From 191ad0f1abbbec923c7d3c1fbd3ab703c425b23e Mon Sep 17 00:00:00 2001 From: "sj.hwang" Date: Fri, 24 Feb 2017 09:57:18 +0900 Subject: [PATCH 0001/1164] Add LineStart, LineEnd to CursorMovePosition --- src/vs/editor/common/editorCommon.ts | 3 +++ src/vs/monaco.d.ts | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index 56720ba9b62..2efe42f96a1 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -4190,6 +4190,9 @@ export const CursorMovePosition = { Up: 'up', Down: 'down', + LineStart: 'lineStart', + LineEnd: 'lineEnd', + WrappedLineStart: 'wrappedLineStart', WrappedLineFirstNonWhitespaceCharacter: 'wrappedLineFirstNonWhitespaceCharacter', WrappedLineColumnCenter: 'wrappedLineColumnCenter', diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 04c2f68d897..edf37cb5bdc 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -3320,6 +3320,8 @@ declare module monaco.editor { Right: string; Up: string; Down: string; + LineStart: string; + LineEnd: string; WrappedLineStart: string; WrappedLineFirstNonWhitespaceCharacter: string; WrappedLineColumnCenter: string; From 7ed7dcadd4dd2e03e5397ed55b38554116a392a5 Mon Sep 17 00:00:00 2001 From: "sj.hwang" Date: Fri, 24 Feb 2017 17:36:38 +0900 Subject: [PATCH 0002/1164] Change behavior of home/end button --- src/vs/editor/common/controller/cursor.ts | 10 ++- src/vs/editor/common/controller/oneCursor.ts | 64 ++++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 76bff2078a1..a7aebc64093 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -1234,11 +1234,17 @@ export class Cursor extends EventEmitter { } private _moveToBeginningOfLine(inSelectionMode: boolean, ctx: IMultipleCursorOperationContext): boolean { - return this._invokeForAll(ctx, (cursorIndex: number, oneCursor: OneCursor, oneCtx: IOneCursorOperationContext) => OneCursorOp.moveToBeginningOfLine(oneCursor, inSelectionMode, oneCtx)); + ctx.eventData = ctx.eventData || {}; + ctx.eventData.to = editorCommon.CursorMovePosition.LineStart; + ctx.eventData.select = inSelectionMode; + return this._cursorMove(ctx); } private _moveToEndOfLine(inSelectionMode: boolean, ctx: IMultipleCursorOperationContext): boolean { - return this._invokeForAll(ctx, (cursorIndex: number, oneCursor: OneCursor, oneCtx: IOneCursorOperationContext) => OneCursorOp.moveToEndOfLine(oneCursor, inSelectionMode, oneCtx)); + ctx.eventData = ctx.eventData || {}; + ctx.eventData.to = editorCommon.CursorMovePosition.LineEnd; + ctx.eventData.select = inSelectionMode; + return this._cursorMove(ctx); } private _moveToBeginningOfBuffer(inSelectionMode: boolean, ctx: IMultipleCursorOperationContext): boolean { diff --git a/src/vs/editor/common/controller/oneCursor.ts b/src/vs/editor/common/controller/oneCursor.ts index 877dca6350c..18869925a1e 100644 --- a/src/vs/editor/common/controller/oneCursor.ts +++ b/src/vs/editor/common/controller/oneCursor.ts @@ -537,6 +537,10 @@ export class OneCursorOp { return this._moveUp(cursor, moveParams, ctx); case editorCommon.CursorMovePosition.Down: return this._moveDown(cursor, moveParams, ctx); + case editorCommon.CursorMovePosition.LineStart: + return this._moveToLineStart(cursor, moveParams, ctx); + case editorCommon.CursorMovePosition.LineEnd: + return this._moveToLineEnd(cursor, moveParams, ctx); case editorCommon.CursorMovePosition.WrappedLineStart: viewColumn = cursor.viewModel.getLineMinColumn(viewLineNumber); break; @@ -695,6 +699,66 @@ export class OneCursorOp { ); } + private static _moveToLineStart(cursor: OneCursor, moveArguments: CursorMoveArguments, ctx: IOneCursorOperationContext): boolean { + const currentViewStateColumn = cursor.viewState.position.column; + const currentModelStateColumn = cursor.modelState.position.column; + const isFirstLineOfWrappedLine = currentViewStateColumn === currentModelStateColumn; + + const currentViewStatelineNumber = cursor.viewState.position.lineNumber; + const firstNonBlankColumn = cursor.viewModel.getLineFirstNonWhitespaceColumn(currentViewStatelineNumber); + const isBeginningOfViewLine = currentViewStateColumn === firstNonBlankColumn; + + if (!isFirstLineOfWrappedLine && !isBeginningOfViewLine) { + return this._moveToLineStartByView(cursor, moveArguments.select, ctx); + } else { + return this._moveToLineStartByModel(cursor, moveArguments.select, ctx); + } + } + + private static _moveToLineStartByView(cursor: OneCursor, inSelectionMode: boolean, ctx: IOneCursorOperationContext): boolean { + return this._applyMoveOperationResult( + cursor, ctx, + this._fromViewCursorState(cursor, MoveOperations.moveToBeginningOfLine(cursor.config, cursor.viewModel, cursor.viewState, inSelectionMode)) + ); + } + + private static _moveToLineStartByModel(cursor: OneCursor, inSelectionMode: boolean, ctx: IOneCursorOperationContext): boolean { + return this._applyMoveOperationResult( + cursor, ctx, + this._fromModelCursorState(cursor, MoveOperations.moveToBeginningOfLine(cursor.config, cursor.model, cursor.modelState, inSelectionMode)) + ); + } + + private static _moveToLineEnd(cursor: OneCursor, moveArguments: CursorMoveArguments, ctx: IOneCursorOperationContext): boolean { + const viewStatePosition = cursor.viewState.position; + const viewModelMaxColumn = cursor.viewModel.getLineMaxColumn(viewStatePosition.lineNumber); + const isEndOfViewLine = viewStatePosition.column === viewModelMaxColumn; + + const modelStatePosition = cursor.modelState.position; + const modelMaxColumn = cursor.model.getLineMaxColumn(modelStatePosition.lineNumber); + const isEndLineOfWrappedLine = viewModelMaxColumn - viewStatePosition.column === modelMaxColumn - modelStatePosition.column; + + if (isEndOfViewLine || isEndLineOfWrappedLine) { + return this._moveToLineEndByModel(cursor, moveArguments.select, ctx); + } else { + return this._moveToLineEndByView(cursor, moveArguments.select, ctx); + } + } + + private static _moveToLineEndByView(cursor: OneCursor, inSelectionMode: boolean, ctx: IOneCursorOperationContext): boolean { + return this._applyMoveOperationResult( + cursor, ctx, + this._fromViewCursorState(cursor, MoveOperations.moveToEndOfLine(cursor.config, cursor.viewModel, cursor.viewState, inSelectionMode)) + ); + } + + private static _moveToLineEndByModel(cursor: OneCursor, inSelectionMode: boolean, ctx: IOneCursorOperationContext): boolean { + return this._applyMoveOperationResult( + cursor, ctx, + this._fromModelCursorState(cursor, MoveOperations.moveToEndOfLine(cursor.config, cursor.model, cursor.modelState, inSelectionMode)) + ); + } + public static moveToBeginningOfLine(cursor: OneCursor, inSelectionMode: boolean, ctx: IOneCursorOperationContext): boolean { return this._applyMoveOperationResult( cursor, ctx, From 9f8dd87d482aac8456d686168f219ac4302ebbb4 Mon Sep 17 00:00:00 2001 From: Jacob Lambert Date: Thu, 9 Mar 2017 21:23:15 -0700 Subject: [PATCH 0003/1164] Update PHP snippits --- extensions/php/snippets/php.json | 131 +++++++++++++++++-------------- 1 file changed, 70 insertions(+), 61 deletions(-) diff --git a/extensions/php/snippets/php.json b/extensions/php/snippets/php.json index 5a3f2c4418c..24a4426a54a 100644 --- a/extensions/php/snippets/php.json +++ b/extensions/php/snippets/php.json @@ -1,63 +1,75 @@ { - "Class Variable": { - "prefix": "doc_v", - "body": [ - "/**", - " * ${1:undocumented class variable}", - " *", - " * @var ${2:string}", - " **/", - "${3:var} $$2;$0" - ], - "description": "Documented Class Variable" - }, - "function __construct": { - "prefix": "con", - "body": [ - "function __construct(${1:$${2:foo} ${3:= ${4:null}}}) {", - "\t${2:$this->$0 = $$0;}", - "}" - ] - }, "class …": { "prefix": "class", "body": [ - "/**", - " * $1", - " */", - "class ${2:ClassName} ${3:extends ${4:AnotherClass}}", + "class ${1:ClassName} ${2:extends ${3:AnotherClass}} ${4:implements ${5:Interface}}", "{", - "\t$5", - "\tfunction ${6:__construct}(${7:argument})", - "\t{", - "\t\t${0:# code...}", - "\t}", + "\t$0", "}", "" ], "description": "Class definition" }, + "PHPDoc class …": { + "prefix": "doc_class", + "body": [ + "/**", + " * ${6:undocumented class}", + " */", + "class ${1:ClassName} ${2:extends ${3:AnotherClass}} ${4:implements ${5:Interface}}", + "{", + "\t$0", + "}", + "" + ], + "description": "Documented Class Declaration" + }, + "function __construct": { + "prefix": "con", + "body": [ + "${1:public} function __construct(${2:${3:Type} $${4:var}${5: = ${6:null}}}) {", + "\t\\$this->${4:var} = $${4:var};$0", + "}" + ] + }, + "PHPDoc property": { + "prefix": "doc_v", + "body": [ + "/** @var ${1:Type} $${2:var} ${3:description} */", + "${4:protected} $${2:var}${5: = ${6:null}};$0" + ], + "description": "Documented Class Variable" + }, "PHPDoc function …": { "prefix": "doc_f", "body": [ "/**", - " * ${6:undocumented function summary}", + " * ${1:undocumented function summary}", " *", - " * ${7:Undocumented function long description}", + " * ${2:Undocumented function long description}", " *", - " * @param ${8:type} ${9:var} ${10:Description}", + "${3: * @param ${4:Type} $${5:var} ${6:Description}}", + "${7: * @return ${8:type}}", + "${9: * @throws ${10:conditon}}", " **/", - "${1:public }function ${2:FunctionName}(${3:$${4:value}${5:=''}})", + "${11:public }function ${12:FunctionName}(${13:${14:${4:Type} }$${5:var}${15: = ${16:null}}})", "{", "\t${0:# code...}", "}" ], "description": "Documented function" }, + "PHPDoc param …": { + "prefix": "param", + "body": [ + "* @param ${1:Type} ${2:var} ${3:Description}$0" + ], + "description": "Paramater documentation" + }, "function …": { "prefix": "fun", "body": [ - "${1:public }function ${2:FunctionName}(${3:$${4:value}${5:=''}})", + "${1:public }function ${2:FunctionName}(${3:${4:${5:Type} }$${6:var}${7: = ${8:null}}})", "{", "\t${0:# code...}", "}" @@ -72,10 +84,7 @@ " */", "trait ${2:TraitName}", "{", - "\tfunction ${3:functionName}(${4:argument})", - "\t{", - "\t\t${5:# code...}", - "\t}", + "\t$0", "}", "" ], @@ -94,9 +103,27 @@ "body": [ "do {", "\t${0:# code...}", - "} while (${1:${2:$a} <= ${3:10}});" + "} while (${1:$${2:a} <= ${3:10}});" ], "description": "Do-While loop" + }, + "while …": { + "prefix": "while", + "body": [ + "while (${1:$${2:a} <= ${3:10}}) {", + "\t${0:# code...}", + "}" + ], + "description": "While-loop" + }, + "if …": { + "prefix": "if", + "body": [ + "if (${1:condition}) {", + "\t${0:# code...}", + "}" + ], + "description": "If block" }, "if … else …": { "prefix": "ifelse", @@ -110,15 +137,6 @@ ], "description": "If Else block" }, - "if …": { - "prefix": "if", - "body": [ - "if (${1:condition}) {", - "\t${0:# code...}", - "}" - ], - "description": "If block" - }, "$… = ( … ) ? … : …": { "prefix": "if?", "body": "$${1:retVal} = (${2:condition}) ? ${3:a} : ${4:b} ;", @@ -178,7 +196,7 @@ "switch …": { "prefix": "switch", "body": [ - "switch (${1:variable}) {", + "switch (\\$${1:variable}) {", "\tcase '${2:value}':", "\t\t${3:# code...}", "\t\tbreak;", @@ -193,7 +211,7 @@ "case …": { "prefix": "case", "body": [ - "case '${1:variable}':", + "case '${1:value}':", "\t${0:# code...}", "\tbreak;" ], @@ -201,12 +219,12 @@ }, "$this->…": { "prefix": "this", - "body": "$this->$0", + "body": "\\$this->$0;", "description": "$this->..." }, "echo $this->…": { "prefix": "ethis", - "body": "echo $this->$0", + "body": "echo \\$this->$0;", "description": "Echo this" }, "Throw Exception": { @@ -216,14 +234,5 @@ "$0" ], "description": "Throw exception" - }, - "while …": { - "prefix": "while", - "body": [ - "while (${1:$a <= 10}) {", - "\t${0:# code...}", - "}" - ], - "description": "While-loop" } } \ No newline at end of file From 51b7c8ef17487b0563e79b5696da55f91dd43afc Mon Sep 17 00:00:00 2001 From: Cody Hoover Date: Sun, 12 Mar 2017 15:16:01 +0100 Subject: [PATCH 0004/1164] Addresses #14221 by reading wordPattern from the language-configuration.json --- .../common/modes/languageConfiguration.ts | 5 +++ .../languageConfigurationExtensionPoint.ts | 42 ++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/common/modes/languageConfiguration.ts b/src/vs/editor/common/modes/languageConfiguration.ts index 1fec47f4806..31b6107f372 100644 --- a/src/vs/editor/common/modes/languageConfiguration.ts +++ b/src/vs/editor/common/modes/languageConfiguration.ts @@ -142,6 +142,11 @@ export interface IAutoClosingPairConditional extends IAutoClosingPair { notIn?: string[]; } +export interface IRegExp { + pattern: string; + flags?: string; +} + /** * Describes what to do with the indentation when pressing Enter. */ diff --git a/src/vs/editor/node/languageConfigurationExtensionPoint.ts b/src/vs/editor/node/languageConfigurationExtensionPoint.ts index 81c0add5dcb..0dfabaadecb 100644 --- a/src/vs/editor/node/languageConfigurationExtensionPoint.ts +++ b/src/vs/editor/node/languageConfigurationExtensionPoint.ts @@ -7,7 +7,7 @@ import * as nls from 'vs/nls'; import { parse } from 'vs/base/common/json'; import { readFile } from 'vs/base/node/pfs'; -import { CharacterPair, LanguageConfiguration, IAutoClosingPair, IAutoClosingPairConditional, CommentRule } from 'vs/editor/common/modes/languageConfiguration'; +import { CharacterPair, LanguageConfiguration, IAutoClosingPair, IAutoClosingPairConditional, CommentRule, IRegExp } from 'vs/editor/common/modes/languageConfiguration'; import { IModeService } from 'vs/editor/common/services/modeService'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { Extensions, IJSONContributionRegistry } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; @@ -21,6 +21,7 @@ interface ILanguageConfiguration { brackets?: CharacterPair[]; autoClosingPairs?: (CharacterPair | IAutoClosingPairConditional)[]; surroundingPairs?: (CharacterPair | IAutoClosingPair)[]; + wordPattern?: string | IRegExp; } export class LanguageConfigurationFileHandler { @@ -85,6 +86,26 @@ export class LanguageConfigurationFileHandler { richEditConfig.surroundingPairs = this._mapCharacterPairs(configuration.surroundingPairs); } + if (configuration.wordPattern) { + let pattern = ''; + let flags = ''; + + if (typeof configuration.wordPattern === 'string') { + pattern = configuration.wordPattern; + } else if (typeof configuration.wordPattern === 'object') { + pattern = configuration.wordPattern.pattern; + flags = configuration.wordPattern.flags; + } + + if (pattern) { + try { + richEditConfig.wordPattern = new RegExp(pattern, flags); + } catch (error) { + // Malformed regexes are ignored + } + } + } + LanguageConfigurationRegistry.register(languageIdentifier, richEditConfig); } @@ -208,6 +229,25 @@ const schema: IJSONSchema = { }] } }, + wordPattern: { + default: '', + description: nls.localize('schema.wordPattern', 'The word definition for the language.'), + type: ['string', 'object'], + properties: { + pattern: { + type: 'string', + description: nls.localize('schema.wordPattern.pattern', 'The RegExp pattern used to match words.'), + default: '', + }, + flags: { + type: 'string', + description: nls.localize('schema.wordPattern.flags', 'The RegExp flags used to match words.'), + default: 'g', + pattern: '^([gimuy]+)$', + patternErrorMessage: nls.localize('schema.wordPattern.flags.errorMessage', 'Must match the pattern `/^([gimuy]+)$/`.') + } + } + } } }; let schemaRegistry = Registry.as(Extensions.JSONContribution); From 1aa16859f958d90234e624668e40f3285f151986 Mon Sep 17 00:00:00 2001 From: Cody Hoover Date: Sun, 12 Mar 2017 18:27:23 +0100 Subject: [PATCH 0005/1164] Added missing monaco.d.ts --- src/vs/monaco.d.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 772fa0233e2..5889e2c3d08 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -4436,6 +4436,11 @@ declare module monaco.languages { notIn?: string[]; } + export interface IRegExp { + pattern: string; + flags?: string; + } + /** * Describes what to do with the indentation when pressing Enter. */ From e30b83608c383985eeb510fbeeb021fb31c2daad Mon Sep 17 00:00:00 2001 From: Cody Hoover Date: Wed, 22 Mar 2017 00:15:14 +0100 Subject: [PATCH 0006/1164] Add letterSpacing to config to address #18715 --- src/vs/base/browser/fastDomNode.ts | 10 ++++++++++ src/vs/editor/browser/config/charWidthReader.ts | 3 +++ src/vs/editor/browser/config/configuration.ts | 4 ++++ src/vs/editor/common/config/commonEditorConfig.ts | 5 +++++ src/vs/editor/common/config/fontInfo.ts | 14 ++++++++++++-- src/vs/editor/common/editorCommon.ts | 4 ++++ .../editor/test/common/mocks/testConfiguration.ts | 1 + src/vs/monaco.d.ts | 5 +++++ 8 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/vs/base/browser/fastDomNode.ts b/src/vs/base/browser/fastDomNode.ts index 7b172c3720d..0663924aa5d 100644 --- a/src/vs/base/browser/fastDomNode.ts +++ b/src/vs/base/browser/fastDomNode.ts @@ -20,6 +20,7 @@ export abstract class FastDomNode { private _fontWeight: string; private _fontSize: number; private _lineHeight: number; + private _letterSpacing: number; private _className: string; private _display: string; private _position: string; @@ -43,6 +44,7 @@ export abstract class FastDomNode { this._fontWeight = ''; this._fontSize = -1; this._lineHeight = -1; + this._letterSpacing = -1; this._className = ''; this._display = ''; this._position = ''; @@ -170,6 +172,14 @@ export abstract class FastDomNode { this._domNode.style.lineHeight = this._lineHeight + 'px'; } + public setLetterSpacing(letterSpacing: number): void { + if (this._letterSpacing === letterSpacing) { + return; + } + this._letterSpacing = letterSpacing; + this._domNode.style.letterSpacing = this._letterSpacing + 'px'; + } + public setClassName(className: string): void { if (this._className === className) { return; diff --git a/src/vs/editor/browser/config/charWidthReader.ts b/src/vs/editor/browser/config/charWidthReader.ts index d1e0b07bf1e..6e5d782a037 100644 --- a/src/vs/editor/browser/config/charWidthReader.ts +++ b/src/vs/editor/browser/config/charWidthReader.ts @@ -77,6 +77,7 @@ class DomCharWidthReader implements ICharWidthReader { regularDomNode.style.fontWeight = this._bareFontInfo.fontWeight; regularDomNode.style.fontSize = this._bareFontInfo.fontSize + 'px'; regularDomNode.style.lineHeight = this._bareFontInfo.lineHeight + 'px'; + regularDomNode.style.letterSpacing = this._bareFontInfo.letterSpacing + 'px'; container.appendChild(regularDomNode); let boldDomNode = document.createElement('div'); @@ -84,6 +85,7 @@ class DomCharWidthReader implements ICharWidthReader { boldDomNode.style.fontWeight = 'bold'; boldDomNode.style.fontSize = this._bareFontInfo.fontSize + 'px'; boldDomNode.style.lineHeight = this._bareFontInfo.lineHeight + 'px'; + boldDomNode.style.letterSpacing = this._bareFontInfo.letterSpacing + 'px'; container.appendChild(boldDomNode); let italicDomNode = document.createElement('div'); @@ -91,6 +93,7 @@ class DomCharWidthReader implements ICharWidthReader { italicDomNode.style.fontWeight = this._bareFontInfo.fontWeight; italicDomNode.style.fontSize = this._bareFontInfo.fontSize + 'px'; italicDomNode.style.lineHeight = this._bareFontInfo.lineHeight + 'px'; + italicDomNode.style.letterSpacing = this._bareFontInfo.letterSpacing + 'px'; italicDomNode.style.fontStyle = 'italic'; container.appendChild(italicDomNode); diff --git a/src/vs/editor/browser/config/configuration.ts b/src/vs/editor/browser/config/configuration.ts index c5faf1e8690..62933c86c76 100644 --- a/src/vs/editor/browser/config/configuration.ts +++ b/src/vs/editor/browser/config/configuration.ts @@ -89,6 +89,7 @@ export interface ISerializedFontInfo { readonly fontWeight: string; readonly fontSize: number; readonly lineHeight: number; + readonly letterSpacing: number; readonly isMonospace: boolean; readonly typicalHalfwidthCharacterWidth: number; readonly typicalFullwidthCharacterWidth: number; @@ -163,6 +164,7 @@ class CSSBasedConfiguration extends Disposable { fontWeight: readConfig.fontWeight, fontSize: readConfig.fontSize, lineHeight: readConfig.lineHeight, + letterSpacing: readConfig.letterSpacing, isMonospace: readConfig.isMonospace, typicalHalfwidthCharacterWidth: Math.max(readConfig.typicalHalfwidthCharacterWidth, 5), typicalFullwidthCharacterWidth: Math.max(readConfig.typicalFullwidthCharacterWidth, 5), @@ -283,6 +285,7 @@ class CSSBasedConfiguration extends Disposable { fontWeight: bareFontInfo.fontWeight, fontSize: bareFontInfo.fontSize, lineHeight: bareFontInfo.lineHeight, + letterSpacing: bareFontInfo.letterSpacing, isMonospace: isMonospace, typicalHalfwidthCharacterWidth: typicalHalfwidthCharacter.width, typicalFullwidthCharacterWidth: typicalFullwidthCharacter.width, @@ -306,6 +309,7 @@ export class Configuration extends CommonEditorConfiguration { domNode.setFontWeight(fontInfo.fontWeight); domNode.setFontSize(fontInfo.fontSize); domNode.setLineHeight(fontInfo.lineHeight); + domNode.setLetterSpacing(fontInfo.letterSpacing); } constructor(options: any, referenceDomElement: HTMLElement = null) { diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 607a2156894..a67bfd72b4e 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -631,6 +631,11 @@ const editorConfiguration: IConfigurationNode = { 'default': DefaultConfig.editor.lineHeight, 'description': nls.localize('lineHeight', "Controls the line height. Use 0 to compute the lineHeight from the fontSize.") }, + 'editor.letterSpacing': { + 'type': 'number', + 'default': DefaultConfig.editor.letterSpacing, + 'description': nls.localize('letterSpacing', "Controls the letter spacing in pixels.") + }, 'editor.lineNumbers': { 'type': 'string', 'enum': ['off', 'on', 'relative'], diff --git a/src/vs/editor/common/config/fontInfo.ts b/src/vs/editor/common/config/fontInfo.ts index 1c291d02cf6..e5cb9bc331a 100644 --- a/src/vs/editor/common/config/fontInfo.ts +++ b/src/vs/editor/common/config/fontInfo.ts @@ -50,6 +50,7 @@ export class BareFontInfo { fontWeight?: string; fontSize?: number | string; lineHeight?: number | string; + letterSpacing?: number | string; }, zoomLevel: number): BareFontInfo { let fontFamily = String(opts.fontFamily) || DefaultConfig.editor.fontFamily; @@ -67,6 +68,9 @@ export class BareFontInfo { lineHeight = Math.round(GOLDEN_LINE_HEIGHT_RATIO * fontSize); } + let letterSpacing = safeParseFloat(opts.letterSpacing, 0);; + letterSpacing = clamp(letterSpacing, -20, 20); + let editorZoomLevelMultiplier = 1 + (EditorZoom.getZoomLevel() * 0.1); fontSize *= editorZoomLevelMultiplier; lineHeight *= editorZoomLevelMultiplier; @@ -76,7 +80,8 @@ export class BareFontInfo { fontFamily: fontFamily, fontWeight: fontWeight, fontSize: fontSize, - lineHeight: lineHeight + lineHeight: lineHeight, + letterSpacing: letterSpacing }); } @@ -85,6 +90,7 @@ export class BareFontInfo { readonly fontWeight: string; readonly fontSize: number; readonly lineHeight: number; + readonly letterSpacing: number; /** * @internal @@ -95,19 +101,21 @@ export class BareFontInfo { fontWeight: string; fontSize: number; lineHeight: number; + letterSpacing: number; }) { this.zoomLevel = opts.zoomLevel; this.fontFamily = String(opts.fontFamily); this.fontWeight = String(opts.fontWeight); this.fontSize = opts.fontSize; this.lineHeight = opts.lineHeight | 0; + this.letterSpacing = opts.letterSpacing; } /** * @internal */ public getId(): string { - return this.zoomLevel + '-' + this.fontFamily + '-' + this.fontWeight + '-' + this.fontSize + '-' + this.lineHeight; + return this.zoomLevel + '-' + this.fontFamily + '-' + this.fontWeight + '-' + this.fontSize + '-' + this.lineHeight + '-' + this.letterSpacing; } } @@ -130,6 +138,7 @@ export class FontInfo extends BareFontInfo { fontWeight: string; fontSize: number; lineHeight: number; + letterSpacing: number; isMonospace: boolean; typicalHalfwidthCharacterWidth: number; typicalFullwidthCharacterWidth: number; @@ -154,6 +163,7 @@ export class FontInfo extends BareFontInfo { && this.fontWeight === other.fontWeight && this.fontSize === other.fontSize && this.lineHeight === other.lineHeight + && this.letterSpacing === other.letterSpacing && this.typicalHalfwidthCharacterWidth === other.typicalHalfwidthCharacterWidth && this.typicalFullwidthCharacterWidth === other.typicalFullwidthCharacterWidth && this.spaceWidth === other.spaceWidth diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index 3390af3d04a..88090d979d1 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -563,6 +563,10 @@ export interface IEditorOptions { * The line height */ lineHeight?: number; + /** + * The letter spacing + */ + letterSpacing?: number; } /** diff --git a/src/vs/editor/test/common/mocks/testConfiguration.ts b/src/vs/editor/test/common/mocks/testConfiguration.ts index 1cd3ce6d717..b0af5f5be4a 100644 --- a/src/vs/editor/test/common/mocks/testConfiguration.ts +++ b/src/vs/editor/test/common/mocks/testConfiguration.ts @@ -41,6 +41,7 @@ export class TestConfiguration extends CommonEditorConfiguration { fontWeight: 'normal', fontSize: 14, lineHeight: 19, + letterSpacing: 1.5, isMonospace: true, typicalHalfwidthCharacterWidth: 10, typicalFullwidthCharacterWidth: 20, diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index ea616a45728..ac7caa846b1 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -1472,6 +1472,10 @@ declare module monaco.editor { * The line height */ lineHeight?: number; + /** + * The letter spacing + */ + letterSpacing?: number; } /** @@ -3967,6 +3971,7 @@ declare module monaco.editor { readonly fontWeight: string; readonly fontSize: number; readonly lineHeight: number; + readonly letterSpacing: number; } } From 7083eb3b8e33a31bf88b18b44547ba09493d3e8c Mon Sep 17 00:00:00 2001 From: Cody Hoover Date: Wed, 22 Mar 2017 09:52:04 +0100 Subject: [PATCH 0007/1164] Added letter spacing to the telemetry whitelist --- src/vs/platform/telemetry/common/telemetryUtils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/platform/telemetry/common/telemetryUtils.ts b/src/vs/platform/telemetry/common/telemetryUtils.ts index 5e6c239a41a..83ac4355b9f 100644 --- a/src/vs/platform/telemetry/common/telemetryUtils.ts +++ b/src/vs/platform/telemetry/common/telemetryUtils.ts @@ -224,6 +224,7 @@ const configurationValueWhitelist = [ 'editor.fontWeight', 'editor.scrollBeyondLastLine', 'editor.lineNumbers', + 'editor.letterSpacing', 'editor.wrappingIndent', 'editor.renderControlCharacters', 'editor.autoClosingBrackets', From b32837c934364ff0a82f974535734cd759d892a4 Mon Sep 17 00:00:00 2001 From: Michel Kaporin Date: Mon, 3 Apr 2017 15:53:21 +0200 Subject: [PATCH 0008/1164] Added multiple link detection for debug console and exception widget. --- .../parts/debug/browser/exceptionWidget.ts | 9 +- .../parts/debug/browser/linkDetector.ts | 104 ++++++++++++++++++ .../debug/browser/media/exceptionWidget.css | 5 + .../debug/electron-browser/replViewer.ts | 86 ++------------- 4 files changed, 124 insertions(+), 80 deletions(-) create mode 100644 src/vs/workbench/parts/debug/browser/linkDetector.ts diff --git a/src/vs/workbench/parts/debug/browser/exceptionWidget.ts b/src/vs/workbench/parts/debug/browser/exceptionWidget.ts index 61989aa9ae2..1206e86259b 100644 --- a/src/vs/workbench/parts/debug/browser/exceptionWidget.ts +++ b/src/vs/workbench/parts/debug/browser/exceptionWidget.ts @@ -14,6 +14,8 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import { IThemeService, ITheme } from "vs/platform/theme/common/themeService"; import { Color } from "vs/base/common/color"; import { registerColor } from "vs/platform/theme/common/colorRegistry"; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { LinkDetector } from 'vs/workbench/parts/debug/browser/linkDetector'; const $ = dom.$; // theming @@ -28,7 +30,8 @@ export class ExceptionWidget extends ZoneWidget { constructor(editor: ICodeEditor, private exceptionInfo: IExceptionInfo, private lineNumber: number, @IContextViewService private contextViewService: IContextViewService, @IDebugService private debugService: IDebugService, - @IThemeService themeService: IThemeService + @IThemeService themeService: IThemeService, + @IInstantiationService private instantiationService: IInstantiationService ) { super(editor, { showFrame: true, showArrow: true, frameWidth: 1 }); @@ -95,7 +98,9 @@ export class ExceptionWidget extends ZoneWidget { if (this.exceptionInfo.details && this.exceptionInfo.details.stackTrace) { let stackTrace = $('.stack-trace'); - stackTrace.textContent = this.exceptionInfo.details.stackTrace; + const linkDetector = this.instantiationService.createInstance(LinkDetector); + const linkedStackTrace = linkDetector.handleLinks(this.exceptionInfo.details.stackTrace); + typeof linkedStackTrace === 'string' ? stackTrace.textContent = linkedStackTrace : stackTrace.appendChild(linkedStackTrace); dom.append(container, stackTrace); } } diff --git a/src/vs/workbench/parts/debug/browser/linkDetector.ts b/src/vs/workbench/parts/debug/browser/linkDetector.ts new file mode 100644 index 00000000000..317c53c929d --- /dev/null +++ b/src/vs/workbench/parts/debug/browser/linkDetector.ts @@ -0,0 +1,104 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import uri from 'vs/base/common/uri'; +import { isMacintosh } from 'vs/base/common/platform'; +import * as errors from 'vs/base/common/errors'; +import { IMouseEvent, StandardMouseEvent } from 'vs/base/browser/mouseEvent'; +import * as nls from 'vs/nls'; +import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; + +export class LinkDetector { + private static FILE_LOCATION_PATTERNS: RegExp[] = [ + // group 0: the full thing :) + // group 1: absolute path + // group 2: drive letter on windows with trailing backslash or leading slash on mac/linux + // group 3: line number + // group 4: column number + // eg: at Context. (c:\Users\someone\Desktop\mocha-runner\test\test.js:26:11) + /((\/|[a-zA-Z]:\\)[^\(\)<>\'\"\[\]]+):(\d+):(\d+)/g + ]; + + constructor( + @IWorkbenchEditorService private editorService: IWorkbenchEditorService + ) { + // noop + } + + public handleLinks(text: string): HTMLElement | string { + let linkContainer: HTMLElement; + + for (let pattern of LinkDetector.FILE_LOCATION_PATTERNS) { + pattern.lastIndex = 0; // the holy grail of software development + let lastMatchIndex = 0; + + let match = pattern.exec(text); + while (match !== null) { + let resource: uri = null; + try { + resource = match && uri.file(match[1]); + } catch (e) { } + + if (resource) { + if (!linkContainer) { + linkContainer = document.createElement('span'); + } + + let textBeforeLink = text.substring(lastMatchIndex, match.index); + if (textBeforeLink) { + let span = document.createElement('span'); + span.textContent = textBeforeLink; + linkContainer.appendChild(span); + } + + const link = document.createElement('a'); + link.textContent = text.substr(match.index, match[0].length); + link.title = isMacintosh ? nls.localize('fileLinkMac', "Click to follow (Cmd + click opens to the side)") : nls.localize('fileLink', "Click to follow (Ctrl + click opens to the side)"); + linkContainer.appendChild(link); + + const line = Number(match[3]); + const column = Number(match[4]); + link.onclick = (e) => this.onLinkClick(new StandardMouseEvent(e), resource, line, column); + + lastMatchIndex = pattern.lastIndex; + const previousMatch = match; + match = pattern.exec(text); + + // Append remaining text if no more links detected + if (!match) { + let textAfterLink = text.substr(previousMatch.index + previousMatch[0].length); + if (textAfterLink) { + let span = document.createElement('span'); + span.textContent = textAfterLink; + linkContainer.appendChild(span); + } + } + } + } + } + + return linkContainer || text; + } + + private onLinkClick(event: IMouseEvent, resource: uri, line: number, column: number): void { + const selection = window.getSelection(); + if (selection.type === 'Range') { + return; // do not navigate when user is selecting + } + + event.preventDefault(); + + this.editorService.openEditor({ + resource, + options: { + selection: { + startLineNumber: line, + startColumn: column + } + } + }, event.ctrlKey || event.metaKey).done(null, errors.onUnexpectedError); + } + +} diff --git a/src/vs/workbench/parts/debug/browser/media/exceptionWidget.css b/src/vs/workbench/parts/debug/browser/media/exceptionWidget.css index 5ec6d6305e6..07cafebe864 100644 --- a/src/vs/workbench/parts/debug/browser/media/exceptionWidget.css +++ b/src/vs/workbench/parts/debug/browser/media/exceptionWidget.css @@ -27,6 +27,11 @@ margin-top: 0.5em; } +.monaco-editor .zone-widget .zone-widget-container.exception-widget a { + text-decoration: underline; + cursor: pointer; +} + /* High Contrast Theming */ .monaco-workbench.mac .zone-widget .zone-widget-container.exception-widget { diff --git a/src/vs/workbench/parts/debug/electron-browser/replViewer.ts b/src/vs/workbench/parts/debug/electron-browser/replViewer.ts index 8e5673fede3..5f14f5b8cd1 100644 --- a/src/vs/workbench/parts/debug/electron-browser/replViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/replViewer.ts @@ -7,13 +7,10 @@ import * as nls from 'vs/nls'; import { TPromise } from 'vs/base/common/winjs.base'; import { IAction } from 'vs/base/common/actions'; import { isFullWidthCharacter, removeAnsiEscapeCodes, endsWith } from 'vs/base/common/strings'; -import uri from 'vs/base/common/uri'; -import { isMacintosh } from 'vs/base/common/platform'; import { IActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import * as dom from 'vs/base/browser/dom'; -import * as errors from 'vs/base/common/errors'; import severity from 'vs/base/common/severity'; -import { IMouseEvent, StandardMouseEvent } from 'vs/base/browser/mouseEvent'; +import { IMouseEvent } from 'vs/base/browser/mouseEvent'; import { ITree, IAccessibilityProvider, IDataSource, IRenderer } from 'vs/base/parts/tree/browser/tree'; import { IActionProvider } from 'vs/base/parts/tree/browser/actionsRenderer'; import { ICancelableEvent } from 'vs/base/parts/tree/browser/treeDefaults'; @@ -24,6 +21,7 @@ import { ClearReplAction } from 'vs/workbench/parts/debug/browser/debugActions'; import { CopyAction } from 'vs/workbench/parts/debug/electron-browser/electronDebugActions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { LinkDetector } from 'vs/workbench/parts/debug/browser/linkDetector'; const $ = dom.$; @@ -84,23 +82,14 @@ export class ReplExpressionsRenderer implements IRenderer { private static VALUE_OUTPUT_TEMPLATE_ID = 'outputValue'; private static NAME_VALUE_OUTPUT_TEMPLATE_ID = 'outputNameValue'; - private static FILE_LOCATION_PATTERNS: RegExp[] = [ - // group 0: the full thing :) - // group 1: absolute path - // group 2: drive letter on windows with trailing backslash or leading slash on mac/linux - // group 3: line number - // group 4: column number - // eg: at Context. (c:\Users\someone\Desktop\mocha-runner\test\test.js:26:11) - /((\/|[a-zA-Z]:\\)[^\(\)<>\'\"\[\]]+):(\d+):(\d+)/ - ]; - private static LINE_HEIGHT_PX = 18; private width: number; private characterWidth: number; constructor( - @IWorkbenchEditorService private editorService: IWorkbenchEditorService + @IWorkbenchEditorService private editorService: IWorkbenchEditorService, + @IInstantiationService private instantiationService: IInstantiationService ) { // noop } @@ -331,7 +320,8 @@ export class ReplExpressionsRenderer implements IRenderer { // flush text buffer if we have any if (buffer) { - this.insert(this.handleLinks(buffer), currentToken || tokensContainer); + const linkDetector = this.instantiationService.createInstance(LinkDetector); + this.insert(linkDetector.handleLinks(buffer), currentToken || tokensContainer); buffer = ''; } @@ -351,7 +341,8 @@ export class ReplExpressionsRenderer implements IRenderer { // flush remaining text buffer if we have any if (buffer) { - let res = this.handleLinks(buffer); + const linkDetector = this.instantiationService.createInstance(LinkDetector); + let res = linkDetector.handleLinks(buffer); if (typeof res !== 'string' || currentToken) { if (!tokensContainer) { tokensContainer = document.createElement('span'); @@ -372,67 +363,6 @@ export class ReplExpressionsRenderer implements IRenderer { } } - private handleLinks(text: string): HTMLElement | string { - let linkContainer: HTMLElement; - - for (let pattern of ReplExpressionsRenderer.FILE_LOCATION_PATTERNS) { - pattern.lastIndex = 0; // the holy grail of software development - - const match = pattern.exec(text); - let resource: uri = null; - try { - resource = match && uri.file(match[1]); - } catch (e) { } - - if (resource) { - linkContainer = document.createElement('span'); - - let textBeforeLink = text.substr(0, match.index); - if (textBeforeLink) { - let span = document.createElement('span'); - span.textContent = textBeforeLink; - linkContainer.appendChild(span); - } - - const link = document.createElement('a'); - link.textContent = text.substr(match.index, match[0].length); - link.title = isMacintosh ? nls.localize('fileLinkMac', "Click to follow (Cmd + click opens to the side)") : nls.localize('fileLink', "Click to follow (Ctrl + click opens to the side)"); - linkContainer.appendChild(link); - link.onclick = (e) => this.onLinkClick(new StandardMouseEvent(e), resource, Number(match[3]), Number(match[4])); - - let textAfterLink = text.substr(match.index + match[0].length); - if (textAfterLink) { - let span = document.createElement('span'); - span.textContent = textAfterLink; - linkContainer.appendChild(span); - } - - break; // support one link per line for now - } - } - - return linkContainer || text; - } - - private onLinkClick(event: IMouseEvent, resource: uri, line: number, column: number): void { - const selection = window.getSelection(); - if (selection.type === 'Range') { - return; // do not navigate when user is selecting - } - - event.preventDefault(); - - this.editorService.openEditor({ - resource, - options: { - selection: { - startLineNumber: line, - startColumn: column - } - } - }, event.ctrlKey || event.metaKey).done(null, errors.onUnexpectedError); - } - public disposeTemplate(tree: ITree, templateId: string, templateData: any): void { // noop } From 353eec925c4886dbe46f8307bcd174cc24d2d98a Mon Sep 17 00:00:00 2001 From: Michel Kaporin Date: Tue, 4 Apr 2017 15:17:54 +0200 Subject: [PATCH 0009/1164] Updated regex to handle relative paths and paths without column number. --- .../workbench/parts/debug/browser/linkDetector.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/linkDetector.ts b/src/vs/workbench/parts/debug/browser/linkDetector.ts index 317c53c929d..616e9c00e3e 100644 --- a/src/vs/workbench/parts/debug/browser/linkDetector.ts +++ b/src/vs/workbench/parts/debug/browser/linkDetector.ts @@ -9,6 +9,7 @@ import * as errors from 'vs/base/common/errors'; import { IMouseEvent, StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import * as nls from 'vs/nls'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; export class LinkDetector { private static FILE_LOCATION_PATTERNS: RegExp[] = [ @@ -18,11 +19,15 @@ export class LinkDetector { // group 3: line number // group 4: column number // eg: at Context. (c:\Users\someone\Desktop\mocha-runner\test\test.js:26:11) - /((\/|[a-zA-Z]:\\)[^\(\)<>\'\"\[\]]+):(\d+):(\d+)/g + ///((\/|[a-zA-Z]:\\)[^\(\)<>\'\"\[\]]+):(\d+):(\d+)/g original + ///(?:at |^|[\(<\'\"\[])(?:file:\/\/)?((?:(\/|[a-zA-Z]:)|[^\(\)<>\'\"\[\]:\s]+)(?:[\\/][^\(\)<>\'\"\[\]:]*)?):(\d+)(?::(\d+))?(?:$|[\)>\'\"\]])/g second original + + /(?![\(])(?:file:\/\/)?((?:([a-zA-Z]:)|[^\(\)<>\'\"\[\]:\s]+)(?:[\\/][^\(\)<>\'\"\[\]:]*)?):(\d+)(?::(\d+))?/g ]; constructor( - @IWorkbenchEditorService private editorService: IWorkbenchEditorService + @IWorkbenchEditorService private editorService: IWorkbenchEditorService, + @IWorkspaceContextService private contextService: IWorkspaceContextService ) { // noop } @@ -38,7 +43,7 @@ export class LinkDetector { while (match !== null) { let resource: uri = null; try { - resource = match && uri.file(match[1]); + resource = match && (match[2] ? uri.file(match[1]) : this.contextService.toResource(match[1])); } catch (e) { } if (resource) { @@ -59,7 +64,7 @@ export class LinkDetector { linkContainer.appendChild(link); const line = Number(match[3]); - const column = Number(match[4]); + const column = match[4] ? Number(match[4]) : null; link.onclick = (e) => this.onLinkClick(new StandardMouseEvent(e), resource, line, column); lastMatchIndex = pattern.lastIndex; @@ -82,7 +87,7 @@ export class LinkDetector { return linkContainer || text; } - private onLinkClick(event: IMouseEvent, resource: uri, line: number, column: number): void { + private onLinkClick(event: IMouseEvent, resource: uri, line: number, column: number = 0): void { const selection = window.getSelection(); if (selection.type === 'Range') { return; // do not navigate when user is selecting From dd96b883d92d69a0caf1799ecf2e34fee42bd2ba Mon Sep 17 00:00:00 2001 From: Michel Kaporin Date: Fri, 7 Apr 2017 16:59:41 +0200 Subject: [PATCH 0010/1164] Added file link validation. --- .../parts/debug/browser/linkDetector.ts | 54 +++++++++++++------ 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/linkDetector.ts b/src/vs/workbench/parts/debug/browser/linkDetector.ts index 616e9c00e3e..f22ab75757c 100644 --- a/src/vs/workbench/parts/debug/browser/linkDetector.ts +++ b/src/vs/workbench/parts/debug/browser/linkDetector.ts @@ -10,6 +10,7 @@ import { IMouseEvent, StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import * as nls from 'vs/nls'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import fs = require('fs'); export class LinkDetector { private static FILE_LOCATION_PATTERNS: RegExp[] = [ @@ -51,29 +52,35 @@ export class LinkDetector { linkContainer = document.createElement('span'); } - let textBeforeLink = text.substring(lastMatchIndex, match.index); - if (textBeforeLink) { - let span = document.createElement('span'); - span.textContent = textBeforeLink; - linkContainer.appendChild(span); + const valid = this.fileExists(resource.fsPath); + if (valid) { + let textBeforeLink = text.substring(lastMatchIndex, match.index); + if (textBeforeLink) { + let span = document.createElement('span'); + span.textContent = textBeforeLink; + linkContainer.appendChild(span); + } + + const link = document.createElement('a'); + link.textContent = text.substr(match.index, match[0].length); + link.title = isMacintosh ? nls.localize('fileLinkMac', "Click to follow (Cmd + click opens to the side)") : nls.localize('fileLink', "Click to follow (Ctrl + click opens to the side)"); + linkContainer.appendChild(link); + const line = Number(match[3]); + const column = match[4] ? Number(match[4]) : undefined; + link.onclick = (e) => this.onLinkClick(new StandardMouseEvent(e), resource, line, column); + } else { + let plainText = document.createElement('span'); + plainText.textContent = text.substring(lastMatchIndex, match.index + match[0].length); + linkContainer.appendChild(plainText); } - const link = document.createElement('a'); - link.textContent = text.substr(match.index, match[0].length); - link.title = isMacintosh ? nls.localize('fileLinkMac', "Click to follow (Cmd + click opens to the side)") : nls.localize('fileLink', "Click to follow (Ctrl + click opens to the side)"); - linkContainer.appendChild(link); - - const line = Number(match[3]); - const column = match[4] ? Number(match[4]) : null; - link.onclick = (e) => this.onLinkClick(new StandardMouseEvent(e), resource, line, column); - lastMatchIndex = pattern.lastIndex; - const previousMatch = match; + const currentMatch = match; match = pattern.exec(text); - // Append remaining text if no more links detected + // Append last string part if no more link matches if (!match) { - let textAfterLink = text.substr(previousMatch.index + previousMatch[0].length); + let textAfterLink = text.substr(currentMatch.index + currentMatch[0].length); if (textAfterLink) { let span = document.createElement('span'); span.textContent = textAfterLink; @@ -106,4 +113,17 @@ export class LinkDetector { }, event.ctrlKey || event.metaKey).done(null, errors.onUnexpectedError); } + private fileExists(path: string): boolean { + let stat; + try { + stat = fs.statSync(path); + } catch (e) { + return false; + } + + if (stat.isFile()) { + return true; + } + return false; + } } From c09c79f0606c2e71158e701e4fe5c61685c6528c Mon Sep 17 00:00:00 2001 From: Michel Kaporin Date: Mon, 3 Apr 2017 15:53:21 +0200 Subject: [PATCH 0011/1164] Added multiple link detection for debug console and exception widget. --- .../parts/debug/browser/exceptionWidget.ts | 9 +- .../parts/debug/browser/linkDetector.ts | 104 ++++++++++++++++++ .../debug/browser/media/exceptionWidget.css | 5 + .../debug/electron-browser/replViewer.ts | 86 ++------------- 4 files changed, 124 insertions(+), 80 deletions(-) create mode 100644 src/vs/workbench/parts/debug/browser/linkDetector.ts diff --git a/src/vs/workbench/parts/debug/browser/exceptionWidget.ts b/src/vs/workbench/parts/debug/browser/exceptionWidget.ts index 61989aa9ae2..1206e86259b 100644 --- a/src/vs/workbench/parts/debug/browser/exceptionWidget.ts +++ b/src/vs/workbench/parts/debug/browser/exceptionWidget.ts @@ -14,6 +14,8 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import { IThemeService, ITheme } from "vs/platform/theme/common/themeService"; import { Color } from "vs/base/common/color"; import { registerColor } from "vs/platform/theme/common/colorRegistry"; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { LinkDetector } from 'vs/workbench/parts/debug/browser/linkDetector'; const $ = dom.$; // theming @@ -28,7 +30,8 @@ export class ExceptionWidget extends ZoneWidget { constructor(editor: ICodeEditor, private exceptionInfo: IExceptionInfo, private lineNumber: number, @IContextViewService private contextViewService: IContextViewService, @IDebugService private debugService: IDebugService, - @IThemeService themeService: IThemeService + @IThemeService themeService: IThemeService, + @IInstantiationService private instantiationService: IInstantiationService ) { super(editor, { showFrame: true, showArrow: true, frameWidth: 1 }); @@ -95,7 +98,9 @@ export class ExceptionWidget extends ZoneWidget { if (this.exceptionInfo.details && this.exceptionInfo.details.stackTrace) { let stackTrace = $('.stack-trace'); - stackTrace.textContent = this.exceptionInfo.details.stackTrace; + const linkDetector = this.instantiationService.createInstance(LinkDetector); + const linkedStackTrace = linkDetector.handleLinks(this.exceptionInfo.details.stackTrace); + typeof linkedStackTrace === 'string' ? stackTrace.textContent = linkedStackTrace : stackTrace.appendChild(linkedStackTrace); dom.append(container, stackTrace); } } diff --git a/src/vs/workbench/parts/debug/browser/linkDetector.ts b/src/vs/workbench/parts/debug/browser/linkDetector.ts new file mode 100644 index 00000000000..317c53c929d --- /dev/null +++ b/src/vs/workbench/parts/debug/browser/linkDetector.ts @@ -0,0 +1,104 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import uri from 'vs/base/common/uri'; +import { isMacintosh } from 'vs/base/common/platform'; +import * as errors from 'vs/base/common/errors'; +import { IMouseEvent, StandardMouseEvent } from 'vs/base/browser/mouseEvent'; +import * as nls from 'vs/nls'; +import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; + +export class LinkDetector { + private static FILE_LOCATION_PATTERNS: RegExp[] = [ + // group 0: the full thing :) + // group 1: absolute path + // group 2: drive letter on windows with trailing backslash or leading slash on mac/linux + // group 3: line number + // group 4: column number + // eg: at Context. (c:\Users\someone\Desktop\mocha-runner\test\test.js:26:11) + /((\/|[a-zA-Z]:\\)[^\(\)<>\'\"\[\]]+):(\d+):(\d+)/g + ]; + + constructor( + @IWorkbenchEditorService private editorService: IWorkbenchEditorService + ) { + // noop + } + + public handleLinks(text: string): HTMLElement | string { + let linkContainer: HTMLElement; + + for (let pattern of LinkDetector.FILE_LOCATION_PATTERNS) { + pattern.lastIndex = 0; // the holy grail of software development + let lastMatchIndex = 0; + + let match = pattern.exec(text); + while (match !== null) { + let resource: uri = null; + try { + resource = match && uri.file(match[1]); + } catch (e) { } + + if (resource) { + if (!linkContainer) { + linkContainer = document.createElement('span'); + } + + let textBeforeLink = text.substring(lastMatchIndex, match.index); + if (textBeforeLink) { + let span = document.createElement('span'); + span.textContent = textBeforeLink; + linkContainer.appendChild(span); + } + + const link = document.createElement('a'); + link.textContent = text.substr(match.index, match[0].length); + link.title = isMacintosh ? nls.localize('fileLinkMac', "Click to follow (Cmd + click opens to the side)") : nls.localize('fileLink', "Click to follow (Ctrl + click opens to the side)"); + linkContainer.appendChild(link); + + const line = Number(match[3]); + const column = Number(match[4]); + link.onclick = (e) => this.onLinkClick(new StandardMouseEvent(e), resource, line, column); + + lastMatchIndex = pattern.lastIndex; + const previousMatch = match; + match = pattern.exec(text); + + // Append remaining text if no more links detected + if (!match) { + let textAfterLink = text.substr(previousMatch.index + previousMatch[0].length); + if (textAfterLink) { + let span = document.createElement('span'); + span.textContent = textAfterLink; + linkContainer.appendChild(span); + } + } + } + } + } + + return linkContainer || text; + } + + private onLinkClick(event: IMouseEvent, resource: uri, line: number, column: number): void { + const selection = window.getSelection(); + if (selection.type === 'Range') { + return; // do not navigate when user is selecting + } + + event.preventDefault(); + + this.editorService.openEditor({ + resource, + options: { + selection: { + startLineNumber: line, + startColumn: column + } + } + }, event.ctrlKey || event.metaKey).done(null, errors.onUnexpectedError); + } + +} diff --git a/src/vs/workbench/parts/debug/browser/media/exceptionWidget.css b/src/vs/workbench/parts/debug/browser/media/exceptionWidget.css index 5ec6d6305e6..07cafebe864 100644 --- a/src/vs/workbench/parts/debug/browser/media/exceptionWidget.css +++ b/src/vs/workbench/parts/debug/browser/media/exceptionWidget.css @@ -27,6 +27,11 @@ margin-top: 0.5em; } +.monaco-editor .zone-widget .zone-widget-container.exception-widget a { + text-decoration: underline; + cursor: pointer; +} + /* High Contrast Theming */ .monaco-workbench.mac .zone-widget .zone-widget-container.exception-widget { diff --git a/src/vs/workbench/parts/debug/electron-browser/replViewer.ts b/src/vs/workbench/parts/debug/electron-browser/replViewer.ts index 361bd48ec99..f9fa4c9fbdd 100644 --- a/src/vs/workbench/parts/debug/electron-browser/replViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/replViewer.ts @@ -7,13 +7,10 @@ import * as nls from 'vs/nls'; import { TPromise } from 'vs/base/common/winjs.base'; import { IAction } from 'vs/base/common/actions'; import { isFullWidthCharacter, removeAnsiEscapeCodes, endsWith } from 'vs/base/common/strings'; -import uri from 'vs/base/common/uri'; -import { isMacintosh } from 'vs/base/common/platform'; import { IActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import * as dom from 'vs/base/browser/dom'; -import * as errors from 'vs/base/common/errors'; import severity from 'vs/base/common/severity'; -import { IMouseEvent, StandardMouseEvent } from 'vs/base/browser/mouseEvent'; +import { IMouseEvent } from 'vs/base/browser/mouseEvent'; import { ITree, IAccessibilityProvider, IDataSource, IRenderer, IActionProvider } from 'vs/base/parts/tree/browser/tree'; import { ICancelableEvent } from 'vs/base/parts/tree/browser/treeDefaults'; import { IExpressionContainer, IExpression } from 'vs/workbench/parts/debug/common/debug'; @@ -23,6 +20,7 @@ import { ClearReplAction } from 'vs/workbench/parts/debug/browser/debugActions'; import { CopyAction } from 'vs/workbench/parts/debug/electron-browser/electronDebugActions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { LinkDetector } from 'vs/workbench/parts/debug/browser/linkDetector'; const $ = dom.$; @@ -83,23 +81,14 @@ export class ReplExpressionsRenderer implements IRenderer { private static VALUE_OUTPUT_TEMPLATE_ID = 'outputValue'; private static NAME_VALUE_OUTPUT_TEMPLATE_ID = 'outputNameValue'; - private static FILE_LOCATION_PATTERNS: RegExp[] = [ - // group 0: the full thing :) - // group 1: absolute path - // group 2: drive letter on windows with trailing backslash or leading slash on mac/linux - // group 3: line number - // group 4: column number - // eg: at Context. (c:\Users\someone\Desktop\mocha-runner\test\test.js:26:11) - /((\/|[a-zA-Z]:\\)[^\(\)<>\'\"\[\]]+):(\d+):(\d+)/ - ]; - private static LINE_HEIGHT_PX = 18; private width: number; private characterWidth: number; constructor( - @IWorkbenchEditorService private editorService: IWorkbenchEditorService + @IWorkbenchEditorService private editorService: IWorkbenchEditorService, + @IInstantiationService private instantiationService: IInstantiationService ) { // noop } @@ -330,7 +319,8 @@ export class ReplExpressionsRenderer implements IRenderer { // flush text buffer if we have any if (buffer) { - this.insert(this.handleLinks(buffer), currentToken || tokensContainer); + const linkDetector = this.instantiationService.createInstance(LinkDetector); + this.insert(linkDetector.handleLinks(buffer), currentToken || tokensContainer); buffer = ''; } @@ -350,7 +340,8 @@ export class ReplExpressionsRenderer implements IRenderer { // flush remaining text buffer if we have any if (buffer) { - let res = this.handleLinks(buffer); + const linkDetector = this.instantiationService.createInstance(LinkDetector); + let res = linkDetector.handleLinks(buffer); if (typeof res !== 'string' || currentToken) { if (!tokensContainer) { tokensContainer = document.createElement('span'); @@ -371,67 +362,6 @@ export class ReplExpressionsRenderer implements IRenderer { } } - private handleLinks(text: string): HTMLElement | string { - let linkContainer: HTMLElement; - - for (let pattern of ReplExpressionsRenderer.FILE_LOCATION_PATTERNS) { - pattern.lastIndex = 0; // the holy grail of software development - - const match = pattern.exec(text); - let resource: uri = null; - try { - resource = match && uri.file(match[1]); - } catch (e) { } - - if (resource) { - linkContainer = document.createElement('span'); - - let textBeforeLink = text.substr(0, match.index); - if (textBeforeLink) { - let span = document.createElement('span'); - span.textContent = textBeforeLink; - linkContainer.appendChild(span); - } - - const link = document.createElement('a'); - link.textContent = text.substr(match.index, match[0].length); - link.title = isMacintosh ? nls.localize('fileLinkMac', "Click to follow (Cmd + click opens to the side)") : nls.localize('fileLink', "Click to follow (Ctrl + click opens to the side)"); - linkContainer.appendChild(link); - link.onclick = (e) => this.onLinkClick(new StandardMouseEvent(e), resource, Number(match[3]), Number(match[4])); - - let textAfterLink = text.substr(match.index + match[0].length); - if (textAfterLink) { - let span = document.createElement('span'); - span.textContent = textAfterLink; - linkContainer.appendChild(span); - } - - break; // support one link per line for now - } - } - - return linkContainer || text; - } - - private onLinkClick(event: IMouseEvent, resource: uri, line: number, column: number): void { - const selection = window.getSelection(); - if (selection.type === 'Range') { - return; // do not navigate when user is selecting - } - - event.preventDefault(); - - this.editorService.openEditor({ - resource, - options: { - selection: { - startLineNumber: line, - startColumn: column - } - } - }, event.ctrlKey || event.metaKey).done(null, errors.onUnexpectedError); - } - public disposeTemplate(tree: ITree, templateId: string, templateData: any): void { // noop } From 0337cfdee614b1f6590e1a01e79adf0a6e6d4c21 Mon Sep 17 00:00:00 2001 From: Michel Kaporin Date: Tue, 4 Apr 2017 15:17:54 +0200 Subject: [PATCH 0012/1164] Updated regex to handle relative paths and paths without column number. --- .../workbench/parts/debug/browser/linkDetector.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/linkDetector.ts b/src/vs/workbench/parts/debug/browser/linkDetector.ts index 317c53c929d..616e9c00e3e 100644 --- a/src/vs/workbench/parts/debug/browser/linkDetector.ts +++ b/src/vs/workbench/parts/debug/browser/linkDetector.ts @@ -9,6 +9,7 @@ import * as errors from 'vs/base/common/errors'; import { IMouseEvent, StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import * as nls from 'vs/nls'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; export class LinkDetector { private static FILE_LOCATION_PATTERNS: RegExp[] = [ @@ -18,11 +19,15 @@ export class LinkDetector { // group 3: line number // group 4: column number // eg: at Context. (c:\Users\someone\Desktop\mocha-runner\test\test.js:26:11) - /((\/|[a-zA-Z]:\\)[^\(\)<>\'\"\[\]]+):(\d+):(\d+)/g + ///((\/|[a-zA-Z]:\\)[^\(\)<>\'\"\[\]]+):(\d+):(\d+)/g original + ///(?:at |^|[\(<\'\"\[])(?:file:\/\/)?((?:(\/|[a-zA-Z]:)|[^\(\)<>\'\"\[\]:\s]+)(?:[\\/][^\(\)<>\'\"\[\]:]*)?):(\d+)(?::(\d+))?(?:$|[\)>\'\"\]])/g second original + + /(?![\(])(?:file:\/\/)?((?:([a-zA-Z]:)|[^\(\)<>\'\"\[\]:\s]+)(?:[\\/][^\(\)<>\'\"\[\]:]*)?):(\d+)(?::(\d+))?/g ]; constructor( - @IWorkbenchEditorService private editorService: IWorkbenchEditorService + @IWorkbenchEditorService private editorService: IWorkbenchEditorService, + @IWorkspaceContextService private contextService: IWorkspaceContextService ) { // noop } @@ -38,7 +43,7 @@ export class LinkDetector { while (match !== null) { let resource: uri = null; try { - resource = match && uri.file(match[1]); + resource = match && (match[2] ? uri.file(match[1]) : this.contextService.toResource(match[1])); } catch (e) { } if (resource) { @@ -59,7 +64,7 @@ export class LinkDetector { linkContainer.appendChild(link); const line = Number(match[3]); - const column = Number(match[4]); + const column = match[4] ? Number(match[4]) : null; link.onclick = (e) => this.onLinkClick(new StandardMouseEvent(e), resource, line, column); lastMatchIndex = pattern.lastIndex; @@ -82,7 +87,7 @@ export class LinkDetector { return linkContainer || text; } - private onLinkClick(event: IMouseEvent, resource: uri, line: number, column: number): void { + private onLinkClick(event: IMouseEvent, resource: uri, line: number, column: number = 0): void { const selection = window.getSelection(); if (selection.type === 'Range') { return; // do not navigate when user is selecting From e793d3e02cbd837ce7dfc011ad7717e20714aeb2 Mon Sep 17 00:00:00 2001 From: Michel Kaporin Date: Fri, 7 Apr 2017 16:59:41 +0200 Subject: [PATCH 0013/1164] Added file link validation. --- .../parts/debug/browser/linkDetector.ts | 54 +++++++++++++------ 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/linkDetector.ts b/src/vs/workbench/parts/debug/browser/linkDetector.ts index 616e9c00e3e..f22ab75757c 100644 --- a/src/vs/workbench/parts/debug/browser/linkDetector.ts +++ b/src/vs/workbench/parts/debug/browser/linkDetector.ts @@ -10,6 +10,7 @@ import { IMouseEvent, StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import * as nls from 'vs/nls'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import fs = require('fs'); export class LinkDetector { private static FILE_LOCATION_PATTERNS: RegExp[] = [ @@ -51,29 +52,35 @@ export class LinkDetector { linkContainer = document.createElement('span'); } - let textBeforeLink = text.substring(lastMatchIndex, match.index); - if (textBeforeLink) { - let span = document.createElement('span'); - span.textContent = textBeforeLink; - linkContainer.appendChild(span); + const valid = this.fileExists(resource.fsPath); + if (valid) { + let textBeforeLink = text.substring(lastMatchIndex, match.index); + if (textBeforeLink) { + let span = document.createElement('span'); + span.textContent = textBeforeLink; + linkContainer.appendChild(span); + } + + const link = document.createElement('a'); + link.textContent = text.substr(match.index, match[0].length); + link.title = isMacintosh ? nls.localize('fileLinkMac', "Click to follow (Cmd + click opens to the side)") : nls.localize('fileLink', "Click to follow (Ctrl + click opens to the side)"); + linkContainer.appendChild(link); + const line = Number(match[3]); + const column = match[4] ? Number(match[4]) : undefined; + link.onclick = (e) => this.onLinkClick(new StandardMouseEvent(e), resource, line, column); + } else { + let plainText = document.createElement('span'); + plainText.textContent = text.substring(lastMatchIndex, match.index + match[0].length); + linkContainer.appendChild(plainText); } - const link = document.createElement('a'); - link.textContent = text.substr(match.index, match[0].length); - link.title = isMacintosh ? nls.localize('fileLinkMac', "Click to follow (Cmd + click opens to the side)") : nls.localize('fileLink', "Click to follow (Ctrl + click opens to the side)"); - linkContainer.appendChild(link); - - const line = Number(match[3]); - const column = match[4] ? Number(match[4]) : null; - link.onclick = (e) => this.onLinkClick(new StandardMouseEvent(e), resource, line, column); - lastMatchIndex = pattern.lastIndex; - const previousMatch = match; + const currentMatch = match; match = pattern.exec(text); - // Append remaining text if no more links detected + // Append last string part if no more link matches if (!match) { - let textAfterLink = text.substr(previousMatch.index + previousMatch[0].length); + let textAfterLink = text.substr(currentMatch.index + currentMatch[0].length); if (textAfterLink) { let span = document.createElement('span'); span.textContent = textAfterLink; @@ -106,4 +113,17 @@ export class LinkDetector { }, event.ctrlKey || event.metaKey).done(null, errors.onUnexpectedError); } + private fileExists(path: string): boolean { + let stat; + try { + stat = fs.statSync(path); + } catch (e) { + return false; + } + + if (stat.isFile()) { + return true; + } + return false; + } } From 583fe76acf72202a06e13426cfa4625e52425a48 Mon Sep 17 00:00:00 2001 From: Michel Kaporin Date: Mon, 10 Apr 2017 18:09:44 +0200 Subject: [PATCH 0014/1164] Removed old regexes. --- src/vs/workbench/parts/debug/browser/linkDetector.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/linkDetector.ts b/src/vs/workbench/parts/debug/browser/linkDetector.ts index f22ab75757c..53fdaf1d231 100644 --- a/src/vs/workbench/parts/debug/browser/linkDetector.ts +++ b/src/vs/workbench/parts/debug/browser/linkDetector.ts @@ -20,9 +20,6 @@ export class LinkDetector { // group 3: line number // group 4: column number // eg: at Context. (c:\Users\someone\Desktop\mocha-runner\test\test.js:26:11) - ///((\/|[a-zA-Z]:\\)[^\(\)<>\'\"\[\]]+):(\d+):(\d+)/g original - ///(?:at |^|[\(<\'\"\[])(?:file:\/\/)?((?:(\/|[a-zA-Z]:)|[^\(\)<>\'\"\[\]:\s]+)(?:[\\/][^\(\)<>\'\"\[\]:]*)?):(\d+)(?::(\d+))?(?:$|[\)>\'\"\]])/g second original - /(?![\(])(?:file:\/\/)?((?:([a-zA-Z]:)|[^\(\)<>\'\"\[\]:\s]+)(?:[\\/][^\(\)<>\'\"\[\]:]*)?):(\d+)(?::(\d+))?/g ]; From f19aa21df8833fafbe4bdd2c72db88f4b66cf687 Mon Sep 17 00:00:00 2001 From: Ilie Halip Date: Tue, 18 Apr 2017 15:26:28 +0300 Subject: [PATCH 0015/1164] added config option git.cloneDirectory, defaulting to os.homedir() --- extensions/git/package.json | 5 +++++ extensions/git/package.nls.json | 3 ++- extensions/git/src/commands.ts | 5 ++++- .../workbench/parts/git/browser/gitWorkbenchContributions.ts | 5 +++++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index b06bb33a1db..749b3a65c09 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -618,6 +618,11 @@ "type": "boolean", "description": "%config.ignoreLegacyWarning%", "default": false + }, + "git.cloneDirectory": { + "type": "string", + "default": null, + "description": "%config.cloneDirectory%" } } } diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index 1db12e4a6b0..44eb8b422c3 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -36,5 +36,6 @@ "config.confirmSync": "Confirm before synchronizing git repositories", "config.countBadge": "Controls the git badge counter", "config.checkoutType": "Controls what type of branches are listed", - "config.ignoreLegacyWarning": "Ignores the legacy Git warning" + "config.ignoreLegacyWarning": "Ignores the legacy Git warning", + "config.cloneDirectory": "When cloning a new repository, the default location will be set to this directory" } \ No newline at end of file diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index eeccf86f2dc..61a519a66b8 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -202,9 +202,12 @@ export class CommandCenter { return; } + const config = workspace.getConfiguration('git'); + const cloneDirectory = config.get('cloneDirectory') || os.homedir(); + const parentPath = await window.showInputBox({ prompt: localize('parent', "Parent Directory"), - value: os.homedir(), + value: cloneDirectory, ignoreFocusOut: true }); diff --git a/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts b/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts index e35495db433..0bdf195f96c 100644 --- a/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts +++ b/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts @@ -235,6 +235,11 @@ export function registerContributions(): void { enum: ['all', 'local', 'tags', 'remote'], default: 'all', description: nls.localize('checkoutType', "Controls what type of branches are listed."), + }, + 'git.cloneDirectory': { + type: 'string', + default: null, + description: nls.localize('cloneDirectory', "When cloning a new repository, the default location will be set to this directory."), } } }); From c7587a992f22f24521e6c38d5e3e3b86e0ffb8fe Mon Sep 17 00:00:00 2001 From: Rishab Date: Wed, 12 Apr 2017 01:24:29 +0530 Subject: [PATCH 0016/1164] Fix - #24242 --- .../parts/extensions/browser/extensionsList.ts | 5 +++-- .../media/extensionsViewlet.css | 17 +++++++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/parts/extensions/browser/extensionsList.ts b/src/vs/workbench/parts/extensions/browser/extensionsList.ts index 168870113c4..191df3e60cf 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsList.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionsList.ts @@ -64,8 +64,9 @@ export class Renderer implements IPagedRenderer { const header = append(headerContainer, $('.header')); const name = append(header, $('span.name')); const version = append(header, $('span.version')); - const installCount = append(header, $('span.install-count')); - const ratings = append(header, $('span.ratings')); + const extensionstats = append(headerContainer, $('.extension-stats')); + const installCount = append(extensionstats, $('span.install-count')); + const ratings = append(extensionstats, $('span.ratings')); const description = append(details, $('.description.ellipsis')); const footer = append(details, $('.footer')); const author = append(footer, $('.author.ellipsis')); diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css b/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css index e6790ffae2a..cbb5a36d904 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css +++ b/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css @@ -82,9 +82,8 @@ .extensions-viewlet > .extensions .extension > .details > .header-container > .header { display: flex; align-items: baseline; - flex-wrap: wrap; overflow: hidden; - flex: 1; + flex: 80%; min-width: 0; } @@ -100,20 +99,26 @@ font-size: 80%; padding-left: 6px; flex: 1; - min-width: fit-content; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; } -.extensions-viewlet > .extensions .extension > .details > .header-container > .header > .install-count:not(:empty) { +.extensions-viewlet > .extensions .extension > .details > .header-container > .extension-stats { + justify-content: flex-end; +} + +.extensions-viewlet > .extensions .extension > .details > .header-container > .extension-stats > .install-count:not(:empty) { font-size: 80%; margin: 0 6px; } -.extensions-viewlet > .extensions .extension > .details > .header-container > .header > .install-count > .octicon { +.extensions-viewlet > .extensions .extension > .details > .header-container > .extension-stats > .install-count > .octicon { font-size: 100%; margin-right: 2px; } -.extensions-viewlet > .extensions .extension > .details > .header-container > .header > .ratings { +.extensions-viewlet > .extensions .extension > .details > .header-container > .extension-stats > .ratings { text-align: right; } From efbb64f09e5270f07b6af7bb2761e6b0e5130546 Mon Sep 17 00:00:00 2001 From: Rishab Date: Wed, 12 Apr 2017 01:59:10 +0530 Subject: [PATCH 0017/1164] Show ratings and download count even when extension explorer is narrow. --- .../extensions/electron-browser/media/extensionsViewlet.css | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css b/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css index cbb5a36d904..79ad2c8bd17 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css +++ b/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css @@ -122,11 +122,6 @@ text-align: right; } -.extensions-viewlet.narrow > .extensions .extension > .details > .header-container > .header > .ratings, -.extensions-viewlet.narrow > .extensions .extension > .details > .header-container > .header > .install-count { - display: none; -} - .extensions-viewlet > .extensions .extension > .details > .header-container .extension-status { width: 8px; height: 8px; From 6f4d9323e60b67c5a4b68f83134be979f30eae98 Mon Sep 17 00:00:00 2001 From: Rishab Date: Wed, 12 Apr 2017 22:44:30 +0530 Subject: [PATCH 0018/1164] Revert "Show ratings and download count even when extension explorer is narrow." This reverts commit 8db8769965b77510abb10974fb2168b62ea08aa8. --- .../extensions/electron-browser/media/extensionsViewlet.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css b/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css index 79ad2c8bd17..cbb5a36d904 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css +++ b/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css @@ -122,6 +122,11 @@ text-align: right; } +.extensions-viewlet.narrow > .extensions .extension > .details > .header-container > .header > .ratings, +.extensions-viewlet.narrow > .extensions .extension > .details > .header-container > .header > .install-count { + display: none; +} + .extensions-viewlet > .extensions .extension > .details > .header-container .extension-status { width: 8px; height: 8px; From 3976ab248675a8891d10d271ca15c0212fc0a6bd Mon Sep 17 00:00:00 2001 From: Rishab Date: Wed, 12 Apr 2017 22:45:21 +0530 Subject: [PATCH 0019/1164] Revert "Fix - #24242" This reverts commit 20137c722c0a0912304be507225830e7ec5766c7. --- .../parts/extensions/browser/extensionsList.ts | 5 ++--- .../media/extensionsViewlet.css | 17 ++++++----------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/parts/extensions/browser/extensionsList.ts b/src/vs/workbench/parts/extensions/browser/extensionsList.ts index 191df3e60cf..168870113c4 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsList.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionsList.ts @@ -64,9 +64,8 @@ export class Renderer implements IPagedRenderer { const header = append(headerContainer, $('.header')); const name = append(header, $('span.name')); const version = append(header, $('span.version')); - const extensionstats = append(headerContainer, $('.extension-stats')); - const installCount = append(extensionstats, $('span.install-count')); - const ratings = append(extensionstats, $('span.ratings')); + const installCount = append(header, $('span.install-count')); + const ratings = append(header, $('span.ratings')); const description = append(details, $('.description.ellipsis')); const footer = append(details, $('.footer')); const author = append(footer, $('.author.ellipsis')); diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css b/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css index cbb5a36d904..e6790ffae2a 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css +++ b/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css @@ -82,8 +82,9 @@ .extensions-viewlet > .extensions .extension > .details > .header-container > .header { display: flex; align-items: baseline; + flex-wrap: wrap; overflow: hidden; - flex: 80%; + flex: 1; min-width: 0; } @@ -99,26 +100,20 @@ font-size: 80%; padding-left: 6px; flex: 1; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; + min-width: fit-content; } -.extensions-viewlet > .extensions .extension > .details > .header-container > .extension-stats { - justify-content: flex-end; -} - -.extensions-viewlet > .extensions .extension > .details > .header-container > .extension-stats > .install-count:not(:empty) { +.extensions-viewlet > .extensions .extension > .details > .header-container > .header > .install-count:not(:empty) { font-size: 80%; margin: 0 6px; } -.extensions-viewlet > .extensions .extension > .details > .header-container > .extension-stats > .install-count > .octicon { +.extensions-viewlet > .extensions .extension > .details > .header-container > .header > .install-count > .octicon { font-size: 100%; margin-right: 2px; } -.extensions-viewlet > .extensions .extension > .details > .header-container > .extension-stats > .ratings { +.extensions-viewlet > .extensions .extension > .details > .header-container > .header > .ratings { text-align: right; } From f6febd0534c6b6533669093ca329dc222ac3dd99 Mon Sep 17 00:00:00 2001 From: Rishab Date: Thu, 20 Apr 2017 01:24:16 +0530 Subject: [PATCH 0020/1164] #24653 - Adds a new user configuration `extensions.ignoreRecommendations` to enable or disable extension recommendations. --- .../parts/extensions/common/extensions.ts | 1 + .../electron-browser/extensionTipsService.ts | 62 +++++++++++++++++-- .../extensions.contribution.ts | 15 +++++ 3 files changed, 72 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/parts/extensions/common/extensions.ts b/src/vs/workbench/parts/extensions/common/extensions.ts index 7828aa162c1..f11cd884312 100644 --- a/src/vs/workbench/parts/extensions/common/extensions.ts +++ b/src/vs/workbench/parts/extensions/common/extensions.ts @@ -83,4 +83,5 @@ export const ConfigurationKey = 'extensions'; export interface IExtensionsConfiguration { autoUpdate: boolean; + ignoreRecommendations: boolean; } \ No newline at end of file diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts index 7b88f2d43cf..9859bf1ef43 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts @@ -15,13 +15,16 @@ import { IModelService } from 'vs/editor/common/services/modelService'; import { IModel } from 'vs/editor/common/editorCommon'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import product from 'vs/platform/node/product'; -import { IChoiceService } from 'vs/platform/message/common/message'; +import { IChoiceService, IMessageService } from 'vs/platform/message/common/message'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ShowRecommendedExtensionsAction, ShowWorkspaceRecommendedExtensionsAction } from 'vs/workbench/parts/extensions/browser/extensionsActions'; import Severity from 'vs/base/common/severity'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { Schemas } from 'vs/base/common/network'; import { IFileService } from 'vs/platform/files/common/files'; +import { IExtensionsConfiguration, ConfigurationKey } from 'vs/workbench/parts/extensions/common/extensions'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; interface IExtensionsContent { recommendations: string[]; @@ -47,7 +50,10 @@ export class ExtensionTipsService implements IExtensionTipsService { @IExtensionManagementService private extensionsService: IExtensionManagementService, @IInstantiationService private instantiationService: IInstantiationService, @IFileService private fileService: IFileService, - @IWorkspaceContextService private contextService: IWorkspaceContextService + @IWorkspaceContextService private contextService: IWorkspaceContextService, + @IConfigurationService private configurationService: IConfigurationService, + @IConfigurationEditingService private configurationEditingService: IConfigurationEditingService, + @IMessageService private messageService: IMessageService ) { if (!this._galleryService.isEnabled()) { return; @@ -151,6 +157,10 @@ export class ExtensionTipsService implements IExtensionTipsService { JSON.stringify(Object.keys(this._recommendations)), StorageScope.GLOBAL ); + const ignoreSuggestions = this.getIgnoreRecommendationsConfig(); + if (ignoreSuggestions) { + return; + } this.extensionsService.getInstalled(LocalExtensionType.User).done(local => { Object.keys(this.importantRecommendations) @@ -174,14 +184,13 @@ export class ExtensionTipsService implements IExtensionTipsService { this.choiceService.choose(Severity.Info, message, options).done(choice => { switch (choice) { case 0: return recommendationsAction.run(); - case 1: - this.importantRecommendationsIgnoreList.push(id); - - return this.storageService.store( + case 1: this.importantRecommendationsIgnoreList.push(id); + this.storageService.store( 'extensionsAssistant/importantRecommendationsIgnore', JSON.stringify(this.importantRecommendationsIgnoreList), StorageScope.GLOBAL ); + return this.ignoreExtensionRecommendations(); } }); }); @@ -196,6 +205,11 @@ export class ExtensionTipsService implements IExtensionTipsService { return; } + const ignoreSuggestions = this.getIgnoreRecommendationsConfig(); + if (ignoreSuggestions) { + return; + } + this.getWorkspaceRecommendations().done(allRecommendations => { if (!allRecommendations.length) { return; @@ -228,6 +242,42 @@ export class ExtensionTipsService implements IExtensionTipsService { }); } + private ignoreExtensionRecommendations() { + const message = localize('ignoreExtensionRecommendations', "Do you want to ignore all extension recommendations ?"); + const options = [ + localize('ignoreAll', "Yes, Ignore All"), + localize('no', "No"), + localize('cancel', "Cancel") + ]; + + this.choiceService.choose(Severity.Info, message, options).done(choice => { + switch (choice) { + case 0: // If the user ignores the current message and selects different file type + // we should hide all the stacked up messages as he has selected Yes, Ignore All + this.messageService.hideAll(); + return this.setIgnoreRecmmendations(true); + case 1: return this.setIgnoreRecmmendations(false); + } + }); + } + + private setIgnoreRecmmendations(configVal: boolean) { + let target = ConfigurationTarget.USER; + const configKey = 'extensions.ignoreRecommendations'; + this.configurationEditingService.writeConfiguration(target, { key: configKey, value: configVal }).then(null, error => { + this.messageService.show(Severity.Error, error); + }); + if (configVal) { + const ignoreWorkspaceRecommendationsStorageKey = 'extensionsAssistant/workspaceRecommendationsIgnore'; + this.storageService.store(ignoreWorkspaceRecommendationsStorageKey, true, StorageScope.WORKSPACE); + } + } + + getIgnoreRecommendationsConfig(): boolean { + const config = this.configurationService.getConfiguration(ConfigurationKey); + return config.ignoreRecommendations ? true : false; + } + getKeywordsForExtension(extension: string): string[] { const keywords = product.extensionKeywords || {}; return keywords[extension] || []; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts index b34622e879a..1e3629f42b1 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts @@ -169,6 +169,21 @@ Registry.as(ConfigurationExtensions.Configuration) } }); +Registry.as(ConfigurationExtensions.Configuration) + .registerConfiguration({ + id: 'extensions', + order: 30, + title: localize('extensionsConfigurationTitle', "Extensions"), + type: 'object', + properties: { + 'extensions.ignoreRecommendations': { + type: 'boolean', + description: localize('extensionsIgnoreRecommendations', "Ignore extension recommendations"), + default: false + } + } + }); + const jsonRegistry = Registry.as(jsonContributionRegistry.Extensions.JSONContribution); jsonRegistry.registerSchema(ExtensionsConfigurationSchemaId, ExtensionsConfigurationSchema); From 052cdc7a54710fa9b3286ffbf4f9abaa136e421e Mon Sep 17 00:00:00 2001 From: Rishab Date: Thu, 20 Apr 2017 01:32:59 +0530 Subject: [PATCH 0021/1164] Change method name. --- .../extensions/electron-browser/extensionTipsService.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts index 9859bf1ef43..758ca8db5d0 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts @@ -255,13 +255,13 @@ export class ExtensionTipsService implements IExtensionTipsService { case 0: // If the user ignores the current message and selects different file type // we should hide all the stacked up messages as he has selected Yes, Ignore All this.messageService.hideAll(); - return this.setIgnoreRecmmendations(true); - case 1: return this.setIgnoreRecmmendations(false); + return this.setIgnoreRecommendationsConfig(true); + case 1: return this.setIgnoreRecommendationsConfig(false); } }); } - private setIgnoreRecmmendations(configVal: boolean) { + private setIgnoreRecommendationsConfig(configVal: boolean) { let target = ConfigurationTarget.USER; const configKey = 'extensions.ignoreRecommendations'; this.configurationEditingService.writeConfiguration(target, { key: configKey, value: configVal }).then(null, error => { From 5d323a3ecaa7c829b7530322fc3c63b55e70fde8 Mon Sep 17 00:00:00 2001 From: Mike Seese Date: Tue, 25 Apr 2017 23:13:07 -0400 Subject: [PATCH 0022/1164] Add git enableSmartCommit setting If false, this setting will prompt the user if they want to commit all files if none are staged --- extensions/git/package.json | 5 +++++ extensions/git/package.nls.json | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index 8db3b5bae93..a76b951c679 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -597,6 +597,11 @@ "type": "boolean", "description": "%config.ignoreLimitWarning%", "default": false + }, + "git.enableSmartCommit": { + "type": "boolean", + "description": "%config.enableSmartCommit%", + "default": false } } } diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index 11c7347fa07..98f9ae8c4bf 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -37,5 +37,6 @@ "config.countBadge": "Controls the git badge counter. `all` counts all changes. `tracked` counts only the tracked changes. `off` turns it off.", "config.checkoutType": "Controls what type of branches are listed when running `Checkout to...`. `all` shows all refs, `local` shows only the local branchs, `tags` shows only tags and `remote` shows only remote branches.", "config.ignoreLegacyWarning": "Ignores the legacy Git warning", - "config.ignoreLimitWarning": "Ignores the warning when there are too many changes in a repository" + "config.ignoreLimitWarning": "Ignores the warning when there are too many changes in a repository", + "config.enableSmartCommit": "Commit all changes when there are not staged changes." } \ No newline at end of file From dc8f4d6fa4288c20812f89da7b420953a084c36b Mon Sep 17 00:00:00 2001 From: Mike Seese Date: Tue, 25 Apr 2017 23:13:51 -0400 Subject: [PATCH 0023/1164] Check git enableSmartCommit if no staged files --- extensions/git/src/commands.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index d36d666b6e6..45808af26e6 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -530,6 +530,30 @@ export class CommandCenter { getCommitMessage: () => Promise, opts?: CommitOptions ): Promise { + const config = workspace.getConfiguration('git'); + const enableSmartCommit = config.get('enableSmartCommit') === true; + const noStagedChanges = this.model.indexGroup.resources.length === 0; + + // no changes, and the user has not configured to commit all in this case + if (noStagedChanges && !enableSmartCommit) { + // prompt the user if we want to commit all or not + + const message = localize('no staged changes', "There are no staged changes to commit. Would you like to stage all changes and commit them?"); + const yes = localize('yes', "Yes"); + const always = localize('always', "Always"); + const pick = await window.showWarningMessage(message, { modal: true }, yes, always); + + if (pick === always) { + // update preference to enable smart commit always + config.update('enableSmartCommit', true, false); + } + else if (pick !== yes) { + // do not commit on cancel + return false; + } + // for yes or always, continue onto previous smart commit behavior + } + if (!opts) { opts = { all: this.model.indexGroup.resources.length === 0 }; } From e64cf3121793863dc2331f88e78bdaa19dd263de Mon Sep 17 00:00:00 2001 From: Mike Seese Date: Tue, 25 Apr 2017 23:23:30 -0400 Subject: [PATCH 0024/1164] Prevent redundant enableSmartCommit prompt This prevents a prompt for enableSmartCommit if there are no changes at all --- extensions/git/src/commands.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 45808af26e6..8c356c049bc 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -533,9 +533,10 @@ export class CommandCenter { const config = workspace.getConfiguration('git'); const enableSmartCommit = config.get('enableSmartCommit') === true; const noStagedChanges = this.model.indexGroup.resources.length === 0; + const noUnstagedChanges = this.model.workingTreeGroup.resources.length === 0; // no changes, and the user has not configured to commit all in this case - if (noStagedChanges && !enableSmartCommit) { + if (!noUnstagedChanges && noStagedChanges && !enableSmartCommit) { // prompt the user if we want to commit all or not const message = localize('no staged changes', "There are no staged changes to commit. Would you like to stage all changes and commit them?"); @@ -555,14 +556,14 @@ export class CommandCenter { } if (!opts) { - opts = { all: this.model.indexGroup.resources.length === 0 }; + opts = { all: noStagedChanges }; } if ( // no changes - (this.model.indexGroup.resources.length === 0 && this.model.workingTreeGroup.resources.length === 0) + (noStagedChanges && noUnstagedChanges) // or no staged changes and not `all` - || (!opts.all && this.model.indexGroup.resources.length === 0) + || (!opts.all && noStagedChanges) ) { window.showInformationMessage(localize('no changes', "There are no changes to commit.")); return false; From 62159fdbe15ecca2b117c36ebc5808989308c166 Mon Sep 17 00:00:00 2001 From: Tereza Tomcova Date: Thu, 27 Apr 2017 02:15:52 +0200 Subject: [PATCH 0025/1164] Fixes #4370: Set default icon for file associations --- build/win32/code.iss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build/win32/code.iss b/build/win32/code.iss index 1eb3241d9f4..2fcc70db554 100644 --- a/build/win32/code.iss +++ b/build/win32/code.iss @@ -770,6 +770,10 @@ Root: HKCR; Subkey: "{#RegValueName}SourceFile"; ValueType: string; ValueName: " Root: HKCR; Subkey: "{#RegValueName}SourceFile\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\app\resources\win32\code_file.ico" Root: HKCR; Subkey: "{#RegValueName}SourceFile\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#ExeBasename}.exe"" ""%1""" +Root: HKCR; Subkey: "Applications\{#ExeBasename}.exe"; ValueType: none; ValueName: ""; Flags: uninsdeletekey +Root: HKCR; Subkey: "Applications\{#ExeBasename}.exe\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\resources\app\resources\win32\code_file.ico" +Root: HKCR; Subkey: "Applications\{#ExeBasename}.exe\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#ExeBasename}.exe"" ""%1""" + Root: HKCU; Subkey: "Environment"; ValueType: expandsz; ValueName: "Path"; ValueData: "{olddata};{app}\bin"; Tasks: addtopath; Check: NeedsAddPath(ExpandConstant('{app}\bin')) Root: HKCU; Subkey: "SOFTWARE\Classes\*\shell\{#RegValueName}"; ValueType: expandsz; ValueName: ""; ValueData: "Open with {#ShellNameShort}"; Tasks: addcontextmenufiles; Flags: uninsdeletekey From 10c0610a6dafc5d7932126678f660e77c895e65c Mon Sep 17 00:00:00 2001 From: Eric Amodio Date: Wed, 12 Apr 2017 00:27:35 -0400 Subject: [PATCH 0026/1164] Fixes #944 - Support wildcards on activationEvents.workspaceContains --- src/vs/workbench/node/extensionHostMain.ts | 34 ++++++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/node/extensionHostMain.ts b/src/vs/workbench/node/extensionHostMain.ts index d84ec84c924..ae3bd6cb18b 100644 --- a/src/vs/workbench/node/extensionHostMain.ts +++ b/src/vs/workbench/node/extensionHostMain.ts @@ -12,6 +12,8 @@ import { join } from 'path'; import { IRemoteCom } from 'vs/platform/extensions/common/ipcRemoteCom'; import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService'; import { ExtHostThreadService } from 'vs/workbench/services/thread/common/extHostThreadService'; +import { QueryType, ISearchQuery } from 'vs/platform/search/common/search'; +import { DiskSearch } from 'vs/workbench/services/search/node/searchService'; import { RemoteTelemetryService } from 'vs/workbench/api/node/extHostTelemetry'; import { IWorkspaceContextService, WorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IInitData, IEnvironment, MainContext } from 'vs/workbench/api/node/extHost.protocol'; @@ -34,6 +36,7 @@ export class ExtensionHostMain { private _isTerminating: boolean = false; private _contextService: IWorkspaceContextService; + private _diskSearch: DiskSearch; private _environment: IEnvironment; private _extensionService: ExtHostExtensionService; @@ -122,13 +125,32 @@ export class ExtensionHostMain { } }); - const fileNames = Object.keys(desiredFilesMap); + const matchingPatterns = Object.keys(desiredFilesMap).map(p => { + // TODO: This is a bit hacky -- maybe this should be implemented by using something like + // `workspaceGlob` or something along those lines? + if (p.indexOf('*') > -1 || p.indexOf('?') > -1) { + if (!this._diskSearch) { + this._diskSearch = new DiskSearch(false); + } - return TPromise.join(fileNames.map(f => pfs.exists(join(folderPath, f)))).then(exists => { - fileNames - .filter((f, i) => exists[i]) - .forEach(fileName => { - const activationEvent = `workspaceContains:${fileName}`; + const query: ISearchQuery = { + folderResources: [workspace.resource], + type: QueryType.File, + maxResults: 1, + includePattern: { [p]: true } + }; + + return this._diskSearch.search(query).then(result => result.results.length ? p : undefined); + } else { + return pfs.exists(join(folderPath, p)).then(exists => exists ? p : undefined); + } + }); + + return TPromise.join(matchingPatterns).then(patterns => { + patterns + .filter(p => p !== undefined) + .forEach(p => { + const activationEvent = `workspaceContains:${p}`; this._extensionService.activateByEvent(activationEvent) .done(null, err => console.error(err)); From 9db49eebf90969af34a1919d5960323fc125b3cc Mon Sep 17 00:00:00 2001 From: Joao Portela Date: Tue, 18 Apr 2017 13:48:12 +0100 Subject: [PATCH 0027/1164] Inserting file path on the terminal, when dragging a file to it --- .../electron-browser/terminalPanel.ts | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index 46dee45dc7f..d13e6e34ed5 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -204,6 +204,28 @@ export class TerminalPanel extends Panel { event.stopPropagation(); } })); + this._register(DOM.addDisposableListener(this._parentDomElement, DOM.EventType.DROP, (e: DragEvent) => { + if (e.target === this._parentDomElement || DOM.isAncestor(e.target as HTMLElement, this._parentDomElement)) { + if (!e.dataTransfer) { + return; + } + const url = e.dataTransfer.getData('URL'); + const filePath = this._getPathFromUrl(url); + const terminal = this._terminalService.getActiveInstance(); + + // for files dragged from the tree explorer + if (filePath) { + terminal.sendText(filePath, false); + return; + } + + // for files dragged from the filesystem + const files = e.dataTransfer.files; + if (files.length > 0) { + terminal.sendText(files[0].path, false); + } + } + })); } private _refreshCtrlHeld(e: KeyboardEvent): void { @@ -255,4 +277,17 @@ export class TerminalPanel extends Panel { a.fontSize !== b.fontSize || a.lineHeight !== b.lineHeight; } + + /** + * Removes the trailing file:// from a URL if it exists + * Returns null if it doesn't + */ + private _getPathFromUrl(url: string): string { + const fileRefex = /^file:\/\/(.+)/; + const result = fileRefex.exec(url); + if (result && result.length === 2) { + return result[1]; + } + return null; + } } From ea4e0f4bee713d48a7a857cd1a412795df2a1fa3 Mon Sep 17 00:00:00 2001 From: Joao Portela Date: Thu, 27 Apr 2017 23:24:05 +0100 Subject: [PATCH 0028/1164] Wrapping paths with spaces in quotes, and encoding properly --- .../electron-browser/terminalPanel.ts | 32 ++++++++----------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index d13e6e34ed5..d942ae2c33f 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -22,6 +22,7 @@ import { KillTerminalAction, CreateNewTerminalAction, SwitchTerminalInstanceActi import { Panel } from 'vs/workbench/browser/panel'; import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { TPromise } from 'vs/base/common/winjs.base'; +import URI from 'vs/base/common/uri'; export class TerminalPanel extends Panel { @@ -209,20 +210,18 @@ export class TerminalPanel extends Panel { if (!e.dataTransfer) { return; } + // check if the file was dragged from the tree explorer const url = e.dataTransfer.getData('URL'); - const filePath = this._getPathFromUrl(url); - const terminal = this._terminalService.getActiveInstance(); + let filePath = URI.parse(url).path; - // for files dragged from the tree explorer - if (filePath) { - terminal.sendText(filePath, false); - return; + // check if the file was dragged from the filesystem + if (!filePath && e.dataTransfer.files.length > 0) { + filePath = e.dataTransfer.files[0].path; } - // for files dragged from the filesystem - const files = e.dataTransfer.files; - if (files.length > 0) { - terminal.sendText(files[0].path, false); + if (filePath) { + const terminal = this._terminalService.getActiveInstance(); + terminal.sendText(this._wrapPathInQuotes(filePath), false); } } })); @@ -279,15 +278,12 @@ export class TerminalPanel extends Panel { } /** - * Removes the trailing file:// from a URL if it exists - * Returns null if it doesn't + * Adds quotes to a path if it contains whitespaces */ - private _getPathFromUrl(url: string): string { - const fileRefex = /^file:\/\/(.+)/; - const result = fileRefex.exec(url); - if (result && result.length === 2) { - return result[1]; + private _wrapPathInQuotes(path: string) { + if (/\s+/.test(path)) { + return `"${path}"`; } - return null; + return path; } } From 5dbb1e5870c717d59adbe207b980e74f8765bcac Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Mon, 1 May 2017 19:03:19 -0700 Subject: [PATCH 0029/1164] Fixes #23005 --- src/vs/editor/contrib/suggest/browser/suggestWidget.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 729331aa277..958d45a3cc6 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -637,7 +637,7 @@ export class SuggestWidget implements IContentWidget, IDelegate this.completionModel = completionModel; - if (isFrozen && this.state !== State.Empty) { + if (isFrozen && this.state !== State.Empty && this.state !== State.Hidden) { this.setState(State.Frozen); return; } @@ -667,7 +667,11 @@ export class SuggestWidget implements IContentWidget, IDelegate this.list.setFocus([0]); this.list.reveal(0, 0); - this.setState(State.Open); + if (isFrozen) { + this.setState(State.Frozen); + } else { + this.setState(State.Open); + } } } From 2382a9da05dc6184ace7623a85592a380a5d9ea4 Mon Sep 17 00:00:00 2001 From: Bugra Cuhadaroglu Date: Mon, 1 May 2017 23:37:08 -0400 Subject: [PATCH 0030/1164] Fix - #24242 #24550 --- .../electron-browser/media/extensionsViewlet.css | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css b/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css index e6790ffae2a..82fab9f5565 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css +++ b/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css @@ -71,6 +71,8 @@ flex: 1; padding: 4px 0; overflow: hidden; + + } .extensions-viewlet > .extensions .extension > .details > .header-container { @@ -82,10 +84,11 @@ .extensions-viewlet > .extensions .extension > .details > .header-container > .header { display: flex; align-items: baseline; - flex-wrap: wrap; + flex-wrap: nowrap; overflow: hidden; flex: 1; min-width: 0; + } .extensions-viewlet > .extensions .extension > .details > .header-container > .header > .name { @@ -155,8 +158,8 @@ .extensions-viewlet > .extensions .extension.disabled > .icon, .extensions-viewlet > .extensions .extension.disabled > .details > .header-container, -.extensions-viewlet > .extensions .extension.disabled > .details > .description, -.extensions-viewlet > .extensions .extension.disabled > .details > .footer > .author { +.extensions-viewlet > .extensions .extension.disabled > .details > .footer > .author +.extensions-viewlet > .extensions .extension.disabled > .details > .description { opacity: 0.5; } From 564548fade4f6e70986cb951d3cc5d88e5764ada Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 2 May 2017 12:51:43 +0200 Subject: [PATCH 0031/1164] use native classlist when possible, fixes #25771 --- src/vs/base/browser/dom.ts | 206 ++++++++++++++------------- src/vs/base/test/browser/dom.test.ts | 6 +- 2 files changed, 111 insertions(+), 101 deletions(-) diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index efe82b59b3c..b2ec45dbb77 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -56,125 +56,133 @@ export function isInDOM(node: Node): boolean { return false; } -let lastStart: number, lastEnd: number; +const _manualClassList = new class { -function _findClassName(node: HTMLElement, className: string): void { + private _lastStart: number; + private _lastEnd: number; - let classes = node.className; - if (!classes) { - lastStart = -1; - return; - } + private _findClassName(node: HTMLElement, className: string): void { - className = className.trim(); - - let classesLen = classes.length, - classLen = className.length; - - if (classLen === 0) { - lastStart = -1; - return; - } - - if (classesLen < classLen) { - lastStart = -1; - return; - } - - if (classes === className) { - lastStart = 0; - lastEnd = classesLen; - return; - } - - let idx = -1, - idxEnd: number; - - while ((idx = classes.indexOf(className, idx + 1)) >= 0) { - - idxEnd = idx + classLen; - - // a class that is followed by another class - if ((idx === 0 || classes.charCodeAt(idx - 1) === CharCode.Space) && classes.charCodeAt(idxEnd) === CharCode.Space) { - lastStart = idx; - lastEnd = idxEnd + 1; + let classes = node.className; + if (!classes) { + this._lastStart = -1; return; } - // last class - if (idx > 0 && classes.charCodeAt(idx - 1) === CharCode.Space && idxEnd === classesLen) { - lastStart = idx - 1; - lastEnd = idxEnd; + className = className.trim(); + + let classesLen = classes.length, + classLen = className.length; + + if (classLen === 0) { + this._lastStart = -1; return; } - // equal - duplicate of cmp above - if (idx === 0 && idxEnd === classesLen) { - lastStart = 0; - lastEnd = idxEnd; + if (classesLen < classLen) { + this._lastStart = -1; return; } + + if (classes === className) { + this._lastStart = 0; + this._lastEnd = classesLen; + return; + } + + let idx = -1, + idxEnd: number; + + while ((idx = classes.indexOf(className, idx + 1)) >= 0) { + + idxEnd = idx + classLen; + + // a class that is followed by another class + if ((idx === 0 || classes.charCodeAt(idx - 1) === CharCode.Space) && classes.charCodeAt(idxEnd) === CharCode.Space) { + this._lastStart = idx; + this._lastEnd = idxEnd + 1; + return; + } + + // last class + if (idx > 0 && classes.charCodeAt(idx - 1) === CharCode.Space && idxEnd === classesLen) { + this._lastStart = idx - 1; + this._lastEnd = idxEnd; + return; + } + + // equal - duplicate of cmp above + if (idx === 0 && idxEnd === classesLen) { + this._lastStart = 0; + this._lastEnd = idxEnd; + return; + } + } + + this._lastStart = -1; } - lastStart = -1; -} + hasClass(node: HTMLElement, className: string): boolean { + this._findClassName(node, className); + return this._lastStart !== -1; + } -/** - * @param node a dom node - * @param className a class name - * @return true if the className attribute of the provided node contains the provided className - */ -export function hasClass(node: HTMLElement, className: string): boolean { - _findClassName(node, className); - return lastStart !== -1; -} - -/** - * Adds the provided className to the provided node. This is a no-op - * if the class is already set. - * @param node a dom node - * @param className a class name - */ -export function addClass(node: HTMLElement, className: string): void { - if (!node.className) { // doesn't have it for sure - node.className = className; - } else { - _findClassName(node, className); // see if it's already there - if (lastStart === -1) { - node.className = node.className + ' ' + className; + addClass(node: HTMLElement, className: string): void { + if (!node.className) { // doesn't have it for sure + node.className = className; + } else { + this._findClassName(node, className); // see if it's already there + if (this._lastStart === -1) { + node.className = node.className + ' ' + className; + } } } -} -/** - * Removes the className for the provided node. This is a no-op - * if the class isn't present. - * @param node a dom node - * @param className a class name - */ -export function removeClass(node: HTMLElement, className: string): void { - _findClassName(node, className); - if (lastStart === -1) { - return; // Prevent styles invalidation if not necessary - } else { - node.className = node.className.substring(0, lastStart) + node.className.substring(lastEnd); + removeClass(node: HTMLElement, className: string): void { + this._findClassName(node, className); + if (this._lastStart === -1) { + return; // Prevent styles invalidation if not necessary + } else { + node.className = node.className.substring(0, this._lastStart) + node.className.substring(this._lastEnd); + } } -} -/** - * @param node a dom node - * @param className a class name - * @param shouldHaveIt - */ -export function toggleClass(node: HTMLElement, className: string, shouldHaveIt?: boolean): void { - _findClassName(node, className); - if (lastStart !== -1 && (shouldHaveIt === void 0 || !shouldHaveIt)) { - removeClass(node, className); + toggleClass(node: HTMLElement, className: string, shouldHaveIt?: boolean): void { + this._findClassName(node, className); + if (this._lastStart !== -1 && (shouldHaveIt === void 0 || !shouldHaveIt)) { + this.removeClass(node, className); + } + if (this._lastStart === -1 && (shouldHaveIt === void 0 || shouldHaveIt)) { + this.addClass(node, className); + } } - if (lastStart === -1 && (shouldHaveIt === void 0 || shouldHaveIt)) { - addClass(node, className); +}; + +const _nativeClassList = new class { + hasClass(node: HTMLElement, className: string): boolean { + return className && node.classList.contains(className); } -} + + addClass(node: HTMLElement, className: string): void { + return className && node.classList.add(className); + } + + removeClass(node: HTMLElement, className: string): void { + return className && node.classList.remove(className); + } + + toggleClass(node: HTMLElement, className: string, shouldHaveIt?: boolean): void { + node.classList.toggle(className, shouldHaveIt); + } +}; + +// In IE11 there is only partial support for `classList` which makes us keep our +// custom implementation. Otherwise use the native implementation, see: http://caniuse.com/#search=classlist +const _classList = browser.isIE ? _manualClassList : _nativeClassList; +export const hasClass: (node: HTMLElement, className: string) => boolean = _classList.hasClass.bind(_classList); +export const addClass: (node: HTMLElement, className: string) => void = _classList.addClass.bind(_classList); +export const removeClass: (node: HTMLElement, className: string) => void = _classList.removeClass.bind(_classList); +export const toggleClass: (node: HTMLElement, className: string, shouldHaveIt?: boolean) => void = _classList.toggleClass.bind(_classList); class DomListener implements IDisposable { @@ -1027,4 +1035,4 @@ export function domContentLoaded(): TPromise { window.addEventListener('DOMContentLoaded', c, false); } }); -} \ No newline at end of file +} diff --git a/src/vs/base/test/browser/dom.test.ts b/src/vs/base/test/browser/dom.test.ts index 3669f2eec12..4b8239985f1 100644 --- a/src/vs/base/test/browser/dom.test.ts +++ b/src/vs/base/test/browser/dom.test.ts @@ -58,7 +58,9 @@ suite('dom', () => { test('removeClass should consider hyphens', function () { let element = document.createElement('div'); - dom.addClass(element, 'foo-bar bar'); + dom.addClass(element, 'foo-bar'); + dom.addClass(element, 'bar'); + assert(dom.hasClass(element, 'foo-bar')); assert(dom.hasClass(element, 'bar')); @@ -179,4 +181,4 @@ suite('dom', () => { assert.equal(div.firstChild.textContent, 'hello'); }); }); -}); \ No newline at end of file +}); From ddfce794d2234c864bd8aad9df0f8e343b66a9dc Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 2 May 2017 13:05:08 +0200 Subject: [PATCH 0032/1164] FIx for terminal color descriptions --- .../parts/terminal/electron-browser/terminalColorRegistry.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts index 16d29e6bf4b..b0e8fc2ab43 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts @@ -147,7 +147,7 @@ const ansiColorMap = { export function registerColors(): void { for (let id in ansiColorMap) { let entry = ansiColorMap[id]; - let colorName = id.substring(12); + let colorName = id.substring(13); ansiColorIdentifiers[entry.index] = registerColor(id, entry.defaults, nls.localize('terminal.ansiColor', '\'{0}\' ansi color in the terminal.', colorName)); } } From f315229abd0babad223d86008a190b1b2e248075 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 2 May 2017 13:06:08 +0200 Subject: [PATCH 0033/1164] Color registry documentation order --- src/vs/platform/theme/common/colorRegistry.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index d988f479831..12f490e7c76 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -105,7 +105,16 @@ class ColorRegistry implements IColorRegistry { } public toString() { - return Object.keys(this.colorsById).sort().map(k => `- \`${k}\`: ${this.colorsById[k].description}`).join('\n'); + let sorter = (a: string, b: string) => { + let cat1 = a.indexOf('.') === -1 ? 0 : 1; + let cat2 = b.indexOf('.') === -1 ? 0 : 1; + if (cat1 !== cat2) { + return cat1 - cat2; + } + return a.localeCompare(b); + }; + + return Object.keys(this.colorsById).sort(sorter).map(k => `- \`${k}\`: ${this.colorsById[k].description}`).join('\n'); } } From d39e7b017c624e382d9843ca76ee4fb0d1d64539 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 2 May 2017 14:03:54 +0200 Subject: [PATCH 0034/1164] Restore action to report negative startup times (insiders only) (fixes #25020) --- src/vs/workbench/electron-browser/shell.ts | 24 +++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index e2e3976ebe7..03296bc74ab 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -63,7 +63,7 @@ import { IContextViewService } from 'vs/platform/contextview/browser/contextView import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { IMessageService, IChoiceService, Severity } from 'vs/platform/message/common/message'; +import { IMessageService, IChoiceService, Severity, CloseAction } from 'vs/platform/message/common/message'; import { ChoiceChannel } from 'vs/platform/message/common/messageIpc'; import { ISearchService } from 'vs/platform/search/common/search'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; @@ -183,7 +183,7 @@ export class WorkbenchShell { onWorkbenchStarted: (info: IWorkbenchStartedInfo) => { // run workbench started logic - this.onWorkbenchStarted(info); + this.onWorkbenchStarted(instantiationService, info); // start cached data manager instantiationService.createInstance(NodeCachedDataManager); @@ -206,7 +206,7 @@ export class WorkbenchShell { return workbenchContainer; } - private onWorkbenchStarted(info: IWorkbenchStartedInfo): void { + private onWorkbenchStarted(instantiationService: IInstantiationService, info: IWorkbenchStartedInfo): void { // Telemetry: workspace info const { filesToOpen, filesToCreate, filesToDiff } = this.options; @@ -230,6 +230,12 @@ export class WorkbenchShell { this.timerService.restoreViewletDuration = info.restoreViewletDuration; this.extensionService.onReady().done(() => { this.telemetryService.publicLog('startupTime', this.timerService.startupMetrics); + + // Check for negative performance numbers (insiders only) + // TODO@Ben remove me + if (product.quality !== 'stable' && this.timerService.startupMetrics.ellapsed < 0) { + this.handleNegativePerformanceNumbers(instantiationService, this.timerService.startupMetrics.ellapsed); + } }); // Telemetry: workspace tags @@ -245,11 +251,9 @@ export class WorkbenchShell { const { profileStartup } = this.environmentService; if (profileStartup) { this.extensionService.onReady().then(() => stopProfiling(profileStartup.dir, profileStartup.prefix)).then(() => { - readdir(profileStartup.dir).then(files => { return files.filter(value => value.indexOf(profileStartup.prefix) === 0); }).then(files => { - const profileFiles = files.reduce((prev, cur) => `${prev}${join(profileStartup.dir, cur)}\n`, '\n'); const primaryButton = this.messageService.confirm({ @@ -275,6 +279,16 @@ export class WorkbenchShell { } } + private handleNegativePerformanceNumbers(i: IInstantiationService, time: number): void { + this.messageService.show(Severity.Warning, { + message: nls.localize('handleNegativePerformanceNumbers', "Something went wrong measuring startup performance numbers (ellapsed: {0}ms). We would like to learn more about this issue.", time), + actions: [ + i.createInstance(ReportPerformanceIssueAction, ReportPerformanceIssueAction.ID, ReportPerformanceIssueAction.LABEL), + CloseAction + ] + }); + } + private initServiceCollection(container: HTMLElement): [IInstantiationService, ServiceCollection] { const disposables = new Disposables(); From 89089f17135b04a9505c000f358f29436d7c998f Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 2 May 2017 15:34:59 +0200 Subject: [PATCH 0035/1164] Quick open: Editor history selection lost once file results kick in (fixes #20828) --- .../workbench/browser/parts/quickopen/quickOpenController.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index edfd121cec2..7e7aa6fed45 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -860,10 +860,11 @@ export class QuickOpenController extends Component implements IQuickOpenService // Show additional handler results below any existing results if (additionalHandlerResults.length > 0) { + const autoFocusFirstEntry = (quickOpenModel.getEntries().length === 0); // the user might have selected another entry meanwhile in local history (see https://github.com/Microsoft/vscode/issues/20828) const useTopBorder = quickOpenModel.getEntries().length > 0; additionalHandlerResults[0] = new QuickOpenEntryGroup(additionalHandlerResults[0], groupLabel, useTopBorder); quickOpenModel.addEntries(additionalHandlerResults); - this.quickOpenWidget.refresh(quickOpenModel, { autoFocusFirstEntry: true }); + this.quickOpenWidget.refresh(quickOpenModel, { autoFocusFirstEntry }); } // Otherwise if no results are present (even from histoy) indicate this to the user From ac466c3cc8263e86a67fa3ae2682b9895134c4a3 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 2 May 2017 17:28:12 +0200 Subject: [PATCH 0036/1164] :lipstick: remove check for qunit --- src/vs/base/common/platform.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/vs/base/common/platform.ts b/src/vs/base/common/platform.ts index 77311e2dc58..4e5c5266d0f 100644 --- a/src/vs/base/common/platform.ts +++ b/src/vs/base/common/platform.ts @@ -12,7 +12,6 @@ let _isLinux = false; let _isRootUser = false; let _isNative = false; let _isWeb = false; -let _isQunit = false; let _locale: string = undefined; let _language: string = undefined; @@ -68,7 +67,6 @@ if (typeof process === 'object') { _isWeb = true; _locale = navigator.language; _language = _locale; - _isQunit = !!(self).QUnit; } export enum Platform { @@ -95,7 +93,6 @@ export const isLinux = _isLinux; export const isRootUser = _isRootUser; export const isNative = _isNative; export const isWeb = _isWeb; -export const isQunit = _isQunit; export const platform = _platform; /** From 662397b9813dc811b3aac443302bde2060e75fe8 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 2 May 2017 17:39:02 +0200 Subject: [PATCH 0037/1164] :lipstick: remove unused code --- src/vs/base/common/network.ts | 64 ----------------------------------- 1 file changed, 64 deletions(-) diff --git a/src/vs/base/common/network.ts b/src/vs/base/common/network.ts index 571b7e1fb3c..93de044478a 100644 --- a/src/vs/base/common/network.ts +++ b/src/vs/base/common/network.ts @@ -4,8 +4,6 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { TPromise } from 'vs/base/common/winjs.base'; - export namespace Schemas { /** @@ -42,65 +40,3 @@ export namespace Schemas { export const untitled: string = 'untitled'; } - -export interface IXHROptions { - type?: string; - url?: string; - user?: string; - password?: string; - responseType?: string; - headers?: any; - customRequestInitializer?: (req: any) => void; - data?: any; -} - -export function xhr(options: IXHROptions): TPromise { - let req: XMLHttpRequest = null; - let canceled = false; - - return new TPromise((c, e, p) => { - req = new XMLHttpRequest(); - - req.onreadystatechange = () => { - if (canceled) { - return; - } - - if (req.readyState === 4) { - // Handle 1223: http://bugs.jquery.com/ticket/1450 - if ((req.status >= 200 && req.status < 300) || req.status === 1223) { - c(req); - } else { - e(req); - } - req.onreadystatechange = () => { }; - } else { - p(req); - } - }; - - req.open( - options.type || 'GET', - options.url, - // Promise based XHR does not support sync. - // - true, - options.user, - options.password - ); - req.responseType = options.responseType as any || ''; - - Object.keys(options.headers || {}).forEach((k) => { - req.setRequestHeader(k, options.headers[k]); - }); - - if (options.customRequestInitializer) { - options.customRequestInitializer(req); - } - - req.send(options.data); - }, () => { - canceled = true; - req.abort(); - }); -} \ No newline at end of file From 672663fcead83f64d34b179a5c6625727fdfac14 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 2 May 2017 17:55:46 +0200 Subject: [PATCH 0038/1164] :lipstick: or-types ftw --- src/vs/base/common/collections.ts | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/vs/base/common/collections.ts b/src/vs/base/common/collections.ts index ddd96a7298a..ca4832b1ccb 100644 --- a/src/vs/base/common/collections.ts +++ b/src/vs/base/common/collections.ts @@ -27,9 +27,7 @@ const hasOwnProperty = Object.prototype.hasOwnProperty; * Returns an array which contains all values that reside * in the given set. */ -export function values(from: IStringDictionary): T[]; -export function values(from: INumberDictionary): T[]; -export function values(from: any): any[] { +export function values(from: IStringDictionary | INumberDictionary): T[] { const result: T[] = []; for (var key in from) { if (hasOwnProperty.call(from, key)) { @@ -53,10 +51,8 @@ export function size(from: IStringDictionary | INumberDictionary): numb * Iterates over each entry in the provided set. The iterator allows * to remove elements and will stop when the callback returns {{false}}. */ -export function forEach(from: IStringDictionary, callback: (entry: { key: string; value: T; }, remove: Function) => any): void; -export function forEach(from: INumberDictionary, callback: (entry: { key: number; value: T; }, remove: Function) => any): void; -export function forEach(from: any, callback: (entry: { key: any; value: T; }, remove: Function) => any): void { - for (var key in from) { +export function forEach(from: IStringDictionary | INumberDictionary, callback: (entry: { key: any; value: T; }, remove: Function) => any): void { + for (let key in from) { if (hasOwnProperty.call(from, key)) { const result = callback({ key: key, value: from[key] }, function () { delete from[key]; @@ -72,9 +68,7 @@ export function forEach(from: any, callback: (entry: { key: any; value: T; }, * Removes an element from the dictionary. Returns {{false}} if the property * does not exists. */ -export function remove(from: IStringDictionary, key: string): boolean; -export function remove(from: INumberDictionary, key: string): boolean; -export function remove(from: any, key: string): boolean { +export function remove(from: IStringDictionary | INumberDictionary, key: string): boolean { if (!hasOwnProperty.call(from, key)) { return false; } From 0ddd558b297a67348ca5ec9b87ee357ed51d0bd0 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 2 May 2017 10:37:43 -0700 Subject: [PATCH 0039/1164] Pull in updated clojure grammar --- .../clojure/syntaxes/clojure.tmLanguage.json | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/extensions/clojure/syntaxes/clojure.tmLanguage.json b/extensions/clojure/syntaxes/clojure.tmLanguage.json index 9f130767d07..6e2d50b5ea5 100644 --- a/extensions/clojure/syntaxes/clojure.tmLanguage.json +++ b/extensions/clojure/syntaxes/clojure.tmLanguage.json @@ -240,8 +240,18 @@ ] }, "regexp": { - "begin": "#\\\"", - "end": "\\\"", + "begin": "#\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.regexp.begin.clojure" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.regexp.end.clojure" + } + }, "name": "string.regexp.clojure", "patterns": [ { @@ -301,7 +311,7 @@ "name": "meta.expression.clojure", "patterns": [ { - "begin": "(?<=\\()(ns|def|def-|defn|defn-|defvar|defvar-|defmacro|defmacro-|deftest)\\s+", + "begin": "(?<=\\()(ns|declare|def[\\w\\d._:+=> Date: Tue, 2 May 2017 10:49:45 -0700 Subject: [PATCH 0040/1164] More Monokai refinements - Focus color is now more muted - Fixed notification foreground - Added input option active border - Added input validation colors - Added title bar color Part of #25742 --- .../themes/monokai-color-theme.json | 43 ++++++++++++------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/extensions/theme-monokai/themes/monokai-color-theme.json b/extensions/theme-monokai/themes/monokai-color-theme.json index 3f9ea01f819..b9331a910c2 100644 --- a/extensions/theme-monokai/themes/monokai-color-theme.json +++ b/extensions/theme-monokai/themes/monokai-color-theme.json @@ -1,14 +1,20 @@ +// This theme's colors are based on the original Monokai: +// #1e1f1c (tab well, borders) +// #272822 (editor background) +// #414339 (selection) +// #75715e (focus) +// #f8f8f2 (editor foreground) { "type": "dark", "colors": { "dropdown.background": "#414339", - "list.activeSelectionBackground": "#f92672", + "list.activeSelectionBackground": "#75715E", "list.focusBackground": "#414339", "list.inactiveSelectionBackground": "#414339", "list.hoverBackground": "#272822", "list.dropBackground": "#414339", - "list.highlightForeground": "#f92672", - "button.background": "#f92672", + "list.highlightForeground": "#75715E", + "button.background": "#75715E", "editor.background": "#272822", "editor.foreground": "#f8f8f2", "editor.selectionBackground": "#49483e", @@ -24,33 +30,40 @@ "widget.shadow": "#1e1f1c", "editorLineNumber.foreground": "#90908a", "panelTitle.activeForeground": "#f8f8f2", - "panelTitle.activeBorder": "#f92672", - "panelTitle.inactiveForeground": "#75715E", // comment color + "panelTitle.activeBorder": "#75715E", + "panelTitle.inactiveForeground": "#75715E", "panel.border": "#414339", + "titleBar.activeBackground": "#414339", "statusBar.background": "#414339", "statusBar.noFolderBackground": "#414339", - "statusBar.debuggingBackground": "#f92672", + "statusBar.debuggingBackground": "#75715E", "activityBar.background": "#272822", "activityBarBadge.foreground": "#f8f8f2", - "activityBarBadge.background": "#f92672", + "activityBarBadge.background": "#75715E", "activityBar.foreground": "#f8f8f2", "activityBar.dropBackground": "#414339", "sideBar.background": "#1e1f1c", "sideBarSectionHeader.background": "#272822", - "notification.foreground": "#1e1f1c", - "pickerGroup.foreground": "#f92672", + "pickerGroup.foreground": "#75715E", "input.background": "#414339", - "focusBorder": "#f92672", + "inputOption.activeBorder": "#75715E", + "focusBorder": "#75715E", "editorWidget.background": "#1e1f1c", "debugToolBar.background": "#1e1f1c", "diffEditor.insertedTextBackground": "#66852880", // middle of #272822 and #a6e22e - "diffEditor.removedTextBackground": "#90274A80", // middle of f92672 and #a6e22e + "diffEditor.removedTextBackground": "#90274A80", // middle of #272822 and #f92672 + "inputValidation.errorBackground": "#90274A", // middle of #272822 and #f92672 + "inputValidation.errorBorder": "#f92672", + "inputValidation.warningBackground": "#848528", // middle of #272822 and #e2e22e + "inputValidation.warningBorder": "#e2e22e", + "inputValidation.infoBackground": "#546190", // middle of #272822 and #819aff + "inputValidation.infoBorder": "#819aff", "editorHoverWidget.background": "#414339", - "editorHoverWidget.border": "#75715E", // comment color + "editorHoverWidget.border": "#75715E", "editorSuggestWidget.background": "#272822", - "editorSuggestWidget.border": "#75715E", // comment color - "editorGroup.border": "#414339", // comment color - "peekView.border": "#f92672", + "editorSuggestWidget.border": "#75715E", + "editorGroup.border": "#414339", + "peekView.border": "#75715E", "peekViewEditor.background": "#272822", "peekViewResult.background": "#1e1f1c", "peekViewTitle.background": "#1e1f1c", From 4b9a244cbfaebe267545a80aee795f9c1b8ccd3c Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 2 May 2017 11:11:46 -0700 Subject: [PATCH 0041/1164] Restore monokai dimmed background - Restored dimmed monokai bg colors - Set saturation of blue tinted colors to 0 - Whitespace using indent guide color - Improve contrast of inactive tab - Add inputOption.activeBorder and focusBorder Fixes #25742 --- .../themes/dimmed-monokai-color-theme.json | 49 ++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json b/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json index 4b598c44ec0..68aeef661f0 100644 --- a/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json +++ b/extensions/theme-monokai-dimmed/themes/dimmed-monokai-color-theme.json @@ -1,38 +1,41 @@ { "type": "dark", "colors": { - "dropdown.background": "#383852", - "list.activeSelectionBackground": "#303070", - "list.focusBackground": "#425370", - "list.inactiveSelectionBackground": "#23324e", - "list.hoverBackground": "#005070", + "dropdown.background": "#525252", + "list.activeSelectionBackground": "#707070", + "list.focusBackground": "#707070", + "list.inactiveSelectionBackground": "#4e4e4e", + "list.hoverBackground": "#707070", "list.highlightForeground": "#e58520", - "button.background": "#1e4456", - "editor.background": "#202025", + "button.background": "#565656", + "editor.background": "#1e1e1e", "editor.foreground": "#c5c8c6", "editor.selectionBackground": "#373b41", "editor.lineHighlightBackground": "#303030", "editorCursor.foreground": "#c07020", - "editorWhitespace.foreground": "#383880", + "editorWhitespace.foreground": "#505037", "editorIndentGuide.background": "#505037", - "editorGroupHeader.tabsBackground": "#222228", - "editorGroup.background": "#1a1a1e", - "tab.inactiveBackground": "#333340", - "tab.border": "#000030", + "editorGroupHeader.tabsBackground": "#282828", + "editorGroup.background": "#1e1e1e", + "tab.inactiveBackground": "#404040", + "tab.border": "#303030", + "tab.inactiveForeground": "#d8d8d8", "peekView.border": "#3655b5", - "panelTitle.activeForeground": "#ddffff", - "statusBar.background": "#354550", - "statusBar.debuggingBackground": "#354550", - "statusBar.noFolderBackground": "#354550", - "titleBar.activeBackground": "#354550", - "activityBar.background": "#292935", + "panelTitle.activeForeground": "#ffffff", + "statusBar.background": "#505050", + "statusBar.debuggingBackground": "#505050", + "statusBar.noFolderBackground": "#505050", + "titleBar.activeBackground": "#505050", + "activityBar.background": "#353535", "activityBar.foreground": "#ffffff", "activityBarBadge.background": "#3655b5", - "sideBar.background": "#232327", - "sideBarSectionHeader.background": "#424250", - "notification.background": "#292935", - "pickerGroup.foreground": "#77a5b0", - "terminal.ansiWhite": "#ddffff" + "sideBar.background": "#272727", + "sideBarSectionHeader.background": "#505050", + "notification.background": "#353535", + "pickerGroup.foreground": "#b0b0b0", + "terminal.ansiWhite": "#ffffff", + "inputOption.activeBorder": "#3655b5", + "focusBorder": "#3655b5" }, "tokenColors": [ { From 36ce3d156fc749ea9a8b9f82f87ee096020017fd Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 2 May 2017 13:38:01 -0700 Subject: [PATCH 0042/1164] Show header level in markdown Fixes #25574 --- extensions/markdown/src/documentSymbolProvider.ts | 2 +- extensions/markdown/src/tableOfContentsProvider.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/markdown/src/documentSymbolProvider.ts b/extensions/markdown/src/documentSymbolProvider.ts index e35e690d624..dec81619648 100644 --- a/extensions/markdown/src/documentSymbolProvider.ts +++ b/extensions/markdown/src/documentSymbolProvider.ts @@ -19,7 +19,7 @@ export default class MDDocumentSymbolProvider implements vscode.DocumentSymbolPr provideDocumentSymbols(document: vscode.TextDocument): vscode.ProviderResult { const toc = new TableOfContentsProvider(this.engine, document); return toc.getToc().map(entry => { - return new vscode.SymbolInformation(entry.text, vscode.SymbolKind.Module, '', entry.location); + return new vscode.SymbolInformation(entry.text, vscode.SymbolKind.Namespace, '', entry.location); }); } } \ No newline at end of file diff --git a/extensions/markdown/src/tableOfContentsProvider.ts b/extensions/markdown/src/tableOfContentsProvider.ts index 7a08e6b4348..983b9113ffa 100644 --- a/extensions/markdown/src/tableOfContentsProvider.ts +++ b/extensions/markdown/src/tableOfContentsProvider.ts @@ -66,7 +66,7 @@ export class TableOfContentsProvider { } private static getHeaderText(header: string): string { - return header.replace(/^\s*(#)+\s*(.*?)\s*\1*$/, '$2').trim(); + return header.replace(/^\s*(#+)\s*(.*?)\s*\1*$/, (_, level, word) => `${level} ${word.trim()}`); } public static slugify(header: string): string { From 8120c7f1b8591cd1825509d1abe8b6ddeab8b93b Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 2 May 2017 14:14:18 -0700 Subject: [PATCH 0043/1164] Use TypeScrit 2.3.2 for building VSCode (#25753) --- build/monaco/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/monaco/package.json b/build/monaco/package.json index 604ffd4b5fe..a697b035f71 100644 --- a/build/monaco/package.json +++ b/build/monaco/package.json @@ -48,7 +48,7 @@ "sinon": "^1.17.2", "source-map": "^0.4.4", "tslint": "^4.3.1", - "typescript": "2.2.2", + "typescript": "2.3.2", "typescript-formatter": "4.0.1", "underscore": "^1.8.2", "vinyl": "^0.4.5", diff --git a/package.json b/package.json index 1aa328903d3..49f1836ee4e 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,7 @@ "sinon": "^1.17.2", "source-map": "^0.4.4", "tslint": "^4.3.1", - "typescript": "2.2.2", + "typescript": "2.3.2", "typescript-formatter": "4.0.1", "uglify-js": "2.4.8", "underscore": "^1.8.2", From 05c771c2bba38a65b194cd804f687cce14182a09 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Tue, 2 May 2017 23:32:03 +0200 Subject: [PATCH 0044/1164] node-debug@1.13.0 --- build/gulpfile.vscode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 08a775ce6e6..e5bab793585 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -41,7 +41,7 @@ const nodeModules = ['electron', 'original-fs'] // Build const builtInExtensions = [ - { name: 'ms-vscode.node-debug', version: '1.12.14' }, + { name: 'ms-vscode.node-debug', version: '1.13.0' }, { name: 'ms-vscode.node-debug2', version: '1.12.4' } ]; From 7a378e4fb171d85087a15be47aaa89b50b081e46 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 3 May 2017 06:51:47 +0200 Subject: [PATCH 0045/1164] Can't split file when dragging from explorer (fixes #25789) --- .../browser/parts/editor/editorGroupsControl.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts b/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts index 7a54896285a..d19a3395f43 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts @@ -1282,8 +1282,14 @@ export class EditorGroupsControl extends Themable implements IEditorGroupsContro // Drag enter let counter = 0; // see https://github.com/Microsoft/vscode/issues/14470 this.toUnbind.push(DOM.addDisposableListener(node, DOM.EventType.DRAG_ENTER, (e: DragEvent) => { - if (!TitleControl.getDraggedEditor() && !extractResources(e).length) { - return; // invalid DND + if (!TitleControl.getDraggedEditor()) { + // we used to check for the dragged resources here (via dnd.extractResources()) but this + // seems to be not possible on Linux and Windows where during DRAG_ENTER the resources + // are always undefined up until they are dropped when dragged from the tree. The workaround + // is to check for a datatransfer type being set. See https://github.com/Microsoft/vscode/issues/25789 + if (!e.dataTransfer.types.length) { + return; // invalid DND + } } counter++; From a7b1e6ccd2973d8d46d8a97777c720a6958aba64 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 3 May 2017 07:06:12 +0200 Subject: [PATCH 0046/1164] Windows: changes to node_modules folder are ignored due to watcherExclude setting (fixes #23954) --- src/vs/workbench/parts/files/browser/files.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/files/browser/files.contribution.ts b/src/vs/workbench/parts/files/browser/files.contribution.ts index f65444bfadb..b3b9532576f 100644 --- a/src/vs/workbench/parts/files/browser/files.contribution.ts +++ b/src/vs/workbench/parts/files/browser/files.contribution.ts @@ -261,7 +261,7 @@ configurationRegistry.registerConfiguration({ }, 'files.watcherExclude': { 'type': 'object', - 'default': { '**/.git/objects/**': true, '**/node_modules/**': true }, + 'default': platform.isWindows /* https://github.com/Microsoft/vscode/issues/23954 */ ? { '**/.git/objects/**': true, '**/node_modules/*/**': true } : { '**/.git/objects/**': true, '**/node_modules/**': true }, 'description': nls.localize('watcherExclude', "Configure glob patterns of file paths to exclude from file watching. Changing this setting requires a restart. When you experience Code consuming lots of cpu time on startup, you can exclude large folders to reduce the initial load.") }, 'files.hotExit': { From ea57f5c04ea39c9b221f5b132072e12461f9ee89 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 3 May 2017 07:10:39 +0200 Subject: [PATCH 0047/1164] :lipstick: --- src/vs/code/electron-main/windows.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index 6fdb5efa1f4..a43d3844bb4 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -253,11 +253,8 @@ export class WindowsManager implements IWindowsMainService { this.lifecycleService.onBeforeWindowClose(win => this.onBeforeWindowClose(win)); this.lifecycleService.onBeforeQuit(() => this.onBeforeQuit()); - KeyboardLayoutMonitor.INSTANCE.onDidChangeKeyboardLayout((isISOKeyboard: boolean) => { - WindowsManager.WINDOWS.forEach((window) => { - window.sendWhenReady('vscode:keyboardLayoutChanged', isISOKeyboard); - }); - }); + // Keyboard layout changes + KeyboardLayoutMonitor.INSTANCE.onDidChangeKeyboardLayout(isISOKeyboard => this.sendToAll('vscode:keyboardLayoutChanged', isISOKeyboard)); } // Note that onBeforeQuit() and onBeforeWindowClose() are fired in different order depending on the OS: From 8ea9e6d0af4a0587cf9802b316fade73224b179b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 3 May 2017 07:29:01 +0200 Subject: [PATCH 0048/1164] Mac: Watcher fails on folders with glob characters in name (fixes #4586) --- src/typings/chokidar.d.ts | 5 +++++ .../files/node/watcher/unix/chokidarWatcherService.ts | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/typings/chokidar.d.ts b/src/typings/chokidar.d.ts index 719eae1ea06..019a9e80e6c 100644 --- a/src/typings/chokidar.d.ts +++ b/src/typings/chokidar.d.ts @@ -57,6 +57,11 @@ declare module 'chokidar' { * (default: true). When false, only the symlinks themselves will be watched for changes instead of following the link references and bubbling events through the link's path. */ followSymlinks?: boolean; + + /** + * (default: false). If set to true then the strings passed to .watch() and .add() are treated as literal path names, even if they look like globs. + */ + disableGlobbing?: boolean; } export interface FSWatcher { diff --git a/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts b/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts index e5b47ec111d..63a17ea995d 100644 --- a/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts +++ b/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts @@ -35,7 +35,8 @@ export class ChokidarWatcherService implements IWatcherService { followSymlinks: true, // this is the default of chokidar and supports file events through symlinks ignored: request.ignored, interval: 1000, // while not used in normal cases, if any error causes chokidar to fallback to polling, increase its intervals - binaryInterval: 1000 + binaryInterval: 1000, + disableGlobbing: true // fix https://github.com/Microsoft/vscode/issues/4586 }; // Chokidar fails when the basePath does not match case-identical to the path on disk From 8dc5b561207b563f863f02dd40af849f4c1fb569 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Tue, 2 May 2017 12:59:16 +0200 Subject: [PATCH 0049/1164] Fixes #4358: Output Window is removing new lines --- src/vs/base/node/decoder.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/vs/base/node/decoder.ts b/src/vs/base/node/decoder.ts index a725903b510..112c6cdf6cb 100644 --- a/src/vs/base/node/decoder.ts +++ b/src/vs/base/node/decoder.ts @@ -36,9 +36,6 @@ export class LineDecoder { } let start = 0; let ch: number; - while (start < value.length && ((ch = value.charCodeAt(start)) === CharCode.CarriageReturn || ch === CharCode.LineFeed)) { - start++; - } let idx = start; while (idx < value.length) { ch = value.charCodeAt(idx); From 378c4b5cd4b88bd27e305ca529dd879b70ef7244 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Wed, 26 Apr 2017 16:57:47 +0200 Subject: [PATCH 0050/1164] Fixes #452: Problem matcher severity handles "Note" and "Hint" as errors --- .../platform/markers/common/problemMatcher.ts | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/vs/platform/markers/common/problemMatcher.ts b/src/vs/platform/markers/common/problemMatcher.ts index 063c064e1ad..b3120929f9c 100644 --- a/src/vs/platform/markers/common/problemMatcher.ts +++ b/src/vs/platform/markers/common/problemMatcher.ts @@ -126,12 +126,6 @@ export function isNamedProblemMatcher(value: ProblemMatcher): value is NamedProb return value && Types.isString((value).name) ? true : false; } -let valueMap: { [key: string]: string; } = { - E: 'error', - W: 'warning', - I: 'info', -}; - interface Location { startLineNumber: number; startCharacter: number; @@ -192,7 +186,7 @@ export function createLineMatcher(matcher: ProblemMatcher): ILineMatcher { } } -class AbstractLineMatcher implements ILineMatcher { +abstract class AbstractLineMatcher implements ILineMatcher { private matcher: ProblemMatcher; constructor(matcher: ProblemMatcher) { @@ -207,9 +201,7 @@ class AbstractLineMatcher implements ILineMatcher { return null; } - public get matchLength(): number { - throw new Error('Subclass reponsibility'); - } + public abstract get matchLength(): number; protected fillProblemData(data: ProblemData, pattern: ProblemPattern, matches: RegExpExecArray): void { this.fillProperty(data, 'file', pattern, matches, true); @@ -302,11 +294,21 @@ class AbstractLineMatcher implements ILineMatcher { let result: Severity = null; if (data.severity) { let value = data.severity; - if (value && value.length > 0) { - if (value.length === 1 && valueMap[value[0]]) { - value = valueMap[value[0]]; - } + if (value) { result = Severity.fromValue(value); + if (result === Severity.Ignore) { + if (value === 'E') { + result = Severity.Error; + } else if (value === 'W') { + result = Severity.Warning; + } else if (value === 'I') { + result = Severity.Info; + } else if (Strings.equalsIgnoreCase(value, 'hint')) { + result = Severity.Info; + } else if (Strings.equalsIgnoreCase(value, 'note')) { + result = Severity.Info; + } + } } } if (result === null || result === Severity.Ignore) { From d9311bd3969c58563d72ae3d8de9f2ed07124c2e Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 3 May 2017 10:28:34 +0200 Subject: [PATCH 0051/1164] [theme] Workbench button.foreground doens't work. Fixes #25767 --- .../services/themes/electron-browser/workbenchThemeService.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts index afaaba898f8..2b5a118ce74 100644 --- a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts @@ -407,6 +407,7 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { if (themeId === this.currentColorTheme.id && !this.currentColorTheme.isLoaded && this.currentColorTheme.hasEqualData(themeData)) { // the loaded theme is identical to the perisisted theme. Don't need to send an event. this.currentColorTheme = themeData; + themeData.setCustomColors(this.colorCustomizations); return TPromise.as(themeData); } themeData.setCustomColors(this.colorCustomizations); From 358eb92d72a97dbbfb27d19baa200cca82e6cac6 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 3 May 2017 14:34:45 +0200 Subject: [PATCH 0052/1164] make sure default editor position is set, fixes #25801 --- .../vscode-api-tests/src/window.test.ts | 21 ++++++++++++++++++- .../workbench/api/node/extHostTextEditors.ts | 2 ++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/extensions/vscode-api-tests/src/window.test.ts b/extensions/vscode-api-tests/src/window.test.ts index 94a11bdff8e..cb14027e666 100644 --- a/extensions/vscode-api-tests/src/window.test.ts +++ b/extensions/vscode-api-tests/src/window.test.ts @@ -8,7 +8,7 @@ import * as assert from 'assert'; import { workspace, window, commands, ViewColumn, TextEditorViewColumnChangeEvent, Uri, Selection, Position, CancellationTokenSource, TextEditorSelectionChangeKind } from 'vscode'; import { join } from 'path'; -import { cleanUp, pathEquals } from './utils'; +import { cleanUp, pathEquals, createRandomFile } from './utils'; suite('window namespace tests', () => { @@ -110,6 +110,25 @@ suite('window namespace tests', () => { }); }); + test('issue #25801 - default column when opening a file', async () => { + const [docA, docB, docC] = await Promise.all([ + workspace.openTextDocument(await createRandomFile()), + workspace.openTextDocument(await createRandomFile()), + workspace.openTextDocument(await createRandomFile()) + ]); + + await window.showTextDocument(docA, ViewColumn.One); + await window.showTextDocument(docB, ViewColumn.Two); + + assert.ok(window.activeTextEditor); + assert.ok(window.activeTextEditor!.document === docB); + assert.equal(window.activeTextEditor!.viewColumn, ViewColumn.Two); + + await window.showTextDocument(docC); + assert.ok(window.activeTextEditor!.document === docC); + assert.equal(window.activeTextEditor!.viewColumn, ViewColumn.One); + }); + test('issue #5362 - Incorrect TextEditor passed by onDidChangeTextEditorSelection', (done) => { const file10Path = join(workspace.rootPath || '', './10linefile.ts'); const file30Path = join(workspace.rootPath || '', './30linefile.ts'); diff --git a/src/vs/workbench/api/node/extHostTextEditors.ts b/src/vs/workbench/api/node/extHostTextEditors.ts index 94003fbaa33..e95c96c3bba 100644 --- a/src/vs/workbench/api/node/extHostTextEditors.ts +++ b/src/vs/workbench/api/node/extHostTextEditors.ts @@ -14,6 +14,7 @@ import { IResolvedTextEditorConfiguration, ISelectionChangeEvent } from 'vs/work import * as TypeConverters from './extHostTypeConverters'; import { TextEditorDecorationType, ExtHostTextEditor } from './extHostTextEditor'; import { ExtHostDocumentsAndEditors } from './extHostDocumentsAndEditors'; +import { Position as EditorPosition } from 'vs/platform/editor/common/editor'; import { MainContext, MainThreadEditorsShape, ExtHostEditorsShape, ITextDocumentShowOptions, ITextEditorPositionData } from './extHost.protocol'; import * as vscode from 'vscode'; @@ -74,6 +75,7 @@ export class ExtHostEditors extends ExtHostEditorsShape { }; } else { options = { + position: EditorPosition.ONE, preserveFocus: false, pinned: true }; From e52841338231906f7cb61b7ddf879d85d2960358 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 May 2017 02:59:24 -0700 Subject: [PATCH 0053/1164] Prepare for special handling of combos without ctrl+alt+ --- .../common/macLinuxKeyboardMapper.ts | 77 +++++++++++++------ 1 file changed, 52 insertions(+), 25 deletions(-) diff --git a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts index b884e80add2..b517eea74a8 100644 --- a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts @@ -621,37 +621,85 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { // Handle all `withShiftAltGr` entries for (let i = mappings.length - 1; i >= 0; i--) { const mapping = mappings[i]; + const scanCode = mapping.scanCode; const withShiftAltGr = mapping.withShiftAltGr; if (withShiftAltGr === mapping.withAltGr || withShiftAltGr === mapping.withShift || withShiftAltGr === mapping.value) { // handled below continue; } - this._registerCharCode(mapping.scanCode, true, true, true, withShiftAltGr); + const kb = MacLinuxKeyboardMapper._charCodeToKb(withShiftAltGr); + if (!kb) { + this._registerAllCombos1(true, true, true, scanCode, KeyCode.Unknown); + continue; + } + const kbShiftKey = kb.shiftKey; + const keyCode = kb.keyCode; + + this._registerAllCombos2( + true, true, true, scanCode, + kbShiftKey, keyCode + ); } // Handle all `withAltGr` entries for (let i = mappings.length - 1; i >= 0; i--) { const mapping = mappings[i]; + const scanCode = mapping.scanCode; const withAltGr = mapping.withAltGr; if (withAltGr === mapping.withShift || withAltGr === mapping.value) { // handled below continue; } - this._registerCharCode(mapping.scanCode, true, false, true, withAltGr); + const kb = MacLinuxKeyboardMapper._charCodeToKb(withAltGr); + if (!kb) { + this._registerAllCombos1(true, false, true, scanCode, KeyCode.Unknown); + continue; + } + const kbShiftKey = kb.shiftKey; + const keyCode = kb.keyCode; + + this._registerAllCombos2( + true, false, true, scanCode, + kbShiftKey, keyCode + ); } // Handle all `withShift` entries for (let i = mappings.length - 1; i >= 0; i--) { const mapping = mappings[i]; + const scanCode = mapping.scanCode; const withShift = mapping.withShift; if (withShift === mapping.value) { // handled below continue; } - this._registerCharCode(mapping.scanCode, false, true, false, withShift); + const kb = MacLinuxKeyboardMapper._charCodeToKb(withShift); + if (!kb) { + this._registerAllCombos1(false, true, false, scanCode, KeyCode.Unknown); + continue; + } + const kbShiftKey = kb.shiftKey; + const keyCode = kb.keyCode; + + this._registerAllCombos2( + false, true, false, scanCode, + kbShiftKey, keyCode + ); } // Handle all `value` entries for (let i = mappings.length - 1; i >= 0; i--) { const mapping = mappings[i]; - this._registerCharCode(mapping.scanCode, false, false, false, mapping.value); + const scanCode = mapping.scanCode; + const kb = MacLinuxKeyboardMapper._charCodeToKb(mapping.value); + if (!kb) { + this._registerAllCombos1(false, false, false, scanCode, KeyCode.Unknown); + continue; + } + const kbShiftKey = kb.shiftKey; + const keyCode = kb.keyCode; + + this._registerAllCombos2( + false, false, false, scanCode, + kbShiftKey, keyCode + ); } // Handle all left-over available digits this._registerAllCombos1(false, false, false, ScanCode.Digit1, KeyCode.KEY_1); @@ -871,27 +919,6 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { } } - private _registerCharCode(scanCode: ScanCode, ctrlKey: boolean, shiftKey: boolean, altKey: boolean, charCode: number): void { - - let _kb = MacLinuxKeyboardMapper._charCodeToKb(charCode); - let kb = _kb ? { - ctrlKey: false, - shiftKey: _kb.shiftKey, - altKey: false, - keyCode: _kb.keyCode - } : null; - - if (!_kb) { - this._registerAllCombos1(ctrlKey, shiftKey, altKey, scanCode, KeyCode.Unknown); - return; - } - - this._registerAllCombos2( - ctrlKey, shiftKey, altKey, scanCode, - kb.shiftKey, kb.keyCode - ); - } - public simpleKeybindingToScanCodeBinding(keybinding: SimpleKeybinding): ScanCodeBinding[] { // Avoid double Enter bindings (both ScanCode.NumpadEnter and ScanCode.Enter point to KeyCode.Enter) if (keybinding.keyCode === KeyCode.Enter) { From e2004c216b2844c6f2be1b512ad616b88294e256 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 May 2017 03:48:06 -0700 Subject: [PATCH 0054/1164] Unroll key combination registration loops --- .../common/macLinuxKeyboardMapper.ts | 155 +++++++++--------- .../services/keybinding/test/linux_de_ch.txt | 7 +- .../services/keybinding/test/mac_de_ch.txt | 2 - 3 files changed, 76 insertions(+), 88 deletions(-) diff --git a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts index b517eea74a8..95be462efed 100644 --- a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts @@ -561,7 +561,7 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { for (let scanCode = ScanCode.None; scanCode < ScanCode.MAX_VALUE; scanCode++) { const keyCode = IMMUTABLE_CODE_TO_KEY_CODE[scanCode]; if (keyCode !== -1) { - this._registerAllCombos1(false, false, false, scanCode, keyCode); + this._registerAllCombos(0, 0, 0, scanCode, keyCode); this._scanCodeToLabel[scanCode] = KeyCodeUtils.toString(keyCode); if (keyCode === KeyCode.Unknown || keyCode === KeyCode.Ctrl || keyCode === KeyCode.Meta || keyCode === KeyCode.Alt || keyCode === KeyCode.Shift) { @@ -629,16 +629,19 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { } const kb = MacLinuxKeyboardMapper._charCodeToKb(withShiftAltGr); if (!kb) { - this._registerAllCombos1(true, true, true, scanCode, KeyCode.Unknown); + this._registerAllCombos(1, 1, 1, scanCode, KeyCode.Unknown); continue; } const kbShiftKey = kb.shiftKey; const keyCode = kb.keyCode; - this._registerAllCombos2( - true, true, true, scanCode, - kbShiftKey, keyCode - ); + if (kbShiftKey) { + // Ctrl+Shift+Alt+ScanCode => Shift+KeyCode + this._registerIfUnknown(1, 1, 1, scanCode, 0, 1, 0, keyCode); // Ctrl+Alt+ScanCode => Shift+KeyCode + } else { + // Ctrl+Shift+Alt+ScanCode => KeyCode + this._registerIfUnknown(1, 1, 1, scanCode, 0, 0, 0, keyCode); // Ctrl+Alt+ScanCode => KeyCode + } } // Handle all `withAltGr` entries for (let i = mappings.length - 1; i >= 0; i--) { @@ -651,16 +654,19 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { } const kb = MacLinuxKeyboardMapper._charCodeToKb(withAltGr); if (!kb) { - this._registerAllCombos1(true, false, true, scanCode, KeyCode.Unknown); + this._registerAllCombos(1, 0, 1, scanCode, KeyCode.Unknown); continue; } const kbShiftKey = kb.shiftKey; const keyCode = kb.keyCode; - this._registerAllCombos2( - true, false, true, scanCode, - kbShiftKey, keyCode - ); + if (kbShiftKey) { + // Ctrl+Alt+ScanCode => Shift+KeyCode + this._registerIfUnknown(1, 0, 1, scanCode, 0, 1, 0, keyCode); // Ctrl+Alt+ScanCode => Shift+KeyCode + } else { + // Ctrl+Alt+ScanCode => KeyCode + this._registerIfUnknown(1, 0, 1, scanCode, 0, 0, 0, keyCode); // Ctrl+Alt+ScanCode => KeyCode + } } // Handle all `withShift` entries for (let i = mappings.length - 1; i >= 0; i--) { @@ -673,16 +679,29 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { } const kb = MacLinuxKeyboardMapper._charCodeToKb(withShift); if (!kb) { - this._registerAllCombos1(false, true, false, scanCode, KeyCode.Unknown); + this._registerAllCombos(0, 1, 0, scanCode, KeyCode.Unknown); continue; } const kbShiftKey = kb.shiftKey; const keyCode = kb.keyCode; - this._registerAllCombos2( - false, true, false, scanCode, - kbShiftKey, keyCode - ); + if (kbShiftKey) { + // Shift+ScanCode => Shift+KeyCode + this._registerIfUnknown(0, 1, 0, scanCode, 0, 1, 0, keyCode); // Shift+ScanCode => Shift+KeyCode + this._registerIfUnknown(0, 1, 1, scanCode, 0, 1, 1, keyCode); // Shift+Alt+ScanCode => Shift+Alt+KeyCode + this._registerIfUnknown(1, 1, 0, scanCode, 1, 1, 0, keyCode); // Ctrl+Shift+ScanCode => Ctrl+Shift+KeyCode + this._registerIfUnknown(1, 1, 1, scanCode, 1, 1, 1, keyCode); // Ctrl+Shift+Alt+ScanCode => Ctrl+Shift+Alt+KeyCode + } else { + // Shift+ScanCode => KeyCode + this._registerIfUnknown(0, 1, 0, scanCode, 0, 0, 0, keyCode); // Shift+ScanCode => KeyCode + this._registerIfUnknown(0, 1, 0, scanCode, 0, 1, 0, keyCode); // Shift+ScanCode => Shift+KeyCode + this._registerIfUnknown(0, 1, 1, scanCode, 0, 0, 1, keyCode); // Shift+Alt+ScanCode => Alt+KeyCode + this._registerIfUnknown(0, 1, 1, scanCode, 0, 1, 1, keyCode); // Shift+Alt+ScanCode => Shift+Alt+KeyCode + this._registerIfUnknown(1, 1, 0, scanCode, 1, 0, 0, keyCode); // Ctrl+Shift+ScanCode => Ctrl+KeyCode + this._registerIfUnknown(1, 1, 0, scanCode, 1, 1, 0, keyCode); // Ctrl+Shift+ScanCode => Ctrl+Shift+KeyCode + this._registerIfUnknown(1, 1, 1, scanCode, 1, 0, 1, keyCode); // Ctrl+Shift+Alt+ScanCode => Ctrl+Alt+KeyCode + this._registerIfUnknown(1, 1, 1, scanCode, 1, 1, 1, keyCode); // Ctrl+Shift+Alt+ScanCode => Ctrl+Shift+Alt+KeyCode + } } // Handle all `value` entries for (let i = mappings.length - 1; i >= 0; i--) { @@ -690,28 +709,41 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { const scanCode = mapping.scanCode; const kb = MacLinuxKeyboardMapper._charCodeToKb(mapping.value); if (!kb) { - this._registerAllCombos1(false, false, false, scanCode, KeyCode.Unknown); + this._registerAllCombos(0, 0, 0, scanCode, KeyCode.Unknown); continue; } const kbShiftKey = kb.shiftKey; const keyCode = kb.keyCode; - this._registerAllCombos2( - false, false, false, scanCode, - kbShiftKey, keyCode - ); + if (kbShiftKey) { + // ScanCode => Shift+KeyCode + this._registerIfUnknown(0, 0, 0, scanCode, 0, 1, 0, keyCode); // ScanCode => Shift+KeyCode + this._registerIfUnknown(0, 0, 1, scanCode, 0, 1, 1, keyCode); // Alt+ScanCode => Shift+Alt+KeyCode + this._registerIfUnknown(1, 0, 0, scanCode, 1, 1, 0, keyCode); // Ctrl+ScanCode => Ctrl+Shift+KeyCode + this._registerIfUnknown(1, 0, 1, scanCode, 1, 1, 1, keyCode); // Ctrl+Alt+ScanCode => Ctrl+Shift+Alt+KeyCode + } else { + // ScanCode => KeyCode + this._registerIfUnknown(0, 0, 0, scanCode, 0, 0, 0, keyCode); // ScanCode => KeyCode + this._registerIfUnknown(0, 0, 1, scanCode, 0, 0, 1, keyCode); // Alt+ScanCode => Alt+KeyCode + this._registerIfUnknown(0, 1, 0, scanCode, 0, 1, 0, keyCode); // Shift+ScanCode => Shift+KeyCode + this._registerIfUnknown(0, 1, 1, scanCode, 0, 1, 1, keyCode); // Shift+Alt+ScanCode => Shift+Alt+KeyCode + this._registerIfUnknown(1, 0, 0, scanCode, 1, 0, 0, keyCode); // Ctrl+ScanCode => Ctrl+KeyCode + this._registerIfUnknown(1, 0, 1, scanCode, 1, 0, 1, keyCode); // Ctrl+Alt+ScanCode => Ctrl+Alt+KeyCode + this._registerIfUnknown(1, 1, 0, scanCode, 1, 1, 0, keyCode); // Ctrl+Shift+ScanCode => Ctrl+Shift+KeyCode + this._registerIfUnknown(1, 1, 1, scanCode, 1, 1, 1, keyCode); // Ctrl+Shift+Alt+ScanCode => Ctrl+Shift+Alt+KeyCode + } } // Handle all left-over available digits - this._registerAllCombos1(false, false, false, ScanCode.Digit1, KeyCode.KEY_1); - this._registerAllCombos1(false, false, false, ScanCode.Digit2, KeyCode.KEY_2); - this._registerAllCombos1(false, false, false, ScanCode.Digit3, KeyCode.KEY_3); - this._registerAllCombos1(false, false, false, ScanCode.Digit4, KeyCode.KEY_4); - this._registerAllCombos1(false, false, false, ScanCode.Digit5, KeyCode.KEY_5); - this._registerAllCombos1(false, false, false, ScanCode.Digit6, KeyCode.KEY_6); - this._registerAllCombos1(false, false, false, ScanCode.Digit7, KeyCode.KEY_7); - this._registerAllCombos1(false, false, false, ScanCode.Digit8, KeyCode.KEY_8); - this._registerAllCombos1(false, false, false, ScanCode.Digit9, KeyCode.KEY_9); - this._registerAllCombos1(false, false, false, ScanCode.Digit0, KeyCode.KEY_0); + this._registerAllCombos(0, 0, 0, ScanCode.Digit1, KeyCode.KEY_1); + this._registerAllCombos(0, 0, 0, ScanCode.Digit2, KeyCode.KEY_2); + this._registerAllCombos(0, 0, 0, ScanCode.Digit3, KeyCode.KEY_3); + this._registerAllCombos(0, 0, 0, ScanCode.Digit4, KeyCode.KEY_4); + this._registerAllCombos(0, 0, 0, ScanCode.Digit5, KeyCode.KEY_5); + this._registerAllCombos(0, 0, 0, ScanCode.Digit6, KeyCode.KEY_6); + this._registerAllCombos(0, 0, 0, ScanCode.Digit7, KeyCode.KEY_7); + this._registerAllCombos(0, 0, 0, ScanCode.Digit8, KeyCode.KEY_8); + this._registerAllCombos(0, 0, 0, ScanCode.Digit9, KeyCode.KEY_9); + this._registerAllCombos(0, 0, 0, ScanCode.Digit0, KeyCode.KEY_0); // Ensure letters are mapped this._registerLetterIfMissing(producesLetter, CharCode.A, ScanCode.KeyA, KeyCode.KEY_A); @@ -746,7 +778,7 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { private _registerLetterIfMissing(producesLetter: boolean[], charCode: CharCode, scanCode: ScanCode, keyCode: KeyCode): void { if (!producesLetter[charCode]) { - this._registerAllCombos1(false, false, false, scanCode, keyCode); + this._registerAllCombos(0, 0, 0, scanCode, keyCode); } } @@ -853,25 +885,22 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { } private _registerIfUnknown( - hwCtrlKey: boolean, hwShiftKey: boolean, hwAltKey: boolean, scanCode: ScanCode, - kbCtrlKey: boolean, kbShiftKey: boolean, kbAltKey: boolean, keyCode: KeyCode, + hwCtrlKey: 0 | 1, hwShiftKey: 0 | 1, hwAltKey: 0 | 1, scanCode: ScanCode, + kbCtrlKey: 0 | 1, kbShiftKey: 0 | 1, kbAltKey: 0 | 1, keyCode: KeyCode, ): void { this._scanCodeKeyCodeMapper.registerIfUnknown( - new ScanCodeCombo(hwCtrlKey, hwShiftKey, hwAltKey, scanCode), - new KeyCodeCombo(kbCtrlKey, kbShiftKey, kbAltKey, keyCode) + new ScanCodeCombo(hwCtrlKey ? true : false, hwShiftKey ? true : false, hwAltKey ? true : false, scanCode), + new KeyCodeCombo(kbCtrlKey ? true : false, kbShiftKey ? true : false, kbAltKey ? true : false, keyCode) ); } - private _registerAllCombos1( - _ctrlKey: boolean, _shiftKey: boolean, _altKey: boolean, scanCode: ScanCode, + private _registerAllCombos( + _ctrlKey: 0 | 1, _shiftKey: 0 | 1, _altKey: 0 | 1, scanCode: ScanCode, keyCode: KeyCode, ): void { - for (let _ctrl = (_ctrlKey ? 1 : 0); _ctrl <= 1; _ctrl++) { - const ctrlKey = (_ctrl ? true : false); - for (let _shift = (_shiftKey ? 1 : 0); _shift <= 1; _shift++) { - const shiftKey = (_shift ? true : false); - for (let _alt = (_altKey ? 1 : 0); _alt <= 1; _alt++) { - const altKey = (_alt ? true : false); + for (let ctrlKey = _ctrlKey; ctrlKey <= 1; ctrlKey++) { + for (let shiftKey = _shiftKey; shiftKey <= 1; shiftKey++) { + for (let altKey = _altKey; altKey <= 1; altKey++) { this._registerIfUnknown( ctrlKey, shiftKey, altKey, scanCode, ctrlKey, shiftKey, altKey, keyCode @@ -881,44 +910,6 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { } } - private _registerAllCombos2( - hwCtrlKey: boolean, hwShiftKey: boolean, hwAltKey: boolean, scanCode: ScanCode, - kbShiftKey: boolean, keyCode: KeyCode, - ): void { - this._registerIfUnknown( - hwCtrlKey, hwShiftKey, hwAltKey, scanCode, - false, kbShiftKey, false, keyCode - ); - - if (!kbShiftKey) { - for (let _ctrl = (hwCtrlKey ? 1 : 0); _ctrl <= 1; _ctrl++) { - const ctrlKey = (_ctrl ? true : false); - for (let _alt = (hwAltKey ? 1 : 0); _alt <= 1; _alt++) { - const altKey = (_alt ? true : false); - this._registerIfUnknown( - ctrlKey, hwShiftKey, altKey, scanCode, - ctrlKey, kbShiftKey, altKey, keyCode - ); - this._registerIfUnknown( - ctrlKey, true, altKey, scanCode, - ctrlKey, true, altKey, keyCode - ); - } - } - } else { - for (let _ctrl = (hwCtrlKey ? 1 : 0); _ctrl <= 1; _ctrl++) { - const ctrlKey = (_ctrl ? true : false); - for (let _alt = (hwAltKey ? 1 : 0); _alt <= 1; _alt++) { - const altKey = (_alt ? true : false); - this._registerIfUnknown( - ctrlKey, hwShiftKey, altKey, scanCode, - ctrlKey, kbShiftKey, altKey, keyCode - ); - } - } - } - } - public simpleKeybindingToScanCodeBinding(keybinding: SimpleKeybinding): ScanCodeBinding[] { // Avoid double Enter bindings (both ScanCode.NumpadEnter and ScanCode.Enter point to KeyCode.Enter) if (keybinding.keyCode === KeyCode.Enter) { diff --git a/src/vs/workbench/services/keybinding/test/linux_de_ch.txt b/src/vs/workbench/services/keybinding/test/linux_de_ch.txt index ed9a85c54bc..aaf9263ec26 100644 --- a/src/vs/workbench/services/keybinding/test/linux_de_ch.txt +++ b/src/vs/workbench/services/keybinding/test/linux_de_ch.txt @@ -349,7 +349,6 @@ isUSStandard: false | | | ] | 1 | | | | | | | Shift+Alt+Digit9 | ) | Shift+Alt+9 | | Shift+Alt+9 | shift+alt+9 | Shift+Alt+9 | shift+alt+[Digit9] | | | Ctrl+Shift+Alt+Digit9 | ± | Ctrl+Shift+Alt+9 | | Ctrl+Shift+Alt+9 | ctrl+shift+alt+9 | Ctrl+Shift+Alt+9 | ctrl+shift+alt+[Digit9] | | -| | | Ctrl+Shift+Alt+] | 1 | | | | | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | Digit0 | 0 | 0 | | 0 | 0 | 0 | [Digit0] | | | Ctrl+Digit0 | 0 | Ctrl+0 | | Ctrl+0 | ctrl+0 | Ctrl+0 | ctrl+[Digit0] | | @@ -392,7 +391,7 @@ isUSStandard: false | Alt+BracketLeft | ü | | | Alt+ü | alt+[BracketLeft] | null | alt+[BracketLeft] | NO | | Ctrl+Alt+BracketLeft | [ | [ | | Ctrl+Alt+ü | ctrl+alt+[BracketLeft] | null | ctrl+alt+[BracketLeft] | NO | | Shift+Alt+BracketLeft | è | | | Shift+Alt+ü | shift+alt+[BracketLeft] | null | shift+alt+[BracketLeft] | NO | -| Ctrl+Shift+Alt+BracketLeft | ˚ | Ctrl+Shift+Alt+[ | | Ctrl+Shift+Alt+ü | ctrl+shift+alt+[BracketLeft] | null | ctrl+shift+alt+[BracketLeft] | NO | +| Ctrl+Shift+Alt+BracketLeft | ˚ | | | Ctrl+Shift+Alt+ü | ctrl+shift+alt+[BracketLeft] | null | ctrl+shift+alt+[BracketLeft] | NO | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | BracketRight | ¨ | | | ¨ | [BracketRight] | null | [BracketRight] | NO | | Ctrl+BracketRight | ¨ | | | Ctrl+¨ | ctrl+[BracketRight] | null | ctrl+[BracketRight] | NO | @@ -401,7 +400,7 @@ isUSStandard: false | Alt+BracketRight | ¨ | | | Alt+¨ | alt+[BracketRight] | null | alt+[BracketRight] | NO | | Ctrl+Alt+BracketRight | ] | ] | 2 | Ctrl+Alt+¨ | ctrl+alt+[BracketRight] | null | ctrl+alt+[BracketRight] | NO | | Shift+Alt+BracketRight | ! | | | Shift+Alt+¨ | shift+alt+[BracketRight] | null | shift+alt+[BracketRight] | NO | -| Ctrl+Shift+Alt+BracketRight | ¯ | Ctrl+Shift+Alt+] | 2 | Ctrl+Shift+Alt+¨ | ctrl+shift+alt+[BracketRight] | null | ctrl+shift+alt+[BracketRight] | NO | +| Ctrl+Shift+Alt+BracketRight | ¯ | | | Ctrl+Shift+Alt+¨ | ctrl+shift+alt+[BracketRight] | null | ctrl+shift+alt+[BracketRight] | NO | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -506,7 +505,7 @@ isUSStandard: false | Alt+IntlBackslash | < | Shift+Alt+, | | Alt+< | alt+[IntlBackslash] | null | alt+[IntlBackslash] | NO | | Ctrl+Alt+IntlBackslash | \ | \ | | Ctrl+Alt+< | ctrl+alt+[IntlBackslash] | null | ctrl+alt+[IntlBackslash] | NO | | Shift+Alt+IntlBackslash | > | Shift+Alt+. | | Shift+Alt+< | shift+alt+[IntlBackslash] | null | shift+alt+[IntlBackslash] | NO | -| Ctrl+Shift+Alt+IntlBackslash | ¦ | Ctrl+Shift+Alt+\ | | Ctrl+Shift+Alt+< | ctrl+shift+alt+[IntlBackslash] | null | ctrl+shift+alt+[IntlBackslash] | NO | +| Ctrl+Shift+Alt+IntlBackslash | ¦ | Ctrl+Shift+Alt+. | | Ctrl+Shift+Alt+< | ctrl+shift+alt+[IntlBackslash] | null | ctrl+shift+alt+[IntlBackslash] | NO | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | IntlRo | --- | | | null | [IntlRo] | null | [IntlRo] | NO | | Ctrl+IntlRo | --- | | | null | ctrl+[IntlRo] | null | ctrl+[IntlRo] | NO | diff --git a/src/vs/workbench/services/keybinding/test/mac_de_ch.txt b/src/vs/workbench/services/keybinding/test/mac_de_ch.txt index 0adb9f82eb5..d4274eed3e0 100644 --- a/src/vs/workbench/services/keybinding/test/mac_de_ch.txt +++ b/src/vs/workbench/services/keybinding/test/mac_de_ch.txt @@ -304,7 +304,6 @@ isUSStandard: false | | | [ | | | | | | | | Shift+Alt+Digit5 | % | Shift+Alt+5 | | Shift+Alt+5 | shift+alt+5 | Shift+Alt+5 | shift+alt+[Digit5] | | | Ctrl+Shift+Alt+Digit5 | [ | Ctrl+Shift+Alt+5 | | Ctrl+Shift+Alt+5 | ctrl+shift+alt+5 | Ctrl+Shift+Alt+5 | ctrl+shift+alt+[Digit5] | | -| | | Ctrl+Shift+Alt+[ | | | | | | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | Digit6 | 6 | 6 | | 6 | 6 | 6 | [Digit6] | | | Ctrl+Digit6 | 6 | Ctrl+6 | | Ctrl+6 | ctrl+6 | Ctrl+6 | ctrl+[Digit6] | | @@ -315,7 +314,6 @@ isUSStandard: false | | | ] | | | | | | | | Shift+Alt+Digit6 | & | Shift+Alt+6 | | Shift+Alt+6 | shift+alt+6 | Shift+Alt+6 | shift+alt+[Digit6] | | | Ctrl+Shift+Alt+Digit6 | ] | Ctrl+Shift+Alt+6 | | Ctrl+Shift+Alt+6 | ctrl+shift+alt+6 | Ctrl+Shift+Alt+6 | ctrl+shift+alt+[Digit6] | | -| | | Ctrl+Shift+Alt+] | | | | | | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- From 5df5c920b58e09345f0152af0b5421d00b76dc0e Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 May 2017 04:18:47 -0700 Subject: [PATCH 0055/1164] Simplify registrations --- .../common/macLinuxKeyboardMapper.ts | 198 +++++++++--------- 1 file changed, 96 insertions(+), 102 deletions(-) diff --git a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts index 95be462efed..15050625c50 100644 --- a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts @@ -547,6 +547,37 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { this._scanCodeToLabel = []; this._scanCodeToDispatch = []; + const _registerIfUnknown = ( + hwCtrlKey: 0 | 1, hwShiftKey: 0 | 1, hwAltKey: 0 | 1, scanCode: ScanCode, + kbCtrlKey: 0 | 1, kbShiftKey: 0 | 1, kbAltKey: 0 | 1, keyCode: KeyCode, + ): void => { + this._scanCodeKeyCodeMapper.registerIfUnknown( + new ScanCodeCombo(hwCtrlKey ? true : false, hwShiftKey ? true : false, hwAltKey ? true : false, scanCode), + new KeyCodeCombo(kbCtrlKey ? true : false, kbShiftKey ? true : false, kbAltKey ? true : false, keyCode) + ); + }; + + const _registerAllCombos = (_ctrlKey: 0 | 1, _shiftKey: 0 | 1, _altKey: 0 | 1, scanCode: ScanCode, keyCode: KeyCode): void => { + for (let ctrlKey = _ctrlKey; ctrlKey <= 1; ctrlKey++) { + for (let shiftKey = _shiftKey; shiftKey <= 1; shiftKey++) { + for (let altKey = _altKey; altKey <= 1; altKey++) { + _registerIfUnknown( + ctrlKey, shiftKey, altKey, scanCode, + ctrlKey, shiftKey, altKey, keyCode + ); + } + } + } + }; + + let producesLetter: boolean[] = []; + const _registerLetterIfMissing = (charCode: CharCode, scanCode: ScanCode, keyCode: KeyCode): void => { + if (!producesLetter[charCode]) { + _registerAllCombos(0, 0, 0, scanCode, keyCode); + } + }; + + // Initialize `_scanCodeToLabel` for (let scanCode = ScanCode.None; scanCode < ScanCode.MAX_VALUE; scanCode++) { this._scanCodeToLabel[scanCode] = null; @@ -561,7 +592,7 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { for (let scanCode = ScanCode.None; scanCode < ScanCode.MAX_VALUE; scanCode++) { const keyCode = IMMUTABLE_CODE_TO_KEY_CODE[scanCode]; if (keyCode !== -1) { - this._registerAllCombos(0, 0, 0, scanCode, keyCode); + _registerAllCombos(0, 0, 0, scanCode, keyCode); this._scanCodeToLabel[scanCode] = KeyCodeUtils.toString(keyCode); if (keyCode === KeyCode.Unknown || keyCode === KeyCode.Ctrl || keyCode === KeyCode.Meta || keyCode === KeyCode.Alt || keyCode === KeyCode.Shift) { @@ -573,7 +604,6 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { } let mappings: IScanCodeMapping[] = [], mappingsLen = 0; - let producesLetter: boolean[] = []; for (let strScanCode in rawMappings) { if (rawMappings.hasOwnProperty(strScanCode)) { const scanCode = ScanCodeUtils.toEnum(strScanCode); @@ -629,7 +659,6 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { } const kb = MacLinuxKeyboardMapper._charCodeToKb(withShiftAltGr); if (!kb) { - this._registerAllCombos(1, 1, 1, scanCode, KeyCode.Unknown); continue; } const kbShiftKey = kb.shiftKey; @@ -637,10 +666,10 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { if (kbShiftKey) { // Ctrl+Shift+Alt+ScanCode => Shift+KeyCode - this._registerIfUnknown(1, 1, 1, scanCode, 0, 1, 0, keyCode); // Ctrl+Alt+ScanCode => Shift+KeyCode + _registerIfUnknown(1, 1, 1, scanCode, 0, 1, 0, keyCode); // Ctrl+Alt+ScanCode => Shift+KeyCode } else { // Ctrl+Shift+Alt+ScanCode => KeyCode - this._registerIfUnknown(1, 1, 1, scanCode, 0, 0, 0, keyCode); // Ctrl+Alt+ScanCode => KeyCode + _registerIfUnknown(1, 1, 1, scanCode, 0, 0, 0, keyCode); // Ctrl+Alt+ScanCode => KeyCode } } // Handle all `withAltGr` entries @@ -654,7 +683,6 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { } const kb = MacLinuxKeyboardMapper._charCodeToKb(withAltGr); if (!kb) { - this._registerAllCombos(1, 0, 1, scanCode, KeyCode.Unknown); continue; } const kbShiftKey = kb.shiftKey; @@ -662,10 +690,10 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { if (kbShiftKey) { // Ctrl+Alt+ScanCode => Shift+KeyCode - this._registerIfUnknown(1, 0, 1, scanCode, 0, 1, 0, keyCode); // Ctrl+Alt+ScanCode => Shift+KeyCode + _registerIfUnknown(1, 0, 1, scanCode, 0, 1, 0, keyCode); // Ctrl+Alt+ScanCode => Shift+KeyCode } else { // Ctrl+Alt+ScanCode => KeyCode - this._registerIfUnknown(1, 0, 1, scanCode, 0, 0, 0, keyCode); // Ctrl+Alt+ScanCode => KeyCode + _registerIfUnknown(1, 0, 1, scanCode, 0, 0, 0, keyCode); // Ctrl+Alt+ScanCode => KeyCode } } // Handle all `withShift` entries @@ -679,7 +707,6 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { } const kb = MacLinuxKeyboardMapper._charCodeToKb(withShift); if (!kb) { - this._registerAllCombos(0, 1, 0, scanCode, KeyCode.Unknown); continue; } const kbShiftKey = kb.shiftKey; @@ -687,20 +714,20 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { if (kbShiftKey) { // Shift+ScanCode => Shift+KeyCode - this._registerIfUnknown(0, 1, 0, scanCode, 0, 1, 0, keyCode); // Shift+ScanCode => Shift+KeyCode - this._registerIfUnknown(0, 1, 1, scanCode, 0, 1, 1, keyCode); // Shift+Alt+ScanCode => Shift+Alt+KeyCode - this._registerIfUnknown(1, 1, 0, scanCode, 1, 1, 0, keyCode); // Ctrl+Shift+ScanCode => Ctrl+Shift+KeyCode - this._registerIfUnknown(1, 1, 1, scanCode, 1, 1, 1, keyCode); // Ctrl+Shift+Alt+ScanCode => Ctrl+Shift+Alt+KeyCode + _registerIfUnknown(0, 1, 0, scanCode, 0, 1, 0, keyCode); // Shift+ScanCode => Shift+KeyCode + _registerIfUnknown(0, 1, 1, scanCode, 0, 1, 1, keyCode); // Shift+Alt+ScanCode => Shift+Alt+KeyCode + _registerIfUnknown(1, 1, 0, scanCode, 1, 1, 0, keyCode); // Ctrl+Shift+ScanCode => Ctrl+Shift+KeyCode + _registerIfUnknown(1, 1, 1, scanCode, 1, 1, 1, keyCode); // Ctrl+Shift+Alt+ScanCode => Ctrl+Shift+Alt+KeyCode } else { // Shift+ScanCode => KeyCode - this._registerIfUnknown(0, 1, 0, scanCode, 0, 0, 0, keyCode); // Shift+ScanCode => KeyCode - this._registerIfUnknown(0, 1, 0, scanCode, 0, 1, 0, keyCode); // Shift+ScanCode => Shift+KeyCode - this._registerIfUnknown(0, 1, 1, scanCode, 0, 0, 1, keyCode); // Shift+Alt+ScanCode => Alt+KeyCode - this._registerIfUnknown(0, 1, 1, scanCode, 0, 1, 1, keyCode); // Shift+Alt+ScanCode => Shift+Alt+KeyCode - this._registerIfUnknown(1, 1, 0, scanCode, 1, 0, 0, keyCode); // Ctrl+Shift+ScanCode => Ctrl+KeyCode - this._registerIfUnknown(1, 1, 0, scanCode, 1, 1, 0, keyCode); // Ctrl+Shift+ScanCode => Ctrl+Shift+KeyCode - this._registerIfUnknown(1, 1, 1, scanCode, 1, 0, 1, keyCode); // Ctrl+Shift+Alt+ScanCode => Ctrl+Alt+KeyCode - this._registerIfUnknown(1, 1, 1, scanCode, 1, 1, 1, keyCode); // Ctrl+Shift+Alt+ScanCode => Ctrl+Shift+Alt+KeyCode + _registerIfUnknown(0, 1, 0, scanCode, 0, 0, 0, keyCode); // Shift+ScanCode => KeyCode + _registerIfUnknown(0, 1, 0, scanCode, 0, 1, 0, keyCode); // Shift+ScanCode => Shift+KeyCode + _registerIfUnknown(0, 1, 1, scanCode, 0, 0, 1, keyCode); // Shift+Alt+ScanCode => Alt+KeyCode + _registerIfUnknown(0, 1, 1, scanCode, 0, 1, 1, keyCode); // Shift+Alt+ScanCode => Shift+Alt+KeyCode + _registerIfUnknown(1, 1, 0, scanCode, 1, 0, 0, keyCode); // Ctrl+Shift+ScanCode => Ctrl+KeyCode + _registerIfUnknown(1, 1, 0, scanCode, 1, 1, 0, keyCode); // Ctrl+Shift+ScanCode => Ctrl+Shift+KeyCode + _registerIfUnknown(1, 1, 1, scanCode, 1, 0, 1, keyCode); // Ctrl+Shift+Alt+ScanCode => Ctrl+Alt+KeyCode + _registerIfUnknown(1, 1, 1, scanCode, 1, 1, 1, keyCode); // Ctrl+Shift+Alt+ScanCode => Ctrl+Shift+Alt+KeyCode } } // Handle all `value` entries @@ -709,7 +736,6 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { const scanCode = mapping.scanCode; const kb = MacLinuxKeyboardMapper._charCodeToKb(mapping.value); if (!kb) { - this._registerAllCombos(0, 0, 0, scanCode, KeyCode.Unknown); continue; } const kbShiftKey = kb.shiftKey; @@ -717,71 +743,65 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { if (kbShiftKey) { // ScanCode => Shift+KeyCode - this._registerIfUnknown(0, 0, 0, scanCode, 0, 1, 0, keyCode); // ScanCode => Shift+KeyCode - this._registerIfUnknown(0, 0, 1, scanCode, 0, 1, 1, keyCode); // Alt+ScanCode => Shift+Alt+KeyCode - this._registerIfUnknown(1, 0, 0, scanCode, 1, 1, 0, keyCode); // Ctrl+ScanCode => Ctrl+Shift+KeyCode - this._registerIfUnknown(1, 0, 1, scanCode, 1, 1, 1, keyCode); // Ctrl+Alt+ScanCode => Ctrl+Shift+Alt+KeyCode + _registerIfUnknown(0, 0, 0, scanCode, 0, 1, 0, keyCode); // ScanCode => Shift+KeyCode + _registerIfUnknown(0, 0, 1, scanCode, 0, 1, 1, keyCode); // Alt+ScanCode => Shift+Alt+KeyCode + _registerIfUnknown(1, 0, 0, scanCode, 1, 1, 0, keyCode); // Ctrl+ScanCode => Ctrl+Shift+KeyCode + _registerIfUnknown(1, 0, 1, scanCode, 1, 1, 1, keyCode); // Ctrl+Alt+ScanCode => Ctrl+Shift+Alt+KeyCode } else { // ScanCode => KeyCode - this._registerIfUnknown(0, 0, 0, scanCode, 0, 0, 0, keyCode); // ScanCode => KeyCode - this._registerIfUnknown(0, 0, 1, scanCode, 0, 0, 1, keyCode); // Alt+ScanCode => Alt+KeyCode - this._registerIfUnknown(0, 1, 0, scanCode, 0, 1, 0, keyCode); // Shift+ScanCode => Shift+KeyCode - this._registerIfUnknown(0, 1, 1, scanCode, 0, 1, 1, keyCode); // Shift+Alt+ScanCode => Shift+Alt+KeyCode - this._registerIfUnknown(1, 0, 0, scanCode, 1, 0, 0, keyCode); // Ctrl+ScanCode => Ctrl+KeyCode - this._registerIfUnknown(1, 0, 1, scanCode, 1, 0, 1, keyCode); // Ctrl+Alt+ScanCode => Ctrl+Alt+KeyCode - this._registerIfUnknown(1, 1, 0, scanCode, 1, 1, 0, keyCode); // Ctrl+Shift+ScanCode => Ctrl+Shift+KeyCode - this._registerIfUnknown(1, 1, 1, scanCode, 1, 1, 1, keyCode); // Ctrl+Shift+Alt+ScanCode => Ctrl+Shift+Alt+KeyCode + _registerIfUnknown(0, 0, 0, scanCode, 0, 0, 0, keyCode); // ScanCode => KeyCode + _registerIfUnknown(0, 0, 1, scanCode, 0, 0, 1, keyCode); // Alt+ScanCode => Alt+KeyCode + _registerIfUnknown(0, 1, 0, scanCode, 0, 1, 0, keyCode); // Shift+ScanCode => Shift+KeyCode + _registerIfUnknown(0, 1, 1, scanCode, 0, 1, 1, keyCode); // Shift+Alt+ScanCode => Shift+Alt+KeyCode + _registerIfUnknown(1, 0, 0, scanCode, 1, 0, 0, keyCode); // Ctrl+ScanCode => Ctrl+KeyCode + _registerIfUnknown(1, 0, 1, scanCode, 1, 0, 1, keyCode); // Ctrl+Alt+ScanCode => Ctrl+Alt+KeyCode + _registerIfUnknown(1, 1, 0, scanCode, 1, 1, 0, keyCode); // Ctrl+Shift+ScanCode => Ctrl+Shift+KeyCode + _registerIfUnknown(1, 1, 1, scanCode, 1, 1, 1, keyCode); // Ctrl+Shift+Alt+ScanCode => Ctrl+Shift+Alt+KeyCode } } // Handle all left-over available digits - this._registerAllCombos(0, 0, 0, ScanCode.Digit1, KeyCode.KEY_1); - this._registerAllCombos(0, 0, 0, ScanCode.Digit2, KeyCode.KEY_2); - this._registerAllCombos(0, 0, 0, ScanCode.Digit3, KeyCode.KEY_3); - this._registerAllCombos(0, 0, 0, ScanCode.Digit4, KeyCode.KEY_4); - this._registerAllCombos(0, 0, 0, ScanCode.Digit5, KeyCode.KEY_5); - this._registerAllCombos(0, 0, 0, ScanCode.Digit6, KeyCode.KEY_6); - this._registerAllCombos(0, 0, 0, ScanCode.Digit7, KeyCode.KEY_7); - this._registerAllCombos(0, 0, 0, ScanCode.Digit8, KeyCode.KEY_8); - this._registerAllCombos(0, 0, 0, ScanCode.Digit9, KeyCode.KEY_9); - this._registerAllCombos(0, 0, 0, ScanCode.Digit0, KeyCode.KEY_0); + _registerAllCombos(0, 0, 0, ScanCode.Digit1, KeyCode.KEY_1); + _registerAllCombos(0, 0, 0, ScanCode.Digit2, KeyCode.KEY_2); + _registerAllCombos(0, 0, 0, ScanCode.Digit3, KeyCode.KEY_3); + _registerAllCombos(0, 0, 0, ScanCode.Digit4, KeyCode.KEY_4); + _registerAllCombos(0, 0, 0, ScanCode.Digit5, KeyCode.KEY_5); + _registerAllCombos(0, 0, 0, ScanCode.Digit6, KeyCode.KEY_6); + _registerAllCombos(0, 0, 0, ScanCode.Digit7, KeyCode.KEY_7); + _registerAllCombos(0, 0, 0, ScanCode.Digit8, KeyCode.KEY_8); + _registerAllCombos(0, 0, 0, ScanCode.Digit9, KeyCode.KEY_9); + _registerAllCombos(0, 0, 0, ScanCode.Digit0, KeyCode.KEY_0); // Ensure letters are mapped - this._registerLetterIfMissing(producesLetter, CharCode.A, ScanCode.KeyA, KeyCode.KEY_A); - this._registerLetterIfMissing(producesLetter, CharCode.B, ScanCode.KeyB, KeyCode.KEY_B); - this._registerLetterIfMissing(producesLetter, CharCode.C, ScanCode.KeyC, KeyCode.KEY_C); - this._registerLetterIfMissing(producesLetter, CharCode.D, ScanCode.KeyD, KeyCode.KEY_D); - this._registerLetterIfMissing(producesLetter, CharCode.E, ScanCode.KeyE, KeyCode.KEY_E); - this._registerLetterIfMissing(producesLetter, CharCode.F, ScanCode.KeyF, KeyCode.KEY_F); - this._registerLetterIfMissing(producesLetter, CharCode.G, ScanCode.KeyG, KeyCode.KEY_G); - this._registerLetterIfMissing(producesLetter, CharCode.H, ScanCode.KeyH, KeyCode.KEY_H); - this._registerLetterIfMissing(producesLetter, CharCode.I, ScanCode.KeyI, KeyCode.KEY_I); - this._registerLetterIfMissing(producesLetter, CharCode.J, ScanCode.KeyJ, KeyCode.KEY_J); - this._registerLetterIfMissing(producesLetter, CharCode.K, ScanCode.KeyK, KeyCode.KEY_K); - this._registerLetterIfMissing(producesLetter, CharCode.L, ScanCode.KeyL, KeyCode.KEY_L); - this._registerLetterIfMissing(producesLetter, CharCode.M, ScanCode.KeyM, KeyCode.KEY_M); - this._registerLetterIfMissing(producesLetter, CharCode.N, ScanCode.KeyN, KeyCode.KEY_N); - this._registerLetterIfMissing(producesLetter, CharCode.O, ScanCode.KeyO, KeyCode.KEY_O); - this._registerLetterIfMissing(producesLetter, CharCode.P, ScanCode.KeyP, KeyCode.KEY_P); - this._registerLetterIfMissing(producesLetter, CharCode.Q, ScanCode.KeyQ, KeyCode.KEY_Q); - this._registerLetterIfMissing(producesLetter, CharCode.R, ScanCode.KeyR, KeyCode.KEY_R); - this._registerLetterIfMissing(producesLetter, CharCode.S, ScanCode.KeyS, KeyCode.KEY_S); - this._registerLetterIfMissing(producesLetter, CharCode.T, ScanCode.KeyT, KeyCode.KEY_T); - this._registerLetterIfMissing(producesLetter, CharCode.U, ScanCode.KeyU, KeyCode.KEY_U); - this._registerLetterIfMissing(producesLetter, CharCode.V, ScanCode.KeyV, KeyCode.KEY_V); - this._registerLetterIfMissing(producesLetter, CharCode.W, ScanCode.KeyW, KeyCode.KEY_W); - this._registerLetterIfMissing(producesLetter, CharCode.X, ScanCode.KeyX, KeyCode.KEY_X); - this._registerLetterIfMissing(producesLetter, CharCode.Y, ScanCode.KeyY, KeyCode.KEY_Y); - this._registerLetterIfMissing(producesLetter, CharCode.Z, ScanCode.KeyZ, KeyCode.KEY_Z); + _registerLetterIfMissing(CharCode.A, ScanCode.KeyA, KeyCode.KEY_A); + _registerLetterIfMissing(CharCode.B, ScanCode.KeyB, KeyCode.KEY_B); + _registerLetterIfMissing(CharCode.C, ScanCode.KeyC, KeyCode.KEY_C); + _registerLetterIfMissing(CharCode.D, ScanCode.KeyD, KeyCode.KEY_D); + _registerLetterIfMissing(CharCode.E, ScanCode.KeyE, KeyCode.KEY_E); + _registerLetterIfMissing(CharCode.F, ScanCode.KeyF, KeyCode.KEY_F); + _registerLetterIfMissing(CharCode.G, ScanCode.KeyG, KeyCode.KEY_G); + _registerLetterIfMissing(CharCode.H, ScanCode.KeyH, KeyCode.KEY_H); + _registerLetterIfMissing(CharCode.I, ScanCode.KeyI, KeyCode.KEY_I); + _registerLetterIfMissing(CharCode.J, ScanCode.KeyJ, KeyCode.KEY_J); + _registerLetterIfMissing(CharCode.K, ScanCode.KeyK, KeyCode.KEY_K); + _registerLetterIfMissing(CharCode.L, ScanCode.KeyL, KeyCode.KEY_L); + _registerLetterIfMissing(CharCode.M, ScanCode.KeyM, KeyCode.KEY_M); + _registerLetterIfMissing(CharCode.N, ScanCode.KeyN, KeyCode.KEY_N); + _registerLetterIfMissing(CharCode.O, ScanCode.KeyO, KeyCode.KEY_O); + _registerLetterIfMissing(CharCode.P, ScanCode.KeyP, KeyCode.KEY_P); + _registerLetterIfMissing(CharCode.Q, ScanCode.KeyQ, KeyCode.KEY_Q); + _registerLetterIfMissing(CharCode.R, ScanCode.KeyR, KeyCode.KEY_R); + _registerLetterIfMissing(CharCode.S, ScanCode.KeyS, KeyCode.KEY_S); + _registerLetterIfMissing(CharCode.T, ScanCode.KeyT, KeyCode.KEY_T); + _registerLetterIfMissing(CharCode.U, ScanCode.KeyU, KeyCode.KEY_U); + _registerLetterIfMissing(CharCode.V, ScanCode.KeyV, KeyCode.KEY_V); + _registerLetterIfMissing(CharCode.W, ScanCode.KeyW, KeyCode.KEY_W); + _registerLetterIfMissing(CharCode.X, ScanCode.KeyX, KeyCode.KEY_X); + _registerLetterIfMissing(CharCode.Y, ScanCode.KeyY, KeyCode.KEY_Y); + _registerLetterIfMissing(CharCode.Z, ScanCode.KeyZ, KeyCode.KEY_Z); this._scanCodeKeyCodeMapper.registrationComplete(); } - private _registerLetterIfMissing(producesLetter: boolean[], charCode: CharCode, scanCode: ScanCode, keyCode: KeyCode): void { - if (!producesLetter[charCode]) { - this._registerAllCombos(0, 0, 0, scanCode, keyCode); - } - } - public dumpDebugInfo(): string { let result: string[] = []; @@ -884,32 +904,6 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { return str; } - private _registerIfUnknown( - hwCtrlKey: 0 | 1, hwShiftKey: 0 | 1, hwAltKey: 0 | 1, scanCode: ScanCode, - kbCtrlKey: 0 | 1, kbShiftKey: 0 | 1, kbAltKey: 0 | 1, keyCode: KeyCode, - ): void { - this._scanCodeKeyCodeMapper.registerIfUnknown( - new ScanCodeCombo(hwCtrlKey ? true : false, hwShiftKey ? true : false, hwAltKey ? true : false, scanCode), - new KeyCodeCombo(kbCtrlKey ? true : false, kbShiftKey ? true : false, kbAltKey ? true : false, keyCode) - ); - } - - private _registerAllCombos( - _ctrlKey: 0 | 1, _shiftKey: 0 | 1, _altKey: 0 | 1, scanCode: ScanCode, - keyCode: KeyCode, - ): void { - for (let ctrlKey = _ctrlKey; ctrlKey <= 1; ctrlKey++) { - for (let shiftKey = _shiftKey; shiftKey <= 1; shiftKey++) { - for (let altKey = _altKey; altKey <= 1; altKey++) { - this._registerIfUnknown( - ctrlKey, shiftKey, altKey, scanCode, - ctrlKey, shiftKey, altKey, keyCode - ); - } - } - } - } - public simpleKeybindingToScanCodeBinding(keybinding: SimpleKeybinding): ScanCodeBinding[] { // Avoid double Enter bindings (both ScanCode.NumpadEnter and ScanCode.Enter point to KeyCode.Enter) if (keybinding.keyCode === KeyCode.Enter) { From 31d62841b6d44d97636ec164c3ecce87102f9564 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 May 2017 05:34:29 -0700 Subject: [PATCH 0056/1164] Debt: Correct types for ResolvedKeybinding.getParts() --- .../ui/keybindingLabel/keybindingLabel.ts | 14 +++--- src/vs/base/common/keyCodes.ts | 23 +++++++++- .../common/usLayoutResolvedKeybinding.ts | 24 ++++++++-- .../common/keybindingsEditorModel.ts | 44 +++++++++---------- .../common/macLinuxKeyboardMapper.ts | 24 ++++++++-- .../common/windowsKeyboardMapper.ts | 24 ++++++++-- 6 files changed, 113 insertions(+), 40 deletions(-) diff --git a/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.ts b/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.ts index e2a7ae59e08..e75c3faade7 100644 --- a/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.ts +++ b/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.ts @@ -8,7 +8,7 @@ import 'vs/css!./keybindingLabel'; import { IDisposable } from 'vs/base/common/lifecycle'; import { equals } from 'vs/base/common/objects'; import { OperatingSystem } from 'vs/base/common/platform'; -import { ResolvedKeybinding } from 'vs/base/common/keycodes'; +import { ResolvedKeybinding, ResolvedKeybindingPart } from 'vs/base/common/keyCodes'; import { UILabelProvider } from 'vs/platform/keybinding/common/keybindingLabels'; import * as dom from 'vs/base/browser/dom'; @@ -72,21 +72,21 @@ export class KeybindingLabel implements IDisposable { this.didEverRender = true; } - private renderPart(parent: HTMLElement, part: ResolvedKeybinding, match: PartMatches) { + private renderPart(parent: HTMLElement, part: ResolvedKeybindingPart, match: PartMatches) { const modifierLabels = UILabelProvider.modifierLabels[this.os]; - if (part.hasCtrlModifier()) { + if (part.ctrlKey) { this.renderKey(parent, modifierLabels.ctrlKey, match && match.ctrlKey, modifierLabels.separator); } - if (part.hasShiftModifier()) { + if (part.shiftKey) { this.renderKey(parent, modifierLabels.shiftKey, match && match.shiftKey, modifierLabels.separator); } - if (part.hasAltModifier()) { + if (part.altKey) { this.renderKey(parent, modifierLabels.altKey, match && match.altKey, modifierLabels.separator); } - if (part.hasMetaModifier()) { + if (part.metaKey) { this.renderKey(parent, modifierLabels.metaKey, match && match.metaKey, modifierLabels.separator); } - const keyLabel = part.getLabelWithoutModifiers(); + const keyLabel = part.kbLabel; if (keyLabel) { this.renderKey(parent, keyLabel, match && match.keyCode, ''); } diff --git a/src/vs/base/common/keyCodes.ts b/src/vs/base/common/keyCodes.ts index 5ee34736992..289e2811aab 100644 --- a/src/vs/base/common/keyCodes.ts +++ b/src/vs/base/common/keyCodes.ts @@ -546,8 +546,27 @@ export class ChordKeybinding { export type Keybinding = SimpleKeybinding | ChordKeybinding; +export class ResolvedKeybindingPart { + readonly ctrlKey: boolean; + readonly shiftKey: boolean; + readonly altKey: boolean; + readonly metaKey: boolean; + + readonly kbLabel: string; + readonly kbAriaLabel: string; + + constructor(ctrlKey: boolean, shiftKey: boolean, altKey: boolean, metaKey: boolean, kbLabel: string, kbAriaLabel: string) { + this.ctrlKey = ctrlKey; + this.shiftKey = shiftKey; + this.altKey = altKey; + this.metaKey = metaKey; + this.kbLabel = kbLabel; + this.kbAriaLabel = kbAriaLabel; + } +} + /** - * A resolved keybinding. + * A resolved keybinding. Can be a simple keybinding or a chord keybinding. */ export abstract class ResolvedKeybinding { /** @@ -612,5 +631,5 @@ export abstract class ResolvedKeybinding { /** * Returns the firstPart, chordPart of the keybinding */ - public abstract getParts(): [ResolvedKeybinding, ResolvedKeybinding]; + public abstract getParts(): [ResolvedKeybindingPart, ResolvedKeybindingPart]; } diff --git a/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding.ts b/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding.ts index 5e204fc8be2..7529049b837 100644 --- a/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding.ts +++ b/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { ResolvedKeybinding, KeyCode, KeyCodeUtils, USER_SETTINGS, Keybinding, KeybindingType, SimpleKeybinding } from 'vs/base/common/keyCodes'; +import { ResolvedKeybinding, ResolvedKeybindingPart, KeyCode, KeyCodeUtils, USER_SETTINGS, Keybinding, KeybindingType, SimpleKeybinding } from 'vs/base/common/keyCodes'; import { UILabelProvider, AriaLabelProvider, ElectronAcceleratorLabelProvider, UserSettingsLabelProvider, NO_MODIFIERS } from 'vs/platform/keybinding/common/keybindingLabels'; import { OperatingSystem } from 'vs/base/common/platform'; @@ -185,8 +185,26 @@ export class USLayoutResolvedKeybinding extends ResolvedKeybinding { return this._firstPart.metaKey; } - public getParts(): [ResolvedKeybinding, ResolvedKeybinding] { - return [new USLayoutResolvedKeybinding(this._firstPart, this._os), this._chordPart ? new USLayoutResolvedKeybinding(this._chordPart, this._os) : null]; + public getParts(): [ResolvedKeybindingPart, ResolvedKeybindingPart] { + return [ + this._toResolvedKeybindingPart(this._firstPart), + this._toResolvedKeybindingPart(this._chordPart) + ]; + } + + private _toResolvedKeybindingPart(keybinding: SimpleKeybinding): ResolvedKeybindingPart { + if (!keybinding) { + return null; + } + + return new ResolvedKeybindingPart( + keybinding.ctrlKey, + keybinding.shiftKey, + keybinding.altKey, + keybinding.metaKey, + this._getUILabelForKeybinding(keybinding), + this._getAriaLabelForKeybinding(keybinding) + ); } public getDispatchParts(): [string, string] { diff --git a/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.ts b/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.ts index a1f187ccc31..43b5b6f0c26 100644 --- a/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.ts +++ b/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.ts @@ -10,7 +10,7 @@ import * as strings from 'vs/base/common/strings'; import { OperatingSystem, language, LANGUAGE_DEFAULT } from 'vs/base/common/platform'; import { IMatch, IFilter, or, matchesContiguousSubString, matchesPrefix, matchesCamelCase, matchesWords } from 'vs/base/common/filters'; import { Registry } from 'vs/platform/platform'; -import { ResolvedKeybinding } from 'vs/base/common/keyCodes'; +import { ResolvedKeybinding, ResolvedKeybindingPart } from 'vs/base/common/keyCodes'; import { AriaLabelProvider, UserSettingsLabelProvider, UILabelProvider, ModifierLabels as ModLabels } from 'vs/platform/keybinding/common/keybindingLabels'; import { CommonEditorRegistry, EditorAction } from 'vs/editor/common/editorCommonExtensions'; import { MenuRegistry, ILocalizedString, SyncActionDescriptor, ICommandAction } from 'vs/platform/actions/common/actions'; @@ -355,7 +355,7 @@ class KeybindingItemMatches { return this.hasAnyMatch(firstPartMatch) || this.hasAnyMatch(chordPartMatch) ? { firstPart: firstPartMatch, chordPart: chordPartMatch } : null; } - private matchPart(part: ResolvedKeybinding, match: KeybindingMatch, word: string): boolean { + private matchPart(part: ResolvedKeybindingPart, match: KeybindingMatch, word: string): boolean { let matched = false; if (this.matchesMetaModifier(part, word)) { matched = true; @@ -380,11 +380,11 @@ class KeybindingItemMatches { return matched; } - private matchesKeyCode(keybinding: ResolvedKeybinding, word: string): boolean { + private matchesKeyCode(keybinding: ResolvedKeybindingPart, word: string): boolean { if (!keybinding) { return false; } - const ariaLabel = keybinding.getAriaLabelWithoutModifiers(); + const ariaLabel = keybinding.kbAriaLabel; if (ariaLabel.length === 1 || word.length === 1) { if (strings.compareIgnoreCase(ariaLabel, word) === 0) { return true; @@ -397,11 +397,11 @@ class KeybindingItemMatches { return false; } - private matchesMetaModifier(keybinding: ResolvedKeybinding, word: string): boolean { + private matchesMetaModifier(keybinding: ResolvedKeybindingPart, word: string): boolean { if (!keybinding) { return false; } - if (!keybinding.hasMetaModifier()) { + if (!keybinding.metaKey) { return false; } return this.wordMatchesMetaModifier(word); @@ -423,11 +423,11 @@ class KeybindingItemMatches { return false; } - private matchesCtrlModifier(keybinding: ResolvedKeybinding, word: string): boolean { + private matchesCtrlModifier(keybinding: ResolvedKeybindingPart, word: string): boolean { if (!keybinding) { return false; } - if (!keybinding.hasCtrlModifier()) { + if (!keybinding.ctrlKey) { return false; } return this.wordMatchesCtrlModifier(word); @@ -446,11 +446,11 @@ class KeybindingItemMatches { return false; } - private matchesShiftModifier(keybinding: ResolvedKeybinding, word: string): boolean { + private matchesShiftModifier(keybinding: ResolvedKeybindingPart, word: string): boolean { if (!keybinding) { return false; } - if (!keybinding.hasShiftModifier()) { + if (!keybinding.shiftKey) { return false; } return this.wordMatchesShiftModifier(word); @@ -469,11 +469,11 @@ class KeybindingItemMatches { return false; } - private matchesAltModifier(keybinding: ResolvedKeybinding, word: string): boolean { + private matchesAltModifier(keybinding: ResolvedKeybindingPart, word: string): boolean { if (!keybinding) { return false; } - if (!keybinding.hasAltModifier()) { + if (!keybinding.altKey) { return false; } return this.wordMatchesAltModifier(word); @@ -503,42 +503,42 @@ class KeybindingItemMatches { keybindingMatch.keyCode; } - private isCompleteMatch(part: ResolvedKeybinding, match: KeybindingMatch): boolean { + private isCompleteMatch(part: ResolvedKeybindingPart, match: KeybindingMatch): boolean { if (!part) { return true; } if (!match.keyCode) { return false; } - if (part.hasMetaModifier() && !match.metaKey) { + if (part.metaKey && !match.metaKey) { return false; } - if (part.hasAltModifier() && !match.altKey) { + if (part.altKey && !match.altKey) { return false; } - if (part.hasCtrlModifier() && !match.ctrlKey) { + if (part.ctrlKey && !match.ctrlKey) { return false; } - if (part.hasShiftModifier() && !match.shiftKey) { + if (part.shiftKey && !match.shiftKey) { return false; } return true; } - private createCompleteMatch(part: ResolvedKeybinding): KeybindingMatch { + private createCompleteMatch(part: ResolvedKeybindingPart): KeybindingMatch { let match: KeybindingMatch = {}; if (part) { match.keyCode = true; - if (part.hasMetaModifier()) { + if (part.metaKey) { match.metaKey = true; } - if (part.hasAltModifier()) { + if (part.altKey) { match.altKey = true; } - if (part.hasCtrlModifier()) { + if (part.ctrlKey) { match.ctrlKey = true; } - if (part.hasShiftModifier()) { + if (part.shiftKey) { match.shiftKey = true; } } diff --git a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts index 15050625c50..51cb59538fc 100644 --- a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts @@ -6,7 +6,7 @@ 'use strict'; import { OperatingSystem } from 'vs/base/common/platform'; -import { KeyCode, ResolvedKeybinding, KeyCodeUtils, SimpleKeybinding, Keybinding, KeybindingType, USER_SETTINGS } from 'vs/base/common/keyCodes'; +import { KeyCode, ResolvedKeybinding, KeyCodeUtils, SimpleKeybinding, Keybinding, KeybindingType, USER_SETTINGS, ResolvedKeybindingPart } from 'vs/base/common/keyCodes'; import { ScanCode, ScanCodeUtils, IMMUTABLE_CODE_TO_KEY_CODE, IMMUTABLE_KEY_CODE_TO_CODE, ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCode'; import { CharCode } from 'vs/base/common/charCode'; import { UILabelProvider, AriaLabelProvider, UserSettingsLabelProvider, ElectronAcceleratorLabelProvider, NO_MODIFIERS } from 'vs/platform/keybinding/common/keybindingLabels'; @@ -222,8 +222,26 @@ export class NativeResolvedKeybinding extends ResolvedKeybinding { return this._firstPart.metaKey; } - public getParts(): [ResolvedKeybinding, ResolvedKeybinding] { - return [new NativeResolvedKeybinding(this._mapper, this._OS, this._firstPart, null), this._chordPart ? new NativeResolvedKeybinding(this._mapper, this._OS, this._chordPart, null) : null]; + public getParts(): [ResolvedKeybindingPart, ResolvedKeybindingPart] { + return [ + this._toResolvedKeybindingPart(this._firstPart), + this._toResolvedKeybindingPart(this._chordPart) + ]; + } + + private _toResolvedKeybindingPart(binding: ScanCodeBinding): ResolvedKeybindingPart { + if (!binding) { + return null; + } + + return new ResolvedKeybindingPart( + binding.ctrlKey, + binding.shiftKey, + binding.altKey, + binding.metaKey, + this._getUILabelForScanCodeBinding(binding), + this._getAriaLabelForScanCodeBinding(binding) + ); } public getDispatchParts(): [string, string] { diff --git a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts index 04c1a8e4010..3add1f33869 100644 --- a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts @@ -5,7 +5,7 @@ 'use strict'; -import { KeyCode, KeyCodeUtils, ResolvedKeybinding, Keybinding, SimpleKeybinding, KeybindingType, USER_SETTINGS } from 'vs/base/common/keyCodes'; +import { KeyCode, KeyCodeUtils, ResolvedKeybinding, Keybinding, SimpleKeybinding, KeybindingType, USER_SETTINGS, ResolvedKeybindingPart } from 'vs/base/common/keyCodes'; import { ScanCode, ScanCodeUtils, IMMUTABLE_CODE_TO_KEY_CODE, ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCode'; import { CharCode } from 'vs/base/common/charCode'; import { UILabelProvider, AriaLabelProvider, ElectronAcceleratorLabelProvider, UserSettingsLabelProvider, NO_MODIFIERS } from 'vs/platform/keybinding/common/keybindingLabels'; @@ -235,8 +235,26 @@ export class WindowsNativeResolvedKeybinding extends ResolvedKeybinding { return this._firstPart.metaKey; } - public getParts(): [ResolvedKeybinding, ResolvedKeybinding] { - return [new WindowsNativeResolvedKeybinding(this._mapper, this._firstPart, null), this._chordPart ? new WindowsNativeResolvedKeybinding(this._mapper, this._chordPart, null) : null]; + public getParts(): [ResolvedKeybindingPart, ResolvedKeybindingPart] { + return [ + this._toResolvedKeybindingPart(this._firstPart), + this._toResolvedKeybindingPart(this._chordPart) + ]; + } + + private _toResolvedKeybindingPart(keybinding: SimpleKeybinding): ResolvedKeybindingPart { + if (!keybinding) { + return null; + } + + return new ResolvedKeybindingPart( + keybinding.ctrlKey, + keybinding.shiftKey, + keybinding.altKey, + keybinding.metaKey, + this._getUILabelForKeybinding(keybinding), + this._getAriaLabelForKeybinding(keybinding) + ); } public getDispatchParts(): [string, string] { From c688f7c57985fc91caff3d196a7d3ef28799f309 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 May 2017 05:52:52 -0700 Subject: [PATCH 0057/1164] Remove unused ResolvedKeybinding methods --- src/vs/base/common/keyCodes.ts | 31 +- .../quickopen/browser/quickOpenWidget.ts | 11 +- .../keybinding/common/keybindingLabels.ts | 7 - .../common/usLayoutResolvedKeybinding.ts | 42 +- .../test/common/keybindingLabels.test.ts | 63 --- .../browser/parts/editor/editorPicker.ts | 8 +- .../common/macLinuxKeyboardMapper.ts | 42 +- .../common/windowsKeyboardMapper.ts | 42 +- .../test/keyboardMapperTestUtils.ts | 12 - .../macLinuxFallbackKeyboardMapper.test.ts | 66 --- .../test/macLinuxKeyboardMapper.test.ts | 396 ------------------ .../test/windowsKeyboardMapper.test.ts | 120 ------ 12 files changed, 18 insertions(+), 822 deletions(-) diff --git a/src/vs/base/common/keyCodes.ts b/src/vs/base/common/keyCodes.ts index 289e2811aab..bed55f19ceb 100644 --- a/src/vs/base/common/keyCodes.ts +++ b/src/vs/base/common/keyCodes.ts @@ -573,18 +573,10 @@ export abstract class ResolvedKeybinding { * This prints the binding in a format suitable for displaying in the UI. */ public abstract getLabel(): string; - /** - * Returns the UI label of the binding without modifiers - */ - public abstract getLabelWithoutModifiers(): string; /** * This prints the binding in a format suitable for ARIA. */ public abstract getAriaLabel(): string; - /** - * Returns the ARIA label of the bindings without modifiers - */ - public abstract getAriaLabelWithoutModifiers(): string; /** * This prints the binding in a format suitable for electron's accelerators. * See https://github.com/electron/electron/blob/master/docs/api/accelerator.md @@ -603,33 +595,14 @@ export abstract class ResolvedKeybinding { * Is the binding a chord? */ public abstract isChord(): boolean; - /** - * Does this binding use the ctrl modifier key. - * If it is a chord, it always returns false. - */ - public abstract hasCtrlModifier(): boolean; - /** - * Does this binding use the shift modifier key. - * If it is a chord, it always returns false. - */ - public abstract hasShiftModifier(): boolean; - /** - * Does this binding use the alt modifier key. - * If it is a chord, it always returns false. - */ - public abstract hasAltModifier(): boolean; - /** - * Does this binding use the meta modifier key. - * If it is a chord, it always returns false. - */ - public abstract hasMetaModifier(): boolean; /** * Returns the firstPart, chordPart that should be used for dispatching. */ public abstract getDispatchParts(): [string, string]; /** - * Returns the firstPart, chordPart of the keybinding + * Returns the firstPart, chordPart of the keybinding. + * For simple keybindings, the second element will be null. */ public abstract getParts(): [ResolvedKeybindingPart, ResolvedKeybindingPart]; } diff --git a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts index c5e7f8c2ae7..d83ef8e8380 100644 --- a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts +++ b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts @@ -279,11 +279,12 @@ export class QuickOpenWidget implements IModelProvider { // Select element when keys are pressed that signal it const quickNavKeys = this.quickNavigateConfiguration.keybindings; const wasTriggerKeyPressed = keyCode === KeyCode.Enter || quickNavKeys.some((k) => { - if (k.isChord()) { + const [firstPart, chordPart] = k.getParts(); + if (chordPart) { return false; } - if (k.hasShiftModifier() && keyCode === KeyCode.Shift) { + if (firstPart.shiftKey && keyCode === KeyCode.Shift) { if (keyboardEvent.ctrlKey || keyboardEvent.altKey || keyboardEvent.metaKey) { return false; // this is an optimistic check for the shift key being used to navigate back in quick open } @@ -291,15 +292,15 @@ export class QuickOpenWidget implements IModelProvider { return true; } - if (k.hasAltModifier() && keyCode === KeyCode.Alt) { + if (firstPart.altKey && keyCode === KeyCode.Alt) { return true; } - if (k.hasCtrlModifier() && keyCode === KeyCode.Ctrl) { + if (firstPart.ctrlKey && keyCode === KeyCode.Ctrl) { return true; } - if (k.hasMetaModifier() && keyCode === KeyCode.Meta) { + if (firstPart.metaKey && keyCode === KeyCode.Meta) { return true; } diff --git a/src/vs/platform/keybinding/common/keybindingLabels.ts b/src/vs/platform/keybinding/common/keybindingLabels.ts index ef961ee79c5..c9a7cec8e18 100644 --- a/src/vs/platform/keybinding/common/keybindingLabels.ts +++ b/src/vs/platform/keybinding/common/keybindingLabels.ts @@ -23,13 +23,6 @@ export interface Modifiers { readonly metaKey: boolean; } -export const NO_MODIFIERS: Modifiers = { - ctrlKey: false, - shiftKey: false, - altKey: false, - metaKey: false -}; - export class ModifierLabelProvider { public readonly modifierLabels: ModifierLabels[]; diff --git a/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding.ts b/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding.ts index 7529049b837..11bf5ad1801 100644 --- a/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding.ts +++ b/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding.ts @@ -5,7 +5,7 @@ 'use strict'; import { ResolvedKeybinding, ResolvedKeybindingPart, KeyCode, KeyCodeUtils, USER_SETTINGS, Keybinding, KeybindingType, SimpleKeybinding } from 'vs/base/common/keyCodes'; -import { UILabelProvider, AriaLabelProvider, ElectronAcceleratorLabelProvider, UserSettingsLabelProvider, NO_MODIFIERS } from 'vs/platform/keybinding/common/keybindingLabels'; +import { UILabelProvider, AriaLabelProvider, ElectronAcceleratorLabelProvider, UserSettingsLabelProvider } from 'vs/platform/keybinding/common/keybindingLabels'; import { OperatingSystem } from 'vs/base/common/platform'; /** @@ -64,12 +64,6 @@ export class USLayoutResolvedKeybinding extends ResolvedKeybinding { return UILabelProvider.toLabel(this._firstPart, firstPart, this._chordPart, chordPart, this._os); } - public getLabelWithoutModifiers(): string { - let firstPart = this._getUILabelForKeybinding(this._firstPart); - let chordPart = this._getUILabelForKeybinding(this._chordPart); - return UILabelProvider.toLabel(NO_MODIFIERS, firstPart, NO_MODIFIERS, chordPart, this._os); - } - private _getAriaLabelForKeybinding(keybinding: SimpleKeybinding): string { if (!keybinding) { return null; @@ -86,12 +80,6 @@ export class USLayoutResolvedKeybinding extends ResolvedKeybinding { return AriaLabelProvider.toLabel(this._firstPart, firstPart, this._chordPart, chordPart, this._os); } - public getAriaLabelWithoutModifiers(): string { - let firstPart = this._getAriaLabelForKeybinding(this._firstPart); - let chordPart = this._getAriaLabelForKeybinding(this._chordPart); - return AriaLabelProvider.toLabel(NO_MODIFIERS, firstPart, NO_MODIFIERS, chordPart, this._os); - } - private _keyCodeToElectronAccelerator(keyCode: KeyCode): string { if (keyCode >= KeyCode.NUMPAD_0 && keyCode <= KeyCode.NUMPAD_DIVIDE) { // Electron cannot handle numpad keys @@ -157,34 +145,6 @@ export class USLayoutResolvedKeybinding extends ResolvedKeybinding { return (this._chordPart ? true : false); } - public hasCtrlModifier(): boolean { - if (this._chordPart) { - return false; - } - return this._firstPart.ctrlKey; - } - - public hasShiftModifier(): boolean { - if (this._chordPart) { - return false; - } - return this._firstPart.shiftKey; - } - - public hasAltModifier(): boolean { - if (this._chordPart) { - return false; - } - return this._firstPart.altKey; - } - - public hasMetaModifier(): boolean { - if (this._chordPart) { - return false; - } - return this._firstPart.metaKey; - } - public getParts(): [ResolvedKeybindingPart, ResolvedKeybindingPart] { return [ this._toResolvedKeybindingPart(this._firstPart), diff --git a/src/vs/platform/keybinding/test/common/keybindingLabels.test.ts b/src/vs/platform/keybinding/test/common/keybindingLabels.test.ts index dacc7a9e157..19f285354cc 100644 --- a/src/vs/platform/keybinding/test/common/keybindingLabels.test.ts +++ b/src/vs/platform/keybinding/test/common/keybindingLabels.test.ts @@ -16,25 +16,15 @@ suite('KeybindingLabels', () => { assert.equal(usResolvedKeybinding.getLabel(), expected); } - function assertUSLabelWithoutModifiers(OS: OperatingSystem, keybinding: number, expected: string): void { - const usResolvedKeybinding = new USLayoutResolvedKeybinding(createKeybinding(keybinding, OS), OS); - assert.equal(usResolvedKeybinding.getLabelWithoutModifiers(), expected); - } - test('Windows US label', () => { // no modifier assertUSLabel(OperatingSystem.Windows, KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Windows, KeyCode.KEY_A, 'A'); // one modifier assertUSLabel(OperatingSystem.Windows, KeyMod.CtrlCmd | KeyCode.KEY_A, 'Ctrl+A'); assertUSLabel(OperatingSystem.Windows, KeyMod.Shift | KeyCode.KEY_A, 'Shift+A'); assertUSLabel(OperatingSystem.Windows, KeyMod.Alt | KeyCode.KEY_A, 'Alt+A'); assertUSLabel(OperatingSystem.Windows, KeyMod.WinCtrl | KeyCode.KEY_A, 'Windows+A'); - assertUSLabelWithoutModifiers(OperatingSystem.Windows, KeyMod.CtrlCmd | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Windows, KeyMod.Shift | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Windows, KeyMod.Alt | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Windows, KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); // two modifiers assertUSLabel(OperatingSystem.Windows, KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_A, 'Ctrl+Shift+A'); @@ -43,46 +33,29 @@ suite('KeybindingLabels', () => { assertUSLabel(OperatingSystem.Windows, KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_A, 'Shift+Alt+A'); assertUSLabel(OperatingSystem.Windows, KeyMod.Shift | KeyMod.WinCtrl | KeyCode.KEY_A, 'Shift+Windows+A'); assertUSLabel(OperatingSystem.Windows, KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'Alt+Windows+A'); - assertUSLabelWithoutModifiers(OperatingSystem.Windows, KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Windows, KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Windows, KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Windows, KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Windows, KeyMod.Shift | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Windows, KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); // three modifiers assertUSLabel(OperatingSystem.Windows, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_A, 'Ctrl+Shift+Alt+A'); assertUSLabel(OperatingSystem.Windows, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.WinCtrl | KeyCode.KEY_A, 'Ctrl+Shift+Windows+A'); assertUSLabel(OperatingSystem.Windows, KeyMod.CtrlCmd | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'Ctrl+Alt+Windows+A'); assertUSLabel(OperatingSystem.Windows, KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'Shift+Alt+Windows+A'); - assertUSLabelWithoutModifiers(OperatingSystem.Windows, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Windows, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Windows, KeyMod.CtrlCmd | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Windows, KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); // four modifiers assertUSLabel(OperatingSystem.Windows, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'Ctrl+Shift+Alt+Windows+A'); - assertUSLabelWithoutModifiers(OperatingSystem.Windows, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); // chord assertUSLabel(OperatingSystem.Windows, KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_A, KeyMod.CtrlCmd | KeyCode.KEY_B), 'Ctrl+A Ctrl+B'); - assertUSLabelWithoutModifiers(OperatingSystem.Windows, KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_A, KeyMod.CtrlCmd | KeyCode.KEY_B), 'A B'); }); test('Linux US label', () => { // no modifier assertUSLabel(OperatingSystem.Linux, KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Linux, KeyCode.KEY_A, 'A'); // one modifier assertUSLabel(OperatingSystem.Linux, KeyMod.CtrlCmd | KeyCode.KEY_A, 'Ctrl+A'); assertUSLabel(OperatingSystem.Linux, KeyMod.Shift | KeyCode.KEY_A, 'Shift+A'); assertUSLabel(OperatingSystem.Linux, KeyMod.Alt | KeyCode.KEY_A, 'Alt+A'); assertUSLabel(OperatingSystem.Linux, KeyMod.WinCtrl | KeyCode.KEY_A, 'Windows+A'); - assertUSLabelWithoutModifiers(OperatingSystem.Linux, KeyMod.CtrlCmd | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Linux, KeyMod.Shift | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Linux, KeyMod.Alt | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Linux, KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); // two modifiers assertUSLabel(OperatingSystem.Linux, KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_A, 'Ctrl+Shift+A'); @@ -91,46 +64,29 @@ suite('KeybindingLabels', () => { assertUSLabel(OperatingSystem.Linux, KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_A, 'Shift+Alt+A'); assertUSLabel(OperatingSystem.Linux, KeyMod.Shift | KeyMod.WinCtrl | KeyCode.KEY_A, 'Shift+Windows+A'); assertUSLabel(OperatingSystem.Linux, KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'Alt+Windows+A'); - assertUSLabelWithoutModifiers(OperatingSystem.Linux, KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Linux, KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Linux, KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Linux, KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Linux, KeyMod.Shift | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Linux, KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); // three modifiers assertUSLabel(OperatingSystem.Linux, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_A, 'Ctrl+Shift+Alt+A'); assertUSLabel(OperatingSystem.Linux, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.WinCtrl | KeyCode.KEY_A, 'Ctrl+Shift+Windows+A'); assertUSLabel(OperatingSystem.Linux, KeyMod.CtrlCmd | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'Ctrl+Alt+Windows+A'); assertUSLabel(OperatingSystem.Linux, KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'Shift+Alt+Windows+A'); - assertUSLabelWithoutModifiers(OperatingSystem.Linux, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Linux, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Linux, KeyMod.CtrlCmd | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Linux, KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); // four modifiers assertUSLabel(OperatingSystem.Linux, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'Ctrl+Shift+Alt+Windows+A'); - assertUSLabelWithoutModifiers(OperatingSystem.Linux, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); // chord assertUSLabel(OperatingSystem.Linux, KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_A, KeyMod.CtrlCmd | KeyCode.KEY_B), 'Ctrl+A Ctrl+B'); - assertUSLabelWithoutModifiers(OperatingSystem.Linux, KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_A, KeyMod.CtrlCmd | KeyCode.KEY_B), 'A B'); }); test('Mac US label', () => { // no modifier assertUSLabel(OperatingSystem.Macintosh, KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Macintosh, KeyCode.KEY_A, 'A'); // one modifier assertUSLabel(OperatingSystem.Macintosh, KeyMod.CtrlCmd | KeyCode.KEY_A, '⌘A'); assertUSLabel(OperatingSystem.Macintosh, KeyMod.Shift | KeyCode.KEY_A, '⇧A'); assertUSLabel(OperatingSystem.Macintosh, KeyMod.Alt | KeyCode.KEY_A, '⌥A'); assertUSLabel(OperatingSystem.Macintosh, KeyMod.WinCtrl | KeyCode.KEY_A, '⌃A'); - assertUSLabelWithoutModifiers(OperatingSystem.Macintosh, KeyMod.CtrlCmd | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Macintosh, KeyMod.Shift | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Macintosh, KeyMod.Alt | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Macintosh, KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); // two modifiers assertUSLabel(OperatingSystem.Macintosh, KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_A, '⇧⌘A'); @@ -139,30 +95,18 @@ suite('KeybindingLabels', () => { assertUSLabel(OperatingSystem.Macintosh, KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_A, '⇧⌥A'); assertUSLabel(OperatingSystem.Macintosh, KeyMod.Shift | KeyMod.WinCtrl | KeyCode.KEY_A, '⌃⇧A'); assertUSLabel(OperatingSystem.Macintosh, KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, '⌃⌥A'); - assertUSLabelWithoutModifiers(OperatingSystem.Macintosh, KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Macintosh, KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Macintosh, KeyMod.CtrlCmd | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Macintosh, KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Macintosh, KeyMod.Shift | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Macintosh, KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); // three modifiers assertUSLabel(OperatingSystem.Macintosh, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_A, '⇧⌥⌘A'); assertUSLabel(OperatingSystem.Macintosh, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.WinCtrl | KeyCode.KEY_A, '⌃⇧⌘A'); assertUSLabel(OperatingSystem.Macintosh, KeyMod.CtrlCmd | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, '⌃⌥⌘A'); assertUSLabel(OperatingSystem.Macintosh, KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, '⌃⇧⌥A'); - assertUSLabelWithoutModifiers(OperatingSystem.Macintosh, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Macintosh, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Macintosh, KeyMod.CtrlCmd | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); - assertUSLabelWithoutModifiers(OperatingSystem.Macintosh, KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); // four modifiers assertUSLabel(OperatingSystem.Macintosh, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, '⌃⇧⌥⌘A'); - assertUSLabelWithoutModifiers(OperatingSystem.Macintosh, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); // chord assertUSLabel(OperatingSystem.Macintosh, KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_A, KeyMod.CtrlCmd | KeyCode.KEY_B), '⌘A ⌘B'); - assertUSLabelWithoutModifiers(OperatingSystem.Macintosh, KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_A, KeyMod.CtrlCmd | KeyCode.KEY_B), 'A B'); // special keys assertUSLabel(OperatingSystem.Macintosh, KeyCode.LeftArrow, '←'); @@ -176,17 +120,10 @@ suite('KeybindingLabels', () => { const usResolvedKeybinding = new USLayoutResolvedKeybinding(createKeybinding(keybinding, OS), OS); assert.equal(usResolvedKeybinding.getAriaLabel(), expected); } - function assertAriaLabelWithoutModifiers(OS: OperatingSystem, keybinding: number, expected: string): void { - const usResolvedKeybinding = new USLayoutResolvedKeybinding(createKeybinding(keybinding, OS), OS); - assert.equal(usResolvedKeybinding.getAriaLabelWithoutModifiers(), expected); - } assertAriaLabel(OperatingSystem.Windows, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'Control+Shift+Alt+Windows+A'); assertAriaLabel(OperatingSystem.Linux, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'Control+Shift+Alt+Windows+A'); assertAriaLabel(OperatingSystem.Macintosh, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'Control+Shift+Alt+Command+A'); - assertAriaLabelWithoutModifiers(OperatingSystem.Windows, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); - assertAriaLabelWithoutModifiers(OperatingSystem.Linux, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); - assertAriaLabelWithoutModifiers(OperatingSystem.Macintosh, KeyMod.CtrlCmd | KeyMod.Shift | KeyMod.Alt | KeyMod.WinCtrl | KeyCode.KEY_A, 'A'); }); test('Electron Accelerator label', () => { diff --git a/src/vs/workbench/browser/parts/editor/editorPicker.ts b/src/vs/workbench/browser/parts/editor/editorPicker.ts index 4fc02ffaf0c..d1a0d74383d 100644 --- a/src/vs/workbench/browser/parts/editor/editorPicker.ts +++ b/src/vs/workbench/browser/parts/editor/editorPicker.ts @@ -198,7 +198,13 @@ export abstract class EditorGroupPicker extends BaseEditorPicker { return super.getAutoFocus(searchValue); } - const isShiftNavigate = (quickNavigateConfiguration && quickNavigateConfiguration.keybindings.some(k => !k.isChord() && k.hasShiftModifier())); + const isShiftNavigate = (quickNavigateConfiguration && quickNavigateConfiguration.keybindings.some(k => { + const [firstPart, chordPart] = k.getParts(); + if (chordPart) { + return false; + } + return firstPart.shiftKey; + })); if (isShiftNavigate) { return { autoFocusLastEntry: true diff --git a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts index 51cb59538fc..d77347961a4 100644 --- a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts @@ -9,7 +9,7 @@ import { OperatingSystem } from 'vs/base/common/platform'; import { KeyCode, ResolvedKeybinding, KeyCodeUtils, SimpleKeybinding, Keybinding, KeybindingType, USER_SETTINGS, ResolvedKeybindingPart } from 'vs/base/common/keyCodes'; import { ScanCode, ScanCodeUtils, IMMUTABLE_CODE_TO_KEY_CODE, IMMUTABLE_KEY_CODE_TO_CODE, ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCode'; import { CharCode } from 'vs/base/common/charCode'; -import { UILabelProvider, AriaLabelProvider, UserSettingsLabelProvider, ElectronAcceleratorLabelProvider, NO_MODIFIERS } from 'vs/platform/keybinding/common/keybindingLabels'; +import { UILabelProvider, AriaLabelProvider, UserSettingsLabelProvider, ElectronAcceleratorLabelProvider } from 'vs/platform/keybinding/common/keybindingLabels'; import { IKeyboardMapper } from 'vs/workbench/services/keybinding/common/keyboardMapper'; import { IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; @@ -103,12 +103,6 @@ export class NativeResolvedKeybinding extends ResolvedKeybinding { return UILabelProvider.toLabel(this._firstPart, firstPart, this._chordPart, chordPart, this._OS); } - public getLabelWithoutModifiers(): string { - let firstPart = this._getUILabelForScanCodeBinding(this._firstPart); - let chordPart = this._getUILabelForScanCodeBinding(this._chordPart); - return UILabelProvider.toLabel(NO_MODIFIERS, firstPart, NO_MODIFIERS, chordPart, this._OS); - } - private _getAriaLabelForScanCodeBinding(binding: ScanCodeBinding): string { if (!binding) { return null; @@ -125,12 +119,6 @@ export class NativeResolvedKeybinding extends ResolvedKeybinding { return AriaLabelProvider.toLabel(this._firstPart, firstPart, this._chordPart, chordPart, this._OS); } - public getAriaLabelWithoutModifiers(): string { - let firstPart = this._getAriaLabelForScanCodeBinding(this._firstPart); - let chordPart = this._getAriaLabelForScanCodeBinding(this._chordPart); - return AriaLabelProvider.toLabel(NO_MODIFIERS, firstPart, NO_MODIFIERS, chordPart, this._OS); - } - private _getElectronAcceleratorLabelForScanCodeBinding(binding: ScanCodeBinding): string { if (!binding) { return null; @@ -194,34 +182,6 @@ export class NativeResolvedKeybinding extends ResolvedKeybinding { return (this._chordPart ? true : false); } - public hasCtrlModifier(): boolean { - if (this._chordPart) { - return false; - } - return this._firstPart.ctrlKey; - } - - public hasShiftModifier(): boolean { - if (this._chordPart) { - return false; - } - return this._firstPart.shiftKey; - } - - public hasAltModifier(): boolean { - if (this._chordPart) { - return false; - } - return this._firstPart.altKey; - } - - public hasMetaModifier(): boolean { - if (this._chordPart) { - return false; - } - return this._firstPart.metaKey; - } - public getParts(): [ResolvedKeybindingPart, ResolvedKeybindingPart] { return [ this._toResolvedKeybindingPart(this._firstPart), diff --git a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts index 3add1f33869..a6e058cb850 100644 --- a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts @@ -8,7 +8,7 @@ import { KeyCode, KeyCodeUtils, ResolvedKeybinding, Keybinding, SimpleKeybinding, KeybindingType, USER_SETTINGS, ResolvedKeybindingPart } from 'vs/base/common/keyCodes'; import { ScanCode, ScanCodeUtils, IMMUTABLE_CODE_TO_KEY_CODE, ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCode'; import { CharCode } from 'vs/base/common/charCode'; -import { UILabelProvider, AriaLabelProvider, ElectronAcceleratorLabelProvider, UserSettingsLabelProvider, NO_MODIFIERS } from 'vs/platform/keybinding/common/keybindingLabels'; +import { UILabelProvider, AriaLabelProvider, ElectronAcceleratorLabelProvider, UserSettingsLabelProvider } from 'vs/platform/keybinding/common/keybindingLabels'; import { OperatingSystem } from 'vs/base/common/platform'; import { IKeyboardMapper } from 'vs/workbench/services/keybinding/common/keyboardMapper'; import { IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; @@ -107,12 +107,6 @@ export class WindowsNativeResolvedKeybinding extends ResolvedKeybinding { return UILabelProvider.toLabel(this._firstPart, firstPart, this._chordPart, chordPart, OperatingSystem.Windows); } - public getLabelWithoutModifiers(): string { - let firstPart = this._getUILabelForKeybinding(this._firstPart); - let chordPart = this._getUILabelForKeybinding(this._chordPart); - return UILabelProvider.toLabel(NO_MODIFIERS, firstPart, NO_MODIFIERS, chordPart, OperatingSystem.Windows); - } - private _getAriaLabelForKeybinding(keybinding: SimpleKeybinding): string { if (!keybinding) { return null; @@ -129,12 +123,6 @@ export class WindowsNativeResolvedKeybinding extends ResolvedKeybinding { return AriaLabelProvider.toLabel(this._firstPart, firstPart, this._chordPart, chordPart, OperatingSystem.Windows); } - public getAriaLabelWithoutModifiers(): string { - let firstPart = this._getAriaLabelForKeybinding(this._firstPart); - let chordPart = this._getAriaLabelForKeybinding(this._chordPart); - return AriaLabelProvider.toLabel(NO_MODIFIERS, firstPart, NO_MODIFIERS, chordPart, OperatingSystem.Windows); - } - private _keyCodeToElectronAccelerator(keyCode: KeyCode): string { if (keyCode >= KeyCode.NUMPAD_0 && keyCode <= KeyCode.NUMPAD_DIVIDE) { // Electron cannot handle numpad keys @@ -207,34 +195,6 @@ export class WindowsNativeResolvedKeybinding extends ResolvedKeybinding { return (this._chordPart ? true : false); } - public hasCtrlModifier(): boolean { - if (this._chordPart) { - return false; - } - return this._firstPart.ctrlKey; - } - - public hasShiftModifier(): boolean { - if (this._chordPart) { - return false; - } - return this._firstPart.shiftKey; - } - - public hasAltModifier(): boolean { - if (this._chordPart) { - return false; - } - return this._firstPart.altKey; - } - - public hasMetaModifier(): boolean { - if (this._chordPart) { - return false; - } - return this._firstPart.metaKey; - } - public getParts(): [ResolvedKeybindingPart, ResolvedKeybindingPart] { return [ this._toResolvedKeybindingPart(this._firstPart), diff --git a/src/vs/workbench/services/keybinding/test/keyboardMapperTestUtils.ts b/src/vs/workbench/services/keybinding/test/keyboardMapperTestUtils.ts index 8f5acff5abf..ae6d665728b 100644 --- a/src/vs/workbench/services/keybinding/test/keyboardMapperTestUtils.ts +++ b/src/vs/workbench/services/keybinding/test/keyboardMapperTestUtils.ts @@ -17,34 +17,22 @@ import { ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCod export interface IResolvedKeybinding { label: string; - labelWithoutModifiers: string; ariaLabel: string; - ariaLabelWithoutModifiers: string; electronAccelerator: string; userSettingsLabel: string; isWYSIWYG: boolean; isChord: boolean; - hasCtrlModifier: boolean; - hasShiftModifier: boolean; - hasAltModifier: boolean; - hasMetaModifier: boolean; dispatchParts: [string, string]; } function toIResolvedKeybinding(kb: ResolvedKeybinding): IResolvedKeybinding { return { label: kb.getLabel(), - labelWithoutModifiers: kb.getLabelWithoutModifiers(), ariaLabel: kb.getAriaLabel(), - ariaLabelWithoutModifiers: kb.getAriaLabelWithoutModifiers(), electronAccelerator: kb.getElectronAccelerator(), userSettingsLabel: kb.getUserSettingsLabel(), isWYSIWYG: kb.isWYSIWYG(), isChord: kb.isChord(), - hasCtrlModifier: kb.hasCtrlModifier(), - hasShiftModifier: kb.hasShiftModifier(), - hasAltModifier: kb.hasAltModifier(), - hasMetaModifier: kb.hasMetaModifier(), dispatchParts: kb.getDispatchParts(), }; } diff --git a/src/vs/workbench/services/keybinding/test/macLinuxFallbackKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/macLinuxFallbackKeyboardMapper.test.ts index 5c6156521d7..73ff188981b 100644 --- a/src/vs/workbench/services/keybinding/test/macLinuxFallbackKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/macLinuxFallbackKeyboardMapper.test.ts @@ -25,16 +25,10 @@ suite('keyboardMapper - MAC fallback', () => { [{ label: '⌘Z', ariaLabel: 'Command+Z', - labelWithoutModifiers: 'Z', - ariaLabelWithoutModifiers: 'Z', electronAccelerator: 'Cmd+Z', userSettingsLabel: 'cmd+z', isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: true, dispatchParts: ['meta+Z', null], }] ); @@ -46,16 +40,10 @@ suite('keyboardMapper - MAC fallback', () => { [{ label: '⌘K ⌘=', ariaLabel: 'Command+K Command+=', - labelWithoutModifiers: 'K =', - ariaLabelWithoutModifiers: 'K =', electronAccelerator: null, userSettingsLabel: 'cmd+k cmd+=', isWYSIWYG: true, isChord: true, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['meta+K', 'meta+='], }] ); @@ -75,16 +63,10 @@ suite('keyboardMapper - MAC fallback', () => { { label: '⌘Z', ariaLabel: 'Command+Z', - labelWithoutModifiers: 'Z', - ariaLabelWithoutModifiers: 'Z', electronAccelerator: 'Cmd+Z', userSettingsLabel: 'cmd+z', isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: true, dispatchParts: ['meta+Z', null], } ); @@ -98,16 +80,10 @@ suite('keyboardMapper - MAC fallback', () => { [{ label: '⌘, ⌘/', ariaLabel: 'Command+, Command+/', - labelWithoutModifiers: ', /', - ariaLabelWithoutModifiers: ', /', electronAccelerator: null, userSettingsLabel: 'cmd+, cmd+/', isWYSIWYG: true, isChord: true, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['meta+,', 'meta+/'], }] ); @@ -127,16 +103,10 @@ suite('keyboardMapper - MAC fallback', () => { { label: '⌘', ariaLabel: 'Command+', - labelWithoutModifiers: '', - ariaLabelWithoutModifiers: '', electronAccelerator: null, userSettingsLabel: 'cmd+', isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: true, dispatchParts: [null, null], } ); @@ -157,16 +127,10 @@ suite('keyboardMapper - LINUX fallback', () => { [{ label: 'Ctrl+Z', ariaLabel: 'Control+Z', - labelWithoutModifiers: 'Z', - ariaLabelWithoutModifiers: 'Z', electronAccelerator: 'Ctrl+Z', userSettingsLabel: 'ctrl+z', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+Z', null], }] ); @@ -178,16 +142,10 @@ suite('keyboardMapper - LINUX fallback', () => { [{ label: 'Ctrl+K Ctrl+=', ariaLabel: 'Control+K Control+=', - labelWithoutModifiers: 'K =', - ariaLabelWithoutModifiers: 'K =', electronAccelerator: null, userSettingsLabel: 'ctrl+k ctrl+=', isWYSIWYG: true, isChord: true, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+K', 'ctrl+='], }] ); @@ -207,16 +165,10 @@ suite('keyboardMapper - LINUX fallback', () => { { label: 'Ctrl+Z', ariaLabel: 'Control+Z', - labelWithoutModifiers: 'Z', - ariaLabelWithoutModifiers: 'Z', electronAccelerator: 'Ctrl+Z', userSettingsLabel: 'ctrl+z', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+Z', null], } ); @@ -230,16 +182,10 @@ suite('keyboardMapper - LINUX fallback', () => { [{ label: 'Ctrl+, Ctrl+/', ariaLabel: 'Control+, Control+/', - labelWithoutModifiers: ', /', - ariaLabelWithoutModifiers: ', /', electronAccelerator: null, userSettingsLabel: 'ctrl+, ctrl+/', isWYSIWYG: true, isChord: true, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+,', 'ctrl+/'], }] ); @@ -253,16 +199,10 @@ suite('keyboardMapper - LINUX fallback', () => { [{ label: 'Ctrl+,', ariaLabel: 'Control+,', - labelWithoutModifiers: ',', - ariaLabelWithoutModifiers: ',', electronAccelerator: 'Ctrl+,', userSettingsLabel: 'ctrl+,', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+,', null], }] ); @@ -282,16 +222,10 @@ suite('keyboardMapper - LINUX fallback', () => { { label: 'Ctrl+', ariaLabel: 'Control+', - labelWithoutModifiers: '', - ariaLabelWithoutModifiers: '', electronAccelerator: null, userSettingsLabel: 'ctrl+', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: [null, null], } ); diff --git a/src/vs/workbench/services/keybinding/test/macLinuxKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/macLinuxKeyboardMapper.test.ts index d47b0dccf77..524ef34f3a6 100644 --- a/src/vs/workbench/services/keybinding/test/macLinuxKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/macLinuxKeyboardMapper.test.ts @@ -67,16 +67,10 @@ suite('keyboardMapper - MAC de_ch', () => { [{ label: '⌘A', ariaLabel: 'Command+A', - labelWithoutModifiers: 'A', - ariaLabelWithoutModifiers: 'A', electronAccelerator: 'Cmd+A', userSettingsLabel: 'cmd+a', isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: true, dispatchParts: ['meta+[KeyA]', null], }] ); @@ -88,16 +82,10 @@ suite('keyboardMapper - MAC de_ch', () => { [{ label: '⌘B', ariaLabel: 'Command+B', - labelWithoutModifiers: 'B', - ariaLabelWithoutModifiers: 'B', electronAccelerator: 'Cmd+B', userSettingsLabel: 'cmd+b', isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: true, dispatchParts: ['meta+[KeyB]', null], }] ); @@ -109,16 +97,10 @@ suite('keyboardMapper - MAC de_ch', () => { [{ label: '⌘Z', ariaLabel: 'Command+Z', - labelWithoutModifiers: 'Z', - ariaLabelWithoutModifiers: 'Z', electronAccelerator: 'Cmd+Z', userSettingsLabel: 'cmd+z', isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: true, dispatchParts: ['meta+[KeyY]', null], }] ); @@ -138,16 +120,10 @@ suite('keyboardMapper - MAC de_ch', () => { { label: '⌘Z', ariaLabel: 'Command+Z', - labelWithoutModifiers: 'Z', - ariaLabelWithoutModifiers: 'Z', electronAccelerator: 'Cmd+Z', userSettingsLabel: 'cmd+z', isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: true, dispatchParts: ['meta+[KeyY]', null], } ); @@ -159,16 +135,10 @@ suite('keyboardMapper - MAC de_ch', () => { [{ label: '⌃⌥⌘6', ariaLabel: 'Control+Alt+Command+6', - labelWithoutModifiers: '6', - ariaLabelWithoutModifiers: '6', electronAccelerator: 'Ctrl+Alt+Cmd+6', userSettingsLabel: 'ctrl+alt+cmd+6', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: true, - hasMetaModifier: true, dispatchParts: ['ctrl+alt+meta+[Digit6]', null], }] ); @@ -188,16 +158,10 @@ suite('keyboardMapper - MAC de_ch', () => { { label: '⌘¨', ariaLabel: 'Command+¨', - labelWithoutModifiers: '¨', - ariaLabelWithoutModifiers: '¨', electronAccelerator: null, userSettingsLabel: 'cmd+[BracketRight]', isWYSIWYG: false, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: true, dispatchParts: ['meta+[BracketRight]', null], } ); @@ -209,16 +173,10 @@ suite('keyboardMapper - MAC de_ch', () => { [{ label: '⌃⌥9', ariaLabel: 'Control+Alt+9', - labelWithoutModifiers: '9', - ariaLabelWithoutModifiers: '9', electronAccelerator: 'Ctrl+Alt+9', userSettingsLabel: 'ctrl+alt+9', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: true, - hasMetaModifier: false, dispatchParts: ['ctrl+alt+[Digit9]', null], }] ); @@ -230,16 +188,10 @@ suite('keyboardMapper - MAC de_ch', () => { [{ label: '⇧⌘7', ariaLabel: 'Shift+Command+7', - labelWithoutModifiers: '7', - ariaLabelWithoutModifiers: '7', electronAccelerator: 'Shift+Cmd+7', userSettingsLabel: 'shift+cmd+7', isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: true, - hasAltModifier: false, - hasMetaModifier: true, dispatchParts: ['shift+meta+[Digit7]', null], }] ); @@ -251,16 +203,10 @@ suite('keyboardMapper - MAC de_ch', () => { [{ label: '⇧⌘\'', ariaLabel: 'Shift+Command+\'', - labelWithoutModifiers: '\'', - ariaLabelWithoutModifiers: '\'', electronAccelerator: null, userSettingsLabel: 'shift+cmd+[Minus]', isWYSIWYG: false, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: true, - hasAltModifier: false, - hasMetaModifier: true, dispatchParts: ['shift+meta+[Minus]', null], }] ); @@ -272,16 +218,10 @@ suite('keyboardMapper - MAC de_ch', () => { [{ label: '⌘K ⌃⇧⌥⌘7', ariaLabel: 'Command+K Control+Shift+Alt+Command+7', - labelWithoutModifiers: 'K 7', - ariaLabelWithoutModifiers: 'K 7', electronAccelerator: null, userSettingsLabel: 'cmd+k ctrl+shift+alt+cmd+7', isWYSIWYG: true, isChord: true, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['meta+[KeyK]', 'ctrl+shift+alt+meta+[Digit7]'], }] ); @@ -293,16 +233,10 @@ suite('keyboardMapper - MAC de_ch', () => { [{ label: '⌘K ⇧⌘0', ariaLabel: 'Command+K Shift+Command+0', - labelWithoutModifiers: 'K 0', - ariaLabelWithoutModifiers: 'K 0', electronAccelerator: null, userSettingsLabel: 'cmd+k shift+cmd+0', isWYSIWYG: true, isChord: true, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['meta+[KeyK]', 'shift+meta+[Digit0]'], }] ); @@ -314,16 +248,10 @@ suite('keyboardMapper - MAC de_ch', () => { [{ label: '⌘↓', ariaLabel: 'Command+DownArrow', - labelWithoutModifiers: '↓', - ariaLabelWithoutModifiers: 'DownArrow', electronAccelerator: 'Cmd+Down', userSettingsLabel: 'cmd+down', isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: true, dispatchParts: ['meta+[ArrowDown]', null], }] ); @@ -335,16 +263,10 @@ suite('keyboardMapper - MAC de_ch', () => { [{ label: '⌘NumPad0', ariaLabel: 'Command+NumPad0', - labelWithoutModifiers: 'NumPad0', - ariaLabelWithoutModifiers: 'NumPad0', electronAccelerator: null, userSettingsLabel: 'cmd+numpad0', isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: true, dispatchParts: ['meta+[Numpad0]', null], }] ); @@ -356,16 +278,10 @@ suite('keyboardMapper - MAC de_ch', () => { [{ label: '⌘Home', ariaLabel: 'Command+Home', - labelWithoutModifiers: 'Home', - ariaLabelWithoutModifiers: 'Home', electronAccelerator: 'Cmd+Home', userSettingsLabel: 'cmd+home', isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: true, dispatchParts: ['meta+[Home]', null], }] ); @@ -385,16 +301,10 @@ suite('keyboardMapper - MAC de_ch', () => { { label: '⌘Home', ariaLabel: 'Command+Home', - labelWithoutModifiers: 'Home', - ariaLabelWithoutModifiers: 'Home', electronAccelerator: 'Cmd+Home', userSettingsLabel: 'cmd+home', isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: true, dispatchParts: ['meta+[Home]', null], } ); @@ -408,16 +318,10 @@ suite('keyboardMapper - MAC de_ch', () => { [{ label: '⌘, ⇧⌘7', ariaLabel: 'Command+, Shift+Command+7', - labelWithoutModifiers: ', 7', - ariaLabelWithoutModifiers: ', 7', electronAccelerator: null, userSettingsLabel: 'cmd+[Comma] shift+cmd+7', isWYSIWYG: false, isChord: true, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['meta+[Comma]', 'shift+meta+[Digit7]'], }] ); @@ -437,16 +341,10 @@ suite('keyboardMapper - MAC de_ch', () => { { label: '⌘', ariaLabel: 'Command+', - labelWithoutModifiers: '', - ariaLabelWithoutModifiers: '', electronAccelerator: null, userSettingsLabel: 'cmd+', isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: true, dispatchParts: [null, null], } ); @@ -466,16 +364,10 @@ suite('keyboardMapper - MAC de_ch', () => { { label: '⌘', ariaLabel: 'Command+', - labelWithoutModifiers: '', - ariaLabelWithoutModifiers: '', electronAccelerator: null, userSettingsLabel: 'cmd+', isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: true, dispatchParts: [null, null], } ); @@ -505,16 +397,10 @@ suite('keyboardMapper - MAC en_us', () => { [{ label: '⌘, ⌘/', ariaLabel: 'Command+, Command+/', - labelWithoutModifiers: ', /', - ariaLabelWithoutModifiers: ', /', electronAccelerator: null, userSettingsLabel: 'cmd+, cmd+/', isWYSIWYG: true, isChord: true, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['meta+[Comma]', 'meta+[Slash]'], }] ); @@ -534,16 +420,10 @@ suite('keyboardMapper - MAC en_us', () => { { label: '⌘', ariaLabel: 'Command+', - labelWithoutModifiers: '', - ariaLabelWithoutModifiers: '', electronAccelerator: null, userSettingsLabel: 'cmd+', isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: true, dispatchParts: [null, null], } ); @@ -563,16 +443,10 @@ suite('keyboardMapper - MAC en_us', () => { { label: '⌘', ariaLabel: 'Command+', - labelWithoutModifiers: '', - ariaLabelWithoutModifiers: '', electronAccelerator: null, userSettingsLabel: 'cmd+', isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: true, dispatchParts: [null, null], } ); @@ -623,16 +497,10 @@ suite('keyboardMapper - LINUX de_ch', () => { [{ label: 'Ctrl+A', ariaLabel: 'Control+A', - labelWithoutModifiers: 'A', - ariaLabelWithoutModifiers: 'A', electronAccelerator: 'Ctrl+A', userSettingsLabel: 'ctrl+a', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[KeyA]', null], }] ); @@ -644,16 +512,10 @@ suite('keyboardMapper - LINUX de_ch', () => { [{ label: 'Ctrl+Z', ariaLabel: 'Control+Z', - labelWithoutModifiers: 'Z', - ariaLabelWithoutModifiers: 'Z', electronAccelerator: 'Ctrl+Z', userSettingsLabel: 'ctrl+z', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[KeyY]', null], }] ); @@ -673,16 +535,10 @@ suite('keyboardMapper - LINUX de_ch', () => { { label: 'Ctrl+Z', ariaLabel: 'Control+Z', - labelWithoutModifiers: 'Z', - ariaLabelWithoutModifiers: 'Z', electronAccelerator: 'Ctrl+Z', userSettingsLabel: 'ctrl+z', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[KeyY]', null], } ); @@ -709,16 +565,10 @@ suite('keyboardMapper - LINUX de_ch', () => { { label: 'Ctrl+¨', ariaLabel: 'Control+¨', - labelWithoutModifiers: '¨', - ariaLabelWithoutModifiers: '¨', electronAccelerator: null, userSettingsLabel: 'ctrl+[BracketRight]', isWYSIWYG: false, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[BracketRight]', null], } ); @@ -730,30 +580,18 @@ suite('keyboardMapper - LINUX de_ch', () => { [{ label: 'Ctrl+Alt+0', ariaLabel: 'Control+Alt+0', - labelWithoutModifiers: '0', - ariaLabelWithoutModifiers: '0', electronAccelerator: 'Ctrl+Alt+0', userSettingsLabel: 'ctrl+alt+0', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: true, - hasMetaModifier: false, dispatchParts: ['ctrl+alt+[Digit0]', null], }, { label: 'Ctrl+Alt+$', ariaLabel: 'Control+Alt+$', - labelWithoutModifiers: '$', - ariaLabelWithoutModifiers: '$', electronAccelerator: null, userSettingsLabel: 'ctrl+alt+[Backslash]', isWYSIWYG: false, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: true, - hasMetaModifier: false, dispatchParts: ['ctrl+alt+[Backslash]', null], }] ); @@ -765,16 +603,10 @@ suite('keyboardMapper - LINUX de_ch', () => { [{ label: 'Ctrl+Shift+7', ariaLabel: 'Control+Shift+7', - labelWithoutModifiers: '7', - ariaLabelWithoutModifiers: '7', electronAccelerator: 'Ctrl+Shift+7', userSettingsLabel: 'ctrl+shift+7', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: true, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+shift+[Digit7]', null], }] ); @@ -786,16 +618,10 @@ suite('keyboardMapper - LINUX de_ch', () => { [{ label: 'Ctrl+Shift+\'', ariaLabel: 'Control+Shift+\'', - labelWithoutModifiers: '\'', - ariaLabelWithoutModifiers: '\'', electronAccelerator: null, userSettingsLabel: 'ctrl+shift+[Minus]', isWYSIWYG: false, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: true, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+shift+[Minus]', null], }] ); @@ -814,16 +640,10 @@ suite('keyboardMapper - LINUX de_ch', () => { [{ label: 'Ctrl+K Ctrl+Shift+0', ariaLabel: 'Control+K Control+Shift+0', - labelWithoutModifiers: 'K 0', - ariaLabelWithoutModifiers: 'K 0', electronAccelerator: null, userSettingsLabel: 'ctrl+k ctrl+shift+0', isWYSIWYG: true, isChord: true, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[KeyK]', 'ctrl+shift+[Digit0]'], }] ); @@ -835,16 +655,10 @@ suite('keyboardMapper - LINUX de_ch', () => { [{ label: 'Ctrl+DownArrow', ariaLabel: 'Control+DownArrow', - labelWithoutModifiers: 'DownArrow', - ariaLabelWithoutModifiers: 'DownArrow', electronAccelerator: 'Ctrl+Down', userSettingsLabel: 'ctrl+down', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[ArrowDown]', null], }] ); @@ -856,16 +670,10 @@ suite('keyboardMapper - LINUX de_ch', () => { [{ label: 'Ctrl+NumPad0', ariaLabel: 'Control+NumPad0', - labelWithoutModifiers: 'NumPad0', - ariaLabelWithoutModifiers: 'NumPad0', electronAccelerator: null, userSettingsLabel: 'ctrl+numpad0', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[Numpad0]', null], }] ); @@ -877,16 +685,10 @@ suite('keyboardMapper - LINUX de_ch', () => { [{ label: 'Ctrl+Home', ariaLabel: 'Control+Home', - labelWithoutModifiers: 'Home', - ariaLabelWithoutModifiers: 'Home', electronAccelerator: 'Ctrl+Home', userSettingsLabel: 'ctrl+home', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[Home]', null], }] ); @@ -906,16 +708,10 @@ suite('keyboardMapper - LINUX de_ch', () => { { label: 'Ctrl+Home', ariaLabel: 'Control+Home', - labelWithoutModifiers: 'Home', - ariaLabelWithoutModifiers: 'Home', electronAccelerator: 'Ctrl+Home', userSettingsLabel: 'ctrl+home', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[Home]', null], } ); @@ -935,16 +731,10 @@ suite('keyboardMapper - LINUX de_ch', () => { { label: 'Ctrl+X', ariaLabel: 'Control+X', - labelWithoutModifiers: 'X', - ariaLabelWithoutModifiers: 'X', electronAccelerator: 'Ctrl+X', userSettingsLabel: 'ctrl+x', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[KeyX]', null], } ); @@ -958,16 +748,10 @@ suite('keyboardMapper - LINUX de_ch', () => { [{ label: 'Ctrl+, Ctrl+Shift+7', ariaLabel: 'Control+, Control+Shift+7', - labelWithoutModifiers: ', 7', - ariaLabelWithoutModifiers: ', 7', electronAccelerator: null, userSettingsLabel: 'ctrl+[Comma] ctrl+shift+7', isWYSIWYG: false, isChord: true, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[Comma]', 'ctrl+shift+[Digit7]'], }] ); @@ -987,16 +771,10 @@ suite('keyboardMapper - LINUX de_ch', () => { { label: 'Ctrl+', ariaLabel: 'Control+', - labelWithoutModifiers: '', - ariaLabelWithoutModifiers: '', electronAccelerator: null, userSettingsLabel: 'ctrl+', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: [null, null], } ); @@ -1016,16 +794,10 @@ suite('keyboardMapper - LINUX de_ch', () => { { label: 'Ctrl+', ariaLabel: 'Control+', - labelWithoutModifiers: '', - ariaLabelWithoutModifiers: '', electronAccelerator: null, userSettingsLabel: 'ctrl+', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: [null, null], } ); @@ -1057,16 +829,10 @@ suite('keyboardMapper - LINUX en_us', () => { [{ label: 'Ctrl+A', ariaLabel: 'Control+A', - labelWithoutModifiers: 'A', - ariaLabelWithoutModifiers: 'A', electronAccelerator: 'Ctrl+A', userSettingsLabel: 'ctrl+a', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[KeyA]', null], }] ); @@ -1078,16 +844,10 @@ suite('keyboardMapper - LINUX en_us', () => { [{ label: 'Ctrl+Z', ariaLabel: 'Control+Z', - labelWithoutModifiers: 'Z', - ariaLabelWithoutModifiers: 'Z', electronAccelerator: 'Ctrl+Z', userSettingsLabel: 'ctrl+z', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[KeyZ]', null], }] ); @@ -1107,16 +867,10 @@ suite('keyboardMapper - LINUX en_us', () => { { label: 'Ctrl+Z', ariaLabel: 'Control+Z', - labelWithoutModifiers: 'Z', - ariaLabelWithoutModifiers: 'Z', electronAccelerator: 'Ctrl+Z', userSettingsLabel: 'ctrl+z', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[KeyZ]', null], } ); @@ -1128,16 +882,10 @@ suite('keyboardMapper - LINUX en_us', () => { [{ label: 'Ctrl+]', ariaLabel: 'Control+]', - labelWithoutModifiers: ']', - ariaLabelWithoutModifiers: ']', electronAccelerator: 'Ctrl+]', userSettingsLabel: 'ctrl+]', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[BracketRight]', null], }] ); @@ -1157,16 +905,10 @@ suite('keyboardMapper - LINUX en_us', () => { { label: 'Ctrl+]', ariaLabel: 'Control+]', - labelWithoutModifiers: ']', - ariaLabelWithoutModifiers: ']', electronAccelerator: 'Ctrl+]', userSettingsLabel: 'ctrl+]', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[BracketRight]', null], } ); @@ -1178,16 +920,10 @@ suite('keyboardMapper - LINUX en_us', () => { [{ label: 'Shift+]', ariaLabel: 'Shift+]', - labelWithoutModifiers: ']', - ariaLabelWithoutModifiers: ']', electronAccelerator: 'Shift+]', userSettingsLabel: 'shift+]', isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: true, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['shift+[BracketRight]', null], }] ); @@ -1199,16 +935,10 @@ suite('keyboardMapper - LINUX en_us', () => { [{ label: 'Ctrl+/', ariaLabel: 'Control+/', - labelWithoutModifiers: '/', - ariaLabelWithoutModifiers: '/', electronAccelerator: 'Ctrl+/', userSettingsLabel: 'ctrl+/', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[Slash]', null], }] ); @@ -1220,16 +950,10 @@ suite('keyboardMapper - LINUX en_us', () => { [{ label: 'Ctrl+Shift+/', ariaLabel: 'Control+Shift+/', - labelWithoutModifiers: '/', - ariaLabelWithoutModifiers: '/', electronAccelerator: 'Ctrl+Shift+/', userSettingsLabel: 'ctrl+shift+/', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: true, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+shift+[Slash]', null], }] ); @@ -1241,16 +965,10 @@ suite('keyboardMapper - LINUX en_us', () => { [{ label: 'Ctrl+K Ctrl+\\', ariaLabel: 'Control+K Control+\\', - labelWithoutModifiers: 'K \\', - ariaLabelWithoutModifiers: 'K \\', electronAccelerator: null, userSettingsLabel: 'ctrl+k ctrl+\\', isWYSIWYG: true, isChord: true, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[KeyK]', 'ctrl+[Backslash]'], }] ); @@ -1262,16 +980,10 @@ suite('keyboardMapper - LINUX en_us', () => { [{ label: 'Ctrl+K Ctrl+=', ariaLabel: 'Control+K Control+=', - labelWithoutModifiers: 'K =', - ariaLabelWithoutModifiers: 'K =', electronAccelerator: null, userSettingsLabel: 'ctrl+k ctrl+=', isWYSIWYG: true, isChord: true, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[KeyK]', 'ctrl+[Equal]'], }] ); @@ -1283,16 +995,10 @@ suite('keyboardMapper - LINUX en_us', () => { [{ label: 'Ctrl+DownArrow', ariaLabel: 'Control+DownArrow', - labelWithoutModifiers: 'DownArrow', - ariaLabelWithoutModifiers: 'DownArrow', electronAccelerator: 'Ctrl+Down', userSettingsLabel: 'ctrl+down', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[ArrowDown]', null], }] ); @@ -1304,16 +1010,10 @@ suite('keyboardMapper - LINUX en_us', () => { [{ label: 'Ctrl+NumPad0', ariaLabel: 'Control+NumPad0', - labelWithoutModifiers: 'NumPad0', - ariaLabelWithoutModifiers: 'NumPad0', electronAccelerator: null, userSettingsLabel: 'ctrl+numpad0', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[Numpad0]', null], }] ); @@ -1325,16 +1025,10 @@ suite('keyboardMapper - LINUX en_us', () => { [{ label: 'Ctrl+Home', ariaLabel: 'Control+Home', - labelWithoutModifiers: 'Home', - ariaLabelWithoutModifiers: 'Home', electronAccelerator: 'Ctrl+Home', userSettingsLabel: 'ctrl+home', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[Home]', null], }] ); @@ -1354,16 +1048,10 @@ suite('keyboardMapper - LINUX en_us', () => { { label: 'Ctrl+Home', ariaLabel: 'Control+Home', - labelWithoutModifiers: 'Home', - ariaLabelWithoutModifiers: 'Home', electronAccelerator: 'Ctrl+Home', userSettingsLabel: 'ctrl+home', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[Home]', null], } ); @@ -1375,30 +1063,18 @@ suite('keyboardMapper - LINUX en_us', () => { [{ label: 'Ctrl+Shift+,', ariaLabel: 'Control+Shift+,', - labelWithoutModifiers: ',', - ariaLabelWithoutModifiers: ',', electronAccelerator: 'Ctrl+Shift+,', userSettingsLabel: 'ctrl+shift+,', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: true, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+shift+[Comma]', null], }, { label: 'Ctrl+<', ariaLabel: 'Control+<', - labelWithoutModifiers: '<', - ariaLabelWithoutModifiers: '<', electronAccelerator: null, userSettingsLabel: 'ctrl+[IntlBackslash]', isWYSIWYG: false, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[IntlBackslash]', null], }] ); @@ -1410,16 +1086,10 @@ suite('keyboardMapper - LINUX en_us', () => { [{ label: 'Ctrl+Enter', ariaLabel: 'Control+Enter', - labelWithoutModifiers: 'Enter', - ariaLabelWithoutModifiers: 'Enter', electronAccelerator: 'Ctrl+Enter', userSettingsLabel: 'ctrl+enter', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[Enter]', null], }] ); @@ -1439,16 +1109,10 @@ suite('keyboardMapper - LINUX en_us', () => { { label: 'Ctrl+Enter', ariaLabel: 'Control+Enter', - labelWithoutModifiers: 'Enter', - ariaLabelWithoutModifiers: 'Enter', electronAccelerator: 'Ctrl+Enter', userSettingsLabel: 'ctrl+enter', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[Enter]', null], } ); @@ -1462,16 +1126,10 @@ suite('keyboardMapper - LINUX en_us', () => { [{ label: 'Ctrl+, Ctrl+/', ariaLabel: 'Control+, Control+/', - labelWithoutModifiers: ', /', - ariaLabelWithoutModifiers: ', /', electronAccelerator: null, userSettingsLabel: 'ctrl+, ctrl+/', isWYSIWYG: true, isChord: true, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[Comma]', 'ctrl+[Slash]'], }] ); @@ -1485,16 +1143,10 @@ suite('keyboardMapper - LINUX en_us', () => { [{ label: 'Ctrl+,', ariaLabel: 'Control+,', - labelWithoutModifiers: ',', - ariaLabelWithoutModifiers: ',', electronAccelerator: 'Ctrl+,', userSettingsLabel: 'ctrl+,', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[Comma]', null], }] ); @@ -1514,16 +1166,10 @@ suite('keyboardMapper - LINUX en_us', () => { { label: 'Ctrl+', ariaLabel: 'Control+', - labelWithoutModifiers: '', - ariaLabelWithoutModifiers: '', electronAccelerator: null, userSettingsLabel: 'ctrl+', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: [null, null], } ); @@ -1543,16 +1189,10 @@ suite('keyboardMapper - LINUX en_us', () => { { label: 'Ctrl+', ariaLabel: 'Control+', - labelWithoutModifiers: '', - ariaLabelWithoutModifiers: '', electronAccelerator: null, userSettingsLabel: 'ctrl+', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: [null, null], } ); @@ -1584,16 +1224,10 @@ suite('keyboardMapper', () => { { label: 'Ctrl+`', ariaLabel: 'Control+`', - labelWithoutModifiers: '`', - ariaLabelWithoutModifiers: '`', electronAccelerator: null, userSettingsLabel: 'ctrl+`', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[Backquote]', null], } ); @@ -1616,16 +1250,10 @@ suite('keyboardMapper', () => { { label: label, ariaLabel: label, - labelWithoutModifiers: label, - ariaLabelWithoutModifiers: label, electronAccelerator: electronAccelerator, userSettingsLabel: userSettingsLabel, isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: [dispatch, null], } ); @@ -1661,16 +1289,10 @@ suite('keyboardMapper', () => { { label: label, ariaLabel: label, - labelWithoutModifiers: label, - ariaLabelWithoutModifiers: label, electronAccelerator: electronAccelerator, userSettingsLabel: userSettingsLabel, isWYSIWYG: true, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: [dispatch, null], } ); @@ -1730,16 +1352,10 @@ suite('keyboardMapper', () => { { label: '⌃§', ariaLabel: 'Control+§', - labelWithoutModifiers: '§', - ariaLabelWithoutModifiers: '§', electronAccelerator: null, userSettingsLabel: 'ctrl+[IntlBackslash]', isWYSIWYG: false, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[IntlBackslash]', null], } ); @@ -1757,16 +1373,10 @@ suite('keyboardMapper', () => { { label: '⌃`', ariaLabel: 'Control+`', - labelWithoutModifiers: '`', - ariaLabelWithoutModifiers: '`', electronAccelerator: null, userSettingsLabel: 'ctrl+`', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[Backquote]', null], } ); @@ -1799,16 +1409,10 @@ suite('keyboardMapper - LINUX ru', () => { [{ label: 'Ctrl+ы', ariaLabel: 'Control+ы', - labelWithoutModifiers: 'ы', - ariaLabelWithoutModifiers: 'ы', electronAccelerator: 'Ctrl+S', userSettingsLabel: 'ctrl+s', isWYSIWYG: false, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+[KeyS]', null], }] ); diff --git a/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts index e5304ffae29..a2ff068f70b 100644 --- a/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts @@ -46,16 +46,10 @@ suite('keyboardMapper - WINDOWS de_ch', () => { [{ label: 'Ctrl+A', ariaLabel: 'Control+A', - labelWithoutModifiers: 'A', - ariaLabelWithoutModifiers: 'A', electronAccelerator: 'Ctrl+A', userSettingsLabel: 'ctrl+a', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+A', null], }] ); @@ -68,16 +62,10 @@ suite('keyboardMapper - WINDOWS de_ch', () => { [{ label: 'Ctrl+Z', ariaLabel: 'Control+Z', - labelWithoutModifiers: 'Z', - ariaLabelWithoutModifiers: 'Z', electronAccelerator: 'Ctrl+Z', userSettingsLabel: 'ctrl+z', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+Z', null], }] ); @@ -97,16 +85,10 @@ suite('keyboardMapper - WINDOWS de_ch', () => { { label: 'Ctrl+Z', ariaLabel: 'Control+Z', - labelWithoutModifiers: 'Z', - ariaLabelWithoutModifiers: 'Z', electronAccelerator: 'Ctrl+Z', userSettingsLabel: 'ctrl+z', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+Z', null], } ); @@ -119,16 +101,10 @@ suite('keyboardMapper - WINDOWS de_ch', () => { [{ label: 'Ctrl+^', ariaLabel: 'Control+^', - labelWithoutModifiers: '^', - ariaLabelWithoutModifiers: '^', electronAccelerator: 'Ctrl+]', userSettingsLabel: 'ctrl+]', isWYSIWYG: false, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+]', null], }] ); @@ -148,16 +124,10 @@ suite('keyboardMapper - WINDOWS de_ch', () => { { label: 'Ctrl+^', ariaLabel: 'Control+^', - labelWithoutModifiers: '^', - ariaLabelWithoutModifiers: '^', electronAccelerator: 'Ctrl+]', userSettingsLabel: 'ctrl+]', isWYSIWYG: false, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+]', null], } ); @@ -170,16 +140,10 @@ suite('keyboardMapper - WINDOWS de_ch', () => { [{ label: 'Shift+^', ariaLabel: 'Shift+^', - labelWithoutModifiers: '^', - ariaLabelWithoutModifiers: '^', electronAccelerator: 'Shift+]', userSettingsLabel: 'shift+]', isWYSIWYG: false, isChord: false, - hasCtrlModifier: false, - hasShiftModifier: true, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['shift+]', null], }] ); @@ -192,16 +156,10 @@ suite('keyboardMapper - WINDOWS de_ch', () => { [{ label: 'Ctrl+§', ariaLabel: 'Control+§', - labelWithoutModifiers: '§', - ariaLabelWithoutModifiers: '§', electronAccelerator: 'Ctrl+/', userSettingsLabel: 'ctrl+/', isWYSIWYG: false, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+/', null], }] ); @@ -214,16 +172,10 @@ suite('keyboardMapper - WINDOWS de_ch', () => { [{ label: 'Ctrl+Shift+§', ariaLabel: 'Control+Shift+§', - labelWithoutModifiers: '§', - ariaLabelWithoutModifiers: '§', electronAccelerator: 'Ctrl+Shift+/', userSettingsLabel: 'ctrl+shift+/', isWYSIWYG: false, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: true, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+shift+/', null], }] ); @@ -236,16 +188,10 @@ suite('keyboardMapper - WINDOWS de_ch', () => { [{ label: 'Ctrl+K Ctrl+ä', ariaLabel: 'Control+K Control+ä', - labelWithoutModifiers: 'K ä', - ariaLabelWithoutModifiers: 'K ä', electronAccelerator: null, userSettingsLabel: 'ctrl+k ctrl+\\', isWYSIWYG: false, isChord: true, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+K', 'ctrl+\\'], }] ); @@ -266,16 +212,10 @@ suite('keyboardMapper - WINDOWS de_ch', () => { [{ label: 'Ctrl+DownArrow', ariaLabel: 'Control+DownArrow', - labelWithoutModifiers: 'DownArrow', - ariaLabelWithoutModifiers: 'DownArrow', electronAccelerator: 'Ctrl+Down', userSettingsLabel: 'ctrl+down', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+DownArrow', null], }] ); @@ -288,16 +228,10 @@ suite('keyboardMapper - WINDOWS de_ch', () => { [{ label: 'Ctrl+NumPad0', ariaLabel: 'Control+NumPad0', - labelWithoutModifiers: 'NumPad0', - ariaLabelWithoutModifiers: 'NumPad0', electronAccelerator: null, userSettingsLabel: 'ctrl+numpad0', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+NumPad0', null], }] ); @@ -310,16 +244,10 @@ suite('keyboardMapper - WINDOWS de_ch', () => { [{ label: 'Ctrl+Home', ariaLabel: 'Control+Home', - labelWithoutModifiers: 'Home', - ariaLabelWithoutModifiers: 'Home', electronAccelerator: 'Ctrl+Home', userSettingsLabel: 'ctrl+home', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+Home', null], }] ); @@ -339,16 +267,10 @@ suite('keyboardMapper - WINDOWS de_ch', () => { { label: 'Ctrl+Home', ariaLabel: 'Control+Home', - labelWithoutModifiers: 'Home', - ariaLabelWithoutModifiers: 'Home', electronAccelerator: 'Ctrl+Home', userSettingsLabel: 'ctrl+home', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+Home', null], } ); @@ -362,16 +284,10 @@ suite('keyboardMapper - WINDOWS de_ch', () => { [{ label: 'Ctrl+, Ctrl+§', ariaLabel: 'Control+, Control+§', - labelWithoutModifiers: ', §', - ariaLabelWithoutModifiers: ', §', electronAccelerator: null, userSettingsLabel: 'ctrl+, ctrl+/', isWYSIWYG: false, isChord: true, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+,', 'ctrl+/'], }] ); @@ -391,16 +307,10 @@ suite('keyboardMapper - WINDOWS de_ch', () => { { label: 'Ctrl+', ariaLabel: 'Control+', - labelWithoutModifiers: '', - ariaLabelWithoutModifiers: '', electronAccelerator: null, userSettingsLabel: 'ctrl+', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: [null, null], } ); @@ -429,16 +339,10 @@ suite('keyboardMapper - WINDOWS en_us', () => { [{ label: 'Ctrl+K Ctrl+\\', ariaLabel: 'Control+K Control+\\', - labelWithoutModifiers: 'K \\', - ariaLabelWithoutModifiers: 'K \\', electronAccelerator: null, userSettingsLabel: 'ctrl+k ctrl+\\', isWYSIWYG: true, isChord: true, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+K', 'ctrl+\\'], }] ); @@ -452,16 +356,10 @@ suite('keyboardMapper - WINDOWS en_us', () => { [{ label: 'Ctrl+, Ctrl+/', ariaLabel: 'Control+, Control+/', - labelWithoutModifiers: ', /', - ariaLabelWithoutModifiers: ', /', electronAccelerator: null, userSettingsLabel: 'ctrl+, ctrl+/', isWYSIWYG: true, isChord: true, - hasCtrlModifier: false, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+,', 'ctrl+/'], }] ); @@ -475,16 +373,10 @@ suite('keyboardMapper - WINDOWS en_us', () => { [{ label: 'Ctrl+,', ariaLabel: 'Control+,', - labelWithoutModifiers: ',', - ariaLabelWithoutModifiers: ',', electronAccelerator: 'Ctrl+,', userSettingsLabel: 'ctrl+,', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+,', null], }] ); @@ -504,16 +396,10 @@ suite('keyboardMapper - WINDOWS en_us', () => { { label: 'Ctrl+', ariaLabel: 'Control+', - labelWithoutModifiers: '', - ariaLabelWithoutModifiers: '', electronAccelerator: null, userSettingsLabel: 'ctrl+', isWYSIWYG: true, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: [null, null], } ); @@ -545,16 +431,10 @@ suite('misc', () => { [{ label: 'Ctrl+لا', ariaLabel: 'Control+لا', - labelWithoutModifiers: 'لا', - ariaLabelWithoutModifiers: 'لا', electronAccelerator: 'Ctrl+B', userSettingsLabel: 'ctrl+b', isWYSIWYG: false, isChord: false, - hasCtrlModifier: true, - hasShiftModifier: false, - hasAltModifier: false, - hasMetaModifier: false, dispatchParts: ['ctrl+B', null], }] ); From c749f235fa0828263e7ae3ba9cd2aef6c547cae1 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 May 2017 07:09:46 -0700 Subject: [PATCH 0058/1164] Fixes #24522: Ctrl+Alt+[Minus] under English (UK) keyboard layout on Linux --- .../ui/keybindingLabel/keybindingLabel.ts | 2 +- src/vs/base/common/keyCodes.ts | 8 +- .../common/keybindingsEditorModel.ts | 2 +- .../common/macLinuxKeyboardMapper.ts | 133 +-- .../services/keybinding/test/linux_en_uk.js | 1046 +++++++++++++++++ .../services/keybinding/test/linux_en_uk.txt | 517 ++++++++ .../test/macLinuxKeyboardMapper.test.ts | 39 + 7 files changed, 1671 insertions(+), 76 deletions(-) create mode 100644 src/vs/workbench/services/keybinding/test/linux_en_uk.js create mode 100644 src/vs/workbench/services/keybinding/test/linux_en_uk.txt diff --git a/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.ts b/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.ts index e75c3faade7..cee68a0de3a 100644 --- a/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.ts +++ b/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.ts @@ -86,7 +86,7 @@ export class KeybindingLabel implements IDisposable { if (part.metaKey) { this.renderKey(parent, modifierLabels.metaKey, match && match.metaKey, modifierLabels.separator); } - const keyLabel = part.kbLabel; + const keyLabel = part.keyLabel; if (keyLabel) { this.renderKey(parent, keyLabel, match && match.keyCode, ''); } diff --git a/src/vs/base/common/keyCodes.ts b/src/vs/base/common/keyCodes.ts index bed55f19ceb..ff89f086e57 100644 --- a/src/vs/base/common/keyCodes.ts +++ b/src/vs/base/common/keyCodes.ts @@ -552,16 +552,16 @@ export class ResolvedKeybindingPart { readonly altKey: boolean; readonly metaKey: boolean; - readonly kbLabel: string; - readonly kbAriaLabel: string; + readonly keyLabel: string; + readonly keyAriaLabel: string; constructor(ctrlKey: boolean, shiftKey: boolean, altKey: boolean, metaKey: boolean, kbLabel: string, kbAriaLabel: string) { this.ctrlKey = ctrlKey; this.shiftKey = shiftKey; this.altKey = altKey; this.metaKey = metaKey; - this.kbLabel = kbLabel; - this.kbAriaLabel = kbAriaLabel; + this.keyLabel = kbLabel; + this.keyAriaLabel = kbAriaLabel; } } diff --git a/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.ts b/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.ts index 43b5b6f0c26..65379a3689f 100644 --- a/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.ts +++ b/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.ts @@ -384,7 +384,7 @@ class KeybindingItemMatches { if (!keybinding) { return false; } - const ariaLabel = keybinding.kbAriaLabel; + const ariaLabel = keybinding.keyAriaLabel; if (ariaLabel.length === 1 || word.length === 1) { if (strings.compareIgnoreCase(ariaLabel, word) === 0) { return true; diff --git a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts index d77347961a4..e7eacdb6a96 100644 --- a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts @@ -87,80 +87,43 @@ export class NativeResolvedKeybinding extends ResolvedKeybinding { this._chordPart = chordPart; } - private _getUILabelForScanCodeBinding(binding: ScanCodeBinding): string { - if (!binding) { - return null; - } - if (binding.isDuplicateModifierCase()) { - return ''; - } - return this._mapper.getUILabelForScanCode(binding.scanCode); - } - public getLabel(): string { - let firstPart = this._getUILabelForScanCodeBinding(this._firstPart); - let chordPart = this._getUILabelForScanCodeBinding(this._chordPart); + let firstPart = this._mapper.getUILabelForScanCodeBinding(this._firstPart); + let chordPart = this._mapper.getUILabelForScanCodeBinding(this._chordPart); return UILabelProvider.toLabel(this._firstPart, firstPart, this._chordPart, chordPart, this._OS); } - private _getAriaLabelForScanCodeBinding(binding: ScanCodeBinding): string { - if (!binding) { - return null; - } - if (binding.isDuplicateModifierCase()) { - return ''; - } - return this._mapper.getAriaLabelForScanCode(binding.scanCode); - } - public getAriaLabel(): string { - let firstPart = this._getAriaLabelForScanCodeBinding(this._firstPart); - let chordPart = this._getAriaLabelForScanCodeBinding(this._chordPart); + let firstPart = this._mapper.getAriaLabelForScanCodeBinding(this._firstPart); + let chordPart = this._mapper.getAriaLabelForScanCodeBinding(this._chordPart); return AriaLabelProvider.toLabel(this._firstPart, firstPart, this._chordPart, chordPart, this._OS); } - private _getElectronAcceleratorLabelForScanCodeBinding(binding: ScanCodeBinding): string { - if (!binding) { - return null; - } - if (binding.isDuplicateModifierCase()) { - return null; - } - return this._mapper.getElectronLabelForScanCode(binding.scanCode); - } - public getElectronAccelerator(): string { if (this._chordPart !== null) { // Electron cannot handle chords return null; } - let firstPart = this._getElectronAcceleratorLabelForScanCodeBinding(this._firstPart); + let firstPart = this._mapper.getElectronAcceleratorLabelForScanCodeBinding(this._firstPart); return ElectronAcceleratorLabelProvider.toLabel(this._firstPart, firstPart, null, null, this._OS); } - private _getUserSettingsLabelForScanCodeBinding(binding: ScanCodeBinding): string { - if (!binding) { - return null; - } - if (binding.isDuplicateModifierCase()) { - return ''; - } - return this._mapper.getUserSettingsLabel(binding.scanCode); - } - public getUserSettingsLabel(): string { - let firstPart = this._getUserSettingsLabelForScanCodeBinding(this._firstPart); - let chordPart = this._getUserSettingsLabelForScanCodeBinding(this._chordPart); + let firstPart = this._mapper.getUserSettingsLabelForScanCodeBinding(this._firstPart); + let chordPart = this._mapper.getUserSettingsLabelForScanCodeBinding(this._chordPart); return UserSettingsLabelProvider.toLabel(this._firstPart, firstPart, this._chordPart, chordPart, this._OS); } - private _isWYSIWYG(scanCode: ScanCode): boolean { - if (IMMUTABLE_CODE_TO_KEY_CODE[scanCode] !== -1) { + private _isWYSIWYG(binding: ScanCodeBinding): boolean { + if (!binding) { return true; } - let a = this._mapper.getAriaLabelForScanCode(scanCode); - let b = this._mapper.getUserSettingsLabel(scanCode); + if (IMMUTABLE_CODE_TO_KEY_CODE[binding.scanCode] !== -1) { + return true; + } + let a = this._mapper.getAriaLabelForScanCodeBinding(binding); + let b = this._mapper.getUserSettingsLabelForScanCodeBinding(binding); if (!a && !b) { return true; @@ -172,10 +135,7 @@ export class NativeResolvedKeybinding extends ResolvedKeybinding { } public isWYSIWYG(): boolean { - let result = true; - result = result && (this._firstPart ? this._isWYSIWYG(this._firstPart.scanCode) : true); - result = result && (this._chordPart ? this._isWYSIWYG(this._chordPart.scanCode) : true); - return result; + return (this._isWYSIWYG(this._firstPart) && this._isWYSIWYG(this._chordPart)); } public isChord(): boolean { @@ -199,8 +159,8 @@ export class NativeResolvedKeybinding extends ResolvedKeybinding { binding.shiftKey, binding.altKey, binding.metaKey, - this._getUILabelForScanCodeBinding(binding), - this._getAriaLabelForScanCodeBinding(binding) + this._mapper.getUILabelForScanCodeBinding(binding), + this._mapper.getAriaLabelForScanCodeBinding(binding) ); } @@ -900,9 +860,15 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { return result; } - public getUILabelForScanCode(scanCode: ScanCode): string { + public getUILabelForScanCodeBinding(binding: ScanCodeBinding): string { + if (!binding) { + return null; + } + if (binding.isDuplicateModifierCase()) { + return ''; + } if (this._OS === OperatingSystem.Macintosh) { - switch (scanCode) { + switch (binding.scanCode) { case ScanCode.ArrowLeft: return '←'; case ScanCode.ArrowUp: @@ -913,11 +879,17 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { return '↓'; } } - return this._scanCodeToLabel[scanCode]; + return this._scanCodeToLabel[binding.scanCode]; } - public getAriaLabelForScanCode(scanCode: ScanCode): string { - return this._scanCodeToLabel[scanCode]; + public getAriaLabelForScanCodeBinding(binding: ScanCodeBinding): string { + if (!binding) { + return null; + } + if (binding.isDuplicateModifierCase()) { + return ''; + } + return this._scanCodeToLabel[binding.scanCode]; } public getDispatchStrForScanCodeBinding(keypress: ScanCodeBinding): string { @@ -944,19 +916,33 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { return result; } - public getUserSettingsLabel(scanCode: ScanCode): string { - const immutableKeyCode = IMMUTABLE_CODE_TO_KEY_CODE[scanCode]; + public getUserSettingsLabelForScanCodeBinding(binding: ScanCodeBinding): string { + if (!binding) { + return null; + } + if (binding.isDuplicateModifierCase()) { + return ''; + } + + const immutableKeyCode = IMMUTABLE_CODE_TO_KEY_CODE[binding.scanCode]; if (immutableKeyCode !== -1) { return USER_SETTINGS.fromKeyCode(immutableKeyCode).toLowerCase(); } // Check if this scanCode always maps to the same keyCode and back - let constantKeyCode: KeyCode = this._scanCodeKeyCodeMapper.guessStableKeyCode(scanCode); + let constantKeyCode: KeyCode = this._scanCodeKeyCodeMapper.guessStableKeyCode(binding.scanCode); if (constantKeyCode !== -1) { - return USER_SETTINGS.fromKeyCode(constantKeyCode).toLowerCase(); + // Verify that this is a good key code that can be mapped back to the same scan code + let reverseBindings = this.simpleKeybindingToScanCodeBinding(new SimpleKeybinding(binding.ctrlKey, binding.shiftKey, binding.altKey, binding.metaKey, constantKeyCode)); + for (let i = 0, len = reverseBindings.length; i < len; i++) { + const reverseBinding = reverseBindings[i]; + if (reverseBinding.scanCode === binding.scanCode) { + return USER_SETTINGS.fromKeyCode(constantKeyCode).toLowerCase(); + } + } } - return this._scanCodeToDispatch[scanCode]; + return this._scanCodeToDispatch[binding.scanCode]; } private _getElectronLabelForKeyCode(keyCode: KeyCode): string { @@ -980,14 +966,21 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { return KeyCodeUtils.toString(keyCode); } - public getElectronLabelForScanCode(scanCode: ScanCode): string { - const immutableKeyCode = IMMUTABLE_CODE_TO_KEY_CODE[scanCode]; + public getElectronAcceleratorLabelForScanCodeBinding(binding: ScanCodeBinding): string { + if (!binding) { + return null; + } + if (binding.isDuplicateModifierCase()) { + return null; + } + + const immutableKeyCode = IMMUTABLE_CODE_TO_KEY_CODE[binding.scanCode]; if (immutableKeyCode !== -1) { return this._getElectronLabelForKeyCode(immutableKeyCode); } // Check if this scanCode always maps to the same keyCode and back - let constantKeyCode: KeyCode = this._scanCodeKeyCodeMapper.guessStableKeyCode(scanCode); + const constantKeyCode: KeyCode = this._scanCodeKeyCodeMapper.guessStableKeyCode(binding.scanCode); if (!this._isUSStandard) { // Electron cannot handle these key codes on anything else than standard US diff --git a/src/vs/workbench/services/keybinding/test/linux_en_uk.js b/src/vs/workbench/services/keybinding/test/linux_en_uk.js new file mode 100644 index 00000000000..57b55abead3 --- /dev/null +++ b/src/vs/workbench/services/keybinding/test/linux_en_uk.js @@ -0,0 +1,1046 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +define({ + "Sleep": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "WakeUp": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "KeyA": { + "value": "a", + "withShift": "A", + "withAltGr": "æ", + "withShiftAltGr": "Æ" + }, + "KeyB": { + "value": "b", + "withShift": "B", + "withAltGr": "”", + "withShiftAltGr": "’" + }, + "KeyC": { + "value": "c", + "withShift": "C", + "withAltGr": "¢", + "withShiftAltGr": "©" + }, + "KeyD": { + "value": "d", + "withShift": "D", + "withAltGr": "ð", + "withShiftAltGr": "Ð" + }, + "KeyE": { + "value": "e", + "withShift": "E", + "withAltGr": "e", + "withShiftAltGr": "E" + }, + "KeyF": { + "value": "f", + "withShift": "F", + "withAltGr": "đ", + "withShiftAltGr": "ª" + }, + "KeyG": { + "value": "g", + "withShift": "G", + "withAltGr": "ŋ", + "withShiftAltGr": "Ŋ" + }, + "KeyH": { + "value": "h", + "withShift": "H", + "withAltGr": "ħ", + "withShiftAltGr": "Ħ" + }, + "KeyI": { + "value": "i", + "withShift": "I", + "withAltGr": "→", + "withShiftAltGr": "ı" + }, + "KeyJ": { + "value": "j", + "withShift": "J", + "withAltGr": "̉", + "withShiftAltGr": "̛" + }, + "KeyK": { + "value": "k", + "withShift": "K", + "withAltGr": "ĸ", + "withShiftAltGr": "&" + }, + "KeyL": { + "value": "l", + "withShift": "L", + "withAltGr": "ł", + "withShiftAltGr": "Ł" + }, + "KeyM": { + "value": "m", + "withShift": "M", + "withAltGr": "µ", + "withShiftAltGr": "º" + }, + "KeyN": { + "value": "n", + "withShift": "N", + "withAltGr": "n", + "withShiftAltGr": "N" + }, + "KeyO": { + "value": "o", + "withShift": "O", + "withAltGr": "ø", + "withShiftAltGr": "Ø" + }, + "KeyP": { + "value": "p", + "withShift": "P", + "withAltGr": "þ", + "withShiftAltGr": "Þ" + }, + "KeyQ": { + "value": "q", + "withShift": "Q", + "withAltGr": "@", + "withShiftAltGr": "Ω" + }, + "KeyR": { + "value": "r", + "withShift": "R", + "withAltGr": "¶", + "withShiftAltGr": "®" + }, + "KeyS": { + "value": "s", + "withShift": "S", + "withAltGr": "ß", + "withShiftAltGr": "§" + }, + "KeyT": { + "value": "t", + "withShift": "T", + "withAltGr": "ŧ", + "withShiftAltGr": "Ŧ" + }, + "KeyU": { + "value": "u", + "withShift": "U", + "withAltGr": "↓", + "withShiftAltGr": "↑" + }, + "KeyV": { + "value": "v", + "withShift": "V", + "withAltGr": "“", + "withShiftAltGr": "‘" + }, + "KeyW": { + "value": "w", + "withShift": "W", + "withAltGr": "ł", + "withShiftAltGr": "Ł" + }, + "KeyX": { + "value": "x", + "withShift": "X", + "withAltGr": "»", + "withShiftAltGr": ">" + }, + "KeyY": { + "value": "y", + "withShift": "Y", + "withAltGr": "←", + "withShiftAltGr": "¥" + }, + "KeyZ": { + "value": "z", + "withShift": "Z", + "withAltGr": "«", + "withShiftAltGr": "<" + }, + "Digit1": { + "value": "1", + "withShift": "!", + "withAltGr": "¹", + "withShiftAltGr": "¡" + }, + "Digit2": { + "value": "2", + "withShift": "\"", + "withAltGr": "²", + "withShiftAltGr": "⅛" + }, + "Digit3": { + "value": "3", + "withShift": "£", + "withAltGr": "³", + "withShiftAltGr": "£" + }, + "Digit4": { + "value": "4", + "withShift": "$", + "withAltGr": "€", + "withShiftAltGr": "¼" + }, + "Digit5": { + "value": "5", + "withShift": "%", + "withAltGr": "½", + "withShiftAltGr": "⅜" + }, + "Digit6": { + "value": "6", + "withShift": "^", + "withAltGr": "¾", + "withShiftAltGr": "⅝" + }, + "Digit7": { + "value": "7", + "withShift": "&", + "withAltGr": "{", + "withShiftAltGr": "⅞" + }, + "Digit8": { + "value": "8", + "withShift": "*", + "withAltGr": "[", + "withShiftAltGr": "™" + }, + "Digit9": { + "value": "9", + "withShift": "(", + "withAltGr": "]", + "withShiftAltGr": "±" + }, + "Digit0": { + "value": "0", + "withShift": ")", + "withAltGr": "}", + "withShiftAltGr": "°" + }, + "Enter": { + "value": "\r", + "withShift": "\r", + "withAltGr": "\r", + "withShiftAltGr": "\r" + }, + "Escape": { + "value": "\u001b", + "withShift": "\u001b", + "withAltGr": "\u001b", + "withShiftAltGr": "\u001b" + }, + "Backspace": { + "value": "\b", + "withShift": "\b", + "withAltGr": "\b", + "withShiftAltGr": "\b" + }, + "Tab": { + "value": "\t", + "withShift": "", + "withAltGr": "\t", + "withShiftAltGr": "" + }, + "Space": { + "value": " ", + "withShift": " ", + "withAltGr": " ", + "withShiftAltGr": " " + }, + "Minus": { + "value": "-", + "withShift": "_", + "withAltGr": "\\", + "withShiftAltGr": "¿" + }, + "Equal": { + "value": "=", + "withShift": "+", + "withAltGr": "̧", + "withShiftAltGr": "̨" + }, + "BracketLeft": { + "value": "[", + "withShift": "{", + "withAltGr": "̈", + "withShiftAltGr": "̊" + }, + "BracketRight": { + "value": "]", + "withShift": "}", + "withAltGr": "̃", + "withShiftAltGr": "̄" + }, + "Backslash": { + "value": "#", + "withShift": "~", + "withAltGr": "̀", + "withShiftAltGr": "̆" + }, + "Semicolon": { + "value": ";", + "withShift": ":", + "withAltGr": "́", + "withShiftAltGr": "̋" + }, + "Quote": { + "value": "'", + "withShift": "@", + "withAltGr": "̂", + "withShiftAltGr": "̌" + }, + "Backquote": { + "value": "`", + "withShift": "¬", + "withAltGr": "|", + "withShiftAltGr": "|" + }, + "Comma": { + "value": ",", + "withShift": "<", + "withAltGr": "─", + "withShiftAltGr": "×" + }, + "Period": { + "value": ".", + "withShift": ">", + "withAltGr": "·", + "withShiftAltGr": "÷" + }, + "Slash": { + "value": "/", + "withShift": "?", + "withAltGr": "̣", + "withShiftAltGr": "̇" + }, + "CapsLock": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F1": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F2": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F3": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F4": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F5": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F6": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F7": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F8": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F9": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F10": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F11": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F12": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "PrintScreen": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "ScrollLock": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Pause": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Insert": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Home": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "PageUp": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Delete": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "End": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "PageDown": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "ArrowRight": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "ArrowLeft": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "ArrowDown": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "ArrowUp": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "NumLock": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "NumpadDivide": { + "value": "/", + "withShift": "/", + "withAltGr": "/", + "withShiftAltGr": "/" + }, + "NumpadMultiply": { + "value": "*", + "withShift": "*", + "withAltGr": "*", + "withShiftAltGr": "*" + }, + "NumpadSubtract": { + "value": "-", + "withShift": "-", + "withAltGr": "-", + "withShiftAltGr": "-" + }, + "NumpadAdd": { + "value": "+", + "withShift": "+", + "withAltGr": "+", + "withShiftAltGr": "+" + }, + "NumpadEnter": { + "value": "\r", + "withShift": "\r", + "withAltGr": "\r", + "withShiftAltGr": "\r" + }, + "Numpad1": { + "value": "", + "withShift": "1", + "withAltGr": "", + "withShiftAltGr": "1" + }, + "Numpad2": { + "value": "", + "withShift": "2", + "withAltGr": "", + "withShiftAltGr": "2" + }, + "Numpad3": { + "value": "", + "withShift": "3", + "withAltGr": "", + "withShiftAltGr": "3" + }, + "Numpad4": { + "value": "", + "withShift": "4", + "withAltGr": "", + "withShiftAltGr": "4" + }, + "Numpad5": { + "value": "", + "withShift": "5", + "withAltGr": "", + "withShiftAltGr": "5" + }, + "Numpad6": { + "value": "", + "withShift": "6", + "withAltGr": "", + "withShiftAltGr": "6" + }, + "Numpad7": { + "value": "", + "withShift": "7", + "withAltGr": "", + "withShiftAltGr": "7" + }, + "Numpad8": { + "value": "", + "withShift": "8", + "withAltGr": "", + "withShiftAltGr": "8" + }, + "Numpad9": { + "value": "", + "withShift": "9", + "withAltGr": "", + "withShiftAltGr": "9" + }, + "Numpad0": { + "value": "", + "withShift": "0", + "withAltGr": "", + "withShiftAltGr": "0" + }, + "NumpadDecimal": { + "value": "", + "withShift": ".", + "withAltGr": "", + "withShiftAltGr": "." + }, + "IntlBackslash": { + "value": "\\", + "withShift": "|", + "withAltGr": "|", + "withShiftAltGr": "¦" + }, + "ContextMenu": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Power": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "NumpadEqual": { + "value": "=", + "withShift": "=", + "withAltGr": "=", + "withShiftAltGr": "=" + }, + "F13": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F14": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F15": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F16": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F17": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F18": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F19": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F20": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F21": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F22": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F23": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "F24": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Open": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Help": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Select": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Again": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Undo": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Cut": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Copy": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Paste": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Find": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "AudioVolumeMute": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "AudioVolumeUp": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "AudioVolumeDown": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "NumpadComma": { + "value": ".", + "withShift": ".", + "withAltGr": ".", + "withShiftAltGr": "." + }, + "IntlRo": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "KanaMode": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "IntlYen": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Convert": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "NonConvert": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Lang1": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Lang2": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Lang3": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Lang4": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Lang5": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "NumpadParenLeft": { + "value": "(", + "withShift": "(", + "withAltGr": "(", + "withShiftAltGr": "(" + }, + "NumpadParenRight": { + "value": ")", + "withShift": ")", + "withAltGr": ")", + "withShiftAltGr": ")" + }, + "ControlLeft": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "ShiftLeft": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "AltLeft": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "MetaLeft": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "ControlRight": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "ShiftRight": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "AltRight": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "MetaRight": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "BrightnessUp": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "BrightnessDown": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "MediaPlay": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "MediaRecord": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "MediaFastForward": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "MediaRewind": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "MediaTrackNext": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "MediaTrackPrevious": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "MediaStop": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "Eject": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "MediaPlayPause": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "MediaSelect": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "LaunchMail": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "LaunchApp2": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "LaunchApp1": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "SelectTask": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "LaunchScreenSaver": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "BrowserSearch": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "BrowserHome": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "BrowserBack": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "BrowserForward": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "BrowserStop": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "BrowserRefresh": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "BrowserFavorites": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "MailReply": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "MailForward": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + }, + "MailSend": { + "value": "", + "withShift": "", + "withAltGr": "", + "withShiftAltGr": "" + } +}); diff --git a/src/vs/workbench/services/keybinding/test/linux_en_uk.txt b/src/vs/workbench/services/keybinding/test/linux_en_uk.txt new file mode 100644 index 00000000000..9d1ab7184c4 --- /dev/null +++ b/src/vs/workbench/services/keybinding/test/linux_en_uk.txt @@ -0,0 +1,517 @@ +isUSStandard: false +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyA | a | A | | A | a | A | [KeyA] | | +| Ctrl+KeyA | a | Ctrl+A | | Ctrl+A | ctrl+a | Ctrl+A | ctrl+[KeyA] | | +| Shift+KeyA | A | Shift+A | | Shift+A | shift+a | Shift+A | shift+[KeyA] | | +| Ctrl+Shift+KeyA | A | Ctrl+Shift+A | | Ctrl+Shift+A | ctrl+shift+a | Ctrl+Shift+A | ctrl+shift+[KeyA] | | +| Alt+KeyA | a | Alt+A | | Alt+A | alt+a | Alt+A | alt+[KeyA] | | +| Ctrl+Alt+KeyA | æ | Ctrl+Alt+A | | Ctrl+Alt+A | ctrl+alt+a | Ctrl+Alt+A | ctrl+alt+[KeyA] | | +| Shift+Alt+KeyA | A | Shift+Alt+A | | Shift+Alt+A | shift+alt+a | Shift+Alt+A | shift+alt+[KeyA] | | +| Ctrl+Shift+Alt+KeyA | Æ | Ctrl+Shift+Alt+A | | Ctrl+Shift+Alt+A | ctrl+shift+alt+a | Ctrl+Shift+Alt+A | ctrl+shift+alt+[KeyA] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyB | b | B | | B | b | B | [KeyB] | | +| Ctrl+KeyB | b | Ctrl+B | | Ctrl+B | ctrl+b | Ctrl+B | ctrl+[KeyB] | | +| Shift+KeyB | B | Shift+B | | Shift+B | shift+b | Shift+B | shift+[KeyB] | | +| Ctrl+Shift+KeyB | B | Ctrl+Shift+B | | Ctrl+Shift+B | ctrl+shift+b | Ctrl+Shift+B | ctrl+shift+[KeyB] | | +| Alt+KeyB | b | Alt+B | | Alt+B | alt+b | Alt+B | alt+[KeyB] | | +| Ctrl+Alt+KeyB | ” | Ctrl+Alt+B | | Ctrl+Alt+B | ctrl+alt+b | Ctrl+Alt+B | ctrl+alt+[KeyB] | | +| Shift+Alt+KeyB | B | Shift+Alt+B | | Shift+Alt+B | shift+alt+b | Shift+Alt+B | shift+alt+[KeyB] | | +| Ctrl+Shift+Alt+KeyB | ’ | Ctrl+Shift+Alt+B | | Ctrl+Shift+Alt+B | ctrl+shift+alt+b | Ctrl+Shift+Alt+B | ctrl+shift+alt+[KeyB] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyC | c | C | | C | c | C | [KeyC] | | +| Ctrl+KeyC | c | Ctrl+C | | Ctrl+C | ctrl+c | Ctrl+C | ctrl+[KeyC] | | +| Shift+KeyC | C | Shift+C | | Shift+C | shift+c | Shift+C | shift+[KeyC] | | +| Ctrl+Shift+KeyC | C | Ctrl+Shift+C | | Ctrl+Shift+C | ctrl+shift+c | Ctrl+Shift+C | ctrl+shift+[KeyC] | | +| Alt+KeyC | c | Alt+C | | Alt+C | alt+c | Alt+C | alt+[KeyC] | | +| Ctrl+Alt+KeyC | ¢ | Ctrl+Alt+C | | Ctrl+Alt+C | ctrl+alt+c | Ctrl+Alt+C | ctrl+alt+[KeyC] | | +| Shift+Alt+KeyC | C | Shift+Alt+C | | Shift+Alt+C | shift+alt+c | Shift+Alt+C | shift+alt+[KeyC] | | +| Ctrl+Shift+Alt+KeyC | © | Ctrl+Shift+Alt+C | | Ctrl+Shift+Alt+C | ctrl+shift+alt+c | Ctrl+Shift+Alt+C | ctrl+shift+alt+[KeyC] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyD | d | D | | D | d | D | [KeyD] | | +| Ctrl+KeyD | d | Ctrl+D | | Ctrl+D | ctrl+d | Ctrl+D | ctrl+[KeyD] | | +| Shift+KeyD | D | Shift+D | | Shift+D | shift+d | Shift+D | shift+[KeyD] | | +| Ctrl+Shift+KeyD | D | Ctrl+Shift+D | | Ctrl+Shift+D | ctrl+shift+d | Ctrl+Shift+D | ctrl+shift+[KeyD] | | +| Alt+KeyD | d | Alt+D | | Alt+D | alt+d | Alt+D | alt+[KeyD] | | +| Ctrl+Alt+KeyD | ð | Ctrl+Alt+D | | Ctrl+Alt+D | ctrl+alt+d | Ctrl+Alt+D | ctrl+alt+[KeyD] | | +| Shift+Alt+KeyD | D | Shift+Alt+D | | Shift+Alt+D | shift+alt+d | Shift+Alt+D | shift+alt+[KeyD] | | +| Ctrl+Shift+Alt+KeyD | Ð | Ctrl+Shift+Alt+D | | Ctrl+Shift+Alt+D | ctrl+shift+alt+d | Ctrl+Shift+Alt+D | ctrl+shift+alt+[KeyD] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyE | e | E | | E | e | E | [KeyE] | | +| Ctrl+KeyE | e | Ctrl+E | | Ctrl+E | ctrl+e | Ctrl+E | ctrl+[KeyE] | | +| Shift+KeyE | E | Shift+E | | Shift+E | shift+e | Shift+E | shift+[KeyE] | | +| Ctrl+Shift+KeyE | E | Ctrl+Shift+E | | Ctrl+Shift+E | ctrl+shift+e | Ctrl+Shift+E | ctrl+shift+[KeyE] | | +| Alt+KeyE | e | Alt+E | | Alt+E | alt+e | Alt+E | alt+[KeyE] | | +| Ctrl+Alt+KeyE | e | Ctrl+Alt+E | | Ctrl+Alt+E | ctrl+alt+e | Ctrl+Alt+E | ctrl+alt+[KeyE] | | +| Shift+Alt+KeyE | E | Shift+Alt+E | | Shift+Alt+E | shift+alt+e | Shift+Alt+E | shift+alt+[KeyE] | | +| Ctrl+Shift+Alt+KeyE | E | Ctrl+Shift+Alt+E | | Ctrl+Shift+Alt+E | ctrl+shift+alt+e | Ctrl+Shift+Alt+E | ctrl+shift+alt+[KeyE] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyF | f | F | | F | f | F | [KeyF] | | +| Ctrl+KeyF | f | Ctrl+F | | Ctrl+F | ctrl+f | Ctrl+F | ctrl+[KeyF] | | +| Shift+KeyF | F | Shift+F | | Shift+F | shift+f | Shift+F | shift+[KeyF] | | +| Ctrl+Shift+KeyF | F | Ctrl+Shift+F | | Ctrl+Shift+F | ctrl+shift+f | Ctrl+Shift+F | ctrl+shift+[KeyF] | | +| Alt+KeyF | f | Alt+F | | Alt+F | alt+f | Alt+F | alt+[KeyF] | | +| Ctrl+Alt+KeyF | đ | Ctrl+Alt+F | | Ctrl+Alt+F | ctrl+alt+f | Ctrl+Alt+F | ctrl+alt+[KeyF] | | +| Shift+Alt+KeyF | F | Shift+Alt+F | | Shift+Alt+F | shift+alt+f | Shift+Alt+F | shift+alt+[KeyF] | | +| Ctrl+Shift+Alt+KeyF | ª | Ctrl+Shift+Alt+F | | Ctrl+Shift+Alt+F | ctrl+shift+alt+f | Ctrl+Shift+Alt+F | ctrl+shift+alt+[KeyF] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyG | g | G | | G | g | G | [KeyG] | | +| Ctrl+KeyG | g | Ctrl+G | | Ctrl+G | ctrl+g | Ctrl+G | ctrl+[KeyG] | | +| Shift+KeyG | G | Shift+G | | Shift+G | shift+g | Shift+G | shift+[KeyG] | | +| Ctrl+Shift+KeyG | G | Ctrl+Shift+G | | Ctrl+Shift+G | ctrl+shift+g | Ctrl+Shift+G | ctrl+shift+[KeyG] | | +| Alt+KeyG | g | Alt+G | | Alt+G | alt+g | Alt+G | alt+[KeyG] | | +| Ctrl+Alt+KeyG | ŋ | Ctrl+Alt+G | | Ctrl+Alt+G | ctrl+alt+g | Ctrl+Alt+G | ctrl+alt+[KeyG] | | +| Shift+Alt+KeyG | G | Shift+Alt+G | | Shift+Alt+G | shift+alt+g | Shift+Alt+G | shift+alt+[KeyG] | | +| Ctrl+Shift+Alt+KeyG | Ŋ | Ctrl+Shift+Alt+G | | Ctrl+Shift+Alt+G | ctrl+shift+alt+g | Ctrl+Shift+Alt+G | ctrl+shift+alt+[KeyG] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyH | h | H | | H | h | H | [KeyH] | | +| Ctrl+KeyH | h | Ctrl+H | | Ctrl+H | ctrl+h | Ctrl+H | ctrl+[KeyH] | | +| Shift+KeyH | H | Shift+H | | Shift+H | shift+h | Shift+H | shift+[KeyH] | | +| Ctrl+Shift+KeyH | H | Ctrl+Shift+H | | Ctrl+Shift+H | ctrl+shift+h | Ctrl+Shift+H | ctrl+shift+[KeyH] | | +| Alt+KeyH | h | Alt+H | | Alt+H | alt+h | Alt+H | alt+[KeyH] | | +| Ctrl+Alt+KeyH | ħ | Ctrl+Alt+H | | Ctrl+Alt+H | ctrl+alt+h | Ctrl+Alt+H | ctrl+alt+[KeyH] | | +| Shift+Alt+KeyH | H | Shift+Alt+H | | Shift+Alt+H | shift+alt+h | Shift+Alt+H | shift+alt+[KeyH] | | +| Ctrl+Shift+Alt+KeyH | Ħ | Ctrl+Shift+Alt+H | | Ctrl+Shift+Alt+H | ctrl+shift+alt+h | Ctrl+Shift+Alt+H | ctrl+shift+alt+[KeyH] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyI | i | I | | I | i | I | [KeyI] | | +| Ctrl+KeyI | i | Ctrl+I | | Ctrl+I | ctrl+i | Ctrl+I | ctrl+[KeyI] | | +| Shift+KeyI | I | Shift+I | | Shift+I | shift+i | Shift+I | shift+[KeyI] | | +| Ctrl+Shift+KeyI | I | Ctrl+Shift+I | | Ctrl+Shift+I | ctrl+shift+i | Ctrl+Shift+I | ctrl+shift+[KeyI] | | +| Alt+KeyI | i | Alt+I | | Alt+I | alt+i | Alt+I | alt+[KeyI] | | +| Ctrl+Alt+KeyI | → | Ctrl+Alt+I | | Ctrl+Alt+I | ctrl+alt+i | Ctrl+Alt+I | ctrl+alt+[KeyI] | | +| Shift+Alt+KeyI | I | Shift+Alt+I | | Shift+Alt+I | shift+alt+i | Shift+Alt+I | shift+alt+[KeyI] | | +| Ctrl+Shift+Alt+KeyI | ı | Ctrl+Shift+Alt+I | | Ctrl+Shift+Alt+I | ctrl+shift+alt+i | Ctrl+Shift+Alt+I | ctrl+shift+alt+[KeyI] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyJ | j | J | | J | j | J | [KeyJ] | | +| Ctrl+KeyJ | j | Ctrl+J | | Ctrl+J | ctrl+j | Ctrl+J | ctrl+[KeyJ] | | +| Shift+KeyJ | J | Shift+J | | Shift+J | shift+j | Shift+J | shift+[KeyJ] | | +| Ctrl+Shift+KeyJ | J | Ctrl+Shift+J | | Ctrl+Shift+J | ctrl+shift+j | Ctrl+Shift+J | ctrl+shift+[KeyJ] | | +| Alt+KeyJ | j | Alt+J | | Alt+J | alt+j | Alt+J | alt+[KeyJ] | | +| Ctrl+Alt+KeyJ | U+309 | Ctrl+Alt+J | | Ctrl+Alt+J | ctrl+alt+j | Ctrl+Alt+J | ctrl+alt+[KeyJ] | | +| Shift+Alt+KeyJ | J | Shift+Alt+J | | Shift+Alt+J | shift+alt+j | Shift+Alt+J | shift+alt+[KeyJ] | | +| Ctrl+Shift+Alt+KeyJ | U+31b | Ctrl+Shift+Alt+J | | Ctrl+Shift+Alt+J | ctrl+shift+alt+j | Ctrl+Shift+Alt+J | ctrl+shift+alt+[KeyJ] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyK | k | K | | K | k | K | [KeyK] | | +| Ctrl+KeyK | k | Ctrl+K | | Ctrl+K | ctrl+k | Ctrl+K | ctrl+[KeyK] | | +| Shift+KeyK | K | Shift+K | | Shift+K | shift+k | Shift+K | shift+[KeyK] | | +| Ctrl+Shift+KeyK | K | Ctrl+Shift+K | | Ctrl+Shift+K | ctrl+shift+k | Ctrl+Shift+K | ctrl+shift+[KeyK] | | +| Alt+KeyK | k | Alt+K | | Alt+K | alt+k | Alt+K | alt+[KeyK] | | +| Ctrl+Alt+KeyK | ĸ | Ctrl+Alt+K | | Ctrl+Alt+K | ctrl+alt+k | Ctrl+Alt+K | ctrl+alt+[KeyK] | | +| Shift+Alt+KeyK | K | Shift+Alt+K | | Shift+Alt+K | shift+alt+k | Shift+Alt+K | shift+alt+[KeyK] | | +| Ctrl+Shift+Alt+KeyK | & | Ctrl+Shift+Alt+K | | Ctrl+Shift+Alt+K | ctrl+shift+alt+k | Ctrl+Shift+Alt+K | ctrl+shift+alt+[KeyK] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyL | l | L | | L | l | L | [KeyL] | | +| Ctrl+KeyL | l | Ctrl+L | | Ctrl+L | ctrl+l | Ctrl+L | ctrl+[KeyL] | | +| Shift+KeyL | L | Shift+L | | Shift+L | shift+l | Shift+L | shift+[KeyL] | | +| Ctrl+Shift+KeyL | L | Ctrl+Shift+L | | Ctrl+Shift+L | ctrl+shift+l | Ctrl+Shift+L | ctrl+shift+[KeyL] | | +| Alt+KeyL | l | Alt+L | | Alt+L | alt+l | Alt+L | alt+[KeyL] | | +| Ctrl+Alt+KeyL | ł | Ctrl+Alt+L | | Ctrl+Alt+L | ctrl+alt+l | Ctrl+Alt+L | ctrl+alt+[KeyL] | | +| Shift+Alt+KeyL | L | Shift+Alt+L | | Shift+Alt+L | shift+alt+l | Shift+Alt+L | shift+alt+[KeyL] | | +| Ctrl+Shift+Alt+KeyL | Ł | Ctrl+Shift+Alt+L | | Ctrl+Shift+Alt+L | ctrl+shift+alt+l | Ctrl+Shift+Alt+L | ctrl+shift+alt+[KeyL] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyM | m | M | | M | m | M | [KeyM] | | +| Ctrl+KeyM | m | Ctrl+M | | Ctrl+M | ctrl+m | Ctrl+M | ctrl+[KeyM] | | +| Shift+KeyM | M | Shift+M | | Shift+M | shift+m | Shift+M | shift+[KeyM] | | +| Ctrl+Shift+KeyM | M | Ctrl+Shift+M | | Ctrl+Shift+M | ctrl+shift+m | Ctrl+Shift+M | ctrl+shift+[KeyM] | | +| Alt+KeyM | m | Alt+M | | Alt+M | alt+m | Alt+M | alt+[KeyM] | | +| Ctrl+Alt+KeyM | µ | Ctrl+Alt+M | | Ctrl+Alt+M | ctrl+alt+m | Ctrl+Alt+M | ctrl+alt+[KeyM] | | +| Shift+Alt+KeyM | M | Shift+Alt+M | | Shift+Alt+M | shift+alt+m | Shift+Alt+M | shift+alt+[KeyM] | | +| Ctrl+Shift+Alt+KeyM | º | Ctrl+Shift+Alt+M | | Ctrl+Shift+Alt+M | ctrl+shift+alt+m | Ctrl+Shift+Alt+M | ctrl+shift+alt+[KeyM] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyN | n | N | | N | n | N | [KeyN] | | +| Ctrl+KeyN | n | Ctrl+N | | Ctrl+N | ctrl+n | Ctrl+N | ctrl+[KeyN] | | +| Shift+KeyN | N | Shift+N | | Shift+N | shift+n | Shift+N | shift+[KeyN] | | +| Ctrl+Shift+KeyN | N | Ctrl+Shift+N | | Ctrl+Shift+N | ctrl+shift+n | Ctrl+Shift+N | ctrl+shift+[KeyN] | | +| Alt+KeyN | n | Alt+N | | Alt+N | alt+n | Alt+N | alt+[KeyN] | | +| Ctrl+Alt+KeyN | n | Ctrl+Alt+N | | Ctrl+Alt+N | ctrl+alt+n | Ctrl+Alt+N | ctrl+alt+[KeyN] | | +| Shift+Alt+KeyN | N | Shift+Alt+N | | Shift+Alt+N | shift+alt+n | Shift+Alt+N | shift+alt+[KeyN] | | +| Ctrl+Shift+Alt+KeyN | N | Ctrl+Shift+Alt+N | | Ctrl+Shift+Alt+N | ctrl+shift+alt+n | Ctrl+Shift+Alt+N | ctrl+shift+alt+[KeyN] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyO | o | O | | O | o | O | [KeyO] | | +| Ctrl+KeyO | o | Ctrl+O | | Ctrl+O | ctrl+o | Ctrl+O | ctrl+[KeyO] | | +| Shift+KeyO | O | Shift+O | | Shift+O | shift+o | Shift+O | shift+[KeyO] | | +| Ctrl+Shift+KeyO | O | Ctrl+Shift+O | | Ctrl+Shift+O | ctrl+shift+o | Ctrl+Shift+O | ctrl+shift+[KeyO] | | +| Alt+KeyO | o | Alt+O | | Alt+O | alt+o | Alt+O | alt+[KeyO] | | +| Ctrl+Alt+KeyO | ø | Ctrl+Alt+O | | Ctrl+Alt+O | ctrl+alt+o | Ctrl+Alt+O | ctrl+alt+[KeyO] | | +| Shift+Alt+KeyO | O | Shift+Alt+O | | Shift+Alt+O | shift+alt+o | Shift+Alt+O | shift+alt+[KeyO] | | +| Ctrl+Shift+Alt+KeyO | Ø | Ctrl+Shift+Alt+O | | Ctrl+Shift+Alt+O | ctrl+shift+alt+o | Ctrl+Shift+Alt+O | ctrl+shift+alt+[KeyO] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyP | p | P | | P | p | P | [KeyP] | | +| Ctrl+KeyP | p | Ctrl+P | | Ctrl+P | ctrl+p | Ctrl+P | ctrl+[KeyP] | | +| Shift+KeyP | P | Shift+P | | Shift+P | shift+p | Shift+P | shift+[KeyP] | | +| Ctrl+Shift+KeyP | P | Ctrl+Shift+P | | Ctrl+Shift+P | ctrl+shift+p | Ctrl+Shift+P | ctrl+shift+[KeyP] | | +| Alt+KeyP | p | Alt+P | | Alt+P | alt+p | Alt+P | alt+[KeyP] | | +| Ctrl+Alt+KeyP | þ | Ctrl+Alt+P | | Ctrl+Alt+P | ctrl+alt+p | Ctrl+Alt+P | ctrl+alt+[KeyP] | | +| Shift+Alt+KeyP | P | Shift+Alt+P | | Shift+Alt+P | shift+alt+p | Shift+Alt+P | shift+alt+[KeyP] | | +| Ctrl+Shift+Alt+KeyP | Þ | Ctrl+Shift+Alt+P | | Ctrl+Shift+Alt+P | ctrl+shift+alt+p | Ctrl+Shift+Alt+P | ctrl+shift+alt+[KeyP] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyQ | q | Q | | Q | q | Q | [KeyQ] | | +| Ctrl+KeyQ | q | Ctrl+Q | | Ctrl+Q | ctrl+q | Ctrl+Q | ctrl+[KeyQ] | | +| Shift+KeyQ | Q | Shift+Q | | Shift+Q | shift+q | Shift+Q | shift+[KeyQ] | | +| Ctrl+Shift+KeyQ | Q | Ctrl+Shift+Q | | Ctrl+Shift+Q | ctrl+shift+q | Ctrl+Shift+Q | ctrl+shift+[KeyQ] | | +| Alt+KeyQ | q | Alt+Q | | Alt+Q | alt+q | Alt+Q | alt+[KeyQ] | | +| Ctrl+Alt+KeyQ | @ | Ctrl+Alt+Q | | Ctrl+Alt+Q | ctrl+alt+q | Ctrl+Alt+Q | ctrl+alt+[KeyQ] | | +| Shift+Alt+KeyQ | Q | Shift+Alt+Q | | Shift+Alt+Q | shift+alt+q | Shift+Alt+Q | shift+alt+[KeyQ] | | +| Ctrl+Shift+Alt+KeyQ | Ω | Ctrl+Shift+Alt+Q | | Ctrl+Shift+Alt+Q | ctrl+shift+alt+q | Ctrl+Shift+Alt+Q | ctrl+shift+alt+[KeyQ] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyR | r | R | | R | r | R | [KeyR] | | +| Ctrl+KeyR | r | Ctrl+R | | Ctrl+R | ctrl+r | Ctrl+R | ctrl+[KeyR] | | +| Shift+KeyR | R | Shift+R | | Shift+R | shift+r | Shift+R | shift+[KeyR] | | +| Ctrl+Shift+KeyR | R | Ctrl+Shift+R | | Ctrl+Shift+R | ctrl+shift+r | Ctrl+Shift+R | ctrl+shift+[KeyR] | | +| Alt+KeyR | r | Alt+R | | Alt+R | alt+r | Alt+R | alt+[KeyR] | | +| Ctrl+Alt+KeyR | ¶ | Ctrl+Alt+R | | Ctrl+Alt+R | ctrl+alt+r | Ctrl+Alt+R | ctrl+alt+[KeyR] | | +| Shift+Alt+KeyR | R | Shift+Alt+R | | Shift+Alt+R | shift+alt+r | Shift+Alt+R | shift+alt+[KeyR] | | +| Ctrl+Shift+Alt+KeyR | ® | Ctrl+Shift+Alt+R | | Ctrl+Shift+Alt+R | ctrl+shift+alt+r | Ctrl+Shift+Alt+R | ctrl+shift+alt+[KeyR] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyS | s | S | | S | s | S | [KeyS] | | +| Ctrl+KeyS | s | Ctrl+S | | Ctrl+S | ctrl+s | Ctrl+S | ctrl+[KeyS] | | +| Shift+KeyS | S | Shift+S | | Shift+S | shift+s | Shift+S | shift+[KeyS] | | +| Ctrl+Shift+KeyS | S | Ctrl+Shift+S | | Ctrl+Shift+S | ctrl+shift+s | Ctrl+Shift+S | ctrl+shift+[KeyS] | | +| Alt+KeyS | s | Alt+S | | Alt+S | alt+s | Alt+S | alt+[KeyS] | | +| Ctrl+Alt+KeyS | ß | Ctrl+Alt+S | | Ctrl+Alt+S | ctrl+alt+s | Ctrl+Alt+S | ctrl+alt+[KeyS] | | +| Shift+Alt+KeyS | S | Shift+Alt+S | | Shift+Alt+S | shift+alt+s | Shift+Alt+S | shift+alt+[KeyS] | | +| Ctrl+Shift+Alt+KeyS | § | Ctrl+Shift+Alt+S | | Ctrl+Shift+Alt+S | ctrl+shift+alt+s | Ctrl+Shift+Alt+S | ctrl+shift+alt+[KeyS] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyT | t | T | | T | t | T | [KeyT] | | +| Ctrl+KeyT | t | Ctrl+T | | Ctrl+T | ctrl+t | Ctrl+T | ctrl+[KeyT] | | +| Shift+KeyT | T | Shift+T | | Shift+T | shift+t | Shift+T | shift+[KeyT] | | +| Ctrl+Shift+KeyT | T | Ctrl+Shift+T | | Ctrl+Shift+T | ctrl+shift+t | Ctrl+Shift+T | ctrl+shift+[KeyT] | | +| Alt+KeyT | t | Alt+T | | Alt+T | alt+t | Alt+T | alt+[KeyT] | | +| Ctrl+Alt+KeyT | ŧ | Ctrl+Alt+T | | Ctrl+Alt+T | ctrl+alt+t | Ctrl+Alt+T | ctrl+alt+[KeyT] | | +| Shift+Alt+KeyT | T | Shift+Alt+T | | Shift+Alt+T | shift+alt+t | Shift+Alt+T | shift+alt+[KeyT] | | +| Ctrl+Shift+Alt+KeyT | Ŧ | Ctrl+Shift+Alt+T | | Ctrl+Shift+Alt+T | ctrl+shift+alt+t | Ctrl+Shift+Alt+T | ctrl+shift+alt+[KeyT] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyU | u | U | | U | u | U | [KeyU] | | +| Ctrl+KeyU | u | Ctrl+U | | Ctrl+U | ctrl+u | Ctrl+U | ctrl+[KeyU] | | +| Shift+KeyU | U | Shift+U | | Shift+U | shift+u | Shift+U | shift+[KeyU] | | +| Ctrl+Shift+KeyU | U | Ctrl+Shift+U | | Ctrl+Shift+U | ctrl+shift+u | Ctrl+Shift+U | ctrl+shift+[KeyU] | | +| Alt+KeyU | u | Alt+U | | Alt+U | alt+u | Alt+U | alt+[KeyU] | | +| Ctrl+Alt+KeyU | ↓ | Ctrl+Alt+U | | Ctrl+Alt+U | ctrl+alt+u | Ctrl+Alt+U | ctrl+alt+[KeyU] | | +| Shift+Alt+KeyU | U | Shift+Alt+U | | Shift+Alt+U | shift+alt+u | Shift+Alt+U | shift+alt+[KeyU] | | +| Ctrl+Shift+Alt+KeyU | ↑ | Ctrl+Shift+Alt+U | | Ctrl+Shift+Alt+U | ctrl+shift+alt+u | Ctrl+Shift+Alt+U | ctrl+shift+alt+[KeyU] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyV | v | V | | V | v | V | [KeyV] | | +| Ctrl+KeyV | v | Ctrl+V | | Ctrl+V | ctrl+v | Ctrl+V | ctrl+[KeyV] | | +| Shift+KeyV | V | Shift+V | | Shift+V | shift+v | Shift+V | shift+[KeyV] | | +| Ctrl+Shift+KeyV | V | Ctrl+Shift+V | | Ctrl+Shift+V | ctrl+shift+v | Ctrl+Shift+V | ctrl+shift+[KeyV] | | +| Alt+KeyV | v | Alt+V | | Alt+V | alt+v | Alt+V | alt+[KeyV] | | +| Ctrl+Alt+KeyV | “ | Ctrl+Alt+V | | Ctrl+Alt+V | ctrl+alt+v | Ctrl+Alt+V | ctrl+alt+[KeyV] | | +| Shift+Alt+KeyV | V | Shift+Alt+V | | Shift+Alt+V | shift+alt+v | Shift+Alt+V | shift+alt+[KeyV] | | +| Ctrl+Shift+Alt+KeyV | ‘ | Ctrl+Shift+Alt+V | | Ctrl+Shift+Alt+V | ctrl+shift+alt+v | Ctrl+Shift+Alt+V | ctrl+shift+alt+[KeyV] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyW | w | W | | W | w | W | [KeyW] | | +| Ctrl+KeyW | w | Ctrl+W | | Ctrl+W | ctrl+w | Ctrl+W | ctrl+[KeyW] | | +| Shift+KeyW | W | Shift+W | | Shift+W | shift+w | Shift+W | shift+[KeyW] | | +| Ctrl+Shift+KeyW | W | Ctrl+Shift+W | | Ctrl+Shift+W | ctrl+shift+w | Ctrl+Shift+W | ctrl+shift+[KeyW] | | +| Alt+KeyW | w | Alt+W | | Alt+W | alt+w | Alt+W | alt+[KeyW] | | +| Ctrl+Alt+KeyW | ł | Ctrl+Alt+W | | Ctrl+Alt+W | ctrl+alt+w | Ctrl+Alt+W | ctrl+alt+[KeyW] | | +| Shift+Alt+KeyW | W | Shift+Alt+W | | Shift+Alt+W | shift+alt+w | Shift+Alt+W | shift+alt+[KeyW] | | +| Ctrl+Shift+Alt+KeyW | Ł | Ctrl+Shift+Alt+W | | Ctrl+Shift+Alt+W | ctrl+shift+alt+w | Ctrl+Shift+Alt+W | ctrl+shift+alt+[KeyW] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyX | x | X | | X | x | X | [KeyX] | | +| Ctrl+KeyX | x | Ctrl+X | | Ctrl+X | ctrl+x | Ctrl+X | ctrl+[KeyX] | | +| Shift+KeyX | X | Shift+X | | Shift+X | shift+x | Shift+X | shift+[KeyX] | | +| Ctrl+Shift+KeyX | X | Ctrl+Shift+X | | Ctrl+Shift+X | ctrl+shift+x | Ctrl+Shift+X | ctrl+shift+[KeyX] | | +| Alt+KeyX | x | Alt+X | | Alt+X | alt+x | Alt+X | alt+[KeyX] | | +| Ctrl+Alt+KeyX | » | Ctrl+Alt+X | | Ctrl+Alt+X | ctrl+alt+x | Ctrl+Alt+X | ctrl+alt+[KeyX] | | +| Shift+Alt+KeyX | X | Shift+Alt+X | | Shift+Alt+X | shift+alt+x | Shift+Alt+X | shift+alt+[KeyX] | | +| Ctrl+Shift+Alt+KeyX | > | Ctrl+Shift+Alt+X | | Ctrl+Shift+Alt+X | ctrl+shift+alt+x | Ctrl+Shift+Alt+X | ctrl+shift+alt+[KeyX] | | +| | | Shift+. | 2 | | | | | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyY | y | Y | | Y | y | Y | [KeyY] | | +| Ctrl+KeyY | y | Ctrl+Y | | Ctrl+Y | ctrl+y | Ctrl+Y | ctrl+[KeyY] | | +| Shift+KeyY | Y | Shift+Y | | Shift+Y | shift+y | Shift+Y | shift+[KeyY] | | +| Ctrl+Shift+KeyY | Y | Ctrl+Shift+Y | | Ctrl+Shift+Y | ctrl+shift+y | Ctrl+Shift+Y | ctrl+shift+[KeyY] | | +| Alt+KeyY | y | Alt+Y | | Alt+Y | alt+y | Alt+Y | alt+[KeyY] | | +| Ctrl+Alt+KeyY | ← | Ctrl+Alt+Y | | Ctrl+Alt+Y | ctrl+alt+y | Ctrl+Alt+Y | ctrl+alt+[KeyY] | | +| Shift+Alt+KeyY | Y | Shift+Alt+Y | | Shift+Alt+Y | shift+alt+y | Shift+Alt+Y | shift+alt+[KeyY] | | +| Ctrl+Shift+Alt+KeyY | ¥ | Ctrl+Shift+Alt+Y | | Ctrl+Shift+Alt+Y | ctrl+shift+alt+y | Ctrl+Shift+Alt+Y | ctrl+shift+alt+[KeyY] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| KeyZ | z | Z | | Z | z | Z | [KeyZ] | | +| Ctrl+KeyZ | z | Ctrl+Z | | Ctrl+Z | ctrl+z | Ctrl+Z | ctrl+[KeyZ] | | +| Shift+KeyZ | Z | Shift+Z | | Shift+Z | shift+z | Shift+Z | shift+[KeyZ] | | +| Ctrl+Shift+KeyZ | Z | Ctrl+Shift+Z | | Ctrl+Shift+Z | ctrl+shift+z | Ctrl+Shift+Z | ctrl+shift+[KeyZ] | | +| Alt+KeyZ | z | Alt+Z | | Alt+Z | alt+z | Alt+Z | alt+[KeyZ] | | +| Ctrl+Alt+KeyZ | « | Ctrl+Alt+Z | | Ctrl+Alt+Z | ctrl+alt+z | Ctrl+Alt+Z | ctrl+alt+[KeyZ] | | +| Shift+Alt+KeyZ | Z | Shift+Alt+Z | | Shift+Alt+Z | shift+alt+z | Shift+Alt+Z | shift+alt+[KeyZ] | | +| Ctrl+Shift+Alt+KeyZ | < | Ctrl+Shift+Alt+Z | | Ctrl+Shift+Alt+Z | ctrl+shift+alt+z | Ctrl+Shift+Alt+Z | ctrl+shift+alt+[KeyZ] | | +| | | Shift+, | 2 | | | | | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Digit1 | 1 | 1 | | 1 | 1 | 1 | [Digit1] | | +| Ctrl+Digit1 | 1 | Ctrl+1 | | Ctrl+1 | ctrl+1 | Ctrl+1 | ctrl+[Digit1] | | +| Shift+Digit1 | ! | Shift+1 | | Shift+1 | shift+1 | Shift+1 | shift+[Digit1] | | +| Ctrl+Shift+Digit1 | ! | Ctrl+Shift+1 | | Ctrl+Shift+1 | ctrl+shift+1 | Ctrl+Shift+1 | ctrl+shift+[Digit1] | | +| Alt+Digit1 | 1 | Alt+1 | | Alt+1 | alt+1 | Alt+1 | alt+[Digit1] | | +| Ctrl+Alt+Digit1 | ¹ | Ctrl+Alt+1 | | Ctrl+Alt+1 | ctrl+alt+1 | Ctrl+Alt+1 | ctrl+alt+[Digit1] | | +| Shift+Alt+Digit1 | ! | Shift+Alt+1 | | Shift+Alt+1 | shift+alt+1 | Shift+Alt+1 | shift+alt+[Digit1] | | +| Ctrl+Shift+Alt+Digit1 | ¡ | Ctrl+Shift+Alt+1 | | Ctrl+Shift+Alt+1 | ctrl+shift+alt+1 | Ctrl+Shift+Alt+1 | ctrl+shift+alt+[Digit1] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Digit2 | 2 | 2 | | 2 | 2 | 2 | [Digit2] | | +| Ctrl+Digit2 | 2 | Ctrl+2 | | Ctrl+2 | ctrl+2 | Ctrl+2 | ctrl+[Digit2] | | +| Shift+Digit2 | " | Shift+2 | | Shift+2 | shift+2 | Shift+2 | shift+[Digit2] | | +| | | Shift+' | 2 | | | | | | +| Ctrl+Shift+Digit2 | " | Ctrl+Shift+2 | | Ctrl+Shift+2 | ctrl+shift+2 | Ctrl+Shift+2 | ctrl+shift+[Digit2] | | +| | | Ctrl+Shift+' | 2 | | | | | | +| Alt+Digit2 | 2 | Alt+2 | | Alt+2 | alt+2 | Alt+2 | alt+[Digit2] | | +| Ctrl+Alt+Digit2 | ² | Ctrl+Alt+2 | | Ctrl+Alt+2 | ctrl+alt+2 | Ctrl+Alt+2 | ctrl+alt+[Digit2] | | +| Shift+Alt+Digit2 | " | Shift+Alt+2 | | Shift+Alt+2 | shift+alt+2 | Shift+Alt+2 | shift+alt+[Digit2] | | +| | | Shift+Alt+' | 2 | | | | | | +| Ctrl+Shift+Alt+Digit2 | ⅛ | Ctrl+Shift+Alt+2 | | Ctrl+Shift+Alt+2 | ctrl+shift+alt+2 | Ctrl+Shift+Alt+2 | ctrl+shift+alt+[Digit2] | | +| | | Ctrl+Shift+Alt+' | 2 | | | | | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Digit3 | 3 | 3 | | 3 | 3 | 3 | [Digit3] | | +| Ctrl+Digit3 | 3 | Ctrl+3 | | Ctrl+3 | ctrl+3 | Ctrl+3 | ctrl+[Digit3] | | +| Shift+Digit3 | £ | Shift+3 | | Shift+3 | shift+3 | Shift+3 | shift+[Digit3] | | +| Ctrl+Shift+Digit3 | £ | Ctrl+Shift+3 | | Ctrl+Shift+3 | ctrl+shift+3 | Ctrl+Shift+3 | ctrl+shift+[Digit3] | | +| Alt+Digit3 | 3 | Alt+3 | | Alt+3 | alt+3 | Alt+3 | alt+[Digit3] | | +| Ctrl+Alt+Digit3 | ³ | Ctrl+Alt+3 | | Ctrl+Alt+3 | ctrl+alt+3 | Ctrl+Alt+3 | ctrl+alt+[Digit3] | | +| Shift+Alt+Digit3 | £ | Shift+Alt+3 | | Shift+Alt+3 | shift+alt+3 | Shift+Alt+3 | shift+alt+[Digit3] | | +| Ctrl+Shift+Alt+Digit3 | £ | Ctrl+Shift+Alt+3 | | Ctrl+Shift+Alt+3 | ctrl+shift+alt+3 | Ctrl+Shift+Alt+3 | ctrl+shift+alt+[Digit3] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Digit4 | 4 | 4 | | 4 | 4 | 4 | [Digit4] | | +| Ctrl+Digit4 | 4 | Ctrl+4 | | Ctrl+4 | ctrl+4 | Ctrl+4 | ctrl+[Digit4] | | +| Shift+Digit4 | $ | Shift+4 | | Shift+4 | shift+4 | Shift+4 | shift+[Digit4] | | +| Ctrl+Shift+Digit4 | $ | Ctrl+Shift+4 | | Ctrl+Shift+4 | ctrl+shift+4 | Ctrl+Shift+4 | ctrl+shift+[Digit4] | | +| Alt+Digit4 | 4 | Alt+4 | | Alt+4 | alt+4 | Alt+4 | alt+[Digit4] | | +| Ctrl+Alt+Digit4 | € | Ctrl+Alt+4 | | Ctrl+Alt+4 | ctrl+alt+4 | Ctrl+Alt+4 | ctrl+alt+[Digit4] | | +| Shift+Alt+Digit4 | $ | Shift+Alt+4 | | Shift+Alt+4 | shift+alt+4 | Shift+Alt+4 | shift+alt+[Digit4] | | +| Ctrl+Shift+Alt+Digit4 | ¼ | Ctrl+Shift+Alt+4 | | Ctrl+Shift+Alt+4 | ctrl+shift+alt+4 | Ctrl+Shift+Alt+4 | ctrl+shift+alt+[Digit4] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Digit5 | 5 | 5 | | 5 | 5 | 5 | [Digit5] | | +| Ctrl+Digit5 | 5 | Ctrl+5 | | Ctrl+5 | ctrl+5 | Ctrl+5 | ctrl+[Digit5] | | +| Shift+Digit5 | % | Shift+5 | | Shift+5 | shift+5 | Shift+5 | shift+[Digit5] | | +| Ctrl+Shift+Digit5 | % | Ctrl+Shift+5 | | Ctrl+Shift+5 | ctrl+shift+5 | Ctrl+Shift+5 | ctrl+shift+[Digit5] | | +| Alt+Digit5 | 5 | Alt+5 | | Alt+5 | alt+5 | Alt+5 | alt+[Digit5] | | +| Ctrl+Alt+Digit5 | ½ | Ctrl+Alt+5 | | Ctrl+Alt+5 | ctrl+alt+5 | Ctrl+Alt+5 | ctrl+alt+[Digit5] | | +| Shift+Alt+Digit5 | % | Shift+Alt+5 | | Shift+Alt+5 | shift+alt+5 | Shift+Alt+5 | shift+alt+[Digit5] | | +| Ctrl+Shift+Alt+Digit5 | ⅜ | Ctrl+Shift+Alt+5 | | Ctrl+Shift+Alt+5 | ctrl+shift+alt+5 | Ctrl+Shift+Alt+5 | ctrl+shift+alt+[Digit5] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Digit6 | 6 | 6 | | 6 | 6 | 6 | [Digit6] | | +| Ctrl+Digit6 | 6 | Ctrl+6 | | Ctrl+6 | ctrl+6 | Ctrl+6 | ctrl+[Digit6] | | +| Shift+Digit6 | ^ | Shift+6 | | Shift+6 | shift+6 | Shift+6 | shift+[Digit6] | | +| Ctrl+Shift+Digit6 | ^ | Ctrl+Shift+6 | | Ctrl+Shift+6 | ctrl+shift+6 | Ctrl+Shift+6 | ctrl+shift+[Digit6] | | +| Alt+Digit6 | 6 | Alt+6 | | Alt+6 | alt+6 | Alt+6 | alt+[Digit6] | | +| Ctrl+Alt+Digit6 | ¾ | Ctrl+Alt+6 | | Ctrl+Alt+6 | ctrl+alt+6 | Ctrl+Alt+6 | ctrl+alt+[Digit6] | | +| Shift+Alt+Digit6 | ^ | Shift+Alt+6 | | Shift+Alt+6 | shift+alt+6 | Shift+Alt+6 | shift+alt+[Digit6] | | +| Ctrl+Shift+Alt+Digit6 | ⅝ | Ctrl+Shift+Alt+6 | | Ctrl+Shift+Alt+6 | ctrl+shift+alt+6 | Ctrl+Shift+Alt+6 | ctrl+shift+alt+[Digit6] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Digit7 | 7 | 7 | | 7 | 7 | 7 | [Digit7] | | +| Ctrl+Digit7 | 7 | Ctrl+7 | | Ctrl+7 | ctrl+7 | Ctrl+7 | ctrl+[Digit7] | | +| Shift+Digit7 | & | Shift+7 | | Shift+7 | shift+7 | Shift+7 | shift+[Digit7] | | +| Ctrl+Shift+Digit7 | & | Ctrl+Shift+7 | | Ctrl+Shift+7 | ctrl+shift+7 | Ctrl+Shift+7 | ctrl+shift+[Digit7] | | +| Alt+Digit7 | 7 | Alt+7 | | Alt+7 | alt+7 | Alt+7 | alt+[Digit7] | | +| Ctrl+Alt+Digit7 | { | Ctrl+Alt+7 | | Ctrl+Alt+7 | ctrl+alt+7 | Ctrl+Alt+7 | ctrl+alt+[Digit7] | | +| | | Shift+[ | 2 | | | | | | +| Shift+Alt+Digit7 | & | Shift+Alt+7 | | Shift+Alt+7 | shift+alt+7 | Shift+Alt+7 | shift+alt+[Digit7] | | +| Ctrl+Shift+Alt+Digit7 | ⅞ | Ctrl+Shift+Alt+7 | | Ctrl+Shift+Alt+7 | ctrl+shift+alt+7 | Ctrl+Shift+Alt+7 | ctrl+shift+alt+[Digit7] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Digit8 | 8 | 8 | | 8 | 8 | 8 | [Digit8] | | +| Ctrl+Digit8 | 8 | Ctrl+8 | | Ctrl+8 | ctrl+8 | Ctrl+8 | ctrl+[Digit8] | | +| Shift+Digit8 | * | Shift+8 | | Shift+8 | shift+8 | Shift+8 | shift+[Digit8] | | +| Ctrl+Shift+Digit8 | * | Ctrl+Shift+8 | | Ctrl+Shift+8 | ctrl+shift+8 | Ctrl+Shift+8 | ctrl+shift+[Digit8] | | +| Alt+Digit8 | 8 | Alt+8 | | Alt+8 | alt+8 | Alt+8 | alt+[Digit8] | | +| Ctrl+Alt+Digit8 | [ | Ctrl+Alt+8 | | Ctrl+Alt+8 | ctrl+alt+8 | Ctrl+Alt+8 | ctrl+alt+[Digit8] | | +| | | [ | 2 | | | | | | +| Shift+Alt+Digit8 | * | Shift+Alt+8 | | Shift+Alt+8 | shift+alt+8 | Shift+Alt+8 | shift+alt+[Digit8] | | +| Ctrl+Shift+Alt+Digit8 | ™ | Ctrl+Shift+Alt+8 | | Ctrl+Shift+Alt+8 | ctrl+shift+alt+8 | Ctrl+Shift+Alt+8 | ctrl+shift+alt+[Digit8] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Digit9 | 9 | 9 | | 9 | 9 | 9 | [Digit9] | | +| Ctrl+Digit9 | 9 | Ctrl+9 | | Ctrl+9 | ctrl+9 | Ctrl+9 | ctrl+[Digit9] | | +| Shift+Digit9 | ( | Shift+9 | | Shift+9 | shift+9 | Shift+9 | shift+[Digit9] | | +| Ctrl+Shift+Digit9 | ( | Ctrl+Shift+9 | | Ctrl+Shift+9 | ctrl+shift+9 | Ctrl+Shift+9 | ctrl+shift+[Digit9] | | +| Alt+Digit9 | 9 | Alt+9 | | Alt+9 | alt+9 | Alt+9 | alt+[Digit9] | | +| Ctrl+Alt+Digit9 | ] | Ctrl+Alt+9 | | Ctrl+Alt+9 | ctrl+alt+9 | Ctrl+Alt+9 | ctrl+alt+[Digit9] | | +| | | ] | 2 | | | | | | +| Shift+Alt+Digit9 | ( | Shift+Alt+9 | | Shift+Alt+9 | shift+alt+9 | Shift+Alt+9 | shift+alt+[Digit9] | | +| Ctrl+Shift+Alt+Digit9 | ± | Ctrl+Shift+Alt+9 | | Ctrl+Shift+Alt+9 | ctrl+shift+alt+9 | Ctrl+Shift+Alt+9 | ctrl+shift+alt+[Digit9] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Digit0 | 0 | 0 | | 0 | 0 | 0 | [Digit0] | | +| Ctrl+Digit0 | 0 | Ctrl+0 | | Ctrl+0 | ctrl+0 | Ctrl+0 | ctrl+[Digit0] | | +| Shift+Digit0 | ) | Shift+0 | | Shift+0 | shift+0 | Shift+0 | shift+[Digit0] | | +| Ctrl+Shift+Digit0 | ) | Ctrl+Shift+0 | | Ctrl+Shift+0 | ctrl+shift+0 | Ctrl+Shift+0 | ctrl+shift+[Digit0] | | +| Alt+Digit0 | 0 | Alt+0 | | Alt+0 | alt+0 | Alt+0 | alt+[Digit0] | | +| Ctrl+Alt+Digit0 | } | Ctrl+Alt+0 | | Ctrl+Alt+0 | ctrl+alt+0 | Ctrl+Alt+0 | ctrl+alt+[Digit0] | | +| | | Shift+] | 2 | | | | | | +| Shift+Alt+Digit0 | ) | Shift+Alt+0 | | Shift+Alt+0 | shift+alt+0 | Shift+Alt+0 | shift+alt+[Digit0] | | +| Ctrl+Shift+Alt+Digit0 | ° | Ctrl+Shift+Alt+0 | | Ctrl+Shift+Alt+0 | ctrl+shift+alt+0 | Ctrl+Shift+Alt+0 | ctrl+shift+alt+[Digit0] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Minus | - | - | | - | - | null | [Minus] | | +| Ctrl+Minus | - | Ctrl+- | | Ctrl+- | ctrl+- | null | ctrl+[Minus] | | +| Shift+Minus | _ | Shift+- | | Shift+- | shift+- | null | shift+[Minus] | | +| Ctrl+Shift+Minus | _ | Ctrl+Shift+- | | Ctrl+Shift+- | ctrl+shift+- | null | ctrl+shift+[Minus] | | +| Alt+Minus | - | Alt+- | | Alt+- | alt+- | null | alt+[Minus] | | +| Ctrl+Alt+Minus | \ | \ | 1 | Ctrl+Alt+- | ctrl+alt+[Minus] | null | ctrl+alt+[Minus] | NO | +| Shift+Alt+Minus | _ | Shift+Alt+- | | Shift+Alt+- | shift+alt+- | null | shift+alt+[Minus] | | +| Ctrl+Shift+Alt+Minus | ¿ | Ctrl+Shift+Alt+- | | Ctrl+Shift+Alt+- | ctrl+shift+alt+- | null | ctrl+shift+alt+[Minus] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Equal | = | = | | = | = | null | [Equal] | | +| Ctrl+Equal | = | Ctrl+= | | Ctrl+= | ctrl+= | null | ctrl+[Equal] | | +| Shift+Equal | + | Shift+= | | Shift+= | shift+= | null | shift+[Equal] | | +| Ctrl+Shift+Equal | + | Ctrl+Shift+= | | Ctrl+Shift+= | ctrl+shift+= | null | ctrl+shift+[Equal] | | +| Alt+Equal | = | Alt+= | | Alt+= | alt+= | null | alt+[Equal] | | +| Ctrl+Alt+Equal | U+327 | Ctrl+Alt+= | | Ctrl+Alt+= | ctrl+alt+= | null | ctrl+alt+[Equal] | | +| Shift+Alt+Equal | + | Shift+Alt+= | | Shift+Alt+= | shift+alt+= | null | shift+alt+[Equal] | | +| Ctrl+Shift+Alt+Equal | U+328 | Ctrl+Shift+Alt+= | | Ctrl+Shift+Alt+= | ctrl+shift+alt+= | null | ctrl+shift+alt+[Equal] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| BracketLeft | [ | [ | 1 | [ | [ | null | [BracketLeft] | | +| Ctrl+BracketLeft | [ | Ctrl+[ | | Ctrl+[ | ctrl+[ | null | ctrl+[BracketLeft] | | +| Shift+BracketLeft | { | Shift+[ | 1 | Shift+[ | shift+[ | null | shift+[BracketLeft] | | +| Ctrl+Shift+BracketLeft | { | Ctrl+Shift+[ | | Ctrl+Shift+[ | ctrl+shift+[ | null | ctrl+shift+[BracketLeft] | | +| Alt+BracketLeft | [ | Alt+[ | | Alt+[ | alt+[ | null | alt+[BracketLeft] | | +| Ctrl+Alt+BracketLeft | ¨ | Ctrl+Alt+[ | | Ctrl+Alt+[ | ctrl+alt+[ | null | ctrl+alt+[BracketLeft] | | +| Shift+Alt+BracketLeft | { | Shift+Alt+[ | | Shift+Alt+[ | shift+alt+[ | null | shift+alt+[BracketLeft] | | +| Ctrl+Shift+Alt+BracketLeft | ˚ | Ctrl+Shift+Alt+[ | | Ctrl+Shift+Alt+[ | ctrl+shift+alt+[ | null | ctrl+shift+alt+[BracketLeft] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| BracketRight | ] | ] | 1 | ] | ] | null | [BracketRight] | | +| Ctrl+BracketRight | ] | Ctrl+] | | Ctrl+] | ctrl+] | null | ctrl+[BracketRight] | | +| Shift+BracketRight | } | Shift+] | 1 | Shift+] | shift+] | null | shift+[BracketRight] | | +| Ctrl+Shift+BracketRight | } | Ctrl+Shift+] | | Ctrl+Shift+] | ctrl+shift+] | null | ctrl+shift+[BracketRight] | | +| Alt+BracketRight | ] | Alt+] | | Alt+] | alt+] | null | alt+[BracketRight] | | +| Ctrl+Alt+BracketRight | ˜ | Ctrl+Alt+] | | Ctrl+Alt+] | ctrl+alt+] | null | ctrl+alt+[BracketRight] | | +| Shift+Alt+BracketRight | } | Shift+Alt+] | | Shift+Alt+] | shift+alt+] | null | shift+alt+[BracketRight] | | +| Ctrl+Shift+Alt+BracketRight | ¯ | Ctrl+Shift+Alt+] | | Ctrl+Shift+Alt+] | ctrl+shift+alt+] | null | ctrl+shift+alt+[BracketRight] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Backslash | # | | | # | [Backslash] | null | [Backslash] | NO | +| Ctrl+Backslash | # | | | Ctrl+# | ctrl+[Backslash] | null | ctrl+[Backslash] | NO | +| Shift+Backslash | ~ | Shift+` | 2 | Shift+# | shift+[Backslash] | null | shift+[Backslash] | NO | +| Ctrl+Shift+Backslash | ~ | Ctrl+Shift+` | 2 | Ctrl+Shift+# | ctrl+shift+[Backslash] | null | ctrl+shift+[Backslash] | NO | +| Alt+Backslash | # | | | Alt+# | alt+[Backslash] | null | alt+[Backslash] | NO | +| Ctrl+Alt+Backslash | ` | ` | 2 | Ctrl+Alt+# | ctrl+alt+[Backslash] | null | ctrl+alt+[Backslash] | NO | +| Shift+Alt+Backslash | ~ | Shift+Alt+` | 2 | Shift+Alt+# | shift+alt+[Backslash] | null | shift+alt+[Backslash] | NO | +| Ctrl+Shift+Alt+Backslash | ˘ | Ctrl+Shift+Alt+` | 2 | Ctrl+Shift+Alt+# | ctrl+shift+alt+[Backslash] | null | ctrl+shift+alt+[Backslash] | NO | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| IntlHash | --- | | | null | null | null | null | | +| Ctrl+IntlHash | --- | | | null | null | null | null | | +| Shift+IntlHash | --- | | | null | null | null | null | | +| Ctrl+Shift+IntlHash | --- | | | null | null | null | null | | +| Alt+IntlHash | --- | | | null | null | null | null | | +| Ctrl+Alt+IntlHash | --- | | | null | null | null | null | | +| Shift+Alt+IntlHash | --- | | | null | null | null | null | | +| Ctrl+Shift+Alt+IntlHash | --- | | | null | null | null | null | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Semicolon | ; | ; | | ; | ; | null | [Semicolon] | | +| Ctrl+Semicolon | ; | Ctrl+; | | Ctrl+; | ctrl+; | null | ctrl+[Semicolon] | | +| Shift+Semicolon | : | Shift+; | | Shift+; | shift+; | null | shift+[Semicolon] | | +| Ctrl+Shift+Semicolon | : | Ctrl+Shift+; | | Ctrl+Shift+; | ctrl+shift+; | null | ctrl+shift+[Semicolon] | | +| Alt+Semicolon | ; | Alt+; | | Alt+; | alt+; | null | alt+[Semicolon] | | +| Ctrl+Alt+Semicolon | ´ | Ctrl+Alt+; | | Ctrl+Alt+; | ctrl+alt+; | null | ctrl+alt+[Semicolon] | | +| Shift+Alt+Semicolon | : | Shift+Alt+; | | Shift+Alt+; | shift+alt+; | null | shift+alt+[Semicolon] | | +| Ctrl+Shift+Alt+Semicolon | ˝ | Ctrl+Shift+Alt+; | | Ctrl+Shift+Alt+; | ctrl+shift+alt+; | null | ctrl+shift+alt+[Semicolon] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Quote | ' | ' | | ' | ' | ' | [Quote] | | +| Ctrl+Quote | ' | Ctrl+' | | Ctrl+' | ctrl+' | Ctrl+' | ctrl+[Quote] | | +| Shift+Quote | @ | Shift+' | 1 | Shift+' | shift+' | Shift+' | shift+[Quote] | | +| Ctrl+Shift+Quote | @ | Ctrl+Shift+' | 1 | Ctrl+Shift+' | ctrl+shift+' | Ctrl+Shift+' | ctrl+shift+[Quote] | | +| Alt+Quote | ' | Alt+' | | Alt+' | alt+' | Alt+' | alt+[Quote] | | +| Ctrl+Alt+Quote | ^ | Ctrl+Alt+' | | Ctrl+Alt+' | ctrl+alt+' | Ctrl+Alt+' | ctrl+alt+[Quote] | | +| Shift+Alt+Quote | @ | Shift+Alt+' | 1 | Shift+Alt+' | shift+alt+' | Shift+Alt+' | shift+alt+[Quote] | | +| Ctrl+Shift+Alt+Quote | U+30c | Ctrl+Shift+Alt+' | 1 | Ctrl+Shift+Alt+' | ctrl+shift+alt+' | Ctrl+Shift+Alt+' | ctrl+shift+alt+[Quote] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Backquote | ` | ` | 1 | ` | ` | null | [Backquote] | | +| Ctrl+Backquote | ` | Ctrl+` | | Ctrl+` | ctrl+` | null | ctrl+[Backquote] | | +| Shift+Backquote | ¬ | Shift+` | 1 | Shift+` | shift+` | null | shift+[Backquote] | | +| Ctrl+Shift+Backquote | ¬ | Ctrl+Shift+` | 1 | Ctrl+Shift+` | ctrl+shift+` | null | ctrl+shift+[Backquote] | | +| Alt+Backquote | ` | Alt+` | | Alt+` | alt+` | null | alt+[Backquote] | | +| Ctrl+Alt+Backquote | | | Shift+\ | 1 | Ctrl+Alt+` | ctrl+alt+[Backquote] | null | ctrl+alt+[Backquote] | NO | +| Shift+Alt+Backquote | ¬ | Shift+Alt+` | 1 | Shift+Alt+` | shift+alt+` | null | shift+alt+[Backquote] | | +| Ctrl+Shift+Alt+Backquote | | | Ctrl+Shift+Alt+` | 1 | Ctrl+Shift+Alt+` | ctrl+shift+alt+` | null | ctrl+shift+alt+[Backquote] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Comma | , | , | | , | , | null | [Comma] | | +| Ctrl+Comma | , | Ctrl+, | | Ctrl+, | ctrl+, | null | ctrl+[Comma] | | +| Shift+Comma | < | Shift+, | 1 | Shift+, | shift+, | null | shift+[Comma] | | +| Ctrl+Shift+Comma | < | Ctrl+Shift+, | | Ctrl+Shift+, | ctrl+shift+, | null | ctrl+shift+[Comma] | | +| Alt+Comma | , | Alt+, | | Alt+, | alt+, | null | alt+[Comma] | | +| Ctrl+Alt+Comma | ─ | Ctrl+Alt+, | | Ctrl+Alt+, | ctrl+alt+, | null | ctrl+alt+[Comma] | | +| Shift+Alt+Comma | < | Shift+Alt+, | | Shift+Alt+, | shift+alt+, | null | shift+alt+[Comma] | | +| Ctrl+Shift+Alt+Comma | × | Ctrl+Shift+Alt+, | | Ctrl+Shift+Alt+, | ctrl+shift+alt+, | null | ctrl+shift+alt+[Comma] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Period | . | . | | . | . | null | [Period] | | +| Ctrl+Period | . | Ctrl+. | | Ctrl+. | ctrl+. | null | ctrl+[Period] | | +| Shift+Period | > | Shift+. | 1 | Shift+. | shift+. | null | shift+[Period] | | +| Ctrl+Shift+Period | > | Ctrl+Shift+. | | Ctrl+Shift+. | ctrl+shift+. | null | ctrl+shift+[Period] | | +| Alt+Period | . | Alt+. | | Alt+. | alt+. | null | alt+[Period] | | +| Ctrl+Alt+Period | · | Ctrl+Alt+. | | Ctrl+Alt+. | ctrl+alt+. | null | ctrl+alt+[Period] | | +| Shift+Alt+Period | > | Shift+Alt+. | | Shift+Alt+. | shift+alt+. | null | shift+alt+[Period] | | +| Ctrl+Shift+Alt+Period | ÷ | Ctrl+Shift+Alt+. | | Ctrl+Shift+Alt+. | ctrl+shift+alt+. | null | ctrl+shift+alt+[Period] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Slash | / | / | | / | / | null | [Slash] | | +| Ctrl+Slash | / | Ctrl+/ | | Ctrl+/ | ctrl+/ | null | ctrl+[Slash] | | +| Shift+Slash | ? | Shift+/ | | Shift+/ | shift+/ | null | shift+[Slash] | | +| Ctrl+Shift+Slash | ? | Ctrl+Shift+/ | | Ctrl+Shift+/ | ctrl+shift+/ | null | ctrl+shift+[Slash] | | +| Alt+Slash | / | Alt+/ | | Alt+/ | alt+/ | null | alt+[Slash] | | +| Ctrl+Alt+Slash | U+323 | Ctrl+Alt+/ | | Ctrl+Alt+/ | ctrl+alt+/ | null | ctrl+alt+[Slash] | | +| Shift+Alt+Slash | ? | Shift+Alt+/ | | Shift+Alt+/ | shift+alt+/ | null | shift+alt+[Slash] | | +| Ctrl+Shift+Alt+Slash | ˙ | Ctrl+Shift+Alt+/ | | Ctrl+Shift+Alt+/ | ctrl+shift+alt+/ | null | ctrl+shift+alt+[Slash] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| ArrowUp | --- | UpArrow | | UpArrow | up | Up | [ArrowUp] | | +| Ctrl+ArrowUp | --- | Ctrl+UpArrow | | Ctrl+UpArrow | ctrl+up | Ctrl+Up | ctrl+[ArrowUp] | | +| Shift+ArrowUp | --- | Shift+UpArrow | | Shift+UpArrow | shift+up | Shift+Up | shift+[ArrowUp] | | +| Ctrl+Shift+ArrowUp | --- | Ctrl+Shift+UpArrow | | Ctrl+Shift+UpArrow | ctrl+shift+up | Ctrl+Shift+Up | ctrl+shift+[ArrowUp] | | +| Alt+ArrowUp | --- | Alt+UpArrow | | Alt+UpArrow | alt+up | Alt+Up | alt+[ArrowUp] | | +| Ctrl+Alt+ArrowUp | --- | Ctrl+Alt+UpArrow | | Ctrl+Alt+UpArrow | ctrl+alt+up | Ctrl+Alt+Up | ctrl+alt+[ArrowUp] | | +| Shift+Alt+ArrowUp | --- | Shift+Alt+UpArrow | | Shift+Alt+UpArrow | shift+alt+up | Shift+Alt+Up | shift+alt+[ArrowUp] | | +| Ctrl+Shift+Alt+ArrowUp | --- | Ctrl+Shift+Alt+UpArrow | | Ctrl+Shift+Alt+UpArrow | ctrl+shift+alt+up | Ctrl+Shift+Alt+Up | ctrl+shift+alt+[ArrowUp] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| Numpad0 | --- | NumPad0 | | NumPad0 | numpad0 | null | [Numpad0] | | +| Ctrl+Numpad0 | --- | Ctrl+NumPad0 | | Ctrl+NumPad0 | ctrl+numpad0 | null | ctrl+[Numpad0] | | +| Shift+Numpad0 | --- | Shift+NumPad0 | | Shift+NumPad0 | shift+numpad0 | null | shift+[Numpad0] | | +| Ctrl+Shift+Numpad0 | --- | Ctrl+Shift+NumPad0 | | Ctrl+Shift+NumPad0 | ctrl+shift+numpad0 | null | ctrl+shift+[Numpad0] | | +| Alt+Numpad0 | --- | Alt+NumPad0 | | Alt+NumPad0 | alt+numpad0 | null | alt+[Numpad0] | | +| Ctrl+Alt+Numpad0 | --- | Ctrl+Alt+NumPad0 | | Ctrl+Alt+NumPad0 | ctrl+alt+numpad0 | null | ctrl+alt+[Numpad0] | | +| Shift+Alt+Numpad0 | --- | Shift+Alt+NumPad0 | | Shift+Alt+NumPad0 | shift+alt+numpad0 | null | shift+alt+[Numpad0] | | +| Ctrl+Shift+Alt+Numpad0 | --- | Ctrl+Shift+Alt+NumPad0 | | Ctrl+Shift+Alt+NumPad0 | ctrl+shift+alt+numpad0 | null | ctrl+shift+alt+[Numpad0] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| IntlBackslash | \ | \ | 2 | \ | \ | null | [IntlBackslash] | | +| Ctrl+IntlBackslash | \ | Ctrl+\ | | Ctrl+\ | ctrl+\ | null | ctrl+[IntlBackslash] | | +| Shift+IntlBackslash | | | Shift+\ | 2 | Shift+\ | shift+\ | null | shift+[IntlBackslash] | | +| Ctrl+Shift+IntlBackslash | | | Ctrl+Shift+\ | | Ctrl+Shift+\ | ctrl+shift+\ | null | ctrl+shift+[IntlBackslash] | | +| Alt+IntlBackslash | \ | Alt+\ | | Alt+\ | alt+\ | null | alt+[IntlBackslash] | | +| Ctrl+Alt+IntlBackslash | | | Ctrl+Alt+\ | | Ctrl+Alt+\ | ctrl+alt+\ | null | ctrl+alt+[IntlBackslash] | | +| Shift+Alt+IntlBackslash | | | Shift+Alt+\ | | Shift+Alt+\ | shift+alt+\ | null | shift+alt+[IntlBackslash] | | +| Ctrl+Shift+Alt+IntlBackslash | ¦ | Ctrl+Shift+Alt+\ | | Ctrl+Shift+Alt+\ | ctrl+shift+alt+\ | null | ctrl+shift+alt+[IntlBackslash] | | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| IntlRo | --- | | | null | [IntlRo] | null | [IntlRo] | NO | +| Ctrl+IntlRo | --- | | | null | ctrl+[IntlRo] | null | ctrl+[IntlRo] | NO | +| Shift+IntlRo | --- | | | null | shift+[IntlRo] | null | shift+[IntlRo] | NO | +| Ctrl+Shift+IntlRo | --- | | | null | ctrl+shift+[IntlRo] | null | ctrl+shift+[IntlRo] | NO | +| Alt+IntlRo | --- | | | null | alt+[IntlRo] | null | alt+[IntlRo] | NO | +| Ctrl+Alt+IntlRo | --- | | | null | ctrl+alt+[IntlRo] | null | ctrl+alt+[IntlRo] | NO | +| Shift+Alt+IntlRo | --- | | | null | shift+alt+[IntlRo] | null | shift+alt+[IntlRo] | NO | +| Ctrl+Shift+Alt+IntlRo | --- | | | null | ctrl+shift+alt+[IntlRo] | null | ctrl+shift+alt+[IntlRo] | NO | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | Pri | UI label | User settings | Electron accelerator | Dispatching string | WYSIWYG | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| IntlYen | --- | | | null | [IntlYen] | null | [IntlYen] | NO | +| Ctrl+IntlYen | --- | | | null | ctrl+[IntlYen] | null | ctrl+[IntlYen] | NO | +| Shift+IntlYen | --- | | | null | shift+[IntlYen] | null | shift+[IntlYen] | NO | +| Ctrl+Shift+IntlYen | --- | | | null | ctrl+shift+[IntlYen] | null | ctrl+shift+[IntlYen] | NO | +| Alt+IntlYen | --- | | | null | alt+[IntlYen] | null | alt+[IntlYen] | NO | +| Ctrl+Alt+IntlYen | --- | | | null | ctrl+alt+[IntlYen] | null | ctrl+alt+[IntlYen] | NO | +| Shift+Alt+IntlYen | --- | | | null | shift+alt+[IntlYen] | null | shift+alt+[IntlYen] | NO | +| Ctrl+Shift+Alt+IntlYen | --- | | | null | ctrl+shift+alt+[IntlYen] | null | ctrl+shift+alt+[IntlYen] | NO | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/test/macLinuxKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/macLinuxKeyboardMapper.test.ts index 524ef34f3a6..8c6cc2a864d 100644 --- a/src/vs/workbench/services/keybinding/test/macLinuxKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/macLinuxKeyboardMapper.test.ts @@ -1419,6 +1419,45 @@ suite('keyboardMapper - LINUX ru', () => { }); }); +suite('keyboardMapper - LINUX en_uk', () => { + + let mapper: MacLinuxKeyboardMapper; + + suiteSetup((done) => { + createKeyboardMapper(false, 'linux_en_uk', OperatingSystem.Linux).then((_mapper) => { + mapper = _mapper; + done(); + }, done); + }); + + test('mapping', (done) => { + assertMapping(WRITE_FILE_IF_DIFFERENT, mapper, 'linux_en_uk.txt', done); + }); + + test('issue #24522: resolveKeyboardEvent Ctrl+Alt+[Minus]', () => { + assertResolveKeyboardEvent( + mapper, + { + ctrlKey: true, + shiftKey: false, + altKey: true, + metaKey: false, + keyCode: -1, + code: 'Minus' + }, + { + label: 'Ctrl+Alt+-', + ariaLabel: 'Control+Alt+-', + electronAccelerator: null, + userSettingsLabel: 'ctrl+alt+[Minus]', + isWYSIWYG: false, + isChord: false, + dispatchParts: ['ctrl+alt+[Minus]', null], + } + ); + }); +}); + function _assertKeybindingTranslation(mapper: MacLinuxKeyboardMapper, OS: OperatingSystem, kb: number, _expected: string | string[]): void { let expected: string[]; if (typeof _expected === 'string') { From 5397df989dbfaa410aa21c040efe157175a52842 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 May 2017 16:41:34 +0200 Subject: [PATCH 0059/1164] Debt: Remove dead code --- .../contentWidgets/contentWidgets.ts | 13 ++----- .../viewParts/decorations/decorations.ts | 9 ----- .../editorScrollbar/editorScrollbar.ts | 36 ------------------- .../viewParts/glyphMargin/glyphMargin.ts | 9 ----- .../viewParts/lineNumbers/lineNumbers.ts | 9 ----- .../linesDecorations/linesDecorations.ts | 9 ----- .../marginDecorations/marginDecorations.ts | 9 ----- .../editor/browser/viewParts/rulers/rulers.ts | 2 +- .../viewParts/selections/selections.ts | 6 ---- .../viewParts/viewCursors/viewCursors.ts | 2 +- .../common/viewModel/viewEventHandler.ts | 2 +- 11 files changed, 5 insertions(+), 101 deletions(-) diff --git a/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts b/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts index 3a2a8ae1fe1..8d57aa5bce0 100644 --- a/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts +++ b/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts @@ -106,7 +106,7 @@ export class ViewContentWidgets extends ViewPart { if (this._contentWidth !== this._context.configuration.editor.layoutInfo.contentWidth) { this._contentWidth = this._context.configuration.editor.layoutInfo.contentWidth; - // update the maxWidth on widgets nodes, such that `onReadAfterForcedLayout` + // update the maxWidth on widgets nodes, such that `prepareRender` // below can read out the adjusted width/height of widgets let keys = Object.keys(this._widgets); for (let i = 0, len = keys.length; i < len; i++) { @@ -122,15 +122,9 @@ export class ViewContentWidgets extends ViewPart { } return true; } - public onCursorPositionChanged(e: viewEvents.ViewCursorPositionChangedEvent): boolean { - return false; - } - public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { - return false; - } public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean { // true for inline decorations that can end up relayouting text - return true;//e.inlineDecorationsChanged; + return true; } public onFlushed(e: viewEvents.ViewFlushedEvent): boolean { return true; @@ -144,9 +138,6 @@ export class ViewContentWidgets extends ViewPart { public onLinesInserted(e: viewEvents.ViewLinesInsertedEvent): boolean { return true; } - public onRevealRangeRequest(e: viewEvents.ViewRevealRangeRequestEvent): boolean { - return false; - } public onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean { return true; } diff --git a/src/vs/editor/browser/viewParts/decorations/decorations.ts b/src/vs/editor/browser/viewParts/decorations/decorations.ts index fc067376be2..19122062c67 100644 --- a/src/vs/editor/browser/viewParts/decorations/decorations.ts +++ b/src/vs/editor/browser/viewParts/decorations/decorations.ts @@ -43,12 +43,6 @@ export class DecorationsOverlay extends DynamicViewOverlay { } return true; } - public onCursorPositionChanged(e: viewEvents.ViewCursorPositionChangedEvent): boolean { - return false; - } - public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { - return false; - } public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean { return true; } @@ -64,9 +58,6 @@ export class DecorationsOverlay extends DynamicViewOverlay { public onLinesInserted(e: viewEvents.ViewLinesInsertedEvent): boolean { return true; } - public onRevealRangeRequest(e: viewEvents.ViewRevealRangeRequestEvent): boolean { - return false; - } public onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean { return e.scrollTopChanged || e.scrollWidthChanged; } diff --git a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts index e5235c6eb2e..dce83c0f62e 100644 --- a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts +++ b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts @@ -142,45 +142,9 @@ export class EditorScrollbar extends ViewPart { } return true; } - public onCursorPositionChanged(e: viewEvents.ViewCursorPositionChangedEvent): boolean { - return false; - } - public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { - return false; - } - public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean { - return false; - } - public onFlushed(e: viewEvents.ViewFlushedEvent): boolean { - return false; - } - public onFocusChanged(e: viewEvents.ViewFocusChangedEvent): boolean { - return false; - } - public onLineMappingChanged(e: viewEvents.ViewLineMappingChangedEvent): boolean { - return false; - } - public onLinesChanged(e: viewEvents.ViewLinesChangedEvent): boolean { - return false; - } - public onLinesDeleted(e: viewEvents.ViewLinesDeletedEvent): boolean { - return false; - } - public onLinesInserted(e: viewEvents.ViewLinesInsertedEvent): boolean { - return false; - } - public onRevealRangeRequest(e: viewEvents.ViewRevealRangeRequestEvent): boolean { - return false; - } public onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean { return true; } - public onTokensChanged(e: viewEvents.ViewTokensChangedEvent): boolean { - return false; - } - public onZonesChanged(e: viewEvents.ViewZonesChangedEvent): boolean { - return false; - } // --- end event handlers diff --git a/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts b/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts index e717800496a..0e37f17d7a7 100644 --- a/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts +++ b/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts @@ -119,12 +119,6 @@ export class GlyphMarginOverlay extends DedupOverlay { } return true; } - public onCursorPositionChanged(e: viewEvents.ViewCursorPositionChangedEvent): boolean { - return false; - } - public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { - return false; - } public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean { return true; } @@ -140,9 +134,6 @@ export class GlyphMarginOverlay extends DedupOverlay { public onLinesInserted(e: viewEvents.ViewLinesInsertedEvent): boolean { return true; } - public onRevealRangeRequest(e: viewEvents.ViewRevealRangeRequestEvent): boolean { - return false; - } public onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean { return e.scrollTopChanged; } diff --git a/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts b/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts index 677b42f4b53..673bdb0c421 100644 --- a/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts +++ b/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts @@ -69,12 +69,6 @@ export class LineNumbersOverlay extends DynamicViewOverlay { } return false; } - public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { - return false; - } - public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean { - return false; - } public onFlushed(e: viewEvents.ViewFlushedEvent): boolean { return true; } @@ -87,9 +81,6 @@ export class LineNumbersOverlay extends DynamicViewOverlay { public onLinesInserted(e: viewEvents.ViewLinesInsertedEvent): boolean { return true; } - public onRevealRangeRequest(e: viewEvents.ViewRevealRangeRequestEvent): boolean { - return false; - } public onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean { return e.scrollTopChanged; } diff --git a/src/vs/editor/browser/viewParts/linesDecorations/linesDecorations.ts b/src/vs/editor/browser/viewParts/linesDecorations/linesDecorations.ts index a5e31040b9d..d9492ecd0fc 100644 --- a/src/vs/editor/browser/viewParts/linesDecorations/linesDecorations.ts +++ b/src/vs/editor/browser/viewParts/linesDecorations/linesDecorations.ts @@ -44,12 +44,6 @@ export class LinesDecorationsOverlay extends DedupOverlay { } return true; } - public onCursorPositionChanged(e: viewEvents.ViewCursorPositionChangedEvent): boolean { - return false; - } - public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { - return false; - } public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean { return true; } @@ -65,9 +59,6 @@ export class LinesDecorationsOverlay extends DedupOverlay { public onLinesInserted(e: viewEvents.ViewLinesInsertedEvent): boolean { return true; } - public onRevealRangeRequest(e: viewEvents.ViewRevealRangeRequestEvent): boolean { - return false; - } public onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean { return e.scrollTopChanged; } diff --git a/src/vs/editor/browser/viewParts/marginDecorations/marginDecorations.ts b/src/vs/editor/browser/viewParts/marginDecorations/marginDecorations.ts index 07a6ea88659..e1880451dd7 100644 --- a/src/vs/editor/browser/viewParts/marginDecorations/marginDecorations.ts +++ b/src/vs/editor/browser/viewParts/marginDecorations/marginDecorations.ts @@ -34,12 +34,6 @@ export class MarginViewLineDecorationsOverlay extends DedupOverlay { public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { return true; } - public onCursorPositionChanged(e: viewEvents.ViewCursorPositionChangedEvent): boolean { - return false; - } - public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { - return false; - } public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean { return true; } @@ -55,9 +49,6 @@ export class MarginViewLineDecorationsOverlay extends DedupOverlay { public onLinesInserted(e: viewEvents.ViewLinesInsertedEvent): boolean { return true; } - public onRevealRangeRequest(e: viewEvents.ViewRevealRangeRequestEvent): boolean { - return false; - } public onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean { return e.scrollTopChanged; } diff --git a/src/vs/editor/browser/viewParts/rulers/rulers.ts b/src/vs/editor/browser/viewParts/rulers/rulers.ts index 6d4f6247bff..9479cc74bdb 100644 --- a/src/vs/editor/browser/viewParts/rulers/rulers.ts +++ b/src/vs/editor/browser/viewParts/rulers/rulers.ts @@ -46,7 +46,7 @@ export class Rulers extends ViewPart { return false; } public onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean { - return super.onScrollChanged(e) || e.scrollHeightChanged; + return e.scrollHeightChanged; } // --- end event handlers diff --git a/src/vs/editor/browser/viewParts/selections/selections.ts b/src/vs/editor/browser/viewParts/selections/selections.ts index 38ee5869922..fc8ac41ed92 100644 --- a/src/vs/editor/browser/viewParts/selections/selections.ts +++ b/src/vs/editor/browser/viewParts/selections/selections.ts @@ -110,9 +110,6 @@ export class SelectionsOverlay extends DynamicViewOverlay { } return true; } - public onCursorPositionChanged(e: viewEvents.ViewCursorPositionChangedEvent): boolean { - return false; - } public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { this._selections = [e.selection]; this._selections = this._selections.concat(e.secondarySelections); @@ -134,9 +131,6 @@ export class SelectionsOverlay extends DynamicViewOverlay { public onLinesInserted(e: viewEvents.ViewLinesInsertedEvent): boolean { return true; } - public onRevealRangeRequest(e: viewEvents.ViewRevealRangeRequestEvent): boolean { - return false; - } public onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean { return e.scrollTopChanged; } diff --git a/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts b/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts index e9c9ea9fe78..7d8185da71c 100644 --- a/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts +++ b/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts @@ -138,7 +138,7 @@ export class ViewCursors extends ViewPart { } public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean { // true for inline decorations that can end up relayouting text - return true;//e.inlineDecorationsChanged; + return true; } public onFlushed(e: viewEvents.ViewFlushedEvent): boolean { this._primaryCursor.onFlushed(); diff --git a/src/vs/editor/common/viewModel/viewEventHandler.ts b/src/vs/editor/common/viewModel/viewEventHandler.ts index ff0ec8c10d9..4a76918e20b 100644 --- a/src/vs/editor/common/viewModel/viewEventHandler.ts +++ b/src/vs/editor/common/viewModel/viewEventHandler.ts @@ -70,7 +70,7 @@ export class ViewEventHandler extends Disposable { public onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean { return false; } - public onScrollRequest(e: viewEvents.ViewScrollRequestEvent): boolean { // TODO@cursor + public onScrollRequest(e: viewEvents.ViewScrollRequestEvent): boolean { return false; } public onTokensChanged(e: viewEvents.ViewTokensChangedEvent): boolean { From 23cafd02483c2aaa373c4172b0b754d138b6ec08 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 May 2017 17:00:39 +0200 Subject: [PATCH 0060/1164] Move text area related code to /browser/ --- .../controller/input/textAreaWrapper.ts | 2 +- .../browser/controller/keyboardHandler.ts | 4 +- .../controller/textAreaHandler.ts | 4 +- .../controller/textAreaState.ts | 0 src/vs/editor/browser/view/viewImpl.ts | 6 +- src/vs/editor/common/viewLayout/viewLayout.ts | 4 +- .../editor/common/viewModel/viewModelImpl.ts | 2 +- .../contrib/clipboard/browser/clipboard.ts | 2 +- .../test/browser/controller/imeTester.ts | 4 +- .../controller/textAreaState.test.ts | 90 +++++++++++++++++- .../test/common/mocks/mockTextAreaWrapper.ts | 94 ------------------- 11 files changed, 102 insertions(+), 110 deletions(-) rename src/vs/editor/{common => browser}/controller/textAreaHandler.ts (99%) rename src/vs/editor/{common => browser}/controller/textAreaState.ts (100%) rename src/vs/editor/test/{common => browser}/controller/textAreaState.test.ts (83%) delete mode 100644 src/vs/editor/test/common/mocks/mockTextAreaWrapper.ts diff --git a/src/vs/editor/browser/controller/input/textAreaWrapper.ts b/src/vs/editor/browser/controller/input/textAreaWrapper.ts index ab895c1831f..538fcaac34d 100644 --- a/src/vs/editor/browser/controller/input/textAreaWrapper.ts +++ b/src/vs/editor/browser/controller/input/textAreaWrapper.ts @@ -9,7 +9,7 @@ import { Disposable } from 'vs/base/common/lifecycle'; import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { IClipboardEvent, ICompositionEvent, IKeyboardEventWrapper, ITextAreaWrapper } from 'vs/editor/common/controller/textAreaState'; +import { IClipboardEvent, ICompositionEvent, IKeyboardEventWrapper, ITextAreaWrapper } from 'vs/editor/browser/controller/textAreaState'; import { FastDomNode } from 'vs/base/browser/fastDomNode'; class ClipboardEventWrapper implements IClipboardEvent { diff --git a/src/vs/editor/browser/controller/keyboardHandler.ts b/src/vs/editor/browser/controller/keyboardHandler.ts index e138406fa13..4c9f52ecdb4 100644 --- a/src/vs/editor/browser/controller/keyboardHandler.ts +++ b/src/vs/editor/browser/controller/keyboardHandler.ts @@ -8,8 +8,8 @@ import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { GlobalScreenReaderNVDA } from 'vs/editor/common/config/commonEditorConfig'; -import { TextAreaHandler } from 'vs/editor/common/controller/textAreaHandler'; -import { TextAreaStrategy } from 'vs/editor/common/controller/textAreaState'; +import { TextAreaHandler } from 'vs/editor/browser/controller/textAreaHandler'; +import { TextAreaStrategy } from 'vs/editor/browser/controller/textAreaState'; import { Range } from 'vs/editor/common/core/range'; import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; import { Configuration } from 'vs/editor/browser/config/configuration'; diff --git a/src/vs/editor/common/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts similarity index 99% rename from src/vs/editor/common/controller/textAreaHandler.ts rename to src/vs/editor/browser/controller/textAreaHandler.ts index f448f6a6d87..394e67bee86 100644 --- a/src/vs/editor/common/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -9,7 +9,7 @@ import * as strings from 'vs/base/common/strings'; import Event, { Emitter } from 'vs/base/common/event'; import { KeyCode } from 'vs/base/common/keyCodes'; import { Disposable } from 'vs/base/common/lifecycle'; -import { IClipboardEvent, ICompositionEvent, IKeyboardEventWrapper, ISimpleModel, ITextAreaWrapper, ITypeData, TextAreaState, TextAreaStrategy, createTextAreaState } from 'vs/editor/common/controller/textAreaState'; +import { IClipboardEvent, ICompositionEvent, IKeyboardEventWrapper, ISimpleModel, ITextAreaWrapper, ITypeData, TextAreaState, TextAreaStrategy, createTextAreaState } from 'vs/editor/browser/controller/textAreaState'; import { Range } from 'vs/editor/common/core/range'; export const CopyOptions = { @@ -383,4 +383,4 @@ export class TextAreaHandler extends Disposable { this.lastCopiedValueIsFromEmptySelection = (selections.length === 1 && selections[0].isEmpty()); } } -} \ No newline at end of file +} diff --git a/src/vs/editor/common/controller/textAreaState.ts b/src/vs/editor/browser/controller/textAreaState.ts similarity index 100% rename from src/vs/editor/common/controller/textAreaState.ts rename to src/vs/editor/browser/controller/textAreaState.ts diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index 82d1a1914bb..b84b23ff234 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -20,7 +20,7 @@ import * as editorBrowser from 'vs/editor/browser/editorBrowser'; import { ViewController, ExecCoreEditorCommandFunc } from 'vs/editor/browser/view/viewController'; import { ViewEventDispatcher } from 'vs/editor/common/view/viewEventDispatcher'; import { ContentViewOverlays, MarginViewOverlays } from 'vs/editor/browser/view/viewOverlays'; -import { LayoutProvider } from 'vs/editor/common/viewLayout/viewLayout'; +import { ViewLayout } from 'vs/editor/common/viewLayout/viewLayout'; import { ViewContentWidgets } from 'vs/editor/browser/viewParts/contentWidgets/contentWidgets'; import { CurrentLineHighlightOverlay } from 'vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight'; import { CurrentLineMarginHighlightOverlay } from 'vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight'; @@ -66,7 +66,7 @@ export class View extends ViewEventHandler { private eventDispatcher: ViewEventDispatcher; - private layoutProvider: LayoutProvider; + private layoutProvider: ViewLayout; private _scrollbar: EditorScrollbar; public _context: ViewContext; @@ -121,7 +121,7 @@ export class View extends ViewEventHandler { // - scrolling (i.e. viewport / full size) & co. // - whitespaces (a.k.a. view zones) management & co. // - line heights updating & co. - this.layoutProvider = new LayoutProvider(configuration, model.getLineCount(), this.eventDispatcher); + this.layoutProvider = new ViewLayout(configuration, model.getLineCount(), this.eventDispatcher); // The view context is passed on to most classes (basically to reduce param. counts in ctors) this._context = new ViewContext(configuration, model, this.eventDispatcher); diff --git a/src/vs/editor/common/viewLayout/viewLayout.ts b/src/vs/editor/common/viewLayout/viewLayout.ts index dc1daf701f2..f7bf44a4bdc 100644 --- a/src/vs/editor/common/viewLayout/viewLayout.ts +++ b/src/vs/editor/common/viewLayout/viewLayout.ts @@ -14,7 +14,7 @@ import { ViewEventDispatcher } from 'vs/editor/common/view/viewEventDispatcher'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; -export class LayoutProvider extends Disposable implements IViewLayout { +export class ViewLayout extends Disposable implements IViewLayout { static LINES_HORIZONTAL_EXTRA_PX = 30; @@ -129,7 +129,7 @@ export class LayoutProvider extends Disposable implements IViewLayout { private _computeScrollWidth(maxLineWidth: number, viewportWidth: number): number { let isViewportWrapping = this._configuration.editor.wrappingInfo.isViewportWrapping; if (!isViewportWrapping) { - return Math.max(maxLineWidth + LayoutProvider.LINES_HORIZONTAL_EXTRA_PX, viewportWidth); + return Math.max(maxLineWidth + ViewLayout.LINES_HORIZONTAL_EXTRA_PX, viewportWidth); } return Math.max(maxLineWidth, viewportWidth); } diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index f9f313c6f39..9a2122971a9 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -568,7 +568,7 @@ export class ViewModel extends Disposable implements IViewModel { if (range.isEmpty()) { if (enableEmptySelectionClipboard) { let modelLineNumber = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(range.startLineNumber, 1)).lineNumber; - return this.getModelLineContent(modelLineNumber) + newLineCharacter; + return this.model.getLineContent(modelLineNumber) + newLineCharacter; } else { return ''; } diff --git a/src/vs/editor/contrib/clipboard/browser/clipboard.ts b/src/vs/editor/contrib/clipboard/browser/clipboard.ts index 2dd0f763ede..4c6f0692fae 100644 --- a/src/vs/editor/contrib/clipboard/browser/clipboard.ts +++ b/src/vs/editor/contrib/clipboard/browser/clipboard.ts @@ -13,7 +13,7 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { editorAction, IActionOptions, EditorAction } from 'vs/editor/common/editorCommonExtensions'; -import { CopyOptions } from 'vs/editor/common/controller/textAreaHandler'; +import { CopyOptions } from 'vs/editor/browser/controller/textAreaHandler'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; const CLIPBOARD_CONTEXT_MENU_GROUP = '9_cutcopypaste'; diff --git a/src/vs/editor/test/browser/controller/imeTester.ts b/src/vs/editor/test/browser/controller/imeTester.ts index 456f6f0a8fd..09d862654ee 100644 --- a/src/vs/editor/test/browser/controller/imeTester.ts +++ b/src/vs/editor/test/browser/controller/imeTester.ts @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { TextAreaHandler } from 'vs/editor/common/controller/textAreaHandler'; +import { TextAreaHandler } from 'vs/editor/browser/controller/textAreaHandler'; import * as browser from 'vs/base/browser/browser'; -import { TextAreaStrategy, ISimpleModel } from 'vs/editor/common/controller/textAreaState'; +import { TextAreaStrategy, ISimpleModel } from 'vs/editor/browser/controller/textAreaState'; import { Range, IRange } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { TextAreaWrapper } from 'vs/editor/browser/controller/input/textAreaWrapper'; diff --git a/src/vs/editor/test/common/controller/textAreaState.test.ts b/src/vs/editor/test/browser/controller/textAreaState.test.ts similarity index 83% rename from src/vs/editor/test/common/controller/textAreaState.test.ts rename to src/vs/editor/test/browser/controller/textAreaState.test.ts index 6da10786e1f..6cdbeb4f50b 100644 --- a/src/vs/editor/test/common/controller/textAreaState.test.ts +++ b/src/vs/editor/test/browser/controller/textAreaState.test.ts @@ -5,11 +5,97 @@ 'use strict'; import * as assert from 'assert'; -import { IENarratorTextAreaState, ISimpleModel, TextAreaState } from 'vs/editor/common/controller/textAreaState'; +import { IENarratorTextAreaState, ISimpleModel, TextAreaState, IClipboardEvent, ICompositionEvent, IKeyboardEventWrapper, ITextAreaWrapper } from 'vs/editor/browser/controller/textAreaState'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; -import { MockTextAreaWrapper } from 'vs/editor/test/common/mocks/mockTextAreaWrapper'; +import Event, { Emitter } from 'vs/base/common/event'; +import { Disposable } from 'vs/base/common/lifecycle'; + +export class MockTextAreaWrapper extends Disposable implements ITextAreaWrapper { + + private _onKeyDown = this._register(new Emitter()); + public onKeyDown: Event = this._onKeyDown.event; + + private _onKeyUp = this._register(new Emitter()); + public onKeyUp: Event = this._onKeyUp.event; + + private _onKeyPress = this._register(new Emitter()); + public onKeyPress: Event = this._onKeyPress.event; + + private _onCompositionStart = this._register(new Emitter()); + public onCompositionStart: Event = this._onCompositionStart.event; + + private _onCompositionUpdate = this._register(new Emitter()); + public onCompositionUpdate: Event = this._onCompositionUpdate.event; + + private _onCompositionEnd = this._register(new Emitter()); + public onCompositionEnd: Event = this._onCompositionEnd.event; + + private _onInput = this._register(new Emitter()); + public onInput: Event = this._onInput.event; + + private _onCut = this._register(new Emitter()); + public onCut: Event = this._onCut.event; + + private _onCopy = this._register(new Emitter()); + public onCopy: Event = this._onCopy.event; + + private _onPaste = this._register(new Emitter()); + public onPaste: Event = this._onPaste.event; + + public _value: string; + public _selectionStart: number; + public _selectionEnd: number; + public _isInOverwriteMode: boolean; + + constructor() { + super(); + this._value = ''; + this._selectionStart = 0; + this._selectionEnd = 0; + this._isInOverwriteMode = false; + } + + public getValue(): string { + return this._value; + } + + public setValue(reason: string, value: string): void { + this._value = value; + this._selectionStart = this._value.length; + this._selectionEnd = this._value.length; + } + + public getSelectionStart(): number { + return this._selectionStart; + } + + public getSelectionEnd(): number { + return this._selectionEnd; + } + + public setSelectionRange(selectionStart: number, selectionEnd: number): void { + if (selectionStart < 0) { + selectionStart = 0; + } + if (selectionStart > this._value.length) { + selectionStart = this._value.length; + } + if (selectionEnd < 0) { + selectionEnd = 0; + } + if (selectionEnd > this._value.length) { + selectionEnd = this._value.length; + } + this._selectionStart = selectionStart; + this._selectionEnd = selectionEnd; + } + + public isInOverwriteMode(): boolean { + return this._isInOverwriteMode; + } +} suite('TextAreaState', () => { diff --git a/src/vs/editor/test/common/mocks/mockTextAreaWrapper.ts b/src/vs/editor/test/common/mocks/mockTextAreaWrapper.ts deleted file mode 100644 index 77d242da63c..00000000000 --- a/src/vs/editor/test/common/mocks/mockTextAreaWrapper.ts +++ /dev/null @@ -1,94 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import Event, { Emitter } from 'vs/base/common/event'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { IClipboardEvent, ICompositionEvent, IKeyboardEventWrapper, ITextAreaWrapper } from 'vs/editor/common/controller/textAreaState'; - -export class MockTextAreaWrapper extends Disposable implements ITextAreaWrapper { - - private _onKeyDown = this._register(new Emitter()); - public onKeyDown: Event = this._onKeyDown.event; - - private _onKeyUp = this._register(new Emitter()); - public onKeyUp: Event = this._onKeyUp.event; - - private _onKeyPress = this._register(new Emitter()); - public onKeyPress: Event = this._onKeyPress.event; - - private _onCompositionStart = this._register(new Emitter()); - public onCompositionStart: Event = this._onCompositionStart.event; - - private _onCompositionUpdate = this._register(new Emitter()); - public onCompositionUpdate: Event = this._onCompositionUpdate.event; - - private _onCompositionEnd = this._register(new Emitter()); - public onCompositionEnd: Event = this._onCompositionEnd.event; - - private _onInput = this._register(new Emitter()); - public onInput: Event = this._onInput.event; - - private _onCut = this._register(new Emitter()); - public onCut: Event = this._onCut.event; - - private _onCopy = this._register(new Emitter()); - public onCopy: Event = this._onCopy.event; - - private _onPaste = this._register(new Emitter()); - public onPaste: Event = this._onPaste.event; - - public _value: string; - public _selectionStart: number; - public _selectionEnd: number; - public _isInOverwriteMode: boolean; - - constructor() { - super(); - this._value = ''; - this._selectionStart = 0; - this._selectionEnd = 0; - this._isInOverwriteMode = false; - } - - public getValue(): string { - return this._value; - } - - public setValue(reason: string, value: string): void { - this._value = value; - this._selectionStart = this._value.length; - this._selectionEnd = this._value.length; - } - - public getSelectionStart(): number { - return this._selectionStart; - } - - public getSelectionEnd(): number { - return this._selectionEnd; - } - - public setSelectionRange(selectionStart: number, selectionEnd: number): void { - if (selectionStart < 0) { - selectionStart = 0; - } - if (selectionStart > this._value.length) { - selectionStart = this._value.length; - } - if (selectionEnd < 0) { - selectionEnd = 0; - } - if (selectionEnd > this._value.length) { - selectionEnd = this._value.length; - } - this._selectionStart = selectionStart; - this._selectionEnd = selectionEnd; - } - - public isInOverwriteMode(): boolean { - return this._isInOverwriteMode; - } -} From b4afac4373163c29142cf2fe2eb606f1a8110190 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 3 May 2017 17:05:36 +0200 Subject: [PATCH 0061/1164] [folding] Allow to specify if decorator should hide in collapsed region. Fixes #4812 --- .../editor/common/config/commonEditorConfig.ts | 6 ++++++ src/vs/editor/common/config/defaultConfig.ts | 1 + src/vs/editor/common/config/editorOptions.ts | 9 +++++++++ .../editor/contrib/folding/browser/folding.css | 16 ++++++++++------ src/vs/editor/contrib/folding/browser/folding.ts | 16 ++++++++++++++++ src/vs/monaco.d.ts | 6 ++++++ 6 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index c8655516e9f..4a5ce1d8dad 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -329,6 +329,7 @@ class InternalEditorOptionsHelper { occurrencesHighlight: toBoolean(opts.occurrencesHighlight), codeLens: opts.referenceInfos && opts.codeLens, folding: toBoolean(opts.folding), + hideFoldIcons: toBoolean(opts.hideFoldIcons), matchBrackets: toBoolean(opts.matchBrackets), }); @@ -932,6 +933,11 @@ const editorConfiguration: IConfigurationNode = { 'default': DefaultConfig.editor.folding, 'description': nls.localize('folding', "Controls whether the editor has code folding enabled") }, + 'editor.hideFoldIcons': { + 'type': 'boolean', + 'default': DefaultConfig.editor.hideFoldIcons, + 'description': nls.localize('hideFoldIcons', "Controls whether the fold icons on the gutter are automatically hidden.") + }, 'editor.matchBrackets': { 'type': 'boolean', 'default': DefaultConfig.editor.matchBrackets, diff --git a/src/vs/editor/common/config/defaultConfig.ts b/src/vs/editor/common/config/defaultConfig.ts index 7bd8bc3ea12..b7224baf580 100644 --- a/src/vs/editor/common/config/defaultConfig.ts +++ b/src/vs/editor/common/config/defaultConfig.ts @@ -106,6 +106,7 @@ class ConfigClass implements IConfiguration { codeLens: true, referenceInfos: true, folding: true, + hideFoldIcons: true, renderWhitespace: 'none', renderControlCharacters: false, renderIndentGuides: false, diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index e8bee72579b..cb25845017a 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -420,6 +420,11 @@ export interface IEditorOptions { * Defaults to true in vscode and to false in monaco-editor. */ folding?: boolean; + /** + * Enable automatic hiding of non-collapsed fold icons in the gutter. + * Defaults to true. + */ + hideFoldIcons?: boolean; /** * Enable highlighting of matching brackets. * Defaults to true. @@ -1017,6 +1022,7 @@ export class EditorContribOptions { readonly occurrencesHighlight: boolean; readonly codeLens: boolean; readonly folding: boolean; + readonly hideFoldIcons: boolean; readonly matchBrackets: boolean; /** @@ -1044,6 +1050,7 @@ export class EditorContribOptions { occurrencesHighlight: boolean; codeLens: boolean; folding: boolean; + hideFoldIcons: boolean; matchBrackets: boolean; }) { this.selectionClipboard = Boolean(source.selectionClipboard); @@ -1067,6 +1074,7 @@ export class EditorContribOptions { this.occurrencesHighlight = Boolean(source.occurrencesHighlight); this.codeLens = Boolean(source.codeLens); this.folding = Boolean(source.folding); + this.hideFoldIcons = Boolean(source.hideFoldIcons); this.matchBrackets = Boolean(source.matchBrackets); } @@ -1096,6 +1104,7 @@ export class EditorContribOptions { && this.occurrencesHighlight === other.occurrencesHighlight && this.codeLens === other.codeLens && this.folding === other.folding + && this.hideFoldIcons === other.hideFoldIcons && this.matchBrackets === other.matchBrackets ); } diff --git a/src/vs/editor/contrib/folding/browser/folding.css b/src/vs/editor/contrib/folding/browser/folding.css index 14c6c882bd1..fbc0462fe35 100644 --- a/src/vs/editor/contrib/folding/browser/folding.css +++ b/src/vs/editor/contrib/folding/browser/folding.css @@ -14,8 +14,17 @@ transition: opacity 0.5s; } -.monaco-editor .margin-view-overlays:hover .folding { +.monaco-editor .margin-view-overlays .folding { background-image: url('arrow-expand.svg'); +} + +.monaco-editor.hc-black .margin-view-overlays .folding, +.monaco-editor.vs-dark .margin-view-overlays .folding { + background-image: url('arrow-expand-dark.svg'); +} + +.monaco-editor .margin-view-overlays:hover .folding, +.monaco-editor.alwaysShowFoldIcons .margin-view-overlays .folding { opacity: 1; } @@ -24,11 +33,6 @@ opacity: 1; } -.monaco-editor.hc-black .margin-view-overlays:hover .folding, -.monaco-editor.vs-dark .margin-view-overlays:hover .folding { - background-image: url('arrow-expand-dark.svg'); -} - .monaco-editor.hc-black .margin-view-overlays .folding.collapsed, .monaco-editor.vs-dark .margin-view-overlays .folding.collapsed { background-image: url('arrow-collapse-dark.svg'); diff --git a/src/vs/editor/contrib/folding/browser/folding.ts b/src/vs/editor/contrib/folding/browser/folding.ts index 613db084fc2..24fe018b8de 100644 --- a/src/vs/editor/contrib/folding/browser/folding.ts +++ b/src/vs/editor/contrib/folding/browser/folding.ts @@ -8,6 +8,7 @@ import * as nls from 'vs/nls'; import * as types from 'vs/base/common/types'; +import * as dom from 'vs/base/browser/dom'; import { RunOnceScheduler } from 'vs/base/common/async'; import { KeyCode, KeyMod, KeyChord } from 'vs/base/common/keyCodes'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; @@ -35,6 +36,7 @@ export class FoldingController implements IFoldingController { private editor: ICodeEditor; private _isEnabled: boolean; + private _hideFoldIcons: boolean; private globalToDispose: IDisposable[]; private computeToken: number; @@ -47,6 +49,7 @@ export class FoldingController implements IFoldingController { constructor(editor: ICodeEditor) { this.editor = editor; this._isEnabled = this.editor.getConfiguration().contribInfo.folding; + this._hideFoldIcons = this.editor.getConfiguration().contribInfo.hideFoldIcons; this.globalToDispose = []; this.localToDispose = []; @@ -60,6 +63,11 @@ export class FoldingController implements IFoldingController { if (oldIsEnabled !== this._isEnabled) { this.onModelChanged(); } + let oldHideFoldIcons = this._hideFoldIcons; + this._hideFoldIcons = this.editor.getConfiguration().contribInfo.hideFoldIcons; + if (oldHideFoldIcons !== this._hideFoldIcons) { + this.updateHideFoldIconClass(); + } })); this.onModelChanged(); @@ -74,6 +82,13 @@ export class FoldingController implements IFoldingController { this.globalToDispose = dispose(this.globalToDispose); } + private updateHideFoldIconClass(): void { + let domNode = this.editor.getDomNode(); + if (domNode) { + dom.toggleClass(domNode, 'alwaysShowFoldIcons', this._hideFoldIcons === false); + } + } + /** * Store view state. */ @@ -190,6 +205,7 @@ export class FoldingController implements IFoldingController { private onModelChanged(): void { this.cleanState(); + this.updateHideFoldIconClass(); let model = this.editor.getModel(); if (!this._isEnabled || !model) { diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index aba5742243f..328340dc7ee 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -2955,6 +2955,11 @@ declare module monaco.editor { * Defaults to true in vscode and to false in monaco-editor. */ folding?: boolean; + /** + * Enable automatic hiding of non-collapsed fold icons in the gutter + * Defaults to true + */ + hideFoldIcons?: boolean; /** * Enable highlighting of matching brackets. * Defaults to true. @@ -3215,6 +3220,7 @@ declare module monaco.editor { readonly occurrencesHighlight: boolean; readonly codeLens: boolean; readonly folding: boolean; + readonly hideFoldIcons: boolean; readonly matchBrackets: boolean; } From 5f87c7b13ebc611c54db83af5994fc97218e34bd Mon Sep 17 00:00:00 2001 From: Michel Kaporin Date: Wed, 3 May 2017 17:45:50 +0200 Subject: [PATCH 0062/1164] Got rid of fs.stat for validation. Amended regex to be more precise with resource schemes. --- .../parts/debug/browser/linkDetector.ts | 89 ++++++++----------- 1 file changed, 35 insertions(+), 54 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/linkDetector.ts b/src/vs/workbench/parts/debug/browser/linkDetector.ts index 53fdaf1d231..a94baa7b26c 100644 --- a/src/vs/workbench/parts/debug/browser/linkDetector.ts +++ b/src/vs/workbench/parts/debug/browser/linkDetector.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import strings = require('vs/base/common/strings'); import uri from 'vs/base/common/uri'; import { isMacintosh } from 'vs/base/common/platform'; import * as errors from 'vs/base/common/errors'; @@ -10,7 +11,6 @@ import { IMouseEvent, StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import * as nls from 'vs/nls'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import fs = require('fs'); export class LinkDetector { private static FILE_LOCATION_PATTERNS: RegExp[] = [ @@ -20,7 +20,7 @@ export class LinkDetector { // group 3: line number // group 4: column number // eg: at Context. (c:\Users\someone\Desktop\mocha-runner\test\test.js:26:11) - /(?![\(])(?:file:\/\/)?((?:([a-zA-Z]:)|[^\(\)<>\'\"\[\]:\s]+)(?:[\\/][^\(\)<>\'\"\[\]:]*)?):(\d+)(?::(\d+))?/g + /(?![\(])(?:file:\/\/)?((?:([a-zA-Z]+:)|[^\(\)<>\'\"\[\]:\s]+)(?:[\\/][^\(\)<>\'\"\[\]:]*)?\.[a-zA-Z]+[0-9]*):(\d+)(?::(\d+))?/g ]; constructor( @@ -41,48 +41,43 @@ export class LinkDetector { while (match !== null) { let resource: uri = null; try { - resource = match && (match[2] ? uri.file(match[1]) : this.contextService.toResource(match[1])); + resource = (match && !strings.startsWith(match[0], 'http')) && (match[2] ? uri.file(match[1]) : this.contextService.toResource(match[1])); } catch (e) { } - if (resource) { - if (!linkContainer) { - linkContainer = document.createElement('span'); - } - - const valid = this.fileExists(resource.fsPath); - if (valid) { - let textBeforeLink = text.substring(lastMatchIndex, match.index); - if (textBeforeLink) { - let span = document.createElement('span'); - span.textContent = textBeforeLink; - linkContainer.appendChild(span); - } - - const link = document.createElement('a'); - link.textContent = text.substr(match.index, match[0].length); - link.title = isMacintosh ? nls.localize('fileLinkMac', "Click to follow (Cmd + click opens to the side)") : nls.localize('fileLink', "Click to follow (Ctrl + click opens to the side)"); - linkContainer.appendChild(link); - const line = Number(match[3]); - const column = match[4] ? Number(match[4]) : undefined; - link.onclick = (e) => this.onLinkClick(new StandardMouseEvent(e), resource, line, column); - } else { - let plainText = document.createElement('span'); - plainText.textContent = text.substring(lastMatchIndex, match.index + match[0].length); - linkContainer.appendChild(plainText); - } - - lastMatchIndex = pattern.lastIndex; - const currentMatch = match; + if (!resource) { match = pattern.exec(text); + continue; + } + if (!linkContainer) { + linkContainer = document.createElement('span'); + } - // Append last string part if no more link matches - if (!match) { - let textAfterLink = text.substr(currentMatch.index + currentMatch[0].length); - if (textAfterLink) { - let span = document.createElement('span'); - span.textContent = textAfterLink; - linkContainer.appendChild(span); - } + let textBeforeLink = text.substring(lastMatchIndex, match.index); + if (textBeforeLink) { + let span = document.createElement('span'); + span.textContent = textBeforeLink; + linkContainer.appendChild(span); + } + + const link = document.createElement('a'); + link.textContent = text.substr(match.index, match[0].length); + link.title = isMacintosh ? nls.localize('fileLinkMac', "Click to follow (Cmd + click opens to the side)") : nls.localize('fileLink', "Click to follow (Ctrl + click opens to the side)"); + linkContainer.appendChild(link); + const line = Number(match[3]); + const column = match[4] ? Number(match[4]) : undefined; + link.onclick = (e) => this.onLinkClick(new StandardMouseEvent(e), resource, line, column); + + lastMatchIndex = pattern.lastIndex; + const currentMatch = match; + match = pattern.exec(text); + + // Append last string part if no more link matches + if (!match) { + let textAfterLink = text.substr(currentMatch.index + currentMatch[0].length); + if (textAfterLink) { + let span = document.createElement('span'); + span.textContent = textAfterLink; + linkContainer.appendChild(span); } } } @@ -109,18 +104,4 @@ export class LinkDetector { } }, event.ctrlKey || event.metaKey).done(null, errors.onUnexpectedError); } - - private fileExists(path: string): boolean { - let stat; - try { - stat = fs.statSync(path); - } catch (e) { - return false; - } - - if (stat.isFile()) { - return true; - } - return false; - } } From 636e3b3cb2fd92ab37ac6abd9d71429a3631fb1d Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 3 May 2017 09:56:55 -0700 Subject: [PATCH 0063/1164] Fix a potential hang when tsserver exits improperly (#25808) **Bug** If the TSServer restarts with ongoing requests queued, the new server instance may not properly startup. in the logs, this looks like a series of cancelled request followed by a restart message, and then more cancelled requests of the same series **fix** I believe the root cause of this is that the request queue is not properly flushed and the request sequence numbers are not properly reset when starting the new server instance. Fixes #25807 --- extensions/typescript/src/typescriptServiceClient.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index 66e83da0185..71e7e2adf16 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -153,7 +153,6 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient private lastError: Error | null; private reader: Reader; private sequenceNumber: number; - private exitRequested: boolean; private firstStart: number; private lastStart: number; private numberRestarts: number; @@ -187,7 +186,6 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient this.servicePromise = null; this.lastError = null; this.sequenceNumber = 0; - this.exitRequested = false; this.firstStart = Date.now(); this.numberRestarts = 0; @@ -522,6 +520,11 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient this.globalState.update(doGlobalVersionCheckKey, true); } + this.sequenceNumber = 0; + this.requestQueue = []; + this.pendingResponses = 0; + this.lastError = null; + try { let options: electron.IForkOptions = { execArgv: [] // [`--debug-brk=5859`] @@ -851,7 +854,7 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient this.callbacks[parseInt(key)].e(new Error('Service died.')); }); this.callbacks = Object.create(null); - if (!this.exitRequested && restart) { + if (restart) { let diff = Date.now() - this.lastStart; this.numberRestarts++; let startService = true; From a11885872a0f47fdd85ef34b5b16395773f0cf87 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 May 2017 17:42:52 +0200 Subject: [PATCH 0064/1164] Debt: Simplify text area handling code --- .../controller/input/textAreaWrapper.ts | 119 ++++++------------ .../browser/controller/keyboardHandler.ts | 43 +++---- .../browser/controller/textAreaHandler.ts | 71 +++++------ .../browser/controller/textAreaState.ts | 43 +------ .../test/browser/controller/imeTester.ts | 6 +- .../browser/controller/textAreaState.test.ts | 35 +----- 6 files changed, 102 insertions(+), 215 deletions(-) diff --git a/src/vs/editor/browser/controller/input/textAreaWrapper.ts b/src/vs/editor/browser/controller/input/textAreaWrapper.ts index 538fcaac34d..886c7ae28e6 100644 --- a/src/vs/editor/browser/controller/input/textAreaWrapper.ts +++ b/src/vs/editor/browser/controller/input/textAreaWrapper.ts @@ -9,10 +9,9 @@ import { Disposable } from 'vs/base/common/lifecycle'; import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { IClipboardEvent, ICompositionEvent, IKeyboardEventWrapper, ITextAreaWrapper } from 'vs/editor/browser/controller/textAreaState'; import { FastDomNode } from 'vs/base/browser/fastDomNode'; -class ClipboardEventWrapper implements IClipboardEvent { +export class ClipboardEventWrapper { private _event: ClipboardEvent; @@ -64,76 +63,48 @@ class ClipboardEventWrapper implements IClipboardEvent { } } -class KeyboardEventWrapper implements IKeyboardEventWrapper { +export class TextAreaWrapper extends Disposable { - public _actual: IKeyboardEvent; + public readonly actual: FastDomNode; - constructor(actual: IKeyboardEvent) { - this._actual = actual; - } + private _onKeyDown = this._register(new Emitter()); + public onKeyDown: Event = this._onKeyDown.event; - public equals(keybinding: number): boolean { - return this._actual.equals(keybinding); - } + private _onKeyUp = this._register(new Emitter()); + public onKeyUp: Event = this._onKeyUp.event; - public preventDefault(): void { - this._actual.preventDefault(); - } + private _onKeyPress = this._register(new Emitter()); + public onKeyPress: Event = this._onKeyPress.event; - public stopPropagation(): void { - this._actual.stopPropagation(); - } + private _onCompositionStart = this._register(new Emitter()); + public onCompositionStart: Event = this._onCompositionStart.event; - public isDefaultPrevented(): boolean { - if (this._actual.browserEvent) { - return this._actual.browserEvent.defaultPrevented; - } - return false; - } -} + private _onCompositionUpdate = this._register(new Emitter()); + public onCompositionUpdate: Event = this._onCompositionUpdate.event; -export class TextAreaWrapper extends Disposable implements ITextAreaWrapper { - - private _textArea: FastDomNode; - - private _onKeyDown = this._register(new Emitter()); - public onKeyDown: Event = this._onKeyDown.event; - - private _onKeyUp = this._register(new Emitter()); - public onKeyUp: Event = this._onKeyUp.event; - - private _onKeyPress = this._register(new Emitter()); - public onKeyPress: Event = this._onKeyPress.event; - - private _onCompositionStart = this._register(new Emitter()); - public onCompositionStart: Event = this._onCompositionStart.event; - - private _onCompositionUpdate = this._register(new Emitter()); - public onCompositionUpdate: Event = this._onCompositionUpdate.event; - - private _onCompositionEnd = this._register(new Emitter()); - public onCompositionEnd: Event = this._onCompositionEnd.event; + private _onCompositionEnd = this._register(new Emitter()); + public onCompositionEnd: Event = this._onCompositionEnd.event; private _onInput = this._register(new Emitter()); public onInput: Event = this._onInput.event; - private _onCut = this._register(new Emitter()); - public onCut: Event = this._onCut.event; + private _onCut = this._register(new Emitter()); + public onCut: Event = this._onCut.event; - private _onCopy = this._register(new Emitter()); - public onCopy: Event = this._onCopy.event; + private _onCopy = this._register(new Emitter()); + public onCopy: Event = this._onCopy.event; - private _onPaste = this._register(new Emitter()); - public onPaste: Event = this._onPaste.event; + private _onPaste = this._register(new Emitter()); + public onPaste: Event = this._onPaste.event; constructor(_textArea: FastDomNode) { super(); - this._textArea = _textArea; + this.actual = _textArea; - const textArea = this._textArea.domNode; - this._register(dom.addStandardDisposableListener(textArea, 'keydown', (e) => this._onKeyDown.fire(new KeyboardEventWrapper(e)))); - this._register(dom.addStandardDisposableListener(textArea, 'keyup', (e) => this._onKeyUp.fire(new KeyboardEventWrapper(e)))); - this._register(dom.addStandardDisposableListener(textArea, 'keypress', (e) => this._onKeyPress.fire(new KeyboardEventWrapper(e)))); + const textArea = this.actual.domNode; + this._register(dom.addStandardDisposableListener(textArea, 'keydown', (e) => this._onKeyDown.fire(e))); + this._register(dom.addStandardDisposableListener(textArea, 'keyup', (e) => this._onKeyUp.fire(e))); + this._register(dom.addStandardDisposableListener(textArea, 'keypress', (e) => this._onKeyPress.fire(e))); this._register(dom.addDisposableListener(textArea, 'compositionstart', (e) => this._onCompositionStart.fire(e))); this._register(dom.addDisposableListener(textArea, 'compositionupdate', (e) => this._onCompositionUpdate.fire(e))); this._register(dom.addDisposableListener(textArea, 'compositionend', (e) => this._onCompositionEnd.fire(e))); @@ -143,52 +114,44 @@ export class TextAreaWrapper extends Disposable implements ITextAreaWrapper { this._register(dom.addDisposableListener(textArea, 'paste', (e: ClipboardEvent) => this._onPaste.fire(new ClipboardEventWrapper(e)))); } - public get actual(): FastDomNode { - return this._textArea; - } - public getValue(): string { // console.log('current value: ' + this._textArea.value); - const textArea = this._textArea.domNode; + const textArea = this.actual.domNode; return textArea.value; } public setValue(reason: string, value: string): void { // console.log('reason: ' + reason + ', current value: ' + this._textArea.value + ' => new value: ' + value); - const textArea = this._textArea.domNode; + const textArea = this.actual.domNode; textArea.value = value; } public getSelectionStart(): number { - const textArea = this._textArea.domNode; + const textArea = this.actual.domNode; return textArea.selectionStart; } public getSelectionEnd(): number { - const textArea = this._textArea.domNode; + const textArea = this.actual.domNode; return textArea.selectionEnd; } public setSelectionRange(selectionStart: number, selectionEnd: number): void { - const textArea = this._textArea.domNode; + const textArea = this.actual.domNode; const activeElement = document.activeElement; if (activeElement === textArea) { textArea.setSelectionRange(selectionStart, selectionEnd); } else { - this._setSelectionRangeJumpy(selectionStart, selectionEnd); - } - } - - private _setSelectionRangeJumpy(selectionStart: number, selectionEnd: number): void { - const textArea = this._textArea.domNode; - try { - let scrollState = dom.saveParentsScrollTop(textArea); - textArea.focus(); - textArea.setSelectionRange(selectionStart, selectionEnd); - dom.restoreParentsScrollTop(textArea, scrollState); - } catch (e) { - // Sometimes IE throws when setting selection (e.g. textarea is off-DOM) - console.log('an error has been thrown!'); + // If the focus is outside the textarea, browsers will try really hard to reveal the textarea. + // Here, we try to undo the browser's desperate reveal. + try { + const scrollState = dom.saveParentsScrollTop(textArea); + textArea.focus(); + textArea.setSelectionRange(selectionStart, selectionEnd); + dom.restoreParentsScrollTop(textArea, scrollState); + } catch (e) { + // Sometimes IE throws when setting selection (e.g. textarea is off-DOM) + } } } diff --git a/src/vs/editor/browser/controller/keyboardHandler.ts b/src/vs/editor/browser/controller/keyboardHandler.ts index 4c9f52ecdb4..c1b61ce4af0 100644 --- a/src/vs/editor/browser/controller/keyboardHandler.ts +++ b/src/vs/editor/browser/controller/keyboardHandler.ts @@ -6,7 +6,6 @@ import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; -import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { GlobalScreenReaderNVDA } from 'vs/editor/common/config/commonEditorConfig'; import { TextAreaHandler } from 'vs/editor/browser/controller/textAreaHandler'; import { TextAreaStrategy } from 'vs/editor/browser/controller/textAreaState'; @@ -15,7 +14,6 @@ import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; import { Configuration } from 'vs/editor/browser/config/configuration'; import { ViewContext } from 'vs/editor/common/view/viewContext'; import { HorizontalRange } from 'vs/editor/common/view/renderingContext'; -import { TextAreaWrapper } from 'vs/editor/browser/controller/input/textAreaWrapper'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { FastDomNode } from 'vs/base/browser/fastDomNode'; import { VerticalRevealType } from 'vs/editor/common/controller/cursorEvents'; @@ -44,7 +42,7 @@ export class KeyboardHandler extends ViewEventHandler { private _context: ViewContext; private viewController: ViewController; private viewHelper: IKeyboardHandlerHelper; - private textArea: TextAreaWrapper; + private textArea: FastDomNode; private textAreaHandler: TextAreaHandler; private contentLeft: number; @@ -59,8 +57,8 @@ export class KeyboardHandler extends ViewEventHandler { this._context = context; this.viewController = viewController; - this.textArea = new TextAreaWrapper(viewHelper.textArea); - Configuration.applyFontInfo(this.textArea.actual, this._context.configuration.editor.fontInfo); + this.textArea = viewHelper.textArea; + Configuration.applyFontInfo(this.textArea, this._context.configuration.editor.fontInfo); this.viewHelper = viewHelper; this.visiblePosition = null; @@ -69,10 +67,10 @@ export class KeyboardHandler extends ViewEventHandler { this.scrollLeft = 0; this.scrollTop = 0; - this.textAreaHandler = new TextAreaHandler(browser, this._getStrategy(), this.textArea, this._context.model); + this.textAreaHandler = new TextAreaHandler(this._getStrategy(), this.textArea, this._context.model); - this._register(this.textAreaHandler.onKeyDown((e) => this.viewController.emitKeyDown(e._actual))); - this._register(this.textAreaHandler.onKeyUp((e) => this.viewController.emitKeyUp(e._actual))); + this._register(this.textAreaHandler.onKeyDown((e) => this.viewController.emitKeyDown(e))); + this._register(this.textAreaHandler.onKeyUp((e) => this.viewController.emitKeyUp(e))); this._register(this.textAreaHandler.onPaste((e) => this.viewController.paste('keyboard', e.text, e.pasteOnNewLine))); this._register(this.textAreaHandler.onCut((e) => this.viewController.cut('keyboard'))); this._register(this.textAreaHandler.onType((e) => { @@ -100,12 +98,12 @@ export class KeyboardHandler extends ViewEventHandler { this.viewHelper.getVerticalOffsetForLineNumber(lineNumber), visibleRange.left ); - this.textArea.actual.setTop(this.visiblePosition.top - this.scrollTop); - this.textArea.actual.setLeft(this.contentLeft + this.visiblePosition.left - this.scrollLeft); + this.textArea.setTop(this.visiblePosition.top - this.scrollTop); + this.textArea.setLeft(this.contentLeft + this.visiblePosition.left - this.scrollLeft); } // Show the textarea - this.textArea.actual.setHeight(this._context.configuration.editor.lineHeight); + this.textArea.setHeight(this._context.configuration.editor.lineHeight); this.viewHelper.viewDomNode.addClassName('ime-input'); this.viewController.compositionStart('keyboard'); @@ -115,30 +113,30 @@ export class KeyboardHandler extends ViewEventHandler { if (browser.isEdgeOrIE) { // Due to isEdgeOrIE (where the textarea was not cleared initially) // we cannot assume the text consists only of the composited text - this.textArea.actual.setWidth(0); + this.textArea.setWidth(0); } else { // adjust width by its size let canvasElem = document.createElement('canvas'); let context = canvasElem.getContext('2d'); - let cs = dom.getComputedStyle(this.textArea.actual.domNode); + let cs = dom.getComputedStyle(this.textArea.domNode); if (browser.isFirefox) { // computedStyle.font is empty in Firefox... context.font = `${cs.fontStyle} ${cs.fontVariant} ${cs.fontWeight} ${cs.fontStretch} ${cs.fontSize} / ${cs.lineHeight} ${cs.fontFamily}`; let metrics = context.measureText(e.data); - this.textArea.actual.setWidth(metrics.width + 2); // +2 for Japanese... + this.textArea.setWidth(metrics.width + 2); // +2 for Japanese... } else { context.font = cs.font; let metrics = context.measureText(e.data); - this.textArea.actual.setWidth(metrics.width); + this.textArea.setWidth(metrics.width); } } })); this._register(this.textAreaHandler.onCompositionEnd((e) => { - this.textArea.actual.unsetHeight(); - this.textArea.actual.unsetWidth(); - this.textArea.actual.setLeft(0); - this.textArea.actual.setTop(0); + this.textArea.unsetHeight(); + this.textArea.unsetWidth(); + this.textArea.setLeft(0); + this.textArea.setTop(0); this.viewHelper.viewDomNode.removeClassName('ime-input'); this.visiblePosition = null; @@ -156,7 +154,6 @@ export class KeyboardHandler extends ViewEventHandler { public dispose(): void { this._context.removeEventHandler(this); this.textAreaHandler.dispose(); - this.textArea.dispose(); super.dispose(); } @@ -179,7 +176,7 @@ export class KeyboardHandler extends ViewEventHandler { public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { // Give textarea same font size & line height as editor, for the IME case (when the textarea is visible) if (e.fontInfo) { - Configuration.applyFontInfo(this.textArea.actual, this._context.configuration.editor.fontInfo); + Configuration.applyFontInfo(this.textArea, this._context.configuration.editor.fontInfo); } if (e.viewInfo.experimentalScreenReader) { this.textAreaHandler.setStrategy(this._getStrategy()); @@ -206,8 +203,8 @@ export class KeyboardHandler extends ViewEventHandler { this.scrollLeft = e.scrollLeft; this.scrollTop = e.scrollTop; if (this.visiblePosition) { - this.textArea.actual.setTop(this.visiblePosition.top - this.scrollTop); - this.textArea.actual.setLeft(this.contentLeft + this.visiblePosition.left - this.scrollLeft); + this.textArea.setTop(this.visiblePosition.top - this.scrollTop); + this.textArea.setLeft(this.contentLeft + this.visiblePosition.left - this.scrollLeft); } return false; } diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index 394e67bee86..7dbd21c82b1 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -9,8 +9,17 @@ import * as strings from 'vs/base/common/strings'; import Event, { Emitter } from 'vs/base/common/event'; import { KeyCode } from 'vs/base/common/keyCodes'; import { Disposable } from 'vs/base/common/lifecycle'; -import { IClipboardEvent, ICompositionEvent, IKeyboardEventWrapper, ISimpleModel, ITextAreaWrapper, ITypeData, TextAreaState, TextAreaStrategy, createTextAreaState } from 'vs/editor/browser/controller/textAreaState'; +import { ISimpleModel, ITypeData, TextAreaState, TextAreaStrategy, createTextAreaState } from 'vs/editor/browser/controller/textAreaState'; import { Range } from 'vs/editor/common/core/range'; +import * as browser from 'vs/base/browser/browser'; +import { ClipboardEventWrapper, TextAreaWrapper } from "vs/editor/browser/controller/input/textAreaWrapper"; +import { IKeyboardEvent } from "vs/base/browser/keyboardEvent"; +import { FastDomNode } from "vs/base/browser/fastDomNode"; + +export interface ICompositionEvent { + data: string; + locale: string; +} export const CopyOptions = { forceCopyWithSyntaxHighlighting: false @@ -21,14 +30,6 @@ const enum ReadFromTextArea { Paste } -export interface IBrowser { - isIPad: boolean; - isChrome: boolean; - isEdgeOrIE: boolean; - isFirefox: boolean; - enableEmptySelectionClipboard: boolean; -} - export interface IPasteData { text: string; pasteOnNewLine: boolean; @@ -48,11 +49,11 @@ const isChromev55_v56 = ( export class TextAreaHandler extends Disposable { - private _onKeyDown = this._register(new Emitter()); - public onKeyDown: Event = this._onKeyDown.event; + private _onKeyDown = this._register(new Emitter()); + public onKeyDown: Event = this._onKeyDown.event; - private _onKeyUp = this._register(new Emitter()); - public onKeyUp: Event = this._onKeyUp.event; + private _onKeyUp = this._register(new Emitter()); + public onKeyUp: Event = this._onKeyUp.event; private _onCut = this._register(new Emitter()); public onCut: Event = this._onCut.event; @@ -72,8 +73,7 @@ export class TextAreaHandler extends Disposable { private _onCompositionEnd = this._register(new Emitter()); public onCompositionEnd: Event = this._onCompositionEnd.event; - private Browser: IBrowser; - private textArea: ITextAreaWrapper; + private textArea: TextAreaWrapper; private model: ISimpleModel; private selection: Range; @@ -82,8 +82,6 @@ export class TextAreaHandler extends Disposable { private asyncTriggerCut: RunOnceScheduler; - private lastCompositionEndTime: number; - private textAreaState: TextAreaState; private textareaIsShownAtCursor: boolean; @@ -92,16 +90,15 @@ export class TextAreaHandler extends Disposable { private _nextCommand: ReadFromTextArea; - constructor(Browser: IBrowser, strategy: TextAreaStrategy, textArea: ITextAreaWrapper, model: ISimpleModel) { + constructor(strategy: TextAreaStrategy, textArea: FastDomNode, model: ISimpleModel) { super(); - this.Browser = Browser; - this.textArea = textArea; + this.textArea = this._register(new TextAreaWrapper(textArea)); this.model = model; this.selection = new Range(1, 1, 1, 1); this.selections = [new Range(1, 1, 1, 1)]; this._nextCommand = ReadFromTextArea.Type; - this.asyncTriggerCut = new RunOnceScheduler(() => this._onCut.fire(), 0); + this.asyncTriggerCut = this._register(new RunOnceScheduler(() => this._onCut.fire(), 0)); this.lastCopiedValue = null; this.lastCopiedValueIsFromEmptySelection = false; @@ -109,8 +106,6 @@ export class TextAreaHandler extends Disposable { this.hasFocus = false; - this.lastCompositionEndTime = 0; - this._register(this.textArea.onKeyDown((e) => this._onKeyDownHandler(e))); this._register(this.textArea.onKeyUp((e) => this._onKeyUp.fire(e))); this._register(this.textArea.onKeyPress((e) => this._onKeyPressHandler(e))); @@ -127,7 +122,7 @@ export class TextAreaHandler extends Disposable { this.textareaIsShownAtCursor = true; // In IE we cannot set .value when handling 'compositionstart' because the entire composition will get canceled. - if (!this.Browser.isEdgeOrIE) { + if (!browser.isEdgeOrIE) { this.setTextAreaState('compositionstart', this.textAreaState.toEmpty(), false); } @@ -148,7 +143,7 @@ export class TextAreaHandler extends Disposable { return; } - if (Browser.isEdgeOrIE && e.locale === 'ja') { + if (browser.isEdgeOrIE && e.locale === 'ja') { // https://github.com/Microsoft/monaco-editor/issues/339 // Multi-part Japanese compositions reset cursor in Edge/IE, Chinese and Korean IME don't have this issue. // The reason that we can't use this path for all CJK IME is IE and Edge behave differently when handling Korean IME, @@ -188,7 +183,7 @@ export class TextAreaHandler extends Disposable { this._register(this.textArea.onCompositionEnd((e) => { // console.log('onCompositionEnd: ' + e.data); - if (Browser.isEdgeOrIE && e.locale === 'ja') { + if (browser.isEdgeOrIE && e.locale === 'ja') { // https://github.com/Microsoft/monaco-editor/issues/339 this.textAreaState = this.textAreaState.fromTextArea(this.textArea); let typeInput = this.textAreaState.deduceInput(); @@ -202,11 +197,10 @@ export class TextAreaHandler extends Disposable { // Due to isEdgeOrIE (where the textarea was not cleared initially) and isChrome (the textarea is not updated correctly when composition ends) // we cannot assume the text at the end consists only of the composited text - if (Browser.isEdgeOrIE || Browser.isChrome) { + if (browser.isEdgeOrIE || browser.isChrome) { this.textAreaState = this.textAreaState.fromTextArea(this.textArea); } - this.lastCompositionEndTime = (new Date()).getTime(); if (!this.textareaIsShownAtCursor) { return; } @@ -264,7 +258,6 @@ export class TextAreaHandler extends Disposable { } public dispose(): void { - this.asyncTriggerCut.dispose(); super.dispose(); } @@ -302,7 +295,7 @@ export class TextAreaHandler extends Disposable { this.textAreaState = textAreaState; } - private _onKeyDownHandler(e: IKeyboardEventWrapper): void { + private _onKeyDownHandler(e: IKeyboardEvent): void { if (this.textareaIsShownAtCursor && e.equals(KeyCode.KEY_IN_COMPOSITION)) { // Stop propagation for keyDown events if the IME is processing key input e.stopPropagation(); @@ -316,7 +309,7 @@ export class TextAreaHandler extends Disposable { this._onKeyDown.fire(e); } - private _onKeyPressHandler(e: IKeyboardEventWrapper): void { + private _onKeyPressHandler(e: IKeyboardEvent): void { if (!this.hasFocus) { // Sometimes, when doing Alt-Tab, in FF, a 'keypress' is sent before a 'focus' return; @@ -331,7 +324,7 @@ export class TextAreaHandler extends Disposable { } let pasteOnNewLine = false; - if (this.Browser.enableEmptySelectionClipboard) { + if (browser.enableEmptySelectionClipboard) { pasteOnNewLine = (txt === this.lastCopiedValue && this.lastCopiedValueIsFromEmptySelection); } this._onPaste.fire({ @@ -347,7 +340,7 @@ export class TextAreaHandler extends Disposable { private _writePlaceholderAndSelectTextArea(reason: string, forceFocus: boolean): void { if (!this.textareaIsShownAtCursor) { // Do not write to the textarea if it is visible. - if (this.Browser.isIPad) { + if (browser.isIPad) { // Do not place anything in the textarea for the iPad this.setTextAreaState(reason, this.textAreaState.toEmpty(), forceFocus); } else { @@ -358,20 +351,20 @@ export class TextAreaHandler extends Disposable { // ------------- Clipboard operations - private _ensureClipboardGetsEditorSelection(e: IClipboardEvent): void { - let whatToCopy = this.model.getPlainTextToCopy(this.selections, this.Browser.enableEmptySelectionClipboard); + private _ensureClipboardGetsEditorSelection(e: ClipboardEventWrapper): void { + let whatToCopy = this.model.getPlainTextToCopy(this.selections, browser.enableEmptySelectionClipboard); if (e.canUseTextData()) { let whatHTMLToCopy: string = null; - if (!this.Browser.isEdgeOrIE && (whatToCopy.length < 65536 || CopyOptions.forceCopyWithSyntaxHighlighting)) { - whatHTMLToCopy = this.model.getHTMLToCopy(this.selections, this.Browser.enableEmptySelectionClipboard); + if (!browser.isEdgeOrIE && (whatToCopy.length < 65536 || CopyOptions.forceCopyWithSyntaxHighlighting)) { + whatHTMLToCopy = this.model.getHTMLToCopy(this.selections, browser.enableEmptySelectionClipboard); } e.setTextData(whatToCopy, whatHTMLToCopy); } else { this.setTextAreaState('copy or cut', this.textAreaState.fromText(whatToCopy), false); } - if (this.Browser.enableEmptySelectionClipboard) { - if (this.Browser.isFirefox) { + if (browser.enableEmptySelectionClipboard) { + if (browser.isFirefox) { // When writing "LINE\r\n" to the clipboard and then pasting, // Firefox pastes "LINE\n", so let's work around this quirk this.lastCopiedValue = whatToCopy.replace(/\r\n/g, '\n'); diff --git a/src/vs/editor/browser/controller/textAreaState.ts b/src/vs/editor/browser/controller/textAreaState.ts index 1090e2a10dc..8f2500c4761 100644 --- a/src/vs/editor/browser/controller/textAreaState.ts +++ b/src/vs/editor/browser/controller/textAreaState.ts @@ -4,44 +4,13 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import Event from 'vs/base/common/event'; import { commonPrefixLength, commonSuffixLength } from 'vs/base/common/strings'; import { Range } from 'vs/editor/common/core/range'; import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; import { Position } from 'vs/editor/common/core/position'; import { Constants } from 'vs/editor/common/core/uint'; -export interface IClipboardEvent { - canUseTextData(): boolean; - setTextData(text: string, richText: string): void; - getTextData(): string; -} - -export interface ICompositionEvent { - data: string; - locale: string; -} - -export interface IKeyboardEventWrapper { - _actual: any; - equals(keybinding: number): boolean; - preventDefault(): void; - stopPropagation(): void; - isDefaultPrevented(): boolean; -} - -export interface ITextAreaWrapper { - onKeyDown: Event; - onKeyUp: Event; - onKeyPress: Event; - onCompositionStart: Event; - onCompositionUpdate: Event; - onCompositionEnd: Event; - onInput: Event; - onCut: Event; - onCopy: Event; - onPaste: Event; - +export interface ISimpleTextAreaWrapper { getValue(): string; setValue(reason: string, value: string): void; getSelectionStart(): number; @@ -113,7 +82,7 @@ export abstract class TextAreaState { public abstract equals(other: TextAreaState): boolean; - public abstract fromTextArea(textArea: ITextAreaWrapper): TextAreaState; + public abstract fromTextArea(textArea: ISimpleTextAreaWrapper): TextAreaState; public abstract fromEditorSelection(model: ISimpleModel, selection: Range); @@ -144,7 +113,7 @@ export abstract class TextAreaState { return this.value; } - public applyToTextArea(reason: string, textArea: ITextAreaWrapper, select: boolean): void { + public applyToTextArea(reason: string, textArea: ISimpleTextAreaWrapper, select: boolean): void { // console.log(Date.now() + ': applyToTextArea ' + reason + ': ' + this.toString()); if (textArea.getValue() !== this.value) { textArea.setValue(reason, this.value); @@ -274,7 +243,7 @@ export class IENarratorTextAreaState extends TextAreaState { return false; } - public fromTextArea(textArea: ITextAreaWrapper): TextAreaState { + public fromTextArea(textArea: ISimpleTextAreaWrapper): TextAreaState { return new IENarratorTextAreaState(this, textArea.getValue(), textArea.getSelectionStart(), textArea.getSelectionEnd(), textArea.isInOverwriteMode(), this.selectionToken); } @@ -375,7 +344,7 @@ export class NVDAPagedTextAreaState extends TextAreaState { return false; } - public fromTextArea(textArea: ITextAreaWrapper): TextAreaState { + public fromTextArea(textArea: ISimpleTextAreaWrapper): TextAreaState { return new NVDAPagedTextAreaState(this, textArea.getValue(), textArea.getSelectionStart(), textArea.getSelectionEnd(), textArea.isInOverwriteMode()); } @@ -484,7 +453,7 @@ export class NVDAFullTextAreaState extends TextAreaState { return false; } - public fromTextArea(textArea: ITextAreaWrapper): TextAreaState { + public fromTextArea(textArea: ISimpleTextAreaWrapper): TextAreaState { return new NVDAFullTextAreaState(this, textArea.getValue(), textArea.getSelectionStart(), textArea.getSelectionEnd(), textArea.isInOverwriteMode()); } diff --git a/src/vs/editor/test/browser/controller/imeTester.ts b/src/vs/editor/test/browser/controller/imeTester.ts index 09d862654ee..faaa003cc12 100644 --- a/src/vs/editor/test/browser/controller/imeTester.ts +++ b/src/vs/editor/test/browser/controller/imeTester.ts @@ -5,11 +5,9 @@ 'use strict'; import { TextAreaHandler } from 'vs/editor/browser/controller/textAreaHandler'; -import * as browser from 'vs/base/browser/browser'; import { TextAreaStrategy, ISimpleModel } from 'vs/editor/browser/controller/textAreaState'; import { Range, IRange } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import { TextAreaWrapper } from 'vs/editor/browser/controller/input/textAreaWrapper'; import { Position } from 'vs/editor/common/core/position'; import { createFastDomNode } from 'vs/base/browser/fastDomNode'; @@ -101,11 +99,9 @@ function doCreateTest(strategy: TextAreaStrategy, description: string, inputStr: input.setAttribute('cols', '40'); container.appendChild(input); - let textAreaWrapper = new TextAreaWrapper(createFastDomNode(input)); - let model = new SingleLineTestModel('some text'); - let handler = new TextAreaHandler(browser, strategy, textAreaWrapper, model); + let handler = new TextAreaHandler(strategy, createFastDomNode(input), model); input.onfocus = () => { handler.setHasFocus(true); diff --git a/src/vs/editor/test/browser/controller/textAreaState.test.ts b/src/vs/editor/test/browser/controller/textAreaState.test.ts index 6cdbeb4f50b..ed1a3b4f71f 100644 --- a/src/vs/editor/test/browser/controller/textAreaState.test.ts +++ b/src/vs/editor/test/browser/controller/textAreaState.test.ts @@ -5,44 +5,13 @@ 'use strict'; import * as assert from 'assert'; -import { IENarratorTextAreaState, ISimpleModel, TextAreaState, IClipboardEvent, ICompositionEvent, IKeyboardEventWrapper, ITextAreaWrapper } from 'vs/editor/browser/controller/textAreaState'; +import { IENarratorTextAreaState, ISimpleModel, TextAreaState, ISimpleTextAreaWrapper } from 'vs/editor/browser/controller/textAreaState'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; -import Event, { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; -export class MockTextAreaWrapper extends Disposable implements ITextAreaWrapper { - - private _onKeyDown = this._register(new Emitter()); - public onKeyDown: Event = this._onKeyDown.event; - - private _onKeyUp = this._register(new Emitter()); - public onKeyUp: Event = this._onKeyUp.event; - - private _onKeyPress = this._register(new Emitter()); - public onKeyPress: Event = this._onKeyPress.event; - - private _onCompositionStart = this._register(new Emitter()); - public onCompositionStart: Event = this._onCompositionStart.event; - - private _onCompositionUpdate = this._register(new Emitter()); - public onCompositionUpdate: Event = this._onCompositionUpdate.event; - - private _onCompositionEnd = this._register(new Emitter()); - public onCompositionEnd: Event = this._onCompositionEnd.event; - - private _onInput = this._register(new Emitter()); - public onInput: Event = this._onInput.event; - - private _onCut = this._register(new Emitter()); - public onCut: Event = this._onCut.event; - - private _onCopy = this._register(new Emitter()); - public onCopy: Event = this._onCopy.event; - - private _onPaste = this._register(new Emitter()); - public onPaste: Event = this._onPaste.event; +export class MockTextAreaWrapper extends Disposable implements ISimpleTextAreaWrapper { public _value: string; public _selectionStart: number; From 9cdd0987b4d8cea724a3087da2d1b5f184859aa5 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 May 2017 18:00:05 +0200 Subject: [PATCH 0065/1164] Debt: Simplify TextAreaHandler --- .../controller/input/textAreaWrapper.ts | 165 ------------------ .../browser/controller/textAreaHandler.ts | 134 ++++++++++++-- .../browser/controller/textAreaState.ts | 12 +- .../browser/controller/textAreaState.test.ts | 4 +- 4 files changed, 125 insertions(+), 190 deletions(-) delete mode 100644 src/vs/editor/browser/controller/input/textAreaWrapper.ts diff --git a/src/vs/editor/browser/controller/input/textAreaWrapper.ts b/src/vs/editor/browser/controller/input/textAreaWrapper.ts deleted file mode 100644 index 886c7ae28e6..00000000000 --- a/src/vs/editor/browser/controller/input/textAreaWrapper.ts +++ /dev/null @@ -1,165 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import Event, { Emitter } from 'vs/base/common/event'; -import { Disposable } from 'vs/base/common/lifecycle'; -import * as browser from 'vs/base/browser/browser'; -import * as dom from 'vs/base/browser/dom'; -import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { FastDomNode } from 'vs/base/browser/fastDomNode'; - -export class ClipboardEventWrapper { - - private _event: ClipboardEvent; - - constructor(event: ClipboardEvent) { - this._event = event; - } - - public canUseTextData(): boolean { - if (this._event.clipboardData) { - return true; - } - if ((window).clipboardData) { - return true; - } - return false; - } - - public setTextData(text: string, richText: string): void { - if (this._event.clipboardData) { - this._event.clipboardData.setData('text/plain', text); - if (richText !== null) { - this._event.clipboardData.setData('text/html', richText); - } - this._event.preventDefault(); - return; - } - - if ((window).clipboardData) { - (window).clipboardData.setData('Text', text); - this._event.preventDefault(); - return; - } - - throw new Error('ClipboardEventWrapper.setTextData: Cannot use text data!'); - } - - public getTextData(): string { - if (this._event.clipboardData) { - this._event.preventDefault(); - return this._event.clipboardData.getData('text/plain'); - } - - if ((window).clipboardData) { - this._event.preventDefault(); - return (window).clipboardData.getData('Text'); - } - - throw new Error('ClipboardEventWrapper.getTextData: Cannot use text data!'); - } -} - -export class TextAreaWrapper extends Disposable { - - public readonly actual: FastDomNode; - - private _onKeyDown = this._register(new Emitter()); - public onKeyDown: Event = this._onKeyDown.event; - - private _onKeyUp = this._register(new Emitter()); - public onKeyUp: Event = this._onKeyUp.event; - - private _onKeyPress = this._register(new Emitter()); - public onKeyPress: Event = this._onKeyPress.event; - - private _onCompositionStart = this._register(new Emitter()); - public onCompositionStart: Event = this._onCompositionStart.event; - - private _onCompositionUpdate = this._register(new Emitter()); - public onCompositionUpdate: Event = this._onCompositionUpdate.event; - - private _onCompositionEnd = this._register(new Emitter()); - public onCompositionEnd: Event = this._onCompositionEnd.event; - - private _onInput = this._register(new Emitter()); - public onInput: Event = this._onInput.event; - - private _onCut = this._register(new Emitter()); - public onCut: Event = this._onCut.event; - - private _onCopy = this._register(new Emitter()); - public onCopy: Event = this._onCopy.event; - - private _onPaste = this._register(new Emitter()); - public onPaste: Event = this._onPaste.event; - - constructor(_textArea: FastDomNode) { - super(); - this.actual = _textArea; - - const textArea = this.actual.domNode; - this._register(dom.addStandardDisposableListener(textArea, 'keydown', (e) => this._onKeyDown.fire(e))); - this._register(dom.addStandardDisposableListener(textArea, 'keyup', (e) => this._onKeyUp.fire(e))); - this._register(dom.addStandardDisposableListener(textArea, 'keypress', (e) => this._onKeyPress.fire(e))); - this._register(dom.addDisposableListener(textArea, 'compositionstart', (e) => this._onCompositionStart.fire(e))); - this._register(dom.addDisposableListener(textArea, 'compositionupdate', (e) => this._onCompositionUpdate.fire(e))); - this._register(dom.addDisposableListener(textArea, 'compositionend', (e) => this._onCompositionEnd.fire(e))); - this._register(dom.addDisposableListener(textArea, 'input', (e) => this._onInput.fire())); - this._register(dom.addDisposableListener(textArea, 'cut', (e: ClipboardEvent) => this._onCut.fire(new ClipboardEventWrapper(e)))); - this._register(dom.addDisposableListener(textArea, 'copy', (e: ClipboardEvent) => this._onCopy.fire(new ClipboardEventWrapper(e)))); - this._register(dom.addDisposableListener(textArea, 'paste', (e: ClipboardEvent) => this._onPaste.fire(new ClipboardEventWrapper(e)))); - } - - public getValue(): string { - // console.log('current value: ' + this._textArea.value); - const textArea = this.actual.domNode; - return textArea.value; - } - - public setValue(reason: string, value: string): void { - // console.log('reason: ' + reason + ', current value: ' + this._textArea.value + ' => new value: ' + value); - const textArea = this.actual.domNode; - textArea.value = value; - } - - public getSelectionStart(): number { - const textArea = this.actual.domNode; - return textArea.selectionStart; - } - - public getSelectionEnd(): number { - const textArea = this.actual.domNode; - return textArea.selectionEnd; - } - - public setSelectionRange(selectionStart: number, selectionEnd: number): void { - const textArea = this.actual.domNode; - const activeElement = document.activeElement; - if (activeElement === textArea) { - textArea.setSelectionRange(selectionStart, selectionEnd); - } else { - // If the focus is outside the textarea, browsers will try really hard to reveal the textarea. - // Here, we try to undo the browser's desperate reveal. - try { - const scrollState = dom.saveParentsScrollTop(textArea); - textArea.focus(); - textArea.setSelectionRange(selectionStart, selectionEnd); - dom.restoreParentsScrollTop(textArea, scrollState); - } catch (e) { - // Sometimes IE throws when setting selection (e.g. textarea is off-DOM) - } - } - } - - public isInOverwriteMode(): boolean { - // In IE, pressing Insert will bring the typing into overwrite mode - if (browser.isIE && document.queryCommandValue('OverWrite')) { - return true; - } - return false; - } -} diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index 7dbd21c82b1..8f0caefae58 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -9,10 +9,10 @@ import * as strings from 'vs/base/common/strings'; import Event, { Emitter } from 'vs/base/common/event'; import { KeyCode } from 'vs/base/common/keyCodes'; import { Disposable } from 'vs/base/common/lifecycle'; -import { ISimpleModel, ITypeData, TextAreaState, TextAreaStrategy, createTextAreaState } from 'vs/editor/browser/controller/textAreaState'; +import { ISimpleModel, ITypeData, TextAreaState, TextAreaStrategy, createTextAreaState, ITextAreaWrapper } from 'vs/editor/browser/controller/textAreaState'; import { Range } from 'vs/editor/common/core/range'; import * as browser from 'vs/base/browser/browser'; -import { ClipboardEventWrapper, TextAreaWrapper } from "vs/editor/browser/controller/input/textAreaWrapper"; +import * as dom from 'vs/base/browser/dom'; import { IKeyboardEvent } from "vs/base/browser/keyboardEvent"; import { FastDomNode } from "vs/base/browser/fastDomNode"; @@ -106,14 +106,14 @@ export class TextAreaHandler extends Disposable { this.hasFocus = false; - this._register(this.textArea.onKeyDown((e) => this._onKeyDownHandler(e))); - this._register(this.textArea.onKeyUp((e) => this._onKeyUp.fire(e))); - this._register(this.textArea.onKeyPress((e) => this._onKeyPressHandler(e))); + this._register(dom.addStandardDisposableListener(textArea.domNode, 'keydown', (e: IKeyboardEvent) => this._onKeyDownHandler(e))); + this._register(dom.addStandardDisposableListener(textArea.domNode, 'keyup', (e: IKeyboardEvent) => this._onKeyUp.fire(e))); + this._register(dom.addStandardDisposableListener(textArea.domNode, 'keypress', (e: IKeyboardEvent) => this._onKeyPressHandler(e))); this.textareaIsShownAtCursor = false; let compositionLocale = null; - this._register(this.textArea.onCompositionStart((e) => { + this._register(dom.addDisposableListener(textArea.domNode, 'compositionstart', (e: CompositionEvent) => { if (this.textareaIsShownAtCursor) { return; @@ -132,7 +132,7 @@ export class TextAreaHandler extends Disposable { }); })); - this._register(this.textArea.onCompositionUpdate((e) => { + this._register(dom.addDisposableListener(textArea.domNode, 'compositionupdate', (e: CompositionEvent) => { if (isChromev55_v56) { // See https://github.com/Microsoft/monaco-editor/issues/320 // where compositionupdate .data is broken in Chrome v55 and v56 @@ -181,7 +181,7 @@ export class TextAreaHandler extends Disposable { } }; - this._register(this.textArea.onCompositionEnd((e) => { + this._register(dom.addDisposableListener(textArea.domNode, 'compositionend', (e: CompositionEvent) => { // console.log('onCompositionEnd: ' + e.data); if (browser.isEdgeOrIE && e.locale === 'ja') { // https://github.com/Microsoft/monaco-editor/issues/339 @@ -209,7 +209,7 @@ export class TextAreaHandler extends Disposable { this._onCompositionEnd.fire(); })); - this._register(this.textArea.onInput(() => { + this._register(dom.addDisposableListener(textArea.domNode, 'input', () => { // console.log('onInput: ' + this.textArea.getValue()); if (this.textareaIsShownAtCursor) { // See https://github.com/Microsoft/monaco-editor/issues/320 @@ -233,18 +233,18 @@ export class TextAreaHandler extends Disposable { // --- Clipboard operations - this._register(this.textArea.onCut((e) => { + this._register(dom.addDisposableListener(textArea.domNode, 'cut', (e: ClipboardEvent) => { this._ensureClipboardGetsEditorSelection(e); this.asyncTriggerCut.schedule(); })); - this._register(this.textArea.onCopy((e) => { + this._register(dom.addDisposableListener(textArea.domNode, 'copy', (e: ClipboardEvent) => { this._ensureClipboardGetsEditorSelection(e); })); - this._register(this.textArea.onPaste((e) => { - if (e.canUseTextData()) { - this.executePaste(e.getTextData()); + this._register(dom.addDisposableListener(textArea.domNode, 'paste', (e: ClipboardEvent) => { + if (ClipboardEventUtils.canUseTextData(e)) { + this.executePaste(ClipboardEventUtils.getTextData(e)); } else { if (this.textArea.getSelectionStart() !== this.textArea.getSelectionEnd()) { // Clean up the textarea, to get a clean paste @@ -351,14 +351,14 @@ export class TextAreaHandler extends Disposable { // ------------- Clipboard operations - private _ensureClipboardGetsEditorSelection(e: ClipboardEventWrapper): void { + private _ensureClipboardGetsEditorSelection(e: ClipboardEvent): void { let whatToCopy = this.model.getPlainTextToCopy(this.selections, browser.enableEmptySelectionClipboard); - if (e.canUseTextData()) { + if (ClipboardEventUtils.canUseTextData(e)) { let whatHTMLToCopy: string = null; if (!browser.isEdgeOrIE && (whatToCopy.length < 65536 || CopyOptions.forceCopyWithSyntaxHighlighting)) { whatHTMLToCopy = this.model.getHTMLToCopy(this.selections, browser.enableEmptySelectionClipboard); } - e.setTextData(whatToCopy, whatHTMLToCopy); + ClipboardEventUtils.setTextData(e, whatToCopy, whatHTMLToCopy); } else { this.setTextAreaState('copy or cut', this.textAreaState.fromText(whatToCopy), false); } @@ -377,3 +377,103 @@ export class TextAreaHandler extends Disposable { } } } + +class ClipboardEventUtils { + + public static canUseTextData(e: ClipboardEvent): boolean { + if (e.clipboardData) { + return true; + } + if ((window).clipboardData) { + return true; + } + return false; + } + + public static getTextData(e: ClipboardEvent): string { + if (e.clipboardData) { + e.preventDefault(); + return e.clipboardData.getData('text/plain'); + } + + if ((window).clipboardData) { + e.preventDefault(); + return (window).clipboardData.getData('Text'); + } + + throw new Error('ClipboardEventUtils.getTextData: Cannot use text data!'); + } + + public static setTextData(e: ClipboardEvent, text: string, richText: string): void { + if (e.clipboardData) { + e.clipboardData.setData('text/plain', text); + if (richText !== null) { + e.clipboardData.setData('text/html', richText); + } + e.preventDefault(); + return; + } + + if ((window).clipboardData) { + (window).clipboardData.setData('Text', text); + e.preventDefault(); + return; + } + + throw new Error('ClipboardEventUtils.setTextData: Cannot use text data!'); + } +} + +class TextAreaWrapper extends Disposable implements ITextAreaWrapper { + + private readonly _actual: FastDomNode; + + constructor(_textArea: FastDomNode) { + super(); + this._actual = _textArea; + } + + public getValue(): string { + // console.log('current value: ' + this._textArea.value); + return this._actual.domNode.value; + } + + public setValue(reason: string, value: string): void { + // console.log('reason: ' + reason + ', current value: ' + this._textArea.value + ' => new value: ' + value); + this._actual.domNode.value = value; + } + + public getSelectionStart(): number { + return this._actual.domNode.selectionStart; + } + + public getSelectionEnd(): number { + return this._actual.domNode.selectionEnd; + } + + public setSelectionRange(selectionStart: number, selectionEnd: number): void { + const textArea = this._actual.domNode; + if (document.activeElement === textArea) { + textArea.setSelectionRange(selectionStart, selectionEnd); + } else { + // If the focus is outside the textarea, browsers will try really hard to reveal the textarea. + // Here, we try to undo the browser's desperate reveal. + try { + const scrollState = dom.saveParentsScrollTop(textArea); + textArea.focus(); + textArea.setSelectionRange(selectionStart, selectionEnd); + dom.restoreParentsScrollTop(textArea, scrollState); + } catch (e) { + // Sometimes IE throws when setting selection (e.g. textarea is off-DOM) + } + } + } + + public isInOverwriteMode(): boolean { + // In IE, pressing Insert will bring the typing into overwrite mode + if (browser.isIE && document.queryCommandValue('OverWrite')) { + return true; + } + return false; + } +} diff --git a/src/vs/editor/browser/controller/textAreaState.ts b/src/vs/editor/browser/controller/textAreaState.ts index 8f2500c4761..6b55e6e5db7 100644 --- a/src/vs/editor/browser/controller/textAreaState.ts +++ b/src/vs/editor/browser/controller/textAreaState.ts @@ -10,7 +10,7 @@ import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; import { Position } from 'vs/editor/common/core/position'; import { Constants } from 'vs/editor/common/core/uint'; -export interface ISimpleTextAreaWrapper { +export interface ITextAreaWrapper { getValue(): string; setValue(reason: string, value: string): void; getSelectionStart(): number; @@ -82,7 +82,7 @@ export abstract class TextAreaState { public abstract equals(other: TextAreaState): boolean; - public abstract fromTextArea(textArea: ISimpleTextAreaWrapper): TextAreaState; + public abstract fromTextArea(textArea: ITextAreaWrapper): TextAreaState; public abstract fromEditorSelection(model: ISimpleModel, selection: Range); @@ -113,7 +113,7 @@ export abstract class TextAreaState { return this.value; } - public applyToTextArea(reason: string, textArea: ISimpleTextAreaWrapper, select: boolean): void { + public applyToTextArea(reason: string, textArea: ITextAreaWrapper, select: boolean): void { // console.log(Date.now() + ': applyToTextArea ' + reason + ': ' + this.toString()); if (textArea.getValue() !== this.value) { textArea.setValue(reason, this.value); @@ -243,7 +243,7 @@ export class IENarratorTextAreaState extends TextAreaState { return false; } - public fromTextArea(textArea: ISimpleTextAreaWrapper): TextAreaState { + public fromTextArea(textArea: ITextAreaWrapper): TextAreaState { return new IENarratorTextAreaState(this, textArea.getValue(), textArea.getSelectionStart(), textArea.getSelectionEnd(), textArea.isInOverwriteMode(), this.selectionToken); } @@ -344,7 +344,7 @@ export class NVDAPagedTextAreaState extends TextAreaState { return false; } - public fromTextArea(textArea: ISimpleTextAreaWrapper): TextAreaState { + public fromTextArea(textArea: ITextAreaWrapper): TextAreaState { return new NVDAPagedTextAreaState(this, textArea.getValue(), textArea.getSelectionStart(), textArea.getSelectionEnd(), textArea.isInOverwriteMode()); } @@ -453,7 +453,7 @@ export class NVDAFullTextAreaState extends TextAreaState { return false; } - public fromTextArea(textArea: ISimpleTextAreaWrapper): TextAreaState { + public fromTextArea(textArea: ITextAreaWrapper): TextAreaState { return new NVDAFullTextAreaState(this, textArea.getValue(), textArea.getSelectionStart(), textArea.getSelectionEnd(), textArea.isInOverwriteMode()); } diff --git a/src/vs/editor/test/browser/controller/textAreaState.test.ts b/src/vs/editor/test/browser/controller/textAreaState.test.ts index ed1a3b4f71f..3513a18c665 100644 --- a/src/vs/editor/test/browser/controller/textAreaState.test.ts +++ b/src/vs/editor/test/browser/controller/textAreaState.test.ts @@ -5,13 +5,13 @@ 'use strict'; import * as assert from 'assert'; -import { IENarratorTextAreaState, ISimpleModel, TextAreaState, ISimpleTextAreaWrapper } from 'vs/editor/browser/controller/textAreaState'; +import { IENarratorTextAreaState, ISimpleModel, TextAreaState, ITextAreaWrapper } from 'vs/editor/browser/controller/textAreaState'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; import { Disposable } from 'vs/base/common/lifecycle'; -export class MockTextAreaWrapper extends Disposable implements ISimpleTextAreaWrapper { +export class MockTextAreaWrapper extends Disposable implements ITextAreaWrapper { public _value: string; public _selectionStart: number; From c3ce62100a04ad9fa629b284dcc1a44d599ae478 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 May 2017 18:48:54 +0200 Subject: [PATCH 0066/1164] Debt: Simplify TextAreaHandler --- .../browser/controller/keyboardHandler.ts | 72 +++++- .../browser/controller/textAreaHandler.ts | 237 ++++++++---------- .../browser/controller/textAreaState.ts | 13 +- src/vs/editor/common/viewModel/viewModel.ts | 2 - .../editor/common/viewModel/viewModelImpl.ts | 10 +- .../test/browser/controller/imeTester.ts | 32 +-- .../browser/controller/textAreaState.test.ts | 23 -- 7 files changed, 173 insertions(+), 216 deletions(-) diff --git a/src/vs/editor/browser/controller/keyboardHandler.ts b/src/vs/editor/browser/controller/keyboardHandler.ts index c1b61ce4af0..d40903f2940 100644 --- a/src/vs/editor/browser/controller/keyboardHandler.ts +++ b/src/vs/editor/browser/controller/keyboardHandler.ts @@ -7,8 +7,8 @@ import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; import { GlobalScreenReaderNVDA } from 'vs/editor/common/config/commonEditorConfig'; -import { TextAreaHandler } from 'vs/editor/browser/controller/textAreaHandler'; -import { TextAreaStrategy } from 'vs/editor/browser/controller/textAreaState'; +import { TextAreaHandler, ITextAreaHandlerHost } from 'vs/editor/browser/controller/textAreaHandler'; +import { TextAreaStrategy, ISimpleModel } from 'vs/editor/browser/controller/textAreaState'; import { Range } from 'vs/editor/common/core/range'; import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; import { Configuration } from 'vs/editor/browser/config/configuration'; @@ -18,6 +18,7 @@ import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { FastDomNode } from 'vs/base/browser/fastDomNode'; import { VerticalRevealType } from 'vs/editor/common/controller/cursorEvents'; import { ViewController } from 'vs/editor/browser/view/viewController'; +import { EndOfLinePreference } from "vs/editor/common/editorCommon"; export interface IKeyboardHandlerHelper { viewDomNode: FastDomNode; @@ -41,16 +42,20 @@ export class KeyboardHandler extends ViewEventHandler { private _context: ViewContext; private viewController: ViewController; - private viewHelper: IKeyboardHandlerHelper; private textArea: FastDomNode; - private textAreaHandler: TextAreaHandler; + private viewHelper: IKeyboardHandlerHelper; + private visiblePosition: TextAreaVisiblePosition; private contentLeft: number; private contentWidth: number; private scrollLeft: number; private scrollTop: number; - private visiblePosition: TextAreaVisiblePosition; + private _selections: Range[]; + private _lastCopiedValue: string; + private _lastCopiedValueIsFromEmptySelection: boolean; + + private textAreaHandler: TextAreaHandler; constructor(context: ViewContext, viewController: ViewController, viewHelper: IKeyboardHandlerHelper) { super(); @@ -67,11 +72,55 @@ export class KeyboardHandler extends ViewEventHandler { this.scrollLeft = 0; this.scrollTop = 0; - this.textAreaHandler = new TextAreaHandler(this._getStrategy(), this.textArea, this._context.model); + this._selections = [new Range(1, 1, 1, 1)]; + this._lastCopiedValue = null; + this._lastCopiedValueIsFromEmptySelection = false; + + const textAreaHandlerHost: ITextAreaHandlerHost = { + getPlainTextToCopy: (): string => { + const whatToCopy = this._context.model.getPlainTextToCopy(this._selections, browser.enableEmptySelectionClipboard); + + if (browser.enableEmptySelectionClipboard) { + if (browser.isFirefox) { + // When writing "LINE\r\n" to the clipboard and then pasting, + // Firefox pastes "LINE\n", so let's work around this quirk + this._lastCopiedValue = whatToCopy.replace(/\r\n/g, '\n'); + } else { + this._lastCopiedValue = whatToCopy; + } + + let selections = this._selections; + this._lastCopiedValueIsFromEmptySelection = (selections.length === 1 && selections[0].isEmpty()); + } + + return whatToCopy; + }, + getHTMLToCopy: (): string => { + return this._context.model.getHTMLToCopy(this._selections, browser.enableEmptySelectionClipboard); + } + }; + const simpleModel: ISimpleModel = { + getLineCount: (): number => { + return this._context.model.getLineCount(); + }, + getLineMaxColumn: (lineNumber: number): number => { + return this._context.model.getLineMaxColumn(lineNumber); + }, + getValueInRange: (range: Range, eol: EndOfLinePreference): string => { + return this._context.model.getValueInRange(range, eol); + } + }; + this.textAreaHandler = new TextAreaHandler(textAreaHandlerHost, this._getStrategy(), this.textArea, simpleModel); this._register(this.textAreaHandler.onKeyDown((e) => this.viewController.emitKeyDown(e))); this._register(this.textAreaHandler.onKeyUp((e) => this.viewController.emitKeyUp(e))); - this._register(this.textAreaHandler.onPaste((e) => this.viewController.paste('keyboard', e.text, e.pasteOnNewLine))); + this._register(this.textAreaHandler.onPaste((e) => { + let pasteOnNewLine = false; + if (browser.enableEmptySelectionClipboard) { + pasteOnNewLine = (e.text === this._lastCopiedValue && this._lastCopiedValueIsFromEmptySelection); + } + this.viewController.paste('keyboard', e.text, pasteOnNewLine); + })); this._register(this.textAreaHandler.onCut((e) => this.viewController.cut('keyboard'))); this._register(this.textAreaHandler.onType((e) => { if (e.replaceCharCnt) { @@ -80,9 +129,9 @@ export class KeyboardHandler extends ViewEventHandler { this.viewController.type('keyboard', e.text); } })); - this._register(this.textAreaHandler.onCompositionStart((e) => { - const lineNumber = e.showAtLineNumber; - const column = e.showAtColumn; + this._register(this.textAreaHandler.onCompositionStart(() => { + const lineNumber = this._selections[0].startLineNumber; + const column = this._selections[0].startColumn; this._context.privateViewEventBus.emit(new viewEvents.ViewRevealRangeRequestEvent( new Range(lineNumber, column, lineNumber, column), @@ -132,7 +181,7 @@ export class KeyboardHandler extends ViewEventHandler { } })); - this._register(this.textAreaHandler.onCompositionEnd((e) => { + this._register(this.textAreaHandler.onCompositionEnd(() => { this.textArea.unsetHeight(); this.textArea.unsetWidth(); this.textArea.setLeft(0); @@ -190,6 +239,7 @@ export class KeyboardHandler extends ViewEventHandler { private _lastCursorSelectionChanged: viewEvents.ViewCursorSelectionChangedEvent = null; public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { + this._selections = [e.selection].concat(e.secondarySelections); this._lastCursorSelectionChanged = e; return false; } diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index 8f0caefae58..78517360e70 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -32,12 +32,6 @@ const enum ReadFromTextArea { export interface IPasteData { text: string; - pasteOnNewLine: boolean; -} - -export interface ICompositionStartData { - showAtLineNumber: number; - showAtColumn: number; } // See https://github.com/Microsoft/monaco-editor/issues/320 @@ -47,6 +41,11 @@ const isChromev55_v56 = ( && navigator.userAgent.indexOf('Edge/') === -1 ); +export interface ITextAreaHandlerHost { + getPlainTextToCopy(): string; + getHTMLToCopy(): string; +} + export class TextAreaHandler extends Disposable { private _onKeyDown = this._register(new Emitter()); @@ -64,72 +63,81 @@ export class TextAreaHandler extends Disposable { private _onType = this._register(new Emitter()); public onType: Event = this._onType.event; - private _onCompositionStart = this._register(new Emitter()); - public onCompositionStart: Event = this._onCompositionStart.event; + private _onCompositionStart = this._register(new Emitter()); + public onCompositionStart: Event = this._onCompositionStart.event; private _onCompositionUpdate = this._register(new Emitter()); public onCompositionUpdate: Event = this._onCompositionUpdate.event; - private _onCompositionEnd = this._register(new Emitter()); - public onCompositionEnd: Event = this._onCompositionEnd.event; + private _onCompositionEnd = this._register(new Emitter()); + public onCompositionEnd: Event = this._onCompositionEnd.event; - private textArea: TextAreaWrapper; - private model: ISimpleModel; + // --- - private selection: Range; - private selections: Range[]; - private hasFocus: boolean; + private readonly _host: ITextAreaHandlerHost; + private readonly _textArea: TextAreaWrapper; + private readonly _model: ISimpleModel; - private asyncTriggerCut: RunOnceScheduler; + private _selection: Range; + private _hasFocus: boolean; - private textAreaState: TextAreaState; - private textareaIsShownAtCursor: boolean; + private readonly _asyncTriggerCut: RunOnceScheduler; - private lastCopiedValue: string; - private lastCopiedValueIsFromEmptySelection: boolean; + private _textAreaState: TextAreaState; + private _isDoingComposition: boolean; private _nextCommand: ReadFromTextArea; - constructor(strategy: TextAreaStrategy, textArea: FastDomNode, model: ISimpleModel) { + constructor(host: ITextAreaHandlerHost, strategy: TextAreaStrategy, textArea: FastDomNode, model: ISimpleModel) { super(); - this.textArea = this._register(new TextAreaWrapper(textArea)); - this.model = model; - this.selection = new Range(1, 1, 1, 1); - this.selections = [new Range(1, 1, 1, 1)]; + this._host = host; + this._textArea = this._register(new TextAreaWrapper(textArea)); + this._model = model; + + this._selection = new Range(1, 1, 1, 1); + this._hasFocus = false; + + this._asyncTriggerCut = this._register(new RunOnceScheduler(() => this._onCut.fire(), 0)); + + this._textAreaState = createTextAreaState(strategy); + this._isDoingComposition = false; + this._nextCommand = ReadFromTextArea.Type; - this.asyncTriggerCut = this._register(new RunOnceScheduler(() => this._onCut.fire(), 0)); + this._register(dom.addStandardDisposableListener(textArea.domNode, 'keydown', (e: IKeyboardEvent) => { + if (this._isDoingComposition && e.equals(KeyCode.KEY_IN_COMPOSITION)) { + // Stop propagation for keyDown events if the IME is processing key input + e.stopPropagation(); + } - this.lastCopiedValue = null; - this.lastCopiedValueIsFromEmptySelection = false; - this.textAreaState = createTextAreaState(strategy); + if (e.equals(KeyCode.Escape)) { + // Prevent default always for `Esc`, otherwise it will generate a keypress + // See https://msdn.microsoft.com/en-us/library/ie/ms536939(v=vs.85).aspx + e.preventDefault(); + } + this._onKeyDown.fire(e); + })); - this.hasFocus = false; + this._register(dom.addStandardDisposableListener(textArea.domNode, 'keyup', (e: IKeyboardEvent) => { + this._onKeyUp.fire(e); + })); - this._register(dom.addStandardDisposableListener(textArea.domNode, 'keydown', (e: IKeyboardEvent) => this._onKeyDownHandler(e))); - this._register(dom.addStandardDisposableListener(textArea.domNode, 'keyup', (e: IKeyboardEvent) => this._onKeyUp.fire(e))); - this._register(dom.addStandardDisposableListener(textArea.domNode, 'keypress', (e: IKeyboardEvent) => this._onKeyPressHandler(e))); - - this.textareaIsShownAtCursor = false; let compositionLocale = null; this._register(dom.addDisposableListener(textArea.domNode, 'compositionstart', (e: CompositionEvent) => { - if (this.textareaIsShownAtCursor) { + if (this._isDoingComposition) { return; } - this.textareaIsShownAtCursor = true; + this._isDoingComposition = true; // In IE we cannot set .value when handling 'compositionstart' because the entire composition will get canceled. if (!browser.isEdgeOrIE) { - this.setTextAreaState('compositionstart', this.textAreaState.toEmpty(), false); + this.setTextAreaState('compositionstart', this._textAreaState.toEmpty(), false); } - this._onCompositionStart.fire({ - showAtLineNumber: this.selection.startLineNumber, - showAtColumn: this.selection.startColumn - }); + this._onCompositionStart.fire(); })); this._register(dom.addDisposableListener(textArea.domNode, 'compositionupdate', (e: CompositionEvent) => { @@ -148,75 +156,55 @@ export class TextAreaHandler extends Disposable { // Multi-part Japanese compositions reset cursor in Edge/IE, Chinese and Korean IME don't have this issue. // The reason that we can't use this path for all CJK IME is IE and Edge behave differently when handling Korean IME, // which breaks this path of code. - this.textAreaState = this.textAreaState.fromTextArea(this.textArea); - let typeInput = this.textAreaState.deduceInput(); + this._textAreaState = this._textAreaState.fromTextArea(this._textArea); + let typeInput = this._textAreaState.deduceInput(); this._onType.fire(typeInput); this._onCompositionUpdate.fire(e); return; } - this.textAreaState = this.textAreaState.fromText(e.data); - let typeInput = this.textAreaState.updateComposition(); + this._textAreaState = this._textAreaState.fromText(e.data); + let typeInput = this._textAreaState.updateComposition(); this._onType.fire(typeInput); this._onCompositionUpdate.fire(e); })); - let readFromTextArea = () => { - let tempTextAreaState = this.textAreaState.fromTextArea(this.textArea); - let typeInput = tempTextAreaState.deduceInput(); - if (typeInput.replaceCharCnt === 0 && typeInput.text.length === 1 && strings.isHighSurrogate(typeInput.text.charCodeAt(0))) { - // Ignore invalid input but keep it around for next time - return; - } - - this.textAreaState = tempTextAreaState; - // console.log('==> DEDUCED INPUT: ' + JSON.stringify(typeInput)); - if (this._nextCommand === ReadFromTextArea.Type) { - if (typeInput.text !== '') { - this._onType.fire(typeInput); - } - } else { - this.executePaste(typeInput.text); - this._nextCommand = ReadFromTextArea.Type; - } - }; - this._register(dom.addDisposableListener(textArea.domNode, 'compositionend', (e: CompositionEvent) => { // console.log('onCompositionEnd: ' + e.data); if (browser.isEdgeOrIE && e.locale === 'ja') { // https://github.com/Microsoft/monaco-editor/issues/339 - this.textAreaState = this.textAreaState.fromTextArea(this.textArea); - let typeInput = this.textAreaState.deduceInput(); + this._textAreaState = this._textAreaState.fromTextArea(this._textArea); + let typeInput = this._textAreaState.deduceInput(); this._onType.fire(typeInput); } else { - this.textAreaState = this.textAreaState.fromText(e.data); - let typeInput = this.textAreaState.updateComposition(); + this._textAreaState = this._textAreaState.fromText(e.data); + let typeInput = this._textAreaState.updateComposition(); this._onType.fire(typeInput); } // Due to isEdgeOrIE (where the textarea was not cleared initially) and isChrome (the textarea is not updated correctly when composition ends) // we cannot assume the text at the end consists only of the composited text if (browser.isEdgeOrIE || browser.isChrome) { - this.textAreaState = this.textAreaState.fromTextArea(this.textArea); + this._textAreaState = this._textAreaState.fromTextArea(this._textArea); } - if (!this.textareaIsShownAtCursor) { + if (!this._isDoingComposition) { return; } - this.textareaIsShownAtCursor = false; + this._isDoingComposition = false; this._onCompositionEnd.fire(); })); this._register(dom.addDisposableListener(textArea.domNode, 'input', () => { // console.log('onInput: ' + this.textArea.getValue()); - if (this.textareaIsShownAtCursor) { + if (this._isDoingComposition) { // See https://github.com/Microsoft/monaco-editor/issues/320 if (isChromev55_v56) { - let text = this.textArea.getValue(); - this.textAreaState = this.textAreaState.fromText(text); - let typeInput = this.textAreaState.updateComposition(); + let text = this._textArea.getValue(); + this._textAreaState = this._textAreaState.fromText(text); + let typeInput = this._textAreaState.updateComposition(); this._onType.fire(typeInput); let e = { locale: compositionLocale, @@ -228,14 +216,30 @@ export class TextAreaHandler extends Disposable { return; } - readFromTextArea(); + let tempTextAreaState = this._textAreaState.fromTextArea(this._textArea); + let typeInput = tempTextAreaState.deduceInput(); + if (typeInput.replaceCharCnt === 0 && typeInput.text.length === 1 && strings.isHighSurrogate(typeInput.text.charCodeAt(0))) { + // Ignore invalid input but keep it around for next time + return; + } + + this._textAreaState = tempTextAreaState; + // console.log('==> DEDUCED INPUT: ' + JSON.stringify(typeInput)); + if (this._nextCommand === ReadFromTextArea.Type) { + if (typeInput.text !== '') { + this._onType.fire(typeInput); + } + } else { + this.executePaste(typeInput.text); + this._nextCommand = ReadFromTextArea.Type; + } })); // --- Clipboard operations this._register(dom.addDisposableListener(textArea.domNode, 'cut', (e: ClipboardEvent) => { this._ensureClipboardGetsEditorSelection(e); - this.asyncTriggerCut.schedule(); + this._asyncTriggerCut.schedule(); })); this._register(dom.addDisposableListener(textArea.domNode, 'copy', (e: ClipboardEvent) => { @@ -246,9 +250,9 @@ export class TextAreaHandler extends Disposable { if (ClipboardEventUtils.canUseTextData(e)) { this.executePaste(ClipboardEventUtils.getTextData(e)); } else { - if (this.textArea.getSelectionStart() !== this.textArea.getSelectionEnd()) { + if (this._textArea.getSelectionStart() !== this._textArea.getSelectionEnd()) { // Clean up the textarea, to get a clean paste - this.setTextAreaState('paste', this.textAreaState.toEmpty(), false); + this.setTextAreaState('paste', this._textAreaState.toEmpty(), false); } this._nextCommand = ReadFromTextArea.Paste; } @@ -264,56 +268,34 @@ export class TextAreaHandler extends Disposable { // --- begin event handlers public setStrategy(strategy: TextAreaStrategy): void { - this.textAreaState = this.textAreaState.toStrategy(strategy); + this._textAreaState = this._textAreaState.toStrategy(strategy); } public setHasFocus(isFocused: boolean): void { - if (this.hasFocus === isFocused) { + if (this._hasFocus === isFocused) { // no change return; } - this.hasFocus = isFocused; - if (this.hasFocus) { + this._hasFocus = isFocused; + if (this._hasFocus) { this._writePlaceholderAndSelectTextArea('focusgain', false); } } public setCursorSelections(primary: Range, secondary: Range[]): void { - this.selection = primary; - this.selections = [primary].concat(secondary); + this._selection = primary; this._writePlaceholderAndSelectTextArea('selection changed', false); } // --- end event handlers private setTextAreaState(reason: string, textAreaState: TextAreaState, forceFocus: boolean): void { - if (!this.hasFocus) { + if (!this._hasFocus) { textAreaState = textAreaState.resetSelection(); } - textAreaState.applyToTextArea(reason, this.textArea, this.hasFocus || forceFocus); - this.textAreaState = textAreaState; - } - - private _onKeyDownHandler(e: IKeyboardEvent): void { - if (this.textareaIsShownAtCursor && e.equals(KeyCode.KEY_IN_COMPOSITION)) { - // Stop propagation for keyDown events if the IME is processing key input - e.stopPropagation(); - } - - if (e.equals(KeyCode.Escape)) { - // Prevent default always for `Esc`, otherwise it will generate a keypress - // See https://msdn.microsoft.com/en-us/library/ie/ms536939(v=vs.85).aspx - e.preventDefault(); - } - this._onKeyDown.fire(e); - } - - private _onKeyPressHandler(e: IKeyboardEvent): void { - if (!this.hasFocus) { - // Sometimes, when doing Alt-Tab, in FF, a 'keypress' is sent before a 'focus' - return; - } + textAreaState.applyToTextArea(reason, this._textArea, this._hasFocus || forceFocus); + this._textAreaState = textAreaState; } // ------------- Operations that are always executed asynchronously @@ -322,14 +304,8 @@ export class TextAreaHandler extends Disposable { if (txt === '') { return; } - - let pasteOnNewLine = false; - if (browser.enableEmptySelectionClipboard) { - pasteOnNewLine = (txt === this.lastCopiedValue && this.lastCopiedValueIsFromEmptySelection); - } this._onPaste.fire({ - text: txt, - pasteOnNewLine: pasteOnNewLine + text: txt }); } @@ -338,13 +314,13 @@ export class TextAreaHandler extends Disposable { } private _writePlaceholderAndSelectTextArea(reason: string, forceFocus: boolean): void { - if (!this.textareaIsShownAtCursor) { + if (!this._isDoingComposition) { // Do not write to the textarea if it is visible. if (browser.isIPad) { // Do not place anything in the textarea for the iPad - this.setTextAreaState(reason, this.textAreaState.toEmpty(), forceFocus); + this.setTextAreaState(reason, this._textAreaState.toEmpty(), forceFocus); } else { - this.setTextAreaState(reason, this.textAreaState.fromEditorSelection(this.model, this.selection), forceFocus); + this.setTextAreaState(reason, this._textAreaState.fromEditorSelection(this._model, this._selection), forceFocus); } } } @@ -352,28 +328,15 @@ export class TextAreaHandler extends Disposable { // ------------- Clipboard operations private _ensureClipboardGetsEditorSelection(e: ClipboardEvent): void { - let whatToCopy = this.model.getPlainTextToCopy(this.selections, browser.enableEmptySelectionClipboard); + let whatToCopy = this._host.getPlainTextToCopy(); if (ClipboardEventUtils.canUseTextData(e)) { let whatHTMLToCopy: string = null; if (!browser.isEdgeOrIE && (whatToCopy.length < 65536 || CopyOptions.forceCopyWithSyntaxHighlighting)) { - whatHTMLToCopy = this.model.getHTMLToCopy(this.selections, browser.enableEmptySelectionClipboard); + whatHTMLToCopy = this._host.getHTMLToCopy(); } ClipboardEventUtils.setTextData(e, whatToCopy, whatHTMLToCopy); } else { - this.setTextAreaState('copy or cut', this.textAreaState.fromText(whatToCopy), false); - } - - if (browser.enableEmptySelectionClipboard) { - if (browser.isFirefox) { - // When writing "LINE\r\n" to the clipboard and then pasting, - // Firefox pastes "LINE\n", so let's work around this quirk - this.lastCopiedValue = whatToCopy.replace(/\r\n/g, '\n'); - } else { - this.lastCopiedValue = whatToCopy; - } - - let selections = this.selections; - this.lastCopiedValueIsFromEmptySelection = (selections.length === 1 && selections[0].isEmpty()); + this.setTextAreaState('copy or cut', this._textAreaState.fromText(whatToCopy), false); } } } diff --git a/src/vs/editor/browser/controller/textAreaState.ts b/src/vs/editor/browser/controller/textAreaState.ts index 6b55e6e5db7..e5ebbe1e456 100644 --- a/src/vs/editor/browser/controller/textAreaState.ts +++ b/src/vs/editor/browser/controller/textAreaState.ts @@ -7,7 +7,6 @@ import { commonPrefixLength, commonSuffixLength } from 'vs/base/common/strings'; import { Range } from 'vs/editor/common/core/range'; import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; -import { Position } from 'vs/editor/common/core/position'; import { Constants } from 'vs/editor/common/core/uint'; export interface ITextAreaWrapper { @@ -21,17 +20,9 @@ export interface ITextAreaWrapper { } export interface ISimpleModel { - getLineMaxColumn(lineNumber: number): number; - getEOL(): string; - getValueInRange(range: Range, eol: EndOfLinePreference): string; - getModelLineContent(lineNumber: number): string; getLineCount(): number; - getPlainTextToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string; - getHTMLToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string; - - coordinatesConverter: { - convertViewPositionToModelPosition(viewPosition: Position): Position; - }; + getLineMaxColumn(lineNumber: number): number; + getValueInRange(range: Range, eol: EndOfLinePreference): string; } export interface ITypeData { diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index b9ccbc9982e..19a4b265f78 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -112,10 +112,8 @@ export interface IViewModel { getLineMaxColumn(lineNumber: number): number; getLineRenderLineNumber(lineNumber: number): string; getAllOverviewRulerDecorations(): ViewModelDecoration[]; - getEOL(): string; getValueInRange(range: Range, eol: EndOfLinePreference): string; - getModelLineContent(modelLineNumber: number): string; getModelLineMaxColumn(modelLineNumber: number): number; validateModelPosition(modelPosition: IPosition): Position; diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 9a2122971a9..3f75c1f17ce 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -539,19 +539,11 @@ export class ViewModel extends Disposable implements IViewModel { return this.decorations.getAllOverviewRulerDecorations(); } - public getEOL(): string { - return this.model.getEOL(); - } - public getValueInRange(range: Range, eol: editorCommon.EndOfLinePreference): string { var modelRange = this.coordinatesConverter.convertViewRangeToModelRange(range); return this.model.getValueInRange(modelRange, eol); } - public getModelLineContent(modelLineNumber: number): string { - return this.model.getLineContent(modelLineNumber); - } - public getModelLineMaxColumn(modelLineNumber: number): number { return this.model.getLineMaxColumn(modelLineNumber); } @@ -561,7 +553,7 @@ export class ViewModel extends Disposable implements IViewModel { } public getPlainTextToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string { - let newLineCharacter = this.getEOL(); + let newLineCharacter = this.model.getEOL(); if (ranges.length === 1) { let range: Range = ranges[0]; diff --git a/src/vs/editor/test/browser/controller/imeTester.ts b/src/vs/editor/test/browser/controller/imeTester.ts index faaa003cc12..9ee87fcd50f 100644 --- a/src/vs/editor/test/browser/controller/imeTester.ts +++ b/src/vs/editor/test/browser/controller/imeTester.ts @@ -4,11 +4,10 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { TextAreaHandler } from 'vs/editor/browser/controller/textAreaHandler'; +import { TextAreaHandler, ITextAreaHandlerHost } from 'vs/editor/browser/controller/textAreaHandler'; import { TextAreaStrategy, ISimpleModel } from 'vs/editor/browser/controller/textAreaState'; import { Range, IRange } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import { Position } from 'vs/editor/common/core/position'; import { createFastDomNode } from 'vs/base/browser/fastDomNode'; // To run this test, open imeTester.html @@ -18,18 +17,12 @@ class SingleLineTestModel implements ISimpleModel { private _line: string; private _eol: string; - public coordinatesConverter = { - convertViewPositionToModelPosition: (viewPosition: Position): Position => { - return viewPosition; - } - }; - constructor(line: string) { this._line = line; this._eol = '\n'; } - setText(text: string) { + _setText(text: string) { this._line = text; } @@ -37,10 +30,6 @@ class SingleLineTestModel implements ISimpleModel { return this._line.length + 1; } - getEOL(): string { - return this._eol; - } - getValueInRange(range: IRange, eol: editorCommon.EndOfLinePreference): string { return this._line.substring(range.startColumn - 1, range.endColumn - 1); } @@ -52,14 +41,6 @@ class SingleLineTestModel implements ISimpleModel { getLineCount(): number { return 1; } - - public getPlainTextToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string { - return ''; - } - - public getHTMLToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string { - return ''; - } } class TestView { @@ -101,7 +82,12 @@ function doCreateTest(strategy: TextAreaStrategy, description: string, inputStr: let model = new SingleLineTestModel('some text'); - let handler = new TextAreaHandler(strategy, createFastDomNode(input), model); + const textAreaHandlerHost: ITextAreaHandlerHost = { + getPlainTextToCopy: (): string => '', + getHTMLToCopy: (): string => '' + }; + + let handler = new TextAreaHandler(textAreaHandlerHost, strategy, createFastDomNode(input), model); input.onfocus = () => { handler.setHasFocus(true); @@ -135,7 +121,7 @@ function doCreateTest(strategy: TextAreaStrategy, description: string, inputStr: }; let updateModelAndPosition = (text: string, off: number, len: number) => { - model.setText(text); + model._setText(text); updatePosition(off, len); view.paint(output); diff --git a/src/vs/editor/test/browser/controller/textAreaState.test.ts b/src/vs/editor/test/browser/controller/textAreaState.test.ts index 3513a18c665..3ae07ec1733 100644 --- a/src/vs/editor/test/browser/controller/textAreaState.test.ts +++ b/src/vs/editor/test/browser/controller/textAreaState.test.ts @@ -6,7 +6,6 @@ import * as assert from 'assert'; import { IENarratorTextAreaState, ISimpleModel, TextAreaState, ITextAreaWrapper } from 'vs/editor/browser/controller/textAreaState'; -import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; import { Disposable } from 'vs/base/common/lifecycle'; @@ -466,12 +465,6 @@ class SimpleModel implements ISimpleModel { private _lines: string[]; private _eol: string; - public coordinatesConverter = { - convertViewPositionToModelPosition: (viewPosition: Position): Position => { - return viewPosition; - } - }; - constructor(lines: string[], eol: string) { this._lines = lines; this._eol = eol; @@ -493,10 +486,6 @@ class SimpleModel implements ISimpleModel { throw new Error('Unknown EOL preference'); } - public getEOL(): string { - return this._eol; - } - public getValueInRange(range: Range, eol: EndOfLinePreference): string { if (Range.isEmpty(range)) { return ''; @@ -520,19 +509,7 @@ class SimpleModel implements ISimpleModel { return resultLines.join(lineEnding); } - public getModelLineContent(lineNumber: number): string { - return this._lines[lineNumber - 1]; - } - public getLineCount(): number { return this._lines.length; } - - public getPlainTextToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string { - return ''; - } - - public getHTMLToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string { - return ''; - } } From 710b7b45093b38ed73b815e124099e84f06839c6 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 May 2017 19:13:58 +0200 Subject: [PATCH 0067/1164] Fix build --- src/vs/monaco.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 328340dc7ee..e26814d708c 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -2956,8 +2956,8 @@ declare module monaco.editor { */ folding?: boolean; /** - * Enable automatic hiding of non-collapsed fold icons in the gutter - * Defaults to true + * Enable automatic hiding of non-collapsed fold icons in the gutter. + * Defaults to true. */ hideFoldIcons?: boolean; /** From 1a8b7a7dc7c0e06ece542256ae78bd923aba61c8 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 3 May 2017 12:47:53 -0700 Subject: [PATCH 0068/1164] Treat Script Tag Contents in HTML as JS (#25847) **Bug** Script contents in html are treated as typescript instead of javascript **Fix** Explicitly set the script kind to js Fixes #25846 --- extensions/html/server/src/modes/javascriptMode.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/html/server/src/modes/javascriptMode.ts b/extensions/html/server/src/modes/javascriptMode.ts index 0340f1be6b2..c31fb273a2a 100644 --- a/extensions/html/server/src/modes/javascriptMode.ts +++ b/extensions/html/server/src/modes/javascriptMode.ts @@ -30,9 +30,10 @@ export function getJavascriptMode(documentRegions: LanguageModelCache compilerOptions, getScriptFileNames: () => [FILE_NAME, JQUERY_D_TS], + getScriptKind: () => ts.ScriptKind.JS, getScriptVersion: (fileName: string) => { if (fileName === FILE_NAME) { return String(scriptFileVersion); From b8e4c9b894d1ab1082c17c1b5a3e33e5a63119bd Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 3 May 2017 23:01:09 +0200 Subject: [PATCH 0069/1164] Debt: Simplify TextAreaState --- .../browser/controller/keyboardHandler.ts | 4 +- .../browser/controller/textAreaHandler.ts | 175 ++++++---- .../browser/controller/textAreaState.ts | 310 ++++-------------- .../test/browser/controller/imeTester.ts | 17 +- .../browser/controller/textAreaState.test.ts | 212 ++++++------ 5 files changed, 279 insertions(+), 439 deletions(-) diff --git a/src/vs/editor/browser/controller/keyboardHandler.ts b/src/vs/editor/browser/controller/keyboardHandler.ts index d40903f2940..225f4ad4c48 100644 --- a/src/vs/editor/browser/controller/keyboardHandler.ts +++ b/src/vs/editor/browser/controller/keyboardHandler.ts @@ -7,8 +7,8 @@ import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; import { GlobalScreenReaderNVDA } from 'vs/editor/common/config/commonEditorConfig'; -import { TextAreaHandler, ITextAreaHandlerHost } from 'vs/editor/browser/controller/textAreaHandler'; -import { TextAreaStrategy, ISimpleModel } from 'vs/editor/browser/controller/textAreaState'; +import { TextAreaHandler, ITextAreaHandlerHost, TextAreaStrategy } from 'vs/editor/browser/controller/textAreaHandler'; +import { ISimpleModel } from 'vs/editor/browser/controller/textAreaState'; import { Range } from 'vs/editor/common/core/range'; import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; import { Configuration } from 'vs/editor/browser/config/configuration'; diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index 78517360e70..5c613ee8916 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -9,7 +9,7 @@ import * as strings from 'vs/base/common/strings'; import Event, { Emitter } from 'vs/base/common/event'; import { KeyCode } from 'vs/base/common/keyCodes'; import { Disposable } from 'vs/base/common/lifecycle'; -import { ISimpleModel, ITypeData, TextAreaState, TextAreaStrategy, createTextAreaState, ITextAreaWrapper } from 'vs/editor/browser/controller/textAreaState'; +import { ISimpleModel, ITypeData, TextAreaState, ITextAreaWrapper, IENarratorStrategy, NVDAPagedStrategy } from 'vs/editor/browser/controller/textAreaState'; import { Range } from 'vs/editor/common/core/range'; import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; @@ -18,13 +18,17 @@ import { FastDomNode } from "vs/base/browser/fastDomNode"; export interface ICompositionEvent { data: string; - locale: string; } export const CopyOptions = { forceCopyWithSyntaxHighlighting: false }; +export const enum TextAreaStrategy { + IENarrator, + NVDA +} + const enum ReadFromTextArea { Type, Paste @@ -78,6 +82,7 @@ export class TextAreaHandler extends Disposable { private readonly _textArea: TextAreaWrapper; private readonly _model: ISimpleModel; + private _textAreaStrategy: TextAreaStrategy; private _selection: Range; private _hasFocus: boolean; @@ -94,12 +99,13 @@ export class TextAreaHandler extends Disposable { this._textArea = this._register(new TextAreaWrapper(textArea)); this._model = model; + this._textAreaStrategy = strategy; this._selection = new Range(1, 1, 1, 1); this._hasFocus = false; this._asyncTriggerCut = this._register(new RunOnceScheduler(() => this._onCut.fire(), 0)); - this._textAreaState = createTextAreaState(strategy); + this._textAreaState = TextAreaState.EMPTY; this._isDoingComposition = false; this._nextCommand = ReadFromTextArea.Type; @@ -122,30 +128,47 @@ export class TextAreaHandler extends Disposable { this._onKeyUp.fire(e); })); - let compositionLocale = null; - this._register(dom.addDisposableListener(textArea.domNode, 'compositionstart', (e: CompositionEvent) => { - if (this._isDoingComposition) { return; } - this._isDoingComposition = true; // In IE we cannot set .value when handling 'compositionstart' because the entire composition will get canceled. if (!browser.isEdgeOrIE) { - this.setTextAreaState('compositionstart', this._textAreaState.toEmpty(), false); + this._setAndWriteTextAreaState('compositionstart', TextAreaState.EMPTY, false); } this._onCompositionStart.fire(); })); + /** + * Deduce the typed input from a text area's value and the last observed state. + */ + const deduceInputFromTextAreaValue = (): [TextAreaState, ITypeData] => { + const oldState = this._textAreaState; + const newState = this._textAreaState.readFromTextArea(this._textArea); + return [newState, TextAreaState.deduceInput(oldState, newState)]; + }; + + /** + * Deduce the composition input from a string. + */ + const deduceComposition = (text: string): [TextAreaState, ITypeData] => { + const oldState = this._textAreaState; + const newState = TextAreaState.selectedText(text); + const typeInput: ITypeData = { + text: newState.value, + replaceCharCnt: oldState.selectionEnd - oldState.selectionStart + }; + return [newState, typeInput]; + }; + this._register(dom.addDisposableListener(textArea.domNode, 'compositionupdate', (e: CompositionEvent) => { if (isChromev55_v56) { // See https://github.com/Microsoft/monaco-editor/issues/320 // where compositionupdate .data is broken in Chrome v55 and v56 // See https://bugs.chromium.org/p/chromium/issues/detail?id=677050#c9 - compositionLocale = e.locale; // The textArea doesn't get the composition update yet, the value of textarea is still obsolete // so we can't correct e at this moment. return; @@ -156,15 +179,15 @@ export class TextAreaHandler extends Disposable { // Multi-part Japanese compositions reset cursor in Edge/IE, Chinese and Korean IME don't have this issue. // The reason that we can't use this path for all CJK IME is IE and Edge behave differently when handling Korean IME, // which breaks this path of code. - this._textAreaState = this._textAreaState.fromTextArea(this._textArea); - let typeInput = this._textAreaState.deduceInput(); + const [newState, typeInput] = deduceInputFromTextAreaValue(); + this._textAreaState = newState; this._onType.fire(typeInput); this._onCompositionUpdate.fire(e); return; } - this._textAreaState = this._textAreaState.fromText(e.data); - let typeInput = this._textAreaState.updateComposition(); + const [newState, typeInput] = deduceComposition(e.data); + this._textAreaState = newState; this._onType.fire(typeInput); this._onCompositionUpdate.fire(e); })); @@ -173,20 +196,20 @@ export class TextAreaHandler extends Disposable { // console.log('onCompositionEnd: ' + e.data); if (browser.isEdgeOrIE && e.locale === 'ja') { // https://github.com/Microsoft/monaco-editor/issues/339 - this._textAreaState = this._textAreaState.fromTextArea(this._textArea); - let typeInput = this._textAreaState.deduceInput(); + const [newState, typeInput] = deduceInputFromTextAreaValue(); + this._textAreaState = newState; this._onType.fire(typeInput); } else { - this._textAreaState = this._textAreaState.fromText(e.data); - let typeInput = this._textAreaState.updateComposition(); + const [newState, typeInput] = deduceComposition(e.data); + this._textAreaState = newState; this._onType.fire(typeInput); } // Due to isEdgeOrIE (where the textarea was not cleared initially) and isChrome (the textarea is not updated correctly when composition ends) // we cannot assume the text at the end consists only of the composited text if (browser.isEdgeOrIE || browser.isChrome) { - this._textAreaState = this._textAreaState.fromTextArea(this._textArea); + this._textAreaState = this._textAreaState.readFromTextArea(this._textArea); } if (!this._isDoingComposition) { @@ -202,13 +225,12 @@ export class TextAreaHandler extends Disposable { if (this._isDoingComposition) { // See https://github.com/Microsoft/monaco-editor/issues/320 if (isChromev55_v56) { - let text = this._textArea.getValue(); - this._textAreaState = this._textAreaState.fromText(text); - let typeInput = this._textAreaState.updateComposition(); + const [newState, typeInput] = deduceComposition(this._textArea.getValue()); + this._textAreaState = newState; + this._onType.fire(typeInput); - let e = { - locale: compositionLocale, - data: text + let e: ICompositionEvent = { + data: typeInput.text }; this._onCompositionUpdate.fire(e); } @@ -216,8 +238,7 @@ export class TextAreaHandler extends Disposable { return; } - let tempTextAreaState = this._textAreaState.fromTextArea(this._textArea); - let typeInput = tempTextAreaState.deduceInput(); + const [tempTextAreaState, typeInput] = deduceInputFromTextAreaValue(); if (typeInput.replaceCharCnt === 0 && typeInput.text.length === 1 && strings.isHighSurrogate(typeInput.text.charCodeAt(0))) { // Ignore invalid input but keep it around for next time return; @@ -230,7 +251,11 @@ export class TextAreaHandler extends Disposable { this._onType.fire(typeInput); } } else { - this.executePaste(typeInput.text); + if (typeInput.text !== '') { + this._onPaste.fire({ + text: typeInput.text + }); + } this._nextCommand = ReadFromTextArea.Type; } })); @@ -248,11 +273,16 @@ export class TextAreaHandler extends Disposable { this._register(dom.addDisposableListener(textArea.domNode, 'paste', (e: ClipboardEvent) => { if (ClipboardEventUtils.canUseTextData(e)) { - this.executePaste(ClipboardEventUtils.getTextData(e)); + const pastePlainText = ClipboardEventUtils.getTextData(e); + if (pastePlainText !== '') { + this._onPaste.fire({ + text: pastePlainText + }); + } } else { if (this._textArea.getSelectionStart() !== this._textArea.getSelectionEnd()) { // Clean up the textarea, to get a clean paste - this.setTextAreaState('paste', this._textAreaState.toEmpty(), false); + this._setAndWriteTextAreaState('paste', TextAreaState.EMPTY, false); } this._nextCommand = ReadFromTextArea.Paste; } @@ -268,7 +298,12 @@ export class TextAreaHandler extends Disposable { // --- begin event handlers public setStrategy(strategy: TextAreaStrategy): void { - this._textAreaState = this._textAreaState.toStrategy(strategy); + if (this._textAreaStrategy === strategy) { + // no change + return; + } + this._textAreaStrategy = strategy; + this._writePlaceholderAndSelectTextArea('strategy changed', false); } public setHasFocus(isFocused: boolean): void { @@ -289,55 +324,58 @@ export class TextAreaHandler extends Disposable { // --- end event handlers - private setTextAreaState(reason: string, textAreaState: TextAreaState, forceFocus: boolean): void { + private _setAndWriteTextAreaState(reason: string, textAreaState: TextAreaState, forceFocus: boolean): void { if (!this._hasFocus) { - textAreaState = textAreaState.resetSelection(); + textAreaState = textAreaState.collapseSelection(); } - textAreaState.applyToTextArea(reason, this._textArea, this._hasFocus || forceFocus); + textAreaState.writeToTextArea(reason, this._textArea, this._hasFocus || forceFocus); this._textAreaState = textAreaState; } // ------------- Operations that are always executed asynchronously - private executePaste(txt: string): void { - if (txt === '') { - return; - } - this._onPaste.fire({ - text: txt - }); - } - public focusTextArea(): void { this._writePlaceholderAndSelectTextArea('focusTextArea', true); } private _writePlaceholderAndSelectTextArea(reason: string, forceFocus: boolean): void { - if (!this._isDoingComposition) { - // Do not write to the textarea if it is visible. - if (browser.isIPad) { - // Do not place anything in the textarea for the iPad - this.setTextAreaState(reason, this._textAreaState.toEmpty(), forceFocus); - } else { - this.setTextAreaState(reason, this._textAreaState.fromEditorSelection(this._model, this._selection), forceFocus); - } + if (this._isDoingComposition) { + // Do not write to the text area when doing composition + return; + } + + if (browser.isIPad) { + // Do not place anything in the textarea for the iPad + this._setAndWriteTextAreaState(reason, TextAreaState.EMPTY, forceFocus); + + } else if (this._textAreaStrategy === TextAreaStrategy.IENarrator) { + + const newState = IENarratorStrategy.fromEditorSelection(this._textAreaState, this._model, this._selection); + this._setAndWriteTextAreaState(reason, newState, forceFocus); + + } else { + + const newState = NVDAPagedStrategy.fromEditorSelection(this._textAreaState, this._model, this._selection); + this._setAndWriteTextAreaState(reason, newState, forceFocus); + } } - // ------------- Clipboard operations - private _ensureClipboardGetsEditorSelection(e: ClipboardEvent): void { - let whatToCopy = this._host.getPlainTextToCopy(); - if (ClipboardEventUtils.canUseTextData(e)) { - let whatHTMLToCopy: string = null; - if (!browser.isEdgeOrIE && (whatToCopy.length < 65536 || CopyOptions.forceCopyWithSyntaxHighlighting)) { - whatHTMLToCopy = this._host.getHTMLToCopy(); - } - ClipboardEventUtils.setTextData(e, whatToCopy, whatHTMLToCopy); - } else { - this.setTextAreaState('copy or cut', this._textAreaState.fromText(whatToCopy), false); + const copyPlainText = this._host.getPlainTextToCopy(); + if (!ClipboardEventUtils.canUseTextData(e)) { + // Looks like an old browser. The strategy is to place the text + // we'd like to be copied to the clipboard in the textarea and select it. + this._setAndWriteTextAreaState('copy or cut', TextAreaState.selectedText(copyPlainText), false); + return; } + + let copyHTML: string = null; + if (!browser.isEdgeOrIE && (copyPlainText.length < 65536 || CopyOptions.forceCopyWithSyntaxHighlighting)) { + copyHTML = this._host.getHTMLToCopy(); + } + ClipboardEventUtils.setTextData(e, copyPlainText, copyHTML); } } @@ -402,8 +440,13 @@ class TextAreaWrapper extends Disposable implements ITextAreaWrapper { } public setValue(reason: string, value: string): void { + const textArea = this._actual.domNode; + if (textArea.value === value) { + // No change + return; + } // console.log('reason: ' + reason + ', current value: ' + this._textArea.value + ' => new value: ' + value); - this._actual.domNode.value = value; + textArea.value = value; } public getSelectionStart(): number { @@ -431,12 +474,4 @@ class TextAreaWrapper extends Disposable implements ITextAreaWrapper { } } } - - public isInOverwriteMode(): boolean { - // In IE, pressing Insert will bring the typing into overwrite mode - if (browser.isIE && document.queryCommandValue('OverWrite')) { - return true; - } - return false; - } } diff --git a/src/vs/editor/browser/controller/textAreaState.ts b/src/vs/editor/browser/controller/textAreaState.ts index e5ebbe1e456..38e82909a66 100644 --- a/src/vs/editor/browser/controller/textAreaState.ts +++ b/src/vs/editor/browser/controller/textAreaState.ts @@ -12,11 +12,10 @@ import { Constants } from 'vs/editor/common/core/uint'; export interface ITextAreaWrapper { getValue(): string; setValue(reason: string, value: string): void; + getSelectionStart(): number; getSelectionEnd(): number; - setSelectionRange(selectionStart: number, selectionEnd: number): void; - isInOverwriteMode(): boolean; } export interface ISimpleModel { @@ -30,92 +29,60 @@ export interface ITypeData { replaceCharCnt: number; } -export enum TextAreaStrategy { - IENarrator, - NVDA -} +export class TextAreaState { -const USE_NVDA_FULL_TEXT = false; + public static EMPTY = new TextAreaState('', 0, 0, 0); -export function createTextAreaState(strategy: TextAreaStrategy): TextAreaState { - if (strategy === TextAreaStrategy.IENarrator) { - return IENarratorTextAreaState.EMPTY; - } - if (USE_NVDA_FULL_TEXT) { - return NVDAFullTextAreaState.EMPTY; - } - return NVDAPagedTextAreaState.EMPTY; -} + public readonly value: string; + public readonly selectionStart: number; + public readonly selectionEnd: number; + public readonly selectionToken: number; -export abstract class TextAreaState { - - protected previousState: TextAreaState; - protected value: string; - protected selectionStart: number; - protected selectionEnd: number; - protected isInOverwriteMode: boolean; - - constructor(previousState: TextAreaState, value: string, selectionStart: number, selectionEnd: number, isInOverwriteMode: boolean) { - this.previousState = previousState ? previousState.shallowClone() : null; + constructor(value: string, selectionStart: number, selectionEnd: number, selectionToken: number) { this.value = value; this.selectionStart = selectionStart; this.selectionEnd = selectionEnd; - this.isInOverwriteMode = isInOverwriteMode; + this.selectionToken = selectionToken; } - protected abstract shallowClone(): TextAreaState; - - public abstract toEmpty(): TextAreaState; - - public abstract toString(): string; - - public abstract toStrategy(strategy: TextAreaStrategy): TextAreaState; - - public abstract equals(other: TextAreaState): boolean; - - public abstract fromTextArea(textArea: ITextAreaWrapper): TextAreaState; - - public abstract fromEditorSelection(model: ISimpleModel, selection: Range); - - public abstract fromText(text: string): TextAreaState; - - public updateComposition(): ITypeData { - if (!this.previousState) { - // This is the EMPTY state - return { - text: '', - replaceCharCnt: 0 - }; + public equals(other: TextAreaState): boolean { + if (other instanceof TextAreaState) { + return ( + this.value === other.value + && this.selectionStart === other.selectionStart + && this.selectionEnd === other.selectionEnd + && this.selectionToken === other.selectionToken + ); } - - return { - text: this.value, - replaceCharCnt: this.previousState.selectionEnd - this.previousState.selectionStart - }; + return false; } - public abstract resetSelection(): TextAreaState; - - public getSelectionStart(): number { - return this.selectionStart; + public toString(): string { + return '[ <' + this.value + '>, selectionStart: ' + this.selectionStart + ', selectionEnd: ' + this.selectionEnd + ', selectionToken: ' + this.selectionToken + ']'; } - public getValue(): string { - return this.value; + public readFromTextArea(textArea: ITextAreaWrapper): TextAreaState { + return new TextAreaState(textArea.getValue(), textArea.getSelectionStart(), textArea.getSelectionEnd(), this.selectionToken); } - public applyToTextArea(reason: string, textArea: ITextAreaWrapper, select: boolean): void { + public collapseSelection(): TextAreaState { + return new TextAreaState(this.value, this.value.length, this.value.length, this.selectionToken); + } + + public writeToTextArea(reason: string, textArea: ITextAreaWrapper, select: boolean): void { // console.log(Date.now() + ': applyToTextArea ' + reason + ': ' + this.toString()); - if (textArea.getValue() !== this.value) { - textArea.setValue(reason, this.value); - } + textArea.setValue(reason, this.value); if (select) { textArea.setSelectionRange(this.selectionStart, this.selectionEnd); } } - public deduceInput(): ITypeData { - if (!this.previousState) { + public static selectedText(text: string): TextAreaState { + return new TextAreaState(text, 0, text.length, 0); + } + + public static deduceInput(previousState: TextAreaState, currentState: TextAreaState): ITypeData { + if (!previousState) { // This is the EMPTY state return { text: '', @@ -124,15 +91,15 @@ export abstract class TextAreaState { } // console.log('------------------------deduceInput'); - // console.log('CURRENT STATE: ' + this.toString()); - // console.log('PREVIOUS STATE: ' + this.previousState.toString()); + // console.log('CURRENT STATE: ' + currentState.toString()); + // console.log('PREVIOUS STATE: ' + prevState.toString()); - let previousValue = this.previousState.value; - let previousSelectionStart = this.previousState.selectionStart; - let previousSelectionEnd = this.previousState.selectionEnd; - let currentValue = this.value; - let currentSelectionStart = this.selectionStart; - let currentSelectionEnd = this.selectionEnd; + let previousValue = previousState.value; + let previousSelectionStart = previousState.selectionStart; + let previousSelectionEnd = previousState.selectionEnd; + let currentValue = currentState.value; + let currentSelectionStart = currentState.selectionStart; + let currentSelectionEnd = currentState.selectionEnd; // Strip the previous suffix from the value (without interfering with the current selection) let previousSuffix = previousValue.substring(previousSelectionEnd); @@ -189,56 +156,9 @@ export abstract class TextAreaState { } } -export class IENarratorTextAreaState extends TextAreaState { - public static EMPTY = new IENarratorTextAreaState(null, '', 0, 0, false, 0); +export class IENarratorStrategy { - private selectionToken: number; - - constructor(previousState: TextAreaState, value: string, selectionStart: number, selectionEnd: number, isInOverwriteMode: boolean, selectionToken: number) { - super(previousState, value, selectionStart, selectionEnd, isInOverwriteMode); - this.selectionToken = selectionToken; - } - - protected shallowClone(): TextAreaState { - return new IENarratorTextAreaState(null, this.value, this.selectionStart, this.selectionEnd, this.isInOverwriteMode, this.selectionToken); - } - - public toEmpty(): TextAreaState { - return IENarratorTextAreaState.EMPTY; - } - - public toString(): string { - return '[ <' + this.value + '>, selectionStart: ' + this.selectionStart + ', selectionEnd: ' + this.selectionEnd + ', isInOverwriteMode: ' + this.isInOverwriteMode + ', selectionToken: ' + this.selectionToken + ']'; - } - - public toStrategy(strategy: TextAreaStrategy): TextAreaState { - if (strategy === TextAreaStrategy.IENarrator) { - return this; - } - if (USE_NVDA_FULL_TEXT) { - return new NVDAFullTextAreaState(this.previousState, this.value, this.selectionStart, this.selectionEnd, this.isInOverwriteMode); - } - return new NVDAPagedTextAreaState(this.previousState, this.value, this.selectionStart, this.selectionEnd, this.isInOverwriteMode); - } - - public equals(other: TextAreaState): boolean { - if (other instanceof IENarratorTextAreaState) { - return ( - this.value === other.value - && this.selectionStart === other.selectionStart - && this.selectionEnd === other.selectionEnd - && this.isInOverwriteMode === other.isInOverwriteMode - && this.selectionToken === other.selectionToken - ); - } - return false; - } - - public fromTextArea(textArea: ITextAreaWrapper): TextAreaState { - return new IENarratorTextAreaState(this, textArea.getValue(), textArea.getSelectionStart(), textArea.getSelectionEnd(), textArea.isInOverwriteMode(), this.selectionToken); - } - - public fromEditorSelection(model: ISimpleModel, selection: Range): TextAreaState { + public static fromEditorSelection(previousState: TextAreaState, model: ISimpleModel, selection: Range): TextAreaState { let LIMIT_CHARS = 100; let PADDING_LINES_COUNT = 0; @@ -249,7 +169,7 @@ export class IENarratorTextAreaState extends TextAreaState { selectionEndLineNumberMaxColumn = model.getLineMaxColumn(selectionEndLineNumber); // If the selection is empty and we have switched line numbers, expand selection to full line (helps Narrator trigger a full line read) - if (selection.isEmpty() && this.selectionToken !== selectionStartLineNumber) { + if (selection.isEmpty() && previousState && previousState.selectionToken !== selectionStartLineNumber) { selectionStartColumn = 1; selectionEndColumn = selectionEndLineNumberMaxColumn; } @@ -284,79 +204,31 @@ export class IENarratorTextAreaState extends TextAreaState { text = text.substring(0, LIMIT_CHARS) + String.fromCharCode(8230) + text.substring(text.length - LIMIT_CHARS, text.length); } - return new IENarratorTextAreaState(this, pretext + text + posttext, pretext.length, pretext.length + text.length, false, selectionStartLineNumber); - } - - public fromText(text: string): TextAreaState { - return new IENarratorTextAreaState(this, text, 0, text.length, false, 0); - } - - public resetSelection(): TextAreaState { - return new IENarratorTextAreaState(this.previousState, this.value, this.value.length, this.value.length, this.isInOverwriteMode, this.selectionToken); + return new TextAreaState(pretext + text + posttext, pretext.length, pretext.length + text.length, selectionStartLineNumber); } } -export class NVDAPagedTextAreaState extends TextAreaState { - public static EMPTY = new NVDAPagedTextAreaState(null, '', 0, 0, false); +export class NVDAPagedStrategy { private static _LINES_PER_PAGE = 10; - constructor(previousState: TextAreaState, value: string, selectionStart: number, selectionEnd: number, isInOverwriteMode: boolean) { - super(previousState, value, selectionStart, selectionEnd, isInOverwriteMode); - } - - protected shallowClone(): TextAreaState { - return new NVDAPagedTextAreaState(null, this.value, this.selectionStart, this.selectionEnd, this.isInOverwriteMode); - } - - public toEmpty(): TextAreaState { - return NVDAPagedTextAreaState.EMPTY; - } - - public toString(): string { - return '[ <' + this.value + '>, selectionStart: ' + this.selectionStart + ', selectionEnd: ' + this.selectionEnd + ', isInOverwriteMode: ' + this.isInOverwriteMode + ']'; - } - - public toStrategy(strategy: TextAreaStrategy): TextAreaState { - if (strategy === TextAreaStrategy.NVDA) { - return this; - } - return new IENarratorTextAreaState(this.previousState, this.value, this.selectionStart, this.selectionEnd, this.isInOverwriteMode, 0); - } - - public equals(other: TextAreaState): boolean { - if (other instanceof NVDAPagedTextAreaState) { - return ( - this.value === other.value - && this.selectionStart === other.selectionStart - && this.selectionEnd === other.selectionEnd - && this.isInOverwriteMode === other.isInOverwriteMode - ); - } - return false; - } - - public fromTextArea(textArea: ITextAreaWrapper): TextAreaState { - return new NVDAPagedTextAreaState(this, textArea.getValue(), textArea.getSelectionStart(), textArea.getSelectionEnd(), textArea.isInOverwriteMode()); - } - private static _getPageOfLine(lineNumber: number): number { - return Math.floor((lineNumber - 1) / NVDAPagedTextAreaState._LINES_PER_PAGE); + return Math.floor((lineNumber - 1) / NVDAPagedStrategy._LINES_PER_PAGE); } private static _getRangeForPage(page: number): Range { - let offset = page * NVDAPagedTextAreaState._LINES_PER_PAGE; + let offset = page * NVDAPagedStrategy._LINES_PER_PAGE; let startLineNumber = offset + 1; - let endLineNumber = offset + NVDAPagedTextAreaState._LINES_PER_PAGE; + let endLineNumber = offset + NVDAPagedStrategy._LINES_PER_PAGE; return new Range(startLineNumber, 1, endLineNumber, Constants.MAX_SAFE_SMALL_INTEGER); } - public fromEditorSelection(model: ISimpleModel, selection: Range): TextAreaState { + public static fromEditorSelection(previousState: TextAreaState, model: ISimpleModel, selection: Range): TextAreaState { - let selectionStartPage = NVDAPagedTextAreaState._getPageOfLine(selection.startLineNumber); - let selectionStartPageRange = NVDAPagedTextAreaState._getRangeForPage(selectionStartPage); + let selectionStartPage = NVDAPagedStrategy._getPageOfLine(selection.startLineNumber); + let selectionStartPageRange = NVDAPagedStrategy._getRangeForPage(selectionStartPage); - let selectionEndPage = NVDAPagedTextAreaState._getPageOfLine(selection.endLineNumber); - let selectionEndPageRange = NVDAPagedTextAreaState._getRangeForPage(selectionEndPage); + let selectionEndPage = NVDAPagedStrategy._getPageOfLine(selection.endLineNumber); + let selectionEndPageRange = NVDAPagedStrategy._getRangeForPage(selectionEndPage); let pretextRange = selectionStartPageRange.intersectRanges(new Range(1, 1, selection.startLineNumber, selection.startColumn)); let pretext = model.getValueInRange(pretextRange, EndOfLinePreference.LF); @@ -393,76 +265,6 @@ export class NVDAPagedTextAreaState extends TextAreaState { text = text.substring(0, LIMIT_CHARS) + String.fromCharCode(8230) + text.substring(text.length - LIMIT_CHARS, text.length); } - return new NVDAPagedTextAreaState(this, pretext + text + posttext, pretext.length, pretext.length + text.length, false); - } - - public fromText(text: string): TextAreaState { - return new NVDAPagedTextAreaState(this, text, 0, text.length, false); - } - - public resetSelection(): TextAreaState { - return new NVDAPagedTextAreaState(this.previousState, this.value, this.value.length, this.value.length, this.isInOverwriteMode); - } -} - - -export class NVDAFullTextAreaState extends TextAreaState { - public static EMPTY = new NVDAFullTextAreaState(null, '', 0, 0, false); - - constructor(previousState: TextAreaState, value: string, selectionStart: number, selectionEnd: number, isInOverwriteMode: boolean) { - super(previousState, value, selectionStart, selectionEnd, isInOverwriteMode); - } - - protected shallowClone(): TextAreaState { - return new NVDAFullTextAreaState(null, this.value, this.selectionStart, this.selectionEnd, this.isInOverwriteMode); - } - - public toEmpty(): TextAreaState { - return NVDAFullTextAreaState.EMPTY; - } - - public toString(): string { - return '[ , selectionStart: ' + this.selectionStart + ', selectionEnd: ' + this.selectionEnd + ', isInOverwriteMode: ' + this.isInOverwriteMode + ']'; - } - - public toStrategy(strategy: TextAreaStrategy): TextAreaState { - if (strategy === TextAreaStrategy.NVDA) { - return this; - } - return new IENarratorTextAreaState(this.previousState, this.value, this.selectionStart, this.selectionEnd, this.isInOverwriteMode, 0); - } - - public equals(other: TextAreaState): boolean { - if (other instanceof NVDAFullTextAreaState) { - return ( - this.value === other.value - && this.selectionStart === other.selectionStart - && this.selectionEnd === other.selectionEnd - && this.isInOverwriteMode === other.isInOverwriteMode - ); - } - return false; - } - - public fromTextArea(textArea: ITextAreaWrapper): TextAreaState { - return new NVDAFullTextAreaState(this, textArea.getValue(), textArea.getSelectionStart(), textArea.getSelectionEnd(), textArea.isInOverwriteMode()); - } - - public fromEditorSelection(model: ISimpleModel, selection: Range): TextAreaState { - let pretext = model.getValueInRange(new Range(1, 1, selection.startLineNumber, selection.startColumn), EndOfLinePreference.LF); - let text = model.getValueInRange(selection, EndOfLinePreference.LF); - let lastLine = model.getLineCount(); - let lastLineMaxColumn = model.getLineMaxColumn(lastLine); - let posttext = model.getValueInRange(new Range(selection.endLineNumber, selection.endColumn, lastLine, lastLineMaxColumn), EndOfLinePreference.LF); - - return new NVDAFullTextAreaState(this, pretext + text + posttext, pretext.length, pretext.length + text.length, false); - } - - public fromText(text: string): TextAreaState { - return new NVDAFullTextAreaState(this, text, 0, text.length, false); - } - - public resetSelection(): TextAreaState { - return new NVDAFullTextAreaState(this.previousState, this.value, this.value.length, this.value.length, this.isInOverwriteMode); + return new TextAreaState(pretext + text + posttext, pretext.length, pretext.length + text.length, selection.startLineNumber); } } diff --git a/src/vs/editor/test/browser/controller/imeTester.ts b/src/vs/editor/test/browser/controller/imeTester.ts index 9ee87fcd50f..97b96d7ec6c 100644 --- a/src/vs/editor/test/browser/controller/imeTester.ts +++ b/src/vs/editor/test/browser/controller/imeTester.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { TextAreaHandler, ITextAreaHandlerHost } from 'vs/editor/browser/controller/textAreaHandler'; -import { TextAreaStrategy, ISimpleModel } from 'vs/editor/browser/controller/textAreaState'; +import { TextAreaHandler, ITextAreaHandlerHost, TextAreaStrategy } from 'vs/editor/browser/controller/textAreaHandler'; +import { ISimpleModel } from 'vs/editor/browser/controller/textAreaState'; import { Range, IRange } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { createFastDomNode } from 'vs/base/browser/fastDomNode'; @@ -67,7 +67,18 @@ function doCreateTest(strategy: TextAreaStrategy, description: string, inputStr: let title = document.createElement('div'); title.className = 'title'; - title.innerHTML = TextAreaStrategy[strategy] + ' strategy: ' + description + '. Type ' + inputStr + ''; + + const toStr = (value: TextAreaStrategy): string => { + if (value === TextAreaStrategy.IENarrator) { + return 'IENarrator'; + } + if (value === TextAreaStrategy.NVDA) { + return 'NVDA'; + } + return '???'; + }; + + title.innerHTML = toStr(strategy) + ' strategy: ' + description + '. Type ' + inputStr + ''; container.appendChild(title); let startBtn = document.createElement('button'); diff --git a/src/vs/editor/test/browser/controller/textAreaState.test.ts b/src/vs/editor/test/browser/controller/textAreaState.test.ts index 3ae07ec1733..9f99fc9a86a 100644 --- a/src/vs/editor/test/browser/controller/textAreaState.test.ts +++ b/src/vs/editor/test/browser/controller/textAreaState.test.ts @@ -5,7 +5,7 @@ 'use strict'; import * as assert from 'assert'; -import { IENarratorTextAreaState, ISimpleModel, TextAreaState, ITextAreaWrapper } from 'vs/editor/browser/controller/textAreaState'; +import { ISimpleModel, TextAreaState, ITextAreaWrapper, IENarratorStrategy } from 'vs/editor/browser/controller/textAreaState'; import { Range } from 'vs/editor/common/core/range'; import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; import { Disposable } from 'vs/base/common/lifecycle'; @@ -15,14 +15,12 @@ export class MockTextAreaWrapper extends Disposable implements ITextAreaWrapper public _value: string; public _selectionStart: number; public _selectionEnd: number; - public _isInOverwriteMode: boolean; constructor() { super(); this._value = ''; this._selectionStart = 0; this._selectionEnd = 0; - this._isInOverwriteMode = false; } public getValue(): string { @@ -59,16 +57,12 @@ export class MockTextAreaWrapper extends Disposable implements ITextAreaWrapper this._selectionStart = selectionStart; this._selectionEnd = selectionEnd; } - - public isInOverwriteMode(): boolean { - return this._isInOverwriteMode; - } } suite('TextAreaState', () => { - function assertTextAreaState(actual: TextAreaState, value: string, selectionStart: number, selectionEnd: number, isInOverwriteMode: boolean, selectionToken: number): void { - let desired = new IENarratorTextAreaState(null, value, selectionStart, selectionEnd, isInOverwriteMode, selectionToken); + function assertTextAreaState(actual: TextAreaState, value: string, selectionStart: number, selectionEnd: number, selectionToken: number): void { + let desired = new TextAreaState(value, selectionStart, selectionEnd, selectionToken); assert.ok(desired.equals(actual), desired.toString() + ' == ' + actual.toString()); } @@ -77,15 +71,14 @@ suite('TextAreaState', () => { textArea._value = 'Hello world!'; textArea._selectionStart = 1; textArea._selectionEnd = 12; - textArea._isInOverwriteMode = false; - let actual = IENarratorTextAreaState.EMPTY.fromTextArea(textArea); + let actual = TextAreaState.EMPTY.readFromTextArea(textArea); - assertTextAreaState(actual, 'Hello world!', 1, 12, false, 0); - assert.equal(actual.getValue(), 'Hello world!'); - assert.equal(actual.getSelectionStart(), 1); + assertTextAreaState(actual, 'Hello world!', 1, 12, 0); + assert.equal(actual.value, 'Hello world!'); + assert.equal(actual.selectionStart, 1); - actual = actual.resetSelection(); - assertTextAreaState(actual, 'Hello world!', 12, 12, false, 0); + actual = actual.collapseSelection(); + assertTextAreaState(actual, 'Hello world!', 12, 12, 0); textArea.dispose(); }); @@ -95,24 +88,23 @@ suite('TextAreaState', () => { textArea._value = 'Hello world!'; textArea._selectionStart = 1; textArea._selectionEnd = 12; - textArea._isInOverwriteMode = false; - let state = new IENarratorTextAreaState(null, 'Hi world!', 2, 2, false, 0); - state.applyToTextArea('test', textArea, false); + let state = new TextAreaState('Hi world!', 2, 2, 0); + state.writeToTextArea('test', textArea, false); assert.equal(textArea._value, 'Hi world!'); assert.equal(textArea._selectionStart, 9); assert.equal(textArea._selectionEnd, 9); - state = new IENarratorTextAreaState(null, 'Hi world!', 3, 3, false, 0); - state.applyToTextArea('test', textArea, false); + state = new TextAreaState('Hi world!', 3, 3, 0); + state.writeToTextArea('test', textArea, false); assert.equal(textArea._value, 'Hi world!'); assert.equal(textArea._selectionStart, 9); assert.equal(textArea._selectionEnd, 9); - state = new IENarratorTextAreaState(null, 'Hi world!', 0, 2, false, 0); - state.applyToTextArea('test', textArea, true); + state = new TextAreaState('Hi world!', 0, 2, 0); + state.writeToTextArea('test', textArea, true); assert.equal(textArea._value, 'Hi world!'); assert.equal(textArea._selectionStart, 0); @@ -121,16 +113,16 @@ suite('TextAreaState', () => { textArea.dispose(); }); - function testDeduceInput(prevState: TextAreaState, value: string, selectionStart: number, selectionEnd: number, isInOverwriteMode: boolean, expected: string, expectedCharReplaceCnt: number): void { + function testDeduceInput(prevState: TextAreaState, value: string, selectionStart: number, selectionEnd: number, expected: string, expectedCharReplaceCnt: number): void { + prevState = prevState || TextAreaState.EMPTY; + let textArea = new MockTextAreaWrapper(); textArea._value = value; textArea._selectionStart = selectionStart; textArea._selectionEnd = selectionEnd; - textArea._isInOverwriteMode = isInOverwriteMode; - let newState = (prevState || IENarratorTextAreaState.EMPTY).fromTextArea(textArea); - - let actual = newState.deduceInput(); + let newState = prevState.readFromTextArea(textArea); + let actual = TextAreaState.deduceInput(prevState, newState); assert.equal(actual.text, expected); assert.equal(actual.replaceCharCnt, expectedCharReplaceCnt); @@ -146,92 +138,92 @@ suite('TextAreaState', () => { // - expected: せんせい // s - // PREVIOUS STATE: [ <>, selectionStart: 0, selectionEnd: 0, isInOverwriteMode: false, selectionToken: 0] - // CURRENT STATE: [ <s>, selectionStart: 0, selectionEnd: 1, isInOverwriteMode: false, selectionToken: 0] + // PREVIOUS STATE: [ <>, selectionStart: 0, selectionEnd: 0, selectionToken: 0] + // CURRENT STATE: [ <s>, selectionStart: 0, selectionEnd: 1, selectionToken: 0] testDeduceInput( - new IENarratorTextAreaState(null, '', 0, 0, false, 0), + TextAreaState.EMPTY, 's', - 0, 1, false, + 0, 1, 's', 0 ); // e - // PREVIOUS STATE: [ <s>, selectionStart: 0, selectionEnd: 1, isInOverwriteMode: false, selectionToken: 0] - // CURRENT STATE: [ <せ>, selectionStart: 0, selectionEnd: 1, isInOverwriteMode: false, selectionToken: 0] + // PREVIOUS STATE: [ <s>, selectionStart: 0, selectionEnd: 1, selectionToken: 0] + // CURRENT STATE: [ <せ>, selectionStart: 0, selectionEnd: 1, selectionToken: 0] testDeduceInput( - new IENarratorTextAreaState(null, 's', 0, 1, false, 0), + new TextAreaState('s', 0, 1, 0), 'せ', - 0, 1, false, + 0, 1, 'せ', 1 ); // n - // PREVIOUS STATE: [ <せ>, selectionStart: 0, selectionEnd: 1, isInOverwriteMode: false, selectionToken: 0] - // CURRENT STATE: [ <せn>, selectionStart: 0, selectionEnd: 2, isInOverwriteMode: false, selectionToken: 0] + // PREVIOUS STATE: [ <せ>, selectionStart: 0, selectionEnd: 1, selectionToken: 0] + // CURRENT STATE: [ <せn>, selectionStart: 0, selectionEnd: 2, selectionToken: 0] testDeduceInput( - new IENarratorTextAreaState(null, 'せ', 0, 1, false, 0), + new TextAreaState('せ', 0, 1, 0), 'せn', - 0, 2, false, + 0, 2, 'せn', 1 ); // n - // PREVIOUS STATE: [ <せn>, selectionStart: 0, selectionEnd: 2, isInOverwriteMode: false, selectionToken: 0] - // CURRENT STATE: [ <せん>, selectionStart: 0, selectionEnd: 2, isInOverwriteMode: false, selectionToken: 0] + // PREVIOUS STATE: [ <せn>, selectionStart: 0, selectionEnd: 2, selectionToken: 0] + // CURRENT STATE: [ <せん>, selectionStart: 0, selectionEnd: 2, selectionToken: 0] testDeduceInput( - new IENarratorTextAreaState(null, 'せn', 0, 2, false, 0), + new TextAreaState('せn', 0, 2, 0), 'せん', - 0, 2, false, + 0, 2, 'せん', 2 ); // s - // PREVIOUS STATE: [ <せん>, selectionStart: 0, selectionEnd: 2, isInOverwriteMode: false, selectionToken: 0] - // CURRENT STATE: [ <せんs>, selectionStart: 0, selectionEnd: 3, isInOverwriteMode: false, selectionToken: 0] + // PREVIOUS STATE: [ <せん>, selectionStart: 0, selectionEnd: 2, selectionToken: 0] + // CURRENT STATE: [ <せんs>, selectionStart: 0, selectionEnd: 3, selectionToken: 0] testDeduceInput( - new IENarratorTextAreaState(null, 'せん', 0, 2, false, 0), + new TextAreaState('せん', 0, 2, 0), 'せんs', - 0, 3, false, + 0, 3, 'せんs', 2 ); // e - // PREVIOUS STATE: [ <せんs>, selectionStart: 0, selectionEnd: 3, isInOverwriteMode: false, selectionToken: 0] - // CURRENT STATE: [ <せんせ>, selectionStart: 0, selectionEnd: 3, isInOverwriteMode: false, selectionToken: 0] + // PREVIOUS STATE: [ <せんs>, selectionStart: 0, selectionEnd: 3, selectionToken: 0] + // CURRENT STATE: [ <せんせ>, selectionStart: 0, selectionEnd: 3, selectionToken: 0] testDeduceInput( - new IENarratorTextAreaState(null, 'せんs', 0, 3, false, 0), + new TextAreaState('せんs', 0, 3, 0), 'せんせ', - 0, 3, false, + 0, 3, 'せんせ', 3 ); // no-op? [was recorded] - // PREVIOUS STATE: [ <せんせ>, selectionStart: 0, selectionEnd: 3, isInOverwriteMode: false, selectionToken: 0] - // CURRENT STATE: [ <せんせ>, selectionStart: 0, selectionEnd: 3, isInOverwriteMode: false, selectionToken: 0] + // PREVIOUS STATE: [ <せんせ>, selectionStart: 0, selectionEnd: 3, selectionToken: 0] + // CURRENT STATE: [ <せんせ>, selectionStart: 0, selectionEnd: 3, selectionToken: 0] testDeduceInput( - new IENarratorTextAreaState(null, 'せんせ', 0, 3, false, 0), + new TextAreaState('せんせ', 0, 3, 0), 'せんせ', - 0, 3, false, + 0, 3, 'せんせ', 3 ); // i - // PREVIOUS STATE: [ <せんせ>, selectionStart: 0, selectionEnd: 3, isInOverwriteMode: false, selectionToken: 0] - // CURRENT STATE: [ <せんせい>, selectionStart: 0, selectionEnd: 4, isInOverwriteMode: false, selectionToken: 0] + // PREVIOUS STATE: [ <せんせ>, selectionStart: 0, selectionEnd: 3, selectionToken: 0] + // CURRENT STATE: [ <せんせい>, selectionStart: 0, selectionEnd: 4, selectionToken: 0] testDeduceInput( - new IENarratorTextAreaState(null, 'せんせ', 0, 3, false, 0), + new TextAreaState('せんせ', 0, 3, 0), 'せんせい', - 0, 4, false, + 0, 4, 'せんせい', 3 ); // ENTER (accept) - // PREVIOUS STATE: [ <せんせい>, selectionStart: 0, selectionEnd: 4, isInOverwriteMode: false, selectionToken: 0] - // CURRENT STATE: [ <せんせい>, selectionStart: 4, selectionEnd: 4, isInOverwriteMode: false, selectionToken: 0] + // PREVIOUS STATE: [ <せんせい>, selectionStart: 0, selectionEnd: 4, selectionToken: 0] + // CURRENT STATE: [ <せんせい>, selectionStart: 4, selectionEnd: 4, selectionToken: 0] testDeduceInput( - new IENarratorTextAreaState(null, 'せんせい', 0, 4, false, 0), + new TextAreaState('せんせい', 0, 4, 0), 'せんせい', - 4, 4, false, + 4, 4, '', 0 ); }); @@ -245,32 +237,32 @@ suite('TextAreaState', () => { // - expected: せんせい // sennsei - // PREVIOUS STATE: [ <せんせい>, selectionStart: 0, selectionEnd: 4, isInOverwriteMode: false, selectionToken: 0] - // CURRENT STATE: [ <せんせい>, selectionStart: 0, selectionEnd: 4, isInOverwriteMode: false, selectionToken: 0] + // PREVIOUS STATE: [ <せんせい>, selectionStart: 0, selectionEnd: 4, selectionToken: 0] + // CURRENT STATE: [ <せんせい>, selectionStart: 0, selectionEnd: 4, selectionToken: 0] testDeduceInput( - new IENarratorTextAreaState(null, 'せんせい', 0, 4, false, 0), + new TextAreaState('せんせい', 0, 4, 0), 'せんせい', - 0, 4, false, + 0, 4, 'せんせい', 4 ); // arrow down - // CURRENT STATE: [ <先生>, selectionStart: 0, selectionEnd: 2, isInOverwriteMode: false, selectionToken: 0] - // PREVIOUS STATE: [ <せんせい>, selectionStart: 0, selectionEnd: 4, isInOverwriteMode: false, selectionToken: 0] + // CURRENT STATE: [ <先生>, selectionStart: 0, selectionEnd: 2, selectionToken: 0] + // PREVIOUS STATE: [ <せんせい>, selectionStart: 0, selectionEnd: 4, selectionToken: 0] testDeduceInput( - new IENarratorTextAreaState(null, 'せんせい', 0, 4, false, 0), + new TextAreaState('せんせい', 0, 4, 0), '先生', - 0, 2, false, + 0, 2, '先生', 4 ); // ENTER (accept) - // PREVIOUS STATE: [ <先生>, selectionStart: 0, selectionEnd: 2, isInOverwriteMode: false, selectionToken: 0] - // CURRENT STATE: [ <先生>, selectionStart: 2, selectionEnd: 2, isInOverwriteMode: false, selectionToken: 0] + // PREVIOUS STATE: [ <先生>, selectionStart: 0, selectionEnd: 2, selectionToken: 0] + // CURRENT STATE: [ <先生>, selectionStart: 2, selectionEnd: 2, selectionToken: 0] testDeduceInput( - new IENarratorTextAreaState(null, '先生', 0, 2, false, 0), + new TextAreaState('先生', 0, 2, 0), '先生', - 2, 2, false, + 2, 2, '', 0 ); }); @@ -279,16 +271,16 @@ suite('TextAreaState', () => { testDeduceInput( null, 'a', - 0, 1, false, + 0, 1, 'a', 0 ); }); test('issue #2586: Replacing selected end-of-line with newline locks up the document', () => { testDeduceInput( - new IENarratorTextAreaState(null, ']\n', 1, 2, false, 0), + new TextAreaState(']\n', 1, 2, 0), ']\n', - 2, 2, false, + 2, 2, '\n', 0 ); }); @@ -297,123 +289,123 @@ suite('TextAreaState', () => { testDeduceInput( null, 'a', - 1, 1, false, + 1, 1, 'a', 0 ); }); test('extractNewText - typing does not cause a selection', () => { testDeduceInput( - new IENarratorTextAreaState(null, '', 0, 0, false, 0), + TextAreaState.EMPTY, 'a', - 0, 1, false, + 0, 1, 'a', 0 ); }); test('extractNewText - had the textarea empty', () => { testDeduceInput( - new IENarratorTextAreaState(null, '', 0, 0, false, 0), + TextAreaState.EMPTY, 'a', - 1, 1, false, + 1, 1, 'a', 0 ); }); test('extractNewText - had the entire line selected', () => { testDeduceInput( - new IENarratorTextAreaState(null, 'Hello world!', 0, 12, false, 0), + new TextAreaState('Hello world!', 0, 12, 0), 'H', - 1, 1, false, + 1, 1, 'H', 0 ); }); test('extractNewText - had previous text 1', () => { testDeduceInput( - new IENarratorTextAreaState(null, 'Hello world!', 12, 12, false, 0), + new TextAreaState('Hello world!', 12, 12, 0), 'Hello world!a', - 13, 13, false, + 13, 13, 'a', 0 ); }); test('extractNewText - had previous text 2', () => { testDeduceInput( - new IENarratorTextAreaState(null, 'Hello world!', 0, 0, false, 0), + new TextAreaState('Hello world!', 0, 0, 0), 'aHello world!', - 1, 1, false, + 1, 1, 'a', 0 ); }); test('extractNewText - had previous text 3', () => { testDeduceInput( - new IENarratorTextAreaState(null, 'Hello world!', 6, 11, false, 0), + new TextAreaState('Hello world!', 6, 11, 0), 'Hello other!', - 11, 11, false, + 11, 11, 'other', 0 ); }); test('extractNewText - IME', () => { testDeduceInput( - new IENarratorTextAreaState(null, '', 0, 0, false, 0), + TextAreaState.EMPTY, 'これは', - 3, 3, false, + 3, 3, 'これは', 0 ); }); test('extractNewText - isInOverwriteMode', () => { testDeduceInput( - new IENarratorTextAreaState(null, 'Hello world!', 0, 0, false, 0), + new TextAreaState('Hello world!', 0, 0, 0), 'Aello world!', - 1, 1, true, + 1, 1, 'A', 0 ); }); test('extractMacReplacedText - does nothing if there is selection', () => { testDeduceInput( - new IENarratorTextAreaState(null, 'Hello world!', 5, 5, false, 0), + new TextAreaState('Hello world!', 5, 5, 0), 'Hellö world!', - 4, 5, false, + 4, 5, 'ö', 0 ); }); test('extractMacReplacedText - does nothing if there is more than one extra char', () => { testDeduceInput( - new IENarratorTextAreaState(null, 'Hello world!', 5, 5, false, 0), + new TextAreaState('Hello world!', 5, 5, 0), 'Hellöö world!', - 5, 5, false, + 5, 5, 'öö', 1 ); }); test('extractMacReplacedText - does nothing if there is more than one changed char', () => { testDeduceInput( - new IENarratorTextAreaState(null, 'Hello world!', 5, 5, false, 0), + new TextAreaState('Hello world!', 5, 5, 0), 'Helöö world!', - 5, 5, false, + 5, 5, 'öö', 2 ); }); test('extractMacReplacedText', () => { testDeduceInput( - new IENarratorTextAreaState(null, 'Hello world!', 5, 5, false, 0), + new TextAreaState('Hello world!', 5, 5, 0), 'Hellö world!', - 5, 5, false, + 5, 5, 'ö', 1 ); }); function testFromEditorSelectionAndPreviousState(eol: string, lines: string[], range: Range, prevSelectionToken: number): TextAreaState { let model = new SimpleModel(lines, eol); - let previousState = new IENarratorTextAreaState(null, '', 0, 0, false, prevSelectionToken); - return previousState.fromEditorSelection(model, range); + let previousState = new TextAreaState('', 0, 0, prevSelectionToken); + return IENarratorStrategy.fromEditorSelection(previousState, model, range); } test('fromEditorSelectionAndPreviousState - no selection on first line', () => { @@ -421,7 +413,7 @@ suite('TextAreaState', () => { 'Just a line', 'And another line' ], new Range(1, 1, 1, 1), 0); - assertTextAreaState(actual, 'Just a line', 0, 11, false, 1); + assertTextAreaState(actual, 'Just a line', 0, 11, 1); }); test('fromEditorSelectionAndPreviousState - no selection on second line', () => { @@ -430,7 +422,7 @@ suite('TextAreaState', () => { 'And another line', 'And yet another line', ], new Range(2, 1, 2, 1), 0); - assertTextAreaState(actual, 'And another line', 0, 16, false, 2); + assertTextAreaState(actual, 'And another line', 0, 16, 2); }); test('fromEditorSelectionAndPreviousState - on a long line with selectionToken mismatch', () => { @@ -443,7 +435,7 @@ suite('TextAreaState', () => { aLongLine, 'And yet another line', ], new Range(2, 500, 2, 500), 0); - assertTextAreaState(actual, 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa…aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 0, 201, false, 2); + assertTextAreaState(actual, 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa…aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 0, 201, 2); }); test('fromEditorSelectionAndPreviousState - on a long line with same selectionToken', () => { @@ -456,7 +448,7 @@ suite('TextAreaState', () => { aLongLine, 'And yet another line', ], new Range(2, 500, 2, 500), 2); - assertTextAreaState(actual, 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 100, 100, false, 2); + assertTextAreaState(actual, 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 100, 100, 2); }); }); From 0e40dd740f26dfcf1b7d2f4cecd0e2bdecf50561 Mon Sep 17 00:00:00 2001 From: Maik Riechert Date: Wed, 3 May 2017 22:53:26 +0100 Subject: [PATCH 0070/1164] add git delete branch command --- extensions/git/package.json | 9 ++++++++ extensions/git/package.nls.json | 1 + extensions/git/src/commands.ts | 39 +++++++++++++++++++++++++++++++++ extensions/git/src/git.ts | 5 +++++ extensions/git/src/model.ts | 7 +++++- 5 files changed, 60 insertions(+), 1 deletion(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index bd3d175c58a..90d477cf594 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -172,6 +172,11 @@ "title": "%command.branch%", "category": "Git" }, + { + "command": "git.deleteBranch", + "title": "%command.deleteBranch%", + "category": "Git" + }, { "command": "git.pull", "title": "%command.pull%", @@ -298,6 +303,10 @@ "command": "git.branch", "when": "config.git.enabled && scmProvider == git && gitState == idle" }, + { + "command": "git.deleteBranch", + "when": "config.git.enabled && scmProvider == git && gitState == idle" + }, { "command": "git.pull", "when": "config.git.enabled && scmProvider == git && gitState == idle" diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index 11c7347fa07..9844e060659 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -21,6 +21,7 @@ "command.undoCommit": "Undo Last Commit", "command.checkout": "Checkout to...", "command.branch": "Create Branch...", + "command.deleteBranch": "Delete Branch...", "command.pull": "Pull", "command.pullRebase": "Pull (Rebase)", "command.push": "Push", diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 399cfd10a16..001532ff9dd 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -60,6 +60,26 @@ class CheckoutRemoteHeadItem extends CheckoutItem { } } +class BranchDeleteItem implements QuickPickItem { + + protected get shortCommit(): string { return (this.ref.commit || '').substr(0, 8); } + protected get treeish(): string | undefined { return this.ref.name; } + get label(): string { return this.ref.name || this.shortCommit; } + get description(): string { return this.shortCommit; } + + constructor(protected ref: Ref) { } + + async run(model: Model): Promise { + const ref = this.treeish; + + if (!ref) { + return; + } + + await model.deleteBranch(ref); + } +} + interface Command { commandId: string; key: string; @@ -671,6 +691,25 @@ export class CommandCenter { await this.model.branch(name); } + @command('git.deleteBranch') + async deleteBranch(branchName: string): Promise { + if (typeof branchName === 'string') { + return await this.model.deleteBranch(branchName); + } + const currentHead = this.model.HEAD && this.model.HEAD.name; + const heads = this.model.refs.filter(ref => ref.type === RefType.Head && ref.name !== currentHead) + .map(ref => new BranchDeleteItem(ref)); + + const placeHolder = 'Select a branch to delete'; + const choice = await window.showQuickPick(heads, { placeHolder }); + + if (!choice) { + return; + } + + await choice.run(this.model); + } + @command('git.pull') async pull(): Promise { const remotes = this.model.remotes; diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 4adc617a3eb..a242d034654 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -650,6 +650,11 @@ export class Repository { await this.run(args); } + async deleteBranch(name: string): Promise { + const args = ['branch', '-d', name]; + await this.run(args); + } + async clean(paths: string[]): Promise { const pathsByGroup = groupBy(paths, p => path.dirname(p)); const groups = Object.keys(pathsByGroup).map(k => pathsByGroup[k]); diff --git a/extensions/git/src/model.ts b/extensions/git/src/model.ts index 1d74a87d3a3..0446a3c5e09 100644 --- a/extensions/git/src/model.ts +++ b/extensions/git/src/model.ts @@ -211,7 +211,8 @@ export enum Operation { Init = 1 << 12, Show = 1 << 13, Stage = 1 << 14, - GetCommitTemplate = 1 << 15 + GetCommitTemplate = 1 << 15, + DeleteBranch = 1 << 16 } // function getOperationName(operation: Operation): string { @@ -454,6 +455,10 @@ export class Model implements Disposable { await this.run(Operation.Branch, () => this.repository.branch(name, true)); } + async deleteBranch(name: string): Promise { + await this.run(Operation.DeleteBranch, () => this.repository.deleteBranch(name)); + } + async checkout(treeish: string): Promise { await this.run(Operation.Checkout, () => this.repository.checkout(treeish, [])); } From 242cb936f0b703a92547c8884dc0c5609eab01e9 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 4 May 2017 00:00:43 +0200 Subject: [PATCH 0071/1164] Fixes #16520 --- .../browser/controller/textAreaHandler.ts | 66 ++++++++-------- .../browser/controller/textAreaState.ts | 27 +++---- .../browser/controller/textAreaState.test.ts | 78 ++++++++++++------- 3 files changed, 97 insertions(+), 74 deletions(-) diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index 5c613ee8916..dad5cd60d02 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -136,7 +136,7 @@ export class TextAreaHandler extends Disposable { // In IE we cannot set .value when handling 'compositionstart' because the entire composition will get canceled. if (!browser.isEdgeOrIE) { - this._setAndWriteTextAreaState('compositionstart', TextAreaState.EMPTY, false); + this._setAndWriteTextAreaState('compositionstart', TextAreaState.EMPTY); } this._onCompositionStart.fire(); @@ -145,10 +145,10 @@ export class TextAreaHandler extends Disposable { /** * Deduce the typed input from a text area's value and the last observed state. */ - const deduceInputFromTextAreaValue = (): [TextAreaState, ITypeData] => { + const deduceInputFromTextAreaValue = (isDoingComposition: boolean): [TextAreaState, ITypeData] => { const oldState = this._textAreaState; const newState = this._textAreaState.readFromTextArea(this._textArea); - return [newState, TextAreaState.deduceInput(oldState, newState)]; + return [newState, TextAreaState.deduceInput(oldState, newState, isDoingComposition)]; }; /** @@ -179,7 +179,7 @@ export class TextAreaHandler extends Disposable { // Multi-part Japanese compositions reset cursor in Edge/IE, Chinese and Korean IME don't have this issue. // The reason that we can't use this path for all CJK IME is IE and Edge behave differently when handling Korean IME, // which breaks this path of code. - const [newState, typeInput] = deduceInputFromTextAreaValue(); + const [newState, typeInput] = deduceInputFromTextAreaValue(true); this._textAreaState = newState; this._onType.fire(typeInput); this._onCompositionUpdate.fire(e); @@ -196,7 +196,7 @@ export class TextAreaHandler extends Disposable { // console.log('onCompositionEnd: ' + e.data); if (browser.isEdgeOrIE && e.locale === 'ja') { // https://github.com/Microsoft/monaco-editor/issues/339 - const [newState, typeInput] = deduceInputFromTextAreaValue(); + const [newState, typeInput] = deduceInputFromTextAreaValue(true); this._textAreaState = newState; this._onType.fire(typeInput); } @@ -238,13 +238,13 @@ export class TextAreaHandler extends Disposable { return; } - const [tempTextAreaState, typeInput] = deduceInputFromTextAreaValue(); + const [newState, typeInput] = deduceInputFromTextAreaValue(false); if (typeInput.replaceCharCnt === 0 && typeInput.text.length === 1 && strings.isHighSurrogate(typeInput.text.charCodeAt(0))) { // Ignore invalid input but keep it around for next time return; } - this._textAreaState = tempTextAreaState; + this._textAreaState = newState; // console.log('==> DEDUCED INPUT: ' + JSON.stringify(typeInput)); if (this._nextCommand === ReadFromTextArea.Type) { if (typeInput.text !== '') { @@ -282,28 +282,33 @@ export class TextAreaHandler extends Disposable { } else { if (this._textArea.getSelectionStart() !== this._textArea.getSelectionEnd()) { // Clean up the textarea, to get a clean paste - this._setAndWriteTextAreaState('paste', TextAreaState.EMPTY, false); + this._setAndWriteTextAreaState('paste', TextAreaState.EMPTY); } this._nextCommand = ReadFromTextArea.Paste; } })); - this._writePlaceholderAndSelectTextArea('ctor', false); + this._writeScreenReaderContent('ctor'); } public dispose(): void { super.dispose(); } - // --- begin event handlers - public setStrategy(strategy: TextAreaStrategy): void { if (this._textAreaStrategy === strategy) { // no change return; } this._textAreaStrategy = strategy; - this._writePlaceholderAndSelectTextArea('strategy changed', false); + this._writeScreenReaderContent('strategy changed'); + } + + public focusTextArea(): void { + // Setting this._hasFocus and writing the screen reader content + // will result in a set selection range in the textarea + this._hasFocus = true; + this._writeScreenReaderContent('focusTextArea'); } public setHasFocus(isFocused: boolean): void { @@ -313,33 +318,31 @@ export class TextAreaHandler extends Disposable { } this._hasFocus = isFocused; if (this._hasFocus) { - this._writePlaceholderAndSelectTextArea('focusgain', false); + if (browser.isEdge) { + // Edge has a bug where setting the selection range while the focus event + // is dispatching doesn't work. To reproduce, "tab into" the editor. + this._setAndWriteTextAreaState('focusgain', TextAreaState.EMPTY); + } else { + this._writeScreenReaderContent('focusgain'); + } } } public setCursorSelections(primary: Range, secondary: Range[]): void { this._selection = primary; - this._writePlaceholderAndSelectTextArea('selection changed', false); + this._writeScreenReaderContent('selection changed'); } - // --- end event handlers - - private _setAndWriteTextAreaState(reason: string, textAreaState: TextAreaState, forceFocus: boolean): void { + private _setAndWriteTextAreaState(reason: string, textAreaState: TextAreaState): void { if (!this._hasFocus) { textAreaState = textAreaState.collapseSelection(); } - textAreaState.writeToTextArea(reason, this._textArea, this._hasFocus || forceFocus); + textAreaState.writeToTextArea(reason, this._textArea, this._hasFocus); this._textAreaState = textAreaState; } - // ------------- Operations that are always executed asynchronously - - public focusTextArea(): void { - this._writePlaceholderAndSelectTextArea('focusTextArea', true); - } - - private _writePlaceholderAndSelectTextArea(reason: string, forceFocus: boolean): void { + private _writeScreenReaderContent(reason: string): void { if (this._isDoingComposition) { // Do not write to the text area when doing composition return; @@ -347,17 +350,17 @@ export class TextAreaHandler extends Disposable { if (browser.isIPad) { // Do not place anything in the textarea for the iPad - this._setAndWriteTextAreaState(reason, TextAreaState.EMPTY, forceFocus); + this._setAndWriteTextAreaState(reason, TextAreaState.EMPTY); } else if (this._textAreaStrategy === TextAreaStrategy.IENarrator) { const newState = IENarratorStrategy.fromEditorSelection(this._textAreaState, this._model, this._selection); - this._setAndWriteTextAreaState(reason, newState, forceFocus); + this._setAndWriteTextAreaState(reason, newState); } else { const newState = NVDAPagedStrategy.fromEditorSelection(this._textAreaState, this._model, this._selection); - this._setAndWriteTextAreaState(reason, newState, forceFocus); + this._setAndWriteTextAreaState(reason, newState); } } @@ -367,7 +370,7 @@ export class TextAreaHandler extends Disposable { if (!ClipboardEventUtils.canUseTextData(e)) { // Looks like an old browser. The strategy is to place the text // we'd like to be copied to the clipboard in the textarea and select it. - this._setAndWriteTextAreaState('copy or cut', TextAreaState.selectedText(copyPlainText), false); + this._setAndWriteTextAreaState('copy or cut', TextAreaState.selectedText(copyPlainText)); return; } @@ -445,7 +448,7 @@ class TextAreaWrapper extends Disposable implements ITextAreaWrapper { // No change return; } - // console.log('reason: ' + reason + ', current value: ' + this._textArea.value + ' => new value: ' + value); + // console.log('reason: ' + reason + ', current value: ' + textArea.value + ' => new value: ' + value); textArea.value = value; } @@ -457,7 +460,8 @@ class TextAreaWrapper extends Disposable implements ITextAreaWrapper { return this._actual.domNode.selectionEnd; } - public setSelectionRange(selectionStart: number, selectionEnd: number): void { + public setSelectionRange(reason: string, selectionStart: number, selectionEnd: number): void { + // console.log('reason: ' + reason + ', setSelectionRange: ' + selectionStart + ' -> ' + selectionEnd); const textArea = this._actual.domNode; if (document.activeElement === textArea) { textArea.setSelectionRange(selectionStart, selectionEnd); diff --git a/src/vs/editor/browser/controller/textAreaState.ts b/src/vs/editor/browser/controller/textAreaState.ts index 38e82909a66..d66e788c53d 100644 --- a/src/vs/editor/browser/controller/textAreaState.ts +++ b/src/vs/editor/browser/controller/textAreaState.ts @@ -15,7 +15,7 @@ export interface ITextAreaWrapper { getSelectionStart(): number; getSelectionEnd(): number; - setSelectionRange(selectionStart: number, selectionEnd: number): void; + setSelectionRange(reason: string, selectionStart: number, selectionEnd: number): void; } export interface ISimpleModel { @@ -73,7 +73,7 @@ export class TextAreaState { // console.log(Date.now() + ': applyToTextArea ' + reason + ': ' + this.toString()); textArea.setValue(reason, this.value); if (select) { - textArea.setSelectionRange(this.selectionStart, this.selectionEnd); + textArea.setSelectionRange(reason, this.selectionStart, this.selectionEnd); } } @@ -81,7 +81,7 @@ export class TextAreaState { return new TextAreaState(text, 0, text.length, 0); } - public static deduceInput(previousState: TextAreaState, currentState: TextAreaState): ITypeData { + public static deduceInput(previousState: TextAreaState, currentState: TextAreaState, isDoingComposition: boolean): ITypeData { if (!previousState) { // This is the EMPTY state return { @@ -92,7 +92,7 @@ export class TextAreaState { // console.log('------------------------deduceInput'); // console.log('CURRENT STATE: ' + currentState.toString()); - // console.log('PREVIOUS STATE: ' + prevState.toString()); + // console.log('PREVIOUS STATE: ' + previousState.toString()); let previousValue = previousState.value; let previousSelectionStart = previousState.selectionStart; @@ -102,15 +102,15 @@ export class TextAreaState { let currentSelectionEnd = currentState.selectionEnd; // Strip the previous suffix from the value (without interfering with the current selection) - let previousSuffix = previousValue.substring(previousSelectionEnd); - let currentSuffix = currentValue.substring(currentSelectionEnd); - let suffixLength = commonSuffixLength(previousSuffix, currentSuffix); + const previousSuffix = previousValue.substring(previousSelectionEnd); + const currentSuffix = currentValue.substring(currentSelectionEnd); + const suffixLength = commonSuffixLength(previousSuffix, currentSuffix); currentValue = currentValue.substring(0, currentValue.length - suffixLength); previousValue = previousValue.substring(0, previousValue.length - suffixLength); - let previousPrefix = previousValue.substring(0, previousSelectionStart); - let currentPrefix = currentValue.substring(0, currentSelectionStart); - let prefixLength = commonPrefixLength(previousPrefix, currentPrefix); + const previousPrefix = previousValue.substring(0, previousSelectionStart); + const currentPrefix = currentValue.substring(0, currentSelectionStart); + const prefixLength = commonPrefixLength(previousPrefix, currentPrefix); currentValue = currentValue.substring(prefixLength); previousValue = previousValue.substring(prefixLength); currentSelectionStart -= prefixLength; @@ -125,7 +125,8 @@ export class TextAreaState { // composition accept case // [blahblah] => blahblah| if ( - previousValue === currentValue + isDoingComposition + && previousValue === currentValue && previousSelectionStart === 0 && previousSelectionEnd === previousValue.length && currentSelectionStart === currentValue.length @@ -138,7 +139,7 @@ export class TextAreaState { } // no current selection - let replacePreviousCharacters = (previousPrefix.length - prefixLength); + const replacePreviousCharacters = (previousPrefix.length - prefixLength); // console.log('REMOVE PREVIOUS: ' + (previousPrefix.length - prefixLength) + ' chars'); return { @@ -148,7 +149,7 @@ export class TextAreaState { } // there is a current selection => composition case - let replacePreviousCharacters = previousSelectionEnd - previousSelectionStart; + const replacePreviousCharacters = previousSelectionEnd - previousSelectionStart; return { text: currentValue, replaceCharCnt: replacePreviousCharacters diff --git a/src/vs/editor/test/browser/controller/textAreaState.test.ts b/src/vs/editor/test/browser/controller/textAreaState.test.ts index 9f99fc9a86a..8cc54071934 100644 --- a/src/vs/editor/test/browser/controller/textAreaState.test.ts +++ b/src/vs/editor/test/browser/controller/textAreaState.test.ts @@ -41,7 +41,7 @@ export class MockTextAreaWrapper extends Disposable implements ITextAreaWrapper return this._selectionEnd; } - public setSelectionRange(selectionStart: number, selectionEnd: number): void { + public setSelectionRange(reason: string, selectionStart: number, selectionEnd: number): void { if (selectionStart < 0) { selectionStart = 0; } @@ -113,7 +113,7 @@ suite('TextAreaState', () => { textArea.dispose(); }); - function testDeduceInput(prevState: TextAreaState, value: string, selectionStart: number, selectionEnd: number, expected: string, expectedCharReplaceCnt: number): void { + function testDeduceInput(prevState: TextAreaState, value: string, selectionStart: number, selectionEnd: number, isDoingComposition: boolean, expected: string, expectedCharReplaceCnt: number): void { prevState = prevState || TextAreaState.EMPTY; let textArea = new MockTextAreaWrapper(); @@ -122,7 +122,7 @@ suite('TextAreaState', () => { textArea._selectionEnd = selectionEnd; let newState = prevState.readFromTextArea(textArea); - let actual = TextAreaState.deduceInput(prevState, newState); + let actual = TextAreaState.deduceInput(prevState, newState, isDoingComposition); assert.equal(actual.text, expected); assert.equal(actual.replaceCharCnt, expectedCharReplaceCnt); @@ -143,7 +143,7 @@ suite('TextAreaState', () => { testDeduceInput( TextAreaState.EMPTY, 's', - 0, 1, + 0, 1, true, 's', 0 ); @@ -153,7 +153,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('s', 0, 1, 0), 'せ', - 0, 1, + 0, 1, true, 'せ', 1 ); @@ -163,7 +163,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('せ', 0, 1, 0), 'せn', - 0, 2, + 0, 2, true, 'せn', 1 ); @@ -173,7 +173,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('せn', 0, 2, 0), 'せん', - 0, 2, + 0, 2, true, 'せん', 2 ); @@ -183,7 +183,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('せん', 0, 2, 0), 'せんs', - 0, 3, + 0, 3, true, 'せんs', 2 ); @@ -193,7 +193,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('せんs', 0, 3, 0), 'せんせ', - 0, 3, + 0, 3, true, 'せんせ', 3 ); @@ -203,7 +203,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('せんせ', 0, 3, 0), 'せんせ', - 0, 3, + 0, 3, true, 'せんせ', 3 ); @@ -213,7 +213,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('せんせ', 0, 3, 0), 'せんせい', - 0, 4, + 0, 4, true, 'せんせい', 3 ); @@ -223,7 +223,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('せんせい', 0, 4, 0), 'せんせい', - 4, 4, + 4, 4, true, '', 0 ); }); @@ -242,7 +242,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('せんせい', 0, 4, 0), 'せんせい', - 0, 4, + 0, 4, true, 'せんせい', 4 ); @@ -252,7 +252,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('せんせい', 0, 4, 0), '先生', - 0, 2, + 0, 2, true, '先生', 4 ); @@ -262,7 +262,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('先生', 0, 2, 0), '先生', - 2, 2, + 2, 2, true, '', 0 ); }); @@ -271,7 +271,7 @@ suite('TextAreaState', () => { testDeduceInput( null, 'a', - 0, 1, + 0, 1, false, 'a', 0 ); }); @@ -280,7 +280,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState(']\n', 1, 2, 0), ']\n', - 2, 2, + 2, 2, false, '\n', 0 ); }); @@ -289,7 +289,7 @@ suite('TextAreaState', () => { testDeduceInput( null, 'a', - 1, 1, + 1, 1, false, 'a', 0 ); }); @@ -298,7 +298,7 @@ suite('TextAreaState', () => { testDeduceInput( TextAreaState.EMPTY, 'a', - 0, 1, + 0, 1, false, 'a', 0 ); }); @@ -307,7 +307,7 @@ suite('TextAreaState', () => { testDeduceInput( TextAreaState.EMPTY, 'a', - 1, 1, + 1, 1, false, 'a', 0 ); }); @@ -316,7 +316,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('Hello world!', 0, 12, 0), 'H', - 1, 1, + 1, 1, false, 'H', 0 ); }); @@ -325,7 +325,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('Hello world!', 12, 12, 0), 'Hello world!a', - 13, 13, + 13, 13, false, 'a', 0 ); }); @@ -334,7 +334,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('Hello world!', 0, 0, 0), 'aHello world!', - 1, 1, + 1, 1, false, 'a', 0 ); }); @@ -343,7 +343,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('Hello world!', 6, 11, 0), 'Hello other!', - 11, 11, + 11, 11, false, 'other', 0 ); }); @@ -352,7 +352,7 @@ suite('TextAreaState', () => { testDeduceInput( TextAreaState.EMPTY, 'これは', - 3, 3, + 3, 3, true, 'これは', 0 ); }); @@ -361,7 +361,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('Hello world!', 0, 0, 0), 'Aello world!', - 1, 1, + 1, 1, false, 'A', 0 ); }); @@ -370,7 +370,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('Hello world!', 5, 5, 0), 'Hellö world!', - 4, 5, + 4, 5, false, 'ö', 0 ); }); @@ -379,7 +379,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('Hello world!', 5, 5, 0), 'Hellöö world!', - 5, 5, + 5, 5, false, 'öö', 1 ); }); @@ -388,7 +388,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('Hello world!', 5, 5, 0), 'Helöö world!', - 5, 5, + 5, 5, false, 'öö', 2 ); }); @@ -397,11 +397,29 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('Hello world!', 5, 5, 0), 'Hellö world!', - 5, 5, + 5, 5, false, 'ö', 1 ); }); + test('issue #25101 - First key press ignored', () => { + testDeduceInput( + new TextAreaState('a', 0, 1, 0), + 'a', + 1, 1, false, + 'a', 0 + ); + }); + + test('issue #16520 - Cmd-d of single character followed by typing same character as has no effect', () => { + testDeduceInput( + new TextAreaState('x x', 0, 1, 0), + 'x x', + 1, 1, false, + 'x', 0 + ); + }); + function testFromEditorSelectionAndPreviousState(eol: string, lines: string[], range: Range, prevSelectionToken: number): TextAreaState { let model = new SimpleModel(lines, eol); let previousState = new TextAreaState('', 0, 0, prevSelectionToken); From 9b0141aaec153a12a738fd96558393968faa69ef Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 3 May 2017 15:23:04 -0700 Subject: [PATCH 0072/1164] Enable Semantics Diagnostics for Inline JS (#25850) Fixes #25809 **Bug** Inline js in html currently only reports semantic errors. This means that `// @ts-check` does not work to help catch programming errors **Fix** Also report semantic errors in script tags --- extensions/html/server/src/modes/javascriptMode.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/extensions/html/server/src/modes/javascriptMode.ts b/extensions/html/server/src/modes/javascriptMode.ts index c31fb273a2a..b9cd9075b20 100644 --- a/extensions/html/server/src/modes/javascriptMode.ts +++ b/extensions/html/server/src/modes/javascriptMode.ts @@ -71,8 +71,9 @@ export function getJavascriptMode(documentRegions: LanguageModelCache { + const syntaxDiagnostics = jsLanguageService.getSyntacticDiagnostics(FILE_NAME); + const semanticDiagnostics = jsLanguageService.getSemanticDiagnostics(FILE_NAME); + return syntaxDiagnostics.concat(semanticDiagnostics).map((diag): Diagnostic => { return { range: convertRange(currentTextDocument, diag), severity: DiagnosticSeverity.Error, From c90c82fa7196a3e017a5b14c3448975696f8c429 Mon Sep 17 00:00:00 2001 From: Daniel Ye Date: Wed, 3 May 2017 15:28:54 -0700 Subject: [PATCH 0073/1164] 2017-05-03, Merge in translation from transifex. --- .../chs/extensions/git/out/commands.i18n.json | 3 +++ i18n/chs/extensions/git/package.i18n.json | 2 ++ i18n/chs/extensions/gulp/package.i18n.json | 4 ++- .../out/utils/typingsStatus.i18n.json | 1 + .../menusExtensionPoint.i18n.json | 6 ++--- .../parts/editor/editorActions.i18n.json | 2 ++ .../src/vs/workbench/common/theme.i18n.json | 10 ++++++- .../inspectKeybindings.i18n.json | 4 ++- .../debug/browser/debugActions.i18n.json | 1 + .../browser/debugActionsWidget.i18n.json | 4 ++- .../parts/debug/node/debugAdapter.i18n.json | 1 + .../treeExplorer.contribution.i18n.json | 5 ++++ .../browser/views/empty/emptyView.i18n.json | 2 +- .../browser/preferencesActions.i18n.json | 1 + .../task.contribution.i18n.json | 1 + .../themes.contribution.i18n.json | 1 + .../electron-browser/watermark.i18n.json | 2 +- .../walkThroughPart.i18n.json | 3 ++- .../themes/common/colorThemeSchema.i18n.json | 3 ++- .../electron-browser/colorThemeData.i18n.json | 7 ++++- .../workbenchThemeService.i18n.json | 5 +++- .../cht/extensions/git/out/commands.i18n.json | 3 +++ i18n/cht/extensions/git/out/main.i18n.json | 3 ++- i18n/cht/extensions/git/out/model.i18n.json | 4 ++- i18n/cht/extensions/git/package.i18n.json | 5 +++- i18n/cht/extensions/grunt/out/main.i18n.json | 4 ++- i18n/cht/extensions/gulp/out/main.i18n.json | 4 ++- i18n/cht/extensions/php/package.i18n.json | 3 ++- .../out/typescriptServiceClient.i18n.json | 2 ++ .../extensions/typescript/package.i18n.json | 7 ++++- .../src/vs/code/electron-main/menus.i18n.json | 4 +++ .../browser/widget/diffEditorWidget.i18n.json | 2 ++ .../src/vs/workbench/common/theme.i18n.json | 4 ++- .../inspectKeybindings.i18n.json | 4 ++- .../debug/browser/debugActions.i18n.json | 1 + .../browser/debugActionsWidget.i18n.json | 4 ++- .../debug.contribution.i18n.json | 3 ++- .../parts/debug/node/debugAdapter.i18n.json | 1 + .../treeExplorer.contribution.i18n.json | 5 ++++ .../extensionTipsService.i18n.json | 1 + .../files/browser/saveErrorHandler.i18n.json | 1 + .../browser/keybindingsEditor.i18n.json | 2 ++ .../browser/preferencesActions.i18n.json | 1 + .../common/keybindingsEditorModel.i18n.json | 1 + .../workbenchThemeService.i18n.json | 3 ++- .../browser/referencesModel.i18n.json | 3 +++ .../theme/common/colorRegistry.i18n.json | 1 + .../esn/extensions/git/out/commands.i18n.json | 3 +++ i18n/esn/extensions/git/package.i18n.json | 2 ++ i18n/esn/extensions/gulp/package.i18n.json | 4 ++- .../out/utils/typingsStatus.i18n.json | 1 + .../browser/referencesModel.i18n.json | 3 +++ .../suggest/browser/suggestWidget.i18n.json | 3 +++ .../platform/environment/node/argv.i18n.json | 1 + .../theme/common/colorRegistry.i18n.json | 27 +++++++++++++++++++ .../parts/editor/editorActions.i18n.json | 2 ++ .../src/vs/workbench/common/theme.i18n.json | 1 + .../inspectKeybindings.i18n.json | 4 ++- .../debug/browser/debugActions.i18n.json | 1 + .../browser/debugActionsWidget.i18n.json | 4 ++- .../parts/debug/node/debugAdapter.i18n.json | 1 + .../treeExplorer.contribution.i18n.json | 5 ++++ .../browser/preferencesActions.i18n.json | 1 + .../task.contribution.i18n.json | 1 + .../themes.contribution.i18n.json | 1 + .../walkThroughPart.i18n.json | 3 ++- .../themes/common/colorThemeSchema.i18n.json | 3 ++- .../electron-browser/colorThemeData.i18n.json | 7 ++++- .../workbenchThemeService.i18n.json | 5 +++- .../fra/extensions/git/out/commands.i18n.json | 3 +++ i18n/fra/extensions/git/package.i18n.json | 2 ++ i18n/fra/extensions/gulp/package.i18n.json | 4 ++- .../out/utils/typingsStatus.i18n.json | 1 + .../browser/referencesModel.i18n.json | 3 +++ .../suggest/browser/suggestWidget.i18n.json | 3 +++ .../platform/environment/node/argv.i18n.json | 1 + .../theme/common/colorRegistry.i18n.json | 27 +++++++++++++++++++ .../parts/editor/editorActions.i18n.json | 2 ++ .../src/vs/workbench/common/theme.i18n.json | 10 ++++++- .../inspectKeybindings.i18n.json | 4 ++- .../debug/browser/debugActions.i18n.json | 1 + .../browser/debugActionsWidget.i18n.json | 4 ++- .../parts/debug/node/debugAdapter.i18n.json | 1 + .../treeExplorer.contribution.i18n.json | 5 ++++ .../browser/preferencesActions.i18n.json | 1 + .../task.contribution.i18n.json | 1 + .../themes.contribution.i18n.json | 1 + .../walkThroughPart.i18n.json | 3 ++- .../themes/common/colorThemeSchema.i18n.json | 3 ++- .../electron-browser/colorThemeData.i18n.json | 7 ++++- .../workbenchThemeService.i18n.json | 5 +++- .../browser/referencesModel.i18n.json | 3 +++ .../suggest/browser/suggestWidget.i18n.json | 3 +++ .../platform/environment/node/argv.i18n.json | 1 + .../theme/common/colorRegistry.i18n.json | 21 +++++++++++++++ .../jpn/extensions/git/out/commands.i18n.json | 2 ++ i18n/jpn/extensions/git/package.i18n.json | 1 + i18n/jpn/extensions/gulp/package.i18n.json | 4 ++- .../out/utils/typingsStatus.i18n.json | 1 + .../extensions/typescript/package.i18n.json | 2 +- .../browser/referencesModel.i18n.json | 3 +++ .../suggest/browser/suggestWidget.i18n.json | 3 +++ .../platform/environment/node/argv.i18n.json | 1 + .../theme/common/colorRegistry.i18n.json | 10 +++++++ .../parts/editor/editorActions.i18n.json | 2 ++ .../src/vs/workbench/common/theme.i18n.json | 9 ++++++- .../inspectKeybindings.i18n.json | 4 ++- .../debug/browser/debugActions.i18n.json | 1 + .../browser/debugActionsWidget.i18n.json | 4 ++- .../parts/debug/node/debugAdapter.i18n.json | 1 + .../treeExplorer.contribution.i18n.json | 4 +++ .../extensionTipsService.i18n.json | 2 +- .../browser/preferencesActions.i18n.json | 1 + .../task.contribution.i18n.json | 1 + .../themes.contribution.i18n.json | 1 + .../welcomePage.contribution.i18n.json | 2 +- .../walkThroughPart.i18n.json | 3 ++- .../electron-browser/colorThemeData.i18n.json | 5 +++- .../workbenchThemeService.i18n.json | 4 ++- .../browser/referencesModel.i18n.json | 3 +++ .../suggest/browser/suggestWidget.i18n.json | 3 +++ .../platform/environment/node/argv.i18n.json | 1 + .../theme/common/colorRegistry.i18n.json | 27 +++++++++++++++++++ .../rus/extensions/git/out/commands.i18n.json | 3 +++ i18n/rus/extensions/git/package.i18n.json | 4 ++- i18n/rus/extensions/grunt/out/main.i18n.json | 4 ++- i18n/rus/extensions/grunt/package.i18n.json | 4 ++- i18n/rus/extensions/gulp/package.i18n.json | 4 ++- .../rus/extensions/markdown/package.i18n.json | 4 ++- i18n/rus/extensions/php/package.i18n.json | 3 ++- .../out/utils/typingsStatus.i18n.json | 1 + .../extensions/typescript/package.i18n.json | 5 +++- 132 files changed, 427 insertions(+), 57 deletions(-) diff --git a/i18n/chs/extensions/git/out/commands.i18n.json b/i18n/chs/extensions/git/out/commands.i18n.json index b7d7aed9960..2bf666865ec 100644 --- a/i18n/chs/extensions/git/out/commands.i18n.json +++ b/i18n/chs/extensions/git/out/commands.i18n.json @@ -16,6 +16,8 @@ "confirm discard": "确定要放弃 {0} 中更改吗?", "confirm discard multiple": "是否确实要放弃 {0} 文件中的更改?", "discard": "放弃更改", + "confirm discard all": "确定要放弃所有更改吗?此操作不可撤销!", + "discardAll": "放弃所有更改", "no changes": "没有要提交的更改。", "commit message": "提交消息", "provide commit message": "请提供提交消息", @@ -31,6 +33,7 @@ "no remotes to publish": "存储库未配置任何要发布到的远程存储库。", "disabled": "此工作区已禁用或不支持 GIT", "clean repo": "在签出前,请清理存储库工作树。", + "cant push": "无法推送 refs 到远端。请先运行“拉取”功能以整合你的更改。", "git error details": "Git:{0}", "git error": "Git 错误", "open git log": "打开 GIT 日志" diff --git a/i18n/chs/extensions/git/package.i18n.json b/i18n/chs/extensions/git/package.i18n.json index d45df3f45c4..06d049a0aeb 100644 --- a/i18n/chs/extensions/git/package.i18n.json +++ b/i18n/chs/extensions/git/package.i18n.json @@ -39,6 +39,8 @@ "config.autofetch": "是否启用了自动提取", "config.enableLongCommitWarning": "是否针对长段提交消息进行警告", "config.confirmSync": "同步 GIT 存储库前请先进行确认", + "config.countBadge": "控制 Git 徽章计数器。“all”计算所有更改。“tracked”只计算跟踪的更改。“off”关闭此功能。", + "config.checkoutType": "控制运行“签出到...”时列出的分支的类型。“all”显示所有 refs,“local”只显示本地分支,“tags”只显示标签,“remote”只显示远程分支。", "config.ignoreLegacyWarning": "忽略旧版 Git 警告", "config.ignoreLimitWarning": "忽略“存储库中存在大量更改”的警告" } \ No newline at end of file diff --git a/i18n/chs/extensions/gulp/package.i18n.json b/i18n/chs/extensions/gulp/package.i18n.json index 8b6ad71cd4e..368a4601441 100644 --- a/i18n/chs/extensions/gulp/package.i18n.json +++ b/i18n/chs/extensions/gulp/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.gulp.autoDetect": "控制自动检测 Gulp 任务是否打开。默认开启。" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript/out/utils/typingsStatus.i18n.json b/i18n/chs/extensions/typescript/out/utils/typingsStatus.i18n.json index f6ee369cc40..01709f2e6d3 100644 --- a/i18n/chs/extensions/typescript/out/utils/typingsStatus.i18n.json +++ b/i18n/chs/extensions/typescript/out/utils/typingsStatus.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "installingPackages": "提取数据以实现更好的 TypeScript IntelliSense", + "typesInstallerInitializationFailed.title": "无法为 JavaScript 语言功能安装 typings 文件。请确认 NPM 已经安装且位于 PATH 中", "typesInstallerInitializationFailed.moreInformation": "详细信息", "typesInstallerInitializationFailed.doNotCheckAgain": "不要再次检查", "typesInstallerInitializationFailed.close": "关闭" diff --git a/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index 3aee009f0fb..806db0f0748 100644 --- a/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -18,9 +18,9 @@ "menus.explorerContext": "文件资源管理器上下文菜单", "menus.editorTabContext": "编辑器选项卡上下文菜单", "menus.debugCallstackContext": "调试调用堆栈上下文菜单", - "menus.scmTitle": "源控件标题菜单", - "menus.resourceGroupContext": "源控件资源组上下文菜单", - "menus.resourceStateContext": "源控件资源状态上下文菜单", + "menus.scmTitle": "源代码管理标题菜单", + "menus.resourceGroupContext": "源代码管理资源组上下文菜单", + "menus.resourceStateContext": "源代码管理资源状态上下文菜单", "nonempty": "应为非空值。", "opticon": "可以省略属性“图标”或者它必须是一个字符串或类似“{dark, light}”的文本", "requireStringOrObject": "属性“{0}”为必需且其类型必须为“字符串”或“对象”", diff --git a/i18n/chs/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/chs/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index b2df0032ff4..dc267856d02 100644 --- a/i18n/chs/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/chs/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -44,6 +44,8 @@ "openPreviousRecentlyUsedEditorInGroup": "打开组中上一个最近使用的编辑器", "openNextRecentlyUsedEditorInGroup": "打开组中下一个最近使用的编辑器", "navigateEditorHistoryByInput": "从历史记录里打开上一个编辑器", + "openNextRecentlyUsedEditor": "打开下一个最近使用的编辑器", + "openPreviousRecentlyUsedEditor": "打开上一个最近使用的编辑器", "clearEditorHistory": "清除编辑器历史记录", "focusLastEditorInStack": "打开组中上一个编辑器", "moveEditorLeft": "向左移动编辑器", diff --git a/i18n/chs/src/vs/workbench/common/theme.i18n.json b/i18n/chs/src/vs/workbench/common/theme.i18n.json index bff10399ed5..82541213ad4 100644 --- a/i18n/chs/src/vs/workbench/common/theme.i18n.json +++ b/i18n/chs/src/vs/workbench/common/theme.i18n.json @@ -12,8 +12,11 @@ "tabActiveEditorGroupInactiveForeground": "非活动组中活动选项卡的前景色。在编辑器区域,选项卡是编辑器的容器。可在一个编辑器组中打开多个选项卡。可以有多个编辑器组。", "tabInactiveEditorGroupActiveForeground": "活动组中非活动选项卡的前景色。在编辑器区域,选项卡是编辑器的容器。可在一个编辑器组中打开多个选项卡。可以有多个编辑器组。", "tabInactiveEditorGroupInactiveForeground": "非活动组中非活动选项卡的前景色。在编辑器区域,选项卡是编辑器的容器。可在一个编辑器组中打开多个选项卡。可以有多个编辑器组。", + "editorGroupBackground": "编辑器组的背景颜色。编辑器组是编辑器的容器。此颜色在拖动编辑器组时显示。", + "editorGroupHeaderBackground": "禁用选项卡时编辑器组标题的背景颜色。编辑器组是编辑器的容器。", "editorGroupBorder": "将多个编辑器组彼此分隔开的颜色。编辑器组是编辑器的容器。", "editorDragAndDropBackground": "随意拖动编辑器时的背景色。", + "editorMasterDetailsBorder": "并排编辑器中将主视图与细节视图分隔开的边框颜色。", "panelBackground": "面板的背景色。面板显示在编辑器区域下方,可包含输出和集成终端等视图。", "panelBorder": "分隔到编辑器的顶部面板边框色。面板显示在编辑器区域下方,可包含输出和集成终端等视图。", "panelActiveTitleForeground": "活动面板的标题颜色。面板显示在编辑器区域下方,并包含输出和集成终端等视图。", @@ -24,6 +27,8 @@ "statusBarNoFolderBackground": "没有打开文件夹时状态栏的背景色。状态栏显示在窗口底部。", "statusBarItemActiveBackground": "单击时的状态栏项背景色。状态栏显示在窗口底部。", "statusBarItemHoverBackground": "悬停时的状态栏项背景色。状态栏显示在窗口底部。", + "statusBarProminentItemBackground": "状态栏突出显示项的背景颜色。突出显示项比状态栏中的其他条目更显眼,表明其重要性更高。状态栏显示在窗口底部。", + "statusBarProminentItemHoverBackground": "状态栏突出显示项在悬停时的背景颜色。突出显示项比状态栏中的其他条目更显眼,表明其重要性更高。状态栏显示在窗口底部。", "activityBarBackground": "活动栏背景色。活动栏显示在最左侧或最右侧,并允许在侧边栏的视图间切换。", "activityBarForeground": "活动栏前景色(例如用于图标)。活动栏显示在最左侧或最右侧,并允许在侧边栏的视图间切换。", "activityBarDragAndDropBackground": "活动栏项的拖放反馈颜色。活动栏显示在最左侧或最右侧,并允许在侧边栏的视图间切换。", @@ -31,8 +36,11 @@ "activityBarBadgeForeground": "活动通知徽章前景色。活动栏显示在最左侧或最右侧,并允许在侧边栏的视图间切换。", "sideBarBackground": "侧边栏背景色。侧边栏是资源管理器和搜索等视图的容器。", "sideBarTitleForeground": "侧边栏标题前景色。侧边栏是资源管理器和搜索等视图的容器。", + "sideBarSectionHeaderBackground": "侧边栏节标题的背景颜色。侧边栏是资源管理器和搜索等视图的容器。", "titleBarActiveForeground": "窗口处于活动状态时的标题栏前景色。请注意,该颜色当前仅在 macOS 上受支持。", "titleBarInactiveForeground": "窗口处于非活动状态时的标题栏前景色。请注意,该颜色当前仅在 macOS 上受支持。", "titleBarActiveBackground": "窗口处于活动状态时的标题栏背景色。请注意,该颜色当前仅在 macOS 上受支持。", - "titleBarInactiveBackground": "窗口处于非活动状态时的标题栏背景色。请注意,该颜色当前仅在 macOS 上受支持。" + "titleBarInactiveBackground": "窗口处于非活动状态时的标题栏背景色。请注意,该颜色当前仅在 macOS 上受支持。", + "notificationsForeground": "通知前景色。通知从窗口顶部滑入。", + "notificationsBackground": "通知背颜色。通知从窗口顶部滑入。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json index 8b6ad71cd4e..a188f9c1e90 100644 --- a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "workbench.action.inspectKeyMap": "开发者:检查键映射" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 0dcbbe50442..2ed88fc7545 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -34,6 +34,7 @@ "editConditionalBreakpoint": "编辑断点...", "setValue": "设置值", "addWatchExpression": "添加表达式", + "editWatchExpression": "编辑表达式", "addToWatchExpressions": "添加到监视", "removeWatchExpression": "删除表达式", "removeAllWatchExpressions": "删除所有表达式", diff --git a/i18n/chs/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json index 8b6ad71cd4e..fd9702e842b 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "debugToolBarBackground": "调试工具栏背景颜色。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index e1f50545d94..59d49516599 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,6 +7,7 @@ "debugAdapterBinNotFound": "调试适配器可执行的“{0}”不存在。", "debugAdapterCannotDetermineExecutable": "无法确定调试适配器“{0}”的可执行文件。", "debugType": "配置类型。", + "debugTypeNotRecognised": "无法识别此调试类型。请安装相应的调试扩展。", "node2NotSupported": "不再支持 \"node2\",改用 \"node\",并将 \"protocol\" 属性设为 \"inspector\"。", "debugName": "配置名称;在启动配置下拉菜单中显示。", "debugRequest": "请求配置类型。可以是“启动”或“附加”。", diff --git a/i18n/chs/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json index 7ee7785b781..5d52f90d627 100644 --- a/i18n/chs/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json @@ -4,6 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "vscode.extension.contributes.view": "贡献自定义视图", + "vscode.extension.contributes.view.id": "用于标识通过 vscode.workspace.createTreeView 创建的视图的唯一 ID", + "vscode.extension.contributes.view.label": "用于呈现视图的人类可读的字符串", + "vscode.extension.contributes.view.icon": "视图图标的路径", + "vscode.extension.contributes.views": "贡献自定义视图", "showViewlet": "显示 {0}", "view": "查看" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/git/browser/views/empty/emptyView.i18n.json b/i18n/chs/src/vs/workbench/parts/git/browser/views/empty/emptyView.i18n.json index d4d866094c6..e4d4e20d715 100644 --- a/i18n/chs/src/vs/workbench/parts/git/browser/views/empty/emptyView.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/git/browser/views/empty/emptyView.i18n.json @@ -4,6 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "noGit": "此工作区尚未在 GIT 源控件之下。", + "noGit": "此工作区尚未使用 Git 源代码管理。", "gitinit": "初始化 GIT 存储库" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 0bf6b9af995..058e01cd6bf 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -6,6 +6,7 @@ { "openGlobalSettings": "打开用户设置", "openGlobalKeybindings": "打开键盘快捷方式", + "openGlobalKeybindingsFile": "打开键盘快捷键文件", "openWorkspaceSettings": "打开工作区设置", "configureLanguageBasedSettings": "配置语言特定的设置...", "languageDescriptionConfigured": "({0})", diff --git a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index af44cd6b112..a1a07ebb7f9 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -9,6 +9,7 @@ "ConfigureTaskRunnerAction.quickPick.template": "选择任务运行程序", "ConfigureTaskRunnerAction.autoDetecting": "适用于 {0} 的自动检测任务", "ConfigureTaskRunnerAction.autoDetect": "自动检测系统任务失败。请使用默认模板。有关详细信息,请参阅任务输出。", + "ConfigureTaskRunnerAction.autoDetectError": "自动检测任务系统时出现错误。有关详细信息,请参阅任务输出。", "ConfigureTaskRunnerAction.failed": "无法在 \".vscode\" 文件夹中创建 \"tasks.json\" 文件。查看任务输出了解详细信息。", "ConfigureTaskRunnerAction.label": "配置任务运行程序", "ConfigureBuildTaskAction.label": "配置生成任务", diff --git a/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index e3d24891a1d..1e8d0fdd5a8 100644 --- a/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -14,6 +14,7 @@ "noIconThemeDesc": "禁用文件图标", "problemChangingIconTheme": "设置图标主题时出现问题: {0}", "themes.selectIconTheme": "选择文件图标主题", + "generateColorTheme.label": "使用当前设置生成颜色主题", "preferences": "首选项", "developer": "开发者" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json b/i18n/chs/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json index 076dd52ebbb..082e49f08bc 100644 --- a/i18n/chs/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json @@ -17,7 +17,7 @@ "watermark.selectTheme": "更改主题", "watermark.selectKeymap": "更改键映射", "watermark.keybindingsReference": "键盘参考", - "watermark.openGlobalKeybindings": "键盘快捷方式(&&K)", + "watermark.openGlobalKeybindings": "键盘快捷键", "watermark.unboundCommand": "未绑定", "workbenchConfigurationTitle": "工作台", "tips.enabled": "启用后,当没有打开编辑器时将显示水印提示。" diff --git a/i18n/chs/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json b/i18n/chs/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json index 919a9e29fe9..20d662cd6cf 100644 --- a/i18n/chs/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "walkThrough.unboundCommand": "未绑定" + "walkThrough.unboundCommand": "未绑定", + "walkThrough.gitNotFound": "你的系统上似乎未安装 Git。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json b/i18n/chs/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json index c9bf9070daa..d745afc2207 100644 --- a/i18n/chs/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json +++ b/i18n/chs/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json @@ -6,5 +6,6 @@ { "schema.colors": "语法突出显示颜色", "schema.properties.name": "规则描述", - "schema.fontStyle": "规则字体样式:“斜体”、“粗体”和“下划线”中的一种或者组合" + "schema.fontStyle": "规则字体样式:“斜体”、“粗体”和“下划线”中的一种或者组合", + "schema.tokenColors.path": "tmTheme 文件路径(相对于当前文件)" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json b/i18n/chs/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json index 75fac413043..88cd69f2451 100644 --- a/i18n/chs/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json +++ b/i18n/chs/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "error.cannotparsejson": "分析 JSON 主题文件 {0} 时出现问题" + "error.cannotparsejson": "分析 JSON 主题文件 {0} 时出现问题", + "error.invalidformat.colors": "分析颜色主题文件时出现问题:{0}。属性“colors”不是“object”类型。", + "error.invalidformat.tokenColors": "分析颜色主题文件时出现问题:{0}。属性“tokenColors”应为指定颜色的数组或是指向 TextMate 主题文件的路径", + "error.plist.invalidformat": "分析 tmTheme 文件时出现问题:{0}。“settings”不是数组。", + "error.cannotparse": "分析 tmTheme 文件时出现问题:{0}", + "error.cannotload": "分析 tmTheme 文件 {0} 时出现问题:{1}" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/chs/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index f8a9d4a4a14..69e35ac02d6 100644 --- a/i18n/chs/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -25,5 +25,8 @@ "colorThemeError": "Theme is unknown or not installed.", "iconTheme": "Specifies the icon theme used in the workbench.", "noIconThemeDesc": "No file icons", - "iconThemeError": "File icon theme is unknown or not installed." + "iconThemeError": "File icon theme is unknown or not installed.", + "workbenchColors": "覆盖当前所选颜色主题的颜色。", + "workbenchColors.deprecated": "该设置不再是实验性设置,并已重命名为“workbench.colorCustomizations”", + "workbenchColors.deprecatedDescription": "改用“workbench.colorCustomizations”" } \ No newline at end of file diff --git a/i18n/cht/extensions/git/out/commands.i18n.json b/i18n/cht/extensions/git/out/commands.i18n.json index 1cdcbdecd44..446fe9ba049 100644 --- a/i18n/cht/extensions/git/out/commands.i18n.json +++ b/i18n/cht/extensions/git/out/commands.i18n.json @@ -16,6 +16,8 @@ "confirm discard": "確定要捨棄 {0} 中的變更嗎?", "confirm discard multiple": "確定要捨棄 {0} 檔案中的變更嗎?", "discard": "捨棄變更", + "confirm discard all": "確定要捨棄所有變更嗎? 此動作無法復原!", + "discardAll": "捨棄所有變更", "no changes": "沒有任何變更要認可。", "commit message": "認可訊息", "provide commit message": "請提供認可訊息", @@ -31,6 +33,7 @@ "no remotes to publish": "您的存放庫未設定要發行的目標遠端。", "disabled": "Git 已停用,或在此工作區不受支援", "clean repo": "請先清除您的存放庫工作樹狀再簽出。", + "cant push": "無法將參考推送到遠端。請先執行 [提取] 以整合您的變更。", "git error details": "Git: {0}", "git error": "Git 錯誤", "open git log": "開啟 Git 記錄" diff --git a/i18n/cht/extensions/git/out/main.i18n.json b/i18n/cht/extensions/git/out/main.i18n.json index 710676d3a31..1a5f7ab3b83 100644 --- a/i18n/cht/extensions/git/out/main.i18n.json +++ b/i18n/cht/extensions/git/out/main.i18n.json @@ -6,5 +6,6 @@ { "using git": "正在使用來自 {1} 的 git {0}", "updateGit": "更新 Git", - "neverShowAgain": "不要再顯示" + "neverShowAgain": "不要再顯示", + "git20": "您似乎已安裝 Git {0}。Code 搭配 Git >= 2 的執行效果最佳" } \ No newline at end of file diff --git a/i18n/cht/extensions/git/out/model.i18n.json b/i18n/cht/extensions/git/out/model.i18n.json index 69c8e98ba19..7a721014864 100644 --- a/i18n/cht/extensions/git/out/model.i18n.json +++ b/i18n/cht/extensions/git/out/model.i18n.json @@ -8,5 +8,7 @@ "merge changes": "合併變更", "staged changes": "已分段的變更", "changes": "變更", - "ok": "確定" + "ok": "確定", + "neveragain": "不要再顯示", + "huge": "位於 '{0}' 的 Git 存放庫有過多使用中的變更,只會啟用一部份 Git 功能。" } \ No newline at end of file diff --git a/i18n/cht/extensions/git/package.i18n.json b/i18n/cht/extensions/git/package.i18n.json index 25e06410e3d..b89e5991900 100644 --- a/i18n/cht/extensions/git/package.i18n.json +++ b/i18n/cht/extensions/git/package.i18n.json @@ -38,5 +38,8 @@ "config.autorefresh": "是否啟用自動重新整理", "config.autofetch": "是否啟用自動擷取", "config.enableLongCommitWarning": "是否發出長認可訊息的警告", - "config.confirmSync": "請先確認再同步處理 GIT 存放庫" + "config.confirmSync": "請先確認再同步處理 GIT 存放庫", + "config.countBadge": "控制 git 徽章計數器。[全部] 會計算所有變更。[已追蹤] 只會計算追蹤的變更。[關閉] 會將其關閉。", + "config.checkoutType": "控制在執行 [簽出至...] 時,會列出那些類型的分支。[全部] 會顯示所有參考,[本機] 只會顯示本機分支,[標記] 只會顯示標記,[遠端] 只會顯示遠端分支。", + "config.ignoreLimitWarning": "當存放庫中有過多變更時,略過警告。" } \ No newline at end of file diff --git a/i18n/cht/extensions/grunt/out/main.i18n.json b/i18n/cht/extensions/grunt/out/main.i18n.json index 8b6ad71cd4e..39e6cf64ecb 100644 --- a/i18n/cht/extensions/grunt/out/main.i18n.json +++ b/i18n/cht/extensions/grunt/out/main.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "execFailed": "Grunt 的自動偵測失敗。錯誤: {0}" +} \ No newline at end of file diff --git a/i18n/cht/extensions/gulp/out/main.i18n.json b/i18n/cht/extensions/gulp/out/main.i18n.json index 8b6ad71cd4e..019ce972d1c 100644 --- a/i18n/cht/extensions/gulp/out/main.i18n.json +++ b/i18n/cht/extensions/gulp/out/main.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "execFailed": "Gulp 的自動偵測失敗。錯誤: {0}" +} \ No newline at end of file diff --git a/i18n/cht/extensions/php/package.i18n.json b/i18n/cht/extensions/php/package.i18n.json index ea8c697e6aa..5f7fb841954 100644 --- a/i18n/cht/extensions/php/package.i18n.json +++ b/i18n/cht/extensions/php/package.i18n.json @@ -9,5 +9,6 @@ "configuration.validate.executablePath": "指向 PHP 可執行檔。", "configuration.validate.run": "是否在儲存或輸入時執行 linter。", "configuration.title": "PHP", - "commands.categroy.php": "PHP" + "commands.categroy.php": "PHP", + "command.untrustValidationExecutable": "禁止 PHP 驗證可執行檔 (定義為工作區設定)" } \ No newline at end of file diff --git a/i18n/cht/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/cht/extensions/typescript/out/typescriptServiceClient.i18n.json index 69c9930b11d..cbb3857f331 100644 --- a/i18n/cht/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/cht/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -15,6 +15,8 @@ "learnMore": "深入了解", "selectTsVersion": "選取 JavaScript 與 TypeScript 功能使用的 TypeScript 版本", "typescript.openTsServerLog.notSupported": "TS 伺服器的記錄功能需要 TS 2.2.2+", + "typescript.openTsServerLog.loggingNotEnabled": "TS 伺服器記錄功能已關閉。請設定 `typescript.tsserver.log` 並重新啟動 TS 伺服器,以啟用記錄功能", + "typescript.openTsServerLog.enableAndReloadOption": "啟用記錄功能並重新啟動 TS 伺服器", "typescript.openTsServerLog.noLogFile": "TS 伺服器尚未開始記錄。", "openTsServerLog.openFileFailedFailed": "無法開啟 TS 伺服器記錄檔", "serverDiedAfterStart": "TypeScript 語言服務在啟動後立即中止 5 次。服務將不會重新啟動。", diff --git a/i18n/cht/extensions/typescript/package.i18n.json b/i18n/cht/extensions/typescript/package.i18n.json index 474b92a51c1..16a2c1a55f1 100644 --- a/i18n/cht/extensions/typescript/package.i18n.json +++ b/i18n/cht/extensions/typescript/package.i18n.json @@ -11,6 +11,7 @@ "typescript.tsdk.desc": "指定資料夾路徑,其中包含要使用的 tsserver 和 lib*.d.ts 檔案。", "typescript.disableAutomaticTypeAcquisition": "停用自動類型取得。需要 TypeScript >= 2.0.6,並需要在變更後重新啟動。", "typescript.check.tscVersion": "請檢查全域安裝 TypeScript 編譯器 (例如 tsc) 是否不同於使用的 TypeScript 語言服務。", + "typescript.tsserver.log": "允許 TS 伺服器記錄到檔案。此記錄可用來診斷 TS 伺服器問題。記錄可能包含檔案路徑、原始程式碼及您專案中可能具有敏感性的其他資訊。", "typescript.tsserver.experimentalAutoBuild": "啟用實驗性自動建置。需要 1.9 dev 或 2.x tsserver 版本,且在變更後必須重新啟動 VS Code。", "typescript.validate.enable": "啟用/停用 TypeScript 驗證。", "typescript.format.enable": "啟用/停用預設 TypeScript 格式器。", @@ -30,6 +31,10 @@ "javascript.validate.enable": "啟用/停用 JavaScript 驗證。", "typescript.goToProjectConfig.title": "移至專案組態", "javascript.goToProjectConfig.title": "移至專案組態", + "typescript.referencesCodeLens.enabled": "啟用/停用參考 CodeLens。需要 TypeScript >= 2.0.6。", + "typescript.implementationsCodeLens.enabled": "啟用/停用實作 CodeLens。需要 TypeScript >= 2.2.0。", "typescript.openTsServerLog.title": "開啟 TS 伺服器記錄檔", - "typescript.selectTypeScriptVersion.title": "選取 TypeScript 版本" + "typescript.selectTypeScriptVersion.title": "選取 TypeScript 版本", + "jsDocCompletion.enabled": "啟用/停用自動 JSDoc 註解", + "javascript.implicitProjectConfig.checkJs": "啟用/停用 JavaScript 檔案的語意檢查。現有的 jsconfig.json 或 tsconfig.json 檔案會覆寫此設定。需要 TypeScript >=2.3.1。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/code/electron-main/menus.i18n.json b/i18n/cht/src/vs/code/electron-main/menus.i18n.json index a0c96430b3e..20490cb499d 100644 --- a/i18n/cht/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/cht/src/vs/code/electron-main/menus.i18n.json @@ -6,7 +6,9 @@ { "mFile": "檔案 (&&F)", "mEdit": "編輯(&&E)", + "mSelection": "選取項目(&&S)", "mView": "檢視 (&&V)", + "mGoto": "前往(&&G)", "mDebug": "偵錯 (&&D)", "mWindow": "視窗", "mHelp": "說明 (&&H)", @@ -29,6 +31,7 @@ "miCloseWindow": "關閉視窗(&&E)", "miCloseFolder": "關閉資料夾(&&F)", "miCloseEditor": "關閉編輯器(&&C)", + "miExit": "結束(&&X)", "miOpenSettings": "設定(&&S)", "miOpenKeymap": "鍵盤快速鍵(&&K)", "miOpenKeymapExtensions": "按鍵對應延伸模組(&&K)", @@ -40,6 +43,7 @@ "miClearRecentOpen": "清理最近的檔案(&&C)", "miUndo": "復原(&&U)", "miRedo": "重做(&&R)", + "miCut": "剪下(&&T)", "miCopy": "複製(&&C)", "miPaste": "貼上(&&P)", "miFind": "尋找(&&F)", diff --git a/i18n/cht/src/vs/editor/browser/widget/diffEditorWidget.i18n.json b/i18n/cht/src/vs/editor/browser/widget/diffEditorWidget.i18n.json index 121381958b1..a4ab50f8f6a 100644 --- a/i18n/cht/src/vs/editor/browser/widget/diffEditorWidget.i18n.json +++ b/i18n/cht/src/vs/editor/browser/widget/diffEditorWidget.i18n.json @@ -4,6 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "diffEditorInserted": "插入文字的背景色彩。", + "diffEditorRemoved": "移除文字的背景色彩。", "diffEditorInsertedOutline": "插入的文字外框色彩。", "diffEditorRemovedOutline": "移除的文字外框色彩。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/common/theme.i18n.json b/i18n/cht/src/vs/workbench/common/theme.i18n.json index 04db8d8c3c7..57facd966f8 100644 --- a/i18n/cht/src/vs/workbench/common/theme.i18n.json +++ b/i18n/cht/src/vs/workbench/common/theme.i18n.json @@ -33,5 +33,7 @@ "titleBarActiveForeground": "作用中視窗之標題列的前景。請注意,目前只有 macOS 支援此色彩。", "titleBarInactiveForeground": "非作用中視窗之標題列的前景。請注意,目前只有 macOS 支援此色彩。", "titleBarActiveBackground": "作用中視窗之標題列的背景。請注意,目前只有 macOS 支援此色彩。", - "titleBarInactiveBackground": "非作用中視窗之標題列的背景。請注意,目前只有 macOS 支援此色彩。" + "titleBarInactiveBackground": "非作用中視窗之標題列的背景。請注意,目前只有 macOS 支援此色彩。", + "notificationsForeground": "通知的前景色彩。通知從視窗的上方滑入。", + "notificationsBackground": "通知的背景色彩。通知從視窗的上方滑入。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json b/i18n/cht/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json index 8b6ad71cd4e..ff6f3d234e9 100644 --- a/i18n/cht/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "workbench.action.inspectKeyMap": "開發人員: 檢查按鍵對應" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index e61ce405342..c2ab22390ca 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -34,6 +34,7 @@ "editConditionalBreakpoint": "編輯中斷點...", "setValue": "設定值", "addWatchExpression": "加入運算式", + "editWatchExpression": "編輯運算式", "addToWatchExpressions": "加入監看", "removeWatchExpression": "移除運算式", "removeAllWatchExpressions": "移除所有運算式", diff --git a/i18n/cht/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json index 8b6ad71cd4e..8bd875c749d 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "debugToolBarBackground": "偵錯工具列背景色彩。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index 02c3d441b7f..da46c1cbcd0 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -15,5 +15,6 @@ "allowBreakpointsEverywhere": "允許在任何檔案設定中斷點", "openExplorerOnEnd": "自動於偵錯工作階段結束時開啟總管檢視", "inlineValues": "在偵錯時於編輯器以內嵌方式顯示變數值", - "hideActionBar": "控制是否應隱藏浮點偵錯動作列" + "hideActionBar": "控制是否應隱藏浮點偵錯動作列", + "launch": "全域偵錯啟動組態。應當做在工作區之間共用的 'launch.json' 替代方案使用" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index f41f30d5524..d2d63b8b78c 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,6 +7,7 @@ "debugAdapterBinNotFound": "偵錯配接器可執行檔 '{0}' 不存在。", "debugAdapterCannotDetermineExecutable": "無法判斷偵錯配接器 '{0}' 的可執行檔。", "debugType": "組態的類型。", + "debugTypeNotRecognised": "無法辨識此偵錯類型。請安裝對應的偵錯延伸模組。", "node2NotSupported": "\"node2\" 已不再支援,請改用 \"node\",並將 \"protocol\" 屬性設為 \"inspector\"。", "debugName": "組態的名稱; 出現在啟動組態下拉式功能表中。", "debugRequest": "要求組態的類型。可以是 [啟動] 或 [附加]。", diff --git a/i18n/cht/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json index 83e61cd9ea9..71c9d68e192 100644 --- a/i18n/cht/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json @@ -4,6 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "vscode.extension.contributes.view": "提供自訂檢視", + "vscode.extension.contributes.view.id": "用以識別透過 vscode.workspace.createTreeView 建立之檢視的唯一識別碼", + "vscode.extension.contributes.view.label": "用以轉譯檢視的易讀字串", + "vscode.extension.contributes.view.icon": "連到檢視圖示的路徑", + "vscode.extension.contributes.views": "提供自訂檢視", "showViewlet": "顯示 {0}", "view": "檢視" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index c4ae560325b..785e1cb774a 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "reallyRecommended2": "建議對此檔案類型使用 '{0}' 延伸模組。", "showRecommendations": "顯示建議", "neverShowAgain": "不要再顯示", "close": "關閉", diff --git a/i18n/cht/src/vs/workbench/parts/files/browser/saveErrorHandler.i18n.json b/i18n/cht/src/vs/workbench/parts/files/browser/saveErrorHandler.i18n.json index 84b98eb14e0..4a54d52ef90 100644 --- a/i18n/cht/src/vs/workbench/parts/files/browser/saveErrorHandler.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/files/browser/saveErrorHandler.i18n.json @@ -11,5 +11,6 @@ "genericSaveError": "無法儲存 '{0}': {1}", "staleSaveError": "無法儲存 '{0}': 磁碟上的內容較新。請按一下 [比較],比較您的版本與磁碟上的版本。", "compareChanges": "比較", + "saveConflictDiffLabel": "{0} (位於磁碟) ↔ {1} (在 {2} 中) - 解決儲存衝突", "userGuide": "使用編輯器工具列中的動作來「復原」您的變更,或以您的變更「覆寫」磁碟上的內容" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index c3aa093a86d..45b8b75fa83 100644 --- a/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -7,6 +7,7 @@ "keybindingsInputName": "鍵盤快速鍵(&&K)", "SearchKeybindings.AriaLabel": "搜尋按鍵繫結關係", "SearchKeybindings.Placeholder": "搜尋按鍵繫結關係", + "sortByPrecedene": "依優先順序排序", "header-message": "開啟及編輯進階自訂項目時使用", "keybindings-file-name": "keybindings.json", "keybindingsLabel": "按鍵繫結關係", @@ -14,6 +15,7 @@ "addLabel": "新增按鍵繫結關係", "removeLabel": "移除按鍵繫結關係", "resetLabel": "重設按鍵繫結關係", + "showConflictsLabel": "顯示衝突", "copyLabel": "複製", "error": "編輯按鍵繫結關係時發生錯誤 '{0}'。請開啟 'keybindings.json' 檔案加以檢查。", "command": "Command", diff --git a/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index ae979e3f753..a92d2c49e8b 100644 --- a/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -6,6 +6,7 @@ { "openGlobalSettings": "開啟使用者設定", "openGlobalKeybindings": "開啟鍵盤快速鍵", + "openGlobalKeybindingsFile": "開啟鍵盤快速鍵檔案", "openWorkspaceSettings": "開啟工作區設定", "configureLanguageBasedSettings": "設定語言專屬設定...", "languageDescriptionConfigured": "({0})", diff --git a/i18n/cht/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.i18n.json b/i18n/cht/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.i18n.json index 6ecaf06064a..c9a1d537022 100644 --- a/i18n/cht/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.i18n.json @@ -6,5 +6,6 @@ { "default": "預設", "user": "使用者", + "meta": "中繼", "option": "選項" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/cht/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index 1940ac12b6a..8cd8c12aa72 100644 --- a/i18n/cht/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -25,5 +25,6 @@ "colorThemeError": "Theme is unknown or not installed.", "iconTheme": "Specifies the icon theme used in the workbench.", "noIconThemeDesc": "No file icons", - "iconThemeError": "File icon theme is unknown or not installed." + "iconThemeError": "File icon theme is unknown or not installed.", + "workbenchColors.deprecatedDescription": "改用'workbench.colorCustomizations'" } \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json b/i18n/deu/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json index 103994c5799..ff88046159d 100644 --- a/i18n/deu/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json @@ -4,6 +4,9 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "aria.oneReference": "Symbol in {0} in Zeile {1}, Spalte {2}", + "aria.fileReferences.1": "1 Symbol in {0}", + "aria.fileReferences.N": "{0} Symbole in {1}", "aria.result.0": "Es wurden keine Ergebnisse gefunden.", "aria.result.1": "1 Symbol in {0} gefunden", "aria.result.n1": "{0} Symbole in {1} gefunden", diff --git a/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json index 43f87d649f5..feac598aaf2 100644 --- a/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "invalid.color": "Ungültiges Farbformat. Verwenden Sie #RGB, #RGBA, #RRGGBB oder #RRGGBBAA.", "schema.colors": "In der Workbench verwendete Farben.", "foreground": "Allgemeine Vordergrundfarbe. Diese Farbe wird nur verwendet, wenn sie nicht durch eine Komponente überschrieben wird.", "inputBoxBackground": "Hintergrund für Eingabefeld.", diff --git a/i18n/esn/extensions/git/out/commands.i18n.json b/i18n/esn/extensions/git/out/commands.i18n.json index c27d7b65351..9dab0b5e8a8 100644 --- a/i18n/esn/extensions/git/out/commands.i18n.json +++ b/i18n/esn/extensions/git/out/commands.i18n.json @@ -16,6 +16,8 @@ "confirm discard": "¿Está seguro de que quiere descartar los cambios de {0}?", "confirm discard multiple": "¿Está seguro de que quiere descartar los cambios de {0} archivos?", "discard": "Descartar cambios", + "confirm discard all": "¿Está seguro de que quiere descartar TODOS los cambios? Esta acción es irreversible.", + "discardAll": "Descartar cambios", "no changes": "No hay cambios para confirmar.", "commit message": "Mensaje de confirmación", "provide commit message": "Proporcione un mensaje de confirmación", @@ -31,6 +33,7 @@ "no remotes to publish": "El repositorio no tiene remotos configurados en los que publicar.", "disabled": "GIT está deshabilitado o no se admite en esta área de trabajo", "clean repo": "Limpie el árbol de trabajo del repositorio antes de la desprotección.", + "cant push": " No puede ejecutar la solicitud de inserción remotamente. Solicite un Pull para integrar los cambios.", "git error details": "GIT: {0}", "git error": "Error de GIT", "open git log": "Abrir registro de GIT" diff --git a/i18n/esn/extensions/git/package.i18n.json b/i18n/esn/extensions/git/package.i18n.json index 4e347b85640..ee4b5566a5e 100644 --- a/i18n/esn/extensions/git/package.i18n.json +++ b/i18n/esn/extensions/git/package.i18n.json @@ -39,6 +39,8 @@ "config.autofetch": "Si la búsqueda automática está habilitada", "config.enableLongCommitWarning": "Si se debe advertir sobre los mensajes de confirmación largos", "config.confirmSync": "Confirmar antes de sincronizar repositorios GIT", + "config.countBadge": "Controla el contador de insignia de Git. \"Todo\" cuenta todos los cambios. \"Seguimiento\" solamente cuenta los cambios realizados. \"Desactivado\" lo desconecta.", + "config.checkoutType": "Controla el tipo de ramas listadas cuando ejecuta \"Desproteger\". \"Todo\" muetra todas las referencias, \"local\" solamente las ramas locales y \"remoto\" las ramas remotas.", "config.ignoreLegacyWarning": "Ignora las advertencias hereradas de Git", "config.ignoreLimitWarning": "\nIgnora advertencias cuando se encuentran muchos cambios en un repositorio." } \ No newline at end of file diff --git a/i18n/esn/extensions/gulp/package.i18n.json b/i18n/esn/extensions/gulp/package.i18n.json index 8b6ad71cd4e..b8595f4e95f 100644 --- a/i18n/esn/extensions/gulp/package.i18n.json +++ b/i18n/esn/extensions/gulp/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.gulp.autoDetect": "Controla si la detección automática de tareas Gulp esta activada/desactivada. El valor predeterminado es \"activada\"." +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript/out/utils/typingsStatus.i18n.json b/i18n/esn/extensions/typescript/out/utils/typingsStatus.i18n.json index 0d39c772a73..f522401a83d 100644 --- a/i18n/esn/extensions/typescript/out/utils/typingsStatus.i18n.json +++ b/i18n/esn/extensions/typescript/out/utils/typingsStatus.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "installingPackages": "Recuperando cambios en los datos para un mejor rendimiento de TypeScript IntelliSense", + "typesInstallerInitializationFailed.title": "No se pudieron instalar los archivos de lenguaje para las características de lenguaje JavaScript. Asegúrese que NPM está instalado y en su ruta de acceso", "typesInstallerInitializationFailed.moreInformation": "Más información", "typesInstallerInitializationFailed.doNotCheckAgain": "No volver a comprobar", "typesInstallerInitializationFailed.close": "Cerrar" diff --git a/i18n/esn/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json b/i18n/esn/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json index 9622f6f18de..515c40c0c1d 100644 --- a/i18n/esn/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json @@ -4,6 +4,9 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "aria.oneReference": "símbolo en {0} linea {1} en la columna {2}", + "aria.fileReferences.1": "1 símbolo en {0}", + "aria.fileReferences.N": "{0} símbolos en {1}", "aria.result.0": "No se encontraron resultados", "aria.result.1": "Encontró 1 símbolo en {0}", "aria.result.n1": "Encontró {0} símbolos en {1}", diff --git a/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 92df4e9611f..c39e54e06e8 100644 --- a/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -6,6 +6,9 @@ { "editorSuggestWidgetBackground": "Color de fondo del widget sugerido.", "editorSuggestWidgetBorder": "Color de borde del widget sugerido.", + "editorSuggestWidgetForeground": "Color de primer plano del widget sugerido.", + "editorSuggestWidgetSelectedBackground": "Color de fondo de la entrada seleccionada del widget sugerido.", + "editorSuggestWidgetHighlightForeground": "Color del resaltado coincidido en el widget sugerido.", "readMore": "Leer más...{0}", "suggestionWithDetailsAriaLabel": "{0}, sugerencia, con detalles", "suggestionAriaLabel": "{0}, sugerencia", diff --git a/i18n/esn/src/vs/platform/environment/node/argv.i18n.json b/i18n/esn/src/vs/platform/environment/node/argv.i18n.json index 7023f1d6e99..1a1f18154df 100644 --- a/i18n/esn/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/esn/src/vs/platform/environment/node/argv.i18n.json @@ -20,6 +20,7 @@ "showVersions": "Muestra las versiones de las extensiones instaladas cuando se usa --list-extension.", "installExtension": "Instala una extensión.", "uninstallExtension": "Desinstala una extensión.", + "experimentalApis": "Habilita características de API propuestas para una extensión.", "disableExtensions": "Deshabilite todas las extensiones instaladas.", "disableGPU": "Deshabilita la aceleración de hardware de GPU.", "version": "Versión de impresión.", diff --git a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json index a2b4777b597..9d9422600d4 100644 --- a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -4,17 +4,44 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "invalid.color": "Formato de color no válido. Use #TGB, #RBGA, #RRGGBB o #RRGGBBAA", "schema.colors": "Colores usados en el área de trabajo.", "foreground": "Color de primer plano general. Este color solo se usa si un componente no lo invalida.", + "focusBorder": "Color de borde de los elementos con foco. Este color solo se usa si un componente no lo invalida.", + "contrastBorder": "Un borde adicional alrededor de los elementos para separarlos unos de otros y así mejorar el contraste.", + "activeContrastBorder": "Un borde adicional alrededor de los elementos activos para separarlos unos de otros y así mejorar el contraste.", + "widgetShadow": "Color de sombra de los widgets dentro del editor, como buscar/reemplazar", "inputBoxBackground": "Fondo de cuadro de entrada.", "inputBoxForeground": "Primer plano de cuadro de entrada.", "inputBoxBorder": "Borde de cuadro de entrada.", "inputBoxActiveOptionBorder": "Color de borde de opciones activadas en campos de entrada.", + "inputValidationInfoBackground": "Color de fondo de validación de entrada para gravedad de información.", + "inputValidationInfoBorder": "Color de borde de validación de entrada para gravedad de información.", + "inputValidationWarningBackground": "Color de fondo de validación de entrada para advertencia de información.", + "inputValidationWarningBorder": "Color de borde de validación de entrada para gravedad de advertencia.", + "inputValidationErrorBackground": "Color de fondo de validación de entrada para gravedad de error.", + "inputValidationErrorBorder": "Color de borde de valdación de entrada para gravedad de error.", "dropdownBackground": "Fondo de lista desplegable.", "dropdownForeground": "Primer plano de lista desplegable.", "dropdownBorder": "Borde de lista desplegable.", + "listFocusBackground": "Color de fondo de la lista o el árbol del elemento con el foco cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", + "listActiveSelectionBackground": "Color de fondo de la lista o el árbol del elemento seleccionado cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", + "listInactiveSelectionBackground": "Color de fondo de la lista o el árbol del elemento seleccionado cuando la lista o el árbol están inactivos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", + "listActiveSelectionForeground": "Color de primer plano de la lista o el árbol del elemento con el foco cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", + "listFocusAndSelectionBackground": "Color de fondo de la lista o el árbol del elemento con foco y seleccionado cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no. Este color tiene preferencia sobre los colores de selección y foco individuales.", + "listFocusAndSelectionForeground": "Color de primer plano de la lista o el árbol del elemento con foco y seleccionado cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no. Este color tiene preferencia sobre los colores de selección y foco individuales.", + "listHoverBackground": "Fondo de la lista o el árbol al mantener el mouse sobre los elementos.", + "listDropBackground": "Fondo de arrastrar y colocar la lista o el árbol al mover los elementos con el mouse.", + "highlight": "Color de primer plano de la lista o el árbol de las coincidencias resaltadas al buscar dentro de la lista o el ábol.", "pickerGroupForeground": "Selector de color rápido para la agrupación de etiquetas.", "pickerGroupBorder": "Selector de color rápido para la agrupación de bordes.", + "buttonForeground": "Color de primer plano del botón.", + "buttonBackground": "Color de fondo del botón.", + "buttonHoverBackground": "Color de fondo del botón al mantener el puntero.", + "scrollbarShadow": "Sombra de la barra de desplazamiento indica que la vista se ha despazado.", + "scrollbarSliderBackground": "Color de fondo del control deslizante.", + "scrollbarSliderHoverBackground": "Color de fondo del control deslizante al mantener el puntero.", + "scrollbarSliderActiveBackground": "Color de fondo del control deslizante cuando está activo.", "editorBackground": "Color de fondo del editor.", "editorForeground": "Color de primer plano predeterminado del editor.", "editorSelection": "Color de la selección del editor.", diff --git a/i18n/esn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/esn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 88b1764fba9..c59c8f1f1b3 100644 --- a/i18n/esn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -44,6 +44,8 @@ "openPreviousRecentlyUsedEditorInGroup": "Abrir el editor recientemente usado anterior en el grupo", "openNextRecentlyUsedEditorInGroup": "Abrir el siguiente editor recientemente usado en el grupo", "navigateEditorHistoryByInput": "Abrir el editor anterior desde el historial", + "openNextRecentlyUsedEditor": "Abrir el siguiente editor recientemente usado", + "openPreviousRecentlyUsedEditor": "Abrir el anterior editor recientemente usado", "clearEditorHistory": "Borrar historial del editor", "focusLastEditorInStack": "Abrir el último editor del grupo", "moveEditorLeft": "Mover el editor a la izquierda", diff --git a/i18n/esn/src/vs/workbench/common/theme.i18n.json b/i18n/esn/src/vs/workbench/common/theme.i18n.json index 9d8d6d091ae..833a10e06c0 100644 --- a/i18n/esn/src/vs/workbench/common/theme.i18n.json +++ b/i18n/esn/src/vs/workbench/common/theme.i18n.json @@ -12,6 +12,7 @@ "tabActiveEditorGroupInactiveForeground": "Color de primer plano de la pestaña activa en un grupo inactivo. Las pestañas son los contenedores de los editores en el área de editores. Se pueden abrir varias pestañas en un grupo de editores. Puede haber varios grupos de editores.", "tabInactiveEditorGroupActiveForeground": "Color de primer plano de la pestaña inactiva en un grupo activo. Las pestañas son los contenedores de los editores en el área de editores. Se pueden abrir varias pestañas en un grupo de editores. Puede haber varios grupos de editores.", "tabInactiveEditorGroupInactiveForeground": "Color de primer plano de la pestaña inactiva en un grupo inactivo. Las pestañas son los contenedores de los editores en el área de editores. Se pueden abrir varias pestañas en un grupo de editores. Puede haber varios grupos de editores.", + "editorGroupBackground": "Color de fondo de un grupo de editores. Los grupos de editores son los contenedores de los editores. El color de fondo se ve cuando se mueven arrastrando los grupos de editores.", "editorGroupBorder": "Color para separar varios grupos de editores entre sí. Los grupos de editores son los contenedores de los editores.", "editorDragAndDropBackground": "Color de fondo cuando se arrastran editores.", "panelBackground": "Color de fondo del panel. Los paneles se muestran debajo del área de editores y contienen vistas, como Salida y Terminal integrado.", diff --git a/i18n/esn/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json b/i18n/esn/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json index 8b6ad71cd4e..1a9d83970b8 100644 --- a/i18n/esn/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "workbench.action.inspectKeyMap": "Desarrollador: inspeccionar asignaciones de teclas " +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 5850e2e3bb2..820ecf1008f 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -34,6 +34,7 @@ "editConditionalBreakpoint": "Editar punto de interrupción...", "setValue": "Establecer valor", "addWatchExpression": "Agregar expresión", + "editWatchExpression": "Editar expresión", "addToWatchExpressions": "Agregar a inspección", "removeWatchExpression": "Quitar expresión", "removeAllWatchExpressions": "Quitar todas las expresiones", diff --git a/i18n/esn/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json index 8b6ad71cd4e..807b2b2952e 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "debugToolBarBackground": "Color de fondo de la barra de herramientas de depuración" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 3ebe0e22808..7a35ad366fb 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,6 +7,7 @@ "debugAdapterBinNotFound": "El ejecutable del adaptador de depuración \"{0}\" no existe.", "debugAdapterCannotDetermineExecutable": "No se puede determinar el ejecutable para el adaptador de depuración \"{0}\".", "debugType": "Tipo de configuración.", + "debugTypeNotRecognised": "Este tipo de depuración no se reconoce. Instale la correspondiente extensión de depuración.", "node2NotSupported": "\"node2\" ya no se admite; use \"node\" en su lugar y establezca el atributo \"protocol\" en \"inspector\".", "debugName": "Nombre de la configuración. Aparece en el menú desplegable de la configuración de inicio.", "debugRequest": "Tipo de solicitud de la configuración. Puede ser \"launch\" o \"attach\".", diff --git a/i18n/esn/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json index feb00418ee7..37239ff3cca 100644 --- a/i18n/esn/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json @@ -4,6 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "vscode.extension.contributes.view": "Aporta una vista personalizada", + "vscode.extension.contributes.view.id": "Identificador único usado para identificar la vista creada a través de vscode.workspace.createTreeView", + "vscode.extension.contributes.view.label": "Cadena en lenguaje natural usada para representar la vista.", + "vscode.extension.contributes.view.icon": "Ruta de acceso al icono de la vista", + "vscode.extension.contributes.views": "Aporta vistas personalizada", "showViewlet": "Mostrar {0}", "view": "Ver" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 7ef1283f9ad..31318057630 100644 --- a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -6,6 +6,7 @@ { "openGlobalSettings": "Abrir configuración de usuario", "openGlobalKeybindings": "Abrir métodos abreviados de teclado", + "openGlobalKeybindingsFile": "Abrir el archivo de métodos abreviados de teclado", "openWorkspaceSettings": "Abrir configuración del área de trabajo", "configureLanguageBasedSettings": "Configurar opciones específicas del lenguaje...", "languageDescriptionConfigured": "({0})", diff --git a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index b8ae0ec102f..05a4cfef6c7 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -9,6 +9,7 @@ "ConfigureTaskRunnerAction.quickPick.template": "Seleccionar un ejecutador de tareas", "ConfigureTaskRunnerAction.autoDetecting": "Detectando tareas automáticamente para {0}", "ConfigureTaskRunnerAction.autoDetect": "Error de detección automática del sistema de tareas. Se usa la plantilla predeterminada. Consulte el resultado de la tarea para obtener más detalles", + "ConfigureTaskRunnerAction.autoDetectError": "Error de detección automática del sistema de tareas. Consulte el resultado de la tarea para obtener más detalles", "ConfigureTaskRunnerAction.failed": "No se puede crear el archivo \"tasks.json\" dentro de la carpeta \".vscode\". Consulte el resultado de la tarea para obtener más detalles.", "ConfigureTaskRunnerAction.label": "Configurar ejecutor de tareas", "ConfigureBuildTaskAction.label": "Configurar tarea de compilación", diff --git a/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 329fe3c8b20..a2ca73e3dc1 100644 --- a/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -14,6 +14,7 @@ "noIconThemeDesc": "Deshabilitar iconos de archivo", "problemChangingIconTheme": "Problema al configurar el tema de icono: {0}", "themes.selectIconTheme": "Seleccionar tema de icono de archivo", + "generateColorTheme.label": "General el tema de color desde la configuración actual", "preferences": "Preferencias", "developer": "Desarrollador" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json b/i18n/esn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json index b18644a031a..bf82a6e7f65 100644 --- a/i18n/esn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "walkThrough.unboundCommand": "sin enlazar" + "walkThrough.unboundCommand": "sin enlazar", + "walkThrough.gitNotFound": "Parece que GIT no está instalado en el sistema." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json b/i18n/esn/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json index a9799ee79c8..a21b957751a 100644 --- a/i18n/esn/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json +++ b/i18n/esn/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json @@ -6,5 +6,6 @@ { "schema.colors": "Colores para resaltado de sintaxis", "schema.properties.name": "Descripción de la regla", - "schema.fontStyle": "Estilo de fuente de la regla: una opción de \"italic\", \"bold\" y \"underline\", o una combinación de ellas." + "schema.fontStyle": "Estilo de fuente de la regla: una opción de \"italic\", \"bold\" y \"underline\", o una combinación de ellas.", + "schema.tokenColors.path": "Ruta de acceso de la archivo de tema (relativa al archivo actual)" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json b/i18n/esn/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json index d94eb7af67c..464fd1a886e 100644 --- a/i18n/esn/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json +++ b/i18n/esn/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "error.cannotparsejson": "Problemas al analizar el archivo de tema JSON: {0}" + "error.cannotparsejson": "Problemas al analizar el archivo de tema JSON: {0}", + "error.invalidformat.colors": "Problema al analizar el archivo de tema: {0}. La propiedad \"colors\" no es tipo \"object\".", + "error.invalidformat.tokenColors": "Problema al analizar el archivo de tema: {0}. La propiedad 'tokenColors' debería ser una matriz de colores o una ruta de acceso a un archivo texto de tema.", + "error.plist.invalidformat": "Problema al analizar el archivo de tema: {0}. \"settings\" no es una matriz.", + "error.cannotparse": "Problemas al analizar el archivo de tema: {0}", + "error.cannotload": "Problemas al analizar el archivo de tema: {0}:{1}" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/esn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index 5d3877ecd7a..1dd28c717de 100644 --- a/i18n/esn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -25,5 +25,8 @@ "colorThemeError": "Theme is unknown or not installed.", "iconTheme": "Specifies the icon theme used in the workbench.", "noIconThemeDesc": "No file icons", - "iconThemeError": "File icon theme is unknown or not installed." + "iconThemeError": "File icon theme is unknown or not installed.", + "workbenchColors": "Reemplaza los colores del tema de color actual", + "workbenchColors.deprecated": "Esta configuracion no es experimental y se ha cambiado de nombre a 'workbench.colorCustomizations'", + "workbenchColors.deprecatedDescription": "Utilice 'workbench.colorCustomizations' en su lugar" } \ No newline at end of file diff --git a/i18n/fra/extensions/git/out/commands.i18n.json b/i18n/fra/extensions/git/out/commands.i18n.json index 738f408aeaa..2f26d293f1e 100644 --- a/i18n/fra/extensions/git/out/commands.i18n.json +++ b/i18n/fra/extensions/git/out/commands.i18n.json @@ -16,6 +16,8 @@ "confirm discard": "Voulez-vous vraiment abandonner les changements apportés à {0} ?", "confirm discard multiple": "Voulez-vous vraiment abandonner les changements apportés à {0} fichiers ?", "discard": "Ignorer les modifications", + "confirm discard all": "Voulez-vous vraiment ignorer TOUTES les modifications ? Cette action est IRRÉVERSIBLE.", + "discardAll": "Ignorer TOUTES les modifications", "no changes": "Il n'existe aucun changement à valider.", "commit message": "Message de validation", "provide commit message": "Indiquez un message de validation", @@ -31,6 +33,7 @@ "no remotes to publish": "Votre dépôt n'a aucun dépôt distant configuré pour une publication.", "disabled": "Git est désactivé ou non pris en charge dans cet espace de travail", "clean repo": "Nettoyez l'arborescence de travail de votre dépôt avant l'extraction.", + "cant push": "Push impossible des références vers la branche distante. Exécutez d'abord 'Extraire' pour intégrer vos modifications.", "git error details": "Git : {0}", "git error": "Erreur Git", "open git log": "Ouvrir le journal Git" diff --git a/i18n/fra/extensions/git/package.i18n.json b/i18n/fra/extensions/git/package.i18n.json index a2aa4ce8ddf..801419a6433 100644 --- a/i18n/fra/extensions/git/package.i18n.json +++ b/i18n/fra/extensions/git/package.i18n.json @@ -39,6 +39,8 @@ "config.autofetch": "Indique si la récupération automatique est activée", "config.enableLongCommitWarning": "Indique si les longs messages de validation doivent faire l'objet d'un avertissement", "config.confirmSync": "Confirmer avant de synchroniser des dépôts git", + "config.countBadge": "Contrôle le compteur de badges Git. La valeur 'toutes' compte toutes les modifications. La valeur 'suivies' compte uniquement les modifications suivies. La valeur 'désactivé' désactive le compteur.", + "config.checkoutType": "Contrôle le type des branches répertoriées pendant l'exécution de 'Extraire vers...'. La valeur 'toutes' montre toutes les références, la valeur 'locales' montre uniquement les branches locales, la valeur 'balises' montre uniquement les balises et la valeur 'distantes' montre uniquement les branches distantes.", "config.ignoreLegacyWarning": "Ignore l'avertissement Git hérité", "config.ignoreLimitWarning": "Ignore l'avertissement quand il y a trop de modifications dans un dépôt" } \ No newline at end of file diff --git a/i18n/fra/extensions/gulp/package.i18n.json b/i18n/fra/extensions/gulp/package.i18n.json index 8b6ad71cd4e..98a28783ec8 100644 --- a/i18n/fra/extensions/gulp/package.i18n.json +++ b/i18n/fra/extensions/gulp/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.gulp.autoDetect": "Contrôle si la détection automatique des tâches Gulp est activée ou désactivée. La valeur par défaut est activée." +} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript/out/utils/typingsStatus.i18n.json b/i18n/fra/extensions/typescript/out/utils/typingsStatus.i18n.json index 0b61796218c..d9cc787276c 100644 --- a/i18n/fra/extensions/typescript/out/utils/typingsStatus.i18n.json +++ b/i18n/fra/extensions/typescript/out/utils/typingsStatus.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "installingPackages": "Récupération (fetch) des données pour l'amélioration de TypeScript IntelliSense", + "typesInstallerInitializationFailed.title": "Impossible d'installer des fichiers de typages pour les fonctionnalités du langage JavaScript. Vérifiez que NPM est installé et se trouve dans votre chemin", "typesInstallerInitializationFailed.moreInformation": "Informations", "typesInstallerInitializationFailed.doNotCheckAgain": "Ne plus vérifier", "typesInstallerInitializationFailed.close": "Fermer" diff --git a/i18n/fra/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json b/i18n/fra/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json index 6440507bb59..e4871d36b89 100644 --- a/i18n/fra/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json +++ b/i18n/fra/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json @@ -4,6 +4,9 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "aria.oneReference": "symbole dans {0} sur la ligne {1}, colonne {2}", + "aria.fileReferences.1": "1 symbole dans {0}", + "aria.fileReferences.N": "{0} symboles dans {1}", "aria.result.0": "Résultats introuvables", "aria.result.1": "1 symbole dans {0}", "aria.result.n1": "{0} symboles dans {1}", diff --git a/i18n/fra/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/fra/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index cae2864bf7a..3e58c829119 100644 --- a/i18n/fra/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/fra/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -6,6 +6,9 @@ { "editorSuggestWidgetBackground": "Couleur d'arrière-plan du widget de suggestion.", "editorSuggestWidgetBorder": "Couleur de bordure du widget de suggestion.", + "editorSuggestWidgetForeground": "Couleur de premier plan du widget de suggestion.", + "editorSuggestWidgetSelectedBackground": "Couleur d'arrière-plan de l'entrée sélectionnée dans le widget de suggestion.", + "editorSuggestWidgetHighlightForeground": "Couleur de la surbrillance des correspondances dans le widget de suggestion.", "readMore": "En savoir plus...{0}", "suggestionWithDetailsAriaLabel": "{0}, suggestion, avec détails", "suggestionAriaLabel": "{0}, suggestion", diff --git a/i18n/fra/src/vs/platform/environment/node/argv.i18n.json b/i18n/fra/src/vs/platform/environment/node/argv.i18n.json index 49e7a265668..b4a7b53c42b 100644 --- a/i18n/fra/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/fra/src/vs/platform/environment/node/argv.i18n.json @@ -20,6 +20,7 @@ "showVersions": "Affichez les versions des extensions installées, quand --list-extension est utilisé.", "installExtension": "Installe une extension.", "uninstallExtension": "Désinstalle une extension.", + "experimentalApis": "Active les fonctionnalités d'API proposées pour une extension.", "disableExtensions": "Désactivez toutes les extensions installées.", "disableGPU": "Désactivez l'accélération matérielle du GPU.", "version": "Affichez la version.", diff --git a/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json index 1fad25c1f71..45d1776b2ba 100644 --- a/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -4,17 +4,44 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "invalid.color": "Format de couleur non valide. Utilisez #RGB, #RGBA, #RRGGBB ou #RRGGBBAA", "schema.colors": "Couleurs utilisées dans le banc d'essai.", "foreground": "Couleur de premier plan globale. Cette couleur est utilisée si elle n'est pas remplacée par un composant.", + "focusBorder": "Couleur de bordure globale des éléments ayant le focus. Cette couleur est utilisée si elle n'est pas remplacée par un composant.", + "contrastBorder": "Bordure supplémentaire autour des éléments pour les séparer des autres et obtenir un meilleur contraste.", + "activeContrastBorder": "Bordure supplémentaire autour des éléments actifs pour les séparer des autres et obtenir un meilleur contraste.", + "widgetShadow": "Couleur de l'ombre des widgets, comme rechercher/remplacer, au sein de l'éditeur.", "inputBoxBackground": "Arrière-plan de la zone d'entrée.", "inputBoxForeground": "Premier plan de la zone d'entrée.", "inputBoxBorder": "Bordure de la zone d'entrée.", "inputBoxActiveOptionBorder": "Couleur de la bordure des options activées dans les champs d'entrée.", + "inputValidationInfoBackground": "Couleur d'arrière-plan de la validation d'entrée pour la gravité des informations.", + "inputValidationInfoBorder": "Couleur de bordure de la validation d'entrée pour la gravité des informations.", + "inputValidationWarningBackground": "Couleur d'arrière-plan de la validation d'entrée pour l'avertissement sur les informations.", + "inputValidationWarningBorder": "Couleur de bordure de la validation d'entrée pour la gravité de l'avertissement.", + "inputValidationErrorBackground": "Couleur d'arrière-plan de la validation d'entrée pour la gravité de l'erreur.", + "inputValidationErrorBorder": "Couleur de bordure de la validation d'entrée pour la gravité de l'erreur. ", "dropdownBackground": "Arrière-plan de la liste déroulante.", "dropdownForeground": "Premier plan de la liste déroulante.", "dropdownBorder": "Bordure de la liste déroulante.", + "listFocusBackground": "Couleur d'arrière-plan de la liste/l'arborescence pour l'élément ayant le focus quand la liste/l'arborescence est active. Une liste/aborescence active peut être sélectionnée au clavier, elle ne l'est pas quand elle est inactive.", + "listActiveSelectionBackground": "Couleur d'arrière-plan de la liste/l'arborescence de l'élément sélectionné quand la liste/l'arborescence est active. Une liste/arborescence active peut être sélectionnée au clavier, elle ne l'est pas quand elle est inactive.", + "listInactiveSelectionBackground": "Couleur d'arrière-plan de la liste/l'arborescence pour l'élément sélectionné quand la liste/l'arborescence est inactive. Une liste/aborescence active peut être sélectionnée au clavier, elle ne l'est pas quand elle est inactive.", + "listActiveSelectionForeground": "Couleur de premier plan de la liste/l'arborescence pour l'élément sélectionné quand la liste/l'arborescence est active. Une liste/aborescence active peut être sélectionnée au clavier, elle ne l'est pas quand elle est inactive.", + "listFocusAndSelectionBackground": "Couleur d'arrière-plan de la liste/l'arborescence pour l'élément ayant le focus et sélectionné quand la liste/l'arborescence est active. Une liste/aborescence active peut être sélectionnée au clavier, elle ne l'est pas quand elle est inactive. Cette couleur l'emporte sur les couleurs individuelles de la sélection et du focus.", + "listFocusAndSelectionForeground": "Couleur de premier plan de la liste/l'arborescence pour l'élément ayant le focus et sélectionné quand la liste/l'arborescence est active. Une liste/aborescence active peut être sélectionnée au clavier, elle ne l'est pas quand elle est inactive. Cette couleur l'emporte sur les couleurs individuelles de la sélection et du focus.", + "listHoverBackground": "Arrière-plan de la liste/l'arborescence pendant le pointage sur des éléments avec la souris.", + "listDropBackground": "Arrière-plan de l'opération de glisser-déplacer dans une liste/arborescence pendant le déplacement d'éléments avec la souris.", + "highlight": "Couleur de premier plan dans la liste/l'arborescence pour la surbrillance des correspondances pendant la recherche dans une liste/arborescence.", "pickerGroupForeground": "Couleur du sélecteur rapide pour les étiquettes de regroupement.", "pickerGroupBorder": "Couleur du sélecteur rapide pour les bordures de regroupement.", + "buttonForeground": "Couleur de premier plan du bouton.", + "buttonBackground": "Couleur d'arrière-plan du bouton.", + "buttonHoverBackground": "Couleur d'arrière-plan du bouton pendant le pointage.", + "scrollbarShadow": "Ombre de la barre de défilement pour indiquer que la vue défile.", + "scrollbarSliderBackground": "Couleur d'arrière-plan du curseur.", + "scrollbarSliderHoverBackground": "Couleur d'arrière-plan du curseur pendant le pointage.", + "scrollbarSliderActiveBackground": "Couleur d'arrière-plan du curseur actif.", "editorBackground": "Couleur d'arrière-plan de l'éditeur.", "editorForeground": "Couleur de premier plan par défaut de l'éditeur.", "editorSelection": "Couleur de la sélection de l'éditeur.", diff --git a/i18n/fra/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/fra/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 461dbd7c73b..044f984b1ac 100644 --- a/i18n/fra/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -44,6 +44,8 @@ "openPreviousRecentlyUsedEditorInGroup": "Ouvrir l'éditeur précédent du groupe", "openNextRecentlyUsedEditorInGroup": "Ouvrir l'éditeur suivant du groupe", "navigateEditorHistoryByInput": "Ouvrir l'éditeur précédent dans l'historique", + "openNextRecentlyUsedEditor": "Ouvrir l'éditeur suivant", + "openPreviousRecentlyUsedEditor": "Ouvrir l'éditeur précédent", "clearEditorHistory": "Effacer l'historique de l'éditeur", "focusLastEditorInStack": "Ouvrir le dernier éditeur du groupe", "moveEditorLeft": "Déplacer l'éditeur vers la gauche", diff --git a/i18n/fra/src/vs/workbench/common/theme.i18n.json b/i18n/fra/src/vs/workbench/common/theme.i18n.json index d27b5b34976..e958fad7ce5 100644 --- a/i18n/fra/src/vs/workbench/common/theme.i18n.json +++ b/i18n/fra/src/vs/workbench/common/theme.i18n.json @@ -12,8 +12,11 @@ "tabActiveEditorGroupInactiveForeground": "Couleur de premier plan de l'onglet actif dans un groupe inactif. Les onglets sont les conteneurs des éditeurs dans la zone d'éditeurs. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", "tabInactiveEditorGroupActiveForeground": "Couleur de premier plan de l'onglet inactif dans un groupe actif. Les onglets sont les conteneurs des éditeurs dans la zone d'éditeurs. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", "tabInactiveEditorGroupInactiveForeground": "Couleur de premier plan de l'onglet inactif dans un groupe inactif. Les onglets sont les conteneurs des éditeurs dans la zone d'éditeurs. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", + "editorGroupBackground": "Couleur d'arrière-plan d'un groupe d'éditeurs. Les groupes d'éditeurs sont les conteneurs des éditeurs. La couleur d'arrière-plan s'affiche pendant le glissement de groupes d'éditeurs.", + "editorGroupHeaderBackground": "Couleur d'arrière-plan de l'en-tête du titre du groupe d'éditeurs quand les onglets sont désactivés. Les groupes d'éditeurs sont les conteneurs des éditeurs.", "editorGroupBorder": "Couleur séparant plusieurs groupes d'éditeurs les uns des autres. Les groupes d'éditeurs sont les conteneurs des éditeurs.", "editorDragAndDropBackground": "Couleur d'arrière-plan durant le déplacement des éditeurs.", + "editorMasterDetailsBorder": "Couleur de bordure séparant les détails côté maître des éditeurs côte à côte. Par exemple, les éditeurs de différences et l'éditeur de paramètres.", "panelBackground": "Couleur d'arrière-plan du panneau. Les panneaux s'affichent sous la zone d'éditeurs et contiennent des affichages tels que la sortie et le terminal intégré.", "panelBorder": "Couleur de bordure de panneau dans la partie supérieure de séparation de l'éditeur. Les panneaux s'affichent sous la zone d'éditeurs et contiennent des affichages tels que la sortie et le terminal intégré.", "panelActiveTitleForeground": "Couleur du titre du panneau actif. Les panneaux se situent sous la zone de l'éditeur et contiennent des affichages comme la sortie et le terminal intégré.", @@ -24,6 +27,8 @@ "statusBarNoFolderBackground": "Couleur d'arrière-plan de la barre d'état quand aucun dossier n'est ouvert. La barre d'état est affichée en bas de la fenêtre.", "statusBarItemActiveBackground": "Couleur d'arrière-plan de l'élément de la barre d'état durant un clic. La barre d'état est affichée en bas de la fenêtre.", "statusBarItemHoverBackground": "Couleur d'arrière-plan de l'élément de la barre d'état durant un pointage. La barre d'état est affichée en bas de la fenêtre.", + "statusBarProminentItemBackground": "Couleur d'arrière-plan des éléments importants de la barre d'état. Les éléments importants se différencient des autres entrées de la barre d'état pour indiquer l'importance. La barre d'état est affichée en bas de la fenêtre.", + "statusBarProminentItemHoverBackground": "Couleur d'arrière-plan des éléments importants de la barre d'état pendant le pointage. Les éléments importants se différencient des autres entrées de la barre d'état pour indiquer l'importance. La barre d'état est affichée en bas de la fenêtre.", "activityBarBackground": "Couleur d'arrière-plan de la barre d'activités. La barre d'activités s'affiche complètement à gauche ou à droite, et permet de naviguer entre les affichages de la barre latérale.", "activityBarForeground": "Couleur de premier plan de la barre d'activités (par ex., utilisée pour les icônes). La barre d'activités s'affiche complètement à gauche ou à droite, et permet de parcourir les vues de la barre latérale.", "activityBarDragAndDropBackground": "Couleur des commentaires sur une opération de glisser-déplacer pour les éléments de la barre d'activités. La barre d'activités, située à l'extrême gauche ou droite, permet de basculer entre les affichages de la barre latérale.", @@ -31,8 +36,11 @@ "activityBarBadgeForeground": "Couleur de premier plan du badge de notification d'activité. La barre d'activités, située à l'extrême gauche ou droite, permet de basculer entre les affichages de la barre latérale.", "sideBarBackground": "Couleur d'arrière-plan de la barre latérale. La barre latérale est le conteneur des affichages tels que ceux de l'exploration et la recherche.", "sideBarTitleForeground": "Couleur de premier plan du titre de la barre latérale. La barre latérale est le conteneur des affichages tels que ceux de l'exploration et la recherche.", + "sideBarSectionHeaderBackground": "Couleur d'arrière-plan de l'en-tête de section de la barre latérale. La barre latérale est le conteneur des vues comme celles de l'explorateur et la recherche.", "titleBarActiveForeground": "Premier plan de la barre de titre quand la fenêtre est active. Notez que cette couleur est uniquement prise en charge sur macOS.", "titleBarInactiveForeground": "Premier plan de la barre de titre quand la fenêtre est inactive. Notez que cette couleur est uniquement prise en charge sur macOS.", "titleBarActiveBackground": "Arrière-plan de la barre de titre quand la fenêtre est active. Notez que cette couleur est uniquement prise en charge sur macOS.", - "titleBarInactiveBackground": "Arrière-plan de la barre de titre quand la fenêtre est inactive. Notez que cette couleur est uniquement prise en charge sur macOS." + "titleBarInactiveBackground": "Arrière-plan de la barre de titre quand la fenêtre est inactive. Notez que cette couleur est uniquement prise en charge sur macOS.", + "notificationsForeground": "Couleur de premier plan des notifications. Les notifications défilent à partir du haut de la fenêtre.", + "notificationsBackground": "Couleur d'arrière-plan des notifications. Les notifications défilent à paritr du haut de la fenêtre." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json b/i18n/fra/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json index 8b6ad71cd4e..e677c5f3571 100644 --- a/i18n/fra/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "workbench.action.inspectKeyMap": "Développeur : Inspecter les mappages de touches" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index e52f1c8e8ea..1783ec559cb 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -34,6 +34,7 @@ "editConditionalBreakpoint": "Modifier un point d'arrêt...", "setValue": "Définir la valeur", "addWatchExpression": "Ajouter une expression", + "editWatchExpression": "Modifier l'expression", "addToWatchExpressions": "Ajouter à la fenêtre Espion", "removeWatchExpression": "Supprimer une expression", "removeAllWatchExpressions": "Supprimer toutes les expressions", diff --git a/i18n/fra/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json index 8b6ad71cd4e..2cfe628ea39 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "debugToolBarBackground": "Couleur d'arrière-plan de la barre d'outils de débogage." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 37eac1f9620..bcdf182d522 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,6 +7,7 @@ "debugAdapterBinNotFound": "L'exécutable d'adaptateur de débogage '{0}' n'existe pas.", "debugAdapterCannotDetermineExecutable": "Impossible de déterminer l'exécutable pour l'adaptateur de débogage '{0}'.", "debugType": "Type de configuration.", + "debugTypeNotRecognised": "Ce type de débogage n'est pas reconnu. Installez l'extension de débogage correspondante.", "node2NotSupported": "\"node2\" n'est plus pris en charge. Utilisez \"node\" à la place, et affectez la valeur \"inspector\" à l'attribut \"protocol\".", "debugName": "Le nom de la configuration s'affiche dans le menu déroulant de la configuration de lancement.", "debugRequest": "Type de requête de configuration. Il peut s'agir de \"launch\" ou \"attach\".", diff --git a/i18n/fra/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json index c0fac8346b8..82bea9c4375 100644 --- a/i18n/fra/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json @@ -4,6 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "vscode.extension.contributes.view": "Ajoute une vue personnalisée", + "vscode.extension.contributes.view.id": "ID unique utilisé pour identifier la vue créée avec vscode.workspace.createTreeView", + "vscode.extension.contributes.view.label": "Chaîne contrôlable de visu permettant d'afficher la vue", + "vscode.extension.contributes.view.icon": "Chemin de l'icône de la vue", + "vscode.extension.contributes.views": "Ajoute des vues personnalisées", "showViewlet": "Afficher {0}", "view": "Affichage" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 5f3ed88ebd2..61742507b36 100644 --- a/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -6,6 +6,7 @@ { "openGlobalSettings": "Ouvrir les paramètres utilisateur", "openGlobalKeybindings": "Ouvrir les raccourcis clavier", + "openGlobalKeybindingsFile": "Ouvrir le fichier des raccourcis clavier", "openWorkspaceSettings": "Ouvrir les paramètres d'espace de travail", "configureLanguageBasedSettings": "Configurer les paramètres spécifiques au langage...", "languageDescriptionConfigured": "({0})", diff --git a/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 0c1b20136ea..e0173fcde81 100644 --- a/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -9,6 +9,7 @@ "ConfigureTaskRunnerAction.quickPick.template": "Sélectionner un exécuteur de tâches", "ConfigureTaskRunnerAction.autoDetecting": "Détection automatique des tâches pour {0}", "ConfigureTaskRunnerAction.autoDetect": "En raison de l'échec de la détection automatique du système de tâche, le modèle par défaut va être utilisé. Pour plus d'informations, consultez la sortie de la tâche.", + "ConfigureTaskRunnerAction.autoDetectError": "La détection automatique du système de tâche a produit des erreurs. Consultez la sortie de la tâche pour plus d'informations.", "ConfigureTaskRunnerAction.failed": "Impossible de créer le fichier 'tasks.json' dans le dossier '.vscode'. Pour plus d'informations, consultez la sortie de la tâche.", "ConfigureTaskRunnerAction.label": "Configurer l'exécuteur de tâches", "ConfigureBuildTaskAction.label": "Configurer une tâche de build", diff --git a/i18n/fra/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 8ad3a81eb90..17bcf71d09f 100644 --- a/i18n/fra/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -14,6 +14,7 @@ "noIconThemeDesc": "Désactiver les icônes de fichiers", "problemChangingIconTheme": "Problème de définition du thème d'icône : {0}", "themes.selectIconTheme": "Sélectionner un thème d'icône de fichier", + "generateColorTheme.label": "Générer le thème de couleur à partir des paramètres actuels", "preferences": "Préférences", "developer": "Développeur" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json b/i18n/fra/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json index 1b65f474a56..a27dad756b1 100644 --- a/i18n/fra/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "walkThrough.unboundCommand": "indépendant" + "walkThrough.unboundCommand": "indépendant", + "walkThrough.gitNotFound": "Git semble ne pas être installé sur votre système." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json b/i18n/fra/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json index d48cbf383ce..2eb42546905 100644 --- a/i18n/fra/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json +++ b/i18n/fra/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json @@ -6,5 +6,6 @@ { "schema.colors": "Couleurs de la coloration syntaxique", "schema.properties.name": "Description de la règle", - "schema.fontStyle": "Style de police de la règle : 'italique', 'gras' ou 'souligné', ou une combinaison de ces styles" + "schema.fontStyle": "Style de police de la règle : 'italique', 'gras' ou 'souligné', ou une combinaison de ces styles", + "schema.tokenColors.path": "Chemin d'un fichier tmTheme (relatif au fichier actuel)" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json b/i18n/fra/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json index 4849a048ec4..2d6a6848e27 100644 --- a/i18n/fra/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json +++ b/i18n/fra/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "error.cannotparsejson": "Problèmes durant l'analyse du fichier de thème JSON : {0}" + "error.cannotparsejson": "Problèmes durant l'analyse du fichier de thème JSON : {0}", + "error.invalidformat.colors": "Problème pendant l'analyse du fichier de thème de couleur : {0}. La propriété 'colors' n'est pas de type 'object'.", + "error.invalidformat.tokenColors": "Problème pendant l'analyse du fichier de thème de couleur : {0}. La propriété 'tokenColors' doit être un tableau spécifiant des couleurs ou le chemin d'un fichier de thème TextMate", + "error.plist.invalidformat": "Problème pendant l'analyse du fichier tmTheme : {0}. 'settings' n'est pas un tableau.", + "error.cannotparse": "Problèmes pendant l'analyse du fichier tmTheme : {0}", + "error.cannotload": "Problèmes pendant le chargement du fichier tmTheme {0} : {1}" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/fra/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index 3181391a3b2..01dfa20dfb8 100644 --- a/i18n/fra/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -25,5 +25,8 @@ "colorThemeError": "Theme is unknown or not installed.", "iconTheme": "Specifies the icon theme used in the workbench.", "noIconThemeDesc": "No file icons", - "iconThemeError": "File icon theme is unknown or not installed." + "iconThemeError": "File icon theme is unknown or not installed.", + "workbenchColors": "Remplace les couleurs du thème de couleur sélectionné.", + "workbenchColors.deprecated": "Le paramètre n'est plus expérimental et a été renommé 'workbench.colorCustomizations'", + "workbenchColors.deprecatedDescription": "Utiliser 'workbench.colorCustomizations' à la place" } \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json b/i18n/ita/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json index c826bb2090e..63fbdbdb30f 100644 --- a/i18n/ita/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json @@ -4,6 +4,9 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "aria.oneReference": "simbolo in {0} alla riga {1} colonna {2}", + "aria.fileReferences.1": "1 simbolo in {0}", + "aria.fileReferences.N": "{0} simboli in {1}", "aria.result.0": "Non sono stati trovati risultati", "aria.result.1": "Trovato 1 simbolo in {0}", "aria.result.n1": "Trovati {0} simboli in {1}", diff --git a/i18n/ita/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/ita/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 8bd52bf0652..6d495a04fda 100644 --- a/i18n/ita/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -6,6 +6,9 @@ { "editorSuggestWidgetBackground": "Colore di sfondo del widget dei suggerimenti.", "editorSuggestWidgetBorder": "Colore del bordo del widget dei suggerimenti.", + "editorSuggestWidgetForeground": "Colore primo piano del widget dei suggerimenti.", + "editorSuggestWidgetSelectedBackground": "Colore di sfondo della voce selezionata del widget dei suggerimenti.", + "editorSuggestWidgetHighlightForeground": "Colore delle evidenziazioni corrispondenze nel widget dei suggerimenti.", "readMore": "Altre informazioni...{0}", "suggestionWithDetailsAriaLabel": "{0}, suggerimento, con dettagli", "suggestionAriaLabel": "{0}, suggerimento", diff --git a/i18n/ita/src/vs/platform/environment/node/argv.i18n.json b/i18n/ita/src/vs/platform/environment/node/argv.i18n.json index ef50677325d..e9a4ecff7e0 100644 --- a/i18n/ita/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/ita/src/vs/platform/environment/node/argv.i18n.json @@ -20,6 +20,7 @@ "showVersions": "Mostra le versioni delle estensioni installate, quando si usa --list-extension.", "installExtension": "Installa un'estensione.", "uninstallExtension": "Disinstalla un'estensione.", + "experimentalApis": "Abilita funzionalità di API proposte per un'estensione specifica.", "disableExtensions": "Disabilita tutte le estensioni installate.", "disableGPU": "Disabilita l'accelerazione hardware della GPU.", "version": "Visualizza la versione.", diff --git a/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json index 1f6ffb780e6..92990d65a8a 100644 --- a/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -4,17 +4,38 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "invalid.color": "Formato colore non valido. Usare #RGB, #RGBA, #RRGGBB o #RRGGBBAA", "schema.colors": "Colori usati nell'area di lavoro.", "foreground": "Colore primo piano. Questo colore è utilizzato solo se non viene sovrascritto da un componente.", + "focusBorder": "Colore dei bordi degli elementi evidenziati. Questo colore è utilizzato solo se non viene sovrascritto da un componente.", + "contrastBorder": "Un bordo supplementare attorno agli elementi per contrastarli maggiormente rispetto agli altri.", + "activeContrastBorder": "Un bordo supplementare intorno agli elementi attivi per contrastarli maggiormente rispetto agli altri.", + "widgetShadow": "Colore ombreggiatura dei widget, ad es. Trova/Sostituisci all'interno dell'editor.", "inputBoxBackground": "Sfondo della casella di input.", "inputBoxForeground": "Primo piano della casella di input.", "inputBoxBorder": "Bordo della casella di input.", "inputBoxActiveOptionBorder": "Colore del bordo di opzioni attivate nei campi di input.", + "inputValidationInfoBackground": "Colore di sfondo di convalida dell'input di tipo Informazione.", + "inputValidationInfoBorder": "Colore bordo di convalida dell'input di tipo Informazione.", + "inputValidationWarningBackground": "Colore di sfondo di convalida dell'input di tipo Avviso.", + "inputValidationWarningBorder": "Colore bordo di convalida dell'input di tipo Avviso.", + "inputValidationErrorBackground": "Colore di sfondo di convalida dell'input di tipo Errore.", + "inputValidationErrorBorder": "Colore bordo di convalida dell'input di tipo Errore.", "dropdownBackground": "Sfondo dell'elenco a discesa.", "dropdownForeground": "Primo piano dell'elenco a discesa.", "dropdownBorder": "Bordo dell'elenco a discesa.", + "listHoverBackground": "Sfondo Elenco/Struttura ad albero al passaggio del mouse sugli elementi.", + "listDropBackground": "Sfondo Elenco/Struttura ad albero durante il trascinamento degli elementi selezionati.", + "highlight": "Colore primo piano Elenco/Struttura ad albero delle occorrenze trovate durante la ricerca nell'Elenco/Struttura ad albero.", "pickerGroupForeground": "Colore di selezione rapida per il raggruppamento delle etichette.", "pickerGroupBorder": "Colore di selezione rapida per il raggruppamento dei bordi.", + "buttonForeground": "Colore primo piano del pulsante.", + "buttonBackground": "Colore di sfondo del pulsante.", + "buttonHoverBackground": "Colore di sfondo del pulsante al passaggio del mouse.", + "scrollbarShadow": "Ombra di ScrollBar per indicare lo scorrimento della visualizzazione.", + "scrollbarSliderBackground": "Colore di sfondo dello Slider.", + "scrollbarSliderHoverBackground": "Colore di sfondo dello Slider al passaggio del mouse", + "scrollbarSliderActiveBackground": "Colore di sfondo dello Slider quando attivo.", "editorBackground": "Colore di sfondo dell'editor.", "editorForeground": "Colore primo piano predefinito dell'editor.", "editorSelection": "Colore della selezione dell'editor.", diff --git a/i18n/jpn/extensions/git/out/commands.i18n.json b/i18n/jpn/extensions/git/out/commands.i18n.json index 9ff7d6a1f7c..0e42fe3c0fd 100644 --- a/i18n/jpn/extensions/git/out/commands.i18n.json +++ b/i18n/jpn/extensions/git/out/commands.i18n.json @@ -16,6 +16,8 @@ "confirm discard": "{0} の変更を破棄しますか?", "confirm discard multiple": "{0} 個のファイルの変更内容を破棄しますか?", "discard": "変更を破棄", + "confirm discard all": "すべての変更を破棄しますか? 変更は戻りません!", + "discardAll": "すべての変更を破棄", "no changes": "コミットする必要のある変更はありません。", "commit message": "コミット メッセージ", "provide commit message": "コミット メッセージを入力してください", diff --git a/i18n/jpn/extensions/git/package.i18n.json b/i18n/jpn/extensions/git/package.i18n.json index 86293d87d2b..f991c6d1789 100644 --- a/i18n/jpn/extensions/git/package.i18n.json +++ b/i18n/jpn/extensions/git/package.i18n.json @@ -39,6 +39,7 @@ "config.autofetch": "自動フェッチが有効かどうか", "config.enableLongCommitWarning": "長いコミット メッセージについて警告するかどうか", "config.confirmSync": "Git リポジトリを同期する前に確認する", + "config.countBadge": "Git バッジ カウンターを制御します。`all` はすべての変更をカウントします。 `tracked` は追跡している変更のみカウントします。 `off` はカウントをオフします。", "config.ignoreLegacyWarning": "旧 Git の警告を無視します", "config.ignoreLimitWarning": "リポジトリ内に変更が多い場合は警告を無視します" } \ No newline at end of file diff --git a/i18n/jpn/extensions/gulp/package.i18n.json b/i18n/jpn/extensions/gulp/package.i18n.json index 8b6ad71cd4e..1db590a1354 100644 --- a/i18n/jpn/extensions/gulp/package.i18n.json +++ b/i18n/jpn/extensions/gulp/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.gulp.autoDetect": "Gulp タスクの自動検出をオンにするかオフにするかを制御します。既定はオンです。" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript/out/utils/typingsStatus.i18n.json b/i18n/jpn/extensions/typescript/out/utils/typingsStatus.i18n.json index 3a40c2e29d9..5696b940392 100644 --- a/i18n/jpn/extensions/typescript/out/utils/typingsStatus.i18n.json +++ b/i18n/jpn/extensions/typescript/out/utils/typingsStatus.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "installingPackages": "より適した TypeScript IntelliSense に関するデータをフェッチしています", + "typesInstallerInitializationFailed.title": "JavaScript 言語機能のための型定義ファイルをインストールできませんでした。NPM がインストールされ、PATH にあることを確認してください。", "typesInstallerInitializationFailed.moreInformation": "詳細情報", "typesInstallerInitializationFailed.doNotCheckAgain": "今後確認しない", "typesInstallerInitializationFailed.close": "閉じる" diff --git a/i18n/jpn/extensions/typescript/package.i18n.json b/i18n/jpn/extensions/typescript/package.i18n.json index 35c289eb3d5..ebe67b59e75 100644 --- a/i18n/jpn/extensions/typescript/package.i18n.json +++ b/i18n/jpn/extensions/typescript/package.i18n.json @@ -38,6 +38,6 @@ "typescript.openTsServerLog.title": "TS サーバーのログ ファイルを開く", "typescript.selectTypeScriptVersion.title": "TypeScript のバージョンの選択", "jsDocCompletion.enabled": " 自動 JSDoc コメントを有効/無効にします", - "javascript.implicitProjectConfig.checkJs": "JavaScript ファイルのセマンティック チェックを有効/無効にします。既存の jsconfi.json や tsconfi.json ファイルの設定はこれより優先されます。 TypeScript は 2.3.1 以上である必要があります。", + "javascript.implicitProjectConfig.checkJs": "JavaScript ファイルのセマンティック チェックを有効/無効にします。既存の jsconfi.json や tsconfi.json ファイルの設定はこれより優先されます。TypeScript は 2.3.1 以上である必要があります。", "typescript.check.npmIsInstalled": "型定義の自動取得に NPM がインストールされているかどうかを確認する" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json b/i18n/jpn/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json index 33c314603a1..0e09eb3904d 100644 --- a/i18n/jpn/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json @@ -4,6 +4,9 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "aria.oneReference": "列 {2} の {1} 行目に {0} つのシンボル", + "aria.fileReferences.1": "{0} に 1 個のシンボル", + "aria.fileReferences.N": "{1} に {0} 個のシンボル", "aria.result.0": "一致する項目はありません", "aria.result.1": "{0} に 1 個のシンボルが見つかりました", "aria.result.n1": "{1} に {0} 個のシンボルが見つかりました", diff --git a/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index b1177964ccf..225b4c1b85d 100644 --- a/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -6,6 +6,9 @@ { "editorSuggestWidgetBackground": "候補のウィジェットの背景色。", "editorSuggestWidgetBorder": "候補ウィジェットの境界線色。", + "editorSuggestWidgetForeground": "候補ウィジェットの前景色。", + "editorSuggestWidgetSelectedBackground": "候補ウィジェット内で選択済みエントリの背景色。", + "editorSuggestWidgetHighlightForeground": "候補のウィジェット内で一致したハイライトの色。", "readMore": "詳細を表示...{0}", "suggestionWithDetailsAriaLabel": "{0}、候補、詳細あり", "suggestionAriaLabel": "{0}、候補", diff --git a/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json b/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json index b51838a0db5..f63839a1d9b 100644 --- a/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/jpn/src/vs/platform/environment/node/argv.i18n.json @@ -20,6 +20,7 @@ "showVersions": "#NAME?", "installExtension": "拡張機能をインストールします。", "uninstallExtension": "拡張機能をアンインストールします。", + "experimentalApis": "拡張機能に対して Proposed API 機能を有効にします。", "disableExtensions": "インストールされたすべての拡張機能を無効にします。", "disableGPU": "GPU ハードウェア アクセラレータを無効にします。", "version": "バージョンを印刷します。", diff --git a/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json index a657f353140..857fb4711f4 100644 --- a/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -4,8 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "invalid.color": "無効な色形式です。 #RGB、#RGBA、#RRGGBB、#RRGGBBAA のいずれかを使用してください", "schema.colors": "ワークベンチで使用する色。", "foreground": "全体の前景色。この色は、コンポーネントによってオーバーライドされていない場合にのみ使用されます。", + "focusBorder": "フォーカスされた要素の境界線全体の色。この色はコンポーネントによって上書きされていない場合にのみ使用されます。", + "widgetShadow": "エディター内の検索/置換窓など、エディター ウィジェットの影の色。", "inputBoxBackground": "入力ボックスの背景。", "inputBoxForeground": "入力ボックスの前景。", "inputBoxBorder": "入力ボックスの境界線。", @@ -15,6 +18,13 @@ "dropdownBorder": "ドロップダウンの境界線。", "pickerGroupForeground": "ラベルをグループ化するためのクリック選択の色。", "pickerGroupBorder": "境界線をグループ化するためのクイック選択の色。", + "buttonForeground": "ボタンの前景色。", + "buttonBackground": "ボタンの背景色。", + "buttonHoverBackground": "ホバー時のボタン背景色。", + "scrollbarShadow": "ビューがスクロールされたことを示すスクロール バーの影。", + "scrollbarSliderBackground": "スライダーの背景色。", + "scrollbarSliderHoverBackground": "ホバー時のスライダー背景色。", + "scrollbarSliderActiveBackground": "アクティブ時のスライダー背景色。", "editorBackground": "エディターの背景色。", "editorForeground": "エディターの既定の前景色。", "editorSelection": "エディターの選択範囲の色。", diff --git a/i18n/jpn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/jpn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 5f83155a33c..7af5bc08c38 100644 --- a/i18n/jpn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -44,6 +44,8 @@ "openPreviousRecentlyUsedEditorInGroup": "グループ内の最近使用したエディターのうち前のエディターを開く", "openNextRecentlyUsedEditorInGroup": "グループ内の最近使用したエディターのうち次のエディターを開く", "navigateEditorHistoryByInput": "履歴から以前のエディターを開く", + "openNextRecentlyUsedEditor": "最近使用したエディターのうち次のエディターを開く", + "openPreviousRecentlyUsedEditor": "最近使用したエディターのうち前のエディターを開く", "clearEditorHistory": "エディター履歴のクリア", "focusLastEditorInStack": "グループ内の最後のエディターを開く", "moveEditorLeft": "エディターを左へ移動", diff --git a/i18n/jpn/src/vs/workbench/common/theme.i18n.json b/i18n/jpn/src/vs/workbench/common/theme.i18n.json index a7d6ea6e58c..7dd2454d3cb 100644 --- a/i18n/jpn/src/vs/workbench/common/theme.i18n.json +++ b/i18n/jpn/src/vs/workbench/common/theme.i18n.json @@ -12,6 +12,8 @@ "tabActiveEditorGroupInactiveForeground": "非アクティブ グループ内のアクティブ タブの前景色。タブはエディター領域におけるエディターのコンテナーです。1 つのエディター グループで複数のタブを開くことができます。エディター グループを複数にすることもできます。", "tabInactiveEditorGroupActiveForeground": "アクティブ グループ内の非アクティブ タブの前景色。タブはエディター領域におけるエディターのコンテナーです。1 つのエディター グループで複数のタブを開くことができます。エディター グループを複数にすることもできます。", "tabInactiveEditorGroupInactiveForeground": "非アクティブ タブの前景色。タブはエディター領域におけるエディターのコンテナーです。1 つのエディター グループで複数のタブを開くことができます。エディター グループを複数にすることもできます。", + "editorGroupBackground": "エディター グループの背景色。エディター グループはエディターのコンテナーです。背景色はエディター グループをドラッグすると表示されます。", + "editorGroupHeaderBackground": "タブが無効な場合の エディター グループ タイトル ヘッダーの背景色。エディター グループはエディターのコンテナーです。", "editorGroupBorder": "複数のエディター グループを互いに分離するための色。エディター グループはエディターのコンテナーです。", "editorDragAndDropBackground": "エディターのドラッグ時の背景色。", "panelBackground": "パネルの背景色。パネルはエディター領域の下に表示され、出力や統合ターミナルなどのビューを含みます。", @@ -24,6 +26,8 @@ "statusBarNoFolderBackground": "フォルダーが開いていないときのステータス バーの背景色。ステータス バーはウィンドウの下部に表示されます。", "statusBarItemActiveBackground": "クリック時のステータス バーの項目の背景色。ステータス バーはウィンドウの下部に表示されます。", "statusBarItemHoverBackground": "ホバーしたときのステータス バーの項目の背景色。ステータス バーはウィンドウの下部に表示されます。", + "statusBarProminentItemBackground": "ステータス バーの重要な項目の背景色。重要な項目は、重要性を示すために他のステータスバーの項目から際立っています。 ステータス バーはウィンドウの下部に表示されます。", + "statusBarProminentItemHoverBackground": "ホバーしたときのステータス バーの重要な項目の背景色。重要な項目は、重要性を示すために他のステータスバーの項目から際立っています。 ステータス バーはウィンドウの下部に表示されます。", "activityBarBackground": "アクティビティ バーの背景色。アクティビティ バーは左端または右端に表示され、サイド バーのビューを切り替えることができます。", "activityBarForeground": "アクティビティ バーの前景色 (例: アイコンの色)。アクティビティ バーは左端または右端に表示され、サイド バーのビューを切り替えることができます。", "activityBarDragAndDropBackground": "アクティビティ バーの項目のドラッグ アンド ドロップ フィードバックの色。アクティビティ バーは左端または右端に表示され、サイド バーの表示を切り替えることができます。", @@ -31,8 +35,11 @@ "activityBarBadgeForeground": "アクティビティ通知バッジの前景色。アクティビティ バーは左端または右端に表示され、サイド バーの表示を切り替えることができます。", "sideBarBackground": "サイド バーの背景色。サイド バーは、エクスプローラーや検索などのビューが入るコンテナーです。", "sideBarTitleForeground": "サイド バーのタイトルの前景色。サイド バーは、エクスプローラーや検索などのビューが入るコンテナーです。", + "sideBarSectionHeaderBackground": "サイド バーのセクション ヘッダーの背景色。サイド バーは、エクスプローラーや検索などのビューが入るコンテナーです。", "titleBarActiveForeground": "ウィンドウがアクティブな場合のタイトル バーの前景。現在、この色は macOS でのみサポートされているのでご注意ください。", "titleBarInactiveForeground": "ウィンドウが非アクティブな場合のタイトル バーの前景。現在、この色は macOS でのみサポートされているのでご注意ください。", "titleBarActiveBackground": "ウィンドウがアクティブな場合のタイトル バーの背景。現在、この色は macOS でのみサポートされているのでご注意ください。", - "titleBarInactiveBackground": "ウィンドウが非アクティブな場合のタイトル バーの背景。現在、この色は macOS でのみサポートされているのでご注意ください。" + "titleBarInactiveBackground": "ウィンドウが非アクティブな場合のタイトル バーの背景。現在、この色は macOS でのみサポートされているのでご注意ください。", + "notificationsForeground": "通知の前景色。通知はウィンドウの上部からスライド表示します。", + "notificationsBackground": "通知の背景色。通知はウィンドウの上部からスライド表示します。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json b/i18n/jpn/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json index 8b6ad71cd4e..d24a34e3065 100644 --- a/i18n/jpn/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "workbench.action.inspectKeyMap": "開発者: キー マッピングを検査する" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 2be30d1f34b..e41cc2280f6 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -34,6 +34,7 @@ "editConditionalBreakpoint": "ブレークポイントの編集...", "setValue": "値の設定", "addWatchExpression": "式の追加", + "editWatchExpression": "式の編集", "addToWatchExpressions": "ウォッチに追加", "removeWatchExpression": "式の削除", "removeAllWatchExpressions": "すべての式を削除する", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json index 8b6ad71cd4e..8876044c17e 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "debugToolBarBackground": "デバッグ ツール バーの背景色。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 75ed35238e1..efdfa523258 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,6 +7,7 @@ "debugAdapterBinNotFound": "デバッグ アダプターの実行可能ファイル '{0}' がありません。", "debugAdapterCannotDetermineExecutable": "デバッグ アダプター '{0}' の実行可能ファイルを判別できません。", "debugType": "構成の種類。", + "debugTypeNotRecognised": "デバッグの種類は認識されませんでした。対応するデバッグの拡張機能をインストールしてください。", "node2NotSupported": "\"node2\" はサポートされていません。代わりに \"node\" を使用し、\"protocol\" 属性を \"inspector\" に設定してください。", "debugName": "構成の名前。起動構成のドロップダウン メニューに表示されます。", "debugRequest": "構成の要求の種類。\"launch\" または \"attach\" です。", diff --git a/i18n/jpn/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json index 9192a65143b..2369ff57b02 100644 --- a/i18n/jpn/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json @@ -4,6 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "vscode.extension.contributes.view": "カスタム ビューを提供します", + "vscode.extension.contributes.view.id": "vscode.workspace.createTreeView を介して生成した、ビューを認識するための一意の ID", + "vscode.extension.contributes.view.icon": "ビュー アイコンへのパス", + "vscode.extension.contributes.views": "複数のカスタム ビューを提供します", "showViewlet": "{0} を表示", "view": "表示" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 0e425d55357..41b230f31e5 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "reallyRecommended2": "このファイルの種類には '{0}' 拡張子が推奨されています。", + "reallyRecommended2": "このファイルの種類には拡張機能 '{0}' が推奨されます。", "showRecommendations": "推奨事項を表示", "neverShowAgain": "今後は表示しない", "close": "閉じる", diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index e8b7110516d..b2c93cd566f 100644 --- a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -6,6 +6,7 @@ { "openGlobalSettings": "ユーザー設定を開く", "openGlobalKeybindings": "キーボード ショートカットを開く", + "openGlobalKeybindingsFile": "キーボード ショートカット ファイルを開く", "openWorkspaceSettings": "ワークスペース設定を開く", "configureLanguageBasedSettings": "言語固有の設定を構成します...", "languageDescriptionConfigured": "({0})", diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 66c1ae4f80a..8329808fc1e 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -9,6 +9,7 @@ "ConfigureTaskRunnerAction.quickPick.template": "タスク ランナーを選択", "ConfigureTaskRunnerAction.autoDetecting": "{0} のタスクを自動検出", "ConfigureTaskRunnerAction.autoDetect": "タスク システムの自動検出が失敗しました。既定のテンプレートを使用しています。詳細については、タスク出力を参照してください", + "ConfigureTaskRunnerAction.autoDetectError": "タスク システムの自動検出でエラーが発生しました。詳細については、タスク出力を参照してください。", "ConfigureTaskRunnerAction.failed": "'.vscode' フォルダー内に 'tasks.json' ファイルを作成できません。詳細については、タスク出力を参照してください。", "ConfigureTaskRunnerAction.label": "タスク ランナーの構成", "ConfigureBuildTaskAction.label": "ビルド タスクを構成します", diff --git a/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index e2d25e3da15..c22c825281d 100644 --- a/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -14,6 +14,7 @@ "noIconThemeDesc": "ファイル アイコンを無効にする", "problemChangingIconTheme": "アイコン テーマの設定で問題が発生しました: {0}", "themes.selectIconTheme": "ファイル アイコンのテーマを選択します", + "generateColorTheme.label": "現在の設定から配色テーマを生成する", "preferences": "基本設定", "developer": "Developer" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution.i18n.json index 57e82748c8e..09458a86c49 100644 --- a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution.i18n.json @@ -5,6 +5,6 @@ // Do not edit this file. It is machine generated. { "workbenchConfigurationTitle": "ワークベンチ", - "welcomePage.enabled": "有効にすると、スタートアップ時に、ようこそページが表示されます。", + "welcomePage.enabled": "有効にすると、起動時にウェルカム ページを表示します。", "help": "ヘルプ" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json b/i18n/jpn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json index e4999a3c4e8..0a5b15ce4a4 100644 --- a/i18n/jpn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "walkThrough.unboundCommand": "バインドなし" + "walkThrough.unboundCommand": "バインドなし", + "walkThrough.gitNotFound": "システムに Git がインストールされていない可能性があります。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json b/i18n/jpn/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json index 83a24dfd0e0..c84f5026160 100644 --- a/i18n/jpn/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json @@ -4,5 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "error.cannotparsejson": "JSON テーマ ファイルの解析中に問題が発生しました: {0}" + "error.cannotparsejson": "JSON テーマ ファイルの解析中に問題が発生しました: {0}", + "error.plist.invalidformat": "tmTheme ファイルの解析中に問題が発生しました: {0}。'settings' は配列ではありません。", + "error.cannotparse": "tmTheme ファイルの解析中に問題が発生しました: {0}", + "error.cannotload": "tmTheme ファイル {0} の読み込み中に問題が発生しました: {1}" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/jpn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index a22528984cb..99cd34d1f8d 100644 --- a/i18n/jpn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -25,5 +25,7 @@ "colorThemeError": "Theme is unknown or not installed.", "iconTheme": "Specifies the icon theme used in the workbench.", "noIconThemeDesc": "No file icons", - "iconThemeError": "File icon theme is unknown or not installed." + "iconThemeError": "File icon theme is unknown or not installed.", + "workbenchColors": "現在選択している配色テーマで配色を上書きします。", + "workbenchColors.deprecatedDescription": "代わりに 'workbench.colorCustomizations' を使用してください" } \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json b/i18n/kor/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json index a6baba2d6b1..2aeba994a61 100644 --- a/i18n/kor/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json +++ b/i18n/kor/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json @@ -4,6 +4,9 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "aria.oneReference": "{2}열, {1}줄, {0}의 기호", + "aria.fileReferences.1": "{0}의 기호 1개", + "aria.fileReferences.N": "{1}의 기호 {0}개", "aria.result.0": "결과 없음", "aria.result.1": "{0}에서 기호 1개를 찾았습니다.", "aria.result.n1": "{1}에서 기호 {0}개를 찾았습니다.", diff --git a/i18n/kor/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/kor/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 569bfddeb58..5903be2fd57 100644 --- a/i18n/kor/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/kor/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -6,6 +6,9 @@ { "editorSuggestWidgetBackground": "제안 위젯의 배경색입니다.", "editorSuggestWidgetBorder": "제안 위젯의 테두리 색입니다.", + "editorSuggestWidgetForeground": "제안 위젯의 전경색입니다.", + "editorSuggestWidgetSelectedBackground": "제한 위젯에서 선택된 항목의 배경색입니다.", + "editorSuggestWidgetHighlightForeground": "제안 위젯의 일치 항목 강조 표시 색입니다.", "readMore": "자세히 알아보기...{0}", "suggestionWithDetailsAriaLabel": "{0}, 제안, 세부 정보 있음", "suggestionAriaLabel": "{0}, 제안", diff --git a/i18n/kor/src/vs/platform/environment/node/argv.i18n.json b/i18n/kor/src/vs/platform/environment/node/argv.i18n.json index 5596f41cdd4..95f21567a73 100644 --- a/i18n/kor/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/kor/src/vs/platform/environment/node/argv.i18n.json @@ -20,6 +20,7 @@ "showVersions": "#NAME?", "installExtension": "확장을 설치합니다.", "uninstallExtension": "확장을 제거합니다.", + "experimentalApis": "확장에 대해 제안된 API 기능을 사용하도록 설정합니다.", "disableExtensions": "설치된 모든 확장을 사용하지 않도록 설정합니다.", "disableGPU": "GPU 하드웨어 가속을 사용하지 않도록 설정합니다.", "version": "버전을 출력합니다.", diff --git a/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json index 20e43b0f760..411e1a2c08a 100644 --- a/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -4,17 +4,44 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "invalid.color": "잘못된 색 형식입니다. #RGB, #RGBA, #RRGGBB 또는 #RRGGBBAA를 사용하세요.", "schema.colors": "워크벤치에서 사용되는 색입니다.", "foreground": "전체 전경색입니다. 이 색은 구성 요소에서 재정의하지 않은 경우에만 사용됩니다.", + "focusBorder": "포커스가 있는 요소의 전체 테두리 색입니다. 이 색은 구성 요소에서 재정의하지 않은 경우에만 사용됩니다.", + "contrastBorder": "더 뚜렷이 대비되도록 요소를 다른 요소와 구분하는 요소 주위의 추가 테두리입니다.", + "activeContrastBorder": "더 뚜렷이 대비되도록 요소를 다른 요소와 구분하는 활성 요소 주위의 추가 테두리입니다.", + "widgetShadow": "편집기 내에서 찾기/바꾸기 같은 위젯의 그림자 색입니다.", "inputBoxBackground": "입력 상자 배경입니다.", "inputBoxForeground": "입력 상자 전경입니다.", "inputBoxBorder": "입력 상자 테두리입니다.", "inputBoxActiveOptionBorder": "입력 필드에서 활성화된 옵션의 테두리 색입니다.", + "inputValidationInfoBackground": "정보 심각도의 입력 유효성 검사 배경색입니다.", + "inputValidationInfoBorder": "정보 심각도의 입력 유효성 검사 테두리 색입니다.", + "inputValidationWarningBackground": "정보 경고의 입력 유효성 검사 배경색입니다.", + "inputValidationWarningBorder": "경고 심각도의 입력 유효성 검사 테두리 색입니다.", + "inputValidationErrorBackground": "오류 심각도의 입력 유효성 검사 배경색입니다.", + "inputValidationErrorBorder": "오류 심각도의 입력 유효성 검사 테두리 색입니다.", "dropdownBackground": "드롭다운 배경입니다.", "dropdownForeground": "드롭다운 전경입니다.", "dropdownBorder": "드롭다운 테두리입니다.", + "listFocusBackground": "목록/트리가 활성 상태인 경우 포커스가 있는 항목의 목록/트리 배경색입니다. 목록/트리가 활성 상태이면 키보드 포커스를 가지며, 비활성 상태이면 포커스가 없습니다.", + "listActiveSelectionBackground": "목록/트리가 활성 상태인 경우 선택한 항목의 목록/트리 배경색입니다. 목록/트리가 활성 상태이면 키보드 포커스를 가지며, 비활성 상태이면 포커스가 없습니다.", + "listInactiveSelectionBackground": "목록/트리가 비활성 상태인 경우 선택한 항목의 목록/트리 배경색입니다. 목록/트리가 활성 상태이면 키보드 포커스를 가지며, 비활성 상태이면 포커스가 없습니다.", + "listActiveSelectionForeground": "목록/트리가 활성 상태인 경우 선택한 항목의 목록/트리 전경색입니다. 목록/트리가 활성 상태이면 키보드 포커스를 가지며, 비활성 상태이면 포커스가 없습니다.", + "listFocusAndSelectionBackground": "목록/트리가 활성 상태인 경우 포커스가 있는 선택한 항목의 목록/트리 배경색입니다. 목록/트리가 활성 상태이면 키보드 포커스를 가지며, 비활성 상태이면 포커스가 없습니다. 이 색은 개별 선택 및 포커스 색보다 우선합니다.", + "listFocusAndSelectionForeground": "목록/트리가 활성 상태인 경우 포커스가 있는 선택한 항목의 목록/트리 전경색입니다. 목록/트리가 활성 상태이면 키보드 포커스를 가지며, 비활성 상태이면 포커스가 없습니다. 이 색은 개별 선택 및 포커스 색보다 우선합니다.", + "listHoverBackground": "마우스로 항목을 가리킬 때 목록/트리 배경입니다.", + "listDropBackground": "마우스로 항목을 이동할 때 목록/트리 끌어서 놓기 배경입니다.", + "highlight": "목록/트리 내에서 검색할 때 일치 항목 강조 표시의 목록/트리 전경색입니다.", "pickerGroupForeground": "그룹화 레이블에 대한 빠른 선택기 색입니다.", "pickerGroupBorder": "그룹화 테두리에 대한 빠른 선택기 색입니다.", + "buttonForeground": "단추 기본 전경색입니다.", + "buttonBackground": "단추 배경색입니다.", + "buttonHoverBackground": "마우스로 가리킬 때 단추 배경색입니다.", + "scrollbarShadow": "스크롤되는 보기를 나타내는 스크롤 막대 그림자입니다.", + "scrollbarSliderBackground": "슬라이더 배경색입니다.", + "scrollbarSliderHoverBackground": "마우스로 가리킬 때 슬라이더 배경색입니다.", + "scrollbarSliderActiveBackground": "활성 상태인 경우 슬라이더 배경색입니다.", "editorBackground": "편집기 배경색입니다.", "editorForeground": "편집기 기본 전경색입니다.", "editorSelection": "편집기 선택 영역의 색입니다.", diff --git a/i18n/rus/extensions/git/out/commands.i18n.json b/i18n/rus/extensions/git/out/commands.i18n.json index dfbba57f8c3..a55cd67aaa0 100644 --- a/i18n/rus/extensions/git/out/commands.i18n.json +++ b/i18n/rus/extensions/git/out/commands.i18n.json @@ -16,6 +16,8 @@ "confirm discard": "Вы действительно хотите отменить изменения в {0}?", "confirm discard multiple": "Вы действительно хотите отменить изменения в файлах ({0})?", "discard": "Отменить изменения", + "confirm discard all": "Вы действительно хотите отменить все изменения? Отменить это действие нельзя!", + "discardAll": "Отменить все изменения", "no changes": "Нет изменений для фиксации.", "commit message": "Сообщение о фиксации", "provide commit message": "Введите сообщение фиксации.", @@ -31,6 +33,7 @@ "no remotes to publish": "Для вашего репозитория не настроены удаленные репозитории для публикации.", "disabled": "GIT отключен или не поддерживается в этой рабочей области", "clean repo": "Очистите рабочее дерево репозитория перед извлечением.", + "cant push": "Не удается отправить ссылки в удаленную ветвь. Сначала выберите \"Извлечь\", чтобы интегрировать изменения.", "git error details": "Git: {0}", "git error": "Ошибка Git", "open git log": "Открыть журнал GIT" diff --git a/i18n/rus/extensions/git/package.i18n.json b/i18n/rus/extensions/git/package.i18n.json index 8b3e7480686..071a37d0e5b 100644 --- a/i18n/rus/extensions/git/package.i18n.json +++ b/i18n/rus/extensions/git/package.i18n.json @@ -38,5 +38,7 @@ "config.autorefresh": "Включено ли автоматическое обновление", "config.autofetch": "Включено ли автоматическое получение", "config.enableLongCommitWarning": "Следует ли предупреждать о длинных сообщениях о фиксации", - "config.confirmSync": "Подтвердите синхронизацию репозиториев GIT." + "config.confirmSync": "Подтвердите синхронизацию репозиториев GIT.", + "config.countBadge": "\nУправляет счетчиком Git. При указании значения \"all\" подсчитываются все изменения, при указании значения \"tracked\" — только отслеживаемые изменения, при указании значения \"off\" счетчик отключается.", + "config.checkoutType": "Определяет типы ветвей, которые выводятся при выборе пункта меню \"Извлечь в...\". При указании значения \"all\" отображаются все ссылки, \"local\" — только локальные ветви, \"tags\" — только теги, а \"remote\" — только удаленные ветви." } \ No newline at end of file diff --git a/i18n/rus/extensions/grunt/out/main.i18n.json b/i18n/rus/extensions/grunt/out/main.i18n.json index 8b6ad71cd4e..7d21b8b17d9 100644 --- a/i18n/rus/extensions/grunt/out/main.i18n.json +++ b/i18n/rus/extensions/grunt/out/main.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "execFailed": "Сбой автоматического определений заданий Grunt. Ошибка: {0}" +} \ No newline at end of file diff --git a/i18n/rus/extensions/grunt/package.i18n.json b/i18n/rus/extensions/grunt/package.i18n.json index 8b6ad71cd4e..b73dd0e2788 100644 --- a/i18n/rus/extensions/grunt/package.i18n.json +++ b/i18n/rus/extensions/grunt/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.grunt.autoDetect": "Включает или отключает автоматическое определние заданий Grunt. Значение по умолчанию — \"включено\"." +} \ No newline at end of file diff --git a/i18n/rus/extensions/gulp/package.i18n.json b/i18n/rus/extensions/gulp/package.i18n.json index 8b6ad71cd4e..37a145323f2 100644 --- a/i18n/rus/extensions/gulp/package.i18n.json +++ b/i18n/rus/extensions/gulp/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.gulp.autoDetect": "Включает или отключает автоматическое определение заданий Gulp. Значение по умолчанию — \"включено\"." +} \ No newline at end of file diff --git a/i18n/rus/extensions/markdown/package.i18n.json b/i18n/rus/extensions/markdown/package.i18n.json index d3ac28369f5..9583a03ad77 100644 --- a/i18n/rus/extensions/markdown/package.i18n.json +++ b/i18n/rus/extensions/markdown/package.i18n.json @@ -16,5 +16,7 @@ "markdown.previewSide.title": "Открыть область предварительного просмотра сбоку", "markdown.showSource.title": "Показать источник", "markdown.styles.dec": "Список URL-адресов или локальных путей к таблицам стилей CSS, используемых из области предварительного просмотра файла Markdown. Относительные пути интерпретируются относительно папки, открытой в проводнике. Если папка не открыта, они интерпретируются относительно расположения файла Markdown. Все символы '\\' должны записываться в виде '\\\\'.", - "markdown.showPreviewSecuritySelector.title": "Изменить параметры безопасности для предварительного просмотра Markdown" + "markdown.showPreviewSecuritySelector.title": "Изменить параметры безопасности для предварительного просмотра Markdown", + "markdown.preview.enableExperimentalExtensionApi.desc": "[Экспериментальная функция] Разрешить расширениям расширять предварительный просмотр Markdown.", + "markdown.trace.desc": "Включить ведение журнала отладки для расширения Markdown." } \ No newline at end of file diff --git a/i18n/rus/extensions/php/package.i18n.json b/i18n/rus/extensions/php/package.i18n.json index b16d4c3729e..f722b3cf8cb 100644 --- a/i18n/rus/extensions/php/package.i18n.json +++ b/i18n/rus/extensions/php/package.i18n.json @@ -9,5 +9,6 @@ "configuration.validate.executablePath": "Указывает на исполняемый файл PHP.", "configuration.validate.run": "Запускается ли анализатор кода при сохранении или при печати.", "configuration.title": "PHP", - "commands.categroy.php": "PHP" + "commands.categroy.php": "PHP", + "command.untrustValidationExecutable": "Запретить исполняемый файл проверки PHP (определяется как параметр рабочей области)" } \ No newline at end of file diff --git a/i18n/rus/extensions/typescript/out/utils/typingsStatus.i18n.json b/i18n/rus/extensions/typescript/out/utils/typingsStatus.i18n.json index 506fc2b22fb..4adb921367a 100644 --- a/i18n/rus/extensions/typescript/out/utils/typingsStatus.i18n.json +++ b/i18n/rus/extensions/typescript/out/utils/typingsStatus.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "installingPackages": "Получение данных для повышения эффективности IntelliSense TypeScript", + "typesInstallerInitializationFailed.title": "Не удалось установить файлы типизации для языка JavaScript. Убедитесь, что NPM установлен и путь к нему указан в переменной PATH", "typesInstallerInitializationFailed.moreInformation": "Дополнительные сведения", "typesInstallerInitializationFailed.doNotCheckAgain": "Больше не проверять", "typesInstallerInitializationFailed.close": "Закрыть" diff --git a/i18n/rus/extensions/typescript/package.i18n.json b/i18n/rus/extensions/typescript/package.i18n.json index 8d5b98b675b..3a3b4907099 100644 --- a/i18n/rus/extensions/typescript/package.i18n.json +++ b/i18n/rus/extensions/typescript/package.i18n.json @@ -23,6 +23,7 @@ "format.insertSpaceBeforeFunctionParenthesis": "Определяет метод обработки пробелов перед скобками аргумента функции. Требует TypeScript >= 2.1.5.", "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": "Определяет метод обработки пробелов после открытия и до закрытия непустых круглых скобок.", "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": "Определяет метод обработки пробелов после открытия и до закрытия непустых квадратных скобок.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": "Определяет метод обработки пробелов после открытия и до закрытия непустых скобок. Требуется TypeScript 2.3.0 или более поздней версии.", "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "Определяет метод обработки пробелов после открытия и до закрытия скобок в строке шаблона. Требуется TypeScript 2.0.6 или более поздней версии.", "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "Определяет метод обработки пробелов после открытия и до закрытия скобок выражения JSX. Требуется TypeScript 2.0.6 или более поздней версии.", "format.placeOpenBraceOnNewLineForFunctions": "Определяет, ставится ли открывающая фигурная скобка с новой строки в функциях.", @@ -34,5 +35,7 @@ "typescript.implementationsCodeLens.enabled": "Включить или отключить CodeLens для реализаций. Требуется TypeScript >= 2.2.0.", "typescript.openTsServerLog.title": "Открытие файла журнала сервера TS", "typescript.selectTypeScriptVersion.title": "Выберите версию TypeScript.", - "jsDocCompletion.enabled": "Включить или отключить JSDoc коментарии" + "jsDocCompletion.enabled": "Включить или отключить JSDoc коментарии", + "javascript.implicitProjectConfig.checkJs": "Включает/отключает семантическую проверку файлов JavaScript. Этот параметр может переопределяться в файле jsconfig.json или tsconfig.json. Требуется TypeScript 2.3.1 или более поздней версии.", + "typescript.check.npmIsInstalled": "Проверяет, установлен ли NPM для автоматического получения типов" } \ No newline at end of file From fa5e110afbddb286928810da4658483be1ea432e Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Thu, 4 May 2017 00:50:20 +0200 Subject: [PATCH 0074/1164] node-debug@1.13.1 --- build/gulpfile.vscode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index e5bab793585..a2a2ca2df0b 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -41,7 +41,7 @@ const nodeModules = ['electron', 'original-fs'] // Build const builtInExtensions = [ - { name: 'ms-vscode.node-debug', version: '1.13.0' }, + { name: 'ms-vscode.node-debug', version: '1.13.1' }, { name: 'ms-vscode.node-debug2', version: '1.12.4' } ]; From 36c491ee02bf731a4d9aca3dd773cf6392f4fb43 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 May 2017 10:54:26 +0200 Subject: [PATCH 0075/1164] remove references to ArraySet related to #25780 --- src/vs/base/common/paging.ts | 11 +++++------ .../node/extensionGalleryService.ts | 8 ++++---- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/vs/base/common/paging.ts b/src/vs/base/common/paging.ts index a8f8208c581..de3319b5038 100644 --- a/src/vs/base/common/paging.ts +++ b/src/vs/base/common/paging.ts @@ -6,7 +6,6 @@ 'use strict'; import { TPromise } from 'vs/base/common/winjs.base'; -import { ArraySet } from 'vs/base/common/set'; import { isArray } from 'vs/base/common/types'; /** @@ -22,7 +21,7 @@ export interface IPager { interface IPage { isResolved: boolean; promise: TPromise; - promiseIndexes: ArraySet; + promiseIndexes: Set; elements: T[]; } @@ -55,12 +54,12 @@ export class PagedModel implements IPagedModel { constructor(private arg: IPager | T[], private pageTimeout: number = 500) { this.pager = isArray(arg) ? singlePagePager(arg) : arg; - this.pages = [{ isResolved: true, promise: null, promiseIndexes: new ArraySet(), elements: this.pager.firstPage.slice() }]; + this.pages = [{ isResolved: true, promise: null, promiseIndexes: new Set(), elements: this.pager.firstPage.slice() }]; const totalPages = Math.ceil(this.pager.total / this.pager.pageSize); for (let i = 0, len = totalPages - 1; i < len; i++) { - this.pages.push({ isResolved: false, promise: null, promiseIndexes: new ArraySet(), elements: [] }); + this.pages.push({ isResolved: false, promise: null, promiseIndexes: new Set(), elements: [] }); } } @@ -102,14 +101,14 @@ export class PagedModel implements IPagedModel { } return new TPromise((c, e) => { - page.promiseIndexes.set(index); + page.promiseIndexes.add(index); page.promise.done(() => c(page.elements[indexInPage])); }, () => { if (!page.promise) { return; } - page.promiseIndexes.unset(index); + page.promiseIndexes.delete(index); if (page.promiseIndexes.size === 0) { page.promise.cancel(); diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index 523bcbda9e9..ccce0192774 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -10,7 +10,6 @@ import { TPromise } from 'vs/base/common/winjs.base'; import * as uuid from 'vs/base/common/uuid'; import { distinct } from 'vs/base/common/arrays'; import { getErrorMessage } from 'vs/base/common/errors'; -import { ArraySet } from 'vs/base/common/set'; import { IGalleryExtension, IExtensionGalleryService, IGalleryExtensionAsset, IQueryOptions, SortBy, SortOrder, IExtensionManifest } from 'vs/platform/extensionManagement/common/extensionManagement'; import { getGalleryExtensionId, getGalleryExtensionTelemetryData, adoptToGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { assign, getOrDefault } from 'vs/base/common/objects'; @@ -475,14 +474,15 @@ export class ExtensionGalleryService implements IExtensionGalleryService { return this.loadDependencies(toGet) .then(loadedDependencies => { - const dependenciesSet = new ArraySet(); + const dependenciesSet = new Set(); for (const dep of loadedDependencies) { if (dep.properties.dependencies) { - dep.properties.dependencies.forEach(d => dependenciesSet.set(d)); + dep.properties.dependencies.forEach(d => dependenciesSet.add(d)); } } result = distinct(result.concat(loadedDependencies), d => d.uuid); - const dependencies = dependenciesSet.elements.filter(d => !ExtensionGalleryService.hasExtensionByName(result, d)); + const dependencies: string[] = []; + dependenciesSet.forEach(d => !ExtensionGalleryService.hasExtensionByName(result, d) && dependencies.push(d)); return this.getDependenciesReccursively(dependencies, result, root); }); } From 0701b576ca095a455e0a8371e1fde31621928aaf Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 4 May 2017 11:09:23 +0200 Subject: [PATCH 0076/1164] debug: better handling of configuration actions when there is no folder open fixes #25466 --- src/vs/workbench/parts/debug/browser/debugActions.ts | 6 +++++- .../parts/debug/electron-browser/debugCommands.ts | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/browser/debugActions.ts b/src/vs/workbench/parts/debug/browser/debugActions.ts index 714284ed642..6a23b8588cd 100644 --- a/src/vs/workbench/parts/debug/browser/debugActions.ts +++ b/src/vs/workbench/parts/debug/browser/debugActions.ts @@ -6,12 +6,14 @@ import * as nls from 'vs/nls'; import { Action } from 'vs/base/common/actions'; import * as lifecycle from 'vs/base/common/lifecycle'; +import severity from 'vs/base/common/severity'; import { TPromise } from 'vs/base/common/winjs.base'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IFileService } from 'vs/platform/files/common/files'; +import { IMessageService } from 'vs/platform/message/common/message'; import { IDebugService, State, IProcess, IThread, IEnablement, IBreakpoint, IStackFrame, IFunctionBreakpoint, IDebugEditorContribution, EDITOR_CONTRIBUTION_ID, IExpression, REPL_ID } from 'vs/workbench/parts/debug/common/debug'; import { Variable, Expression, Thread, Breakpoint, Process } from 'vs/workbench/parts/debug/common/debugModel'; @@ -75,7 +77,8 @@ export class ConfigureAction extends AbstractDebugAction { constructor(id: string, label: string, @IDebugService debugService: IDebugService, @IKeybindingService keybindingService: IKeybindingService, - @IWorkspaceContextService private contextService: IWorkspaceContextService + @IWorkspaceContextService private contextService: IWorkspaceContextService, + @IMessageService private messageService: IMessageService ) { super(id, label, 'debug-action configure', debugService, keybindingService); this.toDispose.push(debugService.getViewModel().onDidSelectConfiguration(configurationName => this.updateClass())); @@ -96,6 +99,7 @@ export class ConfigureAction extends AbstractDebugAction { public run(event?: any): TPromise { if (!this.contextService.getWorkspace()) { + this.messageService.show(severity.Info, nls.localize('noFolderDebugConfig', "Please first open a folder in order to do advanced debug configuration.")); return TPromise.as(null); } diff --git a/src/vs/workbench/parts/debug/electron-browser/debugCommands.ts b/src/vs/workbench/parts/debug/electron-browser/debugCommands.ts index 9138126104f..ec6a8673d4f 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugCommands.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugCommands.ts @@ -3,7 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as nls from 'vs/nls'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import { TPromise } from 'vs/base/common/winjs.base'; import severity from 'vs/base/common/severity'; import { List } from 'vs/base/browser/ui/list/listWidget'; import * as errors from 'vs/base/common/errors'; @@ -11,6 +13,8 @@ import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IListService } from 'vs/platform/list/browser/listService'; +import { IMessageService } from 'vs/platform/message/common/message'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IDebugService, IConfig, IEnablement, CONTEXT_NOT_IN_DEBUG_MODE, CONTEXT_IN_DEBUG_MODE, CONTEXT_BREAKPOINTS_FOCUSED, CONTEXT_WATCH_EXPRESSIONS_FOCUSED, CONTEXT_VARIABLES_FOCUSED, EDITOR_CONTRIBUTION_ID, IDebugEditorContribution } from 'vs/workbench/parts/debug/common/debug'; import { Expression, Variable, Breakpoint, FunctionBreakpoint } from 'vs/workbench/parts/debug/common/debugModel'; import { IExtensionsViewlet, VIEWLET_ID as EXTENSIONS_VIEWLET_ID } from 'vs/workbench/parts/extensions/common/extensions'; @@ -195,6 +199,11 @@ export function registerCommands(): void { primary: undefined, handler: (accessor) => { const manager = accessor.get(IDebugService).getConfigurationManager(); + if (!accessor.get(IWorkspaceContextService).getWorkspace()) { + accessor.get(IMessageService).show(severity.Info, nls.localize('noFolderDebugConfig', "Please first open a folder in order to do advanced debug configuration.")); + return TPromise.as(null); + } + return manager.openConfigFile(false).done(editor => { if (editor) { const codeEditor = editor.getControl(); From 0d72a8e724715885a798913224711a721f6abfb5 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 4 May 2017 11:17:15 +0200 Subject: [PATCH 0077/1164] Theme: Generate Color Theme creates file in fs root. Fixes #25765 --- .../parts/themes/electron-browser/themes.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts b/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts index b66dcb4352b..8ae5925e78b 100644 --- a/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts +++ b/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts @@ -198,7 +198,7 @@ class GenerateColorThemeAction extends Action { colors: resultingColors, tokenColors: theme.tokenColors }, null, '\t'); - return this.editorService.openEditor({ contents, language: 'json', filePath: 'custom-color-theme.json' }); + return this.editorService.openEditor({ contents, language: 'json' }); } } From 56197e2acc0303eaf180fe4273cb16cf187dda2a Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 4 May 2017 12:28:42 +0200 Subject: [PATCH 0078/1164] debug: respect breakpoint.column when sorting fixes #25819 --- src/vs/workbench/parts/debug/electron-browser/debugViews.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViews.ts b/src/vs/workbench/parts/debug/electron-browser/debugViews.ts index cf22f4dcaee..73a2367db05 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViews.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViews.ts @@ -447,6 +447,9 @@ export class BreakpointsView extends AdaptiveCollapsibleViewletView { if (first.uri.toString() !== second.uri.toString()) { return paths.basename(first.uri.fsPath).localeCompare(paths.basename(second.uri.fsPath)); } + if (first.lineNumber === second.lineNumber) { + return first.column - second.column; + } return first.lineNumber - second.lineNumber; } From a61d606b284d4c50902d8fa14f53c41a17b83d2f Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 4 May 2017 12:33:36 +0200 Subject: [PATCH 0079/1164] debug: show columns in callstack view fixes #25818 --- src/vs/workbench/parts/debug/electron-browser/debugViewer.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts index 190059b707c..b91233d7307 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts @@ -540,6 +540,9 @@ export class CallStackRenderer implements IRenderer { data.fileName.textContent = getSourceName(stackFrame.source, this.contextService); if (stackFrame.lineNumber !== undefined) { data.lineNumber.textContent = `${stackFrame.lineNumber}`; + if (stackFrame.column) { + data.lineNumber.textContent += `:${stackFrame.column}`; + } dom.removeClass(data.lineNumber, 'unavailable'); } else { dom.addClass(data.lineNumber, 'unavailable'); From 6038a110d5bc375f636d0130898e33702132dede Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 4 May 2017 10:10:02 +0200 Subject: [PATCH 0080/1164] Rename TextAreaHandler to TextAreaInput --- src/vs/base/browser/browser.ts | 6 ++-- .../browser/controller/keyboardHandler.ts | 36 +++++++++---------- .../{textAreaHandler.ts => textAreaInput.ts} | 27 +++++++------- .../contrib/clipboard/browser/clipboard.ts | 2 +- .../test/browser/controller/imeTester.ts | 6 ++-- 5 files changed, 39 insertions(+), 38 deletions(-) rename src/vs/editor/browser/controller/{textAreaHandler.ts => textAreaInput.ts} (96%) diff --git a/src/vs/base/browser/browser.ts b/src/vs/base/browser/browser.ts index 558dcf75839..29d7a261edd 100644 --- a/src/vs/base/browser/browser.ts +++ b/src/vs/base/browser/browser.ts @@ -124,10 +124,10 @@ export const isChrome = (userAgent.indexOf('Chrome') >= 0); export const isSafari = (userAgent.indexOf('Chrome') === -1) && (userAgent.indexOf('Safari') >= 0); export const isIPad = (userAgent.indexOf('iPad') >= 0); -const isChromev56 = ( - navigator.userAgent.indexOf('Chrome/56.') >= 0 +export const isChromev56 = ( + userAgent.indexOf('Chrome/56.') >= 0 // Edge likes to impersonate Chrome sometimes - && navigator.userAgent.indexOf('Edge/') === -1 + && userAgent.indexOf('Edge/') === -1 ); export const supportsTranslate3d = !isFirefox; diff --git a/src/vs/editor/browser/controller/keyboardHandler.ts b/src/vs/editor/browser/controller/keyboardHandler.ts index 225f4ad4c48..1be3215f806 100644 --- a/src/vs/editor/browser/controller/keyboardHandler.ts +++ b/src/vs/editor/browser/controller/keyboardHandler.ts @@ -7,7 +7,7 @@ import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; import { GlobalScreenReaderNVDA } from 'vs/editor/common/config/commonEditorConfig'; -import { TextAreaHandler, ITextAreaHandlerHost, TextAreaStrategy } from 'vs/editor/browser/controller/textAreaHandler'; +import { TextAreaInput, ITextAreaInputHost, TextAreaStrategy } from 'vs/editor/browser/controller/textAreaInput'; import { ISimpleModel } from 'vs/editor/browser/controller/textAreaState'; import { Range } from 'vs/editor/common/core/range'; import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; @@ -55,7 +55,7 @@ export class KeyboardHandler extends ViewEventHandler { private _lastCopiedValue: string; private _lastCopiedValueIsFromEmptySelection: boolean; - private textAreaHandler: TextAreaHandler; + private _textAreaInput: TextAreaInput; constructor(context: ViewContext, viewController: ViewController, viewHelper: IKeyboardHandlerHelper) { super(); @@ -76,7 +76,7 @@ export class KeyboardHandler extends ViewEventHandler { this._lastCopiedValue = null; this._lastCopiedValueIsFromEmptySelection = false; - const textAreaHandlerHost: ITextAreaHandlerHost = { + const textAreaInputHost: ITextAreaInputHost = { getPlainTextToCopy: (): string => { const whatToCopy = this._context.model.getPlainTextToCopy(this._selections, browser.enableEmptySelectionClipboard); @@ -110,26 +110,26 @@ export class KeyboardHandler extends ViewEventHandler { return this._context.model.getValueInRange(range, eol); } }; - this.textAreaHandler = new TextAreaHandler(textAreaHandlerHost, this._getStrategy(), this.textArea, simpleModel); + this._textAreaInput = new TextAreaInput(textAreaInputHost, this._getStrategy(), this.textArea, simpleModel); - this._register(this.textAreaHandler.onKeyDown((e) => this.viewController.emitKeyDown(e))); - this._register(this.textAreaHandler.onKeyUp((e) => this.viewController.emitKeyUp(e))); - this._register(this.textAreaHandler.onPaste((e) => { + this._register(this._textAreaInput.onKeyDown((e) => this.viewController.emitKeyDown(e))); + this._register(this._textAreaInput.onKeyUp((e) => this.viewController.emitKeyUp(e))); + this._register(this._textAreaInput.onPaste((e) => { let pasteOnNewLine = false; if (browser.enableEmptySelectionClipboard) { pasteOnNewLine = (e.text === this._lastCopiedValue && this._lastCopiedValueIsFromEmptySelection); } this.viewController.paste('keyboard', e.text, pasteOnNewLine); })); - this._register(this.textAreaHandler.onCut((e) => this.viewController.cut('keyboard'))); - this._register(this.textAreaHandler.onType((e) => { + this._register(this._textAreaInput.onCut((e) => this.viewController.cut('keyboard'))); + this._register(this._textAreaInput.onType((e) => { if (e.replaceCharCnt) { this.viewController.replacePreviousChar('keyboard', e.text, e.replaceCharCnt); } else { this.viewController.type('keyboard', e.text); } })); - this._register(this.textAreaHandler.onCompositionStart(() => { + this._register(this._textAreaInput.onCompositionStart(() => { const lineNumber = this._selections[0].startLineNumber; const column = this._selections[0].startColumn; @@ -158,7 +158,7 @@ export class KeyboardHandler extends ViewEventHandler { this.viewController.compositionStart('keyboard'); })); - this._register(this.textAreaHandler.onCompositionUpdate((e) => { + this._register(this._textAreaInput.onCompositionUpdate((e) => { if (browser.isEdgeOrIE) { // Due to isEdgeOrIE (where the textarea was not cleared initially) // we cannot assume the text consists only of the composited text @@ -181,7 +181,7 @@ export class KeyboardHandler extends ViewEventHandler { } })); - this._register(this.textAreaHandler.onCompositionEnd(() => { + this._register(this._textAreaInput.onCompositionEnd(() => { this.textArea.unsetHeight(); this.textArea.unsetWidth(); this.textArea.setLeft(0); @@ -193,7 +193,7 @@ export class KeyboardHandler extends ViewEventHandler { this.viewController.compositionEnd('keyboard'); })); this._register(GlobalScreenReaderNVDA.onChange((value) => { - this.textAreaHandler.setStrategy(this._getStrategy()); + this._textAreaInput.setStrategy(this._getStrategy()); })); @@ -202,7 +202,7 @@ export class KeyboardHandler extends ViewEventHandler { public dispose(): void { this._context.removeEventHandler(this); - this.textAreaHandler.dispose(); + this._textAreaInput.dispose(); super.dispose(); } @@ -217,7 +217,7 @@ export class KeyboardHandler extends ViewEventHandler { } public focusTextArea(): void { - this.textAreaHandler.focusTextArea(); + this._textAreaInput.focusTextArea(); } // --- begin event handlers @@ -228,7 +228,7 @@ export class KeyboardHandler extends ViewEventHandler { Configuration.applyFontInfo(this.textArea, this._context.configuration.editor.fontInfo); } if (e.viewInfo.experimentalScreenReader) { - this.textAreaHandler.setStrategy(this._getStrategy()); + this._textAreaInput.setStrategy(this._getStrategy()); } if (e.layoutInfo) { this.contentLeft = this._context.configuration.editor.layoutInfo.contentLeft; @@ -245,7 +245,7 @@ export class KeyboardHandler extends ViewEventHandler { } public onFocusChanged(e: viewEvents.ViewFocusChangedEvent): boolean { - this.textAreaHandler.setHasFocus(e.isFocused); + this._textAreaInput.setHasFocus(e.isFocused); return false; } @@ -265,7 +265,7 @@ export class KeyboardHandler extends ViewEventHandler { if (this._lastCursorSelectionChanged) { let e = this._lastCursorSelectionChanged; this._lastCursorSelectionChanged = null; - this.textAreaHandler.setCursorSelections(e.selection, e.secondarySelections); + this._textAreaInput.setCursorSelections(e.selection, e.secondarySelections); } } diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaInput.ts similarity index 96% rename from src/vs/editor/browser/controller/textAreaHandler.ts rename to src/vs/editor/browser/controller/textAreaInput.ts index dad5cd60d02..3edfd54fecb 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaInput.ts @@ -38,19 +38,20 @@ export interface IPasteData { text: string; } -// See https://github.com/Microsoft/monaco-editor/issues/320 -const isChromev55_v56 = ( - (navigator.userAgent.indexOf('Chrome/55.') >= 0 || navigator.userAgent.indexOf('Chrome/56.') >= 0) - /* Edge likes to impersonate Chrome sometimes */ - && navigator.userAgent.indexOf('Edge/') === -1 -); - -export interface ITextAreaHandlerHost { +export interface ITextAreaInputHost { getPlainTextToCopy(): string; getHTMLToCopy(): string; } -export class TextAreaHandler extends Disposable { +/** + * Writes screen reader content to the textarea and is able to analyze its input events to generate: + * - onCut + * - onPaste + * - onType + * + * Composition events are generated for presentation purposes (composition input is reflected in onType). + */ +export class TextAreaInput extends Disposable { private _onKeyDown = this._register(new Emitter()); public onKeyDown: Event = this._onKeyDown.event; @@ -78,7 +79,7 @@ export class TextAreaHandler extends Disposable { // --- - private readonly _host: ITextAreaHandlerHost; + private readonly _host: ITextAreaInputHost; private readonly _textArea: TextAreaWrapper; private readonly _model: ISimpleModel; @@ -93,7 +94,7 @@ export class TextAreaHandler extends Disposable { private _nextCommand: ReadFromTextArea; - constructor(host: ITextAreaHandlerHost, strategy: TextAreaStrategy, textArea: FastDomNode, model: ISimpleModel) { + constructor(host: ITextAreaInputHost, strategy: TextAreaStrategy, textArea: FastDomNode, model: ISimpleModel) { super(); this._host = host; this._textArea = this._register(new TextAreaWrapper(textArea)); @@ -165,7 +166,7 @@ export class TextAreaHandler extends Disposable { }; this._register(dom.addDisposableListener(textArea.domNode, 'compositionupdate', (e: CompositionEvent) => { - if (isChromev55_v56) { + if (browser.isChromev56) { // See https://github.com/Microsoft/monaco-editor/issues/320 // where compositionupdate .data is broken in Chrome v55 and v56 // See https://bugs.chromium.org/p/chromium/issues/detail?id=677050#c9 @@ -224,7 +225,7 @@ export class TextAreaHandler extends Disposable { // console.log('onInput: ' + this.textArea.getValue()); if (this._isDoingComposition) { // See https://github.com/Microsoft/monaco-editor/issues/320 - if (isChromev55_v56) { + if (browser.isChromev56) { const [newState, typeInput] = deduceComposition(this._textArea.getValue()); this._textAreaState = newState; diff --git a/src/vs/editor/contrib/clipboard/browser/clipboard.ts b/src/vs/editor/contrib/clipboard/browser/clipboard.ts index 4c6f0692fae..5f0be755a14 100644 --- a/src/vs/editor/contrib/clipboard/browser/clipboard.ts +++ b/src/vs/editor/contrib/clipboard/browser/clipboard.ts @@ -13,7 +13,7 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { editorAction, IActionOptions, EditorAction } from 'vs/editor/common/editorCommonExtensions'; -import { CopyOptions } from 'vs/editor/browser/controller/textAreaHandler'; +import { CopyOptions } from 'vs/editor/browser/controller/textAreaInput'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; const CLIPBOARD_CONTEXT_MENU_GROUP = '9_cutcopypaste'; diff --git a/src/vs/editor/test/browser/controller/imeTester.ts b/src/vs/editor/test/browser/controller/imeTester.ts index 97b96d7ec6c..c47b41d7fb1 100644 --- a/src/vs/editor/test/browser/controller/imeTester.ts +++ b/src/vs/editor/test/browser/controller/imeTester.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { TextAreaHandler, ITextAreaHandlerHost, TextAreaStrategy } from 'vs/editor/browser/controller/textAreaHandler'; +import { TextAreaInput, ITextAreaInputHost, TextAreaStrategy } from 'vs/editor/browser/controller/textAreaInput'; import { ISimpleModel } from 'vs/editor/browser/controller/textAreaState'; import { Range, IRange } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; @@ -93,12 +93,12 @@ function doCreateTest(strategy: TextAreaStrategy, description: string, inputStr: let model = new SingleLineTestModel('some text'); - const textAreaHandlerHost: ITextAreaHandlerHost = { + const textAreaInputHost: ITextAreaInputHost = { getPlainTextToCopy: (): string => '', getHTMLToCopy: (): string => '' }; - let handler = new TextAreaHandler(textAreaHandlerHost, strategy, createFastDomNode(input), model); + let handler = new TextAreaInput(textAreaInputHost, strategy, createFastDomNode(input), model); input.onfocus = () => { handler.setHasFocus(true); From 471124c5d1b01bb6075063bcbcb6df14fd2bd901 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 4 May 2017 11:13:26 +0200 Subject: [PATCH 0081/1164] ITextAreaInputHost provides screen reader content --- .../browser/controller/keyboardHandler.ts | 200 ++++++++++-------- .../browser/controller/textAreaInput.ts | 115 ++++------ src/vs/editor/browser/view/viewImpl.ts | 4 +- .../common/config/commonEditorConfig.ts | 22 -- .../accessibility/browser/accessibility.ts | 26 +-- .../test/browser/controller/imeTester.ts | 33 ++- 6 files changed, 181 insertions(+), 219 deletions(-) diff --git a/src/vs/editor/browser/controller/keyboardHandler.ts b/src/vs/editor/browser/controller/keyboardHandler.ts index 1be3215f806..742a2e70ae8 100644 --- a/src/vs/editor/browser/controller/keyboardHandler.ts +++ b/src/vs/editor/browser/controller/keyboardHandler.ts @@ -6,9 +6,8 @@ import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; -import { GlobalScreenReaderNVDA } from 'vs/editor/common/config/commonEditorConfig'; -import { TextAreaInput, ITextAreaInputHost, TextAreaStrategy } from 'vs/editor/browser/controller/textAreaInput'; -import { ISimpleModel } from 'vs/editor/browser/controller/textAreaState'; +import { TextAreaInput, ITextAreaInputHost, IPasteData, ICompositionData } from 'vs/editor/browser/controller/textAreaInput'; +import { ISimpleModel, ITypeData, TextAreaState, IENarratorStrategy, NVDAPagedStrategy } from 'vs/editor/browser/controller/textAreaState'; import { Range } from 'vs/editor/common/core/range'; import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; import { Configuration } from 'vs/editor/browser/config/configuration'; @@ -19,6 +18,7 @@ import { FastDomNode } from 'vs/base/browser/fastDomNode'; import { VerticalRevealType } from 'vs/editor/common/controller/cursorEvents'; import { ViewController } from 'vs/editor/browser/view/viewController'; import { EndOfLinePreference } from "vs/editor/common/editorCommon"; +import { IKeyboardEvent } from "vs/base/browser/keyboardEvent"; export interface IKeyboardHandlerHelper { viewDomNode: FastDomNode; @@ -38,44 +38,62 @@ class TextAreaVisiblePosition { this.left = left; } } + +export const enum TextAreaStrategy { + IENarrator, + NVDA +} + export class KeyboardHandler extends ViewEventHandler { - private _context: ViewContext; - private viewController: ViewController; - private textArea: FastDomNode; - private viewHelper: IKeyboardHandlerHelper; - private visiblePosition: TextAreaVisiblePosition; + private readonly _context: ViewContext; + private readonly _viewController: ViewController; + private readonly _textArea: FastDomNode; + private readonly _viewHelper: IKeyboardHandlerHelper; - private contentLeft: number; - private contentWidth: number; - private scrollLeft: number; - private scrollTop: number; + private _contentLeft: number; + private _contentWidth: number; + private _scrollLeft: number; + private _scrollTop: number; + private _visiblePosition: TextAreaVisiblePosition; private _selections: Range[]; private _lastCopiedValue: string; private _lastCopiedValueIsFromEmptySelection: boolean; - private _textAreaInput: TextAreaInput; + private readonly _textAreaInput: TextAreaInput; constructor(context: ViewContext, viewController: ViewController, viewHelper: IKeyboardHandlerHelper) { super(); this._context = context; - this.viewController = viewController; - this.textArea = viewHelper.textArea; - Configuration.applyFontInfo(this.textArea, this._context.configuration.editor.fontInfo); - this.viewHelper = viewHelper; - this.visiblePosition = null; + this._viewController = viewController; + this._textArea = viewHelper.textArea; + Configuration.applyFontInfo(this._textArea, this._context.configuration.editor.fontInfo); + this._viewHelper = viewHelper; - this.contentLeft = this._context.configuration.editor.layoutInfo.contentLeft; - this.contentWidth = this._context.configuration.editor.layoutInfo.contentWidth; - this.scrollLeft = 0; - this.scrollTop = 0; + this._contentLeft = this._context.configuration.editor.layoutInfo.contentLeft; + this._contentWidth = this._context.configuration.editor.layoutInfo.contentWidth; + this._scrollLeft = 0; + this._scrollTop = 0; + this._visiblePosition = null; this._selections = [new Range(1, 1, 1, 1)]; this._lastCopiedValue = null; this._lastCopiedValueIsFromEmptySelection = false; + const simpleModel: ISimpleModel = { + getLineCount: (): number => { + return this._context.model.getLineCount(); + }, + getLineMaxColumn: (lineNumber: number): number => { + return this._context.model.getLineMaxColumn(lineNumber); + }, + getValueInRange: (range: Range, eol: EndOfLinePreference): string => { + return this._context.model.getValueInRange(range, eol); + } + }; + const textAreaInputHost: ITextAreaInputHost = { getPlainTextToCopy: (): string => { const whatToCopy = this._context.model.getPlainTextToCopy(this._selections, browser.enableEmptySelectionClipboard); @@ -95,40 +113,59 @@ export class KeyboardHandler extends ViewEventHandler { return whatToCopy; }, + getHTMLToCopy: (): string => { return this._context.model.getHTMLToCopy(this._selections, browser.enableEmptySelectionClipboard); - } - }; - const simpleModel: ISimpleModel = { - getLineCount: (): number => { - return this._context.model.getLineCount(); }, - getLineMaxColumn: (lineNumber: number): number => { - return this._context.model.getLineMaxColumn(lineNumber); - }, - getValueInRange: (range: Range, eol: EndOfLinePreference): string => { - return this._context.model.getValueInRange(range, eol); - } - }; - this._textAreaInput = new TextAreaInput(textAreaInputHost, this._getStrategy(), this.textArea, simpleModel); - this._register(this._textAreaInput.onKeyDown((e) => this.viewController.emitKeyDown(e))); - this._register(this._textAreaInput.onKeyUp((e) => this.viewController.emitKeyUp(e))); - this._register(this._textAreaInput.onPaste((e) => { + getScreenReaderContent: (currentState: TextAreaState): TextAreaState => { + + if (browser.isIPad) { + // Do not place anything in the textarea for the iPad + return TextAreaState.EMPTY; + } + + const strategy = this._getStrategy(); + const selection = this._selections[0]; + + if (strategy === TextAreaStrategy.IENarrator) { + return IENarratorStrategy.fromEditorSelection(currentState, simpleModel, selection); + } + + return NVDAPagedStrategy.fromEditorSelection(currentState, simpleModel, selection); + } + }; + + this._textAreaInput = this._register(new TextAreaInput(textAreaInputHost, this._textArea)); + + this._register(this._textAreaInput.onKeyDown((e: IKeyboardEvent) => { + this._viewController.emitKeyDown(e); + })); + + this._register(this._textAreaInput.onKeyUp((e: IKeyboardEvent) => { + this._viewController.emitKeyUp(e); + })); + + this._register(this._textAreaInput.onPaste((e: IPasteData) => { let pasteOnNewLine = false; if (browser.enableEmptySelectionClipboard) { pasteOnNewLine = (e.text === this._lastCopiedValue && this._lastCopiedValueIsFromEmptySelection); } - this.viewController.paste('keyboard', e.text, pasteOnNewLine); + this._viewController.paste('keyboard', e.text, pasteOnNewLine); })); - this._register(this._textAreaInput.onCut((e) => this.viewController.cut('keyboard'))); - this._register(this._textAreaInput.onType((e) => { + + this._register(this._textAreaInput.onCut(() => { + this._viewController.cut('keyboard'); + })); + + this._register(this._textAreaInput.onType((e: ITypeData) => { if (e.replaceCharCnt) { - this.viewController.replacePreviousChar('keyboard', e.text, e.replaceCharCnt); + this._viewController.replacePreviousChar('keyboard', e.text, e.replaceCharCnt); } else { - this.viewController.type('keyboard', e.text); + this._viewController.type('keyboard', e.text); } })); + this._register(this._textAreaInput.onCompositionStart(() => { const lineNumber = this._selections[0].startLineNumber; const column = this._selections[0].startColumn; @@ -140,76 +177,68 @@ export class KeyboardHandler extends ViewEventHandler { )); // Find range pixel position - const visibleRange = this.viewHelper.visibleRangeForPositionRelativeToEditor(lineNumber, column); + const visibleRange = this._viewHelper.visibleRangeForPositionRelativeToEditor(lineNumber, column); if (visibleRange) { - this.visiblePosition = new TextAreaVisiblePosition( - this.viewHelper.getVerticalOffsetForLineNumber(lineNumber), + this._visiblePosition = new TextAreaVisiblePosition( + this._viewHelper.getVerticalOffsetForLineNumber(lineNumber), visibleRange.left ); - this.textArea.setTop(this.visiblePosition.top - this.scrollTop); - this.textArea.setLeft(this.contentLeft + this.visiblePosition.left - this.scrollLeft); + this._textArea.setTop(this._visiblePosition.top - this._scrollTop); + this._textArea.setLeft(this._contentLeft + this._visiblePosition.left - this._scrollLeft); } // Show the textarea - this.textArea.setHeight(this._context.configuration.editor.lineHeight); - this.viewHelper.viewDomNode.addClassName('ime-input'); + this._textArea.setHeight(this._context.configuration.editor.lineHeight); + this._viewHelper.viewDomNode.addClassName('ime-input'); - this.viewController.compositionStart('keyboard'); + this._viewController.compositionStart('keyboard'); })); - this._register(this._textAreaInput.onCompositionUpdate((e) => { + this._register(this._textAreaInput.onCompositionUpdate((e: ICompositionData) => { if (browser.isEdgeOrIE) { // Due to isEdgeOrIE (where the textarea was not cleared initially) // we cannot assume the text consists only of the composited text - this.textArea.setWidth(0); + this._textArea.setWidth(0); } else { // adjust width by its size let canvasElem = document.createElement('canvas'); let context = canvasElem.getContext('2d'); - let cs = dom.getComputedStyle(this.textArea.domNode); + let cs = dom.getComputedStyle(this._textArea.domNode); if (browser.isFirefox) { // computedStyle.font is empty in Firefox... context.font = `${cs.fontStyle} ${cs.fontVariant} ${cs.fontWeight} ${cs.fontStretch} ${cs.fontSize} / ${cs.lineHeight} ${cs.fontFamily}`; let metrics = context.measureText(e.data); - this.textArea.setWidth(metrics.width + 2); // +2 for Japanese... + this._textArea.setWidth(metrics.width + 2); // +2 for Japanese... } else { context.font = cs.font; let metrics = context.measureText(e.data); - this.textArea.setWidth(metrics.width); + this._textArea.setWidth(metrics.width); } } })); this._register(this._textAreaInput.onCompositionEnd(() => { - this.textArea.unsetHeight(); - this.textArea.unsetWidth(); - this.textArea.setLeft(0); - this.textArea.setTop(0); - this.viewHelper.viewDomNode.removeClassName('ime-input'); + this._textArea.unsetHeight(); + this._textArea.unsetWidth(); + this._textArea.setLeft(0); + this._textArea.setTop(0); + this._viewHelper.viewDomNode.removeClassName('ime-input'); - this.visiblePosition = null; + this._visiblePosition = null; - this.viewController.compositionEnd('keyboard'); + this._viewController.compositionEnd('keyboard'); })); - this._register(GlobalScreenReaderNVDA.onChange((value) => { - this._textAreaInput.setStrategy(this._getStrategy()); - })); - this._context.addEventHandler(this); } public dispose(): void { this._context.removeEventHandler(this); - this._textAreaInput.dispose(); super.dispose(); } private _getStrategy(): TextAreaStrategy { - if (GlobalScreenReaderNVDA.getValue()) { - return TextAreaStrategy.NVDA; - } if (this._context.configuration.editor.viewInfo.experimentalScreenReader) { return TextAreaStrategy.NVDA; } @@ -225,22 +254,20 @@ export class KeyboardHandler extends ViewEventHandler { public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { // Give textarea same font size & line height as editor, for the IME case (when the textarea is visible) if (e.fontInfo) { - Configuration.applyFontInfo(this.textArea, this._context.configuration.editor.fontInfo); + Configuration.applyFontInfo(this._textArea, this._context.configuration.editor.fontInfo); } if (e.viewInfo.experimentalScreenReader) { - this._textAreaInput.setStrategy(this._getStrategy()); + this._textAreaInput.writeScreenReaderContent('strategy changed'); } if (e.layoutInfo) { - this.contentLeft = this._context.configuration.editor.layoutInfo.contentLeft; - this.contentWidth = this._context.configuration.editor.layoutInfo.contentWidth; + this._contentLeft = this._context.configuration.editor.layoutInfo.contentLeft; + this._contentWidth = this._context.configuration.editor.layoutInfo.contentWidth; } return false; } - private _lastCursorSelectionChanged: viewEvents.ViewCursorSelectionChangedEvent = null; public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { this._selections = [e.selection].concat(e.secondarySelections); - this._lastCursorSelectionChanged = e; return false; } @@ -250,11 +277,11 @@ export class KeyboardHandler extends ViewEventHandler { } public onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean { - this.scrollLeft = e.scrollLeft; - this.scrollTop = e.scrollTop; - if (this.visiblePosition) { - this.textArea.setTop(this.visiblePosition.top - this.scrollTop); - this.textArea.setLeft(this.contentLeft + this.visiblePosition.left - this.scrollLeft); + this._scrollLeft = e.scrollLeft; + this._scrollTop = e.scrollTop; + if (this._visiblePosition) { + this._textArea.setTop(this._visiblePosition.top - this._scrollTop); + this._textArea.setLeft(this._contentLeft + this._visiblePosition.left - this._scrollLeft); } return false; } @@ -262,11 +289,6 @@ export class KeyboardHandler extends ViewEventHandler { // --- end event handlers public writeToTextArea(): void { - if (this._lastCursorSelectionChanged) { - let e = this._lastCursorSelectionChanged; - this._lastCursorSelectionChanged = null; - this._textAreaInput.setCursorSelections(e.selection, e.secondarySelections); - } + this._textAreaInput.writeScreenReaderContent('selection changed'); } - -} \ No newline at end of file +} diff --git a/src/vs/editor/browser/controller/textAreaInput.ts b/src/vs/editor/browser/controller/textAreaInput.ts index 3edfd54fecb..c356dca3cd2 100644 --- a/src/vs/editor/browser/controller/textAreaInput.ts +++ b/src/vs/editor/browser/controller/textAreaInput.ts @@ -9,14 +9,13 @@ import * as strings from 'vs/base/common/strings'; import Event, { Emitter } from 'vs/base/common/event'; import { KeyCode } from 'vs/base/common/keyCodes'; import { Disposable } from 'vs/base/common/lifecycle'; -import { ISimpleModel, ITypeData, TextAreaState, ITextAreaWrapper, IENarratorStrategy, NVDAPagedStrategy } from 'vs/editor/browser/controller/textAreaState'; -import { Range } from 'vs/editor/common/core/range'; +import { ITypeData, TextAreaState, ITextAreaWrapper } from 'vs/editor/browser/controller/textAreaState'; import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; import { IKeyboardEvent } from "vs/base/browser/keyboardEvent"; import { FastDomNode } from "vs/base/browser/fastDomNode"; -export interface ICompositionEvent { +export interface ICompositionData { data: string; } @@ -24,11 +23,6 @@ export const CopyOptions = { forceCopyWithSyntaxHighlighting: false }; -export const enum TextAreaStrategy { - IENarrator, - NVDA -} - const enum ReadFromTextArea { Type, Paste @@ -41,6 +35,7 @@ export interface IPasteData { export interface ITextAreaInputHost { getPlainTextToCopy(): string; getHTMLToCopy(): string; + getScreenReaderContent(currentState: TextAreaState): TextAreaState; } /** @@ -71,8 +66,8 @@ export class TextAreaInput extends Disposable { private _onCompositionStart = this._register(new Emitter()); public onCompositionStart: Event = this._onCompositionStart.event; - private _onCompositionUpdate = this._register(new Emitter()); - public onCompositionUpdate: Event = this._onCompositionUpdate.event; + private _onCompositionUpdate = this._register(new Emitter()); + public onCompositionUpdate: Event = this._onCompositionUpdate.event; private _onCompositionEnd = this._register(new Emitter()); public onCompositionEnd: Event = this._onCompositionEnd.event; @@ -81,34 +76,25 @@ export class TextAreaInput extends Disposable { private readonly _host: ITextAreaInputHost; private readonly _textArea: TextAreaWrapper; - private readonly _model: ISimpleModel; - - private _textAreaStrategy: TextAreaStrategy; - private _selection: Range; - private _hasFocus: boolean; - private readonly _asyncTriggerCut: RunOnceScheduler; private _textAreaState: TextAreaState; - private _isDoingComposition: boolean; + private _hasFocus: boolean; + private _isDoingComposition: boolean; private _nextCommand: ReadFromTextArea; - constructor(host: ITextAreaInputHost, strategy: TextAreaStrategy, textArea: FastDomNode, model: ISimpleModel) { + constructor(host: ITextAreaInputHost, textArea: FastDomNode) { super(); this._host = host; this._textArea = this._register(new TextAreaWrapper(textArea)); - this._model = model; - - this._textAreaStrategy = strategy; - this._selection = new Range(1, 1, 1, 1); - this._hasFocus = false; - this._asyncTriggerCut = this._register(new RunOnceScheduler(() => this._onCut.fire(), 0)); this._textAreaState = TextAreaState.EMPTY; - this._isDoingComposition = false; + this.writeScreenReaderContent('ctor'); + this._hasFocus = false; + this._isDoingComposition = false; this._nextCommand = ReadFromTextArea.Type; this._register(dom.addStandardDisposableListener(textArea.domNode, 'keydown', (e: IKeyboardEvent) => { @@ -230,7 +216,7 @@ export class TextAreaInput extends Disposable { this._textAreaState = newState; this._onType.fire(typeInput); - let e: ICompositionEvent = { + let e: ICompositionData = { data: typeInput.text }; this._onCompositionUpdate.fire(e); @@ -288,28 +274,17 @@ export class TextAreaInput extends Disposable { this._nextCommand = ReadFromTextArea.Paste; } })); - - this._writeScreenReaderContent('ctor'); } public dispose(): void { super.dispose(); } - public setStrategy(strategy: TextAreaStrategy): void { - if (this._textAreaStrategy === strategy) { - // no change - return; - } - this._textAreaStrategy = strategy; - this._writeScreenReaderContent('strategy changed'); - } - public focusTextArea(): void { // Setting this._hasFocus and writing the screen reader content // will result in a set selection range in the textarea this._hasFocus = true; - this._writeScreenReaderContent('focusTextArea'); + this.writeScreenReaderContent('focusTextArea'); } public setHasFocus(isFocused: boolean): void { @@ -324,16 +299,11 @@ export class TextAreaInput extends Disposable { // is dispatching doesn't work. To reproduce, "tab into" the editor. this._setAndWriteTextAreaState('focusgain', TextAreaState.EMPTY); } else { - this._writeScreenReaderContent('focusgain'); + this.writeScreenReaderContent('focusgain'); } } } - public setCursorSelections(primary: Range, secondary: Range[]): void { - this._selection = primary; - this._writeScreenReaderContent('selection changed'); - } - private _setAndWriteTextAreaState(reason: string, textAreaState: TextAreaState): void { if (!this._hasFocus) { textAreaState = textAreaState.collapseSelection(); @@ -343,27 +313,13 @@ export class TextAreaInput extends Disposable { this._textAreaState = textAreaState; } - private _writeScreenReaderContent(reason: string): void { + public writeScreenReaderContent(reason: string): void { if (this._isDoingComposition) { // Do not write to the text area when doing composition return; } - if (browser.isIPad) { - // Do not place anything in the textarea for the iPad - this._setAndWriteTextAreaState(reason, TextAreaState.EMPTY); - - } else if (this._textAreaStrategy === TextAreaStrategy.IENarrator) { - - const newState = IENarratorStrategy.fromEditorSelection(this._textAreaState, this._model, this._selection); - this._setAndWriteTextAreaState(reason, newState); - - } else { - - const newState = NVDAPagedStrategy.fromEditorSelection(this._textAreaState, this._model, this._selection); - this._setAndWriteTextAreaState(reason, newState); - - } + this._setAndWriteTextAreaState(reason, this._host.getScreenReaderContent(this._textAreaState)); } private _ensureClipboardGetsEditorSelection(e: ClipboardEvent): void { @@ -462,21 +418,34 @@ class TextAreaWrapper extends Disposable implements ITextAreaWrapper { } public setSelectionRange(reason: string, selectionStart: number, selectionEnd: number): void { - // console.log('reason: ' + reason + ', setSelectionRange: ' + selectionStart + ' -> ' + selectionEnd); const textArea = this._actual.domNode; - if (document.activeElement === textArea) { + + const currentIsFocused = (document.activeElement === textArea); + const currentSelectionStart = textArea.selectionStart; + const currentSelectionEnd = textArea.selectionEnd; + + if (currentIsFocused && currentSelectionStart === selectionStart && currentSelectionEnd === selectionEnd) { + // No change + return; + } + + // console.log('reason: ' + reason + ', setSelectionRange: ' + selectionStart + ' -> ' + selectionEnd); + + if (currentIsFocused) { + // No need to focus, only need to change the selection range textArea.setSelectionRange(selectionStart, selectionEnd); - } else { - // If the focus is outside the textarea, browsers will try really hard to reveal the textarea. - // Here, we try to undo the browser's desperate reveal. - try { - const scrollState = dom.saveParentsScrollTop(textArea); - textArea.focus(); - textArea.setSelectionRange(selectionStart, selectionEnd); - dom.restoreParentsScrollTop(textArea, scrollState); - } catch (e) { - // Sometimes IE throws when setting selection (e.g. textarea is off-DOM) - } + return; + } + + // If the focus is outside the textarea, browsers will try really hard to reveal the textarea. + // Here, we try to undo the browser's desperate reveal. + try { + const scrollState = dom.saveParentsScrollTop(textArea); + textArea.focus(); + textArea.setSelectionRange(selectionStart, selectionEnd); + dom.restoreParentsScrollTop(textArea, scrollState); + } catch (e) { + // Sometimes IE throws when setting selection (e.g. textarea is off-DOM) } } } diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index b84b23ff234..4ba8f9e2739 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -68,7 +68,7 @@ export class View extends ViewEventHandler { private layoutProvider: ViewLayout; private _scrollbar: EditorScrollbar; - public _context: ViewContext; + private _context: ViewContext; // The view lines private viewLines: ViewLines; @@ -88,7 +88,7 @@ export class View extends ViewEventHandler { // Dom nodes private linesContent: FastDomNode; public domNode: FastDomNode; - public textArea: FastDomNode; + private textArea: FastDomNode; private textAreaCover: FastDomNode; private overflowGuardContainer: FastDomNode; diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 4a5ce1d8dad..fb554283298 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -52,28 +52,6 @@ export const TabFocus: ITabFocus = new class { } }; -/** - * Experimental screen reader support toggle - */ -export class GlobalScreenReaderNVDA { - - private static _value = false; - private static _onChange = new Emitter(); - public static onChange: Event = GlobalScreenReaderNVDA._onChange.event; - - public static getValue(): boolean { - return this._value; - } - - public static setValue(value: boolean): void { - if (this._value === value) { - return; - } - this._value = value; - this._onChange.fire(this._value); - } -} - export class ConfigurationWithDefaults { private _editor: editorOptions.IEditorOptions; diff --git a/src/vs/editor/contrib/accessibility/browser/accessibility.ts b/src/vs/editor/contrib/accessibility/browser/accessibility.ts index 508072bd26d..dc68a6a4715 100644 --- a/src/vs/editor/contrib/accessibility/browser/accessibility.ts +++ b/src/vs/editor/contrib/accessibility/browser/accessibility.ts @@ -17,11 +17,9 @@ import { Widget } from 'vs/base/browser/ui/widget'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { GlobalScreenReaderNVDA } from 'vs/editor/common/config/commonEditorConfig'; import { ICommonCodeEditor, IEditorContribution } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { editorAction, CommonEditorRegistry, EditorAction, EditorCommand, Command } from 'vs/editor/common/editorCommonExtensions'; +import { editorAction, CommonEditorRegistry, EditorAction, EditorCommand } from 'vs/editor/common/editorCommonExtensions'; import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition } from 'vs/editor/browser/editorBrowser'; import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; import { ToggleTabFocusModeAction } from 'vs/editor/contrib/toggleTabFocusMode/common/toggleTabFocusMode'; @@ -29,7 +27,6 @@ import { registerThemingParticipant } from 'vs/platform/theme/common/themeServic import { editorWidgetBackground, widgetShadow, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; const CONTEXT_ACCESSIBILITY_WIDGET_VISIBLE = new RawContextKey('accessibilityHelpWidgetVisible', false); -const TOGGLE_EXPERIMENTAL_SCREEN_READER_SUPPORT_COMMAND_ID = 'toggleExperimentalScreenReaderSupport'; @editorContribution class AccessibilityHelpController extends Disposable implements IEditorContribution { @@ -234,27 +231,6 @@ CommonEditorRegistry.registerEditorCommand(new AccessibilityHelpCommand({ } })); -class ToggleExperimentalScreenReaderSupportCommand extends Command { - constructor() { - super({ - id: TOGGLE_EXPERIMENTAL_SCREEN_READER_SUPPORT_COMMAND_ID, - precondition: null, - kbOpts: { - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - kbExpr: null, - primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_R - } - }); - } - - public runCommand(accessor: ServicesAccessor, args: any): void { - let currentValue = GlobalScreenReaderNVDA.getValue(); - GlobalScreenReaderNVDA.setValue(!currentValue); - } -} -const command = new ToggleExperimentalScreenReaderSupportCommand(); -KeybindingsRegistry.registerCommandAndKeybindingRule(command.toCommandAndKeybindingRule(KeybindingsRegistry.WEIGHT.editorContrib())); - registerThemingParticipant((theme, collector) => { let widgetBackground = theme.getColor(editorWidgetBackground); if (widgetBackground) { diff --git a/src/vs/editor/test/browser/controller/imeTester.ts b/src/vs/editor/test/browser/controller/imeTester.ts index c47b41d7fb1..5c5ccc9e076 100644 --- a/src/vs/editor/test/browser/controller/imeTester.ts +++ b/src/vs/editor/test/browser/controller/imeTester.ts @@ -4,11 +4,13 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { TextAreaInput, ITextAreaInputHost, TextAreaStrategy } from 'vs/editor/browser/controller/textAreaInput'; -import { ISimpleModel } from 'vs/editor/browser/controller/textAreaState'; +import { TextAreaInput, ITextAreaInputHost } from 'vs/editor/browser/controller/textAreaInput'; +import { ISimpleModel, TextAreaState, IENarratorStrategy, NVDAPagedStrategy } from 'vs/editor/browser/controller/textAreaState'; import { Range, IRange } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { createFastDomNode } from 'vs/base/browser/fastDomNode'; +import * as browser from 'vs/base/browser/browser'; +import { TextAreaStrategy } from "vs/editor/browser/controller/keyboardHandler"; // To run this test, open imeTester.html @@ -62,6 +64,9 @@ class TestView { } function doCreateTest(strategy: TextAreaStrategy, description: string, inputStr: string, expectedStr: string): HTMLElement { + let cursorOffset: number = 0; + let cursorLength: number = 0; + let container = document.createElement('div'); container.className = 'container'; @@ -95,10 +100,25 @@ function doCreateTest(strategy: TextAreaStrategy, description: string, inputStr: const textAreaInputHost: ITextAreaInputHost = { getPlainTextToCopy: (): string => '', - getHTMLToCopy: (): string => '' + getHTMLToCopy: (): string => '', + getScreenReaderContent: (currentState: TextAreaState): TextAreaState => { + + if (browser.isIPad) { + // Do not place anything in the textarea for the iPad + return TextAreaState.EMPTY; + } + + const selection = new Range(1, 1 + cursorOffset, 1, 1 + cursorOffset + cursorLength); + + if (strategy === TextAreaStrategy.IENarrator) { + return IENarratorStrategy.fromEditorSelection(currentState, model, selection); + } + + return NVDAPagedStrategy.fromEditorSelection(currentState, model, selection); + } }; - let handler = new TextAreaInput(textAreaInputHost, strategy, createFastDomNode(input), model); + let handler = new TextAreaInput(textAreaInputHost, createFastDomNode(input)); input.onfocus = () => { handler.setHasFocus(true); @@ -121,13 +141,10 @@ function doCreateTest(strategy: TextAreaStrategy, description: string, inputStr: let view = new TestView(model); - - let cursorOffset: number; - let cursorLength: number; let updatePosition = (off: number, len: number) => { cursorOffset = off; cursorLength = len; - handler.setCursorSelections(new Range(1, 1 + cursorOffset, 1, 1 + cursorOffset + cursorLength), []); + handler.writeScreenReaderContent('selection changed'); handler.focusTextArea(); }; From de797d873d62aa68b221c8c1a3a61ab7ea0dfe37 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 4 May 2017 12:19:00 +0200 Subject: [PATCH 0082/1164] Move focus related code to TextAreaInput --- .../browser/controller/keyboardHandler.ts | 38 ++++++++++++++++--- .../browser/controller/textAreaInput.ts | 31 ++++++++++++--- src/vs/editor/browser/view/viewImpl.ts | 35 +---------------- .../test/browser/controller/imeTester.ts | 7 ---- 4 files changed, 60 insertions(+), 51 deletions(-) diff --git a/src/vs/editor/browser/controller/keyboardHandler.ts b/src/vs/editor/browser/controller/keyboardHandler.ts index 742a2e70ae8..f442e4a5b16 100644 --- a/src/vs/editor/browser/controller/keyboardHandler.ts +++ b/src/vs/editor/browser/controller/keyboardHandler.ts @@ -230,6 +230,14 @@ export class KeyboardHandler extends ViewEventHandler { this._viewController.compositionEnd('keyboard'); })); + this._register(this._textAreaInput.onFocus(() => { + this._context.privateViewEventBus.emit(new viewEvents.ViewFocusChangedEvent(true)); + })); + + this._register(this._textAreaInput.onBlur(() => { + this._context.privateViewEventBus.emit(new viewEvents.ViewFocusChangedEvent(false)); + })); + this._context.addEventHandler(this); } @@ -245,6 +253,10 @@ export class KeyboardHandler extends ViewEventHandler { return TextAreaStrategy.IENarrator; } + public isFocused(): boolean { + return this._textAreaInput.isFocused(); + } + public focusTextArea(): void { this._textAreaInput.focusTextArea(); } @@ -263,6 +275,9 @@ export class KeyboardHandler extends ViewEventHandler { this._contentLeft = this._context.configuration.editor.layoutInfo.contentLeft; this._contentWidth = this._context.configuration.editor.layoutInfo.contentWidth; } + if (e.viewInfo.ariaLabel) { + this._textArea.setAttribute('aria-label', this._context.configuration.editor.viewInfo.ariaLabel); + } return false; } @@ -271,11 +286,6 @@ export class KeyboardHandler extends ViewEventHandler { return false; } - public onFocusChanged(e: viewEvents.ViewFocusChangedEvent): boolean { - this._textAreaInput.setHasFocus(e.isFocused); - return false; - } - public onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean { this._scrollLeft = e.scrollLeft; this._scrollTop = e.scrollTop; @@ -288,7 +298,25 @@ export class KeyboardHandler extends ViewEventHandler { // --- end event handlers + // --- begin view API + public writeToTextArea(): void { this._textAreaInput.writeScreenReaderContent('selection changed'); } + + public setAriaActiveDescendant(id: string): void { + if (id) { + this._textArea.setAttribute('role', 'combobox'); + if (this._textArea.getAttribute('aria-activedescendant') !== id) { + this._textArea.setAttribute('aria-haspopup', 'true'); + this._textArea.setAttribute('aria-activedescendant', id); + } + } else { + this._textArea.setAttribute('role', 'textbox'); + this._textArea.removeAttribute('aria-activedescendant'); + this._textArea.removeAttribute('aria-haspopup'); + } + } + + // --- end view API } diff --git a/src/vs/editor/browser/controller/textAreaInput.ts b/src/vs/editor/browser/controller/textAreaInput.ts index c356dca3cd2..7d921e1936c 100644 --- a/src/vs/editor/browser/controller/textAreaInput.ts +++ b/src/vs/editor/browser/controller/textAreaInput.ts @@ -48,6 +48,12 @@ export interface ITextAreaInputHost { */ export class TextAreaInput extends Disposable { + private _onFocus = this._register(new Emitter()); + public onFocus: Event = this._onFocus.event; + + private _onBlur = this._register(new Emitter()); + public onBlur: Event = this._onBlur.event; + private _onKeyDown = this._register(new Emitter()); public onKeyDown: Event = this._onKeyDown.event; @@ -274,6 +280,9 @@ export class TextAreaInput extends Disposable { this._nextCommand = ReadFromTextArea.Paste; } })); + + this._register(dom.addDisposableListener(textArea.domNode, 'focus', () => this._setHasFocus(true))); + this._register(dom.addDisposableListener(textArea.domNode, 'blur', () => this._setHasFocus(false))); } public dispose(): void { @@ -282,17 +291,21 @@ export class TextAreaInput extends Disposable { public focusTextArea(): void { // Setting this._hasFocus and writing the screen reader content - // will result in a set selection range in the textarea - this._hasFocus = true; - this.writeScreenReaderContent('focusTextArea'); + // will result in a focus() and setSelectionRange() in the textarea + this._setHasFocus(true); } - public setHasFocus(isFocused: boolean): void { - if (this._hasFocus === isFocused) { + public isFocused(): boolean { + return this._hasFocus; + } + + private _setHasFocus(newHasFocus: boolean): void { + if (this._hasFocus === newHasFocus) { // no change return; } - this._hasFocus = isFocused; + this._hasFocus = newHasFocus; + if (this._hasFocus) { if (browser.isEdge) { // Edge has a bug where setting the selection range while the focus event @@ -302,6 +315,12 @@ export class TextAreaInput extends Disposable { this.writeScreenReaderContent('focusgain'); } } + + if (this._hasFocus) { + this._onFocus.fire(); + } else { + this._onBlur.fire(); + } } private _setAndWriteTextAreaState(reason: string, textAreaState: TextAreaState): void { diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index 4ba8f9e2739..b3301542736 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -93,7 +93,6 @@ export class View extends ViewEventHandler { private overflowGuardContainer: FastDomNode; // Actual mutable state - private hasFocus: boolean; private _isDisposed: boolean; private _renderAnimationFrame: IDisposable; @@ -136,8 +135,6 @@ export class View extends ViewEventHandler { // Pointer handler this.pointerHandler = new PointerHandler(this._context, viewController, this.createPointerHandlerHelper()); - this.hasFocus = false; - this._register(model.addEventListener((events: viewEvents.ViewEvent[]) => { this.eventDispatcher.emitMany(events); })); @@ -161,9 +158,6 @@ export class View extends ViewEventHandler { this.textArea.setTop(0); this.textArea.setLeft(0); - this._register(dom.addDisposableListener(this.textArea.domNode, 'focus', () => this._setHasFocus(true))); - this._register(dom.addDisposableListener(this.textArea.domNode, 'blur', () => this._setHasFocus(false))); - // On top of the text area, we position a dom node to cover it up // (there have been reports of tiny blinking cursors) // (in WebKit the textarea is 1px by 1px because it cannot handle input to a 0x0 textarea) @@ -391,9 +385,6 @@ export class View extends ViewEventHandler { if (e.viewInfo.editorClassName) { this.domNode.setClassName(this._context.configuration.editor.viewInfo.editorClassName); } - if (e.viewInfo.ariaLabel) { - this.textArea.setAttribute('aria-label', this._context.configuration.editor.viewInfo.ariaLabel); - } if (e.layoutInfo) { this._setLayout(); } @@ -537,13 +528,6 @@ export class View extends ViewEventHandler { } } - private _setHasFocus(newHasFocus: boolean): void { - if (this.hasFocus !== newHasFocus) { - this.hasFocus = newHasFocus; - this._context.privateViewEventBus.emit(new viewEvents.ViewFocusChangedEvent(this.hasFocus)); - } - } - // --- BEGIN CodeEditor helpers public getScrollWidth(): number { @@ -683,17 +667,7 @@ export class View extends ViewEventHandler { } public setAriaActiveDescendant(id: string): void { - if (id) { - this.textArea.setAttribute('role', 'combobox'); - if (this.textArea.getAttribute('aria-activedescendant') !== id) { - this.textArea.setAttribute('aria-haspopup', 'true'); - this.textArea.setAttribute('aria-activedescendant', id); - } - } else { - this.textArea.setAttribute('role', 'textbox'); - this.textArea.removeAttribute('aria-activedescendant'); - this.textArea.removeAttribute('aria-haspopup'); - } + this.keyboardHandler.setAriaActiveDescendant(id); } public saveState(): editorCommon.IViewState { @@ -706,15 +680,10 @@ export class View extends ViewEventHandler { public focus(): void { this.keyboardHandler.focusTextArea(); - - // IE does not trigger the focus event immediately, so we must help it a little bit - if (document.activeElement === this.textArea.domNode) { - this._setHasFocus(true); - } } public isFocused(): boolean { - return this.hasFocus; + return this.keyboardHandler.isFocused(); } public addContentWidget(widgetData: IContentWidgetData): void { diff --git a/src/vs/editor/test/browser/controller/imeTester.ts b/src/vs/editor/test/browser/controller/imeTester.ts index 5c5ccc9e076..828c278edb4 100644 --- a/src/vs/editor/test/browser/controller/imeTester.ts +++ b/src/vs/editor/test/browser/controller/imeTester.ts @@ -120,13 +120,6 @@ function doCreateTest(strategy: TextAreaStrategy, description: string, inputStr: let handler = new TextAreaInput(textAreaInputHost, createFastDomNode(input)); - input.onfocus = () => { - handler.setHasFocus(true); - }; - input.onblur = () => { - handler.setHasFocus(false); - }; - let output = document.createElement('pre'); output.className = 'output'; container.appendChild(output); From acff3d07e3d87dc2602ff5716181a9cad08dae4b Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 4 May 2017 12:29:45 +0200 Subject: [PATCH 0083/1164] Move text area creation to TextAreaHandler --- ...{keyboardHandler.ts => textAreaHandler.ts} | 102 ++++++++++++------ src/vs/editor/browser/view/viewImpl.ts | 74 +++---------- .../test/browser/controller/imeTester.ts | 2 +- 3 files changed, 87 insertions(+), 91 deletions(-) rename src/vs/editor/browser/controller/{keyboardHandler.ts => textAreaHandler.ts} (71%) diff --git a/src/vs/editor/browser/controller/keyboardHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts similarity index 71% rename from src/vs/editor/browser/controller/keyboardHandler.ts rename to src/vs/editor/browser/controller/textAreaHandler.ts index f442e4a5b16..90c12809f3e 100644 --- a/src/vs/editor/browser/controller/keyboardHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -14,15 +14,17 @@ import { Configuration } from 'vs/editor/browser/config/configuration'; import { ViewContext } from 'vs/editor/common/view/viewContext'; import { HorizontalRange } from 'vs/editor/common/view/renderingContext'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { FastDomNode } from 'vs/base/browser/fastDomNode'; +import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { VerticalRevealType } from 'vs/editor/common/controller/cursorEvents'; import { ViewController } from 'vs/editor/browser/view/viewController'; import { EndOfLinePreference } from "vs/editor/common/editorCommon"; import { IKeyboardEvent } from "vs/base/browser/keyboardEvent"; +import { PartFingerprints, PartFingerprint } from "vs/editor/browser/view/viewPart"; +import { Margin } from "vs/editor/browser/viewParts/margin/margin"; +import { LineNumbersOverlay } from "vs/editor/browser/viewParts/lineNumbers/lineNumbers"; -export interface IKeyboardHandlerHelper { +export interface ITextAreaHandlerHelper { viewDomNode: FastDomNode; - textArea: FastDomNode; visibleRangeForPositionRelativeToEditor(lineNumber: number, column: number): HorizontalRange; getVerticalOffsetForLineNumber(lineNumber: number): number; } @@ -44,12 +46,11 @@ export const enum TextAreaStrategy { NVDA } -export class KeyboardHandler extends ViewEventHandler { +export class TextAreaHandler extends ViewEventHandler { private readonly _context: ViewContext; private readonly _viewController: ViewController; - private readonly _textArea: FastDomNode; - private readonly _viewHelper: IKeyboardHandlerHelper; + private readonly _viewHelper: ITextAreaHandlerHelper; private _contentLeft: number; private _contentWidth: number; @@ -61,15 +62,15 @@ export class KeyboardHandler extends ViewEventHandler { private _lastCopiedValue: string; private _lastCopiedValueIsFromEmptySelection: boolean; + public readonly textArea: FastDomNode; + public readonly textAreaCover: FastDomNode; private readonly _textAreaInput: TextAreaInput; - constructor(context: ViewContext, viewController: ViewController, viewHelper: IKeyboardHandlerHelper) { + constructor(context: ViewContext, viewController: ViewController, viewHelper: ITextAreaHandlerHelper) { super(); this._context = context; this._viewController = viewController; - this._textArea = viewHelper.textArea; - Configuration.applyFontInfo(this._textArea, this._context.configuration.editor.fontInfo); this._viewHelper = viewHelper; this._contentLeft = this._context.configuration.editor.layoutInfo.contentLeft; @@ -82,6 +83,43 @@ export class KeyboardHandler extends ViewEventHandler { this._lastCopiedValue = null; this._lastCopiedValueIsFromEmptySelection = false; + // Text Area (The focus will always be in the textarea when the cursor is blinking) + this.textArea = createFastDomNode(document.createElement('textarea')); + PartFingerprints.write(this.textArea, PartFingerprint.TextArea); + this.textArea.setClassName('inputarea'); + this.textArea.setAttribute('wrap', 'off'); + this.textArea.setAttribute('autocorrect', 'off'); + this.textArea.setAttribute('autocapitalize', 'off'); + this.textArea.setAttribute('spellcheck', 'false'); + this.textArea.setAttribute('aria-label', this._context.configuration.editor.viewInfo.ariaLabel); + this.textArea.setAttribute('role', 'textbox'); + this.textArea.setAttribute('aria-multiline', 'true'); + this.textArea.setAttribute('aria-haspopup', 'false'); + this.textArea.setAttribute('aria-autocomplete', 'both'); + + this.textArea.setTop(0); + this.textArea.setLeft(0); + Configuration.applyFontInfo(this.textArea, this._context.configuration.editor.fontInfo); + + // On top of the text area, we position a dom node to cover it up + // (there have been reports of tiny blinking cursors) + // (in WebKit the textarea is 1px by 1px because it cannot handle input to a 0x0 textarea) + this.textAreaCover = createFastDomNode(document.createElement('div')); + if (this._context.configuration.editor.viewInfo.glyphMargin) { + this.textAreaCover.setClassName('monaco-editor-background ' + Margin.CLASS_NAME + ' ' + 'textAreaCover'); + } else { + if (this._context.configuration.editor.viewInfo.renderLineNumbers) { + this.textAreaCover.setClassName('monaco-editor-background ' + LineNumbersOverlay.CLASS_NAME + ' ' + 'textAreaCover'); + } else { + this.textAreaCover.setClassName('monaco-editor-background ' + 'textAreaCover'); + } + } + this.textAreaCover.setPosition('absolute'); + this.textAreaCover.setWidth(1); + this.textAreaCover.setHeight(1); + this.textAreaCover.setTop(0); + this.textAreaCover.setLeft(0); + const simpleModel: ISimpleModel = { getLineCount: (): number => { return this._context.model.getLineCount(); @@ -136,7 +174,7 @@ export class KeyboardHandler extends ViewEventHandler { } }; - this._textAreaInput = this._register(new TextAreaInput(textAreaInputHost, this._textArea)); + this._textAreaInput = this._register(new TextAreaInput(textAreaInputHost, this.textArea)); this._register(this._textAreaInput.onKeyDown((e: IKeyboardEvent) => { this._viewController.emitKeyDown(e); @@ -184,12 +222,12 @@ export class KeyboardHandler extends ViewEventHandler { this._viewHelper.getVerticalOffsetForLineNumber(lineNumber), visibleRange.left ); - this._textArea.setTop(this._visiblePosition.top - this._scrollTop); - this._textArea.setLeft(this._contentLeft + this._visiblePosition.left - this._scrollLeft); + this.textArea.setTop(this._visiblePosition.top - this._scrollTop); + this.textArea.setLeft(this._contentLeft + this._visiblePosition.left - this._scrollLeft); } // Show the textarea - this._textArea.setHeight(this._context.configuration.editor.lineHeight); + this.textArea.setHeight(this._context.configuration.editor.lineHeight); this._viewHelper.viewDomNode.addClassName('ime-input'); this._viewController.compositionStart('keyboard'); @@ -199,30 +237,30 @@ export class KeyboardHandler extends ViewEventHandler { if (browser.isEdgeOrIE) { // Due to isEdgeOrIE (where the textarea was not cleared initially) // we cannot assume the text consists only of the composited text - this._textArea.setWidth(0); + this.textArea.setWidth(0); } else { // adjust width by its size let canvasElem = document.createElement('canvas'); let context = canvasElem.getContext('2d'); - let cs = dom.getComputedStyle(this._textArea.domNode); + let cs = dom.getComputedStyle(this.textArea.domNode); if (browser.isFirefox) { // computedStyle.font is empty in Firefox... context.font = `${cs.fontStyle} ${cs.fontVariant} ${cs.fontWeight} ${cs.fontStretch} ${cs.fontSize} / ${cs.lineHeight} ${cs.fontFamily}`; let metrics = context.measureText(e.data); - this._textArea.setWidth(metrics.width + 2); // +2 for Japanese... + this.textArea.setWidth(metrics.width + 2); // +2 for Japanese... } else { context.font = cs.font; let metrics = context.measureText(e.data); - this._textArea.setWidth(metrics.width); + this.textArea.setWidth(metrics.width); } } })); this._register(this._textAreaInput.onCompositionEnd(() => { - this._textArea.unsetHeight(); - this._textArea.unsetWidth(); - this._textArea.setLeft(0); - this._textArea.setTop(0); + this.textArea.unsetHeight(); + this.textArea.unsetWidth(); + this.textArea.setLeft(0); + this.textArea.setTop(0); this._viewHelper.viewDomNode.removeClassName('ime-input'); this._visiblePosition = null; @@ -266,7 +304,7 @@ export class KeyboardHandler extends ViewEventHandler { public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { // Give textarea same font size & line height as editor, for the IME case (when the textarea is visible) if (e.fontInfo) { - Configuration.applyFontInfo(this._textArea, this._context.configuration.editor.fontInfo); + Configuration.applyFontInfo(this.textArea, this._context.configuration.editor.fontInfo); } if (e.viewInfo.experimentalScreenReader) { this._textAreaInput.writeScreenReaderContent('strategy changed'); @@ -276,7 +314,7 @@ export class KeyboardHandler extends ViewEventHandler { this._contentWidth = this._context.configuration.editor.layoutInfo.contentWidth; } if (e.viewInfo.ariaLabel) { - this._textArea.setAttribute('aria-label', this._context.configuration.editor.viewInfo.ariaLabel); + this.textArea.setAttribute('aria-label', this._context.configuration.editor.viewInfo.ariaLabel); } return false; } @@ -290,8 +328,8 @@ export class KeyboardHandler extends ViewEventHandler { this._scrollLeft = e.scrollLeft; this._scrollTop = e.scrollTop; if (this._visiblePosition) { - this._textArea.setTop(this._visiblePosition.top - this._scrollTop); - this._textArea.setLeft(this._contentLeft + this._visiblePosition.left - this._scrollLeft); + this.textArea.setTop(this._visiblePosition.top - this._scrollTop); + this.textArea.setLeft(this._contentLeft + this._visiblePosition.left - this._scrollLeft); } return false; } @@ -306,15 +344,15 @@ export class KeyboardHandler extends ViewEventHandler { public setAriaActiveDescendant(id: string): void { if (id) { - this._textArea.setAttribute('role', 'combobox'); - if (this._textArea.getAttribute('aria-activedescendant') !== id) { - this._textArea.setAttribute('aria-haspopup', 'true'); - this._textArea.setAttribute('aria-activedescendant', id); + this.textArea.setAttribute('role', 'combobox'); + if (this.textArea.getAttribute('aria-activedescendant') !== id) { + this.textArea.setAttribute('aria-haspopup', 'true'); + this.textArea.setAttribute('aria-activedescendant', id); } } else { - this._textArea.setAttribute('role', 'textbox'); - this._textArea.removeAttribute('aria-activedescendant'); - this._textArea.removeAttribute('aria-haspopup'); + this.textArea.setAttribute('role', 'textbox'); + this.textArea.removeAttribute('aria-activedescendant'); + this.textArea.removeAttribute('aria-haspopup'); } } diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index b3301542736..c2dbbd4c6ce 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -14,7 +14,7 @@ import { Range } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; import { Configuration } from 'vs/editor/browser/config/configuration'; -import { KeyboardHandler, IKeyboardHandlerHelper } from 'vs/editor/browser/controller/keyboardHandler'; +import { TextAreaHandler, ITextAreaHandlerHelper } from 'vs/editor/browser/controller/textAreaHandler'; import { PointerHandler } from 'vs/editor/browser/controller/pointerHandler'; import * as editorBrowser from 'vs/editor/browser/editorBrowser'; import { ViewController, ExecCoreEditorCommandFunc } from 'vs/editor/browser/view/viewController'; @@ -80,16 +80,14 @@ export class View extends ViewEventHandler { private viewCursors: ViewCursors; private viewParts: ViewPart[]; - private keyboardHandler: KeyboardHandler; - private pointerHandler: PointerHandler; + private readonly _textAreaHandler: TextAreaHandler; + private readonly pointerHandler: PointerHandler; private outgoingEvents: ViewOutgoingEvents; // Dom nodes private linesContent: FastDomNode; public domNode: FastDomNode; - private textArea: FastDomNode; - private textAreaCover: FastDomNode; private overflowGuardContainer: FastDomNode; // Actual mutable state @@ -125,13 +123,12 @@ export class View extends ViewEventHandler { // The view context is passed on to most classes (basically to reduce param. counts in ctors) this._context = new ViewContext(configuration, model, this.eventDispatcher); - this.createTextArea(); + // Keyboard handler + this._textAreaHandler = new TextAreaHandler(this._context, viewController, this.createTextAreaHandlerHelper()); + this.createViewParts(); this._setLayout(); - // Keyboard handler - this.keyboardHandler = new KeyboardHandler(this._context, viewController, this.createKeyboardHandlerHelper()); - // Pointer handler this.pointerHandler = new PointerHandler(this._context, viewController, this.createPointerHandlerHelper()); @@ -140,44 +137,6 @@ export class View extends ViewEventHandler { })); } - private createTextArea(): void { - // Text Area (The focus will always be in the textarea when the cursor is blinking) - this.textArea = createFastDomNode(document.createElement('textarea')); - PartFingerprints.write(this.textArea, PartFingerprint.TextArea); - this.textArea.setClassName('inputarea'); - this.textArea.setAttribute('wrap', 'off'); - this.textArea.setAttribute('autocorrect', 'off'); - this.textArea.setAttribute('autocapitalize', 'off'); - this.textArea.setAttribute('spellcheck', 'false'); - this.textArea.setAttribute('aria-label', this._context.configuration.editor.viewInfo.ariaLabel); - this.textArea.setAttribute('role', 'textbox'); - this.textArea.setAttribute('aria-multiline', 'true'); - this.textArea.setAttribute('aria-haspopup', 'false'); - this.textArea.setAttribute('aria-autocomplete', 'both'); - - this.textArea.setTop(0); - this.textArea.setLeft(0); - - // On top of the text area, we position a dom node to cover it up - // (there have been reports of tiny blinking cursors) - // (in WebKit the textarea is 1px by 1px because it cannot handle input to a 0x0 textarea) - this.textAreaCover = createFastDomNode(document.createElement('div')); - if (this._context.configuration.editor.viewInfo.glyphMargin) { - this.textAreaCover.setClassName('monaco-editor-background ' + Margin.CLASS_NAME + ' ' + 'textAreaCover'); - } else { - if (this._context.configuration.editor.viewInfo.renderLineNumbers) { - this.textAreaCover.setClassName('monaco-editor-background ' + LineNumbersOverlay.CLASS_NAME + ' ' + 'textAreaCover'); - } else { - this.textAreaCover.setClassName('monaco-editor-background ' + 'textAreaCover'); - } - } - this.textAreaCover.setPosition('absolute'); - this.textAreaCover.setWidth(1); - this.textAreaCover.setHeight(1); - this.textAreaCover.setTop(0); - this.textAreaCover.setLeft(0); - } - private createViewParts(): void { // These two dom nodes must be constructed up front, since references are needed in the layout provider (scrolling & co.) this.linesContent = createFastDomNode(document.createElement('div')); @@ -268,8 +227,8 @@ export class View extends ViewEventHandler { this.overflowGuardContainer.appendChild(this._scrollbar.getDomNode()); this.overflowGuardContainer.appendChild(scrollDecoration.getDomNode()); this.overflowGuardContainer.appendChild(this.overlayWidgets.getDomNode()); - this.overflowGuardContainer.appendChild(this.textArea); - this.overflowGuardContainer.appendChild(this.textAreaCover); + this.overflowGuardContainer.appendChild(this._textAreaHandler.textArea); + this.overflowGuardContainer.appendChild(this._textAreaHandler.textAreaCover); this.overflowGuardContainer.appendChild(minimap.getDomNode()); this.domNode.appendChild(this.overflowGuardContainer); this.domNode.appendChild(this.contentWidgets.overflowingContentWidgetsDomNode); @@ -341,10 +300,9 @@ export class View extends ViewEventHandler { }; } - private createKeyboardHandlerHelper(): IKeyboardHandlerHelper { + private createTextAreaHandlerHelper(): ITextAreaHandlerHelper { return { viewDomNode: this.domNode, - textArea: this.textArea, visibleRangeForPositionRelativeToEditor: (lineNumber: number, column: number) => { this._flushAccumulatedAndRenderNow(); let visibleRanges = this.viewLines.visibleRangesForRange2(new Range(lineNumber, column, lineNumber, column)); @@ -435,7 +393,7 @@ export class View extends ViewEventHandler { this.eventDispatcher.removeEventHandler(this); this.outgoingEvents.dispose(); - this.keyboardHandler.dispose(); + this._textAreaHandler.dispose(); this.pointerHandler.dispose(); this.viewLines.dispose(); @@ -492,7 +450,7 @@ export class View extends ViewEventHandler { if (!this.viewLines.shouldRender() && viewPartsToRender.length === 0) { // Nothing to render - this.keyboardHandler.writeToTextArea(); + this._textAreaHandler.writeToTextArea(); return; } @@ -503,14 +461,14 @@ export class View extends ViewEventHandler { if (this.viewLines.shouldRender()) { this.viewLines.renderText(viewportData, () => { - this.keyboardHandler.writeToTextArea(); + this._textAreaHandler.writeToTextArea(); }); this.viewLines.onDidRender(); // Rendering of viewLines might cause scroll events to occur, so collect view parts to render again viewPartsToRender = this._getViewPartsToRender(); } else { - this.keyboardHandler.writeToTextArea(); + this._textAreaHandler.writeToTextArea(); } let renderingContext = new RenderingContext(this.layoutProvider, viewportData, this.viewLines); @@ -667,7 +625,7 @@ export class View extends ViewEventHandler { } public setAriaActiveDescendant(id: string): void { - this.keyboardHandler.setAriaActiveDescendant(id); + this._textAreaHandler.setAriaActiveDescendant(id); } public saveState(): editorCommon.IViewState { @@ -679,11 +637,11 @@ export class View extends ViewEventHandler { } public focus(): void { - this.keyboardHandler.focusTextArea(); + this._textAreaHandler.focusTextArea(); } public isFocused(): boolean { - return this.keyboardHandler.isFocused(); + return this._textAreaHandler.isFocused(); } public addContentWidget(widgetData: IContentWidgetData): void { diff --git a/src/vs/editor/test/browser/controller/imeTester.ts b/src/vs/editor/test/browser/controller/imeTester.ts index 828c278edb4..63999ce1c14 100644 --- a/src/vs/editor/test/browser/controller/imeTester.ts +++ b/src/vs/editor/test/browser/controller/imeTester.ts @@ -10,7 +10,7 @@ import { Range, IRange } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { createFastDomNode } from 'vs/base/browser/fastDomNode'; import * as browser from 'vs/base/browser/browser'; -import { TextAreaStrategy } from "vs/editor/browser/controller/keyboardHandler"; +import { TextAreaStrategy } from "vs/editor/browser/controller/textAreaHandler"; // To run this test, open imeTester.html From fa1bcc909cb6ce37b01ee6871cfec5ee98e12533 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 4 May 2017 12:44:03 +0200 Subject: [PATCH 0084/1164] Extract text area related CSS to textAreaHandler.css --- .../browser/controller/textAreaHandler.css | 42 ++++++++++++++++++ .../browser/controller/textAreaHandler.ts | 6 +-- src/vs/editor/browser/view/viewImpl.ts | 3 +- src/vs/editor/browser/widget/media/editor.css | 44 +------------------ .../editor/common/view/editorColorRegistry.ts | 2 +- 5 files changed, 49 insertions(+), 48 deletions(-) create mode 100644 src/vs/editor/browser/controller/textAreaHandler.css diff --git a/src/vs/editor/browser/controller/textAreaHandler.css b/src/vs/editor/browser/controller/textAreaHandler.css new file mode 100644 index 00000000000..e4c5188f7d3 --- /dev/null +++ b/src/vs/editor/browser/controller/textAreaHandler.css @@ -0,0 +1,42 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.monaco-editor .inputarea { + /*Chrome cannot handle typing in a 0x0 textarea*/ + width: 1px; + height: 1px; + min-width: 0; + min-height: 0; + margin: 0; + padding: 0; + position: absolute; + outline: none !important; + resize: none; + border: none; + overflow: hidden; +} +/*.monaco-editor .inputarea { + position: fixed !important; + width: 800px !important; + height: 500px !important; + top: initial !important; + left: initial !important; + bottom: 0 !important; + right: 0 !important; +}*/ +.monaco-editor.ff .inputarea, +.monaco-editor.ie .inputarea { + width: 0; + height: 0; +} +.monaco-editor .ime-input.inputarea { + z-index: 10; +} +.monaco-editor .ime-input.inputarea { + background: rgba(255, 255, 255, 0.85); +} +.monaco-editor.vs-dark .ime-input.inputarea { + background: rgba(0, 0, 0, 0.65); +} diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index 90c12809f3e..22bf4288df3 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; +import 'vs/css!./textAreaHandler'; import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; import { TextAreaInput, ITextAreaInputHost, IPasteData, ICompositionData } from 'vs/editor/browser/controller/textAreaInput'; @@ -24,7 +25,6 @@ import { Margin } from "vs/editor/browser/viewParts/margin/margin"; import { LineNumbersOverlay } from "vs/editor/browser/viewParts/lineNumbers/lineNumbers"; export interface ITextAreaHandlerHelper { - viewDomNode: FastDomNode; visibleRangeForPositionRelativeToEditor(lineNumber: number, column: number): HorizontalRange; getVerticalOffsetForLineNumber(lineNumber: number): number; } @@ -228,7 +228,7 @@ export class TextAreaHandler extends ViewEventHandler { // Show the textarea this.textArea.setHeight(this._context.configuration.editor.lineHeight); - this._viewHelper.viewDomNode.addClassName('ime-input'); + this.textArea.setClassName('inputarea ime-input'); this._viewController.compositionStart('keyboard'); })); @@ -261,7 +261,7 @@ export class TextAreaHandler extends ViewEventHandler { this.textArea.unsetWidth(); this.textArea.setLeft(0); this.textArea.setTop(0); - this._viewHelper.viewDomNode.removeClassName('ime-input'); + this.textArea.setClassName('inputarea'); this._visiblePosition = null; diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index c2dbbd4c6ce..97f14e18708 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -83,7 +83,7 @@ export class View extends ViewEventHandler { private readonly _textAreaHandler: TextAreaHandler; private readonly pointerHandler: PointerHandler; - private outgoingEvents: ViewOutgoingEvents; + private readonly outgoingEvents: ViewOutgoingEvents; // Dom nodes private linesContent: FastDomNode; @@ -302,7 +302,6 @@ export class View extends ViewEventHandler { private createTextAreaHandlerHelper(): ITextAreaHandlerHelper { return { - viewDomNode: this.domNode, visibleRangeForPositionRelativeToEditor: (lineNumber: number, column: number) => { this._flushAccumulatedAndRenderNow(); let visibleRanges = this.viewLines.visibleRangesForRange2(new Range(lineNumber, column, lineNumber, column)); diff --git a/src/vs/editor/browser/widget/media/editor.css b/src/vs/editor/browser/widget/media/editor.css index 90a691620e8..e47af5c00c7 100644 --- a/src/vs/editor/browser/widget/media/editor.css +++ b/src/vs/editor/browser/widget/media/editor.css @@ -15,7 +15,7 @@ color: inherit; } -/* -------------------- Editor, inputarea and background -------------------- */ +/* -------------------- Editor -------------------- */ .monaco-editor { position: relative; @@ -29,40 +29,8 @@ -webkit-font-feature-settings: "liga" on, "calt" on; font-feature-settings: "liga" on, "calt" on; } -.monaco-editor .inputarea { - /*Chrome cannot handle typing in a 0x0 textarea*/ - width: 1px; - height: 1px; - min-width: 0; - min-height: 0; - margin: 0; - padding: 0; - position: absolute; - outline: none !important; - resize: none; - border: none; - overflow: hidden; -} -/*.monaco-editor .inputarea { - position: fixed !important; - width: 800px !important; - height: 200px !important; - top: initial !important; - left: initial !important; - bottom: 0 !important; - right: 0 !important; -}*/ -.monaco-editor.ff .inputarea, -.monaco-editor.ie .inputarea { - width: 0; - height: 0; -} -.monaco-editor.ime-input .inputarea { - z-index: 10; -} -.monaco-editor, -.monaco-editor .inputarea { +.monaco-editor { color: #333; /* * WORKAROUND: @@ -71,22 +39,14 @@ */ background: #fffffe; } -.monaco-editor.ime-input .inputarea { - background: rgba(255, 255, 255, 0.85); -} .monaco-editor.vs-dark, -.monaco-editor.vs-dark .inputarea, .monaco-editor.vs-dark .zone-widget .monaco-editor { color: #BBB; background: #1E1E1E; } -.monaco-editor.vs-dark.ime-input .inputarea { - background: rgba(0, 0, 0, 0.65); -} .monaco-editor.hc-black, -.monaco-editor.hc-black .inputarea, .monaco-editor.hc-black .zone-widget .monaco-editor { color: #fff; background: #000; diff --git a/src/vs/editor/common/view/editorColorRegistry.ts b/src/vs/editor/common/view/editorColorRegistry.ts index e6a96f19043..1dd21ca5506 100644 --- a/src/vs/editor/common/view/editorColorRegistry.ts +++ b/src/vs/editor/common/view/editorColorRegistry.ts @@ -25,7 +25,7 @@ registerThemingParticipant((theme, collector) => { let background = theme.getColor(editorBackground); if (background) { - collector.addRule(`.monaco-editor.${theme.selector} .monaco-editor-background { background-color: ${background}; }`); + collector.addRule(`.monaco-editor.${theme.selector} .monaco-editor-background, .monaco-editor.${theme.selector} .inputarea { background-color: ${background}; }`); } let foreground = theme.getColor(editorForeground); if (foreground) { From 3782c32cff6565a22f39924404183fc04cad2f85 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 4 May 2017 14:01:33 +0200 Subject: [PATCH 0085/1164] Fix issue with Japanese IM in FF --- src/vs/base/common/strings.ts | 9 +++ .../browser/controller/textAreaHandler.ts | 77 ++++++++++--------- .../browser/controller/textAreaInput.ts | 10 +-- .../browser/controller/textAreaState.ts | 23 +++--- .../test/browser/controller/imeTester.ts | 6 +- .../browser/controller/textAreaState.test.ts | 62 +++++++-------- 6 files changed, 101 insertions(+), 86 deletions(-) diff --git a/src/vs/base/common/strings.ts b/src/vs/base/common/strings.ts index 85a902fd56b..ea4259e8f36 100644 --- a/src/vs/base/common/strings.ts +++ b/src/vs/base/common/strings.ts @@ -511,6 +511,15 @@ export function isBasicASCII(str: string): boolean { return IS_BASIC_ASCII.test(str); } +export function containsFullWidthCharacter(str: string): boolean { + for (let i = 0, len = str.length; i < len; i++) { + if (isFullWidthCharacter(str.charCodeAt(i))) { + return true; + } + } + return false; +} + export function isFullWidthCharacter(charCode: number): boolean { // Do a cheap trick to better support wrapping of wide characters, treat them as 2 columns // http://jrgraphix.net/research/unicode_blocks.php diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index 22bf4288df3..a7bb2de8772 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -6,7 +6,6 @@ import 'vs/css!./textAreaHandler'; import * as browser from 'vs/base/browser/browser'; -import * as dom from 'vs/base/browser/dom'; import { TextAreaInput, ITextAreaInputHost, IPasteData, ICompositionData } from 'vs/editor/browser/controller/textAreaInput'; import { ISimpleModel, ITypeData, TextAreaState, IENarratorStrategy, NVDAPagedStrategy } from 'vs/editor/browser/controller/textAreaState'; import { Range } from 'vs/editor/common/core/range'; @@ -23,6 +22,7 @@ import { IKeyboardEvent } from "vs/base/browser/keyboardEvent"; import { PartFingerprints, PartFingerprint } from "vs/editor/browser/view/viewPart"; import { Margin } from "vs/editor/browser/viewParts/margin/margin"; import { LineNumbersOverlay } from "vs/editor/browser/viewParts/lineNumbers/lineNumbers"; +import { BareFontInfo } from "vs/editor/common/config/fontInfo"; export interface ITextAreaHandlerHelper { visibleRangeForPositionRelativeToEditor(lineNumber: number, column: number): HorizontalRange; @@ -41,11 +41,6 @@ class TextAreaVisiblePosition { } } -export const enum TextAreaStrategy { - IENarrator, - NVDA -} - export class TextAreaHandler extends ViewEventHandler { private readonly _context: ViewContext; @@ -163,14 +158,13 @@ export class TextAreaHandler extends ViewEventHandler { return TextAreaState.EMPTY; } - const strategy = this._getStrategy(); const selection = this._selections[0]; - if (strategy === TextAreaStrategy.IENarrator) { - return IENarratorStrategy.fromEditorSelection(currentState, simpleModel, selection); + if (this._context.configuration.editor.viewInfo.experimentalScreenReader) { + return NVDAPagedStrategy.fromEditorSelection(currentState, simpleModel, selection); } - return NVDAPagedStrategy.fromEditorSelection(currentState, simpleModel, selection); + return IENarratorStrategy.fromEditorSelection(currentState, simpleModel, selection); } }; @@ -240,19 +234,7 @@ export class TextAreaHandler extends ViewEventHandler { this.textArea.setWidth(0); } else { // adjust width by its size - let canvasElem = document.createElement('canvas'); - let context = canvasElem.getContext('2d'); - let cs = dom.getComputedStyle(this.textArea.domNode); - if (browser.isFirefox) { - // computedStyle.font is empty in Firefox... - context.font = `${cs.fontStyle} ${cs.fontVariant} ${cs.fontWeight} ${cs.fontStretch} ${cs.fontSize} / ${cs.lineHeight} ${cs.fontFamily}`; - let metrics = context.measureText(e.data); - this.textArea.setWidth(metrics.width + 2); // +2 for Japanese... - } else { - context.font = cs.font; - let metrics = context.measureText(e.data); - this.textArea.setWidth(metrics.width); - } + this.textArea.setWidth(measureText(e.data, this._context.configuration.editor.fontInfo)); } })); @@ -284,21 +266,6 @@ export class TextAreaHandler extends ViewEventHandler { super.dispose(); } - private _getStrategy(): TextAreaStrategy { - if (this._context.configuration.editor.viewInfo.experimentalScreenReader) { - return TextAreaStrategy.NVDA; - } - return TextAreaStrategy.IENarrator; - } - - public isFocused(): boolean { - return this._textAreaInput.isFocused(); - } - - public focusTextArea(): void { - this._textAreaInput.focusTextArea(); - } - // --- begin event handlers public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { @@ -338,6 +305,14 @@ export class TextAreaHandler extends ViewEventHandler { // --- begin view API + public isFocused(): boolean { + return this._textAreaInput.isFocused(); + } + + public focusTextArea(): void { + this._textAreaInput.focusTextArea(); + } + public writeToTextArea(): void { this._textAreaInput.writeScreenReaderContent('selection changed'); } @@ -358,3 +333,29 @@ export class TextAreaHandler extends ViewEventHandler { // --- end view API } + +function measureText(text: string, fontInfo: BareFontInfo): number { + // adjust width by its size + const canvasElem = document.createElement('canvas'); + const context = canvasElem.getContext('2d'); + context.font = createFontString(fontInfo); + const metrics = context.measureText(text); + + if (browser.isFirefox) { + return metrics.width + 2; // +2 for Japanese... + } else { + return metrics.width; + } +} + +function createFontString(bareFontInfo: BareFontInfo): string { + return doCreateFontString('normal', bareFontInfo.fontWeight, bareFontInfo.fontSize, bareFontInfo.lineHeight, bareFontInfo.fontFamily); +} + +function doCreateFontString(fontStyle: string, fontWeight: string, fontSize: number, lineHeight: number, fontFamily: string): string { + // The full font syntax is: + // style | variant | weight | stretch | size/line-height | fontFamily + // (https://developer.mozilla.org/en-US/docs/Web/CSS/font) + // But it appears Edge and IE11 cannot properly parse `stretch`. + return `${fontStyle} normal ${fontWeight} ${fontSize}px / ${lineHeight}px ${fontFamily}`; +} diff --git a/src/vs/editor/browser/controller/textAreaInput.ts b/src/vs/editor/browser/controller/textAreaInput.ts index 7d921e1936c..ea20af1e436 100644 --- a/src/vs/editor/browser/controller/textAreaInput.ts +++ b/src/vs/editor/browser/controller/textAreaInput.ts @@ -138,10 +138,10 @@ export class TextAreaInput extends Disposable { /** * Deduce the typed input from a text area's value and the last observed state. */ - const deduceInputFromTextAreaValue = (isDoingComposition: boolean): [TextAreaState, ITypeData] => { + const deduceInputFromTextAreaValue = (): [TextAreaState, ITypeData] => { const oldState = this._textAreaState; const newState = this._textAreaState.readFromTextArea(this._textArea); - return [newState, TextAreaState.deduceInput(oldState, newState, isDoingComposition)]; + return [newState, TextAreaState.deduceInput(oldState, newState)]; }; /** @@ -172,7 +172,7 @@ export class TextAreaInput extends Disposable { // Multi-part Japanese compositions reset cursor in Edge/IE, Chinese and Korean IME don't have this issue. // The reason that we can't use this path for all CJK IME is IE and Edge behave differently when handling Korean IME, // which breaks this path of code. - const [newState, typeInput] = deduceInputFromTextAreaValue(true); + const [newState, typeInput] = deduceInputFromTextAreaValue(); this._textAreaState = newState; this._onType.fire(typeInput); this._onCompositionUpdate.fire(e); @@ -189,7 +189,7 @@ export class TextAreaInput extends Disposable { // console.log('onCompositionEnd: ' + e.data); if (browser.isEdgeOrIE && e.locale === 'ja') { // https://github.com/Microsoft/monaco-editor/issues/339 - const [newState, typeInput] = deduceInputFromTextAreaValue(true); + const [newState, typeInput] = deduceInputFromTextAreaValue(); this._textAreaState = newState; this._onType.fire(typeInput); } @@ -231,7 +231,7 @@ export class TextAreaInput extends Disposable { return; } - const [newState, typeInput] = deduceInputFromTextAreaValue(false); + const [newState, typeInput] = deduceInputFromTextAreaValue(); if (typeInput.replaceCharCnt === 0 && typeInput.text.length === 1 && strings.isHighSurrogate(typeInput.text.charCodeAt(0))) { // Ignore invalid input but keep it around for next time return; diff --git a/src/vs/editor/browser/controller/textAreaState.ts b/src/vs/editor/browser/controller/textAreaState.ts index d66e788c53d..c9218a06db0 100644 --- a/src/vs/editor/browser/controller/textAreaState.ts +++ b/src/vs/editor/browser/controller/textAreaState.ts @@ -4,10 +4,10 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { commonPrefixLength, commonSuffixLength } from 'vs/base/common/strings'; import { Range } from 'vs/editor/common/core/range'; import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; import { Constants } from 'vs/editor/common/core/uint'; +import * as strings from 'vs/base/common/strings'; export interface ITextAreaWrapper { getValue(): string; @@ -81,7 +81,7 @@ export class TextAreaState { return new TextAreaState(text, 0, text.length, 0); } - public static deduceInput(previousState: TextAreaState, currentState: TextAreaState, isDoingComposition: boolean): ITypeData { + public static deduceInput(previousState: TextAreaState, currentState: TextAreaState): ITypeData { if (!previousState) { // This is the EMPTY state return { @@ -104,13 +104,13 @@ export class TextAreaState { // Strip the previous suffix from the value (without interfering with the current selection) const previousSuffix = previousValue.substring(previousSelectionEnd); const currentSuffix = currentValue.substring(currentSelectionEnd); - const suffixLength = commonSuffixLength(previousSuffix, currentSuffix); + const suffixLength = strings.commonSuffixLength(previousSuffix, currentSuffix); currentValue = currentValue.substring(0, currentValue.length - suffixLength); previousValue = previousValue.substring(0, previousValue.length - suffixLength); const previousPrefix = previousValue.substring(0, previousSelectionStart); const currentPrefix = currentValue.substring(0, currentSelectionStart); - const prefixLength = commonPrefixLength(previousPrefix, currentPrefix); + const prefixLength = strings.commonPrefixLength(previousPrefix, currentPrefix); currentValue = currentValue.substring(prefixLength); previousValue = previousValue.substring(prefixLength); currentSelectionStart -= prefixLength; @@ -122,20 +122,21 @@ export class TextAreaState { // console.log('AFTER DIFFING PREVIOUS STATE: <' + previousValue + '>, selectionStart: ' + previousSelectionStart + ', selectionEnd: ' + previousSelectionEnd); if (currentSelectionStart === currentSelectionEnd) { - // composition accept case + // composition accept case (noticed in FF + Japanese) // [blahblah] => blahblah| if ( - isDoingComposition - && previousValue === currentValue + previousValue === currentValue && previousSelectionStart === 0 && previousSelectionEnd === previousValue.length && currentSelectionStart === currentValue.length && currentValue.indexOf('\n') === -1 ) { - return { - text: '', - replaceCharCnt: 0 - }; + if (strings.containsFullWidthCharacter(currentValue)) { + return { + text: '', + replaceCharCnt: 0 + }; + } } // no current selection diff --git a/src/vs/editor/test/browser/controller/imeTester.ts b/src/vs/editor/test/browser/controller/imeTester.ts index 63999ce1c14..855ab7156b7 100644 --- a/src/vs/editor/test/browser/controller/imeTester.ts +++ b/src/vs/editor/test/browser/controller/imeTester.ts @@ -10,10 +10,14 @@ import { Range, IRange } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { createFastDomNode } from 'vs/base/browser/fastDomNode'; import * as browser from 'vs/base/browser/browser'; -import { TextAreaStrategy } from "vs/editor/browser/controller/textAreaHandler"; // To run this test, open imeTester.html +const enum TextAreaStrategy { + IENarrator, + NVDA +} + class SingleLineTestModel implements ISimpleModel { private _line: string; diff --git a/src/vs/editor/test/browser/controller/textAreaState.test.ts b/src/vs/editor/test/browser/controller/textAreaState.test.ts index 8cc54071934..ca8cad271a0 100644 --- a/src/vs/editor/test/browser/controller/textAreaState.test.ts +++ b/src/vs/editor/test/browser/controller/textAreaState.test.ts @@ -113,7 +113,7 @@ suite('TextAreaState', () => { textArea.dispose(); }); - function testDeduceInput(prevState: TextAreaState, value: string, selectionStart: number, selectionEnd: number, isDoingComposition: boolean, expected: string, expectedCharReplaceCnt: number): void { + function testDeduceInput(prevState: TextAreaState, value: string, selectionStart: number, selectionEnd: number, expected: string, expectedCharReplaceCnt: number): void { prevState = prevState || TextAreaState.EMPTY; let textArea = new MockTextAreaWrapper(); @@ -122,7 +122,7 @@ suite('TextAreaState', () => { textArea._selectionEnd = selectionEnd; let newState = prevState.readFromTextArea(textArea); - let actual = TextAreaState.deduceInput(prevState, newState, isDoingComposition); + let actual = TextAreaState.deduceInput(prevState, newState); assert.equal(actual.text, expected); assert.equal(actual.replaceCharCnt, expectedCharReplaceCnt); @@ -143,7 +143,7 @@ suite('TextAreaState', () => { testDeduceInput( TextAreaState.EMPTY, 's', - 0, 1, true, + 0, 1, 's', 0 ); @@ -153,7 +153,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('s', 0, 1, 0), 'せ', - 0, 1, true, + 0, 1, 'せ', 1 ); @@ -163,7 +163,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('せ', 0, 1, 0), 'せn', - 0, 2, true, + 0, 2, 'せn', 1 ); @@ -173,7 +173,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('せn', 0, 2, 0), 'せん', - 0, 2, true, + 0, 2, 'せん', 2 ); @@ -183,7 +183,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('せん', 0, 2, 0), 'せんs', - 0, 3, true, + 0, 3, 'せんs', 2 ); @@ -193,7 +193,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('せんs', 0, 3, 0), 'せんせ', - 0, 3, true, + 0, 3, 'せんせ', 3 ); @@ -203,7 +203,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('せんせ', 0, 3, 0), 'せんせ', - 0, 3, true, + 0, 3, 'せんせ', 3 ); @@ -213,7 +213,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('せんせ', 0, 3, 0), 'せんせい', - 0, 4, true, + 0, 4, 'せんせい', 3 ); @@ -223,7 +223,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('せんせい', 0, 4, 0), 'せんせい', - 4, 4, true, + 4, 4, '', 0 ); }); @@ -242,7 +242,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('せんせい', 0, 4, 0), 'せんせい', - 0, 4, true, + 0, 4, 'せんせい', 4 ); @@ -252,7 +252,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('せんせい', 0, 4, 0), '先生', - 0, 2, true, + 0, 2, '先生', 4 ); @@ -262,7 +262,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('先生', 0, 2, 0), '先生', - 2, 2, true, + 2, 2, '', 0 ); }); @@ -271,7 +271,7 @@ suite('TextAreaState', () => { testDeduceInput( null, 'a', - 0, 1, false, + 0, 1, 'a', 0 ); }); @@ -280,7 +280,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState(']\n', 1, 2, 0), ']\n', - 2, 2, false, + 2, 2, '\n', 0 ); }); @@ -289,7 +289,7 @@ suite('TextAreaState', () => { testDeduceInput( null, 'a', - 1, 1, false, + 1, 1, 'a', 0 ); }); @@ -298,7 +298,7 @@ suite('TextAreaState', () => { testDeduceInput( TextAreaState.EMPTY, 'a', - 0, 1, false, + 0, 1, 'a', 0 ); }); @@ -307,7 +307,7 @@ suite('TextAreaState', () => { testDeduceInput( TextAreaState.EMPTY, 'a', - 1, 1, false, + 1, 1, 'a', 0 ); }); @@ -316,7 +316,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('Hello world!', 0, 12, 0), 'H', - 1, 1, false, + 1, 1, 'H', 0 ); }); @@ -325,7 +325,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('Hello world!', 12, 12, 0), 'Hello world!a', - 13, 13, false, + 13, 13, 'a', 0 ); }); @@ -334,7 +334,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('Hello world!', 0, 0, 0), 'aHello world!', - 1, 1, false, + 1, 1, 'a', 0 ); }); @@ -343,7 +343,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('Hello world!', 6, 11, 0), 'Hello other!', - 11, 11, false, + 11, 11, 'other', 0 ); }); @@ -352,7 +352,7 @@ suite('TextAreaState', () => { testDeduceInput( TextAreaState.EMPTY, 'これは', - 3, 3, true, + 3, 3, 'これは', 0 ); }); @@ -361,7 +361,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('Hello world!', 0, 0, 0), 'Aello world!', - 1, 1, false, + 1, 1, 'A', 0 ); }); @@ -370,7 +370,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('Hello world!', 5, 5, 0), 'Hellö world!', - 4, 5, false, + 4, 5, 'ö', 0 ); }); @@ -379,7 +379,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('Hello world!', 5, 5, 0), 'Hellöö world!', - 5, 5, false, + 5, 5, 'öö', 1 ); }); @@ -388,7 +388,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('Hello world!', 5, 5, 0), 'Helöö world!', - 5, 5, false, + 5, 5, 'öö', 2 ); }); @@ -397,7 +397,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('Hello world!', 5, 5, 0), 'Hellö world!', - 5, 5, false, + 5, 5, 'ö', 1 ); }); @@ -406,7 +406,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('a', 0, 1, 0), 'a', - 1, 1, false, + 1, 1, 'a', 0 ); }); @@ -415,7 +415,7 @@ suite('TextAreaState', () => { testDeduceInput( new TextAreaState('x x', 0, 1, 0), 'x x', - 1, 1, false, + 1, 1, 'x', 0 ); }); From dcd784ee1662a9e1ee2a59839692d41d50b8a6ac Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 4 May 2017 15:51:09 +0200 Subject: [PATCH 0086/1164] adopt new loader, fixes #25229 --- src/vs/loader.js | 145 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 105 insertions(+), 40 deletions(-) diff --git a/src/vs/loader.js b/src/vs/loader.js index 93484a427e4..82f9afa1c3e 100644 --- a/src/vs/loader.js +++ b/src/vs/loader.js @@ -583,24 +583,86 @@ var AMDLoader; }()); var NodeScriptLoader = (function () { function NodeScriptLoader() { - this._initialized = false; + this._didInitialize = false; + this._didPatchNodeRequire = false; + // js-flags have an impact on cached data + this._jsflags = ''; + for (var _i = 0, _a = process.argv; _i < _a.length; _i++) { + var arg = _a[_i]; + if (arg.indexOf('--js-flags=') === 0) { + this._jsflags = arg; + break; + } + } } NodeScriptLoader.prototype._init = function (nodeRequire) { - if (this._initialized) { + if (this._didInitialize) { return; } - this._initialized = true; + this._didInitialize = true; this._fs = nodeRequire('fs'); this._vm = nodeRequire('vm'); this._path = nodeRequire('path'); this._crypto = nodeRequire('crypto'); }; + // patch require-function of nodejs such that we can manually create a script + // from cached data. this is done by overriding the `Module._compile` function + NodeScriptLoader.prototype._initNodeRequire = function (nodeRequire, moduleManager) { + var nodeCachedDataDir = moduleManager.getConfig().getOptionsLiteral().nodeCachedDataDir; + if (!nodeCachedDataDir || this._didPatchNodeRequire) { + return; + } + this._didPatchNodeRequire = true; + var that = this; + var Module = nodeRequire('module'); + function makeRequireFunction(mod) { + var Module = mod.constructor; + var require = function require(path) { + try { + return mod.require(path); + } + finally { + // nothing + } + }; + require.resolve = function resolve(request) { + return Module._resolveFilename(request, mod); + }; + require.main = process.mainModule; + require.extensions = Module._extensions; + require.cache = Module._cache; + return require; + } + Module.prototype._compile = function (content, filename) { + // remove shebang + content = content.replace(/^#!.*/, ''); + // create wrapper function + var wrapper = Module.wrap(content); + var cachedDataPath = that._getCachedDataPath(nodeCachedDataDir, filename); + var options = { filename: filename }; + try { + options.cachedData = that._fs.readFileSync(cachedDataPath); + } + catch (e) { + options.produceCachedData = true; + } + var script = new that._vm.Script(wrapper, options); + var compileWrapper = script.runInThisContext(options); + var dirname = that._path.dirname(filename); + var require = makeRequireFunction(this); + var args = [this.exports, require, this, filename, dirname, process, AMDLoader.global, Buffer]; + var result = compileWrapper.apply(this.exports, args); + that._processCachedData(moduleManager, script, cachedDataPath); + return result; + }; + }; NodeScriptLoader.prototype.load = function (moduleManager, scriptSrc, callback, errorback) { var _this = this; var opts = moduleManager.getConfig().getOptionsLiteral(); var nodeRequire = (opts.nodeRequire || AMDLoader.global.nodeRequire); var nodeInstrumenter = (opts.nodeInstrumenter || function (c) { return c; }); this._init(nodeRequire); + this._initNodeRequire(nodeRequire, moduleManager); var recorder = moduleManager.getRecorder(); if (/^node\|/.test(scriptSrc)) { var pieces = scriptSrc.split('|'); @@ -646,44 +708,16 @@ var AMDLoader; } else { var cachedDataPath_1 = _this._getCachedDataPath(opts.nodeCachedDataDir, scriptSrc); - _this._fs.readFile(cachedDataPath_1, function (err, data) { + _this._fs.readFile(cachedDataPath_1, function (err, cachedData) { // create script options - var scriptOptions = { + var options = { filename: vmScriptSrc, - produceCachedData: typeof data === 'undefined', - cachedData: data + produceCachedData: typeof cachedData === 'undefined', + cachedData: cachedData }; - var script = _this._loadAndEvalScript(scriptSrc, vmScriptSrc, contents, scriptOptions, recorder); + var script = _this._loadAndEvalScript(scriptSrc, vmScriptSrc, contents, options, recorder); callback(); - // cached code after math - if (script.cachedDataRejected) { - // data rejected => delete cache file - opts.onNodeCachedDataError({ - errorCode: 'cachedDataRejected', - path: cachedDataPath_1 - }); - NodeScriptLoader._runSoon(function () { return _this._fs.unlink(cachedDataPath_1, function (err) { - if (err) { - moduleManager.getConfig().getOptionsLiteral().onNodeCachedDataError({ - errorCode: 'unlink', - path: cachedDataPath_1, - detail: err - }); - } - }); }, opts.nodeCachedDataWriteDelay); - } - else if (script.cachedDataProduced) { - // data produced => write cache file - NodeScriptLoader._runSoon(function () { return _this._fs.writeFile(cachedDataPath_1, script.cachedData, function (err) { - if (err) { - moduleManager.getConfig().getOptionsLiteral().onNodeCachedDataError({ - errorCode: 'writeFile', - path: cachedDataPath_1, - detail: err - }); - } - }); }, opts.nodeCachedDataWriteDelay); - } + _this._processCachedData(moduleManager, script, cachedDataPath_1); }); } }); @@ -699,10 +733,41 @@ var AMDLoader; recorder.record(AMDLoader.LoaderEventType.NodeEndEvaluatingScript, scriptSrc); return script; }; - NodeScriptLoader.prototype._getCachedDataPath = function (baseDir, filename) { - var hash = this._crypto.createHash('md5').update(filename, 'utf8').digest('hex'); + NodeScriptLoader.prototype._getCachedDataPath = function (basedir, filename) { + var hash = this._crypto.createHash('md5').update(filename, 'utf8').update(this._jsflags, 'utf8').digest('hex'); var basename = this._path.basename(filename).replace(/\.js$/, ''); - return this._path.join(baseDir, hash + "-" + basename + ".code"); + return this._path.join(basedir, basename + "-" + hash + ".code"); + }; + NodeScriptLoader.prototype._processCachedData = function (moduleManager, script, cachedDataPath) { + var _this = this; + if (script.cachedDataRejected) { + // data rejected => delete cache file + moduleManager.getConfig().getOptionsLiteral().onNodeCachedDataError({ + errorCode: 'cachedDataRejected', + path: cachedDataPath + }); + NodeScriptLoader._runSoon(function () { return _this._fs.unlink(cachedDataPath, function (err) { + if (err) { + moduleManager.getConfig().getOptionsLiteral().onNodeCachedDataError({ + errorCode: 'unlink', + path: cachedDataPath, + detail: err + }); + } + }); }, moduleManager.getConfig().getOptionsLiteral().nodeCachedDataWriteDelay); + } + else if (script.cachedDataProduced) { + // data produced => write cache file + NodeScriptLoader._runSoon(function () { return _this._fs.writeFile(cachedDataPath, script.cachedData, function (err) { + if (err) { + moduleManager.getConfig().getOptionsLiteral().onNodeCachedDataError({ + errorCode: 'writeFile', + path: cachedDataPath, + detail: err + }); + } + }); }, moduleManager.getConfig().getOptionsLiteral().nodeCachedDataWriteDelay); + } }; NodeScriptLoader._runSoon = function (callback, minTimeout) { var timeout = minTimeout + Math.ceil(Math.random() * minTimeout); From 9554695a01428b8ea37213798a757fd8fdfb0faa Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 4 May 2017 16:03:02 +0200 Subject: [PATCH 0087/1164] Diff editor: avoid hardcoded modified-side shadow. Fixes #25625 --- src/vs/editor/browser/widget/diffEditorWidget.ts | 6 +++++- src/vs/editor/browser/widget/media/diffEditor.css | 3 --- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index 10a24f7f8cc..d6fd59992d4 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -34,7 +34,7 @@ import { ColorId, MetadataConsts, FontStyle } from 'vs/editor/common/modes'; import Event, { Emitter } from 'vs/base/common/event'; import * as editorOptions from 'vs/editor/common/config/editorOptions'; import { registerThemingParticipant, IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; -import { registerColor } from 'vs/platform/theme/common/colorRegistry'; +import { registerColor, scrollbarShadow } from 'vs/platform/theme/common/colorRegistry'; import { Color, RGBA } from 'vs/base/common/color'; import { OverviewRulerZone } from 'vs/editor/common/view/overviewZoneManager'; import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; @@ -1979,4 +1979,8 @@ registerThemingParticipant((theme, collector) => { if (removedOutline) { collector.addRule(`.monaco-editor .line-delete, .monaco-editor .char-delete { border: 1px dashed ${removedOutline}; }`); } + let shadow = theme.getColor(scrollbarShadow); + if (shadow) { + collector.addRule(`.monaco-diff-editor.side-by-side .editor.modified { box-shadow: -6px 0 5px -5px ${shadow}; }`); + } }); \ No newline at end of file diff --git a/src/vs/editor/browser/widget/media/diffEditor.css b/src/vs/editor/browser/widget/media/diffEditor.css index 0c1bb226785..76d1969cddc 100644 --- a/src/vs/editor/browser/widget/media/diffEditor.css +++ b/src/vs/editor/browser/widget/media/diffEditor.css @@ -31,9 +31,6 @@ .modified-in-monaco-diff-editor .slider.active { background: rgba(171, 171, 171, .4); } .modified-in-monaco-diff-editor.hc-black .slider.active { background: none; } -.monaco-diff-editor.side-by-side .editor.modified { box-shadow: -6px 0 5px -5px #DDD; } -.monaco-diff-editor.side-by-side.vs-dark .editor.modified { box-shadow: -6px 0 5px -5px black; } - /* ---------- Diff ---------- */ .monaco-editor .insert-sign, .monaco-editor .delete-sign { From af6f8aa748e7cc5b53a2953df2f43c38db215e45 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 May 2017 16:04:30 +0200 Subject: [PATCH 0088/1164] clean up #24950 --- extensions/git/package.json | 4 ++-- extensions/git/package.nls.json | 2 +- extensions/git/src/commands.ts | 4 ++-- .../workbench/parts/git/browser/gitWorkbenchContributions.ts | 5 ----- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index e6e7d350c45..9bbce1ea371 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -609,10 +609,10 @@ "description": "%config.ignoreLimitWarning%", "default": false }, - "git.cloneDirectory": { + "git.defaultCloneDirectory": { "type": "string", "default": null, - "description": "%config.cloneDirectory%" + "description": "%config.defaultCloneDirectory%" } } } diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index 270283993d4..81188ab18a3 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -38,5 +38,5 @@ "config.checkoutType": "Controls what type of branches are listed when running `Checkout to...`. `all` shows all refs, `local` shows only the local branchs, `tags` shows only tags and `remote` shows only remote branches.", "config.ignoreLegacyWarning": "Ignores the legacy Git warning", "config.ignoreLimitWarning": "Ignores the warning when there are too many changes in a repository", - "config.cloneDirectory": "When cloning a new repository, the default location will be set to this directory" + "config.defaultCloneDirectory": "The default location where to clone a git repository" } \ No newline at end of file diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index a938cb31197..5f2ea323c1c 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -203,11 +203,11 @@ export class CommandCenter { } const config = workspace.getConfiguration('git'); - const cloneDirectory = config.get('cloneDirectory') || os.homedir(); + const value = config.get('defaultCloneDirectory') || os.homedir(); const parentPath = await window.showInputBox({ prompt: localize('parent', "Parent Directory"), - value: cloneDirectory, + value, ignoreFocusOut: true }); diff --git a/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts b/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts index 0bdf195f96c..e35495db433 100644 --- a/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts +++ b/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts @@ -235,11 +235,6 @@ export function registerContributions(): void { enum: ['all', 'local', 'tags', 'remote'], default: 'all', description: nls.localize('checkoutType', "Controls what type of branches are listed."), - }, - 'git.cloneDirectory': { - type: 'string', - default: null, - description: nls.localize('cloneDirectory', "When cloning a new repository, the default location will be set to this directory."), } } }); From 00cbee4bbf66290b81eb737367016586bfbdba25 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 4 May 2017 15:23:43 +0200 Subject: [PATCH 0089/1164] debug: remove heuristic for evaluate name fixes #25166 --- .../parts/debug/common/debugModel.ts | 33 +------------------ 1 file changed, 1 insertion(+), 32 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index d1189a6d8ce..4326c55e2d8 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -250,15 +250,13 @@ export class Variable extends ExpressionContainer implements IExpression { // Used to show the error message coming from the adapter when setting the value #7807 public errorMessage: string; - private static NOT_PROPERTY_SYNTAX = /^[a-zA-Z_][a-zA-Z0-9_]*$/; - private static ARRAY_ELEMENT_SYNTAX = /\[.*\]$/; constructor( process: IProcess, public parent: IExpressionContainer, reference: number, public name: string, - private _evaluateName: string, + public evaluateName: string, value: string, namedVariables: number, indexedVariables: number, @@ -270,35 +268,6 @@ export class Variable extends ExpressionContainer implements IExpression { this.value = value; } - public get evaluateName(): string { - if (this._evaluateName) { - return this._evaluateName; - } - - // TODO@Isidor get rid of this ugly heuristic - let names = [this.name]; - let v = this.parent; - while (v instanceof Variable || v instanceof Expression) { - names.push((v).name); - v = (v).parent; - } - names = names.reverse(); - - let result = null; - names.forEach(name => { - if (!result) { - result = name; - } else if (Variable.ARRAY_ELEMENT_SYNTAX.test(name) || (this.process.configuration.type === 'node' && !Variable.NOT_PROPERTY_SYNTAX.test(name))) { - // use safe way to access node properties a['property_name']. Also handles array elements. - result = name && name.indexOf('[') === 0 ? `${result}${name}` : `${result}['${name}']`; - } else { - result = `${result}.${name}`; - } - }); - - return result; - } - public setVariable(value: string): TPromise { return this.process.session.setVariable({ name: this.name, From b7bb7dd96cd46e313cd914da94f70fd1dca63db6 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 4 May 2017 15:35:16 +0200 Subject: [PATCH 0090/1164] Only show context menu on "real" variables. Not on array chunk nodes. fixes #25147 --- src/vs/workbench/parts/debug/electron-browser/debugViewer.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts index b91233d7307..7bde56e3511 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts @@ -589,7 +589,8 @@ export class VariablesActionProvider implements IActionProvider { } public hasSecondaryActions(tree: ITree, element: any): boolean { - return element instanceof Variable; + // Only show context menu on "real" variables. Not on array chunk nodes. + return element instanceof Variable && !!element.value; } public getSecondaryActions(tree: ITree, element: any): TPromise { From 1cc913fcaf71d2e960afee6247367c13d8ef62c3 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 May 2017 16:08:54 +0200 Subject: [PATCH 0091/1164] merge extension config contribution --- .../electron-browser/extensions.contribution.ts | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts index 1e3629f42b1..827ae6984e1 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts @@ -165,17 +165,7 @@ Registry.as(ConfigurationExtensions.Configuration) type: 'boolean', description: localize('extensionsAutoUpdate', "Automatically update extensions"), default: false - } - } - }); - -Registry.as(ConfigurationExtensions.Configuration) - .registerConfiguration({ - id: 'extensions', - order: 30, - title: localize('extensionsConfigurationTitle', "Extensions"), - type: 'object', - properties: { + }, 'extensions.ignoreRecommendations': { type: 'boolean', description: localize('extensionsIgnoreRecommendations', "Ignore extension recommendations"), From 0380d85f0fca371c35f44a99c74147dc654278d7 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 May 2017 16:13:27 +0200 Subject: [PATCH 0092/1164] cleanup --- .../electron-browser/extensionTipsService.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts index 80de571917d..78bf2b91c71 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts @@ -157,8 +157,10 @@ export class ExtensionTipsService implements IExtensionTipsService { JSON.stringify(Object.keys(this._recommendations)), StorageScope.GLOBAL ); - const ignoreSuggestions = this.getIgnoreRecommendationsConfig(); - if (ignoreSuggestions) { + + const config = this.configurationService.getConfiguration(ConfigurationKey); + + if (config.ignoreRecommendations) { return; } @@ -205,11 +207,11 @@ export class ExtensionTipsService implements IExtensionTipsService { return; } - const ignoreSuggestions = this.getIgnoreRecommendationsConfig(); - if (ignoreSuggestions) { + const config = this.configurationService.getConfiguration(ConfigurationKey); + + if (config.ignoreRecommendations) { return; } - this.getWorkspaceRecommendations().done(allRecommendations => { if (!allRecommendations.length) { return; @@ -250,7 +252,7 @@ export class ExtensionTipsService implements IExtensionTipsService { localize('cancel', "Cancel") ]; - this.choiceService.choose(Severity.Info, message, options).done(choice => { + this.choiceService.choose(Severity.Info, message, options, 2).done(choice => { switch (choice) { case 0: // If the user ignores the current message and selects different file type // we should hide all the stacked up messages as he has selected Yes, Ignore All @@ -273,11 +275,6 @@ export class ExtensionTipsService implements IExtensionTipsService { } } - getIgnoreRecommendationsConfig(): boolean { - const config = this.configurationService.getConfiguration(ConfigurationKey); - return config.ignoreRecommendations ? true : false; - } - getKeywordsForExtension(extension: string): string[] { const keywords = product.extensionKeywords || {}; return keywords[extension] || []; From 127b909c1083215df409f7ec372caefc56a3883a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 4 May 2017 16:22:19 +0200 Subject: [PATCH 0093/1164] some api test love --- .../src/configuration.test.ts | 29 +- .../vscode-api-tests/src/workspace.test.ts | 286 ++++++++---------- 2 files changed, 155 insertions(+), 160 deletions(-) diff --git a/extensions/vscode-api-tests/src/configuration.test.ts b/extensions/vscode-api-tests/src/configuration.test.ts index 8b063ae4c78..65dc52e4537 100644 --- a/extensions/vscode-api-tests/src/configuration.test.ts +++ b/extensions/vscode-api-tests/src/configuration.test.ts @@ -8,7 +8,7 @@ import * as vscode from 'vscode'; suite('Configuration tests', () => { - test('Default configurations', function () { + test('configurations, language defaults', function () { const defaultLanguageSettings = vscode.workspace.getConfiguration().get('[abcLang]'); assert.deepEqual(defaultLanguageSettings, { @@ -17,4 +17,29 @@ suite('Configuration tests', () => { }); }); -}); \ No newline at end of file + test('configuration, defaults', () => { + const config = vscode.workspace.getConfiguration('farboo'); + + assert.ok(config.has('config0')); + assert.equal(config.get('config0'), true); + assert.equal(config.get('config4'), ''); + assert.equal(config['config0'], true); + assert.equal(config['config4'], ''); + + assert.throws(() => (config)['config4'] = 'valuevalue'); + + assert.ok(config.has('nested.config1')); + assert.equal(config.get('nested.config1'), 42); + assert.ok(config.has('nested.config2')); + assert.equal(config.get('nested.config2'), 'Das Pferd frisst kein Reis.'); + }); + + test('configuration, name vs property', () => { + const config = vscode.workspace.getConfiguration('farboo'); + + assert.ok(config.has('get')); + assert.equal(config.get('get'), 'get-prop'); + assert.deepEqual(config['get'], config.get); + assert.throws(() => config['get'] = 'get-prop'); + }); +}); diff --git a/extensions/vscode-api-tests/src/workspace.test.ts b/extensions/vscode-api-tests/src/workspace.test.ts index 31303542fad..54aaa0f7962 100644 --- a/extensions/vscode-api-tests/src/workspace.test.ts +++ b/extensions/vscode-api-tests/src/workspace.test.ts @@ -6,7 +6,7 @@ 'use strict'; import * as assert from 'assert'; -import { workspace, TextDocument, window, Position, Uri, EventEmitter, WorkspaceEdit, Disposable, EndOfLine } from 'vscode'; +import * as vscode from 'vscode'; import { createRandomFile, deleteFile, cleanUp, pathEquals } from './utils'; import { join, basename } from 'path'; import * as fs from 'fs'; @@ -15,59 +15,29 @@ suite('workspace-namespace', () => { teardown(cleanUp); - test('configuration, defaults', () => { - const config = workspace.getConfiguration('farboo'); - - assert.ok(config.has('config0')); - assert.equal(config.get('config0'), true); - assert.equal(config.get('config4'), ''); - assert.equal(config['config0'], true); - assert.equal(config['config4'], ''); - - assert.throws(() => (config)['config4'] = 'valuevalue'); - - assert.ok(config.has('nested.config1')); - assert.equal(config.get('nested.config1'), 42); - assert.ok(config.has('nested.config2')); - assert.equal(config.get('nested.config2'), 'Das Pferd frisst kein Reis.'); - }); - - test('configuration, name vs property', () => { - const config = workspace.getConfiguration('farboo'); - - assert.ok(config.has('get')); - assert.equal(config.get('get'), 'get-prop'); - assert.deepEqual(config['get'], config.get); - assert.throws(() => config['get'] = 'get-prop'); - }); - - // test('configuration, getConfig/value', () => { - // const value = workspace.getConfiguration('farboo.config0'); - // assert.equal(Object.keys(value).length, 3); - // }); test('textDocuments', () => { - assert.ok(Array.isArray(workspace.textDocuments)); - assert.throws(() => (workspace).textDocuments = null); + assert.ok(Array.isArray(vscode.workspace.textDocuments)); + assert.throws(() => (vscode.workspace).textDocuments = null); }); test('rootPath', () => { - if (workspace.rootPath) { - assert.ok(pathEquals(workspace.rootPath, join(__dirname, '../testWorkspace'))); + if (vscode.workspace.rootPath) { + assert.ok(pathEquals(vscode.workspace.rootPath, join(__dirname, '../testWorkspace'))); } - assert.throws(() => workspace.rootPath = 'farboo'); + assert.throws(() => vscode.workspace.rootPath = 'farboo'); }); test('openTextDocument', () => { - let len = workspace.textDocuments.length; - return workspace.openTextDocument(join(workspace.rootPath || '', './simple.txt')).then(doc => { + let len = vscode.workspace.textDocuments.length; + return vscode.workspace.openTextDocument(join(vscode.workspace.rootPath || '', './simple.txt')).then(doc => { assert.ok(doc); - assert.equal(workspace.textDocuments.length, len + 1); + assert.equal(vscode.workspace.textDocuments.length, len + 1); }); }); test('openTextDocument, illegal path', () => { - return workspace.openTextDocument('funkydonky.txt').then(doc => { + return vscode.workspace.openTextDocument('funkydonky.txt').then(doc => { throw new Error('missing error'); }, err => { // good! @@ -75,28 +45,28 @@ suite('workspace-namespace', () => { }); test('openTextDocument, untitled is dirty', function () { - return workspace.openTextDocument(Uri.parse('untitled:' + join(workspace.rootPath || '', './newfile.txt'))).then(doc => { + return vscode.workspace.openTextDocument(vscode.Uri.parse('untitled:' + join(vscode.workspace.rootPath || '', './newfile.txt'))).then(doc => { assert.equal(doc.uri.scheme, 'untitled'); assert.ok(doc.isDirty); }); }); test('openTextDocument, untitled with host', function () { - const uri = Uri.parse('untitled://localhost/c%24/Users/jrieken/code/samples/foobar.txt'); - return workspace.openTextDocument(uri).then(doc => { + const uri = vscode.Uri.parse('untitled://localhost/c%24/Users/jrieken/code/samples/foobar.txt'); + return vscode.workspace.openTextDocument(uri).then(doc => { assert.equal(doc.uri.scheme, 'untitled'); }); }); test('openTextDocument, untitled without path', function () { - return workspace.openTextDocument().then(doc => { + return vscode.workspace.openTextDocument().then(doc => { assert.equal(doc.uri.scheme, 'untitled'); assert.ok(doc.isDirty); }); }); test('openTextDocument, untitled without path but language ID', function () { - return workspace.openTextDocument({ language: 'xml' }).then(doc => { + return vscode.workspace.openTextDocument({ language: 'xml' }).then(doc => { assert.equal(doc.uri.scheme, 'untitled'); assert.equal(doc.languageId, 'xml'); assert.ok(doc.isDirty); @@ -104,7 +74,7 @@ suite('workspace-namespace', () => { }); test('openTextDocument, untitled without path but language ID and content', function () { - return workspace.openTextDocument({ language: 'html', content: '

Hello world!

' }).then(doc => { + return vscode.workspace.openTextDocument({ language: 'html', content: '

Hello world!

' }).then(doc => { assert.equal(doc.uri.scheme, 'untitled'); assert.equal(doc.languageId, 'html'); assert.ok(doc.isDirty); @@ -113,16 +83,16 @@ suite('workspace-namespace', () => { }); test('openTextDocument, untitled closes on save', function (done) { - const path = join(workspace.rootPath || '', './newfile.txt'); + const path = join(vscode.workspace.rootPath || '', './newfile.txt'); - return workspace.openTextDocument(Uri.parse('untitled:' + path)).then(doc => { + return vscode.workspace.openTextDocument(vscode.Uri.parse('untitled:' + path)).then(doc => { assert.equal(doc.uri.scheme, 'untitled'); assert.ok(doc.isDirty); - let closed: TextDocument; - let d0 = workspace.onDidCloseTextDocument(e => closed = e); + let closed: vscode.TextDocument; + let d0 = vscode.workspace.onDidCloseTextDocument(e => closed = e); - return window.showTextDocument(doc).then(() => { + return vscode.window.showTextDocument(doc).then(() => { return doc.save().then(() => { assert.ok(closed === doc); assert.ok(!doc.isDirty); @@ -130,7 +100,7 @@ suite('workspace-namespace', () => { d0.dispose(); - return deleteFile(Uri.file(join(workspace.rootPath || '', './newfile.txt'))).then(() => done(null)); + return deleteFile(vscode.Uri.file(join(vscode.workspace.rootPath || '', './newfile.txt'))).then(() => done(null)); }); }); @@ -139,22 +109,22 @@ suite('workspace-namespace', () => { test('openTextDocument, uri scheme/auth/path', function () { - let registration = workspace.registerTextDocumentContentProvider('sc', { + let registration = vscode.workspace.registerTextDocumentContentProvider('sc', { provideTextDocumentContent() { return 'SC'; } }); return Promise.all([ - workspace.openTextDocument(Uri.parse('sc://auth')).then(doc => { + vscode.workspace.openTextDocument(vscode.Uri.parse('sc://auth')).then(doc => { assert.equal(doc.uri.authority, 'auth'); assert.equal(doc.uri.path, ''); }), - workspace.openTextDocument(Uri.parse('sc:///path')).then(doc => { + vscode.workspace.openTextDocument(vscode.Uri.parse('sc:///path')).then(doc => { assert.equal(doc.uri.authority, ''); assert.equal(doc.uri.path, '/path'); }), - workspace.openTextDocument(Uri.parse('sc://auth/path')).then(doc => { + vscode.workspace.openTextDocument(vscode.Uri.parse('sc://auth/path')).then(doc => { assert.equal(doc.uri.authority, 'auth'); assert.equal(doc.uri.path, '/path'); }) @@ -165,110 +135,110 @@ suite('workspace-namespace', () => { test('eol, read', () => { const a = createRandomFile('foo\nbar\nbar').then(file => { - return workspace.openTextDocument(file).then(doc => { - assert.equal(doc.eol, EndOfLine.LF); + return vscode.workspace.openTextDocument(file).then(doc => { + assert.equal(doc.eol, vscode.EndOfLine.LF); }); }); const b = createRandomFile('foo\nbar\nbar\r\nbaz').then(file => { - return workspace.openTextDocument(file).then(doc => { - assert.equal(doc.eol, EndOfLine.LF); + return vscode.workspace.openTextDocument(file).then(doc => { + assert.equal(doc.eol, vscode.EndOfLine.LF); }); }); const c = createRandomFile('foo\r\nbar\r\nbar').then(file => { - return workspace.openTextDocument(file).then(doc => { - assert.equal(doc.eol, EndOfLine.CRLF); + return vscode.workspace.openTextDocument(file).then(doc => { + assert.equal(doc.eol, vscode.EndOfLine.CRLF); }); }); return Promise.all([a, b, c]); }); - // test('eol, change via editor', () => { - // return createRandomFile('foo\nbar\nbar').then(file => { - // return workspace.openTextDocument(file).then(doc => { - // assert.equal(doc.eol, EndOfLine.LF); - // return window.showTextDocument(doc).then(editor => { - // return editor.edit(builder => builder.setEndOfLine(EndOfLine.CRLF)); + test('eol, change via editor', () => { + return createRandomFile('foo\nbar\nbar').then(file => { + return vscode.workspace.openTextDocument(file).then(doc => { + assert.equal(doc.eol, vscode.EndOfLine.LF); + return vscode.window.showTextDocument(doc).then(editor => { + return editor.edit(builder => builder.setEndOfLine(vscode.EndOfLine.CRLF)); - // }).then(value => { - // assert.ok(value); - // assert.ok(doc.isDirty); - // assert.equal(doc.eol, EndOfLine.CRLF); - // }); - // }); - // }); - // }); + }).then(value => { + assert.ok(value); + assert.ok(doc.isDirty); + assert.equal(doc.eol, vscode.EndOfLine.CRLF); + }); + }); + }); + }); - // test('eol, change via applyEdit', () => { - // return createRandomFile('foo\nbar\nbar').then(file => { - // return workspace.openTextDocument(file).then(doc => { - // assert.equal(doc.eol, EndOfLine.LF); + test('eol, change via applyEdit', () => { + return createRandomFile('foo\nbar\nbar').then(file => { + return vscode.workspace.openTextDocument(file).then(doc => { + assert.equal(doc.eol, vscode.EndOfLine.LF); - // const edit = new WorkspaceEdit(); - // edit.set(file, [TextEdit.setEndOfLine(EndOfLine.CRLF)]); - // return workspace.applyEdit(edit).then(value => { - // assert.ok(value); - // assert.ok(doc.isDirty); - // assert.equal(doc.eol, EndOfLine.CRLF); - // }); - // }); - // }); - // }); + const edit = new vscode.WorkspaceEdit(); + edit.set(file, [vscode.TextEdit.setEndOfLine(vscode.EndOfLine.CRLF)]); + return vscode.workspace.applyEdit(edit).then(value => { + assert.ok(value); + assert.ok(doc.isDirty); + assert.equal(doc.eol, vscode.EndOfLine.CRLF); + }); + }); + }); + }); - // test('eol, change via onWillSave', () => { + test('eol, change via onWillSave', () => { - // let called = false; - // let sub = workspace.onWillSaveTextDocument(e => { - // called = true; - // e.waitUntil(Promise.resolve([TextEdit.setEndOfLine(EndOfLine.LF)])); - // }); + let called = false; + let sub = vscode.workspace.onWillSaveTextDocument(e => { + called = true; + e.waitUntil(Promise.resolve([vscode.TextEdit.setEndOfLine(vscode.EndOfLine.LF)])); + }); - // return createRandomFile('foo\r\nbar\r\nbar').then(file => { - // return workspace.openTextDocument(file).then(doc => { - // assert.equal(doc.eol, EndOfLine.CRLF); - // const edit = new WorkspaceEdit(); - // edit.set(file, [TextEdit.insert(new Position(0, 0), '-changes-')]); + return createRandomFile('foo\r\nbar\r\nbar').then(file => { + return vscode.workspace.openTextDocument(file).then(doc => { + assert.equal(doc.eol, vscode.EndOfLine.CRLF); + const edit = new vscode.WorkspaceEdit(); + edit.set(file, [vscode.TextEdit.insert(new vscode.Position(0, 0), '-changes-')]); - // return workspace.applyEdit(edit).then(success => { - // assert.ok(success); - // return doc.save(); + return vscode.workspace.applyEdit(edit).then(success => { + assert.ok(success); + return doc.save(); - // }).then(success => { - // assert.ok(success); - // assert.ok(called); - // assert.ok(!doc.isDirty); - // assert.equal(doc.eol, EndOfLine.LF); - // sub.dispose(); - // }); - // }); - // }); - // }); + }).then(success => { + assert.ok(success); + assert.ok(called); + assert.ok(!doc.isDirty); + assert.equal(doc.eol, vscode.EndOfLine.LF); + sub.dispose(); + }); + }); + }); + }); test('events: onDidOpenTextDocument, onDidChangeTextDocument, onDidSaveTextDocument', () => { return createRandomFile().then(file => { - let disposables: Disposable[] = []; + let disposables: vscode.Disposable[] = []; let onDidOpenTextDocument = false; - disposables.push(workspace.onDidOpenTextDocument(e => { + disposables.push(vscode.workspace.onDidOpenTextDocument(e => { assert.ok(pathEquals(e.uri.fsPath, file.fsPath)); onDidOpenTextDocument = true; })); let onDidChangeTextDocument = false; - disposables.push(workspace.onDidChangeTextDocument(e => { + disposables.push(vscode.workspace.onDidChangeTextDocument(e => { assert.ok(pathEquals(e.document.uri.fsPath, file.fsPath)); onDidChangeTextDocument = true; })); let onDidSaveTextDocument = false; - disposables.push(workspace.onDidSaveTextDocument(e => { + disposables.push(vscode.workspace.onDidSaveTextDocument(e => { assert.ok(pathEquals(e.uri.fsPath, file.fsPath)); onDidSaveTextDocument = true; })); - return workspace.openTextDocument(file).then(doc => { - return window.showTextDocument(doc).then((editor) => { + return vscode.workspace.openTextDocument(file).then(doc => { + return vscode.window.showTextDocument(doc).then((editor) => { return editor.edit((builder) => { - builder.insert(new Position(0, 0), 'Hello World'); + builder.insert(new vscode.Position(0, 0), 'Hello World'); }).then(applied => { return doc.save().then(saved => { assert.ok(onDidOpenTextDocument); @@ -292,14 +262,14 @@ suite('workspace-namespace', () => { test('registerTextDocumentContentProvider, simple', function () { - let registration = workspace.registerTextDocumentContentProvider('foo', { + let registration = vscode.workspace.registerTextDocumentContentProvider('foo', { provideTextDocumentContent(uri) { return uri.toString(); } }); - const uri = Uri.parse('foo://testing/virtual.js'); - return workspace.openTextDocument(uri).then(doc => { + const uri = vscode.Uri.parse('foo://testing/virtual.js'); + return vscode.workspace.openTextDocument(uri).then(doc => { assert.equal(doc.getText(), uri.toString()); assert.equal(doc.isDirty, false); assert.equal(doc.uri.toString(), uri.toString()); @@ -311,15 +281,15 @@ suite('workspace-namespace', () => { // built-in assert.throws(function () { - workspace.registerTextDocumentContentProvider('untitled', { provideTextDocumentContent() { return null; } }); + vscode.workspace.registerTextDocumentContentProvider('untitled', { provideTextDocumentContent() { return null; } }); }); // built-in assert.throws(function () { - workspace.registerTextDocumentContentProvider('file', { provideTextDocumentContent() { return null; } }); + vscode.workspace.registerTextDocumentContentProvider('file', { provideTextDocumentContent() { return null; } }); }); // missing scheme - return workspace.openTextDocument(Uri.parse('notThere://foo/far/boo/bar')).then(() => { + return vscode.workspace.openTextDocument(vscode.Uri.parse('notThere://foo/far/boo/bar')).then(() => { assert.ok(false, 'expected failure'); }, err => { // expected @@ -329,14 +299,14 @@ suite('workspace-namespace', () => { test('registerTextDocumentContentProvider, multiple', function () { // duplicate registration - let registration1 = workspace.registerTextDocumentContentProvider('foo', { + let registration1 = vscode.workspace.registerTextDocumentContentProvider('foo', { provideTextDocumentContent(uri) { if (uri.authority === 'foo') { return '1'; } } }); - let registration2 = workspace.registerTextDocumentContentProvider('foo', { + let registration2 = vscode.workspace.registerTextDocumentContentProvider('foo', { provideTextDocumentContent(uri) { if (uri.authority === 'bar') { return '2'; @@ -345,8 +315,8 @@ suite('workspace-namespace', () => { }); return Promise.all([ - workspace.openTextDocument(Uri.parse('foo://foo/bla')).then(doc => { assert.equal(doc.getText(), '1'); }), - workspace.openTextDocument(Uri.parse('foo://bar/bla')).then(doc => { assert.equal(doc.getText(), '2'); }) + vscode.workspace.openTextDocument(vscode.Uri.parse('foo://foo/bla')).then(doc => { assert.equal(doc.getText(), '1'); }), + vscode.workspace.openTextDocument(vscode.Uri.parse('foo://bar/bla')).then(doc => { assert.equal(doc.getText(), '2'); }) ]).then(() => { registration1.dispose(); registration2.dispose(); @@ -356,18 +326,18 @@ suite('workspace-namespace', () => { test('registerTextDocumentContentProvider, evil provider', function () { // duplicate registration - let registration1 = workspace.registerTextDocumentContentProvider('foo', { + let registration1 = vscode.workspace.registerTextDocumentContentProvider('foo', { provideTextDocumentContent(uri) { return '1'; } }); - let registration2 = workspace.registerTextDocumentContentProvider('foo', { + let registration2 = vscode.workspace.registerTextDocumentContentProvider('foo', { provideTextDocumentContent(uri): string { throw new Error('fail'); } }); - return workspace.openTextDocument(Uri.parse('foo://foo/bla')).then(doc => { + return vscode.workspace.openTextDocument(vscode.Uri.parse('foo://foo/bla')).then(doc => { assert.equal(doc.getText(), '1'); registration1.dispose(); registration2.dispose(); @@ -376,12 +346,12 @@ suite('workspace-namespace', () => { test('registerTextDocumentContentProvider, invalid text', function () { - let registration = workspace.registerTextDocumentContentProvider('foo', { + let registration = vscode.workspace.registerTextDocumentContentProvider('foo', { provideTextDocumentContent(uri) { return 123; } }); - return workspace.openTextDocument(Uri.parse('foo://auth/path')).then(() => { + return vscode.workspace.openTextDocument(vscode.Uri.parse('foo://auth/path')).then(() => { assert.ok(false, 'expected failure'); }, err => { // expected @@ -391,14 +361,14 @@ suite('workspace-namespace', () => { test('registerTextDocumentContentProvider, show virtual document', function () { - let registration = workspace.registerTextDocumentContentProvider('foo', { + let registration = vscode.workspace.registerTextDocumentContentProvider('foo', { provideTextDocumentContent(uri) { return 'I am virtual'; } }); - return workspace.openTextDocument(Uri.parse('foo://something/path')).then(doc => { - return window.showTextDocument(doc).then(editor => { + return vscode.workspace.openTextDocument(vscode.Uri.parse('foo://something/path')).then(doc => { + return vscode.window.showTextDocument(doc).then(editor => { assert.ok(editor.document === doc); assert.equal(editor.document.getText(), 'I am virtual'); @@ -410,19 +380,19 @@ suite('workspace-namespace', () => { test('registerTextDocumentContentProvider, open/open document', function () { let callCount = 0; - let registration = workspace.registerTextDocumentContentProvider('foo', { + let registration = vscode.workspace.registerTextDocumentContentProvider('foo', { provideTextDocumentContent(uri) { callCount += 1; return 'I am virtual'; } }); - const uri = Uri.parse('foo://testing/path'); + const uri = vscode.Uri.parse('foo://testing/path'); - return Promise.all([workspace.openTextDocument(uri), workspace.openTextDocument(uri)]).then(docs => { + return Promise.all([vscode.workspace.openTextDocument(uri), vscode.workspace.openTextDocument(uri)]).then(docs => { let [first, second] = docs; assert.ok(first === second); - assert.ok(workspace.textDocuments.some(doc => doc.uri.toString() === uri.toString())); + assert.ok(vscode.workspace.textDocuments.some(doc => doc.uri.toString() === uri.toString())); assert.equal(callCount, 1); registration.dispose(); }); @@ -430,15 +400,15 @@ suite('workspace-namespace', () => { test('registerTextDocumentContentProvider, empty doc', function () { - let registration = workspace.registerTextDocumentContentProvider('foo', { + let registration = vscode.workspace.registerTextDocumentContentProvider('foo', { provideTextDocumentContent(uri) { return ''; } }); - const uri = Uri.parse('foo:doc/empty'); + const uri = vscode.Uri.parse('foo:doc/empty'); - return workspace.openTextDocument(uri).then(doc => { + return vscode.workspace.openTextDocument(uri).then(doc => { assert.equal(doc.getText(), ''); assert.equal(doc.uri.toString(), uri.toString()); registration.dispose(); @@ -448,25 +418,25 @@ suite('workspace-namespace', () => { test('registerTextDocumentContentProvider, change event', function () { let callCount = 0; - let emitter = new EventEmitter(); + let emitter = new vscode.EventEmitter(); - let registration = workspace.registerTextDocumentContentProvider('foo', { + let registration = vscode.workspace.registerTextDocumentContentProvider('foo', { onDidChange: emitter.event, provideTextDocumentContent(uri) { return 'call' + (callCount++); } }); - const uri = Uri.parse('foo://testing/path3'); + const uri = vscode.Uri.parse('foo://testing/path3'); - return workspace.openTextDocument(uri).then(doc => { + return vscode.workspace.openTextDocument(uri).then(doc => { assert.equal(callCount, 1); assert.equal(doc.getText(), 'call0'); return new Promise((resolve, reject) => { - let subscription = workspace.onDidChangeTextDocument(event => { + let subscription = vscode.workspace.onDidChangeTextDocument(event => { subscription.dispose(); assert.ok(event.document === doc); assert.equal(event.document.getText(), 'call1'); @@ -481,9 +451,9 @@ suite('workspace-namespace', () => { }); test('findFiles', () => { - return workspace.findFiles('*.js').then((res) => { + return vscode.workspace.findFiles('*.js').then((res) => { assert.equal(res.length, 1); - assert.equal(basename(workspace.asRelativePath(res[0])), 'far.js'); + assert.equal(basename(vscode.workspace.asRelativePath(res[0])), 'far.js'); }); }); @@ -494,17 +464,17 @@ suite('workspace-namespace', () => { // const token = source.token; // just to get an instance first // source.cancel(); - // return workspace.findFiles('*.js', null, 100, token).then((res) => { + // return vscode.workspace.findFiles('*.js', null, 100, token).then((res) => { // assert.equal(res, void 0); // }); // }); test('applyEdit', () => { - return workspace.openTextDocument(Uri.parse('untitled:' + join(workspace.rootPath || '', './new2.txt'))).then(doc => { - let edit = new WorkspaceEdit(); - edit.insert(doc.uri, new Position(0, 0), new Array(1000).join('Hello World')); - return workspace.applyEdit(edit); + return vscode.workspace.openTextDocument(vscode.Uri.parse('untitled:' + join(vscode.workspace.rootPath || '', './new2.txt'))).then(doc => { + let edit = new vscode.WorkspaceEdit(); + edit.insert(doc.uri, new vscode.Position(0, 0), new Array(1000).join('Hello World')); + return vscode.workspace.applyEdit(edit); }); }); }); From b31c1e1fc96efd56a892844f942c125d5f0b1e5e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 May 2017 16:42:02 +0200 Subject: [PATCH 0094/1164] use global settings --- extensions/git/src/commands.ts | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 6aa35dae3df..45a2a81f51a 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -540,22 +540,18 @@ export class CommandCenter { // no changes, and the user has not configured to commit all in this case if (!noUnstagedChanges && noStagedChanges && !enableSmartCommit) { - // prompt the user if we want to commit all or not - const message = localize('no staged changes', "There are no staged changes to commit. Would you like to stage all changes and commit them?"); + // prompt the user if we want to commit all or not + const message = localize('no staged changes', "There are no staged changes to commit.\n\nWould you like to automatically stage all your changes and commit them directly?"); const yes = localize('yes', "Yes"); const always = localize('always', "Always"); const pick = await window.showWarningMessage(message, { modal: true }, yes, always); if (pick === always) { - // update preference to enable smart commit always - config.update('enableSmartCommit', true, false); + config.update('enableSmartCommit', true, true); + } else if (pick !== yes) { + return false; // do not commit on cancel } - else if (pick !== yes) { - // do not commit on cancel - return false; - } - // for yes or always, continue onto previous smart commit behavior } if (!opts) { From 4c62dfa0a436bf907966eea1634383eca0d0d477 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 May 2017 16:45:49 +0200 Subject: [PATCH 0095/1164] git commit with input bail early --- extensions/git/src/commands.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 45a2a81f51a..24f9c35129a 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -608,6 +608,10 @@ export class CommandCenter { @command('git.commitWithInput') async commitWithInput(): Promise { + if (!scm.inputBox.value) { + return; + } + const didCommit = await this.smartCommit(async () => scm.inputBox.value); if (didCommit) { From a34e5de6ff26e1f03ce151781b2e231abbffe4f8 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 4 May 2017 16:48:41 +0200 Subject: [PATCH 0096/1164] add SCM Providers as marketplace category --- src/vs/platform/extensions/common/extensionsRegistry.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/extensions/common/extensionsRegistry.ts b/src/vs/platform/extensions/common/extensionsRegistry.ts index a3b94131189..44cbf08d21f 100644 --- a/src/vs/platform/extensions/common/extensionsRegistry.ts +++ b/src/vs/platform/extensions/common/extensionsRegistry.ts @@ -139,7 +139,7 @@ const schema: IJSONSchema = { uniqueItems: true, items: { type: 'string', - enum: ['Languages', 'Snippets', 'Linters', 'Themes', 'Debuggers', 'Other', 'Keymaps', 'Formatters', 'Extension Packs'] + enum: ['Languages', 'Snippets', 'Linters', 'Themes', 'Debuggers', 'Other', 'Keymaps', 'Formatters', 'Extension Packs', 'SCM Providers'] } }, galleryBanner: { From 174fafae53ec26bc3dc1216080061449b17fb080 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 4 May 2017 17:12:47 +0200 Subject: [PATCH 0097/1164] load main.js while waiting for app.isReady, #17108 --- src/main.js | 15 +++++++-------- src/vs/code/electron-main/main.ts | 14 +++++++++++++- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/main.js b/src/main.js index 60070c76804..43a92f8069a 100644 --- a/src/main.js +++ b/src/main.js @@ -222,13 +222,12 @@ var nodeCachedDataDir = getNodeCachedDataDir().then(function (value) { } }); -// Load our code once ready -app.once('ready', function () { - global.perfAppReady = Date.now(); - var nlsConfig = getNLSConfiguration(); - process.env['VSCODE_NLS_CONFIG'] = JSON.stringify(nlsConfig); +var nlsConfig = getNLSConfiguration(); +process.env['VSCODE_NLS_CONFIG'] = JSON.stringify(nlsConfig); - nodeCachedDataDir.then(function () { - require('./bootstrap-amd').bootstrap('vs/code/electron-main/main'); - }, console.error); +var bootstrap = require('./bootstrap-amd'); +nodeCachedDataDir.then(function () { + bootstrap.bootstrap('vs/code/electron-main/main'); +}, function (err) { + console.error(err); }); diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index e76e0685b51..8294cc1f22b 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -199,4 +199,16 @@ function main() { }).done(null, err => instantiationService.invokeFunction(quit, err)); } -main(); \ No newline at end of file +// Get going once we are ready +// TODO@Joh,Joao there more more potential here +// we should check for other instances etc while +// waiting for getting ready +if (app.isReady()) { + global.perfAppReady = Date.now(); + main(); +} else { + app.once('ready', () => { + global.perfAppReady = Date.now(); + main(); + }); +} From d13f3e79c8a6d8e49d4cfc386d83e7d467896ee9 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 4 May 2017 09:14:05 -0700 Subject: [PATCH 0098/1164] Fix markdown preview no longer marking selection Fixs #25802 --- extensions/markdown/src/previewContentProvider.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/extensions/markdown/src/previewContentProvider.ts b/extensions/markdown/src/previewContentProvider.ts index 7e98548f212..e1ce84caba3 100644 --- a/extensions/markdown/src/previewContentProvider.ts +++ b/extensions/markdown/src/previewContentProvider.ts @@ -73,6 +73,7 @@ class MarkdownPreviewConfig { this.scrollPreviewWithEditorSelection = !!markdownConfig.get('preview.scrollPreviewWithEditorSelection', true); this.scrollEditorWithPreview = !!markdownConfig.get('preview.scrollEditorWithPreview', true); this.doubleClickToSwitchToEditor = !!markdownConfig.get('preview.doubleClickToSwitchToEditor', true); + this.markEditorSelection = !!markdownConfig.get('preview.markEditorSelection', true); this.fontFamily = markdownConfig.get('preview.fontFamily', undefined); this.fontSize = +markdownConfig.get('preview.fontSize', NaN); From 29c39f9d301dad20cc84efa2dfd6dfed28a0c49b Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 4 May 2017 09:20:18 -0700 Subject: [PATCH 0099/1164] Check stats for undefined (fixes #25902) --- src/vs/workbench/parts/search/browser/openAnythingHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/search/browser/openAnythingHandler.ts b/src/vs/workbench/parts/search/browser/openAnythingHandler.ts index cb6117d44bc..cc77586caa2 100644 --- a/src/vs/workbench/parts/search/browser/openAnythingHandler.ts +++ b/src/vs/workbench/parts/search/browser/openAnythingHandler.ts @@ -338,7 +338,7 @@ export class OpenAnythingHandler extends QuickOpenHandler { sortedResultDuration: telemetry.sortedResultTime - startTime, resultCount: telemetry.resultCount, symbols: telemetry.symbols, - files: this.createFileEventData(startTime, telemetry.files) + files: telemetry.files && this.createFileEventData(startTime, telemetry.files) }; } From a167edd5f1dbd1ff2a4a02167afa27625ffa6b33 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 4 May 2017 17:54:32 +0200 Subject: [PATCH 0100/1164] Convert TextAreaHandler to a ViewPart --- .../browser/controller/textAreaHandler.css | 14 -- .../browser/controller/textAreaHandler.ts | 161 +++++++++++------- .../browser/controller/textAreaInput.ts | 3 - src/vs/editor/browser/view/viewImpl.ts | 6 +- 4 files changed, 106 insertions(+), 78 deletions(-) diff --git a/src/vs/editor/browser/controller/textAreaHandler.css b/src/vs/editor/browser/controller/textAreaHandler.css index e4c5188f7d3..1e6ec8effa1 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.css +++ b/src/vs/editor/browser/controller/textAreaHandler.css @@ -4,9 +4,6 @@ *--------------------------------------------------------------------------------------------*/ .monaco-editor .inputarea { - /*Chrome cannot handle typing in a 0x0 textarea*/ - width: 1px; - height: 1px; min-width: 0; min-height: 0; margin: 0; @@ -26,17 +23,6 @@ bottom: 0 !important; right: 0 !important; }*/ -.monaco-editor.ff .inputarea, -.monaco-editor.ie .inputarea { - width: 0; - height: 0; -} .monaco-editor .ime-input.inputarea { z-index: 10; } -.monaco-editor .ime-input.inputarea { - background: rgba(255, 255, 255, 0.85); -} -.monaco-editor.vs-dark .ime-input.inputarea { - background: rgba(0, 0, 0, 0.65); -} diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index a7bb2de8772..9e2eea04dbb 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -9,17 +9,16 @@ import * as browser from 'vs/base/browser/browser'; import { TextAreaInput, ITextAreaInputHost, IPasteData, ICompositionData } from 'vs/editor/browser/controller/textAreaInput'; import { ISimpleModel, ITypeData, TextAreaState, IENarratorStrategy, NVDAPagedStrategy } from 'vs/editor/browser/controller/textAreaState'; import { Range } from 'vs/editor/common/core/range'; -import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; import { Configuration } from 'vs/editor/browser/config/configuration'; import { ViewContext } from 'vs/editor/common/view/viewContext'; -import { HorizontalRange } from 'vs/editor/common/view/renderingContext'; +import { HorizontalRange, RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { VerticalRevealType } from 'vs/editor/common/controller/cursorEvents'; import { ViewController } from 'vs/editor/browser/view/viewController'; import { EndOfLinePreference } from "vs/editor/common/editorCommon"; import { IKeyboardEvent } from "vs/base/browser/keyboardEvent"; -import { PartFingerprints, PartFingerprint } from "vs/editor/browser/view/viewPart"; +import { PartFingerprints, PartFingerprint, ViewPart } from "vs/editor/browser/view/viewPart"; import { Margin } from "vs/editor/browser/viewParts/margin/margin"; import { LineNumbersOverlay } from "vs/editor/browser/viewParts/lineNumbers/lineNumbers"; import { BareFontInfo } from "vs/editor/common/config/fontInfo"; @@ -29,21 +28,28 @@ export interface ITextAreaHandlerHelper { getVerticalOffsetForLineNumber(lineNumber: number): number; } -class TextAreaVisiblePosition { - _textAreaVisiblePosition: void; +class VisibleTextArea { + _visibleTextAreaBrand: void; public readonly top: number; public readonly left: number; + public readonly width: number; - constructor(top: number, left: number) { + constructor(top: number, left: number, width: number) { this.top = top; this.left = left; + this.width = width; + } + + public setWidth(width: number): VisibleTextArea { + return new VisibleTextArea(this.top, this.left, width); } } -export class TextAreaHandler extends ViewEventHandler { +const canUseZeroSizeTextarea = (browser.isEdgeOrIE || browser.isFirefox); + +export class TextAreaHandler extends ViewPart { - private readonly _context: ViewContext; private readonly _viewController: ViewController; private readonly _viewHelper: ITextAreaHandlerHelper; @@ -51,8 +57,14 @@ export class TextAreaHandler extends ViewEventHandler { private _contentWidth: number; private _scrollLeft: number; private _scrollTop: number; + private _experimentalScreenReader: boolean; + private _fontInfo: BareFontInfo; + private _lineHeight: number; - private _visiblePosition: TextAreaVisiblePosition; + /** + * Defined only when the text area is visible (composition case). + */ + private _visibleTextArea: VisibleTextArea; private _selections: Range[]; private _lastCopiedValue: string; private _lastCopiedValueIsFromEmptySelection: boolean; @@ -62,7 +74,7 @@ export class TextAreaHandler extends ViewEventHandler { private readonly _textAreaInput: TextAreaInput; constructor(context: ViewContext, viewController: ViewController, viewHelper: ITextAreaHandlerHelper) { - super(); + super(context); this._context = context; this._viewController = viewController; @@ -72,8 +84,11 @@ export class TextAreaHandler extends ViewEventHandler { this._contentWidth = this._context.configuration.editor.layoutInfo.contentWidth; this._scrollLeft = 0; this._scrollTop = 0; + this._experimentalScreenReader = this._context.configuration.editor.viewInfo.experimentalScreenReader; + this._fontInfo = this._context.configuration.editor.fontInfo; + this._lineHeight = this._context.configuration.editor.lineHeight; - this._visiblePosition = null; + this._visibleTextArea = null; this._selections = [new Range(1, 1, 1, 1)]; this._lastCopiedValue = null; this._lastCopiedValueIsFromEmptySelection = false; @@ -92,28 +107,10 @@ export class TextAreaHandler extends ViewEventHandler { this.textArea.setAttribute('aria-haspopup', 'false'); this.textArea.setAttribute('aria-autocomplete', 'both'); - this.textArea.setTop(0); - this.textArea.setLeft(0); - Configuration.applyFontInfo(this.textArea, this._context.configuration.editor.fontInfo); + Configuration.applyFontInfo(this.textArea, this._fontInfo); - // On top of the text area, we position a dom node to cover it up - // (there have been reports of tiny blinking cursors) - // (in WebKit the textarea is 1px by 1px because it cannot handle input to a 0x0 textarea) this.textAreaCover = createFastDomNode(document.createElement('div')); - if (this._context.configuration.editor.viewInfo.glyphMargin) { - this.textAreaCover.setClassName('monaco-editor-background ' + Margin.CLASS_NAME + ' ' + 'textAreaCover'); - } else { - if (this._context.configuration.editor.viewInfo.renderLineNumbers) { - this.textAreaCover.setClassName('monaco-editor-background ' + LineNumbersOverlay.CLASS_NAME + ' ' + 'textAreaCover'); - } else { - this.textAreaCover.setClassName('monaco-editor-background ' + 'textAreaCover'); - } - } this.textAreaCover.setPosition('absolute'); - this.textAreaCover.setWidth(1); - this.textAreaCover.setHeight(1); - this.textAreaCover.setTop(0); - this.textAreaCover.setLeft(0); const simpleModel: ISimpleModel = { getLineCount: (): number => { @@ -160,7 +157,7 @@ export class TextAreaHandler extends ViewEventHandler { const selection = this._selections[0]; - if (this._context.configuration.editor.viewInfo.experimentalScreenReader) { + if (this._experimentalScreenReader) { return NVDAPagedStrategy.fromEditorSelection(currentState, simpleModel, selection); } @@ -212,16 +209,11 @@ export class TextAreaHandler extends ViewEventHandler { const visibleRange = this._viewHelper.visibleRangeForPositionRelativeToEditor(lineNumber, column); if (visibleRange) { - this._visiblePosition = new TextAreaVisiblePosition( - this._viewHelper.getVerticalOffsetForLineNumber(lineNumber), - visibleRange.left - ); - this.textArea.setTop(this._visiblePosition.top - this._scrollTop); - this.textArea.setLeft(this._contentLeft + this._visiblePosition.left - this._scrollLeft); + this._visibleTextArea = new VisibleTextArea(this._viewHelper.getVerticalOffsetForLineNumber(lineNumber), visibleRange.left, 0); + this._render(); } // Show the textarea - this.textArea.setHeight(this._context.configuration.editor.lineHeight); this.textArea.setClassName('inputarea ime-input'); this._viewController.compositionStart('keyboard'); @@ -231,22 +223,20 @@ export class TextAreaHandler extends ViewEventHandler { if (browser.isEdgeOrIE) { // Due to isEdgeOrIE (where the textarea was not cleared initially) // we cannot assume the text consists only of the composited text - this.textArea.setWidth(0); + this._visibleTextArea = this._visibleTextArea.setWidth(0); } else { // adjust width by its size - this.textArea.setWidth(measureText(e.data, this._context.configuration.editor.fontInfo)); + this._visibleTextArea = this._visibleTextArea.setWidth(measureText(e.data, this._fontInfo)); } + this._render(); })); this._register(this._textAreaInput.onCompositionEnd(() => { - this.textArea.unsetHeight(); - this.textArea.unsetWidth(); - this.textArea.setLeft(0); - this.textArea.setTop(0); + + this._visibleTextArea = null; + this._render(); + this.textArea.setClassName('inputarea'); - - this._visiblePosition = null; - this._viewController.compositionEnd('keyboard'); })); @@ -257,12 +247,9 @@ export class TextAreaHandler extends ViewEventHandler { this._register(this._textAreaInput.onBlur(() => { this._context.privateViewEventBus.emit(new viewEvents.ViewFocusChangedEvent(false)); })); - - this._context.addEventHandler(this); } public dispose(): void { - this._context.removeEventHandler(this); super.dispose(); } @@ -271,9 +258,11 @@ export class TextAreaHandler extends ViewEventHandler { public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { // Give textarea same font size & line height as editor, for the IME case (when the textarea is visible) if (e.fontInfo) { - Configuration.applyFontInfo(this.textArea, this._context.configuration.editor.fontInfo); + this._fontInfo = this._context.configuration.editor.fontInfo; + Configuration.applyFontInfo(this.textArea, this._fontInfo); } if (e.viewInfo.experimentalScreenReader) { + this._experimentalScreenReader = this._context.configuration.editor.viewInfo.experimentalScreenReader; this._textAreaInput.writeScreenReaderContent('strategy changed'); } if (e.layoutInfo) { @@ -283,22 +272,22 @@ export class TextAreaHandler extends ViewEventHandler { if (e.viewInfo.ariaLabel) { this.textArea.setAttribute('aria-label', this._context.configuration.editor.viewInfo.ariaLabel); } - return false; + if (e.lineHeight) { + this._lineHeight = this._context.configuration.editor.lineHeight; + } + return true; } public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { this._selections = [e.selection].concat(e.secondarySelections); - return false; + return true; } public onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean { this._scrollLeft = e.scrollLeft; this._scrollTop = e.scrollTop; - if (this._visiblePosition) { - this.textArea.setTop(this._visiblePosition.top - this._scrollTop); - this.textArea.setLeft(this._contentLeft + this._visiblePosition.left - this._scrollLeft); - } - return false; + + return true; } // --- end event handlers @@ -332,6 +321,62 @@ export class TextAreaHandler extends ViewEventHandler { } // --- end view API + + public prepareRender(ctx: RenderingContext): void { + } + + public render(ctx: RestrictedRenderingContext): void { + this._render(); + } + + private _render(): void { + if (this._visibleTextArea) { + + // The text area is visible for composition reasons + this.textArea.setTop(this._visibleTextArea.top - this._scrollTop); + this.textArea.setLeft(this._contentLeft + this._visibleTextArea.left - this._scrollLeft); + this.textArea.setWidth(this._visibleTextArea.width); + this.textArea.setHeight(this._lineHeight); + + this.textAreaCover.setWidth(0); + this.textAreaCover.setHeight(0); + this.textAreaCover.setTop(0); + this.textAreaCover.setLeft(0); + + } else { + + this.textArea.setTop(0); + this.textArea.setLeft(0); + this.textAreaCover.setTop(0); + this.textAreaCover.setLeft(0); + + if (canUseZeroSizeTextarea) { + this.textArea.setWidth(0); + this.textArea.setHeight(0); + this.textAreaCover.setWidth(0); + this.textAreaCover.setHeight(0); + } else { + // (in WebKit the textarea is 1px by 1px because it cannot handle input to a 0x0 textarea) + // specifically, when doing Korean IME, setting the textare to 0x0 breaks IME badly. + + this.textArea.setWidth(1); + this.textArea.setHeight(1); + this.textAreaCover.setWidth(1); + this.textAreaCover.setHeight(1); + + if (this._context.configuration.editor.viewInfo.glyphMargin) { + this.textAreaCover.setClassName('monaco-editor-background textAreaCover ' + Margin.CLASS_NAME); + } else { + if (this._context.configuration.editor.viewInfo.renderLineNumbers) { + this.textAreaCover.setClassName('monaco-editor-background textAreaCover ' + LineNumbersOverlay.CLASS_NAME); + } else { + this.textAreaCover.setClassName('monaco-editor-background textAreaCover'); + } + } + } + + } + } } function measureText(text: string, fontInfo: BareFontInfo): number { diff --git a/src/vs/editor/browser/controller/textAreaInput.ts b/src/vs/editor/browser/controller/textAreaInput.ts index ea20af1e436..08f91649c41 100644 --- a/src/vs/editor/browser/controller/textAreaInput.ts +++ b/src/vs/editor/browser/controller/textAreaInput.ts @@ -186,7 +186,6 @@ export class TextAreaInput extends Disposable { })); this._register(dom.addDisposableListener(textArea.domNode, 'compositionend', (e: CompositionEvent) => { - // console.log('onCompositionEnd: ' + e.data); if (browser.isEdgeOrIE && e.locale === 'ja') { // https://github.com/Microsoft/monaco-editor/issues/339 const [newState, typeInput] = deduceInputFromTextAreaValue(); @@ -214,7 +213,6 @@ export class TextAreaInput extends Disposable { })); this._register(dom.addDisposableListener(textArea.domNode, 'input', () => { - // console.log('onInput: ' + this.textArea.getValue()); if (this._isDoingComposition) { // See https://github.com/Microsoft/monaco-editor/issues/320 if (browser.isChromev56) { @@ -227,7 +225,6 @@ export class TextAreaInput extends Disposable { }; this._onCompositionUpdate.fire(e); } - // console.log('::ignoring input event because the textarea is shown at cursor: ' + this.textArea.getValue()); return; } diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index 97f14e18708..a9a2d8f5491 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -123,8 +123,11 @@ export class View extends ViewEventHandler { // The view context is passed on to most classes (basically to reduce param. counts in ctors) this._context = new ViewContext(configuration, model, this.eventDispatcher); + this.viewParts = []; + // Keyboard handler this._textAreaHandler = new TextAreaHandler(this._context, viewController, this.createTextAreaHandlerHelper()); + this.viewParts.push(this._textAreaHandler); this.createViewParts(); this._setLayout(); @@ -150,8 +153,6 @@ export class View extends ViewEventHandler { PartFingerprints.write(this.overflowGuardContainer, PartFingerprint.OverflowGuard); this.overflowGuardContainer.setClassName('overflow-guard'); - this.viewParts = []; - this._scrollbar = new EditorScrollbar(this._context, this.layoutProvider.getScrollable(), this.linesContent, this.domNode, this.overflowGuardContainer); this.viewParts.push(this._scrollbar); @@ -392,7 +393,6 @@ export class View extends ViewEventHandler { this.eventDispatcher.removeEventHandler(this); this.outgoingEvents.dispose(); - this._textAreaHandler.dispose(); this.pointerHandler.dispose(); this.viewLines.dispose(); From ad023e4bc26865d91a5450ad209b7e1dd6bd7f45 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 4 May 2017 18:36:31 +0200 Subject: [PATCH 0101/1164] Position textarea with the primary cursor (#356) --- .../browser/controller/textAreaHandler.css | 3 +- .../browser/controller/textAreaHandler.ts | 149 +++++++++++++----- .../editor/common/view/editorColorRegistry.ts | 2 +- 3 files changed, 109 insertions(+), 45 deletions(-) diff --git a/src/vs/editor/browser/controller/textAreaHandler.css b/src/vs/editor/browser/controller/textAreaHandler.css index 1e6ec8effa1..e80b2bf6b32 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.css +++ b/src/vs/editor/browser/controller/textAreaHandler.css @@ -13,6 +13,7 @@ resize: none; border: none; overflow: hidden; + background-color: transparent; } /*.monaco-editor .inputarea { position: fixed !important; @@ -23,6 +24,6 @@ bottom: 0 !important; right: 0 !important; }*/ -.monaco-editor .ime-input.inputarea { +.monaco-editor .inputarea.ime-input { z-index: 10; } diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index 9e2eea04dbb..9d3c60eaf2a 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -9,6 +9,8 @@ import * as browser from 'vs/base/browser/browser'; import { TextAreaInput, ITextAreaInputHost, IPasteData, ICompositionData } from 'vs/editor/browser/controller/textAreaInput'; import { ISimpleModel, ITypeData, TextAreaState, IENarratorStrategy, NVDAPagedStrategy } from 'vs/editor/browser/controller/textAreaState'; import { Range } from 'vs/editor/common/core/range'; +import { Selection } from 'vs/editor/common/core/selection'; +import { Position } from 'vs/editor/common/core/position'; import { Configuration } from 'vs/editor/browser/config/configuration'; import { ViewContext } from 'vs/editor/common/view/viewContext'; import { HorizontalRange, RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; @@ -55,6 +57,7 @@ export class TextAreaHandler extends ViewPart { private _contentLeft: number; private _contentWidth: number; + private _contentHeight: number; private _scrollLeft: number; private _scrollTop: number; private _experimentalScreenReader: boolean; @@ -65,7 +68,7 @@ export class TextAreaHandler extends ViewPart { * Defined only when the text area is visible (composition case). */ private _visibleTextArea: VisibleTextArea; - private _selections: Range[]; + private _selections: Selection[]; private _lastCopiedValue: string; private _lastCopiedValueIsFromEmptySelection: boolean; @@ -82,6 +85,7 @@ export class TextAreaHandler extends ViewPart { this._contentLeft = this._context.configuration.editor.layoutInfo.contentLeft; this._contentWidth = this._context.configuration.editor.layoutInfo.contentWidth; + this._contentHeight = this._context.configuration.editor.layoutInfo.contentHeight; this._scrollLeft = 0; this._scrollTop = 0; this._experimentalScreenReader = this._context.configuration.editor.viewInfo.experimentalScreenReader; @@ -89,7 +93,7 @@ export class TextAreaHandler extends ViewPart { this._lineHeight = this._context.configuration.editor.lineHeight; this._visibleTextArea = null; - this._selections = [new Range(1, 1, 1, 1)]; + this._selections = [new Selection(1, 1, 1, 1)]; this._lastCopiedValue = null; this._lastCopiedValueIsFromEmptySelection = false; @@ -268,6 +272,7 @@ export class TextAreaHandler extends ViewPart { if (e.layoutInfo) { this._contentLeft = this._context.configuration.editor.layoutInfo.contentLeft; this._contentWidth = this._context.configuration.editor.layoutInfo.contentWidth; + this._contentHeight = this._context.configuration.editor.layoutInfo.contentHeight; } if (e.viewInfo.ariaLabel) { this.textArea.setAttribute('aria-label', this._context.configuration.editor.viewInfo.ariaLabel); @@ -277,16 +282,32 @@ export class TextAreaHandler extends ViewPart { } return true; } - public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { this._selections = [e.selection].concat(e.secondarySelections); return true; } - + public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean { + // true for inline decorations that can end up relayouting text + return true; + } + public onFlushed(e: viewEvents.ViewFlushedEvent): boolean { + return true; + } + public onLinesChanged(e: viewEvents.ViewLinesChangedEvent): boolean { + return true; + } + public onLinesDeleted(e: viewEvents.ViewLinesDeletedEvent): boolean { + return true; + } + public onLinesInserted(e: viewEvents.ViewLinesInsertedEvent): boolean { + return true; + } public onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean { this._scrollLeft = e.scrollLeft; this._scrollTop = e.scrollTop; - + return true; + } + public onZonesChanged(e: viewEvents.ViewZonesChangedEvent): boolean { return true; } @@ -322,7 +343,11 @@ export class TextAreaHandler extends ViewPart { // --- end view API + private _primaryCursorVisibleRange: HorizontalRange = null; + public prepareRender(ctx: RenderingContext): void { + const primaryCursorPosition = new Position(this._selections[0].positionLineNumber, this._selections[0].positionColumn); + this._primaryCursorVisibleRange = ctx.visibleRangeForPosition(primaryCursorPosition); } public render(ctx: RestrictedRenderingContext): void { @@ -331,50 +356,88 @@ export class TextAreaHandler extends ViewPart { private _render(): void { if (this._visibleTextArea) { - // The text area is visible for composition reasons - this.textArea.setTop(this._visibleTextArea.top - this._scrollTop); - this.textArea.setLeft(this._contentLeft + this._visibleTextArea.left - this._scrollLeft); - this.textArea.setWidth(this._visibleTextArea.width); - this.textArea.setHeight(this._lineHeight); + this._renderInsideEditor( + this._visibleTextArea.top - this._scrollTop, + this._contentLeft + this._visibleTextArea.left - this._scrollLeft, + this._visibleTextArea.width, + this._lineHeight + ); + return; + } - this.textAreaCover.setWidth(0); - this.textAreaCover.setHeight(0); - this.textAreaCover.setTop(0); - this.textAreaCover.setLeft(0); + if (!this._primaryCursorVisibleRange) { + // The primary cursor is outside the viewport => place textarea to the top left + this._renderAtTopLeft(); + return; + } + const left = this._contentLeft + this._primaryCursorVisibleRange.left - this._scrollLeft; + if (left < this._contentLeft || left > this._contentLeft + this._contentWidth) { + // cursor is outside the viewport + this._renderAtTopLeft(); + return; + } + + const top = this._viewHelper.getVerticalOffsetForLineNumber(this._selections[0].positionLineNumber) - this._scrollTop; + if (top < 0 || top > this._contentHeight) { + // cursor is outside the viewport + this._renderAtTopLeft(); + return; + } + + // The primary cursor is in the viewport (at least vertically) => place textarea on the cursor + this._renderInsideEditor(top, left, canUseZeroSizeTextarea ? 0 : 1, canUseZeroSizeTextarea ? 0 : 1); + } + + private _renderInsideEditor(top: number, left: number, width: number, height: number): void { + const ta = this.textArea; + const tac = this.textAreaCover; + + ta.setTop(top); + ta.setLeft(left); + ta.setWidth(width); + ta.setHeight(height); + + tac.setTop(0); + tac.setLeft(0); + tac.setWidth(0); + tac.setHeight(0); + } + + private _renderAtTopLeft(): void { + const ta = this.textArea; + const tac = this.textAreaCover; + + ta.setTop(0); + ta.setLeft(0); + tac.setTop(0); + tac.setLeft(0); + + if (canUseZeroSizeTextarea) { + ta.setWidth(0); + ta.setHeight(0); + tac.setWidth(0); + tac.setHeight(0); + return; + } + + // (in WebKit the textarea is 1px by 1px because it cannot handle input to a 0x0 textarea) + // specifically, when doing Korean IME, setting the textare to 0x0 breaks IME badly. + + ta.setWidth(1); + ta.setHeight(1); + tac.setWidth(1); + tac.setHeight(1); + + if (this._context.configuration.editor.viewInfo.glyphMargin) { + tac.setClassName('monaco-editor-background textAreaCover ' + Margin.CLASS_NAME); } else { - - this.textArea.setTop(0); - this.textArea.setLeft(0); - this.textAreaCover.setTop(0); - this.textAreaCover.setLeft(0); - - if (canUseZeroSizeTextarea) { - this.textArea.setWidth(0); - this.textArea.setHeight(0); - this.textAreaCover.setWidth(0); - this.textAreaCover.setHeight(0); + if (this._context.configuration.editor.viewInfo.renderLineNumbers) { + tac.setClassName('monaco-editor-background textAreaCover ' + LineNumbersOverlay.CLASS_NAME); } else { - // (in WebKit the textarea is 1px by 1px because it cannot handle input to a 0x0 textarea) - // specifically, when doing Korean IME, setting the textare to 0x0 breaks IME badly. - - this.textArea.setWidth(1); - this.textArea.setHeight(1); - this.textAreaCover.setWidth(1); - this.textAreaCover.setHeight(1); - - if (this._context.configuration.editor.viewInfo.glyphMargin) { - this.textAreaCover.setClassName('monaco-editor-background textAreaCover ' + Margin.CLASS_NAME); - } else { - if (this._context.configuration.editor.viewInfo.renderLineNumbers) { - this.textAreaCover.setClassName('monaco-editor-background textAreaCover ' + LineNumbersOverlay.CLASS_NAME); - } else { - this.textAreaCover.setClassName('monaco-editor-background textAreaCover'); - } - } + tac.setClassName('monaco-editor-background textAreaCover'); } - } } } diff --git a/src/vs/editor/common/view/editorColorRegistry.ts b/src/vs/editor/common/view/editorColorRegistry.ts index 1dd21ca5506..05e930fbb68 100644 --- a/src/vs/editor/common/view/editorColorRegistry.ts +++ b/src/vs/editor/common/view/editorColorRegistry.ts @@ -25,7 +25,7 @@ registerThemingParticipant((theme, collector) => { let background = theme.getColor(editorBackground); if (background) { - collector.addRule(`.monaco-editor.${theme.selector} .monaco-editor-background, .monaco-editor.${theme.selector} .inputarea { background-color: ${background}; }`); + collector.addRule(`.monaco-editor.${theme.selector} .monaco-editor-background, .monaco-editor.${theme.selector} .inputarea.ime-input { background-color: ${background}; }`); } let foreground = theme.getColor(editorForeground); if (foreground) { From ed1adb66da3b11f055dbe53ad273f1b85aa9d419 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 4 May 2017 11:02:26 -0700 Subject: [PATCH 0102/1164] Fix some wording on restart alert messages --- src/vs/workbench/browser/actions/configureLocale.ts | 2 +- .../workbench/parts/tasks/electron-browser/task.contribution.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/actions/configureLocale.ts b/src/vs/workbench/browser/actions/configureLocale.ts index 02c70d9f47f..f9181f42609 100644 --- a/src/vs/workbench/browser/actions/configureLocale.ts +++ b/src/vs/workbench/browser/actions/configureLocale.ts @@ -32,7 +32,7 @@ class ConfigureLocaleAction extends Action { '{', `\t// ${nls.localize('displayLanguage', 'Defines VSCode\'s display language.')}`, `\t// ${nls.localize('doc', 'See {0} for a list of supported languages.', 'https://go.microsoft.com/fwlink/?LinkId=761051')}`, - `\t// ${nls.localize('restart', 'Changing the value requires to restart VSCode.')}`, + `\t// ${nls.localize('restart', 'Changing the value requires restarting VSCode.')}`, `\t"locale":"${Platform.language}"`, '}' ].join('\n'); diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index 314a626f91d..a779eaf04c5 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -577,7 +577,7 @@ class TaskService extends EventEmitter implements ITaskService { ? ExecutionEngine.Process : ExecutionEngine.Unknown; if (currentExecutionEngine !== this.getExecutionEngine()) { - this.messageService.show(Severity.Info, nls.localize('TaskSystem.noHotSwap', 'Changing the task execution engine requires to restart VS Code. The change is ignored.')); + this.messageService.show(Severity.Info, nls.localize('TaskSystem.noHotSwap', 'Changing the task execution engine requires restarting VS Code. The change is ignored.')); } }); lifecycleService.onWillShutdown(event => event.veto(this.beforeShutdown())); From 799166a481b75d6d3dc9f7f999f89e5b5645abcc Mon Sep 17 00:00:00 2001 From: Daniel Ye Date: Thu, 4 May 2017 11:46:23 -0700 Subject: [PATCH 0103/1164] 2017-05-04, Merge in translation from transifex. --- i18n/chs/extensions/json/package.i18n.json | 2 +- .../menusExtensionPoint.i18n.json | 1 - i18n/cht/extensions/git/package.i18n.json | 1 + i18n/cht/extensions/grunt/package.i18n.json | 4 ++- i18n/cht/extensions/gulp/package.i18n.json | 4 ++- .../cht/extensions/markdown/package.i18n.json | 4 ++- .../out/utils/typingsStatus.i18n.json | 1 + .../extensions/typescript/package.i18n.json | 5 +++- .../parts/editor/editorActions.i18n.json | 2 ++ .../src/vs/workbench/common/theme.i18n.json | 7 +++++ .../main.contribution.i18n.json | 3 +++ .../task.contribution.i18n.json | 1 + .../terminal.contribution.i18n.json | 1 + .../terminalConfigHelper.i18n.json | 1 + .../themes.contribution.i18n.json | 1 + .../walkThroughPart.i18n.json | 3 ++- .../themes/common/colorThemeSchema.i18n.json | 3 ++- .../electron-browser/colorThemeData.i18n.json | 7 ++++- .../workbenchThemeService.i18n.json | 2 ++ .../deu/extensions/git/out/commands.i18n.json | 3 +++ i18n/deu/extensions/git/package.i18n.json | 2 ++ i18n/deu/extensions/gulp/package.i18n.json | 4 ++- .../out/utils/typingsStatus.i18n.json | 1 + .../suggest/browser/suggestWidget.i18n.json | 3 +++ .../platform/environment/node/argv.i18n.json | 1 + .../theme/common/colorRegistry.i18n.json | 26 +++++++++++++++++++ .../parts/editor/editorActions.i18n.json | 2 ++ .../src/vs/workbench/common/theme.i18n.json | 10 ++++++- .../inspectKeybindings.i18n.json | 4 ++- .../debug/browser/debugActions.i18n.json | 1 + .../browser/debugActionsWidget.i18n.json | 4 ++- .../parts/debug/node/debugAdapter.i18n.json | 1 + .../treeExplorer.contribution.i18n.json | 5 ++++ .../browser/preferencesActions.i18n.json | 1 + .../task.contribution.i18n.json | 1 + .../themes.contribution.i18n.json | 1 + .../walkThroughPart.i18n.json | 3 ++- .../themes/common/colorThemeSchema.i18n.json | 3 ++- .../electron-browser/colorThemeData.i18n.json | 7 ++++- .../workbenchThemeService.i18n.json | 5 +++- .../src/vs/workbench/common/theme.i18n.json | 9 ++++++- .../ita/extensions/git/out/commands.i18n.json | 3 +++ i18n/ita/extensions/git/package.i18n.json | 5 ++++ i18n/ita/extensions/gulp/package.i18n.json | 4 ++- .../out/utils/typingsStatus.i18n.json | 1 + .../theme/common/colorRegistry.i18n.json | 6 +++++ .../parts/editor/editorActions.i18n.json | 2 ++ .../src/vs/workbench/common/theme.i18n.json | 12 +++++++-- .../inspectKeybindings.i18n.json | 4 ++- .../debug/browser/debugActions.i18n.json | 1 + .../browser/debugActionsWidget.i18n.json | 4 ++- .../parts/debug/node/debugAdapter.i18n.json | 1 + .../treeExplorer.contribution.i18n.json | 5 ++++ .../browser/preferencesActions.i18n.json | 1 + .../task.contribution.i18n.json | 1 + .../themes.contribution.i18n.json | 1 + .../walkThroughPart.i18n.json | 3 ++- .../themes/common/colorThemeSchema.i18n.json | 3 ++- .../electron-browser/colorThemeData.i18n.json | 7 ++++- .../workbenchThemeService.i18n.json | 5 +++- .../jpn/extensions/git/out/commands.i18n.json | 1 + i18n/jpn/extensions/git/package.i18n.json | 1 + .../menusExtensionPoint.i18n.json | 10 +++---- .../node/extensionValidator.i18n.json | 16 ++++++------ .../theme/common/colorRegistry.i18n.json | 17 ++++++++++++ .../src/vs/workbench/common/theme.i18n.json | 1 + .../debugConfigurationManager.i18n.json | 2 +- .../treeExplorer.contribution.i18n.json | 1 + .../tasks/common/taskConfiguration.i18n.json | 2 +- .../keybindingService.i18n.json | 4 +-- .../common/workbenchModeService.i18n.json | 14 +++++----- .../themes/common/colorThemeSchema.i18n.json | 3 ++- .../electron-browser/colorThemeData.i18n.json | 2 ++ .../workbenchThemeService.i18n.json | 1 + .../kor/extensions/git/out/commands.i18n.json | 3 +++ .../extensions/git/out/scmProvider.i18n.json | 2 +- i18n/kor/extensions/git/package.i18n.json | 2 ++ i18n/kor/extensions/gulp/package.i18n.json | 4 ++- .../out/utils/typingsStatus.i18n.json | 1 + .../parts/editor/editorActions.i18n.json | 2 ++ .../src/vs/workbench/common/theme.i18n.json | 10 ++++++- .../inspectKeybindings.i18n.json | 4 ++- .../debug/browser/debugActions.i18n.json | 1 + .../browser/debugActionsWidget.i18n.json | 4 ++- .../parts/debug/node/debugAdapter.i18n.json | 1 + .../treeExplorer.contribution.i18n.json | 5 ++++ .../browser/preferencesActions.i18n.json | 1 + .../task.contribution.i18n.json | 1 + .../themes.contribution.i18n.json | 1 + .../walkThroughPart.i18n.json | 3 ++- .../themes/common/colorThemeSchema.i18n.json | 3 ++- .../electron-browser/colorThemeData.i18n.json | 7 ++++- .../workbenchThemeService.i18n.json | 5 +++- i18n/rus/extensions/git/package.i18n.json | 4 ++- .../extensions/typescript/package.i18n.json | 2 ++ .../src/vs/code/electron-main/menus.i18n.json | 5 ++++ .../parts/editor/editorActions.i18n.json | 2 ++ .../src/vs/workbench/common/theme.i18n.json | 11 +++++++- .../main.contribution.i18n.json | 3 +++ .../inspectKeybindings.i18n.json | 4 ++- .../debug/browser/debugActions.i18n.json | 1 + .../browser/debugActionsWidget.i18n.json | 4 ++- .../debug.contribution.i18n.json | 3 ++- .../parts/debug/node/debugAdapter.i18n.json | 1 + .../treeExplorer.contribution.i18n.json | 5 ++++ .../extensionTipsService.i18n.json | 1 + .../extensionsViewlet.i18n.json | 1 + .../browser/keybindingsEditor.i18n.json | 2 ++ .../browser/preferencesActions.i18n.json | 1 + .../common/keybindingsEditorModel.i18n.json | 4 ++- .../search/browser/replaceService.i18n.json | 4 ++- .../task.contribution.i18n.json | 1 + .../terminal.contribution.i18n.json | 1 + .../terminalConfigHelper.i18n.json | 1 + .../themes.contribution.i18n.json | 1 + .../walkThroughPart.i18n.json | 3 ++- .../themes/common/colorThemeSchema.i18n.json | 3 ++- .../electron-browser/colorThemeData.i18n.json | 7 ++++- .../workbenchThemeService.i18n.json | 5 +++- 119 files changed, 362 insertions(+), 72 deletions(-) diff --git a/i18n/chs/extensions/json/package.i18n.json b/i18n/chs/extensions/json/package.i18n.json index 6c9d2ad0143..f147c64ed82 100644 --- a/i18n/chs/extensions/json/package.i18n.json +++ b/i18n/chs/extensions/json/package.i18n.json @@ -10,6 +10,6 @@ "json.schemas.fileMatch.item.desc": "将 JSON 文件解析到架构时,用于匹配的可以包含 \"*\" 的文件模式。", "json.schemas.schema.desc": "给定 URL 的架构定义。只需提供该架构以避免对架构 URL 的访问。", "json.format.enable.desc": "启用/禁用默认 JSON 格式化程序(需要重启)", - "json.tracing.desc": "跟踪 VS Code 和 JSON 语言服务器之间的通信。", + "json.tracing.desc": "跟踪 VS Code 与 JSON 语言服务器之间的通信。", "json.colorDecorators.enable.desc": "启用或禁用颜色修饰器" } \ No newline at end of file diff --git a/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index 806db0f0748..9065a3c4a53 100644 --- a/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -19,7 +19,6 @@ "menus.editorTabContext": "编辑器选项卡上下文菜单", "menus.debugCallstackContext": "调试调用堆栈上下文菜单", "menus.scmTitle": "源代码管理标题菜单", - "menus.resourceGroupContext": "源代码管理资源组上下文菜单", "menus.resourceStateContext": "源代码管理资源状态上下文菜单", "nonempty": "应为非空值。", "opticon": "可以省略属性“图标”或者它必须是一个字符串或类似“{dark, light}”的文本", diff --git a/i18n/cht/extensions/git/package.i18n.json b/i18n/cht/extensions/git/package.i18n.json index b89e5991900..8bab2a3d3eb 100644 --- a/i18n/cht/extensions/git/package.i18n.json +++ b/i18n/cht/extensions/git/package.i18n.json @@ -41,5 +41,6 @@ "config.confirmSync": "請先確認再同步處理 GIT 存放庫", "config.countBadge": "控制 git 徽章計數器。[全部] 會計算所有變更。[已追蹤] 只會計算追蹤的變更。[關閉] 會將其關閉。", "config.checkoutType": "控制在執行 [簽出至...] 時,會列出那些類型的分支。[全部] 會顯示所有參考,[本機] 只會顯示本機分支,[標記] 只會顯示標記,[遠端] 只會顯示遠端分支。", + "config.ignoreLegacyWarning": "略過舊的 Git 警告", "config.ignoreLimitWarning": "當存放庫中有過多變更時,略過警告。" } \ No newline at end of file diff --git a/i18n/cht/extensions/grunt/package.i18n.json b/i18n/cht/extensions/grunt/package.i18n.json index 8b6ad71cd4e..01c2df22d6d 100644 --- a/i18n/cht/extensions/grunt/package.i18n.json +++ b/i18n/cht/extensions/grunt/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.grunt.autoDetect": "控制 Grunt 工作的自動偵測為開啟或關閉。預設為開。" +} \ No newline at end of file diff --git a/i18n/cht/extensions/gulp/package.i18n.json b/i18n/cht/extensions/gulp/package.i18n.json index 8b6ad71cd4e..e91e1955eec 100644 --- a/i18n/cht/extensions/gulp/package.i18n.json +++ b/i18n/cht/extensions/gulp/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.gulp.autoDetect": "控制 Gulp 工作的自動偵測為開啟或關閉。預設為開。" +} \ No newline at end of file diff --git a/i18n/cht/extensions/markdown/package.i18n.json b/i18n/cht/extensions/markdown/package.i18n.json index 8944d1dde43..6c7136baba3 100644 --- a/i18n/cht/extensions/markdown/package.i18n.json +++ b/i18n/cht/extensions/markdown/package.i18n.json @@ -16,5 +16,7 @@ "markdown.previewSide.title": "在一側開啟預覽", "markdown.showSource.title": "顯示來源", "markdown.styles.dec": "可從 Markdown 預覽使用之 CSS 樣式表的 URL 或本機路徑清單。相對路徑是相對於在總管中開啟的資料夾來進行解釋。若沒有開啟資料夾,路徑則是相對於 Markdown 檔案的位置來進行解釋。所有 '\\' 都必須寫成 '\\\\'。", - "markdown.showPreviewSecuritySelector.title": "變更 Markdown 預覽安全性設定" + "markdown.showPreviewSecuritySelector.title": "變更 Markdown 預覽安全性設定", + "markdown.preview.enableExperimentalExtensionApi.desc": "[實驗性] 允許延伸模組延伸 Markdown 預覽。", + "markdown.trace.desc": "允許 Markdown 延伸模組進行偵錯記錄。" } \ No newline at end of file diff --git a/i18n/cht/extensions/typescript/out/utils/typingsStatus.i18n.json b/i18n/cht/extensions/typescript/out/utils/typingsStatus.i18n.json index 4f15ff5fc04..1c4d07bd746 100644 --- a/i18n/cht/extensions/typescript/out/utils/typingsStatus.i18n.json +++ b/i18n/cht/extensions/typescript/out/utils/typingsStatus.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "installingPackages": "正在擷取資料以改善 TypeScript IntelliSense", + "typesInstallerInitializationFailed.title": "無法安裝鍵入檔案以取得 JavaScript 語言功能。請確認 NPM 已安裝,且位於您的 PATH", "typesInstallerInitializationFailed.moreInformation": "詳細資訊", "typesInstallerInitializationFailed.doNotCheckAgain": "不要再檢查", "typesInstallerInitializationFailed.close": "關閉" diff --git a/i18n/cht/extensions/typescript/package.i18n.json b/i18n/cht/extensions/typescript/package.i18n.json index 16a2c1a55f1..c5b2c54edf8 100644 --- a/i18n/cht/extensions/typescript/package.i18n.json +++ b/i18n/cht/extensions/typescript/package.i18n.json @@ -12,6 +12,7 @@ "typescript.disableAutomaticTypeAcquisition": "停用自動類型取得。需要 TypeScript >= 2.0.6,並需要在變更後重新啟動。", "typescript.check.tscVersion": "請檢查全域安裝 TypeScript 編譯器 (例如 tsc) 是否不同於使用的 TypeScript 語言服務。", "typescript.tsserver.log": "允許 TS 伺服器記錄到檔案。此記錄可用來診斷 TS 伺服器問題。記錄可能包含檔案路徑、原始程式碼及您專案中可能具有敏感性的其他資訊。", + "typescript.tsserver.trace": "允許將訊息追蹤傳送到 TS 伺服器。此追蹤可用來診斷 TS 伺服器問題。追蹤可能包含檔案路徑、原始程式碼及您專案中可能具有敏感性的其他資訊。", "typescript.tsserver.experimentalAutoBuild": "啟用實驗性自動建置。需要 1.9 dev 或 2.x tsserver 版本,且在變更後必須重新啟動 VS Code。", "typescript.validate.enable": "啟用/停用 TypeScript 驗證。", "typescript.format.enable": "啟用/停用預設 TypeScript 格式器。", @@ -24,6 +25,7 @@ "format.insertSpaceBeforeFunctionParenthesis": "定義如何處理函式引數括號之前的空格。TypeScript 必須 >= 2.1.5。", "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": "定義左右非空白括弧間的空格處理。", "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": "定義左右非空白中括弧間的空格處理。", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": "定義範非空白左右大括弧間的空格處理。需要 TypeScript >= 2.3.0。", "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "定義範本字串左右大括弧間的空格處理。需要 TypeScript >= 2.0.6。", "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "定義 JSX 運算式左右大括弧間的空格處理。需要 TypeScript >= 2.0.6。", "format.placeOpenBraceOnNewLineForFunctions": "定義是否將左大括弧放入函式的新行。", @@ -36,5 +38,6 @@ "typescript.openTsServerLog.title": "開啟 TS 伺服器記錄檔", "typescript.selectTypeScriptVersion.title": "選取 TypeScript 版本", "jsDocCompletion.enabled": "啟用/停用自動 JSDoc 註解", - "javascript.implicitProjectConfig.checkJs": "啟用/停用 JavaScript 檔案的語意檢查。現有的 jsconfig.json 或 tsconfig.json 檔案會覆寫此設定。需要 TypeScript >=2.3.1。" + "javascript.implicitProjectConfig.checkJs": "啟用/停用 JavaScript 檔案的語意檢查。現有的 jsconfig.json 或 tsconfig.json 檔案會覆寫此設定。需要 TypeScript >=2.3.1。", + "typescript.check.npmIsInstalled": "檢查是否已安裝 NPM,以取得自動鍵入" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/cht/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 7262a8948e3..1228bd7f60d 100644 --- a/i18n/cht/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -44,6 +44,8 @@ "openPreviousRecentlyUsedEditorInGroup": "開啟群組中上一個最近使用的編輯器", "openNextRecentlyUsedEditorInGroup": "開啟群組中下一個最近使用的編輯器", "navigateEditorHistoryByInput": "從記錄中開啟上一個編輯器", + "openNextRecentlyUsedEditor": "開啟下一個最近使用的編輯器", + "openPreviousRecentlyUsedEditor": "開啟上一個最近使用的編輯器", "clearEditorHistory": "清除編輯器記錄", "focusLastEditorInStack": "開啟群組中最後一個編輯器", "moveEditorLeft": "將編輯器左移", diff --git a/i18n/cht/src/vs/workbench/common/theme.i18n.json b/i18n/cht/src/vs/workbench/common/theme.i18n.json index 57facd966f8..ad80aac3089 100644 --- a/i18n/cht/src/vs/workbench/common/theme.i18n.json +++ b/i18n/cht/src/vs/workbench/common/theme.i18n.json @@ -12,8 +12,11 @@ "tabActiveEditorGroupInactiveForeground": "非使用中的群組內,使用中之索引標籤的前景色彩。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", "tabInactiveEditorGroupActiveForeground": "使用中的群組內,非使用中之索引標籤的前景色彩。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", "tabInactiveEditorGroupInactiveForeground": "非使用中的群組內,非使用中之索引標籤的前景色彩。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", + "editorGroupBackground": "編輯器群組的背景色彩。編輯器群組是編輯器的容器。當拖曳編輯器群組時會顯示背景色彩。", + "editorGroupHeaderBackground": "當索引標籤禁用的時候編輯器群組標題的背景顏色。編輯器群組是編輯器的容器。", "editorGroupBorder": "用以分隔多個編輯器群組彼此的色彩。編輯器群組是編輯器的容器。", "editorDragAndDropBackground": "拖曳編輯器時的背景色彩。", + "editorMasterDetailsBorder": "並排編輯器中將主視窗和詳細視窗分隔開的框線色彩。\n範例包括diff編輯器和設定編輯器。", "panelBackground": "面板的前景色彩。面板會顯示在編輯器區域的下方,其中包含諸如輸出與整合式終端機等檢視。", "panelBorder": "面板頂端用以分隔編輯器的邊框色彩。面板會顯示在編輯器區域的下方,其中包含諸如輸出與整合式終端機等檢視。", "panelActiveTitleForeground": "使用中之面板標題的標題色彩。面板會顯示在編輯器區域的下方,其中包含諸如輸出與整合式終端機等檢視。", @@ -24,12 +27,16 @@ "statusBarNoFolderBackground": "當未開啟任何資料夾時,狀態列的背景色彩。狀態列會顯示在視窗的底部。", "statusBarItemActiveBackground": "按下滑鼠按鈕時,狀態列項目的背景色彩。狀態列會顯示在視窗的底部。", "statusBarItemHoverBackground": "動態顯示時,狀態列項目的背景色彩。狀態列會顯示在視窗的底部。", + "statusBarProminentItemBackground": "狀態列突出項目的背景顏色。突出項目比狀態列的其他項目更顯眼,用於表示重要性更高。狀態列會顯示在視窗的底部。", + "statusBarProminentItemHoverBackground": "狀態列突出項目暫留時的背景顏色。突出項目比狀態列的其他項目更顯眼,用於表示重要性更高。狀態列會顯示在視窗的底部。", "activityBarBackground": "活動列背景的色彩。活動列會顯示在最左側或最右側,並可切換不同的提要欄位檢視。", + "activityBarForeground": "活動列的前背景色彩(例如用於圖示)。此活動列會顯示在最左側或最右側,讓您可以切換提要欄位的不同檢視。", "activityBarDragAndDropBackground": "拖放活動列項目之意見回應時的色彩。此活動列會顯示在最左側或最右側,讓您可以切換提要欄位的不同檢視。", "activityBarBadgeBackground": "活動通知徽章的背景色彩。此活動列會顯示在最左側或最右側,讓您可以切換提要欄位的不同檢視。", "activityBarBadgeForeground": "活動通知徽章的前背景色彩。此活動列會顯示在最左側或最右側,讓您可以切換提要欄位的不同檢視。", "sideBarBackground": "提要欄位的背景色彩。提要欄位是檢視 (例如 Explorer 與搜尋) 的容器。", "sideBarTitleForeground": "提要欄位標題的前景色彩。提要欄位是檢視 (例如 Explorer 與搜尋) 的容器。", + "sideBarSectionHeaderBackground": "提要欄位區段標頭的背景色彩。提要欄位是檢視 (例如 Explorer 與搜尋) 的容器。", "titleBarActiveForeground": "作用中視窗之標題列的前景。請注意,目前只有 macOS 支援此色彩。", "titleBarInactiveForeground": "非作用中視窗之標題列的前景。請注意,目前只有 macOS 支援此色彩。", "titleBarActiveBackground": "作用中視窗之標題列的背景。請注意,目前只有 macOS 支援此色彩。", diff --git a/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json index f9a78df4032..f23a60a5640 100644 --- a/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -20,6 +20,7 @@ "statusBarVisibility": "控制 Workbench 底端狀態列的可視性。", "activityBarVisibility": "控制活動列在 workbench 中的可見度。", "closeOnFileDelete": "控制顯示檔案的編輯器是否應在其他處理序刪除或重新命名該檔案時自動關閉。若停用此選項,當發生前述狀況時,編輯器會保持開啟,並呈現已變更的狀態。請注意,從應用程式內刪除一律會關閉編輯器,但已變更的檔案在資料未儲存前一律不會關閉。", + "swipeToNavigate": "利用三指水平撥動在開啟的檔案間瀏覽。", "workbenchConfigurationTitle": "工作台", "window.openFilesInNewWindow.on": "檔案會在新視窗中開啟", "window.openFilesInNewWindow.off": "檔案會在開啟了檔案資料夾的視窗,或在上一個使用中的視窗中開啟", @@ -48,10 +49,12 @@ "menuBarVisibility": "控制功能表列的可見度。[切換] 設定表示會隱藏功能表列,按一下 Alt 鍵則會顯示。除非視窗是全螢幕,否則預設會顯示功能表列。", "autoDetectHighContrast": "若啟用,如果 Windows 使用高對比佈景主題,就會自動變更為高對比佈景主題,切換掉 Windows 高對比佈景主題時則變更為深色佈景主題。", "titleBarStyle": "調整視窗標題列的外觀。變更需要完整重新啟動才會套用。", + "window.nativeTabs": "啟用 macOS Sierra 視窗索引標籤。請注意需要完全重新啟動才能套用變更,並且完成設定後原始索引標籤將會停用自訂標題列樣式。", "windowConfigurationTitle": "視窗", "zenModeConfigurationTitle": "Zen Mode", "zenMode.fullScreen": "控制開啟 Zen Mode 是否也會將 Workbench 轉換為全螢幕模式。", "zenMode.hideTabs": "控制開啟 Zen Mode 是否也會隱藏 Workbench 索引標籤。", "zenMode.hideStatusBar": "控制開啟 Zen Mode 是否也會隱藏 Workbench 底部的狀態列。", + "zenMode.hideActivityBar": "控制開啟 Zen Mode 是否也會隱藏 Workbench 左方的活動列。", "zenMode.restore": "控制視窗如果在 Zen Mode 下結束,是否應還原為 Zen Mode。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 7758b0a3da0..c0537ee4cdf 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -9,6 +9,7 @@ "ConfigureTaskRunnerAction.quickPick.template": "選取工作執行器", "ConfigureTaskRunnerAction.autoDetecting": "自動偵測 {0} 的工作", "ConfigureTaskRunnerAction.autoDetect": "自動偵測工作系統失敗。正在使用預設範本。如需詳細資料,請參閱工作輸出。", + "ConfigureTaskRunnerAction.autoDetectError": "自動偵測工作系統產生錯誤。如需詳細資料,請參閱工作輸出。", "ConfigureTaskRunnerAction.failed": "無法在 '.vscode' 資料夾中建立 'tasks.json' 檔案。如需詳細資訊,請參閱工作輸出。", "ConfigureTaskRunnerAction.label": "設定工作執行器", "ConfigureBuildTaskAction.label": "設定建置工作", diff --git a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index e9ec0d1fe54..38cbc1a135f 100644 --- a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -16,6 +16,7 @@ "terminal.integrated.fontLigatures": "控制是否在終端機中啟用連字字型。", "terminal.integrated.fontSize": "控制終端機的字型大小 (以像素為單位)。", "terminal.integrated.lineHeight": "控制終端機的行高,此數字會乘上終端機字型大小,以取得以像素為單位的實際行高。", + "terminal.integrated.enableBold": "是否要在終端機內啟用粗體文字。此動作需要終端機殼層的支援。", "terminal.integrated.cursorBlinking": "控制終端機資料指標是否閃爍。", "terminal.integrated.cursorStyle": "控制終端機資料指標的樣式。", "terminal.integrated.scrollback": "控制終端機保留在其緩衝區中的行數上限。", diff --git a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.i18n.json b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.i18n.json index 1ed48f98d58..8d475ec0701 100644 --- a/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "terminal.integrated.allowWorkspaceShell": "要允許 {0} (定義為工作區設定) 在終端機中啟動嗎?", "allow": "Allow", "disallow": "Disallow" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 7cd1aafa6f1..d5c740838a6 100644 --- a/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -14,6 +14,7 @@ "noIconThemeDesc": "停用檔案圖示", "problemChangingIconTheme": "設定圖示佈景主題時發生問題: {0}", "themes.selectIconTheme": "選取檔案圖示佈景主題", + "generateColorTheme.label": "依目前的設定產生色彩佈景主題", "preferences": "喜好設定", "developer": "開發人員" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json b/i18n/cht/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json index 88da29e3eed..62ddb9869c6 100644 --- a/i18n/cht/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "walkThrough.unboundCommand": "未繫結" + "walkThrough.unboundCommand": "未繫結", + "walkThrough.gitNotFound": "您的系統上似乎未安裝 Git。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json b/i18n/cht/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json index b0807315760..fe793cb749a 100644 --- a/i18n/cht/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json +++ b/i18n/cht/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json @@ -6,5 +6,6 @@ { "schema.colors": "反白顯示語法時的色彩", "schema.properties.name": "規則描述", - "schema.fontStyle": "規則的字型樣式:「斜體」、「粗體」或「底線」之一或其組合" + "schema.fontStyle": "規則的字型樣式:「斜體」、「粗體」或「底線」之一或其組合", + "schema.tokenColors.path": "tmTheme 檔案的路徑 (相對於目前檔案)。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json b/i18n/cht/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json index 9fba242d4b9..7c45152f8a5 100644 --- a/i18n/cht/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json +++ b/i18n/cht/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "error.cannotparsejson": "剖析 JSON 佈景主題檔案時發生問題: {0}" + "error.cannotparsejson": "剖析 JSON 佈景主題檔案時發生問題: {0}", + "error.invalidformat.colors": "剖析彩色佈景主題檔案 {0} 時出現問題。屬性 'settings' 不是 'object' 類型。", + "error.invalidformat.tokenColors": "剖析彩色佈景主題檔案 {0} 時出現問題。屬性 'tokenColors' 應為指定顏色的陣列,或為通往文字配對佈景主題檔案的路徑", + "error.plist.invalidformat": "剖析 tmTheme 檔案 {0} 時出現問題。'settings' 不是陣列。", + "error.cannotparse": "剖析 tmTheme 檔案 {0} 時發生問題", + "error.cannotload": "載入 tmTheme 檔案 {0} 時發生問題: {1}" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/cht/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index 8cd8c12aa72..cc25166bd67 100644 --- a/i18n/cht/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -26,5 +26,7 @@ "iconTheme": "Specifies the icon theme used in the workbench.", "noIconThemeDesc": "No file icons", "iconThemeError": "File icon theme is unknown or not installed.", + "workbenchColors": "依目前選擇的彩色佈景主題覆寫顏色", + "workbenchColors.deprecated": "此設定不再為實驗性,且已被重新命名為 'workbench.colorCustomizations'", "workbenchColors.deprecatedDescription": "改用'workbench.colorCustomizations'" } \ No newline at end of file diff --git a/i18n/deu/extensions/git/out/commands.i18n.json b/i18n/deu/extensions/git/out/commands.i18n.json index 3470905699d..ee0bf862856 100644 --- a/i18n/deu/extensions/git/out/commands.i18n.json +++ b/i18n/deu/extensions/git/out/commands.i18n.json @@ -16,6 +16,8 @@ "confirm discard": "Möchten Sie die Änderungen in {0} wirklich verwerfen?", "confirm discard multiple": "Möchten Sie wirklich Änderungen in {0} Dateien verwerfen?", "discard": "Änderungen verwerfen", + "confirm discard all": "Möchten Sie wirklich ALLE Änderungen verwerfen? Dieser Vorgang kann nicht rückgängig gemacht werden!", + "discardAll": "ALLE Änderungen verwerfen", "no changes": "Keine Änderungen zum Speichern vorhanden.", "commit message": "Commit-Nachricht", "provide commit message": "Geben Sie eine Commit-Nachrichte ein.", @@ -31,6 +33,7 @@ "no remotes to publish": "In Ihrem Repository wurden keine Remoteelemente für die Veröffentlichung konfiguriert.", "disabled": "Git ist deaktiviert oder wird in diesem Arbeitsbereich nicht unterstützt.", "clean repo": "Bereinigen Sie Ihre Repository-Arbeitsstruktur vor Auftragsabschluss.", + "cant push": "Verweise können nicht per Push an einen Remotespeicherort übertragen werden. Führen Sie zuerst \"Pull\" aus, um Ihre Änderungen zu integrieren.", "git error details": "Git: {0}", "git error": "Git-Fehler", "open git log": "Git-Protokoll öffnen" diff --git a/i18n/deu/extensions/git/package.i18n.json b/i18n/deu/extensions/git/package.i18n.json index 3ea04a9fbbc..91f8db11a7f 100644 --- a/i18n/deu/extensions/git/package.i18n.json +++ b/i18n/deu/extensions/git/package.i18n.json @@ -39,6 +39,8 @@ "config.autofetch": "Gibt an, ob automatischer Abruf aktiviert ist.", "config.enableLongCommitWarning": "Gibt an, ob Warnungen zu langen Commitnachrichten erfolgen sollen.", "config.confirmSync": "Vor dem Synchronisieren von Git-Repositorys bestätigen.", + "config.countBadge": "Steuert die Git-Badgeanzahl. \"Alle\" zählt alle Änderungen. \"tracked\" (Nachverfolgt) zählt nur die nachverfolgten Änderungen. \"off\" (Aus) deaktiviert dies.", + "config.checkoutType": "Steuert, welcher Branchtyp beim Ausführen von \"Auschecken an...\" aufgelistet wird. \"Alle\" zeigt alle Verweise an, \"Lokal\" nur die lokalen Branches, \"Tags\" zeigt nur Tags an, und \"Remote\" zeigt nur Remotebranches an.", "config.ignoreLegacyWarning": "Ignoriert die Legacy-Git-Warnung.", "config.ignoreLimitWarning": "Ignoriert Warnung bei zu hoher Anzahl von Änderungen in einem Repository" } \ No newline at end of file diff --git a/i18n/deu/extensions/gulp/package.i18n.json b/i18n/deu/extensions/gulp/package.i18n.json index 8b6ad71cd4e..b6b5c532278 100644 --- a/i18n/deu/extensions/gulp/package.i18n.json +++ b/i18n/deu/extensions/gulp/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.gulp.autoDetect": "Steuert, ob die automatische Erkennung von Gulp-Tasks aktiviert oder deaktiviert ist. Standardmäßig ist die Funktion aktiviert." +} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript/out/utils/typingsStatus.i18n.json b/i18n/deu/extensions/typescript/out/utils/typingsStatus.i18n.json index 6d936266697..abc0ee901f8 100644 --- a/i18n/deu/extensions/typescript/out/utils/typingsStatus.i18n.json +++ b/i18n/deu/extensions/typescript/out/utils/typingsStatus.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "installingPackages": "Daten werden zum Optimieren von TypeScript IntelliSense abgerufen", + "typesInstallerInitializationFailed.title": "Typisierungsdateien für JavaScript-Sprachfunktionen konnten nicht installiert werden. Stellen Sie sicher, das NPM installiert ist und sich in Ihrem PFAD befindet.", "typesInstallerInitializationFailed.moreInformation": "Weitere Informationen", "typesInstallerInitializationFailed.doNotCheckAgain": "Nicht erneut überprüfen", "typesInstallerInitializationFailed.close": "Schließen" diff --git a/i18n/deu/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/deu/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 99e30e1b037..7e17060c7d1 100644 --- a/i18n/deu/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -6,6 +6,9 @@ { "editorSuggestWidgetBackground": "Hintergrundfarbe des Vorschlagswidgets.", "editorSuggestWidgetBorder": "Rahmenfarbe des Vorschlagswidgets.", + "editorSuggestWidgetForeground": "Vordergrundfarbe des Vorschlagswidgets.", + "editorSuggestWidgetSelectedBackground": "Hintergrundfarbe des ausgewählten Eintrags im Vorschlagswidget.", + "editorSuggestWidgetHighlightForeground": "Farbe der Trefferhervorhebung im Vorschlagswidget.", "readMore": "Mehr anzeigen...{0}", "suggestionWithDetailsAriaLabel": "{0}, Vorschlag, hat Details", "suggestionAriaLabel": "{0}, Vorschlag", diff --git a/i18n/deu/src/vs/platform/environment/node/argv.i18n.json b/i18n/deu/src/vs/platform/environment/node/argv.i18n.json index 8104fc70ba0..058d98933af 100644 --- a/i18n/deu/src/vs/platform/environment/node/argv.i18n.json +++ b/i18n/deu/src/vs/platform/environment/node/argv.i18n.json @@ -20,6 +20,7 @@ "showVersions": "Zeigt Versionen der installierten Erweiterungen an, wenn \"--list-extension\" verwendet wird.", "installExtension": "Installiert eine Extension.", "uninstallExtension": "Deinstalliert eine Extension.", + "experimentalApis": "Aktiviert vorgeschlagene API-Features für eine Erweiterung.", "disableExtensions": "Deaktiviert alle installierten Extensions.", "disableGPU": "Deaktiviert die GPU-Hardwarebeschleunigung.", "version": "Gibt die Version aus.", diff --git a/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json index feac598aaf2..cbffdc17751 100644 --- a/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -7,15 +7,41 @@ "invalid.color": "Ungültiges Farbformat. Verwenden Sie #RGB, #RGBA, #RRGGBB oder #RRGGBBAA.", "schema.colors": "In der Workbench verwendete Farben.", "foreground": "Allgemeine Vordergrundfarbe. Diese Farbe wird nur verwendet, wenn sie nicht durch eine Komponente überschrieben wird.", + "focusBorder": "Allgemeine Rahmenfarbe für fokussierte Elemente. Diese Farbe wird nur verwendet, wenn sie nicht durch eine Komponente überschrieben wird.", + "contrastBorder": "Ein zusätzlicher Rahmen um Elemente, mit dem diese von anderen getrennt werden, um einen größeren Kontrast zu erreichen.", + "activeContrastBorder": "Ein zusätzlicher Rahmen um aktive Elemente, mit dem diese von anderen getrennt werden, um einen größeren Kontrast zu erreichen.", + "widgetShadow": "Schattenfarbe von Widgets wie zum Beispiel Suchen/Ersetzen innerhalb des Editors.", "inputBoxBackground": "Hintergrund für Eingabefeld.", "inputBoxForeground": "Vordergrund für Eingabefeld.", "inputBoxBorder": "Rahmen für Eingabefeld.", "inputBoxActiveOptionBorder": "Rahmenfarbe für aktivierte Optionen in Eingabefeldern.", + "inputValidationInfoBackground": "Hintergrundfarbe bei der Eingabevalidierung für den Schweregrad der Information.", + "inputValidationInfoBorder": "Rahmenfarbe bei der Eingabevalidierung für den Schweregrad der Information.", + "inputValidationWarningBackground": "Hintergrundfarbe bei der Eingabevalidierung für eine Warnung zur Information.", + "inputValidationWarningBorder": "Rahmenfarbe bei der Eingabevalidierung für den Schweregrad der Warnung.", + "inputValidationErrorBackground": "Hintergrundfarbe bei der Eingabevalidierung für den Schweregrad des Fehlers.", + "inputValidationErrorBorder": "Rahmenfarbe bei der Eingabevalidierung für den Schweregrad des Fehlers.", "dropdownBackground": "Hintergrund für Dropdown.", "dropdownForeground": "Vordergrund für Dropdown.", "dropdownBorder": "Rahmen für Dropdown.", + "listFocusBackground": "Hintergrundfarbe der Liste/Struktur für das fokussierte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.", + "listActiveSelectionBackground": "Hintergrundfarbe der Liste/Struktur für das ausgewählte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.", + "listInactiveSelectionBackground": "Hintergrundfarbe der Liste/Struktur für das ausgewählte Element, wenn die Liste/Struktur inaktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.", + "listActiveSelectionForeground": "Vordergrundfarbe der Liste/Struktur für das ausgewählte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.", + "listFocusAndSelectionBackground": "Hintergrundfarbe der Liste/Struktur für das fokussierte und ausgewählte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht. Diese Farbe hat Vorrang vor der individuellen Auswahl und den Fokusfarben.", + "listFocusAndSelectionForeground": "Vordergrundfarbe der Liste/Struktur für das fokussierte und ausgewählte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht. Diese Farbe hat Vorrang vor der individuellen Auswahl und den Fokusfarben.", + "listHoverBackground": "Hintergrund der Liste/Struktur, wenn mit der Maus auf Elemente gezeigt wird.", + "listDropBackground": "Drag & Drop-Hintergrund der Liste/Struktur, wenn Elemente mithilfe der Maus verschoben werden.", + "highlight": "Vordergrundfarbe der Liste/Struktur zur Trefferhervorhebung beim Suchen innerhalb der Liste/Struktur.", "pickerGroupForeground": "Schnellauswahlfarbe für das Gruppieren von Bezeichnungen.", "pickerGroupBorder": "Schnellauswahlfarbe für das Gruppieren von Rahmen.", + "buttonForeground": "Vordergrundfarbe der Schaltfläche.", + "buttonBackground": "Hintergrundfarbe der Schaltfläche.", + "buttonHoverBackground": "Hintergrundfarbe der Schaltfläche, wenn darauf gezeigt wird.", + "scrollbarShadow": "Schatten der Scrollleiste, um anzuzeigen, dass die Ansicht gescrollt wird.", + "scrollbarSliderBackground": "Hintergrundfarbe des Schiebereglers.", + "scrollbarSliderHoverBackground": "Hintergrundfarbe des Schiebereglers, wenn darauf gezeigt wird.", + "scrollbarSliderActiveBackground": "Hintergrundfarbe des Schiebereglers, wenn dieser aktiv ist.", "editorBackground": "Hintergrundfarbe des Editors.", "editorForeground": "Standardvordergrundfarbe des Editors.", "editorSelection": "Farbe der Editor-Auswahl.", diff --git a/i18n/deu/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/deu/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 818cf12465e..fa4ed406834 100644 --- a/i18n/deu/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -44,6 +44,8 @@ "openPreviousRecentlyUsedEditorInGroup": "Vorherigen zuletzt verwendeten Editor in der Gruppe öffnen", "openNextRecentlyUsedEditorInGroup": "Nächsten zuletzt verwendeten Editor in der Gruppe öffnen", "navigateEditorHistoryByInput": "Vorherigen Editor aus Verlauf öffnen", + "openNextRecentlyUsedEditor": "Nächsten zuletzt verwendeten Editor öffnen", + "openPreviousRecentlyUsedEditor": "Vorherigen zuletzt verwendeten Editor öffnen", "clearEditorHistory": "Editor-Verlauf löschen", "focusLastEditorInStack": "Letzten Editor in der Gruppe öffnen", "moveEditorLeft": "Editor nach links verschieben", diff --git a/i18n/deu/src/vs/workbench/common/theme.i18n.json b/i18n/deu/src/vs/workbench/common/theme.i18n.json index 0fcf7d8cb71..3fab9e56ce5 100644 --- a/i18n/deu/src/vs/workbench/common/theme.i18n.json +++ b/i18n/deu/src/vs/workbench/common/theme.i18n.json @@ -12,8 +12,11 @@ "tabActiveEditorGroupInactiveForeground": "Vordergrundfarbe der aktiven Registerkarte in einer inaktiven Gruppe. Registerkarten sind die Container für Editors im Editorbereich. In einer Editorgruppe können mehrere Registerkarten geöffnet werden. Mehrere Editorgruppen können vorhanden sein.", "tabInactiveEditorGroupActiveForeground": "Vordergrundfarbe der inaktiven Registerkarte in einer aktiven Gruppe. Registerkarten sind die Container für Editors im Editorbereich. In einer Editorgruppe können mehrere Registerkarten geöffnet werden. Mehrere Editorgruppen können vorhanden sein.", "tabInactiveEditorGroupInactiveForeground": "Vordergrundfarbe der inaktiven Registerkarte in einer inaktiven Gruppe. Registerkarten sind die Container für Editors im Editorbereich. In einer Editorgruppe können mehrere Registerkarten geöffnet werden. Mehrere Editorgruppen können vorhanden sein.", + "editorGroupBackground": "Hintergrundfarbe einer Editor-Gruppe. Editor-Gruppen sind die Container der Editoren. Die Hintergrundfarbe wird beim Ziehen von Editoren angezeigt.", + "editorGroupHeaderBackground": "Hintergrundfarbe der Titelüberschrift des Editors, wenn die Registerkarten deaktiviert sind. Editor-Gruppen sind die Container der Editoren.", "editorGroupBorder": "Farbe zum Trennen mehrerer Editor-Gruppen. Editor-Gruppen sind die Container der Editoren.", "editorDragAndDropBackground": "Hintergrundfarbe beim Ziehen von Editoren.", + "editorMasterDetailsBorder": "Rahmenfarbe zum Trennen der Details der Masterseite für Editoren mit der Ansicht \"Nebeneinander\". Beispiele sind etwa Diff-Editoren und der Einstellungseditor.", "panelBackground": "Hintergrundfarbe des Panels. Panels werden unter dem Editorbereich angezeigt und enthalten Ansichten wie die Ausgabe und das integrierte Terminal.", "panelBorder": "Farbe des oberen Panelrahmens, der das Panel vom Editor abtrennt. Panels werden unter dem Editorbereich angezeigt und enthalten Ansichten wie die Ausgabe und das integrierten Terminal.", "panelActiveTitleForeground": "Titelfarbe für den aktiven Bereich. Bereiche werden unter dem Editorbereich angezeigt und enthalten Ansichten wie Ausgabe und integriertes Terminal.", @@ -24,6 +27,8 @@ "statusBarNoFolderBackground": "Hintergrundfarbe der Statusleiste, wenn kein Ordner geöffnet ist. Die Statusleiste wird unten im Fenster angezeigt.", "statusBarItemActiveBackground": "Hintergrundfarbe für Statusleistenelemente beim Klicken. Die Statusleiste wird am unteren Rand des Fensters angezeigt.", "statusBarItemHoverBackground": "Hintergrundfarbe der Statusleistenelemente beim Daraufzeigen. Die Statusleiste wird am unteren Seitenrand angezeigt.", + "statusBarProminentItemBackground": "Hintergrundfarbe für markante Elemente der Statusleiste. Markante Elemente sind im Vergleich zu anderen Statusleisteneinträgen hervorgehoben, um auf ihre Bedeutung hinzuweisen. Die Statusleiste wird unten im Fenster angezeigt.", + "statusBarProminentItemHoverBackground": "Hintergrundfarbe für markante Elemente der Statusleiste, wenn auf diese gezeigt wird. Markante Elemente sind im Vergleich zu anderen Statusleisteneinträgen hervorgehoben, um auf ihre Bedeutung hinzuweisen. Die Statusleiste wird unten im Fenster angezeigt.", "activityBarBackground": "Hintergrundfarbe der Aktivitätsleiste. Die Aktivitätsleiste wird ganz links oder rechts angezeigt und ermöglicht das Wechseln zwischen verschiedenen Ansichten der Seitenleiste.", "activityBarForeground": "Vordergrundfarbe der Aktivitätsleiste (z. B. für Symbole). Die Aktivitätsleiste wird ganz links oder rechts angezeigt und ermöglicht das Wechseln zwischen verschiedenen Ansichten der Seitenleiste.", "activityBarDragAndDropBackground": "Drag Drop-Feedbackfarbe für Elemente der Aktivitätsleiste. Die Aktivitätsleiste wird ganz links oder ganz rechts angezeigt und ermöglicht den Wechsel zwischen Ansichten der Seitenleiste.", @@ -31,8 +36,11 @@ "activityBarBadgeForeground": "Vordergrundfarbe für Aktivitätsinfobadge. Die Aktivitätsleiste wird ganz links oder ganz rechts angezeigt und ermöglicht den Wechsel zwischen Ansichten der Seitenleiste.", "sideBarBackground": "Hintergrundfarbe der Seitenleiste. Die Seitenleiste ist der Container für Ansichten wie den Explorer und die Suche.", "sideBarTitleForeground": "Vordergrundfarbe der Seitenleiste. Die Seitenleiste ist der Container für Ansichten wie den Explorer und die Suche.", + "sideBarSectionHeaderBackground": "Hintergrundfarbe der Abschnittsüberschrift der Seitenleiste. Die Seitenleiste ist der Container für Ansichten wie den Explorer und die Suche.", "titleBarActiveForeground": "Vordergrund der Titelleiste, wenn das Fenster aktiv ist. Diese Farbe wird derzeit nur von MacOS unterstützt.", "titleBarInactiveForeground": "Vordergrund der Titelleiste, wenn das Fenster inaktiv ist. Diese Farbe wird derzeit nur von MacOS unterstützt.", "titleBarActiveBackground": "Hintergrund der Titelleiste, wenn das Fenster aktiv ist. Diese Farbe wird derzeit nur von MacOS unterstützt.", - "titleBarInactiveBackground": "Hintergrund der Titelleiste, wenn das Fenster inaktiv ist. Diese Farbe wird derzeit nur von MacOS unterstützt." + "titleBarInactiveBackground": "Hintergrund der Titelleiste, wenn das Fenster inaktiv ist. Diese Farbe wird derzeit nur von MacOS unterstützt.", + "notificationsForeground": "Vordergrundfarbe für Benachrichtigungen. Benachrichtigungen werden oben im Fenster eingeblendet.", + "notificationsBackground": "Hintergrundfarbe für Benachrichtigungen. Benachrichtigungen werden oben im Fenster eingeblendet." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json b/i18n/deu/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json index 8b6ad71cd4e..60061e85504 100644 --- a/i18n/deu/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "workbench.action.inspectKeyMap": "Entwickler: Wichtige Zuordnungen prüfen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index c2e596b3296..11b3d69c656 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -34,6 +34,7 @@ "editConditionalBreakpoint": "Haltepunkt bearbeiten...", "setValue": "Wert festlegen", "addWatchExpression": "Ausdruck hinzufügen", + "editWatchExpression": "Ausdruck bearbeiten", "addToWatchExpressions": "Zur Überwachung hinzufügen", "removeWatchExpression": "Ausdruck entfernen", "removeAllWatchExpressions": "Alle Ausdrücke entfernen", diff --git a/i18n/deu/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json index 8b6ad71cd4e..e3b17702d86 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "debugToolBarBackground": "Hintergrundfarbe der Debug-Symbolleiste." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 213056c17ed..7f72591cc14 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,6 +7,7 @@ "debugAdapterBinNotFound": "Die ausführbare Datei \"{0}\" des Debugadapters ist nicht vorhanden.", "debugAdapterCannotDetermineExecutable": "Die ausführbare Datei \"{0}\" des Debugadapters kann nicht bestimmt werden.", "debugType": "Der Typ der Konfiguration.", + "debugTypeNotRecognised": "Dieser Debugging-Typ wurde nicht erkannt. Bitte installiere die dazugehörige Debugging-Erweiterung.", "node2NotSupported": "\"node2\" wird nicht mehr unterstützt, verwenden Sie stattdessen \"node\", und legen Sie das Attribut \"protocol\" auf \"inspector\" fest.", "debugName": "Der Name der Konfiguration. Er wird im Dropdownmenü der Startkonfiguration angezeigt.", "debugRequest": "Der Anforderungstyp der Konfiguration. Der Wert kann \"launch\" oder \"attach\" sein.", diff --git a/i18n/deu/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json index 83d8c9273d1..88f9247b746 100644 --- a/i18n/deu/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json @@ -4,6 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "vscode.extension.contributes.view": "Trägt eine benutzerdefinierte Ansicht bei", + "vscode.extension.contributes.view.id": "Eindeutige ID zum Identifizieren der über vscode.workspace.createTreeView erstellten Ansicht", + "vscode.extension.contributes.view.label": "Visuell lesbare Zeichenfolge zum Rendern der Ansicht", + "vscode.extension.contributes.view.icon": "Pfad zum Ansichtssymbol", + "vscode.extension.contributes.views": "Trägt benutzerdefinierte Ansichten bei", "showViewlet": "{0} anzeigen", "view": "Anzeigen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index b3f77a860db..157325389a5 100644 --- a/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -6,6 +6,7 @@ { "openGlobalSettings": "Benutzereinstellungen öffnen", "openGlobalKeybindings": "Tastaturkurzbefehle öffnen", + "openGlobalKeybindingsFile": "Datei mit Tastaturkurzbefehlen öffnen", "openWorkspaceSettings": "Arbeitsbereichseinstellungen öffnen", "configureLanguageBasedSettings": "Sprachspezifische Einstellungen konfigurieren...", "languageDescriptionConfigured": "({0})", diff --git a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 5eb77bdab0b..49ebe70befe 100644 --- a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -9,6 +9,7 @@ "ConfigureTaskRunnerAction.quickPick.template": "Taskausführung auswählen", "ConfigureTaskRunnerAction.autoDetecting": "Tasks für {0} werden automatisch erkannt.", "ConfigureTaskRunnerAction.autoDetect": "Fehler bei der automatischen Erkennung des Tasksystems. Die Standardvorlage wird verwendet. Einzelheiten finden Sie in der Taskausgabe.", + "ConfigureTaskRunnerAction.autoDetectError": "Bei der automatischen Erkennung des Tasksystems sind Fehler aufgetreten. Einzelheiten finden Sie in der Taskausgabe.", "ConfigureTaskRunnerAction.failed": "Die Datei \"tasks.json\" kann nicht im Ordner \".vscode\" erstellt werden. Einzelheiten finden Sie in der Taskausgabe.", "ConfigureTaskRunnerAction.label": "Taskausführung konfigurieren", "ConfigureBuildTaskAction.label": "Buildtask konfigurieren", diff --git a/i18n/deu/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index f973ef7e798..30cc79ff848 100644 --- a/i18n/deu/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -14,6 +14,7 @@ "noIconThemeDesc": "Dateisymbole deaktivieren", "problemChangingIconTheme": "Problem beim Festlegen des Symboldesigns: {0}", "themes.selectIconTheme": "Dateisymboldesign auswählen", + "generateColorTheme.label": "Farbdesign aus aktuellen Einstellungen erstellen", "preferences": "Einstellungen", "developer": "Entwickler" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json b/i18n/deu/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json index 72f63890999..197be5e3800 100644 --- a/i18n/deu/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "walkThrough.unboundCommand": "Ungebunden" + "walkThrough.unboundCommand": "Ungebunden", + "walkThrough.gitNotFound": "Git scheint auf Ihrem System nicht installiert zu sein." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json b/i18n/deu/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json index 125841ae856..132f19f4c7b 100644 --- a/i18n/deu/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json +++ b/i18n/deu/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json @@ -6,5 +6,6 @@ { "schema.colors": "Farben für die Syntaxhervorhebung", "schema.properties.name": "Beschreibung der Regel", - "schema.fontStyle": "Schriftschnitt der Regel: kursiv, fett und unterstrichen (einzeln oder in Kombination)" + "schema.fontStyle": "Schriftschnitt der Regel: kursiv, fett und unterstrichen (einzeln oder in Kombination)", + "schema.tokenColors.path": "Pfad zu einer tmTheme-Designdatei (relativ zur aktuellen Datei)" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json b/i18n/deu/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json index ef53547d993..2d04a1d985b 100644 --- a/i18n/deu/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json +++ b/i18n/deu/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "error.cannotparsejson": "Probleme beim Analysieren der JSON-Designdatei: {0}" + "error.cannotparsejson": "Probleme beim Analysieren der JSON-Designdatei: {0}", + "error.invalidformat.colors": "Probleme beim Analysieren der Farbdesigndatei: {0}. Die Eigenschaft \"colors\" ist nicht vom Typ \"object\".", + "error.invalidformat.tokenColors": "Probleme beim Analysieren der Farbdesigndatei: {0}. Die Eigenschaft \"tokenColors\" muss entweder ein Array sein, das Farben angibt, oder ein Pfad zu einer TextMate-Designdatei.", + "error.plist.invalidformat": "Probleme beim Analysieren der tmTheme-Designdatei: {0}. \"settings\" ist kein Array", + "error.cannotparse": "Probleme beim Analysieren der tmTheme-Designdatei: {0}", + "error.cannotload": "Probleme beim Laden der tmTheme-Designdatei {0}: {1}" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/deu/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index e0608f31971..f9fa891eed3 100644 --- a/i18n/deu/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -25,5 +25,8 @@ "colorThemeError": "Theme is unknown or not installed.", "iconTheme": "Specifies the icon theme used in the workbench.", "noIconThemeDesc": "No file icons", - "iconThemeError": "File icon theme is unknown or not installed." + "iconThemeError": "File icon theme is unknown or not installed.", + "workbenchColors": "Überschreibt Farben aus dem derzeit ausgewählte Farbdesign.", + "workbenchColors.deprecated": "Diese Einstellung ist nicht mehr experimentell und wurde in \"workbench.colorCustomizations\" umbenannt.", + "workbenchColors.deprecatedDescription": "Verwenden Sie stattdessen \"workbench.colorCustomizations\"." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/common/theme.i18n.json b/i18n/esn/src/vs/workbench/common/theme.i18n.json index 833a10e06c0..c6ab3bc258a 100644 --- a/i18n/esn/src/vs/workbench/common/theme.i18n.json +++ b/i18n/esn/src/vs/workbench/common/theme.i18n.json @@ -13,8 +13,10 @@ "tabInactiveEditorGroupActiveForeground": "Color de primer plano de la pestaña inactiva en un grupo activo. Las pestañas son los contenedores de los editores en el área de editores. Se pueden abrir varias pestañas en un grupo de editores. Puede haber varios grupos de editores.", "tabInactiveEditorGroupInactiveForeground": "Color de primer plano de la pestaña inactiva en un grupo inactivo. Las pestañas son los contenedores de los editores en el área de editores. Se pueden abrir varias pestañas en un grupo de editores. Puede haber varios grupos de editores.", "editorGroupBackground": "Color de fondo de un grupo de editores. Los grupos de editores son los contenedores de los editores. El color de fondo se ve cuando se mueven arrastrando los grupos de editores.", + "editorGroupHeaderBackground": "Color de fondo del encabezado del título del grupo de editores cuando las fichas están deshabilitadas. Los grupos de editores son contenedores de editores.", "editorGroupBorder": "Color para separar varios grupos de editores entre sí. Los grupos de editores son los contenedores de los editores.", "editorDragAndDropBackground": "Color de fondo cuando se arrastran editores.", + "editorMasterDetailsBorder": "Color del borde para separar los detalles del lado maestro de editores en paralelo, por ejemplo el editor de diff y el de configuración.", "panelBackground": "Color de fondo del panel. Los paneles se muestran debajo del área de editores y contienen vistas, como Salida y Terminal integrado.", "panelBorder": "Color del borde superior del panel que lo separa del editor. Los paneles se muestran debajo del área de editores y contienen vistas, como Salida y Terminal integrado.", "panelActiveTitleForeground": "Color del título del panel activo. Los paneles se muestran debajo del área del editor y contienen vistas como Salida y Terminal integrado.", @@ -25,6 +27,8 @@ "statusBarNoFolderBackground": "Color de fondo de la barra de estado cuando no hay ninguna carpeta abierta. La barra de estado se muestra en la parte inferior de la ventana.", "statusBarItemActiveBackground": "Color de fondo de un elemento de la barra de estado al hacer clic. La barra de estado se muestra en la parte inferior de la ventana.", "statusBarItemHoverBackground": "Color de fondo de un elemento de la barra de estado al mantener el puntero. La barra de estado se muestra en la parte inferior de la ventana.", + "statusBarProminentItemBackground": "Color de fondo de los elementos destacados en la barra de estado. Estos elementos sobresalen para indicar importancia. La barra de estado está ubicada en la parte inferior de la ventana.", + "statusBarProminentItemHoverBackground": "Color de fondo de los elementos destacados en la barra de estado cuando se mantiene el mouse sobre estos elementos. Estos elementos sobresalen para indicar importancia. La barra de estado está ubicada en la parte inferior de la ventana.", "activityBarBackground": "Color de fondo de la barra de actividad, que se muestra en el lado izquierdo o derecho y que permite cambiar entre diferentes vistas de la barra lateral.", "activityBarForeground": "Color de fondo de la barra de actividad (por ejemplo utilizado por los iconos). La barra de actividad muestra en el lado izquierdo o derecho y permite cambiar entre diferentes vistas de la barra lateral.", "activityBarDragAndDropBackground": "Color de arrastrar y colocar comentarios de la barra de actividad. La barra de actividad se muestra en el extremo izquierdo o derecho y permite cambiar entre vistas de la barra lateral.", @@ -32,8 +36,11 @@ "activityBarBadgeForeground": "Color de primer plano de distintivo de notificación de actividad. La barra de actividad se muestra en el extremo izquierdo o derecho y permite cambiar entre vistas de la barra lateral.", "sideBarBackground": "Color de fondo de la barra lateral, que es el contenedor de vistas como Explorador y Búsqueda.", "sideBarTitleForeground": "Color de primer plano del título de la barra lateral, que es el contenedor de vistas como Explorador y Búsqueda.", + "sideBarSectionHeaderBackground": "Color de fondo del encabezado de sección de la barra lateral, que es el contenedor de vistas como Explorador y Búsqueda.", "titleBarActiveForeground": "Color de primer plano de la barra de título cuando la ventana está activa. Tenga en cuenta que, actualmente, este clor solo se admite en macOS.", "titleBarInactiveForeground": "Color de primer plano de la barra de título cuando la ventana está inactiva. Tenga en cuenta que, actualmente, este color solo se admite en macOS.", "titleBarActiveBackground": "Fondo de la barra de título cuando la ventana está activa. Tenga en cuenta que, actualmente, este color solo se admite en macOS.", - "titleBarInactiveBackground": "Color de fondo de la barra de título cuando la ventana está inactiva. Tenga en cuenta que, actualmente, este color solo se admite en macOS." + "titleBarInactiveBackground": "Color de fondo de la barra de título cuando la ventana está inactiva. Tenga en cuenta que, actualmente, este color solo se admite en macOS.", + "notificationsForeground": "Color de primer plano de las notificaciones. Estas se deslizan en la parte superior de la ventana. ", + "notificationsBackground": "Color de fondo de las notificaciones. Estas se deslizan en la parte superior de la ventana. " } \ No newline at end of file diff --git a/i18n/ita/extensions/git/out/commands.i18n.json b/i18n/ita/extensions/git/out/commands.i18n.json index 341133e5827..8e28758d234 100644 --- a/i18n/ita/extensions/git/out/commands.i18n.json +++ b/i18n/ita/extensions/git/out/commands.i18n.json @@ -16,6 +16,8 @@ "confirm discard": "Rimuovere le modifiche in {0}?", "confirm discard multiple": "Rimuovere le modifiche in {0} file?", "discard": "Rimuovi modifiche", + "confirm discard all": "Sei sicuro di voler annullare TUTTE le modifiche? Quest'azione è IRREVERSIBILE!", + "discardAll": "Rimuovi TUTTE le modifiche", "no changes": "Non ci sono modifiche di cui eseguire il commit.", "commit message": "Messaggio di commit", "provide commit message": "Specificare un messaggio di commit", @@ -31,6 +33,7 @@ "no remotes to publish": "Il repository non contiene elementi remoti configurati come destinazione della pubblicazione.", "disabled": "GIT è disabilitato oppure non supportato in quest'area di lavoro", "clean repo": "Pulire l'albero di lavoro del repository prima dell'estrazione.", + "cant push": "Impossibile effettuare il push in remoto. Effettua prima un 'pull' per integrare le tue modifiche.", "git error details": "GIT: {0}", "git error": "Errore GIT", "open git log": "Apri log GIT" diff --git a/i18n/ita/extensions/git/package.i18n.json b/i18n/ita/extensions/git/package.i18n.json index c514f38f714..ec477ab6861 100644 --- a/i18n/ita/extensions/git/package.i18n.json +++ b/i18n/ita/extensions/git/package.i18n.json @@ -9,11 +9,14 @@ "command.refresh": "Aggiorna", "command.openChange": "Apri modifiche", "command.openFile": "Apri file", + "command.stage": "Prepara modifiche per commit", + "command.stageAll": "Prepara tutte le modifiche per commit", "command.stageSelectedRanges": "Prepara per il commit intervalli selezionati", "command.revertSelectedRanges": "Ripristina intervalli selezionati", "command.unstage": "Annulla preparazione modifiche per commit", "command.unstageAll": "Annulla preparazione di tutte le modifiche per commit", "command.unstageSelectedRanges": "Annulla preparazione per il commit di intervalli selezionati", + "command.clean": "Rimuovi modifiche", "command.cleanAll": "Rimuovi tutte le modifiche", "command.commit": "Commit", "command.commitStaged": "Esegui commit dei file preparati", @@ -36,6 +39,8 @@ "config.autofetch": "Indica se il recupero automatico è abilitato", "config.enableLongCommitWarning": "Indica se visualizzare un avviso in caso di messaggi di commit lunghi", "config.confirmSync": "Conferma prima di sincronizzare i repository GIT", + "config.countBadge": "Controlla il contatore delle notifiche git. Con `all` vengono conteggiate tutte le modifiche. Con `tracked` vengono conteggiate solo le revisioni. Con `off` il contatore è disattivato.", + "config.checkoutType": "Controlla il tipo di branch mostrati eseguendo il comando `Checkout in...`. `all` mostra tutti i refs, `local` mostra solamente i branch locali, `tags` mostra solamente i tag e `remote` mostra solamente i branch remoti.", "config.ignoreLegacyWarning": "Ignora l'avvertimento legacy di Git", "config.ignoreLimitWarning": "Ignora il messaggio di avviso quando ci sono troppi cambiamenti in un repository" } \ No newline at end of file diff --git a/i18n/ita/extensions/gulp/package.i18n.json b/i18n/ita/extensions/gulp/package.i18n.json index 8b6ad71cd4e..c9bd05d8b62 100644 --- a/i18n/ita/extensions/gulp/package.i18n.json +++ b/i18n/ita/extensions/gulp/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.gulp.autoDetect": "Controlla se la rilevazione automatica delle attività gulp è on/off. L'impostazione predefinita è 'on'." +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript/out/utils/typingsStatus.i18n.json b/i18n/ita/extensions/typescript/out/utils/typingsStatus.i18n.json index 4cc0b902ae3..ede347b5776 100644 --- a/i18n/ita/extensions/typescript/out/utils/typingsStatus.i18n.json +++ b/i18n/ita/extensions/typescript/out/utils/typingsStatus.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "installingPackages": "Recupero dei dati per ottimizzare IntelliSense in TypeScript", + "typesInstallerInitializationFailed.title": "Non è stato possibile installare i file di definizione tipi per le funzionalità del linguaggio JavaScript. Verificare che NPM sia installato e che sia incluso nel PATH", "typesInstallerInitializationFailed.moreInformation": "Altre informazioni", "typesInstallerInitializationFailed.doNotCheckAgain": "Non eseguire più la verifica", "typesInstallerInitializationFailed.close": "Chiudi" diff --git a/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json index 92990d65a8a..8b28f9f169f 100644 --- a/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -24,6 +24,12 @@ "dropdownBackground": "Sfondo dell'elenco a discesa.", "dropdownForeground": "Primo piano dell'elenco a discesa.", "dropdownBorder": "Bordo dell'elenco a discesa.", + "listFocusBackground": "Colore sfondo Elenco/Struttura ad albero per l'elemento evidenziato quando l'Elenco/Struttura ad albero è attivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no.", + "listActiveSelectionBackground": "Colore sfondo Elenco/Struttura ad albero per l'elemento selezionato quando l'Elenco/Struttura ad albero è attivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no.", + "listInactiveSelectionBackground": "Colore sfondo Elenco/Struttura ad albero per l'elemento selezionato quando l'Elenco/Struttura ad albero è inattivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no.", + "listActiveSelectionForeground": "Colore primo piano Elenco/Struttura ad albero per l'elemento selezionato quando l'Elenco/Struttura ad albero è attivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no.", + "listFocusAndSelectionBackground": "Colore sfondo Elenco/Struttura ad albero per l'elemento evidenziato e selezionato quando l'Elenco/Struttura ad albero è attivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no. Questo colore ha la precedenza su colori specificati singolarmente per selezione e focus.", + "listFocusAndSelectionForeground": "Colore primo piano Elenco/Struttura ad albero per l'elemento evidenziato e selezionato quando l'Elenco/Struttura ad albero è attivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no. Questo colore ha la precedenza su colori specificati singolarmente per selezione e focus.", "listHoverBackground": "Sfondo Elenco/Struttura ad albero al passaggio del mouse sugli elementi.", "listDropBackground": "Sfondo Elenco/Struttura ad albero durante il trascinamento degli elementi selezionati.", "highlight": "Colore primo piano Elenco/Struttura ad albero delle occorrenze trovate durante la ricerca nell'Elenco/Struttura ad albero.", diff --git a/i18n/ita/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/ita/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 5bfe3f067f4..7f7ba33c59b 100644 --- a/i18n/ita/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -44,6 +44,8 @@ "openPreviousRecentlyUsedEditorInGroup": "Apri editor precedente usato di recente nel gruppo", "openNextRecentlyUsedEditorInGroup": "Apri editor successivo usato di recente nel gruppo", "navigateEditorHistoryByInput": "Apri editor precedente dalla cronologia", + "openNextRecentlyUsedEditor": "Apri editor successivo usato di recente", + "openPreviousRecentlyUsedEditor": "Apri editor precedente usato di recente", "clearEditorHistory": "Cancella cronologia degli editor", "focusLastEditorInStack": "Apri ultimo editor del gruppo", "moveEditorLeft": "Sposta editor a sinistra", diff --git a/i18n/ita/src/vs/workbench/common/theme.i18n.json b/i18n/ita/src/vs/workbench/common/theme.i18n.json index b194775f979..ea57126fbcd 100644 --- a/i18n/ita/src/vs/workbench/common/theme.i18n.json +++ b/i18n/ita/src/vs/workbench/common/theme.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "tabsContainerBackground": "Colore di sfondo del contenitore delle scehde. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", + "tabsContainerBackground": "Colore di sfondo del contenitore delle schede. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", "tabActiveBackground": "Colore di sfondo delle schede attive. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", "tabInactiveBackground": "Colore di sfondo delle schede inattive. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", "tabBorder": "Bordo per separare le schede l'una dall'altra. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", @@ -12,8 +12,11 @@ "tabActiveEditorGroupInactiveForeground": "Colore di primo piano delle schede attive in un gruppo inattivo. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", "tabInactiveEditorGroupActiveForeground": "Colore di primo piano delle schede inattive in un gruppo attivo. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", "tabInactiveEditorGroupInactiveForeground": "Colore di primo piano delle schede inattiva in un gruppo inattivo. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", + "editorGroupBackground": "Colore di sfondo di un gruppo di editor. I gruppi di editor sono contenitori di editor. Il colore di sfondo viene visualizzato quando si trascinano i gruppi di editor in un'altra posizione.", + "editorGroupHeaderBackground": "Colore di sfondo dell'intestazione del titolo dell'editor quando le schede sono disabilitate. I gruppi di editor sono contenitori di editor.", "editorGroupBorder": "Colore per separare più gruppi di editor l'uno dall'altro. I gruppi di editor sono i contenitori degli editor.", "editorDragAndDropBackground": "Colore di sfondo durante lo spostamento degli editor.", + "editorMasterDetailsBorder": "Colore del bordo per separare i dettagli dal lato master per gli editor affiancati. Gli esempi includono editor diff e l'editor impostazioni.", "panelBackground": "Colore di sfondo dei pannelli. I pannelli sono visualizzati sotto l'area degli editor e contengono visualizzazioni quali quella di output e del terminale integrato.", "panelBorder": "Colore del bordo dei pannelli nella parte superiore di separazione dall'editor. I pannelli sono visualizzati sotto l'area degli editor e contengono visualizzazioni quali quella di output e del terminale integrato.", "panelActiveTitleForeground": "Colore del titolo del pannello attivo. I pannelli sono visualizzati sotto l'area degli editor e contengono visualizzazioni quali quella di output e quella del terminale integrato.", @@ -24,6 +27,8 @@ "statusBarNoFolderBackground": "Colore di sfondo della barra di stato quando non ci sono cartelle aperte. La barra di stato è visualizzata nella parte inferiore della finestra.", "statusBarItemActiveBackground": "Colore di sfondo degli elementi della barra di stato quando si fa clic. La barra di stato è visualizzata nella parte inferiore della finestra.", "statusBarItemHoverBackground": "Colore di sfondo degli elementi della barra di stato al passaggio del mouse. La barra di stato è visualizzata nella parte inferiore della finestra.", + "statusBarProminentItemBackground": "Colore di sfondo degli elementi rilevanti della barra di stato. Gli elementi rilevanti spiccano rispetto ad altre voci della barra di stato. La barra di stato è visualizzata nella parte inferiore della finestra.", + "statusBarProminentItemHoverBackground": "Colore di sfondo degli elementi rilevanti della barra di stato al passaggio del mouse. Gli elementi rilevanti spiccano rispetto ad altre voci della barra di stato. La barra di stato è visualizzata nella parte inferiore della finestra.", "activityBarBackground": "Colore di sfondo della barra attività. La barra attività viene visualizzata nella parte inferiore sinistra/destra e consente il passaggio tra diverse visualizzazioni della barra laterale", "activityBarForeground": "Colore primo piano della barra attività (ad es. quello utilizzato per le icone). La barra attività viene mostrata all'estrema sinistra o destra e permette di alternare le visualizzazioni della barra laterale.", "activityBarDragAndDropBackground": "Colore feedback drag and drop degli elementi della barra attività. La barra attività viene visualizzata nella parte inferiore sinistra/destra e consente il passaggio tra diverse visualizzazioni della barra laterale", @@ -31,8 +36,11 @@ "activityBarBadgeForeground": "Colore primo piano della notifica utente dell'attività. La barra attività viene visualizzata all'estrema sinistra o all'estrema destra e consente di spostarsi tra le visualizzazioni della barra laterale.", "sideBarBackground": "Colore di sfondo della barra laterale. La barra laterale è il contenitore per visualizzazioni come Explorer e ricerca.", "sideBarTitleForeground": "Colore primo piano del titolo della barra laterale. La barra laterale è il contenitore per visualizzazioni come Explorer e ricerca.", + "sideBarSectionHeaderBackground": "Colore di sfondo dell'intestazione di sezione della barra laterale. La barra laterale è il contenitore di visualizzazioni quali Esplora risorse e Cerca.", "titleBarActiveForeground": "Colore primo piano della barra del titolo quando la finestra è attiva. Si noti che questo colore è attualmente supportato solo su macOS.", "titleBarInactiveForeground": "Colore primo piano della barra del titolo quando la finestra è inattiva. Si noti che questo colore è attualmente supportato solo su macOS.", "titleBarActiveBackground": "Colore di sfondo della barra di titolo quando la finestra è attiva. Si noti che questo colore è attualmente solo supportati su macOS.", - "titleBarInactiveBackground": "Colore di sfondo della barra del titolo quando la finestra è inattiva. Si noti che questo colore è attualmente supportato solo su macOS." + "titleBarInactiveBackground": "Colore di sfondo della barra del titolo quando la finestra è inattiva. Si noti che questo colore è attualmente supportato solo su macOS.", + "notificationsForeground": "Colore primo piano delle notifiche. Le notifiche scorrono dalla parte superiore della finestra.", + "notificationsBackground": "Colore di sfondo delle notifiche. Le notifiche scorrono dalla parte superiore della finestra." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json b/i18n/ita/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json index 8b6ad71cd4e..e11f9e61fe0 100644 --- a/i18n/ita/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "workbench.action.inspectKeyMap": "Sviluppatore: controlla mapping tasti" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index f0e210641bf..d4c6f2a6486 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -34,6 +34,7 @@ "editConditionalBreakpoint": "Modifica punto di interruzione...", "setValue": "Imposta valore", "addWatchExpression": "Aggiungi espressione", + "editWatchExpression": "Modifica espressione", "addToWatchExpressions": "Aggiungi a espressione di controllo", "removeWatchExpression": "Rimuovi espressione", "removeAllWatchExpressions": "Rimuovi tutte le espressioni", diff --git a/i18n/ita/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json index 8b6ad71cd4e..2e0a0d42956 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "debugToolBarBackground": "Colore di sfondo della barra degli strumenti di debug." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 2018bb48066..1c2127860d5 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,6 +7,7 @@ "debugAdapterBinNotFound": "Il file eseguibile '{0}' dell'adattatore di debug non esiste.", "debugAdapterCannotDetermineExecutable": "Non è possibile determinare il file eseguibile per l'adattatore di debug '{0}'.", "debugType": "Tipo di configurazione.", + "debugTypeNotRecognised": "Questo tipo di debug non è riconosciuto. Installare l'estensione di debug corrispondente.", "node2NotSupported": "\"node2\" non è più supportato. In alternativa, usare \"node\" e impostare l'attributo \"protocol\" su \"inspector\".", "debugName": "Nome della configurazione. Viene visualizzato nel menu a discesa della configurazione di avvio.", "debugRequest": "Tipo della richiesta di configurazione. Può essere \"launch\" o \"attach\".", diff --git a/i18n/ita/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json index 0a33d9bea99..8dbebb2e4a7 100644 --- a/i18n/ita/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json @@ -4,6 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "vscode.extension.contributes.view": "Visualizzazione personalizzata per contributes", + "vscode.extension.contributes.view.id": "ID univoco usato per identificare la visualizzazione creata tramite vscode.workspace.createTreeView", + "vscode.extension.contributes.view.label": "Stringa leggibile usata per il rendering della visualizzazione", + "vscode.extension.contributes.view.icon": "Percorso dell'icona della visualizzazione", + "vscode.extension.contributes.views": "Visualizzazioni personalizzate per contributes", "showViewlet": "Mostra {0}", "view": "Visualizza" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 8fa5a9b9b2a..12a31fb4c16 100644 --- a/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -6,6 +6,7 @@ { "openGlobalSettings": "Apri impostazioni utente", "openGlobalKeybindings": "Apri tasti di scelta rapida", + "openGlobalKeybindingsFile": "Apri file dei tasti di scelta rapida", "openWorkspaceSettings": "Apri impostazioni area di lavoro", "configureLanguageBasedSettings": "Configura impostazioni specifiche del linguaggio...", "languageDescriptionConfigured": "({0})", diff --git a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index fabad77044f..9ff412434bc 100644 --- a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -9,6 +9,7 @@ "ConfigureTaskRunnerAction.quickPick.template": "Seleziona strumento di esecuzione attività", "ConfigureTaskRunnerAction.autoDetecting": "Rilevamento automatico delle attività per {0}", "ConfigureTaskRunnerAction.autoDetect": "Il rilevamento automatico del sistema dell'attività non è riuscito. Verrà usato il modello predefinito. Per i dettagli, vedere l'output dell'attività.", + "ConfigureTaskRunnerAction.autoDetectError": "Il rilevamento automatico del sistema dell'attività ha restituito errori. Per i dettagli, vedere l'output dell'attività.", "ConfigureTaskRunnerAction.failed": "Non è possibile creare il file 'tasks.json' all'interno della cartella '.vscode'. Per dettagli, vedere l'output dell'attività.", "ConfigureTaskRunnerAction.label": "Configura esecuzione attività", "ConfigureBuildTaskAction.label": "Configura attività di compilazione", diff --git a/i18n/ita/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index f598673f2ce..823156a4842 100644 --- a/i18n/ita/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -14,6 +14,7 @@ "noIconThemeDesc": "Disabilita le icone dei file", "problemChangingIconTheme": "Problema durante l'impostazione del tema dell'icona: {0}", "themes.selectIconTheme": "Seleziona il tema dell'icona file", + "generateColorTheme.label": "Genera tema colore da impostazioni correnti", "preferences": "Preferenze", "developer": "Sviluppatore" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json b/i18n/ita/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json index 4550587650c..e40df93be8d 100644 --- a/i18n/ita/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "walkThrough.unboundCommand": "non associato" + "walkThrough.unboundCommand": "non associato", + "walkThrough.gitNotFound": "Sembra che GIT non sia installato nel sistema." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json b/i18n/ita/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json index eca6a3b65b4..4d36ef2de5e 100644 --- a/i18n/ita/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json +++ b/i18n/ita/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json @@ -6,5 +6,6 @@ { "schema.colors": "Colori per l'evidenziazione della sintassi", "schema.properties.name": "Descrizione della regola", - "schema.fontStyle": "Stile del carattere della regola: uno o combinazione di 'italic', 'bold' e 'underline'" + "schema.fontStyle": "Stile del carattere della regola: uno o combinazione di 'italic', 'bold' e 'underline'", + "schema.tokenColors.path": "Percorso di un file tmTheme (relativo al file corrente)" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json b/i18n/ita/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json index 25b7b98a369..0aee1a7594d 100644 --- a/i18n/ita/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json +++ b/i18n/ita/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "error.cannotparsejson": "Problemi durante l'analisi del file di tema di JSON: {0}" + "error.cannotparsejson": "Problemi durante l'analisi del file di tema di JSON: {0}", + "error.invalidformat.colors": "Si è verificato un problema durante l'analisi del file di tema {0}. La proprietà 'colors' non è di tipo 'object'.", + "error.invalidformat.tokenColors": "Si è verificato un problema durante l'analisi del file di tema {0}. La proprietà 'tokenColors' deve essere una matrice che specifica i colori o un percorso di un file di tema TextMate", + "error.plist.invalidformat": "Si è verificato un problema durante l'analisi del file tmTheme {0}. 'settings' non è una matrice.", + "error.cannotparse": "Si sono verificati problemi durante l'analisi del file tmTheme {0}", + "error.cannotload": "Si sono verificati problemi durante il caricamento del file tmTheme {0}: {1}" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/ita/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index 13457b15bc1..78a199c933a 100644 --- a/i18n/ita/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -25,5 +25,8 @@ "colorThemeError": "Theme is unknown or not installed.", "iconTheme": "Specifies the icon theme used in the workbench.", "noIconThemeDesc": "No file icons", - "iconThemeError": "File icon theme is unknown or not installed." + "iconThemeError": "File icon theme is unknown or not installed.", + "workbenchColors": "Sostituisce i colori del tema colori attualmente selezionato.", + "workbenchColors.deprecated": "L'impostazione non è più sperimentale ed è stata rinominata in 'workbench.colorCustomizations'", + "workbenchColors.deprecatedDescription": "In alternativa, usare 'workbench.colorCustomizations'" } \ No newline at end of file diff --git a/i18n/jpn/extensions/git/out/commands.i18n.json b/i18n/jpn/extensions/git/out/commands.i18n.json index 0e42fe3c0fd..e84147ee8b4 100644 --- a/i18n/jpn/extensions/git/out/commands.i18n.json +++ b/i18n/jpn/extensions/git/out/commands.i18n.json @@ -33,6 +33,7 @@ "no remotes to publish": "リポジトリには、発行先として構成されているリモートがありません。", "disabled": "このワークスペースでは、Git が無効になっているか、サポートされていません", "clean repo": "チェックアウトの前に、リポジトリの作業ツリーを消去してください。", + "cant push": "参照仕様をリモートにプッシュできません。最初に 'Pull' を実行して変更を統合してください。", "git error details": "Git: {0}", "git error": "Git エラー", "open git log": "Git ログを開く" diff --git a/i18n/jpn/extensions/git/package.i18n.json b/i18n/jpn/extensions/git/package.i18n.json index f991c6d1789..c13c203332a 100644 --- a/i18n/jpn/extensions/git/package.i18n.json +++ b/i18n/jpn/extensions/git/package.i18n.json @@ -40,6 +40,7 @@ "config.enableLongCommitWarning": "長いコミット メッセージについて警告するかどうか", "config.confirmSync": "Git リポジトリを同期する前に確認する", "config.countBadge": "Git バッジ カウンターを制御します。`all` はすべての変更をカウントします。 `tracked` は追跡している変更のみカウントします。 `off` はカウントをオフします。", + "config.checkoutType": "`Checkout to...` を実行するときに表示されるブランチの種類を制御します。`all` はすべての参照を表示します。`local` はローカル ブランチのみ、`tags` はタグのみ、`remote` はリモート ブランチのみを表示します。 ", "config.ignoreLegacyWarning": "旧 Git の警告を無視します", "config.ignoreLimitWarning": "リポジトリ内に変更が多い場合は警告を無視します" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/jpn/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index 5a962ce17d0..5b2270de604 100644 --- a/i18n/jpn/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/jpn/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -5,8 +5,8 @@ // Do not edit this file. It is machine generated. { "requirearray": "メニュー項目は配列にする必要があります", - "requirestring": "プロパティ `{0}` は必須で、型 `string` でなければなりません", - "optstring": "プロパティ `{0}` は省略するか、型 `string` にする必要があります", + "requirestring": "`{0}` プロパティは必須で、`string` 型でなければなりません", + "optstring": "`{0}` プロパティは省略するか、`string` 型にする必要があります", "vscode.extension.contributes.menuItem.command": "実行するコマンドの識別子。コマンドは 'commands' セクションで宣言する必要があります", "vscode.extension.contributes.menuItem.alt": "実行する別のコマンドの識別子。コマンドは 'commands' セクションで宣言する必要があります", "vscode.extension.contributes.menuItem.when": "この項目を表示するために満たす必要がある条件", @@ -22,9 +22,9 @@ "menus.resourceGroupContext": "ソース管理リソース グループのコンテキスト メニュー", "menus.resourceStateContext": "ソース管理リソース状態のコンテキスト メニュー", "nonempty": "空以外の値が必要です。", - "opticon": "プロパティ `icon` は省略できます。指定する場合には、文字列または `{dark, light}` などのリテラルにする必要があります", - "requireStringOrObject": "プロパティ `{0}` は必須で、`string` または `object` の型でなければなりません", - "requirestrings": "プロパティ `{0}` と `{1}` は必須で、型 `string` でなければなりません", + "opticon": "`icon` プロパティは省略できます。指定する場合には、文字列または `{dark, light}` などのリテラルにする必要があります", + "requireStringOrObject": "`{0}` プロパティは必須で、`string` または `object` の型でなければなりません", + "requirestrings": "プロパティの `{0}` と `{1}` は必須で、`string` 型でなければなりません", "vscode.extension.contributes.commandType.command": "実行するコマンドの識別子", "vscode.extension.contributes.commandType.title": "コマンドが UI に表示される際のタイトル", "vscode.extension.contributes.commandType.category": "(省略可能) コマンド別のカテゴリ文字列が UI でグループ分けされます", diff --git a/i18n/jpn/src/vs/platform/extensions/node/extensionValidator.i18n.json b/i18n/jpn/src/vs/platform/extensions/node/extensionValidator.i18n.json index d8c385410db..f3a17198670 100644 --- a/i18n/jpn/src/vs/platform/extensions/node/extensionValidator.i18n.json +++ b/i18n/jpn/src/vs/platform/extensions/node/extensionValidator.i18n.json @@ -9,15 +9,15 @@ "versionSpecificity2": "`engines.vscode` ({0}) で指定されたバージョンが明確ではありません。1.0.0 より後のバージョンの vscode の場合は、少なくとも、想定されているメジャー バージョンを定義してください。例 ^1.10.0、1.10.x、1.x.x、2.x.x など。", "versionMismatch": "拡張機能が Code {0} と互換性がありません。拡張機能に必要なバージョン: {1}。", "extensionDescription.empty": "空の拡張機能の説明を入手しました", - "extensionDescription.publisher": "プロパティ `{0}` は必須で、型 `string` でなければなりません", - "extensionDescription.name": "プロパティ `{0}` は必須で、型 `string` でなければなりません", - "extensionDescription.version": "プロパティ `{0}` は必須で、型 `string` でなければなりません", - "extensionDescription.engines": "プロパティ `{0}` は必須で、型 `object` でなければなりません", - "extensionDescription.engines.vscode": "プロパティ `{0}` は必須で、型 `string` でなければなりません", - "extensionDescription.extensionDependencies": "プロパティ `{0}` は省略するか、型 `string[]` にする必要があります", - "extensionDescription.activationEvents1": "プロパティ `{0}` は省略するか、型 `string[]` にする必要があります", + "extensionDescription.publisher": "`{0}` プロパティは必須で、`string` 型でなければなりません", + "extensionDescription.name": "`{0}` プロパティは必須で、`string` 型でなければなりません", + "extensionDescription.version": "`{0}` プロパティは必須で、`string` 型でなければなりません", + "extensionDescription.engines": "`{0}` プロパティは必須で、`string` 型でなければなりません", + "extensionDescription.engines.vscode": "`{0}` プロパティは必須で、`string` 型でなければなりません", + "extensionDescription.extensionDependencies": "`{0}` プロパティは省略するか、`string[]` 型にする必要があります", + "extensionDescription.activationEvents1": "`{0}` プロパティは省略するか、`string[]` 型にする必要があります", "extensionDescription.activationEvents2": "プロパティ `{0}` と `{1}` は、両方とも指定するか両方とも省略しなければなりません", - "extensionDescription.main1": "プロパティ `{0}` は省略するか、型 `string` にする必要があります", + "extensionDescription.main1": "`{0}` プロパティは省略するか、`string` 型にする必要があります", "extensionDescription.main2": "拡張機能のフォルダー ({1}) の中に `main` ({0}) が含まれることが予期されます。これにより拡張機能を移植できなくなる可能性があります。", "extensionDescription.main3": "プロパティ `{0}` と `{1}` は、両方とも指定するか両方とも省略しなければなりません", "notSemver": "拡張機能のバージョンが semver と互換性がありません。" diff --git a/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json index 857fb4711f4..cae6a6693a2 100644 --- a/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -8,14 +8,31 @@ "schema.colors": "ワークベンチで使用する色。", "foreground": "全体の前景色。この色は、コンポーネントによってオーバーライドされていない場合にのみ使用されます。", "focusBorder": "フォーカスされた要素の境界線全体の色。この色はコンポーネントによって上書きされていない場合にのみ使用されます。", + "contrastBorder": "コントラストを強めるために、他の要素と隔てる追加の境界線。", + "activeContrastBorder": "コントラストを強めるために、アクティブな他要素と隔てる追加の境界線。", "widgetShadow": "エディター内の検索/置換窓など、エディター ウィジェットの影の色。", "inputBoxBackground": "入力ボックスの背景。", "inputBoxForeground": "入力ボックスの前景。", "inputBoxBorder": "入力ボックスの境界線。", "inputBoxActiveOptionBorder": "入力フィールドのアクティブ オプションの境界線の色。", + "inputValidationInfoBackground": "情報の重大度を示す入力検証の背景色。", + "inputValidationInfoBorder": "情報の重大度を示す入力検証の境界線色。", + "inputValidationWarningBackground": "警告の重大度を示す入力検証の背景色。", + "inputValidationWarningBorder": "警告の重大度を示す入力検証の境界線色。", + "inputValidationErrorBackground": "エラーの重大度を示す入力検証の背景色。", + "inputValidationErrorBorder": "エラーの重大度を示す入力検証の境界線色。", "dropdownBackground": "ドロップダウンの背景。", "dropdownForeground": "ドロップダウンの前景。", "dropdownBorder": "ドロップダウンの境界線。", + "listFocusBackground": "ツリーリストがアクティブのとき、フォーカスされた項目のツリーリスト背景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", + "listActiveSelectionBackground": "ツリーリストがアクティブのとき、選択された項目のツリーリスト背景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", + "listInactiveSelectionBackground": "ツリーリストが非アクティブのとき、フォーカスされた項目のツリーリスト背景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", + "listActiveSelectionForeground": "ツリーリストがアクティブのとき、選択された項目のツリーリスト前景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", + "listFocusAndSelectionBackground": "ツリーリストがアクティブのとき、フォーカスと選択された項目のツリーリスト背景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。この色は、各選択とフォーカスの色設定より優先します。", + "listFocusAndSelectionForeground": "ツリーリストがアクティブのとき、フォーカスと選択された項目のツリーリスト前景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。この色は、各選択とフォーカスの色設定より優先します。", + "listHoverBackground": "マウス操作で項目をホバーするときのツリーリスト背景。", + "listDropBackground": "マウス操作で項目を移動するときのツリーリスト ドラッグ アンド ドロップの背景。", + "highlight": "ツリーリスト内を検索しているとき、一致した強調のツリーリスト前景色。", "pickerGroupForeground": "ラベルをグループ化するためのクリック選択の色。", "pickerGroupBorder": "境界線をグループ化するためのクイック選択の色。", "buttonForeground": "ボタンの前景色。", diff --git a/i18n/jpn/src/vs/workbench/common/theme.i18n.json b/i18n/jpn/src/vs/workbench/common/theme.i18n.json index 7dd2454d3cb..f1767a29556 100644 --- a/i18n/jpn/src/vs/workbench/common/theme.i18n.json +++ b/i18n/jpn/src/vs/workbench/common/theme.i18n.json @@ -16,6 +16,7 @@ "editorGroupHeaderBackground": "タブが無効な場合の エディター グループ タイトル ヘッダーの背景色。エディター グループはエディターのコンテナーです。", "editorGroupBorder": "複数のエディター グループを互いに分離するための色。エディター グループはエディターのコンテナーです。", "editorDragAndDropBackground": "エディターのドラッグ時の背景色。", + "editorMasterDetailsBorder": "エディターを横並びに表示している場合に、詳細をマスター側から分けて表示するための境界線色。たとえば、差分エディターや設定エディターです。", "panelBackground": "パネルの背景色。パネルはエディター領域の下に表示され、出力や統合ターミナルなどのビューを含みます。", "panelBorder": "エディターとの区切りを示すパネル上部の罫線の色。パネルはエディター領域の下に表示され、出力や統合ターミナルなどのビューを含みます。", "panelActiveTitleForeground": "アクティブ パネルのタイトルの色。パネルはエディター領域の下に表示され、出力や統合ターミナルなどのビューを含みます。", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index aabd2eeb058..aef11784707 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -32,7 +32,7 @@ "app.launch.json.compounds": "複合の一覧。各複合は、同時に起動される複数の構成を参照します。", "app.launch.json.compound.name": "複合の名前。起動構成のドロップダウン メニューに表示されます。", "app.launch.json.compounds.configurations": "この複合の一部として開始される構成の名前。", - "debugNoType": "デバッグ アダプター 'type' は省略不可で、型 'string' でなければなりません。", + "debugNoType": "デバッグ アダプター 'type' は省略不可で、'string' 型でなければなりません。", "DebugConfig.failed": "'launch.json' ファイルを '.vscode' フォルダー ({0}) 内に作成できません。", "selectDebug": "環境の選択" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json index 2369ff57b02..497be6143f7 100644 --- a/i18n/jpn/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json @@ -6,6 +6,7 @@ { "vscode.extension.contributes.view": "カスタム ビューを提供します", "vscode.extension.contributes.view.id": "vscode.workspace.createTreeView を介して生成した、ビューを認識するための一意の ID", + "vscode.extension.contributes.view.label": "ビューの表示に使用する、他人が解釈できる文字列", "vscode.extension.contributes.view.icon": "ビュー アイコンへのパス", "vscode.extension.contributes.views": "複数のカスタム ビューを提供します", "showViewlet": "{0} を表示", diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/common/taskConfiguration.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/common/taskConfiguration.i18n.json index 4605e28e85a..c7b8031b6e5 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/common/taskConfiguration.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/common/taskConfiguration.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "ConfigurationParser.invalidCWD": "警告: options.cwd は、型 string でなければなりません。値 {0} を無視します\n", + "ConfigurationParser.invalidCWD": "警告: options.cwd は、string 型でなければなりません。値 {0} を無視します", "ConfigurationParser.noShell": "警告: シェル構成がサポートされるのは、ターミナルでタスクを実行している場合のみです。", "ConfigurationParser.noargs": "エラー: コマンド引数は文字列の配列でなければなりません。指定された値:\n{0}", "ConfigurationParser.noName": "エラー: 宣言スコープ内の問題マッチャーに次の名前がなければなりません:\n{0}\n", diff --git a/i18n/jpn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/jpn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index 7cace13d285..590d8c39681 100644 --- a/i18n/jpn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -5,8 +5,8 @@ // Do not edit this file. It is machine generated. { "nonempty": "空以外の値が必要です。", - "requirestring": "プロパティ `{0}` は必須で、型 `string` でなければなりません", - "optstring": "プロパティ `{0}` は省略するか、型 `string` にする必要があります", + "requirestring": "`{0}` プロパティは必須で、`string` 型でなければなりません", + "optstring": "`{0}` プロパティは省略するか、`string` 型にする必要があります", "vscode.extension.contributes.keybindings.command": "キー バインドのトリガー時に実行するコマンドの識別子。", "vscode.extension.contributes.keybindings.key": "キーまたはキー シーケンス (キーは + で区切り、シーケンスはスペースで区切る。例: Ctrl+O、Ctrl+L L で同時に押す", "vscode.extension.contributes.keybindings.mac": "Mac 固有のキーまたはキー シーケンス。", diff --git a/i18n/jpn/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json b/i18n/jpn/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json index 03cdc9aeaad..22d698c1407 100644 --- a/i18n/jpn/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json @@ -6,11 +6,11 @@ { "invalid": "`contributes.{0}` が無効です。配列が必要です。", "invalid.empty": "`contributes.{0}` に対する空の値", - "require.id": "プロパティ `{0}` は必須で、型 `string` でなければなりません", - "opt.extensions": "プロパティ `{0}` を省略するか、型 `string[]` にする必要があります", - "opt.filenames": "プロパティ `{0}` を省略するか、型 `string[]` にする必要があります", - "opt.firstLine": "プロパティ `{0}` を省略するか、型 `string` にする必要があります", - "opt.configuration": "プロパティ `{0}` を省略するか、型 `string` にする必要があります", - "opt.aliases": "プロパティ `{0}` を省略するか、型 `string[]` にする必要があります", - "opt.mimetypes": "プロパティ `{0}` を省略するか、型 `string[]` にする必要があります" + "require.id": "`{0}` プロパティは必須で、`string` 型でなければなりません", + "opt.extensions": "`{0}` プロパティを省略するか、`string[]` 型にする必要があります", + "opt.filenames": "`{0}` プロパティを省略するか、`string[]` 型にする必要があります", + "opt.firstLine": "`{0}` プロパティを省略するか、`string` 型にする必要があります", + "opt.configuration": "`{0}` プロパティを省略するか、`string` 型にする必要があります", + "opt.aliases": "`{0}` プロパティを省略するか、`string[]` 型にする必要があります", + "opt.mimetypes": "`{0}` プロパティを省略するか、`string[]` 型にする必要があります" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json b/i18n/jpn/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json index f0fb6370546..978edc39141 100644 --- a/i18n/jpn/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json @@ -6,5 +6,6 @@ { "schema.colors": "構文の強調表示をする色", "schema.properties.name": "ルールの説明", - "schema.fontStyle": "ルールのフォント スタイル: '斜体'、'太字'、'下線' のいずれかまたはこれらの組み合わせ" + "schema.fontStyle": "ルールのフォント スタイル: '斜体'、'太字'、'下線' のいずれかまたはこれらの組み合わせ", + "schema.tokenColors.path": "tmTheme ファイルへのパス (現在のファイルとの相対パス)" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json b/i18n/jpn/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json index c84f5026160..782cc7b29de 100644 --- a/i18n/jpn/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json @@ -5,6 +5,8 @@ // Do not edit this file. It is machine generated. { "error.cannotparsejson": "JSON テーマ ファイルの解析中に問題が発生しました: {0}", + "error.invalidformat.colors": "配色テーマ ファイルの解析中に問題が発生しました: {0}。'colors' プロパティは 'object' 型ではありません。", + "error.invalidformat.tokenColors": "配色テーマ ファイルの解析中に問題が発生しました: {0}。'tokenColors' プロパティは、配色を指定する配列か、TextMate テーマファイルへのパスでなければなりません", "error.plist.invalidformat": "tmTheme ファイルの解析中に問題が発生しました: {0}。'settings' は配列ではありません。", "error.cannotparse": "tmTheme ファイルの解析中に問題が発生しました: {0}", "error.cannotload": "tmTheme ファイル {0} の読み込み中に問題が発生しました: {1}" diff --git a/i18n/jpn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/jpn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index 99cd34d1f8d..eb295ac74b0 100644 --- a/i18n/jpn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -27,5 +27,6 @@ "noIconThemeDesc": "No file icons", "iconThemeError": "File icon theme is unknown or not installed.", "workbenchColors": "現在選択している配色テーマで配色を上書きします。", + "workbenchColors.deprecated": "この設定はもう試験的なものではなく、名前が 'workbench.colorCustomizations' に変更されています", "workbenchColors.deprecatedDescription": "代わりに 'workbench.colorCustomizations' を使用してください" } \ No newline at end of file diff --git a/i18n/kor/extensions/git/out/commands.i18n.json b/i18n/kor/extensions/git/out/commands.i18n.json index 4a4101b4207..99d98e59a53 100644 --- a/i18n/kor/extensions/git/out/commands.i18n.json +++ b/i18n/kor/extensions/git/out/commands.i18n.json @@ -16,6 +16,8 @@ "confirm discard": "{0}의 변경 내용을 취소하시겠습니까?", "confirm discard multiple": "{0}개 파일의 변경 내용을 취소하시겠습니까?", "discard": "변경 내용 취소", + "confirm discard all": "모든 변경 내용을 취소하시겠습니까? 이 작업은 되돌릴 수 없습니다.", + "discardAll": "모든 변경 내용 취소", "no changes": "커밋할 변경 내용이 없습니다.", "commit message": "커밋 메시지", "provide commit message": "커밋 메시지를 제공하세요.", @@ -31,6 +33,7 @@ "no remotes to publish": "리포지토리에 게시하도록 구성된 원격이 없습니다.", "disabled": "Git은 이 작업 영역에서 사용하지 않도록 설정되어 있거나 지원되지 않습니다.", "clean repo": "체크 아웃하기 전에 리포지토리 작업 트리를 정리하세요.", + "cant push": "참조를 원격에 푸시할 수 없습니다. 먼저 '풀'을 실행하여 변경 내용을 통합하세요.", "git error details": "Git: {0}", "git error": "Git 오류", "open git log": "Git 로그 열기" diff --git a/i18n/kor/extensions/git/out/scmProvider.i18n.json b/i18n/kor/extensions/git/out/scmProvider.i18n.json index 7fded37328a..69250749f77 100644 --- a/i18n/kor/extensions/git/out/scmProvider.i18n.json +++ b/i18n/kor/extensions/git/out/scmProvider.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "commit": "Commit" + "commit": "커밋" } \ No newline at end of file diff --git a/i18n/kor/extensions/git/package.i18n.json b/i18n/kor/extensions/git/package.i18n.json index 0aeb4b64014..aed0ca69317 100644 --- a/i18n/kor/extensions/git/package.i18n.json +++ b/i18n/kor/extensions/git/package.i18n.json @@ -39,6 +39,8 @@ "config.autofetch": "자동 가져오기 사용 여부", "config.enableLongCommitWarning": "긴 커밋 메시지에 대해 경고할지 여부입니다.", "config.confirmSync": "Git 리포지토리를 동기화하기 전에 확인합니다.", + "config.countBadge": "Git 배지 카운터를 제어합니다. `all`이면 변경 내용을 모두 계산하고, `tracked`이면 추적된 변경 내용만 계산하고, `off`이면 해제합니다.", + "config.checkoutType": "`다음으로 체크 아웃...`을 실행할 때 나열되는 분기 유형을 제어합니다. `all`이면 모든 참조를 표시하고, `local`이면 로컬 분기만 표시하고, `tags`이면 태그만 표시하고, `remote`이면 원격 분기만 표시합니다.", "config.ignoreLegacyWarning": "레거시 Git 경고를 무시합니다.", "config.ignoreLimitWarning": "리포지토리에 변경 내용이 너무 많으면 경고를 무시합니다." } \ No newline at end of file diff --git a/i18n/kor/extensions/gulp/package.i18n.json b/i18n/kor/extensions/gulp/package.i18n.json index 8b6ad71cd4e..9dc5dc5daa6 100644 --- a/i18n/kor/extensions/gulp/package.i18n.json +++ b/i18n/kor/extensions/gulp/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.gulp.autoDetect": "Gulp 작업의 자동 검색을 사용할지 여부를 제어합니다. 기본값은 [켜기]입니다." +} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript/out/utils/typingsStatus.i18n.json b/i18n/kor/extensions/typescript/out/utils/typingsStatus.i18n.json index bba27308a23..07c376496cf 100644 --- a/i18n/kor/extensions/typescript/out/utils/typingsStatus.i18n.json +++ b/i18n/kor/extensions/typescript/out/utils/typingsStatus.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "installingPackages": "TypeScript IntelliSense를 향상하기 위해 데이터를 페치하는 중", + "typesInstallerInitializationFailed.title": "JavaScript 언어 기능에 대해 입력 파일을 설치할 수 없습니다. NPM이 설치되어 있고 PATH에 있는지 확인하세요.", "typesInstallerInitializationFailed.moreInformation": "추가 정보", "typesInstallerInitializationFailed.doNotCheckAgain": "다시 확인 안 함", "typesInstallerInitializationFailed.close": "닫기" diff --git a/i18n/kor/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/kor/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 92d7d86820f..66ca4a6169b 100644 --- a/i18n/kor/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -44,6 +44,8 @@ "openPreviousRecentlyUsedEditorInGroup": "그룹에서 최근에 사용한 이전 편집기 열기", "openNextRecentlyUsedEditorInGroup": "그룹에서 최근에 사용한 다음 편집기 열기", "navigateEditorHistoryByInput": "기록에서 이전 편집기 열기", + "openNextRecentlyUsedEditor": "최근에 사용한 다음 편집기 열기", + "openPreviousRecentlyUsedEditor": "최근에 사용한 이전 편집기 열기", "clearEditorHistory": "편집기 기록 지우기", "focusLastEditorInStack": "그룹의 마지막 편집기 열기", "moveEditorLeft": "왼쪽으로 편집기 이동", diff --git a/i18n/kor/src/vs/workbench/common/theme.i18n.json b/i18n/kor/src/vs/workbench/common/theme.i18n.json index 56bd399b45f..1cd988db67e 100644 --- a/i18n/kor/src/vs/workbench/common/theme.i18n.json +++ b/i18n/kor/src/vs/workbench/common/theme.i18n.json @@ -12,8 +12,11 @@ "tabActiveEditorGroupInactiveForeground": "비활성 그룹의 활성 탭 전경색입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에서 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", "tabInactiveEditorGroupActiveForeground": "활성 그룹의 비활성 탭 전경색입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에서 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", "tabInactiveEditorGroupInactiveForeground": "비활성 그룹의 비활성 탭 전경색입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에서 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", + "editorGroupBackground": "편집기 그룹의 배경색입니다. 편집기 그룹은 편집기의 컨테이너입니다. 배경색은 편집기 그룹을 끌 때 표시됩니다.", + "editorGroupHeaderBackground": "탭을 사용하지 않도록 설정한 경우 편집기 그룹 제목 머리글의 배경색입니다. 편집기 그룹은 편집기의 컨테이너입니다.", "editorGroupBorder": "여러 편집기 그룹을 서로 구분하기 위한 색입니다. 편집기 그룹은 편집기의 컨테이너입니다.", "editorDragAndDropBackground": "편집기를 끌어올 때의 배경색입니다.", + "editorMasterDetailsBorder": "병렬 편집기에서 마스터 쪽의 세부 정보를 구분하기 위한 테두리 색입니다. Diff 편집기, 설정 편집기 등을 예로 들 수 있습니다.", "panelBackground": "패널 배경색입니다. 패널은 편집기 영역 아래에 표시되며 출력 및 통합 터미널 같은 보기가 포함됩니다.", "panelBorder": "편집기와 구분되는 맨 위의 패널 테두리 색입니다. 패널은 편집기 영역 아래에 표시되며 출력 및 통합 터미널 같은 보기가 포함됩니다.", "panelActiveTitleForeground": "활성 패널의 제목 색입니다. 패널은 편집기 영역 아래에 표시되며 출력 및 통합 터미널 같은 보기가 포함됩니다.", @@ -24,6 +27,8 @@ "statusBarNoFolderBackground": "폴더가 열리지 않았을 때의 상태 표시줄 배경색입니다. 상태 표시줄은 창의 맨 아래에 표시됩니다.", "statusBarItemActiveBackground": "클릭할 때의 상태 표시줄 항목 배경색입니다. 상태 표시줄은 창의 맨 아래에 표시됩니다.", "statusBarItemHoverBackground": "마우스로 가리킬 때의 상태 표시줄 항목 배경색입니다. 상태 표시줄은 창의 맨 아래에 표시됩니다.", + "statusBarProminentItemBackground": "상태 표시줄 주요 항목 배경색입니다. 주요 항목은 중요도를 나타내는 다른 상태 표시줄 항목보다 눈에 잘 띕니다. 상태 표시줄은 창의 맨 아래에 표시됩니다.", + "statusBarProminentItemHoverBackground": "마우스로 가리킬 때의 상태 표시줄 주요 항목 배경색입니다. 주요 항목은 중요도를를 나타내는 다른 상태 표시줄 항목보다 눈에 잘 띕니다. 상태 표시줄은 창의 맨 아래에 표시됩니다.", "activityBarBackground": "작업 막대 배경색입니다. 작업 막대는 맨 왼쪽이나 오른쪽에 표시되며 사이드바의 뷰 간을 전환하는 데 사용할 수 있습니다.", "activityBarForeground": "작업 막대 전경 색(예: 아이콘에 사용됨)입니다. 작업 막대는 오른쪽이나 왼쪽 끝에 표시되며 사이드바의 보기 간을 전환할 수 있습니다.", "activityBarDragAndDropBackground": "작업 막대 항목의 끌어서 놓기 피드백 색입니다. 작업 막대는 왼쪽이나 오른쪽 끝에 표시되며 사이드바의 보기를 전환할 수 있습니다.", @@ -31,8 +36,11 @@ "activityBarBadgeForeground": "활동 알림 배지 전경색입니다. 작업 막대는 왼쪽이나 오른쪽 끝에 표시되며 사이드바의 보기를 전환할 수 있습니다.", "sideBarBackground": "사이드바 배경색입니다. 사이드바는 탐색기 및 검색과 같은 뷰의 컨테이너입니다.", "sideBarTitleForeground": "사이드바 제목 전경색입니다. 사이드바는 탐색기 및 검색과 같은 뷰의 컨테이너입니다.", + "sideBarSectionHeaderBackground": "사이드바 섹션 헤더 배경색입니다. 사이드바는 탐색기 및 검색과 같은 뷰의 컨테이너입니다.", "titleBarActiveForeground": "창이 활성화된 경우의 제목 표시줄 전경입니다. 이 색은 현재 macOS에서만 지원됩니다.", "titleBarInactiveForeground": "창이 비활성화된 경우의 제목 표시줄 전경입니다. 이 색은 현재 macOS에서만 지원됩니다.", "titleBarActiveBackground": "창을 활성화할 때의 제목 표시줄 전경입니다. 이 색은 현재 macOS에서만 지원됩니다.", - "titleBarInactiveBackground": "창이 비활성화된 경우의 제목 표시줄 배경입니다. 이 색은 현재 macOS에서만 지원됩니다." + "titleBarInactiveBackground": "창이 비활성화된 경우의 제목 표시줄 배경입니다. 이 색은 현재 macOS에서만 지원됩니다.", + "notificationsForeground": "알림 전경색입니다. 알림은 창의 위쪽에 표시됩니다.", + "notificationsBackground": "알림 배경색입니다. 알림은 창의 위쪽에 표시됩니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json b/i18n/kor/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json index 8b6ad71cd4e..e7e7cdc921d 100644 --- a/i18n/kor/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "workbench.action.inspectKeyMap": "개발자: 키 매핑 검사" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index c3b7509d8a4..60f3a207808 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -34,6 +34,7 @@ "editConditionalBreakpoint": "중단점 편집...", "setValue": "값 설정", "addWatchExpression": "식 추가", + "editWatchExpression": "식 편집", "addToWatchExpressions": "조사식에 추가", "removeWatchExpression": "식 제거", "removeAllWatchExpressions": "모든 식 제거", diff --git a/i18n/kor/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json index 8b6ad71cd4e..e3166a31b49 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "debugToolBarBackground": "디버그 도구 모음 배경색입니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index cdf01baf557..bac1b32e92a 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,6 +7,7 @@ "debugAdapterBinNotFound": "디버그 어댑터 실행 파일 '{0}'이(가) 없습니다.", "debugAdapterCannotDetermineExecutable": "디버그 어댑터 '{0}'에 대한 실행 파일을 확인할 수 없습니다.", "debugType": "구성의 형식입니다.", + "debugTypeNotRecognised": "이 디버그 형식은 인식되지 않습니다. 해당하는 디버그 확장을 설치하세요.", "node2NotSupported": "\"node2\"는 더 이상 지원되지 않습니다. 대신 \"node\"를 사용하고 \"protocol\" 특성을 \"inspector\"로 설정하세요.", "debugName": "구성 이름이며, 구성 시작 드롭다운 메뉴에 표시됩니다.", "debugRequest": "구성 형식을 요청합니다. \"시작\" 또는 \"연결\"일 수 있습니다.", diff --git a/i18n/kor/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json index f4bb6b4c431..1d9370c72b0 100644 --- a/i18n/kor/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json @@ -4,6 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "vscode.extension.contributes.view": "사용자 지정 뷰를 적용합니다.", + "vscode.extension.contributes.view.id": "vscode.workspace.createTreeView를 통해 만든 뷰를 식별하는 데 사용된 고유 ID", + "vscode.extension.contributes.view.label": "뷰를 렌더링하는 데 사용되는 사람이 읽을 수 있는 문자열", + "vscode.extension.contributes.view.icon": "뷰 아이콘의 경로", + "vscode.extension.contributes.views": "사용자 지정 뷰를 적용합니다.", "showViewlet": "{0} 표시", "view": "보기" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index d8fa05234c4..474bdeb6edf 100644 --- a/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -6,6 +6,7 @@ { "openGlobalSettings": "사용자 설정 열기", "openGlobalKeybindings": "바로 가기 키 열기", + "openGlobalKeybindingsFile": "바로 가기 키 파일 열기", "openWorkspaceSettings": "작업 영역 설정 열기", "configureLanguageBasedSettings": "언어별 설정 구성...", "languageDescriptionConfigured": "({0})", diff --git a/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 660da9b820c..c5708dad5de 100644 --- a/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -9,6 +9,7 @@ "ConfigureTaskRunnerAction.quickPick.template": "Task Runner 선택", "ConfigureTaskRunnerAction.autoDetecting": "{0} 작업을 자동 검색 중", "ConfigureTaskRunnerAction.autoDetect": "작업 시스템을 자동으로 감지하지 못했습니다. 기본 템플릿을 사용하는 중입니다. 자세한 내용은 작업 출력을 참조하세요.", + "ConfigureTaskRunnerAction.autoDetectError": "작업 시스템을 자동으로 감지하는 중 오류가 발생했습니다. 자세한 내용은 작업 출력을 참조하세요.", "ConfigureTaskRunnerAction.failed": "'.vscode' 폴더 내에 'tasks.json' 파일을 만들 수 없습니다. 자세한 내용은 작업 출력을 참조하세요.", "ConfigureTaskRunnerAction.label": "Task Runner 구성", "ConfigureBuildTaskAction.label": "빌드 작업 구성", diff --git a/i18n/kor/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index e9cc7e8122e..90ad2a84f59 100644 --- a/i18n/kor/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -14,6 +14,7 @@ "noIconThemeDesc": "파일 아이콘 사용 안 함", "problemChangingIconTheme": "아이콘 테마를 설정하는 동안 문제 발생: {0}", "themes.selectIconTheme": "파일 아이콘 테마 선택", + "generateColorTheme.label": "현재 설정에서 색 테마 생성", "preferences": "기본 설정", "developer": "개발자" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json b/i18n/kor/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json index e579f606de7..7f6ec89a740 100644 --- a/i18n/kor/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "walkThrough.unboundCommand": "바인딩 안 됨" + "walkThrough.unboundCommand": "바인딩 안 됨", + "walkThrough.gitNotFound": "Git가 시스템에 설치되지 않은 것 같습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json b/i18n/kor/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json index ef85a3ba9f6..67d59d097a5 100644 --- a/i18n/kor/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json +++ b/i18n/kor/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json @@ -6,5 +6,6 @@ { "schema.colors": "구문 강조 표시를 위한 색", "schema.properties.name": "규칙에 대한 설명", - "schema.fontStyle": "규칙의 글꼴 스타일: '기울임꼴, '굵게' 및 '밑줄' 중 하나 또는 이들의 조합" + "schema.fontStyle": "규칙의 글꼴 스타일: '기울임꼴, '굵게' 및 '밑줄' 중 하나 또는 이들의 조합", + "schema.tokenColors.path": "tmTheme 파일의 경로(현재 파일의 상대 경로)" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json b/i18n/kor/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json index 622950f98f8..1acfa7a4ff4 100644 --- a/i18n/kor/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json +++ b/i18n/kor/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "error.cannotparsejson": "JSON 테마 파일을 구문 분석하는 중 문제 발생: {0}" + "error.cannotparsejson": "JSON 테마 파일을 구문 분석하는 중 문제 발생: {0}", + "error.invalidformat.colors": "색 테마 파일 {0}을(를) 구문 분석하는 중 문제가 발생했습니다. 'colors' 속성이 'object' 형식이 아닙니다.", + "error.invalidformat.tokenColors": "색 테마 파일 {0}을(를) 구문 분석하는 중 문제가 발생했습니다. 'tokenColors' 속성이 'object' 형식이 아닙니다. 'tokenColors' 속성은 색을 지정하는 배열 또는 텍스트 짝 테마 파일의 경로여야 합니다.", + "error.plist.invalidformat": "tmTheme 파일 {0}을(를) 구문 분석하는 중 문제가 발생했습니다. 'settings'가 배열이 아닙니다.", + "error.cannotparse": "tmTheme 파일 {0}을(를) 구문 분석하는 중 문제가 발생했습니다.", + "error.cannotload": "tmTheme 파일 {0}을(를) 로드하는 중 문제가 발생했습니다. {1}" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/kor/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index b9570259fd2..dc5e319d6e7 100644 --- a/i18n/kor/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/kor/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -25,5 +25,8 @@ "colorThemeError": "Theme is unknown or not installed.", "iconTheme": "Specifies the icon theme used in the workbench.", "noIconThemeDesc": "No file icons", - "iconThemeError": "File icon theme is unknown or not installed." + "iconThemeError": "File icon theme is unknown or not installed.", + "workbenchColors": "현재 선택한 색 테마에서 색을 재정의합니다.", + "workbenchColors.deprecated": "이 설정은 더 이상 실험적 설정이 아니며 이름이\n 'workbench.colorCustomizations'로 변경되었습니다.", + "workbenchColors.deprecatedDescription": "대신 'workbench.colorCustomizations'를 사용합니다." } \ No newline at end of file diff --git a/i18n/rus/extensions/git/package.i18n.json b/i18n/rus/extensions/git/package.i18n.json index 071a37d0e5b..5236c98c974 100644 --- a/i18n/rus/extensions/git/package.i18n.json +++ b/i18n/rus/extensions/git/package.i18n.json @@ -40,5 +40,7 @@ "config.enableLongCommitWarning": "Следует ли предупреждать о длинных сообщениях о фиксации", "config.confirmSync": "Подтвердите синхронизацию репозиториев GIT.", "config.countBadge": "\nУправляет счетчиком Git. При указании значения \"all\" подсчитываются все изменения, при указании значения \"tracked\" — только отслеживаемые изменения, при указании значения \"off\" счетчик отключается.", - "config.checkoutType": "Определяет типы ветвей, которые выводятся при выборе пункта меню \"Извлечь в...\". При указании значения \"all\" отображаются все ссылки, \"local\" — только локальные ветви, \"tags\" — только теги, а \"remote\" — только удаленные ветви." + "config.checkoutType": "Определяет типы ветвей, которые выводятся при выборе пункта меню \"Извлечь в...\". При указании значения \"all\" отображаются все ссылки, \"local\" — только локальные ветви, \"tags\" — только теги, а \"remote\" — только удаленные ветви.", + "config.ignoreLegacyWarning": "Игнорирует предупреждение об устаревшей версии Git", + "config.ignoreLimitWarning": "Игнорировать предупреждение, когда в репозитории слишком много изменений" } \ No newline at end of file diff --git a/i18n/rus/extensions/typescript/package.i18n.json b/i18n/rus/extensions/typescript/package.i18n.json index 3a3b4907099..683ce96350f 100644 --- a/i18n/rus/extensions/typescript/package.i18n.json +++ b/i18n/rus/extensions/typescript/package.i18n.json @@ -11,6 +11,8 @@ "typescript.tsdk.desc": "Указывает путь к папке, содержащей файлы tsserver и lib*.d.ts, которые необходимо использовать.", "typescript.disableAutomaticTypeAcquisition": "Отключает автоматическое получение типа. Требуется TypeScript 2.0.6 и более поздней версии и перезапуск после его изменения.", "typescript.check.tscVersion": "Проверка отличия компилятора TypeScript глобальной установки (например, tsc) от используемой языковой службы TypeScript.", + "typescript.tsserver.log": "Включает ведение журнала для сервера TS. Этот журнал можно использовать для диагностики проблем сервера TS. В журнале могут содержаться пути к файлам, исходный код и другие сведения из вашего проекта, в том числе носящие конфиденциальный характер.", + "typescript.tsserver.trace": "Включает трассировку сообщений, отправляемых на сервер TS. Эту трассировку можно использовать для диагностики проблем сервера TS. Трассировка может содержать пути к файлам, исходный код и другие сведения из вашего проекта, в том числе конфиденциальные данные.", "typescript.tsserver.experimentalAutoBuild": "Включает экспериментальную автосборку. Требуется версия 1.9 dev или версия 2.x tsserver и перезапуск VS Code после изменения.", "typescript.validate.enable": "Включение или отключение проверки TypeScript.", "typescript.format.enable": "Включение или отключение модуля форматирования TypeScript по умолчанию.", diff --git a/i18n/rus/src/vs/code/electron-main/menus.i18n.json b/i18n/rus/src/vs/code/electron-main/menus.i18n.json index 44d0d0569f3..d970ca1ef1c 100644 --- a/i18n/rus/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/rus/src/vs/code/electron-main/menus.i18n.json @@ -7,6 +7,8 @@ "mFile": "&&Файл", "mEdit": "&&Изменить", "mSelection": "&&Выделений", + "mView": "&&Просмотреть", + "mGoto": "&&Перейти", "mDebug": "&&Отладка", "mWindow": "Окно", "mHelp": "&&Справка", @@ -29,6 +31,7 @@ "miCloseWindow": "Закрыть &&окно", "miCloseFolder": "Закрыть &&папку", "miCloseEditor": "&&Закрыть редактор", + "miExit": "В&&ыход", "miOpenSettings": "&&Параметры", "miOpenKeymap": "&&Сочетания клавиш", "miOpenKeymapExtensions": "&&Расширения раскладки клавиатуры", @@ -40,6 +43,7 @@ "miClearRecentOpen": "Очистить последние файлы", "miUndo": "Отменить", "miRedo": "Вернуть", + "miCut": "Вы&&резать", "miCopy": "Копировать", "miPaste": "Вставить", "miFind": "Найти", @@ -93,6 +97,7 @@ "miZoomIn": "&&Увеличить", "miZoomOut": "У&&меньшить", "miZoomReset": "&&Сбросить масштаб", + "miBack": "&&Назад", "miForward": "&&Вперед", "miNextEditor": "&&Следующий редактор", "miPreviousEditor": "&&Предыдущий редактор", diff --git a/i18n/rus/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/rus/src/vs/workbench/browser/parts/editor/editorActions.i18n.json index 2259656b83f..e8ab2008c46 100644 --- a/i18n/rus/src/vs/workbench/browser/parts/editor/editorActions.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -44,6 +44,8 @@ "openPreviousRecentlyUsedEditorInGroup": "Открыть предыдущий недавно использованный редактор в группе", "openNextRecentlyUsedEditorInGroup": "Открыть следующий недавно использованный редактор в группе", "navigateEditorHistoryByInput": "Открыть предыдущий редактор из журнала", + "openNextRecentlyUsedEditor": "Открыть следующий недавно использованный редактор", + "openPreviousRecentlyUsedEditor": "Открыть предыдущий недавно использованный редактор", "clearEditorHistory": "Очистить журнал редактора", "focusLastEditorInStack": "Открыть последний редактор в группе", "moveEditorLeft": "Переместить редактор влево", diff --git a/i18n/rus/src/vs/workbench/common/theme.i18n.json b/i18n/rus/src/vs/workbench/common/theme.i18n.json index bf046e99759..f3d59ca959e 100644 --- a/i18n/rus/src/vs/workbench/common/theme.i18n.json +++ b/i18n/rus/src/vs/workbench/common/theme.i18n.json @@ -12,8 +12,11 @@ "tabActiveEditorGroupInactiveForeground": "Цвет переднего плана активной вкладки в неактивной группе. Вкладки — это контейнеры для редакторов в области редактора. В одной группе редакторов можно открыть несколько вкладок. Может присутствовать несколько групп редакторов.", "tabInactiveEditorGroupActiveForeground": "Цвет переднего плана неактивной вкладки в активной группе. Вкладки — это контейнеры для редакторов в области редактора. В одной группе редакторов можно открыть несколько вкладок. Может присутствовать несколько групп редакторов.", "tabInactiveEditorGroupInactiveForeground": "Цвет переднего плана неактивной вкладки в неактивной группе. Вкладки — это контейнеры для редакторов в области редактора. В одной группе редакторов можно открыть несколько вкладок. Может присутствовать несколько групп редакторов.", + "editorGroupBackground": "Цвет фона группы редакторов. Группы редакторов представляют собой контейнеры редакторов. Цвет фона отображается при перетаскивании групп редакторов.", + "editorGroupHeaderBackground": "Цвет фона для заголовка группы редакторов, когда вкладки отключены. Группы редакторов представляют собой контейнеры редакторов.", "editorGroupBorder": "Цвет для разделения нескольких групп редакторов. Группы редакторов — это контейнеры редакторов.", "editorDragAndDropBackground": "Цвет фона при перетаскивании редакторов.", + "editorMasterDetailsBorder": "Цвет контура для отделения сведений от главной панели для параллельных редакторов. К примерам таких редакторов относятся редакторы несовпадений и редактор параметров.", "panelBackground": "Цвет фона панели. Панели показаны под областью редактора и содержат такие представления, как выходные данные и встроенный терминал.", "panelBorder": "Цвет верхней границы панели, отделяющей ее от редактора. Панели показаны под областью редактора и содержат такие представления, как выходные данные и встроенный терминал.", "panelActiveTitleForeground": "Цвет заголовка для активной панели. Панели отображаются под областью редактора и содержат такие представления, как окно вывода и встроенный терминал.", @@ -24,14 +27,20 @@ "statusBarNoFolderBackground": "Цвет фона панели состояния, если папка не открыта. Панель состояния отображается внизу окна.", "statusBarItemActiveBackground": "Цвет фона элементов панели состояния при щелчке. Панель состояния отображается внизу окна.", "statusBarItemHoverBackground": "Цвет фона элементов панели состояния при наведении. Панель состояния отображается внизу окна.", + "statusBarProminentItemBackground": "Цвет фона приоритетных элементов панели состояния. Приоритетные элементы выделяются на фоне других элементов панели состояния, чтобы подчеркнуть их значение. Панель состояния отображается в нижней части окна.", + "statusBarProminentItemHoverBackground": "Цвет фона приоритетных элементов панели состояния при наведении. Приоритетные элементы выделяются на фоне других элементов панели состояния, чтобы подчеркнуть их значение. Панель состояния отображается в нижней части окна.", "activityBarBackground": "Цвет фона панели действий. Панель действий отображается слева или справа и позволяет переключаться между представлениями боковой панели.", + "activityBarForeground": "Цвет переднего плана панели действий (например, цвет, используемый для значков). Панель действий отображается слева или справа и позволяет переключаться между представлениями боковой панели.", "activityBarDragAndDropBackground": "Цвет обратной связи при перетаскивании для элементов панели действий. Панель действий отображается слева или справа и позволяет переключаться между представлениями боковой панели.", "activityBarBadgeBackground": "Цвет фона значка уведомлений о действиях. Панель действий отображается слева или справа и позволяет переключаться между представлениями боковой панели.", "activityBarBadgeForeground": "Цвет переднего плана значка уведомлений о действиях. Панель действий отображается слева или справа и позволяет переключаться между представлениями боковой панели.", "sideBarBackground": "Цвет фона боковой панели. Боковая панель — это контейнер таких представлений, как проводник и поиск.", "sideBarTitleForeground": "Цвет переднего плана заголовка боковой панели. Боковая панель — это контейнер для таких представлений, как проводник и поиск.", + "sideBarSectionHeaderBackground": "Цвет фона для заголовка раздела боковой панели. Боковая панель — это контейнер для таких представлений, как проводник и поиск.", "titleBarActiveForeground": "Передний план панели заголовка, если окно активно. Обратите внимание, что этот цвет сейчас поддерживается только в macOS.", "titleBarInactiveForeground": "Передний план панели заголовка, если окно неактивно. Обратите внимание, что этот цвет сейчас поддерживается только в macOS.", "titleBarActiveBackground": "Фон панели заголовка, если окно активно. Обратите внимание, что этот цвет сейчас поддерживается только в macOS.", - "titleBarInactiveBackground": "Фон панели заголовка, если окно неактивно. Обратите внимание, что этот цвет сейчас поддерживается только в macOS." + "titleBarInactiveBackground": "Фон панели заголовка, если окно неактивно. Обратите внимание, что этот цвет сейчас поддерживается только в macOS.", + "notificationsForeground": "Цвет переднего плана для уведомлений. Уведомления отображаются в верхней части окна.", + "notificationsBackground": "Цвет фона для уведомлений. Уведомления отображаются в верхней части окна." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json index 68ba046d916..f2bf9369173 100644 --- a/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -20,6 +20,7 @@ "statusBarVisibility": "Управляет видимостью строки состояния в нижней части рабочего места.", "activityBarVisibility": "Управляет видимостью панели действий на рабочем месте.", "closeOnFileDelete": "Определяет, следует ли автоматически закрывать редакторы, когда отображаемый в них файл удален или переименован другим процессом. При отключении этой функции редактор остается открытым в качестве черновика. Обратите внимание, что при удалении из приложения редактор закрывается всегда и что файлы черновиков никогда не закрываются для сохранения данных.", + "swipeToNavigate": "Переключайтесь между открытыми файлами, проводя по экрану по горизонтали тремя пальцами.", "workbenchConfigurationTitle": "Workbench", "window.openFilesInNewWindow.on": "Файлы будут открываться в новом окне.", "window.openFilesInNewWindow.off": "Файлы будут открываться в окне с открытой папкой файлов или последнем активном окне.", @@ -48,10 +49,12 @@ "menuBarVisibility": "Определяет видимость строки меню. Значение toggle указывает, что строка меню скрыта и для ее вывода нужно один раз нажать клавишу ALT. По умолчанию строка меню не будет отображаться только в полноэкранном режиме.", "autoDetectHighContrast": "Если включено, будет выполняться автоматический переход к высококонтрастной теме, если в Windows используется тема высокой контрастности, или к темной теме при выходе из темы высокой контрастности Windows.", "titleBarStyle": "Настройка внешнего вида заголовка окна. Чтобы применить изменения, потребуется полный перезапуск.", + "window.nativeTabs": "Включает вкладки окна macOS Sierra. Обратите внимание, что для применения этих изменений потребуется полная перезагрузка, и что для всех внутренних вкладок будет отключен пользовательский стиль заголовка, если он был настроен.", "windowConfigurationTitle": "Окно", "zenModeConfigurationTitle": "Режим Zen", "zenMode.fullScreen": "Определяет, будет ли переключение в режим Zen переключать рабочее пространство в полноэкранный режим.", "zenMode.hideTabs": "Определяет, будет ли включение режима Zen также скрывать вкладки рабочего места.", "zenMode.hideStatusBar": "Определяет, будет ли включение режима Zen также скрывать строку состояния в нижней части рабочего места.", + "zenMode.hideActivityBar": "Определяет, будет ли при включении режима Zen скрыта панель действий в левой части рабочей области.", "zenMode.restore": "Определяет, должно ли окно восстанавливаться в режиме Zen, если закрылось в режиме Zen." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json b/i18n/rus/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json index 8b6ad71cd4e..5e643a61203 100644 --- a/i18n/rus/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "workbench.action.inspectKeyMap": "Разработчик: исследование сопоставлений ключей" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index d73136084f2..0a2abc6c1db 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -34,6 +34,7 @@ "editConditionalBreakpoint": "Изменить точку останова…", "setValue": "Задать значение", "addWatchExpression": "Добавить выражение", + "editWatchExpression": "Изменить выражение", "addToWatchExpressions": "Добавить контрольное значение", "removeWatchExpression": "Удалить выражение", "removeAllWatchExpressions": "Удалить все выражения", diff --git a/i18n/rus/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json index 8b6ad71cd4e..6543390a263 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "debugToolBarBackground": "Цвет фона для панели инструментов отладки." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json index a0a2e364335..9c4ea4ee975 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -15,5 +15,6 @@ "allowBreakpointsEverywhere": "Разрешает задание точки останова в любом файле", "openExplorerOnEnd": "Автоматически открывать представление обозревателя в конце сеанса отладки", "inlineValues": "Показывать значения переменных в редакторе во время отладки", - "hideActionBar": "Определяет, следует ли скрыть всплывающую панель действий отладки." + "hideActionBar": "Определяет, следует ли скрыть всплывающую панель действий отладки.", + "launch": "Глобальная конфигурация запуска отладки. Должна использоваться в качестве альтернативы для конфигурации \"launch.json\", которая является общей для рабочих пространств" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 88d355f7a27..8ea4b501a1e 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,6 +7,7 @@ "debugAdapterBinNotFound": "Исполняемый файл адаптера отладки \"{0}\" не существует.", "debugAdapterCannotDetermineExecutable": "Невозможно определить исполняемый файл для адаптера отладки \"{0}\".", "debugType": "Тип конфигурации.", + "debugTypeNotRecognised": "Не удается распознать тип отладки. Установите соответствующее расширение отладки.", "node2NotSupported": "Значение \"node2\" больше не поддерживается; используйте \"node\" и задайте для атрибута \"protocol\" значение \"inspector\".", "debugName": "Имя конфигурации; отображается в раскрывающемся меню конфигурации запуска.", "debugRequest": "Запросите тип конфигурации. Возможные типы: \"запуск\" и \"подключение\".", diff --git a/i18n/rus/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json index 91e553b6c73..2322bd36fa8 100644 --- a/i18n/rus/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json @@ -4,6 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "vscode.extension.contributes.view": "Добавляет пользовательское представление", + "vscode.extension.contributes.view.id": "Уникальный идентификатор представления, созданного с помощью vscode.workspace.createTreeView", + "vscode.extension.contributes.view.label": "Строка для отображения представления в понятном для пользователя формате", + "vscode.extension.contributes.view.icon": "Путь к значку представления", + "vscode.extension.contributes.views": "Добавляет пользовательские представления", "showViewlet": "Показать {0}", "view": "Просмотреть" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 6d9a00632d2..6380e0caa1e 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "reallyRecommended2": "Расширение '{0}' не рекомендуется для этого типа файлов.", "showRecommendations": "Показать рекомендации", "neverShowAgain": "Больше не показывать", "close": "Закрыть", diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index 183b5ea9535..325a13dfd7a 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -8,6 +8,7 @@ "extensions": "Расширения", "sort by installs": "Сортировать по: числу установок", "sort by rating": "Сортировать по: рейтинг", + "sort by name": "Сортировать по: название", "no extensions found": "Расширений не найдено.", "suggestProxyError": "Marketplace вернул значение \"ECONNREFUSED\". Проверьте параметр \"http.proxy\".", "outdatedExtensions": "Устаревшие расширения: {0}" diff --git a/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index 29ff1ceed65..4338bc61e7b 100644 --- a/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -7,6 +7,7 @@ "keybindingsInputName": "Сочетания клавиш", "SearchKeybindings.AriaLabel": "Поиск настраиваемых сочетаний клавиш", "SearchKeybindings.Placeholder": "Поиск настраиваемых сочетаний клавиш", + "sortByPrecedene": "Сортировать по приоритету", "header-message": "Для использования расширенных настроек откройте и измените", "keybindings-file-name": "keybindings.json", "keybindingsLabel": "Настраиваемые сочетания клавиш", @@ -14,6 +15,7 @@ "addLabel": "Добавить настраиваемое сочетание клавиш", "removeLabel": "Удаление настраиваемого сочетания клавиш", "resetLabel": "Сбросить настраиваемое сочетание клавиш", + "showConflictsLabel": "Показать конфиликты", "copyLabel": "Копировать", "error": "Произошла ошибка \"{0}\" при редактировании настраиваемого сочетания клавиш. Откройте и проверьте файл \"keybindings.json\".", "command": "Команда", diff --git a/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index dd62a90ff3e..b82ad2f758e 100644 --- a/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -6,6 +6,7 @@ { "openGlobalSettings": "Открыть пользовательские параметры", "openGlobalKeybindings": "Открыть сочетания клавиш", + "openGlobalKeybindingsFile": "Открыть файл сочетаний клавиш", "openWorkspaceSettings": "Открыть параметры рабочей области", "configureLanguageBasedSettings": "Настроить параметры языка...", "languageDescriptionConfigured": "({0})", diff --git a/i18n/rus/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.i18n.json b/i18n/rus/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.i18n.json index 2ecce32e28a..01326f09a14 100644 --- a/i18n/rus/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.i18n.json @@ -5,5 +5,7 @@ // Do not edit this file. It is machine generated. { "default": "По умолчанию", - "user": "Пользователь" + "user": "Пользователь", + "meta": "meta", + "option": "параметр" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/search/browser/replaceService.i18n.json b/i18n/rus/src/vs/workbench/parts/search/browser/replaceService.i18n.json index 8b6ad71cd4e..7f4464d3a78 100644 --- a/i18n/rus/src/vs/workbench/parts/search/browser/replaceService.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/search/browser/replaceService.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "fileReplaceChanges": "{0} ↔ {1} (заменить предварительную версию)" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index c172163eb52..da2bdae0add 100644 --- a/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -9,6 +9,7 @@ "ConfigureTaskRunnerAction.quickPick.template": "Выбрать средство выполнения задач", "ConfigureTaskRunnerAction.autoDetecting": "Автообнаружение задач для {0}", "ConfigureTaskRunnerAction.autoDetect": "Не удалось автоматически определить систему задачи, используется шаблон по умолчанию. Подробности см. в выходных данных задачи.", + "ConfigureTaskRunnerAction.autoDetectError": "При определении системы задачи возникли ошибки. Дополнительные сведения см. в выходных данных задачи.", "ConfigureTaskRunnerAction.failed": "Не удается создать файл tasks.json в папке .vscode. Подробности см. в выходных данных задачи.", "ConfigureTaskRunnerAction.label": "Настроить средство выполнения задач", "ConfigureBuildTaskAction.label": "Настроить задачу сборки", diff --git a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index 03b66cf3c55..4523bac1924 100644 --- a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -16,6 +16,7 @@ "terminal.integrated.fontLigatures": "Определяет, будут ли включены лигатуры шрифтов для терминала.", "terminal.integrated.fontSize": "Определяет размер шрифта (в пикселях) для терминала.", "terminal.integrated.lineHeight": "Определяет высоту строки терминала; это число умножается на размер шрифта терминала, что дает фактическую высоту строки в пикселях.", + "terminal.integrated.enableBold": "Следует ли разрешить полужирный текст в терминале. Эта функция должна поддерживаться оболочкой терминала.", "terminal.integrated.cursorBlinking": "Управляет миганием курсора терминала.", "terminal.integrated.cursorStyle": "Определяет стиль курсора терминала.", "terminal.integrated.scrollback": "Определяет предельное число строк в буфере терминала.", diff --git a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.i18n.json b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.i18n.json index 1ed48f98d58..d683bd1c3d9 100644 --- a/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "terminal.integrated.allowWorkspaceShell": "Вы хотите разрешить запуск {0} (определяется как параметр рабочей области) в терминале?", "allow": "Allow", "disallow": "Disallow" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index ab56be435f7..7cd864203ea 100644 --- a/i18n/rus/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -14,6 +14,7 @@ "noIconThemeDesc": "Отключить значки файлов", "problemChangingIconTheme": "Проблема при задании темы значка: {0}", "themes.selectIconTheme": "Выбрать тему значка файла", + "generateColorTheme.label": "Создать цветовую тему на основе текущих параметров", "preferences": "Параметры", "developer": "Разработчик" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json b/i18n/rus/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json index d599004ee21..c86c05dcae5 100644 --- a/i18n/rus/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "walkThrough.unboundCommand": "свободный" + "walkThrough.unboundCommand": "свободный", + "walkThrough.gitNotFound": "Похоже, Git не установлен в вашей системе." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json b/i18n/rus/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json index c953639514d..9f08b3aed1f 100644 --- a/i18n/rus/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json +++ b/i18n/rus/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json @@ -6,5 +6,6 @@ { "schema.colors": "Цвета для выделения синтаксических конструкций", "schema.properties.name": "Описание правила", - "schema.fontStyle": "Начертание шрифта для правила: один либо сочетание курсива, полужирного и подчеркивания." + "schema.fontStyle": "Начертание шрифта для правила: один либо сочетание курсива, полужирного и подчеркивания.", + "schema.tokenColors.path": "Путь к файлу tmTheme (по отношению к текущему файлу)" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json b/i18n/rus/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json index 34c882751ea..ac6d9076357 100644 --- a/i18n/rus/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json +++ b/i18n/rus/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json @@ -4,5 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "error.cannotparsejson": "Возникли проблемы при анализе файла JSON THEME: {0}." + "error.cannotparsejson": "Возникли проблемы при анализе файла JSON THEME: {0}.", + "error.invalidformat.colors": "Ошибка при анализе файла цветовой темы: {0}. Свойство 'colors' не имеет тип 'object'.", + "error.invalidformat.tokenColors": "Ошибка при анализе файла цветовой темы: {0}. Свойство 'tokenColors' должно содержать массив цветов или путь к текстовому файлу цветовой темы", + "error.plist.invalidformat": "Ошибка при анализе файла tmTheme: {0}. 'settings' не является массивом.", + "error.cannotparse": "Ошибка при анализе файла tmTheme: {0}", + "error.cannotload": "Ошибка при загрузке файла tmTheme {0}: {1}" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/rus/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index 2701a620e30..f7243407022 100644 --- a/i18n/rus/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/rus/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -25,5 +25,8 @@ "colorThemeError": "Theme is unknown or not installed.", "iconTheme": "Specifies the icon theme used in the workbench.", "noIconThemeDesc": "No file icons", - "iconThemeError": "File icon theme is unknown or not installed." + "iconThemeError": "File icon theme is unknown or not installed.", + "workbenchColors": "Переопределяет цвета из выбранной цветовой темы.", + "workbenchColors.deprecated": "Параметр больше не является экспериментальным и был переименован в 'workbench.colorCustomizations'", + "workbenchColors.deprecatedDescription": "Используйте параметр 'workbench.colorCustomizations'" } \ No newline at end of file From 76ec19f240150ea86729286c129a72d845adb10a Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 4 May 2017 13:01:01 -0700 Subject: [PATCH 0104/1164] Monokai: Use standard fg for list highlight Fixes #25868 --- extensions/theme-monokai/themes/monokai-color-theme.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/theme-monokai/themes/monokai-color-theme.json b/extensions/theme-monokai/themes/monokai-color-theme.json index b9331a910c2..7f54f825424 100644 --- a/extensions/theme-monokai/themes/monokai-color-theme.json +++ b/extensions/theme-monokai/themes/monokai-color-theme.json @@ -13,7 +13,7 @@ "list.inactiveSelectionBackground": "#414339", "list.hoverBackground": "#272822", "list.dropBackground": "#414339", - "list.highlightForeground": "#75715E", + "list.highlightForeground": "#f8f8f2", "button.background": "#75715E", "editor.background": "#272822", "editor.foreground": "#f8f8f2", From 0a6066eebffb8d760ddfe65539d5ead41dbb7766 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 4 May 2017 22:18:58 +0200 Subject: [PATCH 0105/1164] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 49f1836ee4e..ffb1d379bcb 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "code-oss-dev", "version": "1.13.0", "electronVersion": "1.6.6", - "distro": "c1989b3e8a8516b92a46c359eba624fb9f812201", + "distro": "bb676c1d1f91a0c6d3050d8ca8a49ba7743108c5", "author": { "name": "Microsoft Corporation" }, From d6c61a0e12493068d2da532fdf866eb5fc3201fb Mon Sep 17 00:00:00 2001 From: Bradley Meck Date: Thu, 4 May 2017 18:21:08 -0500 Subject: [PATCH 0106/1164] Add .mjs to known JavaScript file extensions (#25747) Also add .es6 in missing places --- extensions/javascript/package.json | 3 ++- extensions/javascript/syntaxes/JavaScript.tmLanguage.json | 4 +++- extensions/markdown/syntaxes/gulpfile.js | 2 +- extensions/markdown/syntaxes/markdown.tmLanguage | 2 +- extensions/typescript/build/update-grammars.js | 2 +- extensions/typescript/src/typescriptMain.ts | 2 +- src/vs/base/test/node/glob.test.ts | 4 ++-- 7 files changed, 11 insertions(+), 8 deletions(-) diff --git a/extensions/javascript/package.json b/extensions/javascript/package.json index aeb014688ae..b8c76ba64aa 100644 --- a/extensions/javascript/package.json +++ b/extensions/javascript/package.json @@ -41,7 +41,8 @@ ], "extensions": [ ".js", - ".es6" + ".es6", + ".mjs" ], "filenames": [ "jakefile" diff --git a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json index bda3bd858cd..7d5f08c0d49 100644 --- a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json @@ -3,7 +3,9 @@ "scopeName": "source.js", "fileTypes": [ ".js", - ".jsx" + ".jsx", + ".es6", + ".mjs" ], "uuid": "805375ec-d614-41f5-8993-5843fe63ea82", "patterns": [ diff --git a/extensions/markdown/syntaxes/gulpfile.js b/extensions/markdown/syntaxes/gulpfile.js index f57cb80fb9d..a01ff06499c 100644 --- a/extensions/markdown/syntaxes/gulpfile.js +++ b/extensions/markdown/syntaxes/gulpfile.js @@ -34,7 +34,7 @@ const languages = [ { name: 'groovy', identifiers: ['groovy', 'gvy'], source: 'source.groovy' }, { name: 'jade', identifiers: ['jade'], source: 'text.jade' }, - { name: 'js', identifiers: ['js', 'jsx', 'javascript'], source: 'source.js' }, + { name: 'js', identifiers: ['js', 'jsx', 'javascript', 'es6', 'mjs'], source: 'source.js' }, { name: 'js_regexp', identifiers: ['regexp'], source: 'source.js.regexp' }, { name: 'json', identifiers: ['json', 'sublime-settings', 'sublime-menu', 'sublime-keymap', 'sublime-mousemap', 'sublime-theme', 'sublime-build', 'sublime-project', 'sublime-completions'], source: 'source.json' }, { name: 'less', identifiers: ['less'], source: 'source.css.less' }, diff --git a/extensions/markdown/syntaxes/markdown.tmLanguage b/extensions/markdown/syntaxes/markdown.tmLanguage index df4657d2014..38d1292f7e4 100644 --- a/extensions/markdown/syntaxes/markdown.tmLanguage +++ b/extensions/markdown/syntaxes/markdown.tmLanguage @@ -1965,7 +1965,7 @@ fenced_code_block_js begin - (^|\G)(\s*)([`~]{3,})\s*((js|jsx|javascript)(\s+[^`~]*)?$) + (^|\G)(\s*)([`~]{3,})\s*((js|jsx|javascript|es6|mjs)(\s+[^`~]*)?$) name markup.fenced_code.block.markdown end diff --git a/extensions/typescript/build/update-grammars.js b/extensions/typescript/build/update-grammars.js index 2ce6ee9d828..c38d6f10510 100644 --- a/extensions/typescript/build/update-grammars.js +++ b/extensions/typescript/build/update-grammars.js @@ -8,7 +8,7 @@ var updateGrammar = require('../../../build/npm/update-grammar'); function adaptToJavaScript(grammar) { grammar.name = 'JavaScript (with React support)'; - grammar.fileTypes = ['.js', '.jsx' ]; + grammar.fileTypes = ['.js', '.jsx', '.es6', '.mjs' ]; grammar.scopeName = 'source.js'; var fixScopeNames = function(rule) { diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index cc01c02942b..fbc5b02ce7a 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -84,7 +84,7 @@ export function activate(context: ExtensionContext): void { id: 'javascript', diagnosticSource: 'js', modeIds: [MODE_ID_JS, MODE_ID_JSX], - extensions: ['.js', '.jsx'], + extensions: ['.js', '.jsx', '.es6', '.mjs'], configFile: 'jsconfig.json' } ], context.storagePath, context.globalState, context.workspaceState); diff --git a/src/vs/base/test/node/glob.test.ts b/src/vs/base/test/node/glob.test.ts index c48e8a3edf7..eb9ee5e8756 100644 --- a/src/vs/base/test/node/glob.test.ts +++ b/src/vs/base/test/node/glob.test.ts @@ -15,12 +15,12 @@ suite('Glob', () => { // let patterns = [ // '{**/*.cs,**/*.json,**/*.csproj,**/*.sln}', // '{**/*.cs,**/*.csproj,**/*.sln}', - // '{**/*.ts,**/*.tsx,**/*.js,**/*.jsx,**/*.es6}', + // '{**/*.ts,**/*.tsx,**/*.js,**/*.jsx,**/*.es6,**/*.mjs}', // '**/*.go', // '{**/*.ps,**/*.ps1}', // '{**/*.c,**/*.cpp,**/*.h}', // '{**/*.fsx,**/*.fsi,**/*.fs,**/*.ml,**/*.mli}', - // '{**/*.js,**/*.jsx,**/*.es6}', + // '{**/*.js,**/*.jsx,**/*.es6,**/*.mjs}', // '{**/*.ts,**/*.tsx}', // '{**/*.php}', // '{**/*.php}', From 4fce360efb3d0a51791a79460be2200bd0842974 Mon Sep 17 00:00:00 2001 From: Ilie Halip Date: Fri, 5 May 2017 08:36:40 +0300 Subject: [PATCH 0107/1164] make it possible to change a SCMResourceGroup's label --- src/vs/vscode.d.ts | 2 +- src/vs/workbench/api/node/extHost.protocol.ts | 1 + src/vs/workbench/api/node/extHostSCM.ts | 5 +++++ src/vs/workbench/api/node/mainThreadSCM.ts | 21 +++++++++++++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 5b5cd0a27af..95fd5de30fd 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -4735,7 +4735,7 @@ declare module 'vscode' { /** * The label of this source control resource group. */ - readonly label: string; + label: string; /** * Whether this source control resource group is hidden when it contains diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index d4cd004550a..cf5122a2e90 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -295,6 +295,7 @@ export abstract class MainThreadSCMShape { $registerGroup(sourceControlHandle: number, handle: number, id: string, label: string): void { throw ni(); } $updateGroup(sourceControlHandle: number, handle: number, features: SCMGroupFeatures): void { throw ni(); } + $updateGroupLabel(sourceControlHandle: number, handle: number, label: string): void { throw ni(); } $updateGroupResourceStates(sourceControlHandle: number, groupHandle: number, resources: SCMRawResource[]): void { throw ni(); } $unregisterGroup(sourceControlHandle: number, handle: number): void { throw ni(); } diff --git a/src/vs/workbench/api/node/extHostSCM.ts b/src/vs/workbench/api/node/extHostSCM.ts index 079d623d5dd..9d40839b177 100644 --- a/src/vs/workbench/api/node/extHostSCM.ts +++ b/src/vs/workbench/api/node/extHostSCM.ts @@ -81,6 +81,11 @@ class ExtHostSourceControlResourceGroup implements vscode.SourceControlResourceG return this._label; } + set label(label: string) { + this._label = label; + this._proxy.$updateGroupLabel(this._sourceControlHandle, this._handle, label); + } + private _hideWhenEmpty: boolean | undefined = undefined; get hideWhenEmpty(): boolean | undefined { diff --git a/src/vs/workbench/api/node/mainThreadSCM.ts b/src/vs/workbench/api/node/mainThreadSCM.ts index 42129cde3ec..6223b3e3bc9 100644 --- a/src/vs/workbench/api/node/mainThreadSCM.ts +++ b/src/vs/workbench/api/node/mainThreadSCM.ts @@ -137,6 +137,17 @@ class MainThreadSCMProvider implements ISCMProvider { this._onDidChange.fire(); } + $updateGroupLabel(handle: number, label: string): void { + const group = this._groupsByHandle[handle]; + + if (!group) { + return; + } + + group.label = label; + this._onDidChange.fire(); + } + $updateGroupResourceStates(groupHandle: number, resources: SCMRawResource[]): void { const group = this._groupsByHandle[groupHandle]; @@ -263,6 +274,16 @@ export class MainThreadSCM extends MainThreadSCMShape { provider.$updateGroup(groupHandle, features); } + $updateGroupLabel(sourceControlHandle: number, groupHandle: number, label: string): void { + const provider = this._sourceControls[sourceControlHandle]; + + if (!provider) { + return; + } + + provider.$updateGroupLabel(groupHandle, label); + } + $updateGroupResourceStates(sourceControlHandle: number, groupHandle: number, resources: SCMRawResource[]): void { const provider = this._sourceControls[sourceControlHandle]; From 79f9601273ee32506149e84d1c0e714c15acf9e0 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 4 May 2017 23:37:05 -0700 Subject: [PATCH 0108/1164] Fix configFileWatcher being disposed of incorrectly --- extensions/typescript/src/typescriptMain.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index fbc5b02ce7a..2b3536bb290 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -9,7 +9,7 @@ * ------------------------------------------------------------------------------------------ */ 'use strict'; -import { env, languages, commands, workspace, window, ExtensionContext, Memento, IndentAction, Diagnostic, DiagnosticCollection, Range, Disposable, Uri, MessageItem, TextEditor, FileSystemWatcher, DiagnosticSeverity } from 'vscode'; +import { env, languages, commands, workspace, window, ExtensionContext, Memento, IndentAction, Diagnostic, DiagnosticCollection, Range, Disposable, Uri, MessageItem, TextEditor, DiagnosticSeverity } from 'vscode'; // This must be the first statement otherwise modules might got loaded with // the wrong locale. @@ -418,7 +418,6 @@ class TypeScriptServiceClientHost implements ITypescriptServiceClientHost { private client: TypeScriptServiceClient; private languages: LanguageProvider[]; private languagePerId: ObjectMap; - private configFileWatcher: FileSystemWatcher; private readonly disposables: Disposable[] = []; constructor( @@ -460,7 +459,6 @@ class TypeScriptServiceClientHost implements ITypescriptServiceClientHost { obj.dispose(); } } - this.configFileWatcher.dispose(); } public get serviceClient(): TypeScriptServiceClient { From d1768a78bce98a5ce06373a67631fab49d326955 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 May 2017 09:25:20 +0200 Subject: [PATCH 0109/1164] fix #25959 --- src/vs/editor/contrib/suggest/browser/suggestController.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vs/editor/contrib/suggest/browser/suggestController.ts b/src/vs/editor/contrib/suggest/browser/suggestController.ts index 241c5141a18..95fa44e98ae 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestController.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestController.ts @@ -130,6 +130,9 @@ export class SuggestController implements IEditorContribution { let value = true; if ( this._model.state === State.Auto + && !item.suggestion.command + && !item.suggestion.additionalTextEdits + && !item.suggestion.snippetType && endColumn - startColumn === item.suggestion.insertText.length ) { const oldText = this._editor.getModel().getValueInRange({ From f8ede24fd90af759ee23de89f2baf8b4c5032011 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 May 2017 09:27:09 +0200 Subject: [PATCH 0110/1164] correct snippet handling, #25959 --- src/vs/editor/contrib/suggest/browser/suggestController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggestController.ts b/src/vs/editor/contrib/suggest/browser/suggestController.ts index 95fa44e98ae..09720eae57b 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestController.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestController.ts @@ -132,7 +132,7 @@ export class SuggestController implements IEditorContribution { this._model.state === State.Auto && !item.suggestion.command && !item.suggestion.additionalTextEdits - && !item.suggestion.snippetType + && item.suggestion.snippetType !== 'textmate' && endColumn - startColumn === item.suggestion.insertText.length ) { const oldText = this._editor.getModel().getValueInRange({ From 689a607b9719f955508dc10b5c20366b91635797 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 5 May 2017 10:35:14 +0200 Subject: [PATCH 0111/1164] Always have a size >0 on Chrome for the textarea (#356) --- src/vs/editor/browser/controller/textAreaHandler.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index 9d3c60eaf2a..7b51925e3c7 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -213,7 +213,11 @@ export class TextAreaHandler extends ViewPart { const visibleRange = this._viewHelper.visibleRangeForPositionRelativeToEditor(lineNumber, column); if (visibleRange) { - this._visibleTextArea = new VisibleTextArea(this._viewHelper.getVerticalOffsetForLineNumber(lineNumber), visibleRange.left, 0); + this._visibleTextArea = new VisibleTextArea( + this._viewHelper.getVerticalOffsetForLineNumber(lineNumber), + visibleRange.left, + canUseZeroSizeTextarea ? 0 : 1 + ); this._render(); } From 1ddb778ea389513c394c687f7d7608a34d6dcf27 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 5 May 2017 11:04:25 +0200 Subject: [PATCH 0112/1164] Fixes #13093: Have the font size be really small when the textarea is positioned at the primary cursor --- .../browser/controller/textAreaHandler.ts | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index 7b51925e3c7..b438d95510a 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -111,8 +111,6 @@ export class TextAreaHandler extends ViewPart { this.textArea.setAttribute('aria-haspopup', 'false'); this.textArea.setAttribute('aria-autocomplete', 'both'); - Configuration.applyFontInfo(this.textArea, this._fontInfo); - this.textAreaCover = createFastDomNode(document.createElement('div')); this.textAreaCover.setPosition('absolute'); @@ -267,7 +265,6 @@ export class TextAreaHandler extends ViewPart { // Give textarea same font size & line height as editor, for the IME case (when the textarea is visible) if (e.fontInfo) { this._fontInfo = this._context.configuration.editor.fontInfo; - Configuration.applyFontInfo(this.textArea, this._fontInfo); } if (e.viewInfo.experimentalScreenReader) { this._experimentalScreenReader = this._context.configuration.editor.viewInfo.experimentalScreenReader; @@ -365,7 +362,8 @@ export class TextAreaHandler extends ViewPart { this._visibleTextArea.top - this._scrollTop, this._contentLeft + this._visibleTextArea.left - this._scrollLeft, this._visibleTextArea.width, - this._lineHeight + this._lineHeight, + true ); return; } @@ -391,13 +389,24 @@ export class TextAreaHandler extends ViewPart { } // The primary cursor is in the viewport (at least vertically) => place textarea on the cursor - this._renderInsideEditor(top, left, canUseZeroSizeTextarea ? 0 : 1, canUseZeroSizeTextarea ? 0 : 1); + this._renderInsideEditor( + top, left, + canUseZeroSizeTextarea ? 0 : 1, canUseZeroSizeTextarea ? 0 : 1, + false + ); } - private _renderInsideEditor(top: number, left: number, width: number, height: number): void { + private _renderInsideEditor(top: number, left: number, width: number, height: number, useEditorFont: boolean): void { const ta = this.textArea; const tac = this.textAreaCover; + if (useEditorFont) { + Configuration.applyFontInfo(ta, this._fontInfo); + } else { + ta.setFontSize(1); + ta.setLineHeight(1); + } + ta.setTop(top); ta.setLeft(left); ta.setWidth(width); From 1a4f9ab0e611a83d5d30e6b178e141613a9d5b47 Mon Sep 17 00:00:00 2001 From: Maik Riechert Date: Fri, 5 May 2017 10:15:08 +0100 Subject: [PATCH 0113/1164] show ahead/behind while git syncing reverts fab6f8871ad --- extensions/git/src/statusbar.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/extensions/git/src/statusbar.ts b/extensions/git/src/statusbar.ts index b12dd9664c4..c609d570b9d 100644 --- a/extensions/git/src/statusbar.ts +++ b/extensions/git/src/statusbar.ts @@ -127,7 +127,6 @@ class SyncStatusBar { if (this.state.isSyncRunning) { icon = '$(sync~spin)'; - text = ''; command = ''; tooltip = localize('syncing changes', "Synchronizing changes..."); } From 8b4a17ca41dcc761ff1216f775941a4cb61c94b6 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 5 May 2017 11:43:39 +0200 Subject: [PATCH 0114/1164] Fixes #2773: Ignore replacePreviousChar if the editor has a selection --- .../common/controller/cursorTypeOperations.ts | 7 +++++ .../test/common/controller/cursor.test.ts | 26 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/vs/editor/common/controller/cursorTypeOperations.ts b/src/vs/editor/common/controller/cursorTypeOperations.ts index 13b79a281fe..c564895b614 100644 --- a/src/vs/editor/common/controller/cursorTypeOperations.ts +++ b/src/vs/editor/common/controller/cursorTypeOperations.ts @@ -227,6 +227,13 @@ export class TypeOperations { let commands: CommandResult[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; + if (!cursor.selection.isEmpty()) { + // looks like https://github.com/Microsoft/vscode/issues/2773 + // where a cursor operation occured before a canceled composition + // => ignore composition + commands[i] = null; + continue; + } let pos = cursor.position; let startColumn = Math.max(1, pos.column - replaceCharCnt); let range = new Range(pos.lineNumber, startColumn, pos.lineNumber, pos.column); diff --git a/src/vs/editor/test/common/controller/cursor.test.ts b/src/vs/editor/test/common/controller/cursor.test.ts index 59ea9aa805c..a543e5dac9a 100644 --- a/src/vs/editor/test/common/controller/cursor.test.ts +++ b/src/vs/editor/test/common/controller/cursor.test.ts @@ -3145,6 +3145,32 @@ suite('autoClosingPairs', () => { mode.dispose(); }); + test('issue #2773: Accents (´`¨^, others?) are inserted in the wrong position (Mac)', () => { + let mode = new AutoClosingMode(); + usingCursor({ + text: [ + 'hello', + 'world' + ], + languageIdentifier: mode.getLanguageIdentifier() + }, (model, cursor) => { + assertCursor(cursor, new Position(1, 1)); + + // Typing ` and pressing shift+down on the mac US intl kb layout + // Here we're just replaying what the cursor gets + cursorCommand(cursor, H.CompositionStart, null, 'keyboard'); + cursorCommand(cursor, H.Type, { text: '`' }, 'keyboard'); + moveDown(cursor, true); + cursorCommand(cursor, H.ReplacePreviousChar, { replaceCharCnt: 1, text: '`' }, 'keyboard'); + cursorCommand(cursor, H.ReplacePreviousChar, { replaceCharCnt: 1, text: '`' }, 'keyboard'); + cursorCommand(cursor, H.CompositionEnd, null, 'keyboard'); + + assert.equal(model.getValue(), '`hello\nworld'); + assertCursor(cursor, new Selection(1, 2, 2, 2)); + }); + mode.dispose(); + }); + test('issue #20891: All cursors should do the same thing', () => { let mode = new AutoClosingMode(); usingCursor({ From ccae6f96efd7c4e5598c37210e0c970e1ee18da2 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 5 May 2017 11:58:04 +0200 Subject: [PATCH 0115/1164] Contribute explorer views - Adopt proposed API to contribute explorer views - Adopt extension host and main to contribute explorer views - Implement contributable views in explorer viewlet --- src/vs/vscode.proposed.d.ts | 24 +- src/vs/workbench/api/node/extHost.api.impl.ts | 8 +- .../api/node/extHost.contribution.ts | 4 +- src/vs/workbench/api/node/extHost.protocol.ts | 33 +- ...HostTreeView.ts => extHostExplorerView.ts} | 69 +-- ...dTreeView.ts => mainThreadExplorerView.ts} | 55 ++- src/vs/workbench/browser/viewlet.ts | 3 +- .../electron-browser/workbench.main.ts | 3 +- .../browser/explorer.contribution.ts | 10 + .../parts/explorers/browser/explorerView.ts | 407 ++++++++++++++++++ .../parts/explorers/common/explorer.ts | 36 ++ .../parts/files/browser/explorerViewlet.ts | 133 +++--- 12 files changed, 624 insertions(+), 161 deletions(-) rename src/vs/workbench/api/node/{extHostTreeView.ts => extHostExplorerView.ts} (66%) rename src/vs/workbench/api/node/{mainThreadTreeView.ts => mainThreadExplorerView.ts} (51%) create mode 100644 src/vs/workbench/parts/explorers/browser/explorer.contribution.ts create mode 100644 src/vs/workbench/parts/explorers/browser/explorerView.ts create mode 100644 src/vs/workbench/parts/explorers/common/explorer.ts diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index f72a9baa873..60d118eefc6 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -530,20 +530,20 @@ declare module 'vscode' { export namespace window { /** - * Create a new [TreeView](#TreeView) instance. + * Create a new explorer view. * - * @param viewId A unique id that identifies the view. - * @param provider A [TreeDataProvider](#TreeDataProvider). - * @return An instance of [TreeView](#TreeView). + * @param id View id. + * @param name View name. + * @param dataProvider A [TreeDataProvider](#TreeDataProvider). + * @return An instance of [View](#View). */ - export function createTreeView(viewId: string, provider: TreeDataProvider): TreeView; + export function createExplorerView(id: string, name: string, dataProvider: TreeDataProvider): View; } /** - * An source control is able to provide [resource states](#SourceControlResourceState) - * to the editor and interact with the editor in several source control related ways. + * A view to interact with nodes */ - export interface TreeView { + export interface View { /** * Refresh the given nodes @@ -602,6 +602,14 @@ declare module 'vscode' { */ getHasChildren?(node: T): boolean; + /** + * Provider a context key to be set for the node. This can be used to describe actions for each node. + * + * @param node The node from which the provider computes context key. + * @return A context key. + */ + getContextKey?(node: T): string; + /** * Get the command to execute when `node` is clicked. * diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 4b84e46809a..b1e56a9c7e1 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -18,7 +18,7 @@ import { ExtHostDocuments } from 'vs/workbench/api/node/extHostDocuments'; import { ExtHostDocumentSaveParticipant } from 'vs/workbench/api/node/extHostDocumentSaveParticipant'; import { ExtHostConfiguration } from 'vs/workbench/api/node/extHostConfiguration'; import { ExtHostDiagnostics } from 'vs/workbench/api/node/extHostDiagnostics'; -import { ExtHostTreeView } from 'vs/workbench/api/node/extHostTreeView'; +import { ExtHostExplorerView } from 'vs/workbench/api/node/extHostExplorerView'; import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace'; import { ExtHostQuickOpen } from 'vs/workbench/api/node/extHostQuickOpen'; import { ExtHostProgress } from 'vs/workbench/api/node/extHostProgress'; @@ -111,7 +111,7 @@ export function createApiFactory( const extHostDocumentSaveParticipant = col.define(ExtHostContext.ExtHostDocumentSaveParticipant).set(new ExtHostDocumentSaveParticipant(extHostDocuments, threadService.get(MainContext.MainThreadWorkspace))); const extHostEditors = col.define(ExtHostContext.ExtHostEditors).set(new ExtHostEditors(threadService, extHostDocumentsAndEditors)); const extHostCommands = col.define(ExtHostContext.ExtHostCommands).set(new ExtHostCommands(threadService, extHostHeapService)); - const extHostTreeView = col.define(ExtHostContext.ExtHostTreeView).set(new ExtHostTreeView(threadService, extHostCommands)); + const extHostExplorerView = col.define(ExtHostContext.ExtHostExplorerView).set(new ExtHostExplorerView(threadService, extHostCommands)); const extHostConfiguration = col.define(ExtHostContext.ExtHostConfiguration).set(new ExtHostConfiguration(threadService.get(MainContext.MainThreadConfiguration), initData.configuration)); const extHostDiagnostics = col.define(ExtHostContext.ExtHostDiagnostics).set(new ExtHostDiagnostics(threadService)); const languageFeatures = col.define(ExtHostContext.ExtHostLanguageFeatures).set(new ExtHostLanguageFeatures(threadService, extHostDocuments, extHostCommands, extHostHeapService, extHostDiagnostics)); @@ -369,8 +369,8 @@ export function createApiFactory( sampleFunction: proposedApiFunction(extension, () => { return extHostMessageService.showMessage(Severity.Info, 'Hello Proposed Api!', {}, []); }), - createTreeView: proposedApiFunction(extension, (providerId: string, provider: vscode.TreeDataProvider): vscode.TreeView => { - return extHostTreeView.createTreeView(providerId, provider); + createExplorerView: proposedApiFunction(extension, (id: string, name: string, provider: vscode.TreeDataProvider): vscode.View => { + return extHostExplorerView.createExplorerView(id, name, provider); }) }; diff --git a/src/vs/workbench/api/node/extHost.contribution.ts b/src/vs/workbench/api/node/extHost.contribution.ts index 2a0e9f87486..648e50ea3c1 100644 --- a/src/vs/workbench/api/node/extHost.contribution.ts +++ b/src/vs/workbench/api/node/extHost.contribution.ts @@ -19,7 +19,7 @@ import { MainThreadDiagnostics } from './mainThreadDiagnostics'; import { MainThreadDocuments } from './mainThreadDocuments'; import { MainThreadEditors } from './mainThreadEditors'; import { MainThreadErrors } from './mainThreadErrors'; -import { MainThreadTreeView } from './mainThreadTreeView'; +import { MainThreadExplorerView } from './mainThreadExplorerView'; import { MainThreadLanguageFeatures } from './mainThreadLanguageFeatures'; import { MainThreadLanguages } from './mainThreadLanguages'; import { MainThreadMessageService } from './mainThreadMessageService'; @@ -74,7 +74,7 @@ export class ExtHostContribution implements IWorkbenchContribution { col.define(MainContext.MainThreadDocuments).set(this.instantiationService.createInstance(MainThreadDocuments, documentsAndEditors)); col.define(MainContext.MainThreadEditors).set(this.instantiationService.createInstance(MainThreadEditors, documentsAndEditors)); col.define(MainContext.MainThreadErrors).set(create(MainThreadErrors)); - col.define(MainContext.MainThreadExplorers).set(create(MainThreadTreeView)); + col.define(MainContext.MainThreadExplorerViews).set(create(MainThreadExplorerView)); col.define(MainContext.MainThreadLanguageFeatures).set(create(MainThreadLanguageFeatures)); col.define(MainContext.MainThreadLanguages).set(create(MainThreadLanguages)); col.define(MainContext.MainThreadMessageService).set(create(MainThreadMessageService)); diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index d4cd004550a..8a40eb6f740 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -37,7 +37,6 @@ import { IPickOpenEntry, IPickOptions } from 'vs/platform/quickOpen/common/quick import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; import { IApplyEditsOptions, IUndoStopOptions, TextEditorRevealType, ITextEditorConfigurationUpdate, IResolvedTextEditorConfiguration, ISelectionChangeEvent } from './mainThreadEditor'; -import { InternalTreeNodeContent } from 'vs/workbench/parts/explorers/common/treeExplorerViewModel'; import { TaskSet } from 'vs/workbench/parts/tasks/common/tasks'; import { IModelChangedEvent } from 'vs/editor/common/model/mirrorModel'; import { IPosition } from 'vs/editor/common/core/position'; @@ -155,14 +154,17 @@ export abstract class MainThreadEditorsShape { $getDiffInformation(id: string): TPromise { throw ni(); } } -export abstract class MainThreadTreeViewShape { - $registerTreeDataProvider(providerId: string): void { throw ni(); } - $refresh(providerId: string, node: InternalTreeNodeContent): void { throw ni(); } +export interface ITreeNode { + id: string; + label: string; + hasChildren: boolean; + clickCommand: string; + contextKey: string; } -export abstract class MainThreadTreeShape { - $registerTreeExplorerNodeProvider(providerId: string, node: InternalTreeNodeContent): void { throw ni(); } - $refresh(providerId: string, node: InternalTreeNodeContent): void { throw ni(); } +export abstract class MainThreadExplorerViewShape { + $registerView(id: string, name: string): void { throw ni(); } + $refresh(viewId: string, node: ITreeNode): void { throw ni(); } } export abstract class MainThreadErrorsShape { @@ -366,15 +368,10 @@ export abstract class ExtHostDocumentsAndEditorsShape { } -export abstract class ExtHostTreeViewShape { - $provideRootNode(providerId: string): TPromise { throw ni(); }; - $resolveChildren(providerId: string, node: InternalTreeNodeContent): TPromise { throw ni(); } - $getInternalCommand(providerId: string, node: InternalTreeNodeContent): TPromise { throw ni(); } -} - -export abstract class ExtHostTreeShape { - $resolveChildren(providerId: string, node: InternalTreeNodeContent): TPromise { throw ni(); } - $getInternalCommand(providerId: string, node: InternalTreeNodeContent): TPromise { throw ni(); } +export abstract class ExtHostExplorerViewShape { + $provideRootNode(viewId: string): TPromise { throw ni(); }; + $resolveChildren(viewId: string, node: ITreeNode): TPromise { throw ni(); } + $getInternalCommand(viewId: string, node: ITreeNode): TPromise { throw ni(); } } export abstract class ExtHostExtensionServiceShape { @@ -465,7 +462,7 @@ export const MainContext = { MainThreadDocuments: createMainId('MainThreadDocuments', MainThreadDocumentsShape), MainThreadEditors: createMainId('MainThreadEditors', MainThreadEditorsShape), MainThreadErrors: createMainId('MainThreadErrors', MainThreadErrorsShape), - MainThreadExplorers: createMainId('MainThreadTreeView', MainThreadTreeViewShape), + MainThreadExplorerViews: createMainId('MainThreadExplorerView', MainThreadExplorerViewShape), MainThreadLanguageFeatures: createMainId('MainThreadLanguageFeatures', MainThreadLanguageFeaturesShape), MainThreadLanguages: createMainId('MainThreadLanguages', MainThreadLanguagesShape), MainThreadMessageService: createMainId('MainThreadMessageService', MainThreadMessageServiceShape), @@ -490,7 +487,7 @@ export const ExtHostContext = { ExtHostDocuments: createExtId('ExtHostDocuments', ExtHostDocumentsShape), ExtHostDocumentSaveParticipant: createExtId('ExtHostDocumentSaveParticipant', ExtHostDocumentSaveParticipantShape), ExtHostEditors: createExtId('ExtHostEditors', ExtHostEditorsShape), - ExtHostTreeView: createExtId('ExtHostTreeView', ExtHostTreeViewShape), + ExtHostExplorerView: createExtId('ExtHostExplorerView', ExtHostExplorerViewShape), ExtHostFileSystemEventService: createExtId('ExtHostFileSystemEventService', ExtHostFileSystemEventServiceShape), ExtHostHeapService: createExtId('ExtHostHeapMonitor', ExtHostHeapServiceShape), ExtHostLanguageFeatures: createExtId('ExtHostLanguageFeatures', ExtHostLanguageFeaturesShape), diff --git a/src/vs/workbench/api/node/extHostTreeView.ts b/src/vs/workbench/api/node/extHostExplorerView.ts similarity index 66% rename from src/vs/workbench/api/node/extHostTreeView.ts rename to src/vs/workbench/api/node/extHostExplorerView.ts index ec6318eec3a..cb2bd09645b 100644 --- a/src/vs/workbench/api/node/extHostTreeView.ts +++ b/src/vs/workbench/api/node/extHostExplorerView.ts @@ -5,27 +5,28 @@ 'use strict'; import { localize } from 'vs/nls'; -import { TreeView, TreeDataProvider } from 'vscode'; +import { View, TreeDataProvider } from 'vscode'; import { defaultGenerator } from 'vs/base/common/idGenerator'; import { TPromise } from 'vs/base/common/winjs.base'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; -import { MainContext, ExtHostTreeViewShape, MainThreadTreeViewShape } from './extHost.protocol'; -import { InternalTreeNode } from 'vs/workbench/parts/explorers/common/treeExplorerViewModel'; +import { MainContext, ExtHostExplorerViewShape, MainThreadExplorerViewShape, ITreeNode } from './extHost.protocol'; import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; import { asWinJsPromise } from 'vs/base/common/async'; import * as modes from 'vs/editor/common/modes'; -class InternalTreeNodeImpl implements InternalTreeNode { +class TreeNodeImpl implements ITreeNode { readonly id: string; label: string; hasChildren: boolean; clickCommand: string = null; + contextKey: string; constructor(readonly providerId: string, node: any, provider: TreeDataProvider) { this.id = defaultGenerator.nextId(); this.label = provider.getLabel ? provider.getLabel(node) : node.toString(); this.hasChildren = provider.getHasChildren ? provider.getHasChildren(node) : true; + this.contextKey = provider.getContextKey ? provider.getContextKey(node) : null; if (provider.getClickCommand) { const command = provider.getClickCommand(node); if (command) { @@ -35,13 +36,13 @@ class InternalTreeNodeImpl implements InternalTreeNode { } } -export class ExtHostTreeView extends ExtHostTreeViewShape { - private _proxy: MainThreadTreeViewShape; +export class ExtHostExplorerView extends ExtHostExplorerViewShape { + private _proxy: MainThreadExplorerViewShape; private _extNodeProviders: { [providerId: string]: TreeDataProvider }; - private _extViews: Map> = new Map>(); - private _extNodeMaps: { [providerId: string]: { [id: string]: InternalTreeNode } }; - private _mainNodesMap: Map>; + private _extViews: Map> = new Map>(); + private _extNodeMaps: { [providerId: string]: { [id: string]: ITreeNode } }; + private _mainNodesMap: Map>; private _childrenNodesMap: Map>; constructor( @@ -50,11 +51,11 @@ export class ExtHostTreeView extends ExtHostTreeViewShape { ) { super(); - this._proxy = threadService.get(MainContext.MainThreadExplorers); + this._proxy = threadService.get(MainContext.MainThreadExplorerViews); this._extNodeProviders = Object.create(null); this._extNodeMaps = Object.create(null); - this._mainNodesMap = new Map>(); + this._mainNodesMap = new Map>(); this._childrenNodesMap = new Map>(); commands.registerArgumentProcessor({ @@ -68,39 +69,39 @@ export class ExtHostTreeView extends ExtHostTreeViewShape { }); } - createTreeView(providerId: string, provider: TreeDataProvider): TreeView { - this._proxy.$registerTreeDataProvider(providerId); - this._extNodeProviders[providerId] = provider; - this._mainNodesMap.set(providerId, new Map()); - this._childrenNodesMap.set(providerId, new Map()); + createExplorerView(viewId: string, viewName: string, provider: TreeDataProvider): View { + this._proxy.$registerView(viewId, viewName); + this._extNodeProviders[viewId] = provider; + this._mainNodesMap.set(viewId, new Map()); + this._childrenNodesMap.set(viewId, new Map()); - const treeView: TreeView = { + const treeView: View = { refresh: (node: T) => { - const mainThreadNode = this._mainNodesMap.get(providerId).get(node); - this._proxy.$refresh(providerId, mainThreadNode); + const mainThreadNode = this._mainNodesMap.get(viewId).get(node); + this._proxy.$refresh(viewId, mainThreadNode); }, dispose: () => { - delete this._extNodeProviders[providerId]; - delete this._extNodeProviders[providerId]; - this._mainNodesMap.delete(providerId); - this._childrenNodesMap.delete(providerId); - this._extViews.delete(providerId); + delete this._extNodeProviders[viewId]; + delete this._extNodeProviders[viewId]; + this._mainNodesMap.delete(viewId); + this._childrenNodesMap.delete(viewId); + this._extViews.delete(viewId); } }; - this._extViews.set(providerId, treeView); + this._extViews.set(viewId, treeView); return treeView; } - $provideRootNode(providerId: string): TPromise { + $provideRootNode(providerId: string): TPromise { const provider = this._extNodeProviders[providerId]; if (!provider) { const errMessage = localize('treeExplorer.notRegistered', 'No TreeExplorerNodeProvider with id \'{0}\' registered.', providerId); - return TPromise.wrapError(errMessage); + return TPromise.wrapError(errMessage); } return asWinJsPromise(() => provider.provideRootNode()).then(extRootNode => { - const extNodeMap: { [id: string]: InternalTreeNode } = Object.create(null); - const internalRootNode = new InternalTreeNodeImpl(providerId, extRootNode, provider); + const extNodeMap: { [id: string]: ITreeNode } = Object.create(null); + const internalRootNode = new TreeNodeImpl(providerId, extRootNode, provider); extNodeMap[internalRootNode.id] = extRootNode; this._extNodeMaps[providerId] = extNodeMap; @@ -110,15 +111,15 @@ export class ExtHostTreeView extends ExtHostTreeViewShape { return internalRootNode; }, err => { const errMessage = localize('treeExplorer.failedToProvideRootNode', 'TreeExplorerNodeProvider \'{0}\' failed to provide root node.', providerId); - return TPromise.wrapError(errMessage); + return TPromise.wrapError(errMessage); }); } - $resolveChildren(providerId: string, mainThreadNode: InternalTreeNode): TPromise { + $resolveChildren(providerId: string, mainThreadNode: ITreeNode): TPromise { const provider = this._extNodeProviders[providerId]; if (!provider) { const errMessage = localize('treeExplorer.notRegistered', 'No TreeExplorerNodeProvider with id \'{0}\' registered.', providerId); - return TPromise.wrapError(errMessage); + return TPromise.wrapError(errMessage); } const extNodeMap = this._extNodeMaps[providerId]; @@ -133,7 +134,7 @@ export class ExtHostTreeView extends ExtHostTreeViewShape { return asWinJsPromise(() => provider.resolveChildren(extNode)).then(children => { return children.map(extChild => { - const internalChild = new InternalTreeNodeImpl(providerId, extChild, provider); + const internalChild = new TreeNodeImpl(providerId, extChild, provider); extNodeMap[internalChild.id] = extChild; this._mainNodesMap.get(providerId).set(extChild, internalChild); return internalChild; @@ -142,7 +143,7 @@ export class ExtHostTreeView extends ExtHostTreeViewShape { } // Convert the command on the ExtHost side so we can pass the original externalNode to the registered handler - $getInternalCommand(providerId: string, mainThreadNode: InternalTreeNode): TPromise { + $getInternalCommand(providerId: string, mainThreadNode: ITreeNode): TPromise { const commandConverter = this.commands.converter; if (mainThreadNode.clickCommand) { diff --git a/src/vs/workbench/api/node/mainThreadTreeView.ts b/src/vs/workbench/api/node/mainThreadExplorerView.ts similarity index 51% rename from src/vs/workbench/api/node/mainThreadTreeView.ts rename to src/vs/workbench/api/node/mainThreadExplorerView.ts index 54168aecf5c..4ffaa3977c2 100644 --- a/src/vs/workbench/api/node/mainThreadTreeView.ts +++ b/src/vs/workbench/api/node/mainThreadExplorerView.ts @@ -7,56 +7,73 @@ import { TPromise } from 'vs/base/common/winjs.base'; import Event, { Emitter } from 'vs/base/common/event'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; -import { ExtHostContext, MainThreadTreeViewShape, ExtHostTreeViewShape } from './extHost.protocol'; -import { ITreeExplorerService } from 'vs/workbench/parts/explorers/common/treeExplorerService'; -import { InternalTreeNodeContent, InternalTreeNodeProvider } from 'vs/workbench/parts/explorers/common/treeExplorerViewModel'; +import { ExtHostContext, MainThreadExplorerViewShape, ExtHostExplorerViewShape, ITreeNode } from './extHost.protocol'; import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { ICommandService } from 'vs/platform/commands/common/commands'; +import { IExplorerViewsService, IExplorerViewDataProvider, IExplorerView } from 'vs/workbench/parts/explorers/common/explorer'; -export class MainThreadTreeView extends MainThreadTreeViewShape { - private _proxy: ExtHostTreeViewShape; +export class MainThreadExplorerView extends MainThreadExplorerViewShape { + + private _proxy: ExtHostExplorerViewShape; + private _views: Map> = new Map>(); constructor( @IThreadService threadService: IThreadService, - @ITreeExplorerService private treeExplorerService: ITreeExplorerService, + @IExplorerViewsService private explorerViewsService: IExplorerViewsService, @IMessageService private messageService: IMessageService, @ICommandService private commandService: ICommandService ) { super(); - - this._proxy = threadService.get(ExtHostContext.ExtHostTreeView); + this._proxy = threadService.get(ExtHostContext.ExtHostExplorerView); } - $registerTreeDataProvider(providerId: string): void { + $registerView(providerId: string, name: string): void { const provider = new TreeExplorerNodeProvider(providerId, this._proxy, this.messageService, this.commandService); - this.treeExplorerService.registerTreeExplorerNodeProvider(providerId, provider); + const view = this.explorerViewsService.createView(providerId, name, provider); + this._views.set(providerId, view); } - $refresh(providerId: string, node: InternalTreeNodeContent): void { - (this.treeExplorerService.getProvider(providerId))._onRefresh.fire(node); + $refresh(providerId: string, node: ITreeNode): void { + this._views.get(providerId).refresh(node); } } -class TreeExplorerNodeProvider implements InternalTreeNodeProvider { +class TreeExplorerNodeProvider implements IExplorerViewDataProvider { - readonly _onRefresh: Emitter = new Emitter(); - readonly onRefresh: Event = this._onRefresh.event; + readonly _onRefresh: Emitter = new Emitter(); + readonly onRefresh: Event = this._onRefresh.event; - constructor(public readonly id: string, private _proxy: ExtHostTreeViewShape, + constructor(public readonly id: string, private _proxy: ExtHostExplorerViewShape, private messageService: IMessageService, private commandService: ICommandService ) { } - provideRootNode(): TPromise { + provideRoot(): TPromise { return this._proxy.$provideRootNode(this.id).then(rootNode => rootNode, err => this.messageService.show(Severity.Error, err)); } - resolveChildren(node: InternalTreeNodeContent): TPromise { + resolveChildren(node: ITreeNode): TPromise { return this._proxy.$resolveChildren(this.id, node).then(children => children, err => this.messageService.show(Severity.Error, err)); } - executeCommand(node: InternalTreeNodeContent): TPromise { + hasChildren(node: ITreeNode): boolean { + return node.hasChildren; + } + + getLabel(node: ITreeNode): string { + return node.label; + } + + getId(node: ITreeNode): string { + return node.id; + } + + getContextKey(node: ITreeNode): string { + return node.contextKey; + } + + executeCommand(node: ITreeNode): TPromise { return this._proxy.$getInternalCommand(this.id, node).then(command => { return this.commandService.executeCommand(command.id, ...command.arguments); }); diff --git a/src/vs/workbench/browser/viewlet.ts b/src/vs/workbench/browser/viewlet.ts index 1ad83a799ae..b6b84f4b4c8 100644 --- a/src/vs/workbench/browser/viewlet.ts +++ b/src/vs/workbench/browser/viewlet.ts @@ -24,6 +24,7 @@ import { Composite, CompositeDescriptor, CompositeRegistry } from 'vs/workbench/ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IMessageService } from 'vs/platform/message/common/message'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { IThemable } from 'vs/platform/theme/common/styler'; export abstract class Viewlet extends Composite implements IViewlet { @@ -288,7 +289,7 @@ export class CollapseAction extends Action { } } -export interface IViewletView extends IView { +export interface IViewletView extends IView, IThemable { create(): TPromise; setVisible(visible: boolean): TPromise; getActions(): IAction[]; diff --git a/src/vs/workbench/electron-browser/workbench.main.ts b/src/vs/workbench/electron-browser/workbench.main.ts index 1845a488d23..8b287038985 100644 --- a/src/vs/workbench/electron-browser/workbench.main.ts +++ b/src/vs/workbench/electron-browser/workbench.main.ts @@ -69,8 +69,7 @@ import 'vs/workbench/parts/extensions/electron-browser/extensionsViewlet'; // ca import 'vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution'; -import 'vs/workbench/parts/explorers/browser/treeExplorer.contribution'; -import 'vs/workbench/parts/explorers/browser/treeExplorerViewlet'; // can be packaged separately +import 'vs/workbench/parts/explorers/browser/explorer.contribution'; import 'vs/workbench/parts/output/browser/output.contribution'; import 'vs/workbench/parts/output/browser/outputPanel'; // can be packaged separately diff --git a/src/vs/workbench/parts/explorers/browser/explorer.contribution.ts b/src/vs/workbench/parts/explorers/browser/explorer.contribution.ts new file mode 100644 index 00000000000..2c3a9eecbf0 --- /dev/null +++ b/src/vs/workbench/parts/explorers/browser/explorer.contribution.ts @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IExplorerViewsService } from 'vs/workbench/parts/explorers/common/explorer'; +import { ExplorerViewsService } from 'vs/workbench/parts/explorers/browser/explorerView'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; + +registerSingleton(IExplorerViewsService, ExplorerViewsService); \ No newline at end of file diff --git a/src/vs/workbench/parts/explorers/browser/explorerView.ts b/src/vs/workbench/parts/explorers/browser/explorerView.ts new file mode 100644 index 00000000000..7e11e5fca63 --- /dev/null +++ b/src/vs/workbench/parts/explorers/browser/explorerView.ts @@ -0,0 +1,407 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import Event, { Emitter } from 'vs/base/common/event'; +import { IDisposable, Disposable, dispose, empty as EmptyDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { IViewletView, CollapsibleViewletView } from 'vs/workbench/browser/viewlet'; +import { IExplorerViewsService, IExplorerViewDataProvider, IExplorerView } from 'vs/workbench/parts/explorers/common/explorer'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { TPromise } from 'vs/base/common/winjs.base'; +import * as DOM from 'vs/base/browser/dom'; +import { Builder, $ } from 'vs/base/browser/builder'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { IAction, IActionRunner, IActionItem, ActionRunner } from 'vs/base/common/actions'; +import { IMessageService } from 'vs/platform/message/common/message'; +import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { IListService } from 'vs/platform/list/browser/listService'; +import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; +import { ClickBehavior, DefaultController } from 'vs/base/parts/tree/browser/treeDefaults'; +import { IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; +import { attachListStyler } from 'vs/platform/theme/common/styler'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { createActionItem, fillInActions } from 'vs/platform/actions/browser/menuItemActionItem'; +import { IProgressService } from 'vs/platform/progress/common/progress'; +import { ITree, IDataSource, IRenderer, ContextMenuEvent } from 'vs/base/parts/tree/browser/tree'; +import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { ResolvedKeybinding } from 'vs/base/common/keyCodes'; +import { ActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; + +export interface IViewInstantiator { + instantiate(actionRunner: IActionRunner, viewletSetings: any, instantiationService: IInstantiationService): IViewletView; +} + +export class ExplorerViewsService implements IExplorerViewsService { + + public _serviceBrand: any; + + private explorerViews: Map> = new Map>(); + + private _onViewCreated: Emitter> = new Emitter>(); + public readonly onViewCreated: Event> = this._onViewCreated.event; + + private _onDataProviderRegistered: Emitter> = new Emitter>(); + public readonly onDataProviderRegistered: Event> = this._onDataProviderRegistered.event; + + createView(id: string, name: string, dataProvider: IExplorerViewDataProvider): IExplorerView { + const view = new ExplorerView(id, name, dataProvider); + this.explorerViews.set(id, view); + this._onViewCreated.fire(view); + return view; + } + + public getViews(): IExplorerView[] { + const views = []; + this.explorerViews.forEach(view => { + views.push(view); + }); + return views; + } +} + +class ExplorerView extends Disposable implements IExplorerView, IViewInstantiator { + + private view: TreeExplorerView; + + constructor(private id: string, private name: string, private dataProvider: IExplorerViewDataProvider) { + super(); + } + + refresh(element: T): void { + if (this.view) { + this.view.refresh(element); + } + } + + instantiate(actionRunner: IActionRunner, viewletSettings: any, instantiationService: IInstantiationService): IViewletView { + if (!this.view) { + this.view = instantiationService.createInstance(TreeExplorerView, this.id, this.name, this.dataProvider, actionRunner); + } + return this.view; + } +} + +class TreeExplorerView extends CollapsibleViewletView { + + private menus: Menus; + private viewFocusContext: IContextKey; + + constructor( + private id: string, + private name: string, + private dataProvider: IExplorerViewDataProvider, + actionRunner: IActionRunner, + @IMessageService messageService: IMessageService, + @IKeybindingService keybindingService: IKeybindingService, + @IContextMenuService contextMenuService: IContextMenuService, + @IWorkspaceContextService contextService: IWorkspaceContextService, + @IInstantiationService private instantiationService: IInstantiationService, + @IListService private listService: IListService, + @IThemeService private themeService: IThemeService, + @IContextKeyService private contextKeyService: IContextKeyService, + @IExplorerViewsService private explorerViewsService: IExplorerViewsService + ) { + super(actionRunner, false, name, messageService, keybindingService, contextMenuService); + this.menus = this.instantiationService.createInstance(Menus, this.id, this.dataProvider); + this.viewFocusContext = this.contextKeyService.createKey(this.id, void 0); + } + + public renderHeader(container: HTMLElement): void { + const titleDiv = $('div.title').appendTo(container); + $('span').text(this.name).appendTo(titleDiv); + super.renderHeader(container); + } + + public renderBody(container: HTMLElement): void { + this.treeContainer = super.renderViewTree(container); + DOM.addClass(this.treeContainer, 'tree-explorer-viewlet-tree-view'); + + this.tree = this.createViewer($(this.treeContainer)); + } + + public createViewer(container: Builder): ITree { + const dataSource = this.instantiationService.createInstance(TreeDataSource, this.dataProvider); + const renderer = this.instantiationService.createInstance(TreeRenderer, this.dataProvider); + const controller = this.instantiationService.createInstance(TreeController, this.menus); + const tree = new Tree(container.getHTMLElement(), { + dataSource, + renderer, + controller + }, { + keyboardSupport: false + }); + + this.toDispose.push(attachListStyler(tree, this.themeService)); + this.toDispose.push(this.listService.register(tree, [this.viewFocusContext])); + + return tree; + } + + getActions(): IAction[] { + return [...this.menus.getTitleActions()]; + } + + getSecondaryActions(): IAction[] { + return this.menus.getTitleSecondaryActions(); + } + + getActionItem(action: IAction): IActionItem { + return createActionItem(action, this.keybindingService, this.messageService); + } + + public create(): TPromise { + return this.updateInput(); + } + + public setVisible(visible: boolean): TPromise { + return super.setVisible(visible); + } + + public updateInput(): TPromise { + return this.dataProvider.provideRoot() + .then(root => this.tree.setInput(root)); + } + + public getOptimalWidth(): number { + const parentNode = this.tree.getHTMLElement(); + const childNodes = [].slice.call(parentNode.querySelectorAll('.outline-item-label > a')); + + return DOM.getLargestChildWidth(parentNode, childNodes); + } + + refresh(element: any) { + this.tree.refresh(element); + } +} + +class TreeDataSource implements IDataSource { + + constructor( + private dataProvider: IExplorerViewDataProvider, + @IProgressService private progressService: IProgressService, + @IExplorerViewsService private explorerViewsService: IExplorerViewsService + ) { + } + + public getId(tree: ITree, node: any): string { + return this.dataProvider.getId(node); + } + + public hasChildren(tree: ITree, node: any): boolean { + return this.dataProvider.hasChildren(node); + } + + public getChildren(tree: ITree, node: any): TPromise { + const promise = this.dataProvider.resolveChildren(node); + + this.progressService.showWhile(promise, 800); + + return promise; + } + + public getParent(tree: ITree, node: any): TPromise { + return TPromise.as(null); + } +} + +interface ITreeExplorerTemplateData { + label: Builder; +} + +class TreeRenderer implements IRenderer { + + private static ITEM_HEIGHT = 22; + private static TREE_TEMPLATE_ID = 'treeExplorer'; + + constructor( + private dataProvider: IExplorerViewDataProvider, + @IExplorerViewsService private explorerViewsService: IExplorerViewsService + ) { + } + + public getHeight(tree: ITree, element: any): number { + return TreeRenderer.ITEM_HEIGHT; + } + + public getTemplateId(tree: ITree, element: any): string { + return TreeRenderer.TREE_TEMPLATE_ID; + } + + public renderTemplate(tree: ITree, templateId: string, container: HTMLElement): ITreeExplorerTemplateData { + const el = $(container); + const item = $('.custom-viewlet-tree-node-item'); + item.appendTo(el); + + const label = $('.custom-viewlet-tree-node-item-label').appendTo(item); + const link = $('a.plain').appendTo(label); + + return { label: link }; + } + + public renderElement(tree: ITree, node: any, templateId: string, templateData: ITreeExplorerTemplateData): void { + const label = this.dataProvider.getLabel(node); + templateData.label.text(label).title(label); + } + + public disposeTemplate(tree: ITree, templateId: string, templateData: ITreeExplorerTemplateData): void { + } +} + +class TreeController extends DefaultController { + + constructor( + private menus: Menus, + @IContextMenuService private contextMenuService: IContextMenuService, + @IKeybindingService private _keybindingService: IKeybindingService + ) { + super({ clickBehavior: ClickBehavior.ON_MOUSE_UP /* do not change to not break DND */, keyboardSupport: false }); + } + + public onContextMenu(tree: ITree, node: any, event: ContextMenuEvent): boolean { + tree.setFocus(node); + const actions = this.menus.getResourceContextActions(node); + if (!actions.length) { + return true; + } + const anchor = { x: event.posx + 1, y: event.posy }; + this.contextMenuService.showContextMenu({ + getAnchor: () => anchor, + + getActions: () => { + return TPromise.as(actions); + }, + + getActionItem: (action) => { + const keybinding = this._keybindingFor(action); + if (keybinding) { + return new ActionItem(action, action, { label: true, keybinding: keybinding.getLabel() }); + } + return null; + }, + + getKeyBinding: (action): ResolvedKeybinding => { + return this._keybindingFor(action); + }, + + onHide: (wasCancelled?: boolean) => { + if (wasCancelled) { + tree.DOMFocus(); + } + }, + + getActionsContext: () => node, + + actionRunner: new MultipleSelectionActionRunner(() => tree.getSelection()) + }); + + return true; + } + + private _keybindingFor(action: IAction): ResolvedKeybinding { + return this._keybindingService.lookupKeybinding(action.id); + } +} + +class MultipleSelectionActionRunner extends ActionRunner { + + constructor(private getSelectedResources: () => any[]) { + super(); + } + + runAction(action: IAction, context: any): TPromise { + if (action instanceof MenuItemAction) { + const selection = this.getSelectedResources(); + const filteredSelection = selection.filter(s => s !== context); + + if (selection.length === filteredSelection.length || selection.length === 1) { + return action.run(context); + } + + return action.run(context, ...filteredSelection); + } + + return super.runAction(action, context); + } +} + +class Menus implements IDisposable { + + private disposables: IDisposable[] = []; + private titleDisposable: IDisposable = EmptyDisposable; + private titleActions: IAction[] = []; + private titleSecondaryActions: IAction[] = []; + + private _onDidChangeTitle = new Emitter(); + get onDidChangeTitle(): Event { return this._onDidChangeTitle.event; } + + constructor( + private viewId: string, + private dataProvider: IExplorerViewDataProvider, + @IContextKeyService private contextKeyService: IContextKeyService, + @IMenuService private menuService: IMenuService, + @IExplorerViewsService private explorerViewsService: IExplorerViewsService + ) { + if (this.titleDisposable) { + this.titleDisposable.dispose(); + this.titleDisposable = EmptyDisposable; + } + + const _contextKeyService = this.contextKeyService.createScoped(); + contextKeyService.createKey('view', viewId); + + const titleMenu = this.menuService.createMenu(MenuId.ViewTitle, _contextKeyService); + const updateActions = () => { + this.titleActions = []; + this.titleSecondaryActions = []; + fillInActions(titleMenu, null, { primary: this.titleActions, secondary: this.titleSecondaryActions }); + this._onDidChangeTitle.fire(); + }; + + const listener = titleMenu.onDidChange(updateActions); + updateActions(); + + + this.titleDisposable = toDisposable(() => { + listener.dispose(); + titleMenu.dispose(); + _contextKeyService.dispose(); + this.titleActions = []; + this.titleSecondaryActions = []; + }); + } + + getTitleActions(): IAction[] { + return this.titleActions; + } + + getTitleSecondaryActions(): IAction[] { + return this.titleSecondaryActions; + } + + getResourceContextActions(element: any): IAction[] { + return this.getActions(MenuId.ViewResource, { key: 'resource', value: this.dataProvider.getContextKey(element) }).secondary; + } + + private getActions(menuId: MenuId, context: { key: string, value: string }): { primary: IAction[]; secondary: IAction[]; } { + const contextKeyService = this.contextKeyService.createScoped(); + contextKeyService.createKey('view', this.viewId); + contextKeyService.createKey(context.key, context.value); + + const menu = this.menuService.createMenu(menuId, contextKeyService); + const primary = []; + const secondary = []; + const result = { primary, secondary }; + fillInActions(menu, { shouldForwardArgs: true }, result, g => g === 'inline'); + + menu.dispose(); + contextKeyService.dispose(); + + return result; + } + + dispose(): void { + this.disposables = dispose(this.disposables); + } +} diff --git a/src/vs/workbench/parts/explorers/common/explorer.ts b/src/vs/workbench/parts/explorers/common/explorer.ts new file mode 100644 index 00000000000..b6a1731fb9b --- /dev/null +++ b/src/vs/workbench/parts/explorers/common/explorer.ts @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import Event from 'vs/base/common/event'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { IActionRunner } from 'vs/base/common/actions'; +import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; + +export const IExplorerViewsService = createDecorator('explorerViewsService'); + +export interface IExplorerViewsService { + _serviceBrand: any; + + readonly onViewCreated: Event>; + + createView(id: string, name: string, dataProvider: IExplorerViewDataProvider): IExplorerView; + getViews(): IExplorerView[]; +} + +export interface IExplorerView extends IDisposable { + refresh(element: T): void; + instantiate(actionRunner: IActionRunner, viewletSetings: any, instantiationService: IInstantiationService): any; +} + +export interface IExplorerViewDataProvider { + provideRoot(): TPromise; + resolveChildren(element: T): TPromise; + getId(element: T): string; + getLabel(element: T): string; + getContextKey(element: T): string; + hasChildren(element: T): boolean; +} diff --git a/src/vs/workbench/parts/files/browser/explorerViewlet.ts b/src/vs/workbench/parts/files/browser/explorerViewlet.ts index e32cb7f8843..5aa2a30f535 100644 --- a/src/vs/workbench/parts/files/browser/explorerViewlet.ts +++ b/src/vs/workbench/parts/files/browser/explorerViewlet.ts @@ -13,7 +13,7 @@ import { Dimension, Builder } from 'vs/base/browser/builder'; import { Scope } from 'vs/workbench/common/memento'; import { VIEWLET_ID, ExplorerViewletVisibleContext, IFilesConfiguration } from 'vs/workbench/parts/files/common/files'; import { IViewletView, Viewlet } from 'vs/workbench/browser/viewlet'; -import { SplitView, Orientation } from 'vs/base/browser/ui/splitview/splitview'; +import { SplitView } from 'vs/base/browser/ui/splitview/splitview'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ActionRunner, FileViewletState } from 'vs/workbench/parts/files/browser/views/explorerViewer'; import { ExplorerView } from 'vs/workbench/parts/files/browser/views/explorerView'; @@ -32,6 +32,7 @@ import { IEditorGroupService } from 'vs/workbench/services/group/common/groupSer import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { attachHeaderViewStyler } from 'vs/platform/theme/common/styler'; +import { IExplorerViewsService } from 'vs/workbench/parts/explorers/common/explorer'; export class ExplorerViewlet extends Viewlet { private viewletContainer: Builder; @@ -43,7 +44,7 @@ export class ExplorerViewlet extends Viewlet { private emptyView: EmptyView; private openEditorsVisible: boolean; - private lastFocusedView: ExplorerView | OpenEditorsView | EmptyView; + private lastFocusedView: IViewletView; private focusListener: IDisposable; private delayEditorOpeningInOpenedEditors: boolean; @@ -62,7 +63,8 @@ export class ExplorerViewlet extends Viewlet { @IConfigurationService private configurationService: IConfigurationService, @IInstantiationService private instantiationService: IInstantiationService, @IContextKeyService contextKeyService: IContextKeyService, - @IThemeService themeService: IThemeService + @IThemeService themeService: IThemeService, + @IExplorerViewsService private explorerViewsService: IExplorerViewsService ) { super(VIEWLET_ID, telemetryService, themeService); @@ -73,6 +75,7 @@ export class ExplorerViewlet extends Viewlet { this.viewletSettings = this.getMemento(storageService, Scope.WORKSPACE); this.configurationService.onDidUpdateConfiguration(e => this.onConfigurationUpdated(e.config)); + this.explorerViewsService.onViewCreated(view => this.render()); } public create(parent: Builder): TPromise { @@ -80,78 +83,79 @@ export class ExplorerViewlet extends Viewlet { this.viewletContainer = parent.div().addClass('explorer-viewlet'); - const settings = this.configurationService.getConfiguration(); - - return this.onConfigurationUpdated(settings); + return this.render(); } public getActions(): IAction[] { - if (this.openEditorsVisible) { - return []; + if (this.views.length === 1) { + return this.views[0].getActions(); } - - if (this.explorerView) { - return this.explorerView.getActions(); - } - return []; } - private onConfigurationUpdated(config: IFilesConfiguration): TPromise { + private render(): TPromise { + const config = this.configurationService.getConfiguration(); // No need to delay if preview is disabled this.delayEditorOpeningInOpenedEditors = !!config.workbench.editor.enablePreview; // Open editors view should always be visible in no folder workspace. - const openEditorsVisible = !this.contextService.hasWorkspace() || config.explorer.openEditors.visible !== 0; + this.openEditorsVisible = !this.contextService.hasWorkspace() || config.explorer.openEditors.visible !== 0; - // Create views on startup and if open editors visibility has changed #6919 - if (this.openEditorsVisible !== openEditorsVisible) { - this.dispose(); - this.openEditorsVisible = openEditorsVisible; - this.views = []; - this.viewletContainer.clearChildren(); + this.dispose(); + this.views = []; + this.viewletContainer.clearChildren(); - if (this.openEditorsVisible) { - this.splitView = new SplitView(this.viewletContainer.getHTMLElement()); + this.splitView = new SplitView(this.viewletContainer.getHTMLElement()); + // Track focus + this.focusListener = this.splitView.onFocus((view: IViewletView) => { + this.lastFocusedView = view; + }); - // Open editors view - this.addOpenEditorsView(); + const customViews = this.explorerViewsService.getViews(); - // Track focus - this.focusListener = this.splitView.onFocus((view: ExplorerView | OpenEditorsView | EmptyView) => { - this.lastFocusedView = view; - }); - } - - // Explorer view - this.addExplorerView(); - this.lastFocusedView = this.explorerView; - - return TPromise.join(this.views.map(view => view.create())).then(() => void 0).then(() => { - if (this.dimension) { - this.layout(this.dimension); - } - - // Update title area since the title actions have changed. - this.updateTitleArea(); - return this.setVisible(this.isVisible()).then(() => this.focus()); // Focus the viewlet since that triggers a rerender. - }); + if (this.openEditorsVisible) { + // Open editors view + this.openEditorsView = this.instantiationService.createInstance(OpenEditorsView, this.getActionRunner(), this.viewletSettings); + this.views.push(this.openEditorsView); } - return TPromise.as(null); + // Explorer view + this.createExplorerView(this.views.length || customViews.length ? undefined : 0); + this.views.push(this.explorerView); + + // custom views + for (const view of customViews) { + this.views.push(view.instantiate(this.getActionRunner(), this.viewletSettings, this.instantiationService)); + } + + for (const view of this.views) { + attachHeaderViewStyler(view, this.themeService); + this.splitView.addView(view); + } + + this.lastFocusedView = this.explorerView; + + return TPromise.join(this.views.map(view => view.create())).then(() => void 0).then(() => { + if (this.dimension) { + this.layout(this.dimension); + } + + // Update title area since the title actions have changed. + this.updateTitleArea(); + return this.setVisible(this.isVisible()).then(() => this.focus()); // Focus the viewlet since that triggers a rerender. + }); } - private addOpenEditorsView(): void { - this.openEditorsView = this.instantiationService.createInstance(OpenEditorsView, this.getActionRunner(), this.viewletSettings); - attachHeaderViewStyler(this.openEditorsView, this.themeService); - - this.splitView.addView(this.openEditorsView); - - this.views.push(this.openEditorsView); + private onConfigurationUpdated(config: IFilesConfiguration): void { + // Open editors view should always be visible in no folder workspace. + const openEditorsVisible = !this.contextService.hasWorkspace() || config.explorer.openEditors.visible !== 0; + if (this.openEditorsVisible !== openEditorsVisible) { + this.render(); + } } - private addExplorerView(): void { + private createExplorerView(headerSize: number): void { let explorerOrEmptyView: ExplorerView | EmptyView; // With a Workspace @@ -188,25 +192,13 @@ export class ExplorerViewlet extends Viewlet { }); const explorerInstantiator = this.instantiationService.createChild(new ServiceCollection([IWorkbenchEditorService, delegatingEditorService])); - - const headerSize = this.openEditorsVisible ? undefined : 0; // If open editors are not visible set header size explicitly to 0, otherwise const it be computed by super class. this.explorerView = explorerOrEmptyView = explorerInstantiator.createInstance(ExplorerView, this.viewletState, this.getActionRunner(), this.viewletSettings, headerSize); - attachHeaderViewStyler(this.explorerView, this.themeService); } // No workspace else { this.emptyView = explorerOrEmptyView = this.instantiationService.createInstance(EmptyView, this.getActionRunner()); - attachHeaderViewStyler(this.emptyView, this.themeService); } - - if (this.openEditorsVisible) { - this.splitView.addView(explorerOrEmptyView); - } else { - explorerOrEmptyView.render(this.viewletContainer.getHTMLElement(), Orientation.VERTICAL); - } - - this.views.push(explorerOrEmptyView); } public getExplorerView(): ExplorerView { @@ -260,7 +252,7 @@ export class ExplorerViewlet extends Viewlet { return this.openEditorsView.focus(); } - private hasSelectionOrFocus(view: ExplorerView | OpenEditorsView | EmptyView): boolean { + private hasSelectionOrFocus(view: IViewletView): boolean { if (!view) { return false; } @@ -284,12 +276,7 @@ export class ExplorerViewlet extends Viewlet { public layout(dimension: Dimension): void { this.dimension = dimension; - - if (this.openEditorsVisible) { - this.splitView.layout(dimension.height); - } else if (this.explorerView) { - this.explorerView.layout(dimension.height, Orientation.VERTICAL); - } + this.splitView.layout(dimension.height); } public getActionRunner(): IActionRunner { @@ -306,7 +293,7 @@ export class ExplorerViewlet extends Viewlet { public getOptimalWidth(): number { const additionalMargin = 16; - const openedEditorsViewWidth = this.openEditorsVisible ? this.openEditorsView.getOptimalWidth() : 0; + const openedEditorsViewWidth = this.openEditorsView ? this.openEditorsView.getOptimalWidth() : 0; const explorerView = this.getExplorerView(); const explorerViewWidth = explorerView ? explorerView.getOptimalWidth() : 0; const optimalWidth = Math.max(openedEditorsViewWidth, explorerViewWidth); From d2fa4864de460efaa6a8274e51275ff956423f31 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 May 2017 12:30:21 +0200 Subject: [PATCH 0116/1164] :lipstick: --- .../extensions/electron-browser/media/extensionsViewlet.css | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css b/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css index 82fab9f5565..42b73f8bfc6 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css +++ b/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css @@ -71,8 +71,6 @@ flex: 1; padding: 4px 0; overflow: hidden; - - } .extensions-viewlet > .extensions .extension > .details > .header-container { @@ -158,8 +156,8 @@ .extensions-viewlet > .extensions .extension.disabled > .icon, .extensions-viewlet > .extensions .extension.disabled > .details > .header-container, -.extensions-viewlet > .extensions .extension.disabled > .details > .footer > .author -.extensions-viewlet > .extensions .extension.disabled > .details > .description { +.extensions-viewlet > .extensions .extension.disabled > .details > .description +.extensions-viewlet > .extensions .extension.disabled > .details > .footer > .author { opacity: 0.5; } From e0f50d1eb00d411179cd4a402d281697b4c60c5b Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 5 May 2017 12:37:07 +0200 Subject: [PATCH 0117/1164] 'editor.lineHighlightBorder' not working if lineHighlightBackground is set. Fixes #26017 --- src/vs/base/common/color.ts | 4 ++++ .../browser/services/standaloneThemeServiceImpl.ts | 9 ++------- .../currentLineHighlight/currentLineHighlight.ts | 11 ++++++----- src/vs/platform/theme/common/themeService.ts | 5 +++-- .../electron-browser/terminalColorRegistry.test.ts | 2 +- .../themes/electron-browser/colorThemeData.ts | 9 ++------- src/vs/workbench/test/workbenchTestServices.ts | 2 +- 7 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/vs/base/common/color.ts b/src/vs/base/common/color.ts index ad17cab9171..e35bf39d7cb 100644 --- a/src/vs/base/common/color.ts +++ b/src/vs/base/common/color.ts @@ -382,6 +382,10 @@ export class Color { return new Color(new RGBA(p.r, p.g, p.b, Math.round(p.a * factor))); } + public isTransparent(): boolean { + return this.rgba.a === 0; + } + public opposite(): Color { return new Color(new RGBA( 255 - this.rgba.r, diff --git a/src/vs/editor/browser/services/standaloneThemeServiceImpl.ts b/src/vs/editor/browser/services/standaloneThemeServiceImpl.ts index 09969e5f768..35132a10cba 100644 --- a/src/vs/editor/browser/services/standaloneThemeServiceImpl.ts +++ b/src/vs/editor/browser/services/standaloneThemeServiceImpl.ts @@ -67,13 +67,8 @@ class StandaloneTheme implements IStandaloneTheme { return color; } - public isDefault(colorId: ColorIdentifier): boolean { - if (!this.colors.hasOwnProperty(colorId)) { - return true; - } - let color = this.colors[colorId]; - let defaultValue = this.getDefault(colorId); - return color ? !!defaultValue : color.equals(defaultValue); + public defines(colorId: ColorIdentifier): boolean { + return this.colors.hasOwnProperty(colorId); } public get type() { diff --git a/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts b/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts index e0ec23a3868..2aac9fc5557 100644 --- a/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts +++ b/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts @@ -134,14 +134,15 @@ export class CurrentLineHighlightOverlay extends DynamicViewOverlay { registerThemingParticipant((theme, collector) => { let lineHighlight = theme.getColor(editorLineHighlight); if (lineHighlight) { - collector.addRule(`.monaco-editor.${theme.selector} .view-overlays .current-line { background-color: ${lineHighlight}; border: none; }`); - } else { + collector.addRule(`.monaco-editor.${theme.selector} .view-overlays .current-line { background-color: ${lineHighlight}; }`); + } + if (!lineHighlight || lineHighlight.isTransparent() || theme.defines(editorLineHighlightBorder)) { let lineHighlightBorder = theme.getColor(editorLineHighlightBorder); if (lineHighlightBorder) { collector.addRule(`.monaco-editor.${theme.selector} .view-overlays .current-line { border: 2px solid ${lineHighlightBorder}; }`); - } - if (theme.type === 'hc') { - collector.addRule(`.monaco-editor.${theme.selector} .view-overlays .current-line { border-width: 1px; }`); + if (theme.type === 'hc') { + collector.addRule(`.monaco-editor.${theme.selector} .view-overlays .current-line { border-width: 1px; }`); + } } } }); diff --git a/src/vs/platform/theme/common/themeService.ts b/src/vs/platform/theme/common/themeService.ts index ff9f54c95f5..d6d7c4a0639 100644 --- a/src/vs/platform/theme/common/themeService.ts +++ b/src/vs/platform/theme/common/themeService.ts @@ -32,9 +32,10 @@ export interface ITheme { getColor(color: ColorIdentifier, useDefault?: boolean): Color; /** - * Returns wheter the current color matches the default color + * Returns wheter the theme defines a value for the color. If not, that means the + * default color will be used. */ - isDefault(color: ColorIdentifier): boolean; + defines(color: ColorIdentifier): boolean; } export interface ICssStyleCollector { diff --git a/src/vs/workbench/parts/terminal/test/electron-browser/terminalColorRegistry.test.ts b/src/vs/workbench/parts/terminal/test/electron-browser/terminalColorRegistry.test.ts index 7a6317a7295..f2a9ca2fa52 100644 --- a/src/vs/workbench/parts/terminal/test/electron-browser/terminalColorRegistry.test.ts +++ b/src/vs/workbench/parts/terminal/test/electron-browser/terminalColorRegistry.test.ts @@ -20,7 +20,7 @@ function getMockTheme(type: ThemeType): ITheme { label: '', type: type, getColor: (colorId) => themingRegistry.resolveDefaultColor(colorId, theme), - isDefault: () => true + defines: () => true }; return theme; } diff --git a/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts b/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts index 26093f69f55..b545524e4c1 100644 --- a/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts +++ b/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts @@ -56,13 +56,8 @@ export class ColorThemeData implements IColorTheme { return colorRegistry.resolveDefaultColor(colorId, this); } - public isDefault(colorId: ColorIdentifier): boolean { - let color = this.colorMap[colorId]; - if (types.isUndefined(color)) { - return true; - } - let defaultValue = this.getDefault(colorId); - return color === null ? defaultValue === null : color.equals(defaultValue); + public defines(colorId: ColorIdentifier): boolean { + return this.customColorMap.hasOwnProperty(colorId) || this.colorMap.hasOwnProperty(colorId); } public setCustomColors(colors: IColorCustomizations) { diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index d5d1d7cd65a..37cc7b6cb35 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -1006,7 +1006,7 @@ export class TestTheme implements ITheme { throw new Error('Method not implemented.'); } - isDefault(color: string): boolean { + defines(color: string): boolean { throw new Error('Method not implemented.'); } } From 17f2cc03c7175752b100a3106aad31c3df773ab0 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 May 2017 12:04:23 +0200 Subject: [PATCH 0118/1164] more snippet parse info, prep for #16037 --- .../contrib/snippet/common/snippetParser.ts | 68 ++++++++++++++++++ .../snippet/test/common/snippetParser.test.ts | 70 ++++++++++++++++++- 2 files changed, 137 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/common/snippetParser.ts index 7017f77383c..193a208990d 100644 --- a/src/vs/editor/contrib/snippet/common/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/common/snippetParser.ts @@ -135,6 +135,9 @@ export abstract class Marker { toString() { return ''; } + len(): number { + return 0; + } } export class Text extends Marker { @@ -144,6 +147,9 @@ export class Text extends Marker { toString() { return this.string; } + len(): number { + return this.string.length; + } } export class Placeholder extends Marker { @@ -171,9 +177,71 @@ export class Variable extends Marker { return this.isDefined ? this.resolvedValue : Marker.toString(this.defaultValue); } } +export function walk(marker: Marker[], visitor: (marker: Marker) => boolean): void { + const stack = [...marker]; + while (stack.length > 0) { + const marker = stack.shift(); + const recurse = visitor(marker); + if (!recurse) { + break; + } + if (marker instanceof Placeholder || marker instanceof Variable) { + stack.unshift(...marker.defaultValue); + } + } +} + +export class TextmateSnippet { + + readonly marker: Marker[]; + + constructor(marker: Marker[]) { + this.marker = marker; + } + + offset(marker: Marker): number { + let pos = 0; + let found = false; + walk(this.marker, candidate => { + if (candidate === marker) { + found = true; + return false; + } + pos += candidate.len(); + return true; + }); + + if (!found) { + return -1; + } + return pos; + } + + placeholders(): Map { + const map = new Map(); + walk(this.marker, candidate => { + if (candidate instanceof Placeholder) { + let array = map.get(candidate.name); + if (!array) { + map.set(candidate.name, [candidate]); + } else { + array.push(candidate); + } + } + return true; + }); + return map; + } + +} export class SnippetParser { + static parse(template: string): TextmateSnippet { + const marker = new SnippetParser(true, false).parse(template); + return new TextmateSnippet(marker); + } + private _enableTextMate: boolean; private _enableInternal: boolean; private _scanner = new Scanner(); diff --git a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts index 100c4be8679..1fa9d89e6e5 100644 --- a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts +++ b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts @@ -5,7 +5,7 @@ 'use strict'; import * as assert from 'assert'; -import { Scanner, TokenType, SnippetParser, Text, Placeholder, Variable, Marker } from 'vs/editor/contrib/snippet/common/snippetParser'; +import { Scanner, TokenType, SnippetParser, Text, Placeholder, Variable, Marker, walk } from 'vs/editor/contrib/snippet/common/snippetParser'; suite('SnippetParser', () => { @@ -294,4 +294,72 @@ suite('SnippetParser', () => { actual = new SnippetParser(true, false).escape('${1:foo:bar}'); assert.equal(actual, 'foo:bar'); }); + + test('marker#len', () => { + + function assertLen(template: string, ...lengths: number[]): void { + const { marker } = SnippetParser.parse(template); + walk(marker, m => { + const expected = lengths.shift(); + assert.equal(m.len(), expected); + return true; + }); + assert.equal(lengths.length, 0); + } + + assertLen('text', 4); + assertLen('$1text', 0, 4); + assertLen('te$1xt', 2, 0, 2); + assertLen('errorContext: `${1:err}`, error: $0', 15, 0, 3, 10, 0); + assertLen('errorContext: `${1:err}`, error: $1', 15, 0, 3, 10, 0, 3); + assertLen('$TM_SELECTED_TEXT', 0); + assertLen('${TM_SELECTED_TEXT:def}', 0, 3); + }); + + test('TextmateSnippet#offset', () => { + let snippet = SnippetParser.parse('te$1xt'); + assert.equal(snippet.offset(snippet.marker[0]), 0); + assert.equal(snippet.offset(snippet.marker[1]), 2); + assert.equal(snippet.offset(snippet.marker[2]), 2); + + snippet = SnippetParser.parse('${TM_SELECTED_TEXT:def}'); + assert.equal(snippet.offset(snippet.marker[0]), 0); + assert.equal(snippet.offset((snippet.marker[0]).defaultValue[0]), 0); + + // forgein marker + assert.equal(snippet.offset(new Text('foo')), -1); + }); + + test('TextmateSnippet#placeholder', () => { + let snippet = SnippetParser.parse('te$1xt'); + let placeholders = snippet.placeholders(); + assert.equal(placeholders.size, 1); + let array = placeholders.get('1'); + assert.equal(array.length, 1); + + snippet = SnippetParser.parse('te$1xt$1'); + placeholders = snippet.placeholders(); + assert.equal(placeholders.size, 1); + array = placeholders.get('1'); + assert.equal(array.length, 2); + + snippet = SnippetParser.parse('te$1xt$2'); + placeholders = snippet.placeholders(); + assert.equal(placeholders.size, 2); + array = placeholders.get('1'); + assert.equal(array.length, 1); + array = placeholders.get('2'); + assert.equal(array.length, 1); + + snippet = SnippetParser.parse('${1:bar${2:foo}bar}'); + placeholders = snippet.placeholders(); + assert.equal(placeholders.size, 2); + array = placeholders.get('1'); + assert.equal(array.length, 1); + assert.equal(snippet.offset(array[0]), 0); + + array = placeholders.get('2'); + assert.equal(array.length, 1); + assert.equal(snippet.offset(array[0]), 3); + }); }); From 195a8e2526707e2c878ea33b07214520421f4897 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 May 2017 12:53:58 +0200 Subject: [PATCH 0119/1164] add indent adjust logic to snippet, prep for #16037 --- src/vs/base/common/strings.ts | 8 +++---- src/vs/base/test/common/strings.test.ts | 7 ++++++ .../contrib/snippet/common/snippetParser.ts | 23 +++++++++++++++++++ .../snippet/test/common/snippetParser.test.ts | 18 +++++++++++++++ 4 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/vs/base/common/strings.ts b/src/vs/base/common/strings.ts index ea4259e8f36..1886577902b 100644 --- a/src/vs/base/common/strings.ts +++ b/src/vs/base/common/strings.ts @@ -293,14 +293,14 @@ export function firstNonWhitespaceIndex(str: string): number { * Returns the leading whitespace of the string. * If the string contains only whitespaces, returns entire string */ -export function getLeadingWhitespace(str: string): string { - for (let i = 0, len = str.length; i < len; i++) { +export function getLeadingWhitespace(str: string, from: number = 0): string { + for (let i = from, len = str.length; i < len; i++) { let chCode = str.charCodeAt(i); if (chCode !== CharCode.Space && chCode !== CharCode.Tab) { - return str.substring(0, i); + return str.substring(from, i); } } - return str; + return str.substr(from); } /** diff --git a/src/vs/base/test/common/strings.test.ts b/src/vs/base/test/common/strings.test.ts index ef9e73d6c56..7681a2e702c 100644 --- a/src/vs/base/test/common/strings.test.ts +++ b/src/vs/base/test/common/strings.test.ts @@ -306,4 +306,11 @@ suite('Strings', () => { assert(!regExpWithFlags.ignoreCase); assert(regExpWithFlags.multiline); }); + + test('getLeadingWhitespace', () => { + assert.equal(strings.getLeadingWhitespace(' foo'), ' '); + assert.equal(strings.getLeadingWhitespace(' foo', 2), ''); + assert.equal(strings.getLeadingWhitespace(' '), ' '); + assert.equal(strings.getLeadingWhitespace(' ', 1), ' '); + }); }); diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/common/snippetParser.ts index 193a208990d..026247a5e1b 100644 --- a/src/vs/editor/contrib/snippet/common/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/common/snippetParser.ts @@ -6,6 +6,7 @@ 'use strict'; import { CharCode } from 'vs/base/common/charCode'; +import { getLeadingWhitespace } from 'vs/base/common/strings'; export enum TokenType { Dollar, @@ -233,6 +234,28 @@ export class TextmateSnippet { return map; } + adjustIndentation(normalizer: (whitespace: string) => string): void { + + walk(this.marker, candidate => { + if (candidate instanceof Text) { + //check for newline characters and adjust indent + let regex = /\r\n|\r|\n/g; + let match: RegExpMatchArray; + while (match = regex.exec(candidate.string)) { + let pos = regex.lastIndex; + let whitespace = getLeadingWhitespace(candidate.string, pos); + let normalized = normalizer(whitespace); + if (whitespace !== normalized) { + candidate.string = candidate.string.substr(0, pos) + + normalized + + candidate.string.substr(pos + whitespace.length); + } + } + } + return true; + }); + } + } export class SnippetParser { diff --git a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts index 1fa9d89e6e5..60e200e8102 100644 --- a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts +++ b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts @@ -362,4 +362,22 @@ suite('SnippetParser', () => { assert.equal(array.length, 1); assert.equal(snippet.offset(array[0]), 3); }); + + test('TextmateSnippet#adjustIndentation', () => { + let snippet = SnippetParser.parse('foo\n bar'); + assert.equal(Marker.toString(snippet.marker), 'foo\n bar'); + snippet.adjustIndentation(s => s.replace(/ /, '\t')); + assert.equal(Marker.toString(snippet.marker), 'foo\n\tbar'); + + snippet = SnippetParser.parse('foo\r\n bar\r\n far'); + assert.equal(Marker.toString(snippet.marker), 'foo\r\n bar\r\n far'); + snippet.adjustIndentation(s => s.replace(/ /, '\t')); + assert.equal(Marker.toString(snippet.marker), 'foo\r\n\tbar\r\n\tfar'); + + snippet = SnippetParser.parse('foo${1:bar\r far\r boo}'); + assert.equal(Marker.toString(snippet.marker), 'foobar\r far\r boo'); + snippet.adjustIndentation(s => s.replace(/ /, '\t')); + assert.equal(Marker.toString(snippet.marker), 'foobar\r\tfar\r\tboo'); + + }); }); From 58da79c89c75e38fd63cd993066f6b9bd471c6f5 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 May 2017 14:10:19 +0200 Subject: [PATCH 0120/1164] make sure adjust indentation creates a copy of the snippet, #16037 --- .../contrib/snippet/common/snippetParser.ts | 48 +++++++++++++++---- .../snippet/test/common/snippetParser.test.ts | 17 ++++--- 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/common/snippetParser.ts index 026247a5e1b..e06dc9621dd 100644 --- a/src/vs/editor/contrib/snippet/common/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/common/snippetParser.ts @@ -151,6 +151,13 @@ export class Text extends Marker { len(): number { return this.string.length; } + with(string: string): Text { + if (this.string !== string) { + return new Text(string); + } else { + return this; + } + } } export class Placeholder extends Marker { @@ -160,6 +167,9 @@ export class Placeholder extends Marker { toString() { return Marker.toString(this.defaultValue); } + with(defaultValue: Marker[]): Placeholder { + return new Placeholder(this.name, defaultValue); + } } export class Variable extends Marker { @@ -169,14 +179,17 @@ export class Variable extends Marker { constructor(public name: string = '', public defaultValue: Marker[]) { super(); } - get isDefined(): boolean { return this.resolvedValue !== undefined; } - toString() { return this.isDefined ? this.resolvedValue : Marker.toString(this.defaultValue); } + with(defaultValue: Marker[]): Variable { + let ret = new Variable(this.name, defaultValue); + ret.resolvedValue = this.resolvedValue; + return ret; + } } export function walk(marker: Marker[], visitor: (marker: Marker) => boolean): void { const stack = [...marker]; @@ -234,26 +247,41 @@ export class TextmateSnippet { return map; } - adjustIndentation(normalizer: (whitespace: string) => string): void { + withIndentation(normalizer: (whitespace: string) => string): TextmateSnippet { + // create a new snippet because this can be + // different for each and every cursor + const newMarker = [...this.marker]; + TextmateSnippet._adjustIndentation(newMarker, normalizer); + return new TextmateSnippet(newMarker); + } - walk(this.marker, candidate => { + private static _adjustIndentation(marker: Marker[], normalizer: (whitespace: string) => string): void { + for (let i = 0; i < marker.length; i++) { + const candidate = marker[i]; if (candidate instanceof Text) { //check for newline characters and adjust indent let regex = /\r\n|\r|\n/g; let match: RegExpMatchArray; - while (match = regex.exec(candidate.string)) { + let value = candidate.string; + while (match = regex.exec(value)) { let pos = regex.lastIndex; - let whitespace = getLeadingWhitespace(candidate.string, pos); + let whitespace = getLeadingWhitespace(value, pos); let normalized = normalizer(whitespace); if (whitespace !== normalized) { - candidate.string = candidate.string.substr(0, pos) + value = value.substr(0, pos) + normalized - + candidate.string.substr(pos + whitespace.length); + + value.substr(pos + whitespace.length); + + marker[i] = candidate.with(value); } } + } else if (candidate instanceof Placeholder || candidate instanceof Variable) { + // recurse with a copied array + let children = [...candidate.defaultValue]; + TextmateSnippet._adjustIndentation(children, normalizer); + marker[i] = candidate.with(children); } - return true; - }); + } } } diff --git a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts index 60e200e8102..01e98e16123 100644 --- a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts +++ b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts @@ -363,21 +363,24 @@ suite('SnippetParser', () => { assert.equal(snippet.offset(array[0]), 3); }); - test('TextmateSnippet#adjustIndentation', () => { + test('TextmateSnippet#withIndentation', () => { let snippet = SnippetParser.parse('foo\n bar'); assert.equal(Marker.toString(snippet.marker), 'foo\n bar'); - snippet.adjustIndentation(s => s.replace(/ /, '\t')); - assert.equal(Marker.toString(snippet.marker), 'foo\n\tbar'); + let newSnippet = snippet.withIndentation(s => s.replace(/ /, '\t')); + assert.equal(Marker.toString(snippet.marker), 'foo\n bar'); + assert.equal(Marker.toString(newSnippet.marker), 'foo\n\tbar'); snippet = SnippetParser.parse('foo\r\n bar\r\n far'); assert.equal(Marker.toString(snippet.marker), 'foo\r\n bar\r\n far'); - snippet.adjustIndentation(s => s.replace(/ /, '\t')); - assert.equal(Marker.toString(snippet.marker), 'foo\r\n\tbar\r\n\tfar'); + newSnippet = snippet.withIndentation(s => s.replace(/ /, '\t')); + assert.equal(Marker.toString(snippet.marker), 'foo\r\n bar\r\n far'); + assert.equal(Marker.toString(newSnippet.marker), 'foo\r\n\tbar\r\n\tfar'); snippet = SnippetParser.parse('foo${1:bar\r far\r boo}'); assert.equal(Marker.toString(snippet.marker), 'foobar\r far\r boo'); - snippet.adjustIndentation(s => s.replace(/ /, '\t')); - assert.equal(Marker.toString(snippet.marker), 'foobar\r\tfar\r\tboo'); + newSnippet = snippet.withIndentation(s => s.replace(/ /, '\t')); + assert.equal(Marker.toString(snippet.marker), 'foobar\r far\r boo'); + assert.equal(Marker.toString(newSnippet.marker), 'foobar\r\tfar\r\tboo'); }); }); From 003452b28e3572bec2fe941c6df0807bd415d905 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 May 2017 14:23:42 +0200 Subject: [PATCH 0121/1164] more tests, #16037 --- .../contrib/snippet/test/common/snippetParser.test.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts index 01e98e16123..11cc8b994e8 100644 --- a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts +++ b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts @@ -366,6 +366,14 @@ suite('SnippetParser', () => { test('TextmateSnippet#withIndentation', () => { let snippet = SnippetParser.parse('foo\n bar'); assert.equal(Marker.toString(snippet.marker), 'foo\n bar'); + let snippet1 = snippet.withIndentation(s => s.replace(/ /, '\t')); + let snippet2 = snippet.withIndentation(s => s.replace(/ /, ' ')); + assert.equal(Marker.toString(snippet.marker), 'foo\n bar'); + assert.equal(Marker.toString(snippet1.marker), 'foo\n\tbar'); + assert.equal(Marker.toString(snippet2.marker), 'foo\n bar'); + + snippet = SnippetParser.parse('foo\n bar'); + assert.equal(Marker.toString(snippet.marker), 'foo\n bar'); let newSnippet = snippet.withIndentation(s => s.replace(/ /, '\t')); assert.equal(Marker.toString(snippet.marker), 'foo\n bar'); assert.equal(Marker.toString(newSnippet.marker), 'foo\n\tbar'); From e66892f521ca0e30d8d4e43eb4c3b3b9efa34ad5 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 May 2017 14:41:05 +0200 Subject: [PATCH 0122/1164] TextmateSnippet#value, #16037 --- .../contrib/snippet/common/snippetParser.ts | 4 +++ .../snippet/test/common/snippetParser.test.ts | 26 +++++++++---------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/common/snippetParser.ts index e06dc9621dd..dd7fdfc42d7 100644 --- a/src/vs/editor/contrib/snippet/common/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/common/snippetParser.ts @@ -247,6 +247,10 @@ export class TextmateSnippet { return map; } + get value() { + return Marker.toString(this.marker); + } + withIndentation(normalizer: (whitespace: string) => string): TextmateSnippet { // create a new snippet because this can be // different for each and every cursor diff --git a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts index 11cc8b994e8..e5acd64f7ec 100644 --- a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts +++ b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts @@ -365,30 +365,30 @@ suite('SnippetParser', () => { test('TextmateSnippet#withIndentation', () => { let snippet = SnippetParser.parse('foo\n bar'); - assert.equal(Marker.toString(snippet.marker), 'foo\n bar'); + assert.equal(snippet.value, 'foo\n bar'); let snippet1 = snippet.withIndentation(s => s.replace(/ /, '\t')); let snippet2 = snippet.withIndentation(s => s.replace(/ /, ' ')); - assert.equal(Marker.toString(snippet.marker), 'foo\n bar'); - assert.equal(Marker.toString(snippet1.marker), 'foo\n\tbar'); - assert.equal(Marker.toString(snippet2.marker), 'foo\n bar'); + assert.equal(snippet.value, 'foo\n bar'); + assert.equal(snippet1.value, 'foo\n\tbar'); + assert.equal(snippet2.value, 'foo\n bar'); snippet = SnippetParser.parse('foo\n bar'); - assert.equal(Marker.toString(snippet.marker), 'foo\n bar'); + assert.equal(snippet.value, 'foo\n bar'); let newSnippet = snippet.withIndentation(s => s.replace(/ /, '\t')); - assert.equal(Marker.toString(snippet.marker), 'foo\n bar'); - assert.equal(Marker.toString(newSnippet.marker), 'foo\n\tbar'); + assert.equal(snippet.value, 'foo\n bar'); + assert.equal(newSnippet.value, 'foo\n\tbar'); snippet = SnippetParser.parse('foo\r\n bar\r\n far'); - assert.equal(Marker.toString(snippet.marker), 'foo\r\n bar\r\n far'); + assert.equal(snippet.value, 'foo\r\n bar\r\n far'); newSnippet = snippet.withIndentation(s => s.replace(/ /, '\t')); - assert.equal(Marker.toString(snippet.marker), 'foo\r\n bar\r\n far'); - assert.equal(Marker.toString(newSnippet.marker), 'foo\r\n\tbar\r\n\tfar'); + assert.equal(snippet.value, 'foo\r\n bar\r\n far'); + assert.equal(newSnippet.value, 'foo\r\n\tbar\r\n\tfar'); snippet = SnippetParser.parse('foo${1:bar\r far\r boo}'); - assert.equal(Marker.toString(snippet.marker), 'foobar\r far\r boo'); + assert.equal(snippet.value, 'foobar\r far\r boo'); newSnippet = snippet.withIndentation(s => s.replace(/ /, '\t')); - assert.equal(Marker.toString(snippet.marker), 'foobar\r far\r boo'); - assert.equal(Marker.toString(newSnippet.marker), 'foobar\r\tfar\r\tboo'); + assert.equal(snippet.value, 'foobar\r far\r boo'); + assert.equal(newSnippet.value, 'foobar\r\tfar\r\tboo'); }); }); From 688b96f7dfa37b53b88eec4e6cb9af75a499fe86 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 May 2017 14:54:10 +0200 Subject: [PATCH 0123/1164] fix #26021 --- src/vs/base/browser/dom.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index b2ec45dbb77..21698e938db 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -160,19 +160,25 @@ const _manualClassList = new class { const _nativeClassList = new class { hasClass(node: HTMLElement, className: string): boolean { - return className && node.classList.contains(className); + return className && node.classList && node.classList.contains(className); } addClass(node: HTMLElement, className: string): void { - return className && node.classList.add(className); + if (className && node.classList) { + node.classList.add(className); + } } removeClass(node: HTMLElement, className: string): void { - return className && node.classList.remove(className); + if (className && node.classList) { + node.classList.remove(className); + } } toggleClass(node: HTMLElement, className: string, shouldHaveIt?: boolean): void { - node.classList.toggle(className, shouldHaveIt); + if (node.classList) { + node.classList.toggle(className, shouldHaveIt); + } } }; From 8dd1383ccd4606653f2497f7712ba60da35ddb62 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 5 May 2017 15:34:20 +0200 Subject: [PATCH 0124/1164] debug: introduce internalConsoleOptions in settings fixes #18398 --- src/vs/workbench/parts/debug/common/debug.ts | 7 +++++++ .../parts/debug/electron-browser/debug.contribution.ts | 3 ++- .../parts/debug/electron-browser/debugService.ts | 4 +++- src/vs/workbench/parts/debug/node/debugAdapter.ts | 8 ++------ 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index c870954e3e2..ccee37d19f4 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as nls from 'vs/nls'; import uri from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import severity from 'vs/base/common/severity'; @@ -36,6 +37,11 @@ export const CONTEXT_VARIABLES_FOCUSED = new RawContextKey('variablesFo export const EDITOR_CONTRIBUTION_ID = 'editor.contrib.debug'; export const DEBUG_SCHEME = 'debug'; +export const INTERNAL_CONSOLE_OPTIONS_SCHEMA = { + enum: ['neverOpen', 'openOnSessionStart', 'openOnFirstSessionStart'], + default: 'openOnFirstSessionStart', + description: nls.localize('internalConsoleOptions', "Controls behavior of the internal debug console.") +}; // raw @@ -294,6 +300,7 @@ export interface IDebugConfiguration { openExplorerOnEnd: boolean; inlineValues: boolean; hideActionBar: boolean; + internalConsoleOptions: string; } export interface IGlobalConfig { diff --git a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts index 9baa6c91210..22c7191e517 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts @@ -18,7 +18,7 @@ import { TogglePanelAction, Extensions as PanelExtensions, PanelRegistry, PanelD import { DebugViewRegistry } from 'vs/workbench/parts/debug/browser/debugViewRegistry'; import { VariablesView, WatchExpressionsView, CallStackView, BreakpointsView } from 'vs/workbench/parts/debug/electron-browser/debugViews'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; -import { IDebugService, VIEWLET_ID, REPL_ID, CONTEXT_NOT_IN_DEBUG_MODE, CONTEXT_IN_DEBUG_MODE } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugService, VIEWLET_ID, REPL_ID, CONTEXT_NOT_IN_DEBUG_MODE, CONTEXT_IN_DEBUG_MODE, INTERNAL_CONSOLE_OPTIONS_SCHEMA } from 'vs/workbench/parts/debug/common/debug'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { DebugEditorModelManager } from 'vs/workbench/parts/debug/browser/debugEditorModelManager'; @@ -172,6 +172,7 @@ configurationRegistry.registerConfiguration({ description: nls.localize({ comment: ['This is the description for a setting'], key: 'hideActionBar' }, "Controls if the floating debug action bar should be hidden"), default: false }, + 'debug.internalConsoleOptions': INTERNAL_CONSOLE_OPTIONS_SCHEMA, 'launch': { type: 'object', description: nls.localize({ comment: ['This is the description for a setting'], key: 'launch' }, "Global debug launch configuration. Should be used as an alternative to 'launch.json' that is shared across workspaces"), diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 359b940f29d..0a3a3077956 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -765,7 +765,9 @@ export class DebugService implements debug.IDebugService { if (!this.viewModel.focusedProcess) { this.focusStackFrameAndEvaluate(null, process); } - if (configuration.internalConsoleOptions === 'openOnSessionStart' || (!this.viewModel.changedWorkbenchViewState && configuration.internalConsoleOptions !== 'neverOpen')) { + + const internalConsoleOptions = configuration.internalConsoleOptions || this.configurationService.getConfiguration('debug').internalConsoleOptions; + if (internalConsoleOptions === 'openOnSessionStart' || (!this.viewModel.changedWorkbenchViewState && internalConsoleOptions === 'openOnFirstSessionStart')) { this.panelService.openPanel(debug.REPL_ID, false).done(undefined, errors.onUnexpectedError); } diff --git a/src/vs/workbench/parts/debug/node/debugAdapter.ts b/src/vs/workbench/parts/debug/node/debugAdapter.ts index 6926d85d529..973340ea1d9 100644 --- a/src/vs/workbench/parts/debug/node/debugAdapter.ts +++ b/src/vs/workbench/parts/debug/node/debugAdapter.ts @@ -12,7 +12,7 @@ import * as objects from 'vs/base/common/objects'; import * as paths from 'vs/base/common/paths'; import * as platform from 'vs/base/common/platform'; import { IJSONSchema, IJSONSchemaSnippet } from 'vs/base/common/jsonSchema'; -import { IRawAdapter, IAdapterExecutable } from 'vs/workbench/parts/debug/common/debug'; +import { IRawAdapter, IAdapterExecutable, INTERNAL_CONSOLE_OPTIONS_SCHEMA } from 'vs/workbench/parts/debug/common/debug'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -205,11 +205,7 @@ export class Adapter { default: null, description: nls.localize('debugPrelaunchTask', "Task to run before debug session starts.") }; - properties['internalConsoleOptions'] = { - enum: ['neverOpen', 'openOnSessionStart', 'openOnFirstSessionStart'], - default: 'openOnFirstSessionStart', - description: nls.localize('internalConsoleOptions', "Controls behavior of the internal debug console.") - }; + properties['internalConsoleOptions'] = INTERNAL_CONSOLE_OPTIONS_SCHEMA; const osProperties = objects.deepClone(properties); properties['windows'] = { From c2c39e14a2da62b7aefcbb6c23487d9c6547f338 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 5 May 2017 15:35:22 +0200 Subject: [PATCH 0125/1164] remove legacy git fixes #8809 fixes #24014 --- src/vs/code/electron-main/app.ts | 7 - .../api/node/mainThreadExtensionService.ts | 3 - .../parts/activitybar/activitybarPart.ts | 10 +- src/vs/workbench/electron-browser/shell.ts | 5 +- .../electron-browser/workbench.main.ts | 5 - .../git/browser/gitActions.contribution.ts | 749 ---------- .../workbench/parts/git/browser/gitActions.ts | 1299 ----------------- .../git/browser/gitEditorContributions.ts | 181 --- .../parts/git/browser/gitEditorInputs.ts | 160 -- .../parts/git/browser/gitOperations.ts | 25 - .../workbench/parts/git/browser/gitOutput.ts | 42 - .../parts/git/browser/gitQuickOpen.ts | 271 ---- src/vs/workbench/parts/git/browser/gitScm.ts | 125 -- .../parts/git/browser/gitServices.ts | 908 ------------ .../workbench/parts/git/browser/gitViewlet.ts | 215 --- .../workbench/parts/git/browser/gitWidgets.ts | 209 --- .../git/browser/gitWorkbenchContributions.ts | 241 --- .../parts/git/browser/media/Compare.svg | 1 - .../git/browser/media/Compare_inverse.svg | 1 - .../parts/git/browser/media/OpenEditor.svg | 3 - .../git/browser/media/OpenEditor_inverse.svg | 1 - .../parts/git/browser/media/Refresh.svg | 1 - .../parts/git/browser/media/add-focus.svg | 1 - .../parts/git/browser/media/add-inverse.svg | 1 - .../workbench/parts/git/browser/media/add.svg | 1 - .../parts/git/browser/media/check-inverse.svg | 1 - .../parts/git/browser/media/check.svg | 1 - .../parts/git/browser/media/git-dark.svg | 1 - .../git/browser/media/git.contribution.css | 155 -- .../workbench/parts/git/browser/media/git.svg | 1 - .../parts/git/browser/media/gitViewlet.css | 93 -- .../parts/git/browser/media/pull-inverse.svg | 1 - .../parts/git/browser/media/pull.svg | 1 - .../parts/git/browser/media/push-inverse.svg | 1 - .../parts/git/browser/media/push.svg | 1 - .../git/browser/media/refresh-inverse.svg | 1 - .../git/browser/media/subtract-focus.svg | 1 - .../git/browser/media/subtract-inverse.svg | 1 - .../parts/git/browser/media/subtract.svg | 1 - .../parts/git/browser/media/sync.svg | 1 - .../parts/git/browser/media/undo-focus.svg | 1 - .../parts/git/browser/media/undo-inverse.svg | 1 - .../parts/git/browser/media/undo.svg | 1 - .../git/browser/views/changes/changesView.css | 171 --- .../git/browser/views/changes/changesView.ts | 496 ------- .../browser/views/changes/changesViewer.ts | 921 ------------ .../browser/views/disabled/disabledView.css | 8 - .../browser/views/disabled/disabledView.ts | 63 - .../git/browser/views/empty/emptyView.css | 30 - .../git/browser/views/empty/emptyView.ts | 174 --- .../git/browser/views/gitless/gitlessView.css | 23 - .../git/browser/views/gitless/gitlessView.ts | 98 -- .../parts/git/browser/views/huge/hugeView.css | 12 - .../parts/git/browser/views/huge/hugeView.ts | 86 -- .../git/browser/views/notroot/notrootView.css | 23 - .../git/browser/views/notroot/notrootView.ts | 63 - .../views/noworkspace/noworkspaceView.css | 12 - .../views/noworkspace/noworkspaceView.ts | 95 -- .../workbench/parts/git/browser/views/view.ts | 24 - src/vs/workbench/parts/git/common/git.ts | 342 ----- src/vs/workbench/parts/git/common/gitIpc.ts | 267 ---- src/vs/workbench/parts/git/common/gitModel.ts | 412 ------ .../workbench/parts/git/common/stageRanges.ts | 238 --- .../electron-browser/electronGitService.ts | 235 --- .../git/electron-browser/git.contribution.ts | 44 - .../parts/git/electron-browser/gitActions.ts | 92 -- .../parts/git/electron-main/askpassService.ts | 75 - .../workbench/parts/git/electron-main/git.svg | 6 - .../parts/git/electron-main/index.html | 138 -- src/vs/workbench/parts/git/node/askpass.sh | 5 - src/vs/workbench/parts/git/node/askpass.ts | 58 - src/vs/workbench/parts/git/node/git.lib.ts | 735 ---------- src/vs/workbench/parts/git/node/gitApp.ts | 15 - .../workbench/parts/git/node/rawGitService.ts | 237 --- .../parts/git/node/rawGitServiceBootstrap.ts | 52 - .../parts/git/node/unscopedGitService.ts | 135 -- .../parts/git/test/common/gitModel.test.ts | 188 --- .../parts/git/test/common/stageRanges.test.ts | 475 ------ .../workbench/parts/scm/browser/scmPreview.ts | 96 -- .../scm/electron-browser/scm.contribution.ts | 59 +- .../welcome/overlay/browser/welcomeOverlay.ts | 3 +- .../electron-browser/walkThroughPart.ts | 5 +- 82 files changed, 32 insertions(+), 10908 deletions(-) delete mode 100644 src/vs/workbench/parts/git/browser/gitActions.contribution.ts delete mode 100644 src/vs/workbench/parts/git/browser/gitActions.ts delete mode 100644 src/vs/workbench/parts/git/browser/gitEditorContributions.ts delete mode 100644 src/vs/workbench/parts/git/browser/gitEditorInputs.ts delete mode 100644 src/vs/workbench/parts/git/browser/gitOperations.ts delete mode 100644 src/vs/workbench/parts/git/browser/gitOutput.ts delete mode 100644 src/vs/workbench/parts/git/browser/gitQuickOpen.ts delete mode 100644 src/vs/workbench/parts/git/browser/gitScm.ts delete mode 100644 src/vs/workbench/parts/git/browser/gitServices.ts delete mode 100644 src/vs/workbench/parts/git/browser/gitViewlet.ts delete mode 100644 src/vs/workbench/parts/git/browser/gitWidgets.ts delete mode 100644 src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts delete mode 100644 src/vs/workbench/parts/git/browser/media/Compare.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/Compare_inverse.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/OpenEditor.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/OpenEditor_inverse.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/Refresh.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/add-focus.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/add-inverse.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/add.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/check-inverse.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/check.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/git-dark.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/git.contribution.css delete mode 100644 src/vs/workbench/parts/git/browser/media/git.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/gitViewlet.css delete mode 100644 src/vs/workbench/parts/git/browser/media/pull-inverse.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/pull.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/push-inverse.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/push.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/refresh-inverse.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/subtract-focus.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/subtract-inverse.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/subtract.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/sync.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/undo-focus.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/undo-inverse.svg delete mode 100644 src/vs/workbench/parts/git/browser/media/undo.svg delete mode 100644 src/vs/workbench/parts/git/browser/views/changes/changesView.css delete mode 100644 src/vs/workbench/parts/git/browser/views/changes/changesView.ts delete mode 100644 src/vs/workbench/parts/git/browser/views/changes/changesViewer.ts delete mode 100644 src/vs/workbench/parts/git/browser/views/disabled/disabledView.css delete mode 100644 src/vs/workbench/parts/git/browser/views/disabled/disabledView.ts delete mode 100644 src/vs/workbench/parts/git/browser/views/empty/emptyView.css delete mode 100644 src/vs/workbench/parts/git/browser/views/empty/emptyView.ts delete mode 100644 src/vs/workbench/parts/git/browser/views/gitless/gitlessView.css delete mode 100644 src/vs/workbench/parts/git/browser/views/gitless/gitlessView.ts delete mode 100644 src/vs/workbench/parts/git/browser/views/huge/hugeView.css delete mode 100644 src/vs/workbench/parts/git/browser/views/huge/hugeView.ts delete mode 100644 src/vs/workbench/parts/git/browser/views/notroot/notrootView.css delete mode 100644 src/vs/workbench/parts/git/browser/views/notroot/notrootView.ts delete mode 100644 src/vs/workbench/parts/git/browser/views/noworkspace/noworkspaceView.css delete mode 100644 src/vs/workbench/parts/git/browser/views/noworkspace/noworkspaceView.ts delete mode 100644 src/vs/workbench/parts/git/browser/views/view.ts delete mode 100644 src/vs/workbench/parts/git/common/git.ts delete mode 100644 src/vs/workbench/parts/git/common/gitIpc.ts delete mode 100644 src/vs/workbench/parts/git/common/gitModel.ts delete mode 100644 src/vs/workbench/parts/git/common/stageRanges.ts delete mode 100644 src/vs/workbench/parts/git/electron-browser/electronGitService.ts delete mode 100644 src/vs/workbench/parts/git/electron-browser/git.contribution.ts delete mode 100644 src/vs/workbench/parts/git/electron-browser/gitActions.ts delete mode 100644 src/vs/workbench/parts/git/electron-main/askpassService.ts delete mode 100644 src/vs/workbench/parts/git/electron-main/git.svg delete mode 100644 src/vs/workbench/parts/git/electron-main/index.html delete mode 100755 src/vs/workbench/parts/git/node/askpass.sh delete mode 100644 src/vs/workbench/parts/git/node/askpass.ts delete mode 100644 src/vs/workbench/parts/git/node/git.lib.ts delete mode 100644 src/vs/workbench/parts/git/node/gitApp.ts delete mode 100644 src/vs/workbench/parts/git/node/rawGitService.ts delete mode 100644 src/vs/workbench/parts/git/node/rawGitServiceBootstrap.ts delete mode 100644 src/vs/workbench/parts/git/node/unscopedGitService.ts delete mode 100644 src/vs/workbench/parts/git/test/common/gitModel.test.ts delete mode 100644 src/vs/workbench/parts/git/test/common/stageRanges.test.ts delete mode 100644 src/vs/workbench/parts/scm/browser/scmPreview.ts diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 151d6ac5b20..03609bc5772 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -20,8 +20,6 @@ import { UpdateChannel } from 'vs/platform/update/common/updateIpc'; import { UpdateService } from 'vs/platform/update/electron-main/updateService'; import { Server as ElectronIPCServer } from 'vs/base/parts/ipc/electron-main/ipc.electron-main'; import { Server, connect, Client } from 'vs/base/parts/ipc/node/ipc.net'; -import { AskpassChannel } from 'vs/workbench/parts/git/common/gitIpc'; -import { GitAskpassService } from 'vs/workbench/parts/git/electron-main/askpassService'; import { SharedProcess } from 'vs/code/electron-main/sharedProcess'; import { Mutex } from 'windows-mutex'; import { LaunchService, LaunchChannel, ILaunchService } from './launch'; @@ -138,11 +136,6 @@ export class VSCodeApplication { app.setAppUserModelId(product.win32AppUserModelId); } - // Register Main IPC connections - const askpassService = new GitAskpassService(); - const askpassChannel = new AskpassChannel(askpassService); - this.mainIpcServer.registerChannel('askpass', askpassChannel); - // Create Electron IPC Server this.electronIpcServer = new ElectronIPCServer(); diff --git a/src/vs/workbench/api/node/mainThreadExtensionService.ts b/src/vs/workbench/api/node/mainThreadExtensionService.ts index 414cc32accf..05ca99e2f24 100644 --- a/src/vs/workbench/api/node/mainThreadExtensionService.ts +++ b/src/vs/workbench/api/node/mainThreadExtensionService.ts @@ -60,8 +60,6 @@ export class MainProcessExtensionService extends AbstractExtensionService scm viewlet - - const map = SCMPreview.enabled - ? (id => id === 'workbench.view.git' ? 'workbench.view.scm' : id) - : (id => id === 'workbench.view.scm' ? 'workbench.view.git' : id); - this.pinnedViewlets = pinnedViewlets - .map(map) + // TODO@Ben: Migrate git => scm viewlet + .map(id => id === 'workbench.view.git' ? 'workbench.view.scm' : id) .filter(arrays.uniqueFilter(str => str)); } else { diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 03296bc74ab..33d9257064c 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -97,7 +97,6 @@ import { MainProcessTextMateSyntax } from 'vs/editor/electron-browser/textMate/T import { BareFontInfo } from 'vs/editor/common/config/fontInfo'; import { restoreFontInfo, readFontInfo, saveFontInfo } from 'vs/editor/browser/config/configuration'; import * as browser from 'vs/base/browser/browser'; -import SCMPreview from 'vs/workbench/parts/scm/browser/scmPreview'; import { readdir } from 'vs/base/node/pfs'; import { join } from 'path'; import 'vs/platform/opener/browser/opener.contribution'; @@ -386,9 +385,7 @@ export class WorkbenchShell { this.timerService.beforeExtensionLoad = Date.now(); - // TODO@Joao: remove - const disabledExtensions = SCMPreview.enabled ? [] : ['vscode.git']; - this.extensionService = instantiationService.createInstance(MainProcessExtensionService, disabledExtensions); + this.extensionService = instantiationService.createInstance(MainProcessExtensionService); serviceCollection.set(IExtensionService, this.extensionService); extensionHostProcessWorker.start(this.extensionService); this.extensionService.onReady().done(() => { diff --git a/src/vs/workbench/electron-browser/workbench.main.ts b/src/vs/workbench/electron-browser/workbench.main.ts index 8b287038985..f71d678b112 100644 --- a/src/vs/workbench/electron-browser/workbench.main.ts +++ b/src/vs/workbench/electron-browser/workbench.main.ts @@ -45,11 +45,6 @@ import 'vs/workbench/parts/search/browser/openAnythingHandler'; // can be packag import 'vs/workbench/parts/scm/electron-browser/scm.contribution'; import 'vs/workbench/parts/scm/electron-browser/scmViewlet'; // can be packaged separately -import 'vs/workbench/parts/git/electron-browser/git.contribution'; -import 'vs/workbench/parts/git/browser/gitQuickOpen'; -import 'vs/workbench/parts/git/browser/gitActions.contribution'; -import 'vs/workbench/parts/git/browser/gitViewlet'; // can be packaged separately - import 'vs/workbench/parts/debug/electron-browser/debug.contribution'; import 'vs/workbench/parts/debug/browser/debugQuickOpen'; import 'vs/workbench/parts/debug/electron-browser/repl'; diff --git a/src/vs/workbench/parts/git/browser/gitActions.contribution.ts b/src/vs/workbench/parts/git/browser/gitActions.contribution.ts deleted file mode 100644 index 6d2ea142908..00000000000 --- a/src/vs/workbench/parts/git/browser/gitActions.contribution.ts +++ /dev/null @@ -1,749 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import nls = require('vs/nls'); -import lifecycle = require('vs/base/common/lifecycle'); -import platform = require('vs/platform/platform'); -import abr = require('vs/workbench/browser/actionBarRegistry'); -import { TPromise } from 'vs/base/common/winjs.base'; -import editorbrowser = require('vs/editor/browser/editorBrowser'); -import editorcommon = require('vs/editor/common/editorCommon'); -import baseeditor = require('vs/workbench/browser/parts/editor/baseEditor'); -import WorkbenchEditorCommon = require('vs/workbench/common/editor'); -import tdeditor = require('vs/workbench/browser/parts/editor/textDiffEditor'); -import teditor = require('vs/workbench/browser/parts/editor/textEditor'); -import filesCommon = require('vs/workbench/parts/files/common/files'); -import gitcontrib = require('vs/workbench/parts/git/browser/gitWorkbenchContributions'); -import diffei = require('vs/workbench/common/editor/diffEditorInput'); -import { IGitService, Status, IFileStatus, StatusType } from 'vs/workbench/parts/git/common/git'; -import gitei = require('vs/workbench/parts/git/browser/gitEditorInputs'); -import { getSelectedChanges, applyChangesToModel, getChangeRevertEdits } from 'vs/workbench/parts/git/common/stageRanges'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { IViewlet } from 'vs/workbench/common/viewlet'; -import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { IFileService } from 'vs/platform/files/common/files'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import wbar = require('vs/workbench/common/actionRegistry'); -import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; -import { - OpenChangeAction, OpenFileAction, SyncAction, PullAction, PushAction, - PushToRemoteAction, PublishAction, StartGitBranchAction, StartGitCheckoutAction, - InputCommitAction, UndoLastCommitAction, BaseStageAction, BaseUnstageAction, - PullWithRebaseAction -} from './gitActions'; -import paths = require('vs/base/common/paths'); -import URI from 'vs/base/common/uri'; -import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; -import SCMPreview from 'vs/workbench/parts/scm/browser/scmPreview'; -import { IMessageService } from 'vs/platform/message/common/message'; - -function getStatus(gitService: IGitService, contextService: IWorkspaceContextService, input: WorkbenchEditorCommon.IFileEditorInput): IFileStatus { - const model = gitService.getModel(); - const repositoryRoot = model.getRepositoryRoot(); - const statusModel = model.getStatus(); - const repositoryRelativePath = paths.normalize(paths.relative(repositoryRoot, input.getResource().fsPath)); - - return statusModel.getWorkingTreeStatus().find(repositoryRelativePath) || - statusModel.getIndexStatus().find(repositoryRelativePath) || - statusModel.getMergeStatus().find(repositoryRelativePath); -} - -class OpenInDiffAction extends baseeditor.EditorInputAction { - - static ID = 'workbench.action.git.openInDiff'; - static Label = nls.localize('switchToChangesView', "Switch to Changes View"); - - private gitService: IGitService; - private viewletService: IViewletService; - private editorService: IWorkbenchEditorService; - private partService: IPartService; - private contextService: IWorkspaceContextService; - private toDispose: lifecycle.IDisposable[]; - - constructor( @IWorkbenchEditorService editorService: IWorkbenchEditorService, @IGitService gitService: IGitService, @IViewletService viewletService: IViewletService, @IPartService partService: IPartService, @IWorkspaceContextService contextService: IWorkspaceContextService) { - super(OpenInDiffAction.ID, OpenInDiffAction.Label); - - this.class = 'git-action open-in-diff'; - this.gitService = gitService; - this.viewletService = viewletService; - this.editorService = editorService; - this.partService = partService; - this.contextService = contextService; - - this.toDispose = [this.gitService.addBulkListener(() => this.onGitStateChanged())]; - - this.enabled = this.isEnabled(); - } - - public isEnabled(): boolean { - if (!super.isEnabled()) { - return false; - } - - const model = this.gitService.getModel(); - if (!model || !(typeof model.getRepositoryRoot() === 'string')) { - return false; - } - - var status = this.getStatus(); - - return status && ( - status.getStatus() === Status.MODIFIED || - status.getStatus() === Status.INDEX_MODIFIED || - status.getStatus() === Status.INDEX_RENAMED - ); - } - - private onGitStateChanged(): void { - if (this.gitService.isIdle()) { - this.enabled = this.isEnabled(); - } - } - - private getStatus(): IFileStatus { - return getStatus(this.gitService, this.contextService, this.input); - } - - public run(context?: WorkbenchEditorCommon.IEditorContext): TPromise { - const event = context ? context.event : null; - const sideBySide = !!(event && (event.ctrlKey || event.metaKey)); - const editor = this.editorService.getActiveEditor().getControl(); - const viewState = editor ? editor.saveViewState() : null; - - return this.gitService.getInput(this.getStatus()).then((input) => { - var promise = TPromise.as(null); - - if (this.partService.isVisible(Parts.SIDEBAR_PART)) { - promise = this.viewletService.openViewlet(gitcontrib.VIEWLET_ID, false); - } - - return promise.then(() => { - var options = new WorkbenchEditorCommon.TextDiffEditorOptions(); - options.forceOpen = true; - options.autoRevealFirstChange = false; - - return this.editorService.openEditor(input, options, sideBySide).then((editor) => { - if (viewState) { - var codeEditor = this.editorService.getActiveEditor().getControl(); - codeEditor.restoreViewState({ - original: { - cursorState: undefined, - viewState: undefined, - contributionsState: undefined - }, - modified: viewState - }); - } - }); - }); - }); - } - - public dispose(): void { - this.toDispose = lifecycle.dispose(this.toDispose); - } -} - -class OpenInEditorAction extends baseeditor.EditorInputAction { - - private static DELETED_STATES = [Status.BOTH_DELETED, Status.DELETED, Status.DELETED_BY_US, Status.INDEX_DELETED]; - static ID = 'workbench.action.git.openInEditor'; - static LABEL = nls.localize('openInEditor', "Switch to Editor View"); - - private gitService: IGitService; - private fileService: IFileService; - private viewletService: IViewletService; - private editorService: IWorkbenchEditorService; - private partService: IPartService; - private contextService: IWorkspaceContextService; - - constructor( @IFileService fileService: IFileService, @IWorkbenchEditorService editorService: IWorkbenchEditorService, @IGitService gitService: IGitService, @IViewletService viewletService: IViewletService, @IPartService partService: IPartService, @IWorkspaceContextService contextService: IWorkspaceContextService) { - super(OpenInEditorAction.ID, OpenInEditorAction.LABEL); - - this.class = 'git-action open-in-editor'; - this.gitService = gitService; - this.fileService = fileService; - this.viewletService = viewletService; - this.editorService = editorService; - this.partService = partService; - this.contextService = contextService; - - this.enabled = this.isEnabled(); - } - - public isEnabled(): boolean { - if (!super.isEnabled()) { - return false; - } - - const model = this.gitService.getModel(); - if (!model || !(typeof model.getRepositoryRoot() === 'string')) { - return false; - } - - var status: IFileStatus = (this.input).getFileStatus(); - if (OpenInEditorAction.DELETED_STATES.indexOf(status.getStatus()) > -1) { - return false; - } - - return true; - } - - public run(context?: WorkbenchEditorCommon.IEditorContext): TPromise { - const model = this.gitService.getModel(); - const resource = URI.file(paths.join(model.getRepositoryRoot(), this.getRepositoryRelativePath())); - const event = context ? context.event : null; - const sideBySide = !!(event && (event.ctrlKey || event.metaKey)); - const modifiedViewState = this.saveTextViewState(); - - return this.fileService.resolveFile(resource).then(stat => { - return this.editorService.openEditor({ - resource: stat.resource, - options: { - forceOpen: true - } - }, sideBySide).then(editor => { - this.restoreTextViewState(modifiedViewState); - - if (this.partService.isVisible(Parts.SIDEBAR_PART)) { - return this.viewletService.openViewlet(filesCommon.VIEWLET_ID, false); - } - return undefined; - }); - }); - } - - private saveTextViewState(): editorcommon.ICodeEditorViewState { - var textEditor = this.getTextEditor(); - if (textEditor) { - return textEditor.saveViewState(); - } - - return null; - } - - private restoreTextViewState(state: editorcommon.ICodeEditorViewState): void { - var textEditor = this.getTextEditor(); - if (textEditor) { - return textEditor.restoreViewState(state); - } - } - - private getTextEditor(): editorcommon.ICommonCodeEditor { - var editor = this.editorService.getActiveEditor(); - - if (editor instanceof tdeditor.TextDiffEditor) { - return (editor.getControl()).getModifiedEditor(); - } else if (editor instanceof teditor.BaseTextEditor) { - return editor.getControl(); - } - - return null; - } - - private getRepositoryRelativePath(): string { - var status: IFileStatus = (this.input).getFileStatus(); - - if (status.getStatus() === Status.INDEX_RENAMED) { - return status.getRename(); - } else { - var indexStatus = this.gitService.getModel().getStatus().find(status.getPath(), StatusType.INDEX); - - if (indexStatus && indexStatus.getStatus() === Status.INDEX_RENAMED) { - return indexStatus.getRename(); - } else { - return status.getPath(); - } - } - } -} - -export class WorkbenchStageAction extends BaseStageAction { - - static ID = 'workbench.action.git.stage'; - static LABEL = nls.localize('workbenchStage', "Stage"); - private contextService: IWorkspaceContextService; - - constructor( - id = WorkbenchStageAction.ID, - label = WorkbenchStageAction.LABEL, - @IGitService gitService: IGitService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService, - @IWorkspaceContextService contextService: IWorkspaceContextService - ) { - super(id, label, '', gitService, editorService); - this.contextService = contextService; - this.onGitServiceChange(); - } - - protected updateEnablement(): void { - if (this.contextService) { - this.enabled = this.isEnabled(); - } else { - this.enabled = super.isEnabled(); - } - } - - isEnabled(): boolean { - if (!super.isEnabled()) { - return false; - } - - const editor = this.editorService.getActiveEditor(); - if (!editor || !(editor instanceof baseeditor.BaseEditor)) { - return false; - } - - return true; - } - - run(context?: any): TPromise { - const input = this.editorService.getActiveEditor().input; - let fileStatus: IFileStatus; - - if (gitei.isGitEditorInput(input)) { - const gitInput = input as gitei.GitDiffEditorInput; - fileStatus = gitInput.getFileStatus(); - } else { - fileStatus = getStatus(this.gitService, this.contextService, input as WorkbenchEditorCommon.IFileEditorInput); - } - - if (!fileStatus) { - return TPromise.as(null); - } - - return super.run(fileStatus); - } -} - -export class WorkbenchUnstageAction extends BaseUnstageAction { - - static ID = 'workbench.action.git.unstage'; - static LABEL = nls.localize('workbenchUnstage', "Unstage"); - private contextService: IWorkspaceContextService; - - constructor( - id = WorkbenchUnstageAction.ID, - label = WorkbenchUnstageAction.LABEL, - @IGitService gitService: IGitService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService, - @IWorkspaceContextService contextService: IWorkspaceContextService - ) { - super(id, label, '', gitService, editorService); - this.contextService = contextService; - this.onGitServiceChange(); - } - - protected updateEnablement(): void { - if (this.contextService) { - this.enabled = this.isEnabled(); - } else { - this.enabled = super.isEnabled(); - } - } - - isEnabled(): boolean { - if (!super.isEnabled()) { - return false; - } - - const editor = this.editorService.getActiveEditor(); - if (!editor || !(editor instanceof baseeditor.BaseEditor)) { - return false; - } - - return true; - } - - run(context?: any): TPromise { - const input = this.editorService.getActiveEditor().input; - let fileStatus: IFileStatus; - - if (gitei.isGitEditorInput(input)) { - const gitInput = input as gitei.GitDiffEditorInput; - fileStatus = gitInput.getFileStatus(); - } else { - fileStatus = getStatus(this.gitService, this.contextService, input as WorkbenchEditorCommon.IFileEditorInput); - } - - if (!fileStatus) { - return TPromise.as(null); - } - - return super.run(fileStatus); - } -} - -export abstract class BaseStageRangesAction extends baseeditor.EditorInputAction { - private gitService: IGitService; - private editorService: IWorkbenchEditorService; - private editor: editorbrowser.IDiffEditor; - - constructor(id: string, label: string, editor: tdeditor.TextDiffEditor, @IGitService gitService: IGitService, @IWorkbenchEditorService editorService: IWorkbenchEditorService) { - super(id, label); - - this.editorService = editorService; - this.gitService = gitService; - this.editor = editor.getControl(); - this.editor.getModifiedEditor().onDidChangeCursorSelection(() => this.updateEnablement()); - this.editor.onDidUpdateDiff(() => this.updateEnablement()); - this.class = 'git-action stage-ranges'; - } - - public isEnabled(): boolean { - if (!super.isEnabled()) { - return false; - } - - if (!this.gitService || !this.editorService) { - return false; - } - - var changes = this.editor.getLineChanges(); - var selections = this.editor.getSelections(); - - if (!changes || !selections || selections.length === 0) { - return false; - } - - return getSelectedChanges(changes, selections).length > 0; - } - - protected getRangesAppliedResult(editor: editorbrowser.IDiffEditor) { - var selections = editor.getSelections(); - var changes = getSelectedChanges(editor.getLineChanges(), selections); - return applyChangesToModel(editor.getModel().original, editor.getModel().modified, changes); - } - - public run(): TPromise { - var result = this.getRangesAppliedResult(this.editor); - - var status = (this.input).getFileStatus(); - var path = status.getPath(); - var viewState = this.editor.saveViewState(); - - return this.gitService.stage(status.getPath(), result).then(() => { - var statusModel = this.gitService.getModel().getStatus(); - - status = statusModel.getWorkingTreeStatus().find(path) || statusModel.getIndexStatus().find(path); - - if (status) { - return this.gitService.getInput(status).then((input) => { - var options = new WorkbenchEditorCommon.TextDiffEditorOptions(); - options.forceOpen = true; - options.autoRevealFirstChange = false; - - return this.editorService.openEditor(input, options, this.position).then(() => { - this.editor.restoreViewState(viewState); - }); - }); - } - return undefined; - }); - } - - private updateEnablement(): void { - this.enabled = this.isEnabled(); - } -} - -export class StageRangesAction extends BaseStageRangesAction { - static ID = 'workbench.action.git.stageRanges'; - static LABEL = nls.localize('stageSelectedLines', "Stage Selected Lines"); - - constructor(editor: tdeditor.TextDiffEditor, @IGitService gitService: IGitService, @IWorkbenchEditorService editorService: IWorkbenchEditorService) { - super(StageRangesAction.ID, StageRangesAction.LABEL, editor, gitService, editorService); - } -} - -export class UnstageRangesAction extends BaseStageRangesAction { - static ID = 'workbench.action.git.unstageRanges'; - static LABEL = nls.localize('unstageSelectedLines', "Unstage Selected Lines"); - - constructor(editor: tdeditor.TextDiffEditor, @IGitService gitService: IGitService, @IWorkbenchEditorService editorService: IWorkbenchEditorService) { - super(UnstageRangesAction.ID, UnstageRangesAction.LABEL, editor, gitService, editorService); - } - - protected getRangesAppliedResult(editor: editorbrowser.IDiffEditor) { - const selections = editor.getSelections(); - const changes = getSelectedChanges(editor.getLineChanges(), selections) - .map(c => ({ - modifiedStartLineNumber: c.originalStartLineNumber, - modifiedEndLineNumber: c.originalEndLineNumber, - originalStartLineNumber: c.modifiedStartLineNumber, - originalEndLineNumber: c.modifiedEndLineNumber - })); - - return applyChangesToModel(editor.getModel().modified, editor.getModel().original, changes); - } -} - -export class RevertRangesAction extends baseeditor.EditorInputAction { - static ID = 'workbench.action.git.revertRanges'; - static LABEL = nls.localize('revertSelectedLines', "Revert Selected Lines"); - - private editor: editorbrowser.IDiffEditor; - - constructor( - editor: tdeditor.TextDiffEditor, - @IWorkbenchEditorService private editorService: IWorkbenchEditorService, - @IMessageService private messageService: IMessageService - ) { - super(RevertRangesAction.ID, RevertRangesAction.LABEL); - - this.editor = editor.getControl(); - this.editor.getModifiedEditor().onDidChangeCursorSelection(() => this.updateEnablement()); - this.editor.onDidUpdateDiff(() => this.updateEnablement()); - this.class = 'git-action revert-ranges'; - } - - public isEnabled(): boolean { - if (!super.isEnabled()) { - return false; - } - - if (!this.editorService) { - return false; - } - - const changes = this.editor.getLineChanges(); - const selections = this.editor.getSelections(); - - if (!changes || !selections || selections.length === 0) { - return false; - } - - return getSelectedChanges(changes, selections).length > 0; - } - - public run(): TPromise { - const selections = this.editor.getSelections(); - const changes = getSelectedChanges(this.editor.getLineChanges(), selections); - const { original, modified } = this.editor.getModel(); - - const revertEdits = getChangeRevertEdits(original, modified, changes); - - if (revertEdits.length === 0) { - return TPromise.as(null); - } - - const confirm = { - message: nls.localize('confirmRevertMessage', "Are you sure you want to revert the selected changes?"), - detail: nls.localize('irreversible', "This action is irreversible!"), - primaryButton: nls.localize({ key: 'revertChangesLabel', comment: ['&& denotes a mnemonic'] }, "&&Revert Changes") - }; - - if (!this.messageService.confirm(confirm)) { - return TPromise.as(null); - } - - modified.pushEditOperations(selections, revertEdits, () => selections); - modified.pushStackElement(); - - return TPromise.wrap(null); - } - - private updateEnablement(): void { - this.enabled = this.isEnabled(); - } -} - -class FileEditorActionContributor extends baseeditor.EditorInputActionContributor { - private instantiationService: IInstantiationService; - - constructor( @IInstantiationService instantiationService: IInstantiationService) { - super(); - - this.instantiationService = instantiationService; - } - - public hasActionsForEditorInput(context: baseeditor.IEditorInputActionContext): boolean { - return context.input instanceof FileEditorInput; - } - - public getActionsForEditorInput(context: baseeditor.IEditorInputActionContext): baseeditor.IEditorInputAction[] { - return [this.instantiationService.createInstance(OpenInDiffAction)]; - } -} - -class GitEditorActionContributor extends baseeditor.EditorInputActionContributor { - private instantiationService: IInstantiationService; - - constructor( @IInstantiationService instantiationService: IInstantiationService) { - super(); - - this.instantiationService = instantiationService; - } - - public hasActionsForEditorInput(context: baseeditor.IEditorInputActionContext): boolean { - return gitei.isGitEditorInput(context.input); - } - - public getActionsForEditorInput(context: baseeditor.IEditorInputActionContext): baseeditor.IEditorInputAction[] { - return [this.instantiationService.createInstance(OpenInEditorAction)]; - } -} - -class GitWorkingTreeDiffEditorActionContributor extends baseeditor.EditorInputActionContributor { - private instantiationService: IInstantiationService; - - constructor( @IInstantiationService instantiationService: IInstantiationService) { - super(); - - this.instantiationService = instantiationService; - } - - public hasSecondaryActionsForEditorInput(context: baseeditor.IEditorInputActionContext): boolean { - return (context.input instanceof gitei.GitDiffEditorInput && context.editor instanceof tdeditor.TextDiffEditor); - } - - public getSecondaryActionsForEditorInput(context: baseeditor.IEditorInputActionContext): baseeditor.IEditorInputAction[] { - if (context.input instanceof gitei.GitIndexDiffEditorInput) { - return [this.instantiationService.createInstance(UnstageRangesAction, context.editor)]; - } - - return [ - this.instantiationService.createInstance(StageRangesAction, context.editor), - this.instantiationService.createInstance(RevertRangesAction, context.editor)]; - } -} - -class GlobalOpenChangeAction extends OpenChangeAction { - - static ID = 'workbench.action.git.globalOpenChange'; - static LABEL = nls.localize('openChange', "Open Change"); - - constructor( - id: string, - label: string, - @IWorkbenchEditorService editorService: IWorkbenchEditorService, - @IGitService gitService: IGitService, - @IWorkspaceContextService protected contextService: IWorkspaceContextService, - @IViewletService protected viewletService: IViewletService, - @IPartService protected partService: IPartService - ) { - super(editorService, gitService); - } - - public getInput(): WorkbenchEditorCommon.IFileEditorInput { - const input = this.editorService.getActiveEditorInput(); - if (input instanceof FileEditorInput) { - return input; - } - - return null; - } - - public run(context?: any): TPromise { - let input = this.getInput(); - - if (!input) { - return TPromise.as(null); - } - - let status = getStatus(this.gitService, this.contextService, input); - - if (!status) { - return TPromise.as(null); - } - - var sideBySide = !!(context && (context.ctrlKey || context.metaKey)); - var editor = this.editorService.getActiveEditor().getControl(); - var viewState = editor ? editor.saveViewState() : null; - - return this.gitService.getInput(status).then((input) => { - var promise = TPromise.as(null); - - if (this.partService.isVisible(Parts.SIDEBAR_PART)) { - promise = this.viewletService.openViewlet(gitcontrib.VIEWLET_ID, false); - } - - return promise.then(() => { - var options = new WorkbenchEditorCommon.TextDiffEditorOptions(); - options.forceOpen = true; - options.autoRevealFirstChange = false; - - return this.editorService.openEditor(input, options, sideBySide).then((editor) => { - if (viewState) { - var codeEditor = this.editorService.getActiveEditor().getControl(); - codeEditor.restoreViewState({ - original: { - cursorState: undefined, - viewState: undefined, - contributionsState: undefined - }, - modified: viewState - }); - } - }); - }); - }); - } -} - -class GlobalOpenInEditorAction extends OpenFileAction { - - static ID = 'workbench.action.git.globalOpenFile'; - static LABEL = nls.localize('openFile', "Open File"); - - constructor( - id = GlobalOpenInEditorAction.ID, - label = GlobalOpenInEditorAction.LABEL, - @IWorkbenchEditorService editorService: IWorkbenchEditorService, - @IFileService fileService: IFileService, - @IGitService gitService: IGitService, - @IWorkspaceContextService contextService: IWorkspaceContextService - ) { - super(editorService, fileService, gitService, contextService); - } - - public run(event?: any): TPromise { - let input = this.editorService.getActiveEditorInput(); - if (input instanceof diffei.DiffEditorInput) { - input = input.modifiedInput; - } - - if (!(input instanceof FileEditorInput)) { - return TPromise.as(null); - } - - const status = getStatus(this.gitService, this.contextService, input); - - if (!status) { - return TPromise.as(null); - } - - return super.run(status); - } -} - -if (!SCMPreview.enabled) { - var actionBarRegistry = platform.Registry.as(abr.Extensions.Actionbar); - actionBarRegistry.registerActionBarContributor(abr.Scope.EDITOR, FileEditorActionContributor); - actionBarRegistry.registerActionBarContributor(abr.Scope.EDITOR, GitEditorActionContributor); - actionBarRegistry.registerActionBarContributor(abr.Scope.EDITOR, GitWorkingTreeDiffEditorActionContributor); - - let workbenchActionRegistry = (platform.Registry.as(wbar.Extensions.WorkbenchActions)); - - // Register Actions - const category = nls.localize('git', "Git"); - workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(GlobalOpenChangeAction, GlobalOpenChangeAction.ID, GlobalOpenChangeAction.LABEL), 'Git: Open Change', category); - workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(GlobalOpenInEditorAction, GlobalOpenInEditorAction.ID, GlobalOpenInEditorAction.LABEL), 'Git: Open File', category); - workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(PullAction, PullAction.ID, PullAction.LABEL), 'Git: Pull', category); - workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(PullWithRebaseAction, PullWithRebaseAction.ID, PullWithRebaseAction.LABEL), 'Git: Pull (Rebase)', category); - workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(PushAction, PushAction.ID, PushAction.LABEL), 'Git: Push', category); - workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(PushToRemoteAction, PushToRemoteAction.ID, PushToRemoteAction.LABEL), 'Git: Push to...', category); - workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(SyncAction, SyncAction.ID, SyncAction.LABEL), 'Git: Sync', category); - workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(PublishAction, PublishAction.ID, PublishAction.LABEL), 'Git: Publish', category); - workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(StartGitBranchAction, StartGitBranchAction.ID, StartGitBranchAction.LABEL), 'Git: Branch', category); - workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(StartGitCheckoutAction, StartGitCheckoutAction.ID, StartGitCheckoutAction.LABEL), 'Git: Checkout', category); - workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(InputCommitAction, InputCommitAction.ID, InputCommitAction.LABEL), 'Git: Commit', category); - workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(UndoLastCommitAction, UndoLastCommitAction.ID, UndoLastCommitAction.LABEL), 'Git: Undo Last Commit', category); - workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(WorkbenchStageAction, WorkbenchStageAction.ID, WorkbenchStageAction.LABEL), 'Git: Stage', category); - workbenchActionRegistry.registerWorkbenchAction(new SyncActionDescriptor(WorkbenchUnstageAction, WorkbenchUnstageAction.ID, WorkbenchUnstageAction.LABEL), 'Git: Unstage', category); -} diff --git a/src/vs/workbench/parts/git/browser/gitActions.ts b/src/vs/workbench/parts/git/browser/gitActions.ts deleted file mode 100644 index 0b80d5e1663..00000000000 --- a/src/vs/workbench/parts/git/browser/gitActions.ts +++ /dev/null @@ -1,1299 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { Promise, TPromise } from 'vs/base/common/winjs.base'; -import nls = require('vs/nls'); -import { IEventEmitter } from 'vs/base/common/eventEmitter'; -import { ITree } from 'vs/base/parts/tree/browser/tree'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { isString } from 'vs/base/common/types'; -import { Action } from 'vs/base/common/actions'; -import { IDiffEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import model = require('vs/workbench/parts/git/common/gitModel'); -import inputs = require('vs/workbench/parts/git/browser/gitEditorInputs'); -import { TextDiffEditorOptions } from 'vs/workbench/common/editor'; -import errors = require('vs/base/common/errors'); -import platform = require('vs/base/common/platform'); -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { IEditor } from 'vs/platform/editor/common/editor'; -import { IFileService, IFileStat } from 'vs/platform/files/common/files'; -import { IMessageService, IConfirmation, IChoiceService } from 'vs/platform/message/common/message'; -import Severity from 'vs/base/common/severity'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IGitService, IFileStatus, Status, StatusType, ServiceState, IModel, IBranch, GitErrorCodes, IGitConfiguration } from 'vs/workbench/parts/git/common/git'; -import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; -import paths = require('vs/base/common/paths'); -import URI from 'vs/base/common/uri'; -import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; - -function flatten(context?: any, preferFocus = false): IFileStatus[] { - if (!context) { - return context; - - } else if (Array.isArray(context)) { - if (context.some((c: any) => !(c instanceof model.FileStatus))) { - throw new Error('Invalid context.'); - } - return context; - - } else if (context instanceof model.FileStatus) { - return [context]; - - } else if (context instanceof model.StatusGroup) { - return (context).all(); - - } else if (context.tree) { - var elements = (context.tree).getSelection(); - return elements.indexOf(context.fileStatus) > -1 ? elements : [context.fileStatus]; - - } else if (context.selection) { - return !preferFocus && context.selection.indexOf(context.focus) > -1 ? context.selection : [context.focus]; - - } else { - throw new Error('Invalid context.'); - } -} - -export abstract class GitAction extends Action { - - protected gitService: IGitService; - protected toDispose: IDisposable[]; - - constructor(id: string, label: string, cssClass: string, gitService: IGitService) { - super(id, label, cssClass, false); - - this.gitService = gitService; - this.toDispose = [this.gitService.addBulkListener(() => this.onGitServiceChange())]; - this.onGitServiceChange(); - } - - protected onGitServiceChange(): void { - this.updateEnablement(); - } - - protected updateEnablement(): void { - this.enabled = this.isEnabled(); - } - - protected isEnabled(): boolean { - return !!this.gitService; - } - - public abstract run(e?: any): Promise; - - public dispose(): void { - this.gitService = null; - this.toDispose = dispose(this.toDispose); - - super.dispose(); - } -} - -export class OpenChangeAction extends GitAction { - - static ID = 'workbench.action.git.openChange'; - protected editorService: IWorkbenchEditorService; - - constructor( @IWorkbenchEditorService editorService: IWorkbenchEditorService, @IGitService gitService: IGitService) { - super(OpenChangeAction.ID, nls.localize('openChange', "Open Change"), 'git-action open-change', gitService); - this.editorService = editorService; - this.onGitServiceChange(); - } - - protected isEnabled(): boolean { - return super.isEnabled() && !!this.editorService; - } - - public run(context?: any): Promise { - var statuses = flatten(context, true); - - return this.gitService.getInput(statuses[0]).then((input) => { - var options = new TextDiffEditorOptions(); - - options.forceOpen = true; - - return this.editorService.openEditor(input, options); - }); - } -} - -export class OpenFileAction extends GitAction { - - private static DELETED_STATES = [Status.BOTH_DELETED, Status.DELETED, Status.DELETED_BY_US, Status.INDEX_DELETED]; - static ID = 'workbench.action.git.openFile'; - - protected fileService: IFileService; - protected editorService: IWorkbenchEditorService; - protected contextService: IWorkspaceContextService; - - constructor( @IWorkbenchEditorService editorService: IWorkbenchEditorService, @IFileService fileService: IFileService, @IGitService gitService: IGitService, @IWorkspaceContextService contextService: IWorkspaceContextService) { - super(OpenFileAction.ID, nls.localize('openFile', "Open File"), 'git-action open-file', gitService); - this.fileService = fileService; - this.editorService = editorService; - this.contextService = contextService; - this.onGitServiceChange(); - } - - protected isEnabled(): boolean { - return super.isEnabled() && !!this.editorService || !!this.fileService; - } - - private getPath(status: IFileStatus): string { - if (status.getStatus() === Status.INDEX_RENAMED) { - return status.getRename(); - } else { - var indexStatus = this.gitService.getModel().getStatus().find(status.getPath(), StatusType.INDEX); - - if (indexStatus && indexStatus.getStatus() === Status.INDEX_RENAMED) { - return status.getRename(); - } else { - return status.getPath(); - } - } - } - - public run(context?: any): Promise { - var statuses = flatten(context, true); - var status = statuses[0]; - - if (!(status instanceof model.FileStatus)) { - return Promise.wrapError(new Error('Can\'t open file.')); - } - - if (OpenFileAction.DELETED_STATES.indexOf(status.getStatus()) > -1) { - return Promise.wrapError(new Error('Can\'t open file which has been deleted.')); - } - - const resource = URI.file(paths.join(this.gitService.getModel().getRepositoryRoot(), this.getPath(status))); - - return this.fileService.resolveFile(resource) - .then(stat => this.editorService.openEditor({ - resource: stat.resource, - options: { forceOpen: true } - })); - } -} - -export class InitAction extends GitAction { - - static ID = 'workbench.action.git.init'; - - constructor( @IGitService gitService: IGitService) { - super(InitAction.ID, nls.localize('init', "Init"), 'git-action init', gitService); - } - - protected isEnabled(): boolean { - return super.isEnabled() && this.gitService.getState() === ServiceState.NotARepo; - } - - public run(): Promise { - return this.gitService.init(); - } -} - -export class RefreshAction extends GitAction { - - static ID = 'workbench.action.git.refresh'; - - constructor( @IGitService gitService: IGitService) { - super(RefreshAction.ID, nls.localize('refresh', "Refresh"), 'git-action refresh', gitService); - } - - public run(): Promise { - return this.gitService.status(); - } -} - -export abstract class BaseStageAction extends GitAction { - protected editorService: IWorkbenchEditorService; - - constructor(id: string, label: string, className: string, gitService: IGitService, editorService: IWorkbenchEditorService) { - super(id, label, className, gitService); - this.editorService = editorService; - } - - public run(context?: any): Promise { - var flatContext = flatten(context); - - return this.gitService.add(flatContext).then(status => { - var targetEditor = this.findGitWorkingTreeEditor(); - if (!targetEditor) { - return TPromise.as(status); - } - - var currentGitEditorInput = (targetEditor.input); - var currentFileStatus = currentGitEditorInput.getFileStatus(); - - if (flatContext && flatContext.every((f) => f !== currentFileStatus)) { - return TPromise.as(status); - } - - var path = currentGitEditorInput.getFileStatus().getPath(); - var fileStatus = status.getStatus().find(path, StatusType.INDEX); - - if (!fileStatus) { - return TPromise.as(status); - } - - var editorControl = targetEditor.getControl(); - var viewState = editorControl ? editorControl.saveViewState() : null; - - return this.gitService.getInput(fileStatus).then(input => { - var options = new TextDiffEditorOptions(); - options.forceOpen = true; - - return this.editorService.openEditor(input, options, targetEditor.position).then((editor) => { - if (viewState) { - editorControl.restoreViewState(viewState); - } - - return status; - }); - }); - }); - } - - private findGitWorkingTreeEditor(): IEditor { - var editors = this.editorService.getVisibleEditors(); - for (var i = 0; i < editors.length; i++) { - var editor = editors[i]; - if (inputs.isGitEditorInput(editor.input)) { - return editor; - } - } - - return null; - } - - public dispose(): void { - this.editorService = null; - - super.dispose(); - } -} - -export class StageAction extends BaseStageAction { - static ID = 'workbench.action.git.stage'; - static LABEL = nls.localize('stageChanges', "Stage"); - - constructor( - @IGitService gitService: IGitService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService - ) { - super(StageAction.ID, StageAction.LABEL, 'git-action stage', gitService, editorService); - } -} - -export class GlobalStageAction extends BaseStageAction { - - static ID = 'workbench.action.git.stageAll'; - - constructor( @IGitService gitService: IGitService, @IWorkbenchEditorService editorService: IWorkbenchEditorService) { - super(GlobalStageAction.ID, nls.localize('stageAllChanges', "Stage All"), 'git-action stage', gitService, editorService); - } - - protected isEnabled(): boolean { - return super.isEnabled() && this.gitService.getModel().getStatus().getWorkingTreeStatus().all().length > 0; - } - - public run(context?: any): Promise { - return super.run(); - } -} - -export abstract class BaseUndoAction extends GitAction { - - private editorService: IWorkbenchEditorService; - private messageService: IMessageService; - private fileService: IFileService; - private contextService: IWorkspaceContextService; - - constructor(id: string, label: string, className: string, gitService: IGitService, messageService: IMessageService, fileService: IFileService, editorService: IWorkbenchEditorService, contextService: IWorkspaceContextService) { - super(id, label, className, gitService); - this.editorService = editorService; - this.messageService = messageService; - this.fileService = fileService; - this.contextService = contextService; - this.onGitServiceChange(); - } - - protected isEnabled(): boolean { - return super.isEnabled() && !!this.editorService && !!this.fileService; - } - - public run(context?: any): Promise { - if (!this.messageService.confirm(this.getConfirm(context))) { - return TPromise.as(null); - } - - var promises: Promise[] = []; - - if (context instanceof model.StatusGroup) { - promises = [this.gitService.undo()]; - - } else { - var all: IFileStatus[] = flatten(context); - var toClean: IFileStatus[] = []; - var toCheckout: IFileStatus[] = []; - - for (var i = 0; i < all.length; i++) { - var status = all[i].clone(); - - switch (status.getStatus()) { - case Status.UNTRACKED: - case Status.IGNORED: - toClean.push(status); - break; - - default: - toCheckout.push(status); - break; - } - } - - if (toClean.length > 0) { - promises.push(this.gitService.clean(toClean)); - } - - if (toCheckout.length > 0) { - promises.push(this.gitService.checkout('', toCheckout)); - } - } - - return Promise.join(promises).then((statuses: IModel[]) => { - if (statuses.length === 0) { - return TPromise.as(null); - } - - var status = statuses[statuses.length - 1]; - - var targetEditor = this.findWorkingTreeDiffEditor(); - if (!targetEditor) { - return TPromise.as(status); - } - - var currentGitEditorInput = targetEditor.input; - var currentFileStatus = currentGitEditorInput.getFileStatus(); - - if (all && all.every((f) => f !== currentFileStatus)) { - return TPromise.as(status); - } - - var path = currentGitEditorInput.getFileStatus().getPath(); - - var editor = targetEditor.getControl(); - var modifiedEditorControl = editor ? editor.getModifiedEditor() : null; - var modifiedViewState = modifiedEditorControl ? modifiedEditorControl.saveViewState() : null; - - return this.fileService.resolveFile(this.contextService.toResource(path)).then((stat: IFileStat) => { - return this.editorService.openEditor({ - resource: stat.resource, - options: { - forceOpen: true - } - }, targetEditor.position).then((editor) => { - if (modifiedViewState) { - var codeEditor = targetEditor.getControl(); - - if (codeEditor) { - codeEditor.restoreViewState(modifiedViewState); - } - } - }); - }); - }).then(null, (errors: any[]): Promise => { - console.error('One or more errors occurred', errors); - return Promise.wrapError(errors[0]); - }); - } - - private findWorkingTreeDiffEditor(): IEditor { - var editors = this.editorService.getVisibleEditors(); - for (var i = 0; i < editors.length; i++) { - var editor = editors[i]; - if (editor.input instanceof inputs.GitWorkingTreeDiffEditorInput) { - return editor; - } - } - - return null; - } - - private getConfirm(context: any): IConfirmation { - const all = flatten(context); - - if (all.length > 1) { - const count = all.length; - - return { - message: nls.localize('confirmUndoMessage', "Are you sure you want to clean all changes?"), - detail: count === 1 - ? nls.localize('confirmUndoAllOne', "There are unstaged changes in {0} file.\n\nThis action is irreversible!", count) - : nls.localize('confirmUndoAllMultiple', "There are unstaged changes in {0} files.\n\nThis action is irreversible!", count), - primaryButton: nls.localize({ key: 'cleanChangesLabel', comment: ['&& denotes a mnemonic'] }, "&&Clean Changes") - }; - } - - const label = all[0].getPathComponents().reverse()[0]; - - return { - message: nls.localize('confirmUndo', "Are you sure you want to clean changes in '{0}'?", label), - detail: nls.localize('irreversible', "This action is irreversible!"), - primaryButton: nls.localize({ key: 'cleanChangesLabel', comment: ['&& denotes a mnemonic'] }, "&&Clean Changes") - }; - } - - public dispose(): void { - this.editorService = null; - this.fileService = null; - - super.dispose(); - } -} - -export class UndoAction extends BaseUndoAction { - static ID = 'workbench.action.git.undo'; - constructor( @IGitService gitService: IGitService, @IMessageService messageService: IMessageService, @IFileService fileService: IFileService, @IWorkbenchEditorService editorService: IWorkbenchEditorService, @IWorkspaceContextService contextService: IWorkspaceContextService) { - super(UndoAction.ID, nls.localize('undoChanges', "Clean"), 'git-action undo', gitService, messageService, fileService, editorService, contextService); - } -} - -export class GlobalUndoAction extends BaseUndoAction { - - static ID = 'workbench.action.git.undoAll'; - - constructor( @IGitService gitService: IGitService, @IMessageService messageService: IMessageService, @IFileService fileService: IFileService, @IWorkbenchEditorService editorService: IWorkbenchEditorService, @IWorkspaceContextService contextService: IWorkspaceContextService) { - super(GlobalUndoAction.ID, nls.localize('undoAllChanges', "Clean All"), 'git-action undo', gitService, messageService, fileService, editorService, contextService); - } - - protected isEnabled(): boolean { - return super.isEnabled() && this.gitService.getModel().getStatus().getWorkingTreeStatus().all().length > 0; - } - - public run(context?: any): Promise { - return super.run(this.gitService.getModel().getStatus().getWorkingTreeStatus()); - } -} - -export abstract class BaseUnstageAction extends GitAction { - - protected editorService: IWorkbenchEditorService; - - constructor(id: string, label: string, className: string, gitService: IGitService, editorService: IWorkbenchEditorService) { - super(id, label, className, gitService); - this.editorService = editorService; - this.onGitServiceChange(); - } - - protected isEnabled(): boolean { - return super.isEnabled() && !!this.editorService; - } - - public run(context?: any): Promise { - var flatContext = flatten(context); - - return this.gitService.revertFiles('HEAD', flatContext).then((status: IModel) => { - var targetEditor = this.findGitIndexEditor(); - if (!targetEditor) { - return TPromise.as(status); - } - - var currentGitEditorInput = (targetEditor.input); - var currentFileStatus = currentGitEditorInput.getFileStatus(); - - if (flatContext && flatContext.every((f) => f !== currentFileStatus)) { - return TPromise.as(status); - } - - var path = currentGitEditorInput.getFileStatus().getPath(); - var fileStatus = status.getStatus().find(path, StatusType.WORKING_TREE); - - if (!fileStatus) { - return TPromise.as(status); - } - - var editorControl = targetEditor.getControl(); - var viewState = editorControl ? editorControl.saveViewState() : null; - - return this.gitService.getInput(fileStatus).then((input) => { - var options = new TextDiffEditorOptions(); - options.forceOpen = true; - - return this.editorService.openEditor(input, options, targetEditor.position).then((editor) => { - if (viewState) { - editorControl.restoreViewState(viewState); - } - - return status; - }); - }); - }); - } - - private findGitIndexEditor(): IEditor { - var editors = this.editorService.getVisibleEditors(); - for (var i = 0; i < editors.length; i++) { - var editor = editors[i]; - if (inputs.isGitEditorInput(editor.input)) { - return editor; - } - } - - return null; - } - - public dispose(): void { - this.editorService = null; - - super.dispose(); - } -} - -export class UnstageAction extends BaseUnstageAction { - static ID = 'workbench.action.git.unstage'; - static LABEL = nls.localize('unstage', "Unstage"); - - constructor( - @IGitService gitService: IGitService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService - ) { - super(UnstageAction.ID, UnstageAction.LABEL, 'git-action unstage', gitService, editorService); - } -} - -export class GlobalUnstageAction extends BaseUnstageAction { - - static ID = 'workbench.action.git.unstageAll'; - - constructor( @IGitService gitService: IGitService, @IWorkbenchEditorService editorService: IWorkbenchEditorService) { - super(GlobalUnstageAction.ID, nls.localize('unstageAllChanges', "Unstage All"), 'git-action unstage', gitService, editorService); - } - - protected isEnabled(): boolean { - return super.isEnabled() && this.gitService.getModel().getStatus().getIndexStatus().all().length > 0; - } - - public run(context?: any): Promise { - return super.run(); - } -} - -enum LifecycleState { - Alive, - Disposing, - Disposed -} - -export class CheckoutAction extends GitAction { - - static ID = 'workbench.action.git.checkout'; - private editorService: IWorkbenchEditorService; - private branch: IBranch; - private HEAD: IBranch; - - private state: LifecycleState; - private runPromises: Promise[]; - - constructor(branch: IBranch, @IGitService gitService: IGitService, @IWorkbenchEditorService editorService: IWorkbenchEditorService) { - super(CheckoutAction.ID, branch.name, 'git-action checkout', gitService); - - this.editorService = editorService; - this.branch = branch; - this.HEAD = null; - this.state = LifecycleState.Alive; - this.runPromises = []; - this.onGitServiceChange(); - } - - protected onGitServiceChange(): void { - if (this.gitService.getState() === ServiceState.OK) { - this.HEAD = this.gitService.getModel().getHEAD(); - - if (this.HEAD && this.HEAD.name === this.branch.name) { - this.class = 'git-action checkout HEAD'; - } else { - this.class = 'git-action checkout'; - } - } - - super.onGitServiceChange(); - } - - protected isEnabled(): boolean { - return super.isEnabled() && !!this.HEAD; - } - - public run(context?: any): Promise { - if (this.state !== LifecycleState.Alive) { - return Promise.wrapError('action disposed'); - } else if (this.HEAD && this.HEAD.name === this.branch.name) { - return TPromise.as(null); - } - - var result = this.gitService.checkout(this.branch.name).then(null, (err) => { - if (err.gitErrorCode === GitErrorCodes.DirtyWorkTree) { - return Promise.wrapError(new Error(nls.localize('dirtyTreeCheckout', "Can't checkout. Please commit or stash your work first."))); - } - - return Promise.wrapError(err); - }); - - this.runPromises.push(result); - result.done(() => this.runPromises.splice(this.runPromises.indexOf(result), 1)); - - return result; - } - - public dispose(): void { - if (this.state !== LifecycleState.Alive) { - return; - } - - this.state = LifecycleState.Disposing; - Promise.join(this.runPromises).done(() => this.actuallyDispose()); - } - - private actuallyDispose(): void { - this.editorService = null; - this.branch = null; - this.HEAD = null; - - super.dispose(); - - this.state = LifecycleState.Disposed; - } -} - -export class BranchAction extends GitAction { - - static ID = 'workbench.action.git.branch'; - private checkout: boolean; - - constructor(checkout: boolean, @IGitService gitService: IGitService) { - super(BranchAction.ID, 'Branch', 'git-action checkout', gitService); - this.checkout = checkout; - } - - public run(context?: any): Promise { - if (!isString(context)) { - return TPromise.as(false); - } - - return this.gitService.branch(context, this.checkout); - } -} - -export interface ICommitState extends IEventEmitter { - getCommitMessage(): string; - onEmptyCommitMessage(): void; -} - -export abstract class BaseCommitAction extends GitAction { - protected commitState: ICommitState; - - constructor(commitState: ICommitState, id: string, label: string, cssClass: string, gitService: IGitService) { - super(id, label, cssClass, gitService); - - this.commitState = commitState; - - this.toDispose.push(commitState.addListener('change/commitInputBox', () => { - this.updateEnablement(); - })); - - this.onGitServiceChange(); - } - - protected isEnabled(): boolean { - return super.isEnabled() && this.gitService.getModel().getStatus().getIndexStatus().all().length > 0; - } - - public run(context?: any): Promise { - if (!this.commitState.getCommitMessage()) { - this.commitState.onEmptyCommitMessage(); - return TPromise.as(null); - } - - return this.commit(); - } - - protected abstract commit(): Promise; -} - -export class CommitAction extends BaseCommitAction { - - static ID = 'workbench.action.git.commit'; - - constructor(commitState: ICommitState, @IGitService gitService: IGitService) { - super(commitState, CommitAction.ID, nls.localize('commitStaged', "Commit Staged"), 'git-action commit', gitService); - } - - protected commit(): Promise { - return this.gitService.commit(this.commitState.getCommitMessage()); - } -} - -export class CommitAmendAction extends BaseCommitAction { - - static ID = 'workbench.action.git.commitAmend'; - - constructor(commitState: ICommitState, @IGitService gitService: IGitService) { - super(commitState, CommitAction.ID, nls.localize('commitStagedAmend', "Commit Staged (Amend)"), 'git-action commit-amend', gitService); - } - - protected commit(): Promise { - return this.gitService.commit(this.commitState.getCommitMessage(), true); - } -} - -export class CommitSignedOffAction extends BaseCommitAction { - - static ID = 'workbench.action.git.commitSignedOff'; - - constructor(commitState: ICommitState, @IGitService gitService: IGitService) { - super(commitState, CommitAction.ID, nls.localize('commitStagedSignedOff', "Commit Staged (Signed Off)"), 'git-action commit-signed-off', gitService); - } - - protected commit(): Promise { - return this.gitService.commit(this.commitState.getCommitMessage(), undefined, undefined, true); - } -} - -export class InputCommitAction extends GitAction { - - static ID = 'workbench.action.git.input-commit'; - static LABEL = nls.localize('commit', "Commit"); - - constructor( - id = InputCommitAction.ID, - label = InputCommitAction.LABEL, - @IGitService gitService: IGitService, - @IQuickOpenService private quickOpenService: IQuickOpenService - ) { - super(id, label, '', gitService); - } - - protected isEnabled(): boolean { - if (!this.gitService) { - return false; - } - - if (!this.gitService.isIdle()) { - return false; - } - - const status = this.gitService.getModel().getStatus(); - - return status.getIndexStatus().all().length > 0 || status.getWorkingTreeStatus().all().length > 0; - } - - run(): TPromise { - if (!this.enabled) { - return TPromise.as(null); - } - - const status = this.gitService.getModel().getStatus(); - - return this.quickOpenService.input({ prompt: nls.localize('commitMessage', "Commit Message") }) - .then(message => message && this.gitService.commit(message, false, status.getIndexStatus().all().length === 0)); - } -} - -export class StageAndCommitAction extends BaseCommitAction { - - static ID = 'workbench.action.git.stageAndCommit'; - static LABEL = nls.localize('commitAll', "Commit All"); - static CSSCLASS = 'git-action stage-and-commit'; - - constructor( - commitState: ICommitState, - id: string = StageAndCommitAction.ID, - label: string = StageAndCommitAction.LABEL, - cssClass: string = StageAndCommitAction.CSSCLASS, - @IGitService gitService: IGitService - ) { - super(commitState, id, label, cssClass, gitService); - } - - protected isEnabled(): boolean { - if (!this.gitService) { - return false; - } - - if (!this.gitService.isIdle()) { - return false; - } - - var status = this.gitService.getModel().getStatus(); - - return status.getIndexStatus().all().length > 0 - || status.getWorkingTreeStatus().all().length > 0; - } - - protected commit(): Promise { - return this.gitService.commit(this.commitState.getCommitMessage(), false, true); - } -} - -export class StageAndCommitSignedOffAction extends StageAndCommitAction { - - static ID = 'workbench.action.git.stageAndCommitSignedOff'; - - constructor(commitState: ICommitState, @IGitService gitService: IGitService) { - super(commitState, StageAndCommitAction.ID, nls.localize('commitAllSignedOff', "Commit All (Signed Off)"), 'git-action stage-and-commit-signed-off', gitService); - } - - protected commit(): Promise { - return this.gitService.commit(this.commitState.getCommitMessage(), false, true, true); - } -} - -export class SmartCommitAction extends BaseCommitAction { - - static ID = 'workbench.action.git.commitAll'; - private static ALL = nls.localize('commitAll2', "Commit All"); - private static STAGED = nls.localize('commitStaged2', "Commit Staged"); - - private messageService: IMessageService; - - constructor(commitState: ICommitState, @IGitService gitService: IGitService, @IMessageService messageService: IMessageService) { - super(commitState, SmartCommitAction.ID, SmartCommitAction.ALL, 'git-action smart-commit', gitService); - this.messageService = messageService; - this.onGitServiceChange(); - } - - protected onGitServiceChange(): void { - super.onGitServiceChange(); - - if (!this.enabled) { - this.label = SmartCommitAction.ALL; - return; - } - - var status = this.gitService.getModel().getStatus(); - - if (status.getIndexStatus().all().length > 0) { - this.label = SmartCommitAction.STAGED; - } else { - this.label = SmartCommitAction.ALL; - } - - this.label += ' (' + (platform.isMacintosh ? 'Cmd+Enter' : 'Ctrl+Enter') + ')'; - } - - protected isEnabled(): boolean { - if (!this.gitService) { - return false; - } - - if (!this.gitService.isIdle()) { - return false; - } - - var status = this.gitService.getModel().getStatus(); - - return status.getIndexStatus().all().length > 0 - || status.getWorkingTreeStatus().all().length > 0; - } - - protected commit(): Promise { - const status = this.gitService.getModel().getStatus(); - return this.gitService.commit(this.commitState.getCommitMessage(), false, status.getIndexStatus().all().length === 0); - } -} - -export class PullAction extends GitAction { - - static ID = 'workbench.action.git.pull'; - static LABEL = 'Pull'; - - constructor( - id = PullAction.ID, - label = PullAction.LABEL, - @IGitService gitService: IGitService - ) { - super(id, label, 'git-action pull', gitService); - } - - protected isEnabled(): boolean { - if (!super.isEnabled()) { - return false; - } - - if (!this.gitService.isIdle()) { - return false; - } - - var model = this.gitService.getModel(); - var HEAD = model.getHEAD(); - - if (!HEAD || !HEAD.name || !HEAD.upstream) { - return false; - } - - return true; - } - - public run(context?: any): Promise { - return this.pull(); - } - - protected pull(rebase = false): Promise { - return this.gitService.pull(rebase).then(null, (err) => { - if (err.gitErrorCode === GitErrorCodes.DirtyWorkTree) { - return Promise.wrapError(errors.create(nls.localize('dirtyTreePull', "Can't pull. Please commit or stash your work first."), { severity: Severity.Warning })); - } else if (err.gitErrorCode === GitErrorCodes.AuthenticationFailed) { - return Promise.wrapError(errors.create(nls.localize('authFailed', "Authentication failed on the git remote."))); - } - - return Promise.wrapError(err); - }); - } -} - -export class PullWithRebaseAction extends PullAction { - - static ID = 'workbench.action.git.pull.rebase'; - static LABEL = 'Pull (Rebase)'; - - constructor( - id = PullWithRebaseAction.ID, - label = PullWithRebaseAction.LABEL, - @IGitService gitService: IGitService - ) { - super(id, label, gitService); - } - - public run(context?: any): Promise { - return this.pull(true); - } -} - -export class PushAction extends GitAction { - - static ID = 'workbench.action.git.push'; - static LABEL = 'Push'; - - constructor( - id: string = PushAction.ID, - label: string = PushAction.LABEL, - @IGitService gitService: IGitService - ) { - super(id, label, 'git-action push', gitService); - } - - protected isEnabled(): boolean { - if (!super.isEnabled()) { - return false; - } - - if (!this.gitService.isIdle()) { - return false; - } - - var model = this.gitService.getModel(); - var HEAD = model.getHEAD(); - - if (!HEAD || !HEAD.name || !HEAD.upstream) { - return false; - } - - if (!HEAD.ahead) { // no commits to pull or push - return false; - } - - return true; - } - - public run(context?: any): Promise { - return this.gitService.push().then(null, (err) => { - if (err.gitErrorCode === GitErrorCodes.AuthenticationFailed) { - return Promise.wrapError(errors.create(nls.localize('authFailed', "Authentication failed on the git remote."))); - } - - return Promise.wrapError(err); - }); - } -} - -export class PushToRemoteAction extends GitAction { - - static ID = 'workbench.action.git.pushToRemote'; - static LABEL = nls.localize('pushToRemote', "Push to..."); - - constructor( - id: string = PushToRemoteAction.ID, - label: string = PushToRemoteAction.LABEL, - @IGitService gitService: IGitService, - @IQuickOpenService private quickOpenService: IQuickOpenService - ) { - super(id, label, 'git-action publish', gitService); - } - - protected isEnabled(): boolean { - if (!super.isEnabled()) { - return false; - } - - if (!this.gitService.isIdle()) { - return false; - } - - const model = this.gitService.getModel(); - - if (model.getRemotes().length === 0) { - return false; - } - - const HEAD = model.getHEAD(); - - if (!HEAD || !HEAD.name) { - return false; - } - - return true; - } - - public run(context?: any): Promise { - const model = this.gitService.getModel(); - const remotes = model.getRemotes(); - const branchName = model.getHEAD().name; - const picks = remotes.map(({ name, url }) => ({ label: name, description: url })); - const placeHolder = nls.localize('pushToRemotePickMessage', "Pick a remote to push the branch '{0}' to:", branchName); - - return this.quickOpenService.pick(picks, { placeHolder }) - .then(pick => pick && pick.label) - .then(remote => remote && this.gitService.push(remote, branchName)) - .then(null, err => { - if (err.gitErrorCode === GitErrorCodes.AuthenticationFailed) { - return Promise.wrapError(errors.create(nls.localize('authFailed', "Authentication failed on the git remote."))); - } - - return Promise.wrapError(err); - }); - } -} - -export class PublishAction extends GitAction { - - static ID = 'workbench.action.git.publish'; - static LABEL = nls.localize('publish', "Publish"); - - constructor( - id: string = PublishAction.ID, - label: string = PublishAction.LABEL, - @IGitService gitService: IGitService, - @IQuickOpenService private quickOpenService: IQuickOpenService, - @IMessageService private messageService: IMessageService - ) { - super(id, label, 'git-action publish', gitService); - } - - protected isEnabled(): boolean { - if (!super.isEnabled()) { - return false; - } - - if (!this.gitService.isIdle()) { - return false; - } - - const model = this.gitService.getModel(); - - if (model.getRemotes().length === 0) { - return false; - } - - const HEAD = model.getHEAD(); - - if (!HEAD || !HEAD.name || HEAD.upstream) { - return false; - } - - return true; - } - - public run(context?: any): Promise { - const model = this.gitService.getModel(); - const remotes = model.getRemotes(); - const branchName = model.getHEAD().name; - let promise: TPromise; - - if (remotes.length === 1) { - const remoteName = remotes[0].name; - - const result = this.messageService.confirm({ - message: nls.localize('confirmPublishMessage', "Are you sure you want to publish '{0}' to '{1}'?", branchName, remoteName), - primaryButton: nls.localize({ key: 'confirmPublishMessageButton', comment: ['&& denotes a mnemonic'] }, "&&Publish") - }); - - promise = TPromise.as(result ? remoteName : null); - } else { - const picks = remotes.map(({ name, url }) => ({ - label: name, - description: url - })); - - const placeHolder = nls.localize('publishPickMessage', "Pick a remote to publish the branch '{0}' to:", branchName); - - promise = this.quickOpenService.pick(picks, { placeHolder }) - .then(pick => pick && pick.label); - } - - return promise - .then(remote => remote && this.gitService.push(remote, branchName, { setUpstream: true })) - .then(null, err => { - if (err.gitErrorCode === GitErrorCodes.AuthenticationFailed) { - return Promise.wrapError(errors.create(nls.localize('authFailed', "Authentication failed on the git remote."))); - } - - return Promise.wrapError(err); - }); - } -} - -export class SyncAction extends GitAction { - - static ID = 'workbench.action.git.sync'; - static LABEL = 'Sync'; - - constructor(id: string, label: string, - @IGitService gitService: IGitService, - @IConfigurationService private configurationService: IConfigurationService, - @IConfigurationEditingService private configurationEditingService: IConfigurationEditingService, - @IChoiceService private choiceService: IChoiceService - ) { - super(id, label, 'git-action sync', gitService); - } - - protected isEnabled(): boolean { - if (!super.isEnabled()) { - return false; - } - - if (!this.gitService.isIdle()) { - return false; - } - - var model = this.gitService.getModel(); - var HEAD = model.getHEAD(); - - if (!HEAD || !HEAD.name || !HEAD.upstream) { - return false; - } - - return true; - } - - public run(context?: any): Promise { - if (!this.enabled) { - return TPromise.as(null); - } - - const shouldPrompt = this.configurationService.getConfiguration('git').confirmSync; - - if (!shouldPrompt) { - return this.sync(); - } - - - const model = this.gitService.getModel(); - const HEAD = model.getHEAD(); - const message = nls.localize('sync is unpredictable', "This action will push and pull commits to and from '{0}'.", HEAD.upstream); - const options = [nls.localize('ok', "OK"), nls.localize('cancel', "Cancel"), nls.localize('never again', "OK, Never Show Again")]; - - return this.choiceService.choose(Severity.Warning, message, options, 1).then(choice => { - switch (choice) { - case 0: - return this.sync(); - case 1: - return TPromise.as(null); - case 2: - return this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: 'git.confirmSync', value: false }) - .then(() => this.sync()); - default: - return TPromise.as(null); - } - }); - } - - private sync(): TPromise { - return this.gitService.sync().then(null, (err) => { - if (err.gitErrorCode === GitErrorCodes.AuthenticationFailed) { - return Promise.wrapError(errors.create(nls.localize('authFailed', "Authentication failed on the git remote."))); - } - - return Promise.wrapError(err); - }); - } -} - -export class UndoLastCommitAction extends GitAction { - - static ID = 'workbench.action.git.undoLastCommit'; - static LABEL = nls.localize('undoLastCommit', "Undo Last Commit"); - - constructor( - id = UndoLastCommitAction.ID, - label = UndoLastCommitAction.LABEL, - @IGitService gitService: IGitService - ) { - super(UndoLastCommitAction.ID, UndoLastCommitAction.LABEL, 'git-action undo-last-commit', gitService); - } - - protected isEnabled(): boolean { - if (!super.isEnabled()) { - return false; - } - - if (!this.gitService.isIdle()) { - return false; - } - - const model = this.gitService.getModel(); - const HEAD = model.getHEAD(); - - return !!(HEAD && HEAD.commit); - } - - public run(): Promise { - return this.gitService.reset('HEAD~'); - } -} - -export class StartGitCheckoutAction extends Action { - - public static ID = 'workbench.action.git.startGitCheckout'; - public static LABEL = 'Checkout'; - private quickOpenService: IQuickOpenService; - - constructor(id: string, label: string, @IQuickOpenService quickOpenService: IQuickOpenService) { - super(id, label); - this.quickOpenService = quickOpenService; - } - - public run(event?: any): Promise { - this.quickOpenService.show('git checkout '); - return TPromise.as(null); - } -} - -export class StartGitBranchAction extends Action { - - public static ID = 'workbench.action.git.startGitBranch'; - public static LABEL = 'Branch'; - private quickOpenService: IQuickOpenService; - - constructor(id: string, label: string, @IQuickOpenService quickOpenService: IQuickOpenService) { - super(id, label); - this.quickOpenService = quickOpenService; - } - - public run(event?: any): Promise { - this.quickOpenService.show('git branch '); - return TPromise.as(null); - } -} diff --git a/src/vs/workbench/parts/git/browser/gitEditorContributions.ts b/src/vs/workbench/parts/git/browser/gitEditorContributions.ts deleted file mode 100644 index c303f0d05eb..00000000000 --- a/src/vs/workbench/parts/git/browser/gitEditorContributions.ts +++ /dev/null @@ -1,181 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; -import { IModel, IModelDeltaDecoration, IModelDecorationOptions, OverviewRulerLane, IEditorContribution, TrackedRangeStickiness } from 'vs/editor/common/editorCommon'; -import { IGitService, ModelEvents, StatusType } from 'vs/workbench/parts/git/common/git'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { Delayer } from 'vs/base/common/async'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import SCMPreview from 'vs/workbench/parts/scm/browser/scmPreview'; - -const pattern = /^<<<<<<<|^=======|^>>>>>>>/; - -function decorate(model: IModel): IModelDeltaDecoration[] { - const options = MergeDecorator.DECORATION_OPTIONS; - - return model.getLinesContent() - .map((line, i) => pattern.test(line) ? i : null) - .filter(i => i !== null) - .map(i => ({ startLineNumber: i + 1, startColumn: 1, endLineNumber: i + 1, endColumn: 1 })) - .map(range => ({ range, options })); -} - -class MergeDecoratorBoundToModel extends Disposable { - - private decorations: string[]; - - constructor( - private editor: ICodeEditor, - private model: IModel, - private filePath: string, - private gitService: IGitService - ) { - super(); - - this.decorations = []; - - const delayer = new Delayer(300); - delayer.trigger(() => this.redecorate()); - - const gitModel = gitService.getModel(); - this._register(model.onDidChangeContent(() => delayer.trigger(() => this.redecorate()))); - this._register(gitModel.addListener(ModelEvents.STATUS_MODEL_UPDATED, () => delayer.trigger(() => this.redecorate()))); - } - - private _setDecorations(newDecorations: IModelDeltaDecoration[]): void { - this.decorations = this.editor.deltaDecorations(this.decorations, newDecorations); - } - - private redecorate(): void { - if (this.model.isDisposed()) { - return; - } - - const gitModel = this.gitService.getModel(); - - if (!gitModel) { - return; - } - - const mergeStatus = gitModel.getStatus().find(this.filePath, StatusType.MERGE); - - if (!mergeStatus) { - return; - } - - this._setDecorations(decorate(this.model)); - } - - dispose(): void { - this._setDecorations([]); - super.dispose(); - } -} - -export class MergeDecorator extends Disposable implements IEditorContribution { - - static ID = 'vs.git.editor.merge.decorator'; - - static DECORATION_OPTIONS: IModelDecorationOptions = { - className: 'git-merge-control-decoration', - isWholeLine: true, - overviewRuler: { - color: 'rgb(197, 118, 0)', - darkColor: 'rgb(197, 118, 0)', - position: OverviewRulerLane.Left - }, - stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges - }; - - private mergeDecorator: MergeDecoratorBoundToModel; - - constructor( - private editor: ICodeEditor, - @IGitService private gitService: IGitService, - @IWorkspaceContextService private contextService: IWorkspaceContextService - ) { - super(); - - this._register(this.editor.onDidChangeModel(() => this.onModelChanged())); - this.mergeDecorator = null; - } - - getId(): string { - return MergeDecorator.ID; - } - - private onModelChanged(): void { - if (this.mergeDecorator) { - this.mergeDecorator.dispose(); - this.mergeDecorator = null; - } - - if (!this.contextService || !this.gitService) { - return; - } - - const model = this.editor.getModel(); - if (!model) { - return; - } - - const resource = model.uri; - if (!resource) { - return; - } - - const path = this.contextService.toWorkspaceRelativePath(resource); - if (!path) { - return; - } - - this.mergeDecorator = new MergeDecoratorBoundToModel(this.editor, model, path, this.gitService); - } - - dispose(): void { - if (this.mergeDecorator) { - this.mergeDecorator.dispose(); - this.mergeDecorator = null; - } - - super.dispose(); - } -} - -// TODO@Joao: remove -@editorContribution -export class MergeDecoratorWrapper extends Disposable implements IEditorContribution { - - static ID = 'vs.git.editor.merge.decoratorwrapper'; - private decorator: MergeDecorator; - - constructor( - private editor: ICodeEditor, - @IInstantiationService instantiationService: IInstantiationService - ) { - super(); - - if (SCMPreview.enabled) { - return; - } - - this.decorator = instantiationService.createInstance(MergeDecorator, editor); - } - - getId(): string { - return MergeDecoratorWrapper.ID; - } - - dispose(): void { - if (this.decorator) { - this.decorator.dispose(); - this.decorator = null; - } - } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/gitEditorInputs.ts b/src/vs/workbench/parts/git/browser/gitEditorInputs.ts deleted file mode 100644 index 3cc7c790f50..00000000000 --- a/src/vs/workbench/parts/git/browser/gitEditorInputs.ts +++ /dev/null @@ -1,160 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import winjs = require('vs/base/common/winjs.base'); -import lifecycle = require('vs/base/common/lifecycle'); -import async = require('vs/base/common/async'); -import WorkbenchEditorCommon = require('vs/workbench/common/editor'); -import stringei = require('vs/workbench/common/editor/stringEditorInput'); -import diffei = require('vs/workbench/common/editor/diffEditorInput'); -import git = require('vs/workbench/parts/git/common/git'); -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorInput } from 'vs/platform/editor/common/editor'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; - -import IGitService = git.IGitService; - -export interface IEditorInputWithStatus { - getFileStatus(): git.IFileStatus; -} - -export function isGitEditorInput(input: IEditorInput): boolean { - return input instanceof GitDiffEditorInput || input instanceof NativeGitIndexStringEditorInput; -} - -export class GitDiffEditorInput - extends diffei.DiffEditorInput - implements IEditorInputWithStatus { - private status: git.IFileStatus; - - constructor(name: string, description: string, originalInput: WorkbenchEditorCommon.EditorInput, modifiedInput: WorkbenchEditorCommon.EditorInput, status: git.IFileStatus) { - super(name, description, originalInput, modifiedInput); - - this.status = status; - } - - public getFileStatus(): git.IFileStatus { - return this.status; - } - - public contains(otherInput: any): boolean { - if (this.matches(otherInput)) { - return true; - } - - var originalInput = this.originalInput; - if (originalInput && originalInput.matches(otherInput)) { - return true; - } - - var modifiedInput = this.modifiedInput; - if (modifiedInput && modifiedInput.matches(otherInput)) { - return true; - } - - return false; - } -} - -export class GitWorkingTreeDiffEditorInput extends GitDiffEditorInput { - - static ID = 'vs.git.workingTreeDiffInput'; - - constructor(name: string, description: string, originalInput: WorkbenchEditorCommon.EditorInput, modifiedInput: WorkbenchEditorCommon.EditorInput, status: git.IFileStatus) { - super(name, description, originalInput, modifiedInput, status); - } - - public getTypeId(): string { - return GitWorkingTreeDiffEditorInput.ID; - } -} - -export class GitIndexDiffEditorInput extends GitDiffEditorInput { - - static ID: string = 'vs.git.indexDiffInput'; - - constructor(name: string, description: string, originalInput: WorkbenchEditorCommon.EditorInput, modifiedInput: WorkbenchEditorCommon.EditorInput, status: git.IFileStatus) { - super(name, description, originalInput, modifiedInput, status); - } - - public getTypeId(): string { - return GitIndexDiffEditorInput.ID; - } -} - -export class NativeGitIndexStringEditorInput - extends stringei.StringEditorInput - implements IEditorInputWithStatus { - public static ID = 'vs.git.stringEditorInput'; - - private gitService: IGitService; - private editorService: IWorkbenchEditorService; - private status: git.IFileStatus; - private path: string; - private treeish: string; - private delayer: async.ThrottledDelayer; - private toDispose: lifecycle.IDisposable[]; - - constructor(name: any, description: string, mime: string, status: git.IFileStatus, path: string, treeish: string, - @IGitService gitService: IGitService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService, - @IInstantiationService instantiationService: IInstantiationService - ) { - super(name, description, null, mime, false, instantiationService); - - this.gitService = gitService; - this.editorService = editorService; - this.status = status; - this.path = path; - this.treeish = treeish; - this.delayer = new async.ThrottledDelayer(1000); - - this.toDispose = []; - this.toDispose.push(this.gitService.addListener(git.ServiceEvents.STATE_CHANGED, () => this.onGitServiceStateChange())); - this.toDispose.push(this.gitService.addListener(git.ServiceEvents.OPERATION_END, () => this.onGitServiceStateChange())); - } - - public getTypeId(): string { - return NativeGitIndexStringEditorInput.ID; - } - - public getFileStatus(): git.IFileStatus { - return this.status; - } - - public resolve(refresh?: boolean): winjs.TPromise { - if (refresh || !this.getValue()) { - return this.gitService.buffer(this.path, this.treeish).then(contents => { - if (this.getValue() !== contents) { - this.setValue(contents); - } - - return super.resolve(refresh); - }); - } else { - return super.resolve(refresh); - } - } - - private onGitServiceStateChange(): void { - var isVisible = this.editorService.isVisible(this, true); - if (!isVisible) { - return; - } - - this.delayer.trigger(() => this.resolve(true)); - } - - public dispose(): void { - if (this.delayer) { - this.delayer.cancel(); - this.delayer = null; - } - - this.toDispose = lifecycle.dispose(this.toDispose); - super.dispose(); - } -} diff --git a/src/vs/workbench/parts/git/browser/gitOperations.ts b/src/vs/workbench/parts/git/browser/gitOperations.ts deleted file mode 100644 index 669c5a92320..00000000000 --- a/src/vs/workbench/parts/git/browser/gitOperations.ts +++ /dev/null @@ -1,25 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { IGitOperation, IRawStatus } from 'vs/workbench/parts/git/common/git'; -import { TPromise } from 'vs/base/common/winjs.base'; - -export class GitOperation implements IGitOperation { - - id: string; - - constructor(id: string, private fn: () => TPromise) { - this.id = id; - } - - run(): TPromise { - return this.fn(); - } - - dispose(): void { - // noop - } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/gitOutput.ts b/src/vs/workbench/parts/git/browser/gitOutput.ts deleted file mode 100644 index f760e2e3d33..00000000000 --- a/src/vs/workbench/parts/git/browser/gitOutput.ts +++ /dev/null @@ -1,42 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { IGitService, ServiceEvents } from 'vs/workbench/parts/git/common/git'; -import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { IOutputService } from 'vs/workbench/parts/output/common/output'; - -export class GitOutput implements IWorkbenchContribution { - - static ID = 'vs.git.output'; - - private outputListener: IDisposable; - private gitService: IGitService; - private outputService: IOutputService; - - constructor( @IGitService gitService: IGitService, @IOutputService outputService: IOutputService) { - this.gitService = gitService; - this.outputService = outputService; - - const listener = gitService.addListener(ServiceEvents.OPERATION_START, () => { - this.outputListener = this.gitService.onOutput(output => this.onOutput(output)); - listener.dispose(); - }); - } - - getId(): string { - return GitOutput.ID; - } - - private onOutput(output: string): void { - this.outputService.getChannel('Git').append(output); - } - - dispose(): void { - this.outputListener = dispose(this.outputListener); - } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/gitQuickOpen.ts b/src/vs/workbench/parts/git/browser/gitQuickOpen.ts deleted file mode 100644 index bbe0a035bac..00000000000 --- a/src/vs/workbench/parts/git/browser/gitQuickOpen.ts +++ /dev/null @@ -1,271 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { localize } from 'vs/nls'; -import { matchesContiguousSubString } from 'vs/base/common/filters'; -import { TPromise } from 'vs/base/common/winjs.base'; -import Severity from 'vs/base/common/severity'; -import { IGitService, RefType, IRef, IGitConfiguration } from 'vs/workbench/parts/git/common/git'; -import { ICommand, CommandQuickOpenHandler } from 'vs/workbench/browser/quickopen'; -import { Mode } from 'vs/base/parts/quickopen/common/quickOpen'; -import { QuickOpenEntry, IHighlight, IContext, QuickOpenEntryGroup } from 'vs/base/parts/quickopen/browser/quickOpenModel'; -import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; -import { IMessageService } from 'vs/platform/message/common/message'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; - -class AbstractRefEntry extends QuickOpenEntry { - - protected gitService: IGitService; - protected messageService: IMessageService; - protected ref: IRef; - - constructor(gitService: IGitService, messageService: IMessageService, ref: IRef, highlights: IHighlight[]) { - super(highlights); - - this.gitService = gitService; - this.messageService = messageService; - this.ref = ref; - } - - getIcon(): string { return 'git'; } - getLabel(): string { return this.ref.name; } - getDescription(): string { return ''; } - getAriaLabel(): string { return localize('refAriaLabel', "{0}, git", this.getLabel()); } - - run(mode: Mode, context: IContext): boolean { - if (mode === Mode.PREVIEW) { - return false; - } - - return true; - } -} - -class CheckoutHeadEntry extends AbstractRefEntry { - - getDescription(): string { return localize('checkoutBranch', "Branch at {0}", this.ref.commit.substr(0, 8)); } - - run(mode: Mode, context: IContext): boolean { - if (mode === Mode.PREVIEW) { - return false; - } - - this.gitService.checkout(this.ref.name).done(null, e => this.messageService.show(Severity.Error, e)); - return true; - } -} - -class CheckoutRemoteHeadEntry extends AbstractRefEntry { - - getDescription(): string { return localize('checkoutRemoteBranch', "Remote branch at {0}", this.ref.commit.substr(0, 8)); } - - run(mode: Mode, context: IContext): boolean { - if (mode === Mode.PREVIEW) { - return false; - } - - const match = /^[^/]+\/(.*)$/.exec(this.ref.name); - const name = match ? match[1] : this.ref.name; - - this.gitService.checkout(name).done(null, e => this.messageService.show(Severity.Error, e)); - return true; - } -} - -class CheckoutTagEntry extends AbstractRefEntry { - - getDescription(): string { return localize('checkoutTag', "Tag at {0}", this.ref.commit.substr(0, 8)); } - - run(mode: Mode, context: IContext): boolean { - if (mode === Mode.PREVIEW) { - return false; - } - - this.gitService.checkout(this.ref.name).done(null, e => this.messageService.show(Severity.Error, e)); - return true; - } -} - -class CurrentHeadEntry extends AbstractRefEntry { - getDescription(): string { return localize('alreadyCheckedOut', "Branch {0} is already the current branch", this.ref.name); } -} - -class BranchEntry extends QuickOpenEntry { - - private gitService: IGitService; - private messageService: IMessageService; - private name: string; - - constructor(gitService: IGitService, messageService: IMessageService, name: string) { - super([{ start: 0, end: name.length }]); - - this.gitService = gitService; - this.messageService = messageService; - - // sanitize name - this.name = name.replace(/^\.|\/\.|\.\.|~|\^|:|\/$|\.lock$|\.lock\/|\\|\*|\s|^\s*$|\.$/g, '-'); - } - - getIcon(): string { return 'git'; } - getLabel(): string { return this.name; } - getAriaLabel(): string { return localize({ key: 'branchAriaLabel', comment: ['the branch name'] }, "{0}, git branch", this.getLabel()); } - getDescription(): string { return localize('createBranch', "Create branch {0}", this.name); } - - run(mode: Mode, context: IContext): boolean { - if (mode === Mode.PREVIEW) { - return false; - } - - this.gitService.branch(this.name, true).done(null, e => this.messageService.show(Severity.Error, e)); - return true; - } -} - -// Commands - -class CheckoutCommand implements ICommand { - - aliases = ['checkout', 'co']; - icon = 'git'; - - constructor(private gitService: IGitService, private messageService: IMessageService, private configurationService: IConfigurationService) { - // noop - } - - getResults(input: string): TPromise { - input = input.trim(); - - const config = this.configurationService.getConfiguration('git'); - const checkoutType = config.checkoutType; - const includeTags = checkoutType === 'all' || checkoutType === 'tags'; - const includeRemotes = checkoutType === 'all' || checkoutType === 'remote'; - - const gitModel = this.gitService.getModel(); - const currentHead = gitModel.getHEAD(); - const refs = gitModel.getRefs(); - const heads = refs.filter(ref => ref.type === RefType.Head); - const tags = includeTags ? refs.filter(ref => ref.type === RefType.Tag) : []; - const remoteHeads = includeRemotes ? refs.filter(ref => ref.type === RefType.RemoteHead) : []; - - const headMatches = heads - .map(head => ({ head, highlights: matchesContiguousSubString(input, head.name) })) - .filter(({ highlights }) => !!highlights); - - const headEntries: QuickOpenEntry[] = headMatches - .filter(({ head }) => head.name !== currentHead.name) - .map(({ head, highlights }) => new CheckoutHeadEntry(this.gitService, this.messageService, head, highlights)); - - const tagMatches = tags - .map(head => ({ head, highlights: matchesContiguousSubString(input, head.name) })) - .filter(({ highlights }) => !!highlights); - - const tagEntries = tagMatches - .filter(({ head }) => head.name !== currentHead.name) - .map(({ head, highlights }) => new CheckoutTagEntry(this.gitService, this.messageService, head, highlights)); - - const checkoutEntries = headEntries - .concat(tagEntries) - .sort((a, b) => a.getLabel().localeCompare(b.getLabel())); - - const remoteHeadMatches = remoteHeads - .map(head => ({ head, highlights: matchesContiguousSubString(input, head.name) })) - .filter(({ highlights }) => !!highlights); - - const remoteHeadEntries: QuickOpenEntry[] = remoteHeadMatches - .filter(({ head }) => head.name !== currentHead.name) - .map(({ head, highlights }) => new CheckoutRemoteHeadEntry(this.gitService, this.messageService, head, highlights)) - .sort((a, b) => a.getLabel().localeCompare(b.getLabel())); - - if (checkoutEntries.length > 0) { - checkoutEntries[0] = new QuickOpenEntryGroup(checkoutEntries[0], 'checkout', false); - } - - if (remoteHeadEntries.length > 0) { - remoteHeadEntries[0] = new QuickOpenEntryGroup(remoteHeadEntries[0], 'checkout remote', checkoutEntries.length > 0); - } - - const entries = checkoutEntries - .sort((a, b) => a.getLabel().localeCompare(b.getLabel())) - .concat(remoteHeadEntries); - - const allMatches = headMatches.concat(tagMatches).concat(remoteHeadMatches); - const exactMatches = allMatches.filter(({ head }) => head.name === input); - const currentHeadMatches = exactMatches.filter(({ head }) => head.name === currentHead.name); - - if (currentHeadMatches.length > 0) { - entries.unshift(new CurrentHeadEntry(this.gitService, this.messageService, currentHeadMatches[0].head, currentHeadMatches[0].highlights)); - - } else if (exactMatches.length === 0 && input) { - const branchEntry = new BranchEntry(this.gitService, this.messageService, input); - entries.push(new QuickOpenEntryGroup(branchEntry, 'branch', checkoutEntries.length > 0 || remoteHeadEntries.length > 0)); - } - - return TPromise.as(entries); - } - - getEmptyLabel(input: string): string { - return localize('noBranches', "No other branches"); - } -} - -class BranchCommand implements ICommand { - - aliases = ['branch']; - icon = 'git'; - - constructor(private gitService: IGitService, private messageService: IMessageService) { - // noop - } - - getResults(input: string): TPromise { - input = input.trim(); - - if (!input) { - return TPromise.as([]); - } - - const gitModel = this.gitService.getModel(); - const currentHead = gitModel.getHEAD(); - - const matches = gitModel.getRefs() - .map(head => ({ head, highlights: matchesContiguousSubString(input, head.name) })) - .filter(({ highlights }) => !!highlights); - - const exactMatches = matches.filter(({ head }) => head.name === input); - const headMatches = exactMatches.filter(({ head }) => head.name === currentHead.name); - - if (headMatches.length > 0) { - return TPromise.as([new CurrentHeadEntry(this.gitService, this.messageService, headMatches[0].head, headMatches[0].highlights)]); - } else if (exactMatches.length > 0) { - return TPromise.as([new CheckoutHeadEntry(this.gitService, this.messageService, exactMatches[0].head, exactMatches[0].highlights)]); - } - - const branchEntry = new BranchEntry(this.gitService, this.messageService, input); - return TPromise.as([new QuickOpenEntryGroup(branchEntry, 'branch', false)]); - } - - getEmptyLabel(input: string): string { - return localize('notValidBranchName', "Please provide a valid branch name"); - } -} - -export class GitCommandQuickOpenHandler extends CommandQuickOpenHandler { - - constructor( - @IQuickOpenService quickOpenService: IQuickOpenService, - @IGitService gitService: IGitService, - @IMessageService messageService: IMessageService, - @IConfigurationService configurationService: IConfigurationService - ) { - super(quickOpenService, { - prefix: 'git', - commands: [ - new CheckoutCommand(gitService, messageService, configurationService), - new BranchCommand(gitService, messageService) - ] - }); - } -} diff --git a/src/vs/workbench/parts/git/browser/gitScm.ts b/src/vs/workbench/parts/git/browser/gitScm.ts deleted file mode 100644 index b0c345413e4..00000000000 --- a/src/vs/workbench/parts/git/browser/gitScm.ts +++ /dev/null @@ -1,125 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import { TPromise } from 'vs/base/common/winjs.base'; -import Event, { Emitter } from 'vs/base/common/event'; -import { dispose } from 'vs/base/common/lifecycle'; -import URI from 'vs/base/common/uri'; -import { IModel } from 'vs/editor/common/editorCommon'; -import { ISCMService, ISCMProvider, ISCMResource, ISCMResourceGroup } from 'vs/workbench/services/scm/common/scm'; -import { ITextModelResolverService, ITextModelContentProvider } from 'vs/editor/common/services/resolverService'; -import { IModelService } from 'vs/editor/common/services/modelService'; -import { Throttler } from 'vs/base/common/async'; -import * as paths from 'vs/base/common/paths'; -import { IGitService, StatusType, ServiceEvents, ServiceOperations, ServiceState } from 'vs/workbench/parts/git/common/git'; -import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; - -// TODO@Joao: remove -export class GitSCMProvider implements IWorkbenchContribution, ISCMProvider, ITextModelContentProvider { - - get id() { return 'git-internal'; } - get label() { return 'Git'; } - get resources() { return []; } - - private _onDidChange = new Emitter(); - get onDidChange(): Event { - return this._onDidChange.event; - } - - constructor( - @ITextModelResolverService textModelResolverService: ITextModelResolverService, - @IModelService private modelService: IModelService, - @IGitService private gitService: IGitService, - @ISCMService scmService: ISCMService - ) { - scmService.registerSCMProvider(this); - textModelResolverService.registerTextModelContentProvider('git', this); - } - - getId(): string { - return 'git.contentprovider'; - } - - open(uri: ISCMResource): TPromise { - return TPromise.wrapError('not implemented'); - } - - acceptChanges(): TPromise { - return TPromise.wrapError('not implemented'); - } - - drag(from: ISCMResource, to: ISCMResourceGroup): TPromise { - return TPromise.wrapError('not implemented'); - } - - getOriginalResource(uri: URI): TPromise { - if (uri.scheme !== 'file') { - return TPromise.as(null); - } - - return TPromise.as(uri.with({ scheme: 'git' })); - } - - provideTextContent(uri: URI): TPromise { - const model = this.modelService.createModel('', null, uri); - const throttler = new Throttler(); - - const setModelContents = contents => { - if (model.isDisposed()) { - return; - } - - model.setValue(contents || ''); - }; - - const updateModel = () => { - const gitModel = this.gitService.getModel(); - const root = gitModel.getRepositoryRoot(); - - if (!root) { - return TPromise.as(null); - } - - const path = uri.fsPath; - const relativePath = paths.relative(root, path).replace(/\\/g, '/'); - - if (/^\.\./.test(relativePath)) { - return TPromise.as(null); - } - - const treeish = gitModel.getStatus().find(relativePath, StatusType.INDEX) ? '~' : 'HEAD'; - - return this.gitService.buffer(path, treeish).then(setModelContents); - }; - - const triggerModelUpdate = () => { - if (this.gitService.getState() !== ServiceState.OK) { - return; - } - - throttler.queue(updateModel); - }; - - const disposables = [ - this.gitService.addListener(ServiceEvents.STATE_CHANGED, triggerModelUpdate), - this.gitService.addListener(ServiceEvents.OPERATION_END, e => { - if (e.operation.id !== ServiceOperations.BACKGROUND_FETCH) { - triggerModelUpdate(); - } - }) - ]; - - model.onWillDispose(() => dispose(disposables)); - triggerModelUpdate(); - - return TPromise.as(model); - } - - dispose(): void { - - } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/gitServices.ts b/src/vs/workbench/parts/git/browser/gitServices.ts deleted file mode 100644 index f494f7ef3b4..00000000000 --- a/src/vs/workbench/parts/git/browser/gitServices.ts +++ /dev/null @@ -1,908 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { localize } from 'vs/nls'; -import * as platform from 'vs/base/common/platform'; -import { TPromise } from 'vs/base/common/winjs.base'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { Action } from 'vs/base/common/actions'; -import { isPromiseCanceledError, create as createError } from 'vs/base/common/errors'; -import * as mime from 'vs/base/common/mime'; -import * as paths from 'vs/base/common/paths'; -import Event, { once } from 'vs/base/common/event'; -import { EventEmitter } from 'vs/base/common/eventEmitter'; -import { EditorInput } from 'vs/workbench/common/editor'; -import { - IFileStatus, IGitServiceError, GitErrorCodes, Status, StatusType, AutoFetcherState, IGitConfiguration, IAutoFetcher, ServiceEvents, ServiceState, - IModel, IGitOperation, IRawGitService, IGitService, RawServiceState, ServiceOperations, IPushOptions, ICommit, IRawStatus -} from 'vs/workbench/parts/git/common/git'; -import { Model } from 'vs/workbench/parts/git/common/gitModel'; -import { NativeGitIndexStringEditorInput, GitIndexDiffEditorInput, GitWorkingTreeDiffEditorInput, GitDiffEditorInput } from 'vs/workbench/parts/git/browser/gitEditorInputs'; -import { GitOperation } from 'vs/workbench/parts/git/browser/gitOperations'; -import { TextFileModelChangeEvent, ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { IFileService, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files'; -import { ThrottledDelayer, PeriodThrottledDelayer } from 'vs/base/common/async'; -import severity from 'vs/base/common/severity'; -import { IOutputService } from 'vs/workbench/parts/output/common/output'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IMessageService, CloseAction } from 'vs/platform/message/common/message'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; -import URI from 'vs/base/common/uri'; -import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { domEvent } from 'vs/base/browser/event'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; - -function toReadablePath(path: string): string { - if (!platform.isWindows) { - return path; - } - - return path.replace(/\//g, '\\'); -} - -class EditorInputCache { - private gitService: GitService; - private fileService: IFileService; - private instantiationService: IInstantiationService; - private editorService: IWorkbenchEditorService; - private editorGroupService: IEditorGroupService; - private contextService: IWorkspaceContextService; - private cache: { [key: string]: TPromise }; - private toDispose: IDisposable[]; - - constructor(gitService: GitService, - @IInstantiationService instantiationService: IInstantiationService, - @IFileService fileService: IFileService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService, - @IEditorGroupService editorGroupService: IEditorGroupService, - @IWorkspaceContextService contextService: IWorkspaceContextService - ) { - this.instantiationService = instantiationService; - this.fileService = fileService; - this.editorService = editorService; - this.editorGroupService = editorGroupService; - this.contextService = contextService; - - this.gitService = gitService; - - this.cache = {}; - this.toDispose = []; - - this.toDispose.push(this.gitService.getModel().addListener('fileStatus:dispose', (fileStatus: IFileStatus) => this.onFileStatusDispose(fileStatus))); - } - - getInput(status: IFileStatus): TPromise { - var result = this.cache[status.getId()]; - - if (result) { - return result; - } - - result = this.createInput(status); - this.cache[status.getId()] = result; - return result; - } - - private createInput(status: IFileStatus): TPromise { - return TPromise.join([this.createLeftInput(status), this.createRightInput(status)]).then((result) => { - var leftInput = result[0]; - var rightInput = result[1]; - - var fileSegment: string; - var folderSegment: string; - - if (status.getStatus() === Status.INDEX_RENAMED) { - let pathComponents = status.getRename().split('/'); - fileSegment = pathComponents[pathComponents.length - 1]; - folderSegment = toReadablePath(pathComponents.slice(0, pathComponents.length - 1).join('/')); - } else { - let pathComponents = status.getPathComponents(); - fileSegment = pathComponents[pathComponents.length - 1]; - folderSegment = toReadablePath(pathComponents.slice(0, pathComponents.length - 1).join('/')); - } - - if (!leftInput) { - if (!rightInput) { - var error = new Error(localize('cantOpen', "Can't open this git resource.")); - (error).gitErrorCode = GitErrorCodes.CantOpenResource; - return TPromise.wrapError(error); - } - - return TPromise.as(rightInput); - } - - switch (status.getStatus()) { - case Status.INDEX_MODIFIED: - return TPromise.as(new GitIndexDiffEditorInput(localize('gitIndexChanges', "{0} (index) ↔ {1}", fileSegment, fileSegment), localize('gitIndexChangesDesc', "{0} - Changes on index", folderSegment), leftInput, rightInput, status)); - case Status.INDEX_RENAMED: - return TPromise.as(new GitIndexDiffEditorInput(localize('gitIndexChangesRenamed', "{0} ← {1}", status.getRename(), status.getPath()), localize('gitIndexChangesRenamedDesc', "{0} - Renamed - Changes on index", folderSegment), leftInput, rightInput, status)); - case Status.MODIFIED: - return TPromise.as(new GitWorkingTreeDiffEditorInput(localize('workingTreeChanges', "{0} (HEAD) ↔ {1}", fileSegment, fileSegment), localize('workingTreeChangesDesc', "{0} - Changes on working tree", folderSegment), leftInput, rightInput, status)); - default: - return TPromise.as(new GitDiffEditorInput(localize('gitMergeChanges', "{0} (merge) ↔ {1}", fileSegment, fileSegment), localize('gitMergeChangesDesc', "{0} - Merge changes", folderSegment), leftInput, rightInput, status)); - } - }).then((editorInput: EditorInput) => { - const onceDispose = once(editorInput.onDispose); - onceDispose(() => { - delete this.cache[status.getId()]; - }); - - return editorInput; - }, (errs) => { - return TPromise.wrapError(Array.isArray(errs) ? errs[0] || errs[1] : errs); - }); - } - - private createLeftInput(status: IFileStatus): TPromise { - var path = status.getPath(); - var model = this.gitService.getModel(); - - switch (status.getStatus()) { - case Status.INDEX_MODIFIED: - case Status.INDEX_RENAMED: - return this.gitService.show(path, status, 'HEAD', status.getMimetype()); - - case Status.MODIFIED: - var indexStatus = model.getStatus().find(path, StatusType.INDEX); - - if (indexStatus && indexStatus.getStatus() === Status.INDEX_RENAMED) { - return this.gitService.show(indexStatus.getRename(), status, '~', status.getMimetype()); - } - - if (indexStatus) { - return this.gitService.show(path, status, '~', status.getMimetype()); - } - - return this.gitService.show(path, status, 'HEAD', status.getMimetype()); - - default: - return TPromise.as(null); - } - } - - private createRightInput(status: IFileStatus): TPromise { - const model = this.gitService.getModel(); - const path = status.getPath(); - let resource = URI.file(paths.join(model.getRepositoryRoot(), path)); - - switch (status.getStatus()) { - case Status.INDEX_MODIFIED: - case Status.INDEX_ADDED: - case Status.INDEX_COPIED: - return this.gitService.show(path, status, '~', status.getMimetype()); - - case Status.INDEX_RENAMED: - return this.gitService.show(status.getRename(), status, '~', status.getMimetype()); - - case Status.INDEX_DELETED: - case Status.DELETED: - return this.gitService.show(path, status, 'HEAD', status.getMimetype()); - - case Status.MODIFIED: - case Status.UNTRACKED: - case Status.IGNORED: - var indexStatus = model.getStatus().find(path, StatusType.INDEX); - - if (indexStatus && indexStatus.getStatus() === Status.INDEX_RENAMED) { - resource = URI.file(paths.join(model.getRepositoryRoot(), indexStatus.getRename())); - } - - return TPromise.as(this.editorService.createInput({ resource }) as EditorInput); - - case Status.BOTH_MODIFIED: - return TPromise.as(this.editorService.createInput({ resource }) as EditorInput); - - default: - return TPromise.as(null); - } - } - - private onFileStatusDispose(fileStatus: IFileStatus): void { - var id = fileStatus.getId(); - var editorInputPromise = this.cache[id]; - - if (editorInputPromise) { - editorInputPromise.done((editorInput) => { this.eventuallyDispose(editorInput); }); - } - } - - /** - * If the disposed status is the same as this input's status, we must try to dispose the input. - * But we should not do it while the input is still open. This method will eventually call dispose - * when the editor input goes out of the visible editors. - */ - private eventuallyDispose(editorInput: EditorInput): void { - if (!this.maybeDispose(editorInput)) { - var listener = this.editorGroupService.onEditorsChanged(() => { - if (this.maybeDispose(editorInput)) { - listener.dispose(); - } - }); - } - } - - private maybeDispose(editorInput: EditorInput): boolean { - if (!editorInput.isDirty() && !this.editorService.getVisibleEditors().some((editor) => editor.input && editor.input.matches(editorInput))) { - editorInput.dispose(); - return true; - } - - return false; - } - - dispose(): void { - Object.keys(this.cache).forEach(key => { - this.cache[key].done((editorInput) => { editorInput.dispose(); }); - delete this.cache[key]; - }); - - this.toDispose = dispose(this.toDispose); - } -} - -export class AutoFetcher implements IAutoFetcher, IDisposable { - private static MIN_TIMEOUT = 2 * 60 * 1000; // every two minutes - private static MAX_TIMEOUT = 5 * 60 * 1000; // every five minutes - - private _state: AutoFetcherState; - private gitService: GitService; - private messageService: IMessageService; - private configurationService: IConfigurationService; - private instantiationService: IInstantiationService; - private currentRequest: TPromise; - private timeout: number; - private toDispose: IDisposable[]; - private gitServiceStateDisposable: IDisposable; - - constructor(gitService: GitService, // gitService passed as argument, not by injection - @IMessageService messageService: IMessageService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService, - @IConfigurationService configurationService: IConfigurationService, - @IInstantiationService instantiationService: IInstantiationService - ) { - this._state = AutoFetcherState.Disabled; - this.gitService = gitService; - this.messageService = messageService; - this.configurationService = configurationService; - this.instantiationService = instantiationService; - this.currentRequest = null; - this.timeout = AutoFetcher.MIN_TIMEOUT; - - this.toDispose = []; - this.toDispose.push(this.configurationService.onDidUpdateConfiguration(e => this.onConfiguration(e.config.git))); - this.onConfiguration(configurationService.getConfiguration('git')); - } - - get state(): AutoFetcherState { - return this._state; - } - - private onConfiguration(config: IGitConfiguration): void { - if (config.autofetch === false) { - this.disable(); - } else { - this.enable(); - } - } - - enable(): void { - if (this._state !== AutoFetcherState.Disabled) { - return; - } - - this.gitServiceStateDisposable = this.gitService.addListener(ServiceEvents.STATE_CHANGED, (e) => this.onGitServiceStateChange(e)); - this._state = AutoFetcherState.Active; - this.onGitServiceStateChange(this.gitService.getState()); - } - - disable(): void { - if (this.gitServiceStateDisposable) { - this.gitServiceStateDisposable.dispose(); - this.gitServiceStateDisposable = null; - } - - this.deactivate(); - this._state = AutoFetcherState.Disabled; - } - - private onGitServiceStateChange(state: ServiceState): void { - if (state === ServiceState.OK) { - this.activate(); - } else { - this.deactivate(); - } - } - - activate(): void { - if (this.currentRequest) { - this.currentRequest.cancel(); - } - - this._state = AutoFetcherState.Active; - this.loop(); - } - - deactivate(): void { - if (!this.currentRequest) { - return; - } - - this._state = AutoFetcherState.Inactive; - this.currentRequest.cancel(); - this.currentRequest = null; - } - - private loop(): void { - this._state = AutoFetcherState.Fetching; - - const model = this.gitService.getModel(); - const remotes = model ? model.getRemotes() : []; - - if (remotes.length === 0) { - this.timeout = AutoFetcher.MIN_TIMEOUT; - this.currentRequest = TPromise.as(null); - } else { - this.currentRequest = this.gitService.fetch().then(() => { - this.timeout = AutoFetcher.MIN_TIMEOUT; - }, (err) => { - if (isPromiseCanceledError(err)) { - return TPromise.wrapError(err); - } else if (err.gitErrorCode === GitErrorCodes.AuthenticationFailed) { - return TPromise.wrapError(err); - } else { - this.timeout = Math.min(Math.round(this.timeout * 1.2), AutoFetcher.MAX_TIMEOUT); // backoff - } - return undefined; - }); - } - - this.currentRequest.then(() => { - this._state = AutoFetcherState.Active; - this.currentRequest = TPromise.timeout(this.timeout); - return this.currentRequest; - }).then(() => this.loop(), (err) => this.deactivate()); - } - - dispose(): void { - this.disable(); - } -} - -const IgnoreOldGitStorageKey = 'settings.workspace.git.ignoreOld'; - -export class GitService extends EventEmitter - implements - IGitService { - - _serviceBrand: any; - - private contextService: IWorkspaceContextService; - private messageService: IMessageService; - private textFileService: ITextFileService; - private instantiationService: IInstantiationService; - private editorService: IWorkbenchEditorService; - private lifecycleService: ILifecycleService; - private outputService: IOutputService; - protected raw: IRawGitService; - - private state: ServiceState; - private operations: IGitOperation[]; - private model: IModel; - private inputCache: EditorInputCache; - private toDispose: IDisposable[]; - private needsRefresh: boolean; - private statusDelayer: ThrottledDelayer; - private reactiveStatusDelayer: PeriodThrottledDelayer; - private autoFetcher: AutoFetcher; - private isStatusPending = false; - - private _allowHugeRepositories: boolean; - get allowHugeRepositories(): boolean { return this._allowHugeRepositories; } - set allowHugeRepositories(value: boolean) { - this._allowHugeRepositories = value; - - if (value && this.state === ServiceState.Huge) { - this.transition(ServiceState.OK); - } - } - - get onOutput(): Event { return this.raw.onOutput; } - - constructor( - raw: IRawGitService, - @IInstantiationService instantiationService: IInstantiationService, - @IFileService private fileService: IFileService, - @IMessageService messageService: IMessageService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService, - @IOutputService outputService: IOutputService, - @ITextFileService textFileService: ITextFileService, - @IWorkspaceContextService contextService: IWorkspaceContextService, - @ILifecycleService lifecycleService: ILifecycleService, - @IStorageService storageService: IStorageService, - @IConfigurationService private configurationService: IConfigurationService - ) { - super(); - - this.instantiationService = instantiationService; - this.messageService = messageService; - this.editorService = editorService; - this.textFileService = textFileService; - this.outputService = outputService; - this.contextService = contextService; - this.lifecycleService = lifecycleService; - - this.raw = raw; - this.state = ServiceState.NotInitialized; - this.operations = []; - this.model = new Model(); - this.toDispose = []; - - this.needsRefresh = false; - this.statusDelayer = new ThrottledDelayer(500); - this.reactiveStatusDelayer = new PeriodThrottledDelayer(500, 10000); - this.autoFetcher = this.instantiationService.createInstance(AutoFetcher, this); - this._allowHugeRepositories = false; - - this.registerListeners(); - - this.inputCache = this.instantiationService.createInstance(EditorInputCache, this); - - this.triggerAutoStatus(true); // trigger initial status - - if (!storageService.getBoolean(IgnoreOldGitStorageKey, StorageScope.GLOBAL, false)) { - this.raw.serviceState().done(state => { - if (state !== RawServiceState.OK) { - return undefined; - } - - return this.raw.getVersion().then(version => { - const match = /^(\d+)\.\d+\.\d+/.exec(version || ''); - const major = match && parseInt(match[1]); - - if (major && major < 2) { - messageService.show(severity.Warning, { - message: localize('updateGit', "You seem to have git {0} installed. Code works best with git >=2.0.0.", version), - actions: [ - new Action('downloadLatest', localize('download', "Download"), '', true, () => { - window.open('https://git-scm.com/'); - return null; - }), - new Action('neverShowAgain', localize('neverShowAgain', "Don't show again"), null, true, () => { - storageService.store(IgnoreOldGitStorageKey, true, StorageScope.GLOBAL); - return null; - }), - CloseAction - ] - }); - } - }); - }); - } - } - - private registerListeners(): void { - this.toDispose.push(this.fileService.onFileChanges((e) => this.onFileChanges(e))); - this.toDispose.push(this.textFileService.models.onModelSaved((e) => this.onTextFileChange(e))); - this.toDispose.push(this.textFileService.models.onModelReverted((e) => this.onTextFileChange(e))); - this.toDispose.push(this.configurationService.onDidUpdateConfiguration(() => { - if (this._allowHugeRepositories) { - return; - } - - const config = this.configurationService.getConfiguration('git'); - this._allowHugeRepositories = config.allowLargeRepositories; - - if (this._allowHugeRepositories) { - this.triggerAutoStatus(); - } - })); - this.lifecycleService.onShutdown(this.dispose, this); - - const focusEvent = domEvent(window, 'focus'); - this.toDispose.push(focusEvent(() => { - if (this.isStatusPending) { - this.triggerAutoStatus(); - } - })); - } - - private onTextFileChange(e: TextFileModelChangeEvent): void { - var shouldTriggerStatus = paths.basename(e.resource.fsPath) === '.gitignore'; - - if (!shouldTriggerStatus) { - return; - } - - this.triggerAutoStatus(); - } - - private onFileChanges(e: FileChangesEvent): void { - var isIdle = this.isIdle(); - - var shouldTriggerStatus = e.changes.some(c => { - var workspacePath = this.contextService.toWorkspaceRelativePath(c.resource); - if (!workspacePath) { - return false; // ignore out of workspace files - } - - // for .gitindex, the service must be idle - if ('.git/index' === workspacePath) { - return isIdle; - } - - // for anything other that .git* - if (!/^\.git/.test(workspacePath)) { - return true; - } - - // added or deleted .git folder - if (workspacePath === '.git') { - return c.type === FileChangeType.ADDED || c.type === FileChangeType.DELETED; - } - - return ['.git/index.lock', '.git/FETCH_HEAD', '.gitignore', '.gitmodules'].indexOf(workspacePath) === -1; - }); - - if (!shouldTriggerStatus) { - return; - } - - this.triggerAutoStatus(); - } - - private onGitServiceOperationEnd(e: { operation: IGitOperation; }): void { - if (e.operation.id === ServiceOperations.COMMAND) { - this.triggerAutoStatus(); - } - } - - getState(): ServiceState { - return this.state; - } - - getModel(): IModel { - return this.model; - } - - status(): TPromise { - return this.statusDelayer.trigger(() => this._status()); - } - - private _status(): TPromise { - const config = this.configurationService.getConfiguration('git'); - - if (this._allowHugeRepositories || config.allowLargeRepositories) { - return this.run(ServiceOperations.STATUS, () => this.raw.status()); - } - - if (this.state === ServiceState.Huge) { - return TPromise.as(this.model); - } - - return this.raw.statusCount().then(count => { - if (count > 5000 && !this._allowHugeRepositories) { - this.transition(ServiceState.Huge); - return TPromise.as(this.model); - } - - return this.run(ServiceOperations.STATUS, () => this.raw.status()); - }); - } - - private triggerAutoStatus(force = false): void { - this.isStatusPending = true; - - if (!document.hasFocus() && !force) { - return; - } - - this.isStatusPending = false; - - const config = this.configurationService.getConfiguration('git'); - - if (!config.autorefresh) { - return; - } - - this.reactiveStatusDelayer.trigger(() => this.status()).done(null, e => { - if (isPromiseCanceledError(e)) { - return; - } - - this.messageService.show(severity.Error, e); - }); - } - - init(): TPromise { - return this.run(ServiceOperations.INIT, () => this.raw.init()); - } - - add(files?: IFileStatus[]): TPromise { - return this.run(ServiceOperations.ADD, () => this.raw.add(GitService.toPaths(files))); - } - - stage(filePath: string, content: string): TPromise { - return this.run(ServiceOperations.STAGE, () => this.raw.stage(filePath, content)); - } - - branch(name: string, checkout: boolean = false): TPromise { - return this.run(ServiceOperations.BRANCH, () => this.raw.branch(name, checkout)); - } - - checkout(treeish: string = '', files: IFileStatus[] = null): TPromise { - return this.run(ServiceOperations.CHECKOUT, () => this.raw.checkout(treeish, GitService.toPaths(files))); - } - - clean(files: IFileStatus[]): TPromise { - return this.run(ServiceOperations.CLEAN, () => this.raw.clean(files.map((s) => s.getPath()))); - } - - undo(): TPromise { - return this.run(ServiceOperations.UNDO, () => this.raw.undo()); - } - - reset(treeish: string, hard?: boolean): TPromise { - return this.run(ServiceOperations.RESET, () => this.raw.reset(treeish, hard)); - } - - revertFiles(treeish: string, files?: IFileStatus[]): TPromise { - return this.run(ServiceOperations.REVERT, () => this.raw.revertFiles(treeish, (files || []).map((s) => s.getPath()))); - } - - fetch(): TPromise { - return this.run(ServiceOperations.BACKGROUND_FETCH, () => this.raw.fetch()); - } - - pull(rebase?: boolean): TPromise { - return this.run(ServiceOperations.PULL, () => this.raw.pull(rebase)); - } - - push(remote?: string, name?: string, options?: IPushOptions): TPromise { - return this.run(ServiceOperations.PUSH, () => this.raw.push(remote, name, options)); - } - - sync(rebase?: boolean): TPromise { - const head = this.model.getHEAD(); - const isAhead = head && head.upstream && !!head.ahead; - - if (!isAhead) { - return this.run(ServiceOperations.SYNC, () => this.raw.pull(rebase)); - } else { - return this.run(ServiceOperations.SYNC, () => this.raw.sync()); - } - } - - commit(message: string, amend: boolean = false, stage: boolean = false, signoff: boolean = false): TPromise { - return this.run(ServiceOperations.COMMIT, () => this.raw.commit(message, amend, stage, signoff)); - } - - getCommitTemplate(): TPromise { - return this.raw.getCommitTemplate(); - } - - getCommit(ref: string): TPromise { - return this.raw.getCommit(ref); - } - - detectMimetypes(path: string, treeish: string = '~'): TPromise { - return this.raw.detectMimetypes(path, treeish); - } - - clone(url: string, parentPath: string): TPromise { - return this.raw.clone(url, parentPath) - .then(null, e => this.wrapGitError(e)); - } - - private run(operationId: string, fn: () => TPromise): TPromise { - return this.raw.serviceState().then(state => { - if (state === RawServiceState.GitNotFound) { - this.transition(ServiceState.NoGit); - return TPromise.as(null); - } else if (state === RawServiceState.Disabled) { - this.transition(ServiceState.Disabled); - return TPromise.as(null); - } else { - return this._run(operationId, fn); - } - }); - } - - private _run(operationId: string, fn: () => TPromise): TPromise { - var operation = new GitOperation(operationId, fn); - - this.operations.push(operation); - this.emit(ServiceEvents.OPERATION_START, operation); - this.emit(ServiceEvents.OPERATION, operation); - - var onDone = (error: any = null) => { - var index = this.operations.indexOf(operation); - - if (index > -1) { - this.operations.splice(index, 1); - } - - var e = { operation: operation, error: error }; - this.emit(ServiceEvents.OPERATION_END, e); - this.onGitServiceOperationEnd(e); - this.emit(ServiceEvents.OPERATION, operation); - }; - - return operation.run().then((status: IRawStatus) => { - this.model.update(status); - - onDone(); - - if (status) { - this.transition(status.state === null || status.state === undefined ? ServiceState.OK : status.state); - } else { - this.transition(ServiceState.NotARepo); - } - - return this.model; - }, (e) => { - onDone(e); - - if (isPromiseCanceledError(e)) { - return TPromise.wrapError(e); - } - - var gitErrorCode: string = e.gitErrorCode || null; - - if (gitErrorCode === GitErrorCodes.NotAtRepositoryRoot) { - this.transition(ServiceState.NotAtRepoRoot); - return TPromise.as(this.model); - } - - this.emit(ServiceEvents.ERROR, e); - this.transition(ServiceState.OK); - - if (gitErrorCode === GitErrorCodes.NoUserNameConfigured || gitErrorCode === GitErrorCodes.NoUserEmailConfigured) { - this.messageService.show(severity.Warning, localize('configureUsernameEmail', "Please configure your git user name and e-mail.")); - - return TPromise.as(null); - - } else if (gitErrorCode === GitErrorCodes.BadConfigFile) { - this.messageService.show(severity.Error, localize('badConfigFile', "Git {0}", e.message)); - return TPromise.as(null); - - } else if (gitErrorCode === GitErrorCodes.UnmergedChanges) { - this.messageService.show(severity.Warning, localize('unmergedChanges', "You should first resolve the unmerged changes before committing your changes.")); - return TPromise.as(null); - } - - return this.wrapGitError(e); - }); - } - - private wrapGitError(e: any): TPromise { - const gitErrorCode: string = e.gitErrorCode || null; - const showOutputAction = new Action('show.gitOutput', localize('showOutput', "Show Output"), null, true, () => this.outputService.getChannel('Git').show()); - const cancelAction = new Action('close.message', localize('cancel', "Cancel"), null, true, () => TPromise.as(true)); - const error = createError( - localize('checkNativeConsole', "There was an issue running a git operation. Please review the output or use a console to check the state of your repository."), - { actions: [cancelAction, showOutputAction] } - ); - - (error).gitErrorCode = gitErrorCode; - (error).stdout = e.stdout; - (error).stderr = e.stderr; - - return TPromise.wrapError(error); - } - - private transition(state: ServiceState): void { - var oldState = this.state; - - this.state = state; - - if (state !== oldState) { - this.emit(ServiceEvents.STATE_CHANGED, state); - } - } - - buffer(path: string, treeish: string = '~'): TPromise { - return this.raw.show(path, treeish); - } - - show(path: string, status: IFileStatus, treeish: string = '~', mimetype: string = 'text/plain'): TPromise { - return this.detectMimetypes(path, treeish).then((mimetypes: string[]) => { - var pathComponents = status.getPathComponents(); - var fileSegment = pathComponents[pathComponents.length - 1]; - var folderSegment = toReadablePath(pathComponents.slice(0, pathComponents.length - 1).join('/')); - - var label: string; - var description: string; - - if (treeish === '~') { - label = localize('changesFromIndex', "{0} (index)", fileSegment); - description = localize('changesFromIndexDesc', "{0} - Changes on index", folderSegment); - } else { - label = localize('changesFromTree', "{0} ({1})", fileSegment, treeish); - description = localize('changesFromTreeDesc', "{0} - Changes on {1}", folderSegment, treeish); - } - - if (mime.isUnspecific(mimetypes)) { - mimetypes = mime.guessMimeTypes(path); // guess from path if our detection did not yield results - } - - // Binary: our story is weak here for binary files on the index. Since we run natively, we do not have a way currently - // to e.g. show images as binary inside the renderer because images need to be served through a URL to show. We could revisit this by - // allowing to use data URLs for resource inputs to render them. However, this would mean potentially loading a large file into memory - // - // Our solution now is to detect binary files and immediately return an input that is flagged as binary unknown mime type. - if (mime.isBinaryMime(mime.guessMimeTypes(path)) || mimetypes.indexOf(mime.MIME_BINARY) >= 0) { - return TPromise.wrapError(new Error('The resource seems to be binary and cannot be displayed')); - } - - // Text - return TPromise.as(this.instantiationService.createInstance(NativeGitIndexStringEditorInput, label, description, mimetypes.join(', '), status, path, treeish)); - }); - } - - getInput(status: IFileStatus): TPromise { - return this.inputCache.getInput(status).then(null, (err) => { - if (err.gitErrorCode = GitErrorCodes.CantOpenResource) { - this.messageService.show(severity.Warning, localize('cantOpenResource', "Can't open this git resource.")); - return TPromise.as(null); - } - - return TPromise.wrapError(err); - }); - } - - isInitialized(): boolean { - return this.state === ServiceState.OK; - } - - isIdle(): boolean { - return this.isInitialized() && !this.operations.some(op => op.id !== ServiceOperations.BACKGROUND_FETCH); - } - - getRunningOperations(): IGitOperation[] { - return this.operations; - } - - getAutoFetcher(): IAutoFetcher { - return this.autoFetcher; - } - - private static toPaths(files: IFileStatus[]): string[] { - if (!files) { - return null; - } - - return files.map((status) => { - /* In the case that a file was renamed in the index and (changed || deleted) in the - working tree, we must use its new name, running the checkout command. - */ - - switch (status.getStatus()) { - case Status.MODIFIED: - case Status.DELETED: - if (status.getRename()) { - return status.getRename(); - } - - default: - return status.getPath(); - } - }); - } - - dispose(): void { - this.emit(ServiceEvents.DISPOSE); - - if (this.model) { - this.model.dispose(); - this.model = null; - } - - super.dispose(); - } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/gitViewlet.ts b/src/vs/workbench/parts/git/browser/gitViewlet.ts deleted file mode 100644 index 02b64d84ded..00000000000 --- a/src/vs/workbench/parts/git/browser/gitViewlet.ts +++ /dev/null @@ -1,215 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import 'vs/css!./media/gitViewlet'; -import winjs = require('vs/base/common/winjs.base'); -import lifecycle = require('vs/base/common/lifecycle'); -import eventemitter = require('vs/base/common/eventEmitter'); -import $ = require('vs/base/browser/builder'); -import actions = require('vs/base/common/actions'); -import viewlet = require('vs/workbench/browser/viewlet'); -import git = require('vs/workbench/parts/git/common/git'); -import contrib = require('vs/workbench/parts/git/browser/gitWorkbenchContributions'); -import view = require('vs/workbench/parts/git/browser/views/view'); -import changes = require('vs/workbench/parts/git/browser/views/changes/changesView'); -import empty = require('vs/workbench/parts/git/browser/views/empty/emptyView'); -import gitless = require('vs/workbench/parts/git/browser/views/gitless/gitlessView'); -import notroot = require('vs/workbench/parts/git/browser/views/notroot/notrootView'); -import noworkspace = require('vs/workbench/parts/git/browser/views/noworkspace/noworkspaceView'); -import { DisabledView } from './views/disabled/disabledView'; -import { HugeView } from './views/huge/hugeView'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IProgressService, IProgressRunner } from 'vs/platform/progress/common/progress'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; - -import IGitService = git.IGitService; - -export class GitViewlet - extends viewlet.Viewlet - implements view.IController { - private progressService: IProgressService; - private gitService: git.IGitService; - private instantiationService: IInstantiationService; - - private $el: $.Builder; - private currentView: view.IView; - private progressRunner: IProgressRunner; - - private currentDimension: $.Dimension; - private views: { [id: string]: view.IView; }; - - private toDispose: lifecycle.IDisposable[]; - - constructor( @ITelemetryService telemetryService: ITelemetryService, @IProgressService progressService: IProgressService, @IInstantiationService instantiationService: IInstantiationService, @IGitService gitService: IGitService, @IThemeService themeService: IThemeService) { - super(contrib.VIEWLET_ID, telemetryService, themeService); - - this.progressService = progressService; - this.instantiationService = instantiationService; - this.gitService = gitService; - - this.progressRunner = null; - this.views = {}; - this.toDispose = []; - - var views: view.IView[] = [ - this.instantiationService.createInstance(changes.ChangesView, this.getActionRunner()), - this.instantiationService.createInstance(empty.EmptyView, this, this.getActionRunner()), - this.instantiationService.createInstance(gitless.GitlessView), - new notroot.NotRootView(), - this.instantiationService.createInstance(noworkspace.NoWorkspaceView, this.getActionRunner()), - new DisabledView(), - this.instantiationService.createInstance(HugeView) - ]; - - views.forEach(v => { - this.views[v.ID] = v; - this.toDispose.push(v); - }); - - this.toUnbind.push(this.gitService.addBulkListener(() => this.onGitServiceChanges())); - } - - // GitView.IController - - public setView(id: string): winjs.Promise { - if (!this.$el) { - return winjs.TPromise.as(null); - } - - var view = this.views[id]; - - if (!view) { - return winjs.Promise.wrapError(new Error('Could not find view.')); - } - - if (this.currentView === view) { - return winjs.TPromise.as(null); - } - - var promise = winjs.TPromise.as(null); - - if (this.currentView) { - promise = this.currentView.setVisible(false); - } - - var element = view.element; - this.currentView = view; - this.updateTitleArea(); - - var el = this.$el.getHTMLElement(); - while (el.firstChild) { - el.removeChild(el.firstChild); - } - - el.appendChild(element); - view.layout(this.currentDimension); - - return promise.then(() => view.setVisible(true)); - } - - // Viewlet - - public create(parent: $.Builder): winjs.TPromise { - super.create(parent); - - this.$el = parent.div().addClass('git-viewlet'); - - return winjs.TPromise.as(null); - } - - public setVisible(visible: boolean): winjs.TPromise { - if (visible) { - this.onGitServiceChanges(); - - this.gitService.status().done(); - - return super.setVisible(visible).then(() => { - if (this.currentView) { - return this.currentView.setVisible(visible); - } - return undefined; - }); - } else { - return (this.currentView ? this.currentView.setVisible(visible) : winjs.TPromise.as(null)).then(() => { - super.setVisible(visible); - }); - } - } - - public focus(): void { - super.focus(); - - if (this.currentView) { - this.currentView.focus(); - } - } - - public layout(dimension: $.Dimension = this.currentDimension): void { - this.currentDimension = dimension; - - if (this.currentView) { - this.currentView.layout(dimension); - } - } - - public getActions(): actions.IAction[] { - return this.currentView ? this.currentView.getActions() : []; - } - - public getSecondaryActions(): actions.IAction[] { - return this.currentView ? this.currentView.getSecondaryActions() : []; - } - - public getControl(): eventemitter.IEventEmitter { - if (!this.currentView) { - return null; - } - - return this.currentView.getControl(); - } - - // Event handlers - - private onGitServiceChanges(): void { - if (this.progressRunner) { - this.progressRunner.done(); - } - - if (this.gitService.getState() === git.ServiceState.NoGit) { - this.setView('gitless'); - this.progressRunner = null; - } else if (this.gitService.getState() === git.ServiceState.Disabled) { - this.setView('disabled'); - this.progressRunner = null; - } else if (this.gitService.getState() === git.ServiceState.NotARepo) { - this.setView('empty'); - this.progressRunner = null; - } else if (this.gitService.getState() === git.ServiceState.NotAWorkspace) { - this.setView('noworkspace'); - this.progressRunner = null; - } else if (this.gitService.getState() === git.ServiceState.NotAtRepoRoot) { - this.setView('notroot'); - this.progressRunner = null; - } else if (this.gitService.getState() === git.ServiceState.Huge) { - this.setView('huge'); - this.progressRunner = null; - } else if (this.gitService.isIdle()) { - this.setView('changes'); - this.progressRunner = null; - } else { - this.progressRunner = this.progressService.show(true); - } - } - - public dispose(): void { - this.toDispose = lifecycle.dispose(this.toDispose); - this.views = null; - - super.dispose(); - } -} diff --git a/src/vs/workbench/parts/git/browser/gitWidgets.ts b/src/vs/workbench/parts/git/browser/gitWidgets.ts deleted file mode 100644 index d2db61f03d1..00000000000 --- a/src/vs/workbench/parts/git/browser/gitWidgets.ts +++ /dev/null @@ -1,209 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import nls = require('vs/nls'); -import strings = require('vs/base/common/strings'); -import { Delayer } from 'vs/base/common/async'; -import { $, append, show, hide, toggleClass } from 'vs/base/browser/dom'; -import { IAction } from 'vs/base/common/actions'; -import { IDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; -import { IGitService, ServiceState, IBranch, ServiceOperations, IRemote } from 'vs/workbench/parts/git/common/git'; -import { IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar'; -import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { SyncAction, PublishAction } from './gitActions'; -import Severity from 'vs/base/common/severity'; -import { IMessageService } from 'vs/platform/message/common/message'; - -interface IState { - serviceState: ServiceState; - isBusy: boolean; - isSyncing: boolean; - HEAD: IBranch; - remotes: IRemote[]; - ps1: string; -} - -const DisablementDelay = 500; - -export class GitStatusbarItem implements IStatusbarItem { - - private instantiationService: IInstantiationService; - private gitService: IGitService; - private quickOpenService: IQuickOpenService; - private state: IState; - private element: HTMLElement; - private branchElement: HTMLElement; - private publishElement: HTMLElement; - private syncElement: HTMLElement; - private syncLabelElement: HTMLElement; - private disablementDelayer: Delayer; - - private syncAction: SyncAction; - private publishAction: PublishAction; - - private toDispose: IDisposable[]; - - constructor( - @IInstantiationService instantiationService: IInstantiationService, - @IGitService gitService: IGitService, - @IQuickOpenService quickOpenService: IQuickOpenService, - @IMessageService private messageService: IMessageService, - @ITelemetryService private telemetryService: ITelemetryService - ) { - this.instantiationService = instantiationService; - this.gitService = gitService; - this.quickOpenService = quickOpenService; - this.disablementDelayer = new Delayer(DisablementDelay); - - this.syncAction = instantiationService.createInstance(SyncAction, SyncAction.ID, SyncAction.LABEL); - this.publishAction = instantiationService.createInstance(PublishAction, PublishAction.ID, PublishAction.LABEL); - - this.toDispose = [ - this.syncAction, - this.publishAction - ]; - - this.state = { - serviceState: ServiceState.NotInitialized, - isBusy: false, - isSyncing: false, - HEAD: null, - remotes: [], - ps1: '' - }; - } - - public render(container: HTMLElement): IDisposable { - this.element = append(container, $('.git-statusbar-group')); - - this.branchElement = append(this.element, $('a')); - - this.publishElement = append(this.element, $('a.octicon.octicon-cloud-upload')); - this.publishElement.title = nls.localize('publishBranch', "Publish Branch"); - this.publishElement.onclick = () => this.onPublishClick(); - - this.syncElement = append(this.element, $('a.git-statusbar-sync-item')); - this.syncElement.title = nls.localize('syncBranch', "Synchronize Changes"); - this.syncElement.onclick = () => this.onSyncClick(); - append(this.syncElement, $('span.octicon.octicon-sync')); - - this.syncLabelElement = append(this.syncElement, $('span.ahead-behind')); - - this.setState(this.state); - this.toDispose.push(this.gitService.addBulkListener(() => this.onGitServiceChange())); - return combinedDisposable(this.toDispose); - } - - private onGitServiceChange(): void { - const model = this.gitService.getModel(); - - this.setState({ - serviceState: this.gitService.getState(), - isBusy: this.gitService.getRunningOperations().some(op => op.id === ServiceOperations.CHECKOUT || op.id === ServiceOperations.BRANCH), - isSyncing: this.gitService.getRunningOperations().some(op => op.id === ServiceOperations.SYNC), - HEAD: model.getHEAD(), - remotes: model.getRemotes(), - ps1: model.getPS1() - }); - } - - private setState(state: IState): void { - this.state = state; - - let isGitDisabled = false; - let className = 'git-statusbar-branch-item'; - let textContent: string; - let aheadBehindLabel = ''; - let title = ''; - let onclick: () => void = null; - - if (state.serviceState !== ServiceState.OK) { - isGitDisabled = true; - className += ' disabled'; - title = nls.localize('gitNotEnabled', "Git is not enabled in this workspace."); - textContent = '\u00a0'; - } else { - const HEAD = state.HEAD; - - if (state.isBusy) { - className += ' busy'; - } else { - onclick = () => this.onBranchClick(); - } - - if (!HEAD) { - textContent = state.ps1; - } else if (!HEAD.name) { - textContent = state.ps1; - className += ' headless'; - } else if (!HEAD.commit || !HEAD.upstream || (!HEAD.ahead && !HEAD.behind)) { - textContent = state.ps1; - } else { - textContent = state.ps1; - aheadBehindLabel = strings.format('{0}↓ {1}↑', HEAD.behind, HEAD.ahead); - } - } - - this.branchElement.className = className; - this.branchElement.title = title; - this.branchElement.textContent = textContent; - this.branchElement.onclick = onclick; - this.syncLabelElement.textContent = aheadBehindLabel; - - if (isGitDisabled) { - hide(this.branchElement); - hide(this.publishElement); - hide(this.syncElement); - } else { - show(this.branchElement); - - if (state.HEAD && !!state.HEAD.upstream) { - show(this.syncElement); - toggleClass(this.syncElement, 'syncing', this.state.isSyncing); - toggleClass(this.syncElement, 'empty', !aheadBehindLabel); - this.disablementDelayer.trigger( - () => toggleClass(this.syncElement, 'disabled', !this.syncAction.enabled), - this.syncAction.enabled ? 0 : DisablementDelay - ); - hide(this.publishElement); - } else if (state.remotes.length > 0) { - hide(this.syncElement); - show(this.publishElement); - this.disablementDelayer.trigger( - () => toggleClass(this.publishElement, 'disabled', !this.publishAction.enabled), - this.publishAction.enabled ? 0 : DisablementDelay - ); - } else { - hide(this.syncElement); - hide(this.publishElement); - } - } - } - - private onBranchClick(): void { - this.quickOpenService.show('git checkout '); - } - - private onPublishClick(): void { - this.runAction(this.publishAction); - } - - private onSyncClick(): void { - this.runAction(this.syncAction); - } - - private runAction(action: IAction): void { - if (!action.enabled) { - return; - } - - this.telemetryService.publicLog('workbenchActionExecuted', { id: action.id, from: 'status bar' }); - - action.run() - .done(null, err => this.messageService.show(Severity.Error, err)); - } -} diff --git a/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts b/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts deleted file mode 100644 index e35495db433..00000000000 --- a/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts +++ /dev/null @@ -1,241 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import 'vs/css!./media/git.contribution'; -import nls = require('vs/nls'); -import async = require('vs/base/common/async'); -import lifecycle = require('vs/base/common/lifecycle'); -import ext = require('vs/workbench/common/contributions'); -import git = require('vs/workbench/parts/git/common/git'); -import viewlet = require('vs/workbench/browser/viewlet'); -import statusbar = require('vs/workbench/browser/parts/statusbar/statusbar'); -import platform = require('vs/platform/platform'); -import widgets = require('vs/workbench/parts/git/browser/gitWidgets'); -import wbar = require('vs/workbench/common/actionRegistry'); -import gitoutput = require('vs/workbench/parts/git/browser/gitOutput'); -import output = require('vs/workbench/parts/output/common/output'); -import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; -import confregistry = require('vs/platform/configuration/common/configurationRegistry'); -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import quickopen = require('vs/workbench/browser/quickopen'); -import 'vs/workbench/parts/git/browser/gitEditorContributions'; -import { IActivityBarService, ProgressBadge, NumberBadge } from 'vs/workbench/services/activity/common/activityBarService'; -import { IMessageService } from 'vs/platform/message/common/message'; -import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; -import { GitSCMProvider } from './gitScm'; - -import IGitService = git.IGitService; - -export class StatusUpdater implements ext.IWorkbenchContribution { - static ID = 'vs.git.statusUpdater'; - - private gitService: IGitService; - private activityBarService: IActivityBarService; - private messageService: IMessageService; - private configurationService: IConfigurationService; - private progressBadgeDelayer: async.Delayer; - private badgeHandle: lifecycle.IDisposable; - private toDispose: lifecycle.IDisposable[]; - - constructor( - @IGitService gitService: IGitService, - @IActivityBarService activityBarService: IActivityBarService, - @IMessageService messageService: IMessageService, - @IConfigurationService configurationService: IConfigurationService - ) { - this.gitService = gitService; - this.activityBarService = activityBarService; - this.messageService = messageService; - this.configurationService = configurationService; - - this.progressBadgeDelayer = new async.Delayer(200); - - this.toDispose = []; - this.toDispose.push(this.configurationService.onDidUpdateConfiguration(e => this.onGitServiceChange())); - this.toDispose.push(this.gitService.addBulkListener(e => this.onGitServiceChange())); - } - - private onGitServiceChange(): void { - - lifecycle.dispose(this.badgeHandle); - - if (this.gitService.getState() !== git.ServiceState.OK) { - this.progressBadgeDelayer.cancel(); - - } else if (this.gitService.isIdle()) { - this.showChangesBadge(); - } else { - this.progressBadgeDelayer.trigger(() => { - this.badgeHandle = this.activityBarService.showActivity('workbench.view.git', new ProgressBadge(() => nls.localize('gitProgressBadge', 'Running git status')), 'git-viewlet-label-progress'); - }); - } - } - - private showChangesBadge(): void { - this.progressBadgeDelayer.cancel(); - - const { countBadge } = this.configurationService.getConfiguration('git'); - - if (countBadge === 'off') { - return; - } - - const filter = countBadge === 'tracked' - ? s => s.getStatus() !== git.Status.UNTRACKED - : () => true; - - const statuses = this.gitService.getModel().getStatus().getGroups() - .map(g => g.all()) - .reduce((r, g) => r.concat(g), []) - .filter(filter); - - const badge = new NumberBadge(statuses.length, num => nls.localize('gitPendingChangesBadge', '{0} pending changes', num)); - this.badgeHandle = this.activityBarService.showActivity('workbench.view.git', badge, 'git-viewlet-label'); - } - - public getId(): string { - return StatusUpdater.ID; - } - - public dispose(): void { - this.toDispose = lifecycle.dispose(this.toDispose); - lifecycle.dispose(this.badgeHandle); - } -} - -export const VIEWLET_ID = 'workbench.view.git'; - -class OpenGitViewletAction extends viewlet.ToggleViewletAction { - public static ID = VIEWLET_ID; - public static LABEL = nls.localize('toggleGitViewlet', "Show Git"); - - constructor(id: string, label: string, @IViewletService viewletService: IViewletService, @IWorkbenchEditorService editorService: IWorkbenchEditorService) { - super(id, label, VIEWLET_ID, viewletService, editorService); - } -} - -export function registerContributions(): void { - - // Register Statusbar item - (platform.Registry.as(statusbar.Extensions.Statusbar)).registerStatusbarItem(new statusbar.StatusbarItemDescriptor( - widgets.GitStatusbarItem, - statusbar.StatusbarAlignment.LEFT, - 100 /* High Priority */ - )); - - // Register Output Channel - var outputChannelRegistry = platform.Registry.as(output.Extensions.OutputChannels); - outputChannelRegistry.registerChannel('Git', nls.localize('git', "Git")); - - // Register Git Output - (platform.Registry.as(ext.Extensions.Workbench)).registerWorkbenchContribution( - gitoutput.GitOutput - ); - - // Register Viewlet - (platform.Registry.as(viewlet.Extensions.Viewlets)).registerViewlet(new viewlet.ViewletDescriptor( - 'vs/workbench/parts/git/browser/gitViewlet', - 'GitViewlet', - VIEWLET_ID, - nls.localize('git', "Git"), - 'git', - 35 - )); - - // Register Action to Open Viewlet - (platform.Registry.as(wbar.Extensions.WorkbenchActions)).registerWorkbenchAction( - new SyncActionDescriptor(OpenGitViewletAction, OpenGitViewletAction.ID, OpenGitViewletAction.LABEL, { - primary: null, - win: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G }, - linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G }, - mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.KEY_G } - }), - 'View: Show Git', - nls.localize('view', "View") - ); - - // Register StatusUpdater - (platform.Registry.as(ext.Extensions.Workbench)).registerWorkbenchContribution( - StatusUpdater - ); - - // Register GitSCMProvider - (platform.Registry.as(ext.Extensions.Workbench)).registerWorkbenchContribution( - GitSCMProvider - ); - - // Register Quick Open for git - (platform.Registry.as(quickopen.Extensions.Quickopen)).registerQuickOpenHandler( - new quickopen.QuickOpenHandlerDescriptor( - 'vs/workbench/parts/git/browser/gitQuickOpen', - 'GitCommandQuickOpenHandler', - 'git ', - nls.localize('gitCommands', "Git Commands") - ) - ); - - // Register configuration - var configurationRegistry = platform.Registry.as(confregistry.Extensions.Configuration); - configurationRegistry.registerConfiguration({ - id: 'git', - order: 15, - title: nls.localize('gitConfigurationTitle', "Git"), - type: 'object', - properties: { - 'git.enabled': { - type: 'boolean', - description: nls.localize('gitEnabled', "Is git enabled"), - default: true - }, - 'git.path': { - type: ['string', 'null'], - description: nls.localize('gitPath', "Path to the git executable"), - default: null, - isExecutable: true - }, - 'git.autorefresh': { - type: 'boolean', - description: nls.localize('gitAutoRefresh', "Whether auto refreshing is enabled"), - default: true - }, - 'git.autofetch': { - type: 'boolean', - description: nls.localize('gitAutoFetch', "Whether auto fetching is enabled."), - default: true - }, - 'git.enableLongCommitWarning': { - type: 'boolean', - description: nls.localize('gitLongCommit', "Whether long commit messages should be warned about."), - default: true - }, - 'git.allowLargeRepositories': { - type: 'boolean', - description: nls.localize('gitLargeRepos', "Always allow large repositories to be managed by Code."), - default: false - }, - 'git.confirmSync': { - type: 'boolean', - description: nls.localize('confirmSync', "Confirm before synchronizing git repositories."), - default: true - }, - 'git.countBadge': { - type: 'string', - enum: ['all', 'tracked', 'off'], - default: 'all', - description: nls.localize('countBadge', "Controls the git badge counter."), - }, - 'git.checkoutType': { - type: 'string', - enum: ['all', 'local', 'tags', 'remote'], - default: 'all', - description: nls.localize('checkoutType', "Controls what type of branches are listed."), - } - } - }); -} diff --git a/src/vs/workbench/parts/git/browser/media/Compare.svg b/src/vs/workbench/parts/git/browser/media/Compare.svg deleted file mode 100644 index 3a205509bca..00000000000 --- a/src/vs/workbench/parts/git/browser/media/Compare.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/Compare_inverse.svg b/src/vs/workbench/parts/git/browser/media/Compare_inverse.svg deleted file mode 100644 index c951728abac..00000000000 --- a/src/vs/workbench/parts/git/browser/media/Compare_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/OpenEditor.svg b/src/vs/workbench/parts/git/browser/media/OpenEditor.svg deleted file mode 100644 index 85a001dccc2..00000000000 --- a/src/vs/workbench/parts/git/browser/media/OpenEditor.svg +++ /dev/null @@ -1,3 +0,0 @@ - -]> \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/OpenEditor_inverse.svg b/src/vs/workbench/parts/git/browser/media/OpenEditor_inverse.svg deleted file mode 100644 index f6302185aa4..00000000000 --- a/src/vs/workbench/parts/git/browser/media/OpenEditor_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/Refresh.svg b/src/vs/workbench/parts/git/browser/media/Refresh.svg deleted file mode 100644 index e0345748192..00000000000 --- a/src/vs/workbench/parts/git/browser/media/Refresh.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/add-focus.svg b/src/vs/workbench/parts/git/browser/media/add-focus.svg deleted file mode 100644 index 5e9f5851e8b..00000000000 --- a/src/vs/workbench/parts/git/browser/media/add-focus.svg +++ /dev/null @@ -1 +0,0 @@ -Layer 1 \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/add-inverse.svg b/src/vs/workbench/parts/git/browser/media/add-inverse.svg deleted file mode 100644 index 3475c1e1963..00000000000 --- a/src/vs/workbench/parts/git/browser/media/add-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -Layer 1 \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/add.svg b/src/vs/workbench/parts/git/browser/media/add.svg deleted file mode 100644 index bdecdb0e45b..00000000000 --- a/src/vs/workbench/parts/git/browser/media/add.svg +++ /dev/null @@ -1 +0,0 @@ -Layer 1 \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/check-inverse.svg b/src/vs/workbench/parts/git/browser/media/check-inverse.svg deleted file mode 100644 index c225b2f597f..00000000000 --- a/src/vs/workbench/parts/git/browser/media/check-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/check.svg b/src/vs/workbench/parts/git/browser/media/check.svg deleted file mode 100644 index d45df06edf8..00000000000 --- a/src/vs/workbench/parts/git/browser/media/check.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/git-dark.svg b/src/vs/workbench/parts/git/browser/media/git-dark.svg deleted file mode 100644 index c08b1c2e403..00000000000 --- a/src/vs/workbench/parts/git/browser/media/git-dark.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/git.contribution.css b/src/vs/workbench/parts/git/browser/media/git.contribution.css deleted file mode 100644 index 80ad1fe1419..00000000000 --- a/src/vs/workbench/parts/git/browser/media/git.contribution.css +++ /dev/null @@ -1,155 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -/* Appbar */ - -.monaco-workbench .git-action.open-in-diff { - background: url('Compare.svg') center center no-repeat; -} - -.monaco-workbench .git-action.open-in-editor { - background: url('OpenEditor.svg') center center no-repeat; -} - -.vs-dark .monaco-workbench .git-action.open-in-diff, -.hc-black .monaco-workbench .git-action.open-in-diff { - background: url('Compare_inverse.svg') center center no-repeat; -} - -.vs-dark .monaco-workbench .git-action.open-in-editor, -.hc-black .monaco-workbench .git-action.open-in-editor { - background: url('OpenEditor_inverse.svg') center center no-repeat; -} - -/* Activity Bar */ -.monaco-workbench > .activitybar .monaco-action-bar .action-label.git { - -webkit-mask: url('git-dark.svg') no-repeat 50% 50%; -} - -/* Status / Quick Open */ -.monaco-shell .git-statusbar-group > .git-statusbar-branch-item, -.vs-dark .monaco-workbench .quick-open-widget .quick-open-tree .quick-open-entry .quick-open-entry-icon.git { - background-image: url('git-dark.svg'); -} - -/* Git viewlet label */ - -.git-viewlet-label-progress > .badge-content { - background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxNCIgdmlld0JveD0iMiAyIDE0IDE0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDIgMiAxNCAxNCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTkgMTZjLTMuODYgMC03LTMuMTQtNy03czMuMTQtNyA3LTdjMy44NTkgMCA3IDMuMTQxIDcgN3MtMy4xNDEgNy03IDd6bTAtMTIuNmMtMy4wODggMC01LjYgMi41MTMtNS42IDUuNnMyLjUxMiA1LjYgNS42IDUuNiA1LjYtMi41MTIgNS42LTUuNi0yLjUxMi01LjYtNS42LTUuNnptMy44NiA3LjFsLTMuMTYtMS44OTZ2LTMuODA0aC0xLjR2NC41OTZsMy44NCAyLjMwNS43Mi0xLjIwMXoiLz48L3N2Zz4="); - background-position: center center; - background-repeat: no-repeat; -} - -/* Git merge editor decorations */ -.monaco-editor .git-merge-control-decoration { - background-color: rgba(255, 139, 0, 0.3); -} -.monaco-editor.vs-dark .git-merge-control-decoration { - background-color: rgba(235, 59, 0, 0.3); -} - -.monaco-shell .git-branch-dropdown-menu .action-label.git-action.checkout.HEAD { - font-weight: bold; -} - -.monaco-shell .git-branch-dropdown-menu .monaco-inputbox { - font-size: 12px; - width: 100%; -} - -.monaco-shell .git-branch-dropdown-menu .monaco-inputbox > .wrapper > .input { - background-color: transparent; -} - -.monaco-shell .git-branch-dropdown-menu .monaco-inputbox > .wrapper > .input { - padding: 0.8em 1em; -} - -/* Quick Open */ - -.monaco-workbench .quick-open-widget .quick-open-tree .quick-open-entry .quick-open-entry-icon.git { - background-size: 100%; -} - -.vs .monaco-workbench .quick-open-widget .quick-open-tree .quick-open-entry .quick-open-entry-icon.git { - background-image: url('git.svg'); -} - -/* Actions */ - -.monaco-shell .git-action.live-sync.icon { - background: url('sync.svg') 7px center no-repeat; -} - -.monaco-shell .git-action.live-sync.icon.loading { - animation: spin-forever 1.6s linear infinite; -} - -@keyframes spin-forever { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } - -/* High Contrast Theming */ -.hc-black .monaco-workbench > .activitybar .monaco-action-bar .badge.git-viewlet-label-progress .badge-content { - width: 1px; -} - -/* Status bar */ - -.monaco-shell .git-statusbar-group > a { - padding: 0 5px; -} - -.monaco-shell .git-statusbar-group > a.disabled { - opacity: 0.7; -} - -.monaco-shell .git-statusbar-group > a.octicon { - line-height: 22px; - width: 16px; - text-align: center; -} - -.monaco-shell .git-statusbar-group .octicon { - font-size: 14px; -} - -.monaco-shell .git-statusbar-group > .git-statusbar-sync-item:not(.empty) > span.octicon { - margin-right: 6px; -} - -@keyframes spin { - from { transform: rotate(0deg); } - to { transform: rotate(1080deg); } -} - -.monaco-shell .git-statusbar-group > .git-statusbar-sync-item.syncing > .octicon { - animation: 2s ease-in-out infinite spin; -} - -.monaco-shell .git-statusbar-group > .git-statusbar-sync-item.disabled > .ahead-behind, -.monaco-shell .git-statusbar-group > .git-statusbar-sync-item.busy > .ahead-behind { - cursor: default; -} - -.monaco-shell .git-statusbar-group > .git-statusbar-branch-item { - background-repeat: no-repeat; - background-position: 4px 50%; - background-size: 17px; - cursor: default; - padding: 0 5px 0 22px; -} - -.monaco-shell .git-statusbar-group > a:not(.disabled):not(.busy) { - cursor: pointer; -} - -.monaco-shell .git-statusbar-group > .busy, -.monaco-shell .git-statusbar-group > .disabled, { - opacity: 0.6; - cursor: default; -} - -.monaco-shell .git-statusbar-group > .git-statusbar-branch-item.headless { - font-style: italic; -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/git.svg b/src/vs/workbench/parts/git/browser/media/git.svg deleted file mode 100644 index d1049a44d0d..00000000000 --- a/src/vs/workbench/parts/git/browser/media/git.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/gitViewlet.css b/src/vs/workbench/parts/git/browser/media/gitViewlet.css deleted file mode 100644 index 10037adab11..00000000000 --- a/src/vs/workbench/parts/git/browser/media/gitViewlet.css +++ /dev/null @@ -1,93 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -/* Git viewlet */ - -.git-viewlet { - height: 100%; -} - -/* Actionbar actions */ - -.git-action.refresh { - background: url('Refresh.svg') center center no-repeat; -} - -.git-action.smart-commit { - background: url('check.svg') center center no-repeat; -} - -.git-action.run-pull { - background: url('pull.svg') center center no-repeat; -} - -.git-action.run-push { - background: url('push.svg') center center no-repeat; -} - -/* Tree actions */ - -.git-action.stage { - background: url('add.svg') center center no-repeat; -} - -.git-viewlet .focused .monaco-tree-row.selected:not(.highlighted) > .content.actions .git-action.stage { - background: url('add-focus.svg') center center no-repeat; -} - -.git-action.undo { - background: url('undo.svg') center center no-repeat; -} - -.git-viewlet .focused .monaco-tree-row.selected:not(.highlighted) > .content.actions .git-action.undo { - background: url('undo-focus.svg') center center no-repeat; -} - -.git-action.unstage { - background: url('subtract.svg') center center no-repeat; -} - -.git-viewlet .focused .monaco-tree-row.selected:not(.highlighted) > .content.actions .git-action.unstage { - background: url('subtract-focus.svg') center center no-repeat; -} - -/* Dark theme actions */ - -.vs-dark .git-action.refresh, -.hc-black .git-action.refresh { - background: url('refresh-inverse.svg') center center no-repeat; -} - -.vs-dark .git-action.commit, -.hc-black .git-action.commit, -.vs-dark .git-action.stage-and-commit, -.hc-black .git-action.stage-and-commit, -.vs-dark .git-action.smart-commit, -.hc-black .git-action.smart-commit { - background: url('check-inverse.svg') center center no-repeat; -} - -.vs-dark .git-action.run-pull { - background: url('pull-inverse.svg') center center no-repeat; -} - -.vs-dark .git-action.run-push { - background: url('push-inverse.svg') center center no-repeat; -} - -.vs-dark .git-action.stage, -.hc-black .git-action.stage { - background: url('add-inverse.svg') center center no-repeat; -} - -.vs-dark .git-action.undo, -.hc-black .git-action.undo { - background: url('undo-inverse.svg') center center no-repeat; -} - -.vs-dark .git-action.unstage, -.hc-black .git-action.unstage { - background: url('subtract-inverse.svg') center center no-repeat; -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/pull-inverse.svg b/src/vs/workbench/parts/git/browser/media/pull-inverse.svg deleted file mode 100644 index 6f2df243de8..00000000000 --- a/src/vs/workbench/parts/git/browser/media/pull-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/pull.svg b/src/vs/workbench/parts/git/browser/media/pull.svg deleted file mode 100644 index 6d2ccb64649..00000000000 --- a/src/vs/workbench/parts/git/browser/media/pull.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/push-inverse.svg b/src/vs/workbench/parts/git/browser/media/push-inverse.svg deleted file mode 100644 index 5afca6bc64e..00000000000 --- a/src/vs/workbench/parts/git/browser/media/push-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/push.svg b/src/vs/workbench/parts/git/browser/media/push.svg deleted file mode 100644 index 7b57be602b9..00000000000 --- a/src/vs/workbench/parts/git/browser/media/push.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/refresh-inverse.svg b/src/vs/workbench/parts/git/browser/media/refresh-inverse.svg deleted file mode 100644 index d79fdaa4e8e..00000000000 --- a/src/vs/workbench/parts/git/browser/media/refresh-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/subtract-focus.svg b/src/vs/workbench/parts/git/browser/media/subtract-focus.svg deleted file mode 100644 index 64cecb0d222..00000000000 --- a/src/vs/workbench/parts/git/browser/media/subtract-focus.svg +++ /dev/null @@ -1 +0,0 @@ -Layer 1 \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/subtract-inverse.svg b/src/vs/workbench/parts/git/browser/media/subtract-inverse.svg deleted file mode 100644 index 2de46fcf5b5..00000000000 --- a/src/vs/workbench/parts/git/browser/media/subtract-inverse.svg +++ /dev/null @@ -1 +0,0 @@ -Layer 1 \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/subtract.svg b/src/vs/workbench/parts/git/browser/media/subtract.svg deleted file mode 100644 index f5d128b2df8..00000000000 --- a/src/vs/workbench/parts/git/browser/media/subtract.svg +++ /dev/null @@ -1 +0,0 @@ -Layer 1 \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/sync.svg b/src/vs/workbench/parts/git/browser/media/sync.svg deleted file mode 100644 index 5a4bf0799e4..00000000000 --- a/src/vs/workbench/parts/git/browser/media/sync.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/undo-focus.svg b/src/vs/workbench/parts/git/browser/media/undo-focus.svg deleted file mode 100644 index c2d0cda307a..00000000000 --- a/src/vs/workbench/parts/git/browser/media/undo-focus.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/undo-inverse.svg b/src/vs/workbench/parts/git/browser/media/undo-inverse.svg deleted file mode 100644 index 9f175633389..00000000000 --- a/src/vs/workbench/parts/git/browser/media/undo-inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/media/undo.svg b/src/vs/workbench/parts/git/browser/media/undo.svg deleted file mode 100644 index 1fa6ba48a19..00000000000 --- a/src/vs/workbench/parts/git/browser/media/undo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/views/changes/changesView.css b/src/vs/workbench/parts/git/browser/views/changes/changesView.css deleted file mode 100644 index bd5892f7cc4..00000000000 --- a/src/vs/workbench/parts/git/browser/views/changes/changesView.css +++ /dev/null @@ -1,171 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -/* Commit view */ - -.git-viewlet > .changes-view > .commit-view { - box-sizing: border-box; - padding: 5px 9px 5px 16px; -} - -.git-viewlet > .changes-view > .commit-view > .monaco-inputbox { - width: 100%; -} - -.git-viewlet > .changes-view > .commit-view > .monaco-inputbox > .wrapper > .mirror { - max-height: 134px; -} - -.git-viewlet > .changes-view > .commit-view > .monaco-inputbox > .wrapper > textarea.input { - min-height: 26px; -} - -.git-viewlet > .changes-view > .commit-view.scroll > .monaco-inputbox > .wrapper > textarea.input { - overflow-y: scroll; -} - -/* Status view */ - -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .content { - line-height: 22px; - display: flex; -} - -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .content .monaco-action-bar { - display: none; - margin-right: 12px; -} - -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .content .monaco-action-bar .action-item { - margin-top: 2px; -} - -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .content .monaco-action-bar .action-label { - width: 16px; - height: 16px; -} - -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row:hover .content .monaco-action-bar, -.git-viewlet > .changes-view > .status-view > .monaco-tree.focused .monaco-tree-row.focused .content .monaco-action-bar { - display: block; -} - -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row:hover .content .monaco-count-badge, -.git-viewlet > .changes-view > .status-view > .monaco-tree.focused .monaco-tree-row.focused .content .monaco-count-badge { - display: none; -} - -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-rows > .monaco-tree-row > .content:before { - background: none; -} - -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .status-group { - font-size: 11px; - font-weight: bold; - text-transform: uppercase; - cursor: default; -} - -/* Bold font style does not go well with CJK fonts */ -.git-viewlet:lang(zh-Hans) > .changes-view > .status-view > .monaco-tree .monaco-tree-row .status-group, -.git-viewlet:lang(zh-Hant) > .changes-view > .status-view > .monaco-tree .monaco-tree-row .status-group, -.git-viewlet:lang(ja) > .changes-view > .status-view > .monaco-tree .monaco-tree-row .status-group, -.git-viewlet:lang(ko) > .changes-view > .status-view > .monaco-tree .monaco-tree-row .status-group { font-weight: normal; } - -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .count-badge-wrapper { - padding-right: 12px; -} - -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .status-group, -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status { - overflow: hidden; - text-overflow: ellipsis; - flex: 1; -} - -.vs-dark .git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .status-group { - color: inherit; -} - -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.out-of-workspace { - opacity: 0.5; -} - -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status .status { - padding: 2px 4px; - font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Inconsolata", "Courier New", monospace, "Droid Sans Fallback"; - font-size: 70%; - color: white; - text-align: center; - border-radius: 0.5em; - vertical-align: bottom; -} - -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status .name { - margin-left: 0.4em; -} - -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.modified .status { background-color: #007ACC; } -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.added .status { background-color: #2d883e; } -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.deleted .status { background-color: #B9131A; } -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.renamed .status { background-color: #4668C5; } -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.copied .status { background-color: #682079; } -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.untracked .status { background-color: #6C6C6C; } -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.ignored .status { background-color: #969696; } -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.conflict .status { background-color: #9B4F96; } -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row.selected .file-status .status { background-color: #ffffff; color: #666; } - -.vs-dark .git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.modified .status { background-color: #1B80B2; } -.vs-dark .git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.added .status { background-color: #3c8746; } -.vs-dark .git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.deleted .status { background-color: #9E121D; } -.vs-dark .git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.copied .status { background-color: #692C77; } -.vs-dark .git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.conflict .status { background-color: #7F4E7E; } -.vs-dark .git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row.selected .file-status .status { background-color: #ffffff; color: #666; } - -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.deleted .name, -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.both-deleted .name, -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.deleted-by-them .name, -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.deleted-by-us .name { - text-decoration: line-through; -} - -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status:not(.renamed) > .rename { - display: none; -} - -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status .rename-name:not(:empty), -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status .rename-arrow { - margin-left: 0.4em; -} - -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status .rename-folder:not(:empty), -.git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status .folder:not(:empty) { - opacity: 0.7; - font-size: 0.9em; - margin-left: 0.8em; -} - -/* High Contrast Theming */ -.hc-black .git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .content { - line-height: 20px; -} - -.hc-black .git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status .status { - top: 2px; -} - -.hc-black .git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.modified .status, -.hc-black .git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.added .status, -.hc-black .git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.deleted .status, -.hc-black .git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.renamed .status, -.hc-black .git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.copied .status, -.hc-black .git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.untracked .status, -.hc-black .git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.ignored .status, -.hc-black .git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row .file-status.conflict .status, -.hc-black .git-viewlet > .changes-view > .status-view > .monaco-tree .monaco-tree-row.selected .file-status .status { - background-color: #000; - color: #fff; - border: 1px solid #6FC3DF; -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/views/changes/changesView.ts b/src/vs/workbench/parts/git/browser/views/changes/changesView.ts deleted file mode 100644 index 6f92d464832..00000000000 --- a/src/vs/workbench/parts/git/browser/views/changes/changesView.ts +++ /dev/null @@ -1,496 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import 'vs/css!./changesView'; -import nls = require('vs/nls'); -import Platform = require('vs/base/common/platform'); -import Lifecycle = require('vs/base/common/lifecycle'); -import EventEmitter = require('vs/base/common/eventEmitter'); -import Strings = require('vs/base/common/strings'); -import Errors = require('vs/base/common/errors'); -import * as paths from 'vs/base/common/paths'; -import WinJS = require('vs/base/common/winjs.base'); -import Builder = require('vs/base/browser/builder'); -import { StandardKeyboardEvent, IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import Actions = require('vs/base/common/actions'); -import ActionBar = require('vs/base/browser/ui/actionbar/actionbar'); -import Tree = require('vs/base/parts/tree/browser/tree'); -import TreeImpl = require('vs/base/parts/tree/browser/treeImpl'); -import git = require('vs/workbench/parts/git/common/git'); -import GitView = require('vs/workbench/parts/git/browser/views/view'); -import GitActions = require('vs/workbench/parts/git/browser/gitActions'); -import GitModel = require('vs/workbench/parts/git/common/gitModel'); -import Viewer = require('vs/workbench/parts/git/browser/views/changes/changesViewer'); -import GitEditorInputs = require('vs/workbench/parts/git/browser/gitEditorInputs'); -import { IOutputService } from 'vs/workbench/parts/output/common/output'; -import WorkbenchEditorCommon = require('vs/workbench/common/editor'); -import InputBox = require('vs/base/browser/ui/inputbox/inputBox'); -import Severity from 'vs/base/common/severity'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; -import { IEditorInput } from 'vs/platform/editor/common/editor'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IMessageService } from 'vs/platform/message/common/message'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { isEqualOrParent } from 'vs/platform/files/common/files'; -import { attachInputBoxStyler, attachListStyler } from 'vs/platform/theme/common/styler'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; - -import IGitService = git.IGitService; - -var $ = Builder.$; - -export class ChangesView extends EventEmitter.EventEmitter implements GitView.IView, GitActions.ICommitState { - - public ID = 'changes'; - - private static COMMIT_KEYBINDING = Platform.isMacintosh ? 'Cmd+Enter' : 'Ctrl+Enter'; - private static NEED_MESSAGE = nls.localize('needMessage', "Please provide a commit message. You can always press **{0}** to commit changes. If there are any staged changes, only those will be committed; otherwise, all changes will.", ChangesView.COMMIT_KEYBINDING); - private static NOTHING_TO_COMMIT = nls.localize('nothingToCommit', "Once there are some changes to commit, type in the commit message and either press **{0}** to commit changes. If there are any staged changes, only those will be committed; otherwise, all changes will.", ChangesView.COMMIT_KEYBINDING); - private static LONG_COMMIT = nls.localize('longCommit', "It is recommended to keep the commit's first line under 50 characters. Feel free to use more lines for extra information."); - - private instantiationService: IInstantiationService; - private editorService: IWorkbenchEditorService; - private messageService: IMessageService; - private contextViewService: IContextViewService; - private contextService: IWorkspaceContextService; - private gitService: IGitService; - private outputService: IOutputService; - - private $el: Builder.Builder; - private $commitView: Builder.Builder; - private $statusView: Builder.Builder; - private commitInputBox: InputBox.InputBox; - private tree: Tree.ITree; - - private visible: boolean; - private currentDimension: Builder.Dimension; - - private smartCommitAction: GitActions.SmartCommitAction; - private actions: Actions.IAction[]; - private secondaryActions: Actions.IAction[]; - private actionRunner: Actions.IActionRunner; - - private toDispose: Lifecycle.IDisposable[]; - - constructor(actionRunner: Actions.IActionRunner, - @IInstantiationService instantiationService: IInstantiationService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService, - @IEditorGroupService editorGroupService: IEditorGroupService, - @IMessageService messageService: IMessageService, - @IContextViewService contextViewService: IContextViewService, - @IWorkspaceContextService contextService: IWorkspaceContextService, - @IGitService gitService: IGitService, - @IOutputService outputService: IOutputService, - @IConfigurationService private configurationService: IConfigurationService, - @IThemeService private themeService: IThemeService - ) { - super(); - - this.instantiationService = instantiationService; - this.editorService = editorService; - this.messageService = messageService; - this.contextViewService = contextViewService; - this.contextService = contextService; - this.gitService = gitService; - this.outputService = outputService; - - this.visible = false; - this.currentDimension = null; - this.actionRunner = actionRunner; - - this.toDispose = [ - this.smartCommitAction = this.instantiationService.createInstance(GitActions.SmartCommitAction, this), - editorGroupService.onEditorsChanged(() => this.onEditorsChanged(this.editorService.getActiveEditorInput()).done(null, Errors.onUnexpectedError)), - this.gitService.addListener(git.ServiceEvents.OPERATION_START, (e) => this.onGitOperationStart(e)), - this.gitService.addListener(git.ServiceEvents.OPERATION_END, (e) => this.onGitOperationEnd(e)), - this.gitService.getModel().addListener(git.ModelEvents.MODEL_UPDATED, this.onGitModelUpdate.bind(this)) - ]; - } - - // IView - - public get element(): HTMLElement { - this.render(); - return this.$el.getHTMLElement(); - } - - private render(): void { - if (this.$el) { - return; - } - - this.$el = $('.changes-view'); - this.$commitView = $('.commit-view').appendTo(this.$el); - - // Commit view - - this.commitInputBox = new InputBox.InputBox(this.$commitView.getHTMLElement(), this.contextViewService, { - placeholder: nls.localize('commitMessage', "Message (press {0} to commit)", ChangesView.COMMIT_KEYBINDING), - validationOptions: { - showMessage: true, - validation: (value): InputBox.IMessage => { - const config = this.configurationService.getConfiguration('git'); - - if (!config.enableLongCommitWarning) { - return null; - } - - if (/^[^\n]{51}/.test(value)) { - return { - content: ChangesView.LONG_COMMIT, - type: InputBox.MessageType.WARNING - }; - } - - return null; - } - }, - ariaLabel: nls.localize('commitMessageAriaLabel', "Git: Type commit message and press {0} to commit", ChangesView.COMMIT_KEYBINDING), - flexibleHeight: true - }); - this.toDispose.push(attachInputBoxStyler(this.commitInputBox, this.themeService)); - - this.commitInputBox.onDidChange((value) => this.emit('change', value)); - this.commitInputBox.onDidHeightChange((value) => this.emit('heightchange', value)); - - $(this.commitInputBox.inputElement).on('keydown', (e: KeyboardEvent) => { - var keyboardEvent = new StandardKeyboardEvent(e); - - if (keyboardEvent.equals(KeyMod.CtrlCmd | KeyCode.Enter) || keyboardEvent.equals(KeyMod.CtrlCmd | KeyCode.KEY_S)) { - if (this.smartCommitAction.enabled) { - this.actionRunner.run(this.smartCommitAction).done(); - } else { - this.commitInputBox.showMessage({ content: ChangesView.NOTHING_TO_COMMIT, formatContent: true, type: InputBox.MessageType.INFO }); - } - } - }).on('blur', () => { - this.commitInputBox.hideMessage(); - }); - - // Status view - - this.$statusView = $('.status-view').appendTo(this.$el); - - var actionProvider = this.instantiationService.createInstance(Viewer.ActionProvider); - var renderer = this.instantiationService.createInstance(Viewer.Renderer, actionProvider, this.actionRunner); - var dnd = this.instantiationService.createInstance(Viewer.DragAndDrop); - var controller = this.instantiationService.createInstance(Viewer.Controller, actionProvider); - - this.tree = new TreeImpl.Tree(this.$statusView.getHTMLElement(), { - dataSource: new Viewer.DataSource(), - renderer: renderer, - filter: new Viewer.Filter(), - sorter: new Viewer.Sorter(), - accessibilityProvider: new Viewer.AccessibilityProvider(), - dnd: dnd, - controller: controller - }, { - indentPixels: 0, - twistiePixels: 20, - ariaLabel: nls.localize('treeAriaLabel', "Git Changes View") - }); - - this.toDispose.push(attachListStyler(this.tree, this.themeService)); - this.tree.setInput(this.gitService.getModel().getStatus()); - this.tree.expandAll(this.gitService.getModel().getStatus().getGroups()); - - this.toDispose.push(this.tree.addListener('selection', (e) => this.onSelection(e))); - this.toDispose.push(this.commitInputBox.onDidHeightChange(() => this.layout())); - } - - public focus(): void { - var selection = this.tree.getSelection(); - if (selection.length > 0) { - this.tree.reveal(selection[0], 0.5).done(null, Errors.onUnexpectedError); - } - - this.commitInputBox.focus(); - } - - public layout(dimension: Builder.Dimension = this.currentDimension): void { - if (!dimension) { - return; - } - - this.currentDimension = dimension; - - this.commitInputBox.layout(); - var statusViewHeight = dimension.height - (this.commitInputBox.height + 12 /* margin */); - this.$statusView.size(dimension.width, statusViewHeight); - this.tree.layout(statusViewHeight); - - if (this.commitInputBox.height === 134) { - this.$commitView.addClass('scroll'); - } else { - this.$commitView.removeClass('scroll'); - } - } - - public setVisible(visible: boolean): WinJS.TPromise { - this.visible = visible; - - if (visible) { - this.tree.onVisible(); - this.updateCommitInputTemplate(); - return this.onEditorsChanged(this.editorService.getActiveEditorInput()); - } else { - this.tree.onHidden(); - return WinJS.TPromise.as(null); - } - } - - private onUndoLastCommit(commit: git.ICommit): void { - if (this.commitInputBox.value) { - return; - } - - this.commitInputBox.value = commit.message; - } - - private updateCommitInputTemplate(): void { - if (this.commitInputBox.value) { - return; - } - - this.gitService.getCommitTemplate() - .then(template => template && (this.commitInputBox.value = template)) - .done(null, Errors.onUnexpectedError); - } - - public getControl(): Tree.ITree { - return this.tree; - } - - public getActions(): Actions.IAction[] { - if (!this.actions) { - this.actions = [ - this.smartCommitAction, - this.instantiationService.createInstance(GitActions.RefreshAction) - ]; - - this.actions.forEach(a => this.toDispose.push(a)); - } - - return this.actions; - } - - public getSecondaryActions(): Actions.IAction[] { - if (!this.secondaryActions) { - this.secondaryActions = [ - this.instantiationService.createInstance(GitActions.SyncAction, GitActions.SyncAction.ID, GitActions.SyncAction.LABEL), - this.instantiationService.createInstance(GitActions.PullAction, GitActions.PullAction.ID, GitActions.PullAction.LABEL), - this.instantiationService.createInstance(GitActions.PullWithRebaseAction, GitActions.PullWithRebaseAction.ID, GitActions.PullWithRebaseAction.LABEL), - this.instantiationService.createInstance(GitActions.PushAction, GitActions.PushAction.ID, GitActions.PushAction.LABEL), - this.instantiationService.createInstance(GitActions.PushToRemoteAction, GitActions.PushToRemoteAction.ID, GitActions.PushToRemoteAction.LABEL), - new ActionBar.Separator(), - this.instantiationService.createInstance(GitActions.PublishAction, GitActions.PublishAction.ID, GitActions.PublishAction.LABEL), - new ActionBar.Separator(), - this.instantiationService.createInstance(GitActions.CommitAction, this), - this.instantiationService.createInstance(GitActions.CommitSignedOffAction, this), - this.instantiationService.createInstance(GitActions.CommitAmendAction, this), - this.instantiationService.createInstance(GitActions.StageAndCommitAction, this, GitActions.StageAndCommitAction.ID, GitActions.StageAndCommitAction.LABEL, GitActions.StageAndCommitAction.CSSCLASS), - this.instantiationService.createInstance(GitActions.StageAndCommitSignedOffAction, this), - this.instantiationService.createInstance(GitActions.UndoLastCommitAction, GitActions.UndoLastCommitAction.ID, GitActions.UndoLastCommitAction.LABEL), - new ActionBar.Separator(), - this.instantiationService.createInstance(GitActions.GlobalUnstageAction), - this.instantiationService.createInstance(GitActions.GlobalUndoAction), - new ActionBar.Separator(), - new Actions.Action('show.gitOutput', nls.localize('showOutput', "Show Git Output"), null, true, () => this.outputService.getChannel('Git').show()) - ]; - - this.secondaryActions.forEach(a => this.toDispose.push(a)); - } - - return this.secondaryActions; - } - - // ICommitState - - public getCommitMessage(): string { - return Strings.trim(this.commitInputBox.value); - } - - public onEmptyCommitMessage(): void { - this.commitInputBox.focus(); - this.commitInputBox.showMessage({ content: ChangesView.NEED_MESSAGE, formatContent: true, type: InputBox.MessageType.INFO }); - } - - // Events - - private onGitModelUpdate(): void { - if (this.tree) { - this.tree.refresh().done(() => { - return this.tree.expandAll(this.gitService.getModel().getStatus().getGroups()); - }); - } - } - - private onEditorsChanged(input: IEditorInput): WinJS.TPromise { - if (!this.tree) { - return WinJS.TPromise.as(null); - } - - var status = this.getStatusFromInput(input); - - if (!status) { - this.tree.clearSelection(); - } - - if (this.visible && this.tree.getSelection().indexOf(status) === -1) { - return this.tree.reveal(status, 0.5).then(() => { - this.tree.setSelection([status], { origin: 'implicit' }); - }); - } - - return WinJS.TPromise.as(null); - } - - private onSelection(e: Tree.ISelectionEvent): void { - if (e.payload && e.payload && e.payload.origin === 'implicit') { - return; - } - - if (e.selection.length !== 1) { - return; - } - - var element = e.selection[0]; - - if (!(element instanceof GitModel.FileStatus)) { - return; - } - - if (e.payload && e.payload.origin === 'keyboard' && !(e.payload.originalEvent).equals(KeyCode.Enter)) { - return; - } - - var isMouseOrigin = e.payload && (e.payload.origin === 'mouse'); - - if (isMouseOrigin && (e.payload.originalEvent.metaKey || e.payload.originalEvent.shiftKey)) { - return; - } - - var isDoubleClick = isMouseOrigin && e.payload.originalEvent && e.payload.originalEvent.detail === 2; - - var status = element; - - this.gitService.getInput(status).done((input) => { - var options = new WorkbenchEditorCommon.TextDiffEditorOptions(); - - if (isMouseOrigin) { - options.preserveFocus = true; - - var originalEvent: MouseEvent = e && e.payload && e.payload.origin === 'mouse' && e.payload.originalEvent; - if (originalEvent && originalEvent.detail === 2) { - options.preserveFocus = false; - originalEvent.preventDefault(); // focus moves to editor, we need to prevent default - } - } - - options.forceOpen = true; - options.pinned = isDoubleClick; - - var sideBySide = (e && e.payload && e.payload.originalEvent && e.payload.originalEvent.altKey); - - return this.editorService.openEditor(input, options, sideBySide); - }, (e) => { - if (e.gitErrorCode === git.GitErrorCodes.CantOpenResource) { - this.messageService.show(Severity.Warning, e); - return; - } - - this.messageService.show(Severity.Error, e); - }); - } - - private onGitOperationStart(operation: git.IGitOperation): void { - if (operation.id === git.ServiceOperations.COMMIT) { - if (this.commitInputBox) { - this.commitInputBox.disable(); - } - } else if (operation.id === git.ServiceOperations.RESET) { - const promise = this.gitService.getCommit('HEAD'); - const listener = this.gitService.addListener(git.ServiceEvents.OPERATION_END, e => { - if (e.operation.id === git.ServiceOperations.RESET && !e.error) { - promise.done(c => this.onUndoLastCommit(c)); - listener.dispose(); - } - }); - } - } - - private onGitOperationEnd(e: { operation: git.IGitOperation; error: any; }): void { - if (e.operation.id === git.ServiceOperations.COMMIT) { - if (this.commitInputBox) { - this.commitInputBox.enable(); - - if (!e.error) { - this.commitInputBox.value = ''; - this.updateCommitInputTemplate(); - } - } - } - } - - // Misc - - private getStatusFromInput(input: IEditorInput): git.IFileStatus { - if (!input) { - return null; - } - - if (input instanceof GitEditorInputs.GitDiffEditorInput) { - return (input).getFileStatus(); - } - - if (input instanceof GitEditorInputs.NativeGitIndexStringEditorInput) { - return (input).getFileStatus() || null; - } - - const resource = WorkbenchEditorCommon.toResource(input, { filter: 'file' }); - if (resource) { - const workspaceRoot = this.contextService.getWorkspace().resource.fsPath; - if (!workspaceRoot || !isEqualOrParent(resource.fsPath, workspaceRoot, !Platform.isLinux /* ignorecase */)) { - return null; // out of workspace not yet supported - } - - const repositoryRoot = this.gitService.getModel().getRepositoryRoot(); - if (!repositoryRoot || !isEqualOrParent(resource.fsPath, repositoryRoot, !Platform.isLinux /* ignorecase */)) { - return null; // out of repository not supported - } - - const repositoryRelativePath = paths.normalize(paths.relative(repositoryRoot, resource.fsPath)); - - var status = this.gitService.getModel().getStatus().getWorkingTreeStatus().find(repositoryRelativePath); - if (status && (status.getStatus() === git.Status.UNTRACKED || status.getStatus() === git.Status.IGNORED)) { - return status; - } - - status = this.gitService.getModel().getStatus().getMergeStatus().find(repositoryRelativePath); - if (status) { - return status; - } - } - - return null; - } - - public dispose(): void { - if (this.$el) { - this.$el.dispose(); - this.$el = null; - } - - this.toDispose = Lifecycle.dispose(this.toDispose); - - super.dispose(); - } -} diff --git a/src/vs/workbench/parts/git/browser/views/changes/changesViewer.ts b/src/vs/workbench/parts/git/browser/views/changes/changesViewer.ts deleted file mode 100644 index 4dd5130e987..00000000000 --- a/src/vs/workbench/parts/git/browser/views/changes/changesViewer.ts +++ /dev/null @@ -1,921 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import winjs = require('vs/base/common/winjs.base'); -import nls = require('vs/nls'); -import platform = require('vs/base/common/platform'); -import paths = require('vs/base/common/paths'); -import severity from 'vs/base/common/severity'; -import lifecycle = require('vs/base/common/lifecycle'); -import dom = require('vs/base/browser/dom'); -import keyboard = require('vs/base/browser/keyboardEvent'); -import mouse = require('vs/base/browser/mouseEvent'); -import comparers = require('vs/base/common/comparers'); -import actions = require('vs/base/common/actions'); -import actionbar = require('vs/base/browser/ui/actionbar/actionbar'); -import countbadge = require('vs/base/browser/ui/countBadge/countBadge'); -import tree = require('vs/base/parts/tree/browser/tree'); -import treednd = require('vs/base/parts/tree/browser/treeDnd'); -import treedefaults = require('vs/base/parts/tree/browser/treeDefaults'); -import * as git from 'vs/workbench/parts/git/common/git'; -import gitmodel = require('vs/workbench/parts/git/common/gitModel'); -import gitactions = require('vs/workbench/parts/git/browser/gitActions'); -import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IMessageService } from 'vs/platform/message/common/message'; -import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import URI from 'vs/base/common/uri'; - -import IGitService = git.IGitService; - -function toReadablePath(path: string): string { - if (!platform.isWindows) { - return path; - } - - return path.replace(/\//g, '\\'); -} - -const $ = dom.$; - -export class ActionContainer implements lifecycle.IDisposable { - - private cache: { [actionId: string]: actions.IAction; }; - private instantiationService: IInstantiationService; - - constructor(instantiationService: IInstantiationService) { - this.cache = {}; - this.instantiationService = instantiationService; - } - - protected getAction(ctor: any, ...args: any[]): any { - var action = this.cache[ctor.ID]; - - if (!action) { - args.unshift(ctor); - action = this.cache[ctor.ID] = this.instantiationService.createInstance.apply(this.instantiationService, args); - } - - return action; - } - - public dispose(): void { - Object.keys(this.cache).forEach(k => { - this.cache[k].dispose(); - }); - - this.cache = null; - } -} - -export class DataSource implements tree.IDataSource { - - public getId(tree: tree.ITree, element: any): string { - if (element instanceof gitmodel.StatusModel) { - return 'root'; - } else if (element instanceof gitmodel.StatusGroup) { - var statusGroup = element; - - switch (statusGroup.getType()) { - case git.StatusType.INDEX: return 'index'; - case git.StatusType.WORKING_TREE: return 'workingTree'; - case git.StatusType.MERGE: return 'merge'; - default: throw new Error('Invalid group type'); - } - } - - var status = element; - return status.getId(); - } - - public hasChildren(tree: tree.ITree, element: any): boolean { - if (element instanceof gitmodel.StatusModel) { - return true; - } else if (element instanceof gitmodel.StatusGroup) { - var statusGroup = element; - return statusGroup.all().length > 0; - } - return false; - } - - public getChildren(tree: tree.ITree, element: any): winjs.Promise { - if (element instanceof gitmodel.StatusModel) { - var model = element; - return winjs.TPromise.as(model.getGroups()); - - } else if (element instanceof gitmodel.StatusGroup) { - var statusGroup = element; - return winjs.TPromise.as(statusGroup.all()); - } - - return winjs.TPromise.as([]); - } - - public getParent(tree: tree.ITree, element: any): winjs.Promise { - return winjs.TPromise.as(null); - } -} - -export class ActionProvider extends ActionContainer implements tree.IActionProvider { - - private gitService: git.IGitService; - - constructor( @IInstantiationService instantiationService: IInstantiationService, @IGitService gitService: IGitService) { - super(instantiationService); - this.gitService = gitService; - } - - public hasActions(tree: tree.ITree, element: any): boolean { - if (element instanceof gitmodel.FileStatus) { - return true; - } else if (element instanceof gitmodel.StatusGroup && (element).all().length > 0) { - return true; - } - return false; - } - - public getActions(tree: tree.ITree, element: any): winjs.TPromise { - if (element instanceof gitmodel.StatusGroup) { - return winjs.TPromise.as(this.getActionsForGroupStatusType(element.getType())); - } else { - return winjs.TPromise.as(this.getActionsForFileStatusType(element.getType())); - } - } - - public getActionsForFileStatusType(statusType: git.StatusType): actions.IAction[] { - switch (statusType) { - case git.StatusType.INDEX: - return [this.getAction(gitactions.UnstageAction)]; - case git.StatusType.WORKING_TREE: - return [this.getAction(gitactions.UndoAction), this.getAction(gitactions.StageAction)]; - case git.StatusType.MERGE: - return [this.getAction(gitactions.StageAction)]; - default: - return []; - } - } - - public getActionsForGroupStatusType(statusType: git.StatusType): actions.IAction[] { - switch (statusType) { - case git.StatusType.INDEX: - return [this.getAction(gitactions.GlobalUnstageAction)]; - case git.StatusType.WORKING_TREE: - return [this.getAction(gitactions.GlobalUndoAction), this.getAction(gitactions.GlobalStageAction)]; - case git.StatusType.MERGE: - return [this.getAction(gitactions.StageAction)]; - default: - return []; - } - } - - public hasSecondaryActions(tree: tree.ITree, element: any): boolean { - return this.hasActions(tree, element); - } - - public getSecondaryActions(tree: tree.ITree, element: any): winjs.TPromise { - return this.getActions(tree, element).then((actions: actions.IAction[]) => { - - if (element instanceof gitmodel.FileStatus) { - var fileStatus = element; - var status = fileStatus.getStatus(); - - actions.push(new actionbar.Separator()); - - if (status !== git.Status.DELETED && status !== git.Status.INDEX_DELETED) { - actions.push(this.getAction(gitactions.OpenFileAction)); - } - - actions.push(this.getAction(gitactions.OpenChangeAction)); - } - - actions.reverse(); - return actions; - }); - } - - public getActionItem(tree: tree.ITree, element: any, action: actions.IAction): actionbar.IActionItem { - return null; - } -} - -interface IFileStatusTemplateData { - root: HTMLElement; - status: HTMLElement; - name: HTMLElement; - folder: HTMLElement; - renameName: HTMLElement; - renameFolder: HTMLElement; - actionBar: actionbar.ActionBar; -} - -interface IStatusGroupTemplateData { - root: HTMLElement; - count: countbadge.CountBadge; - actionBar: actionbar.ActionBar; -} - -const STAGED_CHANGES = nls.localize('stagedChanges', "Staged Changes"); -const CHANGES = nls.localize('allChanges', "Changes"); -const MERGE_CHANGES = nls.localize('mergeChanges', "Merge Changes"); - -export class Renderer implements tree.IRenderer { - - constructor( - private actionProvider: ActionProvider, - private actionRunner: actions.IActionRunner, - @IMessageService private messageService: IMessageService, - @IGitService private gitService: IGitService, - @IWorkspaceContextService private contextService: IWorkspaceContextService - ) { - // noop - } - - public getHeight(tree: tree.ITree, element: any): number { - return 22; - } - - public getTemplateId(tree: tree.ITree, element: any): string { - if (element instanceof gitmodel.StatusGroup) { - switch (element.getType()) { - case git.StatusType.INDEX: return 'index'; - case git.StatusType.WORKING_TREE: return 'workingTree'; - case git.StatusType.MERGE: return 'merge'; - } - } - - if (element instanceof gitmodel.FileStatus) { - switch (element.getType()) { - case git.StatusType.INDEX: return 'file:index'; - case git.StatusType.WORKING_TREE: return 'file:workingTree'; - case git.StatusType.MERGE: return 'file:merge'; - } - } - - return null; - } - - public renderTemplate(tree: tree.ITree, templateId: string, container: HTMLElement): any { - if (/^file:/.test(templateId)) { - return this.renderFileStatusTemplate(Renderer.templateIdToStatusType(templateId), container); - } else { - return this.renderStatusGroupTemplate(Renderer.templateIdToStatusType(templateId), container); - } - } - - private renderStatusGroupTemplate(statusType: git.StatusType, container: HTMLElement): IStatusGroupTemplateData { - var data: IStatusGroupTemplateData = Object.create(null); - - data.root = dom.append(container, $('.status-group')); - - switch (statusType) { - case git.StatusType.INDEX: data.root.textContent = STAGED_CHANGES; break; - case git.StatusType.WORKING_TREE: data.root.textContent = CHANGES; break; - case git.StatusType.MERGE: data.root.textContent = MERGE_CHANGES; break; - } - - const wrapper = dom.append(container, $('.count-badge-wrapper')); - data.count = new countbadge.CountBadge(wrapper); - - data.actionBar = new actionbar.ActionBar(container, { actionRunner: this.actionRunner }); - data.actionBar.push(this.actionProvider.getActionsForGroupStatusType(statusType), { icon: true, label: false }); - data.actionBar.addListener('run', e => e.error && this.onError(e.error)); - - return data; - } - - private renderFileStatusTemplate(statusType: git.StatusType, container: HTMLElement): IFileStatusTemplateData { - var data: IFileStatusTemplateData = Object.create(null); - - data.root = dom.append(container, $('.file-status')); - data.status = dom.append(data.root, $('span.status')); - data.name = dom.append(data.root, $('a.name.plain')); - data.folder = dom.append(data.root, $('span.folder')); - - var rename = dom.append(data.root, $('span.rename')); - var arrow = dom.append(rename, $('span.rename-arrow')); - arrow.textContent = '←'; - - data.renameName = dom.append(rename, $('span.rename-name')); - data.renameFolder = dom.append(rename, $('span.rename-folder')); - - data.actionBar = new actionbar.ActionBar(container, { actionRunner: this.actionRunner }); - data.actionBar.push(this.actionProvider.getActionsForFileStatusType(statusType), { icon: true, label: false }); - data.actionBar.addListener('run', e => e.error && this.onError(e.error)); - - return data; - } - - public renderElement(tree: tree.ITree, element: any, templateId: string, templateData: any): void { - if (/^file:/.test(templateId)) { - this.renderFileStatus(tree, element, templateData); - } else { - Renderer.renderStatusGroup(element, templateData); - } - } - - private static renderStatusGroup(statusGroup: git.IStatusGroup, data: IStatusGroupTemplateData): void { - data.actionBar.context = statusGroup; - data.count.setCount(statusGroup.all().length); - } - - private renderFileStatus(tree: tree.ITree, fileStatus: git.IFileStatus, data: IFileStatusTemplateData): void { - data.actionBar.context = { - tree: tree, - fileStatus: fileStatus - }; - - const repositoryRoot = this.gitService.getModel().getRepositoryRoot(); - - const status = fileStatus.getStatus(); - const renamePath = fileStatus.getRename(); - const path = fileStatus.getPath(); - const lastSlashIndex = path.lastIndexOf('/'); - const name = lastSlashIndex === -1 ? path : path.substr(lastSlashIndex + 1, path.length); - const folder = (lastSlashIndex === -1 ? '' : path.substr(0, lastSlashIndex)); - - data.root.className = 'file-status ' + Renderer.statusToClass(status); - data.status.textContent = Renderer.statusToChar(status); - data.status.title = Renderer.statusToTitle(status); - - const resource = URI.file(paths.normalize(paths.join(repositoryRoot, path))); - let isInWorkspace = this.contextService.isInsideWorkspace(resource); - - let rename = ''; - let renameFolder = ''; - - if (renamePath) { - const renameLastSlashIndex = renamePath.lastIndexOf('/'); - rename = renameLastSlashIndex === -1 ? renamePath : renamePath.substr(renameLastSlashIndex + 1, renamePath.length); - renameFolder = (renameLastSlashIndex === -1 ? '' : renamePath.substr(0, renameLastSlashIndex)); - - data.renameName.textContent = name; - data.renameFolder.textContent = folder; - - const resource = URI.file(paths.normalize(paths.join(repositoryRoot, renamePath))); - isInWorkspace = this.contextService.isInsideWorkspace(resource); - } - - if (isInWorkspace) { - data.root.title = ''; - } else { - data.root.title = nls.localize('outsideOfWorkspace', "This file is located outside the current workspace."); - data.root.className += ' out-of-workspace'; - } - - data.name.textContent = rename || name; - data.name.title = renamePath || path; - data.folder.textContent = toReadablePath(renameFolder || folder); - } - - public disposeTemplate(tree: tree.ITree, templateId: string, templateData: any): void { - if (/^file:/.test(templateId)) { - Renderer.disposeFileStatusTemplate(templateData); - } - } - - private static disposeFileStatusTemplate(templateData: IFileStatusTemplateData): void { - templateData.actionBar.dispose(); - } - - private static statusToChar(status: git.Status): string { - switch (status) { - case git.Status.INDEX_MODIFIED: return nls.localize('modified-char', "M"); - case git.Status.MODIFIED: return nls.localize('modified-char', "M"); - case git.Status.INDEX_ADDED: return nls.localize('added-char', "A"); - case git.Status.INDEX_DELETED: return nls.localize('deleted-char', "D"); - case git.Status.DELETED: return nls.localize('deleted-char', "D"); - case git.Status.INDEX_RENAMED: return nls.localize('renamed-char', "R"); - case git.Status.INDEX_COPIED: return nls.localize('copied-char', "C"); - case git.Status.UNTRACKED: return nls.localize('untracked-char', "U"); - case git.Status.IGNORED: return nls.localize('ignored-char', "!"); - case git.Status.BOTH_DELETED: return nls.localize('deleted-char', "D"); - case git.Status.ADDED_BY_US: return nls.localize('added-char', "A"); - case git.Status.DELETED_BY_THEM: return nls.localize('deleted-char', "D"); - case git.Status.ADDED_BY_THEM: return nls.localize('added-char', "A"); - case git.Status.DELETED_BY_US: return nls.localize('deleted-char', "D"); - case git.Status.BOTH_ADDED: return nls.localize('added-char', "A"); - case git.Status.BOTH_MODIFIED: return nls.localize('modified-char', "M"); - default: return ''; - } - } - - public static statusToTitle(status: git.Status): string { - switch (status) { - case git.Status.INDEX_MODIFIED: return nls.localize('title-index-modified', "Modified in index"); - case git.Status.MODIFIED: return nls.localize('title-modified', "Modified"); - case git.Status.INDEX_ADDED: return nls.localize('title-index-added', "Added to index"); - case git.Status.INDEX_DELETED: return nls.localize('title-index-deleted', "Deleted in index"); - case git.Status.DELETED: return nls.localize('title-deleted', "Deleted"); - case git.Status.INDEX_RENAMED: return nls.localize('title-index-renamed', "Renamed in index"); - case git.Status.INDEX_COPIED: return nls.localize('title-index-copied', "Copied in index"); - case git.Status.UNTRACKED: return nls.localize('title-untracked', "Untracked"); - case git.Status.IGNORED: return nls.localize('title-ignored', "Ignored"); - case git.Status.BOTH_DELETED: return nls.localize('title-conflict-both-deleted', "Conflict: both deleted"); - case git.Status.ADDED_BY_US: return nls.localize('title-conflict-added-by-us', "Conflict: added by us"); - case git.Status.DELETED_BY_THEM: return nls.localize('title-conflict-deleted-by-them', "Conflict: deleted by them"); - case git.Status.ADDED_BY_THEM: return nls.localize('title-conflict-added-by-them', "Conflict: added by them"); - case git.Status.DELETED_BY_US: return nls.localize('title-conflict-deleted-by-us', "Conflict: deleted by us"); - case git.Status.BOTH_ADDED: return nls.localize('title-conflict-both-added', "Conflict: both added"); - case git.Status.BOTH_MODIFIED: return nls.localize('title-conflict-both-modified', "Conflict: both modified"); - default: return ''; - } - } - - private static statusToClass(status: git.Status): string { - switch (status) { - case git.Status.INDEX_MODIFIED: return 'modified'; - case git.Status.MODIFIED: return 'modified'; - case git.Status.INDEX_ADDED: return 'added'; - case git.Status.INDEX_DELETED: return 'deleted'; - case git.Status.DELETED: return 'deleted'; - case git.Status.INDEX_RENAMED: return 'renamed'; - case git.Status.INDEX_COPIED: return 'copied'; - case git.Status.UNTRACKED: return 'untracked'; - case git.Status.IGNORED: return 'ignored'; - case git.Status.BOTH_DELETED: return 'conflict both-deleted'; - case git.Status.ADDED_BY_US: return 'conflict added-by-us'; - case git.Status.DELETED_BY_THEM: return 'conflict deleted-by-them'; - case git.Status.ADDED_BY_THEM: return 'conflict added-by-them'; - case git.Status.DELETED_BY_US: return 'conflict deleted-by-us'; - case git.Status.BOTH_ADDED: return 'conflict both-added'; - case git.Status.BOTH_MODIFIED: return 'conflict both-modified'; - default: return ''; - } - } - - private static templateIdToStatusType(templateId: string): git.StatusType { - if (/index$/.test(templateId)) { - return git.StatusType.INDEX; - } else if (/workingTree$/.test(templateId)) { - return git.StatusType.WORKING_TREE; - } else { - return git.StatusType.MERGE; - } - } - - private onError(error: any): void { - this.messageService.show(severity.Error, error); - } -} - -export class Filter implements tree.IFilter { - - public isVisible(tree: tree.ITree, element: any): boolean { - if (element instanceof gitmodel.StatusGroup) { - var statusGroup = element; - - switch (statusGroup.getType()) { - case git.StatusType.INDEX: - case git.StatusType.MERGE: - return statusGroup.all().length > 0; - case git.StatusType.WORKING_TREE: - return true; - } - } - - return true; - } -} - -export class Sorter implements tree.ISorter { - - public compare(tree: tree.ITree, element: any, otherElement: any): number { - if (!(element instanceof gitmodel.FileStatus && otherElement instanceof gitmodel.FileStatus)) { - return 0; - } - - return Sorter.compareStatus(element, otherElement); - } - - private static compareStatus(element: git.IFileStatus, otherElement: git.IFileStatus): number { - var one = element.getPathComponents(); - var other = otherElement.getPathComponents(); - var lastOne = one.length - 1; - var lastOther = other.length - 1; - - var endOne: boolean, endOther: boolean, onePart: string, otherPart: string; - - for (var i = 0; ; i++) { - endOne = lastOne === i; - endOther = lastOther === i; - - if (endOne && endOther) { - return comparers.compareFileNames(one[i], other[i]); - } else if (endOne) { - return -1; - } else if (endOther) { - return 1; - } else if ((onePart = one[i].toLowerCase()) !== (otherPart = other[i].toLowerCase())) { - return onePart < otherPart ? -1 : 1; - } - } - } -} - -export class DragAndDrop extends ActionContainer implements tree.IDragAndDrop { - - private gitService: git.IGitService; - private messageService: IMessageService; - - constructor( @IInstantiationService instantiationService: IInstantiationService, @IGitService gitService: IGitService, @IMessageService messageService: IMessageService) { - super(instantiationService); - this.gitService = gitService; - this.messageService = messageService; - } - - public getDragURI(tree: tree.ITree, element: any): string { - if (element instanceof gitmodel.StatusGroup) { - var statusGroup = element; - return 'git:' + statusGroup.getType(); - } else if (element instanceof gitmodel.FileStatus) { - var status = element; - return 'git:' + status.getType() + ':' + status.getPath(); - } - - return null; - } - - getDragLabel(tree: tree.ITree, elements: any[]): string { - if (elements.length > 1) { - return String(elements.length); - } - - const element = elements[0]; - - if (element instanceof gitmodel.StatusGroup) { - const group = element as gitmodel.StatusGroup; - - switch (group.getType()) { - case git.StatusType.INDEX: return STAGED_CHANGES; - case git.StatusType.WORKING_TREE: return CHANGES; - case git.StatusType.MERGE: return MERGE_CHANGES; - } - } - - const status = element as gitmodel.FileStatus; - return paths.basename(status.getPath()); - } - - public onDragStart(tree: tree.ITree, data: tree.IDragAndDropData, originalEvent: mouse.DragMouseEvent): void { - // no-op - } - - public onDragOver(_tree: tree.ITree, data: tree.IDragAndDropData, targetElement: any, originalEvent: mouse.DragMouseEvent): tree.IDragOverReaction { - if (!this.gitService.isIdle()) { - return tree.DRAG_OVER_REJECT; - } - - if (!(data instanceof treednd.ElementsDragAndDropData)) { - return tree.DRAG_OVER_REJECT; - } - - var elements: any[] = data.getData(); - var element = elements[0]; - - if (element instanceof gitmodel.StatusGroup) { - var statusGroup = element; - return this.onDrag(targetElement, statusGroup.getType()); - - } else if (element instanceof gitmodel.FileStatus) { - var status = element; - return this.onDrag(targetElement, status.getType()); - - } else { - return tree.DRAG_OVER_REJECT; - } - } - - private onDrag(targetElement: any, type: git.StatusType): tree.IDragOverReaction { - if (type === git.StatusType.WORKING_TREE) { - return this.onDragWorkingTree(targetElement); - } else if (type === git.StatusType.INDEX) { - return this.onDragIndex(targetElement); - } else if (type === git.StatusType.MERGE) { - return this.onDragMerge(targetElement); - } else { - return tree.DRAG_OVER_REJECT; - } - } - - private onDragWorkingTree(targetElement: any): tree.IDragOverReaction { - if (targetElement instanceof gitmodel.StatusGroup) { - var targetStatusGroup = targetElement; - return targetStatusGroup.getType() === git.StatusType.INDEX ? tree.DRAG_OVER_ACCEPT_BUBBLE_DOWN(false) : tree.DRAG_OVER_REJECT; - } else if (targetElement instanceof gitmodel.FileStatus) { - var targetStatus = targetElement; - return targetStatus.getType() === git.StatusType.INDEX ? tree.DRAG_OVER_ACCEPT_BUBBLE_UP : tree.DRAG_OVER_REJECT; - } else { - return tree.DRAG_OVER_REJECT; - } - } - - private onDragIndex(targetElement: any): tree.IDragOverReaction { - if (targetElement instanceof gitmodel.StatusGroup) { - var targetStatusGroup = targetElement; - return targetStatusGroup.getType() === git.StatusType.WORKING_TREE ? tree.DRAG_OVER_ACCEPT_BUBBLE_DOWN(false) : tree.DRAG_OVER_REJECT; - } else if (targetElement instanceof gitmodel.FileStatus) { - var targetStatus = targetElement; - return targetStatus.getType() === git.StatusType.WORKING_TREE ? tree.DRAG_OVER_ACCEPT_BUBBLE_UP : tree.DRAG_OVER_REJECT; - } else { - return tree.DRAG_OVER_REJECT; - } - } - - private onDragMerge(targetElement: any): tree.IDragOverReaction { - if (targetElement instanceof gitmodel.StatusGroup) { - var targetStatusGroup = targetElement; - return targetStatusGroup.getType() === git.StatusType.INDEX ? tree.DRAG_OVER_ACCEPT_BUBBLE_DOWN(false) : tree.DRAG_OVER_REJECT; - } else if (targetElement instanceof gitmodel.FileStatus) { - var targetStatus = targetElement; - return targetStatus.getType() === git.StatusType.INDEX ? tree.DRAG_OVER_ACCEPT_BUBBLE_UP : tree.DRAG_OVER_REJECT; - } else { - return tree.DRAG_OVER_REJECT; - } - } - - public drop(tree: tree.ITree, data: tree.IDragAndDropData, targetElement: any, originalEvent: mouse.DragMouseEvent): void { - var elements: any[] = data.getData(); - var element = elements[0]; - var files: git.IFileStatus[]; - - if (element instanceof gitmodel.StatusGroup) { - files = (element).all(); - // } else if (element instanceof gitmodel.FileStatus) { - // files = [ element ]; - } else { - files = elements; - // throw new Error('Invalid drag and drop data.'); - } - - var targetGroup = targetElement; - - // Add files to index - if (targetGroup.getType() === git.StatusType.INDEX) { - this.getAction(gitactions.StageAction).run(files).done(null, (e: Error) => this.onError(e)); - } - - // Remove files from index - if (targetGroup.getType() === git.StatusType.WORKING_TREE) { - this.getAction(gitactions.UnstageAction).run(files).done(null, (e: Error) => this.onError(e)); - } - } - - private onError(error: any): void { - this.messageService.show(severity.Error, error); - } -} - -export class AccessibilityProvider implements tree.IAccessibilityProvider { - - public getAriaLabel(tree: tree.ITree, element: any): string { - if (element instanceof gitmodel.FileStatus) { - const fileStatus = element; - const status = fileStatus.getStatus(); - const path = fileStatus.getPath(); - const lastSlashIndex = path.lastIndexOf('/'); - const name = lastSlashIndex === -1 ? path : path.substr(lastSlashIndex + 1, path.length); - const folder = (lastSlashIndex === -1 ? '' : path.substr(0, lastSlashIndex)); - - return nls.localize('fileStatusAriaLabel', "File {0} in folder {1} has status: {2}, Git", name, folder, Renderer.statusToTitle(status)); - } - - if (element instanceof gitmodel.StatusGroup) { - switch ((element).getType()) { - case git.StatusType.INDEX: return nls.localize('ariaLabelStagedChanges', "Staged Changes, Git"); - case git.StatusType.WORKING_TREE: return nls.localize('ariaLabelChanges', "Changes, Git"); - case git.StatusType.MERGE: return nls.localize('ariaLabelMerge', "Merge, Git"); - } - } - return undefined; - } -} - -export class Controller extends treedefaults.DefaultController { - - private contextMenuService: IContextMenuService; - private actionProvider: tree.IActionProvider; - - constructor(actionProvider: tree.IActionProvider, @IContextMenuService contextMenuService: IContextMenuService) { - super({ clickBehavior: treedefaults.ClickBehavior.ON_MOUSE_UP }); - - this.actionProvider = actionProvider; - this.contextMenuService = contextMenuService; - - this.downKeyBindingDispatcher.set(KeyMod.Shift | KeyCode.UpArrow, this.onUp.bind(this)); - this.downKeyBindingDispatcher.set(KeyMod.Shift | KeyCode.DownArrow, this.onDown.bind(this)); - this.downKeyBindingDispatcher.set(KeyMod.Shift | KeyCode.PageUp, this.onPageUp.bind(this)); - this.downKeyBindingDispatcher.set(KeyMod.Shift | KeyCode.PageDown, this.onPageDown.bind(this)); - } - - protected onLeftClick(tree: tree.ITree, element: any, event: mouse.IMouseEvent): boolean { - // Status group should never get selected nor expanded/collapsed - if (element instanceof gitmodel.StatusGroup) { - event.preventDefault(); - event.stopPropagation(); - - return true; - } - - if (event.shiftKey) { - var focus = tree.getFocus(); - - if (!(focus instanceof gitmodel.FileStatus) || !(element instanceof gitmodel.FileStatus)) { - return undefined; - } - - var focusStatus = focus; - var elementStatus = element; - - if (focusStatus.getType() !== elementStatus.getType()) { - return undefined; - } - - if (this.canSelect(tree, element)) { - tree.setFocus(element); - if (tree.isSelected(element)) { - tree.deselectRange(focusStatus, elementStatus); - } else { - tree.selectRange(focusStatus, elementStatus); - } - } - - return undefined; - } - - tree.setFocus(element); - - if (platform.isMacintosh ? event.metaKey : event.ctrlKey) { - if (this.canSelect(tree, element)) { - tree.toggleSelection(element, { origin: 'mouse', originalEvent: event }); - } - - return undefined; - } - - return super.onLeftClick(tree, element, event); - } - - protected onEnter(tree: tree.ITree, event: keyboard.IKeyboardEvent): boolean { - var element = tree.getFocus(); - - // Status group should never get selected nor expanded/collapsed - if (element instanceof gitmodel.StatusGroup) { - event.preventDefault(); - event.stopPropagation(); - - return true; - } - - return super.onEnter(tree, event); - } - - protected onSpace(tree: tree.ITree, event: keyboard.IKeyboardEvent): boolean { - var focus = tree.getFocus(); - - if (!focus) { - event.preventDefault(); - event.stopPropagation(); - return true; - } - - if (!this.canSelect(tree, focus)) { - return false; - } - - tree.toggleSelection(focus, { origin: 'keyboard', originalEvent: event }); - event.preventDefault(); - event.stopPropagation(); - return true; - } - - public onContextMenu(tree: tree.ITree, element: any, event: tree.ContextMenuEvent): boolean { - if (event.target && event.target.tagName && event.target.tagName.toLowerCase() === 'input') { - return false; - } - - event.preventDefault(); - event.stopPropagation(); - - tree.setFocus(element); - - if (this.actionProvider.hasSecondaryActions(tree, element)) { - var anchor = { x: event.posx + 1, y: event.posy }; - var context = { - selection: tree.getSelection(), - focus: element - }; - - this.contextMenuService.showContextMenu({ - getAnchor: () => anchor, - getActions: () => this.actionProvider.getSecondaryActions(tree, element), - getActionItem: this.actionProvider.getActionItem.bind(this.actionProvider, tree, element), - getActionsContext: () => context, - onHide: (wasCancelled?: boolean) => { - if (wasCancelled) { - tree.DOMFocus(); - } - } - }); - - return true; - } - - return false; - } - - protected onLeft(tree: tree.ITree, event: keyboard.IKeyboardEvent): boolean { - return true; - } - - protected onRight(tree: tree.ITree, event: keyboard.IKeyboardEvent): boolean { - return true; - } - - protected onUp(tree: tree.ITree, event: keyboard.IKeyboardEvent): boolean { - var oldFocus = tree.getFocus(); - var base = super.onUp(tree, event); - - if (!base || !event.shiftKey) { - return false; - } - - return this.shiftSelect(tree, oldFocus, event); - } - - protected onPageUp(tree: tree.ITree, event: keyboard.IKeyboardEvent): boolean { - var oldFocus = tree.getFocus(); - var base = super.onPageUp(tree, event); - - if (!base || !event.shiftKey) { - return false; - } - - return this.shiftSelect(tree, oldFocus, event); - } - - protected onDown(tree: tree.ITree, event: keyboard.IKeyboardEvent): boolean { - var oldFocus = tree.getFocus(); - var base = super.onDown(tree, event); - - if (!base || !event.shiftKey) { - return false; - } - - return this.shiftSelect(tree, oldFocus, event); - } - - protected onPageDown(tree: tree.ITree, event: keyboard.IKeyboardEvent): boolean { - var oldFocus = tree.getFocus(); - var base = super.onPageDown(tree, event); - - if (!base || !event.shiftKey) { - return false; - } - - return this.shiftSelect(tree, oldFocus, event); - } - - private canSelect(tree: tree.ITree, ...elements: any[]): boolean { - if (elements.some(e => e instanceof gitmodel.StatusGroup || e instanceof gitmodel.StatusModel)) { - return false; - } - - return elements.every(e => { - var first = tree.getSelection()[0]; - var clicked = e; - return !first || (first.getType() === clicked.getType()); - }); - } - - private shiftSelect(tree: tree.ITree, oldFocus: any, event: keyboard.IKeyboardEvent): boolean { - var payload = { origin: 'keyboard', originalEvent: event }; - var focus = tree.getFocus(); - - if (focus === oldFocus) { - return false; - } - - var oldFocusIsSelected = tree.isSelected(oldFocus); - var focusIsSelected = tree.isSelected(focus); - - if (oldFocusIsSelected && focusIsSelected) { - tree.deselectRange(focus, oldFocus, payload); - } else if (!oldFocusIsSelected && !focusIsSelected) { - if (this.canSelect(tree, oldFocus, focus)) { - tree.selectRange(focus, oldFocus, payload); - } - } else if (oldFocusIsSelected) { - if (this.canSelect(tree, focus)) { - tree.selectRange(focus, oldFocus, payload); - } - } else { - tree.deselectRange(focus, oldFocus, payload); - } - - return true; - } -} diff --git a/src/vs/workbench/parts/git/browser/views/disabled/disabledView.css b/src/vs/workbench/parts/git/browser/views/disabled/disabledView.css deleted file mode 100644 index f5e5b1994a5..00000000000 --- a/src/vs/workbench/parts/git/browser/views/disabled/disabledView.css +++ /dev/null @@ -1,8 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -.git-viewlet > .disabled-view { - padding: 0 20px 0 20px; -} diff --git a/src/vs/workbench/parts/git/browser/views/disabled/disabledView.ts b/src/vs/workbench/parts/git/browser/views/disabled/disabledView.ts deleted file mode 100644 index 43351e73218..00000000000 --- a/src/vs/workbench/parts/git/browser/views/disabled/disabledView.ts +++ /dev/null @@ -1,63 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import 'vs/css!./disabledView'; -import nls = require('vs/nls'); -import winjs = require('vs/base/common/winjs.base'); -import ee = require('vs/base/common/eventEmitter'); -import view = require('vs/workbench/parts/git/browser/views/view'); -import builder = require('vs/base/browser/builder'); -import actions = require('vs/base/common/actions'); - -var $ = builder.$; - -export class DisabledView - extends ee.EventEmitter - implements view.IView { - public ID = 'disabled'; - private _element: HTMLElement; - - public get element(): HTMLElement { - if (!this._element) { - this.render(); - } - - return this._element; - } - - private render(): void { - this._element = $([ - '
', - '

', nls.localize('disabled', "Git is disabled in the settings."), '

', - '
' - ].join('')).getHTMLElement(); - } - - public focus(): void { - return; - } - - public layout(dimension: builder.Dimension): void { - return; - } - - public setVisible(visible: boolean): winjs.TPromise { - return winjs.TPromise.as(null); - } - - public getControl(): ee.IEventEmitter { - return null; - } - - public getActions(): actions.IAction[] { - return []; - } - - public getSecondaryActions(): actions.IAction[] { - return []; - } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/views/empty/emptyView.css b/src/vs/workbench/parts/git/browser/views/empty/emptyView.css deleted file mode 100644 index e7b57f201fd..00000000000 --- a/src/vs/workbench/parts/git/browser/views/empty/emptyView.css +++ /dev/null @@ -1,30 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -.git-viewlet > .empty-view { - padding: 0 20px 0 20px; -} - -.git-viewlet > .empty-view > .section:not(:empty) { - margin: 20px 0; - padding-top: 20px; - border-top: 1px solid rgba(0, 0, 0, 0.05); -} - -.git-viewlet > .empty-view > .section > p:first-child { - margin-top: 0; -} - -.git-viewlet > .empty-view .monaco-inputbox { - width: 100%; - margin-bottom: 10px; -} - -.git-viewlet > .empty-view .combo-box { - width: 100%; - min-width: inherit; - padding: 4px 4px 4px 0; - margin-bottom: 10px; -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/views/empty/emptyView.ts b/src/vs/workbench/parts/git/browser/views/empty/emptyView.ts deleted file mode 100644 index 730837e4a38..00000000000 --- a/src/vs/workbench/parts/git/browser/views/empty/emptyView.ts +++ /dev/null @@ -1,174 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import 'vs/css!./emptyView'; -import nls = require('vs/nls'); -import Lifecycle = require('vs/base/common/lifecycle'); -import EventEmitter = require('vs/base/common/eventEmitter'); -import DOM = require('vs/base/browser/dom'); -import { Button } from 'vs/base/browser/ui/button/button'; -import WinJS = require('vs/base/common/winjs.base'); -import Builder = require('vs/base/browser/builder'); -import Actions = require('vs/base/common/actions'); -import InputBox = require('vs/base/browser/ui/inputbox/inputBox'); -import GitView = require('vs/workbench/parts/git/browser/views/view'); -import GitActions = require('vs/workbench/parts/git/browser/gitActions'); -import { IFileService } from 'vs/platform/files/common/files'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IMessageService } from 'vs/platform/message/common/message'; -import { IGitService } from 'vs/workbench/parts/git/common/git'; -import { attachButtonStyler } from 'vs/platform/theme/common/styler'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; - -var $ = Builder.$; - -export class EmptyView extends EventEmitter.EventEmitter implements GitView.IView { - - public ID = 'empty'; - - private static EMPTY_MESSAGE = nls.localize('noGit', "This workspace isn't yet under git source control."); - - private gitService: IGitService; - private instantiationService: IInstantiationService; - private messageService: IMessageService; - private fileService: IFileService; - - private actionRunner: Actions.IActionRunner; - private refreshAction: Actions.IAction; - private isVisible: boolean; - private needsRender: boolean; - private $el: Builder.Builder; - private urlInputBox: InputBox.InputBox; - private cloneButton: Button; - private initButton: Button; - private controller: GitView.IController; - private toDispose: Lifecycle.IDisposable[]; - - constructor(controller: GitView.IController, actionRunner: Actions.IActionRunner, - @IGitService gitService: IGitService, - @IInstantiationService instantiationService: IInstantiationService, - @IMessageService messageService: IMessageService, - @IFileService fileService: IFileService, - @IThemeService private themeService: IThemeService - ) { - super(); - - this.gitService = gitService; - this.instantiationService = instantiationService; - this.messageService = messageService; - this.fileService = fileService; - - this.actionRunner = actionRunner; - this.isVisible = false; - this.needsRender = false; - this.controller = controller; - this.toDispose = []; - } - - // Properties - - private _initAction: GitActions.InitAction; - private get initAction(): GitActions.InitAction { - if (!this._initAction) { - this._initAction = this.instantiationService.createInstance(GitActions.InitAction); - } - - return this._initAction; - } - - // IView - - public get element(): HTMLElement { - this.render(); - return this.$el.getHTMLElement(); - } - - private render(): void { - if (this.$el) { - return; - } - - this.$el = $('.empty-view'); - - $('p').appendTo(this.$el).text(EmptyView.EMPTY_MESSAGE); - - var initSection = $('.section').appendTo(this.$el); - this.initButton = new Button(initSection); - attachButtonStyler(this.initButton, this.themeService); - this.initButton.label = nls.localize('gitinit', 'Initialize Git Repository'); - this.initButton.addListener('click', (e) => { - DOM.EventHelper.stop(e); - - this.disableUI(); - this.actionRunner.run(this.initAction).done(() => this.enableUI()); - }); - } - - private disableUI(): void { - if (this.urlInputBox) { - this.urlInputBox.disable(); - } - - if (this.cloneButton) { - this.cloneButton.enabled = false; - } - - this.initButton.enabled = false; - } - - private enableUI(): void { - if (this.gitService.getRunningOperations().length > 0) { - return; - } - - if (this.urlInputBox) { - this.urlInputBox.enable(); - this.urlInputBox.validate(); - } - - this.initButton.enabled = true; - } - - public focus(): void { - this.initButton.focus(); - } - - public layout(dimension: Builder.Dimension): void { - // no-op - } - - public setVisible(visible: boolean): WinJS.TPromise { - this.isVisible = visible; - - return WinJS.TPromise.as(null); - } - - public getControl(): EventEmitter.IEventEmitter { - return null; - } - - public getActions(): Actions.IAction[] { - return this.refreshAction ? [this.refreshAction] : []; - } - - public getSecondaryActions(): Actions.IAction[] { - return []; - } - - // Events - - public dispose(): void { - if (this.$el) { - this.$el.dispose(); - this.$el = null; - } - - this.toDispose = Lifecycle.dispose(this.toDispose); - - super.dispose(); - } -} diff --git a/src/vs/workbench/parts/git/browser/views/gitless/gitlessView.css b/src/vs/workbench/parts/git/browser/views/gitless/gitlessView.css deleted file mode 100644 index a06817221da..00000000000 --- a/src/vs/workbench/parts/git/browser/views/gitless/gitlessView.css +++ /dev/null @@ -1,23 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -.git-viewlet > .gitless-view { - padding: 0 20px 0 20px; -} - -.git-viewlet > .gitless-view > p { - line-height: 1.5em; -} - -.git-viewlet > .gitless-view .code { - display: inline; -} - -.git-viewlet > .gitless-view a -{ - color: inherit; - font-weight: bold; - text-decoration: underline; -} diff --git a/src/vs/workbench/parts/git/browser/views/gitless/gitlessView.ts b/src/vs/workbench/parts/git/browser/views/gitless/gitlessView.ts deleted file mode 100644 index e615cf87e76..00000000000 --- a/src/vs/workbench/parts/git/browser/views/gitless/gitlessView.ts +++ /dev/null @@ -1,98 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import 'vs/css!./gitlessView'; -import nls = require('vs/nls'); -import platform = require('vs/base/common/platform'); -import winjs = require('vs/base/common/winjs.base'); -import ee = require('vs/base/common/eventEmitter'); -import view = require('vs/workbench/parts/git/browser/views/view'); -import builder = require('vs/base/browser/builder'); -import actions = require('vs/base/common/actions'); - -var $ = builder.$; - -export class GitlessView - extends ee.EventEmitter - implements view.IView { - public ID = 'gitless'; - private _element: HTMLElement; - - constructor() { - super(); - } - - public get element(): HTMLElement { - if (!this._element) { - this.render(); - } - - return this._element; - } - - private render(): void { - var instructions: string; - - if (platform.isMacintosh) { - instructions = nls.localize('macInstallWith', - "You can either install it with {0}, download it from {1} or install the {2} command line developer tools, by simply typing {3} on a Terminal prompt.", - 'Homebrew', - 'git-scm.com', - 'XCode', - 'git' - ); - } else if (platform.isWindows) { - instructions = nls.localize('winInstallWith', - "You can either install it with {0} or download it from {1}.", - 'Chocolatey', - 'git-scm.com' - ); - } else if (platform.isLinux) { - instructions = nls.localize('linuxDownloadFrom', - "You can download it from {0}.", - 'git-scm.com' - ); - } else { - instructions = nls.localize('downloadFrom', - "You can download it from {0}.", - 'git-scm.com' - ); - } - - this._element = $([ - '
', - '

', nls.localize('looksLike', "It looks like git is not installed on your system."), '

', - '

', instructions, '

', - '

', nls.localize('pleaseRestart', "Once git is installed, please restart VSCode."), '

', - '
' - ].join('')).getHTMLElement(); - } - - public focus(): void { - return; - } - - public layout(dimension: builder.Dimension): void { - return; - } - - public setVisible(visible: boolean): winjs.TPromise { - return winjs.TPromise.as(null); - } - - public getControl(): ee.IEventEmitter { - return null; - } - - public getActions(): actions.IAction[] { - return []; - } - - public getSecondaryActions(): actions.IAction[] { - return []; - } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/views/huge/hugeView.css b/src/vs/workbench/parts/git/browser/views/huge/hugeView.css deleted file mode 100644 index a428d2328c0..00000000000 --- a/src/vs/workbench/parts/git/browser/views/huge/hugeView.css +++ /dev/null @@ -1,12 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -.git-viewlet > .huge-view { - padding: 0 20px 0 20px; -} - -.git-viewlet > .huge-view > p { - line-height: 1.5em; -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/views/huge/hugeView.ts b/src/vs/workbench/parts/git/browser/views/huge/hugeView.ts deleted file mode 100644 index 7e6173e8422..00000000000 --- a/src/vs/workbench/parts/git/browser/views/huge/hugeView.ts +++ /dev/null @@ -1,86 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import 'vs/css!./hugeView'; -import nls = require('vs/nls'); -import winjs = require('vs/base/common/winjs.base'); -import ee = require('vs/base/common/eventEmitter'); -import view = require('vs/workbench/parts/git/browser/views/view'); -import builder = require('vs/base/browser/builder'); -import actions = require('vs/base/common/actions'); -import * as dom from 'vs/base/browser/dom'; -import { IGitService } from 'vs/workbench/parts/git/common/git'; -import { onUnexpectedError } from 'vs/base/common/errors'; -import { Button } from 'vs/base/browser/ui/button/button'; -import { attachButtonStyler } from 'vs/platform/theme/common/styler'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; - -const $ = dom.$; - -export class HugeView extends ee.EventEmitter implements view.IView { - - ID = 'huge'; - private _element: HTMLElement; - - constructor( @IGitService private gitService: IGitService, @IThemeService private themeService: IThemeService) { - super(); - } - - get element(): HTMLElement { - if (!this._element) { - this.render(); - } - - return this._element; - } - - private render(): void { - this._element = $('.huge-view'); - - dom.append(this._element, $('p')).textContent = nls.localize('huge', "Your repository appears to have many active changes.\nThis can cause Code to become very slow."); - - const settingP = dom.append(this._element, $('p')); - dom.append(settingP, document.createTextNode(nls.localize('setting', "You can permanently disable this warning with the following setting:"))); - dom.append(settingP, document.createTextNode(' ')); - const pre = dom.append(settingP, $('pre')); - pre.style.display = 'inline'; - pre.textContent = 'git.allowLargeRepositories'; - - const button = new Button(this._element); - attachButtonStyler(button, this.themeService); - button.label = nls.localize('allo', "Allow large repositories"); - button.addListener('click', (e) => { - dom.EventHelper.stop(e); - this.gitService.allowHugeRepositories = true; - this.gitService.status().done(null, onUnexpectedError); - }); - } - - focus(): void { - return; - } - - layout(dimension: builder.Dimension): void { - return; - } - - setVisible(visible: boolean): winjs.TPromise { - return winjs.TPromise.as(null); - } - - getControl(): ee.IEventEmitter { - return null; - } - - getActions(): actions.IAction[] { - return []; - } - - getSecondaryActions(): actions.IAction[] { - return []; - } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/views/notroot/notrootView.css b/src/vs/workbench/parts/git/browser/views/notroot/notrootView.css deleted file mode 100644 index 85665d2e346..00000000000 --- a/src/vs/workbench/parts/git/browser/views/notroot/notrootView.css +++ /dev/null @@ -1,23 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -.git-viewlet > .notroot-view { - padding: 0 20px 0 20px; -} - -.git-viewlet > .notroot-view > p { - line-height: 1.5em; -} - -.git-viewlet > .notroot-view .code { - display: inline; -} - -.git-viewlet > .notroot-view a -{ - color: inherit; - font-weight: bold; - text-decoration: underline; -} diff --git a/src/vs/workbench/parts/git/browser/views/notroot/notrootView.ts b/src/vs/workbench/parts/git/browser/views/notroot/notrootView.ts deleted file mode 100644 index 2e9263bcb8d..00000000000 --- a/src/vs/workbench/parts/git/browser/views/notroot/notrootView.ts +++ /dev/null @@ -1,63 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import 'vs/css!./notrootView'; -import nls = require('vs/nls'); -import winjs = require('vs/base/common/winjs.base'); -import ee = require('vs/base/common/eventEmitter'); -import view = require('vs/workbench/parts/git/browser/views/view'); -import builder = require('vs/base/browser/builder'); -import actions = require('vs/base/common/actions'); -const $ = builder.$; - -export class NotRootView - extends ee.EventEmitter - implements view.IView { - public ID = 'notroot'; - private _element: HTMLElement; - - public get element(): HTMLElement { - if (!this._element) { - this.render(); - } - - return this._element; - } - - private render(): void { - this._element = $([ - '
', - '

', nls.localize('wrongRoot', "This directory seems to be contained in a git repository."), '

', - '

', nls.localize('pleaseRestart', "Open the repository's root directory in order to access Git features."), '

', - '
' - ].join('')).getHTMLElement(); - } - - public focus(): void { - return; - } - - public layout(dimension: builder.Dimension): void { - return; - } - - public setVisible(visible: boolean): winjs.TPromise { - return winjs.TPromise.as(null); - } - - public getControl(): ee.IEventEmitter { - return null; - } - - public getActions(): actions.IAction[] { - return []; - } - - public getSecondaryActions(): actions.IAction[] { - return []; - } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/views/noworkspace/noworkspaceView.css b/src/vs/workbench/parts/git/browser/views/noworkspace/noworkspaceView.css deleted file mode 100644 index c9e3e1780c0..00000000000 --- a/src/vs/workbench/parts/git/browser/views/noworkspace/noworkspaceView.css +++ /dev/null @@ -1,12 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -.git-viewlet > .noworkspace-view { - padding: 0 20px 0 20px; -} - -.git-viewlet > .noworkspace-view > p { - line-height: 1.5em; -} diff --git a/src/vs/workbench/parts/git/browser/views/noworkspace/noworkspaceView.ts b/src/vs/workbench/parts/git/browser/views/noworkspace/noworkspaceView.ts deleted file mode 100644 index a75f8f249c6..00000000000 --- a/src/vs/workbench/parts/git/browser/views/noworkspace/noworkspaceView.ts +++ /dev/null @@ -1,95 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import 'vs/css!./noworkspaceView'; -import nls = require('vs/nls'); -import * as errors from 'vs/base/common/errors'; -import winjs = require('vs/base/common/winjs.base'); -import ee = require('vs/base/common/eventEmitter'); -import env = require('vs/base/common/platform'); -import view = require('vs/workbench/parts/git/browser/views/view'); -import builder = require('vs/base/browser/builder'); -import { Button } from 'vs/base/browser/ui/button/button'; -import { IActionRunner, IAction } from 'vs/base/common/actions'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { OpenFolderAction, OpenFileFolderAction } from 'vs/workbench/browser/actions/fileActions'; -import { attachButtonStyler } from 'vs/platform/theme/common/styler'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; -const $ = builder.$; - -export class NoWorkspaceView - extends ee.EventEmitter - implements view.IView { - public ID = 'noworkspace'; - private _element: HTMLElement; - private _openFolderButton: Button; - - constructor( - private actionRunner: IActionRunner, - @IInstantiationService private instantiationService: IInstantiationService, - @IThemeService private themeService: IThemeService - ) { - super(); - } - - public get element(): HTMLElement { - if (!this._element) { - this.render(); - } - - return this._element; - } - - private render(): void { - this._element = $([ - '
', - '

', nls.localize('noWorkspaceHelp', "You have not yet opened a folder."), '

', - '

', nls.localize('pleaseRestart', "Open a folder with a Git repository in order to access Git features."), '

', - '
' - ].join('')).getHTMLElement(); - - this._openFolderButton = new Button(this._element); - attachButtonStyler(this._openFolderButton, this.themeService); - this._openFolderButton.label = nls.localize('openFolder', "Open Folder"); - this._openFolderButton.addListener('click', () => { - const actionClass = env.isMacintosh ? OpenFileFolderAction : OpenFolderAction; - const action = this.instantiationService.createInstance(actionClass, actionClass.ID, actionClass.LABEL); - this.actionRunner.run(action).done(() => { - action.dispose(); - }, err => { - action.dispose(); - errors.onUnexpectedError(err); - }); - }); - } - - public focus(): void { - if (this._openFolderButton) { - this._openFolderButton.getElement().focus(); - } - } - - public layout(dimension: builder.Dimension): void { - return; - } - - public setVisible(visible: boolean): winjs.TPromise { - return winjs.TPromise.as(null); - } - - public getControl(): ee.IEventEmitter { - return null; - } - - public getActions(): IAction[] { - return []; - } - - public getSecondaryActions(): IAction[] { - return []; - } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/browser/views/view.ts b/src/vs/workbench/parts/git/browser/views/view.ts deleted file mode 100644 index fc0c209607a..00000000000 --- a/src/vs/workbench/parts/git/browser/views/view.ts +++ /dev/null @@ -1,24 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -import Lifecycle = require('vs/base/common/lifecycle'); -import WinJS = require('vs/base/common/winjs.base'); -import EventEmitter = require('vs/base/common/eventEmitter'); -import Builder = require('vs/base/browser/builder'); -import Actions = require('vs/base/common/actions'); - -export interface IView extends Lifecycle.IDisposable { - ID: string; - element: HTMLElement; - focus(): void; - layout(dimension: Builder.Dimension): void; - setVisible(visible: boolean): WinJS.Promise; - getControl(): EventEmitter.IEventEmitter; - getActions(): Actions.IAction[]; - getSecondaryActions(): Actions.IAction[]; -} - -export interface IController { - setView(id: string): WinJS.Promise; -} diff --git a/src/vs/workbench/parts/git/common/git.ts b/src/vs/workbench/parts/git/common/git.ts deleted file mode 100644 index 1c5ddfd4875..00000000000 --- a/src/vs/workbench/parts/git/common/git.ts +++ /dev/null @@ -1,342 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { TPromise } from 'vs/base/common/winjs.base'; -import { EditorInput } from 'vs/workbench/common/editor'; -import { IEventEmitter } from 'vs/base/common/eventEmitter'; -import { IDisposable } from 'vs/base/common/lifecycle'; -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import Event from 'vs/base/common/event'; - -// Model raw interfaces - -export interface IRawFileStatus { - x: string; - y: string; - path: string; - mimetype: string; - rename?: string; -} - -export interface IRemote { - name: string; - url: string; -} - -export enum RefType { - Head, - RemoteHead, - Tag -} - -export interface IRef { - name: string; - commit: string; - type: RefType; - remote?: string; -} - -export interface IBranch extends IRef { - upstream?: string; - ahead?: number; - behind?: number; -} - -export interface IRawStatus { - repositoryRoot: string; - state?: ServiceState; - status: IRawFileStatus[]; - HEAD: IBranch; - refs: IRef[]; - remotes: IRemote[]; -} - -export interface ICommit { - hash: string; - message: string; -} - -// Model enums - -export enum StatusType { - INDEX, - WORKING_TREE, - MERGE -} - -export enum Status { - INDEX_MODIFIED, - INDEX_ADDED, - INDEX_DELETED, - INDEX_RENAMED, - INDEX_COPIED, - - MODIFIED, - DELETED, - UNTRACKED, - IGNORED, - - ADDED_BY_US, - ADDED_BY_THEM, - DELETED_BY_US, - DELETED_BY_THEM, - BOTH_ADDED, - BOTH_DELETED, - BOTH_MODIFIED -} - -// Model events - -export const ModelEvents = { - MODEL_UPDATED: 'ModelUpdated', - STATUS_MODEL_UPDATED: 'StatusModelUpdated', - HEAD_UPDATED: 'HEADUpdated', - REFS_UPDATED: 'RefsUpdated', - REMOTES_UPDATED: 'RemotesUpdated' -}; - -// Model interfaces - -export interface IFileStatus { - getId(): string; - getType(): StatusType; - getPath(): string; - getPathComponents(): string[]; - getMimetype(): string; - getStatus(): Status; - getRename(): string; - clone(): IFileStatus; - update(other: IFileStatus): void; -} - -export interface IStatusGroup extends IEventEmitter { - getType(): StatusType; - update(statusList: IFileStatus[]): void; - all(): IFileStatus[]; - find(path: string): IFileStatus; -} - -export interface IStatusSummary { - hasWorkingTreeChanges: boolean; - hasIndexChanges: boolean; - hasMergeChanges: boolean; -} - -export interface IStatusModel extends IEventEmitter { - getSummary(): IStatusSummary; - update(status: IRawFileStatus[]): void; - getIndexStatus(): IStatusGroup; - getWorkingTreeStatus(): IStatusGroup; - getMergeStatus(): IStatusGroup; - getGroups(): IStatusGroup[]; - find(path: string, type: StatusType): IFileStatus; -} - -export interface IModel extends IEventEmitter { - getRepositoryRoot(): string; - getStatus(): IStatusModel; - getHEAD(): IBranch; - getRefs(): IRef[]; - getRemotes(): IRemote[]; - update(status: IRawStatus): void; - getPS1(): string; -} - -// Service operations - -export interface IGitOperation extends IDisposable { - id: string; - run(): TPromise; -} - -// Service enums - -export enum ServiceState { - NotInitialized, - NotARepo, - NotAtRepoRoot, - OK, - Huge, - NoGit, - Disabled, - NotAWorkspace -} - -export enum RawServiceState { - OK, - GitNotFound, - Disabled -} - -export const GitErrorCodes = { - BadConfigFile: 'BadConfigFile', - AuthenticationFailed: 'AuthenticationFailed', - NoUserNameConfigured: 'NoUserNameConfigured', - NoUserEmailConfigured: 'NoUserEmailConfigured', - NoRemoteRepositorySpecified: 'NoRemoteRepositorySpecified', - NotAGitRepository: 'NotAGitRepository', - NotAtRepositoryRoot: 'NotAtRepositoryRoot', - Conflict: 'Conflict', - UnmergedChanges: 'UnmergedChanges', - PushRejected: 'PushRejected', - RemoteConnectionError: 'RemoteConnectionError', - DirtyWorkTree: 'DirtyWorkTree', - CantOpenResource: 'CantOpenResource', - GitNotFound: 'GitNotFound', - CantCreatePipe: 'CantCreatePipe', - CantAccessRemote: 'CantAccessRemote', - RepositoryNotFound: 'RepositoryNotFound' -}; - -export enum AutoFetcherState { - Disabled, - Inactive, - Active, - Fetching -} - -// Service events - -export const ServiceEvents = { - STATE_CHANGED: 'stateChanged', - REPO_CHANGED: 'repoChanged', - OPERATION_START: 'operationStart', - OPERATION_END: 'operationEnd', - OPERATION: 'operation', - ERROR: 'error', - DISPOSE: 'dispose' -}; - -// Service operations - -export const ServiceOperations = { - STATUS: 'status', - INIT: 'init', - ADD: 'add', - STAGE: 'stage', - BRANCH: 'branch', - CHECKOUT: 'checkout', - CLEAN: 'clean', - UNDO: 'undo', - RESET: 'reset', - REVERT: 'revert', - COMMIT: 'commit', - COMMAND: 'command', - BACKGROUND_FETCH: 'backgroundfetch', - PULL: 'pull', - PUSH: 'push', - SYNC: 'sync' -}; - -// Service config - -export interface IGitConfiguration { - enabled: boolean; - path: string; - autorefresh: boolean; - autofetch: boolean; - enableLongCommitWarning: boolean; - allowLargeRepositories: boolean; - confirmSync: boolean; - countBadge: string; - checkoutType: string; -} - -// Service interfaces - -export interface IAutoFetcher { - state: AutoFetcherState; - activate(): void; - deactivate(): void; -} - -export interface IGitCredentialScope { - protocol: string; - host: string; - path: string; -} - -export interface ICredentials { - username: string; - password: string; -} - -export interface IGitServiceError extends Error { - gitErrorCode: string; -} - -export interface IPushOptions { - setUpstream?: boolean; -} - -export interface IRawGitService { - onOutput: Event; - getVersion(): TPromise; - serviceState(): TPromise; - statusCount(): TPromise; - status(): TPromise; - init(): TPromise; - add(filesPaths?: string[]): TPromise; - stage(filePath: string, content: string): TPromise; - branch(name: string, checkout?: boolean): TPromise; - checkout(treeish?: string, filePaths?: string[]): TPromise; - clean(filePaths: string[]): TPromise; - undo(): TPromise; - reset(treeish: string, hard?: boolean): TPromise; - revertFiles(treeish: string, filePaths?: string[]): TPromise; - fetch(): TPromise; - pull(rebase?: boolean): TPromise; - push(remote?: string, name?: string, options?: IPushOptions): TPromise; - sync(): TPromise; - commit(message: string, amend?: boolean, stage?: boolean, signoff?: boolean): TPromise; - detectMimetypes(path: string, treeish?: string): TPromise; - show(path: string, treeish?: string): TPromise; - clone(url: string, parentPath: string): TPromise; - getCommitTemplate(): TPromise; - getCommit(ref: string): TPromise; -} - -export const GIT_SERVICE_ID = 'gitService'; - -export const IGitService = createDecorator(GIT_SERVICE_ID); - -export interface IGitService extends IEventEmitter { - _serviceBrand: any; - allowHugeRepositories: boolean; - onOutput: Event; - status(): TPromise; - init(): TPromise; - add(files?: IFileStatus[]): TPromise; - stage(filePath: string, content: string): TPromise; - branch(name: string, checkout?: boolean): TPromise; - checkout(treeish?: string, files?: IFileStatus[]): TPromise; - clean(files: IFileStatus[]): TPromise; - undo(): TPromise; - reset(treeish: string, hard?: boolean): TPromise; - revertFiles(treeish: string, files?: IFileStatus[]): TPromise; - fetch(): TPromise; - pull(rebase?: boolean): TPromise; - push(remote?: string, name?: string, options?: IPushOptions): TPromise; - sync(): TPromise; - commit(message: string, amend?: boolean, stage?: boolean, signoff?: boolean): TPromise; - detectMimetypes(path: string, treeish?: string): TPromise; - buffer(path: string, treeish?: string): TPromise; - clone(url: string, parentPath: string): TPromise; - - getState(): ServiceState; - getModel(): IModel; - getInput(status: IFileStatus): TPromise; - isInitialized(): boolean; - isIdle(): boolean; - getRunningOperations(): IGitOperation[]; - getAutoFetcher(): IAutoFetcher; - getCommitTemplate(): TPromise; - getCommit(ref: string): TPromise; -} - -export interface IAskpassService { - askpass(id: string, host: string, command: string): TPromise; -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/common/gitIpc.ts b/src/vs/workbench/parts/git/common/gitIpc.ts deleted file mode 100644 index 6f52b28e5dd..00000000000 --- a/src/vs/workbench/parts/git/common/gitIpc.ts +++ /dev/null @@ -1,267 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import { TPromise } from 'vs/base/common/winjs.base'; -import { IChannel, eventToCall, eventFromCall } from 'vs/base/parts/ipc/common/ipc'; -import Event from 'vs/base/common/event'; -import { - IRawGitService, RawServiceState, IRawStatus, IPushOptions, IAskpassService, ICredentials, - ServiceState, IRawFileStatus, IBranch, RefType, IRef, IRemote, ICommit -} from './git'; - -type ISerializer = { to(a: A): B; from(b: B): A; }; - -export type IPCRawFileStatus = [string, string, string, string, string]; -const RawFileStatusSerializer: ISerializer = { - to: a => [a.x, a.y, a.path, a.mimetype, a.rename], - from: b => ({ x: b[0], y: b[1], path: b[2], mimetype: b[3], rename: b[4] }) -}; - -export type IPCBranch = [string, string, RefType, string, string, number, number]; -const BranchSerializer: ISerializer = { - to: a => [a.name, a.commit, a.type, a.remote, a.upstream, a.ahead, a.behind], - from: b => ({ name: b[0], commit: b[1], type: b[2], remote: b[3], upstream: b[4], ahead: b[5], behind: b[6] }) -}; - -export type IPCRef = [string, string, RefType, string]; -const RefSerializer: ISerializer = { - to: a => [a.name, a.commit, a.type, a.remote], - from: b => ({ name: b[0], commit: b[1], type: b[2], remote: b[3] }) -}; - -export type IPCRemote = [string, string]; -const RemoteSerializer: ISerializer = { - to: a => [a.name, a.url], - from: b => ({ name: b[0], url: b[1] }) -}; - -export type IPCRawStatus = [ - string, - ServiceState, - IPCRawFileStatus[], - IPCBranch, - IPCRef[], - IPCRemote[] -]; - -const RawStatusSerializer: ISerializer = { - to: a => !a ? null : [ - a.repositoryRoot, - a.state, - a.status.map(RawFileStatusSerializer.to), - BranchSerializer.to(a.HEAD), - a.refs.map(RefSerializer.to), - a.remotes.map(RemoteSerializer.to) - ], - from: b => !b ? null : { - repositoryRoot: b[0], - state: b[1], - status: b[2].map(RawFileStatusSerializer.from), - HEAD: BranchSerializer.from(b[3]), - refs: b[4].map(RefSerializer.from), - remotes: b[5].map(RemoteSerializer.from) - } -}; - -export interface IGitChannel extends IChannel { - call(command: 'getVersion'): TPromise; - call(command: 'serviceState'): TPromise; - call(command: 'statusCount'): TPromise; - call(command: 'status'): TPromise; - call(command: 'init'): TPromise; - call(command: 'add', filesPaths?: string[]): TPromise; - call(command: 'stage', args: [string, string]): TPromise; - call(command: 'branch', args: [string, boolean]): TPromise; - call(command: 'checkout', args: [string, string[]]): TPromise; - call(command: 'clean', filePaths: string[]): TPromise; - call(command: 'undo'): TPromise; - call(command: 'reset', args: [string, boolean]): TPromise; - call(command: 'revertFiles', args: [string, string[]]): TPromise; - call(command: 'fetch'): TPromise; - call(command: 'pull', rebase?: boolean): TPromise; - call(command: 'push', args: [string, string, IPushOptions]): TPromise; - call(command: 'sync'): TPromise; - call(command: 'commit', args: [string, boolean, boolean, boolean]): TPromise; - call(command: 'detectMimetypes', args: [string, string]): TPromise; - call(command: 'show', args: [string, string]): TPromise; - call(command: 'clone', args: [string, string]): TPromise; - call(command: 'onOutput'): TPromise; - call(command: 'getCommitTemplate'): TPromise; - call(command: 'getCommit', ref: string): TPromise; - call(command: string, args?: any): TPromise; -} - -export class GitChannel implements IGitChannel { - - constructor(private service: TPromise) { } - - call(command: string, args?: any): TPromise { - switch (command) { - case 'getVersion': return this.service.then(s => s.getVersion()); - case 'serviceState': return this.service.then(s => s.serviceState()); - case 'statusCount': return this.service.then(s => s.statusCount()); - case 'status': return this.service.then(s => s.status()).then(RawStatusSerializer.to); - case 'init': return this.service.then(s => s.init()).then(RawStatusSerializer.to); - case 'add': return this.service.then(s => s.add(args)).then(RawStatusSerializer.to); - case 'stage': return this.service.then(s => s.stage(args[0], args[1])).then(RawStatusSerializer.to); - case 'branch': return this.service.then(s => s.branch(args[0], args[1])).then(RawStatusSerializer.to); - case 'checkout': return this.service.then(s => s.checkout(args[0], args[1])).then(RawStatusSerializer.to); - case 'clean': return this.service.then(s => s.clean(args)).then(RawStatusSerializer.to); - case 'undo': return this.service.then(s => s.undo()).then(RawStatusSerializer.to); - case 'reset': return this.service.then(s => s.reset(args[0], args[1])).then(RawStatusSerializer.to); - case 'revertFiles': return this.service.then(s => s.revertFiles(args[0], args[1])).then(RawStatusSerializer.to); - case 'fetch': return this.service.then(s => s.fetch()).then(RawStatusSerializer.to); - case 'pull': return this.service.then(s => s.pull(args)).then(RawStatusSerializer.to); - case 'push': return this.service.then(s => s.push(args[0], args[1], args[2])).then(RawStatusSerializer.to); - case 'sync': return this.service.then(s => s.sync()).then(RawStatusSerializer.to); - case 'commit': return this.service.then(s => s.commit(args[0], args[1], args[2], args[3])).then(RawStatusSerializer.to); - case 'detectMimetypes': return this.service.then(s => s.detectMimetypes(args[0], args[1])); - case 'show': return this.service.then(s => s.show(args[0], args[1])); - case 'clone': return this.service.then(s => s.clone(args[0], args[1])); - case 'onOutput': return this.service.then(s => eventToCall(s.onOutput)); - case 'getCommitTemplate': return this.service.then(s => s.getCommitTemplate()); - case 'getCommit': return this.service.then(s => s.getCommit(args)); - } - return undefined; - } -} - -export class UnavailableGitChannel implements IGitChannel { - - call(command: string): TPromise { - switch (command) { - case 'serviceState': return TPromise.as(RawServiceState.GitNotFound); - default: return TPromise.as(null); - } - } -} - -export class GitChannelClient implements IRawGitService { - - constructor(private channel: IGitChannel) { } - - private _onOutput = eventFromCall(this.channel, 'onOutput'); - get onOutput(): Event { return this._onOutput; } - - getVersion(): TPromise { - return this.channel.call('getVersion'); - } - - serviceState(): TPromise { - return this.channel.call('serviceState'); - } - - statusCount(): TPromise { - return this.channel.call('statusCount'); - } - - status(): TPromise { - return this.channel.call('status').then(RawStatusSerializer.from); - } - - init(): TPromise { - return this.channel.call('init').then(RawStatusSerializer.from); - } - - add(filesPaths?: string[]): TPromise { - return this.channel.call('add', filesPaths).then(RawStatusSerializer.from); - } - - stage(filePath: string, content: string): TPromise { - return this.channel.call('stage', [filePath, content]).then(RawStatusSerializer.from); - } - - branch(name: string, checkout?: boolean): TPromise { - return this.channel.call('branch', [name, checkout]).then(RawStatusSerializer.from); - } - - checkout(treeish?: string, filePaths?: string[]): TPromise { - return this.channel.call('checkout', [treeish, filePaths]).then(RawStatusSerializer.from); - } - - clean(filePaths: string[]): TPromise { - return this.channel.call('clean', filePaths).then(RawStatusSerializer.from); - } - - undo(): TPromise { - return this.channel.call('undo').then(RawStatusSerializer.from); - } - - reset(treeish: string, hard?: boolean): TPromise { - return this.channel.call('reset', [treeish, hard]).then(RawStatusSerializer.from); - } - - revertFiles(treeish: string, filePaths?: string[]): TPromise { - return this.channel.call('revertFiles', [treeish, filePaths]).then(RawStatusSerializer.from); - } - - fetch(): TPromise { - return this.channel.call('fetch').then(RawStatusSerializer.from); - } - - pull(rebase?: boolean): TPromise { - return this.channel.call('pull', rebase).then(RawStatusSerializer.from); - } - - push(remote?: string, name?: string, options?: IPushOptions): TPromise { - return this.channel.call('push', [remote, name, options]).then(RawStatusSerializer.from); - } - - sync(): TPromise { - return this.channel.call('sync').then(RawStatusSerializer.from); - } - - commit(message: string, amend?: boolean, stage?: boolean, signoff?: boolean): TPromise { - return this.channel.call('commit', [message, amend, stage, signoff]).then(RawStatusSerializer.from); - } - - detectMimetypes(path: string, treeish?: string): TPromise { - return this.channel.call('detectMimetypes', [path, treeish]); - } - - show(path: string, treeish?: string): TPromise { - return this.channel.call('show', [path, treeish]); - } - - clone(url: string, parentPath: string): TPromise { - return this.channel.call('clone', [url, parentPath]); - } - - getCommitTemplate(): TPromise { - return this.channel.call('getCommitTemplate'); - } - - getCommit(ref: string): TPromise { - return this.channel.call('getCommit', ref); - } -} - -export interface IAskpassChannel extends IChannel { - call(command: 'askpass', args: [string, string, string]): TPromise; - call(command: string, args: any[]): TPromise; -} - -export class AskpassChannel implements IAskpassChannel { - - constructor(private service: IAskpassService) { } - - call(command: string, args: [string, string, string]): TPromise { - switch (command) { - case 'askpass': return this.service.askpass(args[0], args[1], args[2]); - } - return undefined; - } -} - -export class AskpassChannelClient implements IAskpassService { - - constructor(private channel: IAskpassChannel) { } - - askpass(id: string, host: string, command: string): TPromise { - return this.channel.call('askpass', [id, host, command]); - } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/common/gitModel.ts b/src/vs/workbench/parts/git/common/gitModel.ts deleted file mode 100644 index 30baf2cf6d2..00000000000 --- a/src/vs/workbench/parts/git/common/gitModel.ts +++ /dev/null @@ -1,412 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { format } from 'vs/base/common/strings'; -import { EventEmitter } from 'vs/base/common/eventEmitter'; -import { - IStatusModel, IStatusSummary, IRawFileStatus, ModelEvents, - IFileStatus, IStatusGroup, Status, StatusType, - IBranch, IRef, IRemote, IModel, IRawStatus, RefType -} from 'vs/workbench/parts/git/common/git'; - -export class FileStatus implements IFileStatus { - - private id: string; - private pathComponents: string[]; - - constructor( - private path: string, - private mimetype: string, - private status: Status, - private rename?: string, - isModifiedInIndex?: boolean - ) { - this.id = FileStatus.typeOf(status) + ':' + path + (rename ? ':' + rename : '') + (isModifiedInIndex ? '$' : ''); - this.pathComponents = path.split('/'); - } - - getPath(): string { - return this.path; - } - - getPathComponents(): string[] { - return this.pathComponents.slice(0); - } - - getMimetype(): string { - return this.mimetype; - } - - getStatus(): Status { - return this.status; - } - - getRename(): string { - return this.rename; - } - - getId(): string { - return this.id; - } - - getType(): StatusType { - switch (FileStatus.typeOf(this.status)) { - case 'index': return StatusType.INDEX; - case 'workingTree': return StatusType.WORKING_TREE; - default: return StatusType.MERGE; - } - } - - clone(): IFileStatus { - return new FileStatus(this.path, this.mimetype, this.status, this.rename); - } - - update(other: FileStatus): void { - this.status = other.getStatus(); - this.rename = other.getRename(); - } - - static typeOf(s: Status): string { - switch (s) { - case Status.INDEX_MODIFIED: - case Status.INDEX_ADDED: - case Status.INDEX_DELETED: - case Status.INDEX_RENAMED: - case Status.INDEX_COPIED: - return 'index'; - - case Status.MODIFIED: - case Status.DELETED: - case Status.UNTRACKED: - case Status.IGNORED: - return 'workingTree'; - - default: - return 'merge'; - } - } -} - -interface IStatusSet { - [path: string]: IFileStatus; -} - -export class StatusGroup extends EventEmitter implements IStatusGroup { - - private type: StatusType; - private statusSet: IStatusSet; - private statusList: IFileStatus[]; - private statusByName: IStatusSet; - private statusByRename: IStatusSet; - - constructor(type: StatusType) { - super(); - - this.type = type; - this.statusSet = Object.create(null); - this.statusList = []; - this.statusByName = Object.create(null); - this.statusByRename = Object.create(null); - } - - getType(): StatusType { - return this.type; - } - - update(statusList: FileStatus[]): void { - const toDelete: IStatusSet = Object.create(null); - - let id: string, path: string, rename: string; - let status: IFileStatus; - - for (id in this.statusSet) { - toDelete[id] = this.statusSet[id]; - } - - for (let i = 0; i < statusList.length; i++) { - status = statusList[i]; - id = status.getId(); - path = status.getPath(); - rename = status.getRename(); - - if (toDelete[id]) { - this.statusSet[id].update(status); - toDelete[id] = null; - - } else { - this.statusSet[id] = status; - } - } - - for (id in toDelete) { - if (status = toDelete[id]) { - this.emit('fileStatus:dispose', status); - delete this.statusSet[id]; - } - } - - this.statusList = []; - this.statusByName = Object.create(null); - this.statusByRename = Object.create(null); - - for (id in this.statusSet) { - status = this.statusSet[id]; - this.statusList.push(status); - - if (status.getRename()) { - this.statusByRename[status.getPath()] = status; - } else { - this.statusByName[status.getPath()] = status; - } - } - } - - all(): IFileStatus[] { - return this.statusList; - } - - find(path: string): IFileStatus { - return this.statusByName[path] || this.statusByRename[path] || null; - } - - dispose(): void { - this.type = null; - this.statusSet = null; - this.statusList = null; - this.statusByName = null; - this.statusByRename = null; - - super.dispose(); - } -} - -export class StatusModel extends EventEmitter implements IStatusModel { - - private indexStatus: StatusGroup; - private workingTreeStatus: StatusGroup; - private mergeStatus: StatusGroup; - private toDispose: IDisposable[]; - - constructor() { - super(); - - this.indexStatus = new StatusGroup(StatusType.INDEX); - this.workingTreeStatus = new StatusGroup(StatusType.WORKING_TREE); - this.mergeStatus = new StatusGroup(StatusType.MERGE); - - this.toDispose = [ - this.addEmitter(this.indexStatus), - this.addEmitter(this.workingTreeStatus), - this.addEmitter(this.mergeStatus) - ]; - } - - getSummary(): IStatusSummary { - return { - hasWorkingTreeChanges: this.getWorkingTreeStatus().all().length > 0, - hasIndexChanges: this.getIndexStatus().all().length > 0, - hasMergeChanges: this.getMergeStatus().all().length > 0 - }; - } - - update(status: IRawFileStatus[]): void { - const index: FileStatus[] = []; - const workingTree: FileStatus[] = []; - const merge: FileStatus[] = []; - - status.forEach(raw => { - switch (raw.x + raw.y) { - case '??': return workingTree.push(new FileStatus(raw.path, raw.mimetype, Status.UNTRACKED)); - case '!!': return workingTree.push(new FileStatus(raw.path, raw.mimetype, Status.IGNORED)); - case 'DD': return merge.push(new FileStatus(raw.path, raw.mimetype, Status.BOTH_DELETED)); - case 'AU': return merge.push(new FileStatus(raw.path, raw.mimetype, Status.ADDED_BY_US)); - case 'UD': return merge.push(new FileStatus(raw.path, raw.mimetype, Status.DELETED_BY_THEM)); - case 'UA': return merge.push(new FileStatus(raw.path, raw.mimetype, Status.ADDED_BY_THEM)); - case 'DU': return merge.push(new FileStatus(raw.path, raw.mimetype, Status.DELETED_BY_US)); - case 'AA': return merge.push(new FileStatus(raw.path, raw.mimetype, Status.BOTH_ADDED)); - case 'UU': return merge.push(new FileStatus(raw.path, raw.mimetype, Status.BOTH_MODIFIED)); - } - - let isModifiedInIndex = false; - - switch (raw.x) { - case 'M': index.push(new FileStatus(raw.path, raw.mimetype, Status.INDEX_MODIFIED)); isModifiedInIndex = true; break; - case 'A': index.push(new FileStatus(raw.path, raw.mimetype, Status.INDEX_ADDED)); break; - case 'D': index.push(new FileStatus(raw.path, raw.mimetype, Status.INDEX_DELETED)); break; - case 'R': index.push(new FileStatus(raw.path, raw.mimetype, Status.INDEX_RENAMED, raw.rename)); break; - case 'C': index.push(new FileStatus(raw.path, raw.mimetype, Status.INDEX_COPIED)); break; - } - - switch (raw.y) { - case 'M': workingTree.push(new FileStatus(raw.path, raw.mimetype, Status.MODIFIED, raw.rename, isModifiedInIndex)); break; - case 'D': workingTree.push(new FileStatus(raw.path, raw.mimetype, Status.DELETED, raw.rename)); break; - } - - return undefined; - }); - - this.indexStatus.update(index); - this.workingTreeStatus.update(workingTree); - this.mergeStatus.update(merge); - - this.emit(ModelEvents.STATUS_MODEL_UPDATED); - } - - getIndexStatus(): IStatusGroup { - return this.indexStatus; - } - - getWorkingTreeStatus(): IStatusGroup { - return this.workingTreeStatus; - } - - getMergeStatus(): IStatusGroup { - return this.mergeStatus; - } - - getGroups(): IStatusGroup[] { - return [this.mergeStatus, this.indexStatus, this.workingTreeStatus]; - } - - find(path: string, type: StatusType): IFileStatus { - switch (type) { - case StatusType.INDEX: - return this.indexStatus.find(path); - case StatusType.WORKING_TREE: - return this.workingTreeStatus.find(path); - case StatusType.MERGE: - return this.mergeStatus.find(path); - default: - return null; - } - } - - dispose(): void { - this.toDispose = dispose(this.toDispose); - - if (this.indexStatus) { - this.indexStatus.dispose(); - this.indexStatus = null; - } - - if (this.workingTreeStatus) { - this.workingTreeStatus.dispose(); - this.workingTreeStatus = null; - } - - if (this.mergeStatus) { - this.mergeStatus.dispose(); - this.mergeStatus = null; - } - - super.dispose(); - } -} - -export class Model extends EventEmitter implements IModel { - - private repositoryRoot: string; - private status: IStatusModel; - private HEAD: IBranch; - private refs: IRef[]; - private remotes: IRemote[]; - private toDispose: IDisposable[]; - - constructor() { - super(); - - this.toDispose = []; - - this.repositoryRoot = null; - this.status = new StatusModel(); - this.toDispose.push(this.addEmitter(this.status)); - - this.HEAD = null; - this.refs = []; - this.remotes = []; - } - - getRepositoryRoot(): string { - return this.repositoryRoot; - } - - getStatus(): IStatusModel { - return this.status; - } - - getHEAD(): IBranch { - return this.HEAD; - } - - getRefs(): IRef[] { - return this.refs; - } - - getRemotes(): IRemote[] { - return this.remotes; - } - - update(status: IRawStatus): void { - if (!status) { - status = { - repositoryRoot: null, - status: [], - HEAD: null, - refs: [], - remotes: [] - }; - } - - this.repositoryRoot = status.repositoryRoot; - this.status.update(status.status); - - this.HEAD = status.HEAD; - this.emit(ModelEvents.HEAD_UPDATED); - - this.refs = status.refs; - this.emit(ModelEvents.REFS_UPDATED); - - this.remotes = status.remotes; - this.emit(ModelEvents.REMOTES_UPDATED); - - this.emit(ModelEvents.MODEL_UPDATED); - } - - getStatusSummary(): IStatusSummary { - const status = this.getStatus(); - - return { - hasWorkingTreeChanges: status.getWorkingTreeStatus().all().length > 0, - hasIndexChanges: status.getIndexStatus().all().length > 0, - hasMergeChanges: status.getMergeStatus().all().length > 0 - }; - } - - getPS1(): string { - if (!this.HEAD) { - return ''; - } - - const tag = this.getRefs().filter(iref => iref.type === RefType.Tag && iref.commit === this.HEAD.commit)[0]; - const tagName = tag && tag.name; - const head = this.HEAD.name || tagName || this.HEAD.commit.substr(0, 8); - - const statusSummary = this.getStatus().getSummary(); - - return format('{0}{1}{2}{3}', - head, - statusSummary.hasWorkingTreeChanges ? '*' : '', - statusSummary.hasIndexChanges ? '+' : '', - statusSummary.hasMergeChanges ? '!' : '' - ); - } - - dispose(): void { - this.toDispose = dispose(this.toDispose); - super.dispose(); - } -} diff --git a/src/vs/workbench/parts/git/common/stageRanges.ts b/src/vs/workbench/parts/git/common/stageRanges.ts deleted file mode 100644 index e4a30f88be3..00000000000 --- a/src/vs/workbench/parts/git/common/stageRanges.ts +++ /dev/null @@ -1,238 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { IChange, IModel, IIdentifiedSingleEditOperation } from 'vs/editor/common/editorCommon'; -import { Range } from 'vs/editor/common/core/range'; -import { Position } from 'vs/editor/common/core/position'; -import { Selection } from 'vs/editor/common/core/selection'; -import { EditOperation } from 'vs/editor/common/core/editOperation'; - -/** - * Represents the selected portion of an IChange, and includes the start/end line numbers of the full change - */ -export class SelectedChange implements IChange { - readonly originalStartLineNumber: number; - readonly originalEndLineNumber: number; - readonly modifiedStartLineNumber: number; - readonly modifiedEndLineNumber: number; - - readonly fullModifiedStartLineNumber: number; - readonly fullModifiedEndLineNumber: number; - - constructor(selected: IChange, full: IChange) { - this.originalStartLineNumber = selected.originalStartLineNumber; - this.originalEndLineNumber = selected.originalEndLineNumber; - this.modifiedStartLineNumber = selected.modifiedStartLineNumber; - this.modifiedEndLineNumber = selected.modifiedEndLineNumber; - - this.fullModifiedStartLineNumber = full.modifiedStartLineNumber; - this.fullModifiedEndLineNumber = full.modifiedEndLineNumber; - } - - /** - * True when the change is entirely selected - */ - get isCompletelySelected(): boolean { - return this.modifiedStartLineNumber === this.fullModifiedStartLineNumber && - this.modifiedEndLineNumber === this.fullModifiedEndLineNumber; - } -} - -function sortChanges(changes: IChange[]): void { - changes.sort((left, right) => { - if (left.originalStartLineNumber < right.originalStartLineNumber) { - return -1; - } else if (left.originalStartLineNumber > right.originalStartLineNumber) { - return 1; - } else if (left.modifiedStartLineNumber < right.modifiedStartLineNumber) { - return -1; - } - return 1; - }); -} - -function sortSelections(selections: Selection[]): void { - selections.sort((left, right) => { - if (left.getStartPosition().lineNumber < right.getStartPosition().lineNumber) { - return -1; - } - return 1; - }); -} - -function isInsertion(change: IChange): boolean { - return change.originalEndLineNumber <= 0; -} - -function isDeletion(change: IChange): boolean { - return change.modifiedEndLineNumber <= 0; -} - - -/** - * Returns an intersection between a change and a selection. - * Returns null if intersection does not exist. - */ -export function intersectChangeAndSelection(change: IChange, selection: Selection) { - var result = { - modifiedStartLineNumber: Math.max(change.modifiedStartLineNumber, selection.startLineNumber), - modifiedEndLineNumber: Math.min(change.modifiedEndLineNumber, selection.endLineNumber), - originalStartLineNumber: change.originalStartLineNumber, - originalEndLineNumber: change.originalEndLineNumber - }; - // Deletions have modifiedEndLineNumber = 0. In that case we can not use the simple check if there is an intersection. - var isDeletionSelected = isDeletion(result) && - (change.modifiedStartLineNumber >= selection.startLineNumber) && (change.modifiedStartLineNumber <= selection.endLineNumber); - - if ((result.modifiedStartLineNumber <= result.modifiedEndLineNumber) || isDeletionSelected) { - return result; - } - return null; -} - -/** - * Returns all selected changes (there can be multiple selections due to multiple cursors). - * If a change is partially selected, the selected part of the change will be returned. - */ -export function getSelectedChanges(changes: IChange[], selections: Selection[]): SelectedChange[] { - sortChanges(changes); - sortSelections(selections); - var result: SelectedChange[] = []; - var currentSelection = 0; - var lastLineAdded = -1; - - for (var i = 0; i < changes.length; ++i) { - // We have to check the previous selection. Since it can contain two changes. - currentSelection = Math.max(0, currentSelection - 1); - // Find all selections that are not after the current change. - while (currentSelection < selections.length && - (selections[currentSelection].startLineNumber <= changes[i].modifiedEndLineNumber || isDeletion(changes[i]))) { - var intersectedChange = intersectChangeAndSelection(changes[i], selections[currentSelection]); - if (intersectedChange !== null) { - // Each change needs to be disjoint so we check if we already added this line. - if (lastLineAdded !== intersectedChange.modifiedStartLineNumber) { - result.push(new SelectedChange(intersectedChange, changes[i])); - lastLineAdded = intersectedChange.modifiedEndLineNumber; - } else { - // Update change such that we do not add same line twice. - intersectedChange.modifiedStartLineNumber++; - if (intersectedChange.modifiedStartLineNumber <= intersectedChange.modifiedEndLineNumber) { - result.push(new SelectedChange(intersectedChange, changes[i])); - lastLineAdded = intersectedChange.modifiedEndLineNumber; - } - } - } - currentSelection++; - } - } - return result; -} - -function appendValueFromRange(base: string, model: IModel, range: Range): string { - var result = base; - if (result !== '') { - result += model.getEOL(); - } - return result + model.getValueInRange(range); -} - -/** - * Applies a list of changes to the original model and returns the new IModel. - * First sorts changes by line number. - */ -export function applyChangesToModel(original: IModel, modified: IModel, changes: IChange[]): string { - sortChanges(changes); - var result = ''; - var positionInOriginal = 1; - - for (var i = 0; i < changes.length; ++i) { - // We have to update orginalStartLineNumber for insertions, their start line is always one line behind. - var originalStartLineUpdated = isInsertion(changes[i]) ? changes[i].originalStartLineNumber + 1 : changes[i].originalStartLineNumber; - if (positionInOriginal < originalStartLineUpdated) { - result = appendValueFromRange(result, original, - new Range(positionInOriginal, 1, originalStartLineUpdated - 1, original.getLineMaxColumn(originalStartLineUpdated - 1))); - positionInOriginal = originalStartLineUpdated; - } - - if (!isDeletion(changes[i])) { - result = appendValueFromRange(result, modified, - new Range(changes[i].modifiedStartLineNumber, 1, changes[i].modifiedEndLineNumber, modified.getLineMaxColumn(changes[i].modifiedEndLineNumber))); - } - // Update position in the original file where we continue to concatanate. - // Only update position if it was not an insertion. - if (!isInsertion(changes[i])) { - positionInOriginal = changes[i].originalEndLineNumber + 1; - } - } - - // Append the last chunk after all the changes. - if (positionInOriginal <= original.getLineCount()) { - result = appendValueFromRange(result, original, - new Range(positionInOriginal, 1, original.getLineCount(), original.getLineMaxColumn(original.getLineCount()))); - } - - return result; -} - -export function getChangeRevertEdits(original: IModel, modified: IModel, changes: SelectedChange[]): IIdentifiedSingleEditOperation[] { - sortChanges(changes); - - const getDeleteOperation = (change: IChange) => { - const fullRange = getLinesRangeWithOneSurroundingNewline(modified, change.modifiedStartLineNumber, change.modifiedEndLineNumber); - return EditOperation.delete(fullRange); - }; - - return changes.map((change, i) => { - if (isInsertion(change)) { - // Delete inserted range - return getDeleteOperation(change); - } else if (isDeletion(change)) { - // Get the original lines and insert at the deleted position - const value = original.getValueInRange(getLinesRangeWithOneSurroundingNewline(original, change.originalStartLineNumber, change.originalEndLineNumber)); - return EditOperation.insert(new Position(change.modifiedStartLineNumber + 1, 1), value); - } else if (change.isCompletelySelected) { - // If the entire change is selected, then revert the whole thing. - const value = original.getValueInRange(new Range(change.originalStartLineNumber, 1, change.originalEndLineNumber + 1, 1)); - return EditOperation.replace(new Range(change.modifiedStartLineNumber, 1, change.modifiedEndLineNumber + 1, 1), value); - } else { - // If only a portion is selected, replace with the matching lines - e.g. if lines 2-4 are selected, replace with lines 2-4 from the original model (if they exist) - const copyOffset = change.modifiedStartLineNumber - change.fullModifiedStartLineNumber; - const numLinesToCopy = change.modifiedEndLineNumber - change.modifiedStartLineNumber; - const copyStartLine = change.originalStartLineNumber + copyOffset; - const copyEndLine = Math.min(copyStartLine + numLinesToCopy, original.getLineCount()); - if (copyStartLine > copyEndLine) { - return getDeleteOperation(change); - } - - // Compute the range to copy, and intersect with the full original range to validate - const originalRange = new Range(change.originalStartLineNumber, 1, change.originalEndLineNumber, original.getLineMaxColumn(change.originalEndLineNumber)); - const rangeToCopy = originalRange.intersectRanges( - new Range(copyStartLine, 1, copyEndLine, original.getLineMaxColumn(copyEndLine))); - - // No intersection, so delete the added text - if (!rangeToCopy) { - return getDeleteOperation(change); - } - - const value = original.getValueInRange(rangeToCopy); - return EditOperation.replace(new Range(change.modifiedStartLineNumber, 1, change.modifiedEndLineNumber, modified.getLineMaxColumn(change.modifiedEndLineNumber)), value); - } - }); -} - -function getLinesRangeWithOneSurroundingNewline(model: IModel, startLine: number, endLine: number): Range { - let startColumn = 1; - let endColumn = model.getLineMaxColumn(endLine); - if (endLine < model.getLineCount()) { - endLine++; - endColumn = 1; - } else if (startLine > 1) { - startLine--; - startColumn = model.getLineMaxColumn(startLine); - } - - return new Range(startLine, startColumn, endLine, endColumn); -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/electron-browser/electronGitService.ts b/src/vs/workbench/parts/git/electron-browser/electronGitService.ts deleted file mode 100644 index 3f6390c51ca..00000000000 --- a/src/vs/workbench/parts/git/electron-browser/electronGitService.ts +++ /dev/null @@ -1,235 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { TPromise } from 'vs/base/common/winjs.base'; -import { IRawGitService, RawServiceState, IGitConfiguration } from 'vs/workbench/parts/git/common/git'; -import { UnscopedGitService } from 'vs/workbench/parts/git/node/unscopedGitService'; -import { GitService } from 'vs/workbench/parts/git/browser/gitServices'; -import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; -import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { IOutputService } from 'vs/workbench/parts/output/common/output'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IMessageService } from 'vs/platform/message/common/message'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { getDelayedChannel, getNextTickChannel } from 'vs/base/parts/ipc/common/ipc'; -import { Client } from 'vs/base/parts/ipc/node/ipc.cp'; -import { GitChannelClient, UnavailableGitChannel } from 'vs/workbench/parts/git/common/gitIpc'; -import { RawGitService, DelayedRawGitService } from 'vs/workbench/parts/git/node/rawGitService'; -import URI from 'vs/base/common/uri'; -import { spawn, exec } from 'child_process'; -import { join } from 'path'; -import { IStorageService } from 'vs/platform/storage/common/storage'; -import { readdir } from 'vs/base/node/pfs'; -import { IFileService } from 'vs/platform/files/common/files'; - -interface IGit { - path: string; - version: string; -} - -function parseVersion(raw: string): string { - return raw.replace(/^git version /, ''); -} - -function findSpecificGit(path: string): TPromise { - return new TPromise((c, e) => { - const buffers: Buffer[] = []; - const child = spawn(path, ['--version']); - child.stdout.on('data', b => buffers.push(b as Buffer)); - child.on('error', e); - child.on('exit', code => code ? e(new Error('Not found')) : c({ path, version: parseVersion(Buffer.concat(buffers).toString('utf8').trim()) })); - }); -} - -function findGitDarwin(): TPromise { - return new TPromise((c, e) => { - exec('which git', (err, gitPathBuffer) => { - if (err) { - return e('git not found'); - } - - const path = gitPathBuffer.toString().replace(/^\s+|\s+$/g, ''); - - function getVersion(path: string) { - // make sure git executes - exec('git --version', (err, stdout: Buffer) => { - if (err) { - return e('git not found'); - } - - return c({ path, version: parseVersion(stdout.toString('utf8').trim()) }); - }); - } - - if (path !== '/usr/bin/git') { - return getVersion(path); - } - - // must check if XCode is installed - exec('xcode-select -p', (err: any) => { - if (err && err.code === 2) { - // git is not installed, and launching /usr/bin/git - // will prompt the user to install it - - return e('git not found'); - } - - getVersion(path); - }); - }); - }); -} - -function findSystemGitWin32(base: string): TPromise { - if (!base) { - return TPromise.wrapError('Not found'); - } - - return findSpecificGit(join(base, 'Git', 'cmd', 'git.exe')); -} - -function findGitHubGitWin32(): TPromise { - const github = join(process.env['LOCALAPPDATA'], 'GitHub'); - - return readdir(github).then(children => { - const git = children.filter(child => /^PortableGit/.test(child))[0]; - - if (!git) { - return TPromise.wrapError('Not found'); - } - - return findSpecificGit(join(github, git, 'cmd', 'git.exe')); - }); -} - -function findGitWin32(): TPromise { - return findSystemGitWin32(process.env['ProgramW6432']) - .then(null, () => findSystemGitWin32(process.env['ProgramFiles(x86)'])) - .then(null, () => findSystemGitWin32(process.env['ProgramFiles'])) - .then(null, () => findSpecificGit('git')) - .then(null, () => findGitHubGitWin32()); -} - -function findGit(hint: string): TPromise { - var first = hint ? findSpecificGit(hint) : TPromise.wrapError(null); - - return first.then(null, () => { - switch (process.platform) { - case 'darwin': return findGitDarwin(); - case 'win32': return findGitWin32(); - default: return findSpecificGit('git'); - } - }); -} - -class DisabledRawGitService extends RawGitService { - constructor() { - super(null); - } - - serviceState(): TPromise { - return TPromise.as(RawServiceState.Disabled); - } -} - -function createRemoteRawGitService(gitPath: string, execPath: string, workspaceRoot: string, encoding: string, verbose: boolean): IRawGitService { - const promise = TPromise.timeout(0) // free event loop cos finding git costs - .then(() => findGit(gitPath)) - .then(({ path, version }) => { - const client = new Client( - URI.parse(require.toUrl('bootstrap')).fsPath, - { - serverName: 'Git', - timeout: 1000 * 60, - args: [path, workspaceRoot, encoding, execPath, version], - env: { - ELECTRON_RUN_AS_NODE: 1, - PIPE_LOGGING: 'true', - AMD_ENTRYPOINT: 'vs/workbench/parts/git/node/gitApp', - VERBOSE_LOGGING: String(verbose) - } - } - ); - - return client.getChannel('git'); - }) - .then(null, () => new UnavailableGitChannel()); - - const channel = getNextTickChannel(getDelayedChannel(promise)); - return new GitChannelClient(channel); -} - -interface IRawGitServiceBootstrap { - createRawGitService(gitPath: string, workspaceRoot: string, defaultEncoding: string, exePath: string, version: string): TPromise; -} - -function createRawGitService(gitPath: string, execPath: string, workspaceRoot: string, encoding: string, verbose: boolean): IRawGitService { - const requirePromise = new TPromise((c, e) => { - return require(['vs/workbench/parts/git/node/rawGitServiceBootstrap'], c, e); - }); - - const servicePromise = requirePromise.then(({ createRawGitService }) => { - return findGit(gitPath) - .then(({ path, version }) => createRawGitService(path, workspaceRoot, encoding, execPath, version)) - .then(null, () => new RawGitService(null)); - }); - - return new DelayedRawGitService(servicePromise); -} - -function createUnscopedRawGitService(gitPath: string, execPath: string, encoding: string): IRawGitService { - const promise = findGit(gitPath) - .then(({ path, version }) => new UnscopedGitService(path, version, encoding, execPath)) - .then(null, () => new RawGitService(null)); - - return new DelayedRawGitService(promise); -} - -export class ElectronGitService extends GitService { - - private static USE_REMOTE_PROCESS_SERVICE = true; - - constructor( - @IInstantiationService instantiationService: IInstantiationService, - @IFileService fileService: IFileService, - @IMessageService messageService: IMessageService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService, - @IOutputService outputService: IOutputService, - @ITextFileService textFileService: ITextFileService, - @IWorkspaceContextService contextService: IWorkspaceContextService, - @ILifecycleService lifecycleService: ILifecycleService, - @IStorageService storageService: IStorageService, - @IEnvironmentService environmentService: IEnvironmentService, - @IConfigurationService configurationService: IConfigurationService - ) { - const conf = configurationService.getConfiguration('git'); - const filesConf = configurationService.getConfiguration('files'); - const workspace = contextService.getWorkspace(); - const gitPath = conf.path || null; - const encoding = (filesConf && filesConf.encoding) || 'utf8'; - const verbose = !environmentService.isBuilt || environmentService.verbose; - - let raw: IRawGitService; - - if (!conf.enabled) { - raw = new DisabledRawGitService(); - } else if (!workspace) { - raw = createUnscopedRawGitService(gitPath, environmentService.execPath, encoding); - } else { - const workspaceRoot = workspace.resource.fsPath; - - if (ElectronGitService.USE_REMOTE_PROCESS_SERVICE) { - raw = createRemoteRawGitService(gitPath, environmentService.execPath, workspaceRoot, encoding, verbose); - } else { - raw = createRawGitService(gitPath, environmentService.execPath, workspaceRoot, encoding, verbose); - } - } - - super(raw, instantiationService, fileService, messageService, editorService, outputService, textFileService, contextService, lifecycleService, storageService, configurationService); - } -} diff --git a/src/vs/workbench/parts/git/electron-browser/git.contribution.ts b/src/vs/workbench/parts/git/electron-browser/git.contribution.ts deleted file mode 100644 index 93c3bdb17f3..00000000000 --- a/src/vs/workbench/parts/git/electron-browser/git.contribution.ts +++ /dev/null @@ -1,44 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { localize } from 'vs/nls'; -import { registerContributions } from 'vs/workbench/parts/git/browser/gitWorkbenchContributions'; -import { ElectronGitService } from 'vs/workbench/parts/git/electron-browser/electronGitService'; -import { IGitService } from 'vs/workbench/parts/git/common/git'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; -import { Registry } from 'vs/platform/platform'; -import { CloneAction } from './gitActions'; -import { IWorkbenchActionRegistry, Extensions as WorkbenchActionExtensions } from 'vs/workbench/common/actionRegistry'; -import SCMPreview from 'vs/workbench/parts/scm/browser/scmPreview'; -import { ToggleViewletAction } from 'vs/workbench/browser/viewlet'; -import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; - -// TODO@joao: remove -class OpenScmViewletAction extends ToggleViewletAction { - - static ID = 'workbench.view.git'; // fake redirect - static LABEL = localize('toggleSCMViewlet', "Show SCM"); - - constructor(id: string, label: string, @IViewletService viewletService: IViewletService, @IWorkbenchEditorService editorService: IWorkbenchEditorService) { - super(id, label, 'workbench.view.scm', viewletService, editorService); - } -} - -if (SCMPreview.enabled) { - Registry.as(WorkbenchActionExtensions.WorkbenchActions) - .registerWorkbenchAction(new SyncActionDescriptor(OpenScmViewletAction, OpenScmViewletAction.ID, OpenScmViewletAction.LABEL), 'View: Show SCM', 'View'); -} else { - registerContributions(); - - // Register Service - registerSingleton(IGitService, ElectronGitService); - - const category = localize('git', "Git"); - - Registry.as(WorkbenchActionExtensions.WorkbenchActions) - .registerWorkbenchAction(new SyncActionDescriptor(CloneAction, CloneAction.ID, CloneAction.LABEL), 'Git: Clone', category); -} diff --git a/src/vs/workbench/parts/git/electron-browser/gitActions.ts b/src/vs/workbench/parts/git/electron-browser/gitActions.ts deleted file mode 100644 index b168acb47bd..00000000000 --- a/src/vs/workbench/parts/git/electron-browser/gitActions.ts +++ /dev/null @@ -1,92 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { localize } from 'vs/nls'; -import { TPromise } from 'vs/base/common/winjs.base'; -import { always } from 'vs/base/common/async'; -import { Action } from 'vs/base/common/actions'; -import { IMessageService } from 'vs/platform/message/common/message'; -import { IWindowsService } from 'vs/platform/windows/common/windows'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import Severity from 'vs/base/common/severity'; -import { IGitService } from 'vs/workbench/parts/git/common/git'; -import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; -import * as url from 'url'; -import { remote } from 'electron'; -import { ITelemetryService, ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; -import { isPromiseCanceledError } from 'vs/base/common/errors'; - -const dialog = remote.dialog; - -export class CloneAction extends Action { - - static ID = 'workbench.action.git.clone'; - static LABEL = 'Clone'; - - constructor(id: string, label: string, - @IGitService private gitService: IGitService, - @IQuickOpenService private quickOpenService: IQuickOpenService, - @IMessageService private messageService: IMessageService, - @IWindowsService private windowsService: IWindowsService, - @ITelemetryService private telemetryService: ITelemetryService, - @IWorkspaceContextService private workspaceService: IWorkspaceContextService - ) { - super(id, label); - } - - run(event?: any, data?: ITelemetryData): TPromise { - return this.quickOpenService.input({ - prompt: localize('valid', "Provide a valid git repository URL"), - placeHolder: localize('url', "Repository URL"), - validateInput: input => { - const parsedUrl = url.parse(input); - - if (!parsedUrl.protocol || !parsedUrl.host) { - return TPromise.as(localize('valid', "Provide a valid git repository URL")); - } - - return TPromise.as(''); - } - }) - .then(url => { - if (!url) { - this.telemetryService.publicLog('gitClone', { ...data, outcome: 'no_URL' }); - return TPromise.as(null); - } - - const result = dialog.showOpenDialog(remote.getCurrentWindow(), { - title: localize('directory', "Destination clone directory"), - properties: ['openDirectory', 'createDirectory'] - }); - - if (!result || result.length === 0) { - this.telemetryService.publicLog('gitClone', { ...data, outcome: 'no_directory' }); - return TPromise.as(null); - } - - const promise = TPromise.timeout(200) - .then(() => this.messageService.show(Severity.Info, localize('cloning', "Cloning repository '{0}'...", url))) - .then(close => new TPromise(() => null, close)); - - const clone = always(this.gitService.clone(url, result[0]), () => promise.cancel()); - - return clone.then(path => { - this.telemetryService.publicLog('gitClone', { ...data, outcome: 'success' }); - const forceNewWindow = this.workspaceService.hasWorkspace(); - return this.windowsService.openWindow([path], { forceNewWindow, forceReuseWindow: !forceNewWindow }); - - }).then(null, e => { - if (/already exists and is not an empty directory/.test(e.stderr || '')) { - this.telemetryService.publicLog('gitClone', { ...data, outcome: 'directory_not_empty' }); - return TPromise.wrapError(localize('already exists', "Destination repository already exists, please pick another directory to clone to.")); - } - - this.telemetryService.publicLog('gitClone', { ...data, outcome: isPromiseCanceledError(e) ? 'canceled' : 'error' }); - return TPromise.wrapError(e); - }); - }); - } -} diff --git a/src/vs/workbench/parts/git/electron-main/askpassService.ts b/src/vs/workbench/parts/git/electron-main/askpassService.ts deleted file mode 100644 index dbe43c01379..00000000000 --- a/src/vs/workbench/parts/git/electron-main/askpassService.ts +++ /dev/null @@ -1,75 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as nls from 'vs/nls'; -import { ipcMain as ipc, BrowserWindow } from 'electron'; -import platform = require('vs/base/common/platform'); -import { TPromise } from 'vs/base/common/winjs.base'; -import { IAskpassService } from 'vs/workbench/parts/git/common/git'; - -export interface ICredentials { - username: string; - password: string; -} - -interface ICredentialsResult { - id: number; - credentials: ICredentials; -} - -interface IContext { - credentials: ICredentials; - window: Electron.BrowserWindow; -} - -export class GitAskpassService implements IAskpassService { - - private askpassCache: { [id: string]: IContext } = Object.create(null); - - constructor() { - ipc.on('git:askpass', (event, result: ICredentialsResult) => { - this.askpassCache[result.id].credentials = result.credentials; - }); - } - - public askpass(id: string, host: string, command: string): TPromise { - return new TPromise((c, e) => { - let cachedResult = this.askpassCache[id]; - - if (typeof cachedResult !== 'undefined') { - return c(cachedResult.credentials); - } - - if (command === 'fetch') { - return c({ username: '', password: '' }); - } - - let win = new BrowserWindow({ - alwaysOnTop: true, - skipTaskbar: true, - resizable: false, - width: 450, - height: platform.isWindows ? 280 : 260, - show: true, - title: nls.localize('git', "Git") - }); - - win.setMenuBarVisibility(false); - - this.askpassCache[id] = { - window: win, - credentials: null - }; - - win.loadURL(require.toUrl('vs/workbench/parts/git/electron-main/index.html')); - win.webContents.executeJavaScript('init(' + JSON.stringify({ id, host, command }) + ')'); - - win.once('closed', () => { - c(this.askpassCache[id].credentials); - setTimeout(() => delete this.askpassCache[id], 1000 * 10); - }); - }); - } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/electron-main/git.svg b/src/vs/workbench/parts/git/electron-main/git.svg deleted file mode 100644 index dfd62bc16c6..00000000000 --- a/src/vs/workbench/parts/git/electron-main/git.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/vs/workbench/parts/git/electron-main/index.html b/src/vs/workbench/parts/git/electron-main/index.html deleted file mode 100644 index 3ae54ce146c..00000000000 --- a/src/vs/workbench/parts/git/electron-main/index.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - - -

Authentication Required

-
-

-
-

-

-

- - -

-
-
- -
- - diff --git a/src/vs/workbench/parts/git/node/askpass.sh b/src/vs/workbench/parts/git/node/askpass.sh deleted file mode 100755 index 2f30f91ef9a..00000000000 --- a/src/vs/workbench/parts/git/node/askpass.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -VSCODE_GIT_ASKPASS_PIPE=`mktemp` -AMD_ENTRYPOINT="$VSCODE_GIT_ASKPASS_MODULE_ID" VSCODE_GIT_ASKPASS_PIPE="$VSCODE_GIT_ASKPASS_PIPE" "$VSCODE_GIT_ASKPASS_NODE" "$VSCODE_GIT_ASKPASS_BOOTSTRAP" $* -cat $VSCODE_GIT_ASKPASS_PIPE -rm $VSCODE_GIT_ASKPASS_PIPE \ No newline at end of file diff --git a/src/vs/workbench/parts/git/node/askpass.ts b/src/vs/workbench/parts/git/node/askpass.ts deleted file mode 100644 index f2b45f8f1b6..00000000000 --- a/src/vs/workbench/parts/git/node/askpass.ts +++ /dev/null @@ -1,58 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import { connect } from 'vs/base/parts/ipc/node/ipc.net'; -import { IAskpassChannel, AskpassChannelClient } from 'vs/workbench/parts/git/common/gitIpc'; -import * as fs from 'fs'; - -function fatal(err: any): void { - console.error(err); - process.exit(1); -} - -function main(argv: string[]): void { - if (argv.length !== 5) { - return fatal('Wrong number of arguments'); - } - - if (!process.env['VSCODE_IPC_HOOK']) { - return fatal('Missing ipc hook'); - } - - if (!process.env['VSCODE_GIT_REQUEST_ID']) { - return fatal('Missing git id'); - } - - if (!process.env['VSCODE_GIT_ASKPASS_PIPE']) { - return fatal('Missing pipe'); - } - - var id = process.env['VSCODE_GIT_REQUEST_ID']; - var output = process.env['VSCODE_GIT_ASKPASS_PIPE']; - var request = argv[2]; - var host = argv[4].substring(1, argv[4].length - 2); - - connect(process.env['VSCODE_IPC_HOOK'], 'askpass') - .then(client => { - const channel = client.getChannel('askpass'); - const service = new AskpassChannelClient(channel); - - return service.askpass(id, host, process.env['MONACO_GIT_COMMAND']).then(result => { - if (result) { - fs.writeFileSync(output, (/^Username$/i.test(request) ? result.username : result.password) + '\n'); - } - - return client; - }); - }) - .done(c => { - c.dispose(); - setTimeout(() => process.exit(0), 0); - }); -} - -main(process.argv); diff --git a/src/vs/workbench/parts/git/node/git.lib.ts b/src/vs/workbench/parts/git/node/git.lib.ts deleted file mode 100644 index 98fdbd0c5d4..00000000000 --- a/src/vs/workbench/parts/git/node/git.lib.ts +++ /dev/null @@ -1,735 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as os from 'os'; -import * as path from 'path'; -import { Promise, TPromise } from 'vs/base/common/winjs.base'; -import * as pfs from 'vs/base/node/pfs'; -import { guessMimeTypes, isBinaryMime } from 'vs/base/common/mime'; -import { IDisposable, toDisposable, dispose } from 'vs/base/common/lifecycle'; -import { assign } from 'vs/base/common/objects'; -import { sequence } from 'vs/base/common/async'; -import { v4 as UUIDv4 } from 'vs/base/common/uuid'; -import { localize } from 'vs/nls'; -import { uniqueFilter, index } from 'vs/base/common/arrays'; -import { IRawFileStatus, RefType, IRef, IBranch, IRemote, GitErrorCodes, IPushOptions } from 'vs/workbench/parts/git/common/git'; -import { detectMimesFromStream } from 'vs/base/node/mime'; -import { IFileOperationResult, FileOperationResult } from 'vs/platform/files/common/files'; -import { spawn, ChildProcess } from 'child_process'; -import { decode, encodingExists } from 'vs/base/node/encoding'; - -export interface IExecutionResult { - exitCode: number; - stdout: string; - stderr: string; -} - -function exec(child: ChildProcess, encoding = 'utf8'): TPromise { - const disposables: IDisposable[] = []; - - const once = (ee: NodeJS.EventEmitter, name: string, fn: Function) => { - ee.once(name, fn); - disposables.push(toDisposable(() => ee.removeListener(name, fn))); - }; - - const on = (ee: NodeJS.EventEmitter, name: string, fn: Function) => { - ee.on(name, fn); - disposables.push(toDisposable(() => ee.removeListener(name, fn))); - }; - - return TPromise.join([ - new TPromise((c, e) => { - once(child, 'error', e); - once(child, 'exit', c); - }), - new TPromise(c => { - let buffers: Buffer[] = []; - on(child.stdout, 'data', b => buffers.push(b)); - once(child.stdout, 'close', () => c(decode(Buffer.concat(buffers), encoding))); - }), - new TPromise(c => { - let buffers: Buffer[] = []; - on(child.stderr, 'data', b => buffers.push(b)); - once(child.stderr, 'close', () => c(decode(Buffer.concat(buffers), encoding))); - }) - ]).then(values => { - dispose(disposables); - - return { - exitCode: values[0], - stdout: values[1], - stderr: values[2] - }; - }); -} - -export interface IGitErrorData { - error?: Error; - message?: string; - stdout?: string; - stderr?: string; - exitCode?: number; - gitErrorCode?: string; - gitCommand?: string; -} - -export class GitError { - - error: Error; - message: string; - stdout: string; - stderr: string; - exitCode: number; - gitErrorCode: string; - gitCommand: string; - - constructor(data: IGitErrorData) { - if (data.error) { - this.error = data.error; - this.message = data.error.message; - } else { - this.error = null; - } - - this.message = this.message || data.message || 'Git error'; - this.stdout = data.stdout || null; - this.stderr = data.stderr || null; - this.exitCode = data.exitCode || null; - this.gitErrorCode = data.gitErrorCode || null; - this.gitCommand = data.gitCommand || null; - } - - toString(): string { - let result = this.message + ' ' + JSON.stringify({ - exitCode: this.exitCode, - gitErrorCode: this.gitErrorCode, - gitCommand: this.gitCommand, - stdout: this.stdout, - stderr: this.stderr - }, null, 2); - - if (this.error) { - result += (this.error).stack; - } - - return result; - } -} - -export interface IGitOptions { - gitPath: string; - version: string; - defaultEncoding?: string; - env?: any; -} - -export class Git { - - private gitPath: string; - private _version: string; - private env: any; - private defaultEncoding: string; - private outputListeners: { (output: string): void; }[]; - - constructor(options: IGitOptions) { - this.gitPath = options.gitPath; - this._version = options.version; - - const encoding = options.defaultEncoding || 'utf8'; - this.defaultEncoding = encodingExists(encoding) ? encoding : 'utf8'; - - this.env = options.env || {}; - this.outputListeners = []; - } - - get version(): string { - return this._version; - } - - run(cwd: string, args: string[], options: any = {}): TPromise { - options = assign({ cwd: cwd }, options || {}); - return this.exec(args, options); - } - - stream(cwd: string, args: string[], options: any = {}): ChildProcess { - options = assign({ cwd: cwd }, options || {}); - return this.spawn(args, options); - } - - open(repository: string, env: any = {}): Repository { - return new Repository(this, repository, this.defaultEncoding, env); - } - - clone(url: string, parentPath: string): TPromise { - const folderName = url.replace(/^.*\//, '').replace(/\.git$/, '') || 'repository'; - const folderPath = path.join(parentPath, folderName); - - return this.exec(['clone', url, folderPath]) - .then(() => folderPath); - } - - config(name: string, value: string): Promise { - return this.exec(['config', '--global', name, value]); - } - - private exec(args: string[], options: any = {}): TPromise { - const child = this.spawn(args, options); - - if (options.input) { - child.stdin.end(options.input, 'utf8'); - } - - return exec(child).then(result => { - if (result.exitCode) { - let gitErrorCode: string = null; - - if (/Authentication failed/.test(result.stderr)) { - gitErrorCode = GitErrorCodes.AuthenticationFailed; - } else if (/Not a git repository/.test(result.stderr)) { - gitErrorCode = GitErrorCodes.NotAGitRepository; - } else if (/bad config file/.test(result.stderr)) { - gitErrorCode = GitErrorCodes.BadConfigFile; - } else if (/cannot make pipe for command substitution|cannot create standard input pipe/.test(result.stderr)) { - gitErrorCode = GitErrorCodes.CantCreatePipe; - } else if (/Repository not found/.test(result.stderr)) { - gitErrorCode = GitErrorCodes.RepositoryNotFound; - } else if (/unable to access/.test(result.stderr)) { - gitErrorCode = GitErrorCodes.CantAccessRemote; - } - - if (options.log !== false) { - this.log(result.stderr); - } - - return TPromise.wrapError(new GitError({ - message: 'Failed to execute git', - stdout: result.stdout, - stderr: result.stderr, - exitCode: result.exitCode, - gitErrorCode, - gitCommand: args[0] - })); - } - - return result; - }); - } - - spawn(args: string[], options: any = {}): ChildProcess { - if (!this.gitPath) { - throw new Error('git could not be found in the system.'); - } - - if (!options) { - options = {}; - } - - if (!options.stdio && !options.input) { - options.stdio = ['ignore', null, null]; // Unless provided, ignore stdin and leave default streams for stdout and stderr - } - - options.env = assign({}, options.env || {}, this.env, { - LANG: 'en_US.UTF-8', - VSCODE_GIT_REQUEST_ID: UUIDv4().asHex(), - MONACO_GIT_COMMAND: args[0] - }); - - if (options.log !== false) { - this.log(`git ${args.join(' ')}\n`); - } - - return spawn(this.gitPath, args, options); - } - - onOutput(listener: (output: string) => void): () => void { - this.outputListeners.push(listener); - return () => this.outputListeners.splice(this.outputListeners.indexOf(listener), 1); - } - - private log(output: string): void { - this.outputListeners.forEach(l => l(output)); - } -} - -export interface ICommit { - hash: string; - message: string; -} - -export class Repository { - - constructor( - private _git: Git, - private repository: string, - private defaultEncoding: string, - private env: any = {} - ) { } - - get git(): Git { - return this._git; - } - - get path(): string { - return this.repository; - } - - run(args: string[], options: any = {}): TPromise { - options.env = assign({}, options.env || {}); - options.env = assign(options.env, this.env); - - return this.git.run(this.repository, args, options); - } - - stream(args: string[], options: any = {}): ChildProcess { - options.env = assign({}, options.env || {}); - options.env = assign(options.env, this.env); - - return this.git.stream(this.repository, args, options); - } - - spawn(args: string[], options: any = {}): ChildProcess { - options.env = assign({}, options.env || {}); - options.env = assign(options.env, this.env); - - return this.git.spawn(args, options); - } - - init(): Promise { - return this.run(['init']); - } - - config(scope: string, key: string, value: any, options: any): TPromise { - const args = ['config']; - - if (scope) { - args.push('--' + scope); - } - - args.push(key); - - if (value) { - args.push(value); - } - - return this.run(args, options).then((result) => result.stdout); - } - - show(object: string): ChildProcess { - return this.stream(['show', object]); - } - - buffer(object: string): TPromise { - const child = this.show(object); - - if (!child.stdout) { - return TPromise.wrapError(localize('errorBuffer', "Can't open file from git")); - } - - return detectMimesFromStream(child.stdout, null).then(result => { - return isBinaryMime(result.mimes) ? - TPromise.wrapError({ - message: localize('fileBinaryError', "File seems to be binary and cannot be opened as text"), - fileOperationResult: FileOperationResult.FILE_IS_BINARY - }) : - this.doBuffer(object); - }); - } - - private doBuffer(object: string): TPromise { - const child = this.show(object); - - return exec(child, this.defaultEncoding).then(({ exitCode, stdout }) => { - if (exitCode) { - return TPromise.wrapError(new GitError({ - message: 'Could not buffer object.', - exitCode - })); - } - - return TPromise.as(stdout); - }); - } - - add(paths: string[]): Promise { - const args = ['add', '-A', '--']; - - if (paths && paths.length) { - args.push.apply(args, paths); - } else { - args.push('.'); - } - - return this.run(args); - } - - stage(path: string, data: string): Promise { - const child = this.stream(['hash-object', '--stdin', '-w'], { stdio: [null, null, null] }); - child.stdin.end(data, 'utf8'); - - return exec(child).then(({ exitCode, stdout }) => { - if (exitCode) { - return TPromise.wrapError(new GitError({ - message: 'Could not hash object.', - exitCode: exitCode - })); - } - - return this.run(['update-index', '--cacheinfo', '100644', stdout, path]); - }); - } - - checkout(treeish: string, paths: string[]): Promise { - const args = ['checkout', '-q']; - - if (treeish) { - args.push(treeish); - } - - if (paths && paths.length) { - args.push('--'); - args.push.apply(args, paths); - } - - return this.run(args).then(null, (err: GitError) => { - if (/Please, commit your changes or stash them/.test(err.stderr)) { - err.gitErrorCode = GitErrorCodes.DirtyWorkTree; - } - - return Promise.wrapError(err); - }); - } - - commit(message: string, all: boolean, amend: boolean, signoff: boolean): Promise { - const args = ['commit', '--quiet', '--allow-empty-message', '--file', '-']; - - if (all) { - args.push('--all'); - } - - if (amend) { - args.push('--amend'); - } - - if (signoff) { - args.push('--signoff'); - } - - return this.run(args, { input: message || '' }).then(null, (commitErr: GitError) => { - if (/not possible because you have unmerged files/.test(commitErr.stderr)) { - commitErr.gitErrorCode = GitErrorCodes.UnmergedChanges; - return Promise.wrapError(commitErr); - } - - return this.run(['config', '--get-all', 'user.name']).then(null, (err: GitError) => { - err.gitErrorCode = GitErrorCodes.NoUserNameConfigured; - return Promise.wrapError(err); - }).then(() => { - return this.run(['config', '--get-all', 'user.email']).then(null, (err: GitError) => { - err.gitErrorCode = GitErrorCodes.NoUserEmailConfigured; - return Promise.wrapError(err); - }).then(() => { - return Promise.wrapError(commitErr); - }); - }); - }); - } - - branch(name: string, checkout: boolean): Promise { - const args = checkout ? ['checkout', '-q', '-b', name] : ['branch', '-q', name]; - return this.run(args); - } - - clean(paths: string[]): Promise { - const byDirname = index(paths, p => path.dirname(p), (p, r) => (r || []).concat([p])); - const groups = Object.keys(byDirname).map(key => byDirname[key]); - const tasks = groups.map(group => () => this.run(['clean', '-f', '-q', '--'].concat(group))); - - return sequence(tasks); - } - - undo(): Promise { - return this.run(['clean', '-fd']).then(() => { - return this.run(['checkout', '--', '.']).then(null, (err: GitError) => { - if (/did not match any file\(s\) known to git\./.test(err.stderr)) { - return TPromise.as(null); - } - - return Promise.wrapError(err); - }); - }); - } - - reset(treeish: string, hard: boolean = false): Promise { - const args = ['reset']; - - if (hard) { - args.push('--hard'); - } - - args.push(treeish); - - return this.run(args); - } - - revertFiles(treeish: string, paths: string[]): Promise { - return this.run(['branch']).then((result) => { - let args: string[]; - - // In case there are no branches, we must use rm --cached - if (!result.stdout) { - args = ['rm', '--cached', '-r', '--']; - } else { - args = ['reset', '-q', treeish, '--']; - } - - if (paths && paths.length) { - args.push.apply(args, paths); - } else { - args.push('.'); - } - - return this.run(args).then(null, (err: GitError) => { - // In case there are merge conflicts to be resolved, git reset will output - // some "needs merge" data. We try to get around that. - if (/([^:]+: needs merge\n)+/m.test(err.stdout)) { - return TPromise.as(null); - } - - return Promise.wrapError(err); - }); - }); - } - - fetch(): Promise { - return this.run(['fetch']).then(null, (err: GitError) => { - if (/No remote repository specified\./.test(err.stderr)) { - err.gitErrorCode = GitErrorCodes.NoRemoteRepositorySpecified; - } else if (/Could not read from remote repository/.test(err.stderr)) { - err.gitErrorCode = GitErrorCodes.RemoteConnectionError; - } - - return Promise.wrapError(err); - }); - } - - pull(rebase?: boolean): Promise { - const args = ['pull']; - if (rebase) { args.push('-r'); } - - return this.run(args).then(null, (err: GitError) => { - if (/^CONFLICT \([^)]+\): \b/m.test(err.stdout)) { - err.gitErrorCode = GitErrorCodes.Conflict; - } else if (/Please tell me who you are\./.test(err.stderr)) { - err.gitErrorCode = GitErrorCodes.NoUserNameConfigured; - } else if (/Could not read from remote repository/.test(err.stderr)) { - err.gitErrorCode = GitErrorCodes.RemoteConnectionError; - } else if (/Pull is not possible because you have unmerged files|Cannot pull with rebase: You have unstaged changes|Your local changes to the following files would be overwritten|Please, commit your changes before you can merge/.test(err.stderr)) { - err.gitErrorCode = GitErrorCodes.DirtyWorkTree; - } - - return Promise.wrapError(err); - }); - } - - push(remote?: string, name?: string, options?: IPushOptions): Promise { - const args = ['push']; - if (options && options.setUpstream) { args.push('-u'); } - if (remote) { args.push(remote); } - if (name) { args.push(name); } - - return this.run(args).then(null, (err: GitError) => { - if (/^error: failed to push some refs to\b/m.test(err.stderr)) { - err.gitErrorCode = GitErrorCodes.PushRejected; - } else if (/Could not read from remote repository/.test(err.stderr)) { - err.gitErrorCode = GitErrorCodes.RemoteConnectionError; - } - - return Promise.wrapError(err); - }); - } - - sync(): Promise { - return this.pull().then(() => this.push()); - } - - getRoot(): TPromise { - return this.run(['rev-parse', '--show-toplevel'], { log: false }).then(result => result.stdout.trim()); - } - - getStatus(): TPromise { - return this.run(['status', '-z', '-u'], { log: false }).then((executionResult) => { - const status = executionResult.stdout; - const result: IRawFileStatus[] = []; - let current: IRawFileStatus; - let i = 0; - - function readName(): string { - const start = i; - let c: string; - while ((c = status.charAt(i)) !== '\u0000') { i++; } - return status.substring(start, i++); - } - - while (i < status.length) { - current = { - x: status.charAt(i++), - y: status.charAt(i++), - path: null, - mimetype: null - }; - - i++; - - if (current.x === 'R') { - current.rename = readName(); - } - - current.path = readName(); - current.mimetype = guessMimeTypes(current.path)[0]; - - // If path ends with slash, it must be a nested git repo - if (current.path[current.path.length - 1] === '/') { - continue; - } - - result.push(current); - } - - return TPromise.as(result); - }); - } - - getHEAD(): TPromise { - return this.run(['symbolic-ref', '--short', 'HEAD'], { log: false }).then((result) => { - if (!result.stdout) { - return TPromise.wrapError(new Error('Not in a branch')); - } - - return TPromise.as({ name: result.stdout.trim(), commit: void 0, type: RefType.Head }); - }, (err) => { - return this.run(['rev-parse', 'HEAD'], { log: false }).then((result) => { - if (!result.stdout) { - return TPromise.wrapError(new Error('Error parsing HEAD')); - } - - return TPromise.as({ name: void 0, commit: result.stdout.trim(), type: RefType.Head }); - }); - }); - } - - getRefs(): TPromise { - return this.run(['for-each-ref', '--format', '%(refname) %(objectname)'], { log: false }).then(result => { - return result.stdout.trim().split('\n') - .filter(line => !!line) - .map(line => { - let match: RegExpExecArray; - - if (match = /^refs\/heads\/([^ ]+) ([0-9a-f]{40})$/.exec(line)) { - return { name: match[1], commit: match[2], type: RefType.Head }; - } else if (match = /^refs\/remotes\/([^/]+)\/([^ ]+) ([0-9a-f]{40})$/.exec(line)) { - return { name: `${match[1]}/${match[2]}`, commit: match[3], type: RefType.RemoteHead, remote: match[1] }; - } else if (match = /^refs\/tags\/([^ ]+) ([0-9a-f]{40})$/.exec(line)) { - return { name: match[1], commit: match[2], type: RefType.Tag }; - } - - return null; - }) - .filter(ref => !!ref); - }); - } - - getRemotes(): TPromise { - const regex = /^([^\s]+)\s+([^\s]+)\s/; - - return this.run(['remote', '--verbose'], { log: false }) - .then(result => result.stdout - .trim() - .split('\n') - .filter(b => !!b) - .map(line => regex.exec(line)) - .filter(g => !!g) - .map(groups => ({ name: groups[1], url: groups[2] })) - .filter(uniqueFilter<{ name: string; }>(g => g.name)) - ); - } - - getBranch(branch: string): TPromise { - if (branch === 'HEAD') { - return this.getHEAD(); - } - - return this.run(['rev-parse', branch], { log: false }).then((result) => { - if (!result.stdout) { - return TPromise.wrapError(new Error('No such branch')); - } - - const commit = result.stdout.trim(); - - return this.run(['rev-parse', '--symbolic-full-name', '--abbrev-ref', branch + '@{u}'], { log: false }).then((result: IExecutionResult) => { - const upstream = result.stdout.trim(); - - return this.run(['rev-list', '--left-right', branch + '...' + upstream], { log: false }).then((result) => { - let ahead = 0, behind = 0; - let i = 0; - - while (i < result.stdout.length) { - switch (result.stdout.charAt(i)) { - case '<': ahead++; break; - case '>': behind++; break; - default: i++; break; - } - - while (result.stdout.charAt(i++) !== '\n') { /* no-op */ } - } - - return { - name: branch, - commit: commit, - upstream: upstream, - ahead: ahead, - behind: behind - }; - }); - }, () => { - return { name: branch, commit: commit }; - }); - }); - } - - getCommitTemplate(): TPromise { - return this.run(['config', '--get', 'commit.template']).then(result => { - if (!result.stdout) { - return ''; - } - - // https://github.com/git/git/blob/3a0f269e7c82aa3a87323cb7ae04ac5f129f036b/path.c#L612 - const homedir = os.homedir(); - let templatePath = result.stdout.trim() - .replace(/^~([^\/]*)\//, (_, user) => `${user ? path.join(path.dirname(homedir), user) : homedir}/`); - - if (!path.isAbsolute(templatePath)) { - templatePath = path.join(this.repository, templatePath); - } - - return pfs.readFile(templatePath, 'utf8').then(raw => raw.replace(/^\s*#.*$\n?/gm, '').trim()); - }, () => ''); - } - - getCommit(ref: string): TPromise { - return this.run(['show', '-s', '--format=%H\n%B', ref]).then(result => { - const match = /^([0-9a-f]{40})\n([^]*)$/m.exec(result.stdout.trim()); - - if (!match) { - return TPromise.wrapError('bad commit format'); - } - - return { hash: match[1], message: match[2] }; - }); - } - - onOutput(listener: (output: string) => void): () => void { - return this.git.onOutput(listener); - } -} diff --git a/src/vs/workbench/parts/git/node/gitApp.ts b/src/vs/workbench/parts/git/node/gitApp.ts deleted file mode 100644 index 141fa65f2e3..00000000000 --- a/src/vs/workbench/parts/git/node/gitApp.ts +++ /dev/null @@ -1,15 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import { Server } from 'vs/base/parts/ipc/node/ipc.cp'; -import { createRawGitService } from './rawGitServiceBootstrap'; -import { GitChannel } from 'vs/workbench/parts/git/common/gitIpc'; - -const server = new Server(); -const service = createRawGitService(process.argv[2], process.argv[3], process.argv[4], process.argv[5], process.argv[6]); -const channel = new GitChannel(service); -server.registerChannel('git', channel); diff --git a/src/vs/workbench/parts/git/node/rawGitService.ts b/src/vs/workbench/parts/git/node/rawGitService.ts deleted file mode 100644 index 1127fc6daef..00000000000 --- a/src/vs/workbench/parts/git/node/rawGitService.ts +++ /dev/null @@ -1,237 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { join, isAbsolute, relative } from 'path'; -import { TPromise, Promise } from 'vs/base/common/winjs.base'; -import { detectMimesFromFile, detectMimesFromStream } from 'vs/base/node/mime'; -import { realpath, exists } from 'vs/base/node/pfs'; -import { Repository, GitError } from 'vs/workbench/parts/git/node/git.lib'; -import { IRawGitService, RawServiceState, IRawStatus, IRef, GitErrorCodes, IPushOptions, ICommit } from 'vs/workbench/parts/git/common/git'; -import Event, { Emitter, delayed } from 'vs/base/common/event'; - -export class RawGitService implements IRawGitService { - - private repo: Repository; - private _repositoryRoot: TPromise; - private _onOutput: Emitter; - get onOutput(): Event { return this._onOutput.event; } - - constructor(repo: Repository) { - this.repo = repo; - - let listener: () => void; - - this._onOutput = new Emitter({ - onFirstListenerAdd: () => { - listener = this.repo.onOutput(output => this._onOutput.fire(output)); - }, - onLastListenerRemove: () => { - listener(); - listener = null; - } - }); - } - - getVersion(): TPromise { - if (!this.repo) { - return TPromise.as(null); - } - - return TPromise.as(this.repo.git.version); - } - - private getRepositoryRoot(): TPromise { - return this._repositoryRoot || (this._repositoryRoot = realpath(this.repo.path)); - } - - serviceState(): TPromise { - return TPromise.as(this.repo - ? RawServiceState.OK - : RawServiceState.GitNotFound - ); - } - - statusCount(): TPromise { - if (!this.repo) { - return TPromise.as(0); - } - - return this.status().then(r => r ? r.status.length : 0); - } - - status(): TPromise { - return this.repo.getStatus() - .then(status => this.repo.getHEAD() - .then(HEAD => { - if (HEAD.name) { - return this.repo.getBranch(HEAD.name).then(null, () => HEAD); - } else { - return HEAD; - } - }, (): IRef => null) - .then(HEAD => Promise.join([this.getRepositoryRoot(), this.repo.getRefs(), this.repo.getRemotes()]).then(r => { - return { - repositoryRoot: r[0], - status: status, - HEAD: HEAD, - refs: r[1], - remotes: r[2] - }; - }))) - .then(null, (err) => { - if (err.gitErrorCode === GitErrorCodes.BadConfigFile) { - return Promise.wrapError(err); - } else if (err.gitErrorCode === GitErrorCodes.NotAtRepositoryRoot) { - return Promise.wrapError(err); - } - - return null; - }); - } - - init(): TPromise { - return this.repo.init().then(() => this.status()); - } - - add(filePaths?: string[]): TPromise { - return this.repo.add(filePaths).then(() => this.status()); - } - - stage(filePath: string, content: string): TPromise { - return this.repo.stage(filePath, content).then(() => this.status()); - } - - branch(name: string, checkout?: boolean): TPromise { - return this.repo.branch(name, checkout).then(() => this.status()); - } - - checkout(treeish?: string, filePaths?: string[]): TPromise { - return this.repo.checkout(treeish, filePaths).then(() => this.status()); - } - - clean(filePaths: string[]): TPromise { - return this.repo.clean(filePaths).then(() => this.status()); - } - - undo(): TPromise { - return this.repo.undo().then(() => this.status()); - } - - reset(treeish: string, hard?: boolean): TPromise { - return this.repo.reset(treeish, hard).then(() => this.status()); - } - - revertFiles(treeish: string, filePaths?: string[]): TPromise { - return this.repo.revertFiles(treeish, filePaths).then(() => this.status()); - } - - fetch(): TPromise { - return this.repo.fetch().then(null, (err) => { - if (err.gitErrorCode === GitErrorCodes.NoRemoteRepositorySpecified) { - return TPromise.as(null); - } - - return Promise.wrapError(err); - }).then(() => this.status()); - } - - pull(rebase?: boolean): TPromise { - return this.repo.pull(rebase).then(() => this.status()); - } - - push(remote?: string, name?: string, options?: IPushOptions): TPromise { - return this.repo.push(remote, name, options).then(() => this.status()); - } - - sync(): TPromise { - return this.repo.sync().then(() => this.status()); - } - - commit(message: string, amend?: boolean, stage?: boolean, signoff?: boolean): TPromise { - let promise: Promise = TPromise.as(null); - - if (stage) { - promise = this.repo.add(null); - } - - return promise - .then(() => this.repo.commit(message, stage, amend, signoff)) - .then(() => this.status()); - } - - detectMimetypes(filePath: string, treeish?: string): TPromise { - return exists(join(this.repo.path, filePath)).then((exists) => { - if (exists) { - return detectMimesFromFile(join(this.repo.path, filePath)) - .then(result => result.mimes); - } - - const child = this.repo.show(treeish + ':' + filePath); - - return new TPromise((c, e) => - detectMimesFromStream(child.stdout, filePath) - .then(result => result.mimes) - ); - }); - } - - // careful, this buffers the whole object into memory - show(filePath: string, treeish?: string): TPromise { - treeish = (!treeish || treeish === '~') ? '' : treeish; - - if (isAbsolute(filePath)) { - filePath = relative(this.repo.path, filePath).replace(/\\/g, '/'); - } - - return this.repo.buffer(treeish + ':' + filePath).then(null, e => { - if (e instanceof GitError) { - return ''; // mostly untracked files end up in a git error - } - - return TPromise.wrapError(e); - }); - } - - clone(url: string, parentPath: string): TPromise { - return this.repo.git.clone(url, parentPath); - } - - getCommitTemplate(): TPromise { - return this.repo.getCommitTemplate(); - } - - getCommit(ref: string): TPromise { - return this.repo.getCommit(ref); - } -} - -export class DelayedRawGitService implements IRawGitService { - constructor(private raw: TPromise) { } - onOutput: Event = delayed(this.raw.then(r => r.onOutput)); - getVersion(): TPromise { return this.raw.then(r => r.getVersion()); } - serviceState(): TPromise { return this.raw.then(r => r.serviceState()); } - statusCount(): TPromise { return this.raw.then(r => r.statusCount()); } - status(): TPromise { return this.raw.then(r => r.status()); } - init(): TPromise { return this.raw.then(r => r.init()); } - add(filesPaths?: string[]): TPromise { return this.raw.then(r => r.add(filesPaths)); } - stage(filePath: string, content: string): TPromise { return this.raw.then(r => r.stage(filePath, content)); } - branch(name: string, checkout?: boolean): TPromise { return this.raw.then(r => r.branch(name, checkout)); } - checkout(treeish?: string, filePaths?: string[]): TPromise { return this.raw.then(r => r.checkout(treeish, filePaths)); } - clean(filePaths: string[]): TPromise { return this.raw.then(r => r.clean(filePaths)); } - undo(): TPromise { return this.raw.then(r => r.undo()); } - reset(treeish: string, hard?: boolean): TPromise { return this.raw.then(r => r.reset(treeish, hard)); } - revertFiles(treeish: string, filePaths?: string[]): TPromise { return this.raw.then(r => r.revertFiles(treeish, filePaths)); } - fetch(): TPromise { return this.raw.then(r => r.fetch()); } - pull(rebase?: boolean): TPromise { return this.raw.then(r => r.pull(rebase)); } - push(remote?: string, name?: string, options?: IPushOptions): TPromise { return this.raw.then(r => r.push(remote, name, options)); } - sync(): TPromise { return this.raw.then(r => r.sync()); } - commit(message: string, amend?: boolean, stage?: boolean, signoff?: boolean): TPromise { return this.raw.then(r => r.commit(message, amend, stage, signoff)); } - detectMimetypes(path: string, treeish?: string): TPromise { return this.raw.then(r => r.detectMimetypes(path, treeish)); } - show(path: string, treeish?: string): TPromise { return this.raw.then(r => r.show(path, treeish)); } - clone(url: string, parentPath: string): TPromise { return this.raw.then(r => r.clone(url, parentPath)); } - getCommitTemplate(): TPromise { return this.raw.then(r => r.getCommitTemplate()); } - getCommit(ref: string): TPromise { return this.raw.then(r => r.getCommit(ref)); } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/node/rawGitServiceBootstrap.ts b/src/vs/workbench/parts/git/node/rawGitServiceBootstrap.ts deleted file mode 100644 index 666250e9fd9..00000000000 --- a/src/vs/workbench/parts/git/node/rawGitServiceBootstrap.ts +++ /dev/null @@ -1,52 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import { TPromise } from 'vs/base/common/winjs.base'; -import objects = require('vs/base/common/objects'); -import uri from 'vs/base/common/uri'; -import { GitErrorCodes, IRawGitService } from 'vs/workbench/parts/git/common/git'; -import gitlib = require('vs/workbench/parts/git/node/git.lib'); -import { RawGitService } from 'vs/workbench/parts/git/node/rawGitService'; -import { join, normalize } from 'path'; -import { realpath } from 'vs/base/node/pfs'; - -export function createRawGitService(gitPath: string, workspaceRoot: string, defaultEncoding: string, exePath: string, version: string): TPromise { - if (!gitPath) { - return TPromise.as(new RawGitService(null)); - } - - const gitRootPath = uri.parse(require.toUrl('vs/workbench/parts/git/node')).fsPath; - const bootstrapPath = `${uri.parse(require.toUrl('bootstrap')).fsPath}.js`; - workspaceRoot = normalize(workspaceRoot); - - const env = objects.assign({}, process.env, { - GIT_ASKPASS: join(gitRootPath, 'askpass.sh'), - VSCODE_GIT_ASKPASS_BOOTSTRAP: bootstrapPath, - VSCODE_GIT_ASKPASS_NODE: exePath, - VSCODE_GIT_ASKPASS_MODULE_ID: 'vs/workbench/parts/git/node/askpass' - }); - - const git = new gitlib.Git({ - gitPath, version, - defaultEncoding: defaultEncoding, - env: env - }); - - const repo = git.open(workspaceRoot); - - return repo.getRoot() - .then(null, (err: gitlib.GitError) => { - if (err instanceof gitlib.GitError && err.gitErrorCode === GitErrorCodes.NotAGitRepository) { - return workspaceRoot; - } - - return TPromise.wrapError(err); - }) - .then(root => realpath(root)) - .then(root => git.open(root)) - .then(repo => new RawGitService(repo)); -} diff --git a/src/vs/workbench/parts/git/node/unscopedGitService.ts b/src/vs/workbench/parts/git/node/unscopedGitService.ts deleted file mode 100644 index 158604c7e00..00000000000 --- a/src/vs/workbench/parts/git/node/unscopedGitService.ts +++ /dev/null @@ -1,135 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import * as path from 'path'; -import { IRawGitService, IRawStatus, ServiceState, RawServiceState, ICommit } from 'vs/workbench/parts/git/common/git'; -import { TPromise } from 'vs/base/common/winjs.base'; -import { assign } from 'vs/base/common/objects'; -import Event, { Emitter } from 'vs/base/common/event'; -import uri from 'vs/base/common/uri'; -import { Git } from './git.lib'; - -export class UnscopedGitService implements IRawGitService { - - private git: Git; - - private _onOutput = new Emitter(); - get onOutput(): Event { return this._onOutput.event; } - - private static STATUS: IRawStatus = { - repositoryRoot: null, - state: ServiceState.NotAWorkspace, - status: [], - HEAD: null, - refs: [], - remotes: [] - }; - - constructor(gitPath: string, version: string, defaultEncoding: string, exePath: string) { - const gitRootPath = uri.parse(require.toUrl('vs/workbench/parts/git/node')).fsPath; - const bootstrapPath = `${uri.parse(require.toUrl('bootstrap')).fsPath}.js`; - const env = assign({}, process.env, { - GIT_ASKPASS: path.join(gitRootPath, 'askpass.sh'), - VSCODE_GIT_ASKPASS_BOOTSTRAP: bootstrapPath, - VSCODE_GIT_ASKPASS_NODE: exePath, - VSCODE_GIT_ASKPASS_MODULE_ID: 'vs/workbench/parts/git/node/askpass' - }); - - this.git = new Git({ gitPath, version, defaultEncoding, env }); - } - - getVersion(): TPromise { - return TPromise.as(null); - } - - serviceState(): TPromise { - return TPromise.as(RawServiceState.OK); - } - - statusCount(): TPromise { - return TPromise.as(0); - } - - status(): TPromise { - return TPromise.as(UnscopedGitService.STATUS); - } - - init(): TPromise { - return TPromise.as(UnscopedGitService.STATUS); - } - - add(filesPaths?: string[]): TPromise { - return TPromise.as(UnscopedGitService.STATUS); - } - - stage(filePath: string, content: string): TPromise { - return TPromise.as(UnscopedGitService.STATUS); - } - - branch(name: string, checkout?: boolean): TPromise { - return TPromise.as(UnscopedGitService.STATUS); - } - - checkout(treeish?: string, filePaths?: string[]): TPromise { - return TPromise.as(UnscopedGitService.STATUS); - } - - clean(filePaths: string[]): TPromise { - return TPromise.as(UnscopedGitService.STATUS); - } - - undo(): TPromise { - return TPromise.as(UnscopedGitService.STATUS); - } - - reset(treeish: string, hard?: boolean): TPromise { - return TPromise.as(UnscopedGitService.STATUS); - } - - revertFiles(treeish: string, filePaths?: string[]): TPromise { - return TPromise.as(UnscopedGitService.STATUS); - } - - fetch(): TPromise { - return TPromise.as(UnscopedGitService.STATUS); - } - - pull(rebase?: boolean): TPromise { - return TPromise.as(UnscopedGitService.STATUS); - } - - push(): TPromise { - return TPromise.as(UnscopedGitService.STATUS); - } - - sync(): TPromise { - return TPromise.as(UnscopedGitService.STATUS); - } - - commit(message: string, amend?: boolean, stage?: boolean, signoff?: boolean): TPromise { - return TPromise.as(UnscopedGitService.STATUS); - } - - detectMimetypes(path: string, treeish?: string): TPromise { - return TPromise.as([]); - } - - show(path: string, treeish?: string): TPromise { - return TPromise.as(null); - } - - clone(url: string, parentPath: string): TPromise { - return this.git.clone(url, parentPath); - } - - getCommitTemplate(): TPromise { - return TPromise.as(null); - } - - getCommit(ref: string): TPromise { - return TPromise.as(null); - } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/git/test/common/gitModel.test.ts b/src/vs/workbench/parts/git/test/common/gitModel.test.ts deleted file mode 100644 index 8b35789d6e9..00000000000 --- a/src/vs/workbench/parts/git/test/common/gitModel.test.ts +++ /dev/null @@ -1,188 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - - -import assert = require('assert'); -import Git = require('vs/workbench/parts/git/common/git'); -import Model = require('vs/workbench/parts/git/common/gitModel'); - -suite('Git - StatusModel', () => { - var model: Git.IStatusModel; - - setup(() => { - model = new Model.StatusModel(); - }); - - teardown(() => { - model = null; - }); - - test('simple update', () => { - model.update([ - { path: 'hello', x: '?', y: '?', mimetype: 'application/octet-stream' } - ]); - - var index = model.getIndexStatus().all(); - var workingTree = model.getWorkingTreeStatus().all(); - var merge = model.getMergeStatus().all(); - - assert.equal(index.length, 0); - assert.equal(workingTree.length, 1); - assert.equal(merge.length, 0); - }); - - test('simple update same file twice', () => { - model.update([ - { path: 'hello', x: '?', y: '?', mimetype: 'application/octet-stream' } - ]); - - var index = model.getIndexStatus().all(); - var workingTree = model.getWorkingTreeStatus().all(); - var merge = model.getMergeStatus().all(); - - assert.equal(index.length, 0); - assert.equal(workingTree.length, 1); - assert.equal(merge.length, 0); - - model.update([ - { path: 'hello', x: '?', y: '?', mimetype: 'application/octet-stream' } - ]); - - index = model.getIndexStatus().all(); - workingTree = model.getWorkingTreeStatus().all(); - merge = model.getMergeStatus().all(); - - assert.equal(index.length, 0); - assert.equal(workingTree.length, 1); - assert.equal(merge.length, 0); - }); - - test('simple update same file twice, first untracked, then ignored', () => { - model.update([ - { path: 'hello', x: '?', y: '?', mimetype: 'application/octet-stream' } - ]); - - var index = model.getIndexStatus().all(); - var workingTree = model.getWorkingTreeStatus().all(); - var merge = model.getMergeStatus().all(); - - assert.equal(index.length, 0); - assert.equal(workingTree.length, 1); - assert.equal(merge.length, 0); - - model.update([ - { path: 'hello', x: '!', y: '!', mimetype: 'application/octet-stream' } - ]); - - index = model.getIndexStatus().all(); - workingTree = model.getWorkingTreeStatus().all(); - merge = model.getMergeStatus().all(); - - assert.equal(index.length, 0); - assert.equal(workingTree.length, 1); - assert.equal(merge.length, 0); - }); - - test('same file, both modified in index, deleted in working tree', () => { - model.update([ - { path: 'hello', x: 'M', y: 'D', mimetype: 'application/octet-stream' } - ]); - - var index = model.getIndexStatus().all(); - var workingTree = model.getWorkingTreeStatus().all(); - var merge = model.getMergeStatus().all(); - - assert.equal(index.length, 1); - assert.equal(workingTree.length, 1); - assert.equal(merge.length, 0); - - assert.equal(index[0].getPath(), 'hello'); - assert.equal(index[0].getStatus(), Git.Status.INDEX_MODIFIED); - - assert.equal(workingTree[0].getPath(), 'hello'); - assert.equal(workingTree[0].getStatus(), Git.Status.DELETED); - }); - - test('index and working tree matches', () => { - model.update([ - { path: 'f1', x: 'M', y: ' ', mimetype: 'application/octet-stream' }, - { path: 'f2', x: 'A', y: ' ', mimetype: 'application/octet-stream' }, - { path: 'f3', x: 'R', y: ' ', mimetype: 'application/octet-stream' }, - { path: 'f4', x: 'C', y: ' ', mimetype: 'application/octet-stream' } - ]); - - var index = model.getIndexStatus().all(); - var workingTree = model.getWorkingTreeStatus().all(); - var merge = model.getMergeStatus().all(); - - assert.equal(index.length, 4); - assert.equal(workingTree.length, 0); - assert.equal(merge.length, 0); - - assert.equal(index[0].getStatus(), Git.Status.INDEX_MODIFIED); - assert.equal(index[1].getStatus(), Git.Status.INDEX_ADDED); - assert.equal(index[2].getStatus(), Git.Status.INDEX_RENAMED); - assert.equal(index[3].getStatus(), Git.Status.INDEX_COPIED); - }); - - test('work tree changed since index', () => { - model.update([ - { path: 'f1', x: ' ', y: 'M', mimetype: 'application/octet-stream' }, - { path: 'f2', x: 'M', y: 'M', mimetype: 'application/octet-stream' }, - { path: 'f3', x: 'A', y: 'M', mimetype: 'application/octet-stream' }, - { path: 'f4', x: 'R', y: 'M', mimetype: 'application/octet-stream' }, - { path: 'f5', x: 'C', y: 'M', mimetype: 'application/octet-stream' } - ]); - - var index = model.getIndexStatus().all(); - var workingTree = model.getWorkingTreeStatus().all(); - var merge = model.getMergeStatus().all(); - - assert.equal(index.length, 4); - assert.equal(workingTree.length, 5); - assert.equal(merge.length, 0); - - assert.equal(index[0].getStatus(), Git.Status.INDEX_MODIFIED); - assert.equal(index[1].getStatus(), Git.Status.INDEX_ADDED); - assert.equal(index[2].getStatus(), Git.Status.INDEX_RENAMED); - assert.equal(index[3].getStatus(), Git.Status.INDEX_COPIED); - - assert.equal(workingTree[0].getStatus(), Git.Status.MODIFIED); - assert.equal(workingTree[1].getStatus(), Git.Status.MODIFIED); - assert.equal(workingTree[2].getStatus(), Git.Status.MODIFIED); - assert.equal(workingTree[3].getStatus(), Git.Status.MODIFIED); - assert.equal(workingTree[3].getStatus(), Git.Status.MODIFIED); - }); - - test('deleted in work tree', () => { - model.update([ - { path: 'f1', x: ' ', y: 'D', mimetype: 'application/octet-stream' }, - { path: 'f2', x: 'M', y: 'D', mimetype: 'application/octet-stream' }, - { path: 'f3', x: 'A', y: 'D', mimetype: 'application/octet-stream' }, - { path: 'f4', x: 'R', y: 'D', mimetype: 'application/octet-stream' }, - { path: 'f5', x: 'C', y: 'D', mimetype: 'application/octet-stream' } - ]); - - var index = model.getIndexStatus().all(); - var workingTree = model.getWorkingTreeStatus().all(); - var merge = model.getMergeStatus().all(); - - assert.equal(index.length, 4); - assert.equal(workingTree.length, 5); - assert.equal(merge.length, 0); - - assert.equal(index[0].getStatus(), Git.Status.INDEX_MODIFIED); - assert.equal(index[1].getStatus(), Git.Status.INDEX_ADDED); - assert.equal(index[2].getStatus(), Git.Status.INDEX_RENAMED); - assert.equal(index[3].getStatus(), Git.Status.INDEX_COPIED); - - assert.equal(workingTree[0].getStatus(), Git.Status.DELETED); - assert.equal(workingTree[1].getStatus(), Git.Status.DELETED); - assert.equal(workingTree[2].getStatus(), Git.Status.DELETED); - assert.equal(workingTree[3].getStatus(), Git.Status.DELETED); - assert.equal(workingTree[3].getStatus(), Git.Status.DELETED); - }); -}); diff --git a/src/vs/workbench/parts/git/test/common/stageRanges.test.ts b/src/vs/workbench/parts/git/test/common/stageRanges.test.ts deleted file mode 100644 index cd8b50cd1c1..00000000000 --- a/src/vs/workbench/parts/git/test/common/stageRanges.test.ts +++ /dev/null @@ -1,475 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - - -import * as assert from 'assert'; -import { SelectedChange, getSelectedChanges, applyChangesToModel, getChangeRevertEdits } from 'vs/workbench/parts/git/common/stageRanges'; -import { Model } from 'vs/editor/common/model/model'; -import { IChange } from 'vs/editor/common/editorCommon'; -import { Selection } from 'vs/editor/common/core/selection'; - -function changesEqual(actual: IChange[], expected: IChange[]) { - assert.equal(actual.length, expected.length); - if (actual.length === expected.length) { - for (var i = 0; i < actual.length; ++i) { - assert.equal(actual[i].modifiedStartLineNumber, expected[i].modifiedStartLineNumber); - assert.equal(actual[i].modifiedEndLineNumber, expected[i].modifiedEndLineNumber); - assert.equal(actual[i].originalStartLineNumber, expected[i].originalStartLineNumber); - assert.equal(actual[i].originalEndLineNumber, expected[i].originalEndLineNumber); - } - } -} - -function createChange(modifiedStart: number, modifiedEnd: number, originalStart: number, originalEnd: number): IChange { - return { - modifiedStartLineNumber: modifiedStart, - modifiedEndLineNumber: modifiedEnd, - originalStartLineNumber: originalStart, - originalEndLineNumber: originalEnd - }; -} - -function createSelectedChange(modifiedStart: number, modifiedEnd: number, originalStart: number, originalEnd: number, fullModifiedStart = modifiedStart, fullModifiedEnd = modifiedEnd): SelectedChange { - return new SelectedChange( - createChange(modifiedStart, modifiedEnd, originalStart, originalEnd), - createChange(fullModifiedStart, fullModifiedEnd, originalStart, originalEnd)); -} - -suite('Git - Stage ranges', () => { - - test('Get selected changes test - no change selected (selection before changes)', () => { - var selections: Selection[] = []; - selections.push(new Selection(1, 1, 1, 1)); - var changes: IChange[] = []; - changes.push(createChange(2, 3, 1, 1)); - var result = getSelectedChanges(changes, selections); - assert.equal(result.length, 0); - }); - - test('Get selected changes test - no change selected (selection after changes)', () => { - var selections: Selection[] = []; - selections.push(new Selection(5, 3, 7, 8)); - var changes: IChange[] = []; - changes.push(createChange(2, 3, 1, 1)); - var result = getSelectedChanges(changes, selections); - assert.equal(result.length, 0); - }); - - test('Get selected changes test - one change fully selected', () => { - var selections: Selection[] = []; - selections.push(new Selection(5, 3, 7, 8)); - var changes: IChange[] = []; - changes.push(createChange(2, 3, 1, 1), createChange(5, 7, 2, 6)); - var result = getSelectedChanges(changes, selections); - var expected: IChange[] = []; - expected.push(createChange(5, 7, 2, 6)); - changesEqual(result, expected); - }); - - test('Get selected changes test - one change fully selected(deletion)', () => { - var selections: Selection[] = []; - selections.push(new Selection(5, 3, 7, 8)); - var changes: IChange[] = []; - changes.push(createChange(2, 3, 1, 1), createChange(5, 0, 5, 6)); - var result = getSelectedChanges(changes, selections); - var expected: IChange[] = []; - expected.push(createChange(5, 0, 5, 6)); - changesEqual(result, expected); - }); - - test('Get selected changes test - one change (insertion) partially selected', () => { - var selections: Selection[] = []; - selections.push(new Selection(5, 3, 6, 1)); - var changes: IChange[] = []; - changes.push(createChange(2, 3, 1, 0), createChange(5, 7, 2, 0)); - var result = getSelectedChanges(changes, selections); - var expected: IChange[] = []; - expected.push(createChange(5, 6, 2, 0)); - changesEqual(result, expected); - }); - - test('Get selected changes test - multiple changes selected with one selection', () => { - var selections: Selection[] = []; - selections.push(new Selection(2, 7, 7, 1)); - var changes: IChange[] = []; - changes.push(createChange(2, 3, 1, 1), createChange(5, 7, 2, 6)); - var result = getSelectedChanges(changes, selections); - var expected = changes; - changesEqual(result, expected); - }); - - test('Get selected changes test - one change partially seleceted with multiple selections', () => { - var selections: Selection[] = []; - selections.push(new Selection(2, 2, 5, 5), new Selection(7, 2, 9, 1)); - var changes: IChange[] = []; - changes.push(createChange(1, 15, 1, 10), createChange(120, 127, 122, 126)); - var result = getSelectedChanges(changes, selections); - var expected: IChange[] = []; - expected.push(createChange(2, 5, 1, 10), createChange(7, 9, 1, 10)); - changesEqual(result, expected); - }); - - test('Get selected changes test - one change partially seleceted with overlapping selections', () => { - var selections: Selection[] = []; - selections.push(new Selection(2, 2, 5, 5), new Selection(5, 2, 9, 1)); - var changes: IChange[] = []; - changes.push(createChange(1, 15, 1, 10), createChange(120, 127, 122, 126)); - var result = getSelectedChanges(changes, selections); - var expected: IChange[] = []; - expected.push(createChange(2, 5, 1, 10), createChange(6, 9, 1, 10)); - changesEqual(result, expected); - }); - - test('Get selected changes test - multiple changes partially selected with multiple selections', () => { - var selections: Selection[] = []; - selections.push(new Selection(3, 1, 9, 5), new Selection(115, 2, 129, 1)); - var changes: IChange[] = []; - changes.push(createChange(1, 15, 1, 10), createChange(116, 135, 122, 126)); - var result = getSelectedChanges(changes, selections); - var expected: IChange[] = []; - expected.push(createChange(3, 9, 1, 10), createChange(116, 129, 122, 126)); - changesEqual(result, expected); - }); - - test('Get selected changes test - multiple changes selected with multiple selections. Multiple changes not selected', () => { - var selections: Selection[] = []; - selections.push(new Selection(33, 11, 79, 15), new Selection(155, 21, 189, 11)); - var changes: IChange[] = []; - changes.push(createChange(1, 45, 1, 0), createChange(80, 89, 72, 79), createChange(154, 190, 152, 186), createChange(216, 235, 222, 226)); - var result = getSelectedChanges(changes, selections); - var expected: IChange[] = []; - expected.push(createChange(33, 45, 1, 0), createChange(155, 189, 152, 186)); - changesEqual(result, expected); - }); - - function createModel(text: string): Model { - return Model.createFromString(text); - } - - test('Apply changes to model - no changes', () => { - var original = createModel('One line that is equal. '); - var modified = createModel('One line that is equal. \n Second line is new.'); - var changes: IChange[] = []; - var result = applyChangesToModel(original, modified, changes); - var expected = original; - assert.equal(result, expected.getValue()); - original.dispose(); - modified.dispose(); - }); - - test('Apply changes to model - one line change at the end', () => { - var original = createModel('One line that is equal. '); - var modified = createModel('One line that is equal. \n Second line is new.'); - var changes: IChange[] = []; - changes.push(createChange(2, 2, 2, 2)); - var result = applyChangesToModel(original, modified, changes); - var expected = modified; - assert.equal(result, expected.getValue()); - original.dispose(); - modified.dispose(); - }); - - test('Apply changes to model - one line insertion in the middle', () => { - var original = createModel('One line that is equal. \n Last line same. '); - var modified = createModel('One line that is equal. \n Second line is new. \n Last line same. '); - var changes: IChange[] = []; - changes.push(createChange(2, 2, 1, 0)); - var result = applyChangesToModel(original, modified, changes); - var expected = modified; - assert.equal(result, expected.getValue()); - original.dispose(); - modified.dispose(); - }); - - test('Apply changes to model - three empty lines insertion in the middle', () => { - var original = createModel('hello\n there\n isidor\n'); - var modified = createModel('hello\n there\n \n \n \n isidor\n'); - var changes: IChange[] = []; - changes.push(createChange(3, 5, 2, 0)); - var result = applyChangesToModel(original, modified, changes); - var expected = modified; - assert.equal(result, expected.getValue()); - original.dispose(); - modified.dispose(); - }); - - test('Apply changes to model - one line deletion', () => { - var original = createModel('One line that is equal. \n Second line is old. \n Third line same. \n Forth line not important'); - var modified = createModel('One line that is equal. \n Third line same. '); - var changes: IChange[] = []; - changes.push(createChange(2, 0, 2, 2)); - var result = applyChangesToModel(original, modified, changes); - var expected = createModel('One line that is equal. \n Third line same. \n Forth line not important'); - assert.equal(result, expected.getValue()); - original.dispose(); - modified.dispose(); - expected.dispose(); - }); - - test('Apply changes to model - one multi line change', () => { - var original = createModel('One line that is equal. \n Second line is different. \n Third line also different. \n Forth line is same. \n Fifth line is different.'); - var modified = createModel('One line that is equal. \n 2nd line is different. \n 3rd line also different. \n Forth line is same. \n 5th line is different.'); - var changes: IChange[] = []; - changes.push(createChange(2, 3, 2, 3)); - var result = applyChangesToModel(original, modified, changes); - var expected = createModel('One line that is equal. \n 2nd line is different. \n 3rd line also different. \n Forth line is same. \n Fifth line is different.'); - assert.equal(result, expected.getValue()); - original.dispose(); - modified.dispose(); - expected.dispose(); - }); - - test('Apply changes to model - two overlapping changes', () => { - var original = createModel(' One \n Two \n Three \n Four \n Five \n'); - var modified = createModel(' One \n 2 \n 3 \n 4 \n NotSelected \n'); - var changes: IChange[] = []; - changes.push(createChange(2, 3, 2, 4), createChange(4, 4, 2, 4)); - var result = applyChangesToModel(original, modified, changes); - var expected = createModel(' One \n 2 \n 3 \n 4 \n Five \n'); - assert.equal(result, expected.getValue()); - original.dispose(); - modified.dispose(); - expected.dispose(); - }); - - test('Apply changes to model - multiple small changes', () => { - var original = createModel(' One \n Two \n Three \n Four \n Five \n Six \n Seven \n Eight \n'); - var modified = createModel(' One \n 2 \n Three \n 4 \n 5 \n Six \n 7 \n 8 \n'); - var changes: IChange[] = []; - changes.push(createChange(1, 2, 1, 2), createChange(5, 5, 5, 5), createChange(7, 8, 7, 8)); - var result = applyChangesToModel(original, modified, changes); - var expected = createModel(' One \n 2 \n Three \n Four \n 5 \n Six \n 7 \n 8 \n'); - assert.equal(result, expected.getValue()); - original.dispose(); - modified.dispose(); - expected.dispose(); - }); - - test('Apply changes to model - multiple changes - insertion, deletion and modification', () => { - var original = createModel(' One \n Two \n Three \n Four \n Five \n Six \n Seven \n Eight \n Nine \n Ten'); - var modified = createModel(' 1 \n Three \n 4 \n 5 \n Six \n 7 \n NEWLINE \n Eight '); - var changes: IChange[] = []; - changes.push(createChange(1, 1, 1, 1), createChange(2, 0, 2, 2), createChange(3, 3, 4, 4), createChange(7, 7, 7, 0), createChange(7, 0, 9, 10)); - var result = applyChangesToModel(original, modified, changes); - var expected = createModel(' 1 \n Three \n 4 \n Five \n Six \n Seven \n NEWLINE \n Eight '); - assert.equal(result, expected.getValue()); - original.dispose(); - modified.dispose(); - expected.dispose(); - }); - - test('Revert changes on model - no changes', () => { - var original = createModel('One line that is equal. '); - var modified = createModel('One line that is equal. \n Second line is new.'); - var changes: SelectedChange[] = []; - const edits = getChangeRevertEdits(original, modified, changes); - - assert.equal(edits.length, 0); - original.dispose(); - modified.dispose(); - }); - - test('Revert changes on model - one line insertion at the beginning', () => { - const selections = [new Selection(1, 1, 1, 1)]; - const original = createModel(' One line that is equal. '); - const modified = createModel('Inserted line is new. \n One line that is equal. '); - const changes: SelectedChange[] = []; - changes.push(createSelectedChange(1, 1, 0, 0)); - const edits = getChangeRevertEdits(original, modified, changes); - - modified.pushEditOperations(selections, edits, () => selections); - const expected = original; - assert.equal(modified.getValue(), expected.getValue()); - original.dispose(); - modified.dispose(); - }); - - test('Revert changes on model - one line insertion in the middle', () => { - const selections = [new Selection(1, 1, 1, 1)]; - const original = createModel('One line that is equal. \n Last line same. '); - const modified = createModel('One line that is equal. \n Second line is new. \n Last line same. '); - const changes: SelectedChange[] = []; - changes.push(createSelectedChange(2, 2, 1, 0)); - const edits = getChangeRevertEdits(original, modified, changes); - - modified.pushEditOperations(selections, edits, () => selections); - const expected = original; - assert.equal(modified.getValue(), expected.getValue()); - original.dispose(); - modified.dispose(); - }); - - test('Revert changes on model - one line insertion at the end', () => { - const selections = [new Selection(1, 1, 1, 1)]; - const original = createModel('One line that is equal. '); - const modified = createModel('One line that is equal. \n Second line is new.'); - const changes: SelectedChange[] = []; - changes.push(createSelectedChange(2, 2, 1, 0)); - const edits = getChangeRevertEdits(original, modified, changes); - - modified.pushEditOperations(selections, edits, () => selections); - const expected = original; - assert.equal(modified.getValue(), expected.getValue()); - original.dispose(); - modified.dispose(); - }); - - test('Revert changes on model - one line deletion at the beginning', () => { - const selections = [new Selection(1, 1, 1, 1)]; - const original = createModel('First line is deleted. \n One line that is equal. '); - const modified = createModel(' One line that is equal. '); - const changes: SelectedChange[] = []; - changes.push(createSelectedChange(0, 0, 1, 1)); - const edits = getChangeRevertEdits(original, modified, changes); - - modified.pushEditOperations(selections, edits, () => selections); - const expected = original; - assert.equal(modified.getValue(), expected.getValue()); - original.dispose(); - modified.dispose(); - }); - - test('Revert changes on model - one line deletion in the middle', () => { - const selections = [new Selection(1, 1, 1, 1)]; - const original = createModel('One line that is equal. \n Second line is deleted. \n Last line same. '); - const modified = createModel('One line that is equal. \n Last line same. '); - const changes: SelectedChange[] = []; - changes.push(createSelectedChange(1, 0, 2, 2)); - const edits = getChangeRevertEdits(original, modified, changes); - - modified.pushEditOperations(selections, edits, () => selections); - const expected = original; - assert.equal(modified.getValue(), expected.getValue()); - original.dispose(); - modified.dispose(); - }); - - test('Revert changes on model - one line deletion at the end', () => { - const selections = [new Selection(1, 1, 1, 1)]; - const original = createModel('One line that is equal. \n Second line is deleted.'); - const modified = createModel('One line that is equal. '); - const changes: SelectedChange[] = []; - changes.push(createSelectedChange(2, 0, 2, 2)); - const edits = getChangeRevertEdits(original, modified, changes); - - modified.pushEditOperations(selections, edits, () => selections); - const expected = original; - assert.equal(modified.getValue(), expected.getValue()); - original.dispose(); - modified.dispose(); - }); - - test('Revert changes on model - three empty lines insertion in the middle', () => { - const selections = [new Selection(1, 1, 1, 1)]; - const original = createModel('hello\n there\n isidor\n'); - const modified = createModel('hello\n there\n \n \n \n isidor\n'); - const changes: SelectedChange[] = []; - changes.push(createSelectedChange(3, 5, 2, 0)); - const edits = getChangeRevertEdits(original, modified, changes); - - modified.pushEditOperations(selections, edits, () => selections); - const expected = original; - assert.equal(modified.getValue(), expected.getValue()); - original.dispose(); - modified.dispose(); - }); - - test('Revert changes on model - one line deletion', () => { - const selections = [new Selection(1, 1, 1, 1)]; - const original = createModel('One line that is equal. \n Second line is old. \n Third line same. \n Forth line not important'); - const modified = createModel('One line that is equal. \n Third line same. '); - const changes: SelectedChange[] = []; - changes.push(createSelectedChange(1, 0, 2, 2)); - const edits = getChangeRevertEdits(original, modified, changes); - - modified.pushEditOperations(selections, edits, () => selections); - const expected = createModel('One line that is equal. \n Second line is old. \n Third line same. '); - assert.equal(modified.getValue(), expected.getValue()); - original.dispose(); - modified.dispose(); - expected.dispose(); - }); - - test('Revert changes on model - one multi line change', () => { - const selections = [new Selection(1, 1, 1, 1)]; - const original = createModel('One line that is equal. \n Second line is different. \n Third line also different. \n Forth line is same. \n Fifth line is different.'); - const modified = createModel('One line that is equal. \n 2nd line is different. \n 3rd line also different. \n Forth line is same. \n 5th line is different.'); - const changes: SelectedChange[] = []; - changes.push(createSelectedChange(2, 3, 2, 3)); - const edits = getChangeRevertEdits(original, modified, changes); - - modified.pushEditOperations(selections, edits, () => selections); - const expected = createModel('One line that is equal. \n Second line is different. \n Third line also different. \n Forth line is same. \n 5th line is different.'); - assert.equal(modified.getValue(), expected.getValue()); - original.dispose(); - modified.dispose(); - expected.dispose(); - }); - - test('Revert changes on model - one multi line change - partial revert', () => { - const selections = [new Selection(1, 1, 1, 1)]; - const original = createModel('One line that is equal. \n Second line is different. \n Third line also different. \n Forth line is same. \n Fifth line is different.'); - const modified = createModel('One line that is equal. \n 2nd line is different. \n 3rd line also different. \n Forth line is same. \n 5th line is different.'); - const changes: SelectedChange[] = []; - changes.push(createSelectedChange(3, 3, 2, 3, 2, 3)); - const edits = getChangeRevertEdits(original, modified, changes); - - modified.pushEditOperations(selections, edits, () => selections); - const expected = createModel('One line that is equal. \n 2nd line is different. \n Third line also different. \n Forth line is same. \n 5th line is different.'); - assert.equal(modified.getValue(), expected.getValue()); - original.dispose(); - modified.dispose(); - expected.dispose(); - }); - - test('Revert changes on model - multiple small changes', () => { - const selections = [new Selection(1, 1, 1, 1)]; - const original = createModel(' One \n Two \n Three \n Four \n Five \n Six \n Seven \n Eight \n'); - const modified = createModel(' One \n 2 \n Three \n 4 \n 5 \n Six \n 7 \n 8 \n'); - const changes: SelectedChange[] = []; - changes.push(createSelectedChange(1, 2, 1, 2), createSelectedChange(4, 5, 4, 5), createSelectedChange(7, 8, 7, 8)); - const edits = getChangeRevertEdits(original, modified, changes); - - modified.pushEditOperations(selections, edits, () => selections); - const expected = original; - assert.equal(modified.getValue(), expected.getValue()); - original.dispose(); - modified.dispose(); - expected.dispose(); - }); - - test('Revert changes on model - multiple changes - insertion, deletion and modification', () => { - const selections = [new Selection(1, 1, 1, 1)]; - const original = createModel(' One \n Two \n Three \n Four \n Five \n Six \n Seven \n Eight \n Nine \n Ten'); - const modified = createModel(' 1 \n Three \n 4 \n 5 \n Six \n 7 \n NEWLINE \n Eight '); - const changes: SelectedChange[] = []; - changes.push(createSelectedChange(1, 1, 1, 1), createSelectedChange(1, 0, 2, 2), createSelectedChange(3, 4, 4, 5), createSelectedChange(6, 7, 7, 7), createSelectedChange(8, 0, 9, 10)); - const edits = getChangeRevertEdits(original, modified, changes); - - modified.pushEditOperations(selections, edits, () => selections); - const expected = original; - assert.equal(modified.getValue(), expected.getValue()); - original.dispose(); - modified.dispose(); - expected.dispose(); - }); - - test('Revert changes on model - multiple changes - partial revert', () => { - const selections = [new Selection(1, 1, 1, 1)]; - const original = createModel(' One \n Two \n Three \n Four \n Five \n Six \n Seven \n Eight \n Nine \n Ten'); - const modified = createModel(' 1 \n Three \n 4 \n 5 \n Six \n 7 \n NEWLINE \n Eight '); - const changes: SelectedChange[] = []; - changes.push(createSelectedChange(1, 1, 1, 1), createSelectedChange(1, 0, 2, 2), createSelectedChange(3, 4, 4, 5), createSelectedChange(6, 7, 7, 7), createSelectedChange(8, 0, 9, 10)); - const edits = getChangeRevertEdits(original, modified, changes); - - modified.pushEditOperations(selections, edits, () => selections); - const expected = original; - assert.equal(modified.getValue(), expected.getValue()); - original.dispose(); - modified.dispose(); - expected.dispose(); - }); -}); diff --git a/src/vs/workbench/parts/scm/browser/scmPreview.ts b/src/vs/workbench/parts/scm/browser/scmPreview.ts deleted file mode 100644 index 0f2db3ad70a..00000000000 --- a/src/vs/workbench/parts/scm/browser/scmPreview.ts +++ /dev/null @@ -1,96 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import { Action } from 'vs/base/common/actions'; -import { TPromise } from 'vs/base/common/winjs.base'; -import { IWindowService } from 'vs/platform/windows/common/windows'; -import { IMessageService } from 'vs/platform/message/common/message'; - -// tslint:disable -import pkg from 'vs/platform/node/package'; -// tslint:enable - -// Enable this by default -function getDefaultValue(): boolean { - const minorVersion = pkg.version.replace(/^(\d+\.\d+).*$/, '$1'); - const forcedVersion = window.localStorage.getItem('forcedPreviewSCMVersion'); - - if (forcedVersion !== minorVersion) { - window.localStorage.setItem('forcedPreviewSCMVersion', minorVersion); - window.localStorage.setItem('enablePreviewSCM', 'true'); - } - - const value = window.localStorage.getItem('enablePreviewSCM'); - return value !== 'false'; -} - -export default class SCMPreview { - - private static readonly _enabled = getDefaultValue(); - - static get enabled(): boolean { - return this._enabled; - } - - static set enabled(enabled: boolean) { - window.localStorage.setItem('enablePreviewSCM', enabled ? 'true' : 'false'); - } -} - -export class EnableSCMPreviewAction extends Action { - - static ID = 'enablescmpreview'; - static LABEL = 'Disable Legacy Git'; - - constructor( - id = EnableSCMPreviewAction.ID, - label = EnableSCMPreviewAction.LABEL, - @IWindowService private windowService: IWindowService, - @IMessageService private messageService: IMessageService, - ) { - super(EnableSCMPreviewAction.ID, EnableSCMPreviewAction.LABEL, '', true); - } - - run(): TPromise { - const message = 'This will reload this window, do you want to continue?'; - const result = this.messageService.confirm({ message }); - - if (!result) { - return undefined; - } - - SCMPreview.enabled = true; - return this.windowService.reloadWindow(); - } -} - -export class DisableSCMPreviewAction extends Action { - - static ID = 'disablescmpreview'; - static LABEL = 'Enable Legacy Git'; - - constructor( - id = DisableSCMPreviewAction.ID, - label = DisableSCMPreviewAction.LABEL, - @IWindowService private windowService: IWindowService, - @IMessageService private messageService: IMessageService, - ) { - super(DisableSCMPreviewAction.ID, DisableSCMPreviewAction.LABEL, '', true); - } - - run(): TPromise { - const message = 'This will reload this window, do you want to continue?'; - const result = this.messageService.confirm({ message }); - - if (!result) { - return undefined; - } - - SCMPreview.enabled = false; - return this.windowService.reloadWindow(); - } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts b/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts index b372695a4bd..2646a7185f3 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts @@ -21,7 +21,6 @@ import { ISCMService } from 'vs/workbench/services/scm/common/scm'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { StatusUpdater } from './scmActivity'; -import SCMPreview, { DisableSCMPreviewAction, EnableSCMPreviewAction } from '../browser/scmPreview'; class OpenSCMViewletAction extends ToggleViewletAction { @@ -60,40 +59,32 @@ export class SwitchProvider extends Action { Registry.as(WorkbenchExtensions.Workbench) .registerWorkbenchContribution(DirtyDiffDecorator); -if (SCMPreview.enabled) { - const viewletDescriptor = new ViewletDescriptor( - 'vs/workbench/parts/scm/electron-browser/scmViewlet', - 'SCMViewlet', - VIEWLET_ID, - localize('source control', "Source Control"), - 'scm', - 36 - ); +const viewletDescriptor = new ViewletDescriptor( + 'vs/workbench/parts/scm/electron-browser/scmViewlet', + 'SCMViewlet', + VIEWLET_ID, + localize('source control', "Source Control"), + 'scm', + 36 +); - Registry.as(ViewletExtensions.Viewlets) - .registerViewlet(viewletDescriptor); +Registry.as(ViewletExtensions.Viewlets) + .registerViewlet(viewletDescriptor); - Registry.as(WorkbenchExtensions.Workbench) - .registerWorkbenchContribution(StatusUpdater); +Registry.as(WorkbenchExtensions.Workbench) + .registerWorkbenchContribution(StatusUpdater); - // Register Action to Open Viewlet - Registry.as(WorkbenchActionExtensions.WorkbenchActions).registerWorkbenchAction( - new SyncActionDescriptor(OpenSCMViewletAction, VIEWLET_ID, localize('toggleSCMViewlet', "Show SCM"), { - primary: null, - win: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G }, - linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G }, - mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.KEY_G } - }), - 'View: Show SCM', - localize('view', "View") - ); +// Register Action to Open Viewlet +Registry.as(WorkbenchActionExtensions.WorkbenchActions).registerWorkbenchAction( + new SyncActionDescriptor(OpenSCMViewletAction, VIEWLET_ID, localize('toggleSCMViewlet', "Show SCM"), { + primary: null, + win: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G }, + linux: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G }, + mac: { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.KEY_G } + }), + 'View: Show SCM', + localize('view', "View") +); - Registry.as(WorkbenchActionExtensions.WorkbenchActions) - .registerWorkbenchAction(new SyncActionDescriptor(SwitchProvider, SwitchProvider.ID, SwitchProvider.LABEL), 'SCM: Switch Provider', 'SCM'); - - Registry.as(WorkbenchActionExtensions.WorkbenchActions) - .registerWorkbenchAction(new SyncActionDescriptor(DisableSCMPreviewAction, DisableSCMPreviewAction.ID, DisableSCMPreviewAction.LABEL), 'SCM: Disable Preview SCM', 'SCM'); -} else { - Registry.as(WorkbenchActionExtensions.WorkbenchActions) - .registerWorkbenchAction(new SyncActionDescriptor(EnableSCMPreviewAction, EnableSCMPreviewAction.ID, EnableSCMPreviewAction.LABEL), 'SCM: Enable Preview SCM', 'SCM'); -} +Registry.as(WorkbenchActionExtensions.WorkbenchActions) + .registerWorkbenchAction(new SyncActionDescriptor(SwitchProvider, SwitchProvider.ID, SwitchProvider.LABEL), 'SCM: Switch Provider', 'SCM'); diff --git a/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.ts b/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.ts index 33a812a71de..8a3bb16246a 100644 --- a/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.ts +++ b/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.ts @@ -17,7 +17,6 @@ import { localize } from 'vs/nls'; import { Action } from 'vs/base/common/actions'; import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actionRegistry'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; -import SCMPreview from 'vs/workbench/parts/scm/browser/scmPreview'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -50,7 +49,7 @@ const keys: Key[] = [ id: 'git', arrow: '←', label: localize('welcomeOverlay.git', "Source code management"), - command: SCMPreview.enabled ? 'workbench.view.scm' : 'workbench.view.git' + command: 'workbench.view.scm' }, { id: 'debug', diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts index 1acc0111dd9..7da8192ba26 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts @@ -33,7 +33,6 @@ import { Scope } from 'vs/workbench/common/memento'; import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { once } from 'vs/base/common/event'; -import SCMPreview from 'vs/workbench/parts/scm/browser/scmPreview'; import { isObject } from 'vs/base/common/types'; import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/commands'; import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService'; @@ -430,7 +429,9 @@ export class WalkThroughPart extends BaseEditor { private updateMarkerClasses() { const innerContent = this.content.firstElementChild; - if (SCMPreview.enabled && innerContent) { + + // TODO@christof + if (true && innerContent) { innerContent.classList.add('scmEnabled'); } } From 4962cfee0c37f076808909c670b80f1abdfb4243 Mon Sep 17 00:00:00 2001 From: Michel Kaporin Date: Fri, 5 May 2017 16:01:22 +0200 Subject: [PATCH 0126/1164] Added clarification to the regex and public method. --- .../workbench/parts/debug/browser/linkDetector.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/linkDetector.ts b/src/vs/workbench/parts/debug/browser/linkDetector.ts index a94baa7b26c..55657a24827 100644 --- a/src/vs/workbench/parts/debug/browser/linkDetector.ts +++ b/src/vs/workbench/parts/debug/browser/linkDetector.ts @@ -14,11 +14,11 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace export class LinkDetector { private static FILE_LOCATION_PATTERNS: RegExp[] = [ - // group 0: the full thing :) - // group 1: absolute path + // group 0: full path with line and column + // group 1: full path without line and column, matched by `*.*` in the end to work only on paths with extensions in the end (s.t. http://test.com:8000 would not match) // group 2: drive letter on windows with trailing backslash or leading slash on mac/linux - // group 3: line number - // group 4: column number + // group 3: line number, matched by (:(\d+)) + // group 4: column number, matched by ((?::(\d+))?) // eg: at Context. (c:\Users\someone\Desktop\mocha-runner\test\test.js:26:11) /(?![\(])(?:file:\/\/)?((?:([a-zA-Z]+:)|[^\(\)<>\'\"\[\]:\s]+)(?:[\\/][^\(\)<>\'\"\[\]:]*)?\.[a-zA-Z]+[0-9]*):(\d+)(?::(\d+))?/g ]; @@ -30,6 +30,12 @@ export class LinkDetector { // noop } + /** + * Matches and handles relative and absolute file links in the string provided. + * Returns element that wraps the processed string, where matched links are replaced by and unmatched parts are surrounded by elements. + * 'onclick' event is attached to all anchored links that opens them in the editor. + * If no links were detected, returns the original string. + */ public handleLinks(text: string): HTMLElement | string { let linkContainer: HTMLElement; From 17ea7e5143b6fb229ec0cc9998b04e4d302bbb8d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 May 2017 16:03:46 +0200 Subject: [PATCH 0127/1164] more getLeadingWhitespace-tricks --- src/vs/base/common/strings.ts | 8 ++++---- src/vs/base/test/common/strings.test.ts | 6 ++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/vs/base/common/strings.ts b/src/vs/base/common/strings.ts index 1886577902b..d79fcdfe5a1 100644 --- a/src/vs/base/common/strings.ts +++ b/src/vs/base/common/strings.ts @@ -293,14 +293,14 @@ export function firstNonWhitespaceIndex(str: string): number { * Returns the leading whitespace of the string. * If the string contains only whitespaces, returns entire string */ -export function getLeadingWhitespace(str: string, from: number = 0): string { - for (let i = from, len = str.length; i < len; i++) { +export function getLeadingWhitespace(str: string, start: number = 0, end: number = str.length): string { + for (let i = start; i < end; i++) { let chCode = str.charCodeAt(i); if (chCode !== CharCode.Space && chCode !== CharCode.Tab) { - return str.substring(from, i); + return str.substring(start, i); } } - return str.substr(from); + return str.substring(start, end); } /** diff --git a/src/vs/base/test/common/strings.test.ts b/src/vs/base/test/common/strings.test.ts index 7681a2e702c..7b4efab9479 100644 --- a/src/vs/base/test/common/strings.test.ts +++ b/src/vs/base/test/common/strings.test.ts @@ -310,7 +310,13 @@ suite('Strings', () => { test('getLeadingWhitespace', () => { assert.equal(strings.getLeadingWhitespace(' foo'), ' '); assert.equal(strings.getLeadingWhitespace(' foo', 2), ''); + assert.equal(strings.getLeadingWhitespace(' foo', 1, 1), ''); + assert.equal(strings.getLeadingWhitespace(' foo', 0, 1), ' '); assert.equal(strings.getLeadingWhitespace(' '), ' '); assert.equal(strings.getLeadingWhitespace(' ', 1), ' '); + assert.equal(strings.getLeadingWhitespace(' ', 0, 1), ' '); + assert.equal(strings.getLeadingWhitespace('\t\tfunction foo(){', 0, 1), '\t'); + assert.equal(strings.getLeadingWhitespace('\t\tfunction foo(){', 0, 2), '\t\t'); + }); }); From 9901d2b7fbcd4c40fc828404fd4354f16fe06fc9 Mon Sep 17 00:00:00 2001 From: Michel Kaporin Date: Fri, 5 May 2017 16:16:35 +0200 Subject: [PATCH 0128/1164] Removed redundant instantiations of LinkDetetector for each ANSI output. Corrected regex description. --- src/vs/workbench/parts/debug/browser/linkDetector.ts | 2 +- .../parts/debug/electron-browser/replViewer.ts | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/linkDetector.ts b/src/vs/workbench/parts/debug/browser/linkDetector.ts index 55657a24827..e75ea509664 100644 --- a/src/vs/workbench/parts/debug/browser/linkDetector.ts +++ b/src/vs/workbench/parts/debug/browser/linkDetector.ts @@ -15,7 +15,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace export class LinkDetector { private static FILE_LOCATION_PATTERNS: RegExp[] = [ // group 0: full path with line and column - // group 1: full path without line and column, matched by `*.*` in the end to work only on paths with extensions in the end (s.t. http://test.com:8000 would not match) + // group 1: full path without line and column, matched by `*.*` in the end to work only on paths with extensions in the end (s.t. node:10352 would not match) // group 2: drive letter on windows with trailing backslash or leading slash on mac/linux // group 3: line number, matched by (:(\d+)) // group 4: column number, matched by ((?::(\d+))?) diff --git a/src/vs/workbench/parts/debug/electron-browser/replViewer.ts b/src/vs/workbench/parts/debug/electron-browser/replViewer.ts index f9fa4c9fbdd..3442772f59c 100644 --- a/src/vs/workbench/parts/debug/electron-browser/replViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/replViewer.ts @@ -86,11 +86,13 @@ export class ReplExpressionsRenderer implements IRenderer { private width: number; private characterWidth: number; + private linkDetector: LinkDetector; + constructor( @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IInstantiationService private instantiationService: IInstantiationService ) { - // noop + this.linkDetector = this.instantiationService.createInstance(LinkDetector); } public getHeight(tree: ITree, element: any): number { @@ -319,8 +321,7 @@ export class ReplExpressionsRenderer implements IRenderer { // flush text buffer if we have any if (buffer) { - const linkDetector = this.instantiationService.createInstance(LinkDetector); - this.insert(linkDetector.handleLinks(buffer), currentToken || tokensContainer); + this.insert(this.linkDetector.handleLinks(buffer), currentToken || tokensContainer); buffer = ''; } @@ -340,8 +341,7 @@ export class ReplExpressionsRenderer implements IRenderer { // flush remaining text buffer if we have any if (buffer) { - const linkDetector = this.instantiationService.createInstance(LinkDetector); - let res = linkDetector.handleLinks(buffer); + let res = this.linkDetector.handleLinks(buffer); if (typeof res !== 'string' || currentToken) { if (!tokensContainer) { tokensContainer = document.createElement('span'); From 27647f07a760edb984aeb6978da3ba6f9e067236 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 May 2017 16:21:00 +0200 Subject: [PATCH 0129/1164] wip --- .../contrib/snippet/browser/editorSnippets.ts | 38 +++++++++++++++++ .../contrib/snippet/common/snippetParser.ts | 14 +++---- .../test/browser/editorSnippets.test.ts | 41 +++++++++++++++++++ .../snippet/test/common/snippetParser.test.ts | 32 ++++----------- 4 files changed, 93 insertions(+), 32 deletions(-) create mode 100644 src/vs/editor/contrib/snippet/browser/editorSnippets.ts create mode 100644 src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts new file mode 100644 index 00000000000..d1501376c33 --- /dev/null +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -0,0 +1,38 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { getLeadingWhitespace } from 'vs/base/common/strings'; +import { ICommonCodeEditor, IModel } from 'vs/editor/common/editorCommon'; +import { TextmateSnippet } from '../common/snippetParser'; + + +export class SnippetSession { + + private readonly _editor: ICommonCodeEditor; + private readonly _model: IModel; + private readonly _snippets: TextmateSnippet[] = []; + + constructor(editor: ICommonCodeEditor, snippet: TextmateSnippet) { + this._editor = editor; + this._model = editor.getModel(); + + for (const selection of editor.getSelections()) { + // for each selection get the leading 'reference' whitespace and + // adjust the snippet accordingly. this makes one snippet per selection/cursor + const line = this._model.getLineContent(selection.startLineNumber); + const leadingWhitespace = getLeadingWhitespace(line, 0, selection.startColumn - 1); + const newSnippet = snippet.withIndentation(whitespace => this._model.normalizeIndentation(leadingWhitespace + whitespace)); + this._snippets.push(newSnippet); + + // const offset = this._model.getOffsetAt(selection.getStartPosition()); + // for (const placeholder of snippet.getPlaceholders()) { + // const pos = this._model.getPositionAt(offset + snippet.offset(placeholder)); + // this._model.deltaDecorations + // } + } + } +} diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/common/snippetParser.ts index dd7fdfc42d7..2fbe4c9e5f1 100644 --- a/src/vs/editor/contrib/snippet/common/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/common/snippetParser.ts @@ -231,20 +231,16 @@ export class TextmateSnippet { return pos; } - placeholders(): Map { - const map = new Map(); + + getPlaceholders(): Placeholder[] { + const ret: Placeholder[] = []; walk(this.marker, candidate => { if (candidate instanceof Placeholder) { - let array = map.get(candidate.name); - if (!array) { - map.set(candidate.name, [candidate]); - } else { - array.push(candidate); - } + ret.push(candidate); } return true; }); - return map; + return ret; } get value() { diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts new file mode 100644 index 00000000000..3a02a611d50 --- /dev/null +++ b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts @@ -0,0 +1,41 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import * as assert from 'assert'; +import { Selection } from 'vs/editor/common/core/selection'; +import { SnippetSession } from 'vs/editor/contrib/snippet/browser/editorSnippets'; +import { SnippetParser } from 'vs/editor/contrib/snippet/common/snippetParser'; +import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; +import { mockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; + + +suite('Editor Contrib - Snippets', () => { + + let editor: ICommonCodeEditor; + + setup(() => { + editor = mockCodeEditor([ + 'function foo() {', + '\tconsole.log(a)', + '}' + ], {}); + }); + + teardown(() => { + editor.dispose(); + }); + + test('snippets', () => { + + editor.setSelections([ + new Selection(1, 1, 1, 1), + new Selection(2, 2, 2, 2), + ]); + + new SnippetSession(editor, SnippetParser.parse('foo\n${1:bar}\nfoo')); + assert.ok(true); + }); +}); diff --git a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts index e5acd64f7ec..0bbf14eec0d 100644 --- a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts +++ b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts @@ -332,35 +332,21 @@ suite('SnippetParser', () => { test('TextmateSnippet#placeholder', () => { let snippet = SnippetParser.parse('te$1xt'); - let placeholders = snippet.placeholders(); - assert.equal(placeholders.size, 1); - let array = placeholders.get('1'); - assert.equal(array.length, 1); + let placeholders = snippet.getPlaceholders(); + assert.equal(placeholders.length, 1); snippet = SnippetParser.parse('te$1xt$1'); - placeholders = snippet.placeholders(); - assert.equal(placeholders.size, 1); - array = placeholders.get('1'); - assert.equal(array.length, 2); + placeholders = snippet.getPlaceholders(); + assert.equal(placeholders.length, 2); + snippet = SnippetParser.parse('te$1xt$2'); - placeholders = snippet.placeholders(); - assert.equal(placeholders.size, 2); - array = placeholders.get('1'); - assert.equal(array.length, 1); - array = placeholders.get('2'); - assert.equal(array.length, 1); + placeholders = snippet.getPlaceholders(); + assert.equal(placeholders.length, 2); snippet = SnippetParser.parse('${1:bar${2:foo}bar}'); - placeholders = snippet.placeholders(); - assert.equal(placeholders.size, 2); - array = placeholders.get('1'); - assert.equal(array.length, 1); - assert.equal(snippet.offset(array[0]), 0); - - array = placeholders.get('2'); - assert.equal(array.length, 1); - assert.equal(snippet.offset(array[0]), 3); + placeholders = snippet.getPlaceholders(); + assert.equal(placeholders.length, 2); }); test('TextmateSnippet#withIndentation', () => { From 717f328ab7febbd47a5b0b17b5ffcd8058a69af3 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 5 May 2017 16:32:19 +0200 Subject: [PATCH 0130/1164] Snippets with tab (and other control sequences) insert [object Object]. Fixes #25938 --- extensions/json/server/npm-shrinkwrap.json | 10 +++++----- extensions/json/server/package.json | 4 ++-- src/vs/base/common/json.ts | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/extensions/json/server/npm-shrinkwrap.json b/extensions/json/server/npm-shrinkwrap.json index 4571e4d6bcc..b986bef9080 100644 --- a/extensions/json/server/npm-shrinkwrap.json +++ b/extensions/json/server/npm-shrinkwrap.json @@ -28,9 +28,9 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-0.3.6.tgz" }, "jsonc-parser": { - "version": "0.4.1", - "from": "jsonc-parser@0.4.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-0.4.1.tgz" + "version": "0.4.2", + "from": "jsonc-parser@0.4.2", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-0.4.2.tgz" }, "ms": { "version": "0.7.2", @@ -43,9 +43,9 @@ "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.2.0.tgz" }, "vscode-json-languageservice": { - "version": "2.0.8", + "version": "2.0.9", "from": "vscode-json-languageservice@next", - "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-2.0.8.tgz" + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-2.0.9.tgz" }, "vscode-jsonrpc": { "version": "3.1.0-alpha.1", diff --git a/extensions/json/server/package.json b/extensions/json/server/package.json index 4b0a98a80a2..33d3cd9c8a0 100644 --- a/extensions/json/server/package.json +++ b/extensions/json/server/package.json @@ -8,9 +8,9 @@ "node": "*" }, "dependencies": { - "jsonc-parser": "^0.4.1", + "jsonc-parser": "^0.4.2", "request-light": "^0.2.0", - "vscode-json-languageservice": "^2.0.8", + "vscode-json-languageservice": "^2.0.9", "vscode-languageserver": "^3.1.0-alpha.1", "vscode-nls": "^2.0.2" }, diff --git a/src/vs/base/common/json.ts b/src/vs/base/common/json.ts index 03f8216334d..f6391913084 100644 --- a/src/vs/base/common/json.ts +++ b/src/vs/base/common/json.ts @@ -232,7 +232,7 @@ export function createScanner(text: string, ignoreTrivia: boolean = false): JSON break; } else { scanError = ScanError.InvalidCharacter; - break; + // mark as error but continue with string } } pos++; From b14cce8b5d8a81c76a87c18fcf598b0b5cbf9636 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 5 May 2017 16:51:58 +0200 Subject: [PATCH 0131/1164] Fixes #4271: Try to detect the OSX emoji picker case --- src/vs/base/common/strings.ts | 9 +++ src/vs/base/test/common/strings.test.ts | 18 +++++ .../browser/controller/textAreaInput.ts | 11 +-- .../browser/controller/textAreaState.ts | 46 +++++++++++- .../browser/controller/textAreaState.test.ts | 71 ++++++++++++++++++- 5 files changed, 146 insertions(+), 9 deletions(-) diff --git a/src/vs/base/common/strings.ts b/src/vs/base/common/strings.ts index 1886577902b..034b349767e 100644 --- a/src/vs/base/common/strings.ts +++ b/src/vs/base/common/strings.ts @@ -503,6 +503,15 @@ export function containsRTL(str: string): boolean { return CONTAINS_RTL.test(str); } +/** + * Generated using https://github.com/alexandrudima/unicode-utils/blob/master/generate-emoji-test.js + */ +const CONTAINS_EMOJI = /(?:[\u231A\u231B\u23F0\u23F3\u2600-\u27BF\u2B50\u2B55]|\uD83C[\uDDE6-\uDDFF\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F\uDE80-\uDEF8]|\uD83E[\uDD00-\uDDE6])/; + +export function containsEmoji(str: string): boolean { + return CONTAINS_EMOJI.test(str); +} + const IS_BASIC_ASCII = /^[\t\n\r\x20-\x7E]*$/; /** * Returns true if `str` contains only basic ASCII characters in the range 32 - 126 (including 32 and 126) or \n, \r, \t diff --git a/src/vs/base/test/common/strings.test.ts b/src/vs/base/test/common/strings.test.ts index 7681a2e702c..1364b35f8d5 100644 --- a/src/vs/base/test/common/strings.test.ts +++ b/src/vs/base/test/common/strings.test.ts @@ -231,6 +231,24 @@ suite('Strings', () => { assert.equal(strings.containsRTL('זוהי עובדה מבוססת שדעתו'), true); }); + test('containsEmoji', () => { + assert.equal(strings.containsEmoji('a'), false); + assert.equal(strings.containsEmoji(''), false); + assert.equal(strings.containsEmoji(strings.UTF8_BOM_CHARACTER + 'a'), false); + assert.equal(strings.containsEmoji('hello world!'), false); + assert.equal(strings.containsEmoji('هناك حقيقة مثبتة منذ زمن طويل'), false); + assert.equal(strings.containsEmoji('זוהי עובדה מבוססת שדעתו'), false); + + assert.equal(strings.containsEmoji('a📚📚b'), true); + assert.equal(strings.containsEmoji('1F600 # 😀 grinning face'), true); + assert.equal(strings.containsEmoji('1F47E # 👾 alien monster'), true); + assert.equal(strings.containsEmoji('1F467 1F3FD # 👧🏽 girl: medium skin tone'), true); + assert.equal(strings.containsEmoji('26EA # ⛪ church'), true); + assert.equal(strings.containsEmoji('231B # ⌛ hourglass'), true); + assert.equal(strings.containsEmoji('2702 # ✂ scissors'), true); + assert.equal(strings.containsEmoji('1F1F7 1F1F4 # 🇷🇴 Romania'), true); + }); + // test('containsRTL speed', () => { // var SIZE = 1000000; // var REPEAT = 10; diff --git a/src/vs/editor/browser/controller/textAreaInput.ts b/src/vs/editor/browser/controller/textAreaInput.ts index 08f91649c41..757bbf1dd41 100644 --- a/src/vs/editor/browser/controller/textAreaInput.ts +++ b/src/vs/editor/browser/controller/textAreaInput.ts @@ -11,6 +11,7 @@ import { KeyCode } from 'vs/base/common/keyCodes'; import { Disposable } from 'vs/base/common/lifecycle'; import { ITypeData, TextAreaState, ITextAreaWrapper } from 'vs/editor/browser/controller/textAreaState'; import * as browser from 'vs/base/browser/browser'; +import * as platform from 'vs/base/common/platform'; import * as dom from 'vs/base/browser/dom'; import { IKeyboardEvent } from "vs/base/browser/keyboardEvent"; import { FastDomNode } from "vs/base/browser/fastDomNode"; @@ -138,10 +139,10 @@ export class TextAreaInput extends Disposable { /** * Deduce the typed input from a text area's value and the last observed state. */ - const deduceInputFromTextAreaValue = (): [TextAreaState, ITypeData] => { + const deduceInputFromTextAreaValue = (couldBeEmojiInput: boolean): [TextAreaState, ITypeData] => { const oldState = this._textAreaState; const newState = this._textAreaState.readFromTextArea(this._textArea); - return [newState, TextAreaState.deduceInput(oldState, newState)]; + return [newState, TextAreaState.deduceInput(oldState, newState, couldBeEmojiInput)]; }; /** @@ -172,7 +173,7 @@ export class TextAreaInput extends Disposable { // Multi-part Japanese compositions reset cursor in Edge/IE, Chinese and Korean IME don't have this issue. // The reason that we can't use this path for all CJK IME is IE and Edge behave differently when handling Korean IME, // which breaks this path of code. - const [newState, typeInput] = deduceInputFromTextAreaValue(); + const [newState, typeInput] = deduceInputFromTextAreaValue(/*couldBeEmojiInput*/false); this._textAreaState = newState; this._onType.fire(typeInput); this._onCompositionUpdate.fire(e); @@ -188,7 +189,7 @@ export class TextAreaInput extends Disposable { this._register(dom.addDisposableListener(textArea.domNode, 'compositionend', (e: CompositionEvent) => { if (browser.isEdgeOrIE && e.locale === 'ja') { // https://github.com/Microsoft/monaco-editor/issues/339 - const [newState, typeInput] = deduceInputFromTextAreaValue(); + const [newState, typeInput] = deduceInputFromTextAreaValue(/*couldBeEmojiInput*/false); this._textAreaState = newState; this._onType.fire(typeInput); } @@ -228,7 +229,7 @@ export class TextAreaInput extends Disposable { return; } - const [newState, typeInput] = deduceInputFromTextAreaValue(); + const [newState, typeInput] = deduceInputFromTextAreaValue(/*couldBeEmojiInput*/platform.isMacintosh); if (typeInput.replaceCharCnt === 0 && typeInput.text.length === 1 && strings.isHighSurrogate(typeInput.text.charCodeAt(0))) { // Ignore invalid input but keep it around for next time return; diff --git a/src/vs/editor/browser/controller/textAreaState.ts b/src/vs/editor/browser/controller/textAreaState.ts index c9218a06db0..2e3bf4009a4 100644 --- a/src/vs/editor/browser/controller/textAreaState.ts +++ b/src/vs/editor/browser/controller/textAreaState.ts @@ -81,7 +81,7 @@ export class TextAreaState { return new TextAreaState(text, 0, text.length, 0); } - public static deduceInput(previousState: TextAreaState, currentState: TextAreaState): ITypeData { + public static deduceInput(previousState: TextAreaState, currentState: TextAreaState, couldBeEmojiInput: boolean): ITypeData { if (!previousState) { // This is the EMPTY state return { @@ -91,8 +91,8 @@ export class TextAreaState { } // console.log('------------------------deduceInput'); - // console.log('CURRENT STATE: ' + currentState.toString()); // console.log('PREVIOUS STATE: ' + previousState.toString()); + // console.log('CURRENT STATE: ' + currentState.toString()); let previousValue = previousState.value; let previousSelectionStart = previousState.selectionStart; @@ -118,8 +118,48 @@ export class TextAreaState { currentSelectionEnd -= prefixLength; previousSelectionEnd -= prefixLength; - // console.log('AFTER DIFFING CURRENT STATE: <' + currentValue + '>, selectionStart: ' + currentSelectionStart + ', selectionEnd: ' + currentSelectionEnd); // console.log('AFTER DIFFING PREVIOUS STATE: <' + previousValue + '>, selectionStart: ' + previousSelectionStart + ', selectionEnd: ' + previousSelectionEnd); + // console.log('AFTER DIFFING CURRENT STATE: <' + currentValue + '>, selectionStart: ' + currentSelectionStart + ', selectionEnd: ' + currentSelectionEnd); + + if (couldBeEmojiInput && currentSelectionStart === currentSelectionEnd && previousValue.length > 0) { + // on OSX, emojis from the emoji picker are inserted at random locations + // the only hints we can use is that the selection is immediately after the inserted emoji + // and that none of the old text has been deleted + + let potentialEmojiInput: string = null; + + if (currentSelectionStart === currentValue.length) { + // emoji potentially inserted "somewhere" after the previous selection => it should appear at the end of `currentValue` + if (strings.startsWith(currentValue, previousValue)) { + // only if all of the old text is accounted for + potentialEmojiInput = currentValue.substring(previousValue.length); + } + } else { + // emoji potentially inserted "somewhere" before the previous selection => it should appear at the start of `currentValue` + if (strings.endsWith(currentValue, previousValue)) { + // only if all of the old text is accounted for + potentialEmojiInput = currentValue.substring(0, currentValue.length - previousValue.length); + } + } + + if (potentialEmojiInput !== null && potentialEmojiInput.length > 0) { + // now we check that this is indeed an emoji + // emojis can grow quite long, so a length check is of no help + // e.g. 1F3F4 E0067 E0062 E0065 E006E E0067 E007F ; fully-qualified # 🏴󠁧󠁢󠁥󠁮󠁧󠁿 England + + // Oftentimes, emojis use Variation Selector-16 (U+FE0F), so that is a good hint + // http://emojipedia.org/variation-selector-16/ + // > An invisible codepoint which specifies that the preceding character + // > should be displayed with emoji presentation. Only required if the + // > preceding character defaults to text presentation. + if (/\uFE0F/.test(potentialEmojiInput) || strings.containsEmoji(potentialEmojiInput)) { + return { + text: potentialEmojiInput, + replaceCharCnt: 0 + }; + } + } + } if (currentSelectionStart === currentSelectionEnd) { // composition accept case (noticed in FF + Japanese) diff --git a/src/vs/editor/test/browser/controller/textAreaState.test.ts b/src/vs/editor/test/browser/controller/textAreaState.test.ts index ca8cad271a0..a385e6904f7 100644 --- a/src/vs/editor/test/browser/controller/textAreaState.test.ts +++ b/src/vs/editor/test/browser/controller/textAreaState.test.ts @@ -122,7 +122,7 @@ suite('TextAreaState', () => { textArea._selectionEnd = selectionEnd; let newState = prevState.readFromTextArea(textArea); - let actual = TextAreaState.deduceInput(prevState, newState); + let actual = TextAreaState.deduceInput(prevState, newState, true); assert.equal(actual.text, expected); assert.equal(actual.replaceCharCnt, expectedCharReplaceCnt); @@ -420,6 +420,75 @@ suite('TextAreaState', () => { ); }); + test('issue #4271 (example 1) - When inserting an emoji on OSX, it is placed two spaces left of the cursor', () => { + // The OSX emoji inserter inserts emojis at random positions in the text, unrelated to where the cursor is. + testDeduceInput( + new TextAreaState( + [ + 'some1 text', + 'some2 text', + 'some3 text', + 'some4 text', // cursor is here in the middle of the two spaces + 'some5 text', + 'some6 text', + 'some7 text' + ].join('\n'), + 42, 42, 0 + ), + [ + 'so📅me1 text', + 'some2 text', + 'some3 text', + 'some4 text', + 'some5 text', + 'some6 text', + 'some7 text' + ].join('\n'), + 4, 4, + '📅', 0 + ); + }); + + test('issue #4271 (example 2) - When inserting an emoji on OSX, it is placed two spaces left of the cursor', () => { + // The OSX emoji inserter inserts emojis at random positions in the text, unrelated to where the cursor is. + testDeduceInput( + new TextAreaState( + 'some1 text', + 6, 6, 0 + ), + 'some💊1 text', + 6, 6, + '💊', 0 + ); + }); + + test('issue #4271 (example 3) - When inserting an emoji on OSX, it is placed two spaces left of the cursor', () => { + // The OSX emoji inserter inserts emojis at random positions in the text, unrelated to where the cursor is. + testDeduceInput( + new TextAreaState( + 'qwertyu\nasdfghj\nzxcvbnm', + 12, 12, 0 + ), + 'qwertyu\nasdfghj\nzxcvbnm🎈', + 25, 25, + '🎈', 0 + ); + }); + + // an example of an emoji missed by the regex but which has the FE0F variant 16 hint + test('issue #4271 (example 4) - When inserting an emoji on OSX, it is placed two spaces left of the cursor', () => { + // The OSX emoji inserter inserts emojis at random positions in the text, unrelated to where the cursor is. + testDeduceInput( + new TextAreaState( + 'some1 text', + 6, 6, 0 + ), + 'some⌨️1 text', + 6, 6, + '⌨️', 0 + ); + }); + function testFromEditorSelectionAndPreviousState(eol: string, lines: string[], range: Range, prevSelectionToken: number): TextAreaState { let model = new SimpleModel(lines, eol); let previousState = new TextAreaState('', 0, 0, prevSelectionToken); From 29d0a488d00876a0f0a97d956dc0d0e4aafea4b0 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 5 May 2017 08:29:09 -0700 Subject: [PATCH 0132/1164] Monokai: Don't use transparency in terminal colors Part of #26050 --- .../theme-monokai/themes/monokai-color-theme.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/extensions/theme-monokai/themes/monokai-color-theme.json b/extensions/theme-monokai/themes/monokai-color-theme.json index 7f54f825424..d8138d5cd91 100644 --- a/extensions/theme-monokai/themes/monokai-color-theme.json +++ b/extensions/theme-monokai/themes/monokai-color-theme.json @@ -71,12 +71,12 @@ "peekViewResult.matchHighlightBackground": "#75715E", "peekViewEditor.matchHighlightBackground": "#75715E", "terminal.ansiBlack": "#333333", - "terminal.ansiRed": "#f92672BF", - "terminal.ansiGreen": "#A6E22EBF", - "terminal.ansiYellow": "#e2e22eBF", - "terminal.ansiBlue": "#819affBF", - "terminal.ansiMagenta": "#AE81FFBF", - "terminal.ansiCyan": "#66D9EFBF", + "terminal.ansiRed": "#C4265E", // the bright color with ~75% transparent on the background + "terminal.ansiGreen": "#86B42B", + "terminal.ansiYellow": "#B3B42B", + "terminal.ansiBlue": "#6A7EC8", + "terminal.ansiMagenta": "#8C6BC8", + "terminal.ansiCyan": "#56ADBC", "terminal.ansiWhite": "#e3e3dd", "terminal.ansiBrightBlack": "#666666", "terminal.ansiBrightRed": "#f92672", From f36141ac5e0e1ce08112358c41e4e707a25e1693 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 5 May 2017 08:30:46 -0700 Subject: [PATCH 0133/1164] Remove no longer existing theme key from Red --- extensions/theme-red/themes/Red-color-theme.json | 1 - 1 file changed, 1 deletion(-) diff --git a/extensions/theme-red/themes/Red-color-theme.json b/extensions/theme-red/themes/Red-color-theme.json index 9db55816d80..22e587a81f9 100644 --- a/extensions/theme-red/themes/Red-color-theme.json +++ b/extensions/theme-red/themes/Red-color-theme.json @@ -46,7 +46,6 @@ "list.activeSelectionBackground": "#880000", "list.inactiveSelectionBackground": "#770000", "list.dropBackground": "#662222", - "list.focusAndSelectionBackground": "#882222", "list.focusBackground": "#660000", "list.highlightForeground": "#ff4444", "notification.background": "#662222", From b26e1454accd59efa031117c17e65d2b9442d00d Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 5 May 2017 08:43:35 -0700 Subject: [PATCH 0134/1164] Support terminal bg and fg color keys Fixes #24735 --- .../parts/terminal/electron-browser/media/xterm.css | 1 - .../electron-browser/terminalColorRegistry.ts | 4 ++++ .../parts/terminal/electron-browser/terminalPanel.ts | 11 ++++++++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css b/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css index b5b9a339f22..e8a7ad1348d 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css +++ b/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ .monaco-workbench .panel.integrated-terminal .xterm { - background-color: transparent!important; position: relative; height: 100%; } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts index b0e8fc2ab43..727078be3bc 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts @@ -13,6 +13,9 @@ import { registerColor, ColorIdentifier } from 'vs/platform/theme/common/colorRe */ export const ansiColorIdentifiers: ColorIdentifier[] = []; +export const TERMINAL_BACKGROUND_COLOR = registerColor('terminal.background', null, nls.localize('terminal.background', 'The background color of the terminal, this allows coloring the terminal differently to the panel.')); +export const TERMINAL_FOREGROUND_COLOR = registerColor('terminal.foreground', null, nls.localize('terminal.foreground', 'The foreground color of the terminal.')); + const ansiColorMap = { 'terminal.ansiBlack': { index: 0, @@ -150,4 +153,5 @@ export function registerColors(): void { let colorName = id.substring(13); ansiColorIdentifiers[entry.index] = registerColor(id, entry.defaults, nls.localize('terminal.ansiColor', '\'{0}\' ansi color in the terminal.', colorName)); } + } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index 46dee45dc7f..b879da8392d 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -16,7 +16,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ITerminalService, ITerminalFont, TERMINAL_PANEL_ID } from 'vs/workbench/parts/terminal/common/terminal'; import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; -import { ansiColorIdentifiers } from './terminalColorRegistry'; +import { ansiColorIdentifiers, TERMINAL_BACKGROUND_COLOR, TERMINAL_FOREGROUND_COLOR } from './terminalColorRegistry'; import { ColorIdentifier } from 'vs/platform/theme/common/colorRegistry'; import { KillTerminalAction, CreateNewTerminalAction, SwitchTerminalInstanceAction, SwitchTerminalInstanceActionItem, CopyTerminalSelectionAction, TerminalPasteAction, ClearTerminalAction } from 'vs/workbench/parts/terminal/electron-browser/terminalActions'; import { Panel } from 'vs/workbench/browser/panel'; @@ -226,6 +226,15 @@ export class TerminalPanel extends Panel { `.monaco-workbench .panel.integrated-terminal .xterm .xterm-bg-color-${index}::selection { color: ${color}; }`; } }); + const bgColor = theme.getColor(TERMINAL_BACKGROUND_COLOR); + if (bgColor) { + console.log('set bgColor to: ' + bgColor); + css += `.monaco-workbench .panel.integrated-terminal .terminal-outer-container { background-color: ${bgColor}; }`; + } + const fgColor = theme.getColor(TERMINAL_FOREGROUND_COLOR); + if (bgColor) { + css += `.monaco-workbench .panel.integrated-terminal .xterm { color: ${fgColor}; }`; + } this._themeStyleElement.innerHTML = css; } From 63bbadab07360662832c7233210f8ac5a46e627b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 5 May 2017 17:56:29 +0200 Subject: [PATCH 0135/1164] remove unused code now that git classic is deleted (fixes #22275) --- .../browser/parts/editor/baseEditor.ts | 265 +----------------- .../parts/editor/editor.contribution.ts | 2 - .../browser/parts/editor/textDiffEditor.ts | 3 +- .../browser/parts/editor/titleControl.ts | 32 +-- .../common/editor/stringEditorInput.ts | 131 --------- .../common/editor/stringEditorModel.ts | 67 ----- .../editor/test/browser/editorService.test.ts | 19 +- .../browser/parts/editor/baseEditor.test.ts | 91 +----- .../common/editor/editorDiffModel.test.ts | 86 ++++++ .../test/common/editor/editorModel.test.ts | 29 -- .../common/editor/stringEditorInput.test.ts | 115 -------- .../common/editor/stringEditorModel.test.ts | 75 ----- 12 files changed, 102 insertions(+), 813 deletions(-) delete mode 100644 src/vs/workbench/common/editor/stringEditorInput.ts delete mode 100644 src/vs/workbench/common/editor/stringEditorModel.ts create mode 100644 src/vs/workbench/test/common/editor/editorDiffModel.test.ts delete mode 100644 src/vs/workbench/test/common/editor/stringEditorInput.test.ts delete mode 100644 src/vs/workbench/test/common/editor/stringEditorModel.test.ts diff --git a/src/vs/workbench/browser/parts/editor/baseEditor.ts b/src/vs/workbench/browser/parts/editor/baseEditor.ts index 1aff5f9a493..c113ae2837f 100644 --- a/src/vs/workbench/browser/parts/editor/baseEditor.ts +++ b/src/vs/workbench/browser/parts/editor/baseEditor.ts @@ -5,14 +5,12 @@ 'use strict'; import { TPromise } from 'vs/base/common/winjs.base'; -import { Action, IAction } from 'vs/base/common/actions'; -import { ActionBarContributor } from 'vs/workbench/browser/actionBarRegistry'; import types = require('vs/base/common/types'); import { Builder } from 'vs/base/browser/builder'; import { Registry } from 'vs/platform/platform'; import { Panel } from 'vs/workbench/browser/panel'; import { EditorInput, EditorOptions, IEditorDescriptor, IEditorInputFactory, IEditorRegistry, Extensions, IFileInputFactory } from 'vs/workbench/common/editor'; -import { IEditor, Position, POSITIONS } from 'vs/platform/editor/common/editor'; +import { IEditor, Position } from 'vs/platform/editor/common/editor'; import { IInstantiationService, IConstructorSignature0 } from 'vs/platform/instantiation/common/instantiation'; import { SyncDescriptor, AsyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -304,263 +302,4 @@ class EditorRegistry implements IEditorRegistry { } } -Registry.add(Extensions.Editors, new EditorRegistry()); - -/** - * The context that will be passed in to the EditorInputActionContributor. - */ -export interface IEditorInputActionContext { - editor: BaseEditor; - input: EditorInput; - position: Position; -} - -/** - * A variant of the action bar contributor to register actions to specific editor inputs of the editor. This allows to have more - * fine grained control over actions compared to contributing an action to a specific editor. - */ -export class EditorInputActionContributor extends ActionBarContributor { - - // The following data structures are partitioned into arrays of Position (one, two, three) - private mapEditorInputActionContextToPrimaryActions: { [id: string]: IEditorInputAction[] }[]; - private mapEditorInputActionContextToSecondaryActions: { [id: string]: IEditorInputAction[] }[]; - - constructor() { - super(); - - this.mapEditorInputActionContextToPrimaryActions = this.createPositionArray(); - this.mapEditorInputActionContextToSecondaryActions = this.createPositionArray(); - } - - private createPositionArray(): any[] { - const array: any[] = []; - - for (let i = 0; i < POSITIONS.length; i++) { - array[i] = {}; - } - - return array; - } - - /* Subclasses can override to provide a custom cache implementation */ - protected toId(context: IEditorInputActionContext): string { - return context.editor.getId() + context.input.getTypeId(); - } - - private clearInputsFromCache(position: Position, isPrimary: boolean): void { - if (isPrimary) { - this.doClearInputsFromCache(this.mapEditorInputActionContextToPrimaryActions[position]); - } else { - this.doClearInputsFromCache(this.mapEditorInputActionContextToSecondaryActions[position]); - } - } - - private doClearInputsFromCache(cache: { [id: string]: IEditorInputAction[] }): void { - for (let key in cache) { - if (cache.hasOwnProperty(key)) { - const cachedActions = cache[key]; - cachedActions.forEach((action) => { - action.input = null; - action.position = null; - }); - } - } - } - - /** - * Returns true if this contributor has actions for the given editor input. Subclasses must not - * override this method but instead hasActionsForEditorInput(); - */ - public hasActions(context: IEditorInputActionContext): boolean { - if (!this.checkEditorContext(context)) { - return false; - } - - // Ask Cache - if (this.mapEditorInputActionContextToPrimaryActions[context.position][this.toId(context)]) { - return true; - } - - // Ask Client - return this.hasActionsForEditorInput(context); - } - - /** - * Returns an array of actions for the given editor input. Subclasses must not override this - * method but instead getActionsForEditorInput(); - */ - public getActions(context: IEditorInputActionContext): IAction[] { - if (!this.checkEditorContext(context)) { - return []; - } - - // This will cause any cached action to be set with null for the current editor input to prevent - // leaking actions that still think the current editor input is what was set before. - this.clearInputsFromCache(context.position, true /* primary actions */); - - // First consult cache - const editorInput = context.input; - const editorPosition = context.position; - const cachedActions = this.mapEditorInputActionContextToPrimaryActions[context.position][this.toId(context)]; - if (cachedActions) { - - // Update the input field and position in all actions to indicate this change and return - cachedActions.forEach((action) => { - action.input = editorInput; - action.position = editorPosition; - }); - - return cachedActions; - } - - // Otherwise collect and keep in cache - const actions = this.getActionsForEditorInput(context); - actions.forEach((action) => { - action.input = editorInput; - action.position = editorPosition; - }); - - this.mapEditorInputActionContextToPrimaryActions[context.position][this.toId(context)] = actions; - - return actions; - } - - /** - * Returns true if this contributor has actions for the given editor input. Subclasses must not - * override this method but instead hasSecondaryActionsForEditorInput(); - */ - public hasSecondaryActions(context: IEditorInputActionContext): boolean { - if (!this.checkEditorContext(context)) { - return false; - } - - // Ask Cache - if (this.mapEditorInputActionContextToSecondaryActions[context.position][this.toId(context)]) { - return true; - } - - // Ask Client - return this.hasSecondaryActionsForEditorInput(context); - } - - /** - * Returns an array of actions for the given editor input. Subclasses must not override this - * method but instead getSecondaryActionsForEditorInput(); - */ - public getSecondaryActions(context: IEditorInputActionContext): IAction[] { - if (!this.checkEditorContext(context)) { - return []; - } - - // This will cause any cached action to be set with null for the current editor input to prevent - // leaking actions that still think the current editor input is what was set before. - this.clearInputsFromCache(context.position, false /* secondary actions */); - - // First consult cache - const editorInput = context.input; - const editorPosition = context.position; - const cachedActions = this.mapEditorInputActionContextToSecondaryActions[context.position][this.toId(context)]; - if (cachedActions) { - - // Update the input field and position in all actions to indicate this change and return - cachedActions.forEach((action) => { - action.input = editorInput; - action.position = editorPosition; - }); - - return cachedActions; - } - - // Otherwise collect and keep in cache - const actions = this.getSecondaryActionsForEditorInput(context); - actions.forEach((action) => { - action.input = editorInput; - action.position = editorPosition; - }); - - this.mapEditorInputActionContextToSecondaryActions[context.position][this.toId(context)] = actions; - - return actions; - } - - private checkEditorContext(context: IEditorInputActionContext): boolean { - return context && context.input instanceof EditorInput && context.editor instanceof BaseEditor && !types.isUndefinedOrNull(context.position); - } - - /** - * Returns true if this contributor has primary actions for the given editor input. - */ - public hasActionsForEditorInput(context: IEditorInputActionContext): boolean { - return false; - } - - /** - * Returns an array of primary actions for the given editor input. - */ - public getActionsForEditorInput(context: IEditorInputActionContext): IEditorInputAction[] { - return []; - } - - /** - * Returns true if this contributor has secondary actions for the given editor input. - */ - public hasSecondaryActionsForEditorInput(context: IEditorInputActionContext): boolean { - return false; - } - - /** - * Returns an array of secondary actions for the given editor input. - */ - public getSecondaryActionsForEditorInput(context: IEditorInputActionContext): IEditorInputAction[] { - return []; - } -} - -/** - * An editorinput action is contributed to an editor based on the editor input of the editor that is currently - * active. When the editor input changes, the action will be get the new editor input set so that the enablement - * state can be updated. In addition the position of the editor for the given input is applied. - */ -export interface IEditorInputAction extends IAction { - - /** - * The input of the editor for which this action is running. - */ - input: EditorInput; - - /** - * The position of the editor for which this action is running. - */ - position: Position; - - /** - * Implementors to define if the action is enabled or not. - */ - isEnabled(): boolean; -} - -export class EditorInputAction extends Action implements IEditorInputAction { - private _input: EditorInput; - private _position: Position; - - public get input(): EditorInput { - return this._input; - } - - public set input(input: EditorInput) { - this._input = input; - this.enabled = this.isEnabled(); - } - - public get position(): Position { - return this._position; - } - - public set position(position: Position) { - this._position = position; - } - - public isEnabled(): boolean { - return !!this._input; - } -} \ No newline at end of file +Registry.add(Extensions.Editors, new EditorRegistry()); \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/editor/editor.contribution.ts b/src/vs/workbench/browser/parts/editor/editor.contribution.ts index 51cbe1aef5d..e8a5d028fd3 100644 --- a/src/vs/workbench/browser/parts/editor/editor.contribution.ts +++ b/src/vs/workbench/browser/parts/editor/editor.contribution.ts @@ -12,7 +12,6 @@ import { IEditorQuickOpenEntry, IQuickOpenRegistry, Extensions as QuickOpenExten import { StatusbarItemDescriptor, StatusbarAlignment, IStatusbarRegistry, Extensions as StatusExtensions } from 'vs/workbench/browser/parts/statusbar/statusbar'; import { EditorDescriptor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { EditorInput, IEditorRegistry, Extensions as EditorExtensions, IEditorInputFactory, SideBySideEditorInput } from 'vs/workbench/common/editor'; -import { StringEditorInput } from 'vs/workbench/common/editor/stringEditorInput'; import { TextResourceEditor } from 'vs/workbench/browser/parts/editor/textResourceEditor'; import { SideBySideEditor } from 'vs/workbench/browser/parts/editor/sideBySideEditor'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; @@ -47,7 +46,6 @@ Registry.as(EditorExtensions.Editors).registerEditor( 'TextResourceEditor' ), [ - new SyncDescriptor(StringEditorInput), new SyncDescriptor(UntitledEditorInput), new SyncDescriptor(ResourceEditorInput) ] diff --git a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts index 3cc0c4b20a8..cf310d07ac4 100644 --- a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts @@ -17,7 +17,6 @@ import { IDiffEditor } from 'vs/editor/browser/editorBrowser'; import { IDiffEditorOptions, IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { BaseTextEditor, IEditorConfiguration } from 'vs/workbench/browser/parts/editor/textEditor'; import { TextEditorOptions, TextDiffEditorOptions, EditorInput, EditorOptions, TEXT_DIFF_EDITOR_ID, IFileEditorInput } from 'vs/workbench/common/editor'; -import { StringEditorInput } from 'vs/workbench/common/editor/stringEditorInput'; import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { DiffNavigator } from 'vs/editor/contrib/diffNavigator/common/diffNavigator'; @@ -249,7 +248,7 @@ export class TextDiffEditor extends BaseTextEditor { if (input instanceof DiffEditorInput) { const modifiedInput = input.modifiedInput; - return modifiedInput instanceof StringEditorInput || modifiedInput instanceof ResourceEditorInput; + return modifiedInput instanceof ResourceEditorInput; } return false; diff --git a/src/vs/workbench/browser/parts/editor/titleControl.ts b/src/vs/workbench/browser/parts/editor/titleControl.ts index 9777863076a..acb5d5e3e26 100644 --- a/src/vs/workbench/browser/parts/editor/titleControl.ts +++ b/src/vs/workbench/browser/parts/editor/titleControl.ts @@ -13,7 +13,7 @@ import { IAction, Action } from 'vs/base/common/actions'; import errors = require('vs/base/common/errors'); import DOM = require('vs/base/browser/dom'); import { TPromise } from 'vs/base/common/winjs.base'; -import { BaseEditor, IEditorInputActionContext } from 'vs/workbench/browser/parts/editor/baseEditor'; +import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { RunOnceScheduler } from 'vs/base/common/async'; import { isCommonCodeEditor, isCommonDiffEditor } from 'vs/editor/common/editorCommon'; import arrays = require('vs/base/common/arrays'); @@ -303,17 +303,12 @@ export abstract class TitleControl extends Themable implements ITitleAreaControl // Editor Control Actions let editorActions = this.mapActionsToEditors[control.getId()]; if (!editorActions) { - editorActions = this.getEditorActionsForContext(control); + editorActions = { primary: control.getActions(), secondary: control.getSecondaryActions() }; this.mapActionsToEditors[control.getId()] = editorActions; } primary.push(...editorActions.primary); secondary.push(...editorActions.secondary); - // Editor Input Actions - const editorInputActions = this.getEditorActionsForContext({ input: control.input, editor: control, position: control.position }); - primary.push(...editorInputActions.primary); - secondary.push(...editorInputActions.secondary); - // MenuItems // TODO This isn't very proper but needed as we have failed to // use the correct context key service per editor only once. Don't @@ -331,29 +326,6 @@ export abstract class TitleControl extends Themable implements ITitleAreaControl return { primary, secondary }; } - private getEditorActionsForContext(context: BaseEditor | IEditorInputActionContext): IToolbarActions { - const primaryActions: IAction[] = []; - const secondaryActions: IAction[] = []; - - // From Editor - if (context instanceof BaseEditor) { - primaryActions.push(...(context).getActions()); - secondaryActions.push(...(context).getSecondaryActions()); - } - - // From Contributions - else { - const actionBarRegistry = Registry.as(Extensions.Actionbar); - primaryActions.push(...actionBarRegistry.getActionBarActionsForContext(Scope.EDITOR, context)); - secondaryActions.push(...actionBarRegistry.getSecondaryActionBarActionsForContext(Scope.EDITOR, context)); - } - - return { - primary: primaryActions, - secondary: secondaryActions - }; - } - protected updateEditorActionsToolbar(): void { const group = this.context; if (!group) { diff --git a/src/vs/workbench/common/editor/stringEditorInput.ts b/src/vs/workbench/common/editor/stringEditorInput.ts deleted file mode 100644 index bf5b0489b87..00000000000 --- a/src/vs/workbench/common/editor/stringEditorInput.ts +++ /dev/null @@ -1,131 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { TPromise } from 'vs/base/common/winjs.base'; -import { PLAINTEXT_MODE_ID } from 'vs/editor/common/modes/modesRegistry'; -import { EditorModel, EditorInput } from 'vs/workbench/common/editor'; -import { StringEditorModel } from 'vs/workbench/common/editor/stringEditorModel'; -import URI from 'vs/base/common/uri'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; - -/** - * A read-only text editor input whos contents are made of the provided value and mode ID. - */ -export class StringEditorInput extends EditorInput { - - public static ID = 'workbench.editors.stringEditorInput'; - - protected cachedModel: StringEditorModel; - - protected value: string; - - private name: string; - private description: string; - private modeId: string; - private singleton: boolean; - - constructor( - name: string, - description: string, - value: string, - modeId: string, - singleton: boolean, - @IInstantiationService private instantiationService: IInstantiationService - ) { - super(); - - this.name = name; - this.description = description; - this.value = value; - this.modeId = modeId || PLAINTEXT_MODE_ID; - this.singleton = singleton; - } - - protected getResource(): URI { - return null; // Subclasses can implement to associate a resource with the input - } - - public getTypeId(): string { - return StringEditorInput.ID; - } - - public getName(): string { - return this.name; - } - - public getDescription(): string { - return this.description; - } - - public getValue(): string { - return this.value; - } - - /** - * Sets the textual value of this input and will also update the underlying model if this input is resolved. - */ - public setValue(value: string): void { - this.value = value; - if (this.cachedModel) { - this.cachedModel.setValue(value); - } - } - - public resolve(refresh?: boolean): TPromise { - - // Use Cached Model - if (this.cachedModel) { - return TPromise.as(this.cachedModel); - } - - //Otherwise Create Model and Load - let model = this.instantiationService.createInstance(StringEditorModel, this.value, this.modeId, this.getResource()); - return model.load().then((resolvedModel: StringEditorModel) => { - this.cachedModel = resolvedModel; - - return this.cachedModel; - }); - } - - public matches(otherInput: any): boolean { - if (super.matches(otherInput) === true) { - return true; - } - - if (otherInput instanceof StringEditorInput) { - let otherStringEditorInput = otherInput; - - // If both inputs are singletons, check on the modeId for equalness - if (otherStringEditorInput.singleton && this.singleton && otherStringEditorInput.modeId === this.modeId) { - return true; - } - - // If we have resource URIs, use those to compare - const resource = this.getResource(); - const otherResource = otherStringEditorInput.getResource(); - if (resource && otherResource) { - return resource.toString() === otherResource.toString(); - } - - // Otherwise compare by properties - return otherStringEditorInput.value === this.value && - otherStringEditorInput.modeId === this.modeId && - otherStringEditorInput.description === this.description && - otherStringEditorInput.name === this.name; - } - - return false; - } - - public dispose(): void { - if (this.cachedModel) { - this.cachedModel.dispose(); - this.cachedModel = null; - } - - super.dispose(); - } -} \ No newline at end of file diff --git a/src/vs/workbench/common/editor/stringEditorModel.ts b/src/vs/workbench/common/editor/stringEditorModel.ts deleted file mode 100644 index bee71a6bb7b..00000000000 --- a/src/vs/workbench/common/editor/stringEditorModel.ts +++ /dev/null @@ -1,67 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { TPromise } from 'vs/base/common/winjs.base'; -import { BaseTextEditorModel } from 'vs/workbench/common/editor/textEditorModel'; -import { EditorModel } from 'vs/workbench/common/editor'; -import URI from 'vs/base/common/uri'; -import { IModeService } from 'vs/editor/common/services/modeService'; -import { IModelService } from 'vs/editor/common/services/modelService'; - -/** - * An editor model whith an in-memory, readonly content that is not backed by any particular resource. - */ -export class StringEditorModel extends BaseTextEditorModel { - protected value: string; - protected modeId: string; - protected resource: URI; - - constructor( - value: string, - modeId: string, - resource: URI, - @IModeService modeService: IModeService, - @IModelService modelService: IModelService - ) { - super(modelService, modeService); - - this.value = value; - this.modeId = modeId; - this.resource = resource; - } - - /** - * The value of this string editor model. - */ - public getValue(): string { - return this.value; - } - - /** - * Sets the value of this string editor model. - */ - public setValue(value: string): void { - this.value = value; - if (this.textEditorModel) { - this.textEditorModel.setValue(value); - } - } - - public load(): TPromise { - - // Create text editor model if not yet done - if (!this.textEditorModel) { - return this.createTextEditorModel(this.value, this.resource, this.modeId); - } - - // Otherwise update - else { - this.updateTextEditorModel(this.value); - } - - return TPromise.as(this); - } -} \ No newline at end of file diff --git a/src/vs/workbench/services/editor/test/browser/editorService.test.ts b/src/vs/workbench/services/editor/test/browser/editorService.test.ts index edf16d9ec26..e1f4057853f 100644 --- a/src/vs/workbench/services/editor/test/browser/editorService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorService.test.ts @@ -12,12 +12,11 @@ import { Position, Direction, IEditor } from 'vs/platform/editor/common/editor'; import URI from 'vs/base/common/uri'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { EditorInput, EditorOptions, TextEditorOptions } from 'vs/workbench/common/editor'; -import { StringEditorInput } from 'vs/workbench/common/editor/stringEditorInput'; -import { StringEditorModel } from 'vs/workbench/common/editor/stringEditorModel'; import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; import { workbenchInstantiationService, TestThemeService } from 'vs/workbench/test/workbenchTestServices'; import { DelegatingWorkbenchEditorService, WorkbenchEditorService, IEditorPart } from 'vs/workbench/services/editor/browser/editorService'; import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorInput'; +import { ResourceEditorInput } from "vs/workbench/common/editor/resourceEditorInput"; let activeEditor: BaseEditor = { getSelection: function () { @@ -176,20 +175,6 @@ suite('WorkbenchEditorService', () => { const untitledInput = openedEditorInput as UntitledEditorInput; assert.ok(untitledInput.hasAssociatedFilePath); }); - - // Resolve Editor Model (Typed EditorInput) - let input = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'hello world', 'text/plain', false); - input.resolve(true).then((model: StringEditorModel) => { - assert(model instanceof StringEditorModel); - - assert(model.isResolved()); - - input.resolve().then((otherModel) => { - assert(model === otherModel); - - input.dispose(); - }); - }); }); test('caching', function () { @@ -274,7 +259,7 @@ suite('WorkbenchEditorService', () => { } let ed = instantiationService.createInstance(MyEditor, 'my.editor'); - let inp = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'hello world', 'text/plain', false); + let inp = instantiationService.createInstance(ResourceEditorInput, 'name', 'description', URI.from('my://resource')); let delegate = instantiationService.createInstance(DelegatingWorkbenchEditorService); delegate.setEditorOpenHandler((input, options?) => { assert.strictEqual(input, inp); diff --git a/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts b/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts index 8571b4a3f0c..cbdc5139462 100644 --- a/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts @@ -6,17 +6,17 @@ 'use strict'; import * as assert from 'assert'; -import { BaseEditor, EditorInputAction, EditorInputActionContributor, EditorDescriptor } from 'vs/workbench/browser/parts/editor/baseEditor'; +import { BaseEditor, EditorDescriptor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { EditorInput, EditorOptions, Extensions, IEditorRegistry, IEditorInputFactory } from 'vs/workbench/common/editor'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import * as Platform from 'vs/platform/platform'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { StringEditorInput } from 'vs/workbench/common/editor/stringEditorInput'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { PLAINTEXT_MODE_ID } from 'vs/editor/common/modes/modesRegistry'; import { workbenchInstantiationService, TestThemeService } from 'vs/workbench/test/workbenchTestServices'; +import { ResourceEditorInput } from "vs/workbench/common/editor/resourceEditorInput"; const NullThemeService = new TestThemeService(); @@ -94,36 +94,7 @@ class MyOtherInput extends EditorInput { return null; } } -class MyStringInput extends StringEditorInput { } - -class MyAction extends EditorInputAction { - - public didCallIsEnabled = false; - - isEnabled() { - this.didCallIsEnabled = true; - return true; - } -} - -class MyAction2 extends EditorInputAction { - isEnabled() { - return true; - } -} - -class MyEditorInputActionContributor extends EditorInputActionContributor { - hasActionsForEditorInput(context) { - return context.input instanceof StringEditorInput; - } - - getActionsForEditorInput(context) { - return [ - new MyAction2('id1', 'label1'), - new MyAction2('id2', 'label2') - ]; - } -} +class MyResourceInput extends ResourceEditorInput { } suite('Workbench BaseEditor', () => { @@ -188,15 +159,15 @@ suite('Workbench BaseEditor', () => { let oldEditors = EditorRegistry.getEditors(); (EditorRegistry).setEditors([]); - EditorRegistry.registerEditor(d2, new SyncDescriptor(StringEditorInput)); - EditorRegistry.registerEditor(d1, new SyncDescriptor(MyStringInput)); + EditorRegistry.registerEditor(d2, new SyncDescriptor(ResourceEditorInput)); + EditorRegistry.registerEditor(d1, new SyncDescriptor(MyResourceInput)); let inst = new TestInstantiationService(); - inst.createInstance(EditorRegistry.getEditor(inst.createInstance(MyStringInput, 'fake', '', '', PLAINTEXT_MODE_ID, false)), 'id').then(editor => { + inst.createInstance(EditorRegistry.getEditor(inst.createInstance(MyResourceInput, 'fake', '', '', PLAINTEXT_MODE_ID, false)), 'id').then(editor => { assert.strictEqual(editor.getId(), 'myEditor'); - return inst.createInstance(EditorRegistry.getEditor(inst.createInstance(StringEditorInput, 'fake', '', '', PLAINTEXT_MODE_ID, false)), 'id').then(editor => { + return inst.createInstance(EditorRegistry.getEditor(inst.createInstance(ResourceEditorInput, 'fake', '', '', PLAINTEXT_MODE_ID, false)), 'id').then(editor => { assert.strictEqual(editor.getId(), 'myOtherEditor'); (EditorRegistry).setEditors(oldEditors); @@ -210,61 +181,17 @@ suite('Workbench BaseEditor', () => { let oldEditors = EditorRegistry.getEditors(); (EditorRegistry).setEditors([]); - EditorRegistry.registerEditor(d1, new SyncDescriptor(StringEditorInput)); + EditorRegistry.registerEditor(d1, new SyncDescriptor(ResourceEditorInput)); let inst = new TestInstantiationService(); - inst.createInstance(EditorRegistry.getEditor(inst.createInstance(MyStringInput, 'fake', '', '', PLAINTEXT_MODE_ID, false)), 'id').then(editor => { + inst.createInstance(EditorRegistry.getEditor(inst.createInstance(MyResourceInput, 'fake', '', '', PLAINTEXT_MODE_ID, false)), 'id').then(editor => { assert.strictEqual('myOtherEditor', editor.getId()); (EditorRegistry).setEditors(oldEditors); }).done(() => done()); }); - test('Editor Input Action - triggers isEnabled properly', function () { - let inst = new TestInstantiationService(); - - let action = new MyAction('id', 'label'); - action.input = inst.createInstance(StringEditorInput, 'input', '', '', PLAINTEXT_MODE_ID, false); - assert.equal(action.didCallIsEnabled, true); - }); - - test('Editor Input Action Contributor', function () { - let inst = new TestInstantiationService(); - - let contributor = new MyEditorInputActionContributor(); - - assert(!contributor.hasActions(null)); - assert(contributor.hasActions({ editor: new MyEditor('id', NullTelemetryService), input: inst.createInstance(StringEditorInput, 'fake', '', '', PLAINTEXT_MODE_ID, false), position: 0 })); - - let actionsFirst = contributor.getActions({ editor: new MyEditor('id', NullTelemetryService), input: inst.createInstance(StringEditorInput, 'fake', '', '', PLAINTEXT_MODE_ID, false), position: 0 }); - assert.strictEqual(actionsFirst.length, 2); - - let input = inst.createInstance(StringEditorInput, 'fake', '', '', PLAINTEXT_MODE_ID, false); - let actions = contributor.getActions({ editor: new MyEditor('id', NullTelemetryService), input: input, position: 0 }); - assert(actions[0] === actionsFirst[0]); - assert(actions[1] === actionsFirst[1]); - assert((actions[0]).input === input); - assert((actions[1]).input === input); - - // other editor causes new actions to be created - actions = contributor.getActions({ editor: new MyOtherEditor('id2', NullTelemetryService), input: input, position: 0 }); - assert(actions[0] !== actionsFirst[0]); - assert(actions[1] !== actionsFirst[1]); - assert((actions[0]).input === input); - assert((actions[1]).input === input); - - // other input causes actions to loose input context - let myInput = new MyInput(); - myInput.getTypeId = function () { - return 'foo.id'; - }; - - actions = contributor.getActions({ editor: new MyEditor('id3', NullTelemetryService), input: myInput, position: 0 }); - assert(!(actionsFirst[0]).input); - assert(!(actionsFirst[1]).input); - }); - test('Editor Input Factory', function () { EditorRegistry.setInstantiationService(workbenchInstantiationService()); EditorRegistry.registerEditorInputFactory('myInputId', MyInputFactory); diff --git a/src/vs/workbench/test/common/editor/editorDiffModel.test.ts b/src/vs/workbench/test/common/editor/editorDiffModel.test.ts new file mode 100644 index 00000000000..2f5901c6e88 --- /dev/null +++ b/src/vs/workbench/test/common/editor/editorDiffModel.test.ts @@ -0,0 +1,86 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as assert from 'assert'; +import { EditorModel } from 'vs/workbench/common/editor'; +import { BaseTextEditorModel } from 'vs/workbench/common/editor/textEditorModel'; +import { TextDiffEditorModel } from 'vs/workbench/common/editor/textDiffEditorModel'; +import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; +import { IModelService } from 'vs/editor/common/services/modelService'; +import { IModeService } from 'vs/editor/common/services/modeService'; +import { ResourceEditorInput } from "vs/workbench/common/editor/resourceEditorInput"; +import URI from "vs/base/common/uri"; +import { ITextModelResolverService } from "vs/editor/common/services/resolverService"; +import { ITextFileService } from "vs/workbench/services/textfile/common/textfiles"; +import { IUntitledEditorService } from "vs/workbench/services/untitled/common/untitledEditorService"; +import { TestTextFileService, workbenchInstantiationService } from "vs/workbench/test/workbenchTestServices"; +import { TPromise } from "vs/base/common/winjs.base"; +import { IModel } from "vs/editor/common/editorCommon"; +import { IInstantiationService } from "vs/platform/instantiation/common/instantiation"; + +class MyEditorModel extends EditorModel { } +class MyTextEditorModel extends BaseTextEditorModel { } + +class ServiceAccessor { + constructor( + @ITextModelResolverService public textModelResolverService: ITextModelResolverService, + @IModelService public modelService: IModelService, + @IModeService public modeService: IModeService, + @ITextFileService public textFileService: TestTextFileService, + @IUntitledEditorService public untitledEditorService: IUntitledEditorService + ) { + } +} + +suite('Workbench - EditorModel', () => { + let instantiationService: IInstantiationService; + let accessor: ServiceAccessor; + + setup(() => { + instantiationService = workbenchInstantiationService(); + accessor = instantiationService.createInstance(ServiceAccessor); + }); + + test('TextDiffEditorModel', function (done) { + const dispose = accessor.textModelResolverService.registerTextModelContentProvider('test', { + provideTextContent: function (resource: URI): TPromise { + if (resource.scheme === 'test') { + let modelContent = 'Hello Test'; + let mode = accessor.modeService.getOrCreateMode('json'); + return TPromise.as(accessor.modelService.createModel(modelContent, mode, resource)); + } + + return TPromise.as(null); + } + }); + + let input = instantiationService.createInstance(ResourceEditorInput, 'name', 'description', URI.from({ scheme: 'test', authority: null, path: 'thePath' })); + let otherInput = instantiationService.createInstance(ResourceEditorInput, 'name2', 'description', URI.from({ scheme: 'test', authority: null, path: 'thePath' })); + let diffInput = new DiffEditorInput('name', 'description', input, otherInput); + + diffInput.resolve(true).then((model: any) => { + assert(model); + assert(model instanceof TextDiffEditorModel); + + let diffEditorModel = model.textDiffEditorModel; + assert(diffEditorModel.original); + assert(diffEditorModel.modified); + + return diffInput.resolve(true).then((model: any) => { + assert(model.isResolved()); + + assert(diffEditorModel !== model.textDiffEditorModel); + diffInput.dispose(); + assert(!model.textDiffEditorModel); + + dispose.dispose(); + }); + }).done(() => { + done(); + }); + }); +}); \ No newline at end of file diff --git a/src/vs/workbench/test/common/editor/editorModel.test.ts b/src/vs/workbench/test/common/editor/editorModel.test.ts index 61f24c0e934..b0c237b73bb 100644 --- a/src/vs/workbench/test/common/editor/editorModel.test.ts +++ b/src/vs/workbench/test/common/editor/editorModel.test.ts @@ -9,9 +9,6 @@ import * as assert from 'assert'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { EditorModel } from 'vs/workbench/common/editor'; import { BaseTextEditorModel } from 'vs/workbench/common/editor/textEditorModel'; -import { TextDiffEditorModel } from 'vs/workbench/common/editor/textDiffEditorModel'; -import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; -import { StringEditorInput } from 'vs/workbench/common/editor/stringEditorInput'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl'; @@ -65,32 +62,6 @@ suite('Workbench - EditorModel', () => { }); }); - test('TextDiffEditorModel', function (done) { - instantiationService.stub(IModelService, stubModelService(instantiationService)); - let input = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'text/plain', false); - let otherInput = instantiationService.createInstance(StringEditorInput, 'name2', 'description', 'value2', 'text/plain', false); - let diffInput = new DiffEditorInput('name', 'description', input, otherInput); - - diffInput.resolve(true).then((model: any) => { - assert(model); - assert(model instanceof TextDiffEditorModel); - - let diffEditorModel = model.textDiffEditorModel; - assert(diffEditorModel.original); - assert(diffEditorModel.modified); - - return diffInput.resolve(true).then((model: any) => { - assert(model.isResolved()); - - assert(diffEditorModel !== model.textDiffEditorModel); - diffInput.dispose(); - assert(!model.textDiffEditorModel); - }); - }).done(() => { - done(); - }); - }); - function stubModelService(instantiationService: TestInstantiationService): IModelService { instantiationService.stub(IConfigurationService, new TestConfigurationService()); return instantiationService.createInstance(ModelServiceImpl); diff --git a/src/vs/workbench/test/common/editor/stringEditorInput.test.ts b/src/vs/workbench/test/common/editor/stringEditorInput.test.ts deleted file mode 100644 index e2b1611c9f1..00000000000 --- a/src/vs/workbench/test/common/editor/stringEditorInput.test.ts +++ /dev/null @@ -1,115 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import * as assert from 'assert'; -import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import URI from 'vs/base/common/uri'; -import { StringEditorInput } from 'vs/workbench/common/editor/stringEditorInput'; -import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; -import { TestEditorService } from 'vs/workbench/test/workbenchTestServices'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; -import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; -import { IModelService } from 'vs/editor/common/services/modelService'; -import { IModeService } from 'vs/editor/common/services/modeService'; -import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl'; -import WorkbenchEditorService = require('vs/workbench/services/editor/common/editorService'); - -suite('Workbench - StringEditorInput', () => { - let instantiationService: TestInstantiationService; - let editorService: WorkbenchEditorService.IWorkbenchEditorService; - let modelService: IModelService; - let modeService: IModeService; - - setup(() => { - instantiationService = new TestInstantiationService(); - editorService = instantiationService.stub(WorkbenchEditorService.IWorkbenchEditorService, new TestEditorService()); - modeService = instantiationService.stub(IModeService, ModeServiceImpl); - modelService = instantiationService.stub(IModelService, stubModelService(instantiationService)); - }); - - test('StringEditorInput', function (done) { - let input: StringEditorInput = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mode', false); - const otherInput: StringEditorInput = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'othervalue', 'mode', false); - const otherInputSame: StringEditorInput = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mode', false); - - const inputSingleton: StringEditorInput = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mode', true); - const otherInputSingleton: StringEditorInput = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'othervalue', 'mode', true); - assert(inputSingleton.matches(otherInputSingleton)); - (otherInputSingleton).singleton = false; - assert(!inputSingleton.matches(otherInputSingleton)); - - assert(input.matches(input)); - assert(input.matches(otherInputSame)); - assert(!input.matches(otherInput)); - assert(!input.matches(null)); - assert(input.getName()); - - input = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mode', false); - - input = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mode', false); - input.resolve(true).then(resolved => { - const resolvedModelA = resolved; - return input.resolve(true).then(resolved => { - assert(resolvedModelA === resolved); // assert: Resolved Model cached per instance - - const otherInput: StringEditorInput = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mode', false); - return otherInput.resolve(true).then(resolved => { - assert(resolvedModelA !== resolved); // NOT assert: Different instance, different model - - input.dispose(); - - return input.resolve(true).then(resolved => { - assert(resolvedModelA !== resolved); // Different instance, because input got disposed - - const model = (resolved).textEditorModel; - return input.resolve(true).then(againResolved => { - assert(model === (againResolved).textEditorModel); // Models should not differ because string input is constant - - input.dispose(); - }); - }); - }); - }); - }).done(() => done()); - }); - - test('StringEditorInput - setValue, clearValue, append', function () { - const input: StringEditorInput = instantiationService.createInstance(StringEditorInput, 'name', 'description', 'value', 'mode', false); - - assert.strictEqual(input.getValue(), 'value'); - input.setValue('foo'); - assert.strictEqual(input.getValue(), 'foo'); - input.setValue(''); - assert(!input.getValue()); - }); - - test('Input.matches() - StringEditorInput', function () { - const inst = new TestInstantiationService(); - - const stringEditorInput: StringEditorInput = inst.createInstance(StringEditorInput, 'name', 'description', 'value', 'mode', false); - const promiseEditorInput: StringEditorInput = inst.createInstance(ResourceEditorInput, 'name', 'description', URI.from({ scheme: 'inMemory', authority: null, path: 'thePath' })); - - const stringEditorInput2: StringEditorInput = inst.createInstance(StringEditorInput, 'name', 'description', 'value', 'mode', false); - const promiseEditorInput2: StringEditorInput = inst.createInstance(ResourceEditorInput, 'name', 'description', URI.from({ scheme: 'inMemory', authority: null, path: 'thePath' })); - - assert.strictEqual(stringEditorInput.matches(null), false); - assert.strictEqual(promiseEditorInput.matches(null), false); - - assert.strictEqual(promiseEditorInput.matches(promiseEditorInput), true); - assert.strictEqual(stringEditorInput.matches(stringEditorInput), true); - - assert.strictEqual(promiseEditorInput.matches(promiseEditorInput2), true); - assert.strictEqual(stringEditorInput.matches(stringEditorInput2), true); - }); - - function stubModelService(instantiationService: TestInstantiationService): IModelService { - instantiationService.stub(IConfigurationService, new TestConfigurationService()); - - return instantiationService.createInstance(ModelServiceImpl); - } -}); \ No newline at end of file diff --git a/src/vs/workbench/test/common/editor/stringEditorModel.test.ts b/src/vs/workbench/test/common/editor/stringEditorModel.test.ts deleted file mode 100644 index 8258b2c28b2..00000000000 --- a/src/vs/workbench/test/common/editor/stringEditorModel.test.ts +++ /dev/null @@ -1,75 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import * as assert from 'assert'; -import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { StringEditorModel } from 'vs/workbench/common/editor/stringEditorModel'; -import { IModelService } from 'vs/editor/common/services/modelService'; -import { IModeService } from 'vs/editor/common/services/modeService'; -import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; -import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; - -suite('Workbench - StringEditorModel', () => { - let instantiationService: TestInstantiationService; - - setup(() => { - instantiationService = new TestInstantiationService(); - instantiationService.stub(IModeService, ModeServiceImpl); - }); - - test('StringEditorModel', function (done) { - instantiationService.stub(IModelService, stubModelService(instantiationService)); - const m: StringEditorModel = instantiationService.createInstance(StringEditorModel, 'value', 'mode', null); - m.load().then(model => { - assert(model === m); - - const textEditorModel = m.textEditorModel; - assert.strictEqual(textEditorModel.getValue(), 'value'); - - assert.strictEqual(m.isResolved(), true); - - (m).value = 'something'; - return m.load().then(model => { - assert(textEditorModel === m.textEditorModel); - assert.strictEqual(m.getValue(), 'something'); - }); - }).done(() => { - m.dispose(); - done(); - }); - }); - - test('StringEditorModel - setValue', function (done) { - instantiationService.stub(IModelService, stubModelService(instantiationService)); - const m: StringEditorModel = instantiationService.createInstance(StringEditorModel, 'value', 'mode', null); - m.load().then(model => { - assert(model === m); - - const textEditorModel = m.textEditorModel; - assert.strictEqual(textEditorModel.getValue(), 'value'); - - m.setValue('foobar'); - assert.strictEqual(m.getValue(), 'foobar'); - assert.strictEqual(textEditorModel.getValue(), 'foobar'); - - m.setValue(''); - assert(!m.getValue()); - assert(!textEditorModel.getValue()); - }).done(() => { - m.dispose(); - done(); - }); - }); - - function stubModelService(instantiationService: TestInstantiationService): IModelService { - instantiationService.stub(IConfigurationService, new TestConfigurationService()); - - return instantiationService.createInstance(ModelServiceImpl); - } -}); \ No newline at end of file From 0ee4e833cba33f1e9a888afe377a79f2d5b37325 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 5 May 2017 09:09:28 -0700 Subject: [PATCH 0136/1164] Remove log --- .../workbench/parts/terminal/electron-browser/terminalPanel.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index b879da8392d..2843926ae24 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -228,7 +228,6 @@ export class TerminalPanel extends Panel { }); const bgColor = theme.getColor(TERMINAL_BACKGROUND_COLOR); if (bgColor) { - console.log('set bgColor to: ' + bgColor); css += `.monaco-workbench .panel.integrated-terminal .terminal-outer-container { background-color: ${bgColor}; }`; } const fgColor = theme.getColor(TERMINAL_FOREGROUND_COLOR); From 69aaa885e2533e0c7c0f71a4a741532bc1c58cdb Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 5 May 2017 18:30:16 +0200 Subject: [PATCH 0137/1164] fix build? --- build/gulpfile.vscode.js | 1 - build/lib/i18n.ts | 1 - src/vs/workbench/buildfile.js | 3 --- 3 files changed, 5 deletions(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index a2a2ca2df0b..3214a86b15d 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -65,7 +65,6 @@ const vscodeResources = [ 'out-build/vs/workbench/electron-browser/bootstrap/**', 'out-build/vs/workbench/parts/debug/**/*.json', 'out-build/vs/workbench/parts/execution/**/*.scpt', - 'out-build/vs/workbench/parts/git/**/*.sh', 'out-build/vs/workbench/parts/html/browser/webview-pre.js', 'out-build/vs/**/markdown.css', 'out-build/vs/workbench/parts/tasks/**/*.json', diff --git a/build/lib/i18n.ts b/build/lib/i18n.ts index 434d3301752..cdf8e56e4ac 100644 --- a/build/lib/i18n.ts +++ b/build/lib/i18n.ts @@ -606,7 +606,6 @@ const workbenchResources: Resource[] = [ { name: 'vs/workbench/parts/extensions', project: workbenchProject }, { name: 'vs/workbench/parts/feedback', project: workbenchProject }, { name: 'vs/workbench/parts/files', project: workbenchProject }, - { name: 'vs/workbench/parts/git', project: workbenchProject }, { name: 'vs/workbench/parts/html', project: workbenchProject }, { name: 'vs/workbench/parts/markers', project: workbenchProject }, { name: 'vs/workbench/parts/nps', project: workbenchProject }, diff --git a/src/vs/workbench/buildfile.js b/src/vs/workbench/buildfile.js index 4f4a7086040..dfb1ee2b600 100644 --- a/src/vs/workbench/buildfile.js +++ b/src/vs/workbench/buildfile.js @@ -17,9 +17,6 @@ function createModuleDescription(name, exclude) { exports.collectModules = function (excludes) { var modules = [ - createModuleDescription('vs/workbench/parts/git/node/gitApp', []), - createModuleDescription('vs/workbench/parts/git/node/askpass', []), - createModuleDescription('vs/workbench/parts/output/common/outputLinkComputer', ['vs/base/common/worker/simpleWorker', 'vs/editor/common/services/editorSimpleWorker']), createModuleDescription('vs/workbench/parts/debug/node/telemetryApp', []), From cf03392bf338f228459dcfbd64c72a0a3f1f0a1f Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 5 May 2017 10:11:39 -0700 Subject: [PATCH 0138/1164] Fix terminal.integrated.rightClickCopyPaste on macOS Fixes #25844 --- .../parts/terminal/electron-browser/terminalInstance.ts | 2 +- .../parts/terminal/electron-browser/terminalPanel.ts | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 4c75ff54461..807ae0a089b 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -320,7 +320,7 @@ export class TerminalInstance implements ITerminalInstance { } public clearSelection(): void { - document.getSelection().empty(); + window.getSelection().empty(); } public dispose(): void { diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index 2843926ae24..38fb99f450c 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -172,6 +172,15 @@ export class TerminalPanel extends Panel { } else { terminal.paste(); } + // Clear selection after all click event bubbling is finished on Mac to prevent + // right-click selecting a word which is seemed cannot be disabled. There is a + // flicker when pasting but this appears to give the best experience if the + // setting is enabled. + if (platform.isMacintosh) { + setTimeout(() => { + terminal.clearSelection(); + }, 0); + } this._cancelContextMenu = true; } } From 9d5987e8f6569fc3f35f8fe291f8b51815ffc9aa Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 5 May 2017 10:23:29 -0700 Subject: [PATCH 0139/1164] Add terminal colors for solarized themes Fixes #26065 --- .../themes/solarized-dark-color-theme.json | 35 ++++++++++--------- .../themes/solarized-light-color-theme.json | 35 ++++++++++--------- 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json b/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json index 75862dc7088..918d9ac9b45 100644 --- a/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json +++ b/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json @@ -447,24 +447,25 @@ // Workbench: Quick Open "pickerGroup.foreground": "#2AA19899", - "pickerGroup.border": "#2AA19899" + "pickerGroup.border": "#2AA19899", // Workbench: Terminal - // "terminal.ansiBlack": "", - // "terminal.ansiBlue": "", - // "terminal.ansiBrightBlack": "", - // "terminal.ansiBrightBlue": "", - // "terminal.ansiBrightCyan": "", - // "terminal.ansiBrightGreen": "", - // "terminal.ansiBrightMagenta": "", - // "terminal.ansiBrightRed": "", - // "terminal.ansiBrightWhite": "", - // "terminal.ansiBrightYellow": "", - // "terminal.ansiCyan": "", - // "terminal.ansiGreen": "", - // "terminal.ansiMagenta": "", - // "terminal.ansiRed": "", - // "terminal.ansiWhite": "", - // "terminal.ansiYellow": "" + // Colors sourced from the official palette http://ethanschoonover.com/solarized + "terminal.ansiBlack": "#262626", + "terminal.ansiBlue": "#0087ff", + "terminal.ansiBrightBlack": "#1c1c1c", + "terminal.ansiBrightBlue": "#808080", + "terminal.ansiBrightCyan": "#808080", + "terminal.ansiBrightGreen": "#585858", + "terminal.ansiBrightMagenta": "#5f5faf", + "terminal.ansiBrightRed": "#d75f00", + "terminal.ansiBrightWhite": "#808080", + "terminal.ansiBrightYellow": "#626262", + "terminal.ansiCyan": "#00afaf", + "terminal.ansiGreen": "#5f8700", + "terminal.ansiMagenta": "#af005f", + "terminal.ansiRed": "#d70000", + "terminal.ansiWhite": "#808080", + "terminal.ansiYellow": "#af8700" } } \ No newline at end of file diff --git a/extensions/theme-solarized-light/themes/solarized-light-color-theme.json b/extensions/theme-solarized-light/themes/solarized-light-color-theme.json index de82f120283..7deda4d22e4 100644 --- a/extensions/theme-solarized-light/themes/solarized-light-color-theme.json +++ b/extensions/theme-solarized-light/themes/solarized-light-color-theme.json @@ -448,24 +448,25 @@ // Workbench: Quick Open "pickerGroup.border": "#2AA19899", - "pickerGroup.foreground": "#2AA19899" + "pickerGroup.foreground": "#2AA19899", // Workbench: Terminal - // "terminal.ansiBlack": "#111111", - // "terminal.ansiRed": "#ff9da4", - // "terminal.ansiGreen": "#d1f1a9", - // "terminal.ansiYellow": "#ffeead", - // "terminal.ansiBlue": "#bbdaff", - // "terminal.ansiMagenta": "#ebbbff", - // "terminal.ansiCyan": "#99ffff", - // "terminal.ansiWhite": "#cccccc", - // "terminal.ansiBrightBlack": "#333333", - // "terminal.ansiBrightRed": "#ff7882", - // "terminal.ansiBrightGreen": "#b8f171", - // "terminal.ansiBrightYellow": "#ffe580", - // "terminal.ansiBrightBlue": "#80baff", - // "terminal.ansiBrightMagenta": "#d778ff", - // "terminal.ansiBrightCyan": "#78ffff", - // "terminal.ansiBrightWhite": "#ffffff" + // Colors sourced from the official palette http://ethanschoonover.com/solarized + "terminal.ansiBlack": "#262626", + "terminal.ansiBlue": "#0087ff", + "terminal.ansiBrightBlack": "#1c1c1c", + "terminal.ansiBrightBlue": "#808080", + "terminal.ansiBrightCyan": "#808080", + "terminal.ansiBrightGreen": "#585858", + "terminal.ansiBrightMagenta": "#5f5faf", + "terminal.ansiBrightRed": "#d75f00", + "terminal.ansiBrightWhite": "#808080", + "terminal.ansiBrightYellow": "#626262", + "terminal.ansiCyan": "#00afaf", + "terminal.ansiGreen": "#5f8700", + "terminal.ansiMagenta": "#af005f", + "terminal.ansiRed": "#d70000", + "terminal.ansiWhite": "#808080", + "terminal.ansiYellow": "#af8700" } } \ No newline at end of file From 7d2dea4e454e1ffebc9d5504bf789dbe60b3da08 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 5 May 2017 11:37:59 -0700 Subject: [PATCH 0140/1164] Add "Include" to extension TSConfig Files (#25860) **Bug** Most VSCode extensions currently specify `"exclude"` in their `tsconfig.json` but not `"include"`. This may result in extra files being included in each project **Fix** Add `"include": ["src/**/*"]` to all extension tsconfig files --- extensions/configuration-editing/tsconfig.json | 4 ++-- extensions/css/client/tsconfig.json | 4 ++-- extensions/css/server/tsconfig.json | 4 ++-- extensions/extension-editing/tsconfig.json | 4 ++-- extensions/git/tsconfig.json | 4 ++-- extensions/grunt/tsconfig.json | 5 ++--- extensions/gulp/tsconfig.json | 5 ++--- extensions/javascript/tsconfig.json | 4 ++-- extensions/json/server/tsconfig.json | 4 ++-- extensions/markdown/tsconfig.json | 4 ++-- extensions/php/tsconfig.json | 4 ++-- extensions/python/tsconfig.json | 4 ++-- extensions/ruby/tsconfig.json | 4 ++-- extensions/typescript/tsconfig.json | 7 ++----- extensions/vscode-api-tests/tsconfig.json | 4 ++-- extensions/vscode-colorize-tests/tsconfig.json | 4 ++-- 16 files changed, 32 insertions(+), 37 deletions(-) diff --git a/extensions/configuration-editing/tsconfig.json b/extensions/configuration-editing/tsconfig.json index 3fd4b7cd117..6971f531b11 100644 --- a/extensions/configuration-editing/tsconfig.json +++ b/extensions/configuration-editing/tsconfig.json @@ -8,7 +8,7 @@ ], "strictNullChecks": true }, - "exclude": [ - "node_modules" + "include": [ + "src/**/*" ] } diff --git a/extensions/css/client/tsconfig.json b/extensions/css/client/tsconfig.json index 2f1dccc29ca..e87d1a805a1 100644 --- a/extensions/css/client/tsconfig.json +++ b/extensions/css/client/tsconfig.json @@ -7,7 +7,7 @@ "es5", "es2015.promise" ] }, - "exclude": [ - "node_modules" + "include": [ + "src/**/*" ] } \ No newline at end of file diff --git a/extensions/css/server/tsconfig.json b/extensions/css/server/tsconfig.json index 7651bc8687e..8e862f02646 100644 --- a/extensions/css/server/tsconfig.json +++ b/extensions/css/server/tsconfig.json @@ -7,7 +7,7 @@ "es5" ] }, - "exclude": [ - "node_modules" + "include": [ + "src/**/*" ] } \ No newline at end of file diff --git a/extensions/extension-editing/tsconfig.json b/extensions/extension-editing/tsconfig.json index 90ac01c2d39..a2b5bcdfddf 100644 --- a/extensions/extension-editing/tsconfig.json +++ b/extensions/extension-editing/tsconfig.json @@ -7,7 +7,7 @@ "module": "commonjs", "outDir": "./out" }, - "exclude": [ - "node_modules" + "include": [ + "src/**/*" ] } \ No newline at end of file diff --git a/extensions/git/tsconfig.json b/extensions/git/tsconfig.json index bed30f8826c..254c9e67459 100644 --- a/extensions/git/tsconfig.json +++ b/extensions/git/tsconfig.json @@ -9,7 +9,7 @@ "strictNullChecks": true, "experimentalDecorators": true }, - "exclude": [ - "node_modules" + "include": [ + "src/**/*" ] } \ No newline at end of file diff --git a/extensions/grunt/tsconfig.json b/extensions/grunt/tsconfig.json index d815a565579..e804fa3acd7 100644 --- a/extensions/grunt/tsconfig.json +++ b/extensions/grunt/tsconfig.json @@ -12,8 +12,7 @@ "noUnusedLocals": true, "noUnusedParameters": true }, - "exclude": [ - "node_modules", - "out" + "include": [ + "src/**/*" ] } \ No newline at end of file diff --git a/extensions/gulp/tsconfig.json b/extensions/gulp/tsconfig.json index d815a565579..e804fa3acd7 100644 --- a/extensions/gulp/tsconfig.json +++ b/extensions/gulp/tsconfig.json @@ -12,8 +12,7 @@ "noUnusedLocals": true, "noUnusedParameters": true }, - "exclude": [ - "node_modules", - "out" + "include": [ + "src/**/*" ] } \ No newline at end of file diff --git a/extensions/javascript/tsconfig.json b/extensions/javascript/tsconfig.json index 551261ed46d..4445bb27fd7 100644 --- a/extensions/javascript/tsconfig.json +++ b/extensions/javascript/tsconfig.json @@ -7,7 +7,7 @@ "es2015" ] }, - "exclude": [ - "node_modules" + "include": [ + "src/**/*" ] } \ No newline at end of file diff --git a/extensions/json/server/tsconfig.json b/extensions/json/server/tsconfig.json index c2a86a0af35..deecf69b8b4 100644 --- a/extensions/json/server/tsconfig.json +++ b/extensions/json/server/tsconfig.json @@ -9,7 +9,7 @@ "es5", "es2015.promise" ] }, - "exclude": [ - "node_modules" + "include": [ + "src/**/*" ] } \ No newline at end of file diff --git a/extensions/markdown/tsconfig.json b/extensions/markdown/tsconfig.json index e877d8142f0..ec272338af5 100644 --- a/extensions/markdown/tsconfig.json +++ b/extensions/markdown/tsconfig.json @@ -14,7 +14,7 @@ "noUnusedLocals": true, "noUnusedParameters": true }, - "exclude": [ - "node_modules" + "include": [ + "src/**/*" ] } \ No newline at end of file diff --git a/extensions/php/tsconfig.json b/extensions/php/tsconfig.json index 90ac01c2d39..a2b5bcdfddf 100644 --- a/extensions/php/tsconfig.json +++ b/extensions/php/tsconfig.json @@ -7,7 +7,7 @@ "module": "commonjs", "outDir": "./out" }, - "exclude": [ - "node_modules" + "include": [ + "src/**/*" ] } \ No newline at end of file diff --git a/extensions/python/tsconfig.json b/extensions/python/tsconfig.json index 90ac01c2d39..a2b5bcdfddf 100644 --- a/extensions/python/tsconfig.json +++ b/extensions/python/tsconfig.json @@ -7,7 +7,7 @@ "module": "commonjs", "outDir": "./out" }, - "exclude": [ - "node_modules" + "include": [ + "src/**/*" ] } \ No newline at end of file diff --git a/extensions/ruby/tsconfig.json b/extensions/ruby/tsconfig.json index a016490a376..efe5568f2b5 100644 --- a/extensions/ruby/tsconfig.json +++ b/extensions/ruby/tsconfig.json @@ -8,7 +8,7 @@ ], "sourceMap": true }, - "exclude": [ - "node_modules" + "include": [ + "src/**/*" ] } \ No newline at end of file diff --git a/extensions/typescript/tsconfig.json b/extensions/typescript/tsconfig.json index 2e44abefad4..3112725c103 100644 --- a/extensions/typescript/tsconfig.json +++ b/extensions/typescript/tsconfig.json @@ -13,10 +13,7 @@ "noUnusedLocals": true, "noUnusedParameters": true }, - "exclude": [ - "node_modules", - "server", - "out", - "test/colorize-fixtures" + "include": [ + "src/**/*" ] } \ No newline at end of file diff --git a/extensions/vscode-api-tests/tsconfig.json b/extensions/vscode-api-tests/tsconfig.json index 620857bb06f..26c357e374b 100644 --- a/extensions/vscode-api-tests/tsconfig.json +++ b/extensions/vscode-api-tests/tsconfig.json @@ -9,7 +9,7 @@ "sourceMap": true, "strictNullChecks": true }, - "exclude": [ - "node_modules" + "include": [ + "src/**/*" ] } \ No newline at end of file diff --git a/extensions/vscode-colorize-tests/tsconfig.json b/extensions/vscode-colorize-tests/tsconfig.json index 099a940aa2e..366e25ea09c 100644 --- a/extensions/vscode-colorize-tests/tsconfig.json +++ b/extensions/vscode-colorize-tests/tsconfig.json @@ -8,7 +8,7 @@ ], "sourceMap": true }, - "exclude": [ - "node_modules" + "include": [ + "src/**/*" ] } \ No newline at end of file From e8b01da790613d20feaeed845974cf69106fca37 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 5 May 2017 12:53:05 -0700 Subject: [PATCH 0141/1164] Clean Up JSDoc Completion Provider Implementation (#25981) * Fix JSDoc Completion Provider **Bug** 89da6ab81fcc552760a1a8972f5e2f3d6a820ecf fixed #11944 by changing how enter works in completion providers. Now if the completion exactly matches the current text, pressing `enter` is not captured by the the suggestion widget. Instead it inserts a new line into the editor. This broke the jsdoc completion provider which uses `''` as a placeholder insertion before calculating the actual insertion upon being accepted. This weird behavior is because of a of the current tsserver api **Fix** Change the insert text to a single space instead. This seems to fix this issue in my testing. * Slightly more elegant fix --- .../src/features/jsDocCompletionProvider.ts | 68 +++++++------------ 1 file changed, 25 insertions(+), 43 deletions(-) diff --git a/extensions/typescript/src/features/jsDocCompletionProvider.ts b/extensions/typescript/src/features/jsDocCompletionProvider.ts index 7f9aaf8c029..fc8e88d5df2 100644 --- a/extensions/typescript/src/features/jsDocCompletionProvider.ts +++ b/extensions/typescript/src/features/jsDocCompletionProvider.ts @@ -26,7 +26,7 @@ namespace Configuration { class JsDocCompletionItem extends CompletionItem { constructor( - file: Uri, + document: TextDocument, position: Position, shouldGetJSDocFromTSServer: boolean, ) { @@ -34,10 +34,19 @@ class JsDocCompletionItem extends CompletionItem { this.detail = localize('typescript.jsDocCompletionItem.documentation', 'JSDoc comment'); this.insertText = ''; this.sortText = '\0'; + + const line = document.lineAt(position.line).text; + const prefix = line.slice(0, position.character).match(/\/\**\s*$/); + const suffix = line.slice(position.character).match(/^\s*\**\//); + const start = position.translate(0, prefix ? -prefix[0].length : 0); + this.range = new Range( + start, + position.translate(0, suffix ? suffix[0].length : 0)); + this.command = { title: 'Try Complete JSDoc', command: TryCompleteJsDocCommand.COMMAND_NAME, - arguments: [file, position, shouldGetJSDocFromTSServer] + arguments: [document.uri, start, shouldGetJSDocFromTSServer] }; } } @@ -67,7 +76,7 @@ export class JsDocCompletionProvider implements CompletionItemProvider { const line = document.lineAt(position.line).text; const prefix = line.slice(0, position.character); if (prefix.match(/^\s*$|\/\*\*\s*$|^\s*\/\*\*+\s*$/)) { - return [new JsDocCompletionItem(document.uri, position, this.config.enabled)]; + return [new JsDocCompletionItem(document, position, this.config.enabled)]; } return []; } @@ -80,15 +89,15 @@ export class JsDocCompletionProvider implements CompletionItemProvider { export class TryCompleteJsDocCommand { static COMMAND_NAME = '_typeScript.tryCompleteJsDoc'; - constructor(private client: ITypescriptServiceClient) { - - } + constructor( + private client: ITypescriptServiceClient + ) { } /** * Try to insert a jsdoc comment, using a template provide by typescript * if possible, otherwise falling back to a default comment format. */ - public tryCompleteJsDoc(resource: Uri, position: Position, shouldGetJSDocFromTSServer: boolean): Thenable { + public tryCompleteJsDoc(resource: Uri, start: Position, shouldGetJSDocFromTSServer: boolean): Thenable { const file = this.client.normalizePath(resource); if (!file) { return Promise.resolve(false); @@ -99,44 +108,17 @@ export class TryCompleteJsDocCommand { return Promise.resolve(false); } - return this.prepForDocCompletion(editor, position) - .then((start: Position) => { - if (!shouldGetJSDocFromTSServer) { - return this.tryInsertDefaultDoc(editor, start); - } - - return this.tryInsertJsDocFromTemplate(editor, file, start) - .then((didInsertFromTemplate: boolean) => { - if (didInsertFromTemplate) { - return true; - } - return this.tryInsertDefaultDoc(editor, start); - }); - }); - } - - /** - * Prepare the area around the position for insertion of the jsdoc. - * - * Removes any the prefix and suffix of a possible jsdoc - */ - private prepForDocCompletion(editor: TextEditor, position: Position): Thenable { - const line = editor.document.lineAt(position.line).text; - const prefix = line.slice(0, position.character).match(/\/\**\s*$/); - const suffix = line.slice(position.character).match(/^\s*\**\//); - if (!prefix && !suffix) { - // Nothing to remove - return Promise.resolve(position); + if (!shouldGetJSDocFromTSServer) { + return this.tryInsertDefaultDoc(editor, start); } - const start = position.translate(0, prefix ? -prefix[0].length : 0); - return editor.edit( - edits => { - edits.delete(new Range(start, position.translate(0, suffix ? suffix[0].length : 0))); - }, { - undoStopBefore: true, - undoStopAfter: false - }).then(() => start); + return this.tryInsertJsDocFromTemplate(editor, file, start) + .then((didInsertFromTemplate: boolean) => { + if (didInsertFromTemplate) { + return true; + } + return this.tryInsertDefaultDoc(editor, start); + }); } private tryInsertJsDocFromTemplate(editor: TextEditor, file: string, position: Position): Promise { From 721f880cfde7a28d61a102d39dc92f5406882ec5 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 5 May 2017 13:41:39 -0700 Subject: [PATCH 0142/1164] Use Shared TypeScript to Compile VSCode Colorizer Tests (#25858) **Bug** Colorizer-tests currently installs an old version of typescript **Fix** Switch to using the standard typescript that all other extensions use. Also switch over to using the shared `vscode.d.ts` file --- extensions/vscode-colorize-tests/package.json | 2 -- extensions/vscode-colorize-tests/src/colorizer.test.ts | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/extensions/vscode-colorize-tests/package.json b/extensions/vscode-colorize-tests/package.json index a91ebb2a4d7..2e886b67189 100644 --- a/extensions/vscode-colorize-tests/package.json +++ b/extensions/vscode-colorize-tests/package.json @@ -8,14 +8,12 @@ "vscode": "*" }, "scripts": { - "compile": "node ./node_modules/vscode/bin/compile -watch -p ./", "vscode:prepublish": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:vscode-colorize-tests ./tsconfig.json", "postinstall": "node ./node_modules/vscode/bin/install" }, "devDependencies": { "@types/mocha": "^2.2.38", "@types/node": "^7.0.4", - "typescript": "^1.6.2", "vscode": "1.0.1" } } \ No newline at end of file diff --git a/extensions/vscode-colorize-tests/src/colorizer.test.ts b/extensions/vscode-colorize-tests/src/colorizer.test.ts index d709300a839..3c91e57ef3f 100644 --- a/extensions/vscode-colorize-tests/src/colorizer.test.ts +++ b/extensions/vscode-colorize-tests/src/colorizer.test.ts @@ -38,7 +38,7 @@ function assertUnchangedTokens(testFixurePath: string, done) { }, done); } -suite("colorization", () => { +suite('colorization', () => { let extensionsFolder = normalize(join(__dirname, '../../')); let extensions = fs.readdirSync(extensionsFolder); extensions.forEach(extension => { From a68dc0d9e67b21e69f1d79ca5f47a95ead0b7a7d Mon Sep 17 00:00:00 2001 From: rebornix Date: Fri, 28 Apr 2017 10:46:38 -0700 Subject: [PATCH 0143/1164] Fix #24887. Keybinding to toggle Find in selection. --- .../contrib/find/common/findController.ts | 30 ++++++++++++++++++- .../editor/contrib/find/common/findModel.ts | 4 +++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/find/common/findController.ts b/src/vs/editor/contrib/find/common/findController.ts index e3a133ee560..c788dafd5f2 100644 --- a/src/vs/editor/contrib/find/common/findController.ts +++ b/src/vs/editor/contrib/find/common/findController.ts @@ -14,7 +14,7 @@ import { Selection } from 'vs/editor/common/core/selection'; import * as strings from 'vs/base/common/strings'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { editorAction, commonEditorContribution, ServicesAccessor, EditorAction, EditorCommand, CommonEditorRegistry } from 'vs/editor/common/editorCommonExtensions'; -import { FIND_IDS, FindModelBoundToEditorModel, ToggleCaseSensitiveKeybinding, ToggleRegexKeybinding, ToggleWholeWordKeybinding, ShowPreviousFindTermKeybinding, ShowNextFindTermKeybinding } from 'vs/editor/contrib/find/common/findModel'; +import { FIND_IDS, FindModelBoundToEditorModel, ToggleCaseSensitiveKeybinding, ToggleRegexKeybinding, ToggleWholeWordKeybinding, ToggleSearchScopeKeybinding, ShowPreviousFindTermKeybinding, ShowNextFindTermKeybinding } from 'vs/editor/contrib/find/common/findModel'; import { FindReplaceState, FindReplaceStateChangedEvent, INewFindReplaceState } from 'vs/editor/contrib/find/common/findState'; import { DocumentHighlightProviderRegistry } from 'vs/editor/common/modes'; import { RunOnceScheduler, Delayer } from 'vs/base/common/async'; @@ -153,6 +153,20 @@ export class CommonFindController extends Disposable implements editorCommon.IEd this._state.change({ isRegex: !this._state.isRegex }, false); } + public toggleSearchScope(): void { + if (this._state.searchScope) { + this._state.change({ searchScope: null }, true); + } else { + let selection = this._editor.getSelection(); + if (selection.endColumn === 1 && selection.endLineNumber > selection.startLineNumber) { + selection = selection.setEndPosition(selection.endLineNumber - 1, 1); + } + if (!selection.isEmpty()) { + this._state.change({ searchScope: selection }, true); + } + } + } + public setSearchString(searchString: string): void { this._state.change({ searchString: searchString }, false); } @@ -1064,6 +1078,20 @@ CommonEditorRegistry.registerEditorCommand(new FindCommand({ } })); +CommonEditorRegistry.registerEditorCommand(new FindCommand({ + id: FIND_IDS.ToggleSearchScopeCommand, + precondition: null, + handler: x => x.toggleSearchScope(), + kbOpts: { + weight: CommonEditorRegistry.commandWeight(5), + kbExpr: EditorContextKeys.focus, + primary: ToggleSearchScopeKeybinding.primary, + mac: ToggleSearchScopeKeybinding.mac, + win: ToggleSearchScopeKeybinding.win, + linux: ToggleSearchScopeKeybinding.linux + } +})); + CommonEditorRegistry.registerEditorCommand(new FindCommand({ id: FIND_IDS.ReplaceOneAction, precondition: CONTEXT_FIND_WIDGET_VISIBLE, diff --git a/src/vs/editor/contrib/find/common/findModel.ts b/src/vs/editor/contrib/find/common/findModel.ts index a21568981d2..9667c467e1f 100644 --- a/src/vs/editor/contrib/find/common/findModel.ts +++ b/src/vs/editor/contrib/find/common/findModel.ts @@ -33,6 +33,9 @@ export const ToggleRegexKeybinding: IKeybindings = { primary: KeyMod.Alt | KeyCode.KEY_R, mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_R } }; +export const ToggleSearchScopeKeybinding: IKeybindings = { + primary: KeyMod.Alt | KeyCode.KEY_S +}; export const ShowPreviousFindTermKeybinding: IKeybindings = { primary: KeyMod.Alt | KeyCode.UpArrow }; @@ -55,6 +58,7 @@ export const FIND_IDS = { ToggleCaseSensitiveCommand: 'toggleFindCaseSensitive', ToggleWholeWordCommand: 'toggleFindWholeWord', ToggleRegexCommand: 'toggleFindRegex', + ToggleSearchScopeCommand: 'toggleSearchScope', ReplaceOneAction: 'editor.action.replaceOne', ReplaceAllAction: 'editor.action.replaceAll', SelectAllMatchesAction: 'editor.action.selectAllMatches', From bb5722729bd5a282c96196bf920787d9d9fc0d17 Mon Sep 17 00:00:00 2001 From: rebornix Date: Fri, 28 Apr 2017 12:44:48 -0700 Subject: [PATCH 0144/1164] Fix #15959. Align Esc and Close button --- src/vs/editor/contrib/find/browser/findWidget.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index f04848aa1a4..bbd0bee81fa 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -557,7 +557,7 @@ export class FindWidget extends Widget implements IOverlayWidget { label: NLS_CLOSE_BTN_LABEL + this._keybindingLabelFor(FIND_IDS.CloseFindWidgetCommand), className: 'close-fw', onTrigger: () => { - this._state.change({ isRevealed: false }, false); + this._state.change({ isRevealed: false, searchScope: null }, false); }, onKeyDown: (e) => { if (e.equals(KeyCode.Tab)) { From 389efb47e1a7326ed86c9458e5e25a59cbf19c10 Mon Sep 17 00:00:00 2001 From: rebornix Date: Fri, 5 May 2017 15:03:15 -0700 Subject: [PATCH 0145/1164] L is a good key as it is not often used --- src/vs/editor/contrib/find/common/findModel.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/find/common/findModel.ts b/src/vs/editor/contrib/find/common/findModel.ts index 9667c467e1f..ceac616aafa 100644 --- a/src/vs/editor/contrib/find/common/findModel.ts +++ b/src/vs/editor/contrib/find/common/findModel.ts @@ -34,7 +34,8 @@ export const ToggleRegexKeybinding: IKeybindings = { mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_R } }; export const ToggleSearchScopeKeybinding: IKeybindings = { - primary: KeyMod.Alt | KeyCode.KEY_S + primary: KeyMod.Alt | KeyCode.KEY_L, + mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_L } }; export const ShowPreviousFindTermKeybinding: IKeybindings = { primary: KeyMod.Alt | KeyCode.UpArrow From 4adfa92a0cabb998e2630ef79935d58e7051bf3a Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 5 May 2017 14:15:20 -0700 Subject: [PATCH 0146/1164] Enable ts-check for webview-pre.js --- .../parts/html/browser/webview-pre.js | 339 +++++++++--------- 1 file changed, 174 insertions(+), 165 deletions(-) diff --git a/src/vs/workbench/parts/html/browser/webview-pre.js b/src/vs/workbench/parts/html/browser/webview-pre.js index da702ba48a0..8c8a30e742f 100644 --- a/src/vs/workbench/parts/html/browser/webview-pre.js +++ b/src/vs/workbench/parts/html/browser/webview-pre.js @@ -2,187 +2,196 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; +// @ts-check +(function () { + 'use strict'; -const ipcRenderer = require('electron').ipcRenderer; + const ipcRenderer = require('electron').ipcRenderer; -var initData = {}; + const initData = {}; -function styleBody(body) { - if (!body) { - return - } - body.classList.remove('vscode-light', 'vscode-dark', 'vscode-high-contrast'); - body.classList.add(initData.activeTheme); -} - -function getTarget() { - return document.getElementById('_target'); -} - -function handleInnerClick(event) { - if (!event || !event.view || !event.view.document) { - return; - } - var node = event.target; - while (node) { - if (node.tagName === "A" && node.href) { - var baseElement = event.view.document.getElementsByTagName("base")[0]; - if (node.getAttribute("href") === "#") { - event.view.scrollTo(0, 0); - } else if (node.hash && (node.getAttribute("href") === node.hash || (baseElement && node.href.indexOf(baseElement.href) >= 0))) { - var scrollTarget = event.view.document.getElementById(node.hash.substr(1, node.hash.length - 1)); - if (scrollTarget) { - scrollTarget.scrollIntoView(); - } - } else { - ipcRenderer.sendToHost("did-click-link", node.href); - } - event.preventDefault(); - break; + function styleBody(body) { + if (!body) { + return } - node = node.parentNode; + body.classList.remove('vscode-light', 'vscode-dark', 'vscode-high-contrast'); + body.classList.add(initData.activeTheme); } -} + /** + * @return {HTMLIFrameElement} + */ + function getTarget() { + return document.getElementById('_target'); + } -document.addEventListener("DOMContentLoaded", function (event) { - ipcRenderer.on('baseUrl', function (event, value) { - initData.baseUrl = value; - }); - - ipcRenderer.on('styles', function (event, value, activeTheme) { - initData.styles = value; - initData.activeTheme = activeTheme; - - // webview - var target = getTarget() - if (!target) { + function handleInnerClick(event) { + if (!event || !event.view || !event.view.document) { return; } - var body = target.contentDocument.getElementsByTagName('body'); - styleBody(body[0]); - - // iframe - var defaultStyles = target.contentDocument.getElementById('_defaultStyles'); - if (defaultStyles) { - defaultStyles.innerHTML = initData.styles; - } - }); - - // propagate focus - ipcRenderer.on('focus', function () { - const target = getTarget(); - if (target) { - target.contentWindow.focus(); - } - }); - - // update iframe-contents - ipcRenderer.on('content', function (_event, value) { - const text = value.join('\n'); - const newDocument = new DOMParser().parseFromString(text, 'text/html'); - - // know what happens here - const stats = { - scriptTags: newDocument.documentElement.querySelectorAll('script').length, - inputTags: newDocument.documentElement.querySelectorAll('input').length, - styleTags: newDocument.documentElement.querySelectorAll('style').length, - linkStyleSheetTags: newDocument.documentElement.querySelectorAll('link[rel=stylesheet]').length, - stringLen: text.length - }; - - // set base-url if applicable - if (initData.baseUrl && newDocument.head.getElementsByTagName('base').length === 0) { - const baseElement = newDocument.createElement('base'); - baseElement.href = initData.baseUrl; - newDocument.head.appendChild(baseElement); - } - - // apply default styles - const defaultStyles = newDocument.createElement('style'); - defaultStyles.id = '_defaultStyles'; - defaultStyles.innerHTML = initData.styles; - if (newDocument.head.hasChildNodes()) { - newDocument.head.insertBefore(defaultStyles, newDocument.head.firstChild); - } else { - newDocument.head.appendChild(defaultStyles); - } - - styleBody(newDocument.body); - - const frame = getTarget(); - if (frame) { - frame.setAttribute('id', '_oldTarget'); - } - - // keep current scrollTop around and use later - const scrollTop = frame && frame.contentDocument && frame.contentDocument.body ? frame.contentDocument.body.scrollTop : 0; - - const newFrame = document.createElement('iframe'); - newFrame.setAttribute('id', '_target'); - newFrame.setAttribute('frameborder', '0'); - newFrame.setAttribute('sandbox', 'allow-scripts allow-forms allow-same-origin'); - newFrame.style.cssText = "margin: 0; overflow: hidden; position: absolute; width: 100%; height: 100%; display: none"; - document.body.appendChild(newFrame); - - // write new content onto iframe - newFrame.contentDocument.open('text/html', 'replace'); - newFrame.contentWindow.onbeforeunload = function (e) { - console.log('prevented webview navigation'); - return false; - }; - - newFrame.contentWindow.addEventListener('DOMContentLoaded', function (e) { - const contentDocument = e.target; - if (contentDocument.body) { - - // Workaround for https://github.com/Microsoft/vscode/issues/12865 - // check new scrollTop and reset if neccessary - if (scrollTop !== contentDocument.body.scrollTop) { - contentDocument.body.scrollTop = scrollTop; + var node = event.target; + while (node) { + if (node.tagName === "A" && node.href) { + var baseElement = event.view.document.getElementsByTagName("base")[0]; + if (node.getAttribute("href") === "#") { + event.view.scrollTo(0, 0); + } else if (node.hash && (node.getAttribute("href") === node.hash || (baseElement && node.href.indexOf(baseElement.href) >= 0))) { + var scrollTarget = event.view.document.getElementById(node.hash.substr(1, node.hash.length - 1)); + if (scrollTarget) { + scrollTarget.scrollIntoView(); + } + } else { + ipcRenderer.sendToHost("did-click-link", node.href); } - - // Bubble out link clicks - contentDocument.body.addEventListener('click', handleInnerClick); + event.preventDefault(); + break; } + node = node.parentNode; + } + } - // Clean up old frames - [].forEach.call(document.body.getElementsByTagName('iframe'), function (frame) { - if (frame.id !== '_target') { - document.body.removeChild(frame); - } - }); - const newFrame = document.getElementById('_target'); - if (newFrame.contentDocument === contentDocument) { - newFrame.style.display = 'block'; + document.addEventListener("DOMContentLoaded", function (event) { + ipcRenderer.on('baseUrl', function (event, value) { + initData.baseUrl = value; + }); + + ipcRenderer.on('styles', function (event, value, activeTheme) { + initData.styles = value; + initData.activeTheme = activeTheme; + + // webview + var target = getTarget() + if (!target) { + return; + } + var body = target.contentDocument.getElementsByTagName('body'); + styleBody(body[0]); + + // iframe + var defaultStyles = target.contentDocument.getElementById('_defaultStyles'); + if (defaultStyles) { + defaultStyles.innerHTML = initData.styles; } }); - // set DOCTYPE for newDocument explicitly as DOMParser.parseFromString strips it off - // and DOCTYPE is needed in the iframe to ensure that the user agent stylesheet is correctly overridden - newFrame.contentDocument.write(''); - newFrame.contentDocument.write(newDocument.documentElement.innerHTML); - newFrame.contentDocument.close(); + // propagate focus + ipcRenderer.on('focus', function () { + const target = getTarget(); + if (target) { + target.contentWindow.focus(); + } + }); - ipcRenderer.sendToHost('did-set-content', stats); + // update iframe-contents + ipcRenderer.on('content', function (_event, value) { + const text = value.join('\n'); + const newDocument = new DOMParser().parseFromString(text, 'text/html'); + + // know what happens here + const stats = { + scriptTags: newDocument.documentElement.querySelectorAll('script').length, + inputTags: newDocument.documentElement.querySelectorAll('input').length, + styleTags: newDocument.documentElement.querySelectorAll('style').length, + linkStyleSheetTags: newDocument.documentElement.querySelectorAll('link[rel=stylesheet]').length, + stringLen: text.length + }; + + // set base-url if applicable + if (initData.baseUrl && newDocument.head.getElementsByTagName('base').length === 0) { + const baseElement = newDocument.createElement('base'); + baseElement.href = initData.baseUrl; + newDocument.head.appendChild(baseElement); + } + + // apply default styles + const defaultStyles = newDocument.createElement('style'); + defaultStyles.id = '_defaultStyles'; + defaultStyles.innerHTML = initData.styles; + if (newDocument.head.hasChildNodes()) { + newDocument.head.insertBefore(defaultStyles, newDocument.head.firstChild); + } else { + newDocument.head.appendChild(defaultStyles); + } + + styleBody(newDocument.body); + + const frame = getTarget(); + if (frame) { + frame.setAttribute('id', '_oldTarget'); + } + + // keep current scrollTop around and use later + const scrollTop = frame && frame.contentDocument && frame.contentDocument.body ? frame.contentDocument.body.scrollTop : 0; + + const newFrame = document.createElement('iframe'); + newFrame.setAttribute('id', '_target'); + newFrame.setAttribute('frameborder', '0'); + newFrame.setAttribute('sandbox', 'allow-scripts allow-forms allow-same-origin'); + newFrame.style.cssText = "margin: 0; overflow: hidden; position: absolute; width: 100%; height: 100%; display: none"; + document.body.appendChild(newFrame); + + // write new content onto iframe + newFrame.contentDocument.open('text/html', 'replace'); + newFrame.contentWindow.onbeforeunload = function (e) { + console.log('prevented webview navigation'); + return false; + }; + + newFrame.contentWindow.addEventListener('DOMContentLoaded', function (e) { + /** + * @type {any} + */ + const contentDocument = e.target; + if (contentDocument.body) { + + // Workaround for https://github.com/Microsoft/vscode/issues/12865 + // check new scrollTop and reset if neccessary + if (scrollTop !== contentDocument.body.scrollTop) { + contentDocument.body.scrollTop = scrollTop; + } + + // Bubble out link clicks + contentDocument.body.addEventListener('click', handleInnerClick); + } + + // Clean up old frames + [].forEach.call(document.body.getElementsByTagName('iframe'), function (frame) { + if (frame.id !== '_target') { + document.body.removeChild(frame); + } + }); + + const newFrame = getTarget(); + if (newFrame.contentDocument === contentDocument) { + newFrame.style.display = 'block'; + } + }); + + // set DOCTYPE for newDocument explicitly as DOMParser.parseFromString strips it off + // and DOCTYPE is needed in the iframe to ensure that the user agent stylesheet is correctly overridden + newFrame.contentDocument.write(''); + newFrame.contentDocument.write(newDocument.documentElement.innerHTML); + newFrame.contentDocument.close(); + + ipcRenderer.sendToHost('did-set-content', stats); + }); + + // Forward message to the embedded iframe + ipcRenderer.on('message', function (event, data) { + const target = getTarget(); + if (target) { + target.contentWindow.postMessage(data, document.location.origin); + } + }); + + // forward messages from the embedded iframe + window.onmessage = function (message) { + ipcRenderer.sendToHost(message.data.command, message.data.data); + }; + + // signal ready + ipcRenderer.sendToHost('webview-ready', process.pid); }); - - // Forward message to the embedded iframe - ipcRenderer.on('message', function (event, data) { - const target = getTarget(); - if (target) { - target.contentWindow.postMessage(data, document.location.origin); - } - }); - - // forward messages from the embedded iframe - window.onmessage = function (message) { - ipcRenderer.sendToHost(message.data.command, message.data.data); - }; - - // signal ready - ipcRenderer.sendToHost('webview-ready', process.pid); -}); +}()); \ No newline at end of file From feb3c217a495aac395388f16a9f9a982714a1c60 Mon Sep 17 00:00:00 2001 From: rebornix Date: Fri, 5 May 2017 15:21:04 -0700 Subject: [PATCH 0147/1164] Fix #26084. Show Toggle Regex button when Find widget is invisible. --- .../contrib/find/browser/findOptionsWidget.ts | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/find/browser/findOptionsWidget.ts b/src/vs/editor/contrib/find/browser/findOptionsWidget.ts index f84b6f2fae0..05a5d1c9ffe 100644 --- a/src/vs/editor/contrib/find/browser/findOptionsWidget.ts +++ b/src/vs/editor/contrib/find/browser/findOptionsWidget.ts @@ -11,7 +11,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition, OverlayWidgetPositionPreference } from 'vs/editor/browser/editorBrowser'; import { FIND_IDS } from 'vs/editor/contrib/find/common/findModel'; import { FindReplaceState } from 'vs/editor/contrib/find/common/findState'; -import { CaseSensitiveCheckbox, WholeWordsCheckbox } from 'vs/base/browser/ui/findinput/findInputCheckboxes'; +import { CaseSensitiveCheckbox, WholeWordsCheckbox, RegexCheckbox } from 'vs/base/browser/ui/findinput/findInputCheckboxes'; import { RunOnceScheduler } from 'vs/base/common/async'; import { IThemeService, ITheme, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { inputActiveOptionBorder, editorWidgetBackground, contrastBorder, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; @@ -25,6 +25,7 @@ export class FindOptionsWidget extends Widget implements IOverlayWidget { private _keybindingService: IKeybindingService; private _domNode: HTMLElement; + private regex: RegexCheckbox; private wholeWords: WholeWordsCheckbox; private caseSensitive: CaseSensitiveCheckbox; @@ -73,10 +74,26 @@ export class FindOptionsWidget extends Widget implements IOverlayWidget { })); this._domNode.appendChild(this.wholeWords.domNode); + this.regex = this._register(new RegexCheckbox({ + appendTitle: this._keybindingLabelFor(FIND_IDS.ToggleRegexCommand), + isChecked: this._state.isRegex, + onChange: (viaKeyboard) => { + this._state.change({ + isRegex: this.regex.checked + }, false); + }, + inputActiveOptionBorder: inputActiveOptionBorderColor + })); + this._domNode.appendChild(this.regex.domNode); + this._editor.addOverlayWidget(this); this._register(this._state.addChangeListener((e) => { let somethingChanged = false; + if (e.isRegex) { + this.regex.checked = this._state.isRegex; + somethingChanged = true; + } if (e.wholeWord) { this.wholeWords.checked = this._state.wholeWord; somethingChanged = true; @@ -167,6 +184,7 @@ export class FindOptionsWidget extends Widget implements IOverlayWidget { let inputStyles = { inputActiveOptionBorder: theme.getColor(inputActiveOptionBorder) }; this.caseSensitive.style(inputStyles); this.wholeWords.style(inputStyles); + this.regex.style(inputStyles); } } From f468a9921b405e24fb47537f2ff99110c0581785 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 5 May 2017 16:37:13 -0700 Subject: [PATCH 0148/1164] Fix terminal selection color for invalid links Fixes #26092 --- .../parts/terminal/electron-browser/terminalPanel.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index 38fb99f450c..ee895a95919 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -230,9 +230,11 @@ export class TerminalPanel extends Panel { let color = theme.getColor(colorId); let rgba = color.transparent(0.996); css += `.monaco-workbench .panel.integrated-terminal .xterm .xterm-color-${index} { color: ${color}; }` + - `.monaco-workbench .panel.integrated-terminal .xterm .xterm-color-${index}::selection { background-color: ${rgba}; }` + + `.monaco-workbench .panel.integrated-terminal .xterm .xterm-color-${index}::selection,` + + `.monaco-workbench .panel.integrated-terminal .xterm .xterm-color-${index} *::selection { background-color: ${rgba}; }` + `.monaco-workbench .panel.integrated-terminal .xterm .xterm-bg-color-${index} { background-color: ${color}; }` + - `.monaco-workbench .panel.integrated-terminal .xterm .xterm-bg-color-${index}::selection { color: ${color}; }`; + `.monaco-workbench .panel.integrated-terminal .xterm .xterm-bg-color-${index}::selection,` + + `.monaco-workbench .panel.integrated-terminal .xterm .xterm-bg-color-${index} *::selection { color: ${color}; }`; } }); const bgColor = theme.getColor(TERMINAL_BACKGROUND_COLOR); From 64cb10da169666566ae99e46d89afe6d1330df16 Mon Sep 17 00:00:00 2001 From: rebornix Date: Fri, 5 May 2017 18:03:23 -0700 Subject: [PATCH 0149/1164] Fix #5861. Take minimap into account --- src/vs/editor/contrib/find/browser/findWidget.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index bbd0bee81fa..09d722afa8f 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -109,6 +109,7 @@ export class FindWidget extends Widget implements IOverlayWidget { let checkEditorWidth = () => { let editorWidth = this._codeEditor.getConfiguration().layoutInfo.width; + let minimapWidth = this._codeEditor.getConfiguration().layoutInfo.minimapWidth; let collapsedFindWidget = false; let reducedFindWidget = false; let narrowFindWidget = false; @@ -118,7 +119,7 @@ export class FindWidget extends Widget implements IOverlayWidget { if (WIDGET_FIXED_WIDTH + 28 >= editorWidth) { narrowFindWidget = true; } - if (WIDGET_FIXED_WIDTH + MAX_MATCHES_COUNT_WIDTH + 28 >= editorWidth) { + if (WIDGET_FIXED_WIDTH + MAX_MATCHES_COUNT_WIDTH + 28 + minimapWidth >= editorWidth) { reducedFindWidget = true; } dom.toggleClass(this._domNode, 'collapsed-find-widget', collapsedFindWidget); From 56b341c2e067340a6720fdda048bda801081c5f0 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Sat, 6 May 2017 09:29:04 +0200 Subject: [PATCH 0150/1164] Windows in fullscreen mode does not restore to correct monitor (fixes #25400) --- src/vs/code/electron-main/window.ts | 32 ++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 610420ef668..1421465ce4c 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -30,6 +30,7 @@ export interface IWindowState { x?: number; y?: number; mode?: WindowMode; + display?: number; } export interface IWindowCreationOptions { @@ -599,9 +600,15 @@ export class VSCodeWindow { } public serializeWindowState(): IWindowState { + + // fullscreen gets special treatment if (this.win.isFullScreen()) { + const display = screen.getDisplayMatching(this.getBounds()); + return { mode: WindowMode.Fullscreen, + display: display ? display.id : void 0, + // still carry over window dimensions from previous sessions! width: this.windowState.width, height: this.windowState.height, @@ -631,13 +638,12 @@ export class VSCodeWindow { // only consider non-minimized window states if (mode === WindowMode.Normal || mode === WindowMode.Maximized) { - const pos = this.win.getPosition(); - const size = this.win.getSize(); + const bounds = this.getBounds(); - state.x = pos[0]; - state.y = pos[1]; - state.width = size[0]; - state.height = size[1]; + state.x = bounds.x; + state.y = bounds.y; + state.width = bounds.width; + state.height = bounds.height; } return state; @@ -713,7 +719,19 @@ export class VSCodeWindow { return state; } - // Multi Monitor: be less strict because metrics can be crazy + // Multi Montior (fullscreen): try to find the previously used display + if (state.display && state.mode === WindowMode.Fullscreen) { + const display = displays.filter(d => d.id === state.display)[0]; + if (display && display.bounds && typeof display.bounds.x === 'number' && typeof display.bounds.y === 'number') { + const defaults = defaultWindowState(WindowMode.Fullscreen); // make sure we have good values when the user restores the window + defaults.x = display.bounds.x; // carefull to use displays x/y position so that the window ends up on the correct monitor + defaults.y = display.bounds.y; + + return defaults; + } + } + + // Multi Monitor (non-fullscreen): be less strict because metrics can be crazy const bounds = { x: state.x, y: state.y, width: state.width, height: state.height }; const display = screen.getDisplayMatching(bounds); if (display && display.bounds.x + display.bounds.width > bounds.x && display.bounds.y + display.bounds.height > bounds.y) { From c4ccce9229b6f42644bcfd9fa8b7de5362ffd412 Mon Sep 17 00:00:00 2001 From: Maik Riechert Date: Sat, 6 May 2017 16:23:50 +0100 Subject: [PATCH 0151/1164] handle git branch delete error ("not fully merged") --- extensions/git/src/commands.ts | 59 +++++++++++++++++++++------------- extensions/git/src/git.ts | 9 ++++-- extensions/git/src/model.ts | 4 +-- 3 files changed, 45 insertions(+), 27 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 15532bfc28b..e8c155102a3 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -62,21 +62,18 @@ class CheckoutRemoteHeadItem extends CheckoutItem { class BranchDeleteItem implements QuickPickItem { - protected get shortCommit(): string { return (this.ref.commit || '').substr(0, 8); } - protected get treeish(): string | undefined { return this.ref.name; } - get label(): string { return this.ref.name || this.shortCommit; } + private get shortCommit(): string { return (this.ref.commit || '').substr(0, 8); } + get branchName(): string | undefined { return this.ref.name; } + get label(): string { return this.branchName || ''; } get description(): string { return this.shortCommit; } - constructor(protected ref: Ref) { } + constructor(private ref: Ref) { } - async run(model: Model): Promise { - const ref = this.treeish; - - if (!ref) { + async run(model: Model, force?: boolean): Promise { + if (!this.branchName) { return; } - - await model.deleteBranch(ref); + await model.deleteBranch(this.branchName, force); } } @@ -720,22 +717,40 @@ export class CommandCenter { } @command('git.deleteBranch') - async deleteBranch(branchName: string): Promise { - if (typeof branchName === 'string') { - return await this.model.deleteBranch(branchName); - } - const currentHead = this.model.HEAD && this.model.HEAD.name; - const heads = this.model.refs.filter(ref => ref.type === RefType.Head && ref.name !== currentHead) - .map(ref => new BranchDeleteItem(ref)); + async deleteBranch(name: string, force?: boolean): Promise { + let run: (force?: boolean) => Promise; + if (typeof name === 'string') { + run = force => this.model.deleteBranch(name, force); + } else { + const currentHead = this.model.HEAD && this.model.HEAD.name; + const heads = this.model.refs.filter(ref => ref.type === RefType.Head && ref.name !== currentHead) + .map(ref => new BranchDeleteItem(ref)); - const placeHolder = 'Select a branch to delete'; - const choice = await window.showQuickPick(heads, { placeHolder }); + const placeHolder = 'Select a branch to delete'; + const choice = await window.showQuickPick(heads, { placeHolder }); - if (!choice) { - return; + if (!choice) { + return; + } + name = choice.branchName || ''; + run = force => choice.run(this.model, force); } - await choice.run(this.model); + try { + await run(force); + } catch (err) { + if (err.gitErrorCode !== GitErrorCodes.BranchNotFullyMerged) { + throw err; + } + + const message = localize('confirm force delete branch', "The branch '{0}' is not fully merged. Delete anyway?", name); + const yes = localize('delete branch', "Delete Branch"); + const pick = await window.showWarningMessage(message, yes); + + if (pick === yes) { + await run(true); + } + } } @command('git.pull') diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index a242d034654..faad58452b6 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -273,7 +273,8 @@ export const GitErrorCodes = { CantCreatePipe: 'CantCreatePipe', CantAccessRemote: 'CantAccessRemote', RepositoryNotFound: 'RepositoryNotFound', - RepositoryIsLocked: 'RepositoryIsLocked' + RepositoryIsLocked: 'RepositoryIsLocked', + BranchNotFullyMerged: 'BranchNotFullyMerged' }; function getGitErrorCode(stderr: string): string | undefined { @@ -291,6 +292,8 @@ function getGitErrorCode(stderr: string): string | undefined { return GitErrorCodes.RepositoryNotFound; } else if (/unable to access/.test(stderr)) { return GitErrorCodes.CantAccessRemote; + } else if (/branch '.+' is not fully merged/.test(stderr)) { + return GitErrorCodes.BranchNotFullyMerged; } return void 0; @@ -650,8 +653,8 @@ export class Repository { await this.run(args); } - async deleteBranch(name: string): Promise { - const args = ['branch', '-d', name]; + async deleteBranch(name: string, force?: boolean): Promise { + const args = ['branch', force ? '-D' : '-d', name]; await this.run(args); } diff --git a/extensions/git/src/model.ts b/extensions/git/src/model.ts index 0446a3c5e09..6dccfd19984 100644 --- a/extensions/git/src/model.ts +++ b/extensions/git/src/model.ts @@ -455,8 +455,8 @@ export class Model implements Disposable { await this.run(Operation.Branch, () => this.repository.branch(name, true)); } - async deleteBranch(name: string): Promise { - await this.run(Operation.DeleteBranch, () => this.repository.deleteBranch(name)); + async deleteBranch(name: string, force?: boolean): Promise { + await this.run(Operation.DeleteBranch, () => this.repository.deleteBranch(name, force)); } async checkout(treeish: string): Promise { From 1c7f33e4758ff280127087272805b61c80948579 Mon Sep 17 00:00:00 2001 From: Maik Riechert Date: Sat, 6 May 2017 16:55:38 +0100 Subject: [PATCH 0152/1164] localize --- extensions/git/src/commands.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index e8c155102a3..3ede435fff3 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -726,13 +726,13 @@ export class CommandCenter { const heads = this.model.refs.filter(ref => ref.type === RefType.Head && ref.name !== currentHead) .map(ref => new BranchDeleteItem(ref)); - const placeHolder = 'Select a branch to delete'; + const placeHolder = localize('select branch to delete', 'Select a branch to delete'); const choice = await window.showQuickPick(heads, { placeHolder }); - if (!choice) { + if (!choice || !choice.branchName) { return; } - name = choice.branchName || ''; + name = choice.branchName; run = force => choice.run(this.model, force); } From 0fb71c07942f993bbd570f6c55abc66a912e5427 Mon Sep 17 00:00:00 2001 From: Sebastian Zaha Date: Mon, 8 May 2017 07:54:37 +0200 Subject: [PATCH 0153/1164] Added an option to disable the mnemonics in the main menu (#22669) * fixes #17962 * :lipstick: --- src/vs/code/electron-main/menus.ts | 127 ++++++++++-------- src/vs/platform/windows/common/windows.ts | 1 + .../electron-browser/main.contribution.ts | 5 + 3 files changed, 76 insertions(+), 57 deletions(-) diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index 52428d389ee..67092963e6c 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -37,6 +37,9 @@ interface IExtensionViewlet { } interface IConfiguration extends IFilesConfiguration { + window: { + enableMenuBarMnemonics: boolean; + }; workbench: { sideBar: { location: 'left' | 'right'; @@ -153,6 +156,7 @@ export class VSCodeMenu { private currentSidebarLocation: 'left' | 'right'; private currentStatusbarVisible: boolean; private currentActivityBarVisible: boolean; + private currentEnableMenuBarMnemonics: boolean; private isQuitting: boolean; private appMenuInstalled: boolean; @@ -252,6 +256,15 @@ export class VSCodeMenu { updateMenu = true; } + let newEnableMenuBarMnemonics = config && config.window && config.window.enableMenuBarMnemonics; + if (typeof newEnableMenuBarMnemonics !== 'boolean') { + newEnableMenuBarMnemonics = true; + } + if (newEnableMenuBarMnemonics !== this.currentEnableMenuBarMnemonics) { + this.currentEnableMenuBarMnemonics = newEnableMenuBarMnemonics; + updateMenu = true; + } + if (handleMenu && updateMenu) { this.updateMenu(); } @@ -298,32 +311,32 @@ export class VSCodeMenu { // File const fileMenu = new Menu(); - const fileMenuItem = new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'mFile', comment: ['&& denotes a mnemonic'] }, "&&File")), submenu: fileMenu }); + const fileMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mFile', comment: ['&& denotes a mnemonic'] }, "&&File")), submenu: fileMenu }); this.setFileMenu(fileMenu); // Edit const editMenu = new Menu(); - const editMenuItem = new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'mEdit', comment: ['&& denotes a mnemonic'] }, "&&Edit")), submenu: editMenu }); + const editMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mEdit', comment: ['&& denotes a mnemonic'] }, "&&Edit")), submenu: editMenu }); this.setEditMenu(editMenu); // Selection const selectionMenu = new Menu(); - const selectionMenuItem = new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'mSelection', comment: ['&& denotes a mnemonic'] }, "&&Selection")), submenu: selectionMenu }); + const selectionMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mSelection', comment: ['&& denotes a mnemonic'] }, "&&Selection")), submenu: selectionMenu }); this.setSelectionMenu(selectionMenu); // View const viewMenu = new Menu(); - const viewMenuItem = new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'mView', comment: ['&& denotes a mnemonic'] }, "&&View")), submenu: viewMenu }); + const viewMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mView', comment: ['&& denotes a mnemonic'] }, "&&View")), submenu: viewMenu }); this.setViewMenu(viewMenu); // Goto const gotoMenu = new Menu(); - const gotoMenuItem = new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'mGoto', comment: ['&& denotes a mnemonic'] }, "&&Go")), submenu: gotoMenu }); + const gotoMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mGoto', comment: ['&& denotes a mnemonic'] }, "&&Go")), submenu: gotoMenu }); this.setGotoMenu(gotoMenu); // Debug const debugMenu = new Menu(); - const debugMenuItem = new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'mDebug', comment: ['&& denotes a mnemonic'] }, "&&Debug")), submenu: debugMenu }); + const debugMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mDebug', comment: ['&& denotes a mnemonic'] }, "&&Debug")), submenu: debugMenu }); this.setDebugMenu(debugMenu); @@ -331,13 +344,13 @@ export class VSCodeMenu { let macWindowMenuItem: Electron.MenuItem; if (isMacintosh) { const windowMenu = new Menu(); - macWindowMenuItem = new MenuItem({ label: mnemonicLabel(nls.localize('mWindow', "Window")), submenu: windowMenu, role: 'window' }); + macWindowMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize('mWindow', "Window")), submenu: windowMenu, role: 'window' }); this.setMacWindowMenu(windowMenu); } // Help const helpMenu = new Menu(); - const helpMenuItem = new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'mHelp', comment: ['&& denotes a mnemonic'] }, "&&Help")), submenu: helpMenu, role: 'help' }); + const helpMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mHelp', comment: ['&& denotes a mnemonic'] }, "&&Help")), submenu: helpMenu, role: 'help' }); this.setHelpMenu(helpMenu); // Menu Structure @@ -365,7 +378,7 @@ export class VSCodeMenu { this.appMenuInstalled = true; const dockMenu = new Menu(); - dockMenu.append(new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miNewWindow', comment: ['&& denotes a mnemonic'] }, "New &&Window")), click: () => this.windowsService.openNewWindow(OpenContext.DOCK) })); + dockMenu.append(new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miNewWindow', comment: ['&& denotes a mnemonic'] }, "New &&Window")), click: () => this.windowsService.openNewWindow(OpenContext.DOCK) })); app.dock.setMenu(dockMenu); } @@ -401,42 +414,42 @@ export class VSCodeMenu { let newFile: Electron.MenuItem; if (hasNoWindows) { - newFile = new MenuItem(this.likeAction('workbench.action.files.newUntitledFile', { label: mnemonicLabel(nls.localize({ key: 'miNewFile', comment: ['&& denotes a mnemonic'] }, "&&New File")), click: () => this.windowsService.openNewWindow(OpenContext.MENU) })); + newFile = new MenuItem(this.likeAction('workbench.action.files.newUntitledFile', { label: this.mnemonicLabel(nls.localize({ key: 'miNewFile', comment: ['&& denotes a mnemonic'] }, "&&New File")), click: () => this.windowsService.openNewWindow(OpenContext.MENU) })); } else { newFile = this.createMenuItem(nls.localize({ key: 'miNewFile', comment: ['&& denotes a mnemonic'] }, "&&New File"), 'workbench.action.files.newUntitledFile'); } - const open = new MenuItem(this.likeAction('workbench.action.files.openFileFolder', { label: mnemonicLabel(nls.localize({ key: 'miOpen', comment: ['&& denotes a mnemonic'] }, "&&Open...")), click: (menuItem, win, event) => this.windowsService.openFileFolderPicker(this.isOptionClick(event), { from: telemetryFrom }) })); - const openFolder = new MenuItem(this.likeAction('workbench.action.files.openFolder', { label: mnemonicLabel(nls.localize({ key: 'miOpenFolder', comment: ['&& denotes a mnemonic'] }, "Open &&Folder...")), click: (menuItem, win, event) => this.windowsService.openFolderPicker(this.isOptionClick(event), undefined, { from: telemetryFrom }) })); + const open = new MenuItem(this.likeAction('workbench.action.files.openFileFolder', { label: this.mnemonicLabel(nls.localize({ key: 'miOpen', comment: ['&& denotes a mnemonic'] }, "&&Open...")), click: (menuItem, win, event) => this.windowsService.openFileFolderPicker(this.isOptionClick(event), { from: telemetryFrom }) })); + const openFolder = new MenuItem(this.likeAction('workbench.action.files.openFolder', { label: this.mnemonicLabel(nls.localize({ key: 'miOpenFolder', comment: ['&& denotes a mnemonic'] }, "Open &&Folder...")), click: (menuItem, win, event) => this.windowsService.openFolderPicker(this.isOptionClick(event), undefined, { from: telemetryFrom }) })); let openFile: Electron.MenuItem; if (hasNoWindows) { - openFile = new MenuItem(this.likeAction('workbench.action.files.openFile', { label: mnemonicLabel(nls.localize({ key: 'miOpenFile', comment: ['&& denotes a mnemonic'] }, "&&Open File...")), click: (menuItem, win, event) => this.windowsService.openFilePicker(this.isOptionClick(event), undefined, undefined, { from: telemetryFrom }) })); + openFile = new MenuItem(this.likeAction('workbench.action.files.openFile', { label: this.mnemonicLabel(nls.localize({ key: 'miOpenFile', comment: ['&& denotes a mnemonic'] }, "&&Open File...")), click: (menuItem, win, event) => this.windowsService.openFilePicker(this.isOptionClick(event), undefined, undefined, { from: telemetryFrom }) })); } else { openFile = this.createMenuItem(nls.localize({ key: 'miOpenFile', comment: ['&& denotes a mnemonic'] }, "&&Open File..."), ['workbench.action.files.openFile', 'workbench.action.files.openFileInNewWindow']); } const openRecentMenu = new Menu(); this.setOpenRecentMenu(openRecentMenu); - const openRecent = new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miOpenRecent', comment: ['&& denotes a mnemonic'] }, "Open &&Recent")), submenu: openRecentMenu, enabled: openRecentMenu.items.length > 0 }); + const openRecent = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miOpenRecent', comment: ['&& denotes a mnemonic'] }, "Open &&Recent")), submenu: openRecentMenu, enabled: openRecentMenu.items.length > 0 }); const saveFile = this.createMenuItem(nls.localize({ key: 'miSave', comment: ['&& denotes a mnemonic'] }, "&&Save"), 'workbench.action.files.save', this.windowsService.getWindowCount() > 0); const saveFileAs = this.createMenuItem(nls.localize({ key: 'miSaveAs', comment: ['&& denotes a mnemonic'] }, "Save &&As..."), 'workbench.action.files.saveAs', this.windowsService.getWindowCount() > 0); const saveAllFiles = this.createMenuItem(nls.localize({ key: 'miSaveAll', comment: ['&& denotes a mnemonic'] }, "Save A&&ll"), 'workbench.action.files.saveAll', this.windowsService.getWindowCount() > 0); const autoSaveEnabled = [AutoSaveConfiguration.AFTER_DELAY, AutoSaveConfiguration.ON_FOCUS_CHANGE, AutoSaveConfiguration.ON_WINDOW_CHANGE].some(s => this.currentAutoSaveSetting === s); - const autoSave = new MenuItem(this.likeAction('vscode.toggleAutoSave', { label: mnemonicLabel(nls.localize('miAutoSave', "Auto Save")), type: 'checkbox', checked: autoSaveEnabled, enabled: this.windowsService.getWindowCount() > 0, click: () => this.windowsService.sendToFocused('vscode.toggleAutoSave') }, false)); + const autoSave = new MenuItem(this.likeAction('vscode.toggleAutoSave', { label: this.mnemonicLabel(nls.localize('miAutoSave', "Auto Save")), type: 'checkbox', checked: autoSaveEnabled, enabled: this.windowsService.getWindowCount() > 0, click: () => this.windowsService.sendToFocused('vscode.toggleAutoSave') }, false)); const preferences = this.getPreferencesMenu(); - const newWindow = new MenuItem(this.likeAction('workbench.action.newWindow', { label: mnemonicLabel(nls.localize({ key: 'miNewWindow', comment: ['&& denotes a mnemonic'] }, "New &&Window")), click: () => this.windowsService.openNewWindow(OpenContext.MENU) })); + const newWindow = new MenuItem(this.likeAction('workbench.action.newWindow', { label: this.mnemonicLabel(nls.localize({ key: 'miNewWindow', comment: ['&& denotes a mnemonic'] }, "New &&Window")), click: () => this.windowsService.openNewWindow(OpenContext.MENU) })); const revertFile = this.createMenuItem(nls.localize({ key: 'miRevert', comment: ['&& denotes a mnemonic'] }, "Re&&vert File"), 'workbench.action.files.revert', this.windowsService.getWindowCount() > 0); - const closeWindow = new MenuItem(this.likeAction('workbench.action.closeWindow', { label: mnemonicLabel(nls.localize({ key: 'miCloseWindow', comment: ['&& denotes a mnemonic'] }, "Clos&&e Window")), click: () => this.windowsService.getLastActiveWindow().win.close(), enabled: this.windowsService.getWindowCount() > 0 })); + const closeWindow = new MenuItem(this.likeAction('workbench.action.closeWindow', { label: this.mnemonicLabel(nls.localize({ key: 'miCloseWindow', comment: ['&& denotes a mnemonic'] }, "Clos&&e Window")), click: () => this.windowsService.getLastActiveWindow().win.close(), enabled: this.windowsService.getWindowCount() > 0 })); const closeFolder = this.createMenuItem(nls.localize({ key: 'miCloseFolder', comment: ['&& denotes a mnemonic'] }, "Close &&Folder"), 'workbench.action.closeFolder'); const closeEditor = this.createMenuItem(nls.localize({ key: 'miCloseEditor', comment: ['&& denotes a mnemonic'] }, "&&Close Editor"), 'workbench.action.closeActiveEditor'); - const exit = new MenuItem(this.likeAction('workbench.action.quit', { label: mnemonicLabel(nls.localize({ key: 'miExit', comment: ['&& denotes a mnemonic'] }, "E&&xit")), click: () => this.windowsService.quit() })); + const exit = new MenuItem(this.likeAction('workbench.action.quit', { label: this.mnemonicLabel(nls.localize({ key: 'miExit', comment: ['&& denotes a mnemonic'] }, "E&&xit")), click: () => this.windowsService.quit() })); arrays.coalesce([ newFile, @@ -483,7 +496,7 @@ export class VSCodeMenu { preferencesMenu.append(colorThemeSelection); preferencesMenu.append(iconThemeSelection); - return new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miPreferences', comment: ['&& denotes a mnemonic'] }, "&&Preferences")), submenu: preferencesMenu }); + return new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miPreferences', comment: ['&& denotes a mnemonic'] }, "&&Preferences")), submenu: preferencesMenu }); } private setOpenRecentMenu(openRecentMenu: Electron.Menu): void { @@ -522,7 +535,7 @@ export class VSCodeMenu { } return new MenuItem(this.likeAction(commandId, { - label: unMnemonicLabel(label), click: (menuItem, win, event) => { + label: this.unmnemonicLabel(label), click: (menuItem, win, event) => { const openInNewWindow = this.isOptionClick(event); const success = !!this.windowsService.open({ context: OpenContext.MENU, cli: this.environmentService.args, pathsToOpen: [path], forceNewWindow: openInNewWindow }); if (!success) { @@ -538,7 +551,7 @@ export class VSCodeMenu { private createRoleMenuItem(label: string, commandId: string, role: Electron.MenuItemRole): Electron.MenuItem { const options: Electron.MenuItemOptions = { - label: mnemonicLabel(label), + label: this.mnemonicLabel(label), role, enabled: true }; @@ -659,12 +672,12 @@ export class VSCodeMenu { additionalViewletsMenu.append(this.createMenuItem(viewlet.label, viewlet.id)); }); - additionalViewlets = new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miAdditionalViews', comment: ['&& denotes a mnemonic'] }, "Additional &&Views")), submenu: additionalViewletsMenu, enabled: true }); + additionalViewlets = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miAdditionalViews', comment: ['&& denotes a mnemonic'] }, "Additional &&Views")), submenu: additionalViewletsMenu, enabled: true }); } const commands = this.createMenuItem(nls.localize({ key: 'miCommandPalette', comment: ['&& denotes a mnemonic'] }, "&&Command Palette..."), 'workbench.action.showCommands'); - const fullscreen = new MenuItem(this.withKeybinding('workbench.action.toggleFullScreen', { label: mnemonicLabel(nls.localize({ key: 'miToggleFullScreen', comment: ['&& denotes a mnemonic'] }, "Toggle &&Full Screen")), click: () => this.windowsService.getLastActiveWindow().toggleFullScreen(), enabled: this.windowsService.getWindowCount() > 0 })); + const fullscreen = new MenuItem(this.withKeybinding('workbench.action.toggleFullScreen', { label: this.mnemonicLabel(nls.localize({ key: 'miToggleFullScreen', comment: ['&& denotes a mnemonic'] }, "Toggle &&Full Screen")), click: () => this.windowsService.getLastActiveWindow().toggleFullScreen(), enabled: this.windowsService.getWindowCount() > 0 })); const toggleZenMode = this.createMenuItem(nls.localize('miToggleZenMode', "Toggle Zen Mode"), 'workbench.action.toggleZenMode', this.windowsService.getWindowCount() > 0); const toggleMenuBar = this.createMenuItem(nls.localize({ key: 'miToggleMenuBar', comment: ['&& denotes a mnemonic'] }, "Toggle Menu &&Bar"), 'workbench.action.toggleMenuBar'); const splitEditor = this.createMenuItem(nls.localize({ key: 'miSplitEditor', comment: ['&& denotes a mnemonic'] }, "Split &&Editor"), 'workbench.action.splitEditor'); @@ -763,7 +776,7 @@ export class VSCodeMenu { previousEditorInGroup ].forEach(item => switchEditorMenu.append(item)); - const switchEditor = new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miSwitchEditor', comment: ['&& denotes a mnemonic'] }, "Switch &&Editor")), submenu: switchEditorMenu, enabled: true }); + const switchEditor = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miSwitchEditor', comment: ['&& denotes a mnemonic'] }, "Switch &&Editor")), submenu: switchEditorMenu, enabled: true }); const switchGroupMenu = new Menu(); @@ -782,7 +795,7 @@ export class VSCodeMenu { previousGroup ].forEach(item => switchGroupMenu.append(item)); - const switchGroup = new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miSwitchGroup', comment: ['&& denotes a mnemonic'] }, "Switch &&Group")), submenu: switchGroupMenu, enabled: true }); + const switchGroup = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miSwitchGroup', comment: ['&& denotes a mnemonic'] }, "Switch &&Group")), submenu: switchGroupMenu, enabled: true }); const gotoFile = this.createMenuItem(nls.localize({ key: 'miGotoFile', comment: ['&& denotes a mnemonic'] }, "Go to &&File..."), 'workbench.action.quickOpen'); const gotoSymbolInFile = this.createMenuItem(nls.localize({ key: 'miGotoSymbolInFile', comment: ['&& denotes a mnemonic'] }, "Go to &&Symbol in File..."), 'workbench.action.gotoSymbol'); @@ -824,7 +837,7 @@ export class VSCodeMenu { breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miConditionalBreakpoint', comment: ['&& denotes a mnemonic'] }, "&&Conditional Breakpoint..."), 'editor.debug.action.conditionalBreakpoint')); breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miColumnBreakpoint', comment: ['&& denotes a mnemonic'] }, "C&&olumn Breakpoint"), 'editor.debug.action.toggleColumnBreakpoint')); breakpointsMenu.append(this.createMenuItem(nls.localize({ key: 'miFunctionBreakpoint', comment: ['&& denotes a mnemonic'] }, "&&Function Breakpoint..."), 'workbench.debug.viewlet.action.addFunctionBreakpointAction')); - const newBreakpoints = new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miNewBreakpoint', comment: ['&& denotes a mnemonic'] }, "&&New Breakpoint")), submenu: breakpointsMenu }); + const newBreakpoints = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miNewBreakpoint', comment: ['&& denotes a mnemonic'] }, "&&New Breakpoint")), submenu: breakpointsMenu }); const disableAllBreakpoints = this.createMenuItem(nls.localize({ key: 'miDisableAllBreakpoints', comment: ['&& denotes a mnemonic'] }, "Disable A&&ll Breakpoints"), 'workbench.debug.viewlet.action.disableAllBreakpoints'); const removeAllBreakpoints = this.createMenuItem(nls.localize({ key: 'miRemoveAllBreakpoints', comment: ['&& denotes a mnemonic'] }, "Remove &&All Breakpoints"), 'workbench.debug.viewlet.action.removeAllBreakpoints'); @@ -880,13 +893,13 @@ export class VSCodeMenu { private setHelpMenu(helpMenu: Electron.Menu): void { const toggleDevToolsItem = new MenuItem(this.likeAction('workbench.action.toggleDevTools', { - label: mnemonicLabel(nls.localize({ key: 'miToggleDevTools', comment: ['&& denotes a mnemonic'] }, "&&Toggle Developer Tools")), + label: this.mnemonicLabel(nls.localize({ key: 'miToggleDevTools', comment: ['&& denotes a mnemonic'] }, "&&Toggle Developer Tools")), click: () => this.toggleDevTools(), enabled: (this.windowsService.getWindowCount() > 0) })); const showAccessibilityOptions = new MenuItem(this.likeAction('accessibilityOptions', { - label: mnemonicLabel(nls.localize({ key: 'miAccessibilityOptions', comment: ['&& denotes a mnemonic'] }, "Accessibility &&Options")), + label: this.mnemonicLabel(nls.localize({ key: 'miAccessibilityOptions', comment: ['&& denotes a mnemonic'] }, "Accessibility &&Options")), accelerator: null, click: () => { this.windowsService.openAccessibilityOptions(); @@ -900,25 +913,25 @@ export class VSCodeMenu { if (this.windowsService.getWindowCount() > 0) { reportIssuesItem = this.createMenuItem(label, 'workbench.action.reportIssues'); } else { - reportIssuesItem = new MenuItem({ label: mnemonicLabel(label), click: () => this.openUrl(product.reportIssueUrl, 'openReportIssues') }); + reportIssuesItem = new MenuItem({ label: this.mnemonicLabel(label), click: () => this.openUrl(product.reportIssueUrl, 'openReportIssues') }); } } const keyboardShortcutsUrl = isLinux ? product.keyboardShortcutsUrlLinux : isMacintosh ? product.keyboardShortcutsUrlMac : product.keyboardShortcutsUrlWin; arrays.coalesce([ - new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miWelcome', comment: ['&& denotes a mnemonic'] }, "&&Welcome")), click: () => this.windowsService.sendToFocused('vscode:runAction', 'workbench.action.showWelcomePage') }), - product.documentationUrl ? new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miDocumentation', comment: ['&& denotes a mnemonic'] }, "&&Documentation")), click: () => this.windowsService.sendToFocused('vscode:runAction', 'workbench.action.openDocumentationUrl') }) : null, - product.releaseNotesUrl ? new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miReleaseNotes', comment: ['&& denotes a mnemonic'] }, "&&Release Notes")), click: () => this.windowsService.sendToFocused('vscode:runAction', 'update.showCurrentReleaseNotes') }) : null, + new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miWelcome', comment: ['&& denotes a mnemonic'] }, "&&Welcome")), click: () => this.windowsService.sendToFocused('vscode:runAction', 'workbench.action.showWelcomePage') }), + product.documentationUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miDocumentation', comment: ['&& denotes a mnemonic'] }, "&&Documentation")), click: () => this.windowsService.sendToFocused('vscode:runAction', 'workbench.action.openDocumentationUrl') }) : null, + product.releaseNotesUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miReleaseNotes', comment: ['&& denotes a mnemonic'] }, "&&Release Notes")), click: () => this.windowsService.sendToFocused('vscode:runAction', 'update.showCurrentReleaseNotes') }) : null, __separator__(), - keyboardShortcutsUrl ? new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miKeyboardShortcuts', comment: ['&& denotes a mnemonic'] }, "&&Keyboard Shortcuts Reference")), click: () => this.windowsService.sendToFocused('vscode:runAction', 'workbench.action.keybindingsReference') }) : null, - product.introductoryVideosUrl ? new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miIntroductoryVideos', comment: ['&& denotes a mnemonic'] }, "Introductory &&Videos")), click: () => this.windowsService.sendToFocused('vscode:runAction', 'workbench.action.openIntroductoryVideosUrl') }) : null, + keyboardShortcutsUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miKeyboardShortcuts', comment: ['&& denotes a mnemonic'] }, "&&Keyboard Shortcuts Reference")), click: () => this.windowsService.sendToFocused('vscode:runAction', 'workbench.action.keybindingsReference') }) : null, + product.introductoryVideosUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miIntroductoryVideos', comment: ['&& denotes a mnemonic'] }, "Introductory &&Videos")), click: () => this.windowsService.sendToFocused('vscode:runAction', 'workbench.action.openIntroductoryVideosUrl') }) : null, (product.introductoryVideosUrl || keyboardShortcutsUrl) ? __separator__() : null, - product.twitterUrl ? new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miTwitter', comment: ['&& denotes a mnemonic'] }, "&&Join us on Twitter")), click: () => this.openUrl(product.twitterUrl, 'openTwitterUrl') }) : null, - product.requestFeatureUrl ? new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miUserVoice', comment: ['&& denotes a mnemonic'] }, "&&Search Feature Requests")), click: () => this.openUrl(product.requestFeatureUrl, 'openUserVoiceUrl') }) : null, + product.twitterUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miTwitter', comment: ['&& denotes a mnemonic'] }, "&&Join us on Twitter")), click: () => this.openUrl(product.twitterUrl, 'openTwitterUrl') }) : null, + product.requestFeatureUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miUserVoice', comment: ['&& denotes a mnemonic'] }, "&&Search Feature Requests")), click: () => this.openUrl(product.requestFeatureUrl, 'openUserVoiceUrl') }) : null, reportIssuesItem, (product.twitterUrl || product.requestFeatureUrl || product.reportIssueUrl) ? __separator__() : null, product.licenseUrl ? new MenuItem({ - label: mnemonicLabel(nls.localize({ key: 'miLicense', comment: ['&& denotes a mnemonic'] }, "View &&License")), click: () => { + label: this.mnemonicLabel(nls.localize({ key: 'miLicense', comment: ['&& denotes a mnemonic'] }, "View &&License")), click: () => { if (language) { const queryArgChar = product.licenseUrl.indexOf('?') > 0 ? '&' : '?'; this.openUrl(`${product.licenseUrl}${queryArgChar}lang=${language}`, 'openLicenseUrl'); @@ -928,7 +941,7 @@ export class VSCodeMenu { } }) : null, product.privacyStatementUrl ? new MenuItem({ - label: mnemonicLabel(nls.localize({ key: 'miPrivacyStatement', comment: ['&& denotes a mnemonic'] }, "&&Privacy Statement")), click: () => { + label: this.mnemonicLabel(nls.localize({ key: 'miPrivacyStatement', comment: ['&& denotes a mnemonic'] }, "&&Privacy Statement")), click: () => { if (language) { const queryArgChar = product.licenseUrl.indexOf('?') > 0 ? '&' : '?'; this.openUrl(`${product.privacyStatementUrl}${queryArgChar}lang=${language}`, 'openPrivacyStatement'); @@ -950,7 +963,7 @@ export class VSCodeMenu { } helpMenu.append(__separator__()); - helpMenu.append(new MenuItem({ label: mnemonicLabel(nls.localize({ key: 'miAbout', comment: ['&& denotes a mnemonic'] }, "&&About")), click: () => this.openAboutDialog() })); + helpMenu.append(new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miAbout', comment: ['&& denotes a mnemonic'] }, "&&About")), click: () => this.openAboutDialog() })); } } @@ -1000,7 +1013,7 @@ export class VSCodeMenu { private createMenuItem(label: string, commandId: string | string[], enabled?: boolean, checked?: boolean): Electron.MenuItem; private createMenuItem(label: string, click: () => void, enabled?: boolean, checked?: boolean): Electron.MenuItem; private createMenuItem(arg1: string, arg2: any, arg3?: boolean, arg4?: boolean): Electron.MenuItem { - const label = mnemonicLabel(arg1); + const label = this.mnemonicLabel(arg1); const click: () => void = (typeof arg2 === 'function') ? arg2 : (menuItem, win, event) => { let commandId = arg2; if (Array.isArray(arg2)) { @@ -1033,7 +1046,7 @@ export class VSCodeMenu { private createDevToolsAwareMenuItem(label: string, commandId: string, devToolsFocusedFn: (contents: Electron.WebContents) => void): Electron.MenuItem { return new MenuItem(this.withKeybinding(commandId, { - label: mnemonicLabel(label), + label: this.mnemonicLabel(label), enabled: this.windowsService.getWindowCount() > 0, click: () => { const windowInFocus = this.windowsService.getFocusedWindow(); @@ -1128,24 +1141,24 @@ export class VSCodeMenu { private reportMenuActionTelemetry(id: string): void { this.telemetryService.publicLog('workbenchActionExecuted', { id, from: telemetryFrom }); } + + private mnemonicLabel(label: string): string { + if (isMacintosh || !this.currentEnableMenuBarMnemonics) { + return label.replace(/\(&&\w\)|&&/g, ''); // no mnemonic support on mac + } + + return label.replace(/&&/g, '&'); + } + + private unmnemonicLabel(label: string): string { + if (isMacintosh || !this.currentEnableMenuBarMnemonics) { + return label; // no mnemonic support on mac + } + + return label.replace(/&/g, '&&'); + } } function __separator__(): Electron.MenuItem { return new MenuItem({ type: 'separator' }); } - -function mnemonicLabel(label: string): string { - if (isMacintosh) { - return label.replace(/\(&&\w\)|&&/g, ''); // no mnemonic support on mac - } - - return label.replace(/&&/g, '&'); -} - -function unMnemonicLabel(label: string): string { - if (isMacintosh) { - return label; // no mnemonic support on mac - } - - return label.replace(/&/g, '&&'); -} diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 296f757f9c6..d24aafc9bfb 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -104,4 +104,5 @@ export interface IWindowSettings { menuBarVisibility: MenuBarVisibility; newWindowDimensions: 'default' | 'inherit' | 'maximized' | 'fullscreen'; nativeTabs: boolean; + enableMenuBarMnemonics: boolean; } diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index c62f3bbb4a3..f20818fcf5c 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -266,6 +266,11 @@ if (isWindows || isLinux) { 'default': 'default', 'description': nls.localize('menuBarVisibility', "Control the visibility of the menu bar. A setting of 'toggle' means that the menu bar is hidden and a single press of the Alt key will show it. By default, the menu bar will be visible, unless the window is full screen.") }; + properties['window.enableMenuBarMnemonics'] = { + 'type': 'boolean', + 'default': true, + 'description': nls.localize('enableMenuBarMnemonics', "If enabled, the main menus can be opened via Alt-key shortcuts. Disabling mnemonics allows to bind these Alt-key shortcuts to editor commands instead.") + }; } if (isWindows) { From 34ec2059a41273913cb6fa74331186b4420367e5 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 May 2017 07:57:10 +0200 Subject: [PATCH 0154/1164] Default dark theme too low contrast on inactive tabs in inactive editor (fixes #26132) --- src/vs/workbench/browser/parts/editor/tabsTitleControl.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index 91f679da711..f893b2505ca 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -313,11 +313,11 @@ export class TabsTitleControl extends TitleControl { tabLabel.element.style.color = this.getColor(TAB_INACTIVE_FOREGROUND, (color, theme) => { if (!isGroupActive) { if (theme.type === 'dark') { - return color.transparent(0.5).transparent(0.5); + return color.transparent(0.5); } if (theme.type === 'light') { - return color.transparent(0.7).transparent(0.5); + return color.transparent(0.5); } } From 7b7132c9a2c8e7b4762d16f223a75d37722665c2 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 May 2017 07:58:18 +0200 Subject: [PATCH 0155/1164] UI Sizing: Contrast Border Lines (fixes #26113) --- src/vs/platform/theme/common/colorRegistry.ts | 6 +++--- src/vs/platform/theme/common/styler.ts | 6 +++--- src/vs/workbench/parts/debug/browser/debugViewlet.ts | 4 ++-- .../parts/explorers/browser/treeExplorerViewlet.ts | 2 +- src/vs/workbench/parts/files/browser/explorerViewlet.ts | 6 ++++-- 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 12f490e7c76..b5e4ff639ae 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -142,11 +142,11 @@ export const inputForeground = registerColor('input.foreground', { dark: foregro export const inputBorder = registerColor('input.border', { dark: null, light: null, hc: contrastBorder }, nls.localize('inputBoxBorder', "Input box border.")); export const inputActiveOptionBorder = registerColor('inputOption.activeBorder', { dark: '#007ACC', light: '#007ACC', hc: activeContrastBorder }, nls.localize('inputBoxActiveOptionBorder', "Border color of activated options in input fields.")); export const inputValidationInfoBackground = registerColor('inputValidation.infoBackground', { dark: '#063B49', light: '#D6ECF2', hc: Color.black }, nls.localize('inputValidationInfoBackground', "Input validation background color for information severity.")); -export const inputValidationInfoBorder = registerColor('inputValidation.infoBorder', { dark: '#55AAFF', light: '#009CCC', hc: '#6FC3DF' }, nls.localize('inputValidationInfoBorder', "Input validation border color for information severity.")); +export const inputValidationInfoBorder = registerColor('inputValidation.infoBorder', { dark: '#55AAFF', light: '#55AAFF', hc: '#6FC3DF' }, nls.localize('inputValidationInfoBorder', "Input validation border color for information severity.")); export const inputValidationWarningBackground = registerColor('inputValidation.warningBackground', { dark: '#352A05', light: '#F6F5D2', hc: Color.black }, nls.localize('inputValidationWarningBackground', "Input validation background color for information warning.")); -export const inputValidationWarningBorder = registerColor('inputValidation.warningBorder', { dark: '#B89500', light: '#F2CB1D', hc: '#B89500' }, nls.localize('inputValidationWarningBorder', "Input validation border color for warning severity.")); +export const inputValidationWarningBorder = registerColor('inputValidation.warningBorder', { dark: '#B89500', light: '#B89500', hc: '#B89500' }, nls.localize('inputValidationWarningBorder', "Input validation border color for warning severity.")); export const inputValidationErrorBackground = registerColor('inputValidation.errorBackground', { dark: '#5A1D1D', light: '#F2DEDE', hc: Color.black }, nls.localize('inputValidationErrorBackground', "Input validation background color for error severity.")); -export const inputValidationErrorBorder = registerColor('inputValidation.errorBorder', { dark: '#BE1100', light: '#E51400', hc: '#BE1100' }, nls.localize('inputValidationErrorBorder', "Input validation border color for error severity.")); +export const inputValidationErrorBorder = registerColor('inputValidation.errorBorder', { dark: '#BE1100', light: '#BE1100', hc: '#BE1100' }, nls.localize('inputValidationErrorBorder', "Input validation border color for error severity.")); export const selectBackground = registerColor('dropdown.background', { dark: '#3C3C3C', light: Color.white, hc: Color.black }, nls.localize('dropdownBackground', "Dropdown background.")); export const selectForeground = registerColor('dropdown.foreground', { dark: '#F0F0F0', light: null, hc: Color.white }, nls.localize('dropdownForeground', "Dropdown foreground.")); diff --git a/src/vs/platform/theme/common/styler.ts b/src/vs/platform/theme/common/styler.ts index 796b99a6131..017fca395ed 100644 --- a/src/vs/platform/theme/common/styler.ts +++ b/src/vs/platform/theme/common/styler.ts @@ -190,10 +190,10 @@ export function attachListStyler(widget: IThemable, themeService: IThemeService, }); } -export function attachHeaderViewStyler(widget: IThemable, themeService: IThemeService, style?: { headerBackground?: ColorIdentifier, contrastBorder?: ColorIdentifier }): IDisposable { +export function attachHeaderViewStyler(widget: IThemable, themeService: IThemeService, options?: { noContrastBorder?: boolean }): IDisposable { return attachStyler(themeService, widget, { - headerBackground: (style && style.headerBackground) || SIDE_BAR_SECTION_HEADER_BACKGROUND, - headerHighContrastBorder: (style && style.contrastBorder) || contrastBorder + headerBackground: SIDE_BAR_SECTION_HEADER_BACKGROUND, + headerHighContrastBorder: (options && options.noContrastBorder) ? null : contrastBorder }); } diff --git a/src/vs/workbench/parts/debug/browser/debugViewlet.ts b/src/vs/workbench/parts/debug/browser/debugViewlet.ts index 5b3b171fc66..a36d3128022 100644 --- a/src/vs/workbench/parts/debug/browser/debugViewlet.ts +++ b/src/vs/workbench/parts/debug/browser/debugViewlet.ts @@ -75,9 +75,9 @@ export class DebugViewlet extends Viewlet { this.viewletSettings) ); - this.views.forEach(view => { + this.views.forEach((view, index) => { if (view instanceof HeaderView) { - attachHeaderViewStyler(view, this.themeService); + attachHeaderViewStyler(view, this.themeService, { noContrastBorder: index === 0 }); } }); diff --git a/src/vs/workbench/parts/explorers/browser/treeExplorerViewlet.ts b/src/vs/workbench/parts/explorers/browser/treeExplorerViewlet.ts index 856261d3172..51a384bf51c 100644 --- a/src/vs/workbench/parts/explorers/browser/treeExplorerViewlet.ts +++ b/src/vs/workbench/parts/explorers/browser/treeExplorerViewlet.ts @@ -71,7 +71,7 @@ export class TreeExplorerViewlet extends Viewlet { const headerSize = 0; // Hide header (root node) by default this.view = this.instantiationService.createInstance(TreeExplorerView, this.viewletState, this.treeNodeProviderId, this.getActionRunner(), headerSize); - attachHeaderViewStyler(this.view, this.themeService); + attachHeaderViewStyler(this.view, this.themeService, { noContrastBorder: true }); this.view.render(this.viewletContainer.getHTMLElement(), Orientation.VERTICAL); } diff --git a/src/vs/workbench/parts/files/browser/explorerViewlet.ts b/src/vs/workbench/parts/files/browser/explorerViewlet.ts index 5aa2a30f535..2bc49cf9a11 100644 --- a/src/vs/workbench/parts/files/browser/explorerViewlet.ts +++ b/src/vs/workbench/parts/files/browser/explorerViewlet.ts @@ -107,6 +107,7 @@ export class ExplorerViewlet extends Viewlet { this.viewletContainer.clearChildren(); this.splitView = new SplitView(this.viewletContainer.getHTMLElement()); + // Track focus this.focusListener = this.splitView.onFocus((view: IViewletView) => { this.lastFocusedView = view; @@ -129,8 +130,9 @@ export class ExplorerViewlet extends Viewlet { this.views.push(view.instantiate(this.getActionRunner(), this.viewletSettings, this.instantiationService)); } - for (const view of this.views) { - attachHeaderViewStyler(view, this.themeService); + for (let i = 0; i < this.views.length; i++) { + const view = this.views[i]; + attachHeaderViewStyler(view, this.themeService, { noContrastBorder: i === 0 }); this.splitView.addView(view); } From 674200fd49ad8c1557f884903fd09647975270f8 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 May 2017 07:58:51 +0200 Subject: [PATCH 0156/1164] Issue: Select element border radius and color (fixes #26045) --- src/vs/workbench/electron-browser/media/shell.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/workbench/electron-browser/media/shell.css b/src/vs/workbench/electron-browser/media/shell.css index 2b5ece9a68d..f734da27292 100644 --- a/src/vs/workbench/electron-browser/media/shell.css +++ b/src/vs/workbench/electron-browser/media/shell.css @@ -98,6 +98,10 @@ opacity: 1 !important; } +.monaco-shell .mac select:focus { + border: none; /* outline is a square, but border has a radius, so we avoid this glitch when focussed (https://github.com/Microsoft/vscode/issues/26045) */ +} + .monaco-shell.hc-black [tabindex="0"]:focus, .monaco-shell.hc-black .synthetic-focus, .monaco-shell.hc-black select:focus, From 971798b1fbf16c8d5766f834f8f96f16fbc5e4b5 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 7 May 2017 23:06:15 -0700 Subject: [PATCH 0157/1164] Add theme key for selection (#26093) * Add theme key for selection Fixes #25966 * :lipstick: --- src/vs/platform/theme/common/colorRegistry.ts | 2 ++ src/vs/workbench/electron-browser/shell.ts | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index b5e4ff639ae..21ead0e0272 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -134,6 +134,8 @@ export const focusBorder = registerColor('focusBorder', { dark: Color.fromHex('# export const contrastBorder = registerColor('contrastBorder', { light: null, dark: null, hc: '#6FC3DF' }, nls.localize('contrastBorder', "An extra border around elements to separate them from others for greater contrast.")); export const activeContrastBorder = registerColor('contrastActiveBorder', { light: null, dark: null, hc: focusBorder }, nls.localize('activeContrastBorder', "An extra border around active elements to separate them from others for greater contrast.")); +export const selectionBackground = registerColor('selection.background', { light: null, dark: null, hc: null }, nls.localize('selectionBackground', "The background color of text selections in the workbench (e.g. for input fields or text areas). Note that this does not apply to selections within the editor and the terminal.")); + // ----- widgets export const widgetShadow = registerColor('widget.shadow', { dark: '#000000', light: '#A8A8A8', hc: null }, nls.localize('widgetShadow', 'Shadow color of widgets such as find/replace inside the editor.')); diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 33d9257064c..9e003eda0d7 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -103,7 +103,7 @@ import 'vs/platform/opener/browser/opener.contribution'; import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { WorkbenchThemeService } from 'vs/workbench/services/themes/electron-browser/workbenchThemeService'; import { registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; -import { foreground, focusBorder, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, listHighlightForeground } from 'vs/platform/theme/common/colorRegistry'; +import { foreground, selectionBackground, focusBorder, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, listHighlightForeground } from 'vs/platform/theme/common/colorRegistry'; /** * Services that we require for the Shell @@ -529,6 +529,12 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { collector.addRule(`.monaco-shell { color: ${windowForeground}; }`); } + // Selection + const windowSelectionBackground = theme.getColor(selectionBackground); + if (windowSelectionBackground) { + collector.addRule(`.monaco-shell ::selection { background-color: ${windowSelectionBackground}; }`); + } + // List highlight const listHighlightForegroundColor = theme.getColor(listHighlightForeground); if (listHighlightForegroundColor) { From 4e180de1073f472f8617b0627182413aae2e7368 Mon Sep 17 00:00:00 2001 From: Ramya Rao Date: Sun, 7 May 2017 23:24:47 -0700 Subject: [PATCH 0158/1164] Expand docs on the side in the suggest widget (#25812) * Expand docs to the side in suggest widget * Attempt to figure out when to swap list and docs * Fixes #25881 * Fixes #25882 Adjust suggest widget width & position * refactoring * Show docs below instead of hiding when not enough space --- .../contrib/suggest/browser/media/suggest.css | 124 ++-------- .../suggest/browser/suggestController.ts | 4 +- .../contrib/suggest/browser/suggestWidget.ts | 226 ++++++++++-------- 3 files changed, 145 insertions(+), 209 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index 3714be6e58f..4b8e1fca7e6 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -6,7 +6,7 @@ /* Suggest */ .monaco-editor .suggest-widget { z-index: 40; - width: 438px; + width: 660px; } .monaco-editor .suggest-widget.visible { @@ -23,7 +23,17 @@ .monaco-editor .suggest-widget > .tree { height: 100%; - width: 100%; + width: 220px; + float: left; + box-sizing: border-box; +} + +.monaco-editor .suggest-widget.list-right > .tree { + float: right +} + +.monaco-editor .suggest-widget.docs-below > .tree { + float: none; } .monaco-editor .suggest-widget .monaco-list .monaco-list-row { @@ -49,71 +59,10 @@ text-overflow: ellipsis; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .docs { - display: none; - overflow: hidden; -} - -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .docs > .docs-text { - flex: 2; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - opacity: 0.85; -} - -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .docs > .docs-text.no-docs { - opacity: 0.5; - font-style: italic; -} - -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .docs > .docs-details { - opacity: 0.6; - background-image: url('./info.svg'); - background-position: center center; - background-repeat: no-repeat; - background-size: 70%; -} - -.monaco-editor .suggest-widget .details > .header > .go-back, -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .docs > .docs-details { - color: #0035DD; -} - -.monaco-editor .suggest-widget .monaco-list .monaco-list-row .docs > .docs-details:hover { - opacity: 1; -} - .monaco-editor .suggest-widget:not(.frozen) .monaco-highlighted-label .highlight { font-weight: bold; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .type-label { - display: none; - margin-left: 0.8em; - flex: 1; - text-align: right; - overflow: hidden; - text-overflow: ellipsis; - opacity: 0.7; -} - -.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .type-label > .monaco-tokenized-source { - display: inline; -} - -.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused > .contents > .main > .type-label { - display: inline; -} - -.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused .type-label { - display: inline; -} - -.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused .docs { - display: flex; -} - .monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon { display: block; height: 16px; @@ -160,37 +109,16 @@ } .monaco-editor .suggest-widget .details { - height: 100%; - box-sizing: border-box; + max-height: 216px; display: flex; flex-direction: column; cursor: default; -} - -.monaco-editor .suggest-widget .details > .header { - padding: 4px 5px; - display: flex; box-sizing: border-box; - border-bottom: 1px solid rgba(204, 204, 204, 0.5); + width: 440px; } -.monaco-editor .suggest-widget .details > .header > .title { - flex: 2; - overflow: hidden; - text-overflow: ellipsis; -} - -.monaco-editor .suggest-widget .details > .header > .go-back { - cursor: pointer; - opacity: 0.6; - background-image: url('./back.svg'); - background-size: 70%; - background-position: center center; - background-repeat: no-repeat; -} - -.monaco-editor .suggest-widget .details > .header > .go-back:hover { - opacity: 1; +.monaco-editor .suggest-widget .details.no-docs { + display: none; } .monaco-editor .suggest-widget .details > .monaco-scrollable-element { @@ -218,30 +146,12 @@ display: none; } -/* Dark theme */ - -.monaco-editor.vs-dark .suggest-widget .details > .header { - border-color: rgba(85,85,85,0.5); -} - -.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .docs > .docs-details, -.monaco-editor.vs-dark .suggest-widget .details > .header > .go-back { - color: #4E94CE; -} - - /* High Contrast Theming */ -.monaco-editor.hc-black .suggest-widget .details > .monaco-scrollable-element > .body > .docs, -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .docs { +.monaco-editor.hc-black .suggest-widget .details > .monaco-scrollable-element > .body > .docs { color: #C07A7A; } -.monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .docs > .docs-details, -.monaco-editor.hc-black .suggest-widget .details > .header > .go-back { - color: #4E94CE; -} - .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon, .monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon { background-image: url('Misc_inverse_16x.svg'); } diff --git a/src/vs/editor/contrib/suggest/browser/suggestController.ts b/src/vs/editor/contrib/suggest/browser/suggestController.ts index 09720eae57b..e19aad6d8ea 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestController.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestController.ts @@ -222,7 +222,7 @@ export class SuggestController implements IEditorContribution { cancelSuggestWidget(): void { if (this._widget) { this._model.cancel(); - this._widget.hideDetailsOrHideWidget(); + this._widget.hideWidget(); } } @@ -264,7 +264,7 @@ export class SuggestController implements IEditorContribution { toggleSuggestionDetails(): void { if (this._widget) { - this._widget.toggleDetails(); + this._widget.toggleDetailsFocus(); } } } diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 27a980495d8..09ac145137c 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -30,6 +30,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { attachListStyler } from 'vs/platform/theme/common/styler'; import { IThemeService, ITheme, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { registerColor, editorWidgetBackground, contrastBorder, listFocusBackground, activeContrastBorder, listHighlightForeground, editorForeground } from 'vs/platform/theme/common/colorRegistry'; +import { Position } from 'vs/editor/common/core/position'; const sticky = false; // for development purposes @@ -38,9 +39,6 @@ interface ISuggestionTemplateData { icon: HTMLElement; colorspan: HTMLElement; highlightedLabel: HighlightedLabel; - typeLabel: HTMLElement; - documentationDetails: HTMLElement; - documentation: HTMLElement; disposables: IDisposable[]; } @@ -64,7 +62,7 @@ function canExpandCompletionItem(item: ICompletionItem) { if (suggestion.documentation) { return true; } - return (suggestion.detail || '').indexOf('\n') >= 0; + return (suggestion.detail && suggestion.detail !== suggestion.label); } class Renderer implements IRenderer { @@ -96,13 +94,6 @@ class Renderer implements IRenderer { const main = append(text, $('.main')); data.highlightedLabel = new HighlightedLabel(main); data.disposables.push(data.highlightedLabel); - data.typeLabel = append(main, $('span.type-label')); - - const docs = append(text, $('.docs')); - data.documentation = append(docs, $('span.docs-text')); - data.documentationDetails = append(docs, $('span.docs-details')); - data.documentationDetails.title = nls.localize('readMore', "Read More...{0}", this.triggerKeybindingLabel); - const configureFont = () => { const configuration = this.editor.getConfiguration(); const fontFamily = configuration.fontInfo.fontFamily; @@ -116,8 +107,6 @@ class Renderer implements IRenderer { main.style.lineHeight = lineHeightPx; data.icon.style.height = lineHeightPx; data.icon.style.width = lineHeightPx; - data.documentationDetails.style.height = lineHeightPx; - data.documentationDetails.style.width = lineHeightPx; }; configureFont(); @@ -151,26 +140,8 @@ class Renderer implements IRenderer { } data.highlightedLabel.set(suggestion.label, createMatches(element.matches)); - data.typeLabel.textContent = (suggestion.detail || '').replace(/\n.*$/m, ''); - data.documentation.textContent = suggestion.documentation || ''; - if (canExpandCompletionItem(element)) { - show(data.documentationDetails); - data.documentationDetails.onmousedown = e => { - e.stopPropagation(); - e.preventDefault(); - }; - data.documentationDetails.onclick = e => { - e.stopPropagation(); - e.preventDefault(); - this.widget.toggleDetails(); - }; - } else { - hide(data.documentationDetails); - data.documentationDetails.onmousedown = null; - data.documentationDetails.onclick = null; - } } disposeTemplate(templateData: ISuggestionTemplateData): void { @@ -191,9 +162,6 @@ const enum State { class SuggestionDetails { private el: HTMLElement; - private title: HTMLElement; - private titleLabel: HighlightedLabel; - private back: HTMLElement; private scrollbar: DomScrollableElement; private body: HTMLElement; private type: HTMLElement; @@ -211,13 +179,6 @@ class SuggestionDetails { this.el = append(container, $('.details')); this.disposables.push(toDisposable(() => container.removeChild(this.el))); - const header = append(this.el, $('.header')); - this.title = append(header, $('span.title')); - this.titleLabel = new HighlightedLabel(this.title); - this.disposables.push(this.titleLabel); - - this.back = append(header, $('span.go-back')); - this.back.title = nls.localize('goback', "Go back"); this.body = $('.body'); this.scrollbar = new DomScrollableElement(this.body, { canUseTranslate3d: false }); @@ -240,26 +201,18 @@ class SuggestionDetails { } render(item: ICompletionItem): void { - if (!item) { - this.titleLabel.set(''); + if (!item || !canExpandCompletionItem(item)) { this.type.textContent = ''; this.docs.textContent = ''; + addClass(this.el, 'no-docs'); this.ariaLabel = null; return; } - - this.titleLabel.set(item.suggestion.label, createMatches(item.matches)); + removeClass(this.el, 'no-docs'); this.type.innerText = item.suggestion.detail || ''; this.docs.textContent = item.suggestion.documentation; - this.back.onmousedown = e => { - e.preventDefault(); - e.stopPropagation(); - }; - this.back.onclick = e => { - e.preventDefault(); - e.stopPropagation(); - this.widget.toggleDetails(); - }; + + this.el.style.height = this.type.clientHeight + this.docs.clientHeight + 'px'; this.body.scrollTop = 0; this.scrollbar.scanDomNode(); @@ -299,15 +252,10 @@ class SuggestionDetails { const configuration = this.editor.getConfiguration(); const fontFamily = configuration.fontInfo.fontFamily; const fontSize = configuration.contribInfo.suggestFontSize || configuration.fontInfo.fontSize; - const lineHeight = configuration.contribInfo.suggestLineHeight || configuration.fontInfo.lineHeight; const fontSizePx = `${fontSize}px`; - const lineHeightPx = `${lineHeight}px`; this.el.style.fontSize = fontSizePx; - this.title.style.fontFamily = fontFamily; this.type.style.fontFamily = fontFamily; - this.back.style.height = lineHeightPx; - this.back.style.width = lineHeightPx; } dispose(): void { @@ -359,6 +307,14 @@ export class SuggestWidget implements IContentWidget, IDelegate readonly onDidHide: Event = this.onDidHideEmitter.event; readonly onDidShow: Event = this.onDidShowEmitter.event; + private preferredPosition: Position; + private readonly minWidgetWidth = 440; + private readonly maxWidgetWidth = 660; + private readonly listWidth = 220; + private readonly minDocsWidth = 220; + private readonly maxDocsWidth = 440; + private readonly widgetWidthInSmallestEditor = 300; + constructor( private editor: ICodeEditor, @ITelemetryService private telemetryService: ITelemetryService, @@ -477,12 +433,14 @@ export class SuggestWidget implements IContentWidget, IDelegate private onThemeChange(theme: ITheme) { let backgroundColor = theme.getColor(editorSuggestWidgetBackground); if (backgroundColor) { - this.element.style.backgroundColor = backgroundColor.toString(); + this.listElement.style.backgroundColor = backgroundColor.toString(); + this.details.element.style.backgroundColor = backgroundColor.toString(); } let borderColor = theme.getColor(editorSuggestWidgetBorder); if (borderColor) { let borderWidth = theme.type === 'hc' ? 2 : 1; - this.element.style.border = `${borderWidth}px solid ${borderColor}`; + this.listElement.style.border = `${borderWidth}px solid ${borderColor}`; + this.details.element.style.border = `${borderWidth}px solid ${borderColor}`; } } @@ -550,7 +508,7 @@ export class SuggestWidget implements IContentWidget, IDelegate this.list.setFocus([index]); this.updateWidgetHeight(); this.list.reveal(index); - + this.showDetails(); this._ariaAlert(this._getSuggestionAriaAlertLabel(item)); }) .then(null, err => !isPromiseCanceledError(err) && onUnexpectedError(err)) @@ -592,8 +550,8 @@ export class SuggestWidget implements IContentWidget, IDelegate this.show(); break; case State.Open: - hide(this.messageElement, this.details.element); - show(this.listElement); + hide(this.messageElement); + show(this.listElement, this.details.element); this.show(); break; case State.Frozen: @@ -602,8 +560,8 @@ export class SuggestWidget implements IContentWidget, IDelegate this.show(); break; case State.Details: - hide(this.messageElement, this.listElement); - show(this.details.element); + hide(this.messageElement); + show(this.details.element, this.listElement); this.show(); this._ariaAlert(this.details.getAriaLabel()); break; @@ -777,26 +735,21 @@ export class SuggestWidget implements IContentWidget, IDelegate return undefined; } - toggleDetails(): void { + toggleDetailsFocus(): void { if (this.state === State.Details) { this.setState(State.Open); - this.editor.focus(); + } else if (this.state === State.Open) { + this.setState(State.Details); + } + } + + showDetails(): void { + if (this.state !== State.Open && this.state !== State.Details) { return; } - if (this.state !== State.Open) { - return; - } - - const item = this.list.getFocusedElements()[0]; - - if (!item || !canExpandCompletionItem(item)) { - return; - } - - this.setState(State.Details); + this.show(); this.editor.focus(); - this.telemetryService.publicLog('suggestWidget:toggleDetails', this.editor.getTelemetryData()); } private show(): void { @@ -821,21 +774,13 @@ export class SuggestWidget implements IContentWidget, IDelegate this.onDidHideEmitter.fire(this); } - hideDetailsOrHideWidget(): void { - if (this.state === State.Details) { - this.toggleDetails(); - } else { - this.hideWidget(); - } - } - getPosition(): IContentWidgetPosition { if (this.state === State.Hidden) { return null; } return { - position: this.editor.getPosition(), + position: this.preferredPosition ? this.preferredPosition : this.editor.getPosition(), preference: [ContentWidgetPositionPreference.BELOW, ContentWidgetPositionPreference.ABOVE] }; } @@ -850,33 +795,118 @@ export class SuggestWidget implements IContentWidget, IDelegate private updateWidgetHeight(): number { let height = 0; + let maxSuggestionsToShow = this.editor.getLayoutInfo().contentWidth > this.minWidgetWidth ? 11 : 5; if (this.state === State.Empty || this.state === State.Loading) { height = this.unfocusedHeight; - } else if (this.state === State.Details) { - height = 12 * this.unfocusedHeight; } else { const focus = this.list.getFocusedElements()[0]; const focusHeight = focus ? this.getHeight(focus) : this.unfocusedHeight; height = focusHeight; const suggestionCount = (this.list.contentHeight - focusHeight) / this.unfocusedHeight; - height += Math.min(suggestionCount, 11) * this.unfocusedHeight; + height += Math.min(suggestionCount, maxSuggestionsToShow) * this.unfocusedHeight; } this.element.style.lineHeight = `${this.unfocusedHeight}px`; - this.element.style.height = `${height}px`; + this.listElement.style.height = `${height}px`; this.list.layout(height); + + this.adjustWidgetWidth(); this.editor.layoutContentWidget(this); return height; } + private adjustWidgetWidth() { + const perColumnWidth = this.editor.getLayoutInfo().contentWidth / this.editor.getLayoutInfo().viewportColumn; + const spaceOntheLeft = Math.floor(this.editor.getPosition().column * perColumnWidth) - this.editor.getScrollLeft(); + const spaceOntheRight = this.editor.getLayoutInfo().contentWidth - spaceOntheLeft; + const scrolledColumns = Math.floor(this.editor.getScrollLeft() / perColumnWidth); + + // Reset + this.preferredPosition = this.editor.getPosition(); + this.details.element.style.width = `${this.maxDocsWidth}px`; + this.element.style.width = `${this.maxWidgetWidth}px`; + this.listElement.style.width = `${this.listWidth}px`; + removeClass(this.element, 'list-right'); + removeClass(this.element, 'docs-below'); + + if (spaceOntheRight > this.maxWidgetWidth) { + // There is enough space on the right, so nothing to do here. + return; + } + + + if (spaceOntheRight > this.minWidgetWidth) { + // There is enough space on the right for list and resized docs + this.adjustDocs(false, spaceOntheRight - this.listWidth, this.editor.getPosition().column); + return; + } + + if (spaceOntheRight > this.listWidth && spaceOntheLeft > this.maxDocsWidth) { + // Docs on the left and list on the right of the cursor + let columnsOccupiedByDocs = Math.floor(this.maxDocsWidth / perColumnWidth); + this.adjustDocs(true, null, this.editor.getPosition().column - columnsOccupiedByDocs); + return; + } + + if (spaceOntheRight > this.listWidth && spaceOntheLeft > this.minDocsWidth) { + // Resized docs on the left and list on the right of the cursor + let columnsOccupiedByDocs = Math.floor(spaceOntheLeft / perColumnWidth); + this.adjustDocs(true, spaceOntheLeft, this.editor.getPosition().column - columnsOccupiedByDocs); + return; + } + + if (this.editor.getLayoutInfo().contentWidth > this.maxWidgetWidth) { + // Use as much space on the right, and for the rest go left + let columnsOccupiedByWidget = Math.floor(this.maxWidgetWidth / perColumnWidth); + let preferredColumn = this.editor.getLayoutInfo().viewportColumn - columnsOccupiedByWidget + scrolledColumns; + this.adjustDocs(true, null, preferredColumn); + return; + } + + if (this.editor.getLayoutInfo().contentWidth > this.minWidgetWidth) { + // Resize docs. Swap only of there is enough space on the right for the list + let newDocsWidth = this.editor.getLayoutInfo().contentWidth - this.listWidth; + this.adjustDocs(spaceOntheRight < this.listWidth, newDocsWidth, scrolledColumns); + return; + } + + // Not enough space to show side by side + // So show docs below the list + addClass(this.element, 'docs-below'); + this.listElement.style.width = `${this.widgetWidthInSmallestEditor}px`; + this.element.style.width = `${this.widgetWidthInSmallestEditor}px`; + this.details.element.style.width = `${this.widgetWidthInSmallestEditor}px`; + } + + /** + * Adjust the width of the docs widget, swaps docs/list and moves suggest widget if needed + * + * @swap boolean If true, then the docs and list are swapped + * @resizedDocWidth number If not null, this number will be used to set the width of the docs + * @preferredColumn Preferred column in the current line for the suggest widget + */ + private adjustDocs(swap: boolean, resizedDocWidth: number, preferredColumn: number) { + + if (swap) { + addClass(this.element, 'list-right'); + } + + if (resizedDocWidth !== null) { + this.details.element.style.width = `${resizedDocWidth}px`; + this.element.style.width = `${resizedDocWidth + this.listWidth}px`; + } + + this.preferredPosition = new Position(this.editor.getPosition().lineNumber, preferredColumn); + } + private renderDetails(): void { - if (this.state !== State.Details) { - this.details.render(null); - } else { + if (this.state === State.Details || this.state === State.Open) { this.details.render(this.list.getFocusedElements()[0]); + } else { + this.details.render(null); } } @@ -894,10 +924,6 @@ export class SuggestWidget implements IContentWidget, IDelegate // IDelegate getHeight(element: ICompletionItem): number { - if (canExpandCompletionItem(element) && element === this.focusedItem) { - return this.focusHeight; - } - return this.unfocusedHeight; } From fb722316dd2379b5040d9323a01f0080c4d937a2 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 8 May 2017 10:38:39 +0200 Subject: [PATCH 0159/1164] Fix #26186 --- src/vs/workbench/parts/files/browser/explorerViewlet.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/files/browser/explorerViewlet.ts b/src/vs/workbench/parts/files/browser/explorerViewlet.ts index 2bc49cf9a11..80e70692d78 100644 --- a/src/vs/workbench/parts/files/browser/explorerViewlet.ts +++ b/src/vs/workbench/parts/files/browser/explorerViewlet.ts @@ -122,8 +122,8 @@ export class ExplorerViewlet extends Viewlet { } // Explorer view - this.createExplorerView(this.views.length || customViews.length ? undefined : 0); - this.views.push(this.explorerView); + const view = this.createExplorerOrEmptyView(this.views.length || customViews.length ? undefined : 0); + this.views.push(view); // custom views for (const view of customViews) { @@ -157,7 +157,7 @@ export class ExplorerViewlet extends Viewlet { } } - private createExplorerView(headerSize: number): void { + private createExplorerOrEmptyView(headerSize: number): IViewletView { let explorerOrEmptyView: ExplorerView | EmptyView; // With a Workspace @@ -201,6 +201,8 @@ export class ExplorerViewlet extends Viewlet { else { this.emptyView = explorerOrEmptyView = this.instantiationService.createInstance(EmptyView, this.getActionRunner()); } + + return explorerOrEmptyView; } public getExplorerView(): ExplorerView { From 6839bdf79672dc9a634a86afcfb5df7ca525be4c Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 5 May 2017 16:03:46 +0200 Subject: [PATCH 0160/1164] more getLeadingWhitespace-tricks --- src/vs/base/common/strings.ts | 8 ++++---- src/vs/base/test/common/strings.test.ts | 6 ++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/vs/base/common/strings.ts b/src/vs/base/common/strings.ts index 034b349767e..dd078b1f449 100644 --- a/src/vs/base/common/strings.ts +++ b/src/vs/base/common/strings.ts @@ -293,14 +293,14 @@ export function firstNonWhitespaceIndex(str: string): number { * Returns the leading whitespace of the string. * If the string contains only whitespaces, returns entire string */ -export function getLeadingWhitespace(str: string, from: number = 0): string { - for (let i = from, len = str.length; i < len; i++) { +export function getLeadingWhitespace(str: string, start: number = 0, end: number = str.length): string { + for (let i = start; i < end; i++) { let chCode = str.charCodeAt(i); if (chCode !== CharCode.Space && chCode !== CharCode.Tab) { - return str.substring(from, i); + return str.substring(start, i); } } - return str.substr(from); + return str.substring(start, end); } /** diff --git a/src/vs/base/test/common/strings.test.ts b/src/vs/base/test/common/strings.test.ts index 1364b35f8d5..07d750b0ecd 100644 --- a/src/vs/base/test/common/strings.test.ts +++ b/src/vs/base/test/common/strings.test.ts @@ -328,7 +328,13 @@ suite('Strings', () => { test('getLeadingWhitespace', () => { assert.equal(strings.getLeadingWhitespace(' foo'), ' '); assert.equal(strings.getLeadingWhitespace(' foo', 2), ''); + assert.equal(strings.getLeadingWhitespace(' foo', 1, 1), ''); + assert.equal(strings.getLeadingWhitespace(' foo', 0, 1), ' '); assert.equal(strings.getLeadingWhitespace(' '), ' '); assert.equal(strings.getLeadingWhitespace(' ', 1), ' '); + assert.equal(strings.getLeadingWhitespace(' ', 0, 1), ' '); + assert.equal(strings.getLeadingWhitespace('\t\tfunction foo(){', 0, 1), '\t'); + assert.equal(strings.getLeadingWhitespace('\t\tfunction foo(){', 0, 2), '\t\t'); + }); }); From 7113718ce3de5648d9d20e5f3f19bd50496b2b70 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 8 May 2017 12:39:56 +0200 Subject: [PATCH 0161/1164] make text edit, set selections --- .../contrib/snippet/browser/editorSnippets.ts | 119 +++++++++++++++--- .../contrib/snippet/common/snippetParser.ts | 8 ++ .../test/browser/editorSnippets.test.ts | 19 ++- 3 files changed, 124 insertions(+), 22 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index d1501376c33..1f6729cc562 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -5,34 +5,115 @@ 'use strict'; -import { getLeadingWhitespace } from 'vs/base/common/strings'; -import { ICommonCodeEditor, IModel } from 'vs/editor/common/editorCommon'; -import { TextmateSnippet } from '../common/snippetParser'; +import { getLeadingWhitespace, compare } from 'vs/base/common/strings'; +import { ICommonCodeEditor, TrackedRangeStickiness } from 'vs/editor/common/editorCommon'; +import { EditOperation } from 'vs/editor/common/core/editOperation'; +import { TextmateSnippet, Placeholder } from '../common/snippetParser'; +import { Selection } from 'vs/editor/common/core/selection'; +import { Range } from 'vs/editor/common/core/range'; +class OneSnippet { + + private readonly _editor: ICommonCodeEditor; + private readonly _placeholderDecoration = new Map(); + private readonly _placeholderGroups: Placeholder[][]; + + private _placeholderGroupsIdx: number; + + constructor(editor: ICommonCodeEditor, selection: Selection, snippet: TextmateSnippet) { + + this._editor = editor; + + // for each selection get the leading 'reference'-whitespace and adjust the snippet accordingly. + const model = editor.getModel(); + const line = model.getLineContent(selection.startLineNumber); + const leadingWhitespace = getLeadingWhitespace(line, 0, selection.startColumn - 1); + snippet = snippet.withIndentation(whitespace => model.normalizeIndentation(leadingWhitespace + whitespace)); + + const offset = model.getOffsetAt(selection.getStartPosition()); + + this._editor.executeEdits('onesnieppt', [EditOperation.replaceMove(selection, snippet.value)]); + + // create a decoration (tracked range) for each placeholder + this._editor.changeDecorations(accessor => { + + let lastRange: Range; + + for (const placeholder of snippet.getPlaceholders()) { + const placeholderOffset = snippet.offset(placeholder); + const placeholderLen = snippet.len(placeholder); + const start = model.getPositionAt(offset + placeholderOffset); + const end = model.getPositionAt(offset + placeholderOffset + placeholderLen); + const range = new Range(start.lineNumber, start.column, end.lineNumber, end.column); + + let stickiness: TrackedRangeStickiness; + if (lastRange && lastRange.getEndPosition().equals(range.getStartPosition())) { + stickiness = TrackedRangeStickiness.GrowsOnlyWhenTypingAfter; + } else { + stickiness = TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges; + } + + const handle = accessor.addDecoration(range, { stickiness }); + this._placeholderDecoration.set(placeholder, handle); + + lastRange = range; + } + }); + + this._placeholderGroupsIdx = -1; + this._placeholderGroups = []; + let lastBucket: Placeholder[]; + snippet.getPlaceholders().sort((a, b) => compare(a.name, b.name)).reverse().forEach(a => { + if (!lastBucket || lastBucket[0].name !== a.name) { + lastBucket = [a]; + this._placeholderGroups.push(lastBucket); + } else { + lastBucket.push(a); + } + }); + } + + dispose(): void { + this._editor.changeDecorations(accessor => this._placeholderDecoration.forEach(handle => accessor.removeDecoration(handle))); + } + + next(): Selection[] { + this._placeholderGroupsIdx += 1; + if (this._placeholderGroupsIdx >= this._placeholderGroups.length) { + return undefined; + } + const ranges: Selection[] = []; + for (const placeholder of this._placeholderGroups[this._placeholderGroupsIdx]) { + const handle = this._placeholderDecoration.get(placeholder); + const range = this._editor.getModel().getDecorationRange(handle); + ranges.push(new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn)); + } + return ranges; + } +} export class SnippetSession { private readonly _editor: ICommonCodeEditor; - private readonly _model: IModel; - private readonly _snippets: TextmateSnippet[] = []; + private readonly _snippets: OneSnippet[] = []; constructor(editor: ICommonCodeEditor, snippet: TextmateSnippet) { this._editor = editor; - this._model = editor.getModel(); - + this._editor.pushUndoStop(); for (const selection of editor.getSelections()) { - // for each selection get the leading 'reference' whitespace and - // adjust the snippet accordingly. this makes one snippet per selection/cursor - const line = this._model.getLineContent(selection.startLineNumber); - const leadingWhitespace = getLeadingWhitespace(line, 0, selection.startColumn - 1); - const newSnippet = snippet.withIndentation(whitespace => this._model.normalizeIndentation(leadingWhitespace + whitespace)); - this._snippets.push(newSnippet); - - // const offset = this._model.getOffsetAt(selection.getStartPosition()); - // for (const placeholder of snippet.getPlaceholders()) { - // const pos = this._model.getPositionAt(offset + snippet.offset(placeholder)); - // this._model.deltaDecorations - // } + const oneSnippet = new OneSnippet(editor, selection, snippet); + this._snippets.push(oneSnippet); } + this._editor.pushUndoStop(); + this.next(); + } + + next(): void { + const selections: Selection[] = []; + for (const snippet of this._snippets) { + const sel = snippet.next(); + selections.push(...sel); + } + this._editor.setSelections(selections); } } diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/common/snippetParser.ts index 2fbe4c9e5f1..2b5c66816ce 100644 --- a/src/vs/editor/contrib/snippet/common/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/common/snippetParser.ts @@ -231,6 +231,14 @@ export class TextmateSnippet { return pos; } + len(marker: Marker): number { + let ret = 0; + walk([marker], marker => { + ret += marker.len(); + return true; + }); + return ret; + } getPlaceholders(): Placeholder[] { const ret: Placeholder[] = []; diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts index 3a02a611d50..e1c48b7ae75 100644 --- a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts @@ -28,14 +28,27 @@ suite('Editor Contrib - Snippets', () => { editor.dispose(); }); - test('snippets', () => { + test('snippets, selections', () => { editor.setSelections([ new Selection(1, 1, 1, 1), new Selection(2, 2, 2, 2), ]); - new SnippetSession(editor, SnippetParser.parse('foo\n${1:bar}\nfoo')); - assert.ok(true); + const snippet = SnippetParser.parse('foo${1:bar}foo$0'); + const session = new SnippetSession(editor, snippet); + + assert.equal(editor.getModel().getLineContent(1), 'foobarfoofunction foo() {'); + assert.equal(editor.getModel().getLineContent(2), '\tfoobarfooconsole.log(a)'); + + assert.equal(editor.getSelections().length, 2); + assert.ok(editor.getSelections()[0].equalsSelection(new Selection(1, 4, 1, 7))); + assert.ok(editor.getSelections()[1].equalsSelection(new Selection(2, 5, 2, 8))); + + session.next(); + assert.equal(editor.getSelections().length, 2); + assert.ok(editor.getSelections()[0].equalsSelection(new Selection(1, 10, 1, 10))); + assert.ok(editor.getSelections()[1].equalsSelection(new Selection(2, 11, 2, 11))); + }); }); From 4a1c576f48bc8dd471059b368c4d77437926e158 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 8 May 2017 12:52:13 +0200 Subject: [PATCH 0162/1164] Script element with type="text/html" not recognised as html. Fixes #25920 --- extensions/html/syntaxes/html.json | 40 +- .../html/test/colorize-fixtures/25920.html | 13 + .../test/colorize-results/25920_html.json | 1014 +++++++++++++++++ 3 files changed, 1066 insertions(+), 1 deletion(-) create mode 100644 extensions/html/test/colorize-fixtures/25920.html create mode 100644 extensions/html/test/colorize-results/25920_html.json diff --git a/extensions/html/syntaxes/html.json b/extensions/html/syntaxes/html.json index 66eacb26486..be1113e583a 100644 --- a/extensions/html/syntaxes/html.json +++ b/extensions/html/syntaxes/html.json @@ -339,7 +339,7 @@ }, { "begin": "\\G", - "end": "(?i:(?=/?>|type\\s*=\\s*('|\"|)(?!text/(javascript|ecmascript)|application/((x-)?javascript|ecmascript))\\b))", + "end": "(?i:(?=/?>|type\\s*=\\s*('|\"|)(?!text/(javascript|ecmascript)|application/((x-)?javascript|ecmascript)|module)\\b))", "name": "meta.tag.metadata.script.html", "patterns": [ { @@ -347,6 +347,44 @@ } ] }, + { + "begin": "(?=(?i:type\\s*=\\s*('|\"|)(?=text/(x-handlebars|(x-(handlebars-)?|ng-)?template|html))\\b))", + "end": "(<)(?=/(?i:script))", + "endCaptures": { + "0": { + "name": "meta.tag.metadata.script.html" + }, + "1": { + "name": "punctuation.definition.tag.begin.html" + } + }, + "patterns": [ + { + "begin": "\\G", + "end": "(>)|(?=/>)", + "endCaptures": { + "1": { + "name": "punctuation.definition.tag.end.html" + } + }, + "name": "meta.tag.metadata.script.html", + "patterns": [ + { + "include": "#tag-stuff" + } + ] + }, + { + "begin": "(?!\\G)", + "end": "(?= + + + + + + \ No newline at end of file diff --git a/extensions/html/test/colorize-results/25920_html.json b/extensions/html/test/colorize-results/25920_html.json new file mode 100644 index 00000000000..94298771d7e --- /dev/null +++ b/extensions/html/test/colorize-results/25920_html.json @@ -0,0 +1,1014 @@ +[ + { + "c": "<", + "t": "text.html.basic meta.tag.structure.any.html punctuation.definition.tag.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "html", + "t": "text.html.basic meta.tag.structure.any.html entity.name.tag.structure.any.html", + "r": { + "dark_plus": "entity.name.tag: #569CD6", + "light_plus": "entity.name.tag: #800000", + "dark_vs": "entity.name.tag: #569CD6", + "light_vs": "entity.name.tag: #800000", + "hc_black": "entity.name.tag: #569CD6" + } + }, + { + "c": ">", + "t": "text.html.basic meta.tag.structure.any.html punctuation.definition.tag.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "<", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html punctuation.definition.tag.begin.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "script", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html entity.name.tag.html", + "r": { + "dark_plus": "entity.name.tag: #569CD6", + "light_plus": "entity.name.tag: #800000", + "dark_vs": "entity.name.tag: #569CD6", + "light_vs": "entity.name.tag: #800000", + "hc_black": "entity.name.tag: #569CD6" + } + }, + { + "c": " ", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "type", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html entity.other.attribute-name.html", + "r": { + "dark_plus": "entity.other.attribute-name: #9CDCFE", + "light_plus": "entity.other.attribute-name: #FF0000", + "dark_vs": "entity.other.attribute-name: #9CDCFE", + "light_vs": "entity.other.attribute-name: #FF0000", + "hc_black": "entity.other.attribute-name: #9CDCFE" + } + }, + { + "c": "=", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "'", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html string.quoted.single.html punctuation.definition.string.begin.html", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.html: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.html: #0000FF", + "hc_black": "string: #CE9178" + } + }, + { + "c": "text/html", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html string.quoted.single.html", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.html: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.html: #0000FF", + "hc_black": "string: #CE9178" + } + }, + { + "c": "'", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html string.quoted.single.html punctuation.definition.string.end.html", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.html: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.html: #0000FF", + "hc_black": "string: #CE9178" + } + }, + { + "c": ">", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html punctuation.definition.tag.end.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "\t", + "t": "text.html.basic meta.embedded.block.html", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "<", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html punctuation.definition.tag.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "div", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html entity.name.tag.html", + "r": { + "dark_plus": "entity.name.tag: #569CD6", + "light_plus": "entity.name.tag: #800000", + "dark_vs": "entity.name.tag: #569CD6", + "light_vs": "entity.name.tag: #800000", + "hc_black": "entity.name.tag: #569CD6" + } + }, + { + "c": " ", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "class", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html entity.other.attribute-name.html", + "r": { + "dark_plus": "entity.other.attribute-name: #9CDCFE", + "light_plus": "entity.other.attribute-name: #FF0000", + "dark_vs": "entity.other.attribute-name: #9CDCFE", + "light_vs": "entity.other.attribute-name: #FF0000", + "hc_black": "entity.other.attribute-name: #9CDCFE" + } + }, + { + "c": "=", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "'", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html string.quoted.single.html punctuation.definition.string.begin.html", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.html: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.html: #0000FF", + "hc_black": "string: #CE9178" + } + }, + { + "c": "foo", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html string.quoted.single.html", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.html: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.html: #0000FF", + "hc_black": "string: #CE9178" + } + }, + { + "c": "'", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html string.quoted.single.html punctuation.definition.string.end.html", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.html: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.html: #0000FF", + "hc_black": "string: #CE9178" + } + }, + { + "c": ">", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html punctuation.definition.tag.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "<", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html punctuation.definition.tag.html meta.scope.between-tag-pair.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "/", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html punctuation.definition.tag.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "div", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html entity.name.tag.html", + "r": { + "dark_plus": "entity.name.tag: #569CD6", + "light_plus": "entity.name.tag: #800000", + "dark_vs": "entity.name.tag: #569CD6", + "light_vs": "entity.name.tag: #800000", + "hc_black": "entity.name.tag: #569CD6" + } + }, + { + "c": ">", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html punctuation.definition.tag.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html punctuation.definition.tag.end.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "<", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html punctuation.definition.tag.begin.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "script", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html entity.name.tag.html", + "r": { + "dark_plus": "entity.name.tag: #569CD6", + "light_plus": "entity.name.tag: #800000", + "dark_vs": "entity.name.tag: #569CD6", + "light_vs": "entity.name.tag: #800000", + "hc_black": "entity.name.tag: #569CD6" + } + }, + { + "c": " ", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "type", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html entity.other.attribute-name.html", + "r": { + "dark_plus": "entity.other.attribute-name: #9CDCFE", + "light_plus": "entity.other.attribute-name: #FF0000", + "dark_vs": "entity.other.attribute-name: #9CDCFE", + "light_vs": "entity.other.attribute-name: #FF0000", + "hc_black": "entity.other.attribute-name: #9CDCFE" + } + }, + { + "c": "=", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "'", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html string.quoted.single.html punctuation.definition.string.begin.html", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.html: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.html: #0000FF", + "hc_black": "string: #CE9178" + } + }, + { + "c": "module", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html string.quoted.single.html", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.html: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.html: #0000FF", + "hc_black": "string: #CE9178" + } + }, + { + "c": "'", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html string.quoted.single.html punctuation.definition.string.end.html", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.html: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.html: #0000FF", + "hc_black": "string: #CE9178" + } + }, + { + "c": ">", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html punctuation.definition.tag.end.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "\t", + "t": "text.html.basic meta.embedded.block.html source.js", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "var", + "t": "text.html.basic meta.embedded.block.html source.js meta.var.expr.js storage.type.js", + "r": { + "dark_plus": "storage.type: #569CD6", + "light_plus": "storage.type: #0000FF", + "dark_vs": "storage.type: #569CD6", + "light_vs": "storage.type: #0000FF", + "hc_black": "storage.type: #569CD6" + } + }, + { + "c": " ", + "t": "text.html.basic meta.embedded.block.html source.js meta.var.expr.js", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "x", + "t": "text.html.basic meta.embedded.block.html source.js meta.var.expr.js meta.var-single-variable.expr.js meta.definition.variable.js variable.other.readwrite.js", + "r": { + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "text.html.basic meta.embedded.block.html source.js meta.var.expr.js meta.var-single-variable.expr.js", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "=", + "t": "text.html.basic meta.embedded.block.html source.js meta.var.expr.js keyword.operator.assignment.js", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "text.html.basic meta.embedded.block.html source.js meta.var.expr.js", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "9", + "t": "text.html.basic meta.embedded.block.html source.js meta.var.expr.js constant.numeric.decimal.js", + "r": { + "dark_plus": "constant.numeric: #B5CEA8", + "light_plus": "constant.numeric: #09885A", + "dark_vs": "constant.numeric: #B5CEA8", + "light_vs": "constant.numeric: #09885A", + "hc_black": "constant.numeric: #B5CEA8" + } + }, + { + "c": ";", + "t": "text.html.basic meta.embedded.block.html source.js punctuation.terminator.statement.js", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "<", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html punctuation.definition.tag.begin.html source.js", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "/", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html punctuation.definition.tag.begin.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "script", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html entity.name.tag.html", + "r": { + "dark_plus": "entity.name.tag: #569CD6", + "light_plus": "entity.name.tag: #800000", + "dark_vs": "entity.name.tag: #569CD6", + "light_vs": "entity.name.tag: #800000", + "hc_black": "entity.name.tag: #569CD6" + } + }, + { + "c": ">", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html punctuation.definition.tag.end.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "<", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html punctuation.definition.tag.begin.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "script", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html entity.name.tag.html", + "r": { + "dark_plus": "entity.name.tag: #569CD6", + "light_plus": "entity.name.tag: #800000", + "dark_vs": "entity.name.tag: #569CD6", + "light_vs": "entity.name.tag: #800000", + "hc_black": "entity.name.tag: #569CD6" + } + }, + { + "c": " ", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "type", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html entity.other.attribute-name.html", + "r": { + "dark_plus": "entity.other.attribute-name: #9CDCFE", + "light_plus": "entity.other.attribute-name: #FF0000", + "dark_vs": "entity.other.attribute-name: #9CDCFE", + "light_vs": "entity.other.attribute-name: #FF0000", + "hc_black": "entity.other.attribute-name: #9CDCFE" + } + }, + { + "c": "=", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "'", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html string.quoted.single.html punctuation.definition.string.begin.html", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.html: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.html: #0000FF", + "hc_black": "string: #CE9178" + } + }, + { + "c": "text/ng-template", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html string.quoted.single.html", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.html: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.html: #0000FF", + "hc_black": "string: #CE9178" + } + }, + { + "c": "'", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html string.quoted.single.html punctuation.definition.string.end.html", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.html: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.html: #0000FF", + "hc_black": "string: #CE9178" + } + }, + { + "c": ">", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html punctuation.definition.tag.end.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "\t", + "t": "text.html.basic meta.embedded.block.html", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "<", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html punctuation.definition.tag.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "div", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html entity.name.tag.html", + "r": { + "dark_plus": "entity.name.tag: #569CD6", + "light_plus": "entity.name.tag: #800000", + "dark_vs": "entity.name.tag: #569CD6", + "light_vs": "entity.name.tag: #800000", + "hc_black": "entity.name.tag: #569CD6" + } + }, + { + "c": " ", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "class", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html entity.other.attribute-name.html", + "r": { + "dark_plus": "entity.other.attribute-name: #9CDCFE", + "light_plus": "entity.other.attribute-name: #FF0000", + "dark_vs": "entity.other.attribute-name: #9CDCFE", + "light_vs": "entity.other.attribute-name: #FF0000", + "hc_black": "entity.other.attribute-name: #9CDCFE" + } + }, + { + "c": "=", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "'", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html string.quoted.single.html punctuation.definition.string.begin.html", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.html: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.html: #0000FF", + "hc_black": "string: #CE9178" + } + }, + { + "c": "foo", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html string.quoted.single.html", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.html: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.html: #0000FF", + "hc_black": "string: #CE9178" + } + }, + { + "c": "'", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html string.quoted.single.html punctuation.definition.string.end.html", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.html: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.html: #0000FF", + "hc_black": "string: #CE9178" + } + }, + { + "c": ">", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html punctuation.definition.tag.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "<", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html punctuation.definition.tag.html meta.scope.between-tag-pair.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "/", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html punctuation.definition.tag.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "div", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html entity.name.tag.html", + "r": { + "dark_plus": "entity.name.tag: #569CD6", + "light_plus": "entity.name.tag: #800000", + "dark_vs": "entity.name.tag: #569CD6", + "light_vs": "entity.name.tag: #800000", + "hc_black": "entity.name.tag: #569CD6" + } + }, + { + "c": ">", + "t": "text.html.basic meta.embedded.block.html meta.tag.any.html punctuation.definition.tag.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "", + "t": "text.html.basic meta.embedded.block.html meta.tag.metadata.script.html punctuation.definition.tag.end.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "<", + "t": "text.html.basic meta.tag.structure.any.html punctuation.definition.tag.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "body", + "t": "text.html.basic meta.tag.structure.any.html entity.name.tag.structure.any.html", + "r": { + "dark_plus": "entity.name.tag: #569CD6", + "light_plus": "entity.name.tag: #800000", + "dark_vs": "entity.name.tag: #569CD6", + "light_vs": "entity.name.tag: #800000", + "hc_black": "entity.name.tag: #569CD6" + } + }, + { + "c": " ", + "t": "text.html.basic meta.tag.structure.any.html", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "class", + "t": "text.html.basic meta.tag.structure.any.html entity.other.attribute-name.html", + "r": { + "dark_plus": "entity.other.attribute-name: #9CDCFE", + "light_plus": "entity.other.attribute-name: #FF0000", + "dark_vs": "entity.other.attribute-name: #9CDCFE", + "light_vs": "entity.other.attribute-name: #FF0000", + "hc_black": "entity.other.attribute-name: #9CDCFE" + } + }, + { + "c": "=", + "t": "text.html.basic meta.tag.structure.any.html", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "'", + "t": "text.html.basic meta.tag.structure.any.html string.quoted.single.html punctuation.definition.string.begin.html", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.html: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.html: #0000FF", + "hc_black": "string: #CE9178" + } + }, + { + "c": "bar", + "t": "text.html.basic meta.tag.structure.any.html string.quoted.single.html", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.html: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.html: #0000FF", + "hc_black": "string: #CE9178" + } + }, + { + "c": "'", + "t": "text.html.basic meta.tag.structure.any.html string.quoted.single.html punctuation.definition.string.end.html", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string.quoted.single.html: #0000FF", + "dark_vs": "string: #CE9178", + "light_vs": "string.quoted.single.html: #0000FF", + "hc_black": "string: #CE9178" + } + }, + { + "c": ">", + "t": "text.html.basic meta.tag.structure.any.html punctuation.definition.tag.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "", + "t": "text.html.basic meta.tag.structure.any.html punctuation.definition.tag.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + }, + { + "c": "", + "t": "text.html.basic meta.tag.structure.any.html punctuation.definition.tag.html", + "r": { + "dark_plus": "punctuation.definition.tag: #808080", + "light_plus": "punctuation.definition.tag: #800000", + "dark_vs": "punctuation.definition.tag: #808080", + "light_vs": "punctuation.definition.tag: #800000", + "hc_black": "punctuation.definition.tag: #808080" + } + } +] \ No newline at end of file From e2721f46cf49a0872d9c463f9be3daff85d65d6e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 8 May 2017 15:22:23 +0200 Subject: [PATCH 0163/1164] make inline the default snippet sort, fixes #26182 --- src/vs/editor/common/config/defaultConfig.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/common/config/defaultConfig.ts b/src/vs/editor/common/config/defaultConfig.ts index b7224baf580..0662f2bf9e1 100644 --- a/src/vs/editor/common/config/defaultConfig.ts +++ b/src/vs/editor/common/config/defaultConfig.ts @@ -96,7 +96,7 @@ class ConfigClass implements IConfiguration { suggestOnTriggerCharacters: true, acceptSuggestionOnEnter: true, acceptSuggestionOnCommitCharacter: true, - snippetSuggestions: 'bottom', + snippetSuggestions: 'inline', emptySelectionClipboard: true, wordBasedSuggestions: true, suggestFontSize: 0, From ae5c28306b8db90d0b9d7c4af976c2fa76237bb5 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 May 2017 08:12:33 -0700 Subject: [PATCH 0164/1164] Pick up updated js/ts grammar (#26094) --- .../syntaxes/JavaScript.tmLanguage.json | 27 ++++++++++++++----- .../test/colorize-results/test_jsx.json | 6 ++--- .../syntaxes/TypeScriptReact.tmLanguage.json | 27 ++++++++++++++----- 3 files changed, 45 insertions(+), 15 deletions(-) diff --git a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json index 7d5f08c0d49..ec077b65656 100644 --- a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json @@ -4008,8 +4008,8 @@ }, "jsx-tag-without-attributes": { "name": "meta.tag.without-attributes.js", - "begin": "(<)\\s*([_$a-zA-Z][-$\\w.]*(?)", - "end": "()", + "begin": "(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?)", + "end": "()", "beginCaptures": { "1": { "name": "punctuation.definition.tag.begin.js" @@ -4018,6 +4018,9 @@ "name": "entity.name.tag.js" }, "3": { + "name": "support.class.component.js" + }, + "4": { "name": "punctuation.definition.tag.end.js" } }, @@ -4029,6 +4032,9 @@ "name": "entity.name.tag.js" }, "3": { + "name": "support.class.component.js" + }, + "4": { "name": "punctuation.definition.tag.end.js" } }, @@ -4041,7 +4047,7 @@ }, "jsx-tag-in-expression": { "begin": "(?x)\n (?<=[({\\[,?=>:*]|&&|\\|\\||\\?|\\Wreturn|^return|\\Wdefault|^)\\s*\n (?!(<)\\s*([_$a-zA-Z][-$\\w.]*(?)) #look ahead is not start of tag without attributes\n (?!<\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s+[^=>])|,)) # look ahead is not type parameter of arrow\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", - "end": "(/>)|(?:())", + "end": "(/>)|(?:())", "endCaptures": { "0": { "name": "meta.tag.js" @@ -4056,6 +4062,9 @@ "name": "entity.name.tag.js" }, "4": { + "name": "support.class.component.js" + }, + "5": { "name": "punctuation.definition.tag.end.js" } }, @@ -4067,7 +4076,7 @@ }, "jsx-child-tag": { "begin": "(?x)\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", - "end": "(/>)|(?:())", + "end": "(/>)|(?:())", "endCaptures": { "0": { "name": "meta.tag.js" @@ -4082,6 +4091,9 @@ "name": "entity.name.tag.js" }, "4": { + "name": "support.class.component.js" + }, + "5": { "name": "punctuation.definition.tag.end.js" } }, @@ -4097,13 +4109,16 @@ "end": "(?=(/>)|(?:()))", "patterns": [ { - "begin": "(?x)\n (<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?)", + "begin": "(?x)\n (<)\\s*\n ((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?)", "beginCaptures": { "1": { "name": "punctuation.definition.tag.begin.js" }, "2": { "name": "entity.name.tag.js" + }, + "3": { + "name": "support.class.component.js" } }, "end": "(?=[/]?>)", @@ -4173,5 +4188,5 @@ ] } }, - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/9f6676aa2ddb75cb5a9dbe1f59024069e839d986" + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/cb1af7953db224204607cbe22d3a45aa0f77a4c1" } \ No newline at end of file diff --git a/extensions/javascript/test/colorize-results/test_jsx.json b/extensions/javascript/test/colorize-results/test_jsx.json index eaf452df0d2..65e9462cc40 100644 --- a/extensions/javascript/test/colorize-results/test_jsx.json +++ b/extensions/javascript/test/colorize-results/test_jsx.json @@ -2157,10 +2157,10 @@ }, { "c": "ToggleText", - "t": "source.js meta.tag.js entity.name.tag.js", + "t": "source.js meta.tag.js entity.name.tag.js support.class.component.js", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", + "dark_plus": "support.class: #4EC9B0", + "light_plus": "support.class: #267F99", "dark_vs": "entity.name.tag: #569CD6", "light_vs": "entity.name.tag: #800000", "hc_black": "entity.name.tag: #569CD6" diff --git a/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json b/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json index 3781e7bc5dc..c20889881a1 100644 --- a/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json +++ b/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json @@ -4005,8 +4005,8 @@ }, "jsx-tag-without-attributes": { "name": "meta.tag.without-attributes.tsx", - "begin": "(<)\\s*([_$a-zA-Z][-$\\w.]*(?)", - "end": "()", + "begin": "(<)\\s*((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?)", + "end": "()", "beginCaptures": { "1": { "name": "punctuation.definition.tag.begin.tsx" @@ -4015,6 +4015,9 @@ "name": "entity.name.tag.tsx" }, "3": { + "name": "support.class.component.tsx" + }, + "4": { "name": "punctuation.definition.tag.end.tsx" } }, @@ -4026,6 +4029,9 @@ "name": "entity.name.tag.tsx" }, "3": { + "name": "support.class.component.tsx" + }, + "4": { "name": "punctuation.definition.tag.end.tsx" } }, @@ -4038,7 +4044,7 @@ }, "jsx-tag-in-expression": { "begin": "(?x)\n (?<=[({\\[,?=>:*]|&&|\\|\\||\\?|\\Wreturn|^return|\\Wdefault|^)\\s*\n (?!(<)\\s*([_$a-zA-Z][-$\\w.]*(?)) #look ahead is not start of tag without attributes\n (?!<\\s*[_$[:alpha:]][_$[:alnum:]]*((\\s+extends\\s+[^=>])|,)) # look ahead is not type parameter of arrow\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", - "end": "(/>)|(?:())", + "end": "(/>)|(?:())", "endCaptures": { "0": { "name": "meta.tag.tsx" @@ -4053,6 +4059,9 @@ "name": "entity.name.tag.tsx" }, "4": { + "name": "support.class.component.tsx" + }, + "5": { "name": "punctuation.definition.tag.end.tsx" } }, @@ -4064,7 +4073,7 @@ }, "jsx-child-tag": { "begin": "(?x)\n (?=(<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?))", - "end": "(/>)|(?:())", + "end": "(/>)|(?:())", "endCaptures": { "0": { "name": "meta.tag.tsx" @@ -4079,6 +4088,9 @@ "name": "entity.name.tag.tsx" }, "4": { + "name": "support.class.component.tsx" + }, + "5": { "name": "punctuation.definition.tag.end.tsx" } }, @@ -4094,13 +4106,16 @@ "end": "(?=(/>)|(?:()))", "patterns": [ { - "begin": "(?x)\n (<)\\s*\n ([_$a-zA-Z][-$\\w.]*(?)", + "begin": "(?x)\n (<)\\s*\n ((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\\w.]*))(?)", "beginCaptures": { "1": { "name": "punctuation.definition.tag.begin.tsx" }, "2": { "name": "entity.name.tag.tsx" + }, + "3": { + "name": "support.class.component.tsx" } }, "end": "(?=[/]?>)", @@ -4170,5 +4185,5 @@ ] } }, - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/9f6676aa2ddb75cb5a9dbe1f59024069e839d986" + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/cb1af7953db224204607cbe22d3a45aa0f77a4c1" } \ No newline at end of file From 6605a9ec3fc6059f5c817ecd3be50d3e6c5e47be Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 May 2017 17:36:47 +0200 Subject: [PATCH 0165/1164] theming - introduce input.placeholderForeground for placeholder foreground --- src/vs/platform/theme/common/colorRegistry.ts | 2 ++ src/vs/workbench/electron-browser/shell.ts | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 21ead0e0272..21c786197cb 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -143,6 +143,8 @@ export const inputBackground = registerColor('input.background', { dark: '#3C3C3 export const inputForeground = registerColor('input.foreground', { dark: foreground, light: foreground, hc: foreground }, nls.localize('inputBoxForeground', "Input box foreground.")); export const inputBorder = registerColor('input.border', { dark: null, light: null, hc: contrastBorder }, nls.localize('inputBoxBorder', "Input box border.")); export const inputActiveOptionBorder = registerColor('inputOption.activeBorder', { dark: '#007ACC', light: '#007ACC', hc: activeContrastBorder }, nls.localize('inputBoxActiveOptionBorder', "Border color of activated options in input fields.")); +export const inputPlaceholderForeground = registerColor('input.placeholderForeground', { dark: null, light: null, hc: null }, nls.localize('inputPlaceholderForeground', "Input box foreground color for placeholder text.")); + export const inputValidationInfoBackground = registerColor('inputValidation.infoBackground', { dark: '#063B49', light: '#D6ECF2', hc: Color.black }, nls.localize('inputValidationInfoBackground', "Input validation background color for information severity.")); export const inputValidationInfoBorder = registerColor('inputValidation.infoBorder', { dark: '#55AAFF', light: '#55AAFF', hc: '#6FC3DF' }, nls.localize('inputValidationInfoBorder', "Input validation border color for information severity.")); export const inputValidationWarningBackground = registerColor('inputValidation.warningBackground', { dark: '#352A05', light: '#F6F5D2', hc: Color.black }, nls.localize('inputValidationWarningBackground', "Input validation background color for information warning.")); diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 9e003eda0d7..728af5751c1 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -103,7 +103,7 @@ import 'vs/platform/opener/browser/opener.contribution'; import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { WorkbenchThemeService } from 'vs/workbench/services/themes/electron-browser/workbenchThemeService'; import { registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; -import { foreground, selectionBackground, focusBorder, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, listHighlightForeground } from 'vs/platform/theme/common/colorRegistry'; +import { foreground, selectionBackground, focusBorder, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, listHighlightForeground, inputPlaceholderForeground } from 'vs/platform/theme/common/colorRegistry'; /** * Services that we require for the Shell @@ -535,6 +535,13 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { collector.addRule(`.monaco-shell ::selection { background-color: ${windowSelectionBackground}; }`); } + // Input placeholder + const placeholderForeground = theme.getColor(inputPlaceholderForeground); + if (placeholderForeground) { + collector.addRule(`.monaco-shell input::-webkit-input-placeholder { color: ${placeholderForeground}; }`); + collector.addRule(`.monaco-shell textarea::-webkit-input-placeholder { color: ${placeholderForeground}; }`); + } + // List highlight const listHighlightForegroundColor = theme.getColor(listHighlightForeground); if (listHighlightForegroundColor) { From 8425399f03ff5b3968659791c0692adf11353edd Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 May 2017 17:48:34 +0200 Subject: [PATCH 0166/1164] Support for list.inactiveSelectionForeground (fixes #25774) --- src/vs/base/browser/ui/list/listWidget.ts | 5 +++++ src/vs/base/parts/tree/browser/tree.ts | 1 + src/vs/base/parts/tree/browser/treeView.ts | 2 +- src/vs/platform/theme/common/colorRegistry.ts | 1 + src/vs/platform/theme/common/styler.ts | 6 +++++- 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index 5750f6df6e0..6aac291fb23 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -410,6 +410,7 @@ export interface IListStyles { listFocusAndSelectionBackground?: Color; listFocusAndSelectionForeground?: Color; listInactiveSelectionBackground?: Color; + listInactiveSelectionForeground?: Color; listInactiveFocusBackground?: Color; listHoverBackground?: Color; listDropBackground?: Color; @@ -844,6 +845,10 @@ export class List implements ISpliceable, IDisposable { content.push(`.monaco-list.${this.idPrefix} .monaco-list-row.selected:hover { background-color: ${styles.listInactiveSelectionBackground}; }`); // overwrite :hover style in this case! } + if (styles.listInactiveSelectionForeground) { + content.push(`.monaco-list.${this.idPrefix} .monaco-list-row.selected { color: ${styles.listInactiveSelectionForeground}; }`); + } + if (styles.listHoverBackground) { content.push(`.monaco-list.${this.idPrefix} .monaco-list-row:hover { background-color: ${styles.listHoverBackground}; }`); } diff --git a/src/vs/base/parts/tree/browser/tree.ts b/src/vs/base/parts/tree/browser/tree.ts index 59ecc80ad66..0d253f2b083 100644 --- a/src/vs/base/parts/tree/browser/tree.ts +++ b/src/vs/base/parts/tree/browser/tree.ts @@ -670,6 +670,7 @@ export interface ITreeStyles { listFocusAndSelectionBackground?: Color; listFocusAndSelectionForeground?: Color; listInactiveSelectionBackground?: Color; + listInactiveSelectionForeground?: Color; listHoverBackground?: Color; listDropBackground?: Color; listFocusOutline?: Color; diff --git a/src/vs/base/parts/tree/browser/treeView.ts b/src/vs/base/parts/tree/browser/treeView.ts index 549608374c1..5fd3c01a373 100644 --- a/src/vs/base/parts/tree/browser/treeView.ts +++ b/src/vs/base/parts/tree/browser/treeView.ts @@ -562,7 +562,7 @@ export class TreeView extends HeightMap { .monaco-tree.monaco-tree-instance-${this.instance}.focused .monaco-tree-rows > .monaco-tree-row.focused:not(.highlighted) { background-color: ${styles.listFocusBackground}; } .monaco-tree.monaco-tree-instance-${this.instance}.focused .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { background-color: ${styles.listActiveSelectionBackground}; color: ${styles.listActiveSelectionForeground}; } .monaco-tree.monaco-tree-instance-${this.instance}.focused .monaco-tree-rows > .monaco-tree-row.focused.selected:not(.highlighted) { background-color: ${styles.listFocusAndSelectionBackground}; color: ${styles.listFocusAndSelectionForeground}; } - .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { background-color: ${styles.listInactiveSelectionBackground}; } + .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { background-color: ${styles.listInactiveSelectionBackground}; color: ${styles.listInactiveSelectionForeground}; } .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row:hover:not(.highlighted):not(.selected):not(.focused) { background-color: ${styles.listHoverBackground}; } .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-wrapper.drop-target, .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row.drop-target { background-color: ${styles.listDropBackground} !important; } diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 21c786197cb..03dc2d24dda 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -160,6 +160,7 @@ export const listFocusBackground = registerColor('list.focusBackground', { dark: export const listActiveSelectionBackground = registerColor('list.activeSelectionBackground', { dark: '#094771', light: '#3399FF', hc: null }, nls.localize('listActiveSelectionBackground', "List/Tree background color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); export const listInactiveSelectionBackground = registerColor('list.inactiveSelectionBackground', { dark: '#3F3F46', light: '#CCCEDB', hc: null }, nls.localize('listInactiveSelectionBackground', "List/Tree background color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")); export const listActiveSelectionForeground = registerColor('list.activeSelectionForeground', { dark: Color.white, light: Color.white, hc: Color.white }, nls.localize('listActiveSelectionForeground', "List/Tree foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); +export const listInactiveSelectionForeground = registerColor('list.inactiveSelectionForeground', { dark: null, light: null, hc: null }, nls.localize('listInactiveSelectionForeground', "List/Tree foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")); export const listHoverBackground = registerColor('list.hoverBackground', { dark: '#2A2D2E', light: '#F0F0F0', hc: null }, nls.localize('listHoverBackground', "List/Tree background when hovering over items using the mouse.")); export const listDropBackground = registerColor('list.dropBackground', { dark: listFocusBackground, light: listFocusBackground, hc: null }, nls.localize('listDropBackground', "List/Tree drag and drop background when moving items around using the mouse.")); export const listHighlightForeground = registerColor('list.highlightForeground', { dark: '#0097fb', light: '#007acc', hc: focusBorder }, nls.localize('highlight', 'List/Tree foreground color of the match highlights when searching inside the list/tree.')); diff --git a/src/vs/platform/theme/common/styler.ts b/src/vs/platform/theme/common/styler.ts index 017fca395ed..46b5f1bd0fa 100644 --- a/src/vs/platform/theme/common/styler.ts +++ b/src/vs/platform/theme/common/styler.ts @@ -6,7 +6,7 @@ 'use strict'; import { ITheme, IThemeService } from 'vs/platform/theme/common/themeService'; -import { inputBackground, inputForeground, ColorIdentifier, selectForeground, selectBackground, selectBorder, inputBorder, foreground, editorBackground, contrastBorder, inputActiveOptionBorder, listFocusBackground, listActiveSelectionBackground, listActiveSelectionForeground, listInactiveSelectionBackground, listHoverBackground, listDropBackground, pickerGroupBorder, pickerGroupForeground, widgetShadow, inputValidationInfoBorder, inputValidationInfoBackground, inputValidationWarningBorder, inputValidationWarningBackground, inputValidationErrorBorder, inputValidationErrorBackground, activeContrastBorder, buttonForeground, buttonBackground, buttonHoverBackground, ColorFunction, lighten } from 'vs/platform/theme/common/colorRegistry'; +import { inputBackground, inputForeground, ColorIdentifier, selectForeground, selectBackground, selectBorder, inputBorder, foreground, editorBackground, contrastBorder, inputActiveOptionBorder, listFocusBackground, listActiveSelectionBackground, listActiveSelectionForeground, listInactiveSelectionForeground, listInactiveSelectionBackground, listHoverBackground, listDropBackground, pickerGroupBorder, pickerGroupForeground, widgetShadow, inputValidationInfoBorder, inputValidationInfoBackground, inputValidationWarningBorder, inputValidationWarningBackground, inputValidationErrorBorder, inputValidationErrorBackground, activeContrastBorder, buttonForeground, buttonBackground, buttonHoverBackground, ColorFunction, lighten } from 'vs/platform/theme/common/colorRegistry'; import { IDisposable } from 'vs/base/common/lifecycle'; import { SIDE_BAR_SECTION_HEADER_BACKGROUND } from 'vs/workbench/common/theme'; @@ -122,6 +122,7 @@ export function attachQuickOpenStyler(widget: IThemable, themeService: IThemeSer listFocusAndSelectionBackground?: ColorIdentifier, listFocusAndSelectionForeground?: ColorIdentifier, listInactiveSelectionBackground?: ColorIdentifier, + listInactiveSelectionForeground?: ColorIdentifier, listHoverBackground?: ColorIdentifier, listDropBackground?: ColorIdentifier, listFocusOutline?: ColorIdentifier, @@ -150,6 +151,7 @@ export function attachQuickOpenStyler(widget: IThemable, themeService: IThemeSer listFocusAndSelectionBackground: style && style.listFocusAndSelectionBackground || listActiveSelectionBackground, listFocusAndSelectionForeground: (style && style.listFocusAndSelectionForeground) || listActiveSelectionForeground, listInactiveSelectionBackground: (style && style.listInactiveSelectionBackground) || listInactiveSelectionBackground, + listInactiveSelectionForeground: (style && style.listInactiveSelectionForeground) || listInactiveSelectionForeground, listHoverBackground: (style && style.listHoverBackground) || listHoverBackground, listDropBackground: (style && style.listDropBackground) || listDropBackground, listFocusOutline: (style && style.listFocusOutline) || activeContrastBorder, @@ -166,6 +168,7 @@ export function attachListStyler(widget: IThemable, themeService: IThemeService, listFocusAndSelectionForeground?: ColorIdentifier, listInactiveFocusBackground?: ColorIdentifier, listInactiveSelectionBackground?: ColorIdentifier, + listInactiveSelectionForeground?: ColorIdentifier, listHoverBackground?: ColorIdentifier, listDropBackground?: ColorIdentifier, listFocusOutline?: ColorIdentifier, @@ -181,6 +184,7 @@ export function attachListStyler(widget: IThemable, themeService: IThemeService, listFocusAndSelectionForeground: (style && style.listFocusAndSelectionForeground) || listActiveSelectionForeground, listInactiveFocusBackground: (style && style.listInactiveFocusBackground), listInactiveSelectionBackground: (style && style.listInactiveSelectionBackground) || listInactiveSelectionBackground, + listInactiveSelectionForeground: (style && style.listInactiveSelectionForeground) || listInactiveSelectionForeground, listHoverBackground: (style && style.listHoverBackground) || listHoverBackground, listDropBackground: (style && style.listDropBackground) || listDropBackground, listFocusOutline: (style && style.listFocusOutline) || activeContrastBorder, From 7432cfa1eee9b6ca293e31e6b1f469fb7d93d49b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 May 2017 17:52:45 +0200 Subject: [PATCH 0167/1164] panel.border isn't being applied when contrast color is specified (fixes #26074) --- src/vs/workbench/browser/parts/panel/panelPart.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index 3d7c435ff9c..799e4ecc9c4 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -104,7 +104,7 @@ export class PanelPart extends CompositePart implements IPanelService { container.style('background-color', this.getColor(PANEL_BACKGROUND)); const title = this.getTitleArea(); - title.style('border-top-color', this.getColor(contrastBorder) || this.getColor(PANEL_BORDER_COLOR)); + title.style('border-top-color', this.getColor(PANEL_BORDER_COLOR) || this.getColor(contrastBorder)); } public openPanel(id: string, focus?: boolean): TPromise { From 228ac262b861c4606f89e546098dceccc2a183fa Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 May 2017 18:40:34 +0200 Subject: [PATCH 0168/1164] themes - let more specific border colors win over contrastBorder color --- .../parts/activitybar/activitybarActions.ts | 8 ++--- .../parts/activitybar/activitybarPart.ts | 16 ++++----- .../parts/editor/editorGroupsControl.ts | 34 +++++++++---------- .../browser/parts/editor/tabsTitleControl.ts | 16 ++++----- .../browser/parts/sidebar/sidebarPart.ts | 14 ++++---- .../browser/parts/statusbar/statusbarPart.ts | 8 ++--- src/vs/workbench/electron-browser/window.ts | 10 +++--- .../parts/debug/browser/debugActionsWidget.ts | 8 ++--- .../electron-browser/extensionsViewlet.ts | 8 ++--- 9 files changed, 61 insertions(+), 61 deletions(-) diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts index a6cbc397306..be928651ff2 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts @@ -176,14 +176,14 @@ export class ActivityActionItem extends ThemableActivityActionItem { if (this.$badgeContent) { const badgeForeground = theme.getColor(ACTIVITY_BAR_BADGE_FOREGROUND); const badgeBackground = theme.getColor(ACTIVITY_BAR_BADGE_BACKGROUND); - const hcBorder = theme.getColor(contrastBorder); + const contrastBorderColor = theme.getColor(contrastBorder); this.$badgeContent.style('color', badgeForeground ? badgeForeground.toString() : null); this.$badgeContent.style('background-color', badgeBackground ? badgeBackground.toString() : null); - this.$badgeContent.style('border-style', hcBorder ? 'solid' : null); - this.$badgeContent.style('border-width', hcBorder ? '1px' : null); - this.$badgeContent.style('border-color', hcBorder ? hcBorder.toString() : null); + this.$badgeContent.style('border-style', contrastBorderColor ? 'solid' : null); + this.$badgeContent.style('border-width', contrastBorderColor ? '1px' : null); + this.$badgeContent.style('border-color', contrastBorderColor ? contrastBorderColor.toString() : null); } } diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index ccb1b35f223..a40dd7dd621 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -216,15 +216,15 @@ export class ActivitybarPart extends Part implements IActivityBarService { const background = this.getColor(ACTIVITY_BAR_BACKGROUND); container.style('background-color', background); - const hcBorder = this.getColor(contrastBorder); + const contrastBorderColor = this.getColor(contrastBorder); const isPositionLeft = this.partService.getSideBarPosition() === SideBarPosition.LEFT; - container.style('box-sizing', hcBorder && isPositionLeft ? 'border-box' : null); - container.style('border-right-width', hcBorder && isPositionLeft ? '1px' : null); - container.style('border-right-style', hcBorder && isPositionLeft ? 'solid' : null); - container.style('border-right-color', isPositionLeft ? hcBorder : null); - container.style('border-left-width', hcBorder && !isPositionLeft ? '1px' : null); - container.style('border-left-style', hcBorder && !isPositionLeft ? 'solid' : null); - container.style('border-left-color', !isPositionLeft ? hcBorder : null); + container.style('box-sizing', contrastBorderColor && isPositionLeft ? 'border-box' : null); + container.style('border-right-width', contrastBorderColor && isPositionLeft ? '1px' : null); + container.style('border-right-style', contrastBorderColor && isPositionLeft ? 'solid' : null); + container.style('border-right-color', isPositionLeft ? contrastBorderColor : null); + container.style('border-left-width', contrastBorderColor && !isPositionLeft ? '1px' : null); + container.style('border-left-style', contrastBorderColor && !isPositionLeft ? 'solid' : null); + container.style('border-left-color', !isPositionLeft ? contrastBorderColor : null); } private showContextMenu(e: MouseEvent): void { diff --git a/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts b/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts index d19a3395f43..898e5b288e8 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts @@ -1009,19 +1009,19 @@ export class EditorGroupsControl extends Themable implements IEditorGroupsContro silo.style('background-color', this.getColor(editorBackground)); // Border - silo.style('border-left-color', index > Position.ONE ? (this.getColor(contrastBorder) || this.getColor(EDITOR_GROUP_BORDER_COLOR)) : null); - silo.style('border-top-color', index > Position.ONE ? (this.getColor(contrastBorder) || this.getColor(EDITOR_GROUP_BORDER_COLOR)) : null); + silo.style('border-left-color', index > Position.ONE ? (this.getColor(EDITOR_GROUP_BORDER_COLOR) || this.getColor(contrastBorder)) : null); + silo.style('border-top-color', index > Position.ONE ? (this.getColor(EDITOR_GROUP_BORDER_COLOR) || this.getColor(contrastBorder)) : null); }); // Title control POSITIONS.forEach(position => { const container = this.getTitleAreaControl(position).getContainer(); - const hcBorder = this.getColor(contrastBorder); + const contrastBorderColor = this.getColor(contrastBorder); container.style.backgroundColor = this.getColor(this.tabOptions.showTabs ? TABS_CONTAINER_BACKGROUND : EDITOR_GROUP_HEADER_BACKGROUND); - container.style.borderBottomWidth = (hcBorder && this.tabOptions.showTabs) ? '1px' : null; - container.style.borderBottomStyle = (hcBorder && this.tabOptions.showTabs) ? 'solid' : null; - container.style.borderBottomColor = this.tabOptions.showTabs ? hcBorder : null; + container.style.borderBottomWidth = (contrastBorderColor && this.tabOptions.showTabs) ? '1px' : null; + container.style.borderBottomStyle = (contrastBorderColor && this.tabOptions.showTabs) ? 'solid' : null; + container.style.borderBottomColor = this.tabOptions.showTabs ? contrastBorderColor : null; }); } @@ -1226,15 +1226,15 @@ export class EditorGroupsControl extends Themable implements IEditorGroupsContro const containers = $this.visibleEditors.filter(e => !!e).map(e => e.getContainer()); containers.forEach((container, index) => { if (container && DOM.isAncestor(target, container.getHTMLElement())) { - const hcOutline = $this.getColor(activeContrastBorder); + const activeContrastBorderColor = $this.getColor(activeContrastBorder); overlay = $('div').style({ top: $this.tabOptions.showTabs ? `${EditorGroupsControl.EDITOR_TITLE_HEIGHT}px` : 0, height: $this.tabOptions.showTabs ? `calc(100% - ${EditorGroupsControl.EDITOR_TITLE_HEIGHT}px` : '100%', backgroundColor: $this.getColor(EDITOR_DRAG_AND_DROP_BACKGROUND), - outlineColor: hcOutline, - outlineOffset: hcOutline ? '-2px' : null, - outlineStyle: hcOutline ? 'dashed' : null, - outlineWidth: hcOutline ? '2px' : null + outlineColor: activeContrastBorderColor, + outlineOffset: activeContrastBorderColor ? '-2px' : null, + outlineStyle: activeContrastBorderColor ? 'dashed' : null, + outlineWidth: activeContrastBorderColor ? '2px' : null }).id(overlayId); overlay.appendTo(container); @@ -1555,7 +1555,7 @@ export class EditorGroupsControl extends Themable implements IEditorGroupsContro if (isDragging) { this.parent.addClass('dragging'); silo.addClass('dragging'); - borderColor = (this.getColor(contrastBorder) || this.getColor(EDITOR_GROUP_BORDER_COLOR)); + borderColor = this.getColor(EDITOR_GROUP_BORDER_COLOR) || this.getColor(contrastBorder); } else { this.parent.removeClass('dragging'); silo.removeClass('dragging'); @@ -1575,11 +1575,11 @@ export class EditorGroupsControl extends Themable implements IEditorGroupsContro const background = this.getColor(isDropping ? EDITOR_DRAG_AND_DROP_BACKGROUND : groupCount > 0 ? EDITOR_GROUP_BACKGROUND : null); element.style.backgroundColor = background; - const hcOutline = this.getColor(activeContrastBorder); - element.style.outlineColor = isDropping ? hcOutline : null; - element.style.outlineStyle = isDropping && hcOutline ? 'dashed' : null; - element.style.outlineWidth = isDropping && hcOutline ? '2px' : null; - element.style.outlineOffset = isDropping && hcOutline ? '-2px' : null; + const activeContrastBorderColor = this.getColor(activeContrastBorder); + element.style.outlineColor = isDropping ? activeContrastBorderColor : null; + element.style.outlineStyle = isDropping && activeContrastBorderColor ? 'dashed' : null; + element.style.outlineWidth = isDropping && activeContrastBorderColor ? '2px' : null; + element.style.outlineOffset = isDropping && activeContrastBorderColor ? '-2px' : null; } private posSilo(pos: number, leftTop: string | number, rightBottom?: string | number, borderLeftTopWidth?: string | number): void { diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index f893b2505ca..39993429952 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -219,16 +219,16 @@ export class TabsTitleControl extends TitleControl { element.style.backgroundColor = isDND ? this.getColor(EDITOR_DRAG_AND_DROP_BACKGROUND) : noDNDBackgroundColor; // Outline - const hcOutline = this.getColor(activeContrastBorder); - if (hcOutline && isDND) { + const activeContrastBorderColor = this.getColor(activeContrastBorder); + if (activeContrastBorderColor && isDND) { element.style.outlineWidth = '2px'; element.style.outlineStyle = 'dashed'; - element.style.outlineColor = hcOutline; + element.style.outlineColor = activeContrastBorderColor; element.style.outlineOffset = isTab ? '-5px' : '-3px'; } else { element.style.outlineWidth = null; element.style.outlineStyle = null; - element.style.outlineColor = hcOutline; + element.style.outlineColor = activeContrastBorderColor; element.style.outlineOffset = null; } } @@ -272,8 +272,8 @@ export class TabsTitleControl extends TitleControl { // Container tabContainer.setAttribute('aria-label', `${name}, tab`); tabContainer.title = title; - tabContainer.style.borderLeftColor = (index !== 0) ? (this.getColor(contrastBorder) || this.getColor(TAB_BORDER)) : null; - tabContainer.style.borderRightColor = (index === editorsOfGroup.length - 1) ? (this.getColor(contrastBorder) || this.getColor(TAB_BORDER)) : null; + tabContainer.style.borderLeftColor = (index !== 0) ? (this.getColor(TAB_BORDER) || this.getColor(contrastBorder)) : null;; + tabContainer.style.borderRightColor = (index === editorsOfGroup.length - 1) ? (this.getColor(TAB_BORDER) || this.getColor(contrastBorder)) : null;; tabContainer.style.outlineColor = this.getColor(activeContrastBorder); const tabOptions = this.editorGroupService.getTabOptions(); @@ -763,8 +763,8 @@ class TabActionRunner extends ActionRunner { registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { // Styling with Outline color (e.g. high contrast theme) - const outline = theme.getColor(activeContrastBorder); - if (outline) { + const activeContrastBorderColor = theme.getColor(activeContrastBorder); + if (activeContrastBorderColor) { collector.addRule(` .monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab.active, .monaco-workbench > .part.editor > .content > .one-editor-silo > .container > .title .tabs-container > .tab.active:hover { diff --git a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts index bf46d02791d..7c0e4827a2d 100644 --- a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts +++ b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts @@ -83,14 +83,14 @@ export class SidebarPart extends CompositePart { container.style('background-color', this.getColor(SIDE_BAR_BACKGROUND)); - const hcBorder = this.getColor(contrastBorder); + const contrastBorderColor = this.getColor(contrastBorder); const isPositionLeft = this.partService.getSideBarPosition() === SideBarPosition.LEFT; - container.style('border-right-width', hcBorder && isPositionLeft ? '1px' : null); - container.style('border-right-style', hcBorder && isPositionLeft ? 'solid' : null); - container.style('border-right-color', isPositionLeft ? hcBorder : null); - container.style('border-left-width', hcBorder && !isPositionLeft ? '1px' : null); - container.style('border-left-style', hcBorder && !isPositionLeft ? 'solid' : null); - container.style('border-left-color', !isPositionLeft ? hcBorder : null); + container.style('border-right-width', contrastBorderColor && isPositionLeft ? '1px' : null); + container.style('border-right-style', contrastBorderColor && isPositionLeft ? 'solid' : null); + container.style('border-right-color', isPositionLeft ? contrastBorderColor : null); + container.style('border-left-width', contrastBorderColor && !isPositionLeft ? '1px' : null); + container.style('border-left-style', contrastBorderColor && !isPositionLeft ? 'solid' : null); + container.style('border-left-color', !isPositionLeft ? contrastBorderColor : null); } public openViewlet(id: string, focus?: boolean): TPromise { diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index 4fa06dbfe4f..464a368ab25 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -139,10 +139,10 @@ export class StatusbarPart extends Part implements IStatusbarService { container.style('color', this.getColor(STATUS_BAR_FOREGROUND)); container.style('background-color', this.getColor(this.contextService.hasWorkspace() ? STATUS_BAR_BACKGROUND : STATUS_BAR_NO_FOLDER_BACKGROUND)); - const hcBorder = this.getColor(contrastBorder); - container.style('border-top-width', hcBorder ? '1px' : null); - container.style('border-top-style', hcBorder ? 'solid' : null); - container.style('border-top-color', hcBorder); + const contrastBorderColor = this.getColor(contrastBorder); + container.style('border-top-width', contrastBorderColor ? '1px' : null); + container.style('border-top-style', contrastBorderColor ? 'solid' : null); + container.style('border-top-color', contrastBorderColor); } private doCreateStatusItem(alignment: StatusbarAlignment, priority: number = 0): HTMLElement { diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index f779df1a858..3873284472d 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -134,17 +134,17 @@ export class ElectronWindow extends Themable { // Find out if folders are dragged and show the appropiate feedback then this.includesFolder(draggedExternalResources).done(includesFolder => { if (includesFolder) { - const hcOutline = this.getColor(activeContrastBorder); + const activeContrastBorderColor = this.getColor(activeContrastBorder); dropOverlay = $(window.document.getElementById(this.partService.getWorkbenchElementId())) .div({ id: 'monaco-workbench-drop-overlay' }) .style({ backgroundColor: this.getColor(EDITOR_DRAG_AND_DROP_BACKGROUND), - outlineColor: hcOutline, - outlineOffset: hcOutline ? '-2px' : null, - outlineStyle: hcOutline ? 'dashed' : null, - outlineWidth: hcOutline ? '2px' : null + outlineColor: activeContrastBorderColor, + outlineOffset: activeContrastBorderColor ? '-2px' : null, + outlineStyle: activeContrastBorderColor ? 'dashed' : null, + outlineWidth: activeContrastBorderColor ? '2px' : null }) .on(DOM.EventType.DROP, (e: DragEvent) => { DOM.EventHelper.stop(e, true); diff --git a/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts b/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts index 2287c14feb2..549480112b9 100644 --- a/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts +++ b/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts @@ -149,10 +149,10 @@ export class DebugActionsWidget extends Themable implements IWorkbenchContributi const widgetShadowColor = this.getColor(widgetShadow); this.$el.style('box-shadow', widgetShadowColor ? `0 5px 8px ${widgetShadowColor}` : null); - const hcBorder = this.getColor(contrastBorder); - this.$el.style('border-style', hcBorder ? 'solid' : null); - this.$el.style('border-width', hcBorder ? '1px' : null); - this.$el.style('border-color', hcBorder); + const contrastBorderColor = this.getColor(contrastBorder); + this.$el.style('border-style', contrastBorderColor ? 'solid' : null); + this.$el.style('border-width', contrastBorderColor ? '1px' : null); + this.$el.style('border-color', contrastBorderColor); } } diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts index 73345e9c66b..eddc26ea885 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts @@ -146,14 +146,14 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { public updateStyles(): void { super.updateStyles(); - const hcBorder = this.getColor(contrastBorder); + const contrastBorderColor = this.getColor(contrastBorder); this.searchBox.style.backgroundColor = this.getColor(inputBackground); this.searchBox.style.color = this.getColor(inputForeground); - this.searchBox.style.borderWidth = hcBorder ? '1px' : null; - this.searchBox.style.borderStyle = hcBorder ? 'solid' : null; - this.searchBox.style.borderColor = hcBorder; + this.searchBox.style.borderWidth = contrastBorderColor ? '1px' : null; + this.searchBox.style.borderStyle = contrastBorderColor ? 'solid' : null; + this.searchBox.style.borderColor = contrastBorderColor; } setVisible(visible: boolean): TPromise { From a7c753cf40169c2361aca65d7a8492794915e5f4 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 May 2017 19:02:52 +0200 Subject: [PATCH 0169/1164] `list.activeSelectionBackground` seems to have no effect for custom themes (fixes #25788) --- src/vs/base/browser/ui/list/listWidget.ts | 2 +- src/vs/base/parts/tree/browser/treeView.ts | 62 ++++++++++++++----- src/vs/platform/theme/common/colorRegistry.ts | 2 +- 3 files changed, 47 insertions(+), 19 deletions(-) diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index 6aac291fb23..29795a31b98 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -812,7 +812,7 @@ export class List implements ISpliceable, IDisposable { } style(styles: IListStyles): void { - let content: string[] = []; + const content: string[] = []; if (styles.listFocusBackground) { content.push(`.monaco-list.${this.idPrefix}:focus .monaco-list-row.focused { background-color: ${styles.listFocusBackground}; }`); diff --git a/src/vs/base/parts/tree/browser/treeView.ts b/src/vs/base/parts/tree/browser/treeView.ts index 5fd3c01a373..5d40c9cd3d6 100644 --- a/src/vs/base/parts/tree/browser/treeView.ts +++ b/src/vs/base/parts/tree/browser/treeView.ts @@ -555,32 +555,60 @@ export class TreeView extends HeightMap { } public applyStyles(styles: _.ITreeStyles): void { + const content: string[] = []; - // Indicate selection/focus via background color - if (!styles.listFocusOutline) { - this.styleElement.innerHTML = ` - .monaco-tree.monaco-tree-instance-${this.instance}.focused .monaco-tree-rows > .monaco-tree-row.focused:not(.highlighted) { background-color: ${styles.listFocusBackground}; } - .monaco-tree.monaco-tree-instance-${this.instance}.focused .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { background-color: ${styles.listActiveSelectionBackground}; color: ${styles.listActiveSelectionForeground}; } - .monaco-tree.monaco-tree-instance-${this.instance}.focused .monaco-tree-rows > .monaco-tree-row.focused.selected:not(.highlighted) { background-color: ${styles.listFocusAndSelectionBackground}; color: ${styles.listFocusAndSelectionForeground}; } - .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { background-color: ${styles.listInactiveSelectionBackground}; color: ${styles.listInactiveSelectionForeground}; } - .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row:hover:not(.highlighted):not(.selected):not(.focused) { background-color: ${styles.listHoverBackground}; } - .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-wrapper.drop-target, - .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row.drop-target { background-color: ${styles.listDropBackground} !important; } - `; + if (styles.listFocusBackground) { + content.push(`.monaco-tree.monaco-tree-instance-${this.instance}.focused .monaco-tree-rows > .monaco-tree-row.focused:not(.highlighted) { background-color: ${styles.listFocusBackground}; }`); } - // Indicate selection/focus via outline - else { - this.styleElement.innerHTML = ` - .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row { background: none !important; border: 1px solid transparent; } + if (styles.listActiveSelectionBackground) { + content.push(`.monaco-tree.monaco-tree-instance-${this.instance}.focused .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { background-color: ${styles.listActiveSelectionBackground}; }`); + } + + if (styles.listActiveSelectionForeground) { + content.push(`.monaco-tree.monaco-tree-instance-${this.instance}.focused .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { color: ${styles.listActiveSelectionForeground}; }`); + } + + if (styles.listFocusAndSelectionBackground) { + content.push(`.monaco-tree.monaco-tree-instance-${this.instance}.focused .monaco-tree-rows > .monaco-tree-row.focused.selected:not(.highlighted) { background-color: ${styles.listFocusAndSelectionBackground}; }`); + } + + if (styles.listFocusAndSelectionForeground) { + content.push(`.monaco-tree.monaco-tree-instance-${this.instance}.focused .monaco-tree-rows > .monaco-tree-row.focused.selected:not(.highlighted) { color: ${styles.listFocusAndSelectionForeground}; }`); + } + + if (styles.listInactiveSelectionBackground) { + content.push(`.monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { background-color: ${styles.listInactiveSelectionBackground}; }`); + } + + if (styles.listInactiveSelectionForeground) { + content.push(`.monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { color: ${styles.listInactiveSelectionForeground}; }`); + } + + if (styles.listHoverBackground) { + content.push(`.monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row:hover:not(.highlighted):not(.selected):not(.focused) { background-color: ${styles.listHoverBackground}; }`); + } + + if (styles.listDropBackground) { + content.push(` + .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-wrapper.drop-target, + .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row.drop-target { background-color: ${styles.listDropBackground} !important; } + `); + } + + if (styles.listFocusOutline) { + content.push(` + .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row { border: 1px solid transparent; } .monaco-tree.monaco-tree-instance-${this.instance}.focused .monaco-tree-rows > .monaco-tree-row.focused:not(.highlighted) { border: 1px dotted ${styles.listFocusOutline}; } .monaco-tree.monaco-tree-instance-${this.instance}.focused .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { border: 1px solid ${styles.listFocusOutline}; } .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { border: 1px solid ${styles.listFocusOutline}; } .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row:hover:not(.highlighted):not(.selected):not(.focused) { border: 1px dashed ${styles.listFocusOutline}; } .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-wrapper.drop-target, - .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row.drop-target { background: none !important; border: 1px dashed ${styles.listFocusOutline}; } - `; + .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row.drop-target { border: 1px dashed ${styles.listFocusOutline}; } + `); } + + this.styleElement.innerHTML = content.join('\n'); } protected createViewItem(item: Model.Item): IViewItem { diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 03dc2d24dda..326e1853797 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -159,7 +159,7 @@ export const selectBorder = registerColor('dropdown.border', { dark: selectBackg export const listFocusBackground = registerColor('list.focusBackground', { dark: '#073655', light: '#DCEBFC', hc: null }, nls.localize('listFocusBackground', "List/Tree background color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); export const listActiveSelectionBackground = registerColor('list.activeSelectionBackground', { dark: '#094771', light: '#3399FF', hc: null }, nls.localize('listActiveSelectionBackground', "List/Tree background color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); export const listInactiveSelectionBackground = registerColor('list.inactiveSelectionBackground', { dark: '#3F3F46', light: '#CCCEDB', hc: null }, nls.localize('listInactiveSelectionBackground', "List/Tree background color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")); -export const listActiveSelectionForeground = registerColor('list.activeSelectionForeground', { dark: Color.white, light: Color.white, hc: Color.white }, nls.localize('listActiveSelectionForeground', "List/Tree foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); +export const listActiveSelectionForeground = registerColor('list.activeSelectionForeground', { dark: Color.white, light: Color.white, hc: null }, nls.localize('listActiveSelectionForeground', "List/Tree foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); export const listInactiveSelectionForeground = registerColor('list.inactiveSelectionForeground', { dark: null, light: null, hc: null }, nls.localize('listInactiveSelectionForeground', "List/Tree foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")); export const listHoverBackground = registerColor('list.hoverBackground', { dark: '#2A2D2E', light: '#F0F0F0', hc: null }, nls.localize('listHoverBackground', "List/Tree background when hovering over items using the mouse.")); export const listDropBackground = registerColor('list.dropBackground', { dark: listFocusBackground, light: listFocusBackground, hc: null }, nls.localize('listDropBackground', "List/Tree drag and drop background when moving items around using the mouse.")); From 46ae36f9eb67dcf9d38c124f66a1e75448ac3512 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 8 May 2017 19:13:36 +0200 Subject: [PATCH 0170/1164] more correct snippet session --- .../contrib/snippet/browser/editorSnippets.ts | 158 +++++++++++++----- .../test/browser/editorSnippets.test.ts | 113 ++++++++++--- 2 files changed, 202 insertions(+), 69 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index 1f6729cc562..5cfe6f303e5 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -6,44 +6,56 @@ 'use strict'; import { getLeadingWhitespace, compare } from 'vs/base/common/strings'; -import { ICommonCodeEditor, TrackedRangeStickiness } from 'vs/editor/common/editorCommon'; +import { ICommonCodeEditor, IModel, TrackedRangeStickiness, IIdentifiedSingleEditOperation } from 'vs/editor/common/editorCommon'; import { EditOperation } from 'vs/editor/common/core/editOperation'; -import { TextmateSnippet, Placeholder } from '../common/snippetParser'; +import { TextmateSnippet, Placeholder, SnippetParser } from '../common/snippetParser'; import { Selection } from 'vs/editor/common/core/selection'; import { Range } from 'vs/editor/common/core/range'; +import { IPosition } from 'vs/editor/common/core/position'; +import { dispose } from 'vs/base/common/lifecycle'; class OneSnippet { private readonly _editor: ICommonCodeEditor; - private readonly _placeholderDecoration = new Map(); - private readonly _placeholderGroups: Placeholder[][]; + private readonly _snippet: TextmateSnippet; + private readonly _offset: number; + private _placeholderDecorations: Map; + private _placeholderGroups: Placeholder[][]; private _placeholderGroupsIdx: number; - constructor(editor: ICommonCodeEditor, selection: Selection, snippet: TextmateSnippet) { - + constructor(editor: ICommonCodeEditor, snippet: TextmateSnippet, offset: number) { this._editor = editor; + this._snippet = snippet; + this._offset = offset; + } - // for each selection get the leading 'reference'-whitespace and adjust the snippet accordingly. - const model = editor.getModel(); - const line = model.getLineContent(selection.startLineNumber); - const leadingWhitespace = getLeadingWhitespace(line, 0, selection.startColumn - 1); - snippet = snippet.withIndentation(whitespace => model.normalizeIndentation(leadingWhitespace + whitespace)); + dispose(): void { + if (this._placeholderDecorations) { + this._editor.changeDecorations(accessor => this._placeholderDecorations.forEach(handle => accessor.removeDecoration(handle))); + } + } - const offset = model.getOffsetAt(selection.getStartPosition()); + private _init(): void { - this._editor.executeEdits('onesnieppt', [EditOperation.replaceMove(selection, snippet.value)]); + if (this._placeholderDecorations) { + // already initialized + return; + } + + this._placeholderDecorations = new Map(); + const model = this._editor.getModel(); // create a decoration (tracked range) for each placeholder this._editor.changeDecorations(accessor => { let lastRange: Range; - for (const placeholder of snippet.getPlaceholders()) { - const placeholderOffset = snippet.offset(placeholder); - const placeholderLen = snippet.len(placeholder); - const start = model.getPositionAt(offset + placeholderOffset); - const end = model.getPositionAt(offset + placeholderOffset + placeholderLen); + for (const placeholder of this._snippet.getPlaceholders()) { + const placeholderOffset = this._snippet.offset(placeholder); + const placeholderLen = this._snippet.len(placeholder); + const start = model.getPositionAt(this._offset + placeholderOffset); + const end = model.getPositionAt(this._offset + placeholderOffset + placeholderLen); const range = new Range(start.lineNumber, start.column, end.lineNumber, end.column); let stickiness: TrackedRangeStickiness; @@ -54,7 +66,7 @@ class OneSnippet { } const handle = accessor.addDecoration(range, { stickiness }); - this._placeholderDecoration.set(placeholder, handle); + this._placeholderDecorations.set(placeholder, handle); lastRange = range; } @@ -63,7 +75,7 @@ class OneSnippet { this._placeholderGroupsIdx = -1; this._placeholderGroups = []; let lastBucket: Placeholder[]; - snippet.getPlaceholders().sort((a, b) => compare(a.name, b.name)).reverse().forEach(a => { + this._snippet.getPlaceholders().sort((a, b) => compare(a.name, b.name)).reverse().forEach(a => { if (!lastBucket || lastBucket[0].name !== a.name) { lastBucket = [a]; this._placeholderGroups.push(lastBucket); @@ -73,47 +85,107 @@ class OneSnippet { }); } - dispose(): void { - this._editor.changeDecorations(accessor => this._placeholderDecoration.forEach(handle => accessor.removeDecoration(handle))); - } + move(fwd: boolean): Selection[] { - next(): Selection[] { - this._placeholderGroupsIdx += 1; - if (this._placeholderGroupsIdx >= this._placeholderGroups.length) { + this._init(); + + if (fwd && this._placeholderGroupsIdx < this._placeholderGroups.length - 1) { + this._placeholderGroupsIdx += 1; + return this._getCurrentPlaceholderSelections(); + + } else if (!fwd && this._placeholderGroupsIdx > 0) { + this._placeholderGroupsIdx -= 1; + return this._getCurrentPlaceholderSelections(); + + } else { return undefined; } - const ranges: Selection[] = []; + } + + + private _getCurrentPlaceholderSelections(): Selection[] { + const selections: Selection[] = []; for (const placeholder of this._placeholderGroups[this._placeholderGroupsIdx]) { - const handle = this._placeholderDecoration.get(placeholder); + const handle = this._placeholderDecorations.get(placeholder); const range = this._editor.getModel().getDecorationRange(handle); - ranges.push(new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn)); + selections.push(new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn)); } - return ranges; + return selections; } } export class SnippetSession { - private readonly _editor: ICommonCodeEditor; - private readonly _snippets: OneSnippet[] = []; + static normalizeWhitespace(model: IModel, position: IPosition, template: string): string { - constructor(editor: ICommonCodeEditor, snippet: TextmateSnippet) { - this._editor = editor; - this._editor.pushUndoStop(); - for (const selection of editor.getSelections()) { - const oneSnippet = new OneSnippet(editor, selection, snippet); - this._snippets.push(oneSnippet); + const line = model.getLineContent(position.lineNumber); + const lineLeadingWhitespace = getLeadingWhitespace(line, 0, position.column - 1); + const templateLines = template.split(/\r\n|\r|\n/); + + for (let i = 0; i < templateLines.length; i++) { + let templateLeadingWhitespace = getLeadingWhitespace(templateLines[i]); + if (templateLeadingWhitespace.length > 0) { + templateLines[i] = model.normalizeIndentation(lineLeadingWhitespace + templateLeadingWhitespace) + templateLines[i].substr(templateLeadingWhitespace.length); + } } - this._editor.pushUndoStop(); - this.next(); + return templateLines.join(model.getEOL()); + } + + private readonly _editor: ICommonCodeEditor; + private readonly _snippets: OneSnippet[]; + + constructor(editor: ICommonCodeEditor, template: string) { + this._editor = editor; + this._snippets = []; + + let delta = 0; + let edits: IIdentifiedSingleEditOperation[] = []; + let model = editor.getModel(); + + for (const selection of editor.getSelections()) { + const start = selection.getStartPosition(); + const adjustedTemplate = SnippetSession.normalizeWhitespace(model, start, template); + + const snippet = SnippetParser.parse(adjustedTemplate); + const offset = model.getOffsetAt(start) + delta; + + edits.push(EditOperation.replaceMove(selection, snippet.value)); + this._snippets.push(new OneSnippet(editor, snippet, offset)); + + delta += snippet.value.length - model.getValueLengthInRange(selection); + } + + // make insert edit and start with first selections + const newSelections = model.pushEditOperations(editor.getSelections(), edits, () => this._move(true)); + this._editor.setSelections(newSelections); } next(): void { + const newSelections = this._move(true); + this._editor.setSelections(newSelections); + } + + prev(): void { + const newSelections = this._move(false); + this._editor.setSelections(newSelections); + } + + private _move(fwd: boolean): Selection[] { const selections: Selection[] = []; for (const snippet of this._snippets) { - const sel = snippet.next(); - selections.push(...sel); + const oneSelection = snippet.move(fwd); + if (!oneSelection) { + if (fwd) { + this.stop(); + } + return this._editor.getSelections(); + } + selections.push(...oneSelection); } - this._editor.setSelections(selections); + return selections; + } + + stop(): void { + dispose(this._snippets); } } diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts index e1c48b7ae75..12db051617f 100644 --- a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts @@ -6,49 +6,110 @@ import * as assert from 'assert'; import { Selection } from 'vs/editor/common/core/selection'; +import { IPosition, Position } from 'vs/editor/common/core/position'; import { SnippetSession } from 'vs/editor/contrib/snippet/browser/editorSnippets'; -import { SnippetParser } from 'vs/editor/contrib/snippet/common/snippetParser'; import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { mockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; +import { Model } from "vs/editor/common/model/model"; - -suite('Editor Contrib - Snippets', () => { +suite('SnippetInsertion', function () { let editor: ICommonCodeEditor; + let model: Model; - setup(() => { - editor = mockCodeEditor([ - 'function foo() {', - '\tconsole.log(a)', - '}' - ], {}); + function assertSelections(editor: ICommonCodeEditor, ...s: Selection[]) { + for (const selection of editor.getSelections()) { + const actual = s.shift(); + assert.ok(selection.equalsSelection(actual), `actual=${selection.toString()} <> expected=${actual.toString()}`); + } + assert.equal(s.length, 0); + } + + setup(function () { + model = Model.createFromString('function foo() {\n console.log(a);\n}'); + editor = mockCodeEditor([], { model }); + editor.setSelections([new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)]); + assert.equal(model.getEOL(), '\n'); }); - teardown(() => { - editor.dispose(); + teardown(function () { + model.dispose(); }); - test('snippets, selections', () => { + test('normalize whitespace', function () { - editor.setSelections([ - new Selection(1, 1, 1, 1), - new Selection(2, 2, 2, 2), - ]); + function assertNormalized(position: IPosition, input: string, expected: string): void { + const actual = SnippetSession.normalizeWhitespace(model, position, input); + assert.equal(actual, expected); + } - const snippet = SnippetParser.parse('foo${1:bar}foo$0'); - const session = new SnippetSession(editor, snippet); + assertNormalized(new Position(1, 1), 'foo', 'foo'); + assertNormalized(new Position(1, 1), 'foo\rbar', 'foo\nbar'); + assertNormalized(new Position(1, 1), 'foo\rbar', 'foo\nbar'); + assertNormalized(new Position(2, 5), 'foo\r\tbar', 'foo\n bar'); + assertNormalized(new Position(2, 3), 'foo\r\tbar', 'foo\n bar'); + }); - assert.equal(editor.getModel().getLineContent(1), 'foobarfoofunction foo() {'); - assert.equal(editor.getModel().getLineContent(2), '\tfoobarfooconsole.log(a)'); + test('text edits & selection', function () { + const session = new SnippetSession(editor, 'foo${1:bar}foo$0'); + assert.equal(editor.getModel().getValue(), 'foobarfoofunction foo() {\n foobarfooconsole.log(a);\n}'); - assert.equal(editor.getSelections().length, 2); - assert.ok(editor.getSelections()[0].equalsSelection(new Selection(1, 4, 1, 7))); - assert.ok(editor.getSelections()[1].equalsSelection(new Selection(2, 5, 2, 8))); + assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); + session.next(); + assertSelections(editor, new Selection(1, 10, 1, 10), new Selection(2, 14, 2, 14)); + }); + + test('snippets, selections and new text with newlines', () => { + + const session = new SnippetSession(editor, 'foo\n\t${1:bar}\n$0'); + + assert.equal(editor.getModel().getValue(), 'foo\n bar\nfunction foo() {\n foo\n bar\nconsole.log(a);\n}'); + + assertSelections(editor, new Selection(2, 5, 2, 8), new Selection(5, 9, 5, 12)); session.next(); - assert.equal(editor.getSelections().length, 2); - assert.ok(editor.getSelections()[0].equalsSelection(new Selection(1, 10, 1, 10))); - assert.ok(editor.getSelections()[1].equalsSelection(new Selection(2, 11, 2, 11))); + assertSelections(editor, new Selection(3, 1, 3, 1), new Selection(6, 1, 6, 1)); + }); + test('snippets, selections -> next/prev', () => { + + const session = new SnippetSession(editor, 'f$2oo${1:bar}foo$0'); + + // @ $2 + assertSelections(editor, new Selection(1, 2, 1, 2), new Selection(2, 6, 2, 6)); + // @ $1 + session.next(); + assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); + // @ $2 + session.prev(); + assertSelections(editor, new Selection(1, 2, 1, 2), new Selection(2, 6, 2, 6)); + // @ $1 + session.next(); + assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); + // @ $0 + session.next(); + assertSelections(editor, new Selection(1, 10, 1, 10), new Selection(2, 14, 2, 14)); + }); + + test('snippest, selections & typing', function () { + const session = new SnippetSession(editor, 'f${2:oo}_$1_$0'); + + editor.trigger('test', 'type', { text: 'X' }); + session.next(); + editor.trigger('test', 'type', { text: 'bar' }); + + // go back to ${2:oo} which is now just 'X' + session.prev(); + assertSelections(editor, new Selection(1, 2, 1, 3), new Selection(2, 6, 2, 7)); + + // go forward to $1 which is now 'bar' + session.next(); + assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); + + // go to final tabstop + session.next(); + assert.equal(model.getValue(), 'fX_bar_function foo() {\n fX_bar_console.log(a);\n}'); + assertSelections(editor, new Selection(1, 8, 1, 8), new Selection(2, 12, 2, 12)); }); }); + From 408ede050d518ccf2d2755ca604e000d4164c9d0 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 May 2017 19:44:35 +0200 Subject: [PATCH 0171/1164] theming - keybindings button and widget --- src/vs/platform/theme/common/styler.ts | 48 +++++++++++-------- .../preferences/browser/keybindingWidgets.ts | 20 ++++++-- .../preferences/browser/media/keybindings.css | 12 ----- .../preferences/browser/media/preferences.css | 2 - .../preferences/browser/preferencesWidgets.ts | 17 +++++-- 5 files changed, 60 insertions(+), 39 deletions(-) diff --git a/src/vs/platform/theme/common/styler.ts b/src/vs/platform/theme/common/styler.ts index 46b5f1bd0fa..ca14730cfd0 100644 --- a/src/vs/platform/theme/common/styler.ts +++ b/src/vs/platform/theme/common/styler.ts @@ -10,11 +10,13 @@ import { inputBackground, inputForeground, ColorIdentifier, selectForeground, se import { IDisposable } from 'vs/base/common/lifecycle'; import { SIDE_BAR_SECTION_HEADER_BACKGROUND } from 'vs/workbench/common/theme'; +export type styleFn = (colors: { [name: string]: ColorIdentifier }) => void; + export interface IThemable { - style(colors: { [name: string]: ColorIdentifier }): void; + style: styleFn; } -export function attachStyler(themeService: IThemeService, widget: IThemable, optionsMapping: { [optionsKey: string]: ColorIdentifier | ColorFunction }): IDisposable { +function doAttachStyler(themeService: IThemeService, optionsMapping: { [optionsKey: string]: ColorIdentifier | ColorFunction }, widgetOrCallback: IThemable | styleFn): IDisposable { function applyStyles(theme: ITheme): void { const styles = Object.create(null); for (let key in optionsMapping) { @@ -26,7 +28,11 @@ export function attachStyler(themeService: IThemeService, widget: IThemable, opt } } - widget.style(styles); + if (typeof widgetOrCallback === 'function') { + widgetOrCallback(styles); + } else { + widgetOrCallback.style(styles); + } } applyStyles(themeService.getTheme()); @@ -35,9 +41,9 @@ export function attachStyler(themeService: IThemeService, widget: IThemable, opt } export function attachCheckboxStyler(widget: IThemable, themeService: IThemeService, style?: { inputActiveOptionBorderColor?: ColorIdentifier }): IDisposable { - return attachStyler(themeService, widget, { + return doAttachStyler(themeService, { inputActiveOptionBorder: (style && style.inputActiveOptionBorderColor) || inputActiveOptionBorder - }); + }, widget); } export function attachInputBoxStyler(widget: IThemable, themeService: IThemeService, style?: @@ -52,7 +58,7 @@ export function attachInputBoxStyler(widget: IThemable, themeService: IThemeServ inputValidationErrorBorder?: ColorIdentifier, inputValidationErrorBackground?: ColorIdentifier }): IDisposable { - return attachStyler(themeService, widget, { + return doAttachStyler(themeService, { inputBackground: (style && style.inputBackground) || inputBackground, inputForeground: (style && style.inputForeground) || inputForeground, inputBorder: (style && style.inputBorder) || inputBorder, @@ -62,15 +68,15 @@ export function attachInputBoxStyler(widget: IThemable, themeService: IThemeServ inputValidationWarningBackground: (style && style.inputValidationWarningBackground) || inputValidationWarningBackground, inputValidationErrorBorder: (style && style.inputValidationErrorBorder) || inputValidationErrorBorder, inputValidationErrorBackground: (style && style.inputValidationErrorBackground) || inputValidationErrorBackground - }); + }, widget); } export function attachSelectBoxStyler(widget: IThemable, themeService: IThemeService, style?: { selectBackground?: ColorIdentifier, selectForeground?: ColorIdentifier, selectBorder?: ColorIdentifier }): IDisposable { - return attachStyler(themeService, widget, { + return doAttachStyler(themeService, { selectBackground: (style && style.selectBackground) || selectBackground, selectForeground: (style && style.selectForeground) || selectForeground, selectBorder: (style && style.selectBorder) || selectBorder - }); + }, widget); } export function attachFindInputBoxStyler(widget: IThemable, themeService: IThemeService, style?: @@ -86,7 +92,7 @@ export function attachFindInputBoxStyler(widget: IThemable, themeService: ITheme inputValidationErrorBorder?: ColorIdentifier, inputValidationErrorBackground?: ColorIdentifier }): IDisposable { - return attachStyler(themeService, widget, { + return doAttachStyler(themeService, { inputBackground: (style && style.inputBackground) || inputBackground, inputForeground: (style && style.inputForeground) || inputForeground, inputBorder: (style && style.inputBorder) || inputBorder, @@ -97,7 +103,7 @@ export function attachFindInputBoxStyler(widget: IThemable, themeService: ITheme inputValidationWarningBackground: (style && style.inputValidationWarningBackground) || inputValidationWarningBackground, inputValidationErrorBorder: (style && style.inputValidationErrorBorder) || inputValidationErrorBorder, inputValidationErrorBackground: (style && style.inputValidationErrorBackground) || inputValidationErrorBackground - }); + }, widget); } export function attachQuickOpenStyler(widget: IThemable, themeService: IThemeService, style?: { @@ -129,7 +135,7 @@ export function attachQuickOpenStyler(widget: IThemable, themeService: IThemeSer listSelectionOutline?: ColorIdentifier, listHoverOutline?: ColorIdentifier }): IDisposable { - return attachStyler(themeService, widget, { + return doAttachStyler(themeService, { foreground: (style && style.foreground) || foreground, background: (style && style.background) || editorBackground, borderColor: style && style.borderColor || contrastBorder, @@ -157,7 +163,7 @@ export function attachQuickOpenStyler(widget: IThemable, themeService: IThemeSer listFocusOutline: (style && style.listFocusOutline) || activeContrastBorder, listSelectionOutline: (style && style.listSelectionOutline) || activeContrastBorder, listHoverOutline: (style && style.listHoverOutline) || activeContrastBorder - }); + }, widget); } export function attachListStyler(widget: IThemable, themeService: IThemeService, style?: { @@ -176,7 +182,7 @@ export function attachListStyler(widget: IThemable, themeService: IThemeService, listSelectionOutline?: ColorIdentifier, listHoverOutline?: ColorIdentifier, }): IDisposable { - return attachStyler(themeService, widget, { + return doAttachStyler(themeService, { listFocusBackground: (style && style.listFocusBackground) || listFocusBackground, listActiveSelectionBackground: (style && style.listActiveSelectionBackground) || lighten(listActiveSelectionBackground, 0.1), listActiveSelectionForeground: (style && style.listActiveSelectionForeground) || listActiveSelectionForeground, @@ -191,20 +197,24 @@ export function attachListStyler(widget: IThemable, themeService: IThemeService, listSelectionOutline: (style && style.listSelectionOutline) || activeContrastBorder, listHoverOutline: (style && style.listHoverOutline) || activeContrastBorder, listInactiveFocusOutline: style && style.listInactiveFocusOutline // not defined by default, only opt-in - }); + }, widget); } export function attachHeaderViewStyler(widget: IThemable, themeService: IThemeService, options?: { noContrastBorder?: boolean }): IDisposable { - return attachStyler(themeService, widget, { + return doAttachStyler(themeService, { headerBackground: SIDE_BAR_SECTION_HEADER_BACKGROUND, headerHighContrastBorder: (options && options.noContrastBorder) ? null : contrastBorder - }); + }, widget); } export function attachButtonStyler(widget: IThemable, themeService: IThemeService, style?: { buttonForeground?: ColorIdentifier, buttonBackground?: ColorIdentifier, buttonHoverBackground?: ColorIdentifier }): IDisposable { - return attachStyler(themeService, widget, { + return doAttachStyler(themeService, { buttonForeground: (style && style.buttonForeground) || buttonForeground, buttonBackground: (style && style.buttonBackground) || buttonBackground, buttonHoverBackground: (style && style.buttonHoverBackground) || buttonHoverBackground - }); + }, widget); +} + +export function attachStylerCallback(themeService: IThemeService, colors: { [name: string]: ColorIdentifier }, callback: styleFn): IDisposable { + return doAttachStyler(themeService, colors, callback); } \ No newline at end of file diff --git a/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts b/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts index ff98e9f5bc5..11a3ea7753a 100644 --- a/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts +++ b/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts @@ -21,8 +21,9 @@ import { Dimension } from 'vs/base/browser/builder'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition } from 'vs/editor/browser/editorBrowser'; -import { attachInputBoxStyler } from 'vs/platform/theme/common/styler'; +import { attachInputBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { editorWidgetBackground, widgetShadow } from "vs/platform/theme/common/colorRegistry"; class KeybindingInputWidget extends Widget { @@ -128,8 +129,11 @@ export class DefineKeybindingWidget extends Widget { private _onHide = this._register(new Emitter()); - constructor(parent: HTMLElement, @IKeybindingService private keybindingService: IKeybindingService, - @IInstantiationService private instantiationService: IInstantiationService + constructor( + parent: HTMLElement, + @IKeybindingService private keybindingService: IKeybindingService, + @IInstantiationService private instantiationService: IInstantiationService, + @IThemeService private themeService: IThemeService ) { super(); this.create(); @@ -186,6 +190,16 @@ export class DefineKeybindingWidget extends Widget { this._domNode.setHeight(DefineKeybindingWidget.HEIGHT); dom.append(this._domNode.domNode, dom.$('.message', null, nls.localize('defineKeybinding.initial', "Press desired key combination and ENTER. ESCAPE to cancel."))); + this._register(attachStylerCallback(this.themeService, { editorWidgetBackground, widgetShadow }, colors => { + this._domNode.domNode.style.backgroundColor = colors.editorWidgetBackground; + + if (colors.widgetShadow) { + this._domNode.domNode.style.boxShadow = `0 2px 8px ${colors.widgetShadow}`; + } else { + this._domNode.domNode.style.boxShadow = null; + } + })); + this._keybindingInputWidget = this._register(this.instantiationService.createInstance(KeybindingInputWidget, this._domNode.domNode, {})); this._register(this._keybindingInputWidget.onKeybinding(keybinding => this.printKeybinding(keybinding))); this._register(this._keybindingInputWidget.onEnter(() => this.hide())); diff --git a/src/vs/workbench/parts/preferences/browser/media/keybindings.css b/src/vs/workbench/parts/preferences/browser/media/keybindings.css index d7dbc15225f..f8f89e185e6 100644 --- a/src/vs/workbench/parts/preferences/browser/media/keybindings.css +++ b/src/vs/workbench/parts/preferences/browser/media/keybindings.css @@ -34,18 +34,6 @@ margin: 0px 4px; } -/* Theming */ -.defineKeybindingWidget { - background-color: #EFEFF2; - box-shadow: 0 2px 8px #A8A8A8; -} - -.hc-black .defineKeybindingWidget, -.vs-dark .defineKeybindingWidget { - background-color: #2D2D30; - box-shadow: 0 2px 8px #000; -} - /* Editor decorations */ .monaco-editor .inlineKeybindingInfo:before { margin: 0.2em 0.1em 0 0.1em; diff --git a/src/vs/workbench/parts/preferences/browser/media/preferences.css b/src/vs/workbench/parts/preferences/browser/media/preferences.css index 1bc95c360d3..d0f783fbcaa 100644 --- a/src/vs/workbench/parts/preferences/browser/media/preferences.css +++ b/src/vs/workbench/parts/preferences/browser/media/preferences.css @@ -238,8 +238,6 @@ } .monaco-editor .floating-click-widget { - background: #007ACC; - color: white; padding: 10px; border-radius: 5px; cursor: pointer; diff --git a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts b/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts index 26e55c992fa..5d7cfc19695 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts @@ -23,10 +23,11 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; import { ActionsOrientation, ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { Action } from 'vs/base/common/actions'; -import { attachInputBoxStyler } from 'vs/platform/theme/common/styler'; +import { attachInputBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Position } from 'vs/editor/common/core/position'; import { ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { buttonBackground, buttonForeground } from "vs/platform/theme/common/colorRegistry"; export class SettingsGroupTitleWidget extends Widget implements IViewZone { @@ -360,10 +361,15 @@ export class FloatingClickWidget extends Widget implements IOverlayWidget { private _onClick: Emitter = this._register(new Emitter()); public onClick: Event = this._onClick.event; - constructor(private editor: ICodeEditor, private label: string, private keyBindingAction: string, - @IKeybindingService keybindingService: IKeybindingService + constructor( + private editor: ICodeEditor, + private label: string, + private keyBindingAction: string, + @IKeybindingService keybindingService: IKeybindingService, + @IThemeService private themeService: IThemeService ) { super(); + if (keyBindingAction) { let keybinding = keybindingService.lookupKeybinding(keyBindingAction); if (keybinding) { @@ -374,6 +380,11 @@ export class FloatingClickWidget extends Widget implements IOverlayWidget { public render() { this._domNode = DOM.$('.floating-click-widget'); + this._register(attachStylerCallback(this.themeService, { buttonBackground, buttonForeground }, colors => { + this._domNode.style.backgroundColor = colors.buttonBackground; + this._domNode.style.color = colors.buttonForeground; + })); + DOM.append(this._domNode, DOM.$('')).textContent = this.label; this.onclick(this._domNode, e => this._onClick.fire()); this.editor.addOverlayWidget(this); From 841d9ae060e81234c97dcccf4d0d24ca2397d7cc Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 May 2017 19:59:14 +0200 Subject: [PATCH 0172/1164] :lipstick: --- .../theme-solarized-dark/themes/solarized-dark-color-theme.json | 1 + .../themes/solarized-light-color-theme.json | 1 + 2 files changed, 2 insertions(+) diff --git a/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json b/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json index 918d9ac9b45..81a5609cfeb 100644 --- a/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json +++ b/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json @@ -303,6 +303,7 @@ "input.background": "#003847", "input.foreground": "#93A1A1", + "input.placeholderForeground": "#93A1A1AA", // "input.border": "", "inputOption.activeBorder": "#2AA19899", diff --git a/extensions/theme-solarized-light/themes/solarized-light-color-theme.json b/extensions/theme-solarized-light/themes/solarized-light-color-theme.json index 7deda4d22e4..4c5ea2d9070 100644 --- a/extensions/theme-solarized-light/themes/solarized-light-color-theme.json +++ b/extensions/theme-solarized-light/themes/solarized-light-color-theme.json @@ -304,6 +304,7 @@ "input.background": "#DDD6C1", // "input.border": "", "input.foreground": "#586E75", + "input.placeholderForeground": "#586E75AA", "inputOption.activeBorder": "#D3AF86", // "inputValidation.infoBorder": "", // "inputValidation.infoBackground": "", From d679ee8d4b8e5ca7433bea0391b8f7a240d0cd20 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Mon, 8 May 2017 11:23:23 -0700 Subject: [PATCH 0173/1164] Fixes #26224 --- .../contrib/suggest/browser/suggestWidget.ts | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 09ac145137c..249559e2d84 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -435,12 +435,14 @@ export class SuggestWidget implements IContentWidget, IDelegate if (backgroundColor) { this.listElement.style.backgroundColor = backgroundColor.toString(); this.details.element.style.backgroundColor = backgroundColor.toString(); + this.messageElement.style.backgroundColor = backgroundColor.toString(); } let borderColor = theme.getColor(editorSuggestWidgetBorder); if (borderColor) { let borderWidth = theme.type === 'hc' ? 2 : 1; this.listElement.style.border = `${borderWidth}px solid ${borderColor}`; this.details.element.style.border = `${borderWidth}px solid ${borderColor}`; + this.messageElement.style.border = `${borderWidth}px solid ${borderColor}`; } } @@ -819,18 +821,28 @@ export class SuggestWidget implements IContentWidget, IDelegate } private adjustWidgetWidth() { + // Reset + removeClass(this.element, 'list-right'); + removeClass(this.element, 'docs-below'); + this.preferredPosition = this.editor.getPosition(); + + // Message element is shown, list and docs are not + if (this.messageElement.style.display !== 'none' + && this.details.element.style.display === 'none' + && this.listElement.style.display === 'none') { + this.element.style.width = `${this.widgetWidthInSmallestEditor}px`; + return; + } + const perColumnWidth = this.editor.getLayoutInfo().contentWidth / this.editor.getLayoutInfo().viewportColumn; const spaceOntheLeft = Math.floor(this.editor.getPosition().column * perColumnWidth) - this.editor.getScrollLeft(); const spaceOntheRight = this.editor.getLayoutInfo().contentWidth - spaceOntheLeft; const scrolledColumns = Math.floor(this.editor.getScrollLeft() / perColumnWidth); - // Reset - this.preferredPosition = this.editor.getPosition(); + // Reset width this.details.element.style.width = `${this.maxDocsWidth}px`; this.element.style.width = `${this.maxWidgetWidth}px`; this.listElement.style.width = `${this.listWidth}px`; - removeClass(this.element, 'list-right'); - removeClass(this.element, 'docs-below'); if (spaceOntheRight > this.maxWidgetWidth) { // There is enough space on the right, so nothing to do here. From 8cc8c3f18ab352a1eef9fc6f7e4dd1a2f44876dd Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 8 May 2017 21:12:24 +0200 Subject: [PATCH 0174/1164] tests for final tab stop --- .../contrib/snippet/browser/editorSnippets.ts | 5 +-- .../contrib/snippet/common/snippetParser.ts | 3 ++ .../test/browser/editorSnippets.test.ts | 32 ++++++++++++++++++- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index 5cfe6f303e5..88e3c0616d1 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -59,7 +59,9 @@ class OneSnippet { const range = new Range(start.lineNumber, start.column, end.lineNumber, end.column); let stickiness: TrackedRangeStickiness; - if (lastRange && lastRange.getEndPosition().equals(range.getStartPosition())) { + if (placeholder.isFinalTabstop) { + stickiness = TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges; + } else if (lastRange && lastRange.getEndPosition().equals(range.getStartPosition())) { stickiness = TrackedRangeStickiness.GrowsOnlyWhenTypingAfter; } else { stickiness = TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges; @@ -102,7 +104,6 @@ class OneSnippet { } } - private _getCurrentPlaceholderSelections(): Selection[] { const selections: Selection[] = []; for (const placeholder of this._placeholderGroups[this._placeholderGroupsIdx]) { diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/common/snippetParser.ts index 2b5c66816ce..11e0b3a809c 100644 --- a/src/vs/editor/contrib/snippet/common/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/common/snippetParser.ts @@ -164,6 +164,9 @@ export class Placeholder extends Marker { constructor(public name: string = '', public defaultValue: Marker[]) { super(); } + get isFinalTabstop() { + return this.name === '0'; + } toString() { return Marker.toString(this.defaultValue); } diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts index 12db051617f..1491c44293c 100644 --- a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts @@ -91,7 +91,7 @@ suite('SnippetInsertion', function () { assertSelections(editor, new Selection(1, 10, 1, 10), new Selection(2, 14, 2, 14)); }); - test('snippest, selections & typing', function () { + test('snippets, selections & typing', function () { const session = new SnippetSession(editor, 'f${2:oo}_$1_$0'); editor.trigger('test', 'type', { text: 'X' }); @@ -111,5 +111,35 @@ suite('SnippetInsertion', function () { assert.equal(model.getValue(), 'fX_bar_function foo() {\n fX_bar_console.log(a);\n}'); assertSelections(editor, new Selection(1, 8, 1, 8), new Selection(2, 12, 2, 12)); }); + + test('snippets, insert into non-empty selection', function () { + model.setValue('foo_bar_foo'); + editor.setSelections([new Selection(1, 1, 1, 4), new Selection(1, 9, 1, 12)]); + + new SnippetSession(editor, 'x$0'); + assert.equal(model.getValue(), 'x_bar_x'); + assertSelections(editor, new Selection(1, 2, 1, 2), new Selection(1, 8, 1, 8)); + }); + + test('snippets, don\'t grow final tabstop', function () { + model.setValue('foo_zzz_foo'); + editor.setSelection(new Selection(1, 5, 1, 8)); + const session = new SnippetSession(editor, '$1bar$0'); + + assertSelections(editor, new Selection(1, 5, 1, 5)); + editor.trigger('test', 'type', { text: 'foo-' }); + + session.next(); + assert.equal(model.getValue(), 'foo_foo-bar_foo'); + assertSelections(editor, new Selection(1, 12, 1, 12)); + + editor.trigger('test', 'type', { text: 'XXX' }); + assert.equal(model.getValue(), 'foo_foo-barXXX_foo'); + session.prev(); + assertSelections(editor, new Selection(1, 5, 1, 9)); + session.next(); + assertSelections(editor, new Selection(1, 15, 1, 15)); + }); + }); From 96fc37f8d84cf8b3ba009da7b6e5df35c5d5530a Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 8 May 2017 21:15:47 +0200 Subject: [PATCH 0175/1164] Theming: Codelense color. Fixes #26105 --- src/vs/editor/common/view/editorColorRegistry.ts | 2 ++ .../editor/contrib/codelens/browser/codelens.css | 6 ------ src/vs/editor/contrib/codelens/browser/codelens.ts | 14 ++++++++++++++ src/vs/platform/theme/common/colorRegistry.ts | 2 +- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/vs/editor/common/view/editorColorRegistry.ts b/src/vs/editor/common/view/editorColorRegistry.ts index 05e930fbb68..6fbc931f441 100644 --- a/src/vs/editor/common/view/editorColorRegistry.ts +++ b/src/vs/editor/common/view/editorColorRegistry.ts @@ -19,6 +19,8 @@ export const editorWhitespaces = registerColor('editorWhitespace.foreground', { export const editorIndentGuides = registerColor('editorIndentGuide.background', { dark: editorWhitespaces, light: editorWhitespaces, hc: editorWhitespaces }, nls.localize('editorIndentGuides', 'Color of the editor indentation guides.')); export const editorLineNumbers = registerColor('editorLineNumber.foreground', { dark: '#5A5A5A', light: '#2B91AF', hc: Color.white }, nls.localize('editorLineNumbers', 'Color of editor line numbers.')); +export const editorCodeLenseForeground = registerColor('editorCodeLense.foreground', { dark: '#999999', light: '#999999', hc: '#999999' }, nls.localize('editorCodeLenseForeground', 'Foreground color of editor code lenses')); + // contains all color rules that used to defined in editor/browser/widget/editor.css registerThemingParticipant((theme, collector) => { diff --git a/src/vs/editor/contrib/codelens/browser/codelens.css b/src/vs/editor/contrib/codelens/browser/codelens.css index 8cd27141065..d1563adc199 100644 --- a/src/vs/editor/contrib/codelens/browser/codelens.css +++ b/src/vs/editor/contrib/codelens/browser/codelens.css @@ -8,7 +8,6 @@ display: inline-block; text-overflow: ellipsis; font-size: 90%; - color: #999999; } .monaco-editor .codelens-decoration > span, @@ -28,11 +27,6 @@ .monaco-editor .codelens-decoration > a:hover { text-decoration: underline; cursor: pointer; - color: blue !important; -} - -.monaco-editor.vs-dark .codelens-decoration > a:hover { - color: #4E94CE !important; } .monaco-editor .codelens-decoration.invisible-cl { diff --git a/src/vs/editor/contrib/codelens/browser/codelens.ts b/src/vs/editor/contrib/codelens/browser/codelens.ts index db424a9ea23..2f1ff9fc521 100644 --- a/src/vs/editor/contrib/codelens/browser/codelens.ts +++ b/src/vs/editor/contrib/codelens/browser/codelens.ts @@ -22,6 +22,9 @@ import * as editorBrowser from 'vs/editor/browser/editorBrowser'; import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; import { ICodeLensData, getCodeLensData } from '../common/codelens'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; +import { editorCodeLenseForeground } from "vs/editor/common/view/editorColorRegistry"; +import { registerThemingParticipant } from "vs/platform/theme/common/themeService"; +import { editorActiveLinkForeground } from "vs/platform/theme/common/colorRegistry"; class CodeLensViewZone implements editorBrowser.IViewZone { @@ -623,3 +626,14 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { }); } } + +registerThemingParticipant((theme, collector) => { + let codeLenseForeground = theme.getColor(editorCodeLenseForeground); + if (codeLenseForeground) { + collector.addRule(`.monaco-editor .codelens-decoration { color: ${codeLenseForeground}; }`); + } + let activeLinkForeground = theme.getColor(editorActiveLinkForeground); + if (activeLinkForeground) { + collector.addRule(`.monaco-editor .codelens-decoration > a:hover { color: ${activeLinkForeground} !important; }`); + } +}); diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 326e1853797..110d70f162a 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -206,7 +206,7 @@ export const editorFindRangeHighlight = registerColor('editor.findRangeHighlight /** * Editor link colors */ -export const editorActiveLinkForeground = registerColor('editorLink.activeForeground', { dark: '#4E94CE', light: Color.black, hc: Color.cyan }, nls.localize('activeLinkForeground', 'Color of active links.')); +export const editorActiveLinkForeground = registerColor('editorLink.activeForeground', { dark: '#4E94CE', light: Color.blue, hc: Color.cyan }, nls.localize('activeLinkForeground', 'Color of active links.')); /** * Find widget From 7e4dc21175d8f123e68ff2b896e4b19a213e56e7 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 8 May 2017 21:22:54 +0200 Subject: [PATCH 0176/1164] [theme] code lens color name fix --- src/vs/editor/common/view/editorColorRegistry.ts | 3 +-- src/vs/editor/contrib/codelens/browser/codelens.ts | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/common/view/editorColorRegistry.ts b/src/vs/editor/common/view/editorColorRegistry.ts index 6fbc931f441..ef72179a5da 100644 --- a/src/vs/editor/common/view/editorColorRegistry.ts +++ b/src/vs/editor/common/view/editorColorRegistry.ts @@ -19,8 +19,7 @@ export const editorWhitespaces = registerColor('editorWhitespace.foreground', { export const editorIndentGuides = registerColor('editorIndentGuide.background', { dark: editorWhitespaces, light: editorWhitespaces, hc: editorWhitespaces }, nls.localize('editorIndentGuides', 'Color of the editor indentation guides.')); export const editorLineNumbers = registerColor('editorLineNumber.foreground', { dark: '#5A5A5A', light: '#2B91AF', hc: Color.white }, nls.localize('editorLineNumbers', 'Color of editor line numbers.')); -export const editorCodeLenseForeground = registerColor('editorCodeLense.foreground', { dark: '#999999', light: '#999999', hc: '#999999' }, nls.localize('editorCodeLenseForeground', 'Foreground color of editor code lenses')); - +export const editorCodeLensForeground = registerColor('editorCodeLens.foreground', { dark: '#999999', light: '#999999', hc: '#999999' }, nls.localize('editorCodeLensForeground', 'Foreground color of editor code lenses')); // contains all color rules that used to defined in editor/browser/widget/editor.css registerThemingParticipant((theme, collector) => { diff --git a/src/vs/editor/contrib/codelens/browser/codelens.ts b/src/vs/editor/contrib/codelens/browser/codelens.ts index 2f1ff9fc521..533f5056835 100644 --- a/src/vs/editor/contrib/codelens/browser/codelens.ts +++ b/src/vs/editor/contrib/codelens/browser/codelens.ts @@ -22,7 +22,7 @@ import * as editorBrowser from 'vs/editor/browser/editorBrowser'; import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; import { ICodeLensData, getCodeLensData } from '../common/codelens'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; -import { editorCodeLenseForeground } from "vs/editor/common/view/editorColorRegistry"; +import { editorCodeLensForeground } from "vs/editor/common/view/editorColorRegistry"; import { registerThemingParticipant } from "vs/platform/theme/common/themeService"; import { editorActiveLinkForeground } from "vs/platform/theme/common/colorRegistry"; @@ -628,9 +628,9 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { } registerThemingParticipant((theme, collector) => { - let codeLenseForeground = theme.getColor(editorCodeLenseForeground); - if (codeLenseForeground) { - collector.addRule(`.monaco-editor .codelens-decoration { color: ${codeLenseForeground}; }`); + let codeLensForeground = theme.getColor(editorCodeLensForeground); + if (codeLensForeground) { + collector.addRule(`.monaco-editor .codelens-decoration { color: ${codeLensForeground}; }`); } let activeLinkForeground = theme.getColor(editorActiveLinkForeground); if (activeLinkForeground) { From a86bfc7e3c51f4e1127607c0521fc788e1849515 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 8 May 2017 21:40:25 +0200 Subject: [PATCH 0177/1164] proper placeholder sorting --- .../contrib/snippet/browser/editorSnippets.ts | 4 ++-- .../contrib/snippet/common/snippetParser.ts | 23 ++++++++++++++++--- .../test/browser/editorSnippets.test.ts | 4 ++-- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index 88e3c0616d1..f0c26cfa1b2 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -5,7 +5,7 @@ 'use strict'; -import { getLeadingWhitespace, compare } from 'vs/base/common/strings'; +import { getLeadingWhitespace } from 'vs/base/common/strings'; import { ICommonCodeEditor, IModel, TrackedRangeStickiness, IIdentifiedSingleEditOperation } from 'vs/editor/common/editorCommon'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { TextmateSnippet, Placeholder, SnippetParser } from '../common/snippetParser'; @@ -77,7 +77,7 @@ class OneSnippet { this._placeholderGroupsIdx = -1; this._placeholderGroups = []; let lastBucket: Placeholder[]; - this._snippet.getPlaceholders().sort((a, b) => compare(a.name, b.name)).reverse().forEach(a => { + this._snippet.getPlaceholders().sort(Placeholder.compare).forEach(a => { if (!lastBucket || lastBucket[0].name !== a.name) { lastBucket = [a]; this._placeholderGroups.push(lastBucket); diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/common/snippetParser.ts index 11e0b3a809c..c073588b085 100644 --- a/src/vs/editor/contrib/snippet/common/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/common/snippetParser.ts @@ -161,18 +161,35 @@ export class Text extends Marker { } export class Placeholder extends Marker { + + static compare(a: Placeholder, b: Placeholder): number { + if (a.name === b.name) { + return 0; + } else if (a.isFinalTabstop) { + return 1; + } else if (b.isFinalTabstop) { + return -1; + } else if (a.name < b.name) { + return -1; + } else if (a.name > b.name) { + return 1; + } else { + return 0; + } + } + constructor(public name: string = '', public defaultValue: Marker[]) { super(); } get isFinalTabstop() { return this.name === '0'; } - toString() { - return Marker.toString(this.defaultValue); - } with(defaultValue: Marker[]): Placeholder { return new Placeholder(this.name, defaultValue); } + toString() { + return Marker.toString(this.defaultValue); + } } export class Variable extends Marker { diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts index 1491c44293c..9d49e4e13d3 100644 --- a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts @@ -73,7 +73,7 @@ suite('SnippetInsertion', function () { test('snippets, selections -> next/prev', () => { - const session = new SnippetSession(editor, 'f$2oo${1:bar}foo$0'); + const session = new SnippetSession(editor, 'f$1oo${2:bar}foo$0'); // @ $2 assertSelections(editor, new Selection(1, 2, 1, 2), new Selection(2, 6, 2, 6)); @@ -92,7 +92,7 @@ suite('SnippetInsertion', function () { }); test('snippets, selections & typing', function () { - const session = new SnippetSession(editor, 'f${2:oo}_$1_$0'); + const session = new SnippetSession(editor, 'f${1:oo}_$2_$0'); editor.trigger('test', 'type', { text: 'X' }); session.next(); From de0303353f03a3e0502b90616d58c12a5a8177e7 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 8 May 2017 22:01:15 +0200 Subject: [PATCH 0178/1164] Theming: Bracket matching colors. Fixes #26104 --- src/vs/editor/common/view/editorColorRegistry.ts | 3 +++ .../bracketMatching/browser/bracketMatching.css | 4 ---- .../bracketMatching/common/bracketMatching.ts | 13 +++++++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/common/view/editorColorRegistry.ts b/src/vs/editor/common/view/editorColorRegistry.ts index ef72179a5da..386852f64f3 100644 --- a/src/vs/editor/common/view/editorColorRegistry.ts +++ b/src/vs/editor/common/view/editorColorRegistry.ts @@ -21,6 +21,9 @@ export const editorLineNumbers = registerColor('editorLineNumber.foreground', { export const editorCodeLensForeground = registerColor('editorCodeLens.foreground', { dark: '#999999', light: '#999999', hc: '#999999' }, nls.localize('editorCodeLensForeground', 'Foreground color of editor code lenses')); +export const editorBracketMatchBackground = registerColor('editorBracketMatch.background', { dark: '#0064001a', light: '#0064001a', hc: '#0064001a' }, nls.localize('editorBracketMatchBackground', 'Background color behind matching brackets')); +export const editorBracketMatchBorder = registerColor('editorBracketMatch.border', { dark: '#888', light: '#B9B9B9', hc: '#fff' }, nls.localize('editorBracketMatchBorder', 'Color for matching brackets boxes')); + // contains all color rules that used to defined in editor/browser/widget/editor.css registerThemingParticipant((theme, collector) => { diff --git a/src/vs/editor/contrib/bracketMatching/browser/bracketMatching.css b/src/vs/editor/contrib/bracketMatching/browser/bracketMatching.css index 161b88a13d9..d0acbab2da4 100644 --- a/src/vs/editor/contrib/bracketMatching/browser/bracketMatching.css +++ b/src/vs/editor/contrib/bracketMatching/browser/bracketMatching.css @@ -4,9 +4,5 @@ *--------------------------------------------------------------------------------------------*/ .monaco-editor .bracket-match { - box-sizing: border-box; background-color: rgba(0, 100, 0, 0.1); } -.monaco-editor.vs .bracket-match { border: 1px solid #B9B9B9; } -.monaco-editor.vs-dark .bracket-match { border: 1px solid #888; } -.monaco-editor.hc-black .bracket-match { border: 1px solid #fff; } diff --git a/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts b/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts index a439d5067f5..909547185f2 100644 --- a/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts +++ b/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts @@ -15,6 +15,8 @@ import * as editorCommon from 'vs/editor/common/editorCommon'; import { editorAction, commonEditorContribution, ServicesAccessor, EditorAction } from 'vs/editor/common/editorCommonExtensions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; +import { registerThemingParticipant } from "vs/platform/theme/common/themeService"; +import { editorBracketMatchBackground, editorBracketMatchBorder } from "vs/editor/common/view/editorColorRegistry"; @editorAction class SelectBracketAction extends EditorAction { @@ -204,3 +206,14 @@ export class BracketMatchingController extends Disposable implements editorCommo this._lastVersionId = versionId; } } + +registerThemingParticipant((theme, collector) => { + let bracketMatchBackground = theme.getColor(editorBracketMatchBackground); + if (bracketMatchBackground) { + collector.addRule(`.monaco-editor .bracket-match { background-color: ${bracketMatchBackground}; }`); + } + let bracketMatchBorder = theme.getColor(editorBracketMatchBorder); + if (bracketMatchBorder) { + collector.addRule(`.monaco-editor .bracket-match { border: 1px solid ${bracketMatchBorder}; }`); + } +}); \ No newline at end of file From c70f9222011b23752a54938221364808fd18216e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 May 2017 13:23:46 -0700 Subject: [PATCH 0179/1164] Add Suggestion Provider For TS Directives (#25806) * Add Suggestion Provider For TS Directives Adds a new completion provider to suggest typescript comment directives, such as `@ts-check` or `@ts-ignore` Fixes #25413 * Add descriptions to snippets --- .../directiveCommentCompletionProvider.ts | 71 +++++++++++++++++++ extensions/typescript/src/typescriptMain.ts | 7 +- 2 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 extensions/typescript/src/features/directiveCommentCompletionProvider.ts diff --git a/extensions/typescript/src/features/directiveCommentCompletionProvider.ts b/extensions/typescript/src/features/directiveCommentCompletionProvider.ts new file mode 100644 index 00000000000..a334e8c2f7b --- /dev/null +++ b/extensions/typescript/src/features/directiveCommentCompletionProvider.ts @@ -0,0 +1,71 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { Position, CompletionItemProvider, CompletionItemKind, TextDocument, CancellationToken, CompletionItem, ProviderResult, Range } from 'vscode'; + +import { ITypescriptServiceClient } from '../typescriptService'; + +import * as nls from 'vscode-nls'; +const localize = nls.loadMessageBundle(); + +interface Directive { + value: string; + description: string; +} + +const directives: Directive[] = [ + { + value: '@ts-check', + description: localize( + 'ts-check', + 'Enables semantic checking in a JavaScript file. Must be at the top of a file.') + }, { + value: '@ts-nocheck', + description: localize( + 'ts-nocheck', + 'Disables semantic checking in a JavaScript file. Must be at the top of a file.') + }, { + value: '@ts-ignore', + description: localize( + 'ts-ignore', + 'Suppresses @ts-check errors on the next line of a file.') + } +]; + +export class DirectiveCommentCompletionProvider implements CompletionItemProvider { + constructor( + private client: ITypescriptServiceClient, + ) { } + + public provideCompletionItems(document: TextDocument, position: Position, _token: CancellationToken): ProviderResult { + if (!this.client.apiVersion.has230Features()) { + return []; + } + + const file = this.client.normalizePath(document.uri); + if (!file) { + return []; + } + + const line = document.lineAt(position.line).text; + const prefix = line.slice(0, position.character); + const match = prefix.match(/^\s*\/\/+\s?(@[a-zA-Z\-]*)?$/); + if (match) { + return directives.map(directive => { + const item = new CompletionItem(directive.value, CompletionItemKind.Snippet); + item.detail = directive.description; + item.range = new Range(position.line, Math.max(0, position.character - match[1].length), position.line, position.character); + return item; + }); + } + return []; + } + + public resolveCompletionItem(item: CompletionItem, _token: CancellationToken) { + return item; + } +} \ No newline at end of file diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index 2b3536bb290..a6e3f4b8912 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -41,6 +41,8 @@ import WorkspaceSymbolProvider from './features/workspaceSymbolProvider'; import CodeActionProvider from './features/codeActionProvider'; import ReferenceCodeLensProvider from './features/referencesCodeLensProvider'; import { JsDocCompletionProvider, TryCompleteJsDocCommand } from './features/jsDocCompletionProvider'; +import { DirectiveCommentCompletionProvider } from './features/directiveCommentCompletionProvider'; + import ImplementationCodeLensProvider from './features/implementationsCodeLensProvider'; import * as BuildStatus from './utils/buildStatus'; @@ -215,6 +217,8 @@ class LanguageProvider { this.completionItemProvider.updateConfiguration(); this.disposables.push(languages.registerCompletionItemProvider(selector, this.completionItemProvider, '.')); + this.disposables.push(languages.registerCompletionItemProvider(selector, new DirectiveCommentCompletionProvider(client), '@')); + this.formattingProvider = new FormattingProvider(client); this.formattingProvider.updateConfiguration(config); this.disposables.push(languages.registerOnTypeFormattingEditProvider(selector, this.formattingProvider, ';', '}', '\n')); @@ -416,7 +420,7 @@ class LanguageProvider { class TypeScriptServiceClientHost implements ITypescriptServiceClientHost { private client: TypeScriptServiceClient; - private languages: LanguageProvider[]; + private languages: LanguageProvider[] = []; private languagePerId: ObjectMap; private readonly disposables: Disposable[] = []; @@ -442,7 +446,6 @@ class TypeScriptServiceClientHost implements ITypescriptServiceClientHost { configFileWatcher.onDidChange(handleProjectChange, this, this.disposables); this.client = new TypeScriptServiceClient(this, storagePath, globalState, workspaceState, this.disposables); - this.languages = []; this.languagePerId = Object.create(null); for (const description of descriptions) { const manager = new LanguageProvider(this.client, description); From 3725e909ca2e16fa75ec6d3e20661be50bc0d7c8 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 8 May 2017 22:30:03 +0200 Subject: [PATCH 0180/1164] Theming: Minimap slider. Fixes #26103 --- .../browser/viewParts/minimap/minimap.css | 34 ------------------- .../browser/viewParts/minimap/minimap.ts | 21 ++++++++++++ 2 files changed, 21 insertions(+), 34 deletions(-) diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.css b/src/vs/editor/browser/viewParts/minimap/minimap.css index 636eee6a6c6..692577e87bd 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.css +++ b/src/vs/editor/browser/viewParts/minimap/minimap.css @@ -13,35 +13,6 @@ .monaco-editor .minimap-slider.active { opacity: 1; } - -.monaco-editor.vs .minimap-slider { - background: rgba(100, 100, 100, .4); -} -.monaco-editor.vs-dark .minimap-slider { - background: rgba(121, 121, 121, .4); -} -.monaco-editor.hc-black .minimap-slider { - background: rgba(111, 195, 223, .6); -} - -.monaco-editor.vs .minimap-slider:hover, -.monaco-editor.vs-dark .minimap-slider:hover { - background: rgba(100, 100, 100, .7); -} -.monaco-editor.hc-black .minimap-slider:hover { - background: rgba(111, 195, 223, .8); -} - -.monaco-editor.vs .minimap-slider.active { - background: rgba(0, 0, 0, .6); -} -.monaco-editor.vs-dark .minimap-slider.active { - background: rgba(191, 191, 191, .4); -} -.monaco-editor.hc-black .minimap-slider.active { - background: rgba(111, 195, 223, 1); -} - .monaco-editor .minimap-shadow-hidden { position: absolute; width: 0; @@ -50,9 +21,4 @@ position: absolute; left: -6px; width: 6px; - box-shadow: #DDD -6px 0 6px -6px inset; -} - -.monaco-editor.vs-dark .minimap-shadow-visible { - box-shadow: #000 -6px 0 6px -6px inset; } diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index a3c3dbae71d..5acccca0454 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -27,6 +27,8 @@ import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { GlobalMouseMoveMonitor, IStandardMouseMoveEventData, standardMouseMoveMerger } from 'vs/base/browser/globalMouseMoveMonitor'; import * as platform from 'vs/base/common/platform'; import { VerticalRevealType } from 'vs/editor/common/controller/cursorEvents'; +import { registerThemingParticipant } from "vs/platform/theme/common/themeService"; +import { scrollbarSliderBackground, scrollbarSliderHoverBackground, scrollbarSliderActiveBackground, scrollbarShadow } from "vs/platform/theme/common/colorRegistry"; const enum RenderMinimap { None = 0, @@ -854,3 +856,22 @@ export class Minimap extends ViewPart { } } } + +registerThemingParticipant((theme, collector) => { + let sliderBackground = theme.getColor(scrollbarSliderBackground); + if (sliderBackground) { + collector.addRule(`.monaco-editor .minimap-slider { background: ${sliderBackground}; }`); + } + let sliderHoverBackground = theme.getColor(scrollbarSliderHoverBackground); + if (sliderHoverBackground) { + collector.addRule(`.monaco-editor .minimap-slider:hover { background: ${sliderHoverBackground}; }`); + } + let sliderActiveBackground = theme.getColor(scrollbarSliderActiveBackground); + if (sliderActiveBackground) { + collector.addRule(`.monaco-editor .minimap-slider.active { background: ${sliderActiveBackground}; }`); + } + let shadow = theme.getColor(scrollbarShadow); + if (shadow) { + collector.addRule(`.monaco-editor .minimap-shadow-visible { box-shadow: ${shadow} -6px 0 6px -6px inset; }`); + } +}); \ No newline at end of file From 9bc4e760757c50bde525e2ec8bec2b9ab2a710e9 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 8 May 2017 22:37:51 +0200 Subject: [PATCH 0181/1164] Capfile isn't displayed as Ruby. Fixes #25939 --- extensions/ruby/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/ruby/package.json b/extensions/ruby/package.json index 18fe222daaf..d5933231e77 100644 --- a/extensions/ruby/package.json +++ b/extensions/ruby/package.json @@ -9,7 +9,7 @@ "languages": [{ "id": "ruby", "extensions": [ ".rb", ".rbx", ".rjs", ".gemspec", ".rake", ".ru", ".erb" ], - "filenames": [ "rakefile", "gemfile", "guardfile", "podfile" ], + "filenames": [ "rakefile", "gemfile", "guardfile", "podfile", "capfile" ], "aliases": [ "Ruby", "rb" ], "firstLine": "^#!/.*\\bruby\\b", "configuration": "./language-configuration.json" From 4aa5aa4e84baa7d07fc1d798428eac35f0b06601 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 8 May 2017 12:00:23 +0200 Subject: [PATCH 0182/1164] Move editor options related code to editorOptions.ts --- src/vs/editor/common/commonCodeEditor.ts | 2 +- .../common/config/commonEditorConfig.ts | 426 +----------- src/vs/editor/common/config/editorOptions.ts | 654 ++++++++++++++++-- .../common/viewLayout/editorLayoutProvider.ts | 154 ----- .../services/decorationRenderOptions.test.ts | 2 +- .../viewLayout/editorLayoutProvider.test.ts | 3 +- 6 files changed, 607 insertions(+), 634 deletions(-) delete mode 100644 src/vs/editor/common/viewLayout/editorLayoutProvider.ts diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index c21b629a895..d7a01189a10 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -191,7 +191,7 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo } public getConfiguration(): editorOptions.InternalEditorOptions { - return this._configuration.editorClone; + return this._configuration.editor; } public getRawConfiguration(): editorOptions.IEditorOptions { diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index fb554283298..dd2c9b9ddb4 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -13,10 +13,7 @@ import { Extensions, IConfigurationRegistry, IConfigurationNode } from 'vs/platf import { Registry } from 'vs/platform/platform'; import { DefaultConfig, DEFAULT_INDENTATION, DEFAULT_TRIM_AUTO_WHITESPACE } from 'vs/editor/common/config/defaultConfig'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import { EditorLayoutProvider } from 'vs/editor/common/viewLayout/editorLayoutProvider'; -import { ScrollbarVisibility } from 'vs/base/common/scrollable'; import { FontInfo, BareFontInfo } from 'vs/editor/common/config/fontInfo'; -import { Constants } from 'vs/editor/common/core/uint'; import { EditorZoom } from 'vs/editor/common/config/editorZoom'; import * as editorOptions from 'vs/editor/common/config/editorOptions'; @@ -76,396 +73,10 @@ export class ConfigurationWithDefaults { } } -class InternalEditorOptionsHelper { - - constructor() { - } - - public static createInternalEditorOptions( - outerWidth: number, - outerHeight: number, - opts: editorOptions.IEditorOptions, - fontInfo: FontInfo, - editorClassName: string, - isDominatedByLongLines: boolean, - lineNumbersDigitCount: number, - canUseTranslate3d: boolean, - pixelRatio: number - ): editorOptions.InternalEditorOptions { - - let stopRenderingLineAfter: number; - if (typeof opts.stopRenderingLineAfter !== 'undefined') { - stopRenderingLineAfter = toInteger(opts.stopRenderingLineAfter, -1); - } else { - stopRenderingLineAfter = 10000; - } - - let scrollbar = this._sanitizeScrollbarOpts(opts.scrollbar, toFloat(opts.mouseWheelScrollSensitivity, 1)); - let minimap = this._sanitizeMinimapOpts(opts.minimap); - - let glyphMargin = toBoolean(opts.glyphMargin); - let lineNumbersMinChars = toInteger(opts.lineNumbersMinChars, 1); - - let lineDecorationsWidth: number; - if (typeof opts.lineDecorationsWidth === 'string' && /^\d+(\.\d+)?ch$/.test(opts.lineDecorationsWidth)) { - let multiple = parseFloat(opts.lineDecorationsWidth.substr(0, opts.lineDecorationsWidth.length - 2)); - lineDecorationsWidth = multiple * fontInfo.typicalHalfwidthCharacterWidth; - } else { - lineDecorationsWidth = toInteger(opts.lineDecorationsWidth, 0); - } - if (opts.folding) { - lineDecorationsWidth += 16; - } - - let renderLineNumbers: boolean; - let renderCustomLineNumbers: (lineNumber: number) => string; - let renderRelativeLineNumbers: boolean; - { - let lineNumbers = opts.lineNumbers; - // Compatibility with old true or false values - if (lineNumbers === true) { - lineNumbers = 'on'; - } else if (lineNumbers === false) { - lineNumbers = 'off'; - } - - if (typeof lineNumbers === 'function') { - renderLineNumbers = true; - renderCustomLineNumbers = lineNumbers; - renderRelativeLineNumbers = false; - } else if (lineNumbers === 'relative') { - renderLineNumbers = true; - renderCustomLineNumbers = null; - renderRelativeLineNumbers = true; - } else if (lineNumbers === 'on') { - renderLineNumbers = true; - renderCustomLineNumbers = null; - renderRelativeLineNumbers = false; - } else { - renderLineNumbers = false; - renderCustomLineNumbers = null; - renderRelativeLineNumbers = false; - } - } - - let layoutInfo = EditorLayoutProvider.compute({ - outerWidth: outerWidth, - outerHeight: outerHeight, - showGlyphMargin: glyphMargin, - lineHeight: fontInfo.lineHeight, - showLineNumbers: renderLineNumbers, - lineNumbersMinChars: lineNumbersMinChars, - lineNumbersDigitCount: lineNumbersDigitCount, - lineDecorationsWidth: lineDecorationsWidth, - typicalHalfwidthCharacterWidth: fontInfo.typicalHalfwidthCharacterWidth, - maxDigitWidth: fontInfo.maxDigitWidth, - verticalScrollbarWidth: scrollbar.verticalScrollbarSize, - horizontalScrollbarHeight: scrollbar.horizontalScrollbarSize, - scrollbarArrowSize: scrollbar.arrowSize, - verticalScrollbarHasArrows: scrollbar.verticalHasArrows, - minimap: minimap.enabled, - minimapRenderCharacters: minimap.renderCharacters, - minimapMaxColumn: minimap.maxColumn, - pixelRatio: pixelRatio - }); - - let bareWrappingInfo: { isWordWrapMinified: boolean; isViewportWrapping: boolean; wrappingColumn: number; } = null; - { - let wordWrap = opts.wordWrap; - let wordWrapColumn = toInteger(opts.wordWrapColumn, 1); - let wordWrapMinified = toBoolean(opts.wordWrapMinified); - - // Compatibility with old true or false values - if (wordWrap === true) { - wordWrap = 'on'; - } else if (wordWrap === false) { - wordWrap = 'off'; - } - - if (wordWrapMinified && isDominatedByLongLines) { - // Force viewport width wrapping if model is dominated by long lines - bareWrappingInfo = { - isWordWrapMinified: true, - isViewportWrapping: true, - wrappingColumn: Math.max(1, layoutInfo.viewportColumn) - }; - } else if (wordWrap === 'on') { - bareWrappingInfo = { - isWordWrapMinified: false, - isViewportWrapping: true, - wrappingColumn: Math.max(1, layoutInfo.viewportColumn) - }; - } else if (wordWrap === 'bounded') { - bareWrappingInfo = { - isWordWrapMinified: false, - isViewportWrapping: true, - wrappingColumn: Math.min(Math.max(1, layoutInfo.viewportColumn), wordWrapColumn) - }; - } else if (wordWrap === 'wordWrapColumn') { - bareWrappingInfo = { - isWordWrapMinified: false, - isViewportWrapping: false, - wrappingColumn: wordWrapColumn - }; - } else { - bareWrappingInfo = { - isWordWrapMinified: false, - isViewportWrapping: false, - wrappingColumn: -1 - }; - } - } - - let wrappingInfo = new editorOptions.EditorWrappingInfo({ - inDiffEditor: Boolean(opts.inDiffEditor), - isDominatedByLongLines: isDominatedByLongLines, - isWordWrapMinified: bareWrappingInfo.isWordWrapMinified, - isViewportWrapping: bareWrappingInfo.isViewportWrapping, - wrappingColumn: bareWrappingInfo.wrappingColumn, - wrappingIndent: wrappingIndentFromString(opts.wrappingIndent), - wordWrapBreakBeforeCharacters: String(opts.wordWrapBreakBeforeCharacters), - wordWrapBreakAfterCharacters: String(opts.wordWrapBreakAfterCharacters), - wordWrapBreakObtrusiveCharacters: String(opts.wordWrapBreakObtrusiveCharacters), - }); - - let readOnly = toBoolean(opts.readOnly); - - let tabFocusMode = TabFocus.getTabFocusMode(); - if (readOnly) { - tabFocusMode = true; - } - - - let renderWhitespace = opts.renderWhitespace; - // Compatibility with old true or false values - if (renderWhitespace === true) { - renderWhitespace = 'boundary'; - } else if (renderWhitespace === false) { - renderWhitespace = 'none'; - } - - let renderLineHighlight = opts.renderLineHighlight; - // Compatibility with old true or false values - if (renderLineHighlight === true) { - renderLineHighlight = 'line'; - } else if (renderLineHighlight === false) { - renderLineHighlight = 'none'; - } - - let viewInfo = new editorOptions.InternalEditorViewOptions({ - theme: opts.theme, - canUseTranslate3d: canUseTranslate3d, - disableMonospaceOptimizations: (toBoolean(opts.disableMonospaceOptimizations) || toBoolean(opts.fontLigatures)), - experimentalScreenReader: toBoolean(opts.experimentalScreenReader), - rulers: toSortedIntegerArray(opts.rulers), - ariaLabel: String(opts.ariaLabel), - renderLineNumbers: renderLineNumbers, - renderCustomLineNumbers: renderCustomLineNumbers, - renderRelativeLineNumbers: renderRelativeLineNumbers, - selectOnLineNumbers: toBoolean(opts.selectOnLineNumbers), - glyphMargin: glyphMargin, - revealHorizontalRightPadding: toInteger(opts.revealHorizontalRightPadding, 0), - roundedSelection: toBoolean(opts.roundedSelection), - overviewRulerLanes: toInteger(opts.overviewRulerLanes, 0, 3), - overviewRulerBorder: toBoolean(opts.overviewRulerBorder), - cursorBlinking: cursorBlinkingStyleFromString(opts.cursorBlinking), - mouseWheelZoom: toBoolean(opts.mouseWheelZoom), - cursorStyle: cursorStyleFromString(opts.cursorStyle), - hideCursorInOverviewRuler: toBoolean(opts.hideCursorInOverviewRuler), - scrollBeyondLastLine: toBoolean(opts.scrollBeyondLastLine), - editorClassName: editorClassName, - stopRenderingLineAfter: stopRenderingLineAfter, - renderWhitespace: renderWhitespace, - renderControlCharacters: toBoolean(opts.renderControlCharacters), - fontLigatures: toBoolean(opts.fontLigatures), - renderIndentGuides: toBoolean(opts.renderIndentGuides), - renderLineHighlight: renderLineHighlight, - scrollbar: scrollbar, - minimap: minimap, - fixedOverflowWidgets: toBoolean(opts.fixedOverflowWidgets) - }); - - let contribInfo = new editorOptions.EditorContribOptions({ - selectionClipboard: toBoolean(opts.selectionClipboard), - hover: toBoolean(opts.hover), - contextmenu: toBoolean(opts.contextmenu), - quickSuggestions: typeof opts.quickSuggestions === 'object' ? { other: true, ...opts.quickSuggestions } : toBoolean(opts.quickSuggestions), - quickSuggestionsDelay: toInteger(opts.quickSuggestionsDelay), - parameterHints: toBoolean(opts.parameterHints), - iconsInSuggestions: toBoolean(opts.iconsInSuggestions), - formatOnType: toBoolean(opts.formatOnType), - formatOnPaste: toBoolean(opts.formatOnPaste), - suggestOnTriggerCharacters: toBoolean(opts.suggestOnTriggerCharacters), - acceptSuggestionOnEnter: toBoolean(opts.acceptSuggestionOnEnter), - acceptSuggestionOnCommitCharacter: toBoolean(opts.acceptSuggestionOnCommitCharacter), - snippetSuggestions: opts.snippetSuggestions, - emptySelectionClipboard: opts.emptySelectionClipboard, - wordBasedSuggestions: opts.wordBasedSuggestions, - suggestFontSize: opts.suggestFontSize, - suggestLineHeight: opts.suggestLineHeight, - selectionHighlight: toBoolean(opts.selectionHighlight), - occurrencesHighlight: toBoolean(opts.occurrencesHighlight), - codeLens: opts.referenceInfos && opts.codeLens, - folding: toBoolean(opts.folding), - hideFoldIcons: toBoolean(opts.hideFoldIcons), - matchBrackets: toBoolean(opts.matchBrackets), - }); - - return new editorOptions.InternalEditorOptions({ - lineHeight: fontInfo.lineHeight, // todo -> duplicated in styling - readOnly: readOnly, - wordSeparators: String(opts.wordSeparators), - autoClosingBrackets: toBoolean(opts.autoClosingBrackets), - useTabStops: toBoolean(opts.useTabStops), - tabFocusMode: tabFocusMode, - dragAndDrop: toBoolean(opts.dragAndDrop), - layoutInfo: layoutInfo, - fontInfo: fontInfo, - viewInfo: viewInfo, - wrappingInfo: wrappingInfo, - contribInfo: contribInfo, - }); - } - - private static _sanitizeScrollbarOpts(raw: editorOptions.IEditorScrollbarOptions, mouseWheelScrollSensitivity: number): editorOptions.InternalEditorScrollbarOptions { - - let visibilityFromString = (visibility: string) => { - switch (visibility) { - case 'hidden': - return ScrollbarVisibility.Hidden; - case 'visible': - return ScrollbarVisibility.Visible; - default: - return ScrollbarVisibility.Auto; - } - }; - - let horizontalScrollbarSize = toIntegerWithDefault(raw.horizontalScrollbarSize, 10); - let verticalScrollbarSize = toIntegerWithDefault(raw.verticalScrollbarSize, 14); - return new editorOptions.InternalEditorScrollbarOptions({ - vertical: visibilityFromString(raw.vertical), - horizontal: visibilityFromString(raw.horizontal), - - arrowSize: toIntegerWithDefault(raw.arrowSize, 11), - useShadows: toBooleanWithDefault(raw.useShadows, true), - - verticalHasArrows: toBooleanWithDefault(raw.verticalHasArrows, false), - horizontalHasArrows: toBooleanWithDefault(raw.horizontalHasArrows, false), - - horizontalScrollbarSize: horizontalScrollbarSize, - horizontalSliderSize: toIntegerWithDefault(raw.horizontalSliderSize, horizontalScrollbarSize), - - verticalScrollbarSize: verticalScrollbarSize, - verticalSliderSize: toIntegerWithDefault(raw.verticalSliderSize, verticalScrollbarSize), - - handleMouseWheel: toBooleanWithDefault(raw.handleMouseWheel, true), - mouseWheelScrollSensitivity: mouseWheelScrollSensitivity - }); - } - - private static _sanitizeMinimapOpts(raw: editorOptions.IEditorMinimapOptions): editorOptions.InternalEditorMinimapOptions { - let maxColumn = toIntegerWithDefault(raw.maxColumn, DefaultConfig.editor.minimap.maxColumn); - if (maxColumn < 1) { - maxColumn = 1; - } - return new editorOptions.InternalEditorMinimapOptions({ - enabled: toBooleanWithDefault(raw.enabled, DefaultConfig.editor.minimap.enabled), - renderCharacters: toBooleanWithDefault(raw.renderCharacters, DefaultConfig.editor.minimap.renderCharacters), - maxColumn: maxColumn, - }); - } -} - function toBoolean(value: any): boolean { return value === 'false' ? false : Boolean(value); } -function toBooleanWithDefault(value: any, defaultValue: boolean): boolean { - if (typeof value === 'undefined') { - return defaultValue; - } - return toBoolean(value); -} - -function toFloat(source: any, defaultValue: number): number { - let r = parseFloat(source); - if (isNaN(r)) { - r = defaultValue; - } - return r; -} - -function toInteger(source: any, minimum: number = Constants.MIN_SAFE_SMALL_INTEGER, maximum: number = Constants.MAX_SAFE_SMALL_INTEGER): number { - let r = parseInt(source, 10); - if (isNaN(r)) { - r = 0; - } - r = Math.max(minimum, r); - r = Math.min(maximum, r); - return r | 0; -} - -function toSortedIntegerArray(source: any): number[] { - if (!Array.isArray(source)) { - return []; - } - let arrSource = source; - let r = arrSource.map(el => toInteger(el)); - r.sort(); - return r; -} - -function wrappingIndentFromString(wrappingIndent: string): editorOptions.WrappingIndent { - if (wrappingIndent === 'indent') { - return editorOptions.WrappingIndent.Indent; - } else if (wrappingIndent === 'same') { - return editorOptions.WrappingIndent.Same; - } else { - return editorOptions.WrappingIndent.None; - } -} - -function cursorStyleFromString(cursorStyle: string): editorOptions.TextEditorCursorStyle { - if (cursorStyle === 'line') { - return editorOptions.TextEditorCursorStyle.Line; - } else if (cursorStyle === 'block') { - return editorOptions.TextEditorCursorStyle.Block; - } else if (cursorStyle === 'underline') { - return editorOptions.TextEditorCursorStyle.Underline; - } else if (cursorStyle === 'line-thin') { - return editorOptions.TextEditorCursorStyle.LineThin; - } else if (cursorStyle === 'block-outline') { - return editorOptions.TextEditorCursorStyle.BlockOutline; - } else if (cursorStyle === 'underline-thin') { - return editorOptions.TextEditorCursorStyle.UnderlineThin; - } - return editorOptions.TextEditorCursorStyle.Line; -} - -function cursorBlinkingStyleFromString(cursorBlinkingStyle: string): editorOptions.TextEditorCursorBlinkingStyle { - switch (cursorBlinkingStyle) { - case 'blink': - return editorOptions.TextEditorCursorBlinkingStyle.Blink; - case 'smooth': - return editorOptions.TextEditorCursorBlinkingStyle.Smooth; - case 'phase': - return editorOptions.TextEditorCursorBlinkingStyle.Phase; - case 'expand': - return editorOptions.TextEditorCursorBlinkingStyle.Expand; - case 'visible': // maintain compatibility - case 'solid': - return editorOptions.TextEditorCursorBlinkingStyle.Solid; - } - return editorOptions.TextEditorCursorBlinkingStyle.Blink; -} - -function toIntegerWithDefault(source: any, defaultValue: number): number { - if (typeof source === 'undefined') { - return defaultValue; - } - return toInteger(source); -} - export interface IElementSizeObserver { startObserving(): void; observe(dimension?: editorCommon.IDimension): void; @@ -477,7 +88,6 @@ export interface IElementSizeObserver { export abstract class CommonEditorConfiguration extends Disposable implements editorCommon.IConfiguration { public editor: editorOptions.InternalEditorOptions; - public editorClone: editorOptions.InternalEditorOptions; protected _configWithDefaults: ConfigurationWithDefaults; protected _elementSizeObserver: IElementSizeObserver; @@ -494,7 +104,6 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed this._isDominatedByLongLines = false; this._lineNumbersDigitCount = 1; this.editor = this._computeInternalOptions(); - this.editorClone = this.editor.clone(); this._register(EditorZoom.onDidChangeZoomLevel(_ => this._recomputeOptions())); this._register(TabFocus.onDidChangeTabFocus(_ => this._recomputeOptions())); } @@ -514,7 +123,6 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed let changeEvent = this.editor.createChangeEvent(newOptions); this.editor = newOptions; - this.editorClone = this.editor.clone(); this._onDidChange.fire(changeEvent); } @@ -527,25 +135,21 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed let editorClassName = this._getEditorClassName(opts.theme, toBoolean(opts.fontLigatures), opts.mouseStyle); - let disableTranslate3d = toBoolean(opts.disableTranslate3d); - let canUseTranslate3d = this._getCanUseTranslate3d(); - if (disableTranslate3d) { - canUseTranslate3d = false; - } - let bareFontInfo = BareFontInfo.createFromRawSettings(opts, this.getZoomLevel()); - return InternalEditorOptionsHelper.createInternalEditorOptions( - this.getOuterWidth(), - this.getOuterHeight(), - opts, - this.readConfiguration(bareFontInfo), - editorClassName, - this._isDominatedByLongLines, - this._lineNumbersDigitCount, - canUseTranslate3d, - this._getPixelRatio() - ); + const env = new editorOptions.EnvironmentalOptions({ + outerWidth: this.getOuterWidth(), + outerHeight: this.getOuterHeight(), + fontInfo: this.readConfiguration(bareFontInfo), + editorClassName: editorClassName, + isDominatedByLongLines: this._isDominatedByLongLines, + lineNumbersDigitCount: this._lineNumbersDigitCount, + canUseTranslate3d: this._getCanUseTranslate3d(), + pixelRatio: this._getPixelRatio(), + tabFocusMode: TabFocus.getTabFocusMode() + }); + + return editorOptions.InternalEditorOptionsFactory.createInternalEditorOptions(env, opts); } public updateOptions(newOptions: editorOptions.IEditorOptions): void { @@ -559,7 +163,7 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed } public setMaxLineNumber(maxLineNumber: number): void { - let digitCount = CommonEditorConfiguration.digitCount(maxLineNumber); + let digitCount = CommonEditorConfiguration._digitCount(maxLineNumber); if (this._lineNumbersDigitCount === digitCount) { return; } @@ -567,7 +171,7 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed this._recomputeOptions(); } - private static digitCount(n: number): number { + private static _digitCount(n: number): number { var r = 0; while (n) { n = Math.floor(n / 10); diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index cb25845017a..384fe753722 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -6,7 +6,8 @@ import { ScrollbarVisibility } from 'vs/base/common/scrollable'; import { FontInfo } from 'vs/editor/common/config/fontInfo'; -import * as objects from 'vs/base/common/objects'; +import { Constants } from 'vs/editor/common/core/uint'; +import { DefaultConfig } from "vs/editor/common/config/defaultConfig"; /** * Configuration options for editor scrollbars @@ -676,13 +677,6 @@ export class InternalEditorScrollbarOptions { && this.mouseWheelScrollSensitivity === other.mouseWheelScrollSensitivity ); } - - /** - * @internal - */ - public clone(): InternalEditorScrollbarOptions { - return new InternalEditorScrollbarOptions(this); - } } export class InternalEditorMinimapOptions { @@ -715,13 +709,6 @@ export class InternalEditorMinimapOptions { && this.maxColumn === other.maxColumn ); } - - /** - * @internal - */ - public clone(): InternalEditorMinimapOptions { - return new InternalEditorMinimapOptions(this); - } } export class EditorWrappingInfo { @@ -778,13 +765,6 @@ export class EditorWrappingInfo { && this.wordWrapBreakObtrusiveCharacters === other.wordWrapBreakObtrusiveCharacters ); } - - /** - * @internal - */ - public clone(): EditorWrappingInfo { - return new EditorWrappingInfo(this); - } } export class InternalEditorViewOptions { @@ -883,8 +863,8 @@ export class InternalEditorViewOptions { this.fontLigatures = Boolean(source.fontLigatures); this.renderIndentGuides = Boolean(source.renderIndentGuides); this.renderLineHighlight = source.renderLineHighlight; - this.scrollbar = source.scrollbar.clone(); - this.minimap = source.minimap.clone(); + this.scrollbar = source.scrollbar; + this.minimap = source.minimap; this.fixedOverflowWidgets = Boolean(source.fixedOverflowWidgets); } @@ -991,13 +971,6 @@ export class InternalEditorViewOptions { fixedOverflowWidgets: this.fixedOverflowWidgets !== newOpts.fixedOverflowWidgets }; } - - /** - * @internal - */ - public clone(): InternalEditorViewOptions { - return new InternalEditorViewOptions(this); - } } export class EditorContribOptions { @@ -1086,7 +1059,7 @@ export class EditorContribOptions { this.selectionClipboard === other.selectionClipboard && this.hover === other.hover && this.contextmenu === other.contextmenu - && objects.equals(this.quickSuggestions, other.quickSuggestions) + && EditorContribOptions._quickSuggestionsEquals(this.quickSuggestions, other.quickSuggestions) && this.quickSuggestionsDelay === other.quickSuggestionsDelay && this.parameterHints === other.parameterHints && this.iconsInSuggestions === other.iconsInSuggestions @@ -1097,7 +1070,7 @@ export class EditorContribOptions { && this.acceptSuggestionOnCommitCharacter === other.acceptSuggestionOnCommitCharacter && this.snippetSuggestions === other.snippetSuggestions && this.emptySelectionClipboard === other.emptySelectionClipboard - && objects.equals(this.wordBasedSuggestions, other.wordBasedSuggestions) + && this.wordBasedSuggestions === other.wordBasedSuggestions && this.suggestFontSize === other.suggestFontSize && this.suggestLineHeight === other.suggestLineHeight && this.selectionHighlight === other.selectionHighlight @@ -1109,11 +1082,21 @@ export class EditorContribOptions { ); } - /** - * @internal - */ - public clone(): EditorContribOptions { - return new EditorContribOptions(this); + private static _quickSuggestionsEquals(a: boolean | { other: boolean, comments: boolean, strings: boolean }, b: boolean | { other: boolean, comments: boolean, strings: boolean }): boolean { + if (typeof a === 'boolean') { + if (typeof b !== 'boolean') { + return false; + } + return a === b; + } + if (typeof b === 'boolean') { + return false; + } + return ( + a.comments === b.comments + && a.other === b.other + && a.strings === b.strings + ); } } @@ -1163,11 +1146,11 @@ export class InternalEditorOptions { this.useTabStops = Boolean(source.useTabStops); this.tabFocusMode = Boolean(source.tabFocusMode); this.dragAndDrop = Boolean(source.dragAndDrop); - this.layoutInfo = source.layoutInfo.clone(); - this.fontInfo = source.fontInfo.clone(); - this.viewInfo = source.viewInfo.clone(); - this.wrappingInfo = source.wrappingInfo.clone(); - this.contribInfo = source.contribInfo.clone(); + this.layoutInfo = source.layoutInfo; + this.fontInfo = source.fontInfo; + this.viewInfo = source.viewInfo; + this.wrappingInfo = source.wrappingInfo; + this.contribInfo = source.contribInfo; } /** @@ -1209,13 +1192,6 @@ export class InternalEditorOptions { contribInfo: (!this.contribInfo.equals(newOpts.contribInfo)), }; } - - /** - * @internal - */ - public clone(): InternalEditorOptions { - return new InternalEditorOptions(this); - } } /** @@ -1267,13 +1243,6 @@ export class OverviewRulerPosition { && this.right === other.right ); } - - /** - * @internal - */ - public clone(): OverviewRulerPosition { - return new OverviewRulerPosition(this); - } } /** @@ -1416,7 +1385,7 @@ export class EditorLayoutInfo { this.viewportColumn = source.viewportColumn | 0; this.verticalScrollbarWidth = source.verticalScrollbarWidth | 0; this.horizontalScrollbarHeight = source.horizontalScrollbarHeight | 0; - this.overviewRuler = source.overviewRuler.clone(); + this.overviewRuler = source.overviewRuler; } /** @@ -1446,13 +1415,6 @@ export class EditorLayoutInfo { && this.overviewRuler.equals(other.overviewRuler) ); } - - /** - * @internal - */ - public clone(): EditorLayoutInfo { - return new EditorLayoutInfo(this); - } } export interface IViewConfigurationChangedEvent { @@ -1505,3 +1467,565 @@ export interface IConfigurationChangedEvent { readonly wrappingInfo: boolean; readonly contribInfo: boolean; } + +/** + * @internal + */ +export class EnvironmentalOptions { + + public readonly outerWidth: number; + public readonly outerHeight: number; + public readonly fontInfo: FontInfo; + public readonly editorClassName: string; + public readonly isDominatedByLongLines: boolean; + public readonly lineNumbersDigitCount: number; + public readonly canUseTranslate3d: boolean; + public readonly pixelRatio: number; + public readonly tabFocusMode: boolean; + + constructor(opts: { + outerWidth: number; + outerHeight: number; + fontInfo: FontInfo; + editorClassName: string; + isDominatedByLongLines: boolean; + lineNumbersDigitCount: number; + canUseTranslate3d: boolean; + pixelRatio: number; + tabFocusMode: boolean; + }) { + this.outerWidth = opts.outerWidth; + this.outerHeight = opts.outerHeight; + this.fontInfo = opts.fontInfo; + this.editorClassName = opts.editorClassName; + this.isDominatedByLongLines = opts.isDominatedByLongLines; + this.lineNumbersDigitCount = opts.lineNumbersDigitCount; + this.canUseTranslate3d = opts.canUseTranslate3d; + this.pixelRatio = opts.pixelRatio; + this.tabFocusMode = opts.tabFocusMode; + } +} + +/** + * @internal + */ +export class InternalEditorOptionsFactory { + + public static createInternalEditorOptions(env: EnvironmentalOptions, opts: IEditorOptions) { + + let stopRenderingLineAfter: number; + if (typeof opts.stopRenderingLineAfter !== 'undefined') { + stopRenderingLineAfter = this._toInteger(opts.stopRenderingLineAfter, -1); + } else { + stopRenderingLineAfter = 10000; + } + + const scrollbar = this._sanitizeScrollbarOpts(opts.scrollbar, this._toFloat(opts.mouseWheelScrollSensitivity, 1)); + const minimap = this._sanitizeMinimapOpts(opts.minimap); + + const glyphMargin = this._toBoolean(opts.glyphMargin); + const lineNumbersMinChars = this._toInteger(opts.lineNumbersMinChars, 1); + + let lineDecorationsWidth: number; + if (typeof opts.lineDecorationsWidth === 'string' && /^\d+(\.\d+)?ch$/.test(opts.lineDecorationsWidth)) { + const multiple = parseFloat(opts.lineDecorationsWidth.substr(0, opts.lineDecorationsWidth.length - 2)); + lineDecorationsWidth = multiple * env.fontInfo.typicalHalfwidthCharacterWidth; + } else { + lineDecorationsWidth = this._toInteger(opts.lineDecorationsWidth, 0); + } + if (opts.folding) { + lineDecorationsWidth += 16; + } + + let renderLineNumbers: boolean; + let renderCustomLineNumbers: (lineNumber: number) => string; + let renderRelativeLineNumbers: boolean; + { + let lineNumbers = opts.lineNumbers; + // Compatibility with old true or false values + if (lineNumbers === true) { + lineNumbers = 'on'; + } else if (lineNumbers === false) { + lineNumbers = 'off'; + } + + if (typeof lineNumbers === 'function') { + renderLineNumbers = true; + renderCustomLineNumbers = lineNumbers; + renderRelativeLineNumbers = false; + } else if (lineNumbers === 'relative') { + renderLineNumbers = true; + renderCustomLineNumbers = null; + renderRelativeLineNumbers = true; + } else if (lineNumbers === 'on') { + renderLineNumbers = true; + renderCustomLineNumbers = null; + renderRelativeLineNumbers = false; + } else { + renderLineNumbers = false; + renderCustomLineNumbers = null; + renderRelativeLineNumbers = false; + } + } + + const layoutInfo = EditorLayoutProvider.compute({ + outerWidth: env.outerWidth, + outerHeight: env.outerHeight, + showGlyphMargin: glyphMargin, + lineHeight: env.fontInfo.lineHeight, + showLineNumbers: renderLineNumbers, + lineNumbersMinChars: lineNumbersMinChars, + lineNumbersDigitCount: env.lineNumbersDigitCount, + lineDecorationsWidth: lineDecorationsWidth, + typicalHalfwidthCharacterWidth: env.fontInfo.typicalHalfwidthCharacterWidth, + maxDigitWidth: env.fontInfo.maxDigitWidth, + verticalScrollbarWidth: scrollbar.verticalScrollbarSize, + horizontalScrollbarHeight: scrollbar.horizontalScrollbarSize, + scrollbarArrowSize: scrollbar.arrowSize, + verticalScrollbarHasArrows: scrollbar.verticalHasArrows, + minimap: minimap.enabled, + minimapRenderCharacters: minimap.renderCharacters, + minimapMaxColumn: minimap.maxColumn, + pixelRatio: env.pixelRatio + }); + + let bareWrappingInfo: { isWordWrapMinified: boolean; isViewportWrapping: boolean; wrappingColumn: number; } = null; + { + let wordWrap = opts.wordWrap; + const wordWrapColumn = this._toInteger(opts.wordWrapColumn, 1); + const wordWrapMinified = this._toBoolean(opts.wordWrapMinified); + + // Compatibility with old true or false values + if (wordWrap === true) { + wordWrap = 'on'; + } else if (wordWrap === false) { + wordWrap = 'off'; + } + + if (wordWrapMinified && env.isDominatedByLongLines) { + // Force viewport width wrapping if model is dominated by long lines + bareWrappingInfo = { + isWordWrapMinified: true, + isViewportWrapping: true, + wrappingColumn: Math.max(1, layoutInfo.viewportColumn) + }; + } else if (wordWrap === 'on') { + bareWrappingInfo = { + isWordWrapMinified: false, + isViewportWrapping: true, + wrappingColumn: Math.max(1, layoutInfo.viewportColumn) + }; + } else if (wordWrap === 'bounded') { + bareWrappingInfo = { + isWordWrapMinified: false, + isViewportWrapping: true, + wrappingColumn: Math.min(Math.max(1, layoutInfo.viewportColumn), wordWrapColumn) + }; + } else if (wordWrap === 'wordWrapColumn') { + bareWrappingInfo = { + isWordWrapMinified: false, + isViewportWrapping: false, + wrappingColumn: wordWrapColumn + }; + } else { + bareWrappingInfo = { + isWordWrapMinified: false, + isViewportWrapping: false, + wrappingColumn: -1 + }; + } + } + + const wrappingInfo = new EditorWrappingInfo({ + inDiffEditor: Boolean(opts.inDiffEditor), + isDominatedByLongLines: env.isDominatedByLongLines, + isWordWrapMinified: bareWrappingInfo.isWordWrapMinified, + isViewportWrapping: bareWrappingInfo.isViewportWrapping, + wrappingColumn: bareWrappingInfo.wrappingColumn, + wrappingIndent: this._wrappingIndentFromString(opts.wrappingIndent), + wordWrapBreakBeforeCharacters: String(opts.wordWrapBreakBeforeCharacters), + wordWrapBreakAfterCharacters: String(opts.wordWrapBreakAfterCharacters), + wordWrapBreakObtrusiveCharacters: String(opts.wordWrapBreakObtrusiveCharacters), + }); + + const readOnly = this._toBoolean(opts.readOnly); + + let renderWhitespace = opts.renderWhitespace; + // Compatibility with old true or false values + if (renderWhitespace === true) { + renderWhitespace = 'boundary'; + } else if (renderWhitespace === false) { + renderWhitespace = 'none'; + } + + let renderLineHighlight = opts.renderLineHighlight; + // Compatibility with old true or false values + if (renderLineHighlight === true) { + renderLineHighlight = 'line'; + } else if (renderLineHighlight === false) { + renderLineHighlight = 'none'; + } + + const viewInfo = new InternalEditorViewOptions({ + theme: opts.theme, + canUseTranslate3d: this._toBoolean(opts.disableTranslate3d) ? false : env.canUseTranslate3d, + disableMonospaceOptimizations: (this._toBoolean(opts.disableMonospaceOptimizations) || this._toBoolean(opts.fontLigatures)), + experimentalScreenReader: this._toBoolean(opts.experimentalScreenReader), + rulers: this._toSortedIntegerArray(opts.rulers), + ariaLabel: String(opts.ariaLabel), + renderLineNumbers: renderLineNumbers, + renderCustomLineNumbers: renderCustomLineNumbers, + renderRelativeLineNumbers: renderRelativeLineNumbers, + selectOnLineNumbers: this._toBoolean(opts.selectOnLineNumbers), + glyphMargin: glyphMargin, + revealHorizontalRightPadding: this._toInteger(opts.revealHorizontalRightPadding, 0), + roundedSelection: this._toBoolean(opts.roundedSelection), + overviewRulerLanes: this._toInteger(opts.overviewRulerLanes, 0, 3), + overviewRulerBorder: this._toBoolean(opts.overviewRulerBorder), + cursorBlinking: this._cursorBlinkingStyleFromString(opts.cursorBlinking), + mouseWheelZoom: this._toBoolean(opts.mouseWheelZoom), + cursorStyle: this._cursorStyleFromString(opts.cursorStyle), + hideCursorInOverviewRuler: this._toBoolean(opts.hideCursorInOverviewRuler), + scrollBeyondLastLine: this._toBoolean(opts.scrollBeyondLastLine), + editorClassName: env.editorClassName, + stopRenderingLineAfter: stopRenderingLineAfter, + renderWhitespace: renderWhitespace, + renderControlCharacters: this._toBoolean(opts.renderControlCharacters), + fontLigatures: this._toBoolean(opts.fontLigatures), + renderIndentGuides: this._toBoolean(opts.renderIndentGuides), + renderLineHighlight: renderLineHighlight, + scrollbar: scrollbar, + minimap: minimap, + fixedOverflowWidgets: this._toBoolean(opts.fixedOverflowWidgets) + }); + + const contribInfo = new EditorContribOptions({ + selectionClipboard: this._toBoolean(opts.selectionClipboard), + hover: this._toBoolean(opts.hover), + contextmenu: this._toBoolean(opts.contextmenu), + quickSuggestions: typeof opts.quickSuggestions === 'object' ? { other: true, ...opts.quickSuggestions } : this._toBoolean(opts.quickSuggestions), + quickSuggestionsDelay: this._toInteger(opts.quickSuggestionsDelay), + parameterHints: this._toBoolean(opts.parameterHints), + iconsInSuggestions: this._toBoolean(opts.iconsInSuggestions), + formatOnType: this._toBoolean(opts.formatOnType), + formatOnPaste: this._toBoolean(opts.formatOnPaste), + suggestOnTriggerCharacters: this._toBoolean(opts.suggestOnTriggerCharacters), + acceptSuggestionOnEnter: this._toBoolean(opts.acceptSuggestionOnEnter), + acceptSuggestionOnCommitCharacter: this._toBoolean(opts.acceptSuggestionOnCommitCharacter), + snippetSuggestions: opts.snippetSuggestions, + emptySelectionClipboard: opts.emptySelectionClipboard, + wordBasedSuggestions: opts.wordBasedSuggestions, + suggestFontSize: opts.suggestFontSize, + suggestLineHeight: opts.suggestLineHeight, + selectionHighlight: this._toBoolean(opts.selectionHighlight), + occurrencesHighlight: this._toBoolean(opts.occurrencesHighlight), + codeLens: opts.referenceInfos && opts.codeLens, + folding: this._toBoolean(opts.folding), + hideFoldIcons: this._toBoolean(opts.hideFoldIcons), + matchBrackets: this._toBoolean(opts.matchBrackets), + }); + + return new InternalEditorOptions({ + lineHeight: env.fontInfo.lineHeight, // todo -> duplicated in styling + readOnly: readOnly, + wordSeparators: String(opts.wordSeparators), + autoClosingBrackets: this._toBoolean(opts.autoClosingBrackets), + useTabStops: this._toBoolean(opts.useTabStops), + tabFocusMode: readOnly ? true : env.tabFocusMode, + dragAndDrop: this._toBoolean(opts.dragAndDrop), + layoutInfo: layoutInfo, + fontInfo: env.fontInfo, + viewInfo: viewInfo, + wrappingInfo: wrappingInfo, + contribInfo: contribInfo, + }); + } + + private static _scrollbarVisibilityFromString(visibility: string): ScrollbarVisibility { + switch (visibility) { + case 'hidden': + return ScrollbarVisibility.Hidden; + case 'visible': + return ScrollbarVisibility.Visible; + default: + return ScrollbarVisibility.Auto; + } + } + + private static _sanitizeScrollbarOpts(raw: IEditorScrollbarOptions, mouseWheelScrollSensitivity: number): InternalEditorScrollbarOptions { + const horizontalScrollbarSize = this._toIntegerWithDefault(raw.horizontalScrollbarSize, 10); + const verticalScrollbarSize = this._toIntegerWithDefault(raw.verticalScrollbarSize, 14); + return new InternalEditorScrollbarOptions({ + vertical: this._scrollbarVisibilityFromString(raw.vertical), + horizontal: this._scrollbarVisibilityFromString(raw.horizontal), + + arrowSize: this._toIntegerWithDefault(raw.arrowSize, 11), + useShadows: this._toBooleanWithDefault(raw.useShadows, true), + + verticalHasArrows: this._toBooleanWithDefault(raw.verticalHasArrows, false), + horizontalHasArrows: this._toBooleanWithDefault(raw.horizontalHasArrows, false), + + horizontalScrollbarSize: horizontalScrollbarSize, + horizontalSliderSize: this._toIntegerWithDefault(raw.horizontalSliderSize, horizontalScrollbarSize), + + verticalScrollbarSize: verticalScrollbarSize, + verticalSliderSize: this._toIntegerWithDefault(raw.verticalSliderSize, verticalScrollbarSize), + + handleMouseWheel: this._toBooleanWithDefault(raw.handleMouseWheel, true), + mouseWheelScrollSensitivity: mouseWheelScrollSensitivity + }); + } + + private static _sanitizeMinimapOpts(raw: IEditorMinimapOptions): InternalEditorMinimapOptions { + let maxColumn = this._toIntegerWithDefault(raw.maxColumn, DefaultConfig.editor.minimap.maxColumn); + if (maxColumn < 1) { + maxColumn = 1; + } + return new InternalEditorMinimapOptions({ + enabled: this._toBooleanWithDefault(raw.enabled, DefaultConfig.editor.minimap.enabled), + renderCharacters: this._toBooleanWithDefault(raw.renderCharacters, DefaultConfig.editor.minimap.renderCharacters), + maxColumn: maxColumn, + }); + } + + private static _wrappingIndentFromString(wrappingIndent: string): WrappingIndent { + if (wrappingIndent === 'indent') { + return WrappingIndent.Indent; + } else if (wrappingIndent === 'same') { + return WrappingIndent.Same; + } else { + return WrappingIndent.None; + } + } + + private static _cursorStyleFromString(cursorStyle: string): TextEditorCursorStyle { + if (cursorStyle === 'line') { + return TextEditorCursorStyle.Line; + } else if (cursorStyle === 'block') { + return TextEditorCursorStyle.Block; + } else if (cursorStyle === 'underline') { + return TextEditorCursorStyle.Underline; + } else if (cursorStyle === 'line-thin') { + return TextEditorCursorStyle.LineThin; + } else if (cursorStyle === 'block-outline') { + return TextEditorCursorStyle.BlockOutline; + } else if (cursorStyle === 'underline-thin') { + return TextEditorCursorStyle.UnderlineThin; + } + return TextEditorCursorStyle.Line; + } + + private static _cursorBlinkingStyleFromString(cursorBlinkingStyle: string): TextEditorCursorBlinkingStyle { + switch (cursorBlinkingStyle) { + case 'blink': + return TextEditorCursorBlinkingStyle.Blink; + case 'smooth': + return TextEditorCursorBlinkingStyle.Smooth; + case 'phase': + return TextEditorCursorBlinkingStyle.Phase; + case 'expand': + return TextEditorCursorBlinkingStyle.Expand; + case 'visible': // maintain compatibility + case 'solid': + return TextEditorCursorBlinkingStyle.Solid; + } + return TextEditorCursorBlinkingStyle.Blink; + } + + private static _toBoolean(value: any): boolean { + return value === 'false' ? false : Boolean(value); + } + + private static _toBooleanWithDefault(value: any, defaultValue: boolean): boolean { + if (typeof value === 'undefined') { + return defaultValue; + } + return this._toBoolean(value); + } + + private static _toInteger(source: any, minimum: number = Constants.MIN_SAFE_SMALL_INTEGER, maximum: number = Constants.MAX_SAFE_SMALL_INTEGER): number { + let r = parseInt(source, 10); + if (isNaN(r)) { + r = 0; + } + r = Math.max(minimum, r); + r = Math.min(maximum, r); + return r | 0; + } + + private static _toIntegerWithDefault(source: any, defaultValue: number): number { + if (typeof source === 'undefined') { + return defaultValue; + } + return this._toInteger(source); + } + + private static _toSortedIntegerArray(source: any): number[] { + if (!Array.isArray(source)) { + return []; + } + const arrSource = source; + const r = arrSource.map(el => this._toInteger(el)); + r.sort(); + return r; + } + + private static _toFloat(source: any, defaultValue: number): number { + let r = parseFloat(source); + if (isNaN(r)) { + r = defaultValue; + } + return r; + } +} + +/** + * @internal + */ +export interface IEditorLayoutProviderOpts { + outerWidth: number; + outerHeight: number; + + showGlyphMargin: boolean; + lineHeight: number; + + showLineNumbers: boolean; + lineNumbersMinChars: number; + lineNumbersDigitCount: number; + + lineDecorationsWidth: number; + + typicalHalfwidthCharacterWidth: number; + maxDigitWidth: number; + + verticalScrollbarWidth: number; + verticalScrollbarHasArrows: boolean; + scrollbarArrowSize: number; + horizontalScrollbarHeight: number; + + minimap: boolean; + minimapRenderCharacters: boolean; + minimapMaxColumn: number; + pixelRatio: number; +} + +/** + * @internal + */ +export class EditorLayoutProvider { + public static compute(_opts: IEditorLayoutProviderOpts): EditorLayoutInfo { + const outerWidth = _opts.outerWidth | 0; + const outerHeight = _opts.outerHeight | 0; + const showGlyphMargin = Boolean(_opts.showGlyphMargin); + const lineHeight = _opts.lineHeight | 0; + const showLineNumbers = Boolean(_opts.showLineNumbers); + const lineNumbersMinChars = _opts.lineNumbersMinChars | 0; + const lineNumbersDigitCount = _opts.lineNumbersDigitCount | 0; + const lineDecorationsWidth = _opts.lineDecorationsWidth | 0; + const typicalHalfwidthCharacterWidth = Number(_opts.typicalHalfwidthCharacterWidth); + const maxDigitWidth = Number(_opts.maxDigitWidth); + const verticalScrollbarWidth = _opts.verticalScrollbarWidth | 0; + const verticalScrollbarHasArrows = Boolean(_opts.verticalScrollbarHasArrows); + const scrollbarArrowSize = _opts.scrollbarArrowSize | 0; + const horizontalScrollbarHeight = _opts.horizontalScrollbarHeight | 0; + const minimap = Boolean(_opts.minimap); + const minimapRenderCharacters = Boolean(_opts.minimapRenderCharacters); + const minimapMaxColumn = _opts.minimapMaxColumn | 0; + const pixelRatio = Number(_opts.pixelRatio); + + let lineNumbersWidth = 0; + if (showLineNumbers) { + const digitCount = Math.max(lineNumbersDigitCount, lineNumbersMinChars); + lineNumbersWidth = Math.round(digitCount * maxDigitWidth); + } + + let glyphMarginWidth = 0; + if (showGlyphMargin) { + glyphMarginWidth = lineHeight; + } + + const glyphMarginLeft = 0; + const lineNumbersLeft = glyphMarginLeft + glyphMarginWidth; + const decorationsLeft = lineNumbersLeft + lineNumbersWidth; + const contentLeft = decorationsLeft + lineDecorationsWidth; + + const remainingWidth = outerWidth - glyphMarginWidth - lineNumbersWidth - lineDecorationsWidth; + + let renderMinimap: RenderMinimap; + let minimapWidth: number; + let contentWidth: number; + if (!minimap) { + minimapWidth = 0; + renderMinimap = RenderMinimap.None; + contentWidth = remainingWidth; + } else { + let minimapCharWidth: number; + if (pixelRatio >= 2) { + renderMinimap = minimapRenderCharacters ? RenderMinimap.Large : RenderMinimap.LargeBlocks; + minimapCharWidth = 2 / pixelRatio; + } else { + renderMinimap = minimapRenderCharacters ? RenderMinimap.Small : RenderMinimap.SmallBlocks; + minimapCharWidth = 1 / pixelRatio; + } + + // Given: + // viewportColumn = (contentWidth - verticalScrollbarWidth) / typicalHalfwidthCharacterWidth + // minimapWidth = viewportColumn * minimapCharWidth + // contentWidth = remainingWidth - minimapWidth + // What are good values for contentWidth and minimapWidth ? + + // minimapWidth = ((contentWidth - verticalScrollbarWidth) / typicalHalfwidthCharacterWidth) * minimapCharWidth + // typicalHalfwidthCharacterWidth * minimapWidth = (contentWidth - verticalScrollbarWidth) * minimapCharWidth + // typicalHalfwidthCharacterWidth * minimapWidth = (remainingWidth - minimapWidth - verticalScrollbarWidth) * minimapCharWidth + // (typicalHalfwidthCharacterWidth + minimapCharWidth) * minimapWidth = (remainingWidth - verticalScrollbarWidth) * minimapCharWidth + // minimapWidth = ((remainingWidth - verticalScrollbarWidth) * minimapCharWidth) / (typicalHalfwidthCharacterWidth + minimapCharWidth) + + minimapWidth = Math.max(0, Math.floor(((remainingWidth - verticalScrollbarWidth) * minimapCharWidth) / (typicalHalfwidthCharacterWidth + minimapCharWidth))); + let minimapColumns = minimapWidth / minimapCharWidth; + if (minimapColumns > minimapMaxColumn) { + minimapWidth = Math.floor(minimapMaxColumn * minimapCharWidth); + } + contentWidth = remainingWidth - minimapWidth; + } + + const viewportColumn = Math.max(1, Math.floor((contentWidth - verticalScrollbarWidth) / typicalHalfwidthCharacterWidth)); + + const verticalArrowSize = (verticalScrollbarHasArrows ? scrollbarArrowSize : 0); + + return new EditorLayoutInfo({ + width: outerWidth, + height: outerHeight, + + glyphMarginLeft: glyphMarginLeft, + glyphMarginWidth: glyphMarginWidth, + glyphMarginHeight: outerHeight, + + lineNumbersLeft: lineNumbersLeft, + lineNumbersWidth: lineNumbersWidth, + lineNumbersHeight: outerHeight, + + decorationsLeft: decorationsLeft, + decorationsWidth: lineDecorationsWidth, + decorationsHeight: outerHeight, + + contentLeft: contentLeft, + contentWidth: contentWidth, + contentHeight: outerHeight, + + renderMinimap: renderMinimap, + minimapWidth: minimapWidth, + + viewportColumn: viewportColumn, + + verticalScrollbarWidth: verticalScrollbarWidth, + horizontalScrollbarHeight: horizontalScrollbarHeight, + + overviewRuler: new OverviewRulerPosition({ + top: verticalArrowSize, + width: verticalScrollbarWidth, + height: (outerHeight - 2 * verticalArrowSize), + right: 0 + }) + }); + } +} diff --git a/src/vs/editor/common/viewLayout/editorLayoutProvider.ts b/src/vs/editor/common/viewLayout/editorLayoutProvider.ts deleted file mode 100644 index daf1522ab92..00000000000 --- a/src/vs/editor/common/viewLayout/editorLayoutProvider.ts +++ /dev/null @@ -1,154 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { RenderMinimap, EditorLayoutInfo, OverviewRulerPosition } from 'vs/editor/common/config/editorOptions'; - -export interface IEditorLayoutProviderOpts { - outerWidth: number; - outerHeight: number; - - showGlyphMargin: boolean; - lineHeight: number; - - showLineNumbers: boolean; - lineNumbersMinChars: number; - lineNumbersDigitCount: number; - - lineDecorationsWidth: number; - - typicalHalfwidthCharacterWidth: number; - maxDigitWidth: number; - - verticalScrollbarWidth: number; - verticalScrollbarHasArrows: boolean; - scrollbarArrowSize: number; - horizontalScrollbarHeight: number; - - minimap: boolean; - minimapRenderCharacters: boolean; - minimapMaxColumn: number; - pixelRatio: number; -} - -export class EditorLayoutProvider { - public static compute(_opts: IEditorLayoutProviderOpts): EditorLayoutInfo { - const outerWidth = _opts.outerWidth | 0; - const outerHeight = _opts.outerHeight | 0; - const showGlyphMargin = Boolean(_opts.showGlyphMargin); - const lineHeight = _opts.lineHeight | 0; - const showLineNumbers = Boolean(_opts.showLineNumbers); - const lineNumbersMinChars = _opts.lineNumbersMinChars | 0; - const lineNumbersDigitCount = _opts.lineNumbersDigitCount | 0; - const lineDecorationsWidth = _opts.lineDecorationsWidth | 0; - const typicalHalfwidthCharacterWidth = Number(_opts.typicalHalfwidthCharacterWidth); - const maxDigitWidth = Number(_opts.maxDigitWidth); - const verticalScrollbarWidth = _opts.verticalScrollbarWidth | 0; - const verticalScrollbarHasArrows = Boolean(_opts.verticalScrollbarHasArrows); - const scrollbarArrowSize = _opts.scrollbarArrowSize | 0; - const horizontalScrollbarHeight = _opts.horizontalScrollbarHeight | 0; - const minimap = Boolean(_opts.minimap); - const minimapRenderCharacters = Boolean(_opts.minimapRenderCharacters); - const minimapMaxColumn = _opts.minimapMaxColumn | 0; - const pixelRatio = Number(_opts.pixelRatio); - - let lineNumbersWidth = 0; - if (showLineNumbers) { - let digitCount = Math.max(lineNumbersDigitCount, lineNumbersMinChars); - lineNumbersWidth = Math.round(digitCount * maxDigitWidth); - } - - let glyphMarginWidth = 0; - if (showGlyphMargin) { - glyphMarginWidth = lineHeight; - } - - let glyphMarginLeft = 0; - let lineNumbersLeft = glyphMarginLeft + glyphMarginWidth; - let decorationsLeft = lineNumbersLeft + lineNumbersWidth; - let contentLeft = decorationsLeft + lineDecorationsWidth; - - let remainingWidth = outerWidth - glyphMarginWidth - lineNumbersWidth - lineDecorationsWidth; - - let renderMinimap: RenderMinimap; - let minimapWidth: number; - let contentWidth: number; - if (!minimap) { - minimapWidth = 0; - renderMinimap = RenderMinimap.None; - contentWidth = remainingWidth; - } else { - let minimapCharWidth: number; - if (pixelRatio >= 2) { - renderMinimap = minimapRenderCharacters ? RenderMinimap.Large : RenderMinimap.LargeBlocks; - minimapCharWidth = 2 / pixelRatio; - } else { - renderMinimap = minimapRenderCharacters ? RenderMinimap.Small : RenderMinimap.SmallBlocks; - minimapCharWidth = 1 / pixelRatio; - } - - // Given: - // viewportColumn = (contentWidth - verticalScrollbarWidth) / typicalHalfwidthCharacterWidth - // minimapWidth = viewportColumn * minimapCharWidth - // contentWidth = remainingWidth - minimapWidth - // What are good values for contentWidth and minimapWidth ? - - // minimapWidth = ((contentWidth - verticalScrollbarWidth) / typicalHalfwidthCharacterWidth) * minimapCharWidth - // typicalHalfwidthCharacterWidth * minimapWidth = (contentWidth - verticalScrollbarWidth) * minimapCharWidth - // typicalHalfwidthCharacterWidth * minimapWidth = (remainingWidth - minimapWidth - verticalScrollbarWidth) * minimapCharWidth - // (typicalHalfwidthCharacterWidth + minimapCharWidth) * minimapWidth = (remainingWidth - verticalScrollbarWidth) * minimapCharWidth - // minimapWidth = ((remainingWidth - verticalScrollbarWidth) * minimapCharWidth) / (typicalHalfwidthCharacterWidth + minimapCharWidth) - - minimapWidth = Math.max(0, Math.floor(((remainingWidth - verticalScrollbarWidth) * minimapCharWidth) / (typicalHalfwidthCharacterWidth + minimapCharWidth))); - let minimapColumns = minimapWidth / minimapCharWidth; - if (minimapColumns > minimapMaxColumn) { - minimapWidth = Math.floor(minimapMaxColumn * minimapCharWidth); - } - contentWidth = remainingWidth - minimapWidth; - } - - let viewportColumn = Math.max(1, Math.floor((contentWidth - verticalScrollbarWidth) / typicalHalfwidthCharacterWidth)); - - let verticalArrowSize = (verticalScrollbarHasArrows ? scrollbarArrowSize : 0); - - return new EditorLayoutInfo({ - width: outerWidth, - height: outerHeight, - - glyphMarginLeft: glyphMarginLeft, - glyphMarginWidth: glyphMarginWidth, - glyphMarginHeight: outerHeight, - - lineNumbersLeft: lineNumbersLeft, - lineNumbersWidth: lineNumbersWidth, - lineNumbersHeight: outerHeight, - - decorationsLeft: decorationsLeft, - decorationsWidth: lineDecorationsWidth, - decorationsHeight: outerHeight, - - contentLeft: contentLeft, - contentWidth: contentWidth, - contentHeight: outerHeight, - - renderMinimap: renderMinimap, - minimapWidth: minimapWidth, - - viewportColumn: viewportColumn, - - verticalScrollbarWidth: verticalScrollbarWidth, - horizontalScrollbarHeight: horizontalScrollbarHeight, - - overviewRuler: new OverviewRulerPosition({ - top: verticalArrowSize, - width: verticalScrollbarWidth, - height: (outerHeight - 2 * verticalArrowSize), - right: 0 - }) - }); - } - - -} diff --git a/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts b/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts index 2b904a5dd3f..a5cf90e7e1a 100644 --- a/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts +++ b/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts @@ -10,7 +10,7 @@ import * as dom from 'vs/base/browser/dom'; import { CodeEditorServiceImpl } from 'vs/editor/browser/services/codeEditorServiceImpl'; import { IDecorationRenderOptions } from 'vs/editor/common/editorCommon'; -suite('Browser Services - EditorLayoutProvider', () => { +suite('Decoration Render Options', () => { var options: IDecorationRenderOptions = { gutterIconPath: URI.parse('https://github.com/Microsoft/vscode/blob/master/resources/linux/code.png'), gutterIconSize: 'contain', diff --git a/src/vs/editor/test/common/viewLayout/editorLayoutProvider.test.ts b/src/vs/editor/test/common/viewLayout/editorLayoutProvider.test.ts index 28cd57513c8..b60d9b7cb64 100644 --- a/src/vs/editor/test/common/viewLayout/editorLayoutProvider.test.ts +++ b/src/vs/editor/test/common/viewLayout/editorLayoutProvider.test.ts @@ -5,8 +5,7 @@ 'use strict'; import * as assert from 'assert'; -import { RenderMinimap, EditorLayoutInfo, OverviewRulerPosition } from 'vs/editor/common/config/editorOptions'; -import { EditorLayoutProvider, IEditorLayoutProviderOpts } from 'vs/editor/common/viewLayout/editorLayoutProvider'; +import { RenderMinimap, EditorLayoutInfo, OverviewRulerPosition, EditorLayoutProvider, IEditorLayoutProviderOpts } from 'vs/editor/common/config/editorOptions'; suite('Editor ViewLayout - EditorLayoutProvider', () => { From b2091c58c7d7bd989237968122c4ab8ea08a9d29 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 8 May 2017 16:22:14 +0200 Subject: [PATCH 0183/1164] First validate editor options, and then compute the result based on env --- src/vs/editor/browser/config/configuration.ts | 2 +- .../standalone/standaloneCodeEditor.ts | 8 +- .../common/config/commonEditorConfig.ts | 53 +- src/vs/editor/common/config/editorOptions.ts | 870 ++++++++++++------ src/vs/editor/common/config/fontInfo.ts | 11 +- src/vs/editor/common/editorCommon.ts | 2 +- .../browser/preferencesRenderers.ts | 4 +- 7 files changed, 635 insertions(+), 315 deletions(-) diff --git a/src/vs/editor/browser/config/configuration.ts b/src/vs/editor/browser/config/configuration.ts index 23a4a86c292..330903d01af 100644 --- a/src/vs/editor/browser/config/configuration.ts +++ b/src/vs/editor/browser/config/configuration.ts @@ -314,7 +314,7 @@ export class Configuration extends CommonEditorConfiguration { this._register(CSSBasedConfiguration.INSTANCE.onDidChange(() => this._onCSSBasedConfigurationChanged())); - if (this._configWithDefaults.getEditorOptions().automaticLayout) { + if (this._validatedOptions.automaticLayout) { this._elementSizeObserver.startObserving(); } diff --git a/src/vs/editor/browser/standalone/standaloneCodeEditor.ts b/src/vs/editor/browser/standalone/standaloneCodeEditor.ts index 4f7c626bc77..3cc70066d90 100644 --- a/src/vs/editor/browser/standalone/standaloneCodeEditor.ts +++ b/src/vs/editor/browser/standalone/standaloneCodeEditor.ts @@ -211,20 +211,18 @@ export class StandaloneEditor extends StandaloneCodeEditor implements IStandalon if (typeof options.theme === 'string') { options.theme = standaloneThemeService.setTheme(options.theme); } - + let model: IModel = options.model; + delete options.model; super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, keybindingService); this._contextViewService = contextViewService; this._standaloneThemeService = standaloneThemeService; this._register(toDispose); - let model: IModel = null; - if (typeof options.model === 'undefined') { + if (typeof model === 'undefined') { model = (self).monaco.editor.createModel(options.value || '', options.language || 'text/plain'); this._ownsModel = true; } else { - model = options.model; - delete options.model; this._ownsModel = false; } diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index dd2c9b9ddb4..066c5ae79f3 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -49,34 +49,6 @@ export const TabFocus: ITabFocus = new class { } }; -export class ConfigurationWithDefaults { - - private _editor: editorOptions.IEditorOptions; - - constructor(options: editorOptions.IEditorOptions) { - this._editor = objects.clone(DefaultConfig.editor); - - this._mergeOptionsIn(options); - } - - public getEditorOptions(): editorOptions.IEditorOptions { - return this._editor; - } - - private _mergeOptionsIn(newOptions: editorOptions.IEditorOptions): void { - this._editor = objects.mixin(this._editor, newOptions || {}); - } - - public updateOptions(newOptions: editorOptions.IEditorOptions): void { - // Apply new options - this._mergeOptionsIn(newOptions); - } -} - -function toBoolean(value: any): boolean { - return value === 'false' ? false : Boolean(value); -} - export interface IElementSizeObserver { startObserving(): void; observe(dimension?: editorCommon.IDimension): void; @@ -87,9 +59,11 @@ export interface IElementSizeObserver { export abstract class CommonEditorConfiguration extends Disposable implements editorCommon.IConfiguration { + protected _rawOptions: editorOptions.IEditorOptions; + protected _validatedOptions: editorOptions.IValidatedEditorOptions; + public editor: editorOptions.InternalEditorOptions; - protected _configWithDefaults: ConfigurationWithDefaults; protected _elementSizeObserver: IElementSizeObserver; private _isDominatedByLongLines: boolean; private _lineNumbersDigitCount: number; @@ -99,7 +73,10 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed constructor(options: editorOptions.IEditorOptions, elementSizeObserver: IElementSizeObserver = null) { super(); - this._configWithDefaults = new ConfigurationWithDefaults(options); + + this._rawOptions = options; + this._validatedOptions = editorOptions.EditorOptionsValidator.validate(this._rawOptions, editorOptions.DEFAULTS); + this._elementSizeObserver = elementSizeObserver; this._isDominatedByLongLines = false; this._lineNumbersDigitCount = 1; @@ -127,33 +104,29 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed } public getRawOptions(): editorOptions.IEditorOptions { - return this._configWithDefaults.getEditorOptions(); + return this._rawOptions; } private _computeInternalOptions(): editorOptions.InternalEditorOptions { - let opts = this._configWithDefaults.getEditorOptions(); - - let editorClassName = this._getEditorClassName(opts.theme, toBoolean(opts.fontLigatures), opts.mouseStyle); - - let bareFontInfo = BareFontInfo.createFromRawSettings(opts, this.getZoomLevel()); - + const opts = this._validatedOptions; + const bareFontInfo = BareFontInfo.createFromRawSettings(this._rawOptions, this.getZoomLevel()); const env = new editorOptions.EnvironmentalOptions({ outerWidth: this.getOuterWidth(), outerHeight: this.getOuterHeight(), fontInfo: this.readConfiguration(bareFontInfo), - editorClassName: editorClassName, + editorClassName: this._getEditorClassName(opts.theme, opts.fontLigatures, opts.mouseStyle), isDominatedByLongLines: this._isDominatedByLongLines, lineNumbersDigitCount: this._lineNumbersDigitCount, canUseTranslate3d: this._getCanUseTranslate3d(), pixelRatio: this._getPixelRatio(), tabFocusMode: TabFocus.getTabFocusMode() }); - return editorOptions.InternalEditorOptionsFactory.createInternalEditorOptions(env, opts); } public updateOptions(newOptions: editorOptions.IEditorOptions): void { - this._configWithDefaults.updateOptions(newOptions); + this._rawOptions = objects.mixin(this._rawOptions, newOptions || {}); + this._validatedOptions = editorOptions.EditorOptionsValidator.validate(this._rawOptions, editorOptions.DEFAULTS); this._recomputeOptions(); } diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 384fe753722..4c3c216e88f 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -1507,41 +1507,348 @@ export class EnvironmentalOptions { } /** + * Validated scrollbar options for the editor. * @internal */ -export class InternalEditorOptionsFactory { +export interface IValidatedEditorScrollbarOptions { + vertical: ScrollbarVisibility; + horizontal: ScrollbarVisibility; + arrowSize: number; + useShadows: boolean; + verticalHasArrows: boolean; + horizontalHasArrows: boolean; + horizontalScrollbarSize: number; + horizontalSliderSize: number; + verticalScrollbarSize: number; + verticalSliderSize: number; + handleMouseWheel: boolean; +} - public static createInternalEditorOptions(env: EnvironmentalOptions, opts: IEditorOptions) { +/** + * Validated minimap options for the editor. + * @internal + */ +export interface IValidatedEditorMinimapOptions { + enabled: boolean; + renderCharacters: boolean; + maxColumn: number; +} - let stopRenderingLineAfter: number; - if (typeof opts.stopRenderingLineAfter !== 'undefined') { - stopRenderingLineAfter = this._toInteger(opts.stopRenderingLineAfter, -1); - } else { - stopRenderingLineAfter = 10000; +/** + * Validated configuration options for the editor. + * @internal + */ +export interface IValidatedEditorOptions { + inDiffEditor: boolean; + experimentalScreenReader: boolean; + ariaLabel: string; + rulers: number[]; + wordSeparators: string; + selectionClipboard: boolean; + renderLineNumbers: boolean; + renderCustomLineNumbers: (lineNumber: number) => string; + renderRelativeLineNumbers: boolean; + selectOnLineNumbers: boolean; + lineNumbersMinChars: number; + glyphMargin: boolean; + lineDecorationsWidth: number | string; + revealHorizontalRightPadding: number; + roundedSelection: boolean; + theme: string; + readOnly: boolean; + scrollbar: IValidatedEditorScrollbarOptions; + minimap: IValidatedEditorMinimapOptions; + fixedOverflowWidgets: boolean; + overviewRulerLanes: number; + overviewRulerBorder: boolean; + cursorBlinking: TextEditorCursorBlinkingStyle; + mouseWheelZoom: boolean; + mouseStyle: 'text' | 'default' | 'copy'; + cursorStyle: TextEditorCursorStyle; + fontLigatures: boolean; + disableTranslate3d: boolean; + disableMonospaceOptimizations: boolean; + hideCursorInOverviewRuler: boolean; + scrollBeyondLastLine: boolean; + automaticLayout: boolean; + wordWrap: 'off' | 'on' | 'wordWrapColumn' | 'bounded'; + wordWrapColumn: number; + wordWrapMinified: boolean; + wrappingIndent: WrappingIndent; + wordWrapBreakBeforeCharacters: string; + wordWrapBreakAfterCharacters: string; + wordWrapBreakObtrusiveCharacters: string; + stopRenderingLineAfter: number; + hover: boolean; + contextmenu: boolean; + mouseWheelScrollSensitivity: number; + quickSuggestions: boolean | { other: boolean, comments: boolean, strings: boolean }; + quickSuggestionsDelay: number; + parameterHints: boolean; + iconsInSuggestions: boolean; + autoClosingBrackets: boolean; + formatOnType: boolean; + formatOnPaste: boolean; + dragAndDrop: boolean; + suggestOnTriggerCharacters: boolean; + acceptSuggestionOnEnter: boolean; + acceptSuggestionOnCommitCharacter: boolean; + snippetSuggestions: 'top' | 'bottom' | 'inline' | 'none'; + emptySelectionClipboard: boolean; + wordBasedSuggestions: boolean; + suggestFontSize: number; + suggestLineHeight: number; + selectionHighlight: boolean; + occurrencesHighlight: boolean; + codeLens: boolean; + referenceInfos: boolean; + folding: boolean; + hideFoldIcons: boolean; + matchBrackets: boolean; + renderWhitespace: 'none' | 'boundary' | 'all'; + renderControlCharacters: boolean; + renderIndentGuides: boolean; + renderLineHighlight: 'none' | 'gutter' | 'line' | 'all'; + useTabStops: boolean; +} + +function _boolean(value: any, defaultValue: T): boolean | T { + if (typeof value === 'undefined') { + return defaultValue; + } + if (value === 'false') { + // treat the string 'false' as false + return false; + } + return Boolean(value); +} + +function _string(value: any, defaultValue: string): string { + if (typeof value !== 'string') { + return defaultValue; + } + return value; +} + +function _stringSet(value: any, defaultValue: T, allowedValues: string[]): T { + if (typeof value !== 'string') { + return defaultValue; + } + if (allowedValues.indexOf(value) === -1) { + return defaultValue; + } + return value; +} + +function _clampedInt(value: any, defaultValue: number, minimum: number, maximum: number): number { + let r: number; + if (typeof value === 'undefined') { + r = defaultValue; + } else { + r = parseInt(value, 10); + if (isNaN(r)) { + r = defaultValue; + } + } + r = Math.max(minimum, r); + r = Math.min(maximum, r); + return r | 0; +} + +function _float(value: any, defaultValue: number): number { + let r = parseFloat(value); + if (isNaN(r)) { + r = defaultValue; + } + return r; +} + +function _wrappingIndentFromString(wrappingIndent: string, defaultValue: WrappingIndent): WrappingIndent { + if (typeof wrappingIndent !== 'string') { + return defaultValue; + } + if (wrappingIndent === 'indent') { + return WrappingIndent.Indent; + } else if (wrappingIndent === 'same') { + return WrappingIndent.Same; + } else { + return WrappingIndent.None; + } +} + +function _cursorStyleFromString(cursorStyle: string, defaultValue: TextEditorCursorStyle): TextEditorCursorStyle { + if (typeof cursorStyle !== 'string') { + return defaultValue; + } + if (cursorStyle === 'line') { + return TextEditorCursorStyle.Line; + } else if (cursorStyle === 'block') { + return TextEditorCursorStyle.Block; + } else if (cursorStyle === 'underline') { + return TextEditorCursorStyle.Underline; + } else if (cursorStyle === 'line-thin') { + return TextEditorCursorStyle.LineThin; + } else if (cursorStyle === 'block-outline') { + return TextEditorCursorStyle.BlockOutline; + } else if (cursorStyle === 'underline-thin') { + return TextEditorCursorStyle.UnderlineThin; + } + return TextEditorCursorStyle.Line; +} + +function _cursorBlinkingStyleFromString(cursorBlinkingStyle: string, defaultValue: TextEditorCursorBlinkingStyle): TextEditorCursorBlinkingStyle { + if (typeof cursorBlinkingStyle !== 'string') { + return defaultValue; + } + switch (cursorBlinkingStyle) { + case 'blink': + return TextEditorCursorBlinkingStyle.Blink; + case 'smooth': + return TextEditorCursorBlinkingStyle.Smooth; + case 'phase': + return TextEditorCursorBlinkingStyle.Phase; + case 'expand': + return TextEditorCursorBlinkingStyle.Expand; + case 'visible': // maintain compatibility + case 'solid': + return TextEditorCursorBlinkingStyle.Solid; + } + return TextEditorCursorBlinkingStyle.Blink; +} + +function _scrollbarVisibilityFromString(visibility: string, defaultValue: ScrollbarVisibility): ScrollbarVisibility { + if (typeof visibility !== 'string') { + return defaultValue; + } + switch (visibility) { + case 'hidden': + return ScrollbarVisibility.Hidden; + case 'visible': + return ScrollbarVisibility.Visible; + default: + return ScrollbarVisibility.Auto; + } +} + +/** + * @internal + */ +export const DEFAULTS: IValidatedEditorOptions = { + inDiffEditor: false, + experimentalScreenReader: DefaultConfig.editor.experimentalScreenReader, + ariaLabel: DefaultConfig.editor.ariaLabel, + rulers: DefaultConfig.editor.rulers, + wordSeparators: DefaultConfig.editor.wordSeparators, + selectionClipboard: DefaultConfig.editor.selectionClipboard, + renderLineNumbers: true, + renderCustomLineNumbers: null, + renderRelativeLineNumbers: false, + selectOnLineNumbers: DefaultConfig.editor.selectOnLineNumbers, + lineNumbersMinChars: DefaultConfig.editor.lineNumbersMinChars, + glyphMargin: DefaultConfig.editor.glyphMargin, + lineDecorationsWidth: DefaultConfig.editor.lineDecorationsWidth, + revealHorizontalRightPadding: DefaultConfig.editor.revealHorizontalRightPadding, + roundedSelection: DefaultConfig.editor.roundedSelection, + theme: DefaultConfig.editor.theme, + readOnly: DefaultConfig.editor.readOnly, + scrollbar: { + vertical: ScrollbarVisibility.Auto, + horizontal: ScrollbarVisibility.Auto, + arrowSize: 11, + useShadows: true, + verticalHasArrows: false, + horizontalHasArrows: false, + horizontalScrollbarSize: 10, + horizontalSliderSize: 10, + verticalScrollbarSize: 14, + verticalSliderSize: 14, + handleMouseWheel: true + }, + minimap: { + enabled: false, + renderCharacters: true, + maxColumn: 120 + }, + fixedOverflowWidgets: DefaultConfig.editor.fixedOverflowWidgets, + overviewRulerLanes: DefaultConfig.editor.overviewRulerLanes, + overviewRulerBorder: DefaultConfig.editor.overviewRulerBorder, + cursorBlinking: TextEditorCursorBlinkingStyle.Blink, + mouseWheelZoom: DefaultConfig.editor.mouseWheelZoom, + mouseStyle: DefaultConfig.editor.mouseStyle, + cursorStyle: TextEditorCursorStyle.Line, + fontLigatures: DefaultConfig.editor.fontLigatures, + disableTranslate3d: DefaultConfig.editor.disableTranslate3d, + disableMonospaceOptimizations: DefaultConfig.editor.disableMonospaceOptimizations, + hideCursorInOverviewRuler: DefaultConfig.editor.hideCursorInOverviewRuler, + scrollBeyondLastLine: DefaultConfig.editor.scrollBeyondLastLine, + automaticLayout: DefaultConfig.editor.automaticLayout, + wordWrap: DefaultConfig.editor.wordWrap, + wordWrapColumn: DefaultConfig.editor.wordWrapColumn, + wordWrapMinified: DefaultConfig.editor.wordWrapMinified, + wrappingIndent: WrappingIndent.Same, + wordWrapBreakBeforeCharacters: DefaultConfig.editor.wordWrapBreakBeforeCharacters, + wordWrapBreakAfterCharacters: DefaultConfig.editor.wordWrapBreakAfterCharacters, + wordWrapBreakObtrusiveCharacters: DefaultConfig.editor.wordWrapBreakObtrusiveCharacters, + stopRenderingLineAfter: 10000, + hover: DefaultConfig.editor.hover, + contextmenu: DefaultConfig.editor.contextmenu, + mouseWheelScrollSensitivity: DefaultConfig.editor.mouseWheelScrollSensitivity, + quickSuggestions: DefaultConfig.editor.quickSuggestions, + quickSuggestionsDelay: DefaultConfig.editor.quickSuggestionsDelay, + parameterHints: DefaultConfig.editor.parameterHints, + iconsInSuggestions: DefaultConfig.editor.iconsInSuggestions, + autoClosingBrackets: DefaultConfig.editor.autoClosingBrackets, + formatOnType: DefaultConfig.editor.formatOnType, + formatOnPaste: DefaultConfig.editor.formatOnPaste, + dragAndDrop: DefaultConfig.editor.dragAndDrop, + suggestOnTriggerCharacters: DefaultConfig.editor.suggestOnTriggerCharacters, + acceptSuggestionOnEnter: DefaultConfig.editor.acceptSuggestionOnEnter, + acceptSuggestionOnCommitCharacter: DefaultConfig.editor.acceptSuggestionOnCommitCharacter, + snippetSuggestions: DefaultConfig.editor.snippetSuggestions, + emptySelectionClipboard: DefaultConfig.editor.emptySelectionClipboard, + wordBasedSuggestions: DefaultConfig.editor.wordBasedSuggestions, + suggestFontSize: DefaultConfig.editor.suggestFontSize, + suggestLineHeight: DefaultConfig.editor.suggestLineHeight, + selectionHighlight: DefaultConfig.editor.selectionHighlight, + occurrencesHighlight: DefaultConfig.editor.occurrencesHighlight, + codeLens: DefaultConfig.editor.codeLens, + referenceInfos: DefaultConfig.editor.referenceInfos, + folding: DefaultConfig.editor.folding, + hideFoldIcons: DefaultConfig.editor.hideFoldIcons, + matchBrackets: DefaultConfig.editor.matchBrackets, + renderWhitespace: DefaultConfig.editor.renderWhitespace, + renderControlCharacters: DefaultConfig.editor.renderControlCharacters, + renderIndentGuides: DefaultConfig.editor.renderIndentGuides, + renderLineHighlight: DefaultConfig.editor.renderLineHighlight, + useTabStops: DefaultConfig.editor.useTabStops, +}; + +/** + * @internal + */ +export class EditorOptionsValidator { + + /** + * Validate raw editor options. + * i.e. since they can be defined by the user, they might be invalid. + */ + public static validate(opts: IEditorOptions, defaults: IValidatedEditorOptions): IValidatedEditorOptions { + + let rulers: number[] = []; + if (Array.isArray(opts.rulers)) { + for (let i = 0, len = opts.rulers.length; i < len; i++) { + rulers.push(_clampedInt(opts.rulers[i], 0, 0, 10000)); + } + rulers.sort(); } - const scrollbar = this._sanitizeScrollbarOpts(opts.scrollbar, this._toFloat(opts.mouseWheelScrollSensitivity, 1)); - const minimap = this._sanitizeMinimapOpts(opts.minimap); + let renderLineNumbers: boolean = defaults.renderLineNumbers; + let renderCustomLineNumbers: (lineNumber: number) => string = defaults.renderCustomLineNumbers; + let renderRelativeLineNumbers: boolean = defaults.renderRelativeLineNumbers; - const glyphMargin = this._toBoolean(opts.glyphMargin); - const lineNumbersMinChars = this._toInteger(opts.lineNumbersMinChars, 1); - - let lineDecorationsWidth: number; - if (typeof opts.lineDecorationsWidth === 'string' && /^\d+(\.\d+)?ch$/.test(opts.lineDecorationsWidth)) { - const multiple = parseFloat(opts.lineDecorationsWidth.substr(0, opts.lineDecorationsWidth.length - 2)); - lineDecorationsWidth = multiple * env.fontInfo.typicalHalfwidthCharacterWidth; - } else { - lineDecorationsWidth = this._toInteger(opts.lineDecorationsWidth, 0); - } - if (opts.folding) { - lineDecorationsWidth += 16; - } - - let renderLineNumbers: boolean; - let renderCustomLineNumbers: (lineNumber: number) => string; - let renderRelativeLineNumbers: boolean; - { + if (typeof opts.lineNumbers !== 'undefined') { let lineNumbers = opts.lineNumbers; + // Compatibility with old true or false values if (lineNumbers === true) { lineNumbers = 'on'; @@ -1568,33 +1875,8 @@ export class InternalEditorOptionsFactory { } } - const layoutInfo = EditorLayoutProvider.compute({ - outerWidth: env.outerWidth, - outerHeight: env.outerHeight, - showGlyphMargin: glyphMargin, - lineHeight: env.fontInfo.lineHeight, - showLineNumbers: renderLineNumbers, - lineNumbersMinChars: lineNumbersMinChars, - lineNumbersDigitCount: env.lineNumbersDigitCount, - lineDecorationsWidth: lineDecorationsWidth, - typicalHalfwidthCharacterWidth: env.fontInfo.typicalHalfwidthCharacterWidth, - maxDigitWidth: env.fontInfo.maxDigitWidth, - verticalScrollbarWidth: scrollbar.verticalScrollbarSize, - horizontalScrollbarHeight: scrollbar.horizontalScrollbarSize, - scrollbarArrowSize: scrollbar.arrowSize, - verticalScrollbarHasArrows: scrollbar.verticalHasArrows, - minimap: minimap.enabled, - minimapRenderCharacters: minimap.renderCharacters, - minimapMaxColumn: minimap.maxColumn, - pixelRatio: env.pixelRatio - }); - - let bareWrappingInfo: { isWordWrapMinified: boolean; isViewportWrapping: boolean; wrappingColumn: number; } = null; + let wordWrap = opts.wordWrap; { - let wordWrap = opts.wordWrap; - const wordWrapColumn = this._toInteger(opts.wordWrapColumn, 1); - const wordWrapMinified = this._toBoolean(opts.wordWrapMinified); - // Compatibility with old true or false values if (wordWrap === true) { wordWrap = 'on'; @@ -1602,6 +1884,199 @@ export class InternalEditorOptionsFactory { wordWrap = 'off'; } + wordWrap = _stringSet<'off' | 'on' | 'wordWrapColumn' | 'bounded'>(wordWrap, defaults.wordWrap, ['off', 'on', 'wordWrapColumn', 'bounded']); + } + + let renderWhitespace = opts.renderWhitespace; + { + // Compatibility with old true or false values + if (renderWhitespace === true) { + renderWhitespace = 'boundary'; + } else if (renderWhitespace === false) { + renderWhitespace = 'none'; + } + renderWhitespace = _stringSet<'none' | 'boundary' | 'all'>(opts.renderWhitespace, defaults.renderWhitespace, ['none', 'boundary', 'all']); + } + + let renderLineHighlight = opts.renderLineHighlight; + { + // Compatibility with old true or false values + if (renderLineHighlight === true) { + renderLineHighlight = 'line'; + } else if (renderLineHighlight === false) { + renderLineHighlight = 'none'; + } + renderLineHighlight = _stringSet<'none' | 'gutter' | 'line' | 'all'>(opts.renderLineHighlight, defaults.renderLineHighlight, ['none', 'gutter', 'line', 'all']); + } + + const scrollbar = this._sanitizeScrollbarOpts(opts.scrollbar, defaults.scrollbar); + const minimap = this._sanitizeMinimapOpts(opts.minimap, defaults.minimap); + + let quickSuggestions: boolean | { other: boolean, comments: boolean, strings: boolean }; + if (typeof opts.quickSuggestions === 'object') { + quickSuggestions = { other: true, ...opts.quickSuggestions }; + } else { + quickSuggestions = _boolean(opts.quickSuggestions, defaults.quickSuggestions); + } + + return { + inDiffEditor: _boolean(opts.inDiffEditor, defaults.inDiffEditor), + experimentalScreenReader: _boolean(opts.experimentalScreenReader, defaults.experimentalScreenReader), + ariaLabel: _string(opts.ariaLabel, defaults.ariaLabel), + rulers: rulers, + wordSeparators: _string(opts.wordSeparators, defaults.wordSeparators), + selectionClipboard: _boolean(opts.selectionClipboard, defaults.selectionClipboard), + renderLineNumbers: renderLineNumbers, + renderCustomLineNumbers: renderCustomLineNumbers, + renderRelativeLineNumbers: renderRelativeLineNumbers, + selectOnLineNumbers: _boolean(opts.selectOnLineNumbers, defaults.selectOnLineNumbers), + lineNumbersMinChars: _clampedInt(opts.lineNumbersMinChars, defaults.lineNumbersMinChars, 1, 10), + glyphMargin: _boolean(opts.glyphMargin, defaults.glyphMargin), + lineDecorationsWidth: (typeof opts.lineDecorationsWidth === 'undefined' ? defaults.lineDecorationsWidth : opts.lineDecorationsWidth), + revealHorizontalRightPadding: _clampedInt(opts.revealHorizontalRightPadding, defaults.revealHorizontalRightPadding, 0, 1000), + roundedSelection: _boolean(opts.roundedSelection, defaults.roundedSelection), + theme: _string(opts.theme, defaults.theme), + readOnly: _boolean(opts.readOnly, defaults.readOnly), + scrollbar: scrollbar, + minimap: minimap, + fixedOverflowWidgets: _boolean(opts.fixedOverflowWidgets, defaults.fixedOverflowWidgets), + overviewRulerLanes: _clampedInt(opts.overviewRulerLanes, defaults.overviewRulerLanes, 0, 3), + overviewRulerBorder: _boolean(opts.overviewRulerBorder, defaults.overviewRulerBorder), + cursorBlinking: _cursorBlinkingStyleFromString(opts.cursorBlinking, defaults.cursorBlinking), + mouseWheelZoom: _boolean(opts.mouseWheelZoom, defaults.mouseWheelZoom), + mouseStyle: _stringSet<'text' | 'default' | 'copy'>(opts.mouseStyle, defaults.mouseStyle, ['text', 'default', 'copy']), + cursorStyle: _cursorStyleFromString(opts.cursorStyle, defaults.cursorStyle), + fontLigatures: _boolean(opts.fontLigatures, defaults.fontLigatures), + disableTranslate3d: _boolean(opts.disableTranslate3d, defaults.disableTranslate3d), + disableMonospaceOptimizations: _boolean(opts.disableMonospaceOptimizations, defaults.disableMonospaceOptimizations), + hideCursorInOverviewRuler: _boolean(opts.hideCursorInOverviewRuler, defaults.hideCursorInOverviewRuler), + scrollBeyondLastLine: _boolean(opts.scrollBeyondLastLine, defaults.scrollBeyondLastLine), + automaticLayout: _boolean(opts.automaticLayout, defaults.automaticLayout), + wordWrap: wordWrap, + wordWrapColumn: _clampedInt(opts.wordWrapColumn, defaults.wordWrapColumn, 1, Constants.MAX_SAFE_SMALL_INTEGER), + wordWrapMinified: _boolean(opts.wordWrapMinified, defaults.wordWrapMinified), + wrappingIndent: _wrappingIndentFromString(opts.wrappingIndent, defaults.wrappingIndent), + wordWrapBreakBeforeCharacters: _string(opts.wordWrapBreakBeforeCharacters, defaults.wordWrapBreakBeforeCharacters), + wordWrapBreakAfterCharacters: _string(opts.wordWrapBreakAfterCharacters, defaults.wordWrapBreakAfterCharacters), + wordWrapBreakObtrusiveCharacters: _string(opts.wordWrapBreakObtrusiveCharacters, defaults.wordWrapBreakObtrusiveCharacters), + stopRenderingLineAfter: _clampedInt(opts.stopRenderingLineAfter, defaults.stopRenderingLineAfter, -1, Constants.MAX_SAFE_SMALL_INTEGER), + hover: _boolean(opts.hover, defaults.hover), + contextmenu: _boolean(opts.contextmenu, defaults.contextmenu), + mouseWheelScrollSensitivity: _float(opts.mouseWheelScrollSensitivity, defaults.mouseWheelScrollSensitivity), + quickSuggestions: quickSuggestions, + quickSuggestionsDelay: _clampedInt(opts.quickSuggestionsDelay, defaults.quickSuggestionsDelay, Constants.MIN_SAFE_SMALL_INTEGER, Constants.MAX_SAFE_SMALL_INTEGER), + parameterHints: _boolean(opts.parameterHints, defaults.parameterHints), + iconsInSuggestions: _boolean(opts.iconsInSuggestions, defaults.iconsInSuggestions), + autoClosingBrackets: _boolean(opts.autoClosingBrackets, defaults.autoClosingBrackets), + formatOnType: _boolean(opts.formatOnType, defaults.formatOnType), + formatOnPaste: _boolean(opts.formatOnPaste, defaults.formatOnPaste), + dragAndDrop: _boolean(opts.dragAndDrop, defaults.dragAndDrop), + suggestOnTriggerCharacters: _boolean(opts.suggestOnTriggerCharacters, defaults.suggestOnTriggerCharacters), + acceptSuggestionOnEnter: _boolean(opts.acceptSuggestionOnEnter, defaults.acceptSuggestionOnEnter), + acceptSuggestionOnCommitCharacter: _boolean(opts.acceptSuggestionOnCommitCharacter, defaults.acceptSuggestionOnCommitCharacter), + snippetSuggestions: _stringSet<'top' | 'bottom' | 'inline' | 'none'>(opts.snippetSuggestions, defaults.snippetSuggestions, ['top', 'bottom', 'inline', 'none']), + emptySelectionClipboard: _boolean(opts.emptySelectionClipboard, defaults.emptySelectionClipboard), + wordBasedSuggestions: _boolean(opts.wordBasedSuggestions, defaults.wordBasedSuggestions), + suggestFontSize: _clampedInt(opts.suggestFontSize, defaults.suggestFontSize, 0, 1000), + suggestLineHeight: _clampedInt(opts.suggestLineHeight, defaults.suggestLineHeight, 0, 1000), + selectionHighlight: _boolean(opts.selectionHighlight, defaults.selectionHighlight), + occurrencesHighlight: _boolean(opts.occurrencesHighlight, defaults.occurrencesHighlight), + codeLens: _boolean(opts.codeLens, defaults.codeLens), + referenceInfos: _boolean(opts.referenceInfos, defaults.referenceInfos), + folding: _boolean(opts.folding, defaults.folding), + hideFoldIcons: _boolean(opts.hideFoldIcons, defaults.hideFoldIcons), + matchBrackets: _boolean(opts.matchBrackets, defaults.matchBrackets), + renderWhitespace: renderWhitespace, + renderControlCharacters: _boolean(opts.renderControlCharacters, defaults.renderControlCharacters), + renderIndentGuides: _boolean(opts.renderIndentGuides, defaults.renderIndentGuides), + renderLineHighlight: renderLineHighlight, + useTabStops: _boolean(opts.useTabStops, defaults.useTabStops), + }; + } + + private static _sanitizeScrollbarOpts(opts: IEditorScrollbarOptions, defaults: IValidatedEditorScrollbarOptions): IValidatedEditorScrollbarOptions { + if (typeof opts !== 'object') { + return defaults; + } + const horizontalScrollbarSize = _clampedInt(opts.horizontalScrollbarSize, defaults.horizontalScrollbarSize, 0, 1000); + const verticalScrollbarSize = _clampedInt(opts.verticalScrollbarSize, defaults.verticalScrollbarSize, 0, 1000); + return { + vertical: _scrollbarVisibilityFromString(opts.vertical, defaults.vertical), + horizontal: _scrollbarVisibilityFromString(opts.horizontal, defaults.horizontal), + + arrowSize: _clampedInt(opts.arrowSize, defaults.arrowSize, 0, 1000), + useShadows: _boolean(opts.useShadows, defaults.useShadows), + + verticalHasArrows: _boolean(opts.verticalHasArrows, defaults.verticalHasArrows), + horizontalHasArrows: _boolean(opts.horizontalHasArrows, defaults.horizontalHasArrows), + + horizontalScrollbarSize: horizontalScrollbarSize, + horizontalSliderSize: _clampedInt(opts.horizontalSliderSize, horizontalScrollbarSize, 0, 1000), + + verticalScrollbarSize: verticalScrollbarSize, + verticalSliderSize: _clampedInt(opts.verticalSliderSize, verticalScrollbarSize, 0, 1000), + + handleMouseWheel: _boolean(opts.handleMouseWheel, defaults.handleMouseWheel) + }; + } + + private static _sanitizeMinimapOpts(opts: IEditorMinimapOptions, defaults: IValidatedEditorMinimapOptions): IValidatedEditorMinimapOptions { + if (typeof opts !== 'object') { + return defaults; + } + return { + enabled: _boolean(opts.enabled, defaults.enabled), + renderCharacters: _boolean(opts.renderCharacters, defaults.renderCharacters), + maxColumn: _clampedInt(opts.maxColumn, defaults.maxColumn, 1, 10000), + }; + } +} + +/** + * @internal + */ +export class InternalEditorOptionsFactory { + + public static createInternalEditorOptions(env: EnvironmentalOptions, opts: IValidatedEditorOptions) { + + let lineDecorationsWidth: number; + if (typeof opts.lineDecorationsWidth === 'string' && /^\d+(\.\d+)?ch$/.test(opts.lineDecorationsWidth)) { + const multiple = parseFloat(opts.lineDecorationsWidth.substr(0, opts.lineDecorationsWidth.length - 2)); + lineDecorationsWidth = multiple * env.fontInfo.typicalHalfwidthCharacterWidth; + } else { + lineDecorationsWidth = _clampedInt(opts.lineDecorationsWidth, 0, 0, 1000); + } + if (opts.folding) { + lineDecorationsWidth += 16; + } + + const layoutInfo = EditorLayoutProvider.compute({ + outerWidth: env.outerWidth, + outerHeight: env.outerHeight, + showGlyphMargin: opts.glyphMargin, + lineHeight: env.fontInfo.lineHeight, + showLineNumbers: opts.renderLineNumbers, + lineNumbersMinChars: opts.lineNumbersMinChars, + lineNumbersDigitCount: env.lineNumbersDigitCount, + lineDecorationsWidth: lineDecorationsWidth, + typicalHalfwidthCharacterWidth: env.fontInfo.typicalHalfwidthCharacterWidth, + maxDigitWidth: env.fontInfo.maxDigitWidth, + verticalScrollbarWidth: opts.scrollbar.verticalScrollbarSize, + horizontalScrollbarHeight: opts.scrollbar.horizontalScrollbarSize, + scrollbarArrowSize: opts.scrollbar.arrowSize, + verticalScrollbarHasArrows: opts.scrollbar.verticalHasArrows, + minimap: opts.minimap.enabled, + minimapRenderCharacters: opts.minimap.renderCharacters, + minimapMaxColumn: opts.minimap.maxColumn, + pixelRatio: env.pixelRatio + }); + + let bareWrappingInfo: { isWordWrapMinified: boolean; isViewportWrapping: boolean; wrappingColumn: number; } = null; + { + let wordWrap = opts.wordWrap; + const wordWrapColumn = opts.wordWrapColumn; + const wordWrapMinified = opts.wordWrapMinified; + if (wordWrapMinified && env.isDominatedByLongLines) { // Force viewport width wrapping if model is dominated by long lines bareWrappingInfo = { @@ -1637,102 +2112,106 @@ export class InternalEditorOptionsFactory { } const wrappingInfo = new EditorWrappingInfo({ - inDiffEditor: Boolean(opts.inDiffEditor), + inDiffEditor: opts.inDiffEditor, isDominatedByLongLines: env.isDominatedByLongLines, isWordWrapMinified: bareWrappingInfo.isWordWrapMinified, isViewportWrapping: bareWrappingInfo.isViewportWrapping, wrappingColumn: bareWrappingInfo.wrappingColumn, - wrappingIndent: this._wrappingIndentFromString(opts.wrappingIndent), - wordWrapBreakBeforeCharacters: String(opts.wordWrapBreakBeforeCharacters), - wordWrapBreakAfterCharacters: String(opts.wordWrapBreakAfterCharacters), - wordWrapBreakObtrusiveCharacters: String(opts.wordWrapBreakObtrusiveCharacters), + wrappingIndent: opts.wrappingIndent, + wordWrapBreakBeforeCharacters: opts.wordWrapBreakBeforeCharacters, + wordWrapBreakAfterCharacters: opts.wordWrapBreakAfterCharacters, + wordWrapBreakObtrusiveCharacters: opts.wordWrapBreakObtrusiveCharacters, }); - const readOnly = this._toBoolean(opts.readOnly); - - let renderWhitespace = opts.renderWhitespace; - // Compatibility with old true or false values - if (renderWhitespace === true) { - renderWhitespace = 'boundary'; - } else if (renderWhitespace === false) { - renderWhitespace = 'none'; - } - - let renderLineHighlight = opts.renderLineHighlight; - // Compatibility with old true or false values - if (renderLineHighlight === true) { - renderLineHighlight = 'line'; - } else if (renderLineHighlight === false) { - renderLineHighlight = 'none'; - } - const viewInfo = new InternalEditorViewOptions({ theme: opts.theme, - canUseTranslate3d: this._toBoolean(opts.disableTranslate3d) ? false : env.canUseTranslate3d, - disableMonospaceOptimizations: (this._toBoolean(opts.disableMonospaceOptimizations) || this._toBoolean(opts.fontLigatures)), - experimentalScreenReader: this._toBoolean(opts.experimentalScreenReader), - rulers: this._toSortedIntegerArray(opts.rulers), - ariaLabel: String(opts.ariaLabel), - renderLineNumbers: renderLineNumbers, - renderCustomLineNumbers: renderCustomLineNumbers, - renderRelativeLineNumbers: renderRelativeLineNumbers, - selectOnLineNumbers: this._toBoolean(opts.selectOnLineNumbers), - glyphMargin: glyphMargin, - revealHorizontalRightPadding: this._toInteger(opts.revealHorizontalRightPadding, 0), - roundedSelection: this._toBoolean(opts.roundedSelection), - overviewRulerLanes: this._toInteger(opts.overviewRulerLanes, 0, 3), - overviewRulerBorder: this._toBoolean(opts.overviewRulerBorder), - cursorBlinking: this._cursorBlinkingStyleFromString(opts.cursorBlinking), - mouseWheelZoom: this._toBoolean(opts.mouseWheelZoom), - cursorStyle: this._cursorStyleFromString(opts.cursorStyle), - hideCursorInOverviewRuler: this._toBoolean(opts.hideCursorInOverviewRuler), - scrollBeyondLastLine: this._toBoolean(opts.scrollBeyondLastLine), + canUseTranslate3d: opts.disableTranslate3d ? false : env.canUseTranslate3d, + disableMonospaceOptimizations: (opts.disableMonospaceOptimizations || opts.fontLigatures), + experimentalScreenReader: opts.experimentalScreenReader, + rulers: opts.rulers, + ariaLabel: opts.ariaLabel, + renderLineNumbers: opts.renderLineNumbers, + renderCustomLineNumbers: opts.renderCustomLineNumbers, + renderRelativeLineNumbers: opts.renderRelativeLineNumbers, + selectOnLineNumbers: opts.selectOnLineNumbers, + glyphMargin: opts.glyphMargin, + revealHorizontalRightPadding: opts.revealHorizontalRightPadding, + roundedSelection: opts.roundedSelection, + overviewRulerLanes: opts.overviewRulerLanes, + overviewRulerBorder: opts.overviewRulerBorder, + cursorBlinking: opts.cursorBlinking, + mouseWheelZoom: opts.mouseWheelZoom, + cursorStyle: opts.cursorStyle, + hideCursorInOverviewRuler: opts.hideCursorInOverviewRuler, + scrollBeyondLastLine: opts.scrollBeyondLastLine, editorClassName: env.editorClassName, - stopRenderingLineAfter: stopRenderingLineAfter, - renderWhitespace: renderWhitespace, - renderControlCharacters: this._toBoolean(opts.renderControlCharacters), - fontLigatures: this._toBoolean(opts.fontLigatures), - renderIndentGuides: this._toBoolean(opts.renderIndentGuides), - renderLineHighlight: renderLineHighlight, - scrollbar: scrollbar, - minimap: minimap, - fixedOverflowWidgets: this._toBoolean(opts.fixedOverflowWidgets) + stopRenderingLineAfter: opts.stopRenderingLineAfter, + renderWhitespace: opts.renderWhitespace, + renderControlCharacters: opts.renderControlCharacters, + fontLigatures: opts.fontLigatures, + renderIndentGuides: opts.renderIndentGuides, + renderLineHighlight: opts.renderLineHighlight, + scrollbar: new InternalEditorScrollbarOptions({ + vertical: opts.scrollbar.vertical, + horizontal: opts.scrollbar.horizontal, + + arrowSize: opts.scrollbar.arrowSize, + useShadows: opts.scrollbar.useShadows, + + verticalHasArrows: opts.scrollbar.verticalHasArrows, + horizontalHasArrows: opts.scrollbar.horizontalHasArrows, + + horizontalScrollbarSize: opts.scrollbar.horizontalScrollbarSize, + horizontalSliderSize: opts.scrollbar.horizontalSliderSize, + + verticalScrollbarSize: opts.scrollbar.verticalScrollbarSize, + verticalSliderSize: opts.scrollbar.verticalSliderSize, + + handleMouseWheel: opts.scrollbar.handleMouseWheel, + mouseWheelScrollSensitivity: opts.mouseWheelScrollSensitivity + }), + minimap: new InternalEditorMinimapOptions({ + enabled: opts.minimap.enabled, + renderCharacters: opts.minimap.renderCharacters, + maxColumn: opts.minimap.maxColumn, + }), + fixedOverflowWidgets: opts.fixedOverflowWidgets }); const contribInfo = new EditorContribOptions({ - selectionClipboard: this._toBoolean(opts.selectionClipboard), - hover: this._toBoolean(opts.hover), - contextmenu: this._toBoolean(opts.contextmenu), - quickSuggestions: typeof opts.quickSuggestions === 'object' ? { other: true, ...opts.quickSuggestions } : this._toBoolean(opts.quickSuggestions), - quickSuggestionsDelay: this._toInteger(opts.quickSuggestionsDelay), - parameterHints: this._toBoolean(opts.parameterHints), - iconsInSuggestions: this._toBoolean(opts.iconsInSuggestions), - formatOnType: this._toBoolean(opts.formatOnType), - formatOnPaste: this._toBoolean(opts.formatOnPaste), - suggestOnTriggerCharacters: this._toBoolean(opts.suggestOnTriggerCharacters), - acceptSuggestionOnEnter: this._toBoolean(opts.acceptSuggestionOnEnter), - acceptSuggestionOnCommitCharacter: this._toBoolean(opts.acceptSuggestionOnCommitCharacter), + selectionClipboard: opts.selectionClipboard, + hover: opts.hover, + contextmenu: opts.contextmenu, + quickSuggestions: opts.quickSuggestions, + quickSuggestionsDelay: opts.quickSuggestionsDelay, + parameterHints: opts.parameterHints, + iconsInSuggestions: opts.iconsInSuggestions, + formatOnType: opts.formatOnType, + formatOnPaste: opts.formatOnPaste, + suggestOnTriggerCharacters: opts.suggestOnTriggerCharacters, + acceptSuggestionOnEnter: opts.acceptSuggestionOnEnter, + acceptSuggestionOnCommitCharacter: opts.acceptSuggestionOnCommitCharacter, snippetSuggestions: opts.snippetSuggestions, emptySelectionClipboard: opts.emptySelectionClipboard, wordBasedSuggestions: opts.wordBasedSuggestions, suggestFontSize: opts.suggestFontSize, suggestLineHeight: opts.suggestLineHeight, - selectionHighlight: this._toBoolean(opts.selectionHighlight), - occurrencesHighlight: this._toBoolean(opts.occurrencesHighlight), + selectionHighlight: opts.selectionHighlight, + occurrencesHighlight: opts.occurrencesHighlight, codeLens: opts.referenceInfos && opts.codeLens, - folding: this._toBoolean(opts.folding), - hideFoldIcons: this._toBoolean(opts.hideFoldIcons), - matchBrackets: this._toBoolean(opts.matchBrackets), + folding: opts.folding, + hideFoldIcons: opts.hideFoldIcons, + matchBrackets: opts.matchBrackets, }); return new InternalEditorOptions({ lineHeight: env.fontInfo.lineHeight, // todo -> duplicated in styling - readOnly: readOnly, - wordSeparators: String(opts.wordSeparators), - autoClosingBrackets: this._toBoolean(opts.autoClosingBrackets), - useTabStops: this._toBoolean(opts.useTabStops), - tabFocusMode: readOnly ? true : env.tabFocusMode, - dragAndDrop: this._toBoolean(opts.dragAndDrop), + readOnly: opts.readOnly, + wordSeparators: opts.wordSeparators, + autoClosingBrackets: opts.autoClosingBrackets, + useTabStops: opts.useTabStops, + tabFocusMode: opts.readOnly ? true : env.tabFocusMode, + dragAndDrop: opts.dragAndDrop, layoutInfo: layoutInfo, fontInfo: env.fontInfo, viewInfo: viewInfo, @@ -1740,143 +2219,6 @@ export class InternalEditorOptionsFactory { contribInfo: contribInfo, }); } - - private static _scrollbarVisibilityFromString(visibility: string): ScrollbarVisibility { - switch (visibility) { - case 'hidden': - return ScrollbarVisibility.Hidden; - case 'visible': - return ScrollbarVisibility.Visible; - default: - return ScrollbarVisibility.Auto; - } - } - - private static _sanitizeScrollbarOpts(raw: IEditorScrollbarOptions, mouseWheelScrollSensitivity: number): InternalEditorScrollbarOptions { - const horizontalScrollbarSize = this._toIntegerWithDefault(raw.horizontalScrollbarSize, 10); - const verticalScrollbarSize = this._toIntegerWithDefault(raw.verticalScrollbarSize, 14); - return new InternalEditorScrollbarOptions({ - vertical: this._scrollbarVisibilityFromString(raw.vertical), - horizontal: this._scrollbarVisibilityFromString(raw.horizontal), - - arrowSize: this._toIntegerWithDefault(raw.arrowSize, 11), - useShadows: this._toBooleanWithDefault(raw.useShadows, true), - - verticalHasArrows: this._toBooleanWithDefault(raw.verticalHasArrows, false), - horizontalHasArrows: this._toBooleanWithDefault(raw.horizontalHasArrows, false), - - horizontalScrollbarSize: horizontalScrollbarSize, - horizontalSliderSize: this._toIntegerWithDefault(raw.horizontalSliderSize, horizontalScrollbarSize), - - verticalScrollbarSize: verticalScrollbarSize, - verticalSliderSize: this._toIntegerWithDefault(raw.verticalSliderSize, verticalScrollbarSize), - - handleMouseWheel: this._toBooleanWithDefault(raw.handleMouseWheel, true), - mouseWheelScrollSensitivity: mouseWheelScrollSensitivity - }); - } - - private static _sanitizeMinimapOpts(raw: IEditorMinimapOptions): InternalEditorMinimapOptions { - let maxColumn = this._toIntegerWithDefault(raw.maxColumn, DefaultConfig.editor.minimap.maxColumn); - if (maxColumn < 1) { - maxColumn = 1; - } - return new InternalEditorMinimapOptions({ - enabled: this._toBooleanWithDefault(raw.enabled, DefaultConfig.editor.minimap.enabled), - renderCharacters: this._toBooleanWithDefault(raw.renderCharacters, DefaultConfig.editor.minimap.renderCharacters), - maxColumn: maxColumn, - }); - } - - private static _wrappingIndentFromString(wrappingIndent: string): WrappingIndent { - if (wrappingIndent === 'indent') { - return WrappingIndent.Indent; - } else if (wrappingIndent === 'same') { - return WrappingIndent.Same; - } else { - return WrappingIndent.None; - } - } - - private static _cursorStyleFromString(cursorStyle: string): TextEditorCursorStyle { - if (cursorStyle === 'line') { - return TextEditorCursorStyle.Line; - } else if (cursorStyle === 'block') { - return TextEditorCursorStyle.Block; - } else if (cursorStyle === 'underline') { - return TextEditorCursorStyle.Underline; - } else if (cursorStyle === 'line-thin') { - return TextEditorCursorStyle.LineThin; - } else if (cursorStyle === 'block-outline') { - return TextEditorCursorStyle.BlockOutline; - } else if (cursorStyle === 'underline-thin') { - return TextEditorCursorStyle.UnderlineThin; - } - return TextEditorCursorStyle.Line; - } - - private static _cursorBlinkingStyleFromString(cursorBlinkingStyle: string): TextEditorCursorBlinkingStyle { - switch (cursorBlinkingStyle) { - case 'blink': - return TextEditorCursorBlinkingStyle.Blink; - case 'smooth': - return TextEditorCursorBlinkingStyle.Smooth; - case 'phase': - return TextEditorCursorBlinkingStyle.Phase; - case 'expand': - return TextEditorCursorBlinkingStyle.Expand; - case 'visible': // maintain compatibility - case 'solid': - return TextEditorCursorBlinkingStyle.Solid; - } - return TextEditorCursorBlinkingStyle.Blink; - } - - private static _toBoolean(value: any): boolean { - return value === 'false' ? false : Boolean(value); - } - - private static _toBooleanWithDefault(value: any, defaultValue: boolean): boolean { - if (typeof value === 'undefined') { - return defaultValue; - } - return this._toBoolean(value); - } - - private static _toInteger(source: any, minimum: number = Constants.MIN_SAFE_SMALL_INTEGER, maximum: number = Constants.MAX_SAFE_SMALL_INTEGER): number { - let r = parseInt(source, 10); - if (isNaN(r)) { - r = 0; - } - r = Math.max(minimum, r); - r = Math.min(maximum, r); - return r | 0; - } - - private static _toIntegerWithDefault(source: any, defaultValue: number): number { - if (typeof source === 'undefined') { - return defaultValue; - } - return this._toInteger(source); - } - - private static _toSortedIntegerArray(source: any): number[] { - if (!Array.isArray(source)) { - return []; - } - const arrSource = source; - const r = arrSource.map(el => this._toInteger(el)); - r.sort(); - return r; - } - - private static _toFloat(source: any, defaultValue: number): number { - let r = parseFloat(source); - if (isNaN(r)) { - r = defaultValue; - } - return r; - } } /** diff --git a/src/vs/editor/common/config/fontInfo.ts b/src/vs/editor/common/config/fontInfo.ts index 1c291d02cf6..a7d1b36d47f 100644 --- a/src/vs/editor/common/config/fontInfo.ts +++ b/src/vs/editor/common/config/fontInfo.ts @@ -39,6 +39,13 @@ function clamp(n: number, min: number, max: number): number { return n; } +function _string(value: any, defaultValue: string): string { + if (typeof value !== 'string') { + return defaultValue; + } + return value; +} + export class BareFontInfo { readonly _bareFontInfoBrand: void; @@ -52,8 +59,8 @@ export class BareFontInfo { lineHeight?: number | string; }, zoomLevel: number): BareFontInfo { - let fontFamily = String(opts.fontFamily) || DefaultConfig.editor.fontFamily; - let fontWeight = String(opts.fontWeight) || DefaultConfig.editor.fontWeight; + let fontFamily = _string(opts.fontFamily, DefaultConfig.editor.fontFamily); + let fontWeight = _string(opts.fontWeight, DefaultConfig.editor.fontWeight); let fontSize = safeParseFloat(opts.fontSize, DefaultConfig.editor.fontSize); fontSize = clamp(fontSize, 0, 100); diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index 4010e1e6175..9581fa63cfb 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -1816,7 +1816,7 @@ export interface ICommonCodeEditor extends IEditor { getConfiguration(): editorOptions.InternalEditorOptions; /** - * Returns the 'raw' editor's configuration, as it was applied over the defaults, but without any computed members. + * Returns the 'raw' editor's configuration (without any validation or defaults). * @internal */ getRawConfiguration(): editorOptions.IEditorOptions; diff --git a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts index ef2c5cbe388..e16b24e47d0 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts @@ -670,7 +670,7 @@ class EditSettingRenderer extends Disposable { } private onConfigurationChanged(): void { - if (!this.editor.getRawConfiguration().glyphMargin) { + if (!this.editor.getConfiguration().viewInfo.glyphMargin) { this.editPreferenceWidgetForCusorPosition.hide(); this.editPreferenceWidgetForMouseMove.hide(); } @@ -720,7 +720,7 @@ class EditSettingRenderer extends Disposable { private showEditPreferencesWidget(editPreferencesWidget: EditPreferenceWidget, settings: ISetting[]) { const line = settings[0].valueRange.startLineNumber; - if (this.editor.getRawConfiguration().glyphMargin && this.marginFreeFromOtherDecorations(line)) { + if (this.editor.getConfiguration().viewInfo.glyphMargin && this.marginFreeFromOtherDecorations(line)) { editPreferencesWidget.show(line, nls.localize('editTtile', "Edit"), settings); const editPreferenceWidgetToHide = editPreferencesWidget === this.editPreferenceWidgetForCusorPosition ? this.editPreferenceWidgetForMouseMove : this.editPreferenceWidgetForCusorPosition; editPreferenceWidgetToHide.hide(); From ed52cdd5c316f086e1768ab2b092ddbb16c3a8d1 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 8 May 2017 17:32:18 +0200 Subject: [PATCH 0184/1164] Move default option values to editorOptions.ts --- .../editor/browser/widget/diffEditorWidget.ts | 5 +- src/vs/editor/common/commonCodeEditor.ts | 4 - .../common/config/commonEditorConfig.ts | 114 ++++----- src/vs/editor/common/config/defaultConfig.ts | 130 ----------- src/vs/editor/common/config/editorOptions.ts | 218 ++++++++++-------- src/vs/editor/common/config/fontInfo.ts | 17 +- src/vs/editor/common/model/textModel.ts | 8 +- .../common/services/modelServiceImpl.ts | 10 +- .../browser/referencesWidget.ts | 9 +- .../editor/contrib/suggest/browser/suggest.ts | 4 +- src/vs/editor/editor.main.ts | 8 +- .../electron-browser/toggleWordWrap.ts | 5 +- .../electron-browser/terminal.contribution.ts | 4 +- .../electron-browser/terminalConfigHelper.ts | 8 +- .../terminalConfigHelper.test.ts | 6 +- .../electron-browser/walkThroughPart.ts | 9 +- 16 files changed, 238 insertions(+), 321 deletions(-) delete mode 100644 src/vs/editor/common/config/defaultConfig.ts diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index d6fd59992d4..9958edfbde8 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -16,7 +16,6 @@ import { ISashEvent, IVerticalSashLayoutProvider, Sash } from 'vs/base/browser/u import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService'; -import { DefaultConfig } from 'vs/editor/common/config/defaultConfig'; import { Range, IRange } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; @@ -214,7 +213,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE this._domElement = domElement; options = options || {}; - this._theme = options.theme || DefaultConfig.editor.theme; + this._theme = options.theme || editorOptions.EDITOR_DEFAULTS.theme; // renderSideBySide this._renderSideBySide = true; if (typeof options.renderSideBySide !== 'undefined') { @@ -899,7 +898,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE private _adjustOptionsForRightHandSide(options: editorOptions.IDiffEditorOptions): editorOptions.IEditorOptions { let result = this._adjustOptionsForSubEditor(options); - result.revealHorizontalRightPadding = DefaultConfig.editor.revealHorizontalRightPadding + DiffEditorWidget.ENTIRE_DIFF_OVERVIEW_WIDTH; + result.revealHorizontalRightPadding = editorOptions.EDITOR_DEFAULTS.revealHorizontalRightPadding + DiffEditorWidget.ENTIRE_DIFF_OVERVIEW_WIDTH; result.scrollbar.verticalHasArrows = false; result.theme = this._theme + ' modified-in-monaco-diff-editor'; return result; diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index d7a01189a10..63609ca09a2 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -12,7 +12,6 @@ import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiati import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IContextKey, IContextKeyServiceTarget, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { CommonEditorConfiguration } from 'vs/editor/common/config/commonEditorConfig'; -import { DefaultConfig } from 'vs/editor/common/config/defaultConfig'; import { Cursor } from 'vs/editor/common/controller/cursor'; import { CursorColumns, IViewModelHelper, ICursors } from 'vs/editor/common/controller/cursorCommon'; import { Position, IPosition } from 'vs/editor/common/core/position'; @@ -126,9 +125,6 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo this._decorationTypeSubtypes = {}; options = options || {}; - if (typeof options.ariaLabel === 'undefined') { - options.ariaLabel = DefaultConfig.editor.ariaLabel; - } this._configuration = this._register(this._createConfiguration(options)); this._register(this._configuration.onDidChange((e) => { this._onDidChangeConfiguration.fire(e); diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 066c5ae79f3..9a1a5aa404c 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -11,11 +11,13 @@ import * as objects from 'vs/base/common/objects'; import * as platform from 'vs/base/common/platform'; import { Extensions, IConfigurationRegistry, IConfigurationNode } from 'vs/platform/configuration/common/configurationRegistry'; import { Registry } from 'vs/platform/platform'; -import { DefaultConfig, DEFAULT_INDENTATION, DEFAULT_TRIM_AUTO_WHITESPACE } from 'vs/editor/common/config/defaultConfig'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { FontInfo, BareFontInfo } from 'vs/editor/common/config/fontInfo'; import { EditorZoom } from 'vs/editor/common/config/editorZoom'; import * as editorOptions from 'vs/editor/common/config/editorOptions'; +import EDITOR_DEFAULTS = editorOptions.EDITOR_DEFAULTS; +import EDITOR_FONT_DEFAULTS = editorOptions.EDITOR_FONT_DEFAULTS; +import EDITOR_MODEL_DEFAULTS = editorOptions.EDITOR_MODEL_DEFAULTS; /** * Control what pressing Tab does. @@ -74,8 +76,8 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed constructor(options: editorOptions.IEditorOptions, elementSizeObserver: IElementSizeObserver = null) { super(); - this._rawOptions = options; - this._validatedOptions = editorOptions.EditorOptionsValidator.validate(this._rawOptions, editorOptions.DEFAULTS); + this._rawOptions = options || {}; + this._validatedOptions = editorOptions.EditorOptionsValidator.validate(this._rawOptions, EDITOR_DEFAULTS); this._elementSizeObserver = elementSizeObserver; this._isDominatedByLongLines = false; @@ -126,7 +128,7 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed public updateOptions(newOptions: editorOptions.IEditorOptions): void { this._rawOptions = objects.mixin(this._rawOptions, newOptions || {}); - this._validatedOptions = editorOptions.EditorOptionsValidator.validate(this._rawOptions, editorOptions.DEFAULTS); + this._validatedOptions = editorOptions.EditorOptionsValidator.validate(this._rawOptions, EDITOR_DEFAULTS); this._recomputeOptions(); } @@ -178,29 +180,29 @@ const editorConfiguration: IConfigurationNode = { 'properties': { 'editor.fontFamily': { 'type': 'string', - 'default': DefaultConfig.editor.fontFamily, + 'default': EDITOR_FONT_DEFAULTS.fontFamily, 'description': nls.localize('fontFamily', "Controls the font family.") }, 'editor.fontWeight': { 'type': 'string', 'enum': ['normal', 'bold', '100', '200', '300', '400', '500', '600', '700', '800', '900'], - 'default': DefaultConfig.editor.fontWeight, + 'default': EDITOR_FONT_DEFAULTS.fontWeight, 'description': nls.localize('fontWeight', "Controls the font weight.") }, 'editor.fontSize': { 'type': 'number', - 'default': DefaultConfig.editor.fontSize, + 'default': EDITOR_FONT_DEFAULTS.fontSize, 'description': nls.localize('fontSize', "Controls the font size in pixels.") }, 'editor.lineHeight': { 'type': 'number', - 'default': DefaultConfig.editor.lineHeight, + 'default': EDITOR_FONT_DEFAULTS.lineHeight, 'description': nls.localize('lineHeight', "Controls the line height. Use 0 to compute the lineHeight from the fontSize.") }, 'editor.lineNumbers': { 'type': 'string', 'enum': ['off', 'on', 'relative'], - 'default': DefaultConfig.editor.lineNumbers, + 'default': 'on', 'description': nls.localize('lineNumbers', "Controls the display of line numbers. Possible values are 'on', 'off', and 'relative'. 'relative' shows the line count from the current cursor position.") }, 'editor.rulers': { @@ -208,55 +210,55 @@ const editorConfiguration: IConfigurationNode = { 'items': { 'type': 'number' }, - 'default': DefaultConfig.editor.rulers, + 'default': EDITOR_DEFAULTS.rulers, 'description': nls.localize('rulers', "Columns at which to show vertical rulers") }, 'editor.wordSeparators': { 'type': 'string', - 'default': DefaultConfig.editor.wordSeparators, + 'default': EDITOR_DEFAULTS.wordSeparators, 'description': nls.localize('wordSeparators', "Characters that will be used as word separators when doing word related navigations or operations") }, 'editor.tabSize': { 'type': 'number', - 'default': DEFAULT_INDENTATION.tabSize, + 'default': EDITOR_MODEL_DEFAULTS.tabSize, 'minimum': 1, 'description': nls.localize('tabSize', "The number of spaces a tab is equal to. This setting is overriden based on the file contents when `editor.detectIndentation` is on."), 'errorMessage': nls.localize('tabSize.errorMessage', "Expected 'number'. Note that the value \"auto\" has been replaced by the `editor.detectIndentation` setting.") }, 'editor.insertSpaces': { 'type': 'boolean', - 'default': DEFAULT_INDENTATION.insertSpaces, + 'default': EDITOR_MODEL_DEFAULTS.insertSpaces, 'description': nls.localize('insertSpaces', "Insert spaces when pressing Tab. This setting is overriden based on the file contents when `editor.detectIndentation` is on."), 'errorMessage': nls.localize('insertSpaces.errorMessage', "Expected 'boolean'. Note that the value \"auto\" has been replaced by the `editor.detectIndentation` setting.") }, 'editor.detectIndentation': { 'type': 'boolean', - 'default': DEFAULT_INDENTATION.detectIndentation, + 'default': EDITOR_MODEL_DEFAULTS.detectIndentation, 'description': nls.localize('detectIndentation', "When opening a file, `editor.tabSize` and `editor.insertSpaces` will be detected based on the file contents.") }, 'editor.roundedSelection': { 'type': 'boolean', - 'default': DefaultConfig.editor.roundedSelection, + 'default': EDITOR_DEFAULTS.roundedSelection, 'description': nls.localize('roundedSelection', "Controls if selections have rounded corners") }, 'editor.scrollBeyondLastLine': { 'type': 'boolean', - 'default': DefaultConfig.editor.scrollBeyondLastLine, + 'default': EDITOR_DEFAULTS.scrollBeyondLastLine, 'description': nls.localize('scrollBeyondLastLine', "Controls if the editor will scroll beyond the last line") }, 'editor.minimap.enabled': { 'type': 'boolean', - 'default': DefaultConfig.editor.minimap.enabled, + 'default': EDITOR_DEFAULTS.minimap.enabled, 'description': nls.localize('minimap.enabled', "Controls if the minimap is shown") }, 'editor.minimap.renderCharacters': { 'type': 'boolean', - 'default': DefaultConfig.editor.minimap.renderCharacters, + 'default': EDITOR_DEFAULTS.minimap.renderCharacters, 'description': nls.localize('minimap.renderCharacters', "Render the actual characters on a line (as opposed to color blocks)") }, 'editor.minimap.maxColumn': { 'type': 'number', - 'default': DefaultConfig.editor.minimap.maxColumn, + 'default': EDITOR_DEFAULTS.minimap.maxColumn, 'description': nls.localize('minimap.maxColumn', "Limit the width of the minimap to render at most a certain number of columns") }, 'editor.wordWrap': { @@ -279,7 +281,7 @@ const editorConfiguration: IConfigurationNode = { ] }, "Lines will wrap at the minimum of viewport and `editor.wordWrapColumn`."), ], - 'default': DefaultConfig.editor.wordWrap, + 'default': EDITOR_DEFAULTS.wordWrap, 'description': nls.localize({ key: 'wordWrap', comment: [ @@ -290,7 +292,7 @@ const editorConfiguration: IConfigurationNode = { }, 'editor.wordWrapColumn': { 'type': 'integer', - 'default': DefaultConfig.editor.wordWrapColumn, + 'default': EDITOR_DEFAULTS.wordWrapColumn, 'minimum': 1, 'description': nls.localize({ key: 'wordWrapColumn', @@ -303,12 +305,12 @@ const editorConfiguration: IConfigurationNode = { 'editor.wrappingIndent': { 'type': 'string', 'enum': ['none', 'same', 'indent'], - 'default': DefaultConfig.editor.wrappingIndent, + 'default': 'same', 'description': nls.localize('wrappingIndent', "Controls the indentation of wrapped lines. Can be one of 'none', 'same' or 'indent'.") }, 'editor.mouseWheelScrollSensitivity': { 'type': 'number', - 'default': DefaultConfig.editor.mouseWheelScrollSensitivity, + 'default': EDITOR_DEFAULTS.mouseWheelScrollSensitivity, 'description': nls.localize('mouseWheelScrollSensitivity', "A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events") }, 'editor.quickSuggestions': { @@ -337,64 +339,64 @@ const editorConfiguration: IConfigurationNode = { } } ], - 'default': DefaultConfig.editor.quickSuggestions, + 'default': EDITOR_DEFAULTS.quickSuggestions, 'description': nls.localize('quickSuggestions', "Controls if suggestions should automatically show up while typing") }, 'editor.quickSuggestionsDelay': { 'type': 'integer', - 'default': DefaultConfig.editor.quickSuggestionsDelay, + 'default': EDITOR_DEFAULTS.quickSuggestionsDelay, 'minimum': 0, 'description': nls.localize('quickSuggestionsDelay', "Controls the delay in ms after which quick suggestions will show up") }, 'editor.parameterHints': { 'type': 'boolean', - 'default': DefaultConfig.editor.parameterHints, + 'default': EDITOR_DEFAULTS.parameterHints, 'description': nls.localize('parameterHints', "Enables parameter hints") }, 'editor.autoClosingBrackets': { 'type': 'boolean', - 'default': DefaultConfig.editor.autoClosingBrackets, + 'default': EDITOR_DEFAULTS.autoClosingBrackets, 'description': nls.localize('autoClosingBrackets', "Controls if the editor should automatically close brackets after opening them") }, 'editor.formatOnType': { 'type': 'boolean', - 'default': DefaultConfig.editor.formatOnType, + 'default': EDITOR_DEFAULTS.formatOnType, 'description': nls.localize('formatOnType', "Controls if the editor should automatically format the line after typing") }, 'editor.formatOnPaste': { 'type': 'boolean', - 'default': DefaultConfig.editor.formatOnPaste, + 'default': EDITOR_DEFAULTS.formatOnPaste, 'description': nls.localize('formatOnPaste', "Controls if the editor should automatically format the pasted content. A formatter must be available and the formatter should be able to format a range in a document.") }, 'editor.suggestOnTriggerCharacters': { 'type': 'boolean', - 'default': DefaultConfig.editor.suggestOnTriggerCharacters, + 'default': EDITOR_DEFAULTS.suggestOnTriggerCharacters, 'description': nls.localize('suggestOnTriggerCharacters', "Controls if suggestions should automatically show up when typing trigger characters") }, 'editor.acceptSuggestionOnEnter': { 'type': 'boolean', - 'default': DefaultConfig.editor.acceptSuggestionOnEnter, + 'default': EDITOR_DEFAULTS.acceptSuggestionOnEnter, 'description': nls.localize('acceptSuggestionOnEnter', "Controls if suggestions should be accepted on 'Enter' - in addition to 'Tab'. Helps to avoid ambiguity between inserting new lines or accepting suggestions.") }, 'editor.acceptSuggestionOnCommitCharacter': { 'type': 'boolean', - 'default': DefaultConfig.editor.acceptSuggestionOnCommitCharacter, + 'default': EDITOR_DEFAULTS.acceptSuggestionOnCommitCharacter, 'description': nls.localize('acceptSuggestionOnCommitCharacter', "Controls if suggestions should be accepted on commit characters. For instance in JavaScript the semi-colon (';') can be a commit character that accepts a suggestion and types that character.") }, 'editor.snippetSuggestions': { 'type': 'string', 'enum': ['top', 'bottom', 'inline', 'none'], - 'default': DefaultConfig.editor.snippetSuggestions, + 'default': EDITOR_DEFAULTS.snippetSuggestions, 'description': nls.localize('snippetSuggestions', "Controls whether snippets are shown with other suggestions and how they are sorted.") }, 'editor.emptySelectionClipboard': { 'type': 'boolean', - 'default': DefaultConfig.editor.emptySelectionClipboard, + 'default': EDITOR_DEFAULTS.emptySelectionClipboard, 'description': nls.localize('emptySelectionClipboard', "Controls whether copying without a selection copies the current line.") }, 'editor.wordBasedSuggestions': { 'type': 'boolean', - 'default': DefaultConfig.editor.wordBasedSuggestions, + 'default': EDITOR_DEFAULTS.wordBasedSuggestions, 'description': nls.localize('wordBasedSuggestions', "Controls whether completions should be computed based on words in the document.") }, 'editor.suggestFontSize': { @@ -411,12 +413,12 @@ const editorConfiguration: IConfigurationNode = { }, 'editor.selectionHighlight': { 'type': 'boolean', - 'default': DefaultConfig.editor.selectionHighlight, + 'default': EDITOR_DEFAULTS.selectionHighlight, 'description': nls.localize('selectionHighlight', "Controls whether the editor should highlight similar matches to the selection") }, 'editor.occurrencesHighlight': { 'type': 'boolean', - 'default': DefaultConfig.editor.occurrencesHighlight, + 'default': EDITOR_DEFAULTS.occurrencesHighlight, 'description': nls.localize('occurrencesHighlight', "Controls whether the editor should highlight semantic symbol occurrences") }, 'editor.overviewRulerLanes': { @@ -426,91 +428,91 @@ const editorConfiguration: IConfigurationNode = { }, 'editor.overviewRulerBorder': { 'type': 'boolean', - 'default': DefaultConfig.editor.overviewRulerBorder, + 'default': EDITOR_DEFAULTS.overviewRulerBorder, 'description': nls.localize('overviewRulerBorder', "Controls if a border should be drawn around the overview ruler.") }, 'editor.cursorBlinking': { 'type': 'string', 'enum': ['blink', 'smooth', 'phase', 'expand', 'solid'], - 'default': DefaultConfig.editor.cursorBlinking, + 'default': EDITOR_DEFAULTS.cursorBlinking, 'description': nls.localize('cursorBlinking', "Control the cursor animation style, possible values are 'blink', 'smooth', 'phase', 'expand' and 'solid'") }, 'editor.mouseWheelZoom': { 'type': 'boolean', - 'default': DefaultConfig.editor.mouseWheelZoom, + 'default': EDITOR_DEFAULTS.mouseWheelZoom, 'description': nls.localize('mouseWheelZoom', "Zoom the font of the editor when using mouse wheel and holding Ctrl") }, 'editor.cursorStyle': { 'type': 'string', 'enum': ['block', 'block-outline', 'line', 'line-thin', 'underline', 'underline-thin'], - 'default': DefaultConfig.editor.cursorStyle, + 'default': EDITOR_DEFAULTS.cursorStyle, 'description': nls.localize('cursorStyle', "Controls the cursor style, accepted values are 'block', 'block-outline', 'line', 'line-thin', 'underline' and 'underline-thin'") }, 'editor.fontLigatures': { 'type': 'boolean', - 'default': DefaultConfig.editor.fontLigatures, + 'default': EDITOR_DEFAULTS.fontLigatures, 'description': nls.localize('fontLigatures', "Enables font ligatures") }, 'editor.hideCursorInOverviewRuler': { 'type': 'boolean', - 'default': DefaultConfig.editor.hideCursorInOverviewRuler, + 'default': EDITOR_DEFAULTS.hideCursorInOverviewRuler, 'description': nls.localize('hideCursorInOverviewRuler', "Controls if the cursor should be hidden in the overview ruler.") }, 'editor.renderWhitespace': { 'type': 'string', 'enum': ['none', 'boundary', 'all'], - default: DefaultConfig.editor.renderWhitespace, + default: EDITOR_DEFAULTS.renderWhitespace, description: nls.localize('renderWhitespace', "Controls how the editor should render whitespace characters, possibilities are 'none', 'boundary', and 'all'. The 'boundary' option does not render single spaces between words.") }, 'editor.renderControlCharacters': { 'type': 'boolean', - default: DefaultConfig.editor.renderControlCharacters, + default: EDITOR_DEFAULTS.renderControlCharacters, description: nls.localize('renderControlCharacters', "Controls whether the editor should render control characters") }, 'editor.renderIndentGuides': { 'type': 'boolean', - default: DefaultConfig.editor.renderIndentGuides, + default: EDITOR_DEFAULTS.renderIndentGuides, description: nls.localize('renderIndentGuides', "Controls whether the editor should render indent guides") }, 'editor.renderLineHighlight': { 'type': 'string', 'enum': ['none', 'gutter', 'line', 'all'], - default: DefaultConfig.editor.renderLineHighlight, + default: EDITOR_DEFAULTS.renderLineHighlight, description: nls.localize('renderLineHighlight', "Controls how the editor should render the current line highlight, possibilities are 'none', 'gutter', 'line', and 'all'.") }, 'editor.codeLens': { 'type': 'boolean', - 'default': DefaultConfig.editor.codeLens, + 'default': EDITOR_DEFAULTS.codeLens, 'description': nls.localize('codeLens', "Controls if the editor shows code lenses") }, 'editor.folding': { 'type': 'boolean', - 'default': DefaultConfig.editor.folding, + 'default': EDITOR_DEFAULTS.folding, 'description': nls.localize('folding', "Controls whether the editor has code folding enabled") }, 'editor.hideFoldIcons': { 'type': 'boolean', - 'default': DefaultConfig.editor.hideFoldIcons, + 'default': EDITOR_DEFAULTS.hideFoldIcons, 'description': nls.localize('hideFoldIcons', "Controls whether the fold icons on the gutter are automatically hidden.") }, 'editor.matchBrackets': { 'type': 'boolean', - 'default': DefaultConfig.editor.matchBrackets, + 'default': EDITOR_DEFAULTS.matchBrackets, 'description': nls.localize('matchBrackets', "Highlight matching brackets when one of them is selected.") }, 'editor.glyphMargin': { 'type': 'boolean', - 'default': DefaultConfig.editor.glyphMargin, + 'default': EDITOR_DEFAULTS.glyphMargin, 'description': nls.localize('glyphMargin', "Controls whether the editor should render the vertical glyph margin. Glyph margin is mostly used for debugging.") }, 'editor.useTabStops': { 'type': 'boolean', - 'default': DefaultConfig.editor.useTabStops, + 'default': EDITOR_DEFAULTS.useTabStops, 'description': nls.localize('useTabStops', "Inserting and deleting whitespace follows tab stops") }, 'editor.trimAutoWhitespace': { 'type': 'boolean', - 'default': DEFAULT_TRIM_AUTO_WHITESPACE, + 'default': EDITOR_MODEL_DEFAULTS.trimAutoWhitespace, 'description': nls.localize('trimAutoWhitespace', "Remove trailing auto inserted whitespace") }, 'editor.stablePeek': { @@ -520,7 +522,7 @@ const editorConfiguration: IConfigurationNode = { }, 'editor.dragAndDrop': { 'type': 'boolean', - 'default': DefaultConfig.editor.dragAndDrop, + 'default': EDITOR_DEFAULTS.dragAndDrop, 'description': nls.localize('dragAndDrop', "Controls if the editor should allow to move selections via drag and drop.") }, 'diffEditor.renderSideBySide': { @@ -544,7 +546,7 @@ const editorConfiguration: IConfigurationNode = { if (platform.isLinux) { editorConfiguration['properties']['editor.selectionClipboard'] = { 'type': 'boolean', - 'default': DefaultConfig.editor.selectionClipboard, + 'default': EDITOR_DEFAULTS.selectionClipboard, 'description': nls.localize('selectionClipboard', "Controls if the Linux primary clipboard should be supported.") }; } diff --git a/src/vs/editor/common/config/defaultConfig.ts b/src/vs/editor/common/config/defaultConfig.ts deleted file mode 100644 index 0662f2bf9e1..00000000000 --- a/src/vs/editor/common/config/defaultConfig.ts +++ /dev/null @@ -1,130 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import * as nls from 'vs/nls'; -import * as platform from 'vs/base/common/platform'; -import { USUAL_WORD_SEPARATORS } from 'vs/editor/common/model/wordHelper'; -import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; - -export interface IConfiguration { - editor: IEditorOptions; -} - -export const DEFAULT_INDENTATION = { - tabSize: 4, - insertSpaces: true, - detectIndentation: true -}; -export const DEFAULT_TRIM_AUTO_WHITESPACE = true; - -const DEFAULT_WINDOWS_FONT_FAMILY = 'Consolas, \'Courier New\', monospace'; -const DEFAULT_MAC_FONT_FAMILY = 'Menlo, Monaco, \'Courier New\', monospace'; -const DEFAULT_LINUX_FONT_FAMILY = '\'Droid Sans Mono\', \'Courier New\', monospace, \'Droid Sans Fallback\''; - -/** - * Determined from empirical observations. - */ -export const GOLDEN_LINE_HEIGHT_RATIO = platform.isMacintosh ? 1.5 : 1.35; - -class ConfigClass implements IConfiguration { - - public editor: IEditorOptions; - - constructor() { - this.editor = { - experimentalScreenReader: true, - rulers: [], - wordSeparators: USUAL_WORD_SEPARATORS, - selectionClipboard: true, - ariaLabel: nls.localize('editorViewAccessibleLabel', "Editor content"), - lineNumbers: 'on', - selectOnLineNumbers: true, - lineNumbersMinChars: 5, - glyphMargin: true, - lineDecorationsWidth: 10, - revealHorizontalRightPadding: 30, - roundedSelection: true, - theme: 'vs', - readOnly: false, - scrollbar: { - verticalScrollbarSize: 14, - horizontal: 'auto', - useShadows: true, - verticalHasArrows: false, - horizontalHasArrows: false - }, - minimap: { - enabled: false, - renderCharacters: true, - maxColumn: 120 - }, - fixedOverflowWidgets: false, - overviewRulerLanes: 2, - overviewRulerBorder: true, - cursorBlinking: 'blink', - mouseWheelZoom: false, - cursorStyle: 'line', - mouseStyle: 'text', - fontLigatures: false, - disableTranslate3d: false, - disableMonospaceOptimizations: false, - hideCursorInOverviewRuler: false, - scrollBeyondLastLine: true, - automaticLayout: false, - wordWrap: 'off', - wordWrapColumn: 80, - wordWrapMinified: true, - wrappingIndent: 'same', - wordWrapBreakBeforeCharacters: '([{‘“〈《「『【〔([{「£¥$£¥++', - wordWrapBreakAfterCharacters: ' \t})]?|&,;¢°′″‰℃、。。、¢,.:;?!%・・ゝゞヽヾーァィゥェォッャュョヮヵヶぁぃぅぇぉっゃゅょゎゕゖㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ々〻ァィゥェォャュョッー’”〉》」』】〕)]}」', - wordWrapBreakObtrusiveCharacters: '.', - - // Features - hover: true, - contextmenu: true, - mouseWheelScrollSensitivity: 1, - quickSuggestions: { other: true, comments: false, strings: false }, - quickSuggestionsDelay: 10, - parameterHints: true, - iconsInSuggestions: true, - autoClosingBrackets: true, - formatOnType: false, - formatOnPaste: false, - suggestOnTriggerCharacters: true, - acceptSuggestionOnEnter: true, - acceptSuggestionOnCommitCharacter: true, - snippetSuggestions: 'inline', - emptySelectionClipboard: true, - wordBasedSuggestions: true, - suggestFontSize: 0, - suggestLineHeight: 0, - selectionHighlight: true, - occurrencesHighlight: true, - codeLens: true, - referenceInfos: true, - folding: true, - hideFoldIcons: true, - renderWhitespace: 'none', - renderControlCharacters: false, - renderIndentGuides: false, - renderLineHighlight: 'line', - useTabStops: true, - matchBrackets: true, - dragAndDrop: false, - - fontFamily: ( - platform.isMacintosh ? DEFAULT_MAC_FONT_FAMILY : (platform.isLinux ? DEFAULT_LINUX_FONT_FAMILY : DEFAULT_WINDOWS_FONT_FAMILY) - ), - fontWeight: 'normal', - fontSize: ( - platform.isMacintosh ? 12 : 14 - ), - lineHeight: 0 - }; - } -} - -export const DefaultConfig: IConfiguration = new ConfigClass(); diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 4c3c216e88f..cd983f9dcf4 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -4,10 +4,12 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; +import * as nls from 'vs/nls'; +import * as platform from 'vs/base/common/platform'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; import { FontInfo } from 'vs/editor/common/config/fontInfo'; import { Constants } from 'vs/editor/common/core/uint'; -import { DefaultConfig } from "vs/editor/common/config/defaultConfig"; +import { USUAL_WORD_SEPARATORS } from 'vs/editor/common/model/wordHelper'; /** * Configuration options for editor scrollbars @@ -1730,99 +1732,6 @@ function _scrollbarVisibilityFromString(visibility: string, defaultValue: Scroll } } -/** - * @internal - */ -export const DEFAULTS: IValidatedEditorOptions = { - inDiffEditor: false, - experimentalScreenReader: DefaultConfig.editor.experimentalScreenReader, - ariaLabel: DefaultConfig.editor.ariaLabel, - rulers: DefaultConfig.editor.rulers, - wordSeparators: DefaultConfig.editor.wordSeparators, - selectionClipboard: DefaultConfig.editor.selectionClipboard, - renderLineNumbers: true, - renderCustomLineNumbers: null, - renderRelativeLineNumbers: false, - selectOnLineNumbers: DefaultConfig.editor.selectOnLineNumbers, - lineNumbersMinChars: DefaultConfig.editor.lineNumbersMinChars, - glyphMargin: DefaultConfig.editor.glyphMargin, - lineDecorationsWidth: DefaultConfig.editor.lineDecorationsWidth, - revealHorizontalRightPadding: DefaultConfig.editor.revealHorizontalRightPadding, - roundedSelection: DefaultConfig.editor.roundedSelection, - theme: DefaultConfig.editor.theme, - readOnly: DefaultConfig.editor.readOnly, - scrollbar: { - vertical: ScrollbarVisibility.Auto, - horizontal: ScrollbarVisibility.Auto, - arrowSize: 11, - useShadows: true, - verticalHasArrows: false, - horizontalHasArrows: false, - horizontalScrollbarSize: 10, - horizontalSliderSize: 10, - verticalScrollbarSize: 14, - verticalSliderSize: 14, - handleMouseWheel: true - }, - minimap: { - enabled: false, - renderCharacters: true, - maxColumn: 120 - }, - fixedOverflowWidgets: DefaultConfig.editor.fixedOverflowWidgets, - overviewRulerLanes: DefaultConfig.editor.overviewRulerLanes, - overviewRulerBorder: DefaultConfig.editor.overviewRulerBorder, - cursorBlinking: TextEditorCursorBlinkingStyle.Blink, - mouseWheelZoom: DefaultConfig.editor.mouseWheelZoom, - mouseStyle: DefaultConfig.editor.mouseStyle, - cursorStyle: TextEditorCursorStyle.Line, - fontLigatures: DefaultConfig.editor.fontLigatures, - disableTranslate3d: DefaultConfig.editor.disableTranslate3d, - disableMonospaceOptimizations: DefaultConfig.editor.disableMonospaceOptimizations, - hideCursorInOverviewRuler: DefaultConfig.editor.hideCursorInOverviewRuler, - scrollBeyondLastLine: DefaultConfig.editor.scrollBeyondLastLine, - automaticLayout: DefaultConfig.editor.automaticLayout, - wordWrap: DefaultConfig.editor.wordWrap, - wordWrapColumn: DefaultConfig.editor.wordWrapColumn, - wordWrapMinified: DefaultConfig.editor.wordWrapMinified, - wrappingIndent: WrappingIndent.Same, - wordWrapBreakBeforeCharacters: DefaultConfig.editor.wordWrapBreakBeforeCharacters, - wordWrapBreakAfterCharacters: DefaultConfig.editor.wordWrapBreakAfterCharacters, - wordWrapBreakObtrusiveCharacters: DefaultConfig.editor.wordWrapBreakObtrusiveCharacters, - stopRenderingLineAfter: 10000, - hover: DefaultConfig.editor.hover, - contextmenu: DefaultConfig.editor.contextmenu, - mouseWheelScrollSensitivity: DefaultConfig.editor.mouseWheelScrollSensitivity, - quickSuggestions: DefaultConfig.editor.quickSuggestions, - quickSuggestionsDelay: DefaultConfig.editor.quickSuggestionsDelay, - parameterHints: DefaultConfig.editor.parameterHints, - iconsInSuggestions: DefaultConfig.editor.iconsInSuggestions, - autoClosingBrackets: DefaultConfig.editor.autoClosingBrackets, - formatOnType: DefaultConfig.editor.formatOnType, - formatOnPaste: DefaultConfig.editor.formatOnPaste, - dragAndDrop: DefaultConfig.editor.dragAndDrop, - suggestOnTriggerCharacters: DefaultConfig.editor.suggestOnTriggerCharacters, - acceptSuggestionOnEnter: DefaultConfig.editor.acceptSuggestionOnEnter, - acceptSuggestionOnCommitCharacter: DefaultConfig.editor.acceptSuggestionOnCommitCharacter, - snippetSuggestions: DefaultConfig.editor.snippetSuggestions, - emptySelectionClipboard: DefaultConfig.editor.emptySelectionClipboard, - wordBasedSuggestions: DefaultConfig.editor.wordBasedSuggestions, - suggestFontSize: DefaultConfig.editor.suggestFontSize, - suggestLineHeight: DefaultConfig.editor.suggestLineHeight, - selectionHighlight: DefaultConfig.editor.selectionHighlight, - occurrencesHighlight: DefaultConfig.editor.occurrencesHighlight, - codeLens: DefaultConfig.editor.codeLens, - referenceInfos: DefaultConfig.editor.referenceInfos, - folding: DefaultConfig.editor.folding, - hideFoldIcons: DefaultConfig.editor.hideFoldIcons, - matchBrackets: DefaultConfig.editor.matchBrackets, - renderWhitespace: DefaultConfig.editor.renderWhitespace, - renderControlCharacters: DefaultConfig.editor.renderControlCharacters, - renderIndentGuides: DefaultConfig.editor.renderIndentGuides, - renderLineHighlight: DefaultConfig.editor.renderLineHighlight, - useTabStops: DefaultConfig.editor.useTabStops, -}; - /** * @internal */ @@ -2371,3 +2280,124 @@ export class EditorLayoutProvider { }); } } + +const DEFAULT_WINDOWS_FONT_FAMILY = 'Consolas, \'Courier New\', monospace'; +const DEFAULT_MAC_FONT_FAMILY = 'Menlo, Monaco, \'Courier New\', monospace'; +const DEFAULT_LINUX_FONT_FAMILY = '\'Droid Sans Mono\', \'Courier New\', monospace, \'Droid Sans Fallback\''; + +/** + * @internal + */ +export const EDITOR_FONT_DEFAULTS = { + fontFamily: ( + platform.isMacintosh ? DEFAULT_MAC_FONT_FAMILY : (platform.isLinux ? DEFAULT_LINUX_FONT_FAMILY : DEFAULT_WINDOWS_FONT_FAMILY) + ), + fontWeight: 'normal', + fontSize: ( + platform.isMacintosh ? 12 : 14 + ), + lineHeight: 0, +}; + +/** + * @internal + */ +export const EDITOR_MODEL_DEFAULTS = { + tabSize: 4, + insertSpaces: true, + detectIndentation: true, + trimAutoWhitespace: true +}; + +/** + * @internal + */ +export const EDITOR_DEFAULTS: IValidatedEditorOptions = { + inDiffEditor: false, + experimentalScreenReader: true, + ariaLabel: nls.localize('editorViewAccessibleLabel', "Editor content"), + rulers: [], + wordSeparators: USUAL_WORD_SEPARATORS, + selectionClipboard: true, + renderLineNumbers: true, + renderCustomLineNumbers: null, + renderRelativeLineNumbers: false, + selectOnLineNumbers: true, + lineNumbersMinChars: 5, + glyphMargin: true, + lineDecorationsWidth: 10, + revealHorizontalRightPadding: 30, + roundedSelection: true, + theme: 'vs', + readOnly: false, + scrollbar: { + vertical: ScrollbarVisibility.Auto, + horizontal: ScrollbarVisibility.Auto, + arrowSize: 11, + useShadows: true, + verticalHasArrows: false, + horizontalHasArrows: false, + horizontalScrollbarSize: 10, + horizontalSliderSize: 10, + verticalScrollbarSize: 14, + verticalSliderSize: 14, + handleMouseWheel: true + }, + minimap: { + enabled: false, + renderCharacters: true, + maxColumn: 120 + }, + fixedOverflowWidgets: false, + overviewRulerLanes: 2, + overviewRulerBorder: true, + cursorBlinking: TextEditorCursorBlinkingStyle.Blink, + mouseWheelZoom: false, + mouseStyle: 'text', + cursorStyle: TextEditorCursorStyle.Line, + fontLigatures: false, + disableTranslate3d: false, + disableMonospaceOptimizations: false, + hideCursorInOverviewRuler: false, + scrollBeyondLastLine: true, + automaticLayout: false, + wordWrap: 'off', + wordWrapColumn: 80, + wordWrapMinified: true, + wrappingIndent: WrappingIndent.Same, + wordWrapBreakBeforeCharacters: '([{‘“〈《「『【〔([{「£¥$£¥++', + wordWrapBreakAfterCharacters: ' \t})]?|&,;¢°′″‰℃、。。、¢,.:;?!%・・ゝゞヽヾーァィゥェォッャュョヮヵヶぁぃぅぇぉっゃゅょゎゕゖㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ々〻ァィゥェォャュョッー’”〉》」』】〕)]}」', + wordWrapBreakObtrusiveCharacters: '.', + stopRenderingLineAfter: 10000, + hover: true, + contextmenu: true, + mouseWheelScrollSensitivity: 1, + quickSuggestions: { other: true, comments: false, strings: false }, + quickSuggestionsDelay: 10, + parameterHints: true, + iconsInSuggestions: true, + autoClosingBrackets: true, + formatOnType: false, + formatOnPaste: false, + dragAndDrop: false, + suggestOnTriggerCharacters: true, + acceptSuggestionOnEnter: true, + acceptSuggestionOnCommitCharacter: true, + snippetSuggestions: 'inline', + emptySelectionClipboard: true, + wordBasedSuggestions: true, + suggestFontSize: 0, + suggestLineHeight: 0, + selectionHighlight: true, + occurrencesHighlight: true, + codeLens: true, + referenceInfos: true, + folding: true, + hideFoldIcons: true, + matchBrackets: true, + renderWhitespace: 'none', + renderControlCharacters: false, + renderIndentGuides: false, + renderLineHighlight: 'line', + useTabStops: true, +}; diff --git a/src/vs/editor/common/config/fontInfo.ts b/src/vs/editor/common/config/fontInfo.ts index a7d1b36d47f..947c51bf1b9 100644 --- a/src/vs/editor/common/config/fontInfo.ts +++ b/src/vs/editor/common/config/fontInfo.ts @@ -4,8 +4,15 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { DefaultConfig, GOLDEN_LINE_HEIGHT_RATIO } from 'vs/editor/common/config/defaultConfig'; +import * as platform from 'vs/base/common/platform'; import { EditorZoom } from 'vs/editor/common/config/editorZoom'; +import { EDITOR_FONT_DEFAULTS } from "vs/editor/common/config/editorOptions"; + +/** + * Determined from empirical observations. + * @internal + */ +const GOLDEN_LINE_HEIGHT_RATIO = platform.isMacintosh ? 1.5 : 1.35; function safeParseFloat(n: number | string, defaultValue: number): number { if (typeof n === 'number') { @@ -59,13 +66,13 @@ export class BareFontInfo { lineHeight?: number | string; }, zoomLevel: number): BareFontInfo { - let fontFamily = _string(opts.fontFamily, DefaultConfig.editor.fontFamily); - let fontWeight = _string(opts.fontWeight, DefaultConfig.editor.fontWeight); + let fontFamily = _string(opts.fontFamily, EDITOR_FONT_DEFAULTS.fontFamily); + let fontWeight = _string(opts.fontWeight, EDITOR_FONT_DEFAULTS.fontWeight); - let fontSize = safeParseFloat(opts.fontSize, DefaultConfig.editor.fontSize); + let fontSize = safeParseFloat(opts.fontSize, EDITOR_FONT_DEFAULTS.fontSize); fontSize = clamp(fontSize, 0, 100); if (fontSize === 0) { - fontSize = DefaultConfig.editor.fontSize; + fontSize = EDITOR_FONT_DEFAULTS.fontSize; } let lineHeight = safeParseInt(opts.lineHeight, 0); diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 3bc7ddc2490..a84d56ad65b 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -11,7 +11,7 @@ import { Range, IRange } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { ModelLine } from 'vs/editor/common/model/modelLine'; import { guessIndentation } from 'vs/editor/common/model/indentationGuesser'; -import { DEFAULT_INDENTATION, DEFAULT_TRIM_AUTO_WHITESPACE } from 'vs/editor/common/config/defaultConfig'; +import { EDITOR_MODEL_DEFAULTS } from "vs/editor/common/config/editorOptions"; import { PrefixSumComputer } from 'vs/editor/common/viewModel/prefixSumComputer'; import { IndentRange, computeRanges } from 'vs/editor/common/model/indentRanges'; import { TextModelSearch, SearchParams } from 'vs/editor/common/model/textModelSearch'; @@ -32,11 +32,11 @@ export class TextModel implements editorCommon.ITextModel { private static MODEL_TOKENIZATION_LIMIT = 20 * 1024 * 1024; // 20 MB public static DEFAULT_CREATION_OPTIONS: editorCommon.ITextModelCreationOptions = { - tabSize: DEFAULT_INDENTATION.tabSize, - insertSpaces: DEFAULT_INDENTATION.insertSpaces, + tabSize: EDITOR_MODEL_DEFAULTS.tabSize, + insertSpaces: EDITOR_MODEL_DEFAULTS.insertSpaces, detectIndentation: false, defaultEOL: editorCommon.DefaultEndOfLine.LF, - trimAutoWhitespace: DEFAULT_TRIM_AUTO_WHITESPACE, + trimAutoWhitespace: EDITOR_MODEL_DEFAULTS.trimAutoWhitespace, }; public static createFromString(text: string, options: editorCommon.ITextModelCreationOptions = TextModel.DEFAULT_CREATION_OPTIONS): TextModel { diff --git a/src/vs/editor/common/services/modelServiceImpl.ts b/src/vs/editor/common/services/modelServiceImpl.ts index 9bbb35747dc..ad1b9ba8fc6 100644 --- a/src/vs/editor/common/services/modelServiceImpl.ts +++ b/src/vs/editor/common/services/modelServiceImpl.ts @@ -21,7 +21,7 @@ import { IMode, LanguageIdentifier } from 'vs/editor/common/modes'; import { IModelService } from 'vs/editor/common/services/modelService'; import * as platform from 'vs/base/common/platform'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { DEFAULT_INDENTATION, DEFAULT_TRIM_AUTO_WHITESPACE } from 'vs/editor/common/config/defaultConfig'; +import { EDITOR_MODEL_DEFAULTS } from "vs/editor/common/config/editorOptions"; import { PLAINTEXT_LANGUAGE_IDENTIFIER } from 'vs/editor/common/modes/modesRegistry'; import { IRawTextSource, TextSource, RawTextSource } from 'vs/editor/common/model/textSource'; import * as textModelEvents from 'vs/editor/common/model/textModelEvents'; @@ -223,7 +223,7 @@ export class ModelServiceImpl implements IModelService { } private static _readModelOptions(config: IRawConfig): editorCommon.ITextModelCreationOptions { - let tabSize = DEFAULT_INDENTATION.tabSize; + let tabSize = EDITOR_MODEL_DEFAULTS.tabSize; if (config.editor && typeof config.editor.tabSize !== 'undefined') { let parsedTabSize = parseInt(config.editor.tabSize, 10); if (!isNaN(parsedTabSize)) { @@ -231,7 +231,7 @@ export class ModelServiceImpl implements IModelService { } } - let insertSpaces = DEFAULT_INDENTATION.insertSpaces; + let insertSpaces = EDITOR_MODEL_DEFAULTS.insertSpaces; if (config.editor && typeof config.editor.insertSpaces !== 'undefined') { insertSpaces = (config.editor.insertSpaces === 'false' ? false : Boolean(config.editor.insertSpaces)); } @@ -244,12 +244,12 @@ export class ModelServiceImpl implements IModelService { newDefaultEOL = editorCommon.DefaultEndOfLine.LF; } - let trimAutoWhitespace = DEFAULT_TRIM_AUTO_WHITESPACE; + let trimAutoWhitespace = EDITOR_MODEL_DEFAULTS.trimAutoWhitespace; if (config.editor && typeof config.editor.trimAutoWhitespace !== 'undefined') { trimAutoWhitespace = (config.editor.trimAutoWhitespace === 'false' ? false : Boolean(config.editor.trimAutoWhitespace)); } - let detectIndentation = DEFAULT_INDENTATION.detectIndentation; + let detectIndentation = EDITOR_MODEL_DEFAULTS.detectIndentation; if (config.editor && typeof config.editor.detectIndentation !== 'undefined') { detectIndentation = (config.editor.detectIndentation === 'false' ? false : Boolean(config.editor.detectIndentation)); } diff --git a/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts b/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts index 35a4b56d096..19d31c7d405 100644 --- a/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts +++ b/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts @@ -30,7 +30,6 @@ import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { DefaultConfig } from 'vs/editor/common/config/defaultConfig'; import { Range, IRange } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { Model } from 'vs/editor/common/model/model'; @@ -591,7 +590,13 @@ export class ReferenceWidget extends PeekViewWidget { var options: IEditorOptions = { scrollBeyondLastLine: false, - scrollbar: DefaultConfig.editor.scrollbar, + scrollbar: { + verticalScrollbarSize: 14, + horizontal: 'auto', + useShadows: true, + verticalHasArrows: false, + horizontalHasArrows: false + }, overviewRulerLanes: 2, fixedOverflowWidgets: true, minimap: { diff --git a/src/vs/editor/contrib/suggest/browser/suggest.ts b/src/vs/editor/contrib/suggest/browser/suggest.ts index 6ca956304cf..1e79d2e180b 100644 --- a/src/vs/editor/contrib/suggest/browser/suggest.ts +++ b/src/vs/editor/contrib/suggest/browser/suggest.ts @@ -15,14 +15,14 @@ import { CommonEditorRegistry } from 'vs/editor/common/editorCommonExtensions'; import { ISuggestResult, ISuggestSupport, ISuggestion, SuggestRegistry } from 'vs/editor/common/modes'; import { Position, IPosition } from 'vs/editor/common/core/position'; import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { DefaultConfig } from 'vs/editor/common/config/defaultConfig'; +import { EDITOR_DEFAULTS } from "vs/editor/common/config/editorOptions"; export const Context = { Visible: new RawContextKey('suggestWidgetVisible', false), MultipleSuggestions: new RawContextKey('suggestWidgetMultipleSuggestions', false), MakesTextEdit: new RawContextKey('suggestionMakesTextEdit', true), AcceptOnKey: new RawContextKey('suggestionSupportsAcceptOnKey', true), - AcceptSuggestionsOnEnter: new RawContextKey('acceptSuggestionOnEnter', DefaultConfig.editor.acceptSuggestionOnEnter) + AcceptSuggestionsOnEnter: new RawContextKey('acceptSuggestionOnEnter', EDITOR_DEFAULTS.acceptSuggestionOnEnter) }; export interface ISuggestionItem { diff --git a/src/vs/editor/editor.main.ts b/src/vs/editor/editor.main.ts index a0cf669373a..a06d77657e2 100644 --- a/src/vs/editor/editor.main.ts +++ b/src/vs/editor/editor.main.ts @@ -14,12 +14,12 @@ import 'vs/editor/contrib/inspectTokens/browser/inspectTokens'; import { createMonacoBaseAPI } from 'vs/editor/common/standalone/standaloneBase'; import { createMonacoEditorAPI } from 'vs/editor/browser/standalone/standaloneEditor'; import { createMonacoLanguagesAPI } from 'vs/editor/browser/standalone/standaloneLanguages'; -import { DefaultConfig } from 'vs/editor/common/config/defaultConfig'; +import { EDITOR_DEFAULTS, WrappingIndent } from "vs/editor/common/config/editorOptions"; // Set defaults for standalone editor -DefaultConfig.editor.wrappingIndent = 'none'; -DefaultConfig.editor.folding = false; -DefaultConfig.editor.glyphMargin = false; +EDITOR_DEFAULTS.wrappingIndent = WrappingIndent.None; +EDITOR_DEFAULTS.folding = false; +EDITOR_DEFAULTS.glyphMargin = false; var global: any = self; global.monaco = createMonacoBaseAPI(); diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.ts b/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.ts index 9773fc9163e..e0bf3b52629 100644 --- a/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.ts +++ b/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.ts @@ -11,14 +11,13 @@ import { ICommonCodeEditor, IEditorContribution, IModel } from 'vs/editor/common import { editorAction, ServicesAccessor, EditorAction, commonEditorContribution } from 'vs/editor/common/editorCommonExtensions'; import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { DefaultConfig } from 'vs/editor/common/config/defaultConfig'; import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { Disposable } from 'vs/base/common/lifecycle'; import { IMessageService } from 'vs/platform/message/common/message'; import Severity from 'vs/base/common/severity'; import URI from 'vs/base/common/uri'; -import { InternalEditorOptions } from 'vs/editor/common/config/editorOptions'; +import { InternalEditorOptions, EDITOR_DEFAULTS } from 'vs/editor/common/config/editorOptions'; const transientWordWrapState = 'transientWordWrapState'; const isWordWrapMinifiedKey = 'isWordWrapMinified'; @@ -67,7 +66,7 @@ function readWordWrapState(model: IModel, configurationService: IConfigurationSe const _transientState = readTransientState(model, codeEditorService); return { configuredWordWrap: _configuredWordWrap, - configuredWordWrapMinified: (typeof _configuredWordWrapMinified.value === 'undefined' ? DefaultConfig.editor.wordWrapMinified : _configuredWordWrapMinified.value), + configuredWordWrapMinified: (typeof _configuredWordWrapMinified.value === 'undefined' ? EDITOR_DEFAULTS.wordWrapMinified : _configuredWordWrapMinified.value), transientState: _transientState }; } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts index 88e1f59a9fd..1e5cae2592b 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts @@ -27,7 +27,7 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import debugActions = require('vs/workbench/parts/debug/browser/debugActions'); import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { OpenNextRecentlyUsedEditorInGroupAction, OpenPreviousRecentlyUsedEditorInGroupAction, FocusActiveGroupAction, FocusFirstGroupAction, FocusSecondGroupAction, FocusThirdGroupAction } from 'vs/workbench/browser/parts/editor/editorActions'; -import { DefaultConfig } from 'vs/editor/common/config/defaultConfig'; +import { EDITOR_FONT_DEFAULTS } from "vs/editor/common/config/editorOptions"; import { registerColors } from './terminalColorRegistry'; let configurationRegistry = Registry.as(Extensions.Configuration); @@ -96,7 +96,7 @@ configurationRegistry.registerConfiguration({ 'terminal.integrated.fontSize': { 'description': nls.localize('terminal.integrated.fontSize', "Controls the font size in pixels of the terminal."), 'type': 'number', - 'default': DefaultConfig.editor.fontSize + 'default': EDITOR_FONT_DEFAULTS.fontSize }, 'terminal.integrated.lineHeight': { 'description': nls.localize('terminal.integrated.lineHeight', "Controls the line height of the terminal, this number is multipled by the terminal font size to get the actual line-height in pixels."), diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts index b356edb05eb..fd87efa9993 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts @@ -5,7 +5,7 @@ import * as nls from 'vs/nls'; import * as platform from 'vs/base/common/platform'; -import { IConfiguration as IEditorConfiguration, DefaultConfig } from 'vs/editor/common/config/defaultConfig'; +import { EDITOR_FONT_DEFAULTS, IEditorOptions } from "vs/editor/common/config/editorOptions"; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; import { IChoiceService } from 'vs/platform/message/common/message'; @@ -14,6 +14,10 @@ import { ITerminalConfiguration, ITerminalConfigHelper, ITerminalFont, IShellLau import { Severity } from 'vs/editor/common/standalone/standaloneBase'; import { TPromise } from 'vs/base/common/winjs.base'; +interface IEditorConfiguration { + editor: IEditorOptions; +} + interface IFullTerminalConfiguration { terminal: { integrated: ITerminalConfiguration; @@ -86,7 +90,7 @@ export class TerminalConfigHelper implements ITerminalConfigHelper { const fontFamily = terminalConfig.fontFamily || editorConfig.fontFamily; let fontSize = this._toInteger(terminalConfig.fontSize, 0); if (fontSize <= 0) { - fontSize = DefaultConfig.editor.fontSize; + fontSize = EDITOR_FONT_DEFAULTS.fontSize; } let lineHeight = terminalConfig.lineHeight <= 0 ? DEFAULT_LINE_HEIGHT : terminalConfig.lineHeight; if (!lineHeight) { diff --git a/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts b/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts index 0943c00e0fd..285bc9025ad 100644 --- a/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts +++ b/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts @@ -10,7 +10,7 @@ import { IConfigurationService, getConfigurationValue } from 'vs/platform/config import { Platform } from 'vs/base/common/platform'; import { TPromise } from 'vs/base/common/winjs.base'; import { TerminalConfigHelper } from 'vs/workbench/parts/terminal/electron-browser/terminalConfigHelper'; -import { DefaultConfig } from 'vs/editor/common/config/defaultConfig'; +import { EDITOR_FONT_DEFAULTS } from "vs/editor/common/config/editorOptions"; class MockConfigurationService implements IConfigurationService { @@ -97,7 +97,7 @@ suite('Workbench - TerminalConfigHelper', () => { }); configHelper = new TerminalConfigHelper(Platform.Linux, configurationService, null, null, null); configHelper.panelContainer = fixture; - assert.equal(configHelper.getFont().fontSize, `${DefaultConfig.editor.fontSize}px`, 'The default editor font size should be used when editor.fontSize is 0 and terminal.integrated.fontSize not set'); + assert.equal(configHelper.getFont().fontSize, `${EDITOR_FONT_DEFAULTS.fontSize}px`, 'The default editor font size should be used when editor.fontSize is 0 and terminal.integrated.fontSize not set'); configurationService = new MockConfigurationService({ editor: { @@ -113,7 +113,7 @@ suite('Workbench - TerminalConfigHelper', () => { }); configHelper = new TerminalConfigHelper(Platform.Linux, configurationService, null, null, null); configHelper.panelContainer = fixture; - assert.equal(configHelper.getFont().fontSize, `${DefaultConfig.editor.fontSize}px`, 'The default editor font size should be used when editor.fontSize is < 0 and terminal.integrated.fontSize not set'); + assert.equal(configHelper.getFont().fontSize, `${EDITOR_FONT_DEFAULTS.fontSize}px`, 'The default editor font size should be used when editor.fontSize is < 0 and terminal.integrated.fontSize not set'); }); test('TerminalConfigHelper - getFont lineHeight', function () { diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts index 7da8192ba26..640439add9a 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts @@ -11,7 +11,6 @@ import { ScrollbarVisibility } from 'vs/base/common/scrollable'; import * as strings from 'vs/base/common/strings'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; -import { DefaultConfig } from 'vs/editor/common/config/defaultConfig'; import { $, Dimension, Builder } from 'vs/base/browser/builder'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { EditorOptions } from 'vs/workbench/common/editor'; @@ -418,7 +417,13 @@ export class WalkThroughPart extends BaseEditor { return { ...isObject(config) ? config : Object.create(null), scrollBeyondLastLine: false, - scrollbar: DefaultConfig.editor.scrollbar, + scrollbar: { + verticalScrollbarSize: 14, + horizontal: 'auto', + useShadows: true, + verticalHasArrows: false, + horizontalHasArrows: false + }, overviewRulerLanes: 3, fixedOverflowWidgets: true, lineNumbersMinChars: 1, From 76b16244653800d5f961b646265ea8baca1c6cc8 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 8 May 2017 18:30:44 +0200 Subject: [PATCH 0185/1164] Simplify IConfigurationChangedEvent --- .../browser/controller/textAreaHandler.ts | 6 +- src/vs/editor/browser/view/viewImpl.ts | 2 +- .../currentLineHighlight.ts | 2 +- .../currentLineMarginHighlight.ts | 2 +- .../editorScrollbar/editorScrollbar.ts | 2 +- .../viewParts/glyphMargin/glyphMargin.ts | 2 +- .../viewParts/indentGuides/indentGuides.ts | 2 +- .../viewParts/lineNumbers/lineNumbers.ts | 4 +- .../browser/viewParts/lines/viewLines.ts | 4 +- .../editor/browser/viewParts/margin/margin.ts | 2 +- .../overviewRuler/decorationsOverviewRuler.ts | 35 +-- .../viewParts/overviewRuler/overviewRuler.ts | 6 +- .../editor/browser/viewParts/rulers/rulers.ts | 2 +- .../scrollDecoration/scrollDecoration.ts | 2 +- .../viewParts/selections/selections.ts | 2 +- .../viewParts/viewCursors/viewCursor.ts | 2 +- .../viewParts/viewCursors/viewCursors.ts | 6 +- src/vs/editor/common/config/editorOptions.ts | 226 ++++++------------ src/vs/editor/common/view/viewEvents.ts | 4 +- src/vs/monaco.d.ts | 40 +--- 20 files changed, 105 insertions(+), 248 deletions(-) diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index b438d95510a..f7b6e2e4415 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -266,18 +266,16 @@ export class TextAreaHandler extends ViewPart { if (e.fontInfo) { this._fontInfo = this._context.configuration.editor.fontInfo; } - if (e.viewInfo.experimentalScreenReader) { + if (e.viewInfo) { this._experimentalScreenReader = this._context.configuration.editor.viewInfo.experimentalScreenReader; this._textAreaInput.writeScreenReaderContent('strategy changed'); + this.textArea.setAttribute('aria-label', this._context.configuration.editor.viewInfo.ariaLabel); } if (e.layoutInfo) { this._contentLeft = this._context.configuration.editor.layoutInfo.contentLeft; this._contentWidth = this._context.configuration.editor.layoutInfo.contentWidth; this._contentHeight = this._context.configuration.editor.layoutInfo.contentHeight; } - if (e.viewInfo.ariaLabel) { - this.textArea.setAttribute('aria-label', this._context.configuration.editor.viewInfo.ariaLabel); - } if (e.lineHeight) { this._lineHeight = this._context.configuration.editor.lineHeight; } diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index a9a2d8f5491..80c203d0b56 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -340,7 +340,7 @@ export class View extends ViewEventHandler { // --- begin event handlers public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { - if (e.viewInfo.editorClassName) { + if (e.viewInfo) { this.domNode.setClassName(this._context.configuration.editor.viewInfo.editorClassName); } if (e.layoutInfo) { diff --git a/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts b/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts index 2aac9fc5557..a8b35d09f25 100644 --- a/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts +++ b/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts @@ -55,7 +55,7 @@ export class CurrentLineHighlightOverlay extends DynamicViewOverlay { if (e.readOnly) { this._readOnly = this._context.configuration.editor.readOnly; } - if (e.viewInfo.renderLineHighlight) { + if (e.viewInfo) { this._renderLineHighlight = this._context.configuration.editor.viewInfo.renderLineHighlight; } if (e.layoutInfo) { diff --git a/src/vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight.ts b/src/vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight.ts index 1ceb0914cc8..5fdec71c207 100644 --- a/src/vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight.ts +++ b/src/vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight.ts @@ -46,7 +46,7 @@ export class CurrentLineMarginHighlightOverlay extends DynamicViewOverlay { if (e.lineHeight) { this._lineHeight = this._context.configuration.editor.lineHeight; } - if (e.viewInfo.renderLineHighlight) { + if (e.viewInfo) { this._renderLineHighlight = this._context.configuration.editor.viewInfo.renderLineHighlight; } if (e.layoutInfo) { diff --git a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts index dce83c0f62e..b76d950d393 100644 --- a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts +++ b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts @@ -129,7 +129,7 @@ export class EditorScrollbar extends ViewPart { const viewInfo = this._context.configuration.editor.viewInfo; this.scrollbar.updateClassName('editor-scrollable' + ' ' + viewInfo.theme); - if (e.viewInfo.scrollbar || e.viewInfo.canUseTranslate3d) { + if (e.viewInfo) { let newOpts: ScrollableElementChangeOptions = { canUseTranslate3d: viewInfo.canUseTranslate3d, handleMouseWheel: viewInfo.scrollbar.handleMouseWheel, diff --git a/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts b/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts index 0e37f17d7a7..b92c9d0e559 100644 --- a/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts +++ b/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts @@ -110,7 +110,7 @@ export class GlyphMarginOverlay extends DedupOverlay { if (e.lineHeight) { this._lineHeight = this._context.configuration.editor.lineHeight; } - if (e.viewInfo.glyphMargin) { + if (e.viewInfo) { this._glyphMargin = this._context.configuration.editor.viewInfo.glyphMargin; } if (e.layoutInfo) { diff --git a/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts b/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts index 1a68db36461..7c9aa363e38 100644 --- a/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts +++ b/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts @@ -48,7 +48,7 @@ export class IndentGuidesOverlay extends DynamicViewOverlay { if (e.fontInfo) { this._spaceWidth = this._context.configuration.editor.fontInfo.spaceWidth; } - if (e.viewInfo.renderIndentGuides) { + if (e.viewInfo) { this._enabled = this._context.configuration.editor.viewInfo.renderIndentGuides; } return true; diff --git a/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts b/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts index 673bdb0c421..c1a0c97a1da 100644 --- a/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts +++ b/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts @@ -51,10 +51,8 @@ export class LineNumbersOverlay extends DynamicViewOverlay { if (e.lineHeight) { this._lineHeight = this._context.configuration.editor.lineHeight; } - if (e.viewInfo.renderLineNumbers) { + if (e.viewInfo) { this._renderLineNumbers = this._context.configuration.editor.viewInfo.renderLineNumbers; - } - if (e.viewInfo.renderRelativeLineNumbers) { this._renderRelativeLineNumbers = this._context.configuration.editor.viewInfo.renderRelativeLineNumbers; } if (e.layoutInfo) { diff --git a/src/vs/editor/browser/viewParts/lines/viewLines.ts b/src/vs/editor/browser/viewParts/lines/viewLines.ts index a5fdd8b254a..8be984ff5bf 100644 --- a/src/vs/editor/browser/viewParts/lines/viewLines.ts +++ b/src/vs/editor/browser/viewParts/lines/viewLines.ts @@ -127,10 +127,8 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, if (e.wrappingInfo) { this._isViewportWrapping = this._context.configuration.editor.wrappingInfo.isViewportWrapping; } - if (e.viewInfo.revealHorizontalRightPadding) { + if (e.viewInfo) { this._revealHorizontalRightPadding = this._context.configuration.editor.viewInfo.revealHorizontalRightPadding; - } - if (e.viewInfo.canUseTranslate3d) { this._canUseTranslate3d = this._context.configuration.editor.viewInfo.canUseTranslate3d; } if (e.fontInfo) { diff --git a/src/vs/editor/browser/viewParts/margin/margin.ts b/src/vs/editor/browser/viewParts/margin/margin.ts index fb3de087cbf..8cd64bbb320 100644 --- a/src/vs/editor/browser/viewParts/margin/margin.ts +++ b/src/vs/editor/browser/viewParts/margin/margin.ts @@ -57,7 +57,7 @@ export class Margin extends ViewPart { // --- begin event handlers public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { - if (e.viewInfo.canUseTranslate3d) { + if (e.viewInfo) { this._canUseTranslate3d = this._context.configuration.editor.viewInfo.canUseTranslate3d; } diff --git a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts index 37eaae0f2b7..e73de14db1c 100644 --- a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts +++ b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts @@ -104,51 +104,28 @@ export class DecorationsOverviewRuler extends ViewPart { let prevLanesCount = this._overviewRuler.getLanesCount(); let newLanesCount = this._context.configuration.editor.viewInfo.overviewRulerLanes; - let shouldRender = false; + if (prevLanesCount !== newLanesCount) { + this._overviewRuler.setLanesCount(newLanesCount, false); + } if (e.lineHeight) { this._overviewRuler.setLineHeight(this._context.configuration.editor.lineHeight, false); - shouldRender = true; } - if (e.viewInfo.canUseTranslate3d) { + if (e.viewInfo) { this._overviewRuler.setCanUseTranslate3d(this._context.configuration.editor.viewInfo.canUseTranslate3d, false); - shouldRender = true; - } - - if (prevLanesCount !== newLanesCount) { - this._overviewRuler.setLanesCount(newLanesCount, false); - shouldRender = true; - } - - if (e.viewInfo.overviewRulerBorder) { this._renderBorder = this._context.configuration.editor.viewInfo.overviewRulerBorder; - shouldRender = true; - } - - if (e.viewInfo.hideCursorInOverviewRuler) { this._hideCursor = this._context.configuration.editor.viewInfo.hideCursorInOverviewRuler; this._shouldUpdateCursorPosition = true; - shouldRender = true; - } - - if (e.viewInfo.theme) { - let theme = this._context.configuration.editor.viewInfo.theme; - this._overviewRuler.setThemeType(getThemeType(theme), false); - shouldRender = true; - } - - if (e.viewInfo.minimap) { + this._overviewRuler.setThemeType(getThemeType(this._context.configuration.editor.viewInfo.theme), false); this._updateBackground(false); - shouldRender = true; } if (e.layoutInfo) { this._overviewRuler.setLayout(this._context.configuration.editor.layoutInfo.overviewRuler, false); - shouldRender = true; } - return shouldRender; + return true; } public onCursorPositionChanged(e: viewEvents.ViewCursorPositionChangedEvent): boolean { diff --git a/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts b/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts index b3d8613c2d3..18d7c1f49b6 100644 --- a/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts +++ b/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts @@ -37,15 +37,13 @@ export class OverviewRuler extends ViewEventHandler implements IOverviewRuler { public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { if (e.lineHeight) { this._overviewRuler.setLineHeight(this._context.configuration.editor.lineHeight, true); - return true; } - if (e.viewInfo.canUseTranslate3d) { + if (e.viewInfo) { this._overviewRuler.setCanUseTranslate3d(this._context.configuration.editor.viewInfo.canUseTranslate3d, true); - return true; } - return false; + return true; } public onFlushed(e: viewEvents.ViewFlushedEvent): boolean { diff --git a/src/vs/editor/browser/viewParts/rulers/rulers.ts b/src/vs/editor/browser/viewParts/rulers/rulers.ts index 9479cc74bdb..0c4837e7c84 100644 --- a/src/vs/editor/browser/viewParts/rulers/rulers.ts +++ b/src/vs/editor/browser/viewParts/rulers/rulers.ts @@ -37,7 +37,7 @@ export class Rulers extends ViewPart { // --- begin event handlers public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { - if (e.viewInfo.rulers || e.layoutInfo || e.fontInfo) { + if (e.viewInfo || e.layoutInfo || e.fontInfo) { this._rulers = this._context.configuration.editor.viewInfo.rulers; this._height = this._context.configuration.editor.layoutInfo.contentHeight; this._typicalHalfwidthCharacterWidth = this._context.configuration.editor.fontInfo.typicalHalfwidthCharacterWidth; diff --git a/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts b/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts index b0dd4ccee28..3c015c2fabb 100644 --- a/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts +++ b/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts @@ -62,7 +62,7 @@ export class ScrollDecorationViewPart extends ViewPart { public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { let shouldRender = false; - if (e.viewInfo.scrollbar) { + if (e.viewInfo) { this._useShadows = this._context.configuration.editor.viewInfo.scrollbar.useShadows; } if (e.layoutInfo) { diff --git a/src/vs/editor/browser/viewParts/selections/selections.ts b/src/vs/editor/browser/viewParts/selections/selections.ts index fc8ac41ed92..c517172658d 100644 --- a/src/vs/editor/browser/viewParts/selections/selections.ts +++ b/src/vs/editor/browser/viewParts/selections/selections.ts @@ -105,7 +105,7 @@ export class SelectionsOverlay extends DynamicViewOverlay { if (e.lineHeight) { this._lineHeight = this._context.configuration.editor.lineHeight; } - if (e.viewInfo.roundedSelection) { + if (e.viewInfo) { this._roundedSelection = this._context.configuration.editor.viewInfo.roundedSelection; } return true; diff --git a/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts b/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts index b89689b8a8a..5efeefa3c28 100644 --- a/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts +++ b/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts @@ -114,7 +114,7 @@ export class ViewCursor { if (e.lineHeight) { this._lineHeight = this._context.configuration.editor.lineHeight; } - if (e.viewInfo.cursorStyle) { + if (e.viewInfo) { this._cursorStyle = this._context.configuration.editor.viewInfo.cursorStyle; } if (e.fontInfo) { diff --git a/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts b/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts index 7d8185da71c..8220415f4f7 100644 --- a/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts +++ b/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts @@ -84,16 +84,14 @@ export class ViewCursors extends ViewPart { if (e.readOnly) { this._readOnly = this._context.configuration.editor.readOnly; } - if (e.viewInfo.cursorBlinking) { + if (e.viewInfo) { this._cursorBlinking = this._context.configuration.editor.viewInfo.cursorBlinking; - } - if (e.viewInfo.cursorStyle) { this._cursorStyle = this._context.configuration.editor.viewInfo.cursorStyle; } this._primaryCursor.onConfigurationChanged(e); this._updateBlinking(); - if (e.viewInfo.cursorStyle || e.viewInfo.cursorBlinking) { + if (e.viewInfo) { this._updateDomClassName(); } for (let i = 0, len = this._secondaryCursors.length; i < len; i++) { diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index cd983f9dcf4..474696dfffb 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -95,8 +95,6 @@ export interface IEditorMinimapOptions { maxColumn?: number; } -export type LineNumbersOption = 'on' | 'off' | 'relative' | ((lineNumber: number) => string); - /** * Configuration options for the editor. */ @@ -137,7 +135,7 @@ export interface IEditorOptions { * Otherwise, line numbers will not be rendered. * Defaults to true. */ - lineNumbers?: LineNumbersOption; + lineNumbers?: 'on' | 'off' | 'relative' | ((lineNumber: number) => string); /** * Should the corresponding line be selected when clicking on the line number? * Defaults to true. @@ -613,6 +611,26 @@ export function cursorStyleToString(cursorStyle: TextEditorCursorStyle): string } } +function _cursorStyleFromString(cursorStyle: string, defaultValue: TextEditorCursorStyle): TextEditorCursorStyle { + if (typeof cursorStyle !== 'string') { + return defaultValue; + } + if (cursorStyle === 'line') { + return TextEditorCursorStyle.Line; + } else if (cursorStyle === 'block') { + return TextEditorCursorStyle.Block; + } else if (cursorStyle === 'underline') { + return TextEditorCursorStyle.Underline; + } else if (cursorStyle === 'line-thin') { + return TextEditorCursorStyle.LineThin; + } else if (cursorStyle === 'block-outline') { + return TextEditorCursorStyle.BlockOutline; + } else if (cursorStyle === 'underline-thin') { + return TextEditorCursorStyle.UnderlineThin; + } + return TextEditorCursorStyle.Line; +} + export class InternalEditorScrollbarOptions { readonly _internalEditorScrollbarOptionsBrand: void; @@ -770,7 +788,6 @@ export class EditorWrappingInfo { } export class InternalEditorViewOptions { - readonly _internalEditorViewOptionsBrand: void; readonly theme: string; readonly canUseTranslate3d: boolean; @@ -901,78 +918,40 @@ export class InternalEditorViewOptions { /** * @internal */ - public equals(other: InternalEditorViewOptions): boolean { + public static equals(a: InternalEditorViewOptions, b: InternalEditorViewOptions): boolean { return ( - this.theme === other.theme - && this.canUseTranslate3d === other.canUseTranslate3d - && this.disableMonospaceOptimizations === other.disableMonospaceOptimizations - && this.experimentalScreenReader === other.experimentalScreenReader - && InternalEditorViewOptions._numberArraysEqual(this.rulers, other.rulers) - && this.ariaLabel === other.ariaLabel - && this.renderLineNumbers === other.renderLineNumbers - && this.renderCustomLineNumbers === other.renderCustomLineNumbers - && this.renderRelativeLineNumbers === other.renderRelativeLineNumbers - && this.selectOnLineNumbers === other.selectOnLineNumbers - && this.glyphMargin === other.glyphMargin - && this.revealHorizontalRightPadding === other.revealHorizontalRightPadding - && this.roundedSelection === other.roundedSelection - && this.overviewRulerLanes === other.overviewRulerLanes - && this.overviewRulerBorder === other.overviewRulerBorder - && this.cursorBlinking === other.cursorBlinking - && this.mouseWheelZoom === other.mouseWheelZoom - && this.cursorStyle === other.cursorStyle - && this.hideCursorInOverviewRuler === other.hideCursorInOverviewRuler - && this.scrollBeyondLastLine === other.scrollBeyondLastLine - && this.editorClassName === other.editorClassName - && this.stopRenderingLineAfter === other.stopRenderingLineAfter - && this.renderWhitespace === other.renderWhitespace - && this.renderControlCharacters === other.renderControlCharacters - && this.fontLigatures === other.fontLigatures - && this.renderIndentGuides === other.renderIndentGuides - && this.renderLineHighlight === other.renderLineHighlight - && this.scrollbar.equals(other.scrollbar) - && this.minimap.equals(other.minimap) - && this.fixedOverflowWidgets === other.fixedOverflowWidgets + a.theme === b.theme + && a.canUseTranslate3d === b.canUseTranslate3d + && a.disableMonospaceOptimizations === b.disableMonospaceOptimizations + && a.experimentalScreenReader === b.experimentalScreenReader + && InternalEditorViewOptions._numberArraysEqual(a.rulers, b.rulers) + && a.ariaLabel === b.ariaLabel + && a.renderLineNumbers === b.renderLineNumbers + && a.renderCustomLineNumbers === b.renderCustomLineNumbers + && a.renderRelativeLineNumbers === b.renderRelativeLineNumbers + && a.selectOnLineNumbers === b.selectOnLineNumbers + && a.glyphMargin === b.glyphMargin + && a.revealHorizontalRightPadding === b.revealHorizontalRightPadding + && a.roundedSelection === b.roundedSelection + && a.overviewRulerLanes === b.overviewRulerLanes + && a.overviewRulerBorder === b.overviewRulerBorder + && a.cursorBlinking === b.cursorBlinking + && a.mouseWheelZoom === b.mouseWheelZoom + && a.cursorStyle === b.cursorStyle + && a.hideCursorInOverviewRuler === b.hideCursorInOverviewRuler + && a.scrollBeyondLastLine === b.scrollBeyondLastLine + && a.editorClassName === b.editorClassName + && a.stopRenderingLineAfter === b.stopRenderingLineAfter + && a.renderWhitespace === b.renderWhitespace + && a.renderControlCharacters === b.renderControlCharacters + && a.fontLigatures === b.fontLigatures + && a.renderIndentGuides === b.renderIndentGuides + && a.renderLineHighlight === b.renderLineHighlight + && a.scrollbar.equals(b.scrollbar) + && a.minimap.equals(b.minimap) + && a.fixedOverflowWidgets === b.fixedOverflowWidgets ); } - - /** - * @internal - */ - public createChangeEvent(newOpts: InternalEditorViewOptions): IViewConfigurationChangedEvent { - return { - theme: this.theme !== newOpts.theme, - canUseTranslate3d: this.canUseTranslate3d !== newOpts.canUseTranslate3d, - disableMonospaceOptimizations: this.disableMonospaceOptimizations !== newOpts.disableMonospaceOptimizations, - experimentalScreenReader: this.experimentalScreenReader !== newOpts.experimentalScreenReader, - rulers: (!InternalEditorViewOptions._numberArraysEqual(this.rulers, newOpts.rulers)), - ariaLabel: this.ariaLabel !== newOpts.ariaLabel, - renderLineNumbers: this.renderLineNumbers !== newOpts.renderLineNumbers, - renderCustomLineNumbers: this.renderCustomLineNumbers !== newOpts.renderCustomLineNumbers, - renderRelativeLineNumbers: this.renderRelativeLineNumbers !== newOpts.renderRelativeLineNumbers, - selectOnLineNumbers: this.selectOnLineNumbers !== newOpts.selectOnLineNumbers, - glyphMargin: this.glyphMargin !== newOpts.glyphMargin, - revealHorizontalRightPadding: this.revealHorizontalRightPadding !== newOpts.revealHorizontalRightPadding, - roundedSelection: this.roundedSelection !== newOpts.roundedSelection, - overviewRulerLanes: this.overviewRulerLanes !== newOpts.overviewRulerLanes, - overviewRulerBorder: this.overviewRulerBorder !== newOpts.overviewRulerBorder, - cursorBlinking: this.cursorBlinking !== newOpts.cursorBlinking, - mouseWheelZoom: this.mouseWheelZoom !== newOpts.mouseWheelZoom, - cursorStyle: this.cursorStyle !== newOpts.cursorStyle, - hideCursorInOverviewRuler: this.hideCursorInOverviewRuler !== newOpts.hideCursorInOverviewRuler, - scrollBeyondLastLine: this.scrollBeyondLastLine !== newOpts.scrollBeyondLastLine, - editorClassName: this.editorClassName !== newOpts.editorClassName, - stopRenderingLineAfter: this.stopRenderingLineAfter !== newOpts.stopRenderingLineAfter, - renderWhitespace: this.renderWhitespace !== newOpts.renderWhitespace, - renderControlCharacters: this.renderControlCharacters !== newOpts.renderControlCharacters, - fontLigatures: this.fontLigatures !== newOpts.fontLigatures, - renderIndentGuides: this.renderIndentGuides !== newOpts.renderIndentGuides, - renderLineHighlight: this.renderLineHighlight !== newOpts.renderLineHighlight, - scrollbar: (!this.scrollbar.equals(newOpts.scrollbar)), - minimap: (!this.minimap.equals(newOpts.minimap)), - fixedOverflowWidgets: this.fixedOverflowWidgets !== newOpts.fixedOverflowWidgets - }; - } } export class EditorContribOptions { @@ -1108,7 +1087,7 @@ export class EditorContribOptions { export class InternalEditorOptions { readonly _internalEditorOptionsBrand: void; - readonly lineHeight: number; // todo: move to fontInfo + readonly lineHeight: number; readonly readOnly: boolean; // ---- cursor options @@ -1169,7 +1148,7 @@ export class InternalEditorOptions { && this.dragAndDrop === other.dragAndDrop && this.layoutInfo.equals(other.layoutInfo) && this.fontInfo.equals(other.fontInfo) - && this.viewInfo.equals(other.viewInfo) + && InternalEditorViewOptions.equals(this.viewInfo, other.viewInfo) && this.wrappingInfo.equals(other.wrappingInfo) && this.contribInfo.equals(other.contribInfo) ); @@ -1189,7 +1168,7 @@ export class InternalEditorOptions { dragAndDrop: (this.dragAndDrop !== newOpts.dragAndDrop), layoutInfo: (!this.layoutInfo.equals(newOpts.layoutInfo)), fontInfo: (!this.fontInfo.equals(newOpts.fontInfo)), - viewInfo: this.viewInfo.createChangeEvent(newOpts.viewInfo), + viewInfo: (!InternalEditorViewOptions.equals(this.viewInfo, newOpts.viewInfo)), wrappingInfo: (!this.wrappingInfo.equals(newOpts.wrappingInfo)), contribInfo: (!this.contribInfo.equals(newOpts.contribInfo)), }; @@ -1419,39 +1398,6 @@ export class EditorLayoutInfo { } } -export interface IViewConfigurationChangedEvent { - readonly theme: boolean; - readonly canUseTranslate3d: boolean; - readonly disableMonospaceOptimizations: boolean; - readonly experimentalScreenReader: boolean; - readonly rulers: boolean; - readonly ariaLabel: boolean; - readonly renderLineNumbers: boolean; - readonly renderCustomLineNumbers: boolean; - readonly renderRelativeLineNumbers: boolean; - readonly selectOnLineNumbers: boolean; - readonly glyphMargin: boolean; - readonly revealHorizontalRightPadding: boolean; - readonly roundedSelection: boolean; - readonly overviewRulerLanes: boolean; - readonly overviewRulerBorder: boolean; - readonly cursorBlinking: boolean; - readonly mouseWheelZoom: boolean; - readonly cursorStyle: boolean; - readonly hideCursorInOverviewRuler: boolean; - readonly scrollBeyondLastLine: boolean; - readonly editorClassName: boolean; - readonly stopRenderingLineAfter: boolean; - readonly renderWhitespace: boolean; - readonly renderControlCharacters: boolean; - readonly fontLigatures: boolean; - readonly renderIndentGuides: boolean; - readonly renderLineHighlight: boolean; - readonly scrollbar: boolean; - readonly minimap: boolean; - readonly fixedOverflowWidgets: boolean; -} - /** * An event describing that the configuration of the editor has changed. */ @@ -1465,7 +1411,7 @@ export interface IConfigurationChangedEvent { readonly dragAndDrop: boolean; readonly layoutInfo: boolean; readonly fontInfo: boolean; - readonly viewInfo: IViewConfigurationChangedEvent; + readonly viewInfo: boolean; readonly wrappingInfo: boolean; readonly contribInfo: boolean; } @@ -1603,7 +1549,6 @@ export interface IValidatedEditorOptions { selectionHighlight: boolean; occurrencesHighlight: boolean; codeLens: boolean; - referenceInfos: boolean; folding: boolean; hideFoldIcons: boolean; matchBrackets: boolean; @@ -1678,26 +1623,6 @@ function _wrappingIndentFromString(wrappingIndent: string, defaultValue: Wrappin } } -function _cursorStyleFromString(cursorStyle: string, defaultValue: TextEditorCursorStyle): TextEditorCursorStyle { - if (typeof cursorStyle !== 'string') { - return defaultValue; - } - if (cursorStyle === 'line') { - return TextEditorCursorStyle.Line; - } else if (cursorStyle === 'block') { - return TextEditorCursorStyle.Block; - } else if (cursorStyle === 'underline') { - return TextEditorCursorStyle.Underline; - } else if (cursorStyle === 'line-thin') { - return TextEditorCursorStyle.LineThin; - } else if (cursorStyle === 'block-outline') { - return TextEditorCursorStyle.BlockOutline; - } else if (cursorStyle === 'underline-thin') { - return TextEditorCursorStyle.UnderlineThin; - } - return TextEditorCursorStyle.Line; -} - function _cursorBlinkingStyleFromString(cursorBlinkingStyle: string, defaultValue: TextEditorCursorBlinkingStyle): TextEditorCursorBlinkingStyle { if (typeof cursorBlinkingStyle !== 'string') { return defaultValue; @@ -1828,6 +1753,9 @@ export class EditorOptionsValidator { quickSuggestions = _boolean(opts.quickSuggestions, defaults.quickSuggestions); } + const fontLigatures = _boolean(opts.fontLigatures, defaults.fontLigatures); + const disableTranslate3d = _boolean(opts.disableTranslate3d, defaults.disableTranslate3d) || fontLigatures; + return { inDiffEditor: _boolean(opts.inDiffEditor, defaults.inDiffEditor), experimentalScreenReader: _boolean(opts.experimentalScreenReader, defaults.experimentalScreenReader), @@ -1855,8 +1783,8 @@ export class EditorOptionsValidator { mouseWheelZoom: _boolean(opts.mouseWheelZoom, defaults.mouseWheelZoom), mouseStyle: _stringSet<'text' | 'default' | 'copy'>(opts.mouseStyle, defaults.mouseStyle, ['text', 'default', 'copy']), cursorStyle: _cursorStyleFromString(opts.cursorStyle, defaults.cursorStyle), - fontLigatures: _boolean(opts.fontLigatures, defaults.fontLigatures), - disableTranslate3d: _boolean(opts.disableTranslate3d, defaults.disableTranslate3d), + fontLigatures: fontLigatures, + disableTranslate3d: disableTranslate3d, disableMonospaceOptimizations: _boolean(opts.disableMonospaceOptimizations, defaults.disableMonospaceOptimizations), hideCursorInOverviewRuler: _boolean(opts.hideCursorInOverviewRuler, defaults.hideCursorInOverviewRuler), scrollBeyondLastLine: _boolean(opts.scrollBeyondLastLine, defaults.scrollBeyondLastLine), @@ -1890,8 +1818,7 @@ export class EditorOptionsValidator { suggestLineHeight: _clampedInt(opts.suggestLineHeight, defaults.suggestLineHeight, 0, 1000), selectionHighlight: _boolean(opts.selectionHighlight, defaults.selectionHighlight), occurrencesHighlight: _boolean(opts.occurrencesHighlight, defaults.occurrencesHighlight), - codeLens: _boolean(opts.codeLens, defaults.codeLens), - referenceInfos: _boolean(opts.referenceInfos, defaults.referenceInfos), + codeLens: _boolean(opts.codeLens, defaults.codeLens) && _boolean(opts.referenceInfos, true), folding: _boolean(opts.folding, defaults.folding), hideFoldIcons: _boolean(opts.hideFoldIcons, defaults.hideFoldIcons), matchBrackets: _boolean(opts.matchBrackets, defaults.matchBrackets), @@ -2034,8 +1961,8 @@ export class InternalEditorOptionsFactory { const viewInfo = new InternalEditorViewOptions({ theme: opts.theme, - canUseTranslate3d: opts.disableTranslate3d ? false : env.canUseTranslate3d, - disableMonospaceOptimizations: (opts.disableMonospaceOptimizations || opts.fontLigatures), + canUseTranslate3d: opts.disableTranslate3d ? false : env.canUseTranslate3d, // todo + disableMonospaceOptimizations: opts.disableMonospaceOptimizations, experimentalScreenReader: opts.experimentalScreenReader, rulers: opts.rulers, ariaLabel: opts.ariaLabel, @@ -2060,7 +1987,7 @@ export class InternalEditorOptionsFactory { fontLigatures: opts.fontLigatures, renderIndentGuides: opts.renderIndentGuides, renderLineHighlight: opts.renderLineHighlight, - scrollbar: new InternalEditorScrollbarOptions({ + scrollbar: new InternalEditorScrollbarOptions({ // todo vertical: opts.scrollbar.vertical, horizontal: opts.scrollbar.horizontal, @@ -2079,7 +2006,7 @@ export class InternalEditorOptionsFactory { handleMouseWheel: opts.scrollbar.handleMouseWheel, mouseWheelScrollSensitivity: opts.mouseWheelScrollSensitivity }), - minimap: new InternalEditorMinimapOptions({ + minimap: new InternalEditorMinimapOptions({ // todo enabled: opts.minimap.enabled, renderCharacters: opts.minimap.renderCharacters, maxColumn: opts.minimap.maxColumn, @@ -2107,14 +2034,14 @@ export class InternalEditorOptionsFactory { suggestLineHeight: opts.suggestLineHeight, selectionHighlight: opts.selectionHighlight, occurrencesHighlight: opts.occurrencesHighlight, - codeLens: opts.referenceInfos && opts.codeLens, + codeLens: opts.codeLens, folding: opts.folding, hideFoldIcons: opts.hideFoldIcons, matchBrackets: opts.matchBrackets, }); return new InternalEditorOptions({ - lineHeight: env.fontInfo.lineHeight, // todo -> duplicated in styling + lineHeight: env.fontInfo.lineHeight, readOnly: opts.readOnly, wordSeparators: opts.wordSeparators, autoClosingBrackets: opts.autoClosingBrackets, @@ -2167,22 +2094,22 @@ export class EditorLayoutProvider { public static compute(_opts: IEditorLayoutProviderOpts): EditorLayoutInfo { const outerWidth = _opts.outerWidth | 0; const outerHeight = _opts.outerHeight | 0; - const showGlyphMargin = Boolean(_opts.showGlyphMargin); + const showGlyphMargin = _opts.showGlyphMargin; const lineHeight = _opts.lineHeight | 0; - const showLineNumbers = Boolean(_opts.showLineNumbers); + const showLineNumbers = _opts.showLineNumbers; const lineNumbersMinChars = _opts.lineNumbersMinChars | 0; const lineNumbersDigitCount = _opts.lineNumbersDigitCount | 0; const lineDecorationsWidth = _opts.lineDecorationsWidth | 0; - const typicalHalfwidthCharacterWidth = Number(_opts.typicalHalfwidthCharacterWidth); - const maxDigitWidth = Number(_opts.maxDigitWidth); + const typicalHalfwidthCharacterWidth = _opts.typicalHalfwidthCharacterWidth; + const maxDigitWidth = _opts.maxDigitWidth; const verticalScrollbarWidth = _opts.verticalScrollbarWidth | 0; - const verticalScrollbarHasArrows = Boolean(_opts.verticalScrollbarHasArrows); + const verticalScrollbarHasArrows = _opts.verticalScrollbarHasArrows; const scrollbarArrowSize = _opts.scrollbarArrowSize | 0; const horizontalScrollbarHeight = _opts.horizontalScrollbarHeight | 0; - const minimap = Boolean(_opts.minimap); - const minimapRenderCharacters = Boolean(_opts.minimapRenderCharacters); + const minimap = _opts.minimap; + const minimapRenderCharacters = _opts.minimapRenderCharacters; const minimapMaxColumn = _opts.minimapMaxColumn | 0; - const pixelRatio = Number(_opts.pixelRatio); + const pixelRatio = _opts.pixelRatio; let lineNumbersWidth = 0; if (showLineNumbers) { @@ -2391,7 +2318,6 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { selectionHighlight: true, occurrencesHighlight: true, codeLens: true, - referenceInfos: true, folding: true, hideFoldIcons: true, matchBrackets: true, diff --git a/src/vs/editor/common/view/viewEvents.ts b/src/vs/editor/common/view/viewEvents.ts index 3bb4059a38e..1500d49c191 100644 --- a/src/vs/editor/common/view/viewEvents.ts +++ b/src/vs/editor/common/view/viewEvents.ts @@ -8,7 +8,7 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ScrollEvent } from 'vs/base/common/scrollable'; -import { IViewConfigurationChangedEvent, IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; +import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; import { VerticalRevealType } from 'vs/editor/common/controller/cursorEvents'; export const enum ViewEventType { @@ -38,7 +38,7 @@ export class ViewConfigurationChangedEvent { public readonly readOnly: boolean; public readonly layoutInfo: boolean; public readonly fontInfo: boolean; - public readonly viewInfo: IViewConfigurationChangedEvent; + public readonly viewInfo: boolean; public readonly wrappingInfo: boolean; constructor(source: IConfigurationChangedEvent) { diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index e26814d708c..69604f4fa60 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -2640,8 +2640,6 @@ declare module monaco.editor { maxColumn?: number; } - export type LineNumbersOption = 'on' | 'off' | 'relative' | ((lineNumber: number) => string); - /** * Configuration options for the editor. */ @@ -2677,7 +2675,7 @@ declare module monaco.editor { * Otherwise, line numbers will not be rendered. * Defaults to true. */ - lineNumbers?: LineNumbersOption; + lineNumbers?: 'on' | 'off' | 'relative' | ((lineNumber: number) => string); /** * Should the corresponding line be selected when clicking on the line number? * Defaults to true. @@ -3161,7 +3159,6 @@ declare module monaco.editor { } export class InternalEditorViewOptions { - readonly _internalEditorViewOptionsBrand: void; readonly theme: string; readonly canUseTranslate3d: boolean; readonly disableMonospaceOptimizations: boolean; @@ -3353,39 +3350,6 @@ declare module monaco.editor { readonly overviewRuler: OverviewRulerPosition; } - export interface IViewConfigurationChangedEvent { - readonly theme: boolean; - readonly canUseTranslate3d: boolean; - readonly disableMonospaceOptimizations: boolean; - readonly experimentalScreenReader: boolean; - readonly rulers: boolean; - readonly ariaLabel: boolean; - readonly renderLineNumbers: boolean; - readonly renderCustomLineNumbers: boolean; - readonly renderRelativeLineNumbers: boolean; - readonly selectOnLineNumbers: boolean; - readonly glyphMargin: boolean; - readonly revealHorizontalRightPadding: boolean; - readonly roundedSelection: boolean; - readonly overviewRulerLanes: boolean; - readonly overviewRulerBorder: boolean; - readonly cursorBlinking: boolean; - readonly mouseWheelZoom: boolean; - readonly cursorStyle: boolean; - readonly hideCursorInOverviewRuler: boolean; - readonly scrollBeyondLastLine: boolean; - readonly editorClassName: boolean; - readonly stopRenderingLineAfter: boolean; - readonly renderWhitespace: boolean; - readonly renderControlCharacters: boolean; - readonly fontLigatures: boolean; - readonly renderIndentGuides: boolean; - readonly renderLineHighlight: boolean; - readonly scrollbar: boolean; - readonly minimap: boolean; - readonly fixedOverflowWidgets: boolean; - } - /** * An event describing that the configuration of the editor has changed. */ @@ -3399,7 +3363,7 @@ declare module monaco.editor { readonly dragAndDrop: boolean; readonly layoutInfo: boolean; readonly fontInfo: boolean; - readonly viewInfo: IViewConfigurationChangedEvent; + readonly viewInfo: boolean; readonly wrappingInfo: boolean; readonly contribInfo: boolean; } From e31a5085dc0f7936fdb79dbc7139de2cad2e8195 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 8 May 2017 21:28:16 +0200 Subject: [PATCH 0186/1164] Simplify editor options handling --- .../browser/standalone/standaloneEditor.ts | 7 - src/vs/editor/browser/view/viewImpl.ts | 6 +- .../editorScrollbar/editorScrollbar.ts | 20 +- .../browser/viewParts/lines/viewLines.ts | 6 +- .../editor/browser/viewParts/margin/margin.ts | 6 +- .../overviewRuler/decorationsOverviewRuler.ts | 7 +- .../viewParts/overviewRuler/overviewRuler.ts | 6 +- .../editor/browser/widget/diffEditorWidget.ts | 12 +- .../common/config/commonEditorConfig.ts | 78 +- src/vs/editor/common/config/editorOptions.ts | 1302 ++++++----------- src/vs/editor/common/view/viewEvents.ts | 4 + .../editor/contrib/suggest/browser/suggest.ts | 2 +- src/vs/editor/editor.main.ts | 4 +- .../viewLayout/editorLayoutProvider.test.ts | 848 +++++------ src/vs/monaco.d.ts | 25 +- 15 files changed, 953 insertions(+), 1380 deletions(-) diff --git a/src/vs/editor/browser/standalone/standaloneEditor.ts b/src/vs/editor/browser/standalone/standaloneEditor.ts index fc453d6e545..5e5fb63939e 100644 --- a/src/vs/editor/browser/standalone/standaloneEditor.ts +++ b/src/vs/editor/browser/standalone/standaloneEditor.ts @@ -354,14 +354,7 @@ export function createMonacoEditorAPI(): typeof monaco.editor { RenderMinimap: editorOptions.RenderMinimap, // classes - InternalEditorScrollbarOptions: editorOptions.InternalEditorScrollbarOptions, - InternalEditorMinimapOptions: editorOptions.InternalEditorMinimapOptions, - EditorWrappingInfo: editorOptions.EditorWrappingInfo, - InternalEditorViewOptions: editorOptions.InternalEditorViewOptions, - EditorContribOptions: editorOptions.EditorContribOptions, InternalEditorOptions: editorOptions.InternalEditorOptions, - OverviewRulerPosition: editorOptions.OverviewRulerPosition, - EditorLayoutInfo: editorOptions.EditorLayoutInfo, BareFontInfo: BareFontInfo, FontInfo: FontInfo, TextModelResolvedOptions: editorCommon.TextModelResolvedOptions, diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index 80c203d0b56..edd209d5c4f 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -147,7 +147,7 @@ export class View extends ViewEventHandler { this.linesContent.setPosition('absolute'); this.domNode = createFastDomNode(document.createElement('div')); - this.domNode.setClassName(this._context.configuration.editor.viewInfo.editorClassName); + this.domNode.setClassName(this._context.configuration.editor.editorClassName); this.overflowGuardContainer = createFastDomNode(document.createElement('div')); PartFingerprints.write(this.overflowGuardContainer, PartFingerprint.OverflowGuard); @@ -340,8 +340,8 @@ export class View extends ViewEventHandler { // --- begin event handlers public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { - if (e.viewInfo) { - this.domNode.setClassName(this._context.configuration.editor.viewInfo.editorClassName); + if (e.editorClassName) { + this.domNode.setClassName(this._context.configuration.editor.editorClassName); } if (e.layoutInfo) { this._setLayout(); diff --git a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts index b76d950d393..0fc8acf9612 100644 --- a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts +++ b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts @@ -32,13 +32,13 @@ export class EditorScrollbar extends ViewPart { this.scrollable = scrollable; - const viewInfo = this._context.configuration.editor.viewInfo; - const configScrollbarOpts = viewInfo.scrollbar; + const editor = this._context.configuration.editor; + const configScrollbarOpts = editor.viewInfo.scrollbar; let scrollbarOptions: ScrollableElementCreationOptions = { - canUseTranslate3d: viewInfo.canUseTranslate3d, + canUseTranslate3d: editor.canUseTranslate3d, listenOnDomNode: viewDomNode.domNode, - className: 'editor-scrollable' + ' ' + viewInfo.theme, + className: 'editor-scrollable' + ' ' + editor.viewInfo.theme, useShadows: false, lazyRender: true, @@ -126,14 +126,14 @@ export class EditorScrollbar extends ViewPart { // --- begin event handlers public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { - const viewInfo = this._context.configuration.editor.viewInfo; + const editor = this._context.configuration.editor; - this.scrollbar.updateClassName('editor-scrollable' + ' ' + viewInfo.theme); - if (e.viewInfo) { + this.scrollbar.updateClassName('editor-scrollable' + ' ' + editor.viewInfo.theme); + if (e.viewInfo || e.canUseTranslate3d) { let newOpts: ScrollableElementChangeOptions = { - canUseTranslate3d: viewInfo.canUseTranslate3d, - handleMouseWheel: viewInfo.scrollbar.handleMouseWheel, - mouseWheelScrollSensitivity: viewInfo.scrollbar.mouseWheelScrollSensitivity + canUseTranslate3d: editor.canUseTranslate3d, + handleMouseWheel: editor.viewInfo.scrollbar.handleMouseWheel, + mouseWheelScrollSensitivity: editor.viewInfo.scrollbar.mouseWheelScrollSensitivity }; this.scrollbar.updateOptions(newOpts); } diff --git a/src/vs/editor/browser/viewParts/lines/viewLines.ts b/src/vs/editor/browser/viewParts/lines/viewLines.ts index 8be984ff5bf..4d4ee4c9834 100644 --- a/src/vs/editor/browser/viewParts/lines/viewLines.ts +++ b/src/vs/editor/browser/viewParts/lines/viewLines.ts @@ -78,7 +78,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, this._lineHeight = this._context.configuration.editor.lineHeight; this._isViewportWrapping = this._context.configuration.editor.wrappingInfo.isViewportWrapping; this._revealHorizontalRightPadding = this._context.configuration.editor.viewInfo.revealHorizontalRightPadding; - this._canUseTranslate3d = this._context.configuration.editor.viewInfo.canUseTranslate3d; + this._canUseTranslate3d = this._context.configuration.editor.canUseTranslate3d; this._viewLineOptions = new ViewLineOptions(this._context.configuration); PartFingerprints.write(this.domNode, PartFingerprint.ViewLines); @@ -129,7 +129,9 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, } if (e.viewInfo) { this._revealHorizontalRightPadding = this._context.configuration.editor.viewInfo.revealHorizontalRightPadding; - this._canUseTranslate3d = this._context.configuration.editor.viewInfo.canUseTranslate3d; + } + if (e.canUseTranslate3d) { + this._canUseTranslate3d = this._context.configuration.editor.canUseTranslate3d; } if (e.fontInfo) { Configuration.applyFontInfo(this.domNode, this._context.configuration.editor.fontInfo); diff --git a/src/vs/editor/browser/viewParts/margin/margin.ts b/src/vs/editor/browser/viewParts/margin/margin.ts index 8cd64bbb320..162ef220f32 100644 --- a/src/vs/editor/browser/viewParts/margin/margin.ts +++ b/src/vs/editor/browser/viewParts/margin/margin.ts @@ -24,7 +24,7 @@ export class Margin extends ViewPart { constructor(context: ViewContext) { super(context); - this._canUseTranslate3d = this._context.configuration.editor.viewInfo.canUseTranslate3d; + this._canUseTranslate3d = this._context.configuration.editor.canUseTranslate3d; this._contentLeft = this._context.configuration.editor.layoutInfo.contentLeft; this._glyphMarginLeft = this._context.configuration.editor.layoutInfo.glyphMarginLeft; this._glyphMarginWidth = this._context.configuration.editor.layoutInfo.glyphMarginWidth; @@ -57,8 +57,8 @@ export class Margin extends ViewPart { // --- begin event handlers public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { - if (e.viewInfo) { - this._canUseTranslate3d = this._context.configuration.editor.viewInfo.canUseTranslate3d; + if (e.canUseTranslate3d) { + this._canUseTranslate3d = this._context.configuration.editor.canUseTranslate3d; } if (e.layoutInfo) { diff --git a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts index e73de14db1c..6ffaa520096 100644 --- a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts +++ b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts @@ -58,7 +58,7 @@ export class DecorationsOverviewRuler extends ViewPart { 'decorationsOverviewRuler', scrollHeight, this._context.configuration.editor.lineHeight, - this._context.configuration.editor.viewInfo.canUseTranslate3d, + this._context.configuration.editor.canUseTranslate3d, DecorationsOverviewRuler.MIN_DECORATION_HEIGHT, DecorationsOverviewRuler.MAX_DECORATION_HEIGHT, getVerticalOffsetForLine @@ -112,8 +112,11 @@ export class DecorationsOverviewRuler extends ViewPart { this._overviewRuler.setLineHeight(this._context.configuration.editor.lineHeight, false); } + if (e.canUseTranslate3d) { + this._overviewRuler.setCanUseTranslate3d(this._context.configuration.editor.canUseTranslate3d, false); + } + if (e.viewInfo) { - this._overviewRuler.setCanUseTranslate3d(this._context.configuration.editor.viewInfo.canUseTranslate3d, false); this._renderBorder = this._context.configuration.editor.viewInfo.overviewRulerBorder; this._hideCursor = this._context.configuration.editor.viewInfo.hideCursorInOverviewRuler; this._shouldUpdateCursorPosition = true; diff --git a/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts b/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts index 18d7c1f49b6..4ec5b262fbd 100644 --- a/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts +++ b/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts @@ -21,7 +21,7 @@ export class OverviewRuler extends ViewEventHandler implements IOverviewRuler { super(); this._context = context; this._overviewRuler = new OverviewRulerImpl(0, cssClassName, scrollHeight, this._context.configuration.editor.lineHeight, - this._context.configuration.editor.viewInfo.canUseTranslate3d, minimumHeight, maximumHeight, getVerticalOffsetForLine); + this._context.configuration.editor.canUseTranslate3d, minimumHeight, maximumHeight, getVerticalOffsetForLine); this._context.addEventHandler(this); } @@ -39,8 +39,8 @@ export class OverviewRuler extends ViewEventHandler implements IOverviewRuler { this._overviewRuler.setLineHeight(this._context.configuration.editor.lineHeight, true); } - if (e.viewInfo) { - this._overviewRuler.setCanUseTranslate3d(this._context.configuration.editor.viewInfo.canUseTranslate3d, true); + if (e.canUseTranslate3d) { + this._overviewRuler.setCanUseTranslate3d(this._context.configuration.editor.canUseTranslate3d, true); } return true; diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index 9958edfbde8..113637bf6ff 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -213,7 +213,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE this._domElement = domElement; options = options || {}; - this._theme = options.theme || editorOptions.EDITOR_DEFAULTS.theme; + this._theme = options.theme || editorOptions.EDITOR_DEFAULTS.viewInfo.theme; // renderSideBySide this._renderSideBySide = true; if (typeof options.renderSideBySide !== 'undefined') { @@ -777,18 +777,18 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE let freeSpace = DiffEditorWidget.ENTIRE_DIFF_OVERVIEW_WIDTH - 2 * DiffEditorWidget.ONE_OVERVIEW_WIDTH; let layoutInfo = this.modifiedEditor.getLayoutInfo(); if (layoutInfo) { - this._originalOverviewRuler.setLayout(new editorOptions.OverviewRulerPosition({ + this._originalOverviewRuler.setLayout({ top: 0, width: DiffEditorWidget.ONE_OVERVIEW_WIDTH, right: freeSpace + DiffEditorWidget.ONE_OVERVIEW_WIDTH, height: this._height - })); - this._modifiedOverviewRuler.setLayout(new editorOptions.OverviewRulerPosition({ + }); + this._modifiedOverviewRuler.setLayout({ top: 0, right: 0, width: DiffEditorWidget.ONE_OVERVIEW_WIDTH, height: this._height - })); + }); } } @@ -898,7 +898,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE private _adjustOptionsForRightHandSide(options: editorOptions.IDiffEditorOptions): editorOptions.IEditorOptions { let result = this._adjustOptionsForSubEditor(options); - result.revealHorizontalRightPadding = editorOptions.EDITOR_DEFAULTS.revealHorizontalRightPadding + DiffEditorWidget.ENTIRE_DIFF_OVERVIEW_WIDTH; + result.revealHorizontalRightPadding = editorOptions.EDITOR_DEFAULTS.viewInfo.revealHorizontalRightPadding + DiffEditorWidget.ENTIRE_DIFF_OVERVIEW_WIDTH; result.scrollbar.verticalHasArrows = false; result.theme = this._theme + ' modified-in-monaco-diff-editor'; return result; diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 9a1a5aa404c..62ca9dfe173 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -112,17 +112,17 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed private _computeInternalOptions(): editorOptions.InternalEditorOptions { const opts = this._validatedOptions; const bareFontInfo = BareFontInfo.createFromRawSettings(this._rawOptions, this.getZoomLevel()); - const env = new editorOptions.EnvironmentalOptions({ + const env: editorOptions.IEnvironmentalOptions = { outerWidth: this.getOuterWidth(), outerHeight: this.getOuterHeight(), fontInfo: this.readConfiguration(bareFontInfo), - editorClassName: this._getEditorClassName(opts.theme, opts.fontLigatures, opts.mouseStyle), + editorClassName: this._getEditorClassName(opts.viewInfo.theme, opts.viewInfo.fontLigatures, opts.mouseStyle), isDominatedByLongLines: this._isDominatedByLongLines, lineNumbersDigitCount: this._lineNumbersDigitCount, canUseTranslate3d: this._getCanUseTranslate3d(), pixelRatio: this._getPixelRatio(), tabFocusMode: TabFocus.getTabFocusMode() - }); + }; return editorOptions.InternalEditorOptionsFactory.createInternalEditorOptions(env, opts); } @@ -210,7 +210,7 @@ const editorConfiguration: IConfigurationNode = { 'items': { 'type': 'number' }, - 'default': EDITOR_DEFAULTS.rulers, + 'default': EDITOR_DEFAULTS.viewInfo.rulers, 'description': nls.localize('rulers', "Columns at which to show vertical rulers") }, 'editor.wordSeparators': { @@ -238,27 +238,27 @@ const editorConfiguration: IConfigurationNode = { }, 'editor.roundedSelection': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.roundedSelection, + 'default': EDITOR_DEFAULTS.viewInfo.roundedSelection, 'description': nls.localize('roundedSelection', "Controls if selections have rounded corners") }, 'editor.scrollBeyondLastLine': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.scrollBeyondLastLine, + 'default': EDITOR_DEFAULTS.viewInfo.scrollBeyondLastLine, 'description': nls.localize('scrollBeyondLastLine', "Controls if the editor will scroll beyond the last line") }, 'editor.minimap.enabled': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.minimap.enabled, + 'default': EDITOR_DEFAULTS.viewInfo.minimap.enabled, 'description': nls.localize('minimap.enabled', "Controls if the minimap is shown") }, 'editor.minimap.renderCharacters': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.minimap.renderCharacters, + 'default': EDITOR_DEFAULTS.viewInfo.minimap.renderCharacters, 'description': nls.localize('minimap.renderCharacters', "Render the actual characters on a line (as opposed to color blocks)") }, 'editor.minimap.maxColumn': { 'type': 'number', - 'default': EDITOR_DEFAULTS.minimap.maxColumn, + 'default': EDITOR_DEFAULTS.viewInfo.minimap.maxColumn, 'description': nls.localize('minimap.maxColumn', "Limit the width of the minimap to render at most a certain number of columns") }, 'editor.wordWrap': { @@ -310,7 +310,7 @@ const editorConfiguration: IConfigurationNode = { }, 'editor.mouseWheelScrollSensitivity': { 'type': 'number', - 'default': EDITOR_DEFAULTS.mouseWheelScrollSensitivity, + 'default': EDITOR_DEFAULTS.viewInfo.scrollbar.mouseWheelScrollSensitivity, 'description': nls.localize('mouseWheelScrollSensitivity', "A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events") }, 'editor.quickSuggestions': { @@ -339,18 +339,18 @@ const editorConfiguration: IConfigurationNode = { } } ], - 'default': EDITOR_DEFAULTS.quickSuggestions, + 'default': EDITOR_DEFAULTS.contribInfo.quickSuggestions, 'description': nls.localize('quickSuggestions', "Controls if suggestions should automatically show up while typing") }, 'editor.quickSuggestionsDelay': { 'type': 'integer', - 'default': EDITOR_DEFAULTS.quickSuggestionsDelay, + 'default': EDITOR_DEFAULTS.contribInfo.quickSuggestionsDelay, 'minimum': 0, 'description': nls.localize('quickSuggestionsDelay', "Controls the delay in ms after which quick suggestions will show up") }, 'editor.parameterHints': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.parameterHints, + 'default': EDITOR_DEFAULTS.contribInfo.parameterHints, 'description': nls.localize('parameterHints', "Enables parameter hints") }, 'editor.autoClosingBrackets': { @@ -360,43 +360,43 @@ const editorConfiguration: IConfigurationNode = { }, 'editor.formatOnType': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.formatOnType, + 'default': EDITOR_DEFAULTS.contribInfo.formatOnType, 'description': nls.localize('formatOnType', "Controls if the editor should automatically format the line after typing") }, 'editor.formatOnPaste': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.formatOnPaste, + 'default': EDITOR_DEFAULTS.contribInfo.formatOnPaste, 'description': nls.localize('formatOnPaste', "Controls if the editor should automatically format the pasted content. A formatter must be available and the formatter should be able to format a range in a document.") }, 'editor.suggestOnTriggerCharacters': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.suggestOnTriggerCharacters, + 'default': EDITOR_DEFAULTS.contribInfo.suggestOnTriggerCharacters, 'description': nls.localize('suggestOnTriggerCharacters', "Controls if suggestions should automatically show up when typing trigger characters") }, 'editor.acceptSuggestionOnEnter': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.acceptSuggestionOnEnter, + 'default': EDITOR_DEFAULTS.contribInfo.acceptSuggestionOnEnter, 'description': nls.localize('acceptSuggestionOnEnter', "Controls if suggestions should be accepted on 'Enter' - in addition to 'Tab'. Helps to avoid ambiguity between inserting new lines or accepting suggestions.") }, 'editor.acceptSuggestionOnCommitCharacter': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.acceptSuggestionOnCommitCharacter, + 'default': EDITOR_DEFAULTS.contribInfo.acceptSuggestionOnCommitCharacter, 'description': nls.localize('acceptSuggestionOnCommitCharacter', "Controls if suggestions should be accepted on commit characters. For instance in JavaScript the semi-colon (';') can be a commit character that accepts a suggestion and types that character.") }, 'editor.snippetSuggestions': { 'type': 'string', 'enum': ['top', 'bottom', 'inline', 'none'], - 'default': EDITOR_DEFAULTS.snippetSuggestions, + 'default': EDITOR_DEFAULTS.contribInfo.snippetSuggestions, 'description': nls.localize('snippetSuggestions', "Controls whether snippets are shown with other suggestions and how they are sorted.") }, 'editor.emptySelectionClipboard': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.emptySelectionClipboard, + 'default': EDITOR_DEFAULTS.contribInfo.emptySelectionClipboard, 'description': nls.localize('emptySelectionClipboard', "Controls whether copying without a selection copies the current line.") }, 'editor.wordBasedSuggestions': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.wordBasedSuggestions, + 'default': EDITOR_DEFAULTS.contribInfo.wordBasedSuggestions, 'description': nls.localize('wordBasedSuggestions', "Controls whether completions should be computed based on words in the document.") }, 'editor.suggestFontSize': { @@ -413,12 +413,12 @@ const editorConfiguration: IConfigurationNode = { }, 'editor.selectionHighlight': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.selectionHighlight, + 'default': EDITOR_DEFAULTS.contribInfo.selectionHighlight, 'description': nls.localize('selectionHighlight', "Controls whether the editor should highlight similar matches to the selection") }, 'editor.occurrencesHighlight': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.occurrencesHighlight, + 'default': EDITOR_DEFAULTS.contribInfo.occurrencesHighlight, 'description': nls.localize('occurrencesHighlight', "Controls whether the editor should highlight semantic symbol occurrences") }, 'editor.overviewRulerLanes': { @@ -428,81 +428,81 @@ const editorConfiguration: IConfigurationNode = { }, 'editor.overviewRulerBorder': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.overviewRulerBorder, + 'default': EDITOR_DEFAULTS.viewInfo.overviewRulerBorder, 'description': nls.localize('overviewRulerBorder', "Controls if a border should be drawn around the overview ruler.") }, 'editor.cursorBlinking': { 'type': 'string', 'enum': ['blink', 'smooth', 'phase', 'expand', 'solid'], - 'default': EDITOR_DEFAULTS.cursorBlinking, + 'default': EDITOR_DEFAULTS.viewInfo.cursorBlinking, 'description': nls.localize('cursorBlinking', "Control the cursor animation style, possible values are 'blink', 'smooth', 'phase', 'expand' and 'solid'") }, 'editor.mouseWheelZoom': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.mouseWheelZoom, + 'default': EDITOR_DEFAULTS.viewInfo.mouseWheelZoom, 'description': nls.localize('mouseWheelZoom', "Zoom the font of the editor when using mouse wheel and holding Ctrl") }, 'editor.cursorStyle': { 'type': 'string', 'enum': ['block', 'block-outline', 'line', 'line-thin', 'underline', 'underline-thin'], - 'default': EDITOR_DEFAULTS.cursorStyle, + 'default': EDITOR_DEFAULTS.viewInfo.cursorStyle, 'description': nls.localize('cursorStyle', "Controls the cursor style, accepted values are 'block', 'block-outline', 'line', 'line-thin', 'underline' and 'underline-thin'") }, 'editor.fontLigatures': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.fontLigatures, + 'default': EDITOR_DEFAULTS.viewInfo.fontLigatures, 'description': nls.localize('fontLigatures', "Enables font ligatures") }, 'editor.hideCursorInOverviewRuler': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.hideCursorInOverviewRuler, + 'default': EDITOR_DEFAULTS.viewInfo.hideCursorInOverviewRuler, 'description': nls.localize('hideCursorInOverviewRuler', "Controls if the cursor should be hidden in the overview ruler.") }, 'editor.renderWhitespace': { 'type': 'string', 'enum': ['none', 'boundary', 'all'], - default: EDITOR_DEFAULTS.renderWhitespace, + default: EDITOR_DEFAULTS.viewInfo.renderWhitespace, description: nls.localize('renderWhitespace', "Controls how the editor should render whitespace characters, possibilities are 'none', 'boundary', and 'all'. The 'boundary' option does not render single spaces between words.") }, 'editor.renderControlCharacters': { 'type': 'boolean', - default: EDITOR_DEFAULTS.renderControlCharacters, + default: EDITOR_DEFAULTS.viewInfo.renderControlCharacters, description: nls.localize('renderControlCharacters', "Controls whether the editor should render control characters") }, 'editor.renderIndentGuides': { 'type': 'boolean', - default: EDITOR_DEFAULTS.renderIndentGuides, + default: EDITOR_DEFAULTS.viewInfo.renderIndentGuides, description: nls.localize('renderIndentGuides', "Controls whether the editor should render indent guides") }, 'editor.renderLineHighlight': { 'type': 'string', 'enum': ['none', 'gutter', 'line', 'all'], - default: EDITOR_DEFAULTS.renderLineHighlight, + default: EDITOR_DEFAULTS.viewInfo.renderLineHighlight, description: nls.localize('renderLineHighlight', "Controls how the editor should render the current line highlight, possibilities are 'none', 'gutter', 'line', and 'all'.") }, 'editor.codeLens': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.codeLens, + 'default': EDITOR_DEFAULTS.contribInfo.codeLens, 'description': nls.localize('codeLens', "Controls if the editor shows code lenses") }, 'editor.folding': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.folding, + 'default': EDITOR_DEFAULTS.contribInfo.folding, 'description': nls.localize('folding', "Controls whether the editor has code folding enabled") }, 'editor.hideFoldIcons': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.hideFoldIcons, + 'default': EDITOR_DEFAULTS.contribInfo.hideFoldIcons, 'description': nls.localize('hideFoldIcons', "Controls whether the fold icons on the gutter are automatically hidden.") }, 'editor.matchBrackets': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.matchBrackets, + 'default': EDITOR_DEFAULTS.contribInfo.matchBrackets, 'description': nls.localize('matchBrackets', "Highlight matching brackets when one of them is selected.") }, 'editor.glyphMargin': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.glyphMargin, + 'default': EDITOR_DEFAULTS.viewInfo.glyphMargin, 'description': nls.localize('glyphMargin', "Controls whether the editor should render the vertical glyph margin. Glyph margin is mostly used for debugging.") }, 'editor.useTabStops': { @@ -546,7 +546,7 @@ const editorConfiguration: IConfigurationNode = { if (platform.isLinux) { editorConfiguration['properties']['editor.selectionClipboard'] = { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.selectionClipboard, + 'default': EDITOR_DEFAULTS.contribInfo.selectionClipboard, 'description': nls.localize('selectionClipboard', "Controls if the Linux primary clipboard should be supported.") }; } diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 474696dfffb..2382447705c 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -631,9 +631,7 @@ function _cursorStyleFromString(cursorStyle: string, defaultValue: TextEditorCur return TextEditorCursorStyle.Line; } -export class InternalEditorScrollbarOptions { - readonly _internalEditorScrollbarOptionsBrand: void; - +export interface InternalEditorScrollbarOptions { readonly arrowSize: number; readonly vertical: ScrollbarVisibility; readonly horizontal: ScrollbarVisibility; @@ -646,94 +644,15 @@ export class InternalEditorScrollbarOptions { readonly verticalScrollbarSize: number; readonly verticalSliderSize: number; readonly mouseWheelScrollSensitivity: number; - - /** - * @internal - */ - constructor(source: { - arrowSize: number; - vertical: ScrollbarVisibility; - horizontal: ScrollbarVisibility; - useShadows: boolean; - verticalHasArrows: boolean; - horizontalHasArrows: boolean; - handleMouseWheel: boolean; - horizontalScrollbarSize: number; - horizontalSliderSize: number; - verticalScrollbarSize: number; - verticalSliderSize: number; - mouseWheelScrollSensitivity: number; - }) { - this.arrowSize = source.arrowSize | 0; - this.vertical = source.vertical | 0; - this.horizontal = source.horizontal | 0; - this.useShadows = Boolean(source.useShadows); - this.verticalHasArrows = Boolean(source.verticalHasArrows); - this.horizontalHasArrows = Boolean(source.horizontalHasArrows); - this.handleMouseWheel = Boolean(source.handleMouseWheel); - this.horizontalScrollbarSize = source.horizontalScrollbarSize | 0; - this.horizontalSliderSize = source.horizontalSliderSize | 0; - this.verticalScrollbarSize = source.verticalScrollbarSize | 0; - this.verticalSliderSize = source.verticalSliderSize | 0; - this.mouseWheelScrollSensitivity = Number(source.mouseWheelScrollSensitivity); - } - - /** - * @internal - */ - public equals(other: InternalEditorScrollbarOptions): boolean { - return ( - this.arrowSize === other.arrowSize - && this.vertical === other.vertical - && this.horizontal === other.horizontal - && this.useShadows === other.useShadows - && this.verticalHasArrows === other.verticalHasArrows - && this.horizontalHasArrows === other.horizontalHasArrows - && this.handleMouseWheel === other.handleMouseWheel - && this.horizontalScrollbarSize === other.horizontalScrollbarSize - && this.horizontalSliderSize === other.horizontalSliderSize - && this.verticalScrollbarSize === other.verticalScrollbarSize - && this.verticalSliderSize === other.verticalSliderSize - && this.mouseWheelScrollSensitivity === other.mouseWheelScrollSensitivity - ); - } } -export class InternalEditorMinimapOptions { - readonly _internalEditorMinimapOptionsBrand: void; - +export interface InternalEditorMinimapOptions { readonly enabled: boolean; readonly renderCharacters: boolean; readonly maxColumn: number; - - /** - * @internal - */ - constructor(source: { - enabled: boolean; - renderCharacters: boolean; - maxColumn: number; - }) { - this.enabled = Boolean(source.enabled); - this.renderCharacters = Boolean(source.renderCharacters); - this.maxColumn = source.maxColumn | 0; - } - - /** - * @internal - */ - public equals(other: InternalEditorMinimapOptions): boolean { - return ( - this.enabled === other.enabled - && this.renderCharacters === other.renderCharacters - && this.maxColumn === other.maxColumn - ); - } } -export class EditorWrappingInfo { - readonly _editorWrappingInfoBrand: void; - +export interface EditorWrappingInfo { readonly inDiffEditor: boolean; readonly isDominatedByLongLines: boolean; readonly isWordWrapMinified: boolean; @@ -743,54 +662,10 @@ export class EditorWrappingInfo { readonly wordWrapBreakBeforeCharacters: string; readonly wordWrapBreakAfterCharacters: string; readonly wordWrapBreakObtrusiveCharacters: string; - - /** - * @internal - */ - constructor(source: { - inDiffEditor: boolean; - isDominatedByLongLines: boolean; - isWordWrapMinified: boolean; - isViewportWrapping: boolean; - wrappingColumn: number; - wrappingIndent: WrappingIndent; - wordWrapBreakBeforeCharacters: string; - wordWrapBreakAfterCharacters: string; - wordWrapBreakObtrusiveCharacters: string; - }) { - this.inDiffEditor = Boolean(source.inDiffEditor); - this.isDominatedByLongLines = Boolean(source.isDominatedByLongLines); - this.isWordWrapMinified = Boolean(source.isWordWrapMinified); - this.isViewportWrapping = Boolean(source.isViewportWrapping); - this.wrappingColumn = source.wrappingColumn | 0; - this.wrappingIndent = source.wrappingIndent | 0; - this.wordWrapBreakBeforeCharacters = String(source.wordWrapBreakBeforeCharacters); - this.wordWrapBreakAfterCharacters = String(source.wordWrapBreakAfterCharacters); - this.wordWrapBreakObtrusiveCharacters = String(source.wordWrapBreakObtrusiveCharacters); - } - - /** - * @internal - */ - public equals(other: EditorWrappingInfo): boolean { - return ( - this.inDiffEditor === other.inDiffEditor - && this.isDominatedByLongLines === other.isDominatedByLongLines - && this.isWordWrapMinified === other.isWordWrapMinified - && this.isViewportWrapping === other.isViewportWrapping - && this.wrappingColumn === other.wrappingColumn - && this.wrappingIndent === other.wrappingIndent - && this.wordWrapBreakBeforeCharacters === other.wordWrapBreakBeforeCharacters - && this.wordWrapBreakAfterCharacters === other.wordWrapBreakAfterCharacters - && this.wordWrapBreakObtrusiveCharacters === other.wordWrapBreakObtrusiveCharacters - ); - } } -export class InternalEditorViewOptions { - +export interface InternalEditorViewOptions { readonly theme: string; - readonly canUseTranslate3d: boolean; readonly disableMonospaceOptimizations: boolean; readonly experimentalScreenReader: boolean; readonly rulers: number[]; @@ -809,7 +684,6 @@ export class InternalEditorViewOptions { readonly cursorStyle: TextEditorCursorStyle; readonly hideCursorInOverviewRuler: boolean; readonly scrollBeyondLastLine: boolean; - readonly editorClassName: string; readonly stopRenderingLineAfter: number; readonly renderWhitespace: 'none' | 'boundary' | 'all'; readonly renderControlCharacters: boolean; @@ -819,142 +693,9 @@ export class InternalEditorViewOptions { readonly scrollbar: InternalEditorScrollbarOptions; readonly minimap: InternalEditorMinimapOptions; readonly fixedOverflowWidgets: boolean; - - /** - * @internal - */ - constructor(source: { - theme: string; - canUseTranslate3d: boolean; - disableMonospaceOptimizations: boolean; - experimentalScreenReader: boolean; - rulers: number[]; - ariaLabel: string; - renderLineNumbers: boolean; - renderCustomLineNumbers: (lineNumber: number) => string; - renderRelativeLineNumbers: boolean; - selectOnLineNumbers: boolean; - glyphMargin: boolean; - revealHorizontalRightPadding: number; - roundedSelection: boolean; - overviewRulerLanes: number; - overviewRulerBorder: boolean; - cursorBlinking: TextEditorCursorBlinkingStyle; - mouseWheelZoom: boolean; - cursorStyle: TextEditorCursorStyle; - hideCursorInOverviewRuler: boolean; - scrollBeyondLastLine: boolean; - editorClassName: string; - stopRenderingLineAfter: number; - renderWhitespace: 'none' | 'boundary' | 'all'; - renderControlCharacters: boolean; - fontLigatures: boolean; - renderIndentGuides: boolean; - renderLineHighlight: 'none' | 'gutter' | 'line' | 'all'; - scrollbar: InternalEditorScrollbarOptions; - minimap: InternalEditorMinimapOptions; - fixedOverflowWidgets: boolean; - }) { - this.theme = String(source.theme); - this.canUseTranslate3d = Boolean(source.canUseTranslate3d); - this.disableMonospaceOptimizations = Boolean(source.disableMonospaceOptimizations); - this.experimentalScreenReader = Boolean(source.experimentalScreenReader); - this.rulers = InternalEditorViewOptions._toSortedIntegerArray(source.rulers); - this.ariaLabel = String(source.ariaLabel); - this.renderLineNumbers = Boolean(source.renderLineNumbers); - this.renderCustomLineNumbers = source.renderCustomLineNumbers; - this.renderRelativeLineNumbers = Boolean(source.renderRelativeLineNumbers); - this.selectOnLineNumbers = Boolean(source.selectOnLineNumbers); - this.glyphMargin = Boolean(source.glyphMargin); - this.revealHorizontalRightPadding = source.revealHorizontalRightPadding | 0; - this.roundedSelection = Boolean(source.roundedSelection); - this.overviewRulerLanes = source.overviewRulerLanes | 0; - this.overviewRulerBorder = Boolean(source.overviewRulerBorder); - this.cursorBlinking = source.cursorBlinking | 0; - this.mouseWheelZoom = Boolean(source.mouseWheelZoom); - this.cursorStyle = source.cursorStyle | 0; - this.hideCursorInOverviewRuler = Boolean(source.hideCursorInOverviewRuler); - this.scrollBeyondLastLine = Boolean(source.scrollBeyondLastLine); - this.editorClassName = String(source.editorClassName); - this.stopRenderingLineAfter = source.stopRenderingLineAfter | 0; - this.renderWhitespace = source.renderWhitespace; - this.renderControlCharacters = Boolean(source.renderControlCharacters); - this.fontLigatures = Boolean(source.fontLigatures); - this.renderIndentGuides = Boolean(source.renderIndentGuides); - this.renderLineHighlight = source.renderLineHighlight; - this.scrollbar = source.scrollbar; - this.minimap = source.minimap; - this.fixedOverflowWidgets = Boolean(source.fixedOverflowWidgets); - } - - private static _toSortedIntegerArray(source: any): number[] { - if (!Array.isArray(source)) { - return []; - } - let arrSource = source; - let result = arrSource.map(el => { - let r = parseInt(el, 10); - if (isNaN(r)) { - return 0; - } - return r; - }); - result.sort(); - return result; - } - - private static _numberArraysEqual(a: number[], b: number[]): boolean { - if (a.length !== b.length) { - return false; - } - for (let i = 0; i < a.length; i++) { - if (a[i] !== b[i]) { - return false; - } - } - return true; - } - - /** - * @internal - */ - public static equals(a: InternalEditorViewOptions, b: InternalEditorViewOptions): boolean { - return ( - a.theme === b.theme - && a.canUseTranslate3d === b.canUseTranslate3d - && a.disableMonospaceOptimizations === b.disableMonospaceOptimizations - && a.experimentalScreenReader === b.experimentalScreenReader - && InternalEditorViewOptions._numberArraysEqual(a.rulers, b.rulers) - && a.ariaLabel === b.ariaLabel - && a.renderLineNumbers === b.renderLineNumbers - && a.renderCustomLineNumbers === b.renderCustomLineNumbers - && a.renderRelativeLineNumbers === b.renderRelativeLineNumbers - && a.selectOnLineNumbers === b.selectOnLineNumbers - && a.glyphMargin === b.glyphMargin - && a.revealHorizontalRightPadding === b.revealHorizontalRightPadding - && a.roundedSelection === b.roundedSelection - && a.overviewRulerLanes === b.overviewRulerLanes - && a.overviewRulerBorder === b.overviewRulerBorder - && a.cursorBlinking === b.cursorBlinking - && a.mouseWheelZoom === b.mouseWheelZoom - && a.cursorStyle === b.cursorStyle - && a.hideCursorInOverviewRuler === b.hideCursorInOverviewRuler - && a.scrollBeyondLastLine === b.scrollBeyondLastLine - && a.editorClassName === b.editorClassName - && a.stopRenderingLineAfter === b.stopRenderingLineAfter - && a.renderWhitespace === b.renderWhitespace - && a.renderControlCharacters === b.renderControlCharacters - && a.fontLigatures === b.fontLigatures - && a.renderIndentGuides === b.renderIndentGuides - && a.renderLineHighlight === b.renderLineHighlight - && a.scrollbar.equals(b.scrollbar) - && a.minimap.equals(b.minimap) - && a.fixedOverflowWidgets === b.fixedOverflowWidgets - ); - } } -export class EditorContribOptions { +export interface EditorContribOptions { readonly selectionClipboard: boolean; readonly hover: boolean; readonly contextmenu: boolean; @@ -978,107 +719,6 @@ export class EditorContribOptions { readonly folding: boolean; readonly hideFoldIcons: boolean; readonly matchBrackets: boolean; - - /** - * @internal - */ - constructor(source: { - selectionClipboard: boolean; - hover: boolean; - contextmenu: boolean; - quickSuggestions: boolean | { other: boolean, comments: boolean, strings: boolean }; - quickSuggestionsDelay: number; - parameterHints: boolean; - iconsInSuggestions: boolean; - formatOnType: boolean; - formatOnPaste: boolean; - suggestOnTriggerCharacters: boolean; - acceptSuggestionOnEnter: boolean; - acceptSuggestionOnCommitCharacter: boolean; - snippetSuggestions: 'top' | 'bottom' | 'inline' | 'none'; - emptySelectionClipboard: boolean; - wordBasedSuggestions: boolean; - suggestFontSize: number; - suggestLineHeight: number; - selectionHighlight: boolean; - occurrencesHighlight: boolean; - codeLens: boolean; - folding: boolean; - hideFoldIcons: boolean; - matchBrackets: boolean; - }) { - this.selectionClipboard = Boolean(source.selectionClipboard); - this.hover = Boolean(source.hover); - this.contextmenu = Boolean(source.contextmenu); - this.quickSuggestions = source.quickSuggestions; - this.quickSuggestionsDelay = source.quickSuggestionsDelay || 0; - this.parameterHints = Boolean(source.parameterHints); - this.iconsInSuggestions = Boolean(source.iconsInSuggestions); - this.formatOnType = Boolean(source.formatOnType); - this.formatOnPaste = Boolean(source.formatOnPaste); - this.suggestOnTriggerCharacters = Boolean(source.suggestOnTriggerCharacters); - this.acceptSuggestionOnEnter = Boolean(source.acceptSuggestionOnEnter); - this.acceptSuggestionOnCommitCharacter = Boolean(source.acceptSuggestionOnCommitCharacter); - this.snippetSuggestions = source.snippetSuggestions; - this.emptySelectionClipboard = source.emptySelectionClipboard; - this.wordBasedSuggestions = source.wordBasedSuggestions; - this.suggestFontSize = source.suggestFontSize; - this.suggestLineHeight = source.suggestLineHeight; - this.selectionHighlight = Boolean(source.selectionHighlight); - this.occurrencesHighlight = Boolean(source.occurrencesHighlight); - this.codeLens = Boolean(source.codeLens); - this.folding = Boolean(source.folding); - this.hideFoldIcons = Boolean(source.hideFoldIcons); - this.matchBrackets = Boolean(source.matchBrackets); - } - - /** - * @internal - */ - public equals(other: EditorContribOptions): boolean { - return ( - this.selectionClipboard === other.selectionClipboard - && this.hover === other.hover - && this.contextmenu === other.contextmenu - && EditorContribOptions._quickSuggestionsEquals(this.quickSuggestions, other.quickSuggestions) - && this.quickSuggestionsDelay === other.quickSuggestionsDelay - && this.parameterHints === other.parameterHints - && this.iconsInSuggestions === other.iconsInSuggestions - && this.formatOnType === other.formatOnType - && this.formatOnPaste === other.formatOnPaste - && this.suggestOnTriggerCharacters === other.suggestOnTriggerCharacters - && this.acceptSuggestionOnEnter === other.acceptSuggestionOnEnter - && this.acceptSuggestionOnCommitCharacter === other.acceptSuggestionOnCommitCharacter - && this.snippetSuggestions === other.snippetSuggestions - && this.emptySelectionClipboard === other.emptySelectionClipboard - && this.wordBasedSuggestions === other.wordBasedSuggestions - && this.suggestFontSize === other.suggestFontSize - && this.suggestLineHeight === other.suggestLineHeight - && this.selectionHighlight === other.selectionHighlight - && this.occurrencesHighlight === other.occurrencesHighlight - && this.codeLens === other.codeLens - && this.folding === other.folding - && this.hideFoldIcons === other.hideFoldIcons - && this.matchBrackets === other.matchBrackets - ); - } - - private static _quickSuggestionsEquals(a: boolean | { other: boolean, comments: boolean, strings: boolean }, b: boolean | { other: boolean, comments: boolean, strings: boolean }): boolean { - if (typeof a === 'boolean') { - if (typeof b !== 'boolean') { - return false; - } - return a === b; - } - if (typeof b === 'boolean') { - return false; - } - return ( - a.comments === b.comments - && a.other === b.other - && a.strings === b.strings - ); - } } /** @@ -1087,15 +727,18 @@ export class EditorContribOptions { export class InternalEditorOptions { readonly _internalEditorOptionsBrand: void; + readonly canUseTranslate3d: boolean; + readonly editorClassName: string; readonly lineHeight: number; - readonly readOnly: boolean; + // ---- cursor options readonly wordSeparators: string; readonly autoClosingBrackets: boolean; readonly useTabStops: boolean; readonly tabFocusMode: boolean; readonly dragAndDrop: boolean; + // ---- grouped options readonly layoutInfo: EditorLayoutInfo; readonly fontInfo: FontInfo; @@ -1107,6 +750,8 @@ export class InternalEditorOptions { * @internal */ constructor(source: { + canUseTranslate3d: boolean; + editorClassName: string; lineHeight: number; readOnly: boolean; wordSeparators: string; @@ -1120,6 +765,8 @@ export class InternalEditorOptions { wrappingInfo: EditorWrappingInfo; contribInfo: EditorContribOptions; }) { + this.canUseTranslate3d = Boolean(source.canUseTranslate3d); + this.editorClassName = String(source.editorClassName); this.lineHeight = source.lineHeight | 0; this.readOnly = Boolean(source.readOnly); this.wordSeparators = String(source.wordSeparators); @@ -1139,18 +786,20 @@ export class InternalEditorOptions { */ public equals(other: InternalEditorOptions): boolean { return ( - this.lineHeight === other.lineHeight + this.canUseTranslate3d === other.canUseTranslate3d + && this.editorClassName === other.editorClassName + && this.lineHeight === other.lineHeight && this.readOnly === other.readOnly && this.wordSeparators === other.wordSeparators && this.autoClosingBrackets === other.autoClosingBrackets && this.useTabStops === other.useTabStops && this.tabFocusMode === other.tabFocusMode && this.dragAndDrop === other.dragAndDrop - && this.layoutInfo.equals(other.layoutInfo) + && InternalEditorOptions._equalsLayoutInfo(this.layoutInfo, other.layoutInfo) && this.fontInfo.equals(other.fontInfo) - && InternalEditorViewOptions.equals(this.viewInfo, other.viewInfo) - && this.wrappingInfo.equals(other.wrappingInfo) - && this.contribInfo.equals(other.contribInfo) + && InternalEditorOptions._equalsViewOptions(this.viewInfo, other.viewInfo) + && InternalEditorOptions._equalsWrappingInfo(this.wrappingInfo, other.wrappingInfo) + && InternalEditorOptions._equalsContribOptions(this.contribInfo, other.contribInfo) ); } @@ -1159,6 +808,8 @@ export class InternalEditorOptions { */ public createChangeEvent(newOpts: InternalEditorOptions): IConfigurationChangedEvent { return { + canUseTranslate3d: (this.canUseTranslate3d !== newOpts.canUseTranslate3d), + editorClassName: (this.editorClassName !== newOpts.editorClassName), lineHeight: (this.lineHeight !== newOpts.lineHeight), readOnly: (this.readOnly !== newOpts.readOnly), wordSeparators: (this.wordSeparators !== newOpts.wordSeparators), @@ -1166,21 +817,203 @@ export class InternalEditorOptions { useTabStops: (this.useTabStops !== newOpts.useTabStops), tabFocusMode: (this.tabFocusMode !== newOpts.tabFocusMode), dragAndDrop: (this.dragAndDrop !== newOpts.dragAndDrop), - layoutInfo: (!this.layoutInfo.equals(newOpts.layoutInfo)), + layoutInfo: (!InternalEditorOptions._equalsLayoutInfo(this.layoutInfo, newOpts.layoutInfo)), fontInfo: (!this.fontInfo.equals(newOpts.fontInfo)), - viewInfo: (!InternalEditorViewOptions.equals(this.viewInfo, newOpts.viewInfo)), - wrappingInfo: (!this.wrappingInfo.equals(newOpts.wrappingInfo)), - contribInfo: (!this.contribInfo.equals(newOpts.contribInfo)), + viewInfo: (!InternalEditorOptions._equalsViewOptions(this.viewInfo, newOpts.viewInfo)), + wrappingInfo: (!InternalEditorOptions._equalsWrappingInfo(this.wrappingInfo, newOpts.wrappingInfo)), + contribInfo: (!InternalEditorOptions._equalsContribOptions(this.contribInfo, newOpts.contribInfo)), }; } + + /** + * @internal + */ + private static _equalsLayoutInfo(a: EditorLayoutInfo, b: EditorLayoutInfo): boolean { + return ( + a.width === b.width + && a.height === b.height + && a.glyphMarginLeft === b.glyphMarginLeft + && a.glyphMarginWidth === b.glyphMarginWidth + && a.glyphMarginHeight === b.glyphMarginHeight + && a.lineNumbersLeft === b.lineNumbersLeft + && a.lineNumbersWidth === b.lineNumbersWidth + && a.lineNumbersHeight === b.lineNumbersHeight + && a.decorationsLeft === b.decorationsLeft + && a.decorationsWidth === b.decorationsWidth + && a.decorationsHeight === b.decorationsHeight + && a.contentLeft === b.contentLeft + && a.contentWidth === b.contentWidth + && a.contentHeight === b.contentHeight + && a.renderMinimap === b.renderMinimap + && a.minimapWidth === b.minimapWidth + && a.viewportColumn === b.viewportColumn + && a.verticalScrollbarWidth === b.verticalScrollbarWidth + && a.horizontalScrollbarHeight === b.horizontalScrollbarHeight + && this._equalsOverviewRuler(a.overviewRuler, b.overviewRuler) + ); + } + + /** + * @internal + */ + private static _equalsOverviewRuler(a: OverviewRulerPosition, b: OverviewRulerPosition): boolean { + return ( + a.width === b.width + && a.height === b.height + && a.top === b.top + && a.right === b.right + ); + } + + /** + * @internal + */ + private static _equalsViewOptions(a: InternalEditorViewOptions, b: InternalEditorViewOptions): boolean { + return ( + a.theme === b.theme + && a.disableMonospaceOptimizations === b.disableMonospaceOptimizations + && a.experimentalScreenReader === b.experimentalScreenReader + && this._equalsNumberArrays(a.rulers, b.rulers) + && a.ariaLabel === b.ariaLabel + && a.renderLineNumbers === b.renderLineNumbers + && a.renderCustomLineNumbers === b.renderCustomLineNumbers + && a.renderRelativeLineNumbers === b.renderRelativeLineNumbers + && a.selectOnLineNumbers === b.selectOnLineNumbers + && a.glyphMargin === b.glyphMargin + && a.revealHorizontalRightPadding === b.revealHorizontalRightPadding + && a.roundedSelection === b.roundedSelection + && a.overviewRulerLanes === b.overviewRulerLanes + && a.overviewRulerBorder === b.overviewRulerBorder + && a.cursorBlinking === b.cursorBlinking + && a.mouseWheelZoom === b.mouseWheelZoom + && a.cursorStyle === b.cursorStyle + && a.hideCursorInOverviewRuler === b.hideCursorInOverviewRuler + && a.scrollBeyondLastLine === b.scrollBeyondLastLine + && a.stopRenderingLineAfter === b.stopRenderingLineAfter + && a.renderWhitespace === b.renderWhitespace + && a.renderControlCharacters === b.renderControlCharacters + && a.fontLigatures === b.fontLigatures + && a.renderIndentGuides === b.renderIndentGuides + && a.renderLineHighlight === b.renderLineHighlight + && this._equalsScrollbarOptions(a.scrollbar, b.scrollbar) + && this._equalsMinimapOptions(a.minimap, b.minimap) + && a.fixedOverflowWidgets === b.fixedOverflowWidgets + ); + } + + /** + * @internal + */ + private static _equalsScrollbarOptions(a: InternalEditorScrollbarOptions, b: InternalEditorScrollbarOptions): boolean { + return ( + a.arrowSize === b.arrowSize + && a.vertical === b.vertical + && a.horizontal === b.horizontal + && a.useShadows === b.useShadows + && a.verticalHasArrows === b.verticalHasArrows + && a.horizontalHasArrows === b.horizontalHasArrows + && a.handleMouseWheel === b.handleMouseWheel + && a.horizontalScrollbarSize === b.horizontalScrollbarSize + && a.horizontalSliderSize === b.horizontalSliderSize + && a.verticalScrollbarSize === b.verticalScrollbarSize + && a.verticalSliderSize === b.verticalSliderSize + && a.mouseWheelScrollSensitivity === b.mouseWheelScrollSensitivity + ); + } + + /** + * @internal + */ + private static _equalsMinimapOptions(a: InternalEditorMinimapOptions, b: InternalEditorMinimapOptions): boolean { + return ( + a.enabled === b.enabled + && a.renderCharacters === b.renderCharacters + && a.maxColumn === b.maxColumn + ); + } + + private static _equalsNumberArrays(a: number[], b: number[]): boolean { + if (a.length !== b.length) { + return false; + } + for (let i = 0; i < a.length; i++) { + if (a[i] !== b[i]) { + return false; + } + } + return true; + } + + /** + * @internal + */ + private static _equalsWrappingInfo(a: EditorWrappingInfo, b: EditorWrappingInfo): boolean { + return ( + a.inDiffEditor === b.inDiffEditor + && a.isDominatedByLongLines === b.isDominatedByLongLines + && a.isWordWrapMinified === b.isWordWrapMinified + && a.isViewportWrapping === b.isViewportWrapping + && a.wrappingColumn === b.wrappingColumn + && a.wrappingIndent === b.wrappingIndent + && a.wordWrapBreakBeforeCharacters === b.wordWrapBreakBeforeCharacters + && a.wordWrapBreakAfterCharacters === b.wordWrapBreakAfterCharacters + && a.wordWrapBreakObtrusiveCharacters === b.wordWrapBreakObtrusiveCharacters + ); + } + + /** + * @internal + */ + private static _equalsContribOptions(a: EditorContribOptions, b: EditorContribOptions): boolean { + return ( + a.selectionClipboard === b.selectionClipboard + && a.hover === b.hover + && a.contextmenu === b.contextmenu + && InternalEditorOptions._equalsQuickSuggestions(a.quickSuggestions, b.quickSuggestions) + && a.quickSuggestionsDelay === b.quickSuggestionsDelay + && a.parameterHints === b.parameterHints + && a.iconsInSuggestions === b.iconsInSuggestions + && a.formatOnType === b.formatOnType + && a.formatOnPaste === b.formatOnPaste + && a.suggestOnTriggerCharacters === b.suggestOnTriggerCharacters + && a.acceptSuggestionOnEnter === b.acceptSuggestionOnEnter + && a.acceptSuggestionOnCommitCharacter === b.acceptSuggestionOnCommitCharacter + && a.snippetSuggestions === b.snippetSuggestions + && a.emptySelectionClipboard === b.emptySelectionClipboard + && a.wordBasedSuggestions === b.wordBasedSuggestions + && a.suggestFontSize === b.suggestFontSize + && a.suggestLineHeight === b.suggestLineHeight + && a.selectionHighlight === b.selectionHighlight + && a.occurrencesHighlight === b.occurrencesHighlight + && a.codeLens === b.codeLens + && a.folding === b.folding + && a.hideFoldIcons === b.hideFoldIcons + && a.matchBrackets === b.matchBrackets + ); + } + + private static _equalsQuickSuggestions(a: boolean | { other: boolean, comments: boolean, strings: boolean }, b: boolean | { other: boolean, comments: boolean, strings: boolean }): boolean { + if (typeof a === 'boolean') { + if (typeof b !== 'boolean') { + return false; + } + return a === b; + } + if (typeof b === 'boolean') { + return false; + } + return ( + a.comments === b.comments + && a.other === b.other + && a.strings === b.strings + ); + } } /** * A description for the overview ruler position. */ -export class OverviewRulerPosition { - readonly _overviewRulerPositionBrand: void; - +export interface OverviewRulerPosition { /** * Width of the overview ruler */ @@ -1197,40 +1030,12 @@ export class OverviewRulerPosition { * Right position for the overview ruler */ readonly right: number; - - /** - * @internal - */ - constructor(source: { - width: number; - height: number; - top: number; - right: number; - }) { - this.width = source.width | 0; - this.height = source.height | 0; - this.top = source.top | 0; - this.right = source.right | 0; - } - - /** - * @internal - */ - public equals(other: OverviewRulerPosition): boolean { - return ( - this.width === other.width - && this.height === other.height - && this.top === other.top - && this.right === other.right - ); - } } /** * The internal layout details of the editor. */ -export class EditorLayoutInfo { - readonly _editorLayoutInfoBrand: void; +export interface EditorLayoutInfo { /** * Full editor width. @@ -1321,87 +1126,14 @@ export class EditorLayoutInfo { * The position of the overview ruler. */ readonly overviewRuler: OverviewRulerPosition; - - /** - * @internal - */ - constructor(source: { - width: number; - height: number; - glyphMarginLeft: number; - glyphMarginWidth: number; - glyphMarginHeight: number; - lineNumbersLeft: number; - lineNumbersWidth: number; - lineNumbersHeight: number; - decorationsLeft: number; - decorationsWidth: number; - decorationsHeight: number; - contentLeft: number; - contentWidth: number; - contentHeight: number; - renderMinimap: RenderMinimap; - minimapWidth: number; - viewportColumn: number; - verticalScrollbarWidth: number; - horizontalScrollbarHeight: number; - overviewRuler: OverviewRulerPosition; - }) { - this.width = source.width | 0; - this.height = source.height | 0; - this.glyphMarginLeft = source.glyphMarginLeft | 0; - this.glyphMarginWidth = source.glyphMarginWidth | 0; - this.glyphMarginHeight = source.glyphMarginHeight | 0; - this.lineNumbersLeft = source.lineNumbersLeft | 0; - this.lineNumbersWidth = source.lineNumbersWidth | 0; - this.lineNumbersHeight = source.lineNumbersHeight | 0; - this.decorationsLeft = source.decorationsLeft | 0; - this.decorationsWidth = source.decorationsWidth | 0; - this.decorationsHeight = source.decorationsHeight | 0; - this.contentLeft = source.contentLeft | 0; - this.contentWidth = source.contentWidth | 0; - this.contentHeight = source.contentHeight | 0; - this.renderMinimap = source.renderMinimap | 0; - this.minimapWidth = source.minimapWidth | 0; - this.viewportColumn = source.viewportColumn | 0; - this.verticalScrollbarWidth = source.verticalScrollbarWidth | 0; - this.horizontalScrollbarHeight = source.horizontalScrollbarHeight | 0; - this.overviewRuler = source.overviewRuler; - } - - /** - * @internal - */ - public equals(other: EditorLayoutInfo): boolean { - return ( - this.width === other.width - && this.height === other.height - && this.glyphMarginLeft === other.glyphMarginLeft - && this.glyphMarginWidth === other.glyphMarginWidth - && this.glyphMarginHeight === other.glyphMarginHeight - && this.lineNumbersLeft === other.lineNumbersLeft - && this.lineNumbersWidth === other.lineNumbersWidth - && this.lineNumbersHeight === other.lineNumbersHeight - && this.decorationsLeft === other.decorationsLeft - && this.decorationsWidth === other.decorationsWidth - && this.decorationsHeight === other.decorationsHeight - && this.contentLeft === other.contentLeft - && this.contentWidth === other.contentWidth - && this.contentHeight === other.contentHeight - && this.renderMinimap === other.renderMinimap - && this.minimapWidth === other.minimapWidth - && this.viewportColumn === other.viewportColumn - && this.verticalScrollbarWidth === other.verticalScrollbarWidth - && this.horizontalScrollbarHeight === other.horizontalScrollbarHeight - && this.overviewRuler.equals(other.overviewRuler) - ); - } } /** * An event describing that the configuration of the editor has changed. */ export interface IConfigurationChangedEvent { + readonly canUseTranslate3d: boolean; + readonly editorClassName: boolean; readonly lineHeight: boolean; readonly readOnly: boolean; readonly wordSeparators: boolean; @@ -1419,67 +1151,16 @@ export interface IConfigurationChangedEvent { /** * @internal */ -export class EnvironmentalOptions { - - public readonly outerWidth: number; - public readonly outerHeight: number; - public readonly fontInfo: FontInfo; - public readonly editorClassName: string; - public readonly isDominatedByLongLines: boolean; - public readonly lineNumbersDigitCount: number; - public readonly canUseTranslate3d: boolean; - public readonly pixelRatio: number; - public readonly tabFocusMode: boolean; - - constructor(opts: { - outerWidth: number; - outerHeight: number; - fontInfo: FontInfo; - editorClassName: string; - isDominatedByLongLines: boolean; - lineNumbersDigitCount: number; - canUseTranslate3d: boolean; - pixelRatio: number; - tabFocusMode: boolean; - }) { - this.outerWidth = opts.outerWidth; - this.outerHeight = opts.outerHeight; - this.fontInfo = opts.fontInfo; - this.editorClassName = opts.editorClassName; - this.isDominatedByLongLines = opts.isDominatedByLongLines; - this.lineNumbersDigitCount = opts.lineNumbersDigitCount; - this.canUseTranslate3d = opts.canUseTranslate3d; - this.pixelRatio = opts.pixelRatio; - this.tabFocusMode = opts.tabFocusMode; - } -} - -/** - * Validated scrollbar options for the editor. - * @internal - */ -export interface IValidatedEditorScrollbarOptions { - vertical: ScrollbarVisibility; - horizontal: ScrollbarVisibility; - arrowSize: number; - useShadows: boolean; - verticalHasArrows: boolean; - horizontalHasArrows: boolean; - horizontalScrollbarSize: number; - horizontalSliderSize: number; - verticalScrollbarSize: number; - verticalSliderSize: number; - handleMouseWheel: boolean; -} - -/** - * Validated minimap options for the editor. - * @internal - */ -export interface IValidatedEditorMinimapOptions { - enabled: boolean; - renderCharacters: boolean; - maxColumn: number; +export interface IEnvironmentalOptions { + readonly outerWidth: number; + readonly outerHeight: number; + readonly fontInfo: FontInfo; + readonly editorClassName: string; + readonly isDominatedByLongLines: boolean; + readonly lineNumbersDigitCount: number; + readonly canUseTranslate3d: boolean; + readonly pixelRatio: number; + readonly tabFocusMode: boolean; } /** @@ -1488,36 +1169,12 @@ export interface IValidatedEditorMinimapOptions { */ export interface IValidatedEditorOptions { inDiffEditor: boolean; - experimentalScreenReader: boolean; - ariaLabel: string; - rulers: number[]; wordSeparators: string; - selectionClipboard: boolean; - renderLineNumbers: boolean; - renderCustomLineNumbers: (lineNumber: number) => string; - renderRelativeLineNumbers: boolean; - selectOnLineNumbers: boolean; lineNumbersMinChars: number; - glyphMargin: boolean; lineDecorationsWidth: number | string; - revealHorizontalRightPadding: number; - roundedSelection: boolean; - theme: string; readOnly: boolean; - scrollbar: IValidatedEditorScrollbarOptions; - minimap: IValidatedEditorMinimapOptions; - fixedOverflowWidgets: boolean; - overviewRulerLanes: number; - overviewRulerBorder: boolean; - cursorBlinking: TextEditorCursorBlinkingStyle; - mouseWheelZoom: boolean; mouseStyle: 'text' | 'default' | 'copy'; - cursorStyle: TextEditorCursorStyle; - fontLigatures: boolean; disableTranslate3d: boolean; - disableMonospaceOptimizations: boolean; - hideCursorInOverviewRuler: boolean; - scrollBeyondLastLine: boolean; automaticLayout: boolean; wordWrap: 'off' | 'on' | 'wordWrapColumn' | 'bounded'; wordWrapColumn: number; @@ -1526,37 +1183,12 @@ export interface IValidatedEditorOptions { wordWrapBreakBeforeCharacters: string; wordWrapBreakAfterCharacters: string; wordWrapBreakObtrusiveCharacters: string; - stopRenderingLineAfter: number; - hover: boolean; - contextmenu: boolean; - mouseWheelScrollSensitivity: number; - quickSuggestions: boolean | { other: boolean, comments: boolean, strings: boolean }; - quickSuggestionsDelay: number; - parameterHints: boolean; - iconsInSuggestions: boolean; autoClosingBrackets: boolean; - formatOnType: boolean; - formatOnPaste: boolean; dragAndDrop: boolean; - suggestOnTriggerCharacters: boolean; - acceptSuggestionOnEnter: boolean; - acceptSuggestionOnCommitCharacter: boolean; - snippetSuggestions: 'top' | 'bottom' | 'inline' | 'none'; - emptySelectionClipboard: boolean; - wordBasedSuggestions: boolean; - suggestFontSize: number; - suggestLineHeight: number; - selectionHighlight: boolean; - occurrencesHighlight: boolean; - codeLens: boolean; - folding: boolean; - hideFoldIcons: boolean; - matchBrackets: boolean; - renderWhitespace: 'none' | 'boundary' | 'all'; - renderControlCharacters: boolean; - renderIndentGuides: boolean; - renderLineHighlight: 'none' | 'gutter' | 'line' | 'all'; useTabStops: boolean; + + viewInfo: InternalEditorViewOptions; + contribInfo: EditorContribOptions; } function _boolean(value: any, defaultValue: T): boolean | T { @@ -1667,6 +1299,84 @@ export class EditorOptionsValidator { * i.e. since they can be defined by the user, they might be invalid. */ public static validate(opts: IEditorOptions, defaults: IValidatedEditorOptions): IValidatedEditorOptions { + let wordWrap = opts.wordWrap; + { + // Compatibility with old true or false values + if (wordWrap === true) { + wordWrap = 'on'; + } else if (wordWrap === false) { + wordWrap = 'off'; + } + + wordWrap = _stringSet<'off' | 'on' | 'wordWrapColumn' | 'bounded'>(wordWrap, defaults.wordWrap, ['off', 'on', 'wordWrapColumn', 'bounded']); + } + + const viewInfo = this._sanitizeViewInfo(opts, defaults.viewInfo); + const contribInfo = this._sanitizeContribInfo(opts, defaults.contribInfo); + + return { + inDiffEditor: _boolean(opts.inDiffEditor, defaults.inDiffEditor), + wordSeparators: _string(opts.wordSeparators, defaults.wordSeparators), + lineNumbersMinChars: _clampedInt(opts.lineNumbersMinChars, defaults.lineNumbersMinChars, 1, 10), + lineDecorationsWidth: (typeof opts.lineDecorationsWidth === 'undefined' ? defaults.lineDecorationsWidth : opts.lineDecorationsWidth), + readOnly: _boolean(opts.readOnly, defaults.readOnly), + mouseStyle: _stringSet<'text' | 'default' | 'copy'>(opts.mouseStyle, defaults.mouseStyle, ['text', 'default', 'copy']), + disableTranslate3d: _boolean(opts.disableTranslate3d, defaults.disableTranslate3d), + automaticLayout: _boolean(opts.automaticLayout, defaults.automaticLayout), + wordWrap: wordWrap, + wordWrapColumn: _clampedInt(opts.wordWrapColumn, defaults.wordWrapColumn, 1, Constants.MAX_SAFE_SMALL_INTEGER), + wordWrapMinified: _boolean(opts.wordWrapMinified, defaults.wordWrapMinified), + wrappingIndent: _wrappingIndentFromString(opts.wrappingIndent, defaults.wrappingIndent), + wordWrapBreakBeforeCharacters: _string(opts.wordWrapBreakBeforeCharacters, defaults.wordWrapBreakBeforeCharacters), + wordWrapBreakAfterCharacters: _string(opts.wordWrapBreakAfterCharacters, defaults.wordWrapBreakAfterCharacters), + wordWrapBreakObtrusiveCharacters: _string(opts.wordWrapBreakObtrusiveCharacters, defaults.wordWrapBreakObtrusiveCharacters), + autoClosingBrackets: _boolean(opts.autoClosingBrackets, defaults.autoClosingBrackets), + dragAndDrop: _boolean(opts.dragAndDrop, defaults.dragAndDrop), + useTabStops: _boolean(opts.useTabStops, defaults.useTabStops), + viewInfo: viewInfo, + contribInfo: contribInfo, + }; + } + + private static _sanitizeScrollbarOpts(opts: IEditorScrollbarOptions, defaults: InternalEditorScrollbarOptions, mouseWheelScrollSensitivity: number): InternalEditorScrollbarOptions { + if (typeof opts !== 'object') { + return defaults; + } + const horizontalScrollbarSize = _clampedInt(opts.horizontalScrollbarSize, defaults.horizontalScrollbarSize, 0, 1000); + const verticalScrollbarSize = _clampedInt(opts.verticalScrollbarSize, defaults.verticalScrollbarSize, 0, 1000); + return { + vertical: _scrollbarVisibilityFromString(opts.vertical, defaults.vertical), + horizontal: _scrollbarVisibilityFromString(opts.horizontal, defaults.horizontal), + + arrowSize: _clampedInt(opts.arrowSize, defaults.arrowSize, 0, 1000), + useShadows: _boolean(opts.useShadows, defaults.useShadows), + + verticalHasArrows: _boolean(opts.verticalHasArrows, defaults.verticalHasArrows), + horizontalHasArrows: _boolean(opts.horizontalHasArrows, defaults.horizontalHasArrows), + + horizontalScrollbarSize: horizontalScrollbarSize, + horizontalSliderSize: _clampedInt(opts.horizontalSliderSize, horizontalScrollbarSize, 0, 1000), + + verticalScrollbarSize: verticalScrollbarSize, + verticalSliderSize: _clampedInt(opts.verticalSliderSize, verticalScrollbarSize, 0, 1000), + + handleMouseWheel: _boolean(opts.handleMouseWheel, defaults.handleMouseWheel), + mouseWheelScrollSensitivity: mouseWheelScrollSensitivity + }; + } + + private static _sanitizeMinimapOpts(opts: IEditorMinimapOptions, defaults: InternalEditorMinimapOptions): InternalEditorMinimapOptions { + if (typeof opts !== 'object') { + return defaults; + } + return { + enabled: _boolean(opts.enabled, defaults.enabled), + renderCharacters: _boolean(opts.renderCharacters, defaults.renderCharacters), + maxColumn: _clampedInt(opts.maxColumn, defaults.maxColumn, 1, 10000), + }; + } + + private static _sanitizeViewInfo(opts: IEditorOptions, defaults: InternalEditorViewOptions): InternalEditorViewOptions { let rulers: number[] = []; if (Array.isArray(opts.rulers)) { @@ -1709,17 +1419,8 @@ export class EditorOptionsValidator { } } - let wordWrap = opts.wordWrap; - { - // Compatibility with old true or false values - if (wordWrap === true) { - wordWrap = 'on'; - } else if (wordWrap === false) { - wordWrap = 'off'; - } - - wordWrap = _stringSet<'off' | 'on' | 'wordWrapColumn' | 'bounded'>(wordWrap, defaults.wordWrap, ['off', 'on', 'wordWrapColumn', 'bounded']); - } + const fontLigatures = _boolean(opts.fontLigatures, defaults.fontLigatures); + const disableMonospaceOptimizations = _boolean(opts.disableMonospaceOptimizations, defaults.disableMonospaceOptimizations) || fontLigatures; let renderWhitespace = opts.renderWhitespace; { @@ -1743,71 +1444,59 @@ export class EditorOptionsValidator { renderLineHighlight = _stringSet<'none' | 'gutter' | 'line' | 'all'>(opts.renderLineHighlight, defaults.renderLineHighlight, ['none', 'gutter', 'line', 'all']); } - const scrollbar = this._sanitizeScrollbarOpts(opts.scrollbar, defaults.scrollbar); + const mouseWheelScrollSensitivity = _float(opts.mouseWheelScrollSensitivity, defaults.scrollbar.mouseWheelScrollSensitivity); + const scrollbar = this._sanitizeScrollbarOpts(opts.scrollbar, defaults.scrollbar, mouseWheelScrollSensitivity); const minimap = this._sanitizeMinimapOpts(opts.minimap, defaults.minimap); + return { + theme: _string(opts.theme, defaults.theme), + disableMonospaceOptimizations: disableMonospaceOptimizations, + experimentalScreenReader: _boolean(opts.experimentalScreenReader, defaults.experimentalScreenReader), + rulers: rulers, + ariaLabel: _string(opts.ariaLabel, defaults.ariaLabel), + renderLineNumbers: renderLineNumbers, + renderCustomLineNumbers: renderCustomLineNumbers, + renderRelativeLineNumbers: renderRelativeLineNumbers, + selectOnLineNumbers: _boolean(opts.selectOnLineNumbers, defaults.selectOnLineNumbers), + glyphMargin: _boolean(opts.glyphMargin, defaults.glyphMargin), + revealHorizontalRightPadding: _clampedInt(opts.revealHorizontalRightPadding, defaults.revealHorizontalRightPadding, 0, 1000), + roundedSelection: _boolean(opts.roundedSelection, defaults.roundedSelection), + overviewRulerLanes: _clampedInt(opts.overviewRulerLanes, defaults.overviewRulerLanes, 0, 3), + overviewRulerBorder: _boolean(opts.overviewRulerBorder, defaults.overviewRulerBorder), + cursorBlinking: _cursorBlinkingStyleFromString(opts.cursorBlinking, defaults.cursorBlinking), + mouseWheelZoom: _boolean(opts.mouseWheelZoom, defaults.mouseWheelZoom), + cursorStyle: _cursorStyleFromString(opts.cursorStyle, defaults.cursorStyle), + hideCursorInOverviewRuler: _boolean(opts.hideCursorInOverviewRuler, defaults.hideCursorInOverviewRuler), + scrollBeyondLastLine: _boolean(opts.scrollBeyondLastLine, defaults.scrollBeyondLastLine), + stopRenderingLineAfter: _clampedInt(opts.stopRenderingLineAfter, defaults.stopRenderingLineAfter, -1, Constants.MAX_SAFE_SMALL_INTEGER), + renderWhitespace: renderWhitespace, + renderControlCharacters: _boolean(opts.renderControlCharacters, defaults.renderControlCharacters), + fontLigatures: fontLigatures, + renderIndentGuides: _boolean(opts.renderIndentGuides, defaults.renderIndentGuides), + renderLineHighlight: renderLineHighlight, + scrollbar: scrollbar, + minimap: minimap, + fixedOverflowWidgets: _boolean(opts.fixedOverflowWidgets, defaults.fixedOverflowWidgets), + }; + } + + private static _sanitizeContribInfo(opts: IEditorOptions, defaults: EditorContribOptions): EditorContribOptions { let quickSuggestions: boolean | { other: boolean, comments: boolean, strings: boolean }; if (typeof opts.quickSuggestions === 'object') { quickSuggestions = { other: true, ...opts.quickSuggestions }; } else { quickSuggestions = _boolean(opts.quickSuggestions, defaults.quickSuggestions); } - - const fontLigatures = _boolean(opts.fontLigatures, defaults.fontLigatures); - const disableTranslate3d = _boolean(opts.disableTranslate3d, defaults.disableTranslate3d) || fontLigatures; - return { - inDiffEditor: _boolean(opts.inDiffEditor, defaults.inDiffEditor), - experimentalScreenReader: _boolean(opts.experimentalScreenReader, defaults.experimentalScreenReader), - ariaLabel: _string(opts.ariaLabel, defaults.ariaLabel), - rulers: rulers, - wordSeparators: _string(opts.wordSeparators, defaults.wordSeparators), selectionClipboard: _boolean(opts.selectionClipboard, defaults.selectionClipboard), - renderLineNumbers: renderLineNumbers, - renderCustomLineNumbers: renderCustomLineNumbers, - renderRelativeLineNumbers: renderRelativeLineNumbers, - selectOnLineNumbers: _boolean(opts.selectOnLineNumbers, defaults.selectOnLineNumbers), - lineNumbersMinChars: _clampedInt(opts.lineNumbersMinChars, defaults.lineNumbersMinChars, 1, 10), - glyphMargin: _boolean(opts.glyphMargin, defaults.glyphMargin), - lineDecorationsWidth: (typeof opts.lineDecorationsWidth === 'undefined' ? defaults.lineDecorationsWidth : opts.lineDecorationsWidth), - revealHorizontalRightPadding: _clampedInt(opts.revealHorizontalRightPadding, defaults.revealHorizontalRightPadding, 0, 1000), - roundedSelection: _boolean(opts.roundedSelection, defaults.roundedSelection), - theme: _string(opts.theme, defaults.theme), - readOnly: _boolean(opts.readOnly, defaults.readOnly), - scrollbar: scrollbar, - minimap: minimap, - fixedOverflowWidgets: _boolean(opts.fixedOverflowWidgets, defaults.fixedOverflowWidgets), - overviewRulerLanes: _clampedInt(opts.overviewRulerLanes, defaults.overviewRulerLanes, 0, 3), - overviewRulerBorder: _boolean(opts.overviewRulerBorder, defaults.overviewRulerBorder), - cursorBlinking: _cursorBlinkingStyleFromString(opts.cursorBlinking, defaults.cursorBlinking), - mouseWheelZoom: _boolean(opts.mouseWheelZoom, defaults.mouseWheelZoom), - mouseStyle: _stringSet<'text' | 'default' | 'copy'>(opts.mouseStyle, defaults.mouseStyle, ['text', 'default', 'copy']), - cursorStyle: _cursorStyleFromString(opts.cursorStyle, defaults.cursorStyle), - fontLigatures: fontLigatures, - disableTranslate3d: disableTranslate3d, - disableMonospaceOptimizations: _boolean(opts.disableMonospaceOptimizations, defaults.disableMonospaceOptimizations), - hideCursorInOverviewRuler: _boolean(opts.hideCursorInOverviewRuler, defaults.hideCursorInOverviewRuler), - scrollBeyondLastLine: _boolean(opts.scrollBeyondLastLine, defaults.scrollBeyondLastLine), - automaticLayout: _boolean(opts.automaticLayout, defaults.automaticLayout), - wordWrap: wordWrap, - wordWrapColumn: _clampedInt(opts.wordWrapColumn, defaults.wordWrapColumn, 1, Constants.MAX_SAFE_SMALL_INTEGER), - wordWrapMinified: _boolean(opts.wordWrapMinified, defaults.wordWrapMinified), - wrappingIndent: _wrappingIndentFromString(opts.wrappingIndent, defaults.wrappingIndent), - wordWrapBreakBeforeCharacters: _string(opts.wordWrapBreakBeforeCharacters, defaults.wordWrapBreakBeforeCharacters), - wordWrapBreakAfterCharacters: _string(opts.wordWrapBreakAfterCharacters, defaults.wordWrapBreakAfterCharacters), - wordWrapBreakObtrusiveCharacters: _string(opts.wordWrapBreakObtrusiveCharacters, defaults.wordWrapBreakObtrusiveCharacters), - stopRenderingLineAfter: _clampedInt(opts.stopRenderingLineAfter, defaults.stopRenderingLineAfter, -1, Constants.MAX_SAFE_SMALL_INTEGER), hover: _boolean(opts.hover, defaults.hover), contextmenu: _boolean(opts.contextmenu, defaults.contextmenu), - mouseWheelScrollSensitivity: _float(opts.mouseWheelScrollSensitivity, defaults.mouseWheelScrollSensitivity), quickSuggestions: quickSuggestions, quickSuggestionsDelay: _clampedInt(opts.quickSuggestionsDelay, defaults.quickSuggestionsDelay, Constants.MIN_SAFE_SMALL_INTEGER, Constants.MAX_SAFE_SMALL_INTEGER), parameterHints: _boolean(opts.parameterHints, defaults.parameterHints), iconsInSuggestions: _boolean(opts.iconsInSuggestions, defaults.iconsInSuggestions), - autoClosingBrackets: _boolean(opts.autoClosingBrackets, defaults.autoClosingBrackets), formatOnType: _boolean(opts.formatOnType, defaults.formatOnType), formatOnPaste: _boolean(opts.formatOnPaste, defaults.formatOnPaste), - dragAndDrop: _boolean(opts.dragAndDrop, defaults.dragAndDrop), suggestOnTriggerCharacters: _boolean(opts.suggestOnTriggerCharacters, defaults.suggestOnTriggerCharacters), acceptSuggestionOnEnter: _boolean(opts.acceptSuggestionOnEnter, defaults.acceptSuggestionOnEnter), acceptSuggestionOnCommitCharacter: _boolean(opts.acceptSuggestionOnCommitCharacter, defaults.acceptSuggestionOnCommitCharacter), @@ -1822,48 +1511,6 @@ export class EditorOptionsValidator { folding: _boolean(opts.folding, defaults.folding), hideFoldIcons: _boolean(opts.hideFoldIcons, defaults.hideFoldIcons), matchBrackets: _boolean(opts.matchBrackets, defaults.matchBrackets), - renderWhitespace: renderWhitespace, - renderControlCharacters: _boolean(opts.renderControlCharacters, defaults.renderControlCharacters), - renderIndentGuides: _boolean(opts.renderIndentGuides, defaults.renderIndentGuides), - renderLineHighlight: renderLineHighlight, - useTabStops: _boolean(opts.useTabStops, defaults.useTabStops), - }; - } - - private static _sanitizeScrollbarOpts(opts: IEditorScrollbarOptions, defaults: IValidatedEditorScrollbarOptions): IValidatedEditorScrollbarOptions { - if (typeof opts !== 'object') { - return defaults; - } - const horizontalScrollbarSize = _clampedInt(opts.horizontalScrollbarSize, defaults.horizontalScrollbarSize, 0, 1000); - const verticalScrollbarSize = _clampedInt(opts.verticalScrollbarSize, defaults.verticalScrollbarSize, 0, 1000); - return { - vertical: _scrollbarVisibilityFromString(opts.vertical, defaults.vertical), - horizontal: _scrollbarVisibilityFromString(opts.horizontal, defaults.horizontal), - - arrowSize: _clampedInt(opts.arrowSize, defaults.arrowSize, 0, 1000), - useShadows: _boolean(opts.useShadows, defaults.useShadows), - - verticalHasArrows: _boolean(opts.verticalHasArrows, defaults.verticalHasArrows), - horizontalHasArrows: _boolean(opts.horizontalHasArrows, defaults.horizontalHasArrows), - - horizontalScrollbarSize: horizontalScrollbarSize, - horizontalSliderSize: _clampedInt(opts.horizontalSliderSize, horizontalScrollbarSize, 0, 1000), - - verticalScrollbarSize: verticalScrollbarSize, - verticalSliderSize: _clampedInt(opts.verticalSliderSize, verticalScrollbarSize, 0, 1000), - - handleMouseWheel: _boolean(opts.handleMouseWheel, defaults.handleMouseWheel) - }; - } - - private static _sanitizeMinimapOpts(opts: IEditorMinimapOptions, defaults: IValidatedEditorMinimapOptions): IValidatedEditorMinimapOptions { - if (typeof opts !== 'object') { - return defaults; - } - return { - enabled: _boolean(opts.enabled, defaults.enabled), - renderCharacters: _boolean(opts.renderCharacters, defaults.renderCharacters), - maxColumn: _clampedInt(opts.maxColumn, defaults.maxColumn, 1, 10000), }; } } @@ -1873,7 +1520,7 @@ export class EditorOptionsValidator { */ export class InternalEditorOptionsFactory { - public static createInternalEditorOptions(env: EnvironmentalOptions, opts: IValidatedEditorOptions) { + public static createInternalEditorOptions(env: IEnvironmentalOptions, opts: IValidatedEditorOptions) { let lineDecorationsWidth: number; if (typeof opts.lineDecorationsWidth === 'string' && /^\d+(\.\d+)?ch$/.test(opts.lineDecorationsWidth)) { @@ -1882,34 +1529,34 @@ export class InternalEditorOptionsFactory { } else { lineDecorationsWidth = _clampedInt(opts.lineDecorationsWidth, 0, 0, 1000); } - if (opts.folding) { + if (opts.contribInfo.folding) { lineDecorationsWidth += 16; } const layoutInfo = EditorLayoutProvider.compute({ outerWidth: env.outerWidth, outerHeight: env.outerHeight, - showGlyphMargin: opts.glyphMargin, + showGlyphMargin: opts.viewInfo.glyphMargin, lineHeight: env.fontInfo.lineHeight, - showLineNumbers: opts.renderLineNumbers, + showLineNumbers: opts.viewInfo.renderLineNumbers, lineNumbersMinChars: opts.lineNumbersMinChars, lineNumbersDigitCount: env.lineNumbersDigitCount, lineDecorationsWidth: lineDecorationsWidth, typicalHalfwidthCharacterWidth: env.fontInfo.typicalHalfwidthCharacterWidth, maxDigitWidth: env.fontInfo.maxDigitWidth, - verticalScrollbarWidth: opts.scrollbar.verticalScrollbarSize, - horizontalScrollbarHeight: opts.scrollbar.horizontalScrollbarSize, - scrollbarArrowSize: opts.scrollbar.arrowSize, - verticalScrollbarHasArrows: opts.scrollbar.verticalHasArrows, - minimap: opts.minimap.enabled, - minimapRenderCharacters: opts.minimap.renderCharacters, - minimapMaxColumn: opts.minimap.maxColumn, + verticalScrollbarWidth: opts.viewInfo.scrollbar.verticalScrollbarSize, + horizontalScrollbarHeight: opts.viewInfo.scrollbar.horizontalScrollbarSize, + scrollbarArrowSize: opts.viewInfo.scrollbar.arrowSize, + verticalScrollbarHasArrows: opts.viewInfo.scrollbar.verticalHasArrows, + minimap: opts.viewInfo.minimap.enabled, + minimapRenderCharacters: opts.viewInfo.minimap.renderCharacters, + minimapMaxColumn: opts.viewInfo.minimap.maxColumn, pixelRatio: env.pixelRatio }); let bareWrappingInfo: { isWordWrapMinified: boolean; isViewportWrapping: boolean; wrappingColumn: number; } = null; { - let wordWrap = opts.wordWrap; + const wordWrap = opts.wordWrap; const wordWrapColumn = opts.wordWrapColumn; const wordWrapMinified = opts.wordWrapMinified; @@ -1947,7 +1594,7 @@ export class InternalEditorOptionsFactory { } } - const wrappingInfo = new EditorWrappingInfo({ + const wrappingInfo: EditorWrappingInfo = { inDiffEditor: opts.inDiffEditor, isDominatedByLongLines: env.isDominatedByLongLines, isWordWrapMinified: bareWrappingInfo.isWordWrapMinified, @@ -1957,90 +1604,11 @@ export class InternalEditorOptionsFactory { wordWrapBreakBeforeCharacters: opts.wordWrapBreakBeforeCharacters, wordWrapBreakAfterCharacters: opts.wordWrapBreakAfterCharacters, wordWrapBreakObtrusiveCharacters: opts.wordWrapBreakObtrusiveCharacters, - }); - - const viewInfo = new InternalEditorViewOptions({ - theme: opts.theme, - canUseTranslate3d: opts.disableTranslate3d ? false : env.canUseTranslate3d, // todo - disableMonospaceOptimizations: opts.disableMonospaceOptimizations, - experimentalScreenReader: opts.experimentalScreenReader, - rulers: opts.rulers, - ariaLabel: opts.ariaLabel, - renderLineNumbers: opts.renderLineNumbers, - renderCustomLineNumbers: opts.renderCustomLineNumbers, - renderRelativeLineNumbers: opts.renderRelativeLineNumbers, - selectOnLineNumbers: opts.selectOnLineNumbers, - glyphMargin: opts.glyphMargin, - revealHorizontalRightPadding: opts.revealHorizontalRightPadding, - roundedSelection: opts.roundedSelection, - overviewRulerLanes: opts.overviewRulerLanes, - overviewRulerBorder: opts.overviewRulerBorder, - cursorBlinking: opts.cursorBlinking, - mouseWheelZoom: opts.mouseWheelZoom, - cursorStyle: opts.cursorStyle, - hideCursorInOverviewRuler: opts.hideCursorInOverviewRuler, - scrollBeyondLastLine: opts.scrollBeyondLastLine, - editorClassName: env.editorClassName, - stopRenderingLineAfter: opts.stopRenderingLineAfter, - renderWhitespace: opts.renderWhitespace, - renderControlCharacters: opts.renderControlCharacters, - fontLigatures: opts.fontLigatures, - renderIndentGuides: opts.renderIndentGuides, - renderLineHighlight: opts.renderLineHighlight, - scrollbar: new InternalEditorScrollbarOptions({ // todo - vertical: opts.scrollbar.vertical, - horizontal: opts.scrollbar.horizontal, - - arrowSize: opts.scrollbar.arrowSize, - useShadows: opts.scrollbar.useShadows, - - verticalHasArrows: opts.scrollbar.verticalHasArrows, - horizontalHasArrows: opts.scrollbar.horizontalHasArrows, - - horizontalScrollbarSize: opts.scrollbar.horizontalScrollbarSize, - horizontalSliderSize: opts.scrollbar.horizontalSliderSize, - - verticalScrollbarSize: opts.scrollbar.verticalScrollbarSize, - verticalSliderSize: opts.scrollbar.verticalSliderSize, - - handleMouseWheel: opts.scrollbar.handleMouseWheel, - mouseWheelScrollSensitivity: opts.mouseWheelScrollSensitivity - }), - minimap: new InternalEditorMinimapOptions({ // todo - enabled: opts.minimap.enabled, - renderCharacters: opts.minimap.renderCharacters, - maxColumn: opts.minimap.maxColumn, - }), - fixedOverflowWidgets: opts.fixedOverflowWidgets - }); - - const contribInfo = new EditorContribOptions({ - selectionClipboard: opts.selectionClipboard, - hover: opts.hover, - contextmenu: opts.contextmenu, - quickSuggestions: opts.quickSuggestions, - quickSuggestionsDelay: opts.quickSuggestionsDelay, - parameterHints: opts.parameterHints, - iconsInSuggestions: opts.iconsInSuggestions, - formatOnType: opts.formatOnType, - formatOnPaste: opts.formatOnPaste, - suggestOnTriggerCharacters: opts.suggestOnTriggerCharacters, - acceptSuggestionOnEnter: opts.acceptSuggestionOnEnter, - acceptSuggestionOnCommitCharacter: opts.acceptSuggestionOnCommitCharacter, - snippetSuggestions: opts.snippetSuggestions, - emptySelectionClipboard: opts.emptySelectionClipboard, - wordBasedSuggestions: opts.wordBasedSuggestions, - suggestFontSize: opts.suggestFontSize, - suggestLineHeight: opts.suggestLineHeight, - selectionHighlight: opts.selectionHighlight, - occurrencesHighlight: opts.occurrencesHighlight, - codeLens: opts.codeLens, - folding: opts.folding, - hideFoldIcons: opts.hideFoldIcons, - matchBrackets: opts.matchBrackets, - }); + }; return new InternalEditorOptions({ + canUseTranslate3d: opts.disableTranslate3d ? false : env.canUseTranslate3d, + editorClassName: env.editorClassName, lineHeight: env.fontInfo.lineHeight, readOnly: opts.readOnly, wordSeparators: opts.wordSeparators, @@ -2050,9 +1618,9 @@ export class InternalEditorOptionsFactory { dragAndDrop: opts.dragAndDrop, layoutInfo: layoutInfo, fontInfo: env.fontInfo, - viewInfo: viewInfo, + viewInfo: opts.viewInfo, wrappingInfo: wrappingInfo, - contribInfo: contribInfo, + contribInfo: opts.contribInfo, }); } } @@ -2170,7 +1738,7 @@ export class EditorLayoutProvider { const verticalArrowSize = (verticalScrollbarHasArrows ? scrollbarArrowSize : 0); - return new EditorLayoutInfo({ + return { width: outerWidth, height: outerHeight, @@ -2198,13 +1766,13 @@ export class EditorLayoutProvider { verticalScrollbarWidth: verticalScrollbarWidth, horizontalScrollbarHeight: horizontalScrollbarHeight, - overviewRuler: new OverviewRulerPosition({ + overviewRuler: { top: verticalArrowSize, width: verticalScrollbarWidth, height: (outerHeight - 2 * verticalArrowSize), right: 0 - }) - }); + } + }; } } @@ -2241,52 +1809,12 @@ export const EDITOR_MODEL_DEFAULTS = { */ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { inDiffEditor: false, - experimentalScreenReader: true, - ariaLabel: nls.localize('editorViewAccessibleLabel', "Editor content"), - rulers: [], wordSeparators: USUAL_WORD_SEPARATORS, - selectionClipboard: true, - renderLineNumbers: true, - renderCustomLineNumbers: null, - renderRelativeLineNumbers: false, - selectOnLineNumbers: true, lineNumbersMinChars: 5, - glyphMargin: true, lineDecorationsWidth: 10, - revealHorizontalRightPadding: 30, - roundedSelection: true, - theme: 'vs', readOnly: false, - scrollbar: { - vertical: ScrollbarVisibility.Auto, - horizontal: ScrollbarVisibility.Auto, - arrowSize: 11, - useShadows: true, - verticalHasArrows: false, - horizontalHasArrows: false, - horizontalScrollbarSize: 10, - horizontalSliderSize: 10, - verticalScrollbarSize: 14, - verticalSliderSize: 14, - handleMouseWheel: true - }, - minimap: { - enabled: false, - renderCharacters: true, - maxColumn: 120 - }, - fixedOverflowWidgets: false, - overviewRulerLanes: 2, - overviewRulerBorder: true, - cursorBlinking: TextEditorCursorBlinkingStyle.Blink, - mouseWheelZoom: false, mouseStyle: 'text', - cursorStyle: TextEditorCursorStyle.Line, - fontLigatures: false, disableTranslate3d: false, - disableMonospaceOptimizations: false, - hideCursorInOverviewRuler: false, - scrollBeyondLastLine: true, automaticLayout: false, wordWrap: 'off', wordWrapColumn: 80, @@ -2295,35 +1823,81 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { wordWrapBreakBeforeCharacters: '([{‘“〈《「『【〔([{「£¥$£¥++', wordWrapBreakAfterCharacters: ' \t})]?|&,;¢°′″‰℃、。。、¢,.:;?!%・・ゝゞヽヾーァィゥェォッャュョヮヵヶぁぃぅぇぉっゃゅょゎゕゖㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ々〻ァィゥェォャュョッー’”〉》」』】〕)]}」', wordWrapBreakObtrusiveCharacters: '.', - stopRenderingLineAfter: 10000, - hover: true, - contextmenu: true, - mouseWheelScrollSensitivity: 1, - quickSuggestions: { other: true, comments: false, strings: false }, - quickSuggestionsDelay: 10, - parameterHints: true, - iconsInSuggestions: true, autoClosingBrackets: true, - formatOnType: false, - formatOnPaste: false, dragAndDrop: false, - suggestOnTriggerCharacters: true, - acceptSuggestionOnEnter: true, - acceptSuggestionOnCommitCharacter: true, - snippetSuggestions: 'inline', - emptySelectionClipboard: true, - wordBasedSuggestions: true, - suggestFontSize: 0, - suggestLineHeight: 0, - selectionHighlight: true, - occurrencesHighlight: true, - codeLens: true, - folding: true, - hideFoldIcons: true, - matchBrackets: true, - renderWhitespace: 'none', - renderControlCharacters: false, - renderIndentGuides: false, - renderLineHighlight: 'line', useTabStops: true, + + viewInfo: { + theme: 'vs', + disableMonospaceOptimizations: false, + experimentalScreenReader: true, + rulers: [], + ariaLabel: nls.localize('editorViewAccessibleLabel', "Editor content"), + renderLineNumbers: true, + renderCustomLineNumbers: null, + renderRelativeLineNumbers: false, + selectOnLineNumbers: true, + glyphMargin: true, + revealHorizontalRightPadding: 30, + roundedSelection: true, + overviewRulerLanes: 2, + overviewRulerBorder: true, + cursorBlinking: TextEditorCursorBlinkingStyle.Blink, + mouseWheelZoom: false, + cursorStyle: TextEditorCursorStyle.Line, + hideCursorInOverviewRuler: false, + scrollBeyondLastLine: true, + stopRenderingLineAfter: 10000, + renderWhitespace: 'none', + renderControlCharacters: false, + fontLigatures: false, + renderIndentGuides: false, + renderLineHighlight: 'line', + scrollbar: { + vertical: ScrollbarVisibility.Auto, + horizontal: ScrollbarVisibility.Auto, + arrowSize: 11, + useShadows: true, + verticalHasArrows: false, + horizontalHasArrows: false, + horizontalScrollbarSize: 10, + horizontalSliderSize: 10, + verticalScrollbarSize: 14, + verticalSliderSize: 14, + handleMouseWheel: true, + mouseWheelScrollSensitivity: 1, + }, + minimap: { + enabled: false, + renderCharacters: true, + maxColumn: 120 + }, + fixedOverflowWidgets: false, + }, + + contribInfo: { + selectionClipboard: true, + hover: true, + contextmenu: true, + quickSuggestions: { other: true, comments: false, strings: false }, + quickSuggestionsDelay: 10, + parameterHints: true, + iconsInSuggestions: true, + formatOnType: false, + formatOnPaste: false, + suggestOnTriggerCharacters: true, + acceptSuggestionOnEnter: true, + acceptSuggestionOnCommitCharacter: true, + snippetSuggestions: 'inline', + emptySelectionClipboard: true, + wordBasedSuggestions: true, + suggestFontSize: 0, + suggestLineHeight: 0, + selectionHighlight: true, + occurrencesHighlight: true, + codeLens: true, + folding: true, + hideFoldIcons: true, + matchBrackets: true, + }, }; diff --git a/src/vs/editor/common/view/viewEvents.ts b/src/vs/editor/common/view/viewEvents.ts index 1500d49c191..9b29111f999 100644 --- a/src/vs/editor/common/view/viewEvents.ts +++ b/src/vs/editor/common/view/viewEvents.ts @@ -34,6 +34,8 @@ export class ViewConfigurationChangedEvent { public readonly type = ViewEventType.ViewConfigurationChanged; + public readonly canUseTranslate3d: boolean; + public readonly editorClassName: boolean; public readonly lineHeight: boolean; public readonly readOnly: boolean; public readonly layoutInfo: boolean; @@ -42,6 +44,8 @@ export class ViewConfigurationChangedEvent { public readonly wrappingInfo: boolean; constructor(source: IConfigurationChangedEvent) { + this.canUseTranslate3d = source.canUseTranslate3d; + this.editorClassName = source.editorClassName; this.lineHeight = source.lineHeight; this.readOnly = source.readOnly; this.layoutInfo = source.layoutInfo; diff --git a/src/vs/editor/contrib/suggest/browser/suggest.ts b/src/vs/editor/contrib/suggest/browser/suggest.ts index 1e79d2e180b..6f6a5dbff75 100644 --- a/src/vs/editor/contrib/suggest/browser/suggest.ts +++ b/src/vs/editor/contrib/suggest/browser/suggest.ts @@ -22,7 +22,7 @@ export const Context = { MultipleSuggestions: new RawContextKey('suggestWidgetMultipleSuggestions', false), MakesTextEdit: new RawContextKey('suggestionMakesTextEdit', true), AcceptOnKey: new RawContextKey('suggestionSupportsAcceptOnKey', true), - AcceptSuggestionsOnEnter: new RawContextKey('acceptSuggestionOnEnter', EDITOR_DEFAULTS.acceptSuggestionOnEnter) + AcceptSuggestionsOnEnter: new RawContextKey('acceptSuggestionOnEnter', EDITOR_DEFAULTS.contribInfo.acceptSuggestionOnEnter) }; export interface ISuggestionItem { diff --git a/src/vs/editor/editor.main.ts b/src/vs/editor/editor.main.ts index a06d77657e2..7820913b7de 100644 --- a/src/vs/editor/editor.main.ts +++ b/src/vs/editor/editor.main.ts @@ -18,8 +18,8 @@ import { EDITOR_DEFAULTS, WrappingIndent } from "vs/editor/common/config/editorO // Set defaults for standalone editor EDITOR_DEFAULTS.wrappingIndent = WrappingIndent.None; -EDITOR_DEFAULTS.folding = false; -EDITOR_DEFAULTS.glyphMargin = false; +(EDITOR_DEFAULTS.contribInfo).folding = false; +(EDITOR_DEFAULTS.viewInfo).glyphMargin = false; var global: any = self; global.monaco = createMonacoBaseAPI(); diff --git a/src/vs/editor/test/common/viewLayout/editorLayoutProvider.test.ts b/src/vs/editor/test/common/viewLayout/editorLayoutProvider.test.ts index b60d9b7cb64..53ac8d481a6 100644 --- a/src/vs/editor/test/common/viewLayout/editorLayoutProvider.test.ts +++ b/src/vs/editor/test/common/viewLayout/editorLayoutProvider.test.ts @@ -5,7 +5,7 @@ 'use strict'; import * as assert from 'assert'; -import { RenderMinimap, EditorLayoutInfo, OverviewRulerPosition, EditorLayoutProvider, IEditorLayoutProviderOpts } from 'vs/editor/common/config/editorOptions'; +import { RenderMinimap, EditorLayoutInfo, EditorLayoutProvider, IEditorLayoutProviderOpts } from 'vs/editor/common/config/editorOptions'; suite('Editor ViewLayout - EditorLayoutProvider', () => { @@ -34,40 +34,40 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { minimapRenderCharacters: true, minimapMaxColumn: 150, pixelRatio: 1, - }, new EditorLayoutInfo({ - width: 1000, - height: 800, - - glyphMarginLeft: 0, - glyphMarginWidth: 0, - glyphMarginHeight: 800, - - lineNumbersLeft: 0, - lineNumbersWidth: 0, - lineNumbersHeight: 800, - - decorationsLeft: 0, - decorationsWidth: 10, - decorationsHeight: 800, - - contentLeft: 10, - contentWidth: 990, - contentHeight: 800, - - renderMinimap: RenderMinimap.None, - minimapWidth: 0, - viewportColumn: 99, - - verticalScrollbarWidth: 0, - horizontalScrollbarHeight: 0, - - overviewRuler: new OverviewRulerPosition({ - top: 0, - width: 0, + }, { + width: 1000, height: 800, - right: 0 - }) - })); + + glyphMarginLeft: 0, + glyphMarginWidth: 0, + glyphMarginHeight: 800, + + lineNumbersLeft: 0, + lineNumbersWidth: 0, + lineNumbersHeight: 800, + + decorationsLeft: 0, + decorationsWidth: 10, + decorationsHeight: 800, + + contentLeft: 10, + contentWidth: 990, + contentHeight: 800, + + renderMinimap: RenderMinimap.None, + minimapWidth: 0, + viewportColumn: 99, + + verticalScrollbarWidth: 0, + horizontalScrollbarHeight: 0, + + overviewRuler: { + top: 0, + width: 0, + height: 800, + right: 0 + } + }); }); test('EditorLayoutProvider 1.1', () => { @@ -90,40 +90,40 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { minimapRenderCharacters: true, minimapMaxColumn: 150, pixelRatio: 1, - }, new EditorLayoutInfo({ - width: 1000, - height: 800, + }, { + width: 1000, + height: 800, - glyphMarginLeft: 0, - glyphMarginWidth: 0, - glyphMarginHeight: 800, + glyphMarginLeft: 0, + glyphMarginWidth: 0, + glyphMarginHeight: 800, - lineNumbersLeft: 0, - lineNumbersWidth: 0, - lineNumbersHeight: 800, + lineNumbersLeft: 0, + lineNumbersWidth: 0, + lineNumbersHeight: 800, - decorationsLeft: 0, - decorationsWidth: 10, - decorationsHeight: 800, + decorationsLeft: 0, + decorationsWidth: 10, + decorationsHeight: 800, - contentLeft: 10, - contentWidth: 990, - contentHeight: 800, + contentLeft: 10, + contentWidth: 990, + contentHeight: 800, - renderMinimap: RenderMinimap.None, - minimapWidth: 0, - viewportColumn: 97, + renderMinimap: RenderMinimap.None, + minimapWidth: 0, + viewportColumn: 97, - verticalScrollbarWidth: 11, - horizontalScrollbarHeight: 12, + verticalScrollbarWidth: 11, + horizontalScrollbarHeight: 12, - overviewRuler: new OverviewRulerPosition({ - top: 13, - width: 11, - height: (800 - 2 * 13), - right: 0 - }) - })); + overviewRuler: { + top: 13, + width: 11, + height: (800 - 2 * 13), + right: 0 + } + }); }); test('EditorLayoutProvider 2', () => { @@ -146,40 +146,40 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { minimapRenderCharacters: true, minimapMaxColumn: 150, pixelRatio: 1, - }, new EditorLayoutInfo({ - width: 900, - height: 800, - - glyphMarginLeft: 0, - glyphMarginWidth: 0, - glyphMarginHeight: 800, - - lineNumbersLeft: 0, - lineNumbersWidth: 0, - lineNumbersHeight: 800, - - decorationsLeft: 0, - decorationsWidth: 10, - decorationsHeight: 800, - - contentLeft: 10, - contentWidth: 890, - contentHeight: 800, - - renderMinimap: RenderMinimap.None, - minimapWidth: 0, - viewportColumn: 89, - - verticalScrollbarWidth: 0, - horizontalScrollbarHeight: 0, - - overviewRuler: new OverviewRulerPosition({ - top: 0, - width: 0, + }, { + width: 900, height: 800, - right: 0 - }) - })); + + glyphMarginLeft: 0, + glyphMarginWidth: 0, + glyphMarginHeight: 800, + + lineNumbersLeft: 0, + lineNumbersWidth: 0, + lineNumbersHeight: 800, + + decorationsLeft: 0, + decorationsWidth: 10, + decorationsHeight: 800, + + contentLeft: 10, + contentWidth: 890, + contentHeight: 800, + + renderMinimap: RenderMinimap.None, + minimapWidth: 0, + viewportColumn: 89, + + verticalScrollbarWidth: 0, + horizontalScrollbarHeight: 0, + + overviewRuler: { + top: 0, + width: 0, + height: 800, + right: 0 + } + }); }); test('EditorLayoutProvider 3', () => { @@ -202,40 +202,40 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { minimapRenderCharacters: true, minimapMaxColumn: 150, pixelRatio: 1, - }, new EditorLayoutInfo({ - width: 900, - height: 900, - - glyphMarginLeft: 0, - glyphMarginWidth: 0, - glyphMarginHeight: 900, - - lineNumbersLeft: 0, - lineNumbersWidth: 0, - lineNumbersHeight: 900, - - decorationsLeft: 0, - decorationsWidth: 10, - decorationsHeight: 900, - - contentLeft: 10, - contentWidth: 890, - contentHeight: 900, - - renderMinimap: RenderMinimap.None, - minimapWidth: 0, - viewportColumn: 89, - - verticalScrollbarWidth: 0, - horizontalScrollbarHeight: 0, - - overviewRuler: new OverviewRulerPosition({ - top: 0, - width: 0, + }, { + width: 900, height: 900, - right: 0 - }) - })); + + glyphMarginLeft: 0, + glyphMarginWidth: 0, + glyphMarginHeight: 900, + + lineNumbersLeft: 0, + lineNumbersWidth: 0, + lineNumbersHeight: 900, + + decorationsLeft: 0, + decorationsWidth: 10, + decorationsHeight: 900, + + contentLeft: 10, + contentWidth: 890, + contentHeight: 900, + + renderMinimap: RenderMinimap.None, + minimapWidth: 0, + viewportColumn: 89, + + verticalScrollbarWidth: 0, + horizontalScrollbarHeight: 0, + + overviewRuler: { + top: 0, + width: 0, + height: 900, + right: 0 + } + }); }); test('EditorLayoutProvider 4', () => { @@ -258,40 +258,40 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { minimapRenderCharacters: true, minimapMaxColumn: 150, pixelRatio: 1, - }, new EditorLayoutInfo({ - width: 900, - height: 900, - - glyphMarginLeft: 0, - glyphMarginWidth: 0, - glyphMarginHeight: 900, - - lineNumbersLeft: 0, - lineNumbersWidth: 0, - lineNumbersHeight: 900, - - decorationsLeft: 0, - decorationsWidth: 10, - decorationsHeight: 900, - - contentLeft: 10, - contentWidth: 890, - contentHeight: 900, - - renderMinimap: RenderMinimap.None, - minimapWidth: 0, - viewportColumn: 89, - - verticalScrollbarWidth: 0, - horizontalScrollbarHeight: 0, - - overviewRuler: new OverviewRulerPosition({ - top: 0, - width: 0, + }, { + width: 900, height: 900, - right: 0 - }) - })); + + glyphMarginLeft: 0, + glyphMarginWidth: 0, + glyphMarginHeight: 900, + + lineNumbersLeft: 0, + lineNumbersWidth: 0, + lineNumbersHeight: 900, + + decorationsLeft: 0, + decorationsWidth: 10, + decorationsHeight: 900, + + contentLeft: 10, + contentWidth: 890, + contentHeight: 900, + + renderMinimap: RenderMinimap.None, + minimapWidth: 0, + viewportColumn: 89, + + verticalScrollbarWidth: 0, + horizontalScrollbarHeight: 0, + + overviewRuler: { + top: 0, + width: 0, + height: 900, + right: 0 + } + }); }); test('EditorLayoutProvider 5', () => { @@ -314,40 +314,40 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { minimapRenderCharacters: true, minimapMaxColumn: 150, pixelRatio: 1, - }, new EditorLayoutInfo({ - width: 900, - height: 900, - - glyphMarginLeft: 0, - glyphMarginWidth: 0, - glyphMarginHeight: 900, - - lineNumbersLeft: 0, - lineNumbersWidth: 50, - lineNumbersHeight: 900, - - decorationsLeft: 50, - decorationsWidth: 10, - decorationsHeight: 900, - - contentLeft: 60, - contentWidth: 840, - contentHeight: 900, - - renderMinimap: RenderMinimap.None, - minimapWidth: 0, - viewportColumn: 84, - - verticalScrollbarWidth: 0, - horizontalScrollbarHeight: 0, - - overviewRuler: new OverviewRulerPosition({ - top: 0, - width: 0, + }, { + width: 900, height: 900, - right: 0 - }) - })); + + glyphMarginLeft: 0, + glyphMarginWidth: 0, + glyphMarginHeight: 900, + + lineNumbersLeft: 0, + lineNumbersWidth: 50, + lineNumbersHeight: 900, + + decorationsLeft: 50, + decorationsWidth: 10, + decorationsHeight: 900, + + contentLeft: 60, + contentWidth: 840, + contentHeight: 900, + + renderMinimap: RenderMinimap.None, + minimapWidth: 0, + viewportColumn: 84, + + verticalScrollbarWidth: 0, + horizontalScrollbarHeight: 0, + + overviewRuler: { + top: 0, + width: 0, + height: 900, + right: 0 + } + }); }); test('EditorLayoutProvider 6', () => { @@ -370,40 +370,40 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { minimapRenderCharacters: true, minimapMaxColumn: 150, pixelRatio: 1, - }, new EditorLayoutInfo({ - width: 900, - height: 900, - - glyphMarginLeft: 0, - glyphMarginWidth: 0, - glyphMarginHeight: 900, - - lineNumbersLeft: 0, - lineNumbersWidth: 50, - lineNumbersHeight: 900, - - decorationsLeft: 50, - decorationsWidth: 10, - decorationsHeight: 900, - - contentLeft: 60, - contentWidth: 840, - contentHeight: 900, - - renderMinimap: RenderMinimap.None, - minimapWidth: 0, - viewportColumn: 84, - - verticalScrollbarWidth: 0, - horizontalScrollbarHeight: 0, - - overviewRuler: new OverviewRulerPosition({ - top: 0, - width: 0, + }, { + width: 900, height: 900, - right: 0 - }) - })); + + glyphMarginLeft: 0, + glyphMarginWidth: 0, + glyphMarginHeight: 900, + + lineNumbersLeft: 0, + lineNumbersWidth: 50, + lineNumbersHeight: 900, + + decorationsLeft: 50, + decorationsWidth: 10, + decorationsHeight: 900, + + contentLeft: 60, + contentWidth: 840, + contentHeight: 900, + + renderMinimap: RenderMinimap.None, + minimapWidth: 0, + viewportColumn: 84, + + verticalScrollbarWidth: 0, + horizontalScrollbarHeight: 0, + + overviewRuler: { + top: 0, + width: 0, + height: 900, + right: 0 + } + }); }); test('EditorLayoutProvider 7', () => { @@ -426,40 +426,40 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { minimapRenderCharacters: true, minimapMaxColumn: 150, pixelRatio: 1, - }, new EditorLayoutInfo({ - width: 900, - height: 900, - - glyphMarginLeft: 0, - glyphMarginWidth: 0, - glyphMarginHeight: 900, - - lineNumbersLeft: 0, - lineNumbersWidth: 60, - lineNumbersHeight: 900, - - decorationsLeft: 60, - decorationsWidth: 10, - decorationsHeight: 900, - - contentLeft: 70, - contentWidth: 830, - contentHeight: 900, - - renderMinimap: RenderMinimap.None, - minimapWidth: 0, - viewportColumn: 83, - - verticalScrollbarWidth: 0, - horizontalScrollbarHeight: 0, - - overviewRuler: new OverviewRulerPosition({ - top: 0, - width: 0, + }, { + width: 900, height: 900, - right: 0 - }) - })); + + glyphMarginLeft: 0, + glyphMarginWidth: 0, + glyphMarginHeight: 900, + + lineNumbersLeft: 0, + lineNumbersWidth: 60, + lineNumbersHeight: 900, + + decorationsLeft: 60, + decorationsWidth: 10, + decorationsHeight: 900, + + contentLeft: 70, + contentWidth: 830, + contentHeight: 900, + + renderMinimap: RenderMinimap.None, + minimapWidth: 0, + viewportColumn: 83, + + verticalScrollbarWidth: 0, + horizontalScrollbarHeight: 0, + + overviewRuler: { + top: 0, + width: 0, + height: 900, + right: 0 + } + }); }); test('EditorLayoutProvider 8', () => { @@ -482,40 +482,40 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { minimapRenderCharacters: true, minimapMaxColumn: 150, pixelRatio: 1, - }, new EditorLayoutInfo({ - width: 900, - height: 900, - - glyphMarginLeft: 0, - glyphMarginWidth: 0, - glyphMarginHeight: 900, - - lineNumbersLeft: 0, - lineNumbersWidth: 30, - lineNumbersHeight: 900, - - decorationsLeft: 30, - decorationsWidth: 10, - decorationsHeight: 900, - - contentLeft: 40, - contentWidth: 860, - contentHeight: 900, - - renderMinimap: RenderMinimap.None, - minimapWidth: 0, - viewportColumn: 172, - - verticalScrollbarWidth: 0, - horizontalScrollbarHeight: 0, - - overviewRuler: new OverviewRulerPosition({ - top: 0, - width: 0, + }, { + width: 900, height: 900, - right: 0 - }) - })); + + glyphMarginLeft: 0, + glyphMarginWidth: 0, + glyphMarginHeight: 900, + + lineNumbersLeft: 0, + lineNumbersWidth: 30, + lineNumbersHeight: 900, + + decorationsLeft: 30, + decorationsWidth: 10, + decorationsHeight: 900, + + contentLeft: 40, + contentWidth: 860, + contentHeight: 900, + + renderMinimap: RenderMinimap.None, + minimapWidth: 0, + viewportColumn: 172, + + verticalScrollbarWidth: 0, + horizontalScrollbarHeight: 0, + + overviewRuler: { + top: 0, + width: 0, + height: 900, + right: 0 + } + }); }); test('EditorLayoutProvider 8 - rounds floats', () => { @@ -538,40 +538,40 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { minimapRenderCharacters: true, minimapMaxColumn: 150, pixelRatio: 1, - }, new EditorLayoutInfo({ - width: 900, - height: 900, - - glyphMarginLeft: 0, - glyphMarginWidth: 0, - glyphMarginHeight: 900, - - lineNumbersLeft: 0, - lineNumbersWidth: 30, - lineNumbersHeight: 900, - - decorationsLeft: 30, - decorationsWidth: 10, - decorationsHeight: 900, - - contentLeft: 40, - contentWidth: 860, - contentHeight: 900, - - renderMinimap: RenderMinimap.None, - minimapWidth: 0, - viewportColumn: 170, - - verticalScrollbarWidth: 0, - horizontalScrollbarHeight: 0, - - overviewRuler: new OverviewRulerPosition({ - top: 0, - width: 0, + }, { + width: 900, height: 900, - right: 0 - }) - })); + + glyphMarginLeft: 0, + glyphMarginWidth: 0, + glyphMarginHeight: 900, + + lineNumbersLeft: 0, + lineNumbersWidth: 30, + lineNumbersHeight: 900, + + decorationsLeft: 30, + decorationsWidth: 10, + decorationsHeight: 900, + + contentLeft: 40, + contentWidth: 860, + contentHeight: 900, + + renderMinimap: RenderMinimap.None, + minimapWidth: 0, + viewportColumn: 170, + + verticalScrollbarWidth: 0, + horizontalScrollbarHeight: 0, + + overviewRuler: { + top: 0, + width: 0, + height: 900, + right: 0 + } + }); }); test('EditorLayoutProvider 9 - render minimap', () => { @@ -594,40 +594,40 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { minimapRenderCharacters: true, minimapMaxColumn: 150, pixelRatio: 1, - }, new EditorLayoutInfo({ - width: 1000, - height: 800, - - glyphMarginLeft: 0, - glyphMarginWidth: 0, - glyphMarginHeight: 800, - - lineNumbersLeft: 0, - lineNumbersWidth: 0, - lineNumbersHeight: 800, - - decorationsLeft: 0, - decorationsWidth: 10, - decorationsHeight: 800, - - contentLeft: 10, - contentWidth: 900, - contentHeight: 800, - - renderMinimap: RenderMinimap.Small, - minimapWidth: 90, - viewportColumn: 90, - - verticalScrollbarWidth: 0, - horizontalScrollbarHeight: 0, - - overviewRuler: new OverviewRulerPosition({ - top: 0, - width: 0, + }, { + width: 1000, height: 800, - right: 0 - }) - })); + + glyphMarginLeft: 0, + glyphMarginWidth: 0, + glyphMarginHeight: 800, + + lineNumbersLeft: 0, + lineNumbersWidth: 0, + lineNumbersHeight: 800, + + decorationsLeft: 0, + decorationsWidth: 10, + decorationsHeight: 800, + + contentLeft: 10, + contentWidth: 900, + contentHeight: 800, + + renderMinimap: RenderMinimap.Small, + minimapWidth: 90, + viewportColumn: 90, + + verticalScrollbarWidth: 0, + horizontalScrollbarHeight: 0, + + overviewRuler: { + top: 0, + width: 0, + height: 800, + right: 0 + } + }); }); test('EditorLayoutProvider 9 - render minimap with pixelRatio = 2', () => { @@ -650,40 +650,40 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { minimapRenderCharacters: true, minimapMaxColumn: 150, pixelRatio: 2, - }, new EditorLayoutInfo({ - width: 1000, - height: 800, - - glyphMarginLeft: 0, - glyphMarginWidth: 0, - glyphMarginHeight: 800, - - lineNumbersLeft: 0, - lineNumbersWidth: 0, - lineNumbersHeight: 800, - - decorationsLeft: 0, - decorationsWidth: 10, - decorationsHeight: 800, - - contentLeft: 10, - contentWidth: 900, - contentHeight: 800, - - renderMinimap: RenderMinimap.Large, - minimapWidth: 90, - viewportColumn: 90, - - verticalScrollbarWidth: 0, - horizontalScrollbarHeight: 0, - - overviewRuler: new OverviewRulerPosition({ - top: 0, - width: 0, + }, { + width: 1000, height: 800, - right: 0 - }) - })); + + glyphMarginLeft: 0, + glyphMarginWidth: 0, + glyphMarginHeight: 800, + + lineNumbersLeft: 0, + lineNumbersWidth: 0, + lineNumbersHeight: 800, + + decorationsLeft: 0, + decorationsWidth: 10, + decorationsHeight: 800, + + contentLeft: 10, + contentWidth: 900, + contentHeight: 800, + + renderMinimap: RenderMinimap.Large, + minimapWidth: 90, + viewportColumn: 90, + + verticalScrollbarWidth: 0, + horizontalScrollbarHeight: 0, + + overviewRuler: { + top: 0, + width: 0, + height: 800, + right: 0 + } + }); }); test('EditorLayoutProvider 9 - render minimap with pixelRatio = 4', () => { @@ -706,39 +706,39 @@ suite('Editor ViewLayout - EditorLayoutProvider', () => { minimapRenderCharacters: true, minimapMaxColumn: 150, pixelRatio: 4, - }, new EditorLayoutInfo({ - width: 1000, - height: 800, - - glyphMarginLeft: 0, - glyphMarginWidth: 0, - glyphMarginHeight: 800, - - lineNumbersLeft: 0, - lineNumbersWidth: 0, - lineNumbersHeight: 800, - - decorationsLeft: 0, - decorationsWidth: 10, - decorationsHeight: 800, - - contentLeft: 10, - contentWidth: 943, - contentHeight: 800, - - renderMinimap: RenderMinimap.Large, - minimapWidth: 47, - viewportColumn: 94, - - verticalScrollbarWidth: 0, - horizontalScrollbarHeight: 0, - - overviewRuler: new OverviewRulerPosition({ - top: 0, - width: 0, + }, { + width: 1000, height: 800, - right: 0 - }) - })); + + glyphMarginLeft: 0, + glyphMarginWidth: 0, + glyphMarginHeight: 800, + + lineNumbersLeft: 0, + lineNumbersWidth: 0, + lineNumbersHeight: 800, + + decorationsLeft: 0, + decorationsWidth: 10, + decorationsHeight: 800, + + contentLeft: 10, + contentWidth: 943, + contentHeight: 800, + + renderMinimap: RenderMinimap.Large, + minimapWidth: 47, + viewportColumn: 94, + + verticalScrollbarWidth: 0, + horizontalScrollbarHeight: 0, + + overviewRuler: { + top: 0, + width: 0, + height: 800, + right: 0 + } + }); }); }); diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 69604f4fa60..94337858952 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -3122,8 +3122,7 @@ declare module monaco.editor { UnderlineThin = 6, } - export class InternalEditorScrollbarOptions { - readonly _internalEditorScrollbarOptionsBrand: void; + export interface InternalEditorScrollbarOptions { readonly arrowSize: number; readonly vertical: ScrollbarVisibility; readonly horizontal: ScrollbarVisibility; @@ -3138,15 +3137,13 @@ declare module monaco.editor { readonly mouseWheelScrollSensitivity: number; } - export class InternalEditorMinimapOptions { - readonly _internalEditorMinimapOptionsBrand: void; + export interface InternalEditorMinimapOptions { readonly enabled: boolean; readonly renderCharacters: boolean; readonly maxColumn: number; } - export class EditorWrappingInfo { - readonly _editorWrappingInfoBrand: void; + export interface EditorWrappingInfo { readonly inDiffEditor: boolean; readonly isDominatedByLongLines: boolean; readonly isWordWrapMinified: boolean; @@ -3158,9 +3155,8 @@ declare module monaco.editor { readonly wordWrapBreakObtrusiveCharacters: string; } - export class InternalEditorViewOptions { + export interface InternalEditorViewOptions { readonly theme: string; - readonly canUseTranslate3d: boolean; readonly disableMonospaceOptimizations: boolean; readonly experimentalScreenReader: boolean; readonly rulers: number[]; @@ -3179,7 +3175,6 @@ declare module monaco.editor { readonly cursorStyle: TextEditorCursorStyle; readonly hideCursorInOverviewRuler: boolean; readonly scrollBeyondLastLine: boolean; - readonly editorClassName: string; readonly stopRenderingLineAfter: number; readonly renderWhitespace: 'none' | 'boundary' | 'all'; readonly renderControlCharacters: boolean; @@ -3191,7 +3186,7 @@ declare module monaco.editor { readonly fixedOverflowWidgets: boolean; } - export class EditorContribOptions { + export interface EditorContribOptions { readonly selectionClipboard: boolean; readonly hover: boolean; readonly contextmenu: boolean; @@ -3226,6 +3221,8 @@ declare module monaco.editor { */ export class InternalEditorOptions { readonly _internalEditorOptionsBrand: void; + readonly canUseTranslate3d: boolean; + readonly editorClassName: string; readonly lineHeight: number; readonly readOnly: boolean; readonly wordSeparators: string; @@ -3243,8 +3240,7 @@ declare module monaco.editor { /** * A description for the overview ruler position. */ - export class OverviewRulerPosition { - readonly _overviewRulerPositionBrand: void; + export interface OverviewRulerPosition { /** * Width of the overview ruler */ @@ -3266,8 +3262,7 @@ declare module monaco.editor { /** * The internal layout details of the editor. */ - export class EditorLayoutInfo { - readonly _editorLayoutInfoBrand: void; + export interface EditorLayoutInfo { /** * Full editor width. */ @@ -3354,6 +3349,8 @@ declare module monaco.editor { * An event describing that the configuration of the editor has changed. */ export interface IConfigurationChangedEvent { + readonly canUseTranslate3d: boolean; + readonly editorClassName: boolean; readonly lineHeight: boolean; readonly readOnly: boolean; readonly wordSeparators: boolean; From 3b8f8a3bd9ea487cf99334190a840adb334da872 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 8 May 2017 22:44:13 +0200 Subject: [PATCH 0187/1164] Simplify editor configuration --- src/vs/editor/browser/config/configuration.ts | 50 +++++-------- .../browser/config/elementSizeObserver.ts | 3 +- .../common/config/commonEditorConfig.ts | 72 ++++++++++--------- .../common/config/commonEditorConfig.test.ts | 12 +++- .../test/common/mocks/testConfiguration.ts | 34 +++------ 5 files changed, 79 insertions(+), 92 deletions(-) diff --git a/src/vs/editor/browser/config/configuration.ts b/src/vs/editor/browser/config/configuration.ts index 330903d01af..80191982f21 100644 --- a/src/vs/editor/browser/config/configuration.ts +++ b/src/vs/editor/browser/config/configuration.ts @@ -8,7 +8,7 @@ import Event, { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import * as platform from 'vs/base/common/platform'; import * as browser from 'vs/base/browser/browser'; -import { CommonEditorConfiguration } from 'vs/editor/common/config/commonEditorConfig'; +import { CommonEditorConfiguration, IEnvConfiguration } from 'vs/editor/common/config/commonEditorConfig'; import { IDimension } from 'vs/editor/common/editorCommon'; import { FontInfo, BareFontInfo } from 'vs/editor/common/config/fontInfo'; import { ElementSizeObserver } from 'vs/editor/browser/config/elementSizeObserver'; @@ -309,8 +309,12 @@ export class Configuration extends CommonEditorConfiguration { domNode.setLineHeight(fontInfo.lineHeight); } + private readonly _elementSizeObserver: ElementSizeObserver; + constructor(options: IEditorOptions, referenceDomElement: HTMLElement = null) { - super(options, new ElementSizeObserver(referenceDomElement, () => this._onReferenceDomElementSizeChanged())); + super(options); + + this._elementSizeObserver = this._register(new ElementSizeObserver(referenceDomElement, () => this._onReferenceDomElementSizeChanged())); this._register(CSSBasedConfiguration.INSTANCE.onDidChange(() => this._onCSSBasedConfigurationChanged())); @@ -319,6 +323,8 @@ export class Configuration extends CommonEditorConfiguration { } this._register(browser.onDidChangeZoomLevel(_ => this._recomputeOptions())); + + this._recomputeOptions(); } private _onReferenceDomElementSizeChanged(): void { @@ -334,11 +340,10 @@ export class Configuration extends CommonEditorConfiguration { } public dispose(): void { - this._elementSizeObserver.dispose(); super.dispose(); } - protected _getEditorClassName(theme: string, fontLigatures: boolean, mouseStyle: 'text' | 'default' | 'copy'): string { + private _getExtraEditorClassName(): string { let extra = ''; if (browser.isIE) { extra += 'ie '; @@ -350,38 +355,21 @@ export class Configuration extends CommonEditorConfiguration { if (platform.isMacintosh) { extra += 'mac '; } - if (fontLigatures) { - extra += 'enable-ligatures '; - } - if (mouseStyle === 'default') { - extra += 'mouse-default '; - } else if (mouseStyle === 'copy') { - extra += 'mouse-copy '; - } - return 'monaco-editor ' + extra + theme; + return extra; } - protected getOuterWidth(): number { - return this._elementSizeObserver.getWidth(); - } - - protected getOuterHeight(): number { - return this._elementSizeObserver.getHeight(); - } - - protected _getCanUseTranslate3d(): boolean { - return browser.canUseTranslate3d(); - } - - protected _getPixelRatio(): number { - return browser.getPixelRatio(); + protected _getEnvConfiguration(): IEnvConfiguration { + return { + extraEditorClassName: this._getExtraEditorClassName(), + outerWidth: this._elementSizeObserver.getWidth(), + outerHeight: this._elementSizeObserver.getHeight(), + canUseTranslate3d: browser.canUseTranslate3d(), + pixelRatio: browser.getPixelRatio(), + zoomLevel: browser.getZoomLevel() + }; } protected readConfiguration(bareFontInfo: BareFontInfo): FontInfo { return CSSBasedConfiguration.INSTANCE.readConfiguration(bareFontInfo); } - - protected getZoomLevel(): number { - return browser.getZoomLevel(); - } } diff --git a/src/vs/editor/browser/config/elementSizeObserver.ts b/src/vs/editor/browser/config/elementSizeObserver.ts index ee21f6c21bd..bd8814cace9 100644 --- a/src/vs/editor/browser/config/elementSizeObserver.ts +++ b/src/vs/editor/browser/config/elementSizeObserver.ts @@ -6,9 +6,8 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { IDimension } from 'vs/editor/common/editorCommon'; -import { IElementSizeObserver } from 'vs/editor/common/config/commonEditorConfig'; -export class ElementSizeObserver extends Disposable implements IElementSizeObserver { +export class ElementSizeObserver extends Disposable { private referenceDomElement: HTMLElement; private measureReferenceDomElementToken: number; diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 62ca9dfe173..172b427f1b3 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -51,38 +51,35 @@ export const TabFocus: ITabFocus = new class { } }; -export interface IElementSizeObserver { - startObserving(): void; - observe(dimension?: editorCommon.IDimension): void; - dispose(): void; - getWidth(): number; - getHeight(): number; +export interface IEnvConfiguration { + extraEditorClassName: string; + outerWidth: number; + outerHeight: number; + canUseTranslate3d: boolean; + pixelRatio: number; + zoomLevel: number; } export abstract class CommonEditorConfiguration extends Disposable implements editorCommon.IConfiguration { protected _rawOptions: editorOptions.IEditorOptions; protected _validatedOptions: editorOptions.IValidatedEditorOptions; - public editor: editorOptions.InternalEditorOptions; - - protected _elementSizeObserver: IElementSizeObserver; private _isDominatedByLongLines: boolean; private _lineNumbersDigitCount: number; private _onDidChange = this._register(new Emitter()); public onDidChange: Event = this._onDidChange.event; - constructor(options: editorOptions.IEditorOptions, elementSizeObserver: IElementSizeObserver = null) { + constructor(options: editorOptions.IEditorOptions) { super(); this._rawOptions = options || {}; this._validatedOptions = editorOptions.EditorOptionsValidator.validate(this._rawOptions, EDITOR_DEFAULTS); - - this._elementSizeObserver = elementSizeObserver; + this.editor = null; this._isDominatedByLongLines = false; this._lineNumbersDigitCount = 1; - this.editor = this._computeInternalOptions(); + this._register(EditorZoom.onDidChangeZoomLevel(_ => this._recomputeOptions())); this._register(TabFocus.onDidChangeTabFocus(_ => this._recomputeOptions())); } @@ -92,17 +89,18 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed } protected _recomputeOptions(): void { - this._setOptions(this._computeInternalOptions()); - } + const oldOptions = this.editor; + const newOptions = this._computeInternalOptions(); - private _setOptions(newOptions: editorOptions.InternalEditorOptions): void { - if (this.editor && this.editor.equals(newOptions)) { + if (oldOptions && oldOptions.equals(newOptions)) { return; } - let changeEvent = this.editor.createChangeEvent(newOptions); this.editor = newOptions; - this._onDidChange.fire(changeEvent); + + if (oldOptions) { + this._onDidChange.fire(oldOptions.createChangeEvent(newOptions)); + } } public getRawOptions(): editorOptions.IEditorOptions { @@ -111,16 +109,18 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed private _computeInternalOptions(): editorOptions.InternalEditorOptions { const opts = this._validatedOptions; - const bareFontInfo = BareFontInfo.createFromRawSettings(this._rawOptions, this.getZoomLevel()); + const partialEnv = this._getEnvConfiguration(); + const bareFontInfo = BareFontInfo.createFromRawSettings(this._rawOptions, partialEnv.zoomLevel); + const editorClassName = this._getEditorClassName(opts.viewInfo.theme, opts.viewInfo.fontLigatures, opts.mouseStyle); const env: editorOptions.IEnvironmentalOptions = { - outerWidth: this.getOuterWidth(), - outerHeight: this.getOuterHeight(), + outerWidth: partialEnv.outerWidth, + outerHeight: partialEnv.outerHeight, fontInfo: this.readConfiguration(bareFontInfo), - editorClassName: this._getEditorClassName(opts.viewInfo.theme, opts.viewInfo.fontLigatures, opts.mouseStyle), + editorClassName: editorClassName + ' ' + partialEnv.extraEditorClassName, isDominatedByLongLines: this._isDominatedByLongLines, lineNumbersDigitCount: this._lineNumbersDigitCount, - canUseTranslate3d: this._getCanUseTranslate3d(), - pixelRatio: this._getPixelRatio(), + canUseTranslate3d: partialEnv.canUseTranslate3d, + pixelRatio: partialEnv.pixelRatio, tabFocusMode: TabFocus.getTabFocusMode() }; return editorOptions.InternalEditorOptionsFactory.createInternalEditorOptions(env, opts); @@ -155,19 +155,23 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed return r ? r : 1; } - protected abstract _getEditorClassName(theme: string, fontLigatures: boolean, mouseDrag: 'text' | 'default' | 'copy'): string; + private _getEditorClassName(theme: string, fontLigatures: boolean, mouseStyle: 'text' | 'default' | 'copy'): string { + let extra = ''; + if (fontLigatures) { + extra += 'enable-ligatures '; + } + if (mouseStyle === 'default') { + extra += 'mouse-default '; + } else if (mouseStyle === 'copy') { + extra += 'mouse-copy '; + } + return 'monaco-editor ' + extra + theme; + } - protected abstract getOuterWidth(): number; - - protected abstract getOuterHeight(): number; - - protected abstract _getCanUseTranslate3d(): boolean; - - protected abstract _getPixelRatio(): number; + protected abstract _getEnvConfiguration(): IEnvConfiguration; protected abstract readConfiguration(styling: BareFontInfo): FontInfo; - protected abstract getZoomLevel(): number; } const configurationRegistry = Registry.as(Extensions.Configuration); diff --git a/src/vs/editor/test/common/config/commonEditorConfig.test.ts b/src/vs/editor/test/common/config/commonEditorConfig.test.ts index bda2f542ccb..e98f7cc203c 100644 --- a/src/vs/editor/test/common/config/commonEditorConfig.test.ts +++ b/src/vs/editor/test/common/config/commonEditorConfig.test.ts @@ -7,6 +7,7 @@ import * as assert from 'assert'; import { EditorZoom } from 'vs/editor/common/config/editorZoom'; import { TestConfiguration } from 'vs/editor/test/common/mocks/testConfiguration'; +import { IEnvConfiguration } from "vs/editor/common/config/commonEditorConfig"; suite('Common Editor Config', () => { test('Zoom Level', () => { @@ -52,8 +53,15 @@ suite('Common Editor Config', () => { }); class TestWrappingConfiguration extends TestConfiguration { - protected getOuterWidth(): number { - return 1000; + protected _getEnvConfiguration(): IEnvConfiguration { + return { + extraEditorClassName: '', + outerWidth: 1000, + outerHeight: 100, + canUseTranslate3d: true, + pixelRatio: 1, + zoomLevel: 0 + }; } } diff --git a/src/vs/editor/test/common/mocks/testConfiguration.ts b/src/vs/editor/test/common/mocks/testConfiguration.ts index d8cede0b45b..41917c57f23 100644 --- a/src/vs/editor/test/common/mocks/testConfiguration.ts +++ b/src/vs/editor/test/common/mocks/testConfiguration.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { CommonEditorConfiguration } from 'vs/editor/common/config/commonEditorConfig'; +import { CommonEditorConfiguration, IEnvConfiguration } from 'vs/editor/common/config/commonEditorConfig'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { FontInfo, BareFontInfo } from 'vs/editor/common/config/fontInfo'; @@ -12,26 +12,18 @@ export class TestConfiguration extends CommonEditorConfiguration { constructor(opts: IEditorOptions) { super(opts); + this._recomputeOptions(); } - protected _getEditorClassName(theme: string, fontLigatures: boolean): string { - return ''; - } - - protected getOuterWidth(): number { - return 100; - } - - protected getOuterHeight(): number { - return 100; - } - - protected _getCanUseTranslate3d(): boolean { - return true; - } - - protected _getPixelRatio(): number { - return 1; + protected _getEnvConfiguration(): IEnvConfiguration { + return { + extraEditorClassName: '', + outerWidth: 100, + outerHeight: 100, + canUseTranslate3d: true, + pixelRatio: 1, + zoomLevel: 0 + }; } protected readConfiguration(styling: BareFontInfo): FontInfo { @@ -48,8 +40,4 @@ export class TestConfiguration extends CommonEditorConfiguration { maxDigitWidth: 10, }, true); } - - protected getZoomLevel(): number { - return 0; - } } From 96d9bd667136326898a65533ce1d037953b6d406 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 8 May 2017 23:03:25 +0200 Subject: [PATCH 0188/1164] Fixes #22433: Enforce a minimum for editor.lineHeight --- src/vs/editor/common/config/fontInfo.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/editor/common/config/fontInfo.ts b/src/vs/editor/common/config/fontInfo.ts index 947c51bf1b9..ae3ff7bfe9b 100644 --- a/src/vs/editor/common/config/fontInfo.ts +++ b/src/vs/editor/common/config/fontInfo.ts @@ -73,12 +73,16 @@ export class BareFontInfo { fontSize = clamp(fontSize, 0, 100); if (fontSize === 0) { fontSize = EDITOR_FONT_DEFAULTS.fontSize; + } else if (fontSize < 8) { + fontSize = 8; } let lineHeight = safeParseInt(opts.lineHeight, 0); lineHeight = clamp(lineHeight, 0, 150); if (lineHeight === 0) { lineHeight = Math.round(GOLDEN_LINE_HEIGHT_RATIO * fontSize); + } else if (lineHeight < 8) { + lineHeight = 8; } let editorZoomLevelMultiplier = 1 + (EditorZoom.getZoomLevel() * 0.1); From 91b79959041b247eb45399867bf75061bae9c94f Mon Sep 17 00:00:00 2001 From: chrisdias Date: Mon, 8 May 2017 14:25:17 -0700 Subject: [PATCH 0189/1164] support FROM...AS in dockerfile --- extensions/docker/syntaxes/docker.tmLanguage.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/extensions/docker/syntaxes/docker.tmLanguage.json b/extensions/docker/syntaxes/docker.tmLanguage.json index 6ca5dc67b08..ccd56618a90 100644 --- a/extensions/docker/syntaxes/docker.tmLanguage.json +++ b/extensions/docker/syntaxes/docker.tmLanguage.json @@ -4,6 +4,14 @@ ], "name": "Dockerfile", "patterns": [ + { + "captures": { + "1": { + "name": "keyword.other.dockerfile" + } + }, + "match": "\\s*(?:(FROM|AS))\\s" + }, { "captures": { "1": { From 9ebaef7fe4f7d859afaa428175782560b2917bf1 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 8 May 2017 15:41:38 -0700 Subject: [PATCH 0190/1164] Fix node_modules being included in our ts projects Part of #24698 **bug** A node_modules folder under build/lib/watch is being included in our project system. This slows down TS quite a lot **fix** Remove this and remove the root jsconfig.json in the project --- build/tsconfig.json | 6 +++++- jsconfig.json | 27 --------------------------- 2 files changed, 5 insertions(+), 28 deletions(-) delete mode 100644 jsconfig.json diff --git a/build/tsconfig.json b/build/tsconfig.json index 59a73844e14..6dacf425042 100644 --- a/build/tsconfig.json +++ b/build/tsconfig.json @@ -9,5 +9,9 @@ "experimentalDecorators": true, "noLib": true, "newLine": "LF" - } + }, + "exclude": [ + "node_modules", + "./lib/watch/node_modules/**/*" + ] } \ No newline at end of file diff --git a/jsconfig.json b/jsconfig.json deleted file mode 100644 index cc732031011..00000000000 --- a/jsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - // See https://go.microsoft.com/fwlink/?LinkId=759670 - // for the documentation about the jsconfig.json format - "compilerOptions": { - "target": "es6", - "module": "commonjs", - "allowSyntheticDefaultImports": true - }, - "exclude": [ - "src", - "extensions", - "test", - "i18n", - "out", - "out-build", - "out-vscode", - "out-vscode-min", - "out-editor", - "out-editor-min", - "out-monaco-editor-core", - "resources", - "scripts", - ".build", - "node_modules", - "build/monaco/node_modules" - ] -} From 312cb04e19e8f61381fc79de8e79d3ab09f96faf Mon Sep 17 00:00:00 2001 From: chrisdias Date: Mon, 8 May 2017 15:50:46 -0700 Subject: [PATCH 0191/1164] fix keyword type to fix tests --- extensions/docker/syntaxes/docker.tmLanguage.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/docker/syntaxes/docker.tmLanguage.json b/extensions/docker/syntaxes/docker.tmLanguage.json index ccd56618a90..caab35092b0 100644 --- a/extensions/docker/syntaxes/docker.tmLanguage.json +++ b/extensions/docker/syntaxes/docker.tmLanguage.json @@ -7,7 +7,7 @@ { "captures": { "1": { - "name": "keyword.other.dockerfile" + "name": "keyword.other.special-method.dockerfile" } }, "match": "\\s*(?:(FROM|AS))\\s" From 6e0d024ad55d9fcd31e0858575e961e8464a637b Mon Sep 17 00:00:00 2001 From: rebornix Date: Mon, 8 May 2017 14:48:05 -0700 Subject: [PATCH 0192/1164] Fix #6158. Persist isRegex, macthCase, wholeWord search settings for workspace --- src/vs/editor/contrib/find/browser/find.ts | 6 ++-- .../editor/contrib/find/browser/findWidget.ts | 3 ++ .../contrib/find/common/findController.ts | 33 +++++++++++++++++-- .../find/test/common/findController.test.ts | 5 +-- 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/contrib/find/browser/find.ts b/src/vs/editor/contrib/find/browser/find.ts index cc32e668da5..3b5e1d0bb1d 100644 --- a/src/vs/editor/contrib/find/browser/find.ts +++ b/src/vs/editor/contrib/find/browser/find.ts @@ -13,6 +13,7 @@ import { FindWidget, IFindController } from 'vs/editor/contrib/find/browser/find import { FindOptionsWidget } from 'vs/editor/contrib/find/browser/findOptionsWidget'; import { CommonFindController, FindStartFocusAction, IFindStartOptions } from 'vs/editor/contrib/find/common/findController'; import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IStorageService } from 'vs/platform/storage/common/storage'; @editorContribution export class FindController extends CommonFindController implements IFindController { @@ -25,9 +26,10 @@ export class FindController extends CommonFindController implements IFindControl @IContextViewService contextViewService: IContextViewService, @IContextKeyService contextKeyService: IContextKeyService, @IKeybindingService keybindingService: IKeybindingService, - @IThemeService themeService: IThemeService + @IThemeService themeService: IThemeService, + @IStorageService storageService: IStorageService ) { - super(editor, contextKeyService); + super(editor, contextKeyService, storageService); this._widget = this._register(new FindWidget(editor, this, this._state, contextViewService, keybindingService, contextKeyService, themeService)); this._findOptionsWidget = this._register(new FindOptionsWidget(editor, this._state, keybindingService, themeService)); diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index 09d722afa8f..559c6635abc 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -483,6 +483,9 @@ export class FindWidget extends Widget implements IOverlayWidget { } } })); + this._findInput.setRegex(!!this._state.isRegex); + this._findInput.setCaseSensitive(!!this._state.matchCase); + this._findInput.setWholeWords(!!this._state.wholeWord); this._register(this._findInput.onKeyDown((e) => this._onFindInputKeyDown(e))); this._register(this._findInput.onInput(() => { this._state.change({ searchString: this._findInput.getValue() }, true); diff --git a/src/vs/editor/contrib/find/common/findController.ts b/src/vs/editor/contrib/find/common/findController.ts index c788dafd5f2..a8f06599b3f 100644 --- a/src/vs/editor/contrib/find/common/findController.ts +++ b/src/vs/editor/contrib/find/common/findController.ts @@ -20,6 +20,7 @@ import { DocumentHighlightProviderRegistry } from 'vs/editor/common/modes'; import { RunOnceScheduler, Delayer } from 'vs/base/common/async'; import { CursorChangeReason, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; export const enum FindStartFocusAction { NoFocusChange, @@ -48,19 +49,22 @@ export class CommonFindController extends Disposable implements editorCommon.IEd private _currentHistoryNavigator: HistoryNavigator; protected _updateHistoryDelayer: Delayer; private _model: FindModelBoundToEditorModel; + private _storageService: IStorageService; public static get(editor: editorCommon.ICommonCodeEditor): CommonFindController { return editor.getContribution(CommonFindController.ID); } - constructor(editor: editorCommon.ICommonCodeEditor, @IContextKeyService contextKeyService: IContextKeyService) { + constructor(editor: editorCommon.ICommonCodeEditor, @IContextKeyService contextKeyService: IContextKeyService, @IStorageService storageService: IStorageService) { super(); this._editor = editor; this._findWidgetVisible = CONTEXT_FIND_WIDGET_VISIBLE.bindTo(contextKeyService); + this._storageService = storageService; this._updateHistoryDelayer = new Delayer(500); this._currentHistoryNavigator = new HistoryNavigator(); this._state = this._register(new FindReplaceState()); + this.loadQueryState(); this._register(this._state.addChangeListener((e) => this._onStateChanged(e))); this._model = null; @@ -71,7 +75,10 @@ export class CommonFindController extends Disposable implements editorCommon.IEd this.disposeModel(); this._state.change({ - searchScope: null + searchScope: null, + matchCase: this._storageService.getBoolean('editor.matchCase', StorageScope.WORKSPACE, false), + wholeWord: this._storageService.getBoolean('editor.wholeWord', StorageScope.WORKSPACE, false), + isRegex: this._storageService.getBoolean('editor.isRegex', StorageScope.WORKSPACE, false) }, false); if (shouldRestartFind) { @@ -102,6 +109,8 @@ export class CommonFindController extends Disposable implements editorCommon.IEd } private _onStateChanged(e: FindReplaceStateChangedEvent): void { + this.saveQueryState(e); + if (e.updateHistory && e.searchString) { this._delayedUpdateHistory(); } @@ -115,6 +124,26 @@ export class CommonFindController extends Disposable implements editorCommon.IEd } } + private saveQueryState(e: FindReplaceStateChangedEvent) { + if (e.isRegex && typeof this._state.isRegex !== 'undefined') { + this._storageService.store('editor.isRegex', this._state.isRegex, StorageScope.WORKSPACE); + } + if (e.wholeWord && typeof this._state.wholeWord !== 'undefined') { + this._storageService.store('editor.wholeWord', this._state.wholeWord, StorageScope.WORKSPACE); + } + if (e.matchCase && typeof this._state.matchCase !== 'undefined') { + this._storageService.store('editor.matchCase', this._state.matchCase, StorageScope.WORKSPACE); + } + } + + private loadQueryState() { + this._state.change({ + matchCase: this._storageService.getBoolean('editor.matchCase', StorageScope.WORKSPACE, this._state.matchCase), + wholeWord: this._storageService.getBoolean('editor.wholeWord', StorageScope.WORKSPACE, this._state.wholeWord), + isRegex: this._storageService.getBoolean('editor.isRegex', StorageScope.WORKSPACE, this._state.isRegex) + }, false); + } + protected _delayedUpdateHistory() { this._updateHistoryDelayer.trigger(this._updateHistory.bind(this)); } diff --git a/src/vs/editor/contrib/find/test/common/findController.test.ts b/src/vs/editor/contrib/find/test/common/findController.test.ts index 949fbc5632e..311a6c18373 100644 --- a/src/vs/editor/contrib/find/test/common/findController.test.ts +++ b/src/vs/editor/contrib/find/test/common/findController.test.ts @@ -20,6 +20,7 @@ import { import { MockCodeEditor, withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; import { HistoryNavigator } from 'vs/base/common/history'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IStorageService } from 'vs/platform/storage/common/storage'; import { Delayer } from 'vs/base/common/async'; class TestFindController extends CommonFindController { @@ -30,8 +31,8 @@ class TestFindController extends CommonFindController { private _delayedUpdateHistoryEvent: Emitter = new Emitter(); - constructor(editor: ICommonCodeEditor, @IContextKeyService contextKeyService: IContextKeyService) { - super(editor, contextKeyService); + constructor(editor: ICommonCodeEditor, @IContextKeyService contextKeyService: IContextKeyService, @IStorageService storageService: IStorageService) { + super(editor, contextKeyService, storageService); this._updateHistoryDelayer = new Delayer(50); } From bf3ab10ecae8930b18e7747df3a207bfed13dae4 Mon Sep 17 00:00:00 2001 From: rebornix Date: Mon, 8 May 2017 15:31:52 -0700 Subject: [PATCH 0193/1164] Fix test failure as IStorageService is not initalized in test --- .../find/test/common/findController.test.ts | 40 +++++++++++-------- .../test/common/mocks/mockCodeEditor.ts | 3 +- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/vs/editor/contrib/find/test/common/findController.test.ts b/src/vs/editor/contrib/find/test/common/findController.test.ts index 311a6c18373..d8670a93fc9 100644 --- a/src/vs/editor/contrib/find/test/common/findController.test.ts +++ b/src/vs/editor/contrib/find/test/common/findController.test.ts @@ -17,10 +17,12 @@ import { NextMatchFindAction, StartFindAction, SelectHighlightsAction, AddSelectionToNextFindMatchAction } from 'vs/editor/contrib/find/common/findController'; +import { FindReplaceState } from 'vs/editor/contrib/find/common/findState'; import { MockCodeEditor, withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; import { HistoryNavigator } from 'vs/base/common/history'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IStorageService } from 'vs/platform/storage/common/storage'; +import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { Delayer } from 'vs/base/common/async'; class TestFindController extends CommonFindController { @@ -68,7 +70,13 @@ class TestFindController extends CommonFindController { } suite('FindController', () => { - + let queryState = new FindReplaceState(); + let serviceCollection = new ServiceCollection(); + serviceCollection.set(IStorageService, { + get: (key) => queryState[key], + getBoolean: (key) => !!queryState[key], + store: (key: string, value: any) => { queryState[key] = value; } + }); function fromRange(rng: Range): number[] { return [rng.startLineNumber, rng.startColumn, rng.endLineNumber, rng.endColumn]; } @@ -79,7 +87,7 @@ suite('FindController', () => { 'ABC', 'XYZ', 'ABC' - ], {}, (editor, cursor) => { + ], { serviceCollection: serviceCollection }, (editor, cursor) => { // The cursor is at the very top, of the file, at the first ABC let findController = editor.registerAndInstantiateContribution(TestFindController); @@ -134,7 +142,7 @@ suite('FindController', () => { test('issue #3090: F3 does not loop with two matches on a single line', () => { withMockCodeEditor([ 'import nls = require(\'vs/nls\');' - ], {}, (editor, cursor) => { + ], { serviceCollection: serviceCollection }, (editor, cursor) => { let findController = editor.registerAndInstantiateContribution(TestFindController); let nextMatchFindAction = new NextMatchFindAction(); @@ -159,7 +167,7 @@ suite('FindController', () => { 'var x = (3 * 5)', 'var y = (3 * 5)', 'var z = (3 * 5)', - ], {}, (editor, cursor) => { + ], { serviceCollection: serviceCollection }, (editor, cursor) => { let findController = editor.registerAndInstantiateContribution(TestFindController); let startFindAction = new StartFindAction(); @@ -185,7 +193,7 @@ suite('FindController', () => { 'var x = (3 * 5)', 'var y = (3 * 5)', 'var z = (3 * 5)', - ], {}, (editor, cursor) => { + ], { serviceCollection: serviceCollection }, (editor, cursor) => { let findController = editor.registerAndInstantiateContribution(TestFindController); let selectHighlightsAction = new SelectHighlightsAction(); @@ -212,7 +220,7 @@ suite('FindController', () => { 'var x = (3 * 5)', 'var y = (3 * 5)', 'var z = (3 * 5)', - ], {}, (editor, cursor) => { + ], { serviceCollection: serviceCollection }, (editor, cursor) => { let findController = editor.registerAndInstantiateContribution(TestFindController); findController.start({ @@ -240,7 +248,7 @@ suite('FindController', () => { 'var x = (3 * 5)', 'var y = (3 * 5)', 'var z = (3 * 5)', - ], {}, (editor, cursor) => { + ], { serviceCollection: serviceCollection }, (editor, cursor) => { let findController = editor.registerAndInstantiateContribution(TestFindController); findController.getState().change({ searchString: '1' }, false); @@ -256,7 +264,7 @@ suite('FindController', () => { 'var x = (3 * 5)', 'var y = (3 * 5)', 'var z = (3 * 5)', - ], {}, (editor, cursor) => { + ], { serviceCollection: serviceCollection }, (editor, cursor) => { let findController = editor.registerAndInstantiateContribution(TestFindController); findController.delayUpdateHistory = true; @@ -276,7 +284,7 @@ suite('FindController', () => { 'var x = (3 * 5)', 'var y = (3 * 5)', 'var z = (3 * 5)', - ], {}, (editor, cursor) => { + ], { serviceCollection: serviceCollection }, (editor, cursor) => { let findController = editor.registerAndInstantiateContribution(TestFindController); findController.getState().change({ searchString: '1' }, false); @@ -293,7 +301,7 @@ suite('FindController', () => { 'var x = (3 * 5)', 'var y = (3 * 5)', 'var z = (3 * 5)', - ], {}, (editor, cursor) => { + ], { serviceCollection: serviceCollection }, (editor, cursor) => { let findController = editor.registerAndInstantiateContribution(TestFindController); findController.getState().change({ searchString: '1' }, false); @@ -310,7 +318,7 @@ suite('FindController', () => { 'var x = (3 * 5)', 'var y = (3 * 5)', 'var z = (3 * 5)', - ], {}, (editor, cursor) => { + ], { serviceCollection: serviceCollection }, (editor, cursor) => { let findController = editor.registerAndInstantiateContribution(TestFindController); findController.getState().change({ searchString: '1' }, false); @@ -330,7 +338,7 @@ suite('FindController', () => { 'var x = (3 * 5)', 'var y = (3 * 5)', 'var z = (3 * 5)', - ], {}, (editor, cursor) => { + ], { serviceCollection: serviceCollection }, (editor, cursor) => { let findController = editor.registerAndInstantiateContribution(TestFindController); findController.getState().change({ searchString: '1' }, false); @@ -356,7 +364,7 @@ suite('FindController', () => { 'rty', 'qwe', 'rty' - ], {}, (editor, cursor) => { + ], { serviceCollection: serviceCollection }, (editor, cursor) => { let findController = editor.registerAndInstantiateContribution(TestFindController); let addSelectionToNextFindMatch = new AddSelectionToNextFindMatchAction(); @@ -388,7 +396,7 @@ suite('FindController', () => { 'rty', 'qwe', 'rty' - ], {}, (editor, cursor) => { + ], { serviceCollection: serviceCollection }, (editor, cursor) => { editor.getModel().setEOL(EndOfLineSequence.CRLF); @@ -414,7 +422,7 @@ suite('FindController', () => { test('issue #18111: Regex replace with single space replaces with no space', () => { withMockCodeEditor([ 'HRESULT OnAmbientPropertyChange(DISPID dispid);' - ], {}, (editor, cursor) => { + ], { serviceCollection: serviceCollection }, (editor, cursor) => { let findController = editor.registerAndInstantiateContribution(TestFindController); @@ -448,7 +456,7 @@ suite('FindController', () => { } function testAddSelectionToNextFindMatchAction(text: string[], callback: (editor: MockCodeEditor, action: AddSelectionToNextFindMatchAction, findController: TestFindController) => void): void { - withMockCodeEditor(text, {}, (editor, cursor) => { + withMockCodeEditor(text, { serviceCollection: serviceCollection }, (editor, cursor) => { let findController = editor.registerAndInstantiateContribution(TestFindController); diff --git a/src/vs/editor/test/common/mocks/mockCodeEditor.ts b/src/vs/editor/test/common/mocks/mockCodeEditor.ts index 3a70f211dbc..92e4e0f444e 100644 --- a/src/vs/editor/test/common/mocks/mockCodeEditor.ts +++ b/src/vs/editor/test/common/mocks/mockCodeEditor.ts @@ -85,6 +85,7 @@ export interface MockCodeEditorCreationOptions extends editorOptions.IEditorOpti * The initial model associated with this code editor. */ model?: editorCommon.IModel; + serviceCollection?: ServiceCollection; } export function withMockCodeEditor(text: string[], options: MockCodeEditorCreationOptions, callback: (editor: MockCodeEditor, cursor: Cursor) => void): void { @@ -97,7 +98,7 @@ export function mockCodeEditor(text: string[], options: MockCodeEditorCreationOp let contextKeyService = new MockContextKeyService(); - let services = new ServiceCollection(); + let services = options.serviceCollection || new ServiceCollection(); services.set(IContextKeyService, contextKeyService); let instantiationService = new InstantiationService(services); From 05c3876f4541991cbf0d6c3a926566188fd5eba5 Mon Sep 17 00:00:00 2001 From: rebornix Date: Mon, 8 May 2017 16:13:56 -0700 Subject: [PATCH 0194/1164] add tests for query option persistence --- .../find/test/common/findController.test.ts | 89 +++++++++++++++++-- 1 file changed, 84 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/contrib/find/test/common/findController.test.ts b/src/vs/editor/contrib/find/test/common/findController.test.ts index d8670a93fc9..13d26d2dde1 100644 --- a/src/vs/editor/contrib/find/test/common/findController.test.ts +++ b/src/vs/editor/contrib/find/test/common/findController.test.ts @@ -17,7 +17,6 @@ import { NextMatchFindAction, StartFindAction, SelectHighlightsAction, AddSelectionToNextFindMatchAction } from 'vs/editor/contrib/find/common/findController'; -import { FindReplaceState } from 'vs/editor/contrib/find/common/findState'; import { MockCodeEditor, withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; import { HistoryNavigator } from 'vs/base/common/history'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -69,17 +68,18 @@ class TestFindController extends CommonFindController { } } +function fromRange(rng: Range): number[] { + return [rng.startLineNumber, rng.startColumn, rng.endLineNumber, rng.endColumn]; +} + suite('FindController', () => { - let queryState = new FindReplaceState(); + let queryState = {}; let serviceCollection = new ServiceCollection(); serviceCollection.set(IStorageService, { get: (key) => queryState[key], getBoolean: (key) => !!queryState[key], store: (key: string, value: any) => { queryState[key] = value; } }); - function fromRange(rng: Range): number[] { - return [rng.startLineNumber, rng.startColumn, rng.endLineNumber, rng.endColumn]; - } test('issue #1857: F3, Find Next, acts like "Find Under Cursor"', () => { withMockCodeEditor([ @@ -686,3 +686,82 @@ suite('FindController', () => { }); }); }); + +suite('FindController query options persistence', () => { + let queryState = { 'editor.isRegex': false, 'editor.matchCase': false, 'editor.wholeWord': false }; + let serviceCollection = new ServiceCollection(); + serviceCollection.set(IStorageService, { + get: (key) => queryState[key], + getBoolean: (key) => !!queryState[key], + store: (key: string, value: any) => { queryState[key] = value; } + }); + + test('matchCase', () => { + withMockCodeEditor([ + 'abc', + 'ABC', + 'XYZ', + 'ABC' + ], { serviceCollection: serviceCollection }, (editor, cursor) => { + queryState = { 'editor.isRegex': false, 'editor.matchCase': true, 'editor.wholeWord': false }; + // The cursor is at the very top, of the file, at the first ABC + let findController = editor.registerAndInstantiateContribution(TestFindController); + let findState = findController.getState(); + let startFindAction = new StartFindAction(); + + // I hit Ctrl+F to show the Find dialog + startFindAction.run(null, editor); + + // I type ABC. + findState.change({ searchString: 'ABC' }, true); + // The second ABC is highlighted as matchCase is true. + assert.deepEqual(fromRange(editor.getSelection()), [2, 1, 2, 4]); + + findController.dispose(); + }); + }); + + queryState = { 'editor.isRegex': false, 'editor.matchCase': false, 'editor.wholeWord': true }; + + test('wholeWord', () => { + withMockCodeEditor([ + 'ABC', + 'AB', + 'XYZ', + 'ABC' + ], { serviceCollection: serviceCollection }, (editor, cursor) => { + queryState = { 'editor.isRegex': false, 'editor.matchCase': false, 'editor.wholeWord': true }; + // The cursor is at the very top, of the file, at the first ABC + let findController = editor.registerAndInstantiateContribution(TestFindController); + let findState = findController.getState(); + let startFindAction = new StartFindAction(); + + // I hit Ctrl+F to show the Find dialog + startFindAction.run(null, editor); + + // I type AB. + findState.change({ searchString: 'AB' }, true); + // The second AB is highlighted as wholeWord is true. + assert.deepEqual(fromRange(editor.getSelection()), [2, 1, 2, 3]); + + findController.dispose(); + }); + }); + + test('toggling options is saved', () => { + withMockCodeEditor([ + 'ABC', + 'AB', + 'XYZ', + 'ABC' + ], { serviceCollection: serviceCollection }, (editor, cursor) => { + queryState = { 'editor.isRegex': false, 'editor.matchCase': false, 'editor.wholeWord': true }; + // The cursor is at the very top, of the file, at the first ABC + let findController = editor.registerAndInstantiateContribution(TestFindController); + findController.toggleRegex(); + assert.equal(queryState['editor.isRegex'], true); + + findController.dispose(); + }); + }); +}); \ No newline at end of file From bf53bb089c37cdea99051811ac2b7bdc16a79554 Mon Sep 17 00:00:00 2001 From: Ramya Rao Date: Mon, 8 May 2017 17:57:16 -0700 Subject: [PATCH 0195/1164] Use EditorGroupinfo to decide if to swap/reposition suggest widget (#26250) --- .../contrib/suggest/browser/media/suggest.css | 2 - .../contrib/suggest/browser/suggestWidget.ts | 98 +++++++------------ 2 files changed, 34 insertions(+), 66 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index 4b8e1fca7e6..166f7ff94b6 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -23,7 +23,6 @@ .monaco-editor .suggest-widget > .tree { height: 100%; - width: 220px; float: left; box-sizing: border-box; } @@ -114,7 +113,6 @@ flex-direction: column; cursor: default; box-sizing: border-box; - width: 440px; } .monaco-editor .suggest-widget .details.no-docs { diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 249559e2d84..e28be9bc62e 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -31,6 +31,7 @@ import { attachListStyler } from 'vs/platform/theme/common/styler'; import { IThemeService, ITheme, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { registerColor, editorWidgetBackground, contrastBorder, listFocusBackground, activeContrastBorder, listHighlightForeground, editorForeground } from 'vs/platform/theme/common/colorRegistry'; import { Position } from 'vs/editor/common/core/position'; +import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; const sticky = false; // for development purposes @@ -308,19 +309,18 @@ export class SuggestWidget implements IContentWidget, IDelegate readonly onDidShow: Event = this.onDidShowEmitter.event; private preferredPosition: Position; - private readonly minWidgetWidth = 440; private readonly maxWidgetWidth = 660; - private readonly listWidth = 220; - private readonly minDocsWidth = 220; - private readonly maxDocsWidth = 440; - private readonly widgetWidthInSmallestEditor = 300; + private readonly listWidth = 330; + private readonly docsWidth = 330; + private readonly minWidgetWidth = 400; constructor( private editor: ICodeEditor, @ITelemetryService private telemetryService: ITelemetryService, @IContextKeyService contextKeyService: IContextKeyService, @IInstantiationService instantiationService: IInstantiationService, - @IThemeService themeService: IThemeService + @IThemeService themeService: IThemeService, + @IEditorGroupService private editorGroupService: IEditorGroupService ) { this.isAuto = false; this.focusedItem = null; @@ -830,89 +830,59 @@ export class SuggestWidget implements IContentWidget, IDelegate if (this.messageElement.style.display !== 'none' && this.details.element.style.display === 'none' && this.listElement.style.display === 'none') { - this.element.style.width = `${this.widgetWidthInSmallestEditor}px`; + this.element.style.width = `${this.minWidgetWidth}px`; return; } const perColumnWidth = this.editor.getLayoutInfo().contentWidth / this.editor.getLayoutInfo().viewportColumn; const spaceOntheLeft = Math.floor(this.editor.getPosition().column * perColumnWidth) - this.editor.getScrollLeft(); const spaceOntheRight = this.editor.getLayoutInfo().contentWidth - spaceOntheLeft; - const scrolledColumns = Math.floor(this.editor.getScrollLeft() / perColumnWidth); + const columnsOccupiedByDocs = Math.floor(this.docsWidth / perColumnWidth); // Reset width - this.details.element.style.width = `${this.maxDocsWidth}px`; + this.details.element.style.width = `${this.docsWidth}px`; this.element.style.width = `${this.maxWidgetWidth}px`; this.listElement.style.width = `${this.listWidth}px`; - if (spaceOntheRight > this.maxWidgetWidth) { + let editorStacksModel = this.editorGroupService.getStacksModel(); + let totalEditors = editorStacksModel.groups.length; + let currentEditorPosition = editorStacksModel.positionOfGroup(editorStacksModel.activeGroup); + + if (spaceOntheRight > this.maxWidgetWidth || + (this.editorGroupService.getGroupOrientation() === 'vertical' && currentEditorPosition < totalEditors - 1)) { // There is enough space on the right, so nothing to do here. return; } - - if (spaceOntheRight > this.minWidgetWidth) { - // There is enough space on the right for list and resized docs - this.adjustDocs(false, spaceOntheRight - this.listWidth, this.editor.getPosition().column); + if (this.editorGroupService.getGroupOrientation() === 'horizontal' || totalEditors === 1) { + if (this.editor.getLayoutInfo().contentWidth > this.maxWidgetWidth) { + if (spaceOntheRight < this.docsWidth) { + addClass(this.element, 'list-right'); + this.preferredPosition = new Position(this.editor.getPosition().lineNumber, this.editor.getPosition().column - columnsOccupiedByDocs); + } + return; + } + this.showDocsBelow(); return; } - if (spaceOntheRight > this.listWidth && spaceOntheLeft > this.maxDocsWidth) { - // Docs on the left and list on the right of the cursor - let columnsOccupiedByDocs = Math.floor(this.maxDocsWidth / perColumnWidth); - this.adjustDocs(true, null, this.editor.getPosition().column - columnsOccupiedByDocs); - return; - } + // Its vertical, multiple editors, active editor is the last one and not enough space on the right for widget + // TODO: Check if window width < this.maxDocsWidth, in which case we may have to drop the docs below. + addClass(this.element, 'list-right'); + this.preferredPosition = new Position(this.editor.getPosition().lineNumber, this.editor.getPosition().column - columnsOccupiedByDocs); - if (spaceOntheRight > this.listWidth && spaceOntheLeft > this.minDocsWidth) { - // Resized docs on the left and list on the right of the cursor - let columnsOccupiedByDocs = Math.floor(spaceOntheLeft / perColumnWidth); - this.adjustDocs(true, spaceOntheLeft, this.editor.getPosition().column - columnsOccupiedByDocs); - return; - } - - if (this.editor.getLayoutInfo().contentWidth > this.maxWidgetWidth) { - // Use as much space on the right, and for the rest go left - let columnsOccupiedByWidget = Math.floor(this.maxWidgetWidth / perColumnWidth); - let preferredColumn = this.editor.getLayoutInfo().viewportColumn - columnsOccupiedByWidget + scrolledColumns; - this.adjustDocs(true, null, preferredColumn); - return; - } - - if (this.editor.getLayoutInfo().contentWidth > this.minWidgetWidth) { - // Resize docs. Swap only of there is enough space on the right for the list - let newDocsWidth = this.editor.getLayoutInfo().contentWidth - this.listWidth; - this.adjustDocs(spaceOntheRight < this.listWidth, newDocsWidth, scrolledColumns); - return; - } + return; + } + private showDocsBelow() { // Not enough space to show side by side // So show docs below the list addClass(this.element, 'docs-below'); - this.listElement.style.width = `${this.widgetWidthInSmallestEditor}px`; - this.element.style.width = `${this.widgetWidthInSmallestEditor}px`; - this.details.element.style.width = `${this.widgetWidthInSmallestEditor}px`; + this.listElement.style.width = `${this.minWidgetWidth}px`; + this.element.style.width = `${this.minWidgetWidth}px`; + this.details.element.style.width = `${this.minWidgetWidth}px`; } - /** - * Adjust the width of the docs widget, swaps docs/list and moves suggest widget if needed - * - * @swap boolean If true, then the docs and list are swapped - * @resizedDocWidth number If not null, this number will be used to set the width of the docs - * @preferredColumn Preferred column in the current line for the suggest widget - */ - private adjustDocs(swap: boolean, resizedDocWidth: number, preferredColumn: number) { - - if (swap) { - addClass(this.element, 'list-right'); - } - - if (resizedDocWidth !== null) { - this.details.element.style.width = `${resizedDocWidth}px`; - this.element.style.width = `${resizedDocWidth + this.listWidth}px`; - } - - this.preferredPosition = new Position(this.editor.getPosition().lineNumber, preferredColumn); - } private renderDetails(): void { if (this.state === State.Details || this.state === State.Open) { From 72e7b8eabbc47a1930712b57922a72103cf6f834 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 May 2017 07:30:28 +0200 Subject: [PATCH 0196/1164] theming - initial "send a smile" work --- .../feedback/electron-browser/feedback.ts | 26 ++++++++++- .../electron-browser/media/feedback.css | 43 +------------------ 2 files changed, 27 insertions(+), 42 deletions(-) diff --git a/src/vs/workbench/parts/feedback/electron-browser/feedback.ts b/src/vs/workbench/parts/feedback/electron-browser/feedback.ts index 10f65422a6e..9f85724b4e9 100644 --- a/src/vs/workbench/parts/feedback/electron-browser/feedback.ts +++ b/src/vs/workbench/parts/feedback/electron-browser/feedback.ts @@ -17,6 +17,9 @@ import * as dom from 'vs/base/browser/dom'; import { ICommandService } from 'vs/platform/commands/common/commands'; import * as errors from 'vs/base/common/errors'; import { IIntegrityService } from 'vs/platform/integrity/common/integrity'; +import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from "vs/platform/theme/common/themeService"; +import { attachStylerCallback } from "vs/platform/theme/common/styler"; +import { editorWidgetBackground, widgetShadow, inputBorder, inputForeground, inputBackground, inputActiveOptionBorder, editorBackground } from "vs/platform/theme/common/colorRegistry"; export interface IFeedback { feedback: string; @@ -67,7 +70,8 @@ export class FeedbackDropdown extends Dropdown { options: IFeedbackDropdownOptions, @ITelemetryService protected telemetryService: ITelemetryService, @ICommandService private commandService: ICommandService, - @IIntegrityService protected integrityService: IIntegrityService + @IIntegrityService protected integrityService: IIntegrityService, + @IThemeService private themeService: IThemeService ) { super(container, { contextViewProvider: options.contextViewProvider, @@ -200,6 +204,17 @@ export class FeedbackDropdown extends Dropdown { this.onSubmit(); }); + this.toDispose.push(attachStylerCallback(this.themeService, { widgetShadow, editorWidgetBackground, inputBackground, inputForeground, inputBorder, editorBackground }, colors => { + $form.style('background-color', colors.editorWidgetBackground); + $form.style('box-shadow', colors.widgetShadow ? `0 2px 8px ${colors.widgetShadow}` : null); + + this.feedbackDescriptionInput.style.backgroundColor = colors.inputBackground; + this.feedbackDescriptionInput.style.color = colors.inputForeground; + this.feedbackDescriptionInput.style.border = `1px solid ${colors.inputBorder || 'transparent'}`; + + $contactUs.style('background-color', colors.editorBackground); + })); + return { dispose: () => { this.feedbackForm = null; @@ -329,3 +344,12 @@ export class FeedbackDropdown extends Dropdown { this.aliasEnabled = false; } } + +registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { + + // Sentiment Buttons + const inputActiveOptionBorderColor = theme.getColor(inputActiveOptionBorder); + if (inputActiveOptionBorderColor) { + collector.addRule(`.monaco-shell .feedback-form .sentiment.checked { border: 1px solid ${inputActiveOptionBorderColor}; }`); + } +}); \ No newline at end of file diff --git a/src/vs/workbench/parts/feedback/electron-browser/media/feedback.css b/src/vs/workbench/parts/feedback/electron-browser/media/feedback.css index c957d301d0c..3fc516150d6 100644 --- a/src/vs/workbench/parts/feedback/electron-browser/media/feedback.css +++ b/src/vs/workbench/parts/feedback/electron-browser/media/feedback.css @@ -36,17 +36,9 @@ .monaco-shell .feedback-form .content .contactus { padding: 10px; - border: solid 1px #B4BABF; - background-color: #EBF2F9; float: right; } -.monaco-shell.vs-dark .feedback-form .content .contactus { - border: solid 1px #44444C; - background-color: #333337; -} - - .monaco-shell .feedback-form .content .channels { margin-top: 5px; font-size: 0.9em; @@ -148,10 +140,6 @@ background-color: #eaeaea; } -.monaco-shell .feedback-form .sentiment.checked { - border: 1px solid #39F; -} - /* Statusbar */ .monaco-shell .statusbar-item > .dropdown.send-feedback { display: inline-block; @@ -163,11 +151,6 @@ } /* Theming */ -.monaco-shell.vs .feedback-form { - color: black; - background: #F6F6F6; -} - .monaco-shell .feedback-form h2 { color: #007ACC; } @@ -224,11 +207,6 @@ background-color: #E51400; } -.monaco-shell.vs-dark .feedback-form { - background: #252526; - box-shadow: 0 2px 8px #000; -} - .monaco-shell.vs-dark .feedback-form h2 { color: #75BEFF; } @@ -239,18 +217,11 @@ } .monaco-shell.vs-dark .feedback-form .sentiment:hover { - background-color: #1e1e1e; -} - -.monaco-shell.vs-dark .feedback-form .sentiment.checked { - border-color: #75BEFF; + background-color: rgba(30,30,30,0.8); } .monaco-shell.vs-dark .feedback-form .feedback-alias, .monaco-shell.vs-dark .feedback-form .feedback-description { font-family: inherit; - border: 1px solid transparent; - background-color: #333337; - color: #D4D4D4; } .monaco-shell.vs-dark .feedback-form .cancel, @@ -259,7 +230,7 @@ } .monaco-shell.vs-dark .feedback-form .cancel:hover { - background-color: #1e1e1e; + background-color: rgba(30,30,30,0.8); } .monaco-shell .feedback-form .sentiment.smile { @@ -312,9 +283,6 @@ .monaco-shell.hc-black .feedback-form .feedback-alias, .monaco-shell.hc-black .feedback-form .feedback-description { font-family: inherit; - border: 1px solid #6FC3DF; - background-color: #000; - color: #D4D4D4; } .monaco-shell.hc-black .feedback-form .content .contactus { @@ -343,13 +311,6 @@ background-color: #0C141F; } -.monaco-shell.hc-black .feedback-form .sentiment { - border: 1px solid transparent; -} - -.monaco-shell.hc-black .feedback-form .sentiment.checked { - border: 1px solid #f38518; -} .monaco-shell .feedback-form .infotip { background: none; From c615b43be67170e166779c9020a249442c4f36fc Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 May 2017 07:58:17 +0200 Subject: [PATCH 0197/1164] theming - badge colors (fixes #25493) --- .../theme-abyss/themes/abyss-color-theme.json | 2 + .../themes/kimbie-dark-color-theme.json | 3 +- .../themes/monokai-color-theme.json | 2 + .../themes/quietlight-color-theme.json | 3 +- .../theme-red/themes/Red-color-theme.json | 3 +- .../themes/solarized-dark-color-theme.json | 2 + .../themes/solarized-light-color-theme.json | 2 + .../themes/tomorrow-night-blue-theme.json | 2 + .../base/browser/ui/countBadge/countBadge.css | 14 ----- .../base/browser/ui/countBadge/countBadge.ts | 62 ++++++++++++++++++- .../browser/referencesWidget.ts | 21 +++++-- src/vs/platform/theme/common/colorRegistry.ts | 4 ++ src/vs/platform/theme/common/styler.ts | 15 ++++- .../files/browser/media/explorerviewlet.css | 10 --- .../files/browser/views/openEditorsView.ts | 17 ++++- .../markers/browser/markersTreeViewer.ts | 11 +++- .../preferences/browser/media/preferences.css | 10 +-- .../preferences/browser/preferencesWidgets.ts | 14 ++++- .../parts/scm/electron-browser/scmViewlet.ts | 18 ++++-- .../parts/search/browser/searchResultsView.ts | 13 +++- 20 files changed, 173 insertions(+), 55 deletions(-) diff --git a/extensions/theme-abyss/themes/abyss-color-theme.json b/extensions/theme-abyss/themes/abyss-color-theme.json index aec2495fd14..d742e6ec1cc 100644 --- a/extensions/theme-abyss/themes/abyss-color-theme.json +++ b/extensions/theme-abyss/themes/abyss-color-theme.json @@ -270,6 +270,8 @@ "inputValidation.errorBackground": "#A22D44", "inputValidation.errorBorder": "#AB395B", + "badge.background": "#0063a5", + "dropdown.background": "#181f2f", // "dropdown.foreground": "", // "dropdown.border": "", diff --git a/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json b/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json index f98364ce67d..94ddfd45836 100644 --- a/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json +++ b/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json @@ -43,7 +43,8 @@ "inputValidation.warningBackground": "#51412c", // "inputValidation.warningBorder": "#5B7E7A", "inputValidation.errorBackground": "#5f0d0d", - "inputValidation.errorBorder": "#9d2f23" + "inputValidation.errorBorder": "#9d2f23", + "badge.background": "#7f5d38" }, "tokenColors": [ { diff --git a/extensions/theme-monokai/themes/monokai-color-theme.json b/extensions/theme-monokai/themes/monokai-color-theme.json index d8138d5cd91..2ae56ae7239 100644 --- a/extensions/theme-monokai/themes/monokai-color-theme.json +++ b/extensions/theme-monokai/themes/monokai-color-theme.json @@ -28,6 +28,8 @@ "tab.border": "#1e1f1c", "tab.inactiveForeground": "#ccccc7", // needs to be bright so it's readable when another editor group is focused "widget.shadow": "#1e1f1c", + "badge.background": "#75715E", + "badge.foreground": "#f8f8f2", "editorLineNumber.foreground": "#90908a", "panelTitle.activeForeground": "#f8f8f2", "panelTitle.activeBorder": "#75715E", diff --git a/extensions/theme-quietlight/themes/quietlight-color-theme.json b/extensions/theme-quietlight/themes/quietlight-color-theme.json index 9e065fef1d6..4edbd8c1871 100644 --- a/extensions/theme-quietlight/themes/quietlight-color-theme.json +++ b/extensions/theme-quietlight/themes/quietlight-color-theme.json @@ -495,6 +495,7 @@ "inputValidation.warningBackground": "#fffee2", "inputValidation.warningBorder": "#ffe055", "inputValidation.errorBackground": "#ffeaea", - "inputValidation.errorBorder": "#f1897f" + "inputValidation.errorBorder": "#f1897f", + "badge.background": "#705697AA" } } \ No newline at end of file diff --git a/extensions/theme-red/themes/Red-color-theme.json b/extensions/theme-red/themes/Red-color-theme.json index 22e587a81f9..ec9b4dbf20a 100644 --- a/extensions/theme-red/themes/Red-color-theme.json +++ b/extensions/theme-red/themes/Red-color-theme.json @@ -50,7 +50,8 @@ "list.highlightForeground": "#ff4444", "notification.background": "#662222", "pickerGroup.foreground": "#cc9999", - "pickerGroup.border": "#ff000033" + "pickerGroup.border": "#ff000033", + "badge.background": "#cc3333" }, "name": "Red" } \ No newline at end of file diff --git a/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json b/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json index 81a5609cfeb..118127b4e92 100644 --- a/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json +++ b/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json @@ -314,6 +314,8 @@ "inputValidation.errorBackground": "#571b26", "inputValidation.errorBorder": "#a92049", + "badge.background": "#047aa6", + "dropdown.background": "#00212B", "dropdown.border": "#2AA19899", // "dropdown.foreground": "", diff --git a/extensions/theme-solarized-light/themes/solarized-light-color-theme.json b/extensions/theme-solarized-light/themes/solarized-light-color-theme.json index 4c5ea2d9070..71b344458d1 100644 --- a/extensions/theme-solarized-light/themes/solarized-light-color-theme.json +++ b/extensions/theme-solarized-light/themes/solarized-light-color-theme.json @@ -313,6 +313,8 @@ // "inputValidation.errorBackground": "", // "inputValidation.errorBorder": "", + "badge.background": "#B58900AA", + "dropdown.background": "#EEE8D5", // "dropdown.foreground": "", "dropdown.border": "#D3AF86", diff --git a/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-theme.json b/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-theme.json index 1e1ba355fb2..f9af23e39eb 100644 --- a/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-theme.json +++ b/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-theme.json @@ -33,6 +33,8 @@ "activityBar.background": "#001733", "activityBarBadge.background": "#bbdaff", "activityBarBadge.foreground": "#001733", + "badge.background": "#bbdaffcc", + "badge.foreground": "#001733", "sideBar.background": "#001c40", "terminal.ansiBlack": "#111111", "terminal.ansiRed": "#ff9da4", diff --git a/src/vs/base/browser/ui/countBadge/countBadge.css b/src/vs/base/browser/ui/countBadge/countBadge.css index aef2810df4c..e6f36db1adc 100644 --- a/src/vs/base/browser/ui/countBadge/countBadge.css +++ b/src/vs/base/browser/ui/countBadge/countBadge.css @@ -9,19 +9,5 @@ font-size: 85%; font-weight: normal; text-align: center; - background: #BEBEBE; - color: #FFF; display: inline; -} - -.vs-dark .monaco-count-badge { - color: #FFF; - background: #4D4D4D; -} - -/* High Contrast Theming */ -.hc-black .monaco-count-badge { - background: #000; - border: 1px solid #6FC3DF; - margin-top: 2px; } \ No newline at end of file diff --git a/src/vs/base/browser/ui/countBadge/countBadge.ts b/src/vs/base/browser/ui/countBadge/countBadge.ts index 36031fb9a1e..a7fa56efce8 100644 --- a/src/vs/base/browser/ui/countBadge/countBadge.ts +++ b/src/vs/base/browser/ui/countBadge/countBadge.ts @@ -8,6 +8,24 @@ import 'vs/css!./countBadge'; import { $, append } from 'vs/base/browser/dom'; import { format } from 'vs/base/common/strings'; +import { Color } from "vs/base/common/color"; +import { mixin } from "vs/base/common/objects"; + +export interface ICountBadgeOptions extends ICountBadgetyles { + count?: number; + titleFormat?: string; +} + +export interface ICountBadgetyles { + badgeBackground?: Color; + badgeForeground?: Color; + badgeBorder?: Color; +} + +const defaultOpts = { + badgeBackground: Color.fromHex('#4D4D4D'), + badgeForeground: Color.fromHex('#FFFFFF') +}; export class CountBadge { @@ -15,10 +33,23 @@ export class CountBadge { private count: number; private titleFormat: string; - constructor(container: HTMLElement, count?: number, titleFormat?: string) { + private badgeBackground: Color; + private badgeForeground: Color; + private badgeBorder: Color; + + private options: ICountBadgeOptions; + + constructor(container: HTMLElement, options?: ICountBadgeOptions) { + this.options = options || Object.create(null); + mixin(this.options, defaultOpts, false); + + this.badgeBackground = this.options.badgeBackground; + this.badgeForeground = this.options.badgeForeground; + this.badgeBorder = this.options.badgeBorder; + this.element = append(container, $('.monaco-count-badge')); - this.titleFormat = titleFormat || ''; - this.setCount(count || 0); + this.titleFormat = this.options.titleFormat || ''; + this.setCount(this.options.count || 0); } setCount(count: number) { @@ -34,5 +65,30 @@ export class CountBadge { private render() { this.element.textContent = '' + this.count; this.element.title = format(this.titleFormat, this.count); + + this.applyStyles(); + } + + style(styles: ICountBadgetyles): void { + this.badgeBackground = styles.badgeBackground; + this.badgeForeground = styles.badgeForeground; + this.badgeBorder = styles.badgeBorder; + + this.applyStyles(); + } + + private applyStyles(): void { + if (this.element) { + const background = this.badgeBackground ? this.badgeBackground.toString() : null; + const foreground = this.badgeForeground ? this.badgeForeground.toString() : null; + const border = this.badgeBorder ? this.badgeBorder.toString() : null; + + this.element.style.backgroundColor = background; + this.element.style.color = foreground; + + this.element.style.borderWidth = border ? '1px' : null; + this.element.style.borderStyle = border ? 'solid' : null; + this.element.style.borderColor = border; + } } } diff --git a/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts b/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts index 19d31c7d405..f5bbe18e907 100644 --- a/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts +++ b/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts @@ -40,7 +40,7 @@ import { FileReferences, OneReference, ReferencesModel } from './referencesModel import { ITextModelResolverService, ITextEditorModel } from 'vs/editor/common/services/resolverService'; import { registerColor, activeContrastBorder, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant, ITheme, IThemeService } from 'vs/platform/theme/common/themeService'; -import { attachListStyler } from 'vs/platform/theme/common/styler'; +import { attachListStyler, attachBadgeStyler } from 'vs/platform/theme/common/styler'; import { IModelDecorationsChangedEvent } from 'vs/editor/common/model/textModelEvents'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; @@ -344,10 +344,16 @@ class Controller extends DefaultController { class Renderer extends LegacyRenderer { private _contextService: IWorkspaceContextService; + private _themeService: IThemeService; - constructor( @IWorkspaceContextService contextService: IWorkspaceContextService) { + constructor( + @IWorkspaceContextService contextService: IWorkspaceContextService, + @IThemeService themeService: IThemeService + ) { super(); + this._contextService = contextService; + this._themeService = themeService; } public getHeight(tree: tree.ITree, element: any): number { @@ -356,6 +362,7 @@ class Renderer extends LegacyRenderer { protected render(tree: tree.ITree, element: FileReferences | OneReference, container: HTMLElement): tree.IElementCallback { + const toDispose: IDisposable[] = []; dom.clearNode(container); if (element instanceof FileReferences) { @@ -364,13 +371,15 @@ class Renderer extends LegacyRenderer { /* tslint:disable:no-unused-expression */ new LeftRightWidget(fileReferencesContainer, (left: HTMLElement) => { - new FileLabel(left, element.uri, this._contextService); + const label = new FileLabel(left, element.uri, this._contextService); + toDispose.push(label); return null; }, (right: HTMLElement) => { const len = element.children.length; - const badge = new CountBadge(right, len); + const badge = new CountBadge(right, { count: len }); + toDispose.push(attachBadgeStyler(badge, this._themeService)); if (element.failure) { badge.setTitleFormat(nls.localize('referencesFailre', "Failed to resolve file.")); @@ -402,7 +411,9 @@ class Renderer extends LegacyRenderer { strings.escape(preview.after))).appendTo(container); } - return null; + return () => { + dispose(toDispose); + }; } } diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 110d70f162a..7d5d29074b5 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -172,6 +172,10 @@ export const buttonForeground = registerColor('button.foreground', { dark: Color export const buttonBackground = registerColor('button.background', { dark: '#0E639C', light: '#007ACC', hc: null }, nls.localize('buttonBackground', "Button background color.")); export const buttonHoverBackground = registerColor('button.hoverBackground', { dark: lighten(buttonBackground, 0.2), light: darken(buttonBackground, 0.2), hc: null }, nls.localize('buttonHoverBackground', "Button background color when hovering.")); +export const badgeBackground = registerColor('badge.background', { dark: '#4D4D4D', light: '#BEBEBE', hc: Color.black }, nls.localize('badgeBackground', "Badge background color. Badges are small information labels, e.g. for search results count.")); +export const badgeForeground = registerColor('badge.foreground', { dark: Color.white, light: Color.white, hc: Color.white }, nls.localize('badgeForeground', "Badge foreground color. Badges are small information labels, e.g. for search results count.")); +export const badgeBorder = registerColor('badge.border', { dark: null, light: null, hc: contrastBorder }, nls.localize('badgeBorder', "Badge border color. Badges are small information labels, e.g. for search results count.")); + export const scrollbarShadow = registerColor('scrollbar.shadow', { dark: '#000000', light: '#DDDDDD', hc: null }, nls.localize('scrollbarShadow', "Scrollbar shadow to indicate that the view is scrolled.")); export const scrollbarSliderBackground = registerColor('scrollbarSlider.background', { dark: Color.fromHex('#797979').transparent(0.4), light: Color.fromHex('#646464').transparent(0.4), hc: transparent(contrastBorder, 0.6) }, nls.localize('scrollbarSliderBackground', "Slider background color.")); export const scrollbarSliderHoverBackground = registerColor('scrollbarSlider.hoverBackground', { dark: Color.fromHex('#646464').transparent(0.7), light: Color.fromHex('#646464').transparent(0.7), hc: transparent(contrastBorder, 0.8) }, nls.localize('scrollbarSliderHoverBackground', "Slider background color when hovering.")); diff --git a/src/vs/platform/theme/common/styler.ts b/src/vs/platform/theme/common/styler.ts index ca14730cfd0..e5d088e794a 100644 --- a/src/vs/platform/theme/common/styler.ts +++ b/src/vs/platform/theme/common/styler.ts @@ -6,7 +6,7 @@ 'use strict'; import { ITheme, IThemeService } from 'vs/platform/theme/common/themeService'; -import { inputBackground, inputForeground, ColorIdentifier, selectForeground, selectBackground, selectBorder, inputBorder, foreground, editorBackground, contrastBorder, inputActiveOptionBorder, listFocusBackground, listActiveSelectionBackground, listActiveSelectionForeground, listInactiveSelectionForeground, listInactiveSelectionBackground, listHoverBackground, listDropBackground, pickerGroupBorder, pickerGroupForeground, widgetShadow, inputValidationInfoBorder, inputValidationInfoBackground, inputValidationWarningBorder, inputValidationWarningBackground, inputValidationErrorBorder, inputValidationErrorBackground, activeContrastBorder, buttonForeground, buttonBackground, buttonHoverBackground, ColorFunction, lighten } from 'vs/platform/theme/common/colorRegistry'; +import { inputBackground, inputForeground, ColorIdentifier, selectForeground, selectBackground, selectBorder, inputBorder, foreground, editorBackground, contrastBorder, inputActiveOptionBorder, listFocusBackground, listActiveSelectionBackground, listActiveSelectionForeground, listInactiveSelectionForeground, listInactiveSelectionBackground, listHoverBackground, listDropBackground, pickerGroupBorder, pickerGroupForeground, widgetShadow, inputValidationInfoBorder, inputValidationInfoBackground, inputValidationWarningBorder, inputValidationWarningBackground, inputValidationErrorBorder, inputValidationErrorBackground, activeContrastBorder, buttonForeground, buttonBackground, buttonHoverBackground, ColorFunction, lighten, badgeBackground, badgeForeground, badgeBorder } from 'vs/platform/theme/common/colorRegistry'; import { IDisposable } from 'vs/base/common/lifecycle'; import { SIDE_BAR_SECTION_HEADER_BACKGROUND } from 'vs/workbench/common/theme'; @@ -46,6 +46,19 @@ export function attachCheckboxStyler(widget: IThemable, themeService: IThemeServ }, widget); } +export function attachBadgeStyler(widget: IThemable, themeService: IThemeService, style?: + { + badgeBackground?: ColorIdentifier, + badgeForeground?: ColorIdentifier, + badgeBorder?: ColorIdentifier + }): IDisposable { + return doAttachStyler(themeService, { + badgeBackground: (style && style.badgeBackground) || badgeBackground, + badgeForeground: (style && style.badgeForeground) || badgeForeground, + badgeBorder: (style && style.badgeBorder) || badgeBorder + }, widget); +} + export function attachInputBoxStyler(widget: IThemable, themeService: IThemeService, style?: { inputBackground?: ColorIdentifier, diff --git a/src/vs/workbench/parts/files/browser/media/explorerviewlet.css b/src/vs/workbench/parts/files/browser/media/explorerviewlet.css index b8a40903a74..c0718789375 100644 --- a/src/vs/workbench/parts/files/browser/media/explorerviewlet.css +++ b/src/vs/workbench/parts/files/browser/media/explorerviewlet.css @@ -182,14 +182,4 @@ .hc-black .monaco-workbench .explorer-viewlet .open-editor, .hc-black .monaco-workbench .explorer-viewlet .editor-group { line-height: 20px; -} - -/* TODO@Theme */ - -.vs .monaco-workbench .explorer-viewlet .header .monaco-count-badge { - background-color: rgba(190, 190, 190, 0.7); -} - -.vs-dark .monaco-workbench .explorer-viewlet .header .monaco-count-badge { - background-color: rgba(100, 100, 100, 0.5); } \ No newline at end of file diff --git a/src/vs/workbench/parts/files/browser/views/openEditorsView.ts b/src/vs/workbench/parts/files/browser/views/openEditorsView.ts index b6f1e2db772..07b9ac2cbd9 100644 --- a/src/vs/workbench/parts/files/browser/views/openEditorsView.ts +++ b/src/vs/workbench/parts/files/browser/views/openEditorsView.ts @@ -31,8 +31,9 @@ import { ToggleEditorLayoutAction } from 'vs/workbench/browser/actions/toggleEdi import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IListService } from 'vs/platform/list/browser/listService'; import { EditorGroup } from 'vs/workbench/common/editor/editorStacksModel'; -import { attachListStyler } from 'vs/platform/theme/common/styler'; +import { attachListStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { badgeBackground, badgeForeground, badgeBorder } from "vs/platform/theme/common/colorRegistry"; const $ = dom.$; @@ -87,6 +88,20 @@ export class OpenEditorsView extends AdaptiveCollapsibleViewletView { titleSpan.textContent = nls.localize({ key: 'openEditors', comment: ['Open is an adjective'] }, "Open Editors"); this.dirtyCountElement = dom.append(titleDiv, $('.monaco-count-badge')); + + this.toDispose.push((attachStylerCallback(this.themeService, { badgeBackground, badgeForeground, badgeBorder }, colors => { + const background = colors.badgeBackground ? colors.badgeBackground.toString() : null; + const foreground = colors.badgeForeground ? colors.badgeForeground.toString() : null; + const border = colors.badgeBorder ? colors.badgeBorder.toString() : null; + + this.dirtyCountElement.style.backgroundColor = background; + this.dirtyCountElement.style.color = foreground; + + this.dirtyCountElement.style.borderWidth = border ? '1px' : null; + this.dirtyCountElement.style.borderStyle = border ? 'solid' : null; + this.dirtyCountElement.style.borderColor = border; + }))); + this.updateDirtyIndicator(); super.renderHeader(container); diff --git a/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts b/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts index 4367e3c85de..b0f736e5e51 100644 --- a/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts +++ b/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts @@ -18,9 +18,13 @@ import { IMarker } from 'vs/platform/markers/common/markers'; import { MarkersModel, Resource, Marker } from 'vs/workbench/parts/markers/common/markersModel'; import Messages from 'vs/workbench/parts/markers/common/messages'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { attachBadgeStyler } from "vs/platform/theme/common/styler"; +import { IThemeService } from "vs/platform/theme/common/themeService"; +import { IDisposable } from "vs/base/common/lifecycle"; interface IAnyResourceTemplateData { count: CountBadge; + styler: IDisposable; } interface IResourceTemplateData extends IAnyResourceTemplateData { @@ -80,7 +84,8 @@ export class Renderer implements IRenderer { constructor(private actionRunner: IActionRunner, private actionProvider: IActionProvider, @IWorkspaceContextService private contextService: IWorkspaceContextService, - @IInstantiationService private instantiationService: IInstantiationService + @IInstantiationService private instantiationService: IInstantiationService, + @IThemeService private themeService: IThemeService ) { } @@ -121,6 +126,7 @@ export class Renderer implements IRenderer { const badgeWrapper = dom.append(container, dom.$('.count-badge-wrapper')); data.count = new CountBadge(badgeWrapper); + data.styler = attachBadgeStyler(data.count, this.themeService); return data; } @@ -132,6 +138,7 @@ export class Renderer implements IRenderer { const badgeWrapper = dom.append(container, dom.$('.count-badge-wrapper')); data.count = new CountBadge(badgeWrapper); + data.styler = attachBadgeStyler(data.count, this.themeService); return data; } @@ -193,9 +200,11 @@ export class Renderer implements IRenderer { public disposeTemplate(tree: ITree, templateId: string, templateData: any): void { if (templateId === Renderer.FILE_RESOURCE_TEMPLATE_ID) { (templateData).fileLabel.dispose(); + (templateData).styler.dispose(); } if (templateId === Renderer.RESOURCE_TEMPLATE_ID) { (templateData).resourceLabel.dispose(); + (templateData).styler.dispose(); } } } diff --git a/src/vs/workbench/parts/preferences/browser/media/preferences.css b/src/vs/workbench/parts/preferences/browser/media/preferences.css index d0f783fbcaa..a8eccaa8c2d 100644 --- a/src/vs/workbench/parts/preferences/browser/media/preferences.css +++ b/src/vs/workbench/parts/preferences/browser/media/preferences.css @@ -108,25 +108,19 @@ position: absolute; right: 10px; border-radius: 2px; - background-color: #EFEFF2; } .settings-header-widget > .settings-count-widget.hide { display: none; } -.hc-black .settings-header-widget > .settings-count-widget, -.vs-dark .settings-header-widget > .settings-count-widget { - background-color: #2D2D30; -} - .settings-header-widget > .settings-count-widget.no-results { - color: #A1260D; + color: #A1260D !important; } .hc-black .settings-header-widget > .settings-count-widget.no-results, .vs-dark .settings-header-widget > .settings-count-widget.no-results { - color: #F48771 + color: #F48771 !important; } .settings-header-widget > .settings-search-container { diff --git a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts b/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts index 5d7cfc19695..ff38198dbba 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts @@ -27,7 +27,7 @@ import { attachInputBoxStyler, attachStylerCallback } from 'vs/platform/theme/co import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Position } from 'vs/editor/common/core/position'; import { ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; -import { buttonBackground, buttonForeground } from "vs/platform/theme/common/colorRegistry"; +import { buttonBackground, buttonForeground, badgeBorder, badgeForeground, badgeBackground } from "vs/platform/theme/common/colorRegistry"; export class SettingsGroupTitleWidget extends Widget implements IViewZone { @@ -263,6 +263,18 @@ export class SearchWidget extends Widget { this.domNode = DOM.append(parent, DOM.$('div.settings-header-widget')); this.createSearchContainer(DOM.append(this.domNode, DOM.$('div.settings-search-container'))); this.countElement = DOM.append(this.domNode, DOM.$('.settings-count-widget')); + this._register(attachStylerCallback(this.themeService, { badgeBackground, badgeForeground, badgeBorder }, colors => { + const background = colors.badgeBackground ? colors.badgeBackground.toString() : null; + const foreground = colors.badgeForeground ? colors.badgeForeground.toString() : null; + const border = colors.badgeBorder ? colors.badgeBorder.toString() : null; + + this.countElement.style.backgroundColor = background; + this.countElement.style.color = foreground; + + this.countElement.style.borderWidth = border ? '1px' : null; + this.countElement.style.borderStyle = border ? 'solid' : null; + this.countElement.style.borderColor = border; + })); this.inputBox.inputElement.setAttribute('aria-live', 'assertive'); } diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index 4bf09bf4e11..f395ebd5eed 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -42,7 +42,7 @@ import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { IModelService } from 'vs/editor/common/services/modelService'; import { comparePaths } from 'vs/base/common/comparers'; import { isSCMResource } from './scmUtil'; -import { attachInputBoxStyler, attachListStyler } from 'vs/platform/theme/common/styler'; +import { attachInputBoxStyler, attachListStyler, attachBadgeStyler } from 'vs/platform/theme/common/styler'; import Severity from 'vs/base/common/severity'; // TODO@Joao @@ -80,6 +80,7 @@ interface ResourceGroupTemplate { name: HTMLElement; count: CountBadge; actionBar: ActionBar; + dispose: () => void; } class ResourceGroupRenderer implements IRenderer { @@ -89,7 +90,8 @@ class ResourceGroupRenderer implements IRenderer { + actionBar.dispose(); + styler.dispose(); + } + }; } renderElement(group: ISCMResourceGroup, index: number, template: ResourceGroupTemplate): void { @@ -112,7 +120,7 @@ class ResourceGroupRenderer implements IRenderer this.getActionItem(action); const renderers = [ - new ResourceGroupRenderer(this.menus, actionItemProvider), + new ResourceGroupRenderer(this.menus, actionItemProvider, this.themeService), this.instantiationService.createInstance(ResourceRenderer, this.menus, actionItemProvider, () => this.getSelectedResources()), ]; diff --git a/src/vs/workbench/parts/search/browser/searchResultsView.ts b/src/vs/workbench/parts/search/browser/searchResultsView.ts index 5039bded064..2ea9e84cafa 100644 --- a/src/vs/workbench/parts/search/browser/searchResultsView.ts +++ b/src/vs/workbench/parts/search/browser/searchResultsView.ts @@ -19,6 +19,8 @@ import { Range } from 'vs/editor/common/core/range'; import { SearchViewlet } from 'vs/workbench/parts/search/browser/searchViewlet'; import { RemoveAction, ReplaceAllAction, ReplaceAction } from 'vs/workbench/parts/search/browser/searchActions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { attachBadgeStyler } from "vs/platform/theme/common/styler"; +import { IThemeService } from "vs/platform/theme/common/themeService"; export class SearchDataSource implements IDataSource { @@ -107,8 +109,13 @@ export class SearchRenderer extends Disposable implements IRenderer { private static FILE_MATCH_TEMPLATE_ID = 'fileMatch'; private static MATCH_TEMPLATE_ID = 'match'; - constructor(actionRunner: IActionRunner, private viewlet: SearchViewlet, @IWorkspaceContextService private contextService: IWorkspaceContextService, - @IInstantiationService private instantiationService: IInstantiationService) { + constructor( + actionRunner: IActionRunner, + private viewlet: SearchViewlet, + @IWorkspaceContextService private contextService: IWorkspaceContextService, + @IInstantiationService private instantiationService: IInstantiationService, + @IThemeService private themeService: IThemeService + ) { super(); } @@ -145,11 +152,11 @@ export class SearchRenderer extends Disposable implements IRenderer { } } - private renderFileMatchTemplate(tree: ITree, templateId: string, container: HTMLElement): IFileMatchTemplate { let fileMatchElement = DOM.append(container, DOM.$('.filematch')); const label = this.instantiationService.createInstance(FileLabel, fileMatchElement, void 0); const badge = new CountBadge(DOM.append(fileMatchElement, DOM.$('.badge'))); + this._register(attachBadgeStyler(badge, this.themeService)); const actions = new ActionBar(fileMatchElement, { animated: false }); return { label, badge, actions }; } From 7a47589cac1f6e230c1104c8d117aeb7edb15a11 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 9 May 2017 09:52:27 +0200 Subject: [PATCH 0198/1164] remove git menu fixes #19638 --- src/vs/code/electron-main/menus.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index 67092963e6c..9dc190d135f 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -655,8 +655,7 @@ export class VSCodeMenu { private setViewMenu(viewMenu: Electron.Menu): void { const explorer = this.createMenuItem(nls.localize({ key: 'miViewExplorer', comment: ['&& denotes a mnemonic'] }, "&&Explorer"), 'workbench.view.explorer'); const search = this.createMenuItem(nls.localize({ key: 'miViewSearch', comment: ['&& denotes a mnemonic'] }, "&&Search"), 'workbench.view.search'); - const git = this.createMenuItem(nls.localize({ key: 'miViewGit', comment: ['&& denotes a mnemonic'] }, "&&Git"), 'workbench.view.git'); - // const scm = this.createMenuItem(nls.localize({ key: 'miViewSCM', comment: ['&& denotes a mnemonic'] }, "S&&CM"), 'workbench.view.scm'); + const scm = this.createMenuItem(nls.localize({ key: 'miViewSCM', comment: ['&& denotes a mnemonic'] }, "S&&CM"), 'workbench.view.scm'); const debug = this.createMenuItem(nls.localize({ key: 'miViewDebug', comment: ['&& denotes a mnemonic'] }, "&&Debug"), 'workbench.view.debug'); const extensions = this.createMenuItem(nls.localize({ key: 'miViewExtensions', comment: ['&& denotes a mnemonic'] }, "E&&xtensions"), 'workbench.view.extensions'); const output = this.createMenuItem(nls.localize({ key: 'miToggleOutput', comment: ['&& denotes a mnemonic'] }, "&&Output"), 'workbench.action.output.toggleOutput'); @@ -724,8 +723,7 @@ export class VSCodeMenu { __separator__(), explorer, search, - git, - // scm, + scm, debug, extensions, additionalViewlets, From f97acb341c9850edb1b52702b84346b3367f98aa Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 May 2017 10:14:19 +0200 Subject: [PATCH 0199/1164] theming - inherit badge colors in activity bar --- .../theme-abyss/themes/abyss-color-theme.json | 2 +- .../theme-defaults/themes/dark_defaults.json | 3 ++- .../theme-defaults/themes/light_defaults.json | 3 ++- .../themes/kimbie-dark-color-theme.json | 1 - .../theme-monokai/themes/monokai-color-theme.json | 2 -- extensions/theme-red/themes/Red-color-theme.json | 1 - .../themes/solarized-dark-color-theme.json | 2 +- .../themes/tomorrow-night-blue-theme.json | 2 -- src/vs/workbench/common/theme.ts | 14 +++++++------- 9 files changed, 13 insertions(+), 17 deletions(-) diff --git a/extensions/theme-abyss/themes/abyss-color-theme.json b/extensions/theme-abyss/themes/abyss-color-theme.json index d742e6ec1cc..d45846b0d16 100644 --- a/extensions/theme-abyss/themes/abyss-color-theme.json +++ b/extensions/theme-abyss/themes/abyss-color-theme.json @@ -369,7 +369,7 @@ // Workbench: Activity Bar "activityBar.background": "#051336", // "activityBar.foreground": "", - "activityBarBadge.background": "#0063a5", + // "activityBarBadge.background": "", // "activityBarBadge.foreground": "", // "activityBar.dropBackground": "", diff --git a/extensions/theme-defaults/themes/dark_defaults.json b/extensions/theme-defaults/themes/dark_defaults.json index 690098711f9..bb319ce5675 100644 --- a/extensions/theme-defaults/themes/dark_defaults.json +++ b/extensions/theme-defaults/themes/dark_defaults.json @@ -7,6 +7,7 @@ "editor.inactiveSelectionBackground": "#3A3D41", "editorIndentGuide.background": "#404040", "editor.selectionHighlightBackground": "#add6ff26", - "list.dropBackground": "#383B3D" + "list.dropBackground": "#383B3D", + "activityBarBadge.background": "#007ACC" } } \ No newline at end of file diff --git a/extensions/theme-defaults/themes/light_defaults.json b/extensions/theme-defaults/themes/light_defaults.json index 091fb560b5e..fb7571ba81a 100644 --- a/extensions/theme-defaults/themes/light_defaults.json +++ b/extensions/theme-defaults/themes/light_defaults.json @@ -7,6 +7,7 @@ "editor.inactiveSelectionBackground": "#E5EBF1", "editorIndentGuide.background": "#d3d3d3", "editor.selectionHighlightBackground": "#add6ff4d", - "editorSuggestWidget.background": "#F3F3F3" + "editorSuggestWidget.background": "#F3F3F3", + "activityBarBadge.background": "#007ACC" } } \ No newline at end of file diff --git a/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json b/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json index 94ddfd45836..2a9958948d8 100644 --- a/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json +++ b/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json @@ -26,7 +26,6 @@ "statusBar.noFolderBackground": "#423523", "activityBar.background": "#221a0f", "activityBar.foreground": "#d3af86", - "activityBarBadge.background": "#7f5d38", "sideBar.background": "#362712", "editor.lineHighlightBackground": "#5e452b", "editorCursor.foreground": "#d3af86", diff --git a/extensions/theme-monokai/themes/monokai-color-theme.json b/extensions/theme-monokai/themes/monokai-color-theme.json index 2ae56ae7239..b2ec0a432b1 100644 --- a/extensions/theme-monokai/themes/monokai-color-theme.json +++ b/extensions/theme-monokai/themes/monokai-color-theme.json @@ -40,8 +40,6 @@ "statusBar.noFolderBackground": "#414339", "statusBar.debuggingBackground": "#75715E", "activityBar.background": "#272822", - "activityBarBadge.foreground": "#f8f8f2", - "activityBarBadge.background": "#75715E", "activityBar.foreground": "#f8f8f2", "activityBar.dropBackground": "#414339", "sideBar.background": "#1e1f1c", diff --git a/extensions/theme-red/themes/Red-color-theme.json b/extensions/theme-red/themes/Red-color-theme.json index ec9b4dbf20a..19e66f7bea3 100644 --- a/extensions/theme-red/themes/Red-color-theme.json +++ b/extensions/theme-red/themes/Red-color-theme.json @@ -2,7 +2,6 @@ "tokenColors": "./red.tmTheme", "colors": { // window - "activityBarBadge.background": "#cc3333", "activityBar.background": "#580000", "tab.inactiveBackground": "#300a0a", "tab.activeBackground": "#490000", diff --git a/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json b/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json index 118127b4e92..b1e0133a628 100644 --- a/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json +++ b/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json @@ -412,7 +412,7 @@ // Workbench: Activity Bar "activityBar.background": "#003847", - "activityBarBadge.background": "#047aa6", + // "activityBarBadge.background": "", // "activityBar.dropBackground": "", // "activityBar.foreground": "", // "activityBarBadge.foreground": "", diff --git a/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-theme.json b/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-theme.json index f9af23e39eb..4ba744d26ba 100644 --- a/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-theme.json +++ b/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-theme.json @@ -31,8 +31,6 @@ "statusBar.noFolderBackground": "#001126", "statusBar.debuggingBackground": "#001126", "activityBar.background": "#001733", - "activityBarBadge.background": "#bbdaff", - "activityBarBadge.foreground": "#001733", "badge.background": "#bbdaffcc", "badge.foreground": "#001733", "sideBar.background": "#001c40", diff --git a/src/vs/workbench/common/theme.ts b/src/vs/workbench/common/theme.ts index 44c3a6c51e1..cf64a63b777 100644 --- a/src/vs/workbench/common/theme.ts +++ b/src/vs/workbench/common/theme.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import nls = require('vs/nls'); -import { registerColor, editorBackground, contrastBorder, transparent } from 'vs/platform/theme/common/colorRegistry'; +import { registerColor, editorBackground, contrastBorder, transparent, badgeForeground, badgeBackground } from 'vs/platform/theme/common/colorRegistry'; import { IDisposable, Disposable, dispose } from 'vs/base/common/lifecycle'; import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; import { Color } from 'vs/base/common/color'; @@ -177,15 +177,15 @@ export const ACTIVITY_BAR_DRAG_AND_DROP_BACKGROUND = registerColor('activityBar. }, nls.localize('activityBarDragAndDropBackground', "Drag and drop feedback color for the activity bar items. The activity bar is showing on the far left or right and allows to switch between views of the side bar.")); export const ACTIVITY_BAR_BADGE_BACKGROUND = registerColor('activityBarBadge.background', { - dark: '#007ACC', - light: '#007ACC', - hc: '#000000' + dark: badgeBackground, + light: badgeBackground, + hc: badgeBackground }, nls.localize('activityBarBadgeBackground', "Activity notification badge background color. The activity bar is showing on the far left or right and allows to switch between views of the side bar.")); export const ACTIVITY_BAR_BADGE_FOREGROUND = registerColor('activityBarBadge.foreground', { - dark: Color.white, - light: Color.white, - hc: Color.white + dark: badgeForeground, + light: badgeForeground, + hc: badgeForeground }, nls.localize('activityBarBadgeForeground', "Activity notification badge foreground color. The activity bar is showing on the far left or right and allows to switch between views of the side bar.")); From 5830a4af1c6ecf85c0a87e83b38c42d6ef8523e8 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 May 2017 10:18:30 +0200 Subject: [PATCH 0200/1164] theming - do not expose badge.border --- src/vs/platform/theme/common/colorRegistry.ts | 1 - src/vs/platform/theme/common/styler.ts | 7 +++---- .../workbench/parts/files/browser/views/openEditorsView.ts | 6 +++--- .../parts/preferences/browser/preferencesWidgets.ts | 6 +++--- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 7d5d29074b5..f75fc922c72 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -174,7 +174,6 @@ export const buttonHoverBackground = registerColor('button.hoverBackground', { d export const badgeBackground = registerColor('badge.background', { dark: '#4D4D4D', light: '#BEBEBE', hc: Color.black }, nls.localize('badgeBackground', "Badge background color. Badges are small information labels, e.g. for search results count.")); export const badgeForeground = registerColor('badge.foreground', { dark: Color.white, light: Color.white, hc: Color.white }, nls.localize('badgeForeground', "Badge foreground color. Badges are small information labels, e.g. for search results count.")); -export const badgeBorder = registerColor('badge.border', { dark: null, light: null, hc: contrastBorder }, nls.localize('badgeBorder', "Badge border color. Badges are small information labels, e.g. for search results count.")); export const scrollbarShadow = registerColor('scrollbar.shadow', { dark: '#000000', light: '#DDDDDD', hc: null }, nls.localize('scrollbarShadow', "Scrollbar shadow to indicate that the view is scrolled.")); export const scrollbarSliderBackground = registerColor('scrollbarSlider.background', { dark: Color.fromHex('#797979').transparent(0.4), light: Color.fromHex('#646464').transparent(0.4), hc: transparent(contrastBorder, 0.6) }, nls.localize('scrollbarSliderBackground', "Slider background color.")); diff --git a/src/vs/platform/theme/common/styler.ts b/src/vs/platform/theme/common/styler.ts index e5d088e794a..51504eaf7a5 100644 --- a/src/vs/platform/theme/common/styler.ts +++ b/src/vs/platform/theme/common/styler.ts @@ -6,7 +6,7 @@ 'use strict'; import { ITheme, IThemeService } from 'vs/platform/theme/common/themeService'; -import { inputBackground, inputForeground, ColorIdentifier, selectForeground, selectBackground, selectBorder, inputBorder, foreground, editorBackground, contrastBorder, inputActiveOptionBorder, listFocusBackground, listActiveSelectionBackground, listActiveSelectionForeground, listInactiveSelectionForeground, listInactiveSelectionBackground, listHoverBackground, listDropBackground, pickerGroupBorder, pickerGroupForeground, widgetShadow, inputValidationInfoBorder, inputValidationInfoBackground, inputValidationWarningBorder, inputValidationWarningBackground, inputValidationErrorBorder, inputValidationErrorBackground, activeContrastBorder, buttonForeground, buttonBackground, buttonHoverBackground, ColorFunction, lighten, badgeBackground, badgeForeground, badgeBorder } from 'vs/platform/theme/common/colorRegistry'; +import { inputBackground, inputForeground, ColorIdentifier, selectForeground, selectBackground, selectBorder, inputBorder, foreground, editorBackground, contrastBorder, inputActiveOptionBorder, listFocusBackground, listActiveSelectionBackground, listActiveSelectionForeground, listInactiveSelectionForeground, listInactiveSelectionBackground, listHoverBackground, listDropBackground, pickerGroupBorder, pickerGroupForeground, widgetShadow, inputValidationInfoBorder, inputValidationInfoBackground, inputValidationWarningBorder, inputValidationWarningBackground, inputValidationErrorBorder, inputValidationErrorBackground, activeContrastBorder, buttonForeground, buttonBackground, buttonHoverBackground, ColorFunction, lighten, badgeBackground, badgeForeground } from 'vs/platform/theme/common/colorRegistry'; import { IDisposable } from 'vs/base/common/lifecycle'; import { SIDE_BAR_SECTION_HEADER_BACKGROUND } from 'vs/workbench/common/theme'; @@ -49,13 +49,12 @@ export function attachCheckboxStyler(widget: IThemable, themeService: IThemeServ export function attachBadgeStyler(widget: IThemable, themeService: IThemeService, style?: { badgeBackground?: ColorIdentifier, - badgeForeground?: ColorIdentifier, - badgeBorder?: ColorIdentifier + badgeForeground?: ColorIdentifier }): IDisposable { return doAttachStyler(themeService, { badgeBackground: (style && style.badgeBackground) || badgeBackground, badgeForeground: (style && style.badgeForeground) || badgeForeground, - badgeBorder: (style && style.badgeBorder) || badgeBorder + badgeBorder: contrastBorder }, widget); } diff --git a/src/vs/workbench/parts/files/browser/views/openEditorsView.ts b/src/vs/workbench/parts/files/browser/views/openEditorsView.ts index 07b9ac2cbd9..01b6ce74cfd 100644 --- a/src/vs/workbench/parts/files/browser/views/openEditorsView.ts +++ b/src/vs/workbench/parts/files/browser/views/openEditorsView.ts @@ -33,7 +33,7 @@ import { IListService } from 'vs/platform/list/browser/listService'; import { EditorGroup } from 'vs/workbench/common/editor/editorStacksModel'; import { attachListStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { badgeBackground, badgeForeground, badgeBorder } from "vs/platform/theme/common/colorRegistry"; +import { badgeBackground, badgeForeground, contrastBorder } from "vs/platform/theme/common/colorRegistry"; const $ = dom.$; @@ -89,10 +89,10 @@ export class OpenEditorsView extends AdaptiveCollapsibleViewletView { this.dirtyCountElement = dom.append(titleDiv, $('.monaco-count-badge')); - this.toDispose.push((attachStylerCallback(this.themeService, { badgeBackground, badgeForeground, badgeBorder }, colors => { + this.toDispose.push((attachStylerCallback(this.themeService, { badgeBackground, badgeForeground, contrastBorder }, colors => { const background = colors.badgeBackground ? colors.badgeBackground.toString() : null; const foreground = colors.badgeForeground ? colors.badgeForeground.toString() : null; - const border = colors.badgeBorder ? colors.badgeBorder.toString() : null; + const border = colors.contrastBorder ? colors.contrastBorder.toString() : null; this.dirtyCountElement.style.backgroundColor = background; this.dirtyCountElement.style.color = foreground; diff --git a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts b/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts index ff38198dbba..a07b8a57be6 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts @@ -27,7 +27,7 @@ import { attachInputBoxStyler, attachStylerCallback } from 'vs/platform/theme/co import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Position } from 'vs/editor/common/core/position'; import { ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; -import { buttonBackground, buttonForeground, badgeBorder, badgeForeground, badgeBackground } from "vs/platform/theme/common/colorRegistry"; +import { buttonBackground, buttonForeground, badgeForeground, badgeBackground, contrastBorder } from "vs/platform/theme/common/colorRegistry"; export class SettingsGroupTitleWidget extends Widget implements IViewZone { @@ -263,10 +263,10 @@ export class SearchWidget extends Widget { this.domNode = DOM.append(parent, DOM.$('div.settings-header-widget')); this.createSearchContainer(DOM.append(this.domNode, DOM.$('div.settings-search-container'))); this.countElement = DOM.append(this.domNode, DOM.$('.settings-count-widget')); - this._register(attachStylerCallback(this.themeService, { badgeBackground, badgeForeground, badgeBorder }, colors => { + this._register(attachStylerCallback(this.themeService, { badgeBackground, badgeForeground, contrastBorder }, colors => { const background = colors.badgeBackground ? colors.badgeBackground.toString() : null; const foreground = colors.badgeForeground ? colors.badgeForeground.toString() : null; - const border = colors.badgeBorder ? colors.badgeBorder.toString() : null; + const border = colors.contrastBorder ? colors.contrastBorder.toString() : null; this.countElement.style.backgroundColor = background; this.countElement.style.color = foreground; From fd7958b5c86ccd2dbc1c496a520fdd7fe5682d49 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 9 May 2017 10:53:27 +0200 Subject: [PATCH 0201/1164] debug: do not use special arrow character on windows fixes #25330 --- .../workbench/parts/debug/browser/media/repl.css | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/media/repl.css b/src/vs/workbench/parts/debug/browser/media/repl.css index c25e4150f66..9c59952e8e1 100644 --- a/src/vs/workbench/parts/debug/browser/media/repl.css +++ b/src/vs/workbench/parts/debug/browser/media/repl.css @@ -76,6 +76,7 @@ .monaco-workbench .repl .repl-tree .monaco-tree .monaco-tree-row.has-children > .content.input-output-pair:before { top: 8px; + cursor: pointer; } .monaco-workbench .repl .repl-tree .monaco-tree .monaco-tree-row.has-children > .content.input-output-pair:after { @@ -114,21 +115,13 @@ position: absolute; } -.monaco-workbench.windows .repl .repl-input-wrapper:before { - content: '\203A'; /* character does not exist on windows */ - font-size: 30px; - line-height: 12px; +.monaco-workbench .repl .repl-input-wrapper:before { + content: '\276f'; + line-height: 18px; } .monaco-workbench.linux .repl .repl-input-wrapper:before { - content: '\276f'; font-size: 9px; - line-height: 18px; -} - -.monaco-workbench.mac .repl .repl-input-wrapper:before { - content: '\276f'; - line-height: 18px; } /* Actions */ From c0362f72e519b96b31dc6f8e8ea0eb9c2c4fc2f3 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 9 May 2017 11:08:12 +0200 Subject: [PATCH 0202/1164] Fixes #26252: compute widget max width in the same way in all cases --- .../viewParts/contentWidgets/contentWidgets.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts b/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts index 8d57aa5bce0..bce7eb16e38 100644 --- a/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts +++ b/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts @@ -111,12 +111,7 @@ export class ViewContentWidgets extends ViewPart { let keys = Object.keys(this._widgets); for (let i = 0, len = keys.length; i < len; i++) { const widgetId = keys[i]; - const widgetData = this._widgets[widgetId]; - const maxWidth = widgetData.allowEditorOverflow - ? window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth - : this._contentWidth; - - widgetData.domNode.setMaxWidth(maxWidth); + this._setWidgetMaxWidth(this._widgets[widgetId]); } } } @@ -147,6 +142,14 @@ export class ViewContentWidgets extends ViewPart { // ---- end view event handlers + private _setWidgetMaxWidth(widgetData: IWidgetData): void { + const maxWidth = widgetData.allowEditorOverflow + ? window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth + : this._contentWidth; + + widgetData.domNode.setMaxWidth(maxWidth); + } + public addWidget(widget: IContentWidget): void { const domNode = createFastDomNode(widget.getDomNode()); @@ -161,7 +164,7 @@ export class ViewContentWidgets extends ViewPart { this._widgets[widget.getId()] = widgetData; domNode.setPosition((this._context.configuration.editor.viewInfo.fixedOverflowWidgets && widget.allowEditorOverflow) ? 'fixed' : 'absolute'); - domNode.setMaxWidth(this._contentWidth); + this._setWidgetMaxWidth(widgetData); domNode.setVisibility('hidden'); domNode.setAttribute('widgetId', widget.getId()); From 6819433c055b1116f4191397697b099c0af0fdda Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 May 2017 11:15:21 +0200 Subject: [PATCH 0203/1164] better decoration management, more tests, finish at final tab stop --- .../contrib/snippet/browser/editorSnippets.ts | 81 +++++++++++------- .../test/browser/editorSnippets.test.ts | 84 +++++++++++++++++++ 2 files changed, 134 insertions(+), 31 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index f0c26cfa1b2..e77d8defd54 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -6,7 +6,7 @@ 'use strict'; import { getLeadingWhitespace } from 'vs/base/common/strings'; -import { ICommonCodeEditor, IModel, TrackedRangeStickiness, IIdentifiedSingleEditOperation } from 'vs/editor/common/editorCommon'; +import { ICommonCodeEditor, IModel, IModelDecorationOptions, TrackedRangeStickiness, IIdentifiedSingleEditOperation } from 'vs/editor/common/editorCommon'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { TextmateSnippet, Placeholder, SnippetParser } from '../common/snippetParser'; import { Selection } from 'vs/editor/common/core/selection'; @@ -24,6 +24,9 @@ class OneSnippet { private _placeholderGroups: Placeholder[][]; private _placeholderGroupsIdx: number; + private static readonly _growingDecoration: IModelDecorationOptions = { stickiness: TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges }; + private static readonly _fixedDecoration: IModelDecorationOptions = { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges }; + constructor(editor: ICommonCodeEditor, snippet: TextmateSnippet, offset: number) { this._editor = editor; this._snippet = snippet; @@ -58,16 +61,7 @@ class OneSnippet { const end = model.getPositionAt(this._offset + placeholderOffset + placeholderLen); const range = new Range(start.lineNumber, start.column, end.lineNumber, end.column); - let stickiness: TrackedRangeStickiness; - if (placeholder.isFinalTabstop) { - stickiness = TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges; - } else if (lastRange && lastRange.getEndPosition().equals(range.getStartPosition())) { - stickiness = TrackedRangeStickiness.GrowsOnlyWhenTypingAfter; - } else { - stickiness = TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges; - } - - const handle = accessor.addDecoration(range, { stickiness }); + const handle = accessor.addDecoration(range, OneSnippet._fixedDecoration); this._placeholderDecorations.set(placeholder, handle); lastRange = range; @@ -91,27 +85,50 @@ class OneSnippet { this._init(); + const prevGroupsIdx = this._placeholderGroupsIdx; + if (fwd && this._placeholderGroupsIdx < this._placeholderGroups.length - 1) { this._placeholderGroupsIdx += 1; - return this._getCurrentPlaceholderSelections(); } else if (!fwd && this._placeholderGroupsIdx > 0) { this._placeholderGroupsIdx -= 1; - return this._getCurrentPlaceholderSelections(); } else { - return undefined; + return []; } + + return this._editor.getModel().changeDecorations(accessor => { + + // change stickness to never grow when typing at its edges + // so that in-active tabstops never grow + if (prevGroupsIdx !== -1) { + for (const placeholder of this._placeholderGroups[prevGroupsIdx]) { + const id = this._placeholderDecorations.get(placeholder); + accessor.changeDecorationOptions(id, OneSnippet._fixedDecoration); + } + } + + // change stickiness to always grow when typing at its edges + // because these decorations represent the currently active + // tabstop. Special case: reaching the final tab stop + const selections: Selection[] = []; + for (const placeholder of this._placeholderGroups[this._placeholderGroupsIdx]) { + const id = this._placeholderDecorations.get(placeholder); + const range = this._editor.getModel().getDecorationRange(id); + selections.push(new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn)); + + accessor.changeDecorationOptions(id, placeholder.isFinalTabstop ? OneSnippet._fixedDecoration : OneSnippet._growingDecoration); + } + return selections; + }); } - private _getCurrentPlaceholderSelections(): Selection[] { - const selections: Selection[] = []; - for (const placeholder of this._placeholderGroups[this._placeholderGroupsIdx]) { - const handle = this._placeholderDecorations.get(placeholder); - const range = this._editor.getModel().getDecorationRange(handle); - selections.push(new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn)); + get isAtFinalPlaceholder() { + if (this._placeholderGroupsIdx < 0) { + return false; + } else { + return this._placeholderGroups[this._placeholderGroupsIdx][0].isFinalTabstop; } - return selections; } } @@ -161,32 +178,34 @@ export class SnippetSession { this._editor.setSelections(newSelections); } + dispose(): void { + dispose(this._snippets); + } + next(): void { const newSelections = this._move(true); - this._editor.setSelections(newSelections); + if (newSelections.length > 0) { + this._editor.setSelections(newSelections); + } } prev(): void { const newSelections = this._move(false); - this._editor.setSelections(newSelections); + if (newSelections.length > 0) { + this._editor.setSelections(newSelections); + } } private _move(fwd: boolean): Selection[] { const selections: Selection[] = []; for (const snippet of this._snippets) { const oneSelection = snippet.move(fwd); - if (!oneSelection) { - if (fwd) { - this.stop(); - } - return this._editor.getSelections(); - } selections.push(...oneSelection); } return selections; } - stop(): void { - dispose(this._snippets); + get isAtFinalPlaceholder() { + return this._snippets[0].isAtFinalPlaceholder; } } diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts index 9d49e4e13d3..ed0c472107a 100644 --- a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts @@ -59,6 +59,19 @@ suite('SnippetInsertion', function () { assertSelections(editor, new Selection(1, 10, 1, 10), new Selection(2, 14, 2, 14)); }); + test('snippets, repeated tabstops', function () { + const session = new SnippetSession(editor, '${1:abc}foo${1:abc}$0'); + assertSelections(editor, + new Selection(1, 1, 1, 4), new Selection(1, 7, 1, 10), + new Selection(2, 5, 2, 8), new Selection(2, 11, 2, 14), + ); + session.next(); + assertSelections(editor, + new Selection(1, 10, 1, 10), + new Selection(2, 14, 2, 14), + ); + }); + test('snippets, selections and new text with newlines', () => { const session = new SnippetSession(editor, 'foo\n\t${1:bar}\n$0'); @@ -141,5 +154,76 @@ suite('SnippetInsertion', function () { assertSelections(editor, new Selection(1, 15, 1, 15)); }); + test('snippets, don\'t merge touching tabstops 1/2', function () { + + const session = new SnippetSession(editor, '$1$2$3$0'); + assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); + + session.next(); + assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); + + session.next(); + assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); + + session.next(); + assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); + + session.prev(); + session.prev(); + session.prev(); + assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); + editor.trigger('test', 'type', { text: '111' }); + + session.next(); + editor.trigger('test', 'type', { text: '222' }); + + session.next(); + editor.trigger('test', 'type', { text: '333' }); + + session.next(); + assert.equal(model.getValue(), '111222333function foo() {\n 111222333console.log(a);\n}'); + assertSelections(editor, new Selection(1, 10, 1, 10), new Selection(2, 14, 2, 14)); + + session.prev(); + assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); + session.prev(); + assertSelections(editor, new Selection(1, 4, 1, 4), new Selection(2, 8, 2, 8)); + session.prev(); + assertSelections(editor, new Selection(1, 1, 1, 4), new Selection(2, 5, 2, 8)); + }); + test('snippets, don\'t merge touching tabstops 2/2', function () { + + const session = new SnippetSession(editor, '$1$2$3$0'); + assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); + + editor.trigger('test', 'type', { text: '111' }); + + session.next(); + assertSelections(editor, new Selection(1, 4, 1, 4), new Selection(2, 8, 2, 8)); + editor.trigger('test', 'type', { text: '222' }); + + session.next(); + assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); + editor.trigger('test', 'type', { text: '333' }); + + session.next(); + assert.equal(session.isAtFinalPlaceholder, true); + }); + + test('snippets, gracefully move over final tabstop', function () { + const session = new SnippetSession(editor, '${1}bar$0'); + + assert.equal(session.isAtFinalPlaceholder, false); + assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); + + session.next(); + assert.equal(session.isAtFinalPlaceholder, true); + assertSelections(editor, new Selection(1, 4, 1, 4), new Selection(2, 8, 2, 8)); + + session.next(); + assert.equal(session.isAtFinalPlaceholder, true); + assertSelections(editor, new Selection(1, 4, 1, 4), new Selection(2, 8, 2, 8)); + }); + }); From 68237f29b3cbc5784e0d327e232fbe6d40caec91 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 May 2017 11:18:15 +0200 Subject: [PATCH 0204/1164] Debug Hover Widget Not Themed (fixes #25905) --- src/vs/editor/contrib/hover/browser/hover.ts | 7 +------ src/vs/platform/theme/common/colorRegistry.ts | 7 +++++++ .../parts/debug/browser/media/debugHover.css | 14 -------------- .../parts/debug/electron-browser/debugHover.ts | 11 ++++++++++- 4 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/vs/editor/contrib/hover/browser/hover.ts b/src/vs/editor/contrib/hover/browser/hover.ts index 6e424a667d6..4ad6fba3fb3 100644 --- a/src/vs/editor/contrib/hover/browser/hover.ts +++ b/src/vs/editor/contrib/hover/browser/hover.ts @@ -21,7 +21,7 @@ import { ModesContentHoverWidget } from './modesContentHover'; import { ModesGlyphHoverWidget } from './modesGlyphHover'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { registerColor } from 'vs/platform/theme/common/colorRegistry'; +import { editorHoverHighlight, editorHoverBackground, editorHoverBorder } from 'vs/platform/theme/common/colorRegistry'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; @editorContribution @@ -173,11 +173,6 @@ class ShowHoverAction extends EditorAction { } // theming - -export const editorHoverHighlight = registerColor('editor.hoverHighlightBackground', { light: '#ADD6FF26', dark: '#264f7840', hc: '#ADD6FF26' }, nls.localize('hoverHighlight', 'Highlight below the word for which a hover is shown.')); -export const editorHoverBackground = registerColor('editorHoverWidget.background', { light: '#F3F3F3', dark: '#2D2D30', hc: '#0C141F' }, nls.localize('hoverBackground', 'Background color of the editor hover.')); -export const editorHoverBorder = registerColor('editorHoverWidget.border', { light: '#CCCCCC', dark: '#555555', hc: '#CCCCCC' }, nls.localize('hoverBorder', 'Border color of the editor hover.')); - registerThemingParticipant((theme, collector) => { let editorHoverHighlightColor = theme.getColor(editorHoverHighlight); if (editorHoverHighlightColor) { diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index f75fc922c72..981f08f63c9 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -206,6 +206,13 @@ export const editorFindMatch = registerColor('editor.findMatchBackground', { lig export const editorFindMatchHighlight = registerColor('editor.findMatchHighlightBackground', { light: '#EA5C0055', dark: '#EA5C0055', hc: null }, nls.localize('findMatchHighlight', "Color of the other search matches.")); export const editorFindRangeHighlight = registerColor('editor.findRangeHighlightBackground', { dark: '#3a3d4166', light: '#b4b4b44d', hc: null }, nls.localize('findRangeHighlight', "Color the range limiting the search.")); +/** + * Editor hover + */ +export const editorHoverHighlight = registerColor('editor.hoverHighlightBackground', { light: '#ADD6FF26', dark: '#264f7840', hc: '#ADD6FF26' }, nls.localize('hoverHighlight', 'Highlight below the word for which a hover is shown.')); +export const editorHoverBackground = registerColor('editorHoverWidget.background', { light: '#F3F3F3', dark: '#2D2D30', hc: '#0C141F' }, nls.localize('hoverBackground', 'Background color of the editor hover.')); +export const editorHoverBorder = registerColor('editorHoverWidget.border', { light: '#CCCCCC', dark: '#555555', hc: '#CCCCCC' }, nls.localize('hoverBorder', 'Border color of the editor hover.')); + /** * Editor link colors */ diff --git a/src/vs/workbench/parts/debug/browser/media/debugHover.css b/src/vs/workbench/parts/debug/browser/media/debugHover.css index 29707f09e11..a734651beab 100644 --- a/src/vs/workbench/parts/debug/browser/media/debugHover.css +++ b/src/vs/workbench/parts/debug/browser/media/debugHover.css @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ .monaco-editor .debug-hover-widget { - border: 1px solid #CCC; position: absolute; margin-top: -1px; cursor: default; @@ -13,8 +12,6 @@ animation-name: fadeIn; -webkit-user-select: text; word-break: break-all; - background-color: #F3F3F3; - border: 1px solid #CCC; padding: 4px 5px; } @@ -87,12 +84,6 @@ /* Dark theme */ -.monaco-editor.vs-dark .debug-hover-widget, -.monaco-editor.hc-black .debug-hover-widget { - background-color: #2D2D30; - border-color: #555; -} - .monaco-editor.vs-dark .debug-hover-widget .value, .monaco-editor.hc-black .debug-hover-widget .value { color: rgba(204, 204, 204, 0.6); @@ -118,11 +109,6 @@ color: #CE9178; } -.monaco-editor.vs-dark .debug-hover-widget, -.monaco-editor.hc-black .debug-hover-widget { - border-color: #555; -} - .monaco-editor.vs-dark .debugHoverHighlight, .monaco-editor.hc-theme .debugHoverHighlight { background-color: rgba(38, 79, 120, 0.25); diff --git a/src/vs/workbench/parts/debug/electron-browser/debugHover.ts b/src/vs/workbench/parts/debug/electron-browser/debugHover.ts index c4f703de4e9..4e5b9be2e79 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugHover.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugHover.ts @@ -21,8 +21,9 @@ import { IDebugService, IExpression, IExpressionContainer } from 'vs/workbench/p import { Expression } from 'vs/workbench/parts/debug/common/debugModel'; import { VariablesRenderer, renderExpressionValue, VariablesDataSource } from 'vs/workbench/parts/debug/electron-browser/debugViewer'; import { IListService } from 'vs/platform/list/browser/listService'; -import { attachListStyler } from 'vs/platform/theme/common/styler'; +import { attachListStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { editorHoverBackground, editorHoverBorder } from "vs/platform/theme/common/colorRegistry"; const $ = dom.$; const MAX_ELEMENTS_SHOWN = 18; @@ -88,6 +89,14 @@ export class DebugHoverWidget implements IContentWidget { this.toDispose.push(attachListStyler(this.tree, this.themeService)); this.toDispose.push(this.listService.register(this.tree)); + this.toDispose.push(attachStylerCallback(this.themeService, { editorHoverBackground, editorHoverBorder }, colors => { + this.domNode.style.backgroundColor = colors.editorHoverBackground; + if (colors.editorHoverBorder) { + this.domNode.style.border = `1px solid ${colors.editorHoverBorder}`; + } else { + this.domNode.style.border = null; + } + })); } private registerListeners(): void { From 0d1db8a0a307759fdd3fb8ddd5713ee99d26a082 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 May 2017 11:24:38 +0200 Subject: [PATCH 0205/1164] yet another test --- .../snippet/test/browser/editorSnippets.test.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts index ed0c472107a..280e4ddab44 100644 --- a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts @@ -125,7 +125,7 @@ suite('SnippetInsertion', function () { assertSelections(editor, new Selection(1, 8, 1, 8), new Selection(2, 12, 2, 12)); }); - test('snippets, insert into non-empty selection', function () { + test('snippets, insert shorter snippet into non-empty selection', function () { model.setValue('foo_bar_foo'); editor.setSelections([new Selection(1, 1, 1, 4), new Selection(1, 9, 1, 12)]); @@ -134,6 +134,15 @@ suite('SnippetInsertion', function () { assertSelections(editor, new Selection(1, 2, 1, 2), new Selection(1, 8, 1, 8)); }); + test('snippets, insert longer snippet into non-empty selection', function () { + model.setValue('foo_bar_foo'); + editor.setSelections([new Selection(1, 1, 1, 4), new Selection(1, 9, 1, 12)]); + + new SnippetSession(editor, 'LONGER$0'); + assert.equal(model.getValue(), 'LONGER_bar_LONGER'); + assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(1, 18, 1, 18)); + }); + test('snippets, don\'t grow final tabstop', function () { model.setValue('foo_zzz_foo'); editor.setSelection(new Selection(1, 5, 1, 8)); From 8d4d6e615a1e53cc02cb54917b09257484b5df70 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 9 May 2017 11:26:02 +0200 Subject: [PATCH 0206/1164] debug: auto remove duplicate breakpoints fixes #25389 --- src/vs/workbench/parts/debug/common/debugModel.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index 4326c55e2d8..d27bf7f8823 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -809,6 +809,7 @@ export class Model implements IModel { this.breakpoints = this.breakpoints.concat(rawData.map(rawBp => new Breakpoint(uri, rawBp.lineNumber, rawBp.column, rawBp.enabled, rawBp.condition, rawBp.hitCondition, true))); this.breakpointsActivated = true; + this.breakpoints = distinct(this.breakpoints, bp => `${bp.uri.toString()}:${bp.lineNumber}:${bp.column}`); this._onDidChangeBreakpoints.fire(); } @@ -828,6 +829,7 @@ export class Model implements IModel { bp.message = bpData.message; } }); + this.breakpoints = distinct(this.breakpoints, bp => `${bp.uri.toString()}:${bp.lineNumber}:${bp.column}`); this._onDidChangeBreakpoints.fire(); } From ff8b85ffa3be60ce312e89150e61979e1e540b41 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 May 2017 11:27:25 +0200 Subject: [PATCH 0207/1164] properly spelled out decoration options --- .../contrib/snippet/browser/editorSnippets.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index e77d8defd54..8b0e86d2569 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -24,8 +24,11 @@ class OneSnippet { private _placeholderGroups: Placeholder[][]; private _placeholderGroupsIdx: number; - private static readonly _growingDecoration: IModelDecorationOptions = { stickiness: TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges }; - private static readonly _fixedDecoration: IModelDecorationOptions = { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges }; + private static readonly _decorations = { + active: { stickiness: TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges }, + activeFinal: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges }, + inActive: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges }, + }; constructor(editor: ICommonCodeEditor, snippet: TextmateSnippet, offset: number) { this._editor = editor; @@ -61,7 +64,7 @@ class OneSnippet { const end = model.getPositionAt(this._offset + placeholderOffset + placeholderLen); const range = new Range(start.lineNumber, start.column, end.lineNumber, end.column); - const handle = accessor.addDecoration(range, OneSnippet._fixedDecoration); + const handle = accessor.addDecoration(range, OneSnippet._decorations.inActive); this._placeholderDecorations.set(placeholder, handle); lastRange = range; @@ -104,7 +107,7 @@ class OneSnippet { if (prevGroupsIdx !== -1) { for (const placeholder of this._placeholderGroups[prevGroupsIdx]) { const id = this._placeholderDecorations.get(placeholder); - accessor.changeDecorationOptions(id, OneSnippet._fixedDecoration); + accessor.changeDecorationOptions(id, OneSnippet._decorations.inActive); } } @@ -117,7 +120,7 @@ class OneSnippet { const range = this._editor.getModel().getDecorationRange(id); selections.push(new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn)); - accessor.changeDecorationOptions(id, placeholder.isFinalTabstop ? OneSnippet._fixedDecoration : OneSnippet._growingDecoration); + accessor.changeDecorationOptions(id, placeholder.isFinalTabstop ? OneSnippet._decorations.activeFinal : OneSnippet._decorations.active); } return selections; }); From 08ff828cfd4c7f3cdddd1824f0d24bffc9e53f11 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 May 2017 11:32:32 +0200 Subject: [PATCH 0208/1164] theme - send a smile --- .../feedback/electron-browser/feedback.ts | 11 ++++- .../electron-browser/media/feedback.css | 41 ------------------- 2 files changed, 9 insertions(+), 43 deletions(-) diff --git a/src/vs/workbench/parts/feedback/electron-browser/feedback.ts b/src/vs/workbench/parts/feedback/electron-browser/feedback.ts index 9f85724b4e9..db945b16e01 100644 --- a/src/vs/workbench/parts/feedback/electron-browser/feedback.ts +++ b/src/vs/workbench/parts/feedback/electron-browser/feedback.ts @@ -19,7 +19,7 @@ import * as errors from 'vs/base/common/errors'; import { IIntegrityService } from 'vs/platform/integrity/common/integrity'; import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from "vs/platform/theme/common/themeService"; import { attachStylerCallback } from "vs/platform/theme/common/styler"; -import { editorWidgetBackground, widgetShadow, inputBorder, inputForeground, inputBackground, inputActiveOptionBorder, editorBackground } from "vs/platform/theme/common/colorRegistry"; +import { editorWidgetBackground, widgetShadow, inputBorder, inputForeground, inputBackground, inputActiveOptionBorder, editorBackground, buttonBackground, contrastBorder } from "vs/platform/theme/common/colorRegistry"; export interface IFeedback { feedback: string; @@ -204,7 +204,7 @@ export class FeedbackDropdown extends Dropdown { this.onSubmit(); }); - this.toDispose.push(attachStylerCallback(this.themeService, { widgetShadow, editorWidgetBackground, inputBackground, inputForeground, inputBorder, editorBackground }, colors => { + this.toDispose.push(attachStylerCallback(this.themeService, { widgetShadow, editorWidgetBackground, inputBackground, inputForeground, inputBorder, editorBackground, contrastBorder }, colors => { $form.style('background-color', colors.editorWidgetBackground); $form.style('box-shadow', colors.widgetShadow ? `0 2px 8px ${colors.widgetShadow}` : null); @@ -213,6 +213,7 @@ export class FeedbackDropdown extends Dropdown { this.feedbackDescriptionInput.style.border = `1px solid ${colors.inputBorder || 'transparent'}`; $contactUs.style('background-color', colors.editorBackground); + $contactUs.style('border', `1px solid ${colors.contrastBorder || 'transparent'}`); })); return { @@ -352,4 +353,10 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { if (inputActiveOptionBorderColor) { collector.addRule(`.monaco-shell .feedback-form .sentiment.checked { border: 1px solid ${inputActiveOptionBorderColor}; }`); } + + // Links + const linkColor = theme.getColor(buttonBackground) || theme.getColor(contrastBorder); + if (linkColor) { + collector.addRule(`.monaco-shell .feedback-form .content .channels a { color: ${linkColor}; }`); + } }); \ No newline at end of file diff --git a/src/vs/workbench/parts/feedback/electron-browser/media/feedback.css b/src/vs/workbench/parts/feedback/electron-browser/media/feedback.css index 3fc516150d6..a6d66aee3c4 100644 --- a/src/vs/workbench/parts/feedback/electron-browser/media/feedback.css +++ b/src/vs/workbench/parts/feedback/electron-browser/media/feedback.css @@ -50,14 +50,9 @@ /* TODO @C5 review link color */ .monaco-shell .feedback-form .content .channels a { - color: #007ACC; padding: 2px 0; } -.monaco-shell.vs-dark .feedback-form .content .channels a { - color: #75BEFF; -} - .monaco-shell .feedback-form .content .channels a:hover { text-decoration: underline; } @@ -151,15 +146,6 @@ } /* Theming */ -.monaco-shell .feedback-form h2 { - color: #007ACC; -} - -.monaco-shell.vs .feedback-form h3 { - color: #646465; -} - - .monaco-shell.vs .feedback-form .feedback-alias, .monaco-shell.vs .feedback-form .feedback-description { font-family: inherit; border: 1px solid transparent; @@ -207,10 +193,6 @@ background-color: #E51400; } -.monaco-shell.vs-dark .feedback-form h2 { - color: #75BEFF; -} - .monaco-shell.vs-dark .feedback-form h3 { font-weight: normal; font-size: 1.2em; @@ -258,37 +240,18 @@ margin-left: 5px; } -.monaco-shell .feedback-form .privacyLink { - float: left; - color: #007ACC !Important; -} -.monaco-shell.vs-dark .feedback-form .privacyLink { - color: #75BEFF !Important; -} - -.monaco-shell .feedback-form .privacyLink:hover { - text-decoration: underline; -} - /* High Contrast Theming */ .monaco-shell.hc-black .feedback-form { - background-color: #000; outline: 2px solid #6fc3df; outline-offset: -2px; } -.monaco-shell.hc-black .feedback-form h2 { - color: white; -} - .monaco-shell.hc-black .feedback-form .feedback-alias, .monaco-shell.hc-black .feedback-form .feedback-description { font-family: inherit; } .monaco-shell.hc-black .feedback-form .content .contactus { padding: 10px; - border: solid 1px #6FC3DF; - background-color: #0C141F; float: right; } .monaco-shell.hc-black .feedback-form .cancel { @@ -321,8 +284,4 @@ height: 16px; width: 16px; display: inline-block; -} - -.monaco-shell.hc-black .feedback-form .privacyLink { - color: white !Important; } \ No newline at end of file From 484a2db0668b1028844d8c685e22e58fa2324e70 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 9 May 2017 11:33:40 +0200 Subject: [PATCH 0209/1164] drop support for substituing "command.", "env.", "config." --- .../node/configurationResolverService.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts b/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts index e74e57c412a..3caa6312379 100644 --- a/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts +++ b/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts @@ -17,7 +17,6 @@ import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { toResource } from 'vs/workbench/common/editor'; -// TODO@Isidor remove support for env, config. and command. in march export class ConfigurationResolverService implements IConfigurationResolverService { _serviceBrand: any; private _workspaceRoot: string; @@ -34,7 +33,6 @@ export class ConfigurationResolverService implements IConfigurationResolverServi this._workspaceRoot = paths.normalize(workspaceRoot ? workspaceRoot.fsPath : '', true); this._execPath = environmentService.execPath; Object.keys(envVariables).forEach(key => { - this[`env.${key}`] = envVariables[key]; this[`env:${key}`] = envVariables[key]; }); } @@ -141,7 +139,7 @@ export class ConfigurationResolverService implements IConfigurationResolverServi if (types.isString(newValue)) { return newValue; } else { - return match && (match.indexOf('env.') > 0 || match.indexOf('env:') > 0) ? '' : match; + return match && match.indexOf('env:') > 0 ? '' : match; } }); @@ -176,7 +174,7 @@ export class ConfigurationResolverService implements IConfigurationResolverServi } }; - return value.replace(/\$\{config\.(.+?)\}/g, replacer).replace(/\$\{config:(.+?)\}/g, replacer); + return value.replace(/\$\{config:(.+?)\}/g, replacer); } private resolveLiteral(values: IStringDictionary | string[]>): IStringDictionary | string[]> { @@ -223,7 +221,7 @@ export class ConfigurationResolverService implements IConfigurationResolverServi if (object[key] && typeof object[key] === 'object') { findInteractiveVariables(object[key]); } else if (typeof object[key] === 'string') { - const matches = /\${command[:\.](.+)}/.exec(object[key]); + const matches = /\${command:(.+)}/.exec(object[key]); if (matches && matches.length === 2) { const interactiveVariable = matches[1]; if (!interactiveVariablesToSubstitutes[interactiveVariable]) { @@ -251,8 +249,6 @@ export class ConfigurationResolverService implements IConfigurationResolverServi interactiveVariablesToSubstitutes[interactiveVariable].forEach(substitute => { if (substitute.object[substitute.key].indexOf(`\${command:${interactiveVariable}}`) >= 0) { substitute.object[substitute.key] = substitute.object[substitute.key].replace(`\${command:${interactiveVariable}}`, result); - } else if (substitute.object[substitute.key].indexOf(`\${command.${interactiveVariable}}`) >= 0) { - substitute.object[substitute.key] = substitute.object[substitute.key].replace(`\${command.${interactiveVariable}}`, result); } }); } else { From 650b75a94a6314c589b8edd7119e72ea363fdd1d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 9 May 2017 11:35:22 +0200 Subject: [PATCH 0210/1164] win32 tfs builds --- build/gulpfile.hygiene.js | 1 + build/tfs/win32/compile-win32.ps1 | 5 +++++ build/tfs/win32/lib.ps1 | 10 ++++++++++ build/tfs/win32/test-win32.ps1 | 5 +++++ package.json | 3 ++- 5 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 build/tfs/win32/compile-win32.ps1 create mode 100644 build/tfs/win32/lib.ps1 create mode 100644 build/tfs/win32/test-win32.ps1 diff --git a/build/gulpfile.hygiene.js b/build/gulpfile.hygiene.js index 480077c58cf..ee2d5864302 100644 --- a/build/gulpfile.hygiene.js +++ b/build/gulpfile.hygiene.js @@ -47,6 +47,7 @@ const indentationFilter = [ '**', '!ThirdPartyNotices.txt', '!**/*.md', + '!**/*.ps1', '!**/*.template', '!**/*.yml', '!**/lib/**', diff --git a/build/tfs/win32/compile-win32.ps1 b/build/tfs/win32/compile-win32.ps1 new file mode 100644 index 00000000000..be8431986d1 --- /dev/null +++ b/build/tfs/win32/compile-win32.ps1 @@ -0,0 +1,5 @@ +. .\lib.ps1 + +exec { & .\scripts\npm.bat install } +exec { & npm run gulp -- mixin } +exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-min } \ No newline at end of file diff --git a/build/tfs/win32/lib.ps1 b/build/tfs/win32/lib.ps1 new file mode 100644 index 00000000000..4ecb58e62a3 --- /dev/null +++ b/build/tfs/win32/lib.ps1 @@ -0,0 +1,10 @@ +# stop when there's an error +$ErrorActionPreference = 'Stop' + +# throw when a process exits with something other than 0 +function exec([scriptblock]$cmd, [string]$errorMessage = "Error executing command: " + $cmd) { + & $cmd + if ($LastExitCode -ne 0) { + throw $errorMessage + } +} diff --git a/build/tfs/win32/test-win32.ps1 b/build/tfs/win32/test-win32.ps1 new file mode 100644 index 00000000000..f9a58fff298 --- /dev/null +++ b/build/tfs/win32/test-win32.ps1 @@ -0,0 +1,5 @@ +. .\lib.ps1 + +exec { & npm run gulp -- electron } +exec { & .\scripts\test.bat --build --reporter dot } +# exec { & .\scripts\test-integration.bat } \ No newline at end of file diff --git a/package.json b/package.json index ffb1d379bcb..0b85f601598 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "watch": "gulp watch --max_old_space_size=4096", "monaco-editor-setup": "node scripts/monaco-editor-setup.js", "monaco-editor-test": "mocha --only-monaco-editor", - "precommit": "node build/gulpfile.hygiene.js" + "precommit": "node build/gulpfile.hygiene.js", + "gulp": "gulp" }, "dependencies": { "applicationinsights": "0.17.1", From 4455df6f0b87e257143a77858d4f35f918e2d4ee Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 9 May 2017 11:39:35 +0200 Subject: [PATCH 0211/1164] remove breakpoint.respectColumn, no longer needed --- src/vs/workbench/parts/debug/common/debugModel.ts | 3 +-- src/vs/workbench/parts/debug/electron-browser/debugService.ts | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index d27bf7f8823..2055357d274 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -646,7 +646,6 @@ export class Breakpoint implements IBreakpoint { public enabled: boolean, public condition: string, public hitCondition: string, - public respectColumn: boolean // TODO@Isidor remove this in March ) { if (enabled === undefined) { this.enabled = true; @@ -807,7 +806,7 @@ export class Model implements IModel { public addBreakpoints(uri: uri, rawData: IRawBreakpoint[]): void { this.breakpoints = this.breakpoints.concat(rawData.map(rawBp => - new Breakpoint(uri, rawBp.lineNumber, rawBp.column, rawBp.enabled, rawBp.condition, rawBp.hitCondition, true))); + new Breakpoint(uri, rawBp.lineNumber, rawBp.column, rawBp.enabled, rawBp.condition, rawBp.hitCondition))); this.breakpointsActivated = true; this.breakpoints = distinct(this.breakpoints, bp => `${bp.uri.toString()}:${bp.lineNumber}:${bp.column}`); this._onDidChangeBreakpoints.fire(); diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 0a3a3077956..b959668dfc6 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -407,7 +407,7 @@ export class DebugService implements debug.IDebugService { let result: Breakpoint[]; try { result = JSON.parse(this.storageService.get(DEBUG_BREAKPOINTS_KEY, StorageScope.WORKSPACE, '[]')).map((breakpoint: any) => { - return new Breakpoint(uri.parse(breakpoint.uri.external || breakpoint.source.uri.external), breakpoint.lineNumber, breakpoint.respectColumn ? breakpoint.column : undefined, breakpoint.enabled, breakpoint.condition, breakpoint.hitCondition, breakpoint.respectColumn); + return new Breakpoint(uri.parse(breakpoint.uri.external || breakpoint.source.uri.external), breakpoint.lineNumber, breakpoint.column, breakpoint.enabled, breakpoint.condition, breakpoint.hitCondition); }); } catch (e) { } From 16e1d237b3579489cbff67c25abb0831e5d9987d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 May 2017 11:41:14 +0200 Subject: [PATCH 0212/1164] theming bugfixes --- src/vs/base/browser/ui/button/button.ts | 9 +++++++++ src/vs/platform/theme/common/colorRegistry.ts | 6 +++--- src/vs/platform/theme/common/styler.ts | 3 ++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/vs/base/browser/ui/button/button.ts b/src/vs/base/browser/ui/button/button.ts index 21db87b36cb..356692bf766 100644 --- a/src/vs/base/browser/ui/button/button.ts +++ b/src/vs/base/browser/ui/button/button.ts @@ -21,6 +21,7 @@ export interface IButtonStyles { buttonBackground?: Color; buttonHoverBackground?: Color; buttonForeground?: Color; + buttonBorder?: Color; } const defaultOptions: IButtonStyles = { @@ -37,6 +38,7 @@ export class Button extends EventEmitter { private buttonBackground: Color; private buttonHoverBackground: Color; private buttonForeground: Color; + private buttonBorder: Color; constructor(container: Builder, options?: IButtonOptions); constructor(container: HTMLElement, options?: IButtonOptions); @@ -49,6 +51,7 @@ export class Button extends EventEmitter { this.buttonBackground = this.options.buttonBackground; this.buttonHoverBackground = this.options.buttonHoverBackground; this.buttonForeground = this.options.buttonForeground; + this.buttonBorder = this.options.buttonBorder; this.$el = $('a.monaco-button').attr({ 'tabIndex': '0', @@ -100,6 +103,7 @@ export class Button extends EventEmitter { this.buttonForeground = styles.buttonForeground; this.buttonBackground = styles.buttonBackground; this.buttonHoverBackground = styles.buttonHoverBackground; + this.buttonBorder = styles.buttonBorder; this.applyStyles(); } @@ -108,9 +112,14 @@ export class Button extends EventEmitter { if (this.$el) { const background = this.buttonBackground ? this.buttonBackground.toString() : null; const foreground = this.buttonForeground ? this.buttonForeground.toString() : null; + const border = this.buttonBorder ? this.buttonBorder.toString() : null; this.$el.style('color', foreground); this.$el.style('background-color', background); + + this.$el.style('border-width', border ? '1px' : null); + this.$el.style('border-style', border ? 'solid' : null); + this.$el.style('border-color', border); } } diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 981f08f63c9..d3ebe11a1de 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -146,11 +146,11 @@ export const inputActiveOptionBorder = registerColor('inputOption.activeBorder', export const inputPlaceholderForeground = registerColor('input.placeholderForeground', { dark: null, light: null, hc: null }, nls.localize('inputPlaceholderForeground', "Input box foreground color for placeholder text.")); export const inputValidationInfoBackground = registerColor('inputValidation.infoBackground', { dark: '#063B49', light: '#D6ECF2', hc: Color.black }, nls.localize('inputValidationInfoBackground', "Input validation background color for information severity.")); -export const inputValidationInfoBorder = registerColor('inputValidation.infoBorder', { dark: '#55AAFF', light: '#55AAFF', hc: '#6FC3DF' }, nls.localize('inputValidationInfoBorder', "Input validation border color for information severity.")); +export const inputValidationInfoBorder = registerColor('inputValidation.infoBorder', { dark: '#55AAFF', light: '#55AAFF', hc: contrastBorder }, nls.localize('inputValidationInfoBorder', "Input validation border color for information severity.")); export const inputValidationWarningBackground = registerColor('inputValidation.warningBackground', { dark: '#352A05', light: '#F6F5D2', hc: Color.black }, nls.localize('inputValidationWarningBackground', "Input validation background color for information warning.")); -export const inputValidationWarningBorder = registerColor('inputValidation.warningBorder', { dark: '#B89500', light: '#B89500', hc: '#B89500' }, nls.localize('inputValidationWarningBorder', "Input validation border color for warning severity.")); +export const inputValidationWarningBorder = registerColor('inputValidation.warningBorder', { dark: '#B89500', light: '#B89500', hc: contrastBorder }, nls.localize('inputValidationWarningBorder', "Input validation border color for warning severity.")); export const inputValidationErrorBackground = registerColor('inputValidation.errorBackground', { dark: '#5A1D1D', light: '#F2DEDE', hc: Color.black }, nls.localize('inputValidationErrorBackground', "Input validation background color for error severity.")); -export const inputValidationErrorBorder = registerColor('inputValidation.errorBorder', { dark: '#BE1100', light: '#BE1100', hc: '#BE1100' }, nls.localize('inputValidationErrorBorder', "Input validation border color for error severity.")); +export const inputValidationErrorBorder = registerColor('inputValidation.errorBorder', { dark: '#BE1100', light: '#BE1100', hc: contrastBorder }, nls.localize('inputValidationErrorBorder', "Input validation border color for error severity.")); export const selectBackground = registerColor('dropdown.background', { dark: '#3C3C3C', light: Color.white, hc: Color.black }, nls.localize('dropdownBackground', "Dropdown background.")); export const selectForeground = registerColor('dropdown.foreground', { dark: '#F0F0F0', light: null, hc: Color.white }, nls.localize('dropdownForeground', "Dropdown foreground.")); diff --git a/src/vs/platform/theme/common/styler.ts b/src/vs/platform/theme/common/styler.ts index 51504eaf7a5..ec9ad4240dd 100644 --- a/src/vs/platform/theme/common/styler.ts +++ b/src/vs/platform/theme/common/styler.ts @@ -223,7 +223,8 @@ export function attachButtonStyler(widget: IThemable, themeService: IThemeServic return doAttachStyler(themeService, { buttonForeground: (style && style.buttonForeground) || buttonForeground, buttonBackground: (style && style.buttonBackground) || buttonBackground, - buttonHoverBackground: (style && style.buttonHoverBackground) || buttonHoverBackground + buttonHoverBackground: (style && style.buttonHoverBackground) || buttonHoverBackground, + buttonBorder: contrastBorder }, widget); } From 6a49503b4332468995d118ce5bd178e7a72bee43 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 9 May 2017 10:22:41 +0200 Subject: [PATCH 0213/1164] Theme: "No results" in find widget is using hardcoded color. Fixes #26267 --- .../contrib/find/browser/findWidget.css | 9 --------- .../editor/contrib/find/browser/findWidget.ts | 19 ++++++++++++------- src/vs/platform/theme/common/colorRegistry.ts | 3 +++ 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/vs/editor/contrib/find/browser/findWidget.css b/src/vs/editor/contrib/find/browser/findWidget.css index 6d3ffb0ab28..74d52635a45 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.css +++ b/src/vs/editor/contrib/find/browser/findWidget.css @@ -99,15 +99,6 @@ vertical-align: middle; } -.monaco-editor .find-widget.no-results .matchesCount { - color: #A1260D; -} - -.monaco-editor.vs-dark .find-widget.no-results .matchesCount, -.monaco-editor.hc-black .find-widget.no-results .matchesCount { - color: #F48771 -} - .monaco-editor .find-widget .matchesCount { display: inline-block; margin: 0 1px 0 3px; diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index 559c6635abc..ea8efb1bb45 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -26,7 +26,7 @@ import { CONTEXT_FIND_INPUT_FOCUSSED } from 'vs/editor/contrib/find/common/findC import { ITheme, registerThemingParticipant, IThemeService } from 'vs/platform/theme/common/themeService'; import { Color } from 'vs/base/common/color'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; -import { editorFindRangeHighlight, editorFindMatch, editorFindMatchHighlight, activeContrastBorder, contrastBorder, inputBackground, editorWidgetBackground, inputActiveOptionBorder, widgetShadow, inputForeground, inputBorder, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationErrorBackground, inputValidationErrorBorder } from 'vs/platform/theme/common/colorRegistry'; +import { editorFindRangeHighlight, editorFindMatch, editorFindMatchHighlight, activeContrastBorder, contrastBorder, inputBackground, editorWidgetBackground, inputActiveOptionBorder, widgetShadow, inputForeground, inputBorder, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationErrorBackground, inputValidationErrorBorder, errorForeground } from 'vs/platform/theme/common/colorRegistry'; export interface IFindController { replace(): void; @@ -807,7 +807,7 @@ class SimpleButton extends Widget { registerThemingParticipant((theme, collector) => { function addBackgroundColorRule(selector: string, color: Color): void { if (color) { - collector.addRule(`.monaco-editor.${theme.selector} ${selector} { background-color: ${color}; }`); + collector.addRule(`.monaco-editor ${selector} { background-color: ${color}; }`); } } @@ -820,18 +820,23 @@ registerThemingParticipant((theme, collector) => { let widgetShadowColor = theme.getColor(widgetShadow); if (widgetShadowColor) { - collector.addRule(`.monaco-editor.${theme.selector} .find-widget { box-shadow: 0 2px 8px ${widgetShadowColor}; }`); + collector.addRule(`.monaco-editor .find-widget { box-shadow: 0 2px 8px ${widgetShadowColor}; }`); } let hcOutline = theme.getColor(activeContrastBorder); if (hcOutline) { - collector.addRule(`.monaco-editor.${theme.selector} .findScope { border: 1px dashed ${hcOutline.transparent(0.4)}; }`); - collector.addRule(`.monaco-editor.${theme.selector} .currentFindMatch { border: 2px solid ${hcOutline}; padding: 1px; -moz-box-sizing: border-box; box-sizing: border-box; }`); - collector.addRule(`.monaco-editor.${theme.selector} .findMatch { border: 1px dotted ${hcOutline}; -moz-box-sizing: border-box; box-sizing: border-box; }`); + collector.addRule(`.monaco-editor .findScope { border: 1px dashed ${hcOutline.transparent(0.4)}; }`); + collector.addRule(`.monaco-editor .currentFindMatch { border: 2px solid ${hcOutline}; padding: 1px; -moz-box-sizing: border-box; box-sizing: border-box; }`); + collector.addRule(`.monaco-editor .findMatch { border: 1px dotted ${hcOutline}; -moz-box-sizing: border-box; box-sizing: border-box; }`); } let hcBorder = theme.getColor(contrastBorder); if (hcBorder) { - collector.addRule(`.monaco-editor.${theme.selector} .find-widget { border: 2px solid ${hcBorder}; }`); + collector.addRule(`.monaco-editor .find-widget { border: 2px solid ${hcBorder}; }`); + } + + let error = theme.getColor(errorForeground); + if (error) { + collector.addRule(`.monaco-editor .find-widget.no-results .matchesCount { color: ${error}; }`); } }); diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index d3ebe11a1de..ec2a2d0f036 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -129,11 +129,14 @@ export function registerColor(id: string, defaults: ColorDefaults, description: // ----- base colors export const foreground = registerColor('foreground', { dark: '#CCCCCC', light: '#6C6C6C', hc: '#FFFFFF' }, nls.localize('foreground', "Overall foreground color. This color is only used if not overridden by a component.")); +export const errorForeground = registerColor('errorForeground', { dark: '#F48771', light: '#A1260D', hc: '#F48771' }, nls.localize('errorForeground', "Overall foreground color for error messages. This color is only used if not overridden by a component.")); + export const focusBorder = registerColor('focusBorder', { dark: Color.fromHex('#0E639C').transparent(0.6), light: Color.fromHex('#007ACC').transparent(0.4), hc: '#F38518' }, nls.localize('focusBorder', "Overall border color for focused elements. This color is only used if not overridden by a component.")); export const contrastBorder = registerColor('contrastBorder', { light: null, dark: null, hc: '#6FC3DF' }, nls.localize('contrastBorder', "An extra border around elements to separate them from others for greater contrast.")); export const activeContrastBorder = registerColor('contrastActiveBorder', { light: null, dark: null, hc: focusBorder }, nls.localize('activeContrastBorder', "An extra border around active elements to separate them from others for greater contrast.")); + export const selectionBackground = registerColor('selection.background', { light: null, dark: null, hc: null }, nls.localize('selectionBackground', "The background color of text selections in the workbench (e.g. for input fields or text areas). Note that this does not apply to selections within the editor and the terminal.")); // ----- widgets From cc0cad82e061997f785726b4e7567684cc18b021 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 9 May 2017 11:39:27 +0200 Subject: [PATCH 0214/1164] Use errorForeground in preferences editor (for #26267) --- .../preferences/browser/media/preferences.css | 9 --------- .../preferences/browser/preferencesWidgets.ts | 15 +++++++++++---- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/media/preferences.css b/src/vs/workbench/parts/preferences/browser/media/preferences.css index a8eccaa8c2d..58079f256d1 100644 --- a/src/vs/workbench/parts/preferences/browser/media/preferences.css +++ b/src/vs/workbench/parts/preferences/browser/media/preferences.css @@ -114,15 +114,6 @@ display: none; } -.settings-header-widget > .settings-count-widget.no-results { - color: #A1260D !important; -} - -.hc-black .settings-header-widget > .settings-count-widget.no-results, -.vs-dark .settings-header-widget > .settings-count-widget.no-results { - color: #F48771 !important; -} - .settings-header-widget > .settings-search-container { flex: 1; } diff --git a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts b/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts index a07b8a57be6..1f802861a31 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts @@ -27,7 +27,7 @@ import { attachInputBoxStyler, attachStylerCallback } from 'vs/platform/theme/co import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Position } from 'vs/editor/common/core/position'; import { ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; -import { buttonBackground, buttonForeground, badgeForeground, badgeBackground, contrastBorder } from "vs/platform/theme/common/colorRegistry"; +import { buttonBackground, buttonForeground, badgeForeground, badgeBackground, contrastBorder, errorForeground } from "vs/platform/theme/common/colorRegistry"; export class SettingsGroupTitleWidget extends Widget implements IViewZone { @@ -263,17 +263,17 @@ export class SearchWidget extends Widget { this.domNode = DOM.append(parent, DOM.$('div.settings-header-widget')); this.createSearchContainer(DOM.append(this.domNode, DOM.$('div.settings-search-container'))); this.countElement = DOM.append(this.domNode, DOM.$('.settings-count-widget')); - this._register(attachStylerCallback(this.themeService, { badgeBackground, badgeForeground, contrastBorder }, colors => { + this._register(attachStylerCallback(this.themeService, { badgeBackground, contrastBorder }, colors => { const background = colors.badgeBackground ? colors.badgeBackground.toString() : null; - const foreground = colors.badgeForeground ? colors.badgeForeground.toString() : null; const border = colors.contrastBorder ? colors.contrastBorder.toString() : null; this.countElement.style.backgroundColor = background; - this.countElement.style.color = foreground; this.countElement.style.borderWidth = border ? '1px' : null; this.countElement.style.borderStyle = border ? 'solid' : null; this.countElement.style.borderColor = border; + + this.styleCountElementForeground(); })); this.inputBox.inputElement.setAttribute('aria-live', 'assertive'); } @@ -298,6 +298,13 @@ export class SearchWidget extends Widget { this.inputBox.inputElement.setAttribute('aria-label', message); DOM.toggleClass(this.countElement, 'no-results', count === 0); this.inputBox.inputElement.style.paddingRight = DOM.getTotalWidth(this.countElement) + 20 + 'px'; + this.styleCountElementForeground(); + } + + private styleCountElementForeground() { + const colorId = DOM.hasClass(this.countElement, 'no-results') ? errorForeground : badgeForeground; + const color = this.themeService.getTheme().getColor(colorId); + this.countElement.style.color = color ? color.toString() : null; } public layout(dimension: Dimension) { From 8b4a75ffd09899afb65833613182896ea24d3ae6 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 9 May 2017 11:42:31 +0200 Subject: [PATCH 0215/1164] streamline win32 build --- build/tfs/win32/{compile-win32.ps1 => compile.ps1} | 0 build/tfs/win32/{test-win32.ps1 => test.ps1} | 0 package.json | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) rename build/tfs/win32/{compile-win32.ps1 => compile.ps1} (100%) rename build/tfs/win32/{test-win32.ps1 => test.ps1} (100%) diff --git a/build/tfs/win32/compile-win32.ps1 b/build/tfs/win32/compile.ps1 similarity index 100% rename from build/tfs/win32/compile-win32.ps1 rename to build/tfs/win32/compile.ps1 diff --git a/build/tfs/win32/test-win32.ps1 b/build/tfs/win32/test.ps1 similarity index 100% rename from build/tfs/win32/test-win32.ps1 rename to build/tfs/win32/test.ps1 diff --git a/package.json b/package.json index 0b85f601598..a5c50981cc2 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "code-oss-dev", "version": "1.13.0", "electronVersion": "1.6.6", - "distro": "bb676c1d1f91a0c6d3050d8ca8a49ba7743108c5", + "distro": "19f52f7ed3528101860a011fa740c4167dfc2d21", "author": { "name": "Microsoft Corporation" }, From 1b005bae403eb6f0ddc0e4d5bed1f4442d451dd0 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 May 2017 11:44:35 +0200 Subject: [PATCH 0216/1164] fix --- .../services/themes/electron-browser/themeCompatibility.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vs/workbench/services/themes/electron-browser/themeCompatibility.ts b/src/vs/workbench/services/themes/electron-browser/themeCompatibility.ts index 0f840bfd95f..519c2797b97 100644 --- a/src/vs/workbench/services/themes/electron-browser/themeCompatibility.ts +++ b/src/vs/workbench/services/themes/electron-browser/themeCompatibility.ts @@ -10,7 +10,6 @@ import * as colorRegistry from 'vs/platform/theme/common/colorRegistry'; import * as editorColorRegistry from 'vs/editor/common/view/editorColorRegistry'; import * as wordHighlighter from 'vs/editor/contrib/wordHighlighter/common/wordHighlighter'; import { ansiColorIdentifiers } from 'vs/workbench/parts/terminal/electron-browser/terminalColorRegistry'; -import { editorHoverHighlight } from 'vs/editor/contrib/hover/browser/hover'; import { peekViewEditorMatchHighlight, peekViewResultsMatchHighlight } from 'vs/editor/contrib/referenceSearch/browser/referencesWidget'; const settingToColorIdMapping: { [settingId: string]: string[] } = {}; @@ -56,7 +55,7 @@ addSettingMapping('inactiveSelection', colorRegistry.editorInactiveSelection); addSettingMapping('selectionHighlightColor', colorRegistry.editorSelectionHighlight); addSettingMapping('findMatchHighlight', colorRegistry.editorFindMatchHighlight); addSettingMapping('currentFindMatchHighlight', colorRegistry.editorFindMatch); -addSettingMapping('hoverHighlight', editorHoverHighlight); +addSettingMapping('hoverHighlight', colorRegistry.editorHoverHighlight); addSettingMapping('wordHighlight', wordHighlighter.editorWordHighlight); addSettingMapping('wordHighlightStrong', wordHighlighter.editorWordHighlightStrong); addSettingMapping('findRangeHighlight', colorRegistry.editorFindRangeHighlight); From e4c6a965eac234385767e5a2359f7850ee69db09 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 9 May 2017 11:49:28 +0200 Subject: [PATCH 0217/1164] Simplify content widgets --- .../contentWidgets/contentWidgets.ts | 313 +++++++++--------- 1 file changed, 151 insertions(+), 162 deletions(-) diff --git a/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts b/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts index bce7eb16e38..66e04e6cbf6 100644 --- a/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts +++ b/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts @@ -14,36 +14,6 @@ import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/v import { Position, IPosition } from 'vs/editor/common/core/position'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; -interface IWidgetData { - allowEditorOverflow: boolean; - widget: IContentWidget; - position: IPosition; - preference: ContentWidgetPositionPreference[]; - isVisible: boolean; - domNode: FastDomNode; -} - -interface IWidgetMap { - [key: string]: IWidgetData; -} - -interface IBoxLayoutResult { - aboveTop: number; - fitsAbove: boolean; - belowTop: number; - fitsBelow: boolean; - left: number; -} - -interface IMyWidgetRenderData { - top: number; - left: number; -} - -interface IMyRenderData { - [id: string]: IMyWidgetRenderData; -} - class Coordinate { _coordinateBrand: void; @@ -58,25 +28,16 @@ class Coordinate { export class ViewContentWidgets extends ViewPart { - private _widgets: IWidgetMap; - private _contentWidth: number; - private _contentLeft: number; - private _lineHeight: number; - private _renderData: IMyRenderData; + private _viewDomNode: FastDomNode; + private _widgets: { [key: string]: Widget; }; public domNode: FastDomNode; public overflowingContentWidgetsDomNode: FastDomNode; - private _viewDomNode: FastDomNode; constructor(context: ViewContext, viewDomNode: FastDomNode) { super(context); this._viewDomNode = viewDomNode; - this._widgets = {}; - this._contentWidth = this._context.configuration.editor.layoutInfo.contentWidth; - this._contentLeft = this._context.configuration.editor.layoutInfo.contentLeft; - this._lineHeight = this._context.configuration.editor.lineHeight; - this._renderData = {}; this.domNode = createFastDomNode(document.createElement('div')); PartFingerprints.write(this.domNode, PartFingerprint.ContentWidgets); @@ -98,22 +59,10 @@ export class ViewContentWidgets extends ViewPart { // --- begin event handlers public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { - if (e.lineHeight) { - this._lineHeight = this._context.configuration.editor.lineHeight; - } - if (e.layoutInfo) { - this._contentLeft = this._context.configuration.editor.layoutInfo.contentLeft; - - if (this._contentWidth !== this._context.configuration.editor.layoutInfo.contentWidth) { - this._contentWidth = this._context.configuration.editor.layoutInfo.contentWidth; - // update the maxWidth on widgets nodes, such that `prepareRender` - // below can read out the adjusted width/height of widgets - let keys = Object.keys(this._widgets); - for (let i = 0, len = keys.length; i < len; i++) { - const widgetId = keys[i]; - this._setWidgetMaxWidth(this._widgets[widgetId]); - } - } + let keys = Object.keys(this._widgets); + for (let i = 0, len = keys.length; i < len; i++) { + const widgetId = keys[i]; + this._widgets[widgetId].onConfigurationChanged(e); } return true; } @@ -142,57 +91,33 @@ export class ViewContentWidgets extends ViewPart { // ---- end view event handlers - private _setWidgetMaxWidth(widgetData: IWidgetData): void { - const maxWidth = widgetData.allowEditorOverflow - ? window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth - : this._contentWidth; + public addWidget(_widget: IContentWidget): void { + const myWidget = new Widget(this._context, this._viewDomNode, _widget); + this._widgets[myWidget.id] = myWidget; - widgetData.domNode.setMaxWidth(maxWidth); - } - - public addWidget(widget: IContentWidget): void { - const domNode = createFastDomNode(widget.getDomNode()); - - const widgetData: IWidgetData = { - allowEditorOverflow: widget.allowEditorOverflow || false, - widget: widget, - position: null, - preference: null, - isVisible: false, - domNode: domNode - }; - this._widgets[widget.getId()] = widgetData; - - domNode.setPosition((this._context.configuration.editor.viewInfo.fixedOverflowWidgets && widget.allowEditorOverflow) ? 'fixed' : 'absolute'); - this._setWidgetMaxWidth(widgetData); - domNode.setVisibility('hidden'); - domNode.setAttribute('widgetId', widget.getId()); - - if (widgetData.allowEditorOverflow) { - this.overflowingContentWidgetsDomNode.appendChild(domNode); + if (myWidget.allowEditorOverflow) { + this.overflowingContentWidgetsDomNode.appendChild(myWidget.domNode); } else { - this.domNode.appendChild(domNode); + this.domNode.appendChild(myWidget.domNode); } this.setShouldRender(); } public setWidgetPosition(widget: IContentWidget, position: IPosition, preference: ContentWidgetPositionPreference[]): void { - let widgetData = this._widgets[widget.getId()]; - - widgetData.position = position; - widgetData.preference = preference; + const myWidget = this._widgets[widget.getId()]; + myWidget.setPosition(position, preference); this.setShouldRender(); } public removeWidget(widget: IContentWidget): void { - let widgetId = widget.getId(); + const widgetId = widget.getId(); if (this._widgets.hasOwnProperty(widgetId)) { - let widgetData = this._widgets[widgetId]; + const myWidget = this._widgets[widgetId]; delete this._widgets[widgetId]; - const domNode = widgetData.domNode.domNode; + const domNode = myWidget.domNode.domNode; domNode.parentNode.removeChild(domNode); domNode.removeAttribute('monaco-visible-content-widget'); @@ -202,12 +127,107 @@ export class ViewContentWidgets extends ViewPart { public shouldSuppressMouseDownOnWidget(widgetId: string): boolean { if (this._widgets.hasOwnProperty(widgetId)) { - let widgetData = this._widgets[widgetId]; - return widgetData.widget.suppressMouseDown; + return this._widgets[widgetId].suppressMouseDown; } return false; } + public prepareRender(ctx: RenderingContext): void { + let keys = Object.keys(this._widgets); + for (let i = 0, len = keys.length; i < len; i++) { + const widgetId = keys[i]; + this._widgets[widgetId].prepareRender(ctx); + } + } + + public render(ctx: RestrictedRenderingContext): void { + let keys = Object.keys(this._widgets); + for (let i = 0, len = keys.length; i < len; i++) { + const widgetId = keys[i]; + this._widgets[widgetId].render(ctx); + } + } +} + +interface IBoxLayoutResult { + aboveTop: number; + fitsAbove: boolean; + belowTop: number; + fitsBelow: boolean; + left: number; +} + +class Widget { + private readonly _context: ViewContext; + private readonly _viewDomNode: FastDomNode; + private readonly _actual: IContentWidget; + + public readonly domNode: FastDomNode; + public readonly id: string; + public readonly allowEditorOverflow: boolean; + public readonly suppressMouseDown: boolean; + + private _fixedOverflowWidgets: boolean; + private _contentWidth: number; + private _contentLeft: number; + private _lineHeight: number; + + private _position: IPosition; + private _preference: ContentWidgetPositionPreference[]; + private _isVisible: boolean; + private _renderData: Coordinate; + + constructor(context: ViewContext, viewDomNode: FastDomNode, actual: IContentWidget) { + this._context = context; + this._viewDomNode = viewDomNode; + this._actual = actual; + this.domNode = createFastDomNode(this._actual.getDomNode()); + + this.id = this._actual.getId(); + this.allowEditorOverflow = this._actual.allowEditorOverflow || false; + this.suppressMouseDown = this._actual.suppressMouseDown || false; + + this._fixedOverflowWidgets = this._context.configuration.editor.viewInfo.fixedOverflowWidgets; + this._contentWidth = this._context.configuration.editor.layoutInfo.contentWidth; + this._contentLeft = this._context.configuration.editor.layoutInfo.contentLeft; + this._lineHeight = this._context.configuration.editor.lineHeight; + + this._position = null; + this._preference = null; + this._isVisible = false; + this._renderData = null; + + this.domNode.setPosition((this._fixedOverflowWidgets && this.allowEditorOverflow) ? 'fixed' : 'absolute'); + this._updateMaxWidth(); + this.domNode.setVisibility('hidden'); + this.domNode.setAttribute('widgetId', this.id); + } + + public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): void { + if (e.lineHeight) { + this._lineHeight = this._context.configuration.editor.lineHeight; + } + if (e.layoutInfo) { + this._contentLeft = this._context.configuration.editor.layoutInfo.contentLeft; + this._contentWidth = this._context.configuration.editor.layoutInfo.contentWidth; + + this._updateMaxWidth(); + } + } + + private _updateMaxWidth(): void { + const maxWidth = this.allowEditorOverflow + ? window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth + : this._contentWidth; + + this.domNode.setMaxWidth(maxWidth); + } + + public setPosition(position: IPosition, preference: ContentWidgetPositionPreference[]): void { + this._position = position; + this._preference = preference; + } + private _layoutBoxInViewport(topLeft: Coordinate, width: number, height: number, ctx: RenderingContext): IBoxLayoutResult { // Our visible box is split horizontally by the current line => 2 boxes @@ -279,7 +299,7 @@ export class ViewContentWidgets extends ViewPart { left -= delta; } - if (this._context.configuration.editor.viewInfo.fixedOverflowWidgets) { + if (this._fixedOverflowWidgets) { aboveTop = absoluteAboveTop; belowTop = absoluteBelowTop; left = absoluteLeft; @@ -288,17 +308,8 @@ export class ViewContentWidgets extends ViewPart { return { aboveTop, fitsAbove, belowTop, fitsBelow, left }; } - private _prepareRenderWidgetAtExactPosition(topLeft: Coordinate): IMyWidgetRenderData { - return { - top: topLeft.top, - left: topLeft.left - }; - } - - private _prepareRenderWidgetAtExactPositionOverflowing(topLeft: Coordinate): IMyWidgetRenderData { - let r = this._prepareRenderWidgetAtExactPosition(topLeft); - r.left += this._contentLeft; - return r; + private _prepareRenderWidgetAtExactPositionOverflowing(topLeft: Coordinate): Coordinate { + return new Coordinate(topLeft.top, topLeft.left + this._contentLeft); } private _getTopLeft(ctx: RenderingContext, position: Position): Coordinate { @@ -311,13 +322,13 @@ export class ViewContentWidgets extends ViewPart { return new Coordinate(top, visibleRange.left); } - private _prepareRenderWidget(widgetData: IWidgetData, ctx: RenderingContext): IMyWidgetRenderData { - if (!widgetData.position || !widgetData.preference) { + private _prepareRenderWidget(ctx: RenderingContext): Coordinate { + if (!this._position || !this._preference) { return null; } // Do not trust that widgets have a valid position - let validModelPosition = this._context.model.validateModelPosition(widgetData.position); + let validModelPosition = this._context.model.validateModelPosition(this._position); if (!this._context.model.coordinatesConverter.modelPositionIsVisible(validModelPosition)) { // this position is hidden by the view model @@ -337,11 +348,11 @@ export class ViewContentWidgets extends ViewPart { return null; } - const domNode = widgetData.domNode.domNode; + const domNode = this.domNode.domNode; const width = domNode.clientWidth; const height = domNode.clientHeight; - if (widgetData.allowEditorOverflow) { + if (this.allowEditorOverflow) { placement = this._layoutBoxInPage(topLeft, width, height, ctx); } else { placement = this._layoutBoxInViewport(topLeft, width, height, ctx); @@ -350,8 +361,8 @@ export class ViewContentWidgets extends ViewPart { // Do two passes, first for perfect fit, second picks first option for (let pass = 1; pass <= 2; pass++) { - for (let i = 0; i < widgetData.preference.length; i++) { - let pref = widgetData.preference[i]; + for (let i = 0; i < this._preference.length; i++) { + let pref = this._preference[i]; if (pref === ContentWidgetPositionPreference.ABOVE) { fetchPlacement(); if (!placement) { @@ -359,10 +370,7 @@ export class ViewContentWidgets extends ViewPart { return null; } if (pass === 2 || placement.fitsAbove) { - return { - top: placement.aboveTop, - left: placement.left - }; + return new Coordinate(placement.aboveTop, placement.left); } } else if (pref === ContentWidgetPositionPreference.BELOW) { fetchPlacement(); @@ -371,10 +379,7 @@ export class ViewContentWidgets extends ViewPart { return null; } if (pass === 2 || placement.fitsBelow) { - return { - top: placement.belowTop, - left: placement.left - }; + return new Coordinate(placement.belowTop, placement.left); } } else { const topLeft = this._getTopLeft(ctx, position); @@ -382,10 +387,10 @@ export class ViewContentWidgets extends ViewPart { // Widget outside of viewport return null; } - if (widgetData.allowEditorOverflow) { + if (this.allowEditorOverflow) { return this._prepareRenderWidgetAtExactPositionOverflowing(topLeft); } else { - return this._prepareRenderWidgetAtExactPosition(topLeft); + return topLeft; } } } @@ -394,49 +399,33 @@ export class ViewContentWidgets extends ViewPart { } public prepareRender(ctx: RenderingContext): void { - let data: IMyRenderData = {}; - - let keys = Object.keys(this._widgets); - for (let i = 0, len = keys.length; i < len; i++) { - let widgetId = keys[i]; - let renderData = this._prepareRenderWidget(this._widgets[widgetId], ctx); - if (renderData) { - data[widgetId] = renderData; - } - } - - this._renderData = data; + this._renderData = this._prepareRenderWidget(ctx); } public render(ctx: RestrictedRenderingContext): void { - let data = this._renderData; - - let keys = Object.keys(this._widgets); - for (let i = 0, len = keys.length; i < len; i++) { - const widgetId = keys[i]; - const widget = this._widgets[widgetId]; - const domNode = widget.domNode; - - if (data.hasOwnProperty(widgetId)) { - if (widget.allowEditorOverflow) { - domNode.setTop(data[widgetId].top); - domNode.setLeft(data[widgetId].left); - } else { - domNode.setTop(data[widgetId].top + ctx.scrollTop - ctx.bigNumbersDelta); - domNode.setLeft(data[widgetId].left); - } - if (!widget.isVisible) { - domNode.setVisibility('inherit'); - domNode.setAttribute('monaco-visible-content-widget', 'true'); - widget.isVisible = true; - } - } else { - if (widget.isVisible) { - domNode.removeAttribute('monaco-visible-content-widget'); - widget.isVisible = false; - domNode.setVisibility('hidden'); - } + if (!this._renderData) { + // This widget should be invisible + if (this._isVisible) { + this.domNode.removeAttribute('monaco-visible-content-widget'); + this._isVisible = false; + this.domNode.setVisibility('hidden'); } + return; + } + + // This widget should be visible + if (this.allowEditorOverflow) { + this.domNode.setTop(this._renderData.top); + this.domNode.setLeft(this._renderData.left); + } else { + this.domNode.setTop(this._renderData.top + ctx.scrollTop - ctx.bigNumbersDelta); + this.domNode.setLeft(this._renderData.left); + } + + if (!this._isVisible) { + this.domNode.setVisibility('inherit'); + this.domNode.setAttribute('monaco-visible-content-widget', 'true'); + this._isVisible = true; } } } From f3ca4f6e09832eea66e325e86d340b4c3575356d Mon Sep 17 00:00:00 2001 From: Michel Kaporin Date: Tue, 9 May 2017 12:06:05 +0200 Subject: [PATCH 0218/1164] Added handling for multiple '--user-data-dir' to enable Spectron smoke testing in #25291. --- src/main.js | 9 ++++++++- src/vs/platform/environment/node/argv.ts | 9 ++++++++- .../environment/test/node/environmentService.test.ts | 7 +++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main.js b/src/main.js index 43a92f8069a..bf1c9542f1b 100644 --- a/src/main.js +++ b/src/main.js @@ -170,8 +170,15 @@ function mkdir(dir) { }); } +// Because Spectron doesn't allow us to pass a custom user-data-dir, +// Code receives two of them. Let's just take the first one. +var userDataDir = args['user-data-dir']; +if (userDataDir) { + userDataDir = typeof userDataDir === 'string' ? userDataDir : userDataDir[0]; +} + // Set userData path before app 'ready' event and call to process.chdir -var userData = path.resolve(args['user-data-dir'] || paths.getDefaultUserDataPath(process.platform)); +var userData = path.resolve(userDataDir || paths.getDefaultUserDataPath(process.platform)); app.setPath('userData', userData); // Update cwd based on environment and platform diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index b5bd5de2417..757875134f8 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -105,7 +105,14 @@ export function parseCLIProcessArgv(processArgv: string[]): ParsedArgs { * Use this to parse code arguments such as `--verbose --wait` */ export function parseArgs(args: string[]): ParsedArgs { - return minimist(args, options) as ParsedArgs; + const result = minimist(args, options) as ParsedArgs; + + // Because Spectron doesn't allow us to pass a custom user-data-dir, + // Code receives two of them. Let's just take the first one. + const userDataDir: string | string[] = result['user-data-dir']; + result['user-data-dir'] = typeof userDataDir === 'string' ? userDataDir : userDataDir[0]; + + return result; } export const optionsHelp: { [name: string]: string; } = { diff --git a/src/vs/platform/environment/test/node/environmentService.test.ts b/src/vs/platform/environment/test/node/environmentService.test.ts index 1f3b16ab944..44617be5a87 100644 --- a/src/vs/platform/environment/test/node/environmentService.test.ts +++ b/src/vs/platform/environment/test/node/environmentService.test.ts @@ -41,4 +41,11 @@ suite('EnvironmentService', () => { assert.equal(parse(['--user-data-dir', './dir'], { cwd: () => '/foo', env: { 'VSCODE_CWD': '/bar' } }), path.resolve('/bar/dir'), 'should use VSCODE_CWD as the cwd when --user-data-dir is specified'); }); + + test('userDataPath should always take the first one', () => { + const parse = (a, b: { cwd: () => string, env: { [key: string]: string } }) => parseUserDataDir(parseArgs(a), b); + + assert.equal(parse(['--user-data-dir', './dir1', '--user-data-dir', './dir2'], { cwd: () => '/foo', env: {} }), path.resolve('/foo/dir1'), + 'should pick first --user-data-dir (dir1)'); + }); }); \ No newline at end of file From 4cc83a75e499d44adcb69b7412e793f514f35676 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 9 May 2017 12:18:32 +0200 Subject: [PATCH 0219/1164] Fix NPE where events were handled while the view model was disposing --- src/vs/editor/common/viewModel/viewModelImpl.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 3f75c1f17ce..7d5ff82c7f0 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -98,6 +98,8 @@ export class ViewModel extends Disposable implements IViewModel { private readonly decorations: ViewModelDecorations; private readonly cursors: ViewModelCursors; + private _isDisposing: boolean; + private _renderCustomLineNumbers: (lineNumber: number) => string; private _renderRelativeLineNumbers: boolean; private _lastCursorPosition: Position; @@ -128,6 +130,8 @@ export class ViewModel extends Disposable implements IViewModel { this.cursors = new ViewModelCursors(this.configuration, this.coordinatesConverter); + this._isDisposing = false; + this._register(this.model.addBulkListener((events: EmitterEvent[]) => this.onEvents(events))); this._register(this.configuration.onDidChange((e) => { this.onEvents([new EmitterEvent(ConfigurationChanged, e)]); @@ -155,6 +159,7 @@ export class ViewModel extends Disposable implements IViewModel { } public dispose(): void { + this._isDisposing = true; this.decorations.dispose(); this.lines.dispose(); this._listeners = []; @@ -230,6 +235,11 @@ export class ViewModel extends Disposable implements IViewModel { } private onEvents(events: EmitterEvent[]): void { + if (this._isDisposing) { + // Disposing the lines might end up sending model decoration changed events + // We no longer care about them... + return; + } let eventsCollector = new ViewEventsCollector(); this._onEvents(eventsCollector, events); this._emit(eventsCollector.finalize()); From 625c330e49e3e3081a2b012946db47d928f8eacc Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 May 2017 12:24:13 +0200 Subject: [PATCH 0220/1164] fix startup --- src/vs/platform/environment/node/argv.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index 757875134f8..fa8e0558faa 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -110,7 +110,9 @@ export function parseArgs(args: string[]): ParsedArgs { // Because Spectron doesn't allow us to pass a custom user-data-dir, // Code receives two of them. Let's just take the first one. const userDataDir: string | string[] = result['user-data-dir']; - result['user-data-dir'] = typeof userDataDir === 'string' ? userDataDir : userDataDir[0]; + if (userDataDir) { + result['user-data-dir'] = typeof userDataDir === 'string' ? userDataDir : userDataDir[0]; + } return result; } From 50b588a5a1d6ef1cc957e452553724a873afac1a Mon Sep 17 00:00:00 2001 From: Jeremy Loy Date: Tue, 9 May 2017 06:25:55 -0400 Subject: [PATCH 0221/1164] Added Services Submenu for MacOS (#26248) --- src/vs/code/electron-main/menus.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index 9dc190d135f..90b2eda68ec 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -388,6 +388,8 @@ export class VSCodeMenu { const about = new MenuItem({ label: nls.localize('mAbout', "About {0}", product.nameLong), role: 'about' }); const checkForUpdates = this.getUpdateMenuItems(); const preferences = this.getPreferencesMenu(); + const servicesMenu = new Menu(); + const services = new MenuItem({ label: nls.localize('mServices', "Services"), role: 'services', submenu: servicesMenu }); const hide = new MenuItem({ label: nls.localize('mHide', "Hide {0}", product.nameLong), role: 'hide', accelerator: 'Command+H' }); const hideOthers = new MenuItem({ label: nls.localize('mHideOthers', "Hide Others"), role: 'hideothers', accelerator: 'Command+Alt+H' }); const showAll = new MenuItem({ label: nls.localize('mShowAll', "Show All"), role: 'unhide' }); @@ -399,6 +401,8 @@ export class VSCodeMenu { __separator__(), preferences, __separator__(), + services, + __separator__(), hide, hideOthers, showAll, From 9c3880c539c22b130b3626df03ef2d7b46ab549b Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 May 2017 12:35:45 +0200 Subject: [PATCH 0222/1164] validate editor selections --- src/vs/editor/common/core/range.ts | 4 ++ .../contrib/snippet/browser/editorSnippets.ts | 67 ++++++++++++++----- .../contrib/snippet/common/snippetParser.ts | 2 +- .../test/browser/editorSnippets.test.ts | 49 +++++++++++++- .../snippet/test/common/snippetParser.test.ts | 26 +++---- src/vs/monaco.d.ts | 1 + 6 files changed, 119 insertions(+), 30 deletions(-) diff --git a/src/vs/editor/common/core/range.ts b/src/vs/editor/common/core/range.ts index e04ac3ef677..06255c480ec 100644 --- a/src/vs/editor/common/core/range.ts +++ b/src/vs/editor/common/core/range.ts @@ -290,6 +290,10 @@ export class Range { // --- + public static fromPositions(start: IPosition, end: IPosition = start): Range { + return new Range(start.lineNumber, start.column, end.lineNumber, end.column); + } + /** * Create a `Range` from an `IRange`. */ diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index 8b0e86d2569..0a237f10af4 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -20,14 +20,16 @@ class OneSnippet { private readonly _snippet: TextmateSnippet; private readonly _offset: number; + private _snippetDecoration: string; private _placeholderDecorations: Map; private _placeholderGroups: Placeholder[][]; private _placeholderGroupsIdx: number; - private static readonly _decorations = { + private static readonly _decor = { active: { stickiness: TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges }, activeFinal: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges }, - inActive: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges }, + inactive: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges }, + snippet: { stickiness: TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges }, }; constructor(editor: ICommonCodeEditor, snippet: TextmateSnippet, offset: number) { @@ -52,22 +54,25 @@ class OneSnippet { this._placeholderDecorations = new Map(); const model = this._editor.getModel(); - // create a decoration (tracked range) for each placeholder this._editor.changeDecorations(accessor => { - let lastRange: Range; + // create one decoration for the whole snippets + const range = Range.fromPositions( + model.getPositionAt(this._offset), + model.getPositionAt(this._offset + this._snippet.text.length) + ); + this._snippetDecoration = accessor.addDecoration(range, OneSnippet._decor.snippet); + // create a decoration for each placeholder for (const placeholder of this._snippet.getPlaceholders()) { const placeholderOffset = this._snippet.offset(placeholder); const placeholderLen = this._snippet.len(placeholder); - const start = model.getPositionAt(this._offset + placeholderOffset); - const end = model.getPositionAt(this._offset + placeholderOffset + placeholderLen); - const range = new Range(start.lineNumber, start.column, end.lineNumber, end.column); - - const handle = accessor.addDecoration(range, OneSnippet._decorations.inActive); + const range = Range.fromPositions( + model.getPositionAt(this._offset + placeholderOffset), + model.getPositionAt(this._offset + placeholderOffset + placeholderLen) + ); + const handle = accessor.addDecoration(range, OneSnippet._decor.inactive); this._placeholderDecorations.set(placeholder, handle); - - lastRange = range; } }); @@ -107,7 +112,7 @@ class OneSnippet { if (prevGroupsIdx !== -1) { for (const placeholder of this._placeholderGroups[prevGroupsIdx]) { const id = this._placeholderDecorations.get(placeholder); - accessor.changeDecorationOptions(id, OneSnippet._decorations.inActive); + accessor.changeDecorationOptions(id, OneSnippet._decor.inactive); } } @@ -120,7 +125,7 @@ class OneSnippet { const range = this._editor.getModel().getDecorationRange(id); selections.push(new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn)); - accessor.changeDecorationOptions(id, placeholder.isFinalTabstop ? OneSnippet._decorations.activeFinal : OneSnippet._decorations.active); + accessor.changeDecorationOptions(id, placeholder.isFinalTabstop ? OneSnippet._decor.activeFinal : OneSnippet._decor.active); } return selections; }); @@ -133,6 +138,10 @@ class OneSnippet { return this._placeholderGroups[this._placeholderGroupsIdx][0].isFinalTabstop; } } + + get range() { + return this._snippetDecoration !== undefined && this._editor.getModel().getDecorationRange(this._snippetDecoration); + } } export class SnippetSession { @@ -170,10 +179,10 @@ export class SnippetSession { const snippet = SnippetParser.parse(adjustedTemplate); const offset = model.getOffsetAt(start) + delta; - edits.push(EditOperation.replaceMove(selection, snippet.value)); + edits.push(EditOperation.replaceMove(selection, snippet.text)); this._snippets.push(new OneSnippet(editor, snippet, offset)); - delta += snippet.value.length - model.getValueLengthInRange(selection); + delta += snippet.text.length - model.getValueLengthInRange(selection); } // make insert edit and start with first selections @@ -211,4 +220,32 @@ export class SnippetSession { get isAtFinalPlaceholder() { return this._snippets[0].isAtFinalPlaceholder; } + + validateSelections(): boolean { + const selections = this._editor.getSelections(); + if (selections.length < this._snippets.length) { + return false; + } + + for (const selection of selections) { + let found = false; + for (const { range } of this._snippets) { + + if (!range) { + // too early, not yet initialized + return true; + } + + if (range.containsRange(selection)) { + found = true; + break; + } + } + if (!found) { + return false; + } + } + + return true; + } } diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/common/snippetParser.ts index c073588b085..c17415c3de6 100644 --- a/src/vs/editor/contrib/snippet/common/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/common/snippetParser.ts @@ -271,7 +271,7 @@ export class TextmateSnippet { return ret; } - get value() { + get text() { return Marker.toString(this.marker); } diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts index 280e4ddab44..04af3d8bcd6 100644 --- a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts @@ -12,7 +12,7 @@ import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { mockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; import { Model } from "vs/editor/common/model/model"; -suite('SnippetInsertion', function () { +suite('SnippetSession', function () { let editor: ICommonCodeEditor; let model: Model; @@ -234,5 +234,52 @@ suite('SnippetInsertion', function () { assertSelections(editor, new Selection(1, 4, 1, 4), new Selection(2, 8, 2, 8)); }); + test('snippets, overwriting nested placeholder', function () { + const session = new SnippetSession(editor, 'log(${1:"$2"});$0'); + assertSelections(editor, new Selection(1, 5, 1, 7), new Selection(2, 9, 2, 11)); + + editor.trigger('test', 'type', { text: 'XXX' }); + assert.equal(model.getValue(), 'log(XXX);function foo() {\n log(XXX);console.log(a);\n}'); + + session.next(); + assert.equal(session.isAtFinalPlaceholder, false); + // assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); + + session.next(); + assert.equal(session.isAtFinalPlaceholder, true); + assertSelections(editor, new Selection(1, 10, 1, 10), new Selection(2, 14, 2, 14)); + }); + + test('snippets, selections and snippet ranges', function () { + const session = new SnippetSession(editor, '${1:foo}farboo${2:bar}$0'); + assert.equal(model.getValue(), 'foofarboobarfunction foo() {\n foofarboobarconsole.log(a);\n}'); + assertSelections(editor, new Selection(1, 1, 1, 4), new Selection(2, 5, 2, 8)); + + assert.equal(session.validateSelections(), true); + + editor.setSelections([new Selection(1, 1, 1, 1)]); + assert.equal(session.validateSelections(), false); + + editor.setSelections([new Selection(1, 6, 1, 6), new Selection(2, 10, 2, 10)]); + assert.equal(session.validateSelections(), true); + + editor.setSelections([new Selection(1, 6, 1, 6), new Selection(2, 10, 2, 10), new Selection(1, 1, 1, 1)]); + assert.equal(session.validateSelections(), true); + + editor.setSelections([new Selection(1, 6, 1, 6), new Selection(2, 10, 2, 10), new Selection(2, 20, 2, 21)]); + assert.equal(session.validateSelections(), false); + + // reset selection to placeholder + session.next(); + assert.equal(session.validateSelections(), true); + assertSelections(editor, new Selection(1, 10, 1, 13), new Selection(2, 14, 2, 17)); + + // reset selection to placeholder + session.next(); + assert.equal(session.validateSelections(), true); + assert.equal(session.isAtFinalPlaceholder, true); + assertSelections(editor, new Selection(1, 13, 1, 13), new Selection(2, 17, 2, 17)); + }); + }); diff --git a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts index 0bbf14eec0d..0bfbcec0e5c 100644 --- a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts +++ b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts @@ -351,30 +351,30 @@ suite('SnippetParser', () => { test('TextmateSnippet#withIndentation', () => { let snippet = SnippetParser.parse('foo\n bar'); - assert.equal(snippet.value, 'foo\n bar'); + assert.equal(snippet.text, 'foo\n bar'); let snippet1 = snippet.withIndentation(s => s.replace(/ /, '\t')); let snippet2 = snippet.withIndentation(s => s.replace(/ /, ' ')); - assert.equal(snippet.value, 'foo\n bar'); - assert.equal(snippet1.value, 'foo\n\tbar'); - assert.equal(snippet2.value, 'foo\n bar'); + assert.equal(snippet.text, 'foo\n bar'); + assert.equal(snippet1.text, 'foo\n\tbar'); + assert.equal(snippet2.text, 'foo\n bar'); snippet = SnippetParser.parse('foo\n bar'); - assert.equal(snippet.value, 'foo\n bar'); + assert.equal(snippet.text, 'foo\n bar'); let newSnippet = snippet.withIndentation(s => s.replace(/ /, '\t')); - assert.equal(snippet.value, 'foo\n bar'); - assert.equal(newSnippet.value, 'foo\n\tbar'); + assert.equal(snippet.text, 'foo\n bar'); + assert.equal(newSnippet.text, 'foo\n\tbar'); snippet = SnippetParser.parse('foo\r\n bar\r\n far'); - assert.equal(snippet.value, 'foo\r\n bar\r\n far'); + assert.equal(snippet.text, 'foo\r\n bar\r\n far'); newSnippet = snippet.withIndentation(s => s.replace(/ /, '\t')); - assert.equal(snippet.value, 'foo\r\n bar\r\n far'); - assert.equal(newSnippet.value, 'foo\r\n\tbar\r\n\tfar'); + assert.equal(snippet.text, 'foo\r\n bar\r\n far'); + assert.equal(newSnippet.text, 'foo\r\n\tbar\r\n\tfar'); snippet = SnippetParser.parse('foo${1:bar\r far\r boo}'); - assert.equal(snippet.value, 'foobar\r far\r boo'); + assert.equal(snippet.text, 'foobar\r far\r boo'); newSnippet = snippet.withIndentation(s => s.replace(/ /, '\t')); - assert.equal(snippet.value, 'foobar\r far\r boo'); - assert.equal(newSnippet.value, 'foobar\r\tfar\r\tboo'); + assert.equal(snippet.text, 'foobar\r far\r boo'); + assert.equal(newSnippet.text, 'foobar\r\tfar\r\tboo'); }); }); diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index e26814d708c..7ebc6a1eeba 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -624,6 +624,7 @@ declare module monaco { * Create a new empty range using this range's start position. */ static collapseToStart(range: IRange): Range; + static fromPositions(start: IPosition, end?: IPosition): Range; /** * Create a `Range` from an `IRange`. */ From 854954758ae23ab6a7b9cc36e1de75d3c267cbf5 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 May 2017 12:51:07 +0200 Subject: [PATCH 0223/1164] simple test for nested snippet sessions --- .../test/browser/editorSnippets.test.ts | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts index 04af3d8bcd6..4de2f4c6387 100644 --- a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts @@ -281,5 +281,28 @@ suite('SnippetSession', function () { assertSelections(editor, new Selection(1, 13, 1, 13), new Selection(2, 17, 2, 17)); }); + test('snippets, nested sessions', function () { + + model.setValue(''); + editor.setSelection(new Selection(1, 1, 1, 1)); + + const first = new SnippetSession(editor, 'foo${2:bar}foo$0'); + assert.equal(model.getValue(), 'foobarfoo'); + assertSelections(editor, new Selection(1, 4, 1, 7)); + + const second = new SnippetSession(editor, 'ba${1:zzzz}$0'); + assert.equal(model.getValue(), 'foobazzzzfoo'); + assertSelections(editor, new Selection(1, 6, 1, 10)); + + second.next(); + assert.equal(second.isAtFinalPlaceholder, true); + assertSelections(editor, new Selection(1, 10, 1, 10)); + + first.next(); + assert.equal(first.isAtFinalPlaceholder, true); + assertSelections(editor, new Selection(1, 13, 1, 13)); + + }); + }); From b8a2488a8fe4f7d5835e320270ea044e5d872776 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 9 May 2017 12:51:13 +0200 Subject: [PATCH 0224/1164] Reduce view model responsibilities --- .../viewParts/lineNumbers/lineNumbers.ts | 62 ++++++++---- src/vs/editor/common/viewModel/viewModel.ts | 1 - .../editor/common/viewModel/viewModelImpl.ts | 94 ++++++++----------- 3 files changed, 83 insertions(+), 74 deletions(-) diff --git a/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts b/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts index c1a0c97a1da..38205f5a997 100644 --- a/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts +++ b/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts @@ -13,31 +13,45 @@ import { DynamicViewOverlay } from 'vs/editor/browser/view/dynamicViewOverlay'; import { ViewContext } from 'vs/editor/common/view/viewContext'; import { RenderingContext } from 'vs/editor/common/view/renderingContext'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { Position } from 'vs/editor/common/core/position'; export class LineNumbersOverlay extends DynamicViewOverlay { public static CLASS_NAME = 'line-numbers'; private _context: ViewContext; + private _lineHeight: number; private _renderLineNumbers: boolean; + private _renderCustomLineNumbers: (lineNumber: number) => string; private _renderRelativeLineNumbers: boolean; private _lineNumbersLeft: number; private _lineNumbersWidth: number; + + private _lastCursorModelPosition: Position; private _renderResult: string[]; constructor(context: ViewContext) { super(); this._context = context; - this._lineHeight = this._context.configuration.editor.lineHeight; - this._renderLineNumbers = this._context.configuration.editor.viewInfo.renderLineNumbers; - this._renderRelativeLineNumbers = this._context.configuration.editor.viewInfo.renderRelativeLineNumbers; - this._lineNumbersLeft = this._context.configuration.editor.layoutInfo.lineNumbersLeft; - this._lineNumbersWidth = this._context.configuration.editor.layoutInfo.lineNumbersWidth; + + this._readConfig(); + + this._lastCursorModelPosition = new Position(1, 1); this._renderResult = null; this._context.addEventHandler(this); } + private _readConfig(): void { + const config = this._context.configuration.editor; + this._lineHeight = config.lineHeight; + this._renderLineNumbers = config.viewInfo.renderLineNumbers; + this._renderCustomLineNumbers = config.viewInfo.renderCustomLineNumbers; + this._renderRelativeLineNumbers = config.viewInfo.renderRelativeLineNumbers; + this._lineNumbersLeft = config.layoutInfo.lineNumbersLeft; + this._lineNumbersWidth = config.layoutInfo.lineNumbersWidth; + } + public dispose(): void { this._context.removeEventHandler(this); this._context = null; @@ -48,20 +62,12 @@ export class LineNumbersOverlay extends DynamicViewOverlay { // --- begin event handlers public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { - if (e.lineHeight) { - this._lineHeight = this._context.configuration.editor.lineHeight; - } - if (e.viewInfo) { - this._renderLineNumbers = this._context.configuration.editor.viewInfo.renderLineNumbers; - this._renderRelativeLineNumbers = this._context.configuration.editor.viewInfo.renderRelativeLineNumbers; - } - if (e.layoutInfo) { - this._lineNumbersLeft = this._context.configuration.editor.layoutInfo.lineNumbersLeft; - this._lineNumbersWidth = this._context.configuration.editor.layoutInfo.lineNumbersWidth; - } + this._readConfig(); return true; } public onCursorPositionChanged(e: viewEvents.ViewCursorPositionChangedEvent): boolean { + this._lastCursorModelPosition = this._context.model.coordinatesConverter.convertViewPositionToModelPosition(e.position); + if (this._renderRelativeLineNumbers) { return true; } @@ -88,6 +94,28 @@ export class LineNumbersOverlay extends DynamicViewOverlay { // --- end event handlers + private _getLineRenderLineNumber(viewLineNumber: number): string { + const modelPosition = this._context.model.coordinatesConverter.convertViewPositionToModelPosition(new Position(viewLineNumber, 1)); + if (modelPosition.column !== 1) { + return ''; + } + let modelLineNumber = modelPosition.lineNumber; + + if (this._renderCustomLineNumbers) { + return this._renderCustomLineNumbers(modelLineNumber); + } + + if (this._renderRelativeLineNumbers) { + let diff = Math.abs(this._lastCursorModelPosition.lineNumber - modelLineNumber); + if (diff === 0) { + return '' + modelLineNumber + ''; + } + return String(diff); + } + + return String(modelLineNumber); + } + public prepareRender(ctx: RenderingContext): void { if (!this._renderLineNumbers) { this._renderResult = null; @@ -103,7 +131,7 @@ export class LineNumbersOverlay extends DynamicViewOverlay { for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) { let lineIndex = lineNumber - visibleStartLineNumber; - let renderLineNumber = this._context.model.getLineRenderLineNumber(lineNumber); + let renderLineNumber = this._getLineRenderLineNumber(lineNumber); if (renderLineNumber) { output[lineIndex] = ( common diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index 19a4b265f78..ab2b17027ac 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -110,7 +110,6 @@ export interface IViewModel { getLineIndentGuide(lineNumber: number): number; getLineMinColumn(lineNumber: number): number; getLineMaxColumn(lineNumber: number): number; - getLineRenderLineNumber(lineNumber: number): string; getAllOverviewRulerDecorations(): ViewModelDecoration[]; getValueInRange(range: Range, eol: EndOfLinePreference): string; diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 7d5ff82c7f0..77521cdacc2 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -100,10 +100,6 @@ export class ViewModel extends Disposable implements IViewModel { private _isDisposing: boolean; - private _renderCustomLineNumbers: (lineNumber: number) => string; - private _renderRelativeLineNumbers: boolean; - private _lastCursorPosition: Position; - private _centeredViewLine: number; private _listeners: IViewModelListener[]; @@ -119,10 +115,6 @@ export class ViewModel extends Disposable implements IViewModel { this.coordinatesConverter = new CoordinatesConverter(this.lines); - this._lastCursorPosition = new Position(1, 1); - this._renderCustomLineNumbers = this.configuration.editor.viewInfo.renderCustomLineNumbers; - this._renderRelativeLineNumbers = this.configuration.editor.viewInfo.renderRelativeLineNumbers; - this._centeredViewLine = -1; this.decorations = new ViewModelDecorations(this.editorId, this.model, this.configuration, this.coordinatesConverter); @@ -230,8 +222,44 @@ export class ViewModel extends Disposable implements IViewModel { return lineMappingChanged; } - public addEventSource(eventSource: Cursor): void { - this._register(eventSource.addBulkListener((events: EmitterEvent[]) => this.onEvents(events))); + public addEventSource(cursor: Cursor): void { + this._register(cursor.addBulkListener((events: EmitterEvent[]) => { + const eventsCollector = new ViewEventsCollector(); + + for (let i = 0, len = events.length; i < len; i++) { + const _e = events[i]; + const type = _e.type; + const data = _e.data; + + switch (type) { + case CursorEventType.CursorPositionChanged: { + const e = data; + this.cursors.onCursorPositionChanged(eventsCollector, e); + break; + } + case CursorEventType.CursorSelectionChanged: { + const e = data; + this.cursors.onCursorSelectionChanged(eventsCollector, e); + break; + } + case CursorEventType.CursorRevealRange: { + const e = data; + this.cursors.onCursorRevealRange(eventsCollector, e); + break; + } + case CursorEventType.CursorScrollRequest: { + const e = data; + this.cursors.onCursorScrollRequest(eventsCollector, e); + break; + } + default: + console.info('View received unknown event: '); + console.info(type, data); + } + } + + this._emit(eventsCollector.finalize()); + })); } private onEvents(events: EmitterEvent[]): void { @@ -389,35 +417,11 @@ export class ViewModel extends Disposable implements IViewModel { // Ignore, since the editor will take care of this and destroy the view shortly break; } - case CursorEventType.CursorPositionChanged: { - const e = data; - this.cursors.onCursorPositionChanged(eventsCollector, e); - this._lastCursorPosition = e.position; - break; - } - case CursorEventType.CursorSelectionChanged: { - const e = data; - this.cursors.onCursorSelectionChanged(eventsCollector, e); - break; - } - case CursorEventType.CursorRevealRange: { - const e = data; - this.cursors.onCursorRevealRange(eventsCollector, e); - break; - } - case CursorEventType.CursorScrollRequest: { - const e = data; - this.cursors.onCursorScrollRequest(eventsCollector, e); - break; - } case ConfigurationChanged: { const e = data; revealPreviousCenteredModelRange = this._onWrappingIndentChange(eventsCollector, this.configuration.editor.wrappingInfo.wrappingIndent) || revealPreviousCenteredModelRange; revealPreviousCenteredModelRange = this._onWrappingColumnChange(eventsCollector, this.configuration.editor.wrappingInfo.wrappingColumn, this.configuration.editor.fontInfo.typicalFullwidthCharacterWidth / this.configuration.editor.fontInfo.typicalHalfwidthCharacterWidth) || revealPreviousCenteredModelRange; - this._renderCustomLineNumbers = this.configuration.editor.viewInfo.renderCustomLineNumbers; - this._renderRelativeLineNumbers = this.configuration.editor.viewInfo.renderRelativeLineNumbers; - if (e.readOnly) { // Must read again all decorations due to readOnly filtering this.decorations.reset(); @@ -491,28 +495,6 @@ export class ViewModel extends Disposable implements IViewModel { return result + 2; } - public getLineRenderLineNumber(viewLineNumber: number): string { - let modelPosition = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(viewLineNumber, 1)); - if (modelPosition.column !== 1) { - return ''; - } - let modelLineNumber = modelPosition.lineNumber; - - if (this._renderCustomLineNumbers) { - return this._renderCustomLineNumbers(modelLineNumber); - } - - if (this._renderRelativeLineNumbers) { - let diff = Math.abs(this._lastCursorPosition.lineNumber - modelLineNumber); - if (diff === 0) { - return '' + modelLineNumber + ''; - } - return String(diff); - } - - return String(modelLineNumber); - } - public getDecorationsInViewport(visibleRange: Range): ViewModelDecoration[] { return this.decorations.getDecorationsViewportData(visibleRange).decorations; } From cdf3c0c660087ab699b46c23ce4a17e38b19476f Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 May 2017 12:59:19 +0200 Subject: [PATCH 0225/1164] remove unused code, rename Placeholder#name to Placeholder#index --- .../contrib/snippet/browser/editorSnippets.ts | 4 +- .../editor/contrib/snippet/common/snippet.ts | 14 ++-- .../contrib/snippet/common/snippetParser.ts | 64 +++---------------- .../snippet/test/common/snippetParser.test.ts | 43 ++----------- 4 files changed, 26 insertions(+), 99 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index 0a237f10af4..508e9be0afd 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -79,8 +79,8 @@ class OneSnippet { this._placeholderGroupsIdx = -1; this._placeholderGroups = []; let lastBucket: Placeholder[]; - this._snippet.getPlaceholders().sort(Placeholder.compare).forEach(a => { - if (!lastBucket || lastBucket[0].name !== a.name) { + this._snippet.getPlaceholders().sort(Placeholder.compareByIndex).forEach(a => { + if (!lastBucket || lastBucket[0].index !== a.index) { lastBucket = [a]; this._placeholderGroups.push(lastBucket); } else { diff --git a/src/vs/editor/contrib/snippet/common/snippet.ts b/src/vs/editor/contrib/snippet/common/snippet.ts index ea0b628e953..b9049993493 100644 --- a/src/vs/editor/contrib/snippet/common/snippet.ts +++ b/src/vs/editor/contrib/snippet/common/snippet.ts @@ -65,8 +65,8 @@ export class CodeSnippet implements ICodeSnippet { let getMaxTabStop = (markers: Marker[]): number => { let currentMaxTabStop = -1; markers.forEach(marker => { - if (marker instanceof Placeholder && /^\d+$/.test(marker['name'])) { - let currentTabStop = Number(marker['name']); + if (marker instanceof Placeholder && /^\d+$/.test(marker['index'])) { + let currentTabStop = Number(marker['index']); let nestedMaxTabStop = getMaxTabStop(marker['defaultValue'] || []); currentMaxTabStop = Math.max(currentMaxTabStop, currentTabStop, nestedMaxTabStop); } @@ -79,8 +79,8 @@ export class CodeSnippet implements ICodeSnippet { let setNextTabStop = (markers: Marker[]) => { markers.forEach(marker => { if (marker instanceof Placeholder) { - if (marker['name'] === '0') { - marker['name'] = ++maxTabStop + ''; + if (marker['index'] === '0') { + marker['index'] = ++maxTabStop + ''; } setNextTabStop(marker['defaultValue'] || []); } @@ -262,10 +262,10 @@ function _fillCodeSnippetFromMarker(snippet: CodeSnippet, marker: Marker[]) { } else if (marker instanceof Placeholder) { - let placeHolder = placeHolders[marker.name]; + let placeHolder = placeHolders[marker.index]; if (!placeHolder) { - placeHolders[marker.name] = placeHolder = { - id: marker.name, + placeHolders[marker.index] = placeHolder = { + id: marker.index, value: Marker.toString(marker.defaultValue), occurences: [] }; diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/common/snippetParser.ts index c17415c3de6..a69ca03386e 100644 --- a/src/vs/editor/contrib/snippet/common/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/common/snippetParser.ts @@ -6,7 +6,6 @@ 'use strict'; import { CharCode } from 'vs/base/common/charCode'; -import { getLeadingWhitespace } from 'vs/base/common/strings'; export enum TokenType { Dollar, @@ -162,30 +161,30 @@ export class Text extends Marker { export class Placeholder extends Marker { - static compare(a: Placeholder, b: Placeholder): number { - if (a.name === b.name) { + static compareByIndex(a: Placeholder, b: Placeholder): number { + if (a.index === b.index) { return 0; } else if (a.isFinalTabstop) { return 1; } else if (b.isFinalTabstop) { return -1; - } else if (a.name < b.name) { + } else if (a.index < b.index) { return -1; - } else if (a.name > b.name) { + } else if (a.index > b.index) { return 1; } else { return 0; } } - constructor(public name: string = '', public defaultValue: Marker[]) { + constructor(public index: string = '', public defaultValue: Marker[]) { super(); } get isFinalTabstop() { - return this.name === '0'; + return this.index === '0'; } with(defaultValue: Marker[]): Placeholder { - return new Placeholder(this.name, defaultValue); + return new Placeholder(this.index, defaultValue); } toString() { return Marker.toString(this.defaultValue); @@ -205,11 +204,6 @@ export class Variable extends Marker { toString() { return this.isDefined ? this.resolvedValue : Marker.toString(this.defaultValue); } - with(defaultValue: Marker[]): Variable { - let ret = new Variable(this.name, defaultValue); - ret.resolvedValue = this.resolvedValue; - return ret; - } } export function walk(marker: Marker[], visitor: (marker: Marker) => boolean): void { const stack = [...marker]; @@ -274,44 +268,6 @@ export class TextmateSnippet { get text() { return Marker.toString(this.marker); } - - withIndentation(normalizer: (whitespace: string) => string): TextmateSnippet { - // create a new snippet because this can be - // different for each and every cursor - const newMarker = [...this.marker]; - TextmateSnippet._adjustIndentation(newMarker, normalizer); - return new TextmateSnippet(newMarker); - } - - private static _adjustIndentation(marker: Marker[], normalizer: (whitespace: string) => string): void { - for (let i = 0; i < marker.length; i++) { - const candidate = marker[i]; - if (candidate instanceof Text) { - //check for newline characters and adjust indent - let regex = /\r\n|\r|\n/g; - let match: RegExpMatchArray; - let value = candidate.string; - while (match = regex.exec(value)) { - let pos = regex.lastIndex; - let whitespace = getLeadingWhitespace(value, pos); - let normalized = normalizer(whitespace); - if (whitespace !== normalized) { - value = value.substr(0, pos) - + normalized - + value.substr(pos + whitespace.length); - - marker[i] = candidate.with(value); - } - } - } else if (candidate instanceof Placeholder || candidate instanceof Variable) { - // recurse with a copied array - let children = [...candidate.defaultValue]; - TextmateSnippet._adjustIndentation(children, normalizer); - marker[i] = candidate.with(children); - } - } - } - } export class SnippetParser { @@ -353,10 +309,10 @@ export class SnippetParser { const thisMarker = marker[i]; if (thisMarker instanceof Placeholder) { - if (placeholders[thisMarker.name] === undefined) { - placeholders[thisMarker.name] = thisMarker.defaultValue; + if (placeholders[thisMarker.index] === undefined) { + placeholders[thisMarker.index] = thisMarker.defaultValue; } else if (thisMarker.defaultValue.length === 0) { - thisMarker.defaultValue = placeholders[thisMarker.name].slice(0); + thisMarker.defaultValue = placeholders[thisMarker.index].slice(0); } if (thisMarker.defaultValue.length > 0) { diff --git a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts index 0bfbcec0e5c..1b02a3676c3 100644 --- a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts +++ b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts @@ -144,7 +144,7 @@ suite('SnippetParser', () => { let [, placeholder] = new SnippetParser(true, false).parse('foo${1:bar\\}${2:foo}}'); let { defaultValue } = (placeholder); - assert.equal((placeholder).name, '1'); + assert.equal((placeholder).index, '1'); assert.ok(defaultValue[0] instanceof Text); assert.equal(defaultValue[0].toString(), 'bar}'); assert.ok(defaultValue[1] instanceof Placeholder); @@ -213,7 +213,7 @@ suite('SnippetParser', () => { const placeholder = marker[1]; assert.equal(placeholder, false); - assert.equal(placeholder.name, '1'); + assert.equal(placeholder.index, '1'); assert.equal(placeholder.defaultValue.length, 3); assert.ok(placeholder.defaultValue[0] instanceof Text); assert.ok(placeholder.defaultValue[1] instanceof Variable); @@ -256,13 +256,13 @@ suite('SnippetParser', () => { ); const [p1, , p2, , p3] = new SnippetParser().parse('{{first}}-{{2:}}-{{second}}-{{1:}}'); - assert.equal((p1).name, 'first'); + assert.equal((p1).index, 'first'); assert.equal(Marker.toString((p1).defaultValue), 'first'); - assert.equal((p2).name, '2'); + assert.equal((p2).index, '2'); assert.equal(Marker.toString((p2).defaultValue), ''); - assert.equal((p3).name, 'second'); + assert.equal((p3).index, 'second'); assert.equal(Marker.toString((p3).defaultValue), 'second'); }); @@ -272,11 +272,11 @@ suite('SnippetParser', () => { const [, p1, , p2] = new SnippetParser().parse('errorContext: `${1:err}`, error:$1'); - assert.equal((p1).name, '1'); + assert.equal((p1).index, '1'); assert.equal((p1).defaultValue.length, '1'); assert.equal(((p1).defaultValue[0]), 'err'); - assert.equal((p2).name, '1'); + assert.equal((p2).index, '1'); assert.equal((p2).defaultValue.length, '1'); assert.equal(((p2).defaultValue[0]), 'err'); @@ -348,33 +348,4 @@ suite('SnippetParser', () => { placeholders = snippet.getPlaceholders(); assert.equal(placeholders.length, 2); }); - - test('TextmateSnippet#withIndentation', () => { - let snippet = SnippetParser.parse('foo\n bar'); - assert.equal(snippet.text, 'foo\n bar'); - let snippet1 = snippet.withIndentation(s => s.replace(/ /, '\t')); - let snippet2 = snippet.withIndentation(s => s.replace(/ /, ' ')); - assert.equal(snippet.text, 'foo\n bar'); - assert.equal(snippet1.text, 'foo\n\tbar'); - assert.equal(snippet2.text, 'foo\n bar'); - - snippet = SnippetParser.parse('foo\n bar'); - assert.equal(snippet.text, 'foo\n bar'); - let newSnippet = snippet.withIndentation(s => s.replace(/ /, '\t')); - assert.equal(snippet.text, 'foo\n bar'); - assert.equal(newSnippet.text, 'foo\n\tbar'); - - snippet = SnippetParser.parse('foo\r\n bar\r\n far'); - assert.equal(snippet.text, 'foo\r\n bar\r\n far'); - newSnippet = snippet.withIndentation(s => s.replace(/ /, '\t')); - assert.equal(snippet.text, 'foo\r\n bar\r\n far'); - assert.equal(newSnippet.text, 'foo\r\n\tbar\r\n\tfar'); - - snippet = SnippetParser.parse('foo${1:bar\r far\r boo}'); - assert.equal(snippet.text, 'foobar\r far\r boo'); - newSnippet = snippet.withIndentation(s => s.replace(/ /, '\t')); - assert.equal(snippet.text, 'foobar\r far\r boo'); - assert.equal(newSnippet.text, 'foobar\r\tfar\r\tboo'); - - }); }); From c9f10706eff2d9ceb73ba0f7e5f18cb4f8a63d80 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 9 May 2017 15:50:18 +0200 Subject: [PATCH 0226/1164] [theme] add text colors. Fixes #26298 --- src/vs/platform/theme/common/colorRegistry.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index ec2a2d0f036..37746aef6bb 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -130,6 +130,7 @@ export function registerColor(id: string, defaults: ColorDefaults, description: export const foreground = registerColor('foreground', { dark: '#CCCCCC', light: '#6C6C6C', hc: '#FFFFFF' }, nls.localize('foreground', "Overall foreground color. This color is only used if not overridden by a component.")); export const errorForeground = registerColor('errorForeground', { dark: '#F48771', light: '#A1260D', hc: '#F48771' }, nls.localize('errorForeground', "Overall foreground color for error messages. This color is only used if not overridden by a component.")); +export const descriptionForeground = registerColor('descriptionForeground', { light: transparent(foreground, 0.7), dark: transparent(foreground, 0.7), hc: transparent(foreground, 0.7) }, nls.localize('descriptionForeground', "Foreground color for description text providing additional information, for example for a label.")); export const focusBorder = registerColor('focusBorder', { dark: Color.fromHex('#0E639C').transparent(0.6), light: Color.fromHex('#007ACC').transparent(0.4), hc: '#F38518' }, nls.localize('focusBorder', "Overall border color for focused elements. This color is only used if not overridden by a component.")); @@ -139,6 +140,16 @@ export const activeContrastBorder = registerColor('contrastActiveBorder', { ligh export const selectionBackground = registerColor('selection.background', { light: null, dark: null, hc: null }, nls.localize('selectionBackground', "The background color of text selections in the workbench (e.g. for input fields or text areas). Note that this does not apply to selections within the editor and the terminal.")); +// ------ text colors + +export const textSeparatorForeground = registerColor('textSeparator.foreground', { light: '#0000002e', dark: '#ffffff2e', hc: Color.black }, nls.localize('textSeparatorForeground', "Color for text separators.")); +export const textLinkForeground = registerColor('textLink.foreground', { light: '#4080D0', dark: '#4080D0', hc: '#4080D0' }, nls.localize('textLinkForeground', "Foreground color for links in text.")); +export const textLinkActiveForeground = registerColor('textLink.activeForeground', { light: '#4080D0', dark: '#4080D0', hc: '#4080D0' }, nls.localize('textLinkActiveForeground', "Foreground color for active links in text.")); +export const textPreformatForeground = registerColor('textPreformat.foreground', { light: '#A31515', dark: '#D7BA7D', hc: '#D7BA7D' }, nls.localize('textPreformatForeground', "Foreground color for preformatted text segments.")); +export const textBlockQuoteBackground = registerColor('textBlockQuote.background', { light: '#7f7f7f1a', dark: '#7f7f7f1a', hc: null }, nls.localize('textBlockQuoteBackground', "Background color for block quotes in text.")); +export const textBlockQuoteBorder = registerColor('textBlockQuote.border', { light: '#007acc80', dark: '#007acc80', hc: Color.white }, nls.localize('textBlockQuoteBorder', "Border color for block quotes in text.")); +export const textCodeBlockBackground = registerColor('textCodeBlock.background', { light: '#dcdcdc66', dark: '#0a0a0a66', hc: Color.black }, nls.localize('textCodeBlockBackground', "Background color for code blocks in text.")); + // ----- widgets export const widgetShadow = registerColor('widget.shadow', { dark: '#000000', light: '#A8A8A8', hc: null }, nls.localize('widgetShadow', 'Shadow color of widgets such as find/replace inside the editor.')); @@ -297,7 +308,7 @@ function resolveColorValue(colorValue: ColorValue, theme: ITheme): Color { return null; } -//setTimeout(_ => console.log(colorRegistry.toString()), 5000); +setTimeout(_ => console.log(colorRegistry.toString()), 5000); From d43d4ab9392e9a8e762d4f20d10751027dae88f4 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Tue, 9 May 2017 15:59:57 +0200 Subject: [PATCH 0227/1164] DAP: extend type of TerminateEvent.restart --- src/vs/workbench/parts/debug/common/debugProtocol.d.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debugProtocol.d.ts b/src/vs/workbench/parts/debug/common/debugProtocol.d.ts index 5f1345593d9..17f87f55016 100644 --- a/src/vs/workbench/parts/debug/common/debugProtocol.d.ts +++ b/src/vs/workbench/parts/debug/common/debugProtocol.d.ts @@ -121,8 +121,10 @@ declare module DebugProtocol { export interface TerminatedEvent extends Event { // event: 'terminated'; body?: { - /** A debug adapter may set 'restart' to true to request that the front end restarts the session. */ - restart?: boolean; + /** A debug adapter may set 'restart' to true (or to an arbitrary object) to request that the front end restarts the session. + The value is not interpreted by the client and passed unmodified as an attribute '__restart' to the launchRequest. + */ + restart?: boolean | object; }; } @@ -1345,4 +1347,3 @@ declare module DebugProtocol { innerException?: ExceptionDetails[]; } } - From 90dcda507ac342cb88f6d8b5fd91706919edf822 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 May 2017 16:02:10 +0200 Subject: [PATCH 0228/1164] add workaround for #24820 --- src/main.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main.js b/src/main.js index bf1c9542f1b..67d76f57004 100644 --- a/src/main.js +++ b/src/main.js @@ -16,7 +16,12 @@ if (process.argv.indexOf('--prof-startup') >= 0) { // in certain locales (e.g. PL), image metrics are wrongly computed. We explicitly set the // LC_NUMERIC to prevent this from happening (selects the numeric formatting category of the // C locale, http://en.cppreference.com/w/cpp/locale/LC_categories). TODO@Ben temporary. -process.env.LC_NUMERIC = 'C'; +if (process.env.LC_ALL) { + process.env.LC_ALL = 'C'; +} +if (process.env.LC_NUMERIC) { + process.env.LC_NUMERIC = 'C'; +} // Perf measurements global.perfStartTime = Date.now(); From 0a2d89c1abc535faff1a2bfe8d87beac7dd5632a Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 9 May 2017 16:00:56 +0200 Subject: [PATCH 0229/1164] fix new windows build --- build/tfs/win32/compile.ps1 | 2 +- build/tfs/win32/test.ps1 | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/tfs/win32/compile.ps1 b/build/tfs/win32/compile.ps1 index be8431986d1..d75432a5639 100644 --- a/build/tfs/win32/compile.ps1 +++ b/build/tfs/win32/compile.ps1 @@ -1,4 +1,4 @@ -. .\lib.ps1 +. .\build\tfs\win32\lib.ps1 exec { & .\scripts\npm.bat install } exec { & npm run gulp -- mixin } diff --git a/build/tfs/win32/test.ps1 b/build/tfs/win32/test.ps1 index f9a58fff298..c9589b5d52d 100644 --- a/build/tfs/win32/test.ps1 +++ b/build/tfs/win32/test.ps1 @@ -1,4 +1,4 @@ -. .\lib.ps1 +. .\build\tfs\win32\lib.ps1 exec { & npm run gulp -- electron } exec { & .\scripts\test.bat --build --reporter dot } diff --git a/package.json b/package.json index a5c50981cc2..3d3707bc48e 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "code-oss-dev", "version": "1.13.0", "electronVersion": "1.6.6", - "distro": "19f52f7ed3528101860a011fa740c4167dfc2d21", + "distro": "1337efdc669776e277c7e556d33b1dd7915fcefa", "author": { "name": "Microsoft Corporation" }, From c5fcfbc1130dc539f84e367720d7dd4b07f4a32d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 9 May 2017 16:11:30 +0200 Subject: [PATCH 0230/1164] windows build --- build/tfs/win32/compile.ps1 | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/build/tfs/win32/compile.ps1 b/build/tfs/win32/compile.ps1 index d75432a5639..7a962435818 100644 --- a/build/tfs/win32/compile.ps1 +++ b/build/tfs/win32/compile.ps1 @@ -1,5 +1,15 @@ . .\build\tfs\win32\lib.ps1 +# set agent specific npm cache +if (Test-Path env:AGENT_WORKFOLDER) { + $env:npm_config_cache = "${env:AGENT_WORKFOLDER}\npm-cache" +} + +# npm install exec { & .\scripts\npm.bat install } + +# mixin exec { & npm run gulp -- mixin } + +# compile exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-min } \ No newline at end of file From a2f424a823983af3dfdff0658e38c85f8042333f Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 9 May 2017 16:22:56 +0200 Subject: [PATCH 0231/1164] Support arbitrary data to be looped from one debug session to a restarted session fixes #26315 --- src/vs/workbench/parts/debug/common/debug.ts | 2 +- .../parts/debug/electron-browser/debugService.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index ccee37d19f4..7f8c638a686 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -315,7 +315,7 @@ export interface IEnvConfig { request: string; internalConsoleOptions?: string; preLaunchTask?: string; - __restart?: boolean; + __restart?: any; debugServer?: number; noDebug?: boolean; port?: number; diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index b959668dfc6..19e67a5c86e 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -318,8 +318,8 @@ export class DebugService implements debug.IDebugService { this.toDisposeOnSessionEnd.get(session.getId()).push(session.onDidTerminateDebugee(event => { aria.status(nls.localize('debuggingStopped', "Debugging stopped.")); if (session && session.getId() === event.body.sessionId) { - if (event.body && typeof event.body.restart === 'boolean' && event.body.restart && process) { - this.restartProcess(process, true).done(null, err => this.messageService.show(severity.Error, err.message)); + if (event.body && event.body.restart && process) { + this.restartProcess(process, event.body.restart).done(null, err => this.messageService.show(severity.Error, err.message)); } else { session.disconnect().done(null, errors.onUnexpectedError); } @@ -874,7 +874,7 @@ export class DebugService implements debug.IDebugService { this.model.deemphasizeSource(uri); } - public restartProcess(process: debug.IProcess, internalRestart?: boolean): TPromise { + public restartProcess(process: debug.IProcess, restartData?: any): TPromise { if (process.session.capabilities.supportsRestartRequest) { return process.session.custom('restart', null); } @@ -890,7 +890,7 @@ export class DebugService implements debug.IDebugService { // Take the type from the process since the debug extension might overwrite it #21316 config.type = process.configuration.type; config.noDebug = process.configuration.noDebug; - config.__restart = internalRestart; + config.__restart = restartData; } this.createProcess(config || process.configuration).then(() => c(null), err => e(err)); }, 300); From e20c90f3473c12e99c5a28b43e22dda1af991e33 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 May 2017 16:37:38 +0200 Subject: [PATCH 0232/1164] comment in spammy console.log --- src/vs/platform/theme/common/colorRegistry.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 37746aef6bb..314e9a861a2 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -308,7 +308,7 @@ function resolveColorValue(colorValue: ColorValue, theme: ITheme): Color { return null; } -setTimeout(_ => console.log(colorRegistry.toString()), 5000); +// setTimeout(_ => console.log(colorRegistry.toString()), 5000); From 3b32ecfc3218258958546431a27641851b0b42d1 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Tue, 9 May 2017 16:52:25 +0200 Subject: [PATCH 0233/1164] DAP: properly extend type of TerminateEvent.restart --- src/vs/workbench/parts/debug/common/debugProtocol.d.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/common/debugProtocol.d.ts b/src/vs/workbench/parts/debug/common/debugProtocol.d.ts index 17f87f55016..b6b16f7ad5b 100644 --- a/src/vs/workbench/parts/debug/common/debugProtocol.d.ts +++ b/src/vs/workbench/parts/debug/common/debugProtocol.d.ts @@ -124,7 +124,7 @@ declare module DebugProtocol { /** A debug adapter may set 'restart' to true (or to an arbitrary object) to request that the front end restarts the session. The value is not interpreted by the client and passed unmodified as an attribute '__restart' to the launchRequest. */ - restart?: boolean | object; + restart?: any; }; } @@ -1347,3 +1347,4 @@ declare module DebugProtocol { innerException?: ExceptionDetails[]; } } + From e3524b78623aba6f695f861e75e7ebe770dcb7a4 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 May 2017 17:03:52 +0200 Subject: [PATCH 0234/1164] first sketches of new snippet controller --- .../contrib/snippet/browser/editorSnippets.ts | 24 ++- .../snippet/browser/snippetController2.ts | 111 +++++++++++++ .../test/browser/editorSnippets.test.ts | 1 + .../test/browser/snippetController2.test.ts | 148 ++++++++++++++++++ .../test/common/mockKeybindingService.ts | 15 +- 5 files changed, 291 insertions(+), 8 deletions(-) create mode 100644 src/vs/editor/contrib/snippet/browser/snippetController2.ts create mode 100644 src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index 508e9be0afd..5bdf6042d69 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -39,9 +39,11 @@ class OneSnippet { } dispose(): void { - if (this._placeholderDecorations) { - this._editor.changeDecorations(accessor => this._placeholderDecorations.forEach(handle => accessor.removeDecoration(handle))); + if (!this._placeholderDecorations) { + return; } + this._editor.changeDecorations(accessor => this._placeholderDecorations.forEach(handle => accessor.removeDecoration(handle))); + this._placeholderGroups.length = 0; } private _init(): void { @@ -131,6 +133,10 @@ class OneSnippet { }); } + get isAtFirstPlaceholder() { + return this._placeholderGroupsIdx === 0; + } + get isAtFinalPlaceholder() { if (this._placeholderGroupsIdx < 0) { return false; @@ -194,17 +200,23 @@ export class SnippetSession { dispose(this._snippets); } - next(): void { + next(): boolean { const newSelections = this._move(true); if (newSelections.length > 0) { this._editor.setSelections(newSelections); + return true; + } else { + return false; } } - prev(): void { + prev(): boolean { const newSelections = this._move(false); if (newSelections.length > 0) { this._editor.setSelections(newSelections); + return true; + } else { + return false; } } @@ -217,6 +229,10 @@ export class SnippetSession { return selections; } + get isAtFirstPlaceholder() { + return this._snippets[0].isAtFirstPlaceholder; + } + get isAtFinalPlaceholder() { return this._snippets[0].isAtFinalPlaceholder; } diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts new file mode 100644 index 00000000000..a55e4eea20a --- /dev/null +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -0,0 +1,111 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; +import { commonEditorContribution } from 'vs/editor/common/editorCommonExtensions'; +import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { SnippetSession } from './editorSnippets'; + + +@commonEditorContribution +export class SnippetController2 { + + static InSnippetMode = new RawContextKey('inSnippet', false); + static HasNextTabstop = new RawContextKey('hasNextTabstop', false); + static HasPrevTabstop = new RawContextKey('hasPrevTabstop', false); + + private readonly _inSnippet: IContextKey; + private readonly _hasNextTabstop: IContextKey; + private readonly _hasPrevTabstop: IContextKey; + + private _snippetStack: SnippetSession[] = []; + private _snippetListener: IDisposable[] = []; + + constructor( + private readonly _editor: ICommonCodeEditor, + @IContextKeyService contextKeyService: IContextKeyService + ) { + this._inSnippet = SnippetController2.InSnippetMode.bindTo(contextKeyService); + this._hasNextTabstop = SnippetController2.HasNextTabstop.bindTo(contextKeyService); + this._hasPrevTabstop = SnippetController2.HasPrevTabstop.bindTo(contextKeyService); + } + + dispose(): void { + this._inSnippet.reset(); + dispose(this._snippetStack); + } + + getId(): string { + return 'snippetController2'; + } + + insert(template: string, overwriteBefore: number = 0, overwriteAfter: number = 0): void { + const newLen = this._snippetStack.unshift(new SnippetSession(this._editor, template)); + if (newLen === 1) { + this._inSnippet.set(true); + this._snippetListener = [this._editor.onDidChangeCursorSelection(() => this._updateState())]; + } + this._updateState(); + } + + private _updateState(): void { + if (!this._snippetStack[0].validateSelections()) { + return this.abort(); + } + + let prev = false; + let next = false; + for (let i = 0; i < this._snippetStack.length && !(prev && next); i++) { + if (!this._snippetStack[i].isAtFirstPlaceholder) { + prev = true; + } + if (!this._snippetStack[i].isAtFinalPlaceholder) { + next = true; + } + } + this._hasNextTabstop.set(next); + this._hasPrevTabstop.set(prev); + } + + abort(): void { + + // remove current, check for next + const element = this._snippetStack.shift(); + dispose(element); + + // clean up if last snippet is gone + // or validate the new active snippet + if (this._snippetStack.length === 0) { + this._inSnippet.set(false); + this._hasNextTabstop.set(false); + this._hasPrevTabstop.set(false); + this._snippetListener = dispose(this._snippetListener); + + } else { + // + this._updateState(); + } + } + + prev(): void { + for (let i = 0; i < this._snippetStack.length; i++) { + if (this._snippetStack[i].prev()) { + return; + } + } + } + + next(): void { + for (let i = 0; i < this._snippetStack.length; i++) { + if (this._snippetStack[i].next()) { + return; + } + } + } + +} diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts index 4de2f4c6387..04391cdc5a7 100644 --- a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts @@ -34,6 +34,7 @@ suite('SnippetSession', function () { teardown(function () { model.dispose(); + editor.dispose(); }); test('normalize whitespace', function () { diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts new file mode 100644 index 00000000000..c43ab3283b3 --- /dev/null +++ b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts @@ -0,0 +1,148 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import * as assert from 'assert'; +import { Selection } from 'vs/editor/common/core/selection'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; +import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; +import { mockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; +import { Model } from "vs/editor/common/model/model"; +import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; + +suite('SnippetController2', function () { + + function assertSelections(editor: ICommonCodeEditor, ...s: Selection[]) { + for (const selection of editor.getSelections()) { + const actual = s.shift(); + assert.ok(selection.equalsSelection(actual), `actual=${selection.toString()} <> expected=${actual.toString()}`); + } + assert.equal(s.length, 0); + } + + let editor: ICommonCodeEditor; + let model: Model; + let contextKeys: MockContextKeyService; + + setup(function () { + contextKeys = new MockContextKeyService(); + model = Model.createFromString('if\n $state\nfi'); + editor = mockCodeEditor([], { model }); + editor.setSelections([new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)]); + assert.equal(model.getEOL(), '\n'); + }); + + teardown(function () { + model.dispose(); + }); + + test('creation', function () { + const ctrl = new SnippetController2(editor, contextKeys); + assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), false); + ctrl.dispose(); + }); + + test('insert, insert -> abort', function () { + const ctrl = new SnippetController2(editor, contextKeys); + + ctrl.insert('foo${1:bar}foo$0'); + assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); + assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); + + ctrl.abort(); + assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), false); + assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); + }); + + test('insert, insert -> tab, tab, done', function () { + const ctrl = new SnippetController2(editor, contextKeys); + + ctrl.insert('${1:one}${2:two}$0'); + assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); + assert.equal(SnippetController2.HasNextTabstop.getValue(contextKeys), true); + assert.equal(SnippetController2.HasPrevTabstop.getValue(contextKeys), false); + + ctrl.next(); + assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); + assert.equal(SnippetController2.HasNextTabstop.getValue(contextKeys), true); + assert.equal(SnippetController2.HasPrevTabstop.getValue(contextKeys), true); + + ctrl.next(); + assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); + assert.equal(SnippetController2.HasNextTabstop.getValue(contextKeys), false); + assert.equal(SnippetController2.HasPrevTabstop.getValue(contextKeys), true); + + // editor.trigger('test', 'type', { text: '\t' }); + // assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), false); + // assert.equal(SnippetController2.HasNextTabstop.getValue(contextKeys), false); + // assert.equal(SnippetController2.HasPrevTabstop.getValue(contextKeys), false); + }); + + test('insert, insert -> cursor moves out', function () { + const ctrl = new SnippetController2(editor, contextKeys); + + ctrl.insert('foo${1:bar}foo$0'); + assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); + assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); + + // bad selection change + editor.setSelections([new Selection(1, 12, 1, 12), new Selection(2, 16, 2, 16)]); + assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), false); + }); + + test('insert, nested -> cursor moves out 1/2', function () { + + const ctrl = new SnippetController2(editor, contextKeys); + + ctrl.insert('foo${1:bar}foo$0'); + assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); + assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); + + ctrl.insert('ff$1bb$0'); + assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); + assertSelections(editor, new Selection(1, 6, 1, 6), new Selection(2, 10, 2, 10)); + + // bad selection + editor.setSelections([new Selection(3, 1, 3, 1), new Selection(1, 6, 1, 6)]); + assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), false); + }); + + test('insert, nested -> cursor moves out 2/2', function () { + + const ctrl = new SnippetController2(editor, contextKeys); + + ctrl.insert('foo${1:bar}foo$0'); + assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); + assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); + + ctrl.insert('ff$1bb$0'); + assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); + assertSelections(editor, new Selection(1, 6, 1, 6), new Selection(2, 10, 2, 10)); + + // select outer snippet + editor.setSelections([new Selection(1, 3, 1, 3), new Selection(2, 6, 2, 6)]); + assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); + + ctrl.next(); + assert.equal(model.getValue(), 'fooffbbfooif\n fooffbbfoo$state\nfi'); + assertSelections(editor, new Selection(1, 11, 1, 11), new Selection(2, 15, 2, 15)); + assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); + }); + + test('insert, nested -> tab across all', function () { + const ctrl = new SnippetController2(editor, contextKeys); + + ctrl.insert('outer$1outer$0'); + assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); + assert.equal(SnippetController2.HasNextTabstop.getValue(contextKeys), true); + assert.equal(SnippetController2.HasPrevTabstop.getValue(contextKeys), false); + + ctrl.insert('inner$1inner$0'); + assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); + assert.equal(SnippetController2.HasNextTabstop.getValue(contextKeys), true); + // assert.equal(SnippetController2.HasPrevTabstop.getValue(contextKeys), true); + + }); +}); diff --git a/src/vs/platform/keybinding/test/common/mockKeybindingService.ts b/src/vs/platform/keybinding/test/common/mockKeybindingService.ts index 4c4e03c566c..a050b92656c 100644 --- a/src/vs/platform/keybinding/test/common/mockKeybindingService.ts +++ b/src/vs/platform/keybinding/test/common/mockKeybindingService.ts @@ -38,12 +38,17 @@ class MockKeybindingContextKey implements IContextKey { } export class MockContextKeyService implements IContextKeyService { + public _serviceBrand: any; + private _keys = new Map>(); - public dispose(): void { } - + public dispose(): void { + // + } public createKey(key: string, defaultValue: T): IContextKey { - return new MockKeybindingContextKey(key, defaultValue); + let ret = new MockKeybindingContextKey(key, defaultValue); + this._keys.set(key, ret); + return ret; } public contextMatchesRules(rules: ContextKeyExpr): boolean { return false; @@ -52,7 +57,9 @@ export class MockContextKeyService implements IContextKeyService { return Event.None; } public getContextKeyValue(key: string) { - return; + if (this._keys.has(key)) { + return this._keys.get(key).get(); + } } public getContext(domNode: HTMLElement): any { return null; From 2312a0a5aeb93502c5e3a7f6288bbfdcfaab54c6 Mon Sep 17 00:00:00 2001 From: Isidor Nikolic Date: Tue, 9 May 2017 17:06:10 +0200 Subject: [PATCH 0235/1164] also store and restore view state for ResourceEditorInputs (#26317) --- src/vs/workbench/browser/parts/editor/textResourceEditor.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/textResourceEditor.ts b/src/vs/workbench/browser/parts/editor/textResourceEditor.ts index 96b76b50418..c54d7aef429 100644 --- a/src/vs/workbench/browser/parts/editor/textResourceEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textResourceEditor.ts @@ -10,6 +10,7 @@ import types = require('vs/base/common/types'); import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { TextEditorOptions, EditorModel, EditorInput, EditorOptions } from 'vs/workbench/common/editor'; +import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; import { BaseTextEditorModel } from 'vs/workbench/common/editor/textEditorModel'; import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorInput'; import { BaseTextEditor } from 'vs/workbench/browser/parts/editor/textEditor'; @@ -118,7 +119,7 @@ export class TextResourceEditor extends BaseTextEditor { } protected restoreViewState(input: EditorInput) { - if (input instanceof UntitledEditorInput) { + if (input instanceof UntitledEditorInput || input instanceof ResourceEditorInput) { const viewState = this.loadTextEditorViewState(input.getResource().toString()); if (viewState) { this.getControl().restoreViewState(viewState); @@ -190,7 +191,7 @@ export class TextResourceEditor extends BaseTextEditor { return super.saveTextEditorViewState(arg1); } - if (arg1 instanceof UntitledEditorInput && !arg1.isDisposed()) { + if ((arg1 instanceof UntitledEditorInput || arg1 instanceof ResourceEditorInput) && !arg1.isDisposed()) { return super.saveTextEditorViewState(arg1.getResource().toString()); } } From a986ea476e11fc8a24c80cb1d9e7f1e6631da2d9 Mon Sep 17 00:00:00 2001 From: Michel Kaporin Date: Tue, 9 May 2017 17:08:52 +0200 Subject: [PATCH 0236/1164] Respect the arrow height when layouting exception widget. Fixes #25443. --- src/vs/workbench/parts/debug/browser/exceptionWidget.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/browser/exceptionWidget.ts b/src/vs/workbench/parts/debug/browser/exceptionWidget.ts index 217c4435370..7e5f9676374 100644 --- a/src/vs/workbench/parts/debug/browser/exceptionWidget.ts +++ b/src/vs/workbench/parts/debug/browser/exceptionWidget.ts @@ -93,7 +93,10 @@ export class ExceptionWidget extends ZoneWidget { // Reload the height with respect to the exception text content and relayout it to match the line count. this.container.style.height = 'initial'; - const computedLinesNumber = Math.ceil(this.container.offsetHeight / this.editor.getConfiguration().fontInfo.lineHeight); + const lineHeight = this.editor.getConfiguration().lineHeight; + const arrowHeight = Math.round(lineHeight / 3); + const computedLinesNumber = Math.ceil((this.container.offsetHeight + arrowHeight) / lineHeight); + this._relayout(computedLinesNumber); } } From 9ee052bf836ff653a689cff36204811cf6435433 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 May 2017 17:18:26 +0200 Subject: [PATCH 0237/1164] improve typing at edges --- .../contrib/snippet/browser/editorSnippets.ts | 37 +++++-------------- .../test/browser/editorSnippets.test.ts | 26 +++++++++++++ 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index 5bdf6042d69..890f7694278 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -29,7 +29,7 @@ class OneSnippet { active: { stickiness: TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges }, activeFinal: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges }, inactive: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges }, - snippet: { stickiness: TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges }, + snippet: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges }, }; constructor(editor: ICommonCodeEditor, snippet: TextmateSnippet, offset: number) { @@ -95,16 +95,15 @@ class OneSnippet { this._init(); - const prevGroupsIdx = this._placeholderGroupsIdx; + let prevGroupsIdx = -1; if (fwd && this._placeholderGroupsIdx < this._placeholderGroups.length - 1) { + prevGroupsIdx = this._placeholderGroupsIdx; this._placeholderGroupsIdx += 1; } else if (!fwd && this._placeholderGroupsIdx > 0) { + prevGroupsIdx = this._placeholderGroupsIdx; this._placeholderGroupsIdx -= 1; - - } else { - return []; } return this._editor.getModel().changeDecorations(accessor => { @@ -200,24 +199,14 @@ export class SnippetSession { dispose(this._snippets); } - next(): boolean { + next(): void { const newSelections = this._move(true); - if (newSelections.length > 0) { - this._editor.setSelections(newSelections); - return true; - } else { - return false; - } + this._editor.setSelections(newSelections); } - prev(): boolean { + prev(): void { const newSelections = this._move(false); - if (newSelections.length > 0) { - this._editor.setSelections(newSelections); - return true; - } else { - return false; - } + this._editor.setSelections(newSelections); } private _move(fwd: boolean): Selection[] { @@ -245,14 +234,8 @@ export class SnippetSession { for (const selection of selections) { let found = false; - for (const { range } of this._snippets) { - - if (!range) { - // too early, not yet initialized - return true; - } - - if (range.containsRange(selection)) { + for (const snippet of this._snippets) { + if (snippet.range.containsRange(selection)) { found = true; break; } diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts index 04391cdc5a7..5da6689a730 100644 --- a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts @@ -302,7 +302,33 @@ suite('SnippetSession', function () { first.next(); assert.equal(first.isAtFinalPlaceholder, true); assertSelections(editor, new Selection(1, 13, 1, 13)); + }); + test('snippets, typing at final tabstop', function () { + + const session = new SnippetSession(editor, 'farboo$0'); + assert.equal(session.isAtFinalPlaceholder, true); + assert.equal(session.validateSelections(), true); + + editor.trigger('test', 'type', { text: 'XXX' }); + assert.equal(session.validateSelections(), false); + }); + + test('snippets, typing at beginning', function () { + + editor.setSelection(new Selection(1, 2, 1, 2)); + const session = new SnippetSession(editor, 'farboo$0'); + + editor.setSelection(new Selection(1, 2, 1, 2)); + assert.equal(session.validateSelections(), true); + assert.equal(session.isAtFinalPlaceholder, true); + + editor.trigger('test', 'type', { text: 'XXX' }); + assert.equal(model.getLineContent(1), 'fXXXfarboounction foo() {'); + assert.equal(session.validateSelections(), true); + + session.next(); + assertSelections(editor, new Selection(1, 11, 1, 11)); }); }); From b7499af70443e4f616a278dd33990d41fc5f375e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 May 2017 17:39:22 +0200 Subject: [PATCH 0238/1164] explit SnippetSession#insert --- .../contrib/snippet/browser/editorSnippets.ts | 22 +++++++++++-------- .../snippet/browser/snippetController2.ts | 5 +++-- .../test/browser/editorSnippets.test.ts | 19 ++++++++++++++-- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index 890f7694278..e126e1fea75 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -167,38 +167,42 @@ export class SnippetSession { } private readonly _editor: ICommonCodeEditor; + private readonly _template: string; private readonly _snippets: OneSnippet[]; constructor(editor: ICommonCodeEditor, template: string) { this._editor = editor; + this._template = template; this._snippets = []; + } + dispose(): void { + dispose(this._snippets); + } + + insert(): void { let delta = 0; let edits: IIdentifiedSingleEditOperation[] = []; - let model = editor.getModel(); + let model = this._editor.getModel(); - for (const selection of editor.getSelections()) { + for (const selection of this._editor.getSelections()) { const start = selection.getStartPosition(); - const adjustedTemplate = SnippetSession.normalizeWhitespace(model, start, template); + const adjustedTemplate = SnippetSession.normalizeWhitespace(model, start, this._template); const snippet = SnippetParser.parse(adjustedTemplate); const offset = model.getOffsetAt(start) + delta; edits.push(EditOperation.replaceMove(selection, snippet.text)); - this._snippets.push(new OneSnippet(editor, snippet, offset)); + this._snippets.push(new OneSnippet(this._editor, snippet, offset)); delta += snippet.text.length - model.getValueLengthInRange(selection); } // make insert edit and start with first selections - const newSelections = model.pushEditOperations(editor.getSelections(), edits, () => this._move(true)); + const newSelections = model.pushEditOperations(this._editor.getSelections(), edits, () => this._move(true)); this._editor.setSelections(newSelections); } - dispose(): void { - dispose(this._snippets); - } - next(): void { const newSelections = this._move(true); this._editor.setSelections(newSelections); diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index a55e4eea20a..7e9eaae9e10 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -45,12 +45,13 @@ export class SnippetController2 { } insert(template: string, overwriteBefore: number = 0, overwriteAfter: number = 0): void { - const newLen = this._snippetStack.unshift(new SnippetSession(this._editor, template)); + const session = new SnippetSession(this._editor, template); + const newLen = this._snippetStack.unshift(session); if (newLen === 1) { this._inSnippet.set(true); this._snippetListener = [this._editor.onDidChangeCursorSelection(() => this._updateState())]; } - this._updateState(); + session.insert(); } private _updateState(): void { diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts index 5da6689a730..9e6ea7b1b23 100644 --- a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts @@ -53,6 +53,7 @@ suite('SnippetSession', function () { test('text edits & selection', function () { const session = new SnippetSession(editor, 'foo${1:bar}foo$0'); + session.insert(); assert.equal(editor.getModel().getValue(), 'foobarfoofunction foo() {\n foobarfooconsole.log(a);\n}'); assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); @@ -62,6 +63,7 @@ suite('SnippetSession', function () { test('snippets, repeated tabstops', function () { const session = new SnippetSession(editor, '${1:abc}foo${1:abc}$0'); + session.insert(); assertSelections(editor, new Selection(1, 1, 1, 4), new Selection(1, 7, 1, 10), new Selection(2, 5, 2, 8), new Selection(2, 11, 2, 14), @@ -76,6 +78,7 @@ suite('SnippetSession', function () { test('snippets, selections and new text with newlines', () => { const session = new SnippetSession(editor, 'foo\n\t${1:bar}\n$0'); + session.insert(); assert.equal(editor.getModel().getValue(), 'foo\n bar\nfunction foo() {\n foo\n bar\nconsole.log(a);\n}'); @@ -88,6 +91,7 @@ suite('SnippetSession', function () { test('snippets, selections -> next/prev', () => { const session = new SnippetSession(editor, 'f$1oo${2:bar}foo$0'); + session.insert(); // @ $2 assertSelections(editor, new Selection(1, 2, 1, 2), new Selection(2, 6, 2, 6)); @@ -107,6 +111,7 @@ suite('SnippetSession', function () { test('snippets, selections & typing', function () { const session = new SnippetSession(editor, 'f${1:oo}_$2_$0'); + session.insert(); editor.trigger('test', 'type', { text: 'X' }); session.next(); @@ -130,7 +135,7 @@ suite('SnippetSession', function () { model.setValue('foo_bar_foo'); editor.setSelections([new Selection(1, 1, 1, 4), new Selection(1, 9, 1, 12)]); - new SnippetSession(editor, 'x$0'); + new SnippetSession(editor, 'x$0').insert(); assert.equal(model.getValue(), 'x_bar_x'); assertSelections(editor, new Selection(1, 2, 1, 2), new Selection(1, 8, 1, 8)); }); @@ -139,7 +144,7 @@ suite('SnippetSession', function () { model.setValue('foo_bar_foo'); editor.setSelections([new Selection(1, 1, 1, 4), new Selection(1, 9, 1, 12)]); - new SnippetSession(editor, 'LONGER$0'); + new SnippetSession(editor, 'LONGER$0').insert(); assert.equal(model.getValue(), 'LONGER_bar_LONGER'); assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(1, 18, 1, 18)); }); @@ -148,6 +153,7 @@ suite('SnippetSession', function () { model.setValue('foo_zzz_foo'); editor.setSelection(new Selection(1, 5, 1, 8)); const session = new SnippetSession(editor, '$1bar$0'); + session.insert(); assertSelections(editor, new Selection(1, 5, 1, 5)); editor.trigger('test', 'type', { text: 'foo-' }); @@ -167,6 +173,7 @@ suite('SnippetSession', function () { test('snippets, don\'t merge touching tabstops 1/2', function () { const session = new SnippetSession(editor, '$1$2$3$0'); + session.insert(); assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); session.next(); @@ -204,6 +211,7 @@ suite('SnippetSession', function () { test('snippets, don\'t merge touching tabstops 2/2', function () { const session = new SnippetSession(editor, '$1$2$3$0'); + session.insert(); assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); editor.trigger('test', 'type', { text: '111' }); @@ -222,6 +230,7 @@ suite('SnippetSession', function () { test('snippets, gracefully move over final tabstop', function () { const session = new SnippetSession(editor, '${1}bar$0'); + session.insert(); assert.equal(session.isAtFinalPlaceholder, false); assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); @@ -237,6 +246,7 @@ suite('SnippetSession', function () { test('snippets, overwriting nested placeholder', function () { const session = new SnippetSession(editor, 'log(${1:"$2"});$0'); + session.insert(); assertSelections(editor, new Selection(1, 5, 1, 7), new Selection(2, 9, 2, 11)); editor.trigger('test', 'type', { text: 'XXX' }); @@ -253,6 +263,7 @@ suite('SnippetSession', function () { test('snippets, selections and snippet ranges', function () { const session = new SnippetSession(editor, '${1:foo}farboo${2:bar}$0'); + session.insert(); assert.equal(model.getValue(), 'foofarboobarfunction foo() {\n foofarboobarconsole.log(a);\n}'); assertSelections(editor, new Selection(1, 1, 1, 4), new Selection(2, 5, 2, 8)); @@ -288,10 +299,12 @@ suite('SnippetSession', function () { editor.setSelection(new Selection(1, 1, 1, 1)); const first = new SnippetSession(editor, 'foo${2:bar}foo$0'); + first.insert(); assert.equal(model.getValue(), 'foobarfoo'); assertSelections(editor, new Selection(1, 4, 1, 7)); const second = new SnippetSession(editor, 'ba${1:zzzz}$0'); + second.insert(); assert.equal(model.getValue(), 'foobazzzzfoo'); assertSelections(editor, new Selection(1, 6, 1, 10)); @@ -307,6 +320,7 @@ suite('SnippetSession', function () { test('snippets, typing at final tabstop', function () { const session = new SnippetSession(editor, 'farboo$0'); + session.insert(); assert.equal(session.isAtFinalPlaceholder, true); assert.equal(session.validateSelections(), true); @@ -318,6 +332,7 @@ suite('SnippetSession', function () { editor.setSelection(new Selection(1, 2, 1, 2)); const session = new SnippetSession(editor, 'farboo$0'); + session.insert(); editor.setSelection(new Selection(1, 2, 1, 2)); assert.equal(session.validateSelections(), true); From 28f70d51164fbb6468c40eda536e70c660956665 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 9 May 2017 17:42:26 +0200 Subject: [PATCH 0239/1164] Simplify view model event handling --- src/vs/editor/common/commonCodeEditor.ts | 24 +- .../common/viewModel/splitLinesCollection.ts | 573 +++++++++--------- .../common/viewModel/viewModelDecorations.ts | 1 - .../editor/common/viewModel/viewModelImpl.ts | 358 +++++------ .../test/common/viewModel/testViewModel.ts | 24 +- 5 files changed, 441 insertions(+), 539 deletions(-) diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index 63609ca09a2..b3d0d0f0ce0 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -18,8 +18,6 @@ import { Position, IPosition } from 'vs/editor/common/core/position'; import { Range, IRange } from 'vs/editor/common/core/range'; import { Selection, ISelection } from 'vs/editor/common/core/selection'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import { CharacterHardWrappingLineMapperFactory } from 'vs/editor/common/viewModel/characterHardWrappingLineMapper'; -import { SplitLinesCollection } from 'vs/editor/common/viewModel/splitLinesCollection'; import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl'; import { hash } from 'vs/base/common/hash'; import { EditorModeContext } from 'vs/editor/common/modes/editorModeContext'; @@ -752,27 +750,7 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo this.model.onBeforeAttached(); - let hardWrappingLineMapperFactory = new CharacterHardWrappingLineMapperFactory( - this._configuration.editor.wrappingInfo.wordWrapBreakBeforeCharacters, - this._configuration.editor.wrappingInfo.wordWrapBreakAfterCharacters, - this._configuration.editor.wrappingInfo.wordWrapBreakObtrusiveCharacters - ); - - let linesCollection = new SplitLinesCollection( - this.model, - hardWrappingLineMapperFactory, - this.model.getOptions().tabSize, - this._configuration.editor.wrappingInfo.wrappingColumn, - this._configuration.editor.fontInfo.typicalFullwidthCharacterWidth / this._configuration.editor.fontInfo.typicalHalfwidthCharacterWidth, - this._configuration.editor.wrappingInfo.wrappingIndent - ); - - this.viewModel = new ViewModel( - linesCollection, - this.id, - this._configuration, - this.model - ); + this.viewModel = new ViewModel(this.id, this._configuration, this.model); let viewModelHelper: IViewModelHelper = { viewModel: this.viewModel, diff --git a/src/vs/editor/common/viewModel/splitLinesCollection.ts b/src/vs/editor/common/viewModel/splitLinesCollection.ts index 6ac00757566..322cc3aa6c7 100644 --- a/src/vs/editor/common/viewModel/splitLinesCollection.ts +++ b/src/vs/editor/common/viewModel/splitLinesCollection.ts @@ -57,283 +57,6 @@ export interface ISplitLine { getViewPositionOfModelPosition(deltaLineNumber: number, inputColumn: number): Position; } -class VisibleIdentitySplitLine implements ISplitLine { - - public static INSTANCE = new VisibleIdentitySplitLine(); - - private constructor() { } - - public isVisible(): boolean { - return true; - } - - public setVisible(isVisible: boolean): ISplitLine { - if (isVisible) { - return this; - } - return InvisibleIdentitySplitLine.INSTANCE; - } - - public getViewLineCount(): number { - return 1; - } - - public getViewLineContent(model: IModel, modelLineNumber: number, outputLineIndex: number): string { - return model.getLineContent(modelLineNumber); - } - - public getViewLineMinColumn(model: IModel, modelLineNumber: number, outputLineIndex: number): number { - return model.getLineMinColumn(modelLineNumber); - } - - public getViewLineMaxColumn(model: IModel, modelLineNumber: number, outputLineIndex: number): number { - return model.getLineMaxColumn(modelLineNumber); - } - - public getViewLineData(model: IModel, modelLineNumber: number, outputLineIndex: number): ViewLineData { - let lineTokens = model.getLineTokens(modelLineNumber); - let lineContent = lineTokens.getLineContent(); - return new ViewLineData( - lineContent, - 1, - lineContent.length + 1, - lineTokens.inflate() - ); - } - - public getViewLinesData(model: IModel, modelLineNumber: number, fromOuputLineIndex: number, toOutputLineIndex: number, globalStartIndex: number, needed: boolean[], result: ViewLineData[]): void { - if (!needed[globalStartIndex]) { - result[globalStartIndex] = null; - return; - } - result[globalStartIndex] = this.getViewLineData(model, modelLineNumber, 0); - } - - public getModelColumnOfViewPosition(outputLineIndex: number, outputColumn: number): number { - return outputColumn; - } - - public getViewPositionOfModelPosition(deltaLineNumber: number, inputColumn: number): Position { - return new Position(deltaLineNumber, inputColumn); - } -} - -class InvisibleIdentitySplitLine implements ISplitLine { - - public static INSTANCE = new InvisibleIdentitySplitLine(); - - private constructor() { } - - public isVisible(): boolean { - return false; - } - - public setVisible(isVisible: boolean): ISplitLine { - if (!isVisible) { - return this; - } - return VisibleIdentitySplitLine.INSTANCE; - } - - public getViewLineCount(): number { - return 0; - } - - public getViewLineContent(model: IModel, modelLineNumber: number, outputLineIndex: number): string { - throw new Error('Not supported'); - } - - public getViewLineMinColumn(model: IModel, modelLineNumber: number, outputLineIndex: number): number { - throw new Error('Not supported'); - } - - public getViewLineMaxColumn(model: IModel, modelLineNumber: number, outputLineIndex: number): number { - throw new Error('Not supported'); - } - - public getViewLineData(model: IModel, modelLineNumber: number, outputLineIndex: number): ViewLineData { - throw new Error('Not supported'); - } - - public getViewLinesData(model: IModel, modelLineNumber: number, fromOuputLineIndex: number, toOutputLineIndex: number, globalStartIndex: number, needed: boolean[], result: ViewLineData[]): void { - throw new Error('Not supported'); - } - - public getModelColumnOfViewPosition(outputLineIndex: number, outputColumn: number): number { - throw new Error('Not supported'); - } - - public getViewPositionOfModelPosition(deltaLineNumber: number, inputColumn: number): Position { - throw new Error('Not supported'); - } -} - -export class SplitLine implements ISplitLine { - - private positionMapper: ILineMapping; - private outputLineCount: number; - - private wrappedIndent: string; - private wrappedIndentLength: number; - private _isVisible: boolean; - - constructor(positionMapper: ILineMapping, isVisible: boolean) { - this.positionMapper = positionMapper; - this.wrappedIndent = this.positionMapper.getWrappedLinesIndent(); - this.wrappedIndentLength = this.wrappedIndent.length; - this.outputLineCount = this.positionMapper.getOutputLineCount(); - this._isVisible = isVisible; - } - - public isVisible(): boolean { - return this._isVisible; - } - - public setVisible(isVisible: boolean): ISplitLine { - this._isVisible = isVisible; - return this; - } - - public getViewLineCount(): number { - if (!this._isVisible) { - return 0; - } - return this.outputLineCount; - } - - private getInputStartOffsetOfOutputLineIndex(outputLineIndex: number): number { - return this.positionMapper.getInputOffsetOfOutputPosition(outputLineIndex, 0); - } - - private getInputEndOffsetOfOutputLineIndex(model: IModel, modelLineNumber: number, outputLineIndex: number): number { - if (outputLineIndex + 1 === this.outputLineCount) { - return model.getLineMaxColumn(modelLineNumber) - 1; - } - return this.positionMapper.getInputOffsetOfOutputPosition(outputLineIndex + 1, 0); - } - - public getViewLineContent(model: IModel, modelLineNumber: number, outputLineIndex: number): string { - if (!this._isVisible) { - throw new Error('Not supported'); - } - let startOffset = this.getInputStartOffsetOfOutputLineIndex(outputLineIndex); - let endOffset = this.getInputEndOffsetOfOutputLineIndex(model, modelLineNumber, outputLineIndex); - let r = model.getLineContent(modelLineNumber).substring(startOffset, endOffset); - - if (outputLineIndex > 0) { - r = this.wrappedIndent + r; - } - - return r; - } - - public getViewLineMinColumn(model: IModel, modelLineNumber: number, outputLineIndex: number): number { - if (!this._isVisible) { - throw new Error('Not supported'); - } - if (outputLineIndex > 0) { - return this.wrappedIndentLength + 1; - } - return 1; - } - - public getViewLineMaxColumn(model: IModel, modelLineNumber: number, outputLineIndex: number): number { - if (!this._isVisible) { - throw new Error('Not supported'); - } - return this.getViewLineContent(model, modelLineNumber, outputLineIndex).length + 1; - } - - public getViewLineData(model: IModel, modelLineNumber: number, outputLineIndex: number): ViewLineData { - if (!this._isVisible) { - throw new Error('Not supported'); - } - - let startOffset = this.getInputStartOffsetOfOutputLineIndex(outputLineIndex); - let endOffset = this.getInputEndOffsetOfOutputLineIndex(model, modelLineNumber, outputLineIndex); - - let lineContent = model.getLineContent(modelLineNumber).substring(startOffset, endOffset); - if (outputLineIndex > 0) { - lineContent = this.wrappedIndent + lineContent; - } - - let minColumn = (outputLineIndex > 0 ? this.wrappedIndentLength + 1 : 1); - let maxColumn = lineContent.length + 1; - - let deltaStartIndex = 0; - if (outputLineIndex > 0) { - deltaStartIndex = this.wrappedIndentLength; - } - let lineTokens = model.getLineTokens(modelLineNumber); - - return new ViewLineData( - lineContent, - minColumn, - maxColumn, - lineTokens.sliceAndInflate(startOffset, endOffset, deltaStartIndex) - ); - } - - public getViewLinesData(model: IModel, modelLineNumber: number, fromOuputLineIndex: number, toOutputLineIndex: number, globalStartIndex: number, needed: boolean[], result: ViewLineData[]): void { - if (!this._isVisible) { - throw new Error('Not supported'); - } - - for (let outputLineIndex = fromOuputLineIndex; outputLineIndex < toOutputLineIndex; outputLineIndex++) { - let globalIndex = globalStartIndex + outputLineIndex - fromOuputLineIndex; - if (!needed[globalIndex]) { - result[globalIndex] = null; - continue; - } - result[globalIndex] = this.getViewLineData(model, modelLineNumber, outputLineIndex); - } - } - - public getModelColumnOfViewPosition(outputLineIndex: number, outputColumn: number): number { - if (!this._isVisible) { - throw new Error('Not supported'); - } - let adjustedColumn = outputColumn - 1; - if (outputLineIndex > 0) { - if (adjustedColumn < this.wrappedIndentLength) { - adjustedColumn = 0; - } else { - adjustedColumn -= this.wrappedIndentLength; - } - } - return this.positionMapper.getInputOffsetOfOutputPosition(outputLineIndex, adjustedColumn) + 1; - } - - public getViewPositionOfModelPosition(deltaLineNumber: number, inputColumn: number): Position { - if (!this._isVisible) { - throw new Error('Not supported'); - } - let r = this.positionMapper.getOutputPositionOfInputOffset(inputColumn - 1); - let outputLineIndex = r.outputLineIndex; - let outputColumn = r.outputOffset + 1; - - if (outputLineIndex > 0) { - outputColumn += this.wrappedIndentLength; - } - - // console.log('in -> out ' + deltaLineNumber + ',' + inputColumn + ' ===> ' + (deltaLineNumber+outputLineIndex) + ',' + outputColumn); - return new Position(deltaLineNumber + outputLineIndex, outputColumn); - } -} - -function createSplitLine(linePositionMapperFactory: ILineMapperFactory, text: string, tabSize: number, wrappingColumn: number, columnsForFullWidthChar: number, wrappingIndent: WrappingIndent, isVisible: boolean): ISplitLine { - let positionMapper = linePositionMapperFactory.createLineMapping(text, tabSize, wrappingColumn, columnsForFullWidthChar, wrappingIndent); - if (positionMapper === null) { - // No mapping needed - if (isVisible) { - return VisibleIdentitySplitLine.INSTANCE; - } - return InvisibleIdentitySplitLine.INSTANCE; - } else { - return new SplitLine(positionMapper, isVisible); - } -} - export class SplitLinesCollection { private model: editorCommon.IModel; @@ -533,24 +256,15 @@ export class SplitLinesCollection { return true; } - public setWrappingIndent(eventsCollector: ViewEventsCollector, newWrappingIndent: WrappingIndent): boolean { - if (this.wrappingIndent === newWrappingIndent) { + public setWrappingSettings(eventsCollector: ViewEventsCollector, wrappingIndent: WrappingIndent, wrappingColumn: number, columnsForFullWidthChar: number): boolean { + if (this.wrappingIndent === wrappingIndent && this.wrappingColumn === wrappingColumn && this.columnsForFullWidthChar === columnsForFullWidthChar) { return false; } - this.wrappingIndent = newWrappingIndent; - this._constructLines(false); - eventsCollector.emit(new viewEvents.ViewFlushedEvent()); - - return true; - } - - public setWrappingColumn(eventsCollector: ViewEventsCollector, newWrappingColumn: number, columnsForFullWidthChar: number): boolean { - if (this.wrappingColumn === newWrappingColumn && this.columnsForFullWidthChar === columnsForFullWidthChar) { - return false; - } - this.wrappingColumn = newWrappingColumn; + this.wrappingIndent = wrappingIndent; + this.wrappingColumn = wrappingColumn; this.columnsForFullWidthChar = columnsForFullWidthChar; + this._constructLines(false); eventsCollector.emit(new viewEvents.ViewFlushedEvent()); @@ -857,3 +571,280 @@ export class SplitLinesCollection { return r; } } + +class VisibleIdentitySplitLine implements ISplitLine { + + public static INSTANCE = new VisibleIdentitySplitLine(); + + private constructor() { } + + public isVisible(): boolean { + return true; + } + + public setVisible(isVisible: boolean): ISplitLine { + if (isVisible) { + return this; + } + return InvisibleIdentitySplitLine.INSTANCE; + } + + public getViewLineCount(): number { + return 1; + } + + public getViewLineContent(model: IModel, modelLineNumber: number, outputLineIndex: number): string { + return model.getLineContent(modelLineNumber); + } + + public getViewLineMinColumn(model: IModel, modelLineNumber: number, outputLineIndex: number): number { + return model.getLineMinColumn(modelLineNumber); + } + + public getViewLineMaxColumn(model: IModel, modelLineNumber: number, outputLineIndex: number): number { + return model.getLineMaxColumn(modelLineNumber); + } + + public getViewLineData(model: IModel, modelLineNumber: number, outputLineIndex: number): ViewLineData { + let lineTokens = model.getLineTokens(modelLineNumber); + let lineContent = lineTokens.getLineContent(); + return new ViewLineData( + lineContent, + 1, + lineContent.length + 1, + lineTokens.inflate() + ); + } + + public getViewLinesData(model: IModel, modelLineNumber: number, fromOuputLineIndex: number, toOutputLineIndex: number, globalStartIndex: number, needed: boolean[], result: ViewLineData[]): void { + if (!needed[globalStartIndex]) { + result[globalStartIndex] = null; + return; + } + result[globalStartIndex] = this.getViewLineData(model, modelLineNumber, 0); + } + + public getModelColumnOfViewPosition(outputLineIndex: number, outputColumn: number): number { + return outputColumn; + } + + public getViewPositionOfModelPosition(deltaLineNumber: number, inputColumn: number): Position { + return new Position(deltaLineNumber, inputColumn); + } +} + +class InvisibleIdentitySplitLine implements ISplitLine { + + public static INSTANCE = new InvisibleIdentitySplitLine(); + + private constructor() { } + + public isVisible(): boolean { + return false; + } + + public setVisible(isVisible: boolean): ISplitLine { + if (!isVisible) { + return this; + } + return VisibleIdentitySplitLine.INSTANCE; + } + + public getViewLineCount(): number { + return 0; + } + + public getViewLineContent(model: IModel, modelLineNumber: number, outputLineIndex: number): string { + throw new Error('Not supported'); + } + + public getViewLineMinColumn(model: IModel, modelLineNumber: number, outputLineIndex: number): number { + throw new Error('Not supported'); + } + + public getViewLineMaxColumn(model: IModel, modelLineNumber: number, outputLineIndex: number): number { + throw new Error('Not supported'); + } + + public getViewLineData(model: IModel, modelLineNumber: number, outputLineIndex: number): ViewLineData { + throw new Error('Not supported'); + } + + public getViewLinesData(model: IModel, modelLineNumber: number, fromOuputLineIndex: number, toOutputLineIndex: number, globalStartIndex: number, needed: boolean[], result: ViewLineData[]): void { + throw new Error('Not supported'); + } + + public getModelColumnOfViewPosition(outputLineIndex: number, outputColumn: number): number { + throw new Error('Not supported'); + } + + public getViewPositionOfModelPosition(deltaLineNumber: number, inputColumn: number): Position { + throw new Error('Not supported'); + } +} + +export class SplitLine implements ISplitLine { + + private positionMapper: ILineMapping; + private outputLineCount: number; + + private wrappedIndent: string; + private wrappedIndentLength: number; + private _isVisible: boolean; + + constructor(positionMapper: ILineMapping, isVisible: boolean) { + this.positionMapper = positionMapper; + this.wrappedIndent = this.positionMapper.getWrappedLinesIndent(); + this.wrappedIndentLength = this.wrappedIndent.length; + this.outputLineCount = this.positionMapper.getOutputLineCount(); + this._isVisible = isVisible; + } + + public isVisible(): boolean { + return this._isVisible; + } + + public setVisible(isVisible: boolean): ISplitLine { + this._isVisible = isVisible; + return this; + } + + public getViewLineCount(): number { + if (!this._isVisible) { + return 0; + } + return this.outputLineCount; + } + + private getInputStartOffsetOfOutputLineIndex(outputLineIndex: number): number { + return this.positionMapper.getInputOffsetOfOutputPosition(outputLineIndex, 0); + } + + private getInputEndOffsetOfOutputLineIndex(model: IModel, modelLineNumber: number, outputLineIndex: number): number { + if (outputLineIndex + 1 === this.outputLineCount) { + return model.getLineMaxColumn(modelLineNumber) - 1; + } + return this.positionMapper.getInputOffsetOfOutputPosition(outputLineIndex + 1, 0); + } + + public getViewLineContent(model: IModel, modelLineNumber: number, outputLineIndex: number): string { + if (!this._isVisible) { + throw new Error('Not supported'); + } + let startOffset = this.getInputStartOffsetOfOutputLineIndex(outputLineIndex); + let endOffset = this.getInputEndOffsetOfOutputLineIndex(model, modelLineNumber, outputLineIndex); + let r = model.getLineContent(modelLineNumber).substring(startOffset, endOffset); + + if (outputLineIndex > 0) { + r = this.wrappedIndent + r; + } + + return r; + } + + public getViewLineMinColumn(model: IModel, modelLineNumber: number, outputLineIndex: number): number { + if (!this._isVisible) { + throw new Error('Not supported'); + } + if (outputLineIndex > 0) { + return this.wrappedIndentLength + 1; + } + return 1; + } + + public getViewLineMaxColumn(model: IModel, modelLineNumber: number, outputLineIndex: number): number { + if (!this._isVisible) { + throw new Error('Not supported'); + } + return this.getViewLineContent(model, modelLineNumber, outputLineIndex).length + 1; + } + + public getViewLineData(model: IModel, modelLineNumber: number, outputLineIndex: number): ViewLineData { + if (!this._isVisible) { + throw new Error('Not supported'); + } + + let startOffset = this.getInputStartOffsetOfOutputLineIndex(outputLineIndex); + let endOffset = this.getInputEndOffsetOfOutputLineIndex(model, modelLineNumber, outputLineIndex); + + let lineContent = model.getLineContent(modelLineNumber).substring(startOffset, endOffset); + if (outputLineIndex > 0) { + lineContent = this.wrappedIndent + lineContent; + } + + let minColumn = (outputLineIndex > 0 ? this.wrappedIndentLength + 1 : 1); + let maxColumn = lineContent.length + 1; + + let deltaStartIndex = 0; + if (outputLineIndex > 0) { + deltaStartIndex = this.wrappedIndentLength; + } + let lineTokens = model.getLineTokens(modelLineNumber); + + return new ViewLineData( + lineContent, + minColumn, + maxColumn, + lineTokens.sliceAndInflate(startOffset, endOffset, deltaStartIndex) + ); + } + + public getViewLinesData(model: IModel, modelLineNumber: number, fromOuputLineIndex: number, toOutputLineIndex: number, globalStartIndex: number, needed: boolean[], result: ViewLineData[]): void { + if (!this._isVisible) { + throw new Error('Not supported'); + } + + for (let outputLineIndex = fromOuputLineIndex; outputLineIndex < toOutputLineIndex; outputLineIndex++) { + let globalIndex = globalStartIndex + outputLineIndex - fromOuputLineIndex; + if (!needed[globalIndex]) { + result[globalIndex] = null; + continue; + } + result[globalIndex] = this.getViewLineData(model, modelLineNumber, outputLineIndex); + } + } + + public getModelColumnOfViewPosition(outputLineIndex: number, outputColumn: number): number { + if (!this._isVisible) { + throw new Error('Not supported'); + } + let adjustedColumn = outputColumn - 1; + if (outputLineIndex > 0) { + if (adjustedColumn < this.wrappedIndentLength) { + adjustedColumn = 0; + } else { + adjustedColumn -= this.wrappedIndentLength; + } + } + return this.positionMapper.getInputOffsetOfOutputPosition(outputLineIndex, adjustedColumn) + 1; + } + + public getViewPositionOfModelPosition(deltaLineNumber: number, inputColumn: number): Position { + if (!this._isVisible) { + throw new Error('Not supported'); + } + let r = this.positionMapper.getOutputPositionOfInputOffset(inputColumn - 1); + let outputLineIndex = r.outputLineIndex; + let outputColumn = r.outputOffset + 1; + + if (outputLineIndex > 0) { + outputColumn += this.wrappedIndentLength; + } + + // console.log('in -> out ' + deltaLineNumber + ',' + inputColumn + ' ===> ' + (deltaLineNumber+outputLineIndex) + ',' + outputColumn); + return new Position(deltaLineNumber + outputLineIndex, outputColumn); + } +} + +function createSplitLine(linePositionMapperFactory: ILineMapperFactory, text: string, tabSize: number, wrappingColumn: number, columnsForFullWidthChar: number, wrappingIndent: WrappingIndent, isVisible: boolean): ISplitLine { + let positionMapper = linePositionMapperFactory.createLineMapping(text, tabSize, wrappingColumn, columnsForFullWidthChar, wrappingIndent); + if (positionMapper === null) { + // No mapping needed + if (isVisible) { + return VisibleIdentitySplitLine.INSTANCE; + } + return InvisibleIdentitySplitLine.INSTANCE; + } else { + return new SplitLine(positionMapper, isVisible); + } +} diff --git a/src/vs/editor/common/viewModel/viewModelDecorations.ts b/src/vs/editor/common/viewModel/viewModelDecorations.ts index d129ee76612..2a5bbea8d82 100644 --- a/src/vs/editor/common/viewModel/viewModelDecorations.ts +++ b/src/vs/editor/common/viewModel/viewModelDecorations.ts @@ -41,7 +41,6 @@ export class ViewModelDecorations implements IDisposable { this.configuration = configuration; this._coordinatesConverter = coordinatesConverter; this._decorationsCache = Object.create(null); - this._clearCachedModelDecorationsResolver(); } diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 77521cdacc2..21f45c369e2 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -21,11 +21,10 @@ import * as viewEvents from 'vs/editor/common/view/viewEvents'; import * as errors from 'vs/base/common/errors'; import { MinimapTokensColorTracker } from 'vs/editor/common/view/minimapCharRenderer'; import * as textModelEvents from 'vs/editor/common/model/textModelEvents'; -import { WrappingIndent, IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; +import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; import { CursorEventType, ICursorPositionChangedEvent, VerticalRevealType, ICursorSelectionChangedEvent, ICursorRevealRangeEvent, CursorScrollRequest } from 'vs/editor/common/controller/cursorEvents'; import { Cursor } from 'vs/editor/common/controller/cursor'; - -const ConfigurationChanged = 'configurationChanged'; +import { CharacterHardWrappingLineMapperFactory } from "vs/editor/common/viewModel/characterHardWrappingLineMapper"; export class CoordinatesConverter implements ICoordinatesConverter { @@ -89,65 +88,75 @@ export class CoordinatesConverter implements ICoordinatesConverter { export class ViewModel extends Disposable implements IViewModel { - private readonly lines: SplitLinesCollection; private readonly editorId: number; private readonly configuration: editorCommon.IConfiguration; private readonly model: editorCommon.IModel; + private readonly lines: SplitLinesCollection; public readonly coordinatesConverter: ICoordinatesConverter; private readonly decorations: ViewModelDecorations; private readonly cursors: ViewModelCursors; private _isDisposing: boolean; - private _centeredViewLine: number; - private _listeners: IViewModelListener[]; - constructor(lines: SplitLinesCollection, editorId: number, configuration: editorCommon.IConfiguration, model: editorCommon.IModel) { + constructor(editorId: number, configuration: editorCommon.IConfiguration, model: editorCommon.IModel) { super(); - this.lines = lines; this.editorId = editorId; this.configuration = configuration; this.model = model; + + const conf = this.configuration.editor; + + let hardWrappingLineMapperFactory = new CharacterHardWrappingLineMapperFactory( + conf.wrappingInfo.wordWrapBreakBeforeCharacters, + conf.wrappingInfo.wordWrapBreakAfterCharacters, + conf.wrappingInfo.wordWrapBreakObtrusiveCharacters + ); + + this.lines = new SplitLinesCollection( + this.model, + hardWrappingLineMapperFactory, + this.model.getOptions().tabSize, + conf.wrappingInfo.wrappingColumn, + conf.fontInfo.typicalFullwidthCharacterWidth / conf.fontInfo.typicalHalfwidthCharacterWidth, + conf.wrappingInfo.wrappingIndent + ); + this.configuration.setMaxLineNumber(this.model.getLineCount()); this.coordinatesConverter = new CoordinatesConverter(this.lines); + this._isDisposing = false; this._centeredViewLine = -1; + this._listeners = []; this.decorations = new ViewModelDecorations(this.editorId, this.model, this.configuration, this.coordinatesConverter); - this.decorations.reset(); this.cursors = new ViewModelCursors(this.configuration, this.coordinatesConverter); - this._isDisposing = false; - - this._register(this.model.addBulkListener((events: EmitterEvent[]) => this.onEvents(events))); - this._register(this.configuration.onDidChange((e) => { - this.onEvents([new EmitterEvent(ConfigurationChanged, e)]); + this._register(this.model.addBulkListener((events: EmitterEvent[]) => { + if (this._isDisposing) { + // Disposing the lines might end up sending model decoration changed events + // ...we no longer care about them... + return; + } + let eventsCollector = new ViewEventsCollector(); + this._onModelEvents(eventsCollector, events); + this._emit(eventsCollector.finalize()); })); + + this._register(this.configuration.onDidChange((e) => { + const eventsCollector = new ViewEventsCollector(); + this._onConfigurationChanged(eventsCollector, e); + this._emit(eventsCollector.finalize()); + })); + this._register(MinimapTokensColorTracker.getInstance().onDidChange(() => { this._emit([new viewEvents.ViewTokensColorsChangedEvent()]); })); - - this._listeners = []; - } - - public setHiddenAreas(ranges: Range[]): void { - let eventsCollector = new ViewEventsCollector(); - this._setHiddenAreas(eventsCollector, ranges); - this._emit(eventsCollector.finalize()); - } - - private _setHiddenAreas(eventsCollector: ViewEventsCollector, ranges: Range[]): void { - let lineMappingChanged = this.lines.setHiddenAreas(eventsCollector, ranges); - if (lineMappingChanged) { - eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); - this.decorations.onLineMappingChanged(eventsCollector); - this.cursors.onLineMappingChanged(eventsCollector); - } } public dispose(): void { @@ -158,179 +167,108 @@ export class ViewModel extends Disposable implements IViewModel { super.dispose(); } - public addEventListener(listener: (events: viewEvents.ViewEvent[]) => void): IDisposable { - this._listeners.push(listener); - return { - dispose: () => { - let listeners = this._listeners; - for (let i = 0, len = listeners.length; i < len; i++) { - if (listeners[i] === listener) { - listeners.splice(i, 1); - break; - } - } - } - }; - } - private _emit(events: viewEvents.ViewEvent[]): void { - let listeners = this._listeners.slice(0); + const listeners = this._listeners.slice(0); for (let i = 0, len = listeners.length; i < len; i++) { safeInvokeListener(listeners[i], events); } } - private _onTabSizeChange(eventsCollector: ViewEventsCollector, newTabSize: number): boolean { - var lineMappingChanged = this.lines.setTabSize(eventsCollector, newTabSize); - if (lineMappingChanged) { - eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); - this.decorations.onLineMappingChanged(eventsCollector); - this.cursors.onLineMappingChanged(eventsCollector); - } - return lineMappingChanged; - } - - private _onWrappingIndentChange(eventsCollector: ViewEventsCollector, newWrappingIndent: WrappingIndent): boolean { - var lineMappingChanged = this.lines.setWrappingIndent(eventsCollector, newWrappingIndent); - if (lineMappingChanged) { - eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); - this.decorations.onLineMappingChanged(eventsCollector); - this.cursors.onLineMappingChanged(eventsCollector); - } - return lineMappingChanged; - } - - private _restoreCenteredModelRange(eventsCollector: ViewEventsCollector, range: Range): void { - // modelLine -> viewLine - var newCenteredViewRange = this.coordinatesConverter.convertModelRangeToViewRange(range); - - // Send a reveal event to restore the centered content - eventsCollector.emit(new viewEvents.ViewRevealRangeRequestEvent( - newCenteredViewRange, - VerticalRevealType.Center, - false - )); - } - - private _onWrappingColumnChange(eventsCollector: ViewEventsCollector, newWrappingColumn: number, columnsForFullWidthChar: number): boolean { - let lineMappingChanged = this.lines.setWrappingColumn(eventsCollector, newWrappingColumn, columnsForFullWidthChar); - if (lineMappingChanged) { - eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); - this.decorations.onLineMappingChanged(eventsCollector); - this.cursors.onLineMappingChanged(eventsCollector); - } - return lineMappingChanged; - } - public addEventSource(cursor: Cursor): void { this._register(cursor.addBulkListener((events: EmitterEvent[]) => { const eventsCollector = new ViewEventsCollector(); - - for (let i = 0, len = events.length; i < len; i++) { - const _e = events[i]; - const type = _e.type; - const data = _e.data; - - switch (type) { - case CursorEventType.CursorPositionChanged: { - const e = data; - this.cursors.onCursorPositionChanged(eventsCollector, e); - break; - } - case CursorEventType.CursorSelectionChanged: { - const e = data; - this.cursors.onCursorSelectionChanged(eventsCollector, e); - break; - } - case CursorEventType.CursorRevealRange: { - const e = data; - this.cursors.onCursorRevealRange(eventsCollector, e); - break; - } - case CursorEventType.CursorScrollRequest: { - const e = data; - this.cursors.onCursorScrollRequest(eventsCollector, e); - break; - } - default: - console.info('View received unknown event: '); - console.info(type, data); - } - } - + this._onCursorEvents(eventsCollector, events); this._emit(eventsCollector.finalize()); })); } - private onEvents(events: EmitterEvent[]): void { - if (this._isDisposing) { - // Disposing the lines might end up sending model decoration changed events - // We no longer care about them... - return; + private _onCursorEvents(eventsCollector: ViewEventsCollector, events: EmitterEvent[]): void { + for (let i = 0, len = events.length; i < len; i++) { + const _e = events[i]; + const type = _e.type; + const data = _e.data; + + switch (type) { + case CursorEventType.CursorPositionChanged: { + const e = data; + this.cursors.onCursorPositionChanged(eventsCollector, e); + break; + } + case CursorEventType.CursorSelectionChanged: { + const e = data; + this.cursors.onCursorSelectionChanged(eventsCollector, e); + break; + } + case CursorEventType.CursorRevealRange: { + const e = data; + this.cursors.onCursorRevealRange(eventsCollector, e); + break; + } + case CursorEventType.CursorScrollRequest: { + const e = data; + this.cursors.onCursorScrollRequest(eventsCollector, e); + break; + } + default: + console.info('View received unknown event: '); + console.info(type, data); + } } - let eventsCollector = new ViewEventsCollector(); - this._onEvents(eventsCollector, events); - this._emit(eventsCollector.finalize()); } - private static _containsModelContentChangeEvent(events: EmitterEvent[]): boolean { + private _onConfigurationChanged(eventsCollector: ViewEventsCollector, e: IConfigurationChangedEvent): void { + + // We might need to restore the current centered view range, so save it (if available) + const previousCenteredModelRange = this.getCenteredRangeInViewport(); + let revealPreviousCenteredModelRange = false; + + const conf = this.configuration.editor; + + if (this.lines.setWrappingSettings(eventsCollector, conf.wrappingInfo.wrappingIndent, conf.wrappingInfo.wrappingColumn, conf.fontInfo.typicalFullwidthCharacterWidth / conf.fontInfo.typicalHalfwidthCharacterWidth)) { + eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); + this.decorations.onLineMappingChanged(eventsCollector); + this.cursors.onLineMappingChanged(eventsCollector); + revealPreviousCenteredModelRange = true; + } + + if (e.readOnly) { + // Must read again all decorations due to readOnly filtering + this.decorations.reset(); + eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent()); + } + + eventsCollector.emit(new viewEvents.ViewConfigurationChangedEvent(e)); + + if (revealPreviousCenteredModelRange && previousCenteredModelRange) { + // modelLine -> viewLine + const newCenteredViewRange = this.coordinatesConverter.convertModelRangeToViewRange(previousCenteredModelRange); + + // Send a reveal event to restore the centered content + eventsCollector.emit(new viewEvents.ViewRevealRangeRequestEvent( + newCenteredViewRange, + VerticalRevealType.Center, + false + )); + } + } + + private _onModelEvents(eventsCollector: ViewEventsCollector, events: EmitterEvent[]): void { + + // A quick check if there are model content change events incoming + // in order to update the configuration and reset the centered view line for (let i = 0, len = events.length; i < len; i++) { - let eventType = events[i].type; + const eventType = events[i].type; if (eventType === textModelEvents.TextModelEventType.ModelRawContentChanged2) { - return true; + // There is a content change event + this._centeredViewLine = -1; + this.configuration.setMaxLineNumber(this.model.getLineCount()); + + break; } } - return false; - } - - private static _containsWrappingRelatedEvents(events: EmitterEvent[]): boolean { - for (let i = 0, len = events.length; i < len; i++) { - let eventType = events[i].type; - if (eventType === textModelEvents.TextModelEventType.ModelOptionsChanged) { - return true; - } - if (eventType === ConfigurationChanged) { - return true; - } - } - return false; - } - - public getCenteredRangeInViewport(): Range { - if (this._centeredViewLine === -1) { - // Never got rendered or not rendered since last content change event - return null; - } - let viewLineNumber = this._centeredViewLine; - let currentCenteredViewRange = new Range(viewLineNumber, this.getLineMinColumn(viewLineNumber), viewLineNumber, this.getLineMaxColumn(viewLineNumber)); - return this.coordinatesConverter.convertViewRangeToModelRange(currentCenteredViewRange); - } - - private _onEvents(eventsCollector: ViewEventsCollector, events: EmitterEvent[]): void { - - const containsModelContentChangeEvent = ViewModel._containsModelContentChangeEvent(events); - if (containsModelContentChangeEvent) { - this._centeredViewLine = -1; - this.configuration.setMaxLineNumber(this.model.getLineCount()); - } - - // We might need to restore the current centered view range in the following circumstances: - // All of these changes might lead to a new line mapping: - // (a) model tabSize changed - // (b) wrappingIndent changed - // (c) wrappingColumn changed - // (d) fontInfo changed - // However, we cannot restore the current centered line if the model has changed its content - // because we cannot convert the view range to a model range. - - let previousCenteredModelRange: Range = null; - if (!containsModelContentChangeEvent && ViewModel._containsWrappingRelatedEvents(events)) { - previousCenteredModelRange = this.getCenteredRangeInViewport(); - } let hadOtherModelChange = false; let hadModelLineChangeThatChangedLineMapping = false; - let revealPreviousCenteredModelRange = false; for (let i = 0, len = events.length; i < len; i++) { const _e = events[i]; @@ -399,11 +337,10 @@ export class ViewModel extends Disposable implements IViewModel { } case textModelEvents.TextModelEventType.ModelOptionsChanged: { // A tab size change causes a line mapping changed event => all view parts will repaint OK, no further event needed here - let prevLineCount = this.lines.getViewLineCount(); - let tabSizeChanged = this._onTabSizeChange(eventsCollector, this.model.getOptions().tabSize); - let newLineCount = this.lines.getViewLineCount(); - if (tabSizeChanged && prevLineCount !== newLineCount) { - revealPreviousCenteredModelRange = true; + if (this.lines.setTabSize(eventsCollector, this.model.getOptions().tabSize)) { + eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); + this.decorations.onLineMappingChanged(eventsCollector); + this.cursors.onLineMappingChanged(eventsCollector); } break; @@ -417,19 +354,6 @@ export class ViewModel extends Disposable implements IViewModel { // Ignore, since the editor will take care of this and destroy the view shortly break; } - case ConfigurationChanged: { - const e = data; - revealPreviousCenteredModelRange = this._onWrappingIndentChange(eventsCollector, this.configuration.editor.wrappingInfo.wrappingIndent) || revealPreviousCenteredModelRange; - revealPreviousCenteredModelRange = this._onWrappingColumnChange(eventsCollector, this.configuration.editor.wrappingInfo.wrappingColumn, this.configuration.editor.fontInfo.typicalFullwidthCharacterWidth / this.configuration.editor.fontInfo.typicalHalfwidthCharacterWidth) || revealPreviousCenteredModelRange; - - if (e.readOnly) { - // Must read again all decorations due to readOnly filtering - this.decorations.reset(); - eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent()); - } - eventsCollector.emit(new viewEvents.ViewConfigurationChangedEvent(e)); - break; - } default: console.info('View received unknown event: '); console.info(type, data); @@ -441,10 +365,42 @@ export class ViewModel extends Disposable implements IViewModel { this.decorations.onLineMappingChanged(eventsCollector); this.cursors.onLineMappingChanged(eventsCollector); } + } - if (revealPreviousCenteredModelRange && previousCenteredModelRange) { - this._restoreCenteredModelRange(eventsCollector, previousCenteredModelRange); + public setHiddenAreas(ranges: Range[]): void { + let eventsCollector = new ViewEventsCollector(); + let lineMappingChanged = this.lines.setHiddenAreas(eventsCollector, ranges); + if (lineMappingChanged) { + eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); + this.decorations.onLineMappingChanged(eventsCollector); + this.cursors.onLineMappingChanged(eventsCollector); } + this._emit(eventsCollector.finalize()); + } + + public addEventListener(listener: (events: viewEvents.ViewEvent[]) => void): IDisposable { + this._listeners.push(listener); + return { + dispose: () => { + let listeners = this._listeners; + for (let i = 0, len = listeners.length; i < len; i++) { + if (listeners[i] === listener) { + listeners.splice(i, 1); + break; + } + } + } + }; + } + + public getCenteredRangeInViewport(): Range { + if (this._centeredViewLine === -1) { + // Never got rendered or not rendered since last content change event + return null; + } + let viewLineNumber = this._centeredViewLine; + let currentCenteredViewRange = new Range(viewLineNumber, this.getLineMinColumn(viewLineNumber), viewLineNumber, this.getLineMaxColumn(viewLineNumber)); + return this.coordinatesConverter.convertViewRangeToModelRange(currentCenteredViewRange); } public getTabSize(): number { diff --git a/src/vs/editor/test/common/viewModel/testViewModel.ts b/src/vs/editor/test/common/viewModel/testViewModel.ts index 7c1e6ed9a77..a041d80037a 100644 --- a/src/vs/editor/test/common/viewModel/testViewModel.ts +++ b/src/vs/editor/test/common/viewModel/testViewModel.ts @@ -5,9 +5,7 @@ 'use strict'; import { Model } from 'vs/editor/common/model/model'; -import { CharacterHardWrappingLineMapperFactory } from 'vs/editor/common/viewModel/characterHardWrappingLineMapper'; import { TestConfiguration } from 'vs/editor/test/common/mocks/testConfiguration'; -import { SplitLinesCollection } from 'vs/editor/common/viewModel/splitLinesCollection'; import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl'; import { MockCodeEditorCreationOptions } from 'vs/editor/test/common/mocks/mockCodeEditor'; @@ -18,27 +16,7 @@ export function testViewModel(text: string[], options: MockCodeEditorCreationOpt let model = Model.createFromString(text.join('\n')); - let factory = new CharacterHardWrappingLineMapperFactory( - configuration.editor.wrappingInfo.wordWrapBreakBeforeCharacters, - configuration.editor.wrappingInfo.wordWrapBreakAfterCharacters, - configuration.editor.wrappingInfo.wordWrapBreakObtrusiveCharacters - ); - - let linesCollection = new SplitLinesCollection( - model, - factory, - model.getOptions().tabSize, - configuration.editor.wrappingInfo.wrappingColumn, - configuration.editor.fontInfo.typicalFullwidthCharacterWidth / configuration.editor.fontInfo.typicalHalfwidthCharacterWidth, - configuration.editor.wrappingInfo.wrappingIndent - ); - - let viewModel = new ViewModel( - linesCollection, - EDITOR_ID, - configuration, - model - ); + let viewModel = new ViewModel(EDITOR_ID, configuration, model); callback(viewModel, model); From b81f7485aaded55c1d05212aeeb63b1a13c115b5 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 9 May 2017 17:56:23 +0200 Subject: [PATCH 0240/1164] add overwrite[Before|After] to SnippetSession --- .../contrib/snippet/browser/editorSnippets.ts | 30 ++++++++++++++++--- .../snippet/browser/snippetController2.ts | 2 +- .../test/browser/editorSnippets.test.ts | 14 +++++++++ 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index e126e1fea75..efaba9a24c5 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -166,13 +166,34 @@ export class SnippetSession { return templateLines.join(model.getEOL()); } + static adjustRange(model: IModel, range: Range, overwriteBefore: number, overwriteAfter: number): Range { + if (overwriteBefore !== 0 || overwriteAfter !== 0) { + let { startLineNumber, startColumn, endLineNumber, endColumn } = range; + startColumn -= overwriteBefore; + endColumn += overwriteAfter; + + range = Range.plusRange(range, { + startLineNumber, + startColumn, + endLineNumber, + endColumn, + }); + range = model.validateRange(range); + } + return range; + } + private readonly _editor: ICommonCodeEditor; private readonly _template: string; + private readonly _overwriteBefore: number; + private readonly _overwriteAfter: number; private readonly _snippets: OneSnippet[]; - constructor(editor: ICommonCodeEditor, template: string) { + constructor(editor: ICommonCodeEditor, template: string, overwriteBefore: number = 0, overwriteAfter: number = 0) { this._editor = editor; this._template = template; + this._overwriteBefore = overwriteBefore; + this._overwriteAfter = overwriteAfter; this._snippets = []; } @@ -186,16 +207,17 @@ export class SnippetSession { let model = this._editor.getModel(); for (const selection of this._editor.getSelections()) { - const start = selection.getStartPosition(); + const range = SnippetSession.adjustRange(model, selection, this._overwriteBefore, this._overwriteAfter); + const start = range.getStartPosition(); const adjustedTemplate = SnippetSession.normalizeWhitespace(model, start, this._template); const snippet = SnippetParser.parse(adjustedTemplate); const offset = model.getOffsetAt(start) + delta; - edits.push(EditOperation.replaceMove(selection, snippet.text)); + edits.push(EditOperation.replaceMove(range, snippet.text)); this._snippets.push(new OneSnippet(this._editor, snippet, offset)); - delta += snippet.text.length - model.getValueLengthInRange(selection); + delta += snippet.text.length - model.getValueLengthInRange(range); } // make insert edit and start with first selections diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 7e9eaae9e10..84ce4e1e637 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -45,7 +45,7 @@ export class SnippetController2 { } insert(template: string, overwriteBefore: number = 0, overwriteAfter: number = 0): void { - const session = new SnippetSession(this._editor, template); + const session = new SnippetSession(this._editor, template, overwriteBefore, overwriteAfter); const newLen = this._snippetStack.unshift(session); if (newLen === 1) { this._inSnippet.set(true); diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts index 9e6ea7b1b23..0da0cbbf467 100644 --- a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts @@ -6,6 +6,7 @@ import * as assert from 'assert'; import { Selection } from 'vs/editor/common/core/selection'; +import { Range } from 'vs/editor/common/core/range'; import { IPosition, Position } from 'vs/editor/common/core/position'; import { SnippetSession } from 'vs/editor/contrib/snippet/browser/editorSnippets'; import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; @@ -51,6 +52,19 @@ suite('SnippetSession', function () { assertNormalized(new Position(2, 3), 'foo\r\tbar', 'foo\n bar'); }); + test('adjust selection (overwrite[Before|After]', function () { + + let range = SnippetSession.adjustRange(model, new Range(1, 2, 1, 2), 1, 0); + assert.ok(range.equalsRange(new Range(1, 1, 1, 2))); + range = SnippetSession.adjustRange(model, new Range(1, 2, 1, 2), 1111, 0); + assert.ok(range.equalsRange(new Range(1, 1, 1, 2))); + range = SnippetSession.adjustRange(model, new Range(1, 2, 1, 2), 0, 10); + assert.ok(range.equalsRange(new Range(1, 2, 1, 12))); + range = SnippetSession.adjustRange(model, new Range(1, 2, 1, 2), 0, 10111); + assert.ok(range.equalsRange(new Range(1, 2, 1, 17))); + + }); + test('text edits & selection', function () { const session = new SnippetSession(editor, 'foo${1:bar}foo$0'); session.insert(); From 0dc762612fdd774195c51ad89609c241480cb6e6 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Tue, 9 May 2017 18:05:53 +0200 Subject: [PATCH 0241/1164] node-debug@1.13.2 --- build/gulpfile.vscode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 3214a86b15d..c4227104532 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -41,7 +41,7 @@ const nodeModules = ['electron', 'original-fs'] // Build const builtInExtensions = [ - { name: 'ms-vscode.node-debug', version: '1.13.1' }, + { name: 'ms-vscode.node-debug', version: '1.13.2' }, { name: 'ms-vscode.node-debug2', version: '1.12.4' } ]; From 4e3702fe9adb7c3dea0930961bf1a590a79b288e Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 9 May 2017 09:08:52 -0700 Subject: [PATCH 0242/1164] Don't allow terminal to overflow to the right of the panel Fixes #26238 --- .../parts/terminal/electron-browser/media/terminal.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css index 67fe62305c8..bbd66f6978d 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css +++ b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css @@ -18,8 +18,9 @@ .monaco-workbench .panel.integrated-terminal .terminal-outer-container { height: 100%; - padding: 0 20px; + padding-left: 20px; /*Don't use right padding in case xterm.js misbehaves*/ width: 100%; + box-sizing: border-box; } .monaco-workbench .panel.integrated-terminal .terminal-wrapper { From 0f102b9577dd1b8b9c1442d40c4cb4bd5903ce15 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 9 May 2017 18:21:11 +0200 Subject: [PATCH 0243/1164] Code Folding won't be remembered after latest update. (fixes #26157) (#26319) --- .../browser/parts/editor/textEditor.ts | 2 +- src/vs/workbench/common/editor.ts | 2 + .../common/editor/editorStacksModel.ts | 9 ++++- .../files/browser/editors/textFileEditor.ts | 29 +++++++++----- .../test/browser/editorStacksModel.test.ts | 38 ++++++++++++++++++- 5 files changed, 66 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/textEditor.ts b/src/vs/workbench/browser/parts/editor/textEditor.ts index d0f89123f6a..18033e72569 100644 --- a/src/vs/workbench/browser/parts/editor/textEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textEditor.ts @@ -61,7 +61,7 @@ export abstract class BaseTextEditor extends BaseEditor { @IWorkbenchThemeService protected themeService: IWorkbenchThemeService, @IModeService private modeService: IModeService, @ITextFileService private textFileService: ITextFileService, - @IEditorGroupService private editorGroupService: IEditorGroupService + @IEditorGroupService protected editorGroupService: IEditorGroupService ) { super(id, telemetryService, themeService); diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index c89cfe4455b..c4013c04cad 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -844,6 +844,8 @@ export interface IStacksModelChangeEvent { export interface IEditorStacksModel { onModelChanged: Event; + + onWillCloseEditor: Event; onEditorClosed: Event; groups: IEditorGroup[]; diff --git a/src/vs/workbench/common/editor/editorStacksModel.ts b/src/vs/workbench/common/editor/editorStacksModel.ts index 00e7d3722c2..a81bd7a2fb1 100644 --- a/src/vs/workbench/common/editor/editorStacksModel.ts +++ b/src/vs/workbench/common/editor/editorStacksModel.ts @@ -703,6 +703,7 @@ export class EditorStacksModel implements IEditorStacksModel { private _onEditorDirty: Emitter; private _onEditorLabelChange: Emitter; private _onEditorOpened: Emitter; + private _onWillCloseEditor: Emitter; private _onEditorClosed: Emitter; private _onModelChanged: Emitter; @@ -728,9 +729,10 @@ export class EditorStacksModel implements IEditorStacksModel { this._onEditorDirty = new Emitter(); this._onEditorLabelChange = new Emitter(); this._onEditorOpened = new Emitter(); + this._onWillCloseEditor = new Emitter(); this._onEditorClosed = new Emitter(); - this.toDispose.push(this._onGroupOpened, this._onGroupClosed, this._onGroupActivated, this._onGroupDeactivated, this._onGroupMoved, this._onGroupRenamed, this._onModelChanged, this._onEditorDisposed, this._onEditorDirty, this._onEditorLabelChange, this._onEditorClosed); + this.toDispose.push(this._onGroupOpened, this._onGroupClosed, this._onGroupActivated, this._onGroupDeactivated, this._onGroupMoved, this._onGroupRenamed, this._onModelChanged, this._onEditorDisposed, this._onEditorDirty, this._onEditorLabelChange, this._onEditorClosed, this._onWillCloseEditor); this.registerListeners(); } @@ -783,6 +785,10 @@ export class EditorStacksModel implements IEditorStacksModel { return this._onEditorOpened.event; } + public get onWillCloseEditor(): Event { + return this._onWillCloseEditor.event; + } + public get onEditorClosed(): Event { return this._onEditorClosed.event; } @@ -1155,6 +1161,7 @@ export class EditorStacksModel implements IEditorStacksModel { unbind.push(group.onEditorStateChanged(editor => this._onModelChanged.fire({ group, editor }))); unbind.push(group.onEditorOpened(editor => this._onEditorOpened.fire({ editor, group }))); unbind.push(group.onEditorClosed(event => { + this._onWillCloseEditor.fire({ editor: event.editor, group }); this.handleOnEditorClosed(event); this._onEditorClosed.fire(event); })); diff --git a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts b/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts index ec7f682e99c..c624ee237af 100644 --- a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts +++ b/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts @@ -14,7 +14,7 @@ import { Action } from 'vs/base/common/actions'; import { VIEWLET_ID, TEXT_FILE_EDITOR_ID } from 'vs/workbench/parts/files/common/files'; import { ITextFileEditorModel, ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { BaseTextEditor } from 'vs/workbench/browser/parts/editor/textEditor'; -import { EditorOptions, TextEditorOptions } from 'vs/workbench/common/editor'; +import { EditorOptions, TextEditorOptions, IEditorIdentifier } from 'vs/workbench/common/editor'; import { BinaryEditorModel } from 'vs/workbench/common/editor/binaryEditorModel'; import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; import { ExplorerViewlet } from 'vs/workbench/parts/files/browser/explorerViewlet'; @@ -58,6 +58,9 @@ export class TextFileEditor extends BaseTextEditor { // Clear view state for deleted files this.toUnbind.push(this.fileService.onFileChanges(e => this.onFilesChanged(e))); + + // React to editors closing to preserve view state + this.toUnbind.push(editorGroupService.getStacksModel().onWillCloseEditor(e => this.onWillCloseEditor(e))); } private onFilesChanged(e: FileChangesEvent): void { @@ -67,6 +70,12 @@ export class TextFileEditor extends BaseTextEditor { } } + private onWillCloseEditor(e: IEditorIdentifier): void { + if (e.editor === this.input && this.position === this.editorGroupService.getStacksModel().positionOfGroup(e.group)) { + this.doSaveTextEditorViewState(this.input); + } + } + public getTitle(): string { return this.input ? this.input.getName() : nls.localize('textFileEditor', "Text File Editor"); } @@ -104,9 +113,7 @@ export class TextFileEditor extends BaseTextEditor { } // Remember view settings if input changes - if (oldInput) { - this.saveTextEditorViewState(oldInput.getResource().toString()); - } + this.doSaveTextEditorViewState(oldInput); // Different Input (Reload) return input.resolve(true).then(resolvedModel => { @@ -224,9 +231,7 @@ export class TextFileEditor extends BaseTextEditor { public clearInput(): void { // Keep editor view state in settings to restore when coming back - if (this.input) { - this.saveTextEditorViewState(this.input.getResource().toString()); - } + this.doSaveTextEditorViewState(this.input); // Clear Model this.getControl().setModel(null); @@ -238,11 +243,15 @@ export class TextFileEditor extends BaseTextEditor { public shutdown(): void { // Save View State - if (this.input) { - this.saveTextEditorViewState(this.input.getResource().toString()); - } + this.doSaveTextEditorViewState(this.input); // Call Super super.shutdown(); } + + private doSaveTextEditorViewState(input: FileEditorInput): void { + if (input && !input.isDisposed()) { + this.saveTextEditorViewState(input.getResource().toString()); + } + } } \ No newline at end of file diff --git a/src/vs/workbench/test/browser/editorStacksModel.test.ts b/src/vs/workbench/test/browser/editorStacksModel.test.ts index 9cc08d0d963..0593fc06d54 100644 --- a/src/vs/workbench/test/browser/editorStacksModel.test.ts +++ b/src/vs/workbench/test/browser/editorStacksModel.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { EditorStacksModel, EditorGroup, GroupEvent } from 'vs/workbench/common/editor/editorStacksModel'; -import { EditorInput, IFileEditorInput, IEditorIdentifier, IEditorGroup, IStacksModelChangeEvent, IEditorRegistry, Extensions as EditorExtensions, IEditorInputFactory } from 'vs/workbench/common/editor'; +import { EditorInput, IFileEditorInput, IEditorIdentifier, IEditorGroup, IStacksModelChangeEvent, IEditorRegistry, Extensions as EditorExtensions, IEditorInputFactory, IGroupEvent } from 'vs/workbench/common/editor'; import URI from 'vs/base/common/uri'; import { TestStorageService, TestLifecycleService, TestContextService } from 'vs/workbench/test/workbenchTestServices'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; @@ -47,6 +47,8 @@ interface ModelEvents { renamed: IEditorGroup[]; disposed: IEditorIdentifier[]; changed: IStacksModelChangeEvent[]; + editorClosed: IGroupEvent[]; + editorWillClose: IEditorIdentifier[]; } interface GroupEvents { @@ -66,7 +68,9 @@ function modelListener(model: EditorStacksModel): ModelEvents { moved: [], renamed: [], disposed: [], - changed: [] + changed: [], + editorClosed: [], + editorWillClose: [] }; model.onGroupOpened(g => modelEvents.opened.push(g)); @@ -76,6 +80,8 @@ function modelListener(model: EditorStacksModel): ModelEvents { model.onGroupRenamed(g => modelEvents.renamed.push(g)); model.onEditorDisposed(e => modelEvents.disposed.push(e)); model.onModelChanged(e => modelEvents.changed.push(e)); + model.onWillCloseEditor(e => modelEvents.editorWillClose.push(e)); + model.onEditorClosed(e => modelEvents.editorClosed.push(e)); return modelEvents; } @@ -1671,6 +1677,7 @@ suite('Editor Stacks Model', () => { test('Stack - Multiple Editors - Editor Disposed on Close', function () { const model = create(); + const events = modelListener(model); const group1 = model.openGroup('group1'); const group2 = model.openGroup('group2'); @@ -1687,6 +1694,13 @@ suite('Editor Stacks Model', () => { group1.closeEditor(input3); + assert.equal(events.editorClosed.length, 1); + assert.equal(events.editorClosed[0].editor, input3); + + assert.equal(events.editorWillClose.length, 1); + assert.equal(events.editorWillClose[0].editor, input3); + assert.equal(events.editorWillClose[0].group, group1); + assert.equal(input3.isDisposed(), true); group2.openEditor(input2, { pinned: true, active: true }); @@ -1695,18 +1709,38 @@ suite('Editor Stacks Model', () => { group1.closeEditor(input2); + assert.equal(events.editorClosed.length, 2); + assert.equal(events.editorClosed[1].editor, input2); + + assert.equal(events.editorWillClose.length, 2); + assert.equal(events.editorWillClose[1].editor, input2); + assert.equal(events.editorWillClose[1].group, group1); + assert.equal(input2.isDisposed(), false); group2.closeEditor(input2); + assert.equal(events.editorClosed.length, 3); + assert.equal(events.editorClosed[2].editor, input2); + + assert.equal(events.editorWillClose.length, 3); + assert.equal(events.editorWillClose[2].editor, input2); + assert.equal(events.editorWillClose[2].group, group2); + assert.equal(input2.isDisposed(), true); group1.closeAllEditors(); + assert.equal(events.editorClosed.length, 5); + assert.equal(events.editorWillClose.length, 5); + assert.equal(input4.isDisposed(), false); model.closeGroups(); + assert.equal(events.editorClosed.length, 7); + assert.equal(events.editorWillClose.length, 7); + assert.equal(input4.isDisposed(), true); }); From c94789c509a8d85400d3d94bc70c8456af1b0a09 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 9 May 2017 11:17:16 -0700 Subject: [PATCH 0244/1164] Add Filename to JS/TS Workspace Symbol Search Fixes #22357 Adds file name to the workspace symbol results for JS and TS --- .../src/features/workspaceSymbolProvider.ts | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/extensions/typescript/src/features/workspaceSymbolProvider.ts b/extensions/typescript/src/features/workspaceSymbolProvider.ts index 625c2d1c4ba..ccc115752af 100644 --- a/extensions/typescript/src/features/workspaceSymbolProvider.ts +++ b/extensions/typescript/src/features/workspaceSymbolProvider.ts @@ -7,6 +7,8 @@ import { workspace, window, Uri, WorkspaceSymbolProvider, SymbolInformation, SymbolKind, Range, Location, CancellationToken } from 'vscode'; +import * as path from 'path'; + import * as Proto from '../protocol'; import { ITypescriptServiceClient } from '../typescriptService'; @@ -28,7 +30,7 @@ export default class TypeScriptWorkspaceSymbolProvider implements WorkspaceSymbo // general questions so we check the active editor. If this // doesn't match we take the first TS document. let uri: Uri | undefined = undefined; - let editor = window.activeTextEditor; + const editor = window.activeTextEditor; if (editor) { let document = editor.document; if (document && document.languageId === this.modeId) { @@ -53,34 +55,39 @@ export default class TypeScriptWorkspaceSymbolProvider implements WorkspaceSymbo if (!filepath) { return Promise.resolve([]); } - let args: Proto.NavtoRequestArgs = { + const args: Proto.NavtoRequestArgs = { file: filepath, searchValue: search }; - if (!args.file) { - return Promise.resolve([]); - } return this.client.execute('navto', args, token).then((response): SymbolInformation[] => { let data = response.body; if (data) { - let result: SymbolInformation[] = []; + const result: SymbolInformation[] = []; for (let item of data) { if (!item.containerName && item.kind === 'alias') { continue; } - let range = new Range(item.start.line - 1, item.start.offset - 1, item.end.line - 1, item.end.offset - 1); + const range = new Range(item.start.line - 1, item.start.offset - 1, item.end.line - 1, item.end.offset - 1); let label = item.name; if (item.kind === 'method' || item.kind === 'function') { label += '()'; } - result.push(new SymbolInformation(label, _kindMapping[item.kind], item.containerName ? item.containerName : '', - new Location(this.client.asUrl(item.file), range))); + const containerNameParts: string[] = []; + if (item.containerName) { + containerNameParts.push(item.containerName); + } + const fileUri = this.client.asUrl(item.file); + const fileName = path.basename(fileUri.fsPath); + if (fileName) { + containerNameParts.push(fileName); + } + result.push(new SymbolInformation(label, _kindMapping[item.kind], containerNameParts.join(' — '), + new Location(fileUri, range))); } return result; } else { return []; } - }, (err) => { this.client.error(`'navto' request failed with error.`, err); return []; From e2d6ff6181a37c32c39df2c596f32d91a6b273d9 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 9 May 2017 11:43:21 -0700 Subject: [PATCH 0245/1164] =?UTF-8?q?=F0=9F=92=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/features/workspaceSymbolProvider.ts | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/extensions/typescript/src/features/workspaceSymbolProvider.ts b/extensions/typescript/src/features/workspaceSymbolProvider.ts index ccc115752af..c8a192726e7 100644 --- a/extensions/typescript/src/features/workspaceSymbolProvider.ts +++ b/extensions/typescript/src/features/workspaceSymbolProvider.ts @@ -12,13 +12,17 @@ import * as path from 'path'; import * as Proto from '../protocol'; import { ITypescriptServiceClient } from '../typescriptService'; -const _kindMapping: { [kind: string]: SymbolKind } = Object.create(null); -_kindMapping['method'] = SymbolKind.Method; -_kindMapping['enum'] = SymbolKind.Enum; -_kindMapping['function'] = SymbolKind.Function; -_kindMapping['class'] = SymbolKind.Class; -_kindMapping['interface'] = SymbolKind.Interface; -_kindMapping['var'] = SymbolKind.Variable; +function getSymbolKind(item: Proto.NavtoItem): SymbolKind { + switch (item.kind) { + case 'method': return SymbolKind.Method; + case 'enum': return SymbolKind.Enum; + case 'function': return SymbolKind.Function; + case 'class': return SymbolKind.Class; + case 'interface': return SymbolKind.Interface; + case 'var': return SymbolKind.Variable; + default: return SymbolKind.Variable; + } +} export default class TypeScriptWorkspaceSymbolProvider implements WorkspaceSymbolProvider { public constructor( @@ -32,14 +36,14 @@ export default class TypeScriptWorkspaceSymbolProvider implements WorkspaceSymbo let uri: Uri | undefined = undefined; const editor = window.activeTextEditor; if (editor) { - let document = editor.document; + const document = editor.document; if (document && document.languageId === this.modeId) { uri = document.uri; } } if (!uri) { - let documents = workspace.textDocuments; - for (let document of documents) { + const documents = workspace.textDocuments; + for (const document of documents) { if (document.languageId === this.modeId) { uri = document.uri; break; @@ -60,9 +64,9 @@ export default class TypeScriptWorkspaceSymbolProvider implements WorkspaceSymbo searchValue: search }; return this.client.execute('navto', args, token).then((response): SymbolInformation[] => { + const result: SymbolInformation[] = []; let data = response.body; if (data) { - const result: SymbolInformation[] = []; for (let item of data) { if (!item.containerName && item.kind === 'alias') { continue; @@ -81,13 +85,11 @@ export default class TypeScriptWorkspaceSymbolProvider implements WorkspaceSymbo if (fileName) { containerNameParts.push(fileName); } - result.push(new SymbolInformation(label, _kindMapping[item.kind], containerNameParts.join(' — '), + result.push(new SymbolInformation(label, getSymbolKind(item), containerNameParts.join(' — '), new Location(fileUri, range))); } - return result; - } else { - return []; } + return result; }, (err) => { this.client.error(`'navto' request failed with error.`, err); return []; From d529e3e07be26346fd62c9706f1c4581b2b48de3 Mon Sep 17 00:00:00 2001 From: rebornix Date: Tue, 9 May 2017 11:49:06 -0700 Subject: [PATCH 0246/1164] Fix #26274. Guard Editor command args --- src/vs/editor/common/editorCommonExtensions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/common/editorCommonExtensions.ts b/src/vs/editor/common/editorCommonExtensions.ts index f9f6e49c970..cc2cac81cef 100644 --- a/src/vs/editor/common/editorCommonExtensions.ts +++ b/src/vs/editor/common/editorCommonExtensions.ts @@ -64,7 +64,7 @@ export abstract class EditorAction extends ConfigEditorCommand { public runEditorCommand(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor, args: any): void | TPromise { this.reportTelemetry(accessor, editor); - return this.run(accessor, editor, args); + return this.run(accessor, editor, args || {}); } protected reportTelemetry(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor) { From 8984ed3036fd125548639b65fe3ac95ea479b26c Mon Sep 17 00:00:00 2001 From: rebornix Date: Tue, 9 May 2017 14:42:35 -0700 Subject: [PATCH 0247/1164] Fix #26336. Convert Enum numbers to String --- .../editor/common/config/commonEditorConfig.ts | 4 ++-- src/vs/editor/common/config/editorOptions.ts | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 172b427f1b3..6256a8ac919 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -438,7 +438,7 @@ const editorConfiguration: IConfigurationNode = { 'editor.cursorBlinking': { 'type': 'string', 'enum': ['blink', 'smooth', 'phase', 'expand', 'solid'], - 'default': EDITOR_DEFAULTS.viewInfo.cursorBlinking, + 'default': editorOptions.blinkingStyleToString(EDITOR_DEFAULTS.viewInfo.cursorBlinking), 'description': nls.localize('cursorBlinking', "Control the cursor animation style, possible values are 'blink', 'smooth', 'phase', 'expand' and 'solid'") }, 'editor.mouseWheelZoom': { @@ -449,7 +449,7 @@ const editorConfiguration: IConfigurationNode = { 'editor.cursorStyle': { 'type': 'string', 'enum': ['block', 'block-outline', 'line', 'line-thin', 'underline', 'underline-thin'], - 'default': EDITOR_DEFAULTS.viewInfo.cursorStyle, + 'default': editorOptions.cursorStyleToString(EDITOR_DEFAULTS.viewInfo.cursorStyle), 'description': nls.localize('cursorStyle', "Controls the cursor style, accepted values are 'block', 'block-outline', 'line', 'line-thin', 'underline' and 'underline-thin'") }, 'editor.fontLigatures': { diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 2382447705c..de990d726b4 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -559,6 +559,24 @@ export enum TextEditorCursorBlinkingStyle { */ Solid = 5 } +/** + * @internal + */ +export function blinkingStyleToString(blinkingStyle: TextEditorCursorBlinkingStyle): string { + if (blinkingStyle === TextEditorCursorBlinkingStyle.Blink) { + return 'blink'; + } else if (blinkingStyle === TextEditorCursorBlinkingStyle.Expand) { + return 'expand'; + } else if (blinkingStyle === TextEditorCursorBlinkingStyle.Phase) { + return 'phase'; + } else if (blinkingStyle === TextEditorCursorBlinkingStyle.Smooth) { + return 'smooth'; + } else if (blinkingStyle === TextEditorCursorBlinkingStyle.Solid) { + return 'solid'; + } else { + throw new Error('blinkingStyleToString: Unknown blinkingStyle'); + } +} /** * The style in which the editor's cursor should be rendered. From 946e7ebb2fe61ac36baaf6c346c767adfb438c77 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 9 May 2017 14:41:39 -0700 Subject: [PATCH 0248/1164] Reveal TS Server log file in os instead of opening log in explorer. Fixes #25908 --- extensions/typescript/package.nls.json | 2 +- .../typescript/src/typescriptServiceClient.ts | 21 ++++++------------- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/extensions/typescript/package.nls.json b/extensions/typescript/package.nls.json index 78103b90939..2217759f722 100644 --- a/extensions/typescript/package.nls.json +++ b/extensions/typescript/package.nls.json @@ -30,7 +30,7 @@ "javascript.goToProjectConfig.title": "Go to Project Configuration", "typescript.referencesCodeLens.enabled": "Enable/disable references CodeLens. Requires TypeScript >= 2.0.6.", "typescript.implementationsCodeLens.enabled": "Enable/disable implementations CodeLens. Requires TypeScript >= 2.2.0.", - "typescript.openTsServerLog.title": "Open TS Server log file", + "typescript.openTsServerLog.title": "Open TS Server log", "typescript.selectTypeScriptVersion.title": "Select TypeScript Version", "jsDocCompletion.enabled": "Enable/disable auto JSDoc comments", "javascript.implicitProjectConfig.checkJs": "Enable/disable semantic checking of JavaScript files. Existing jsconfig.json or tsconfig.json files override this setting. Requires TypeScript >=2.3.1.", diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index 71e7e2adf16..f6292a584ca 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -741,21 +741,12 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient 'TS Server has not started logging.')).then(() => false); } - return workspace.openTextDocument(this.tsServerLogFile) - .then(doc => { - if (!doc) { - return false; - } - return window.showTextDocument(doc, window.activeTextEditor ? window.activeTextEditor.viewColumn : undefined) - .then(editor => !!editor); - }, () => false) - .then(didOpen => { - if (!didOpen) { - window.showWarningMessage(localize( - 'openTsServerLog.openFileFailedFailed', - 'Could not open TS Server log file')); - } - return didOpen; + return commands.executeCommand('_workbench.action.files.revealInOS', Uri.parse(this.tsServerLogFile)) + .then(() => true, () => { + window.showWarningMessage(localize( + 'openTsServerLog.openFileFailedFailed', + 'Could not open TS Server log file')); + return false; }); } From 1d6e311998b83dfa6fd05fe5d2f2a2cd130442a4 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 9 May 2017 23:32:24 +0200 Subject: [PATCH 0249/1164] Move viewLayout management into viewModel --- .../editor/browser/controller/mouseHandler.ts | 26 ++--- .../editor/browser/controller/mouseTarget.ts | 18 ++-- .../browser/controller/pointerHandler.ts | 21 ++-- .../browser/controller/textAreaHandler.ts | 16 ++- src/vs/editor/browser/view/viewImpl.ts | 99 +++++-------------- .../editorScrollbar/editorScrollbar.ts | 3 +- .../browser/viewParts/lines/viewLines.ts | 30 +++--- .../browser/viewParts/minimap/minimap.ts | 14 ++- .../browser/viewParts/viewZones/viewZones.ts | 17 ++-- src/vs/editor/common/view/viewContext.ts | 4 +- src/vs/editor/common/viewLayout/viewLayout.ts | 53 +++++----- .../common/viewModel/splitLinesCollection.ts | 44 ++++----- src/vs/editor/common/viewModel/viewModel.ts | 25 ++++- .../common/viewModel/viewModelCursors.ts | 6 +- .../editor/common/viewModel/viewModelImpl.ts | 71 ++++++++++--- .../viewModel/splitLinesCollection.test.ts | 8 +- 16 files changed, 216 insertions(+), 239 deletions(-) diff --git a/src/vs/editor/browser/controller/mouseHandler.ts b/src/vs/editor/browser/controller/mouseHandler.ts index aaa0a3203e8..674dbf1c090 100644 --- a/src/vs/editor/browser/controller/mouseHandler.ts +++ b/src/vs/editor/browser/controller/mouseHandler.ts @@ -10,7 +10,6 @@ import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; import { Position } from 'vs/editor/common/core/position'; import { Selection } from 'vs/editor/common/core/selection'; -import * as editorCommon from 'vs/editor/common/editorCommon'; import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; import { MouseTarget, MouseTargetFactory, IViewZoneData } from 'vs/editor/browser/controller/mouseTarget'; import * as editorBrowser from 'vs/editor/browser/editorBrowser'; @@ -22,7 +21,6 @@ import { StandardMouseWheelEvent } from 'vs/base/browser/mouseEvent'; import { EditorZoom } from 'vs/editor/common/config/editorZoom'; import { IViewCursorRenderData } from 'vs/editor/browser/viewParts/viewCursors/viewCursor'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { IViewWhitespaceViewportData } from 'vs/editor/common/viewModel/viewModel'; import { ViewController } from 'vs/editor/browser/view/viewController'; /** @@ -47,16 +45,6 @@ export interface IPointerHandlerHelper { focusTextArea(): void; - getScrollLeft(): number; - getScrollTop(): number; - - setScrollPosition(position: editorCommon.INewScrollPosition): void; - - isAfterLines(verticalOffset: number): boolean; - getLineNumberAtVerticalOffset(verticalOffset: number): number; - getVerticalOffsetForLineNumber(lineNumber: number): number; - getWhitespaceAtVerticalOffset(verticalOffset: number): IViewWhitespaceViewportData; - /** * Get the last rendered information of the cursors. */ @@ -433,27 +421,29 @@ class MouseDownOperation extends Disposable { private _getPositionOutsideEditor(e: EditorMouseEvent): MouseTarget { const editorContent = e.editorPos; + const model = this._context.model; + const viewLayout = this._context.viewLayout; - let mouseColumn = this._getMouseColumn(e); + const mouseColumn = this._getMouseColumn(e); if (e.posy < editorContent.y) { - let aboveLineNumber = this._viewHelper.getLineNumberAtVerticalOffset(Math.max(this._viewHelper.getScrollTop() - (editorContent.y - e.posy), 0)); + let aboveLineNumber = viewLayout.getLineNumberAtVerticalOffset(Math.max(viewLayout.getScrollTop() - (editorContent.y - e.posy), 0)); return new MouseTarget(null, editorBrowser.MouseTargetType.OUTSIDE_EDITOR, mouseColumn, new Position(aboveLineNumber, 1)); } if (e.posy > editorContent.y + editorContent.height) { - let belowLineNumber = this._viewHelper.getLineNumberAtVerticalOffset(this._viewHelper.getScrollTop() + (e.posy - editorContent.y)); - return new MouseTarget(null, editorBrowser.MouseTargetType.OUTSIDE_EDITOR, mouseColumn, new Position(belowLineNumber, this._context.model.getLineMaxColumn(belowLineNumber))); + let belowLineNumber = viewLayout.getLineNumberAtVerticalOffset(viewLayout.getScrollTop() + (e.posy - editorContent.y)); + return new MouseTarget(null, editorBrowser.MouseTargetType.OUTSIDE_EDITOR, mouseColumn, new Position(belowLineNumber, model.getLineMaxColumn(belowLineNumber))); } - let possibleLineNumber = this._viewHelper.getLineNumberAtVerticalOffset(this._viewHelper.getScrollTop() + (e.posy - editorContent.y)); + let possibleLineNumber = viewLayout.getLineNumberAtVerticalOffset(viewLayout.getScrollTop() + (e.posy - editorContent.y)); if (e.posx < editorContent.x) { return new MouseTarget(null, editorBrowser.MouseTargetType.OUTSIDE_EDITOR, mouseColumn, new Position(possibleLineNumber, 1)); } if (e.posx > editorContent.x + editorContent.width) { - return new MouseTarget(null, editorBrowser.MouseTargetType.OUTSIDE_EDITOR, mouseColumn, new Position(possibleLineNumber, this._context.model.getLineMaxColumn(possibleLineNumber))); + return new MouseTarget(null, editorBrowser.MouseTargetType.OUTSIDE_EDITOR, mouseColumn, new Position(possibleLineNumber, model.getLineMaxColumn(possibleLineNumber))); } return null; diff --git a/src/vs/editor/browser/controller/mouseTarget.ts b/src/vs/editor/browser/controller/mouseTarget.ts index 253c5bc8421..b91b491be6b 100644 --- a/src/vs/editor/browser/controller/mouseTarget.ts +++ b/src/vs/editor/browser/controller/mouseTarget.ts @@ -228,7 +228,7 @@ class HitTestContext { public getZoneAtCoord(mouseVerticalOffset: number): IViewZoneData { // The target is either a view zone or the empty space after the last view-line - let viewZoneWhitespace = this._viewHelper.getWhitespaceAtVerticalOffset(mouseVerticalOffset); + let viewZoneWhitespace = this._context.viewLayout.getWhitespaceAtVerticalOffset(mouseVerticalOffset); if (viewZoneWhitespace) { let viewZoneMiddle = viewZoneWhitespace.verticalOffset + viewZoneWhitespace.height / 2, @@ -268,7 +268,7 @@ class HitTestContext { } public getFullLineRangeAtCoord(mouseVerticalOffset: number): { range: EditorRange; isAfterLines: boolean; } { - if (this._viewHelper.isAfterLines(mouseVerticalOffset)) { + if (this._context.viewLayout.isAfterLines(mouseVerticalOffset)) { // Below the last line let lineNumber = this._context.model.getLineCount(); let maxLineColumn = this._context.model.getLineMaxColumn(lineNumber); @@ -278,7 +278,7 @@ class HitTestContext { }; } - let lineNumber = this._viewHelper.getLineNumberAtVerticalOffset(mouseVerticalOffset); + let lineNumber = this._context.viewLayout.getLineNumberAtVerticalOffset(mouseVerticalOffset); let maxLineColumn = this._context.model.getLineMaxColumn(lineNumber); return { range: new EditorRange(lineNumber, 1, lineNumber, maxLineColumn), @@ -287,15 +287,15 @@ class HitTestContext { } public getLineNumberAtVerticalOffset(mouseVerticalOffset: number): number { - return this._viewHelper.getLineNumberAtVerticalOffset(mouseVerticalOffset); + return this._context.viewLayout.getLineNumberAtVerticalOffset(mouseVerticalOffset); } public isAfterLines(mouseVerticalOffset: number): boolean { - return this._viewHelper.isAfterLines(mouseVerticalOffset); + return this._context.viewLayout.isAfterLines(mouseVerticalOffset); } public getVerticalOffsetForLineNumber(lineNumber: number): number { - return this._viewHelper.getVerticalOffsetForLineNumber(lineNumber); + return this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber); } public findAttribute(element: Element, attr: string): string { @@ -328,11 +328,11 @@ class HitTestContext { } public getScrollTop(): number { - return this._viewHelper.getScrollTop(); + return this._context.viewLayout.getScrollTop(); } public getScrollLeft(): number { - return this._viewHelper.getScrollLeft(); + return this._context.viewLayout.getScrollLeft(); } } @@ -649,7 +649,7 @@ export class MouseTargetFactory { public getMouseColumn(editorPos: EditorPagePosition, pos: PageCoordinates): number { let layoutInfo = this._context.configuration.editor.layoutInfo; - let mouseContentHorizontalOffset = this._viewHelper.getScrollLeft() + pos.x - editorPos.x - layoutInfo.contentLeft; + let mouseContentHorizontalOffset = this._context.viewLayout.getScrollLeft() + pos.x - editorPos.x - layoutInfo.contentLeft; return MouseTargetFactory._getMouseColumn(mouseContentHorizontalOffset, this._context.configuration.editor.fontInfo.typicalHalfwidthCharacterWidth); } diff --git a/src/vs/editor/browser/controller/pointerHandler.ts b/src/vs/editor/browser/controller/pointerHandler.ts index 96f6c014343..fdd809a2e1a 100644 --- a/src/vs/editor/browser/controller/pointerHandler.ts +++ b/src/vs/editor/browser/controller/pointerHandler.ts @@ -99,9 +99,10 @@ class MsPointerHandler extends MouseHandler implements IDisposable { } private _onGestureChange(e: IThrottledGestureEvent): void { - this.viewHelper.setScrollPosition({ - scrollLeft: this.viewHelper.getScrollLeft() - e.translationX, - scrollTop: this.viewHelper.getScrollTop() - e.translationY, + const viewLayout = this._context.viewLayout; + viewLayout.setScrollPosition({ + scrollLeft: viewLayout.getScrollLeft() - e.translationX, + scrollTop: viewLayout.getScrollTop() - e.translationY, }); } @@ -180,9 +181,10 @@ class StandardPointerHandler extends MouseHandler implements IDisposable { } private _onGestureChange(e: IThrottledGestureEvent): void { - this.viewHelper.setScrollPosition({ - scrollLeft: this.viewHelper.getScrollLeft() - e.translationX, - scrollTop: this.viewHelper.getScrollTop() - e.translationY, + const viewLayout = this._context.viewLayout; + viewLayout.setScrollPosition({ + scrollLeft: viewLayout.getScrollLeft() - e.translationX, + scrollTop: viewLayout.getScrollTop() - e.translationY, }); } @@ -225,9 +227,10 @@ class TouchHandler extends MouseHandler { } private onChange(e: GestureEvent): void { - this.viewHelper.setScrollPosition({ - scrollLeft: this.viewHelper.getScrollLeft() - e.translationX, - scrollTop: this.viewHelper.getScrollTop() - e.translationY, + const viewLayout = this._context.viewLayout; + viewLayout.setScrollPosition({ + scrollLeft: viewLayout.getScrollLeft() - e.translationX, + scrollTop: viewLayout.getScrollTop() - e.translationY, }); } } diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index f7b6e2e4415..420e4bfafbc 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -27,10 +27,9 @@ import { BareFontInfo } from "vs/editor/common/config/fontInfo"; export interface ITextAreaHandlerHelper { visibleRangeForPositionRelativeToEditor(lineNumber: number, column: number): HorizontalRange; - getVerticalOffsetForLineNumber(lineNumber: number): number; } -class VisibleTextArea { +class VisibleTextAreaData { _visibleTextAreaBrand: void; public readonly top: number; @@ -43,8 +42,8 @@ class VisibleTextArea { this.width = width; } - public setWidth(width: number): VisibleTextArea { - return new VisibleTextArea(this.top, this.left, width); + public setWidth(width: number): VisibleTextAreaData { + return new VisibleTextAreaData(this.top, this.left, width); } } @@ -67,7 +66,7 @@ export class TextAreaHandler extends ViewPart { /** * Defined only when the text area is visible (composition case). */ - private _visibleTextArea: VisibleTextArea; + private _visibleTextArea: VisibleTextAreaData; private _selections: Selection[]; private _lastCopiedValue: string; private _lastCopiedValueIsFromEmptySelection: boolean; @@ -79,7 +78,6 @@ export class TextAreaHandler extends ViewPart { constructor(context: ViewContext, viewController: ViewController, viewHelper: ITextAreaHandlerHelper) { super(context); - this._context = context; this._viewController = viewController; this._viewHelper = viewHelper; @@ -211,8 +209,8 @@ export class TextAreaHandler extends ViewPart { const visibleRange = this._viewHelper.visibleRangeForPositionRelativeToEditor(lineNumber, column); if (visibleRange) { - this._visibleTextArea = new VisibleTextArea( - this._viewHelper.getVerticalOffsetForLineNumber(lineNumber), + this._visibleTextArea = new VisibleTextAreaData( + this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber), visibleRange.left, canUseZeroSizeTextarea ? 0 : 1 ); @@ -379,7 +377,7 @@ export class TextAreaHandler extends ViewPart { return; } - const top = this._viewHelper.getVerticalOffsetForLineNumber(this._selections[0].positionLineNumber) - this._scrollTop; + const top = this._context.viewLayout.getVerticalOffsetForLineNumber(this._selections[0].positionLineNumber) - this._scrollTop; if (top < 0 || top > this._contentHeight) { // cursor is outside the viewport this._renderAtTopLeft(); diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index edd209d5c4f..6882b9ee36b 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -20,7 +20,6 @@ import * as editorBrowser from 'vs/editor/browser/editorBrowser'; import { ViewController, ExecCoreEditorCommandFunc } from 'vs/editor/browser/view/viewController'; import { ViewEventDispatcher } from 'vs/editor/common/view/viewEventDispatcher'; import { ContentViewOverlays, MarginViewOverlays } from 'vs/editor/browser/view/viewOverlays'; -import { ViewLayout } from 'vs/editor/common/viewLayout/viewLayout'; import { ViewContentWidgets } from 'vs/editor/browser/viewParts/contentWidgets/contentWidgets'; import { CurrentLineHighlightOverlay } from 'vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight'; import { CurrentLineMarginHighlightOverlay } from 'vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight'; @@ -66,7 +65,6 @@ export class View extends ViewEventHandler { private eventDispatcher: ViewEventDispatcher; - private layoutProvider: ViewLayout; private _scrollbar: EditorScrollbar; private _context: ViewContext; @@ -114,12 +112,6 @@ export class View extends ViewEventHandler { // Ensure the view is the first event handler in order to update the layout this.eventDispatcher.addEventHandler(this); - // The layout provider has such responsibilities as: - // - scrolling (i.e. viewport / full size) & co. - // - whitespaces (a.k.a. view zones) management & co. - // - line heights updating & co. - this.layoutProvider = new ViewLayout(configuration, model.getLineCount(), this.eventDispatcher); - // The view context is passed on to most classes (basically to reduce param. counts in ctors) this._context = new ViewContext(configuration, model, this.eventDispatcher); @@ -153,20 +145,20 @@ export class View extends ViewEventHandler { PartFingerprints.write(this.overflowGuardContainer, PartFingerprint.OverflowGuard); this.overflowGuardContainer.setClassName('overflow-guard'); - this._scrollbar = new EditorScrollbar(this._context, this.layoutProvider.getScrollable(), this.linesContent, this.domNode, this.overflowGuardContainer); + this._scrollbar = new EditorScrollbar(this._context, this.linesContent, this.domNode, this.overflowGuardContainer); this.viewParts.push(this._scrollbar); // View Lines - this.viewLines = new ViewLines(this._context, this.linesContent, this.layoutProvider); + this.viewLines = new ViewLines(this._context, this.linesContent); // View Zones - this.viewZones = new ViewZones(this._context, this.layoutProvider); + this.viewZones = new ViewZones(this._context); this.viewParts.push(this.viewZones); // Decorations overview ruler let decorationsOverviewRuler = new DecorationsOverviewRuler( - this._context, this.layoutProvider.getScrollHeight(), - (lineNumber: number) => this.layoutProvider.getVerticalOffsetForLineNumber(lineNumber) + this._context, this._context.viewLayout.getScrollHeight(), + (lineNumber: number) => this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber) ); this.viewParts.push(decorationsOverviewRuler); @@ -208,7 +200,7 @@ export class View extends ViewEventHandler { let rulers = new Rulers(this._context); this.viewParts.push(rulers); - let minimap = new Minimap(this._context, this.layoutProvider, this._scrollbar); + let minimap = new Minimap(this._context, this._scrollbar); this.viewParts.push(minimap); // -------------- Wire dom nodes up @@ -248,29 +240,6 @@ export class View extends ViewEventHandler { this.focus(); }, - getScrollLeft: () => { - return this.layoutProvider.getScrollLeft(); - }, - getScrollTop: () => { - return this.layoutProvider.getScrollTop(); - }, - - setScrollPosition: (position: editorCommon.INewScrollPosition) => { - this.layoutProvider.setScrollPosition(position); - }, - - isAfterLines: (verticalOffset: number) => { - return this.layoutProvider.isAfterLines(verticalOffset); - }, - getLineNumberAtVerticalOffset: (verticalOffset: number) => { - return this.layoutProvider.getLineNumberAtVerticalOffset(verticalOffset); - }, - getVerticalOffsetForLineNumber: (lineNumber: number) => { - return this.layoutProvider.getVerticalOffsetForLineNumber(lineNumber); - }, - getWhitespaceAtVerticalOffset: (verticalOffset: number) => { - return this.layoutProvider.getWhitespaceAtVerticalOffset(verticalOffset); - }, getLastViewCursorsRenderData: () => { return this.viewCursors.getLastRenderData() || []; }, @@ -310,9 +279,6 @@ export class View extends ViewEventHandler { return null; } return visibleRanges[0]; - }, - getVerticalOffsetForLineNumber: (lineNumber: number) => { - return this.layoutProvider.getVerticalOffsetForLineNumber(lineNumber); } }; } @@ -346,11 +312,6 @@ export class View extends ViewEventHandler { if (e.layoutInfo) { this._setLayout(); } - this.layoutProvider.onConfigurationChanged(e); - return false; - } - public onFlushed(e: viewEvents.ViewFlushedEvent): boolean { - this.layoutProvider.onFlushed(this._context.model.getLineCount()); return false; } public onFocusChanged(e: viewEvents.ViewFocusChangedEvent): boolean { @@ -362,24 +323,10 @@ export class View extends ViewEventHandler { } return false; } - public onLinesDeleted(e: viewEvents.ViewLinesDeletedEvent): boolean { - this.layoutProvider.onLinesDeleted(e); - return false; - } - public onLinesInserted(e: viewEvents.ViewLinesInsertedEvent): boolean { - this.layoutProvider.onLinesInserted(e); - return false; - } public onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean { this.outgoingEvents.emitScrollChanged(e); return false; } - public onScrollRequest(e: viewEvents.ViewScrollRequestEvent): boolean { - this.layoutProvider.setScrollPosition({ - scrollTop: e.desiredScrollTop - }); - return false; - } // --- end event handlers @@ -403,8 +350,6 @@ export class View extends ViewEventHandler { } this.viewParts = []; - this.layoutProvider.dispose(); - super.dispose(); } @@ -453,7 +398,7 @@ export class View extends ViewEventHandler { return; } - let partialViewportData = this.layoutProvider.getLinesViewportData(); + const partialViewportData = this._context.viewLayout.getLinesViewportData(); this._context.model.setViewport(partialViewportData.startLineNumber, partialViewportData.endLineNumber, partialViewportData.centeredLineNumber); let viewportData = new ViewportData(partialViewportData, this._context.model); @@ -470,7 +415,7 @@ export class View extends ViewEventHandler { this._textAreaHandler.writeToTextArea(); } - let renderingContext = new RenderingContext(this.layoutProvider, viewportData, this.viewLines); + let renderingContext = new RenderingContext(this._context.viewLayout, viewportData, this.viewLines); // Render the rest of the parts for (let i = 0, len = viewPartsToRender.length; i < len; i++) { @@ -488,27 +433,27 @@ export class View extends ViewEventHandler { // --- BEGIN CodeEditor helpers public getScrollWidth(): number { - return this.layoutProvider.getScrollWidth(); + return this._context.viewLayout.getScrollWidth(); } public getScrollLeft(): number { - return this.layoutProvider.getScrollLeft(); + return this._context.viewLayout.getScrollLeft(); } public getScrollHeight(): number { - return this.layoutProvider.getScrollHeight(); + return this._context.viewLayout.getScrollHeight(); } public getScrollTop(): number { - return this.layoutProvider.getScrollTop(); + return this._context.viewLayout.getScrollTop(); } public setScrollPosition(scrollPosition: editorCommon.INewScrollPosition): void { - this.layoutProvider.setScrollPosition(scrollPosition); + this._context.viewLayout.setScrollPosition(scrollPosition); } public getVerticalOffsetForViewLineNumber(viewLineNumber: number): number { - return this.layoutProvider.getVerticalOffsetForLineNumber(viewLineNumber); + return this._context.viewLayout.getVerticalOffsetForLineNumber(viewLineNumber); } public delegateVerticalScrollbarMouseDown(browserEvent: MouseEvent): void { @@ -534,7 +479,7 @@ export class View extends ViewEventHandler { } public getCompletelyVisibleViewRange(): Range { - const partialData = this.layoutProvider.getLinesViewportData(); + const partialData = this._context.viewLayout.getLinesViewportData(); const startViewLineNumber = partialData.completelyVisibleStartLineNumber; const endViewLineNumber = partialData.completelyVisibleEndLineNumber; @@ -545,7 +490,7 @@ export class View extends ViewEventHandler { } public getCompletelyVisibleViewRangeAtScrollTop(scrollTop: number): Range { - const partialData = this.layoutProvider.getLinesViewportDataAtScrollTop(scrollTop); + const partialData = this._context.viewLayout.getLinesViewportDataAtScrollTop(scrollTop); const startViewLineNumber = partialData.completelyVisibleStartLineNumber; const endViewLineNumber = partialData.completelyVisibleEndLineNumber; @@ -561,8 +506,8 @@ export class View extends ViewEventHandler { public createOverviewRuler(cssClassName: string, minimumHeight: number, maximumHeight: number): OverviewRuler { return new OverviewRuler( - this._context, cssClassName, this.layoutProvider.getScrollHeight(), minimumHeight, maximumHeight, - (lineNumber: number) => this.layoutProvider.getVerticalOffsetForLineNumber(lineNumber) + this._context, cssClassName, this._context.viewLayout.getScrollHeight(), minimumHeight, maximumHeight, + (lineNumber: number) => this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber) ); } @@ -596,7 +541,7 @@ export class View extends ViewEventHandler { changeAccessor.removeZone = null; if (zonesHaveChanged) { - this.layoutProvider.onHeightMaybeChanged(); + this._context.viewLayout.onHeightMaybeChanged(); this._context.privateViewEventBus.emit(new viewEvents.ViewZonesChangedEvent()); } }); @@ -604,7 +549,7 @@ export class View extends ViewEventHandler { } public getWhitespaces(): IEditorWhitespace[] { - return this.layoutProvider.getWhitespaces(); + return this._context.viewLayout.getWhitespaces(); } public render(now: boolean, everything: boolean): void { @@ -628,11 +573,11 @@ export class View extends ViewEventHandler { } public saveState(): editorCommon.IViewState { - return this.layoutProvider.saveState(); + return this._context.viewLayout.saveState(); } public restoreState(state: editorCommon.IViewState): void { - return this.layoutProvider.restoreState(state); + return this._context.viewLayout.restoreState(state); } public focus(): void { diff --git a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts index 0fc8acf9612..a5d6bab5cdf 100644 --- a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts +++ b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts @@ -23,14 +23,13 @@ export class EditorScrollbar extends ViewPart { constructor( context: ViewContext, - scrollable: Scrollable, linesContent: FastDomNode, viewDomNode: FastDomNode, overflowGuardDomNode: FastDomNode ) { super(context); - this.scrollable = scrollable; + this.scrollable = this._context.viewLayout.scrollable; const editor = this._context.configuration.editor; const configScrollbarOpts = editor.viewInfo.scrollbar; diff --git a/src/vs/editor/browser/viewParts/lines/viewLines.ts b/src/vs/editor/browser/viewParts/lines/viewLines.ts index 4d4ee4c9834..fce372b0b8d 100644 --- a/src/vs/editor/browser/viewParts/lines/viewLines.ts +++ b/src/vs/editor/browser/viewParts/lines/viewLines.ts @@ -15,7 +15,7 @@ import { Configuration } from 'vs/editor/browser/config/configuration'; import { ViewContext } from 'vs/editor/common/view/viewContext'; import { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData'; import { IViewLines, HorizontalRange, LineVisibleRanges } from 'vs/editor/common/view/renderingContext'; -import { IViewLayout, Viewport } from 'vs/editor/common/viewModel/viewModel'; +import { Viewport } from 'vs/editor/common/viewModel/viewModel'; import { ViewPart, PartFingerprint, PartFingerprints } from 'vs/editor/browser/view/viewPart'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { VerticalRevealType } from 'vs/editor/common/controller/cursorEvents'; @@ -48,7 +48,6 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, private static HORIZONTAL_EXTRA_PX = 30; private readonly _linesContent: FastDomNode; - private readonly _viewLayout: IViewLayout; private readonly _textRangeRestingSpot: HTMLElement; private readonly _visibleLines: VisibleLinesCollection; private readonly domNode: FastDomNode; @@ -67,10 +66,9 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, private _lastCursorRevealRangeHorizontallyEvent: viewEvents.ViewRevealRangeRequestEvent; private _lastRenderedData: LastRenderedData; - constructor(context: ViewContext, linesContent: FastDomNode, viewLayout: IViewLayout) { + constructor(context: ViewContext, linesContent: FastDomNode) { super(context); this._linesContent = linesContent; - this._viewLayout = viewLayout; this._textRangeRestingSpot = document.createElement('div'); this._visibleLines = new VisibleLinesCollection(this); this.domNode = this._visibleLines.domNode; @@ -180,13 +178,13 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, return this._visibleLines.onLinesInserted(e); } public onRevealRangeRequest(e: viewEvents.ViewRevealRangeRequestEvent): boolean { - let newScrollTop = this._computeScrollTopToRevealRange(this._viewLayout.getCurrentViewport(), e.range, e.verticalType); + let newScrollTop = this._computeScrollTopToRevealRange(this._context.viewLayout.getCurrentViewport(), e.range, e.verticalType); if (e.revealHorizontal) { this._lastCursorRevealRangeHorizontallyEvent = e; } - this._viewLayout.setScrollPosition({ + this._context.viewLayout.setScrollPosition({ scrollTop: newScrollTop }); @@ -412,8 +410,8 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, // (1) render lines - ensures lines are in the DOM this._visibleLines.renderLines(viewportData); this._lastRenderedData.setCurrentVisibleRange(viewportData.visibleRange); - this.domNode.setWidth(this._viewLayout.getScrollWidth()); - this.domNode.setHeight(Math.min(this._viewLayout.getScrollHeight(), 1000000)); + this.domNode.setWidth(this._context.viewLayout.getScrollWidth()); + this.domNode.setHeight(Math.min(this._context.viewLayout.getScrollHeight(), 1000000)); // (2) execute DOM writing that forces sync layout (e.g. textArea manipulation) onAfterLinesRendered(); @@ -438,22 +436,22 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, } // set `scrollLeft` - this._viewLayout.setScrollPosition({ + this._context.viewLayout.setScrollPosition({ scrollLeft: newScrollLeft.scrollLeft }); } // (4) handle scrolling - const adjustedScrollTop = this._viewLayout.getScrollTop() - viewportData.bigNumbersDelta; + const adjustedScrollTop = this._context.viewLayout.getScrollTop() - viewportData.bigNumbersDelta; if (this._canUseTranslate3d) { - let transform = 'translate3d(' + -this._viewLayout.getScrollLeft() + 'px, ' + -adjustedScrollTop + 'px, 0px)'; + let transform = 'translate3d(' + -this._context.viewLayout.getScrollLeft() + 'px, ' + -adjustedScrollTop + 'px, 0px)'; this._linesContent.setTransform(transform); this._linesContent.setTop(0); this._linesContent.setLeft(0); } else { this._linesContent.setTransform(''); this._linesContent.setTop(-adjustedScrollTop); - this._linesContent.setLeft(-this._viewLayout.getScrollLeft()); + this._linesContent.setLeft(-this._context.viewLayout.getScrollLeft()); } // Update max line width (not so important, it is just so the horizontal scrollbar doesn't get too small) @@ -466,7 +464,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, let iLineWidth = Math.ceil(lineWidth); if (this._maxLineWidth < iLineWidth) { this._maxLineWidth = iLineWidth; - this._viewLayout.onMaxLineWidthChanged(this._maxLineWidth); + this._context.viewLayout.onMaxLineWidthChanged(this._maxLineWidth); } } @@ -478,8 +476,8 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, let boxEndY: number; // Have a box that includes one extra line height (for the horizontal scrollbar) - boxStartY = this._viewLayout.getVerticalOffsetForLineNumber(range.startLineNumber); - boxEndY = this._viewLayout.getVerticalOffsetForLineNumber(range.endLineNumber) + this._lineHeight; + boxStartY = this._context.viewLayout.getVerticalOffsetForLineNumber(range.startLineNumber); + boxEndY = this._context.viewLayout.getVerticalOffsetForLineNumber(range.endLineNumber) + this._lineHeight; if (verticalType === VerticalRevealType.Simple || verticalType === VerticalRevealType.Bottom) { // Reveal one line more when the last line would be covered by the scrollbar - arrow down case or revealing a line explicitly at bottom boxEndY += this._lineHeight; @@ -515,7 +513,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, }; } - let viewport = this._viewLayout.getCurrentViewport(); + let viewport = this._context.viewLayout.getCurrentViewport(); let viewportStartX = viewport.left; let viewportEndX = viewportStartX + viewport.width; diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index 5acccca0454..43dd9161682 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -15,7 +15,7 @@ import * as dom from 'vs/base/browser/dom'; import { MinimapCharRenderer, MinimapTokensColorTracker, Constants } from 'vs/editor/common/view/minimapCharRenderer'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { CharCode } from 'vs/base/common/charCode'; -import { IViewLayout, ViewLineData } from 'vs/editor/common/viewModel/viewModel'; +import { ViewLineData } from 'vs/editor/common/viewModel/viewModel'; import { ColorId } from 'vs/editor/common/modes'; import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { IDisposable } from 'vs/base/common/lifecycle'; @@ -415,7 +415,6 @@ class MinimapBuffers { export class Minimap extends ViewPart { - private readonly _viewLayout: IViewLayout; private readonly _editorScrollbar: EditorScrollbar; private readonly _domNode: FastDomNode; @@ -433,9 +432,8 @@ export class Minimap extends ViewPart { private _lastRenderData: RenderData; private _buffers: MinimapBuffers; - constructor(context: ViewContext, viewLayout: IViewLayout, editorScrollbar: EditorScrollbar) { + constructor(context: ViewContext, editorScrollbar: EditorScrollbar) { super(context); - this._viewLayout = viewLayout; this._editorScrollbar = editorScrollbar; this._options = new MinimapOptions(this._context.configuration); @@ -499,7 +497,7 @@ export class Minimap extends ViewPart { if (e.leftButton) { const initialMouseOrthogonalPosition = e.posx; - const initialScrollTop = this._viewLayout.getScrollTop(); + const initialScrollTop = this._context.viewLayout.getScrollTop(); const initialSliderCenter = (this._slider.getTop() + this._slider.getHeight() / 2); const draggingDeltaCenter = e.posy - initialSliderCenter; this._slider.toggleClassName('active', true); @@ -511,7 +509,7 @@ export class Minimap extends ViewPart { const mouseOrthogonalDelta = Math.abs(mouseOrthogonalPosition - initialMouseOrthogonalPosition); if (platform.isWindows && mouseOrthogonalDelta > MOUSE_DRAG_RESET_DISTANCE) { // The mouse has wondered away from the slider => reset dragging - this._viewLayout.setScrollPosition({ + this._context.viewLayout.setScrollPosition({ scrollTop: initialScrollTop }); } else { @@ -525,13 +523,13 @@ export class Minimap extends ViewPart { if (this._context.configuration.editor.viewInfo.scrollBeyondLastLine) { discountScrollHeight = this._canvas.getHeight() - this._context.configuration.editor.lineHeight; } - const scrollHeight = this._viewLayout.getScrollHeight() - discountScrollHeight; + const scrollHeight = this._context.viewLayout.getScrollHeight() - discountScrollHeight; const desiredSliderCenter = mouseMoveData.posy - draggingDeltaCenter; const desiredScrollCenter = desiredSliderCenter * (scrollHeight / representableHeight); const desiredScrollTop = desiredScrollCenter - this._canvas.getHeight() / 2; - this._viewLayout.setScrollPosition({ + this._context.viewLayout.setScrollPosition({ scrollTop: desiredScrollTop }); } diff --git a/src/vs/editor/browser/viewParts/viewZones/viewZones.ts b/src/vs/editor/browser/viewParts/viewZones/viewZones.ts index a56f4457cf4..d91430803b3 100644 --- a/src/vs/editor/browser/viewParts/viewZones/viewZones.ts +++ b/src/vs/editor/browser/viewParts/viewZones/viewZones.ts @@ -11,7 +11,7 @@ import { ViewPart } from 'vs/editor/browser/view/viewPart'; import { ViewContext } from 'vs/editor/common/view/viewContext'; import { Position } from 'vs/editor/common/core/position'; import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; -import { IViewLayout, IViewWhitespaceViewportData } from 'vs/editor/common/viewModel/viewModel'; +import { IViewWhitespaceViewportData } from 'vs/editor/common/viewModel/viewModel'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; export interface IMyViewZone { @@ -33,7 +33,6 @@ interface IComputedViewZoneProps { export class ViewZones extends ViewPart { - private _viewLayout: IViewLayout; private _zones: { [id: string]: IMyViewZone; }; private _lineHeight: number; private _contentWidth: number; @@ -43,12 +42,11 @@ export class ViewZones extends ViewPart { public marginDomNode: FastDomNode; - constructor(context: ViewContext, viewLayout: IViewLayout) { + constructor(context: ViewContext) { super(context); this._lineHeight = this._context.configuration.editor.lineHeight; this._contentWidth = this._context.configuration.editor.layoutInfo.contentWidth; this._contentLeft = this._context.configuration.editor.layoutInfo.contentLeft; - this._viewLayout = viewLayout; this.domNode = createFastDomNode(document.createElement('div')); this.domNode.setClassName('view-zones'); @@ -67,7 +65,6 @@ export class ViewZones extends ViewPart { public dispose(): void { super.dispose(); - this._viewLayout = null; this._zones = {}; } @@ -81,7 +78,7 @@ export class ViewZones extends ViewPart { let id = keys[i]; let zone = this._zones[id]; let props = this._computeWhitespaceProps(zone.delegate); - if (this._viewLayout.changeWhitespace(parseInt(id, 10), props.afterViewLineNumber, props.heightInPx)) { + if (this._context.viewLayout.changeWhitespace(parseInt(id, 10), props.afterViewLineNumber, props.heightInPx)) { this._safeCallOnComputedHeight(zone.delegate, props.heightInPx); hadAChange = true; } @@ -186,7 +183,7 @@ export class ViewZones extends ViewPart { public addZone(zone: IViewZone): number { let props = this._computeWhitespaceProps(zone); - let whitespaceId = this._viewLayout.addWhitespace(props.afterViewLineNumber, this._getZoneOrdinal(zone), props.heightInPx); + let whitespaceId = this._context.viewLayout.addWhitespace(props.afterViewLineNumber, this._getZoneOrdinal(zone), props.heightInPx); let myZone: IMyViewZone = { whitespaceId: whitespaceId, @@ -224,7 +221,7 @@ export class ViewZones extends ViewPart { if (this._zones.hasOwnProperty(id.toString())) { let zone = this._zones[id.toString()]; delete this._zones[id.toString()]; - this._viewLayout.removeWhitespace(zone.whitespaceId); + this._context.viewLayout.removeWhitespace(zone.whitespaceId); zone.domNode.removeAttribute('monaco-visible-view-zone'); zone.domNode.removeAttribute('monaco-view-zone'); @@ -249,7 +246,7 @@ export class ViewZones extends ViewPart { let zone = this._zones[id.toString()]; let props = this._computeWhitespaceProps(zone.delegate); // let newOrdinal = this._getZoneOrdinal(zone.delegate); - changed = this._viewLayout.changeWhitespace(zone.whitespaceId, props.afterViewLineNumber, props.heightInPx) || changed; + changed = this._context.viewLayout.changeWhitespace(zone.whitespaceId, props.afterViewLineNumber, props.heightInPx) || changed; // TODO@Alex: change `newOrdinal` too if (changed) { @@ -303,7 +300,7 @@ export class ViewZones extends ViewPart { } public render(ctx: RestrictedRenderingContext): void { - let visibleWhitespaces = this._viewLayout.getWhitespaceViewportData(); + let visibleWhitespaces = this._context.viewLayout.getWhitespaceViewportData(); let visibleZones: { [id: string]: IViewWhitespaceViewportData; } = {}; let hasVisibleZone = false; diff --git a/src/vs/editor/common/view/viewContext.ts b/src/vs/editor/common/view/viewContext.ts index c37c88756d9..ebb5cc199a3 100644 --- a/src/vs/editor/common/view/viewContext.ts +++ b/src/vs/editor/common/view/viewContext.ts @@ -5,7 +5,7 @@ 'use strict'; import { IConfiguration } from 'vs/editor/common/editorCommon'; -import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; +import { IViewModel, IViewLayout } from 'vs/editor/common/viewModel/viewModel'; import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; import { ViewEventDispatcher } from 'vs/editor/common/view/viewEventDispatcher'; @@ -13,6 +13,7 @@ export class ViewContext { public readonly configuration: IConfiguration; public readonly model: IViewModel; + public readonly viewLayout: IViewLayout; public readonly privateViewEventBus: ViewEventDispatcher; constructor( @@ -22,6 +23,7 @@ export class ViewContext { ) { this.configuration = configuration; this.model = model; + this.viewLayout = model.viewLayout; this.privateViewEventBus = privateViewEventBus; } diff --git a/src/vs/editor/common/viewLayout/viewLayout.ts b/src/vs/editor/common/viewLayout/viewLayout.ts index f7bf44a4bdc..9f437e73140 100644 --- a/src/vs/editor/common/viewLayout/viewLayout.ts +++ b/src/vs/editor/common/viewLayout/viewLayout.ts @@ -10,34 +10,33 @@ import * as editorCommon from 'vs/editor/common/editorCommon'; import { LinesLayout } from 'vs/editor/common/viewLayout/linesLayout'; import { IViewLayout, IViewWhitespaceViewportData, Viewport } from 'vs/editor/common/viewModel/viewModel'; import { IPartialViewLinesViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData'; -import { ViewEventDispatcher } from 'vs/editor/common/view/viewEventDispatcher'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; +import Event from 'vs/base/common/event'; +import { IConfigurationChangedEvent } from "vs/editor/common/config/editorOptions"; export class ViewLayout extends Disposable implements IViewLayout { static LINES_HORIZONTAL_EXTRA_PX = 30; - private _configuration: editorCommon.IConfiguration; - private _privateViewEventBus: ViewEventDispatcher; - private _linesLayout: LinesLayout; - private _scrollable: Scrollable; + private readonly _configuration: editorCommon.IConfiguration; + private readonly _linesLayout: LinesLayout; - constructor(configuration: editorCommon.IConfiguration, lineCount: number, privateViewEventBus: ViewEventDispatcher) { + public readonly scrollable: Scrollable; + public readonly onDidScroll: Event; + + constructor(configuration: editorCommon.IConfiguration, lineCount: number) { super(); this._configuration = configuration; - this._privateViewEventBus = privateViewEventBus; this._linesLayout = new LinesLayout(lineCount, this._configuration.editor.lineHeight); - this._scrollable = this._register(new Scrollable()); - this._scrollable.updateState({ + this.scrollable = this._register(new Scrollable()); + this.scrollable.updateState({ width: configuration.editor.layoutInfo.contentWidth, height: configuration.editor.layoutInfo.contentHeight }); - this._register(this._scrollable.onScroll((e: ScrollEvent) => { - this._privateViewEventBus.emit(new viewEvents.ViewScrollChangedEvent(e)); - })); + this.onDidScroll = this.scrollable.onScroll; this._updateHeight(); } @@ -47,7 +46,7 @@ export class ViewLayout extends Disposable implements IViewLayout { } public getScrollable(): Scrollable { - return this._scrollable; + return this.scrollable; } public onHeightMaybeChanged(): void { @@ -56,12 +55,12 @@ export class ViewLayout extends Disposable implements IViewLayout { // ---- begin view event handlers - public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): void { + public onConfigurationChanged(e: IConfigurationChangedEvent): void { if (e.lineHeight) { this._linesLayout.setLineHeight(this._configuration.editor.lineHeight); } if (e.layoutInfo) { - this._scrollable.updateState({ + this.scrollable.updateState({ width: this._configuration.editor.layoutInfo.contentWidth, height: this._configuration.editor.layoutInfo.contentHeight }); @@ -96,7 +95,7 @@ export class ViewLayout extends Disposable implements IViewLayout { } private _getTotalHeight(): number { - const scrollState = this._scrollable.getState(); + const scrollState = this.scrollable.getState(); let result = this._linesLayout.getLinesTotalHeight(); if (this._configuration.editor.viewInfo.scrollBeyondLastLine) { @@ -109,7 +108,7 @@ export class ViewLayout extends Disposable implements IViewLayout { } private _updateHeight(): void { - this._scrollable.updateState({ + this.scrollable.updateState({ scrollHeight: this._getTotalHeight() }); } @@ -117,7 +116,7 @@ export class ViewLayout extends Disposable implements IViewLayout { // ---- Layouting logic public getCurrentViewport(): Viewport { - const scrollState = this._scrollable.getState(); + const scrollState = this.scrollable.getState(); return new Viewport( scrollState.scrollTop, scrollState.scrollLeft, @@ -136,7 +135,7 @@ export class ViewLayout extends Disposable implements IViewLayout { public onMaxLineWidthChanged(maxLineWidth: number): void { let newScrollWidth = this._computeScrollWidth(maxLineWidth, this.getCurrentViewport().width); - this._scrollable.updateState({ + this.scrollable.updateState({ scrollWidth: newScrollWidth }); @@ -147,7 +146,7 @@ export class ViewLayout extends Disposable implements IViewLayout { // ---- view state public saveState(): editorCommon.IViewState { - const scrollState = this._scrollable.getState(); + const scrollState = this.scrollable.getState(); let scrollTop = scrollState.scrollTop; let firstLineNumberInViewport = this._linesLayout.getLineNumberAtOrAfterVerticalOffset(scrollTop); let whitespaceAboveFirstLine = this._linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(firstLineNumberInViewport); @@ -163,7 +162,7 @@ export class ViewLayout extends Disposable implements IViewLayout { if (typeof state.scrollTopWithoutViewZones === 'number' && !this._linesLayout.hasWhitespace()) { restoreScrollTop = state.scrollTopWithoutViewZones; } - this._scrollable.updateState({ + this.scrollable.updateState({ scrollLeft: state.scrollLeft, scrollTop: restoreScrollTop }); @@ -199,7 +198,7 @@ export class ViewLayout extends Disposable implements IViewLayout { } public getLinesViewportDataAtScrollTop(scrollTop: number): IPartialViewLinesViewportData { // do some minimal validations on scrollTop - const scrollState = this._scrollable.getState(); + const scrollState = this.scrollable.getState(); if (scrollTop + scrollState.height > scrollState.scrollHeight) { scrollTop = scrollState.scrollHeight - scrollState.height; } @@ -220,23 +219,23 @@ export class ViewLayout extends Disposable implements IViewLayout { public getScrollWidth(): number { - const scrollState = this._scrollable.getState(); + const scrollState = this.scrollable.getState(); return scrollState.scrollWidth; } public getScrollLeft(): number { - const scrollState = this._scrollable.getState(); + const scrollState = this.scrollable.getState(); return scrollState.scrollLeft; } public getScrollHeight(): number { - const scrollState = this._scrollable.getState(); + const scrollState = this.scrollable.getState(); return scrollState.scrollHeight; } public getScrollTop(): number { - const scrollState = this._scrollable.getState(); + const scrollState = this.scrollable.getState(); return scrollState.scrollTop; } public setScrollPosition(position: editorCommon.INewScrollPosition): void { - this._scrollable.updateState(position); + this.scrollable.updateState(position); } } diff --git a/src/vs/editor/common/viewModel/splitLinesCollection.ts b/src/vs/editor/common/viewModel/splitLinesCollection.ts index 322cc3aa6c7..726df79208e 100644 --- a/src/vs/editor/common/viewModel/splitLinesCollection.ts +++ b/src/vs/editor/common/viewModel/splitLinesCollection.ts @@ -9,7 +9,7 @@ import { Range } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { LineTokens } from 'vs/editor/common/core/lineTokens'; import { PrefixSumComputerWithCache } from 'vs/editor/common/viewModel/prefixSumComputer'; -import { ViewLineData, ViewEventsCollector } from 'vs/editor/common/viewModel/viewModel'; +import { ViewLineData } from 'vs/editor/common/viewModel/viewModel'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { WrappingIndent } from 'vs/editor/common/config/editorOptions'; @@ -165,7 +165,7 @@ export class SplitLinesCollection { return result; } - public setHiddenAreas(eventsCollector: ViewEventsCollector, _ranges: Range[]): boolean { + public setHiddenAreas(_ranges: Range[]): boolean { let newRanges = this._reduceRanges(_ranges); @@ -232,7 +232,6 @@ export class SplitLinesCollection { } } - eventsCollector.emit(new viewEvents.ViewFlushedEvent()); return true; } @@ -244,19 +243,18 @@ export class SplitLinesCollection { return this.lines[modelLineNumber - 1].isVisible(); } - public setTabSize(eventsCollector: ViewEventsCollector, newTabSize: number): boolean { + public setTabSize(newTabSize: number): boolean { if (this.tabSize === newTabSize) { return false; } this.tabSize = newTabSize; this._constructLines(false); - eventsCollector.emit(new viewEvents.ViewFlushedEvent()); return true; } - public setWrappingSettings(eventsCollector: ViewEventsCollector, wrappingIndent: WrappingIndent, wrappingColumn: number, columnsForFullWidthChar: number): boolean { + public setWrappingSettings(wrappingIndent: WrappingIndent, wrappingColumn: number, columnsForFullWidthChar: number): boolean { if (this.wrappingIndent === wrappingIndent && this.wrappingColumn === wrappingColumn && this.columnsForFullWidthChar === columnsForFullWidthChar) { return false; } @@ -266,21 +264,19 @@ export class SplitLinesCollection { this.columnsForFullWidthChar = columnsForFullWidthChar; this._constructLines(false); - eventsCollector.emit(new viewEvents.ViewFlushedEvent()); return true; } - public onModelFlushed(eventsCollector: ViewEventsCollector): void { + public onModelFlushed(): void { this._constructLines(true); - eventsCollector.emit(new viewEvents.ViewFlushedEvent()); } - public onModelLinesDeleted(eventsCollector: ViewEventsCollector, versionId: number, fromLineNumber: number, toLineNumber: number): void { + public onModelLinesDeleted(versionId: number, fromLineNumber: number, toLineNumber: number): viewEvents.ViewLinesDeletedEvent { if (versionId <= this._validModelVersionId) { // Here we check for versionId in case the lines were reconstructed in the meantime. // We don't want to apply stale change events on top of a newer read model state. - return; + return null; } let outputFromLineNumber = (fromLineNumber === 1 ? 1 : this.prefixSumComputer.getAccumulatedValue(fromLineNumber - 2) + 1); @@ -289,14 +285,14 @@ export class SplitLinesCollection { this.lines.splice(fromLineNumber - 1, toLineNumber - fromLineNumber + 1); this.prefixSumComputer.removeValues(fromLineNumber - 1, toLineNumber - fromLineNumber + 1); - eventsCollector.emit(new viewEvents.ViewLinesDeletedEvent(outputFromLineNumber, outputToLineNumber)); + return new viewEvents.ViewLinesDeletedEvent(outputFromLineNumber, outputToLineNumber); } - public onModelLinesInserted(eventsCollector: ViewEventsCollector, versionId: number, fromLineNumber: number, toLineNumber: number, text: string[]): void { + public onModelLinesInserted(versionId: number, fromLineNumber: number, toLineNumber: number, text: string[]): viewEvents.ViewLinesInsertedEvent { if (versionId <= this._validModelVersionId) { // Here we check for versionId in case the lines were reconstructed in the meantime. // We don't want to apply stale change events on top of a newer read model state. - return; + return null; } let hiddenAreas = this.getHiddenAreas(); @@ -328,14 +324,14 @@ export class SplitLinesCollection { this.prefixSumComputer.insertValues(fromLineNumber - 1, insertPrefixSumValues); - eventsCollector.emit(new viewEvents.ViewLinesInsertedEvent(outputFromLineNumber, outputFromLineNumber + totalOutputLineCount - 1)); + return new viewEvents.ViewLinesInsertedEvent(outputFromLineNumber, outputFromLineNumber + totalOutputLineCount - 1); } - public onModelLineChanged(eventsCollector: ViewEventsCollector, versionId: number, lineNumber: number, newText: string): boolean { + public onModelLineChanged(versionId: number, lineNumber: number, newText: string): [boolean, viewEvents.ViewLinesChangedEvent, viewEvents.ViewLinesInsertedEvent, viewEvents.ViewLinesDeletedEvent] { if (versionId <= this._validModelVersionId) { // Here we check for versionId in case the lines were reconstructed in the meantime. // We don't want to apply stale change events on top of a newer read model state. - return false; + return [false, null, null, null]; } let lineIndex = lineNumber - 1; @@ -373,17 +369,11 @@ export class SplitLinesCollection { this.prefixSumComputer.changeValue(lineIndex, newOutputLineCount); - if (changeFrom <= changeTo) { - eventsCollector.emit(new viewEvents.ViewLinesChangedEvent(changeFrom, changeTo)); - } - if (insertFrom <= insertTo) { - eventsCollector.emit(new viewEvents.ViewLinesInsertedEvent(insertFrom, insertTo)); - } - if (deleteFrom <= deleteTo) { - eventsCollector.emit(new viewEvents.ViewLinesDeletedEvent(deleteFrom, deleteTo)); - } + const viewLinesChangedEvent = (changeFrom <= changeTo ? new viewEvents.ViewLinesChangedEvent(changeFrom, changeTo) : null); + const viewLinesInsertedEvent = (insertFrom <= insertTo ? new viewEvents.ViewLinesInsertedEvent(insertFrom, insertTo) : null); + const viewLinesDeletedEvent = (deleteFrom <= deleteTo ? new viewEvents.ViewLinesDeletedEvent(deleteFrom, deleteTo) : null); - return lineMappingChanged; + return [lineMappingChanged, viewLinesChangedEvent, viewLinesInsertedEvent, viewLinesDeletedEvent]; } public acceptVersionId(versionId: number): void { diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index ab2b17027ac..2abd774314c 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -4,13 +4,16 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { INewScrollPosition, IModelDecoration, EndOfLinePreference } from 'vs/editor/common/editorCommon'; +import { INewScrollPosition, IModelDecoration, EndOfLinePreference, IViewState } from 'vs/editor/common/editorCommon'; import { ViewLineToken } from 'vs/editor/common/core/viewLineToken'; import { Position, IPosition } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ViewEvent } from 'vs/editor/common/view/viewEvents'; import { IDisposable } from 'vs/base/common/lifecycle'; +import { Scrollable } from "vs/base/common/scrollable"; +import { IPartialViewLinesViewportData } from "vs/editor/common/viewLayout/viewLinesViewportData"; +import { IEditorWhitespace } from "vs/editor/common/viewLayout/whitespaceComputer"; export interface IViewWhitespaceViewportData { readonly id: number; @@ -37,6 +40,8 @@ export class Viewport { export interface IViewLayout { + readonly scrollable: Scrollable; + onMaxLineWidthChanged(width: number): void; getScrollLeft(): number; @@ -44,9 +49,20 @@ export interface IViewLayout { getScrollHeight(): number; getScrollTop(): number; getCurrentViewport(): Viewport; - getVerticalOffsetForLineNumber(lineNumber: number): number; setScrollPosition(position: INewScrollPosition): void; + getLinesViewportData(): IPartialViewLinesViewportData; + getLinesViewportDataAtScrollTop(scrollTop: number): IPartialViewLinesViewportData; + getWhitespaces(): IEditorWhitespace[]; + + saveState(): IViewState; + restoreState(state: IViewState): void; + + isAfterLines(verticalOffset: number): boolean; + getLineNumberAtVerticalOffset(verticalOffset: number): number; + getVerticalOffsetForLineNumber(lineNumber: number): number; + getWhitespaceAtVerticalOffset(verticalOffset: number): IViewWhitespaceViewportData; + // --------------- Begin vertical whitespace management /** @@ -67,6 +83,9 @@ export interface IViewLayout { */ getWhitespaceViewportData(): IViewWhitespaceViewportData[]; + // TODO@Alex + onHeightMaybeChanged(); + // --------------- End vertical whitespace management } @@ -95,6 +114,8 @@ export interface IViewModel { readonly coordinatesConverter: ICoordinatesConverter; + readonly viewLayout: IViewLayout; + /** * Gives a hint that a lot of requests are about to come in for these line numbers. */ diff --git a/src/vs/editor/common/viewModel/viewModelCursors.ts b/src/vs/editor/common/viewModel/viewModelCursors.ts index fbfae793c15..90ec0e37eb2 100644 --- a/src/vs/editor/common/viewModel/viewModelCursors.ts +++ b/src/vs/editor/common/viewModel/viewModelCursors.ts @@ -9,7 +9,7 @@ import { Position } from 'vs/editor/common/core/position'; import { ICoordinatesConverter, ViewEventsCollector } from 'vs/editor/common/viewModel/viewModel'; import { Selection } from 'vs/editor/common/core/selection'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { ICursorRevealRangeEvent, CursorScrollRequest } from 'vs/editor/common/controller/cursorEvents'; +import { ICursorRevealRangeEvent } from 'vs/editor/common/controller/cursorEvents'; export interface ICursorPositionChangedEvent { readonly position: Position; @@ -110,8 +110,4 @@ export class ViewModelCursors { this.onCursorSelectionChanged(eventsCollector, e); } } - - public onCursorScrollRequest(eventsCollector: ViewEventsCollector, e: CursorScrollRequest): void { - eventsCollector.emit(new viewEvents.ViewScrollRequestEvent(e.desiredScrollTop)); - } } diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 21f45c369e2..94cf029a9ce 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -25,6 +25,7 @@ import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOption import { CursorEventType, ICursorPositionChangedEvent, VerticalRevealType, ICursorSelectionChangedEvent, ICursorRevealRangeEvent, CursorScrollRequest } from 'vs/editor/common/controller/cursorEvents'; import { Cursor } from 'vs/editor/common/controller/cursor'; import { CharacterHardWrappingLineMapperFactory } from "vs/editor/common/viewModel/characterHardWrappingLineMapper"; +import { ViewLayout } from 'vs/editor/common/viewLayout/viewLayout'; export class CoordinatesConverter implements ICoordinatesConverter { @@ -93,6 +94,7 @@ export class ViewModel extends Disposable implements IViewModel { private readonly model: editorCommon.IModel; private readonly lines: SplitLinesCollection; public readonly coordinatesConverter: ICoordinatesConverter; + public readonly viewLayout: ViewLayout; private readonly decorations: ViewModelDecorations; private readonly cursors: ViewModelCursors; @@ -129,6 +131,12 @@ export class ViewModel extends Disposable implements IViewModel { this.coordinatesConverter = new CoordinatesConverter(this.lines); + this.viewLayout = this._register(new ViewLayout(this.configuration, this.getLineCount())); + + this._register(this.viewLayout.onDidScroll((e) => { + this._emit([new viewEvents.ViewScrollChangedEvent(e)]); + })); + this._isDisposing = false; this._centeredViewLine = -1; this._listeners = []; @@ -206,7 +214,10 @@ export class ViewModel extends Disposable implements IViewModel { } case CursorEventType.CursorScrollRequest: { const e = data; - this.cursors.onCursorScrollRequest(eventsCollector, e); + this.viewLayout.setScrollPosition({ + scrollTop: e.desiredScrollTop + }); + eventsCollector.emit(new viewEvents.ViewScrollRequestEvent(e.desiredScrollTop)); // TODO@Alex: delete this ev type break; } default: @@ -224,10 +235,12 @@ export class ViewModel extends Disposable implements IViewModel { const conf = this.configuration.editor; - if (this.lines.setWrappingSettings(eventsCollector, conf.wrappingInfo.wrappingIndent, conf.wrappingInfo.wrappingColumn, conf.fontInfo.typicalFullwidthCharacterWidth / conf.fontInfo.typicalHalfwidthCharacterWidth)) { + if (this.lines.setWrappingSettings(conf.wrappingInfo.wrappingIndent, conf.wrappingInfo.wrappingColumn, conf.fontInfo.typicalFullwidthCharacterWidth / conf.fontInfo.typicalHalfwidthCharacterWidth)) { + eventsCollector.emit(new viewEvents.ViewFlushedEvent()); eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); this.decorations.onLineMappingChanged(eventsCollector); this.cursors.onLineMappingChanged(eventsCollector); + this.viewLayout.onFlushed(this.getLineCount()); revealPreviousCenteredModelRange = true; } @@ -238,6 +251,7 @@ export class ViewModel extends Disposable implements IViewModel { } eventsCollector.emit(new viewEvents.ViewConfigurationChangedEvent(e)); + this.viewLayout.onConfigurationChanged(e); if (revealPreviousCenteredModelRange && previousCenteredModelRange) { // modelLine -> viewLine @@ -286,25 +300,48 @@ export class ViewModel extends Disposable implements IViewModel { const change = changes[j]; switch (change.changeType) { - case textModelEvents.RawContentChangedType.Flush: - this.lines.onModelFlushed(eventsCollector); + case textModelEvents.RawContentChangedType.Flush: { + this.lines.onModelFlushed(); + eventsCollector.emit(new viewEvents.ViewFlushedEvent()); this.decorations.reset(); + this.viewLayout.onFlushed(this.getLineCount()); hadOtherModelChange = true; break; - - case textModelEvents.RawContentChangedType.LinesDeleted: - this.lines.onModelLinesDeleted(eventsCollector, versionId, change.fromLineNumber, change.toLineNumber); + } + case textModelEvents.RawContentChangedType.LinesDeleted: { + const linesDeletedEvent = this.lines.onModelLinesDeleted(versionId, change.fromLineNumber, change.toLineNumber); + if (linesDeletedEvent !== null) { + eventsCollector.emit(linesDeletedEvent); + this.viewLayout.onLinesDeleted(linesDeletedEvent); + } hadOtherModelChange = true; break; - - case textModelEvents.RawContentChangedType.LinesInserted: - this.lines.onModelLinesInserted(eventsCollector, versionId, change.fromLineNumber, change.toLineNumber, change.detail.split('\n')); + } + case textModelEvents.RawContentChangedType.LinesInserted: { + const linesInsertedEvent = this.lines.onModelLinesInserted(versionId, change.fromLineNumber, change.toLineNumber, change.detail.split('\n')); + if (linesInsertedEvent !== null) { + eventsCollector.emit(linesInsertedEvent); + this.viewLayout.onLinesInserted(linesInsertedEvent); + } hadOtherModelChange = true; break; - - case textModelEvents.RawContentChangedType.LineChanged: - hadModelLineChangeThatChangedLineMapping = this.lines.onModelLineChanged(eventsCollector, versionId, change.lineNumber, change.detail); + } + case textModelEvents.RawContentChangedType.LineChanged: { + const [lineMappingChanged, viewLinesChangedEvent, viewLinesInsertedEvent, viewLinesDeletedEvent] = this.lines.onModelLineChanged(versionId, change.lineNumber, change.detail); + hadModelLineChangeThatChangedLineMapping = lineMappingChanged; + if (viewLinesChangedEvent) { + eventsCollector.emit(viewLinesChangedEvent); + } + if (viewLinesInsertedEvent) { + eventsCollector.emit(viewLinesInsertedEvent); + this.viewLayout.onLinesInserted(viewLinesInsertedEvent); + } + if (viewLinesDeletedEvent) { + eventsCollector.emit(viewLinesDeletedEvent); + this.viewLayout.onLinesDeleted(viewLinesDeletedEvent); + } break; + } } } this.lines.acceptVersionId(versionId); @@ -337,10 +374,12 @@ export class ViewModel extends Disposable implements IViewModel { } case textModelEvents.TextModelEventType.ModelOptionsChanged: { // A tab size change causes a line mapping changed event => all view parts will repaint OK, no further event needed here - if (this.lines.setTabSize(eventsCollector, this.model.getOptions().tabSize)) { + if (this.lines.setTabSize(this.model.getOptions().tabSize)) { + eventsCollector.emit(new viewEvents.ViewFlushedEvent()); eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); this.decorations.onLineMappingChanged(eventsCollector); this.cursors.onLineMappingChanged(eventsCollector); + this.viewLayout.onFlushed(this.getLineCount()); } break; @@ -369,11 +408,13 @@ export class ViewModel extends Disposable implements IViewModel { public setHiddenAreas(ranges: Range[]): void { let eventsCollector = new ViewEventsCollector(); - let lineMappingChanged = this.lines.setHiddenAreas(eventsCollector, ranges); + let lineMappingChanged = this.lines.setHiddenAreas(ranges); if (lineMappingChanged) { + eventsCollector.emit(new viewEvents.ViewFlushedEvent()); eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); this.decorations.onLineMappingChanged(eventsCollector); this.cursors.onLineMappingChanged(eventsCollector); + this.viewLayout.onFlushed(this.getLineCount()); } this._emit(eventsCollector.finalize()); } diff --git a/src/vs/editor/test/common/viewModel/splitLinesCollection.test.ts b/src/vs/editor/test/common/viewModel/splitLinesCollection.test.ts index 714e0b2c437..cca084b0918 100644 --- a/src/vs/editor/test/common/viewModel/splitLinesCollection.test.ts +++ b/src/vs/editor/test/common/viewModel/splitLinesCollection.test.ts @@ -17,7 +17,7 @@ import { NULL_STATE } from 'vs/editor/common/modes/nullMode'; import { TokenizationResult2 } from 'vs/editor/common/core/token'; import { IDisposable } from 'vs/base/common/lifecycle'; import { ViewLineToken } from 'vs/editor/common/core/viewLineToken'; -import { ViewLineData, ViewEventsCollector } from 'vs/editor/common/viewModel/viewModel'; +import { ViewLineData } from 'vs/editor/common/viewModel/viewModel'; import { Range } from 'vs/editor/common/core/range'; suite('Editor ViewModel - SplitLinesCollection', () => { @@ -205,7 +205,7 @@ suite('Editor ViewModel - SplitLinesCollection', () => { ].join('\n'); withSplitLinesCollection(text, (model, linesCollection) => { - linesCollection.setHiddenAreas(new ViewEventsCollector(), [ + linesCollection.setHiddenAreas([ new Range(1, 1, 3, 1), new Range(5, 1, 6, 1) ]); @@ -530,7 +530,7 @@ suite('SplitLinesCollection', () => { _expected[7], ]); - splitLinesCollection.setHiddenAreas(new ViewEventsCollector(), [new Range(2, 1, 4, 1)]); + splitLinesCollection.setHiddenAreas([new Range(2, 1, 4, 1)]); assert.equal(splitLinesCollection.getViewLineCount(), 5); assert.equal(splitLinesCollection.modelPositionIsVisible(1, 1), true); assert.equal(splitLinesCollection.modelPositionIsVisible(2, 1), false); @@ -700,7 +700,7 @@ suite('SplitLinesCollection', () => { _expected[11], ]); - splitLinesCollection.setHiddenAreas(new ViewEventsCollector(), [new Range(2, 1, 4, 1)]); + splitLinesCollection.setHiddenAreas([new Range(2, 1, 4, 1)]); assert.equal(splitLinesCollection.getViewLineCount(), 8); assert.equal(splitLinesCollection.modelPositionIsVisible(1, 1), true); assert.equal(splitLinesCollection.modelPositionIsVisible(2, 1), false); From 8485cb6e4dc9ca3446914129997fdb8032a1635a Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 10 May 2017 00:24:40 +0200 Subject: [PATCH 0250/1164] Simplifications post moving viewLayout into viewModel --- src/vs/editor/browser/view/viewImpl.ts | 70 +------- .../editorScrollbar/editorScrollbar.ts | 13 +- .../browser/viewParts/lines/viewLines.ts | 2 +- .../overviewRuler/decorationsOverviewRuler.ts | 6 +- .../viewParts/overviewRuler/overviewRuler.ts | 14 +- .../editor/browser/widget/codeEditorWidget.ts | 142 +---------------- src/vs/editor/common/commonCodeEditor.ts | 150 ++++++++++++++++-- src/vs/editor/common/view/viewEvents.ts | 19 +-- src/vs/editor/common/viewLayout/viewLayout.ts | 9 +- .../common/viewModel/viewEventHandler.ts | 9 -- src/vs/editor/common/viewModel/viewModel.ts | 2 +- .../editor/common/viewModel/viewModelImpl.ts | 23 ++- .../test/common/mocks/mockCodeEditor.ts | 18 --- 13 files changed, 180 insertions(+), 297 deletions(-) diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index 6882b9ee36b..49a8d522741 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -11,7 +11,6 @@ import * as dom from 'vs/base/browser/dom'; import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { Range } from 'vs/editor/common/core/range'; -import * as editorCommon from 'vs/editor/common/editorCommon'; import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; import { Configuration } from 'vs/editor/browser/config/configuration'; import { TextAreaHandler, ITextAreaHandlerHelper } from 'vs/editor/browser/controller/textAreaHandler'; @@ -49,7 +48,6 @@ import { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData' import { EditorScrollbar } from 'vs/editor/browser/viewParts/editorScrollbar/editorScrollbar'; import { Minimap } from 'vs/editor/browser/viewParts/minimap/minimap'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; export interface IContentWidgetData { widget: editorBrowser.IContentWidget; @@ -156,10 +154,7 @@ export class View extends ViewEventHandler { this.viewParts.push(this.viewZones); // Decorations overview ruler - let decorationsOverviewRuler = new DecorationsOverviewRuler( - this._context, this._context.viewLayout.getScrollHeight(), - (lineNumber: number) => this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber) - ); + let decorationsOverviewRuler = new DecorationsOverviewRuler(this._context); this.viewParts.push(decorationsOverviewRuler); @@ -432,30 +427,6 @@ export class View extends ViewEventHandler { // --- BEGIN CodeEditor helpers - public getScrollWidth(): number { - return this._context.viewLayout.getScrollWidth(); - } - - public getScrollLeft(): number { - return this._context.viewLayout.getScrollLeft(); - } - - public getScrollHeight(): number { - return this._context.viewLayout.getScrollHeight(); - } - - public getScrollTop(): number { - return this._context.viewLayout.getScrollTop(); - } - - public setScrollPosition(scrollPosition: editorCommon.INewScrollPosition): void { - this._context.viewLayout.setScrollPosition(scrollPosition); - } - - public getVerticalOffsetForViewLineNumber(viewLineNumber: number): number { - return this._context.viewLayout.getVerticalOffsetForLineNumber(viewLineNumber); - } - public delegateVerticalScrollbarMouseDown(browserEvent: MouseEvent): void { this._scrollbar.delegateVerticalScrollbarMouseDown(browserEvent); } @@ -478,37 +449,12 @@ export class View extends ViewEventHandler { return this.pointerHandler.getTargetAtClientPoint(clientX, clientY); } - public getCompletelyVisibleViewRange(): Range { - const partialData = this._context.viewLayout.getLinesViewportData(); - const startViewLineNumber = partialData.completelyVisibleStartLineNumber; - const endViewLineNumber = partialData.completelyVisibleEndLineNumber; - - return new Range( - startViewLineNumber, this._context.model.getLineMinColumn(startViewLineNumber), - endViewLineNumber, this._context.model.getLineMaxColumn(endViewLineNumber) - ); - } - - public getCompletelyVisibleViewRangeAtScrollTop(scrollTop: number): Range { - const partialData = this._context.viewLayout.getLinesViewportDataAtScrollTop(scrollTop); - const startViewLineNumber = partialData.completelyVisibleStartLineNumber; - const endViewLineNumber = partialData.completelyVisibleEndLineNumber; - - return new Range( - startViewLineNumber, this._context.model.getLineMinColumn(startViewLineNumber), - endViewLineNumber, this._context.model.getLineMaxColumn(endViewLineNumber) - ); - } - public getInternalEventBus(): ViewOutgoingEvents { return this.outgoingEvents; } public createOverviewRuler(cssClassName: string, minimumHeight: number, maximumHeight: number): OverviewRuler { - return new OverviewRuler( - this._context, cssClassName, this._context.viewLayout.getScrollHeight(), minimumHeight, maximumHeight, - (lineNumber: number) => this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber) - ); + return new OverviewRuler(this._context, cssClassName, minimumHeight, maximumHeight); } public change(callback: (changeAccessor: editorBrowser.IViewZoneChangeAccessor) => any): boolean { @@ -548,10 +494,6 @@ export class View extends ViewEventHandler { return zonesHaveChanged; } - public getWhitespaces(): IEditorWhitespace[] { - return this._context.viewLayout.getWhitespaces(); - } - public render(now: boolean, everything: boolean): void { if (everything) { // Force everything to render... @@ -572,14 +514,6 @@ export class View extends ViewEventHandler { this._textAreaHandler.setAriaActiveDescendant(id); } - public saveState(): editorCommon.IViewState { - return this._context.viewLayout.saveState(); - } - - public restoreState(state: editorCommon.IViewState): void { - return this._context.viewLayout.restoreState(state); - } - public focus(): void { this._textAreaHandler.focusTextArea(); } diff --git a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts index a5d6bab5cdf..aff8334b64c 100644 --- a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts +++ b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts @@ -9,7 +9,6 @@ import { ScrollableElementCreationOptions, ScrollableElementChangeOptions } from import { IOverviewRulerLayoutInfo, ScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; import { INewScrollPosition } from 'vs/editor/common/editorCommon'; import { ViewPart, PartFingerprint, PartFingerprints } from 'vs/editor/browser/view/viewPart'; -import { Scrollable } from 'vs/base/common/scrollable'; import { ViewContext } from 'vs/editor/common/view/viewContext'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; @@ -17,7 +16,6 @@ import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; export class EditorScrollbar extends ViewPart { - private scrollable: Scrollable; private scrollbar: ScrollableElement; private scrollbarDomNode: FastDomNode; @@ -29,8 +27,6 @@ export class EditorScrollbar extends ViewPart { ) { super(context); - this.scrollable = this._context.viewLayout.scrollable; - const editor = this._context.configuration.editor; const configScrollbarOpts = editor.viewInfo.scrollbar; @@ -54,7 +50,7 @@ export class EditorScrollbar extends ViewPart { mouseWheelScrollSensitivity: configScrollbarOpts.mouseWheelScrollSensitivity, }; - this.scrollbar = this._register(new ScrollableElement(linesContent.domNode, scrollbarOptions, this.scrollable)); + this.scrollbar = this._register(new ScrollableElement(linesContent.domNode, scrollbarOptions, this._context.viewLayout.scrollable)); PartFingerprints.write(this.scrollbar.getDomNode(), PartFingerprint.ScrollableElement); this.scrollbarDomNode = createFastDomNode(this.scrollbar.getDomNode()); @@ -66,13 +62,12 @@ export class EditorScrollbar extends ViewPart { // changing the .scrollTop of this.linesContent let onBrowserDesperateReveal = (domNode: HTMLElement, lookAtScrollTop: boolean, lookAtScrollLeft: boolean) => { - const scrollState = this.scrollable.getState(); let newScrollPosition: INewScrollPosition = {}; if (lookAtScrollTop) { let deltaTop = domNode.scrollTop; if (deltaTop) { - newScrollPosition.scrollTop = scrollState.scrollTop + deltaTop; + newScrollPosition.scrollTop = this._context.viewLayout.getScrollTop() + deltaTop; domNode.scrollTop = 0; } } @@ -80,12 +75,12 @@ export class EditorScrollbar extends ViewPart { if (lookAtScrollLeft) { let deltaLeft = domNode.scrollLeft; if (deltaLeft) { - newScrollPosition.scrollLeft = scrollState.scrollLeft + deltaLeft; + newScrollPosition.scrollLeft = this._context.viewLayout.getScrollLeft() + deltaLeft; domNode.scrollLeft = 0; } } - this.scrollable.updateState(newScrollPosition); + this._context.viewLayout.setScrollPosition(newScrollPosition); }; // I've seen this happen both on the view dom node & on the lines content dom node. diff --git a/src/vs/editor/browser/viewParts/lines/viewLines.ts b/src/vs/editor/browser/viewParts/lines/viewLines.ts index fce372b0b8d..730e42ad417 100644 --- a/src/vs/editor/browser/viewParts/lines/viewLines.ts +++ b/src/vs/editor/browser/viewParts/lines/viewLines.ts @@ -184,7 +184,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, this._lastCursorRevealRangeHorizontallyEvent = e; } - this._context.viewLayout.setScrollPosition({ + this._context.viewLayout.setScrollPosition({ // TODO@Alex: scrolling vertically can be moved to the view model scrollTop: newScrollTop }); diff --git a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts index 6ffaa520096..5ee8d66826e 100644 --- a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts +++ b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts @@ -51,17 +51,17 @@ export class DecorationsOverviewRuler extends ViewPart { private _zonesFromDecorations: OverviewRulerZone[]; private _zonesFromCursors: OverviewRulerZone[]; - constructor(context: ViewContext, scrollHeight: number, getVerticalOffsetForLine: (lineNumber: number) => number) { + constructor(context: ViewContext) { super(context); this._overviewRuler = new OverviewRulerImpl( 1, 'decorationsOverviewRuler', - scrollHeight, + this._context.viewLayout.getScrollHeight(), this._context.configuration.editor.lineHeight, this._context.configuration.editor.canUseTranslate3d, DecorationsOverviewRuler.MIN_DECORATION_HEIGHT, DecorationsOverviewRuler.MAX_DECORATION_HEIGHT, - getVerticalOffsetForLine + (lineNumber: number) => this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber) ); this._overviewRuler.setLanesCount(this._context.configuration.editor.viewInfo.overviewRulerLanes, false); let theme = this._context.configuration.editor.viewInfo.theme; diff --git a/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts b/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts index 4ec5b262fbd..8efec195d9a 100644 --- a/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts +++ b/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts @@ -17,11 +17,19 @@ export class OverviewRuler extends ViewEventHandler implements IOverviewRuler { private _context: ViewContext; private _overviewRuler: OverviewRulerImpl; - constructor(context: ViewContext, cssClassName: string, scrollHeight: number, minimumHeight: number, maximumHeight: number, getVerticalOffsetForLine: (lineNumber: number) => number) { + constructor(context: ViewContext, cssClassName: string, minimumHeight: number, maximumHeight: number) { super(); this._context = context; - this._overviewRuler = new OverviewRulerImpl(0, cssClassName, scrollHeight, this._context.configuration.editor.lineHeight, - this._context.configuration.editor.canUseTranslate3d, minimumHeight, maximumHeight, getVerticalOffsetForLine); + this._overviewRuler = new OverviewRulerImpl( + 0, + cssClassName, + this._context.viewLayout.getScrollHeight(), + this._context.configuration.editor.lineHeight, + this._context.configuration.editor.canUseTranslate3d, + minimumHeight, + maximumHeight, + (lineNumber: number) => this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber) + ); this._context.addEventHandler(this); } diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index f1bb44263e4..19579878aa2 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -187,94 +187,11 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito return this._view.domNode.domNode; } - public getCenteredRangeInViewport(): Range { - if (!this.hasView) { - return null; - } - return this.viewModel.getCenteredRangeInViewport(); - } - - protected _getCompletelyVisibleViewRange(): Range { - if (!this.hasView) { - return null; - } - return this._view.getCompletelyVisibleViewRange(); - } - - protected _getCompletelyVisibleViewRangeAtScrollTop(scrollTop: number): Range { - if (!this.hasView) { - return null; - } - return this._view.getCompletelyVisibleViewRangeAtScrollTop(scrollTop); - } - - protected _getVerticalOffsetForViewLineNumber(viewLineNumber: number): number { - if (!this.hasView) { - return 0; - } - return this._view.getVerticalOffsetForViewLineNumber(viewLineNumber); - } - public getCompletelyVisibleLinesRangeInViewport(): Range { const viewRange = this._getCompletelyVisibleViewRange(); return this.viewModel.coordinatesConverter.convertViewRangeToModelRange(viewRange); } - public getScrollWidth(): number { - if (!this.hasView) { - return -1; - } - return this._view.getScrollWidth(); - } - public getScrollLeft(): number { - if (!this.hasView) { - return -1; - } - return this._view.getScrollLeft(); - } - - public getScrollHeight(): number { - if (!this.hasView) { - return -1; - } - return this._view.getScrollHeight(); - } - public getScrollTop(): number { - if (!this.hasView) { - return -1; - } - return this._view.getScrollTop(); - } - - public setScrollLeft(newScrollLeft: number): void { - if (!this.hasView) { - return; - } - if (typeof newScrollLeft !== 'number') { - throw new Error('Invalid arguments'); - } - this._view.setScrollPosition({ - scrollLeft: newScrollLeft - }); - } - public setScrollTop(newScrollTop: number): void { - if (!this.hasView) { - return; - } - if (typeof newScrollTop !== 'number') { - throw new Error('Invalid arguments'); - } - this._view.setScrollPosition({ - scrollTop: newScrollTop - }); - } - public setScrollPosition(position: editorCommon.INewScrollPosition): void { - if (!this.hasView) { - return; - } - this._view.setScrollPosition(position); - } - public delegateVerticalScrollbarMouseDown(browserEvent: MouseEvent): void { if (!this.hasView) { return; @@ -282,57 +199,6 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito this._view.delegateVerticalScrollbarMouseDown(browserEvent); } - public saveViewState(): editorCommon.ICodeEditorViewState { - if (!this.cursor || !this.hasView) { - return null; - } - let contributionsState: { [key: string]: any } = {}; - - let keys = Object.keys(this._contributions); - for (let i = 0, len = keys.length; i < len; i++) { - let id = keys[i]; - let contribution = this._contributions[id]; - if (typeof contribution.saveViewState === 'function') { - contributionsState[id] = contribution.saveViewState(); - } - } - - let cursorState = this.cursor.saveState(); - let viewState = this._view.saveState(); - return { - cursorState: cursorState, - viewState: viewState, - contributionsState: contributionsState - }; - } - - public restoreViewState(s: editorCommon.ICodeEditorViewState): void { - if (!this.cursor || !this.hasView) { - return; - } - if (s && s.cursorState && s.viewState) { - let codeEditorState = s; - let cursorState = codeEditorState.cursorState; - if (Array.isArray(cursorState)) { - this.cursor.restoreState(cursorState); - } else { - // Backwards compatibility - this.cursor.restoreState([cursorState]); - } - this._view.restoreState(codeEditorState.viewState); - - let contributionsState = s.contributionsState || {}; - let keys = Object.keys(this._contributions); - for (let i = 0, len = keys.length; i < len; i++) { - let id = keys[i]; - let contribution = this._contributions[id]; - if (typeof contribution.restoreViewState === 'function') { - contribution.restoreViewState(contributionsState[id]); - } - } - } - } - public layout(dimension?: editorCommon.IDimension): void { this._configuration.observeReferenceElement(dimension); this.render(); @@ -445,7 +311,7 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito if (!this.hasView) { return []; } - return this._view.getWhitespaces(); + return this.viewModel.viewLayout.getWhitespaces(); } private _getVerticalOffsetForPosition(modelLineNumber: number, modelColumn: number): number { @@ -454,7 +320,7 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito column: modelColumn }); let viewPosition = this.viewModel.coordinatesConverter.convertModelPositionToViewPosition(modelPosition); - return this._view.getVerticalOffsetForViewLineNumber(viewPosition.lineNumber); + return this.viewModel.viewLayout.getVerticalOffsetForLineNumber(viewPosition.lineNumber); } public getTopForLineNumber(lineNumber: number): number { @@ -486,8 +352,8 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito let position = this.model.validatePosition(rawPosition); let layoutInfo = this._configuration.editor.layoutInfo; - let top = this._getVerticalOffsetForPosition(position.lineNumber, position.column) - this._view.getScrollTop(); - let left = this._view.getOffsetForColumn(position.lineNumber, position.column) + layoutInfo.glyphMarginWidth + layoutInfo.lineNumbersWidth + layoutInfo.decorationsWidth - this._view.getScrollLeft(); + let top = this._getVerticalOffsetForPosition(position.lineNumber, position.column) - this.getScrollTop(); + let left = this._view.getOffsetForColumn(position.lineNumber, position.column) + layoutInfo.glyphMarginWidth + layoutInfo.lineNumbersWidth + layoutInfo.decorationsWidth - this.getScrollLeft(); return { top: top, diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index b3d0d0f0ce0..104436dd806 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -234,11 +234,40 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo this._postDetachModelCleanup(detachedModel); } - public abstract getCenteredRangeInViewport(): Range; + public getCenteredRangeInViewport(): Range { + if (!this.hasView) { + return null; + } + return this.viewModel.getCenteredRangeInViewport(); + } - protected abstract _getCompletelyVisibleViewRange(): Range; - protected abstract _getCompletelyVisibleViewRangeAtScrollTop(scrollTop: number): Range; - protected abstract _getVerticalOffsetForViewLineNumber(viewLineNumber: number): number; + protected _getCompletelyVisibleViewRange(): Range { + if (!this.hasView) { + return null; + } + const partialData = this.viewModel.viewLayout.getLinesViewportData(); + const startViewLineNumber = partialData.completelyVisibleStartLineNumber; + const endViewLineNumber = partialData.completelyVisibleEndLineNumber; + + return new Range( + startViewLineNumber, this.viewModel.getLineMinColumn(startViewLineNumber), + endViewLineNumber, this.viewModel.getLineMaxColumn(endViewLineNumber) + ); + } + + protected _getCompletelyVisibleViewRangeAtScrollTop(scrollTop: number): Range { + if (!this.hasView) { + return null; + } + const partialData = this.viewModel.viewLayout.getLinesViewportDataAtScrollTop(scrollTop); + const startViewLineNumber = partialData.completelyVisibleStartLineNumber; + const endViewLineNumber = partialData.completelyVisibleEndLineNumber; + + return new Range( + startViewLineNumber, this.viewModel.getLineMinColumn(startViewLineNumber), + endViewLineNumber, this.viewModel.getLineMaxColumn(endViewLineNumber) + ); + } public getVisibleColumnFromPosition(rawPosition: IPosition): number { if (!this.model) { @@ -499,18 +528,111 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo this.cursor.setSelections('api', ranges); } - public abstract getScrollWidth(): number; - public abstract getScrollLeft(): number; + public getScrollWidth(): number { + if (!this.hasView) { + return -1; + } + return this.viewModel.viewLayout.getScrollWidth(); + } + public getScrollLeft(): number { + if (!this.hasView) { + return -1; + } + return this.viewModel.viewLayout.getScrollLeft(); + } - public abstract getScrollHeight(): number; - public abstract getScrollTop(): number; + public getScrollHeight(): number { + if (!this.hasView) { + return -1; + } + return this.viewModel.viewLayout.getScrollHeight(); + } + public getScrollTop(): number { + if (!this.hasView) { + return -1; + } + return this.viewModel.viewLayout.getScrollTop(); + } - public abstract setScrollLeft(newScrollLeft: number): void; - public abstract setScrollTop(newScrollTop: number): void; - public abstract setScrollPosition(position: editorCommon.INewScrollPosition): void; + public setScrollLeft(newScrollLeft: number): void { + if (!this.hasView) { + return; + } + if (typeof newScrollLeft !== 'number') { + throw new Error('Invalid arguments'); + } + this.viewModel.viewLayout.setScrollPosition({ + scrollLeft: newScrollLeft + }); + } + public setScrollTop(newScrollTop: number): void { + if (!this.hasView) { + return; + } + if (typeof newScrollTop !== 'number') { + throw new Error('Invalid arguments'); + } + this.viewModel.viewLayout.setScrollPosition({ + scrollTop: newScrollTop + }); + } + public setScrollPosition(position: editorCommon.INewScrollPosition): void { + if (!this.hasView) { + return; + } + this.viewModel.viewLayout.setScrollPosition(position); + } - public abstract saveViewState(): editorCommon.ICodeEditorViewState; - public abstract restoreViewState(state: editorCommon.IEditorViewState): void; + public saveViewState(): editorCommon.ICodeEditorViewState { + if (!this.cursor || !this.hasView) { + return null; + } + let contributionsState: { [key: string]: any } = {}; + + let keys = Object.keys(this._contributions); + for (let i = 0, len = keys.length; i < len; i++) { + let id = keys[i]; + let contribution = this._contributions[id]; + if (typeof contribution.saveViewState === 'function') { + contributionsState[id] = contribution.saveViewState(); + } + } + + let cursorState = this.cursor.saveState(); + let viewState = this.viewModel.viewLayout.saveState(); + return { + cursorState: cursorState, + viewState: viewState, + contributionsState: contributionsState + }; + } + + public restoreViewState(s: editorCommon.ICodeEditorViewState): void { + if (!this.cursor || !this.hasView) { + return; + } + if (s && s.cursorState && s.viewState) { + let codeEditorState = s; + let cursorState = codeEditorState.cursorState; + if (Array.isArray(cursorState)) { + this.cursor.restoreState(cursorState); + } else { + // Backwards compatibility + this.cursor.restoreState([cursorState]); + } + this.viewModel.viewLayout.restoreState(codeEditorState.viewState); + + let contributionsState = s.contributionsState || {}; + let keys = Object.keys(this._contributions); + for (let i = 0, len = keys.length; i < len; i++) { + let id = keys[i]; + let contribution = this._contributions[id]; + if (typeof contribution.restoreViewState === 'function') { + contribution.restoreViewState(contributionsState[id]); + } + } + } + } public onVisible(): void { } @@ -765,7 +887,7 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo return this._getCompletelyVisibleViewRangeAtScrollTop(scrollTop); }, getVerticalOffsetForViewLineNumber: (viewLineNumber: number): number => { - return this._getVerticalOffsetForViewLineNumber(viewLineNumber); + return this.viewModel.viewLayout.getVerticalOffsetForLineNumber(viewLineNumber); } }; diff --git a/src/vs/editor/common/view/viewEvents.ts b/src/vs/editor/common/view/viewEvents.ts index 9b29111f999..7decc3f5231 100644 --- a/src/vs/editor/common/view/viewEvents.ts +++ b/src/vs/editor/common/view/viewEvents.ts @@ -24,10 +24,9 @@ export const enum ViewEventType { ViewLinesInserted = 10, ViewRevealRangeRequest = 11, ViewScrollChanged = 12, - ViewScrollRequest = 13, - ViewTokensChanged = 14, - ViewTokensColorsChanged = 15, - ViewZonesChanged = 16, + ViewTokensChanged = 13, + ViewTokensColorsChanged = 14, + ViewZonesChanged = 15, } export class ViewConfigurationChangedEvent { @@ -243,17 +242,6 @@ export class ViewScrollChangedEvent { } } -export class ViewScrollRequestEvent { - - public readonly type = ViewEventType.ViewScrollRequest; - - public readonly desiredScrollTop: number; - - constructor(desiredScrollTop: number) { - this.desiredScrollTop = desiredScrollTop; - } -} - export class ViewTokensChangedEvent { public readonly type = ViewEventType.ViewTokensChanged; @@ -305,7 +293,6 @@ export type ViewEvent = ( | ViewLinesInsertedEvent | ViewRevealRangeRequestEvent | ViewScrollChangedEvent - | ViewScrollRequestEvent | ViewTokensChangedEvent | ViewTokensColorsChangedEvent | ViewZonesChangedEvent diff --git a/src/vs/editor/common/viewLayout/viewLayout.ts b/src/vs/editor/common/viewLayout/viewLayout.ts index 9f437e73140..e6a9d763d29 100644 --- a/src/vs/editor/common/viewLayout/viewLayout.ts +++ b/src/vs/editor/common/viewLayout/viewLayout.ts @@ -10,7 +10,6 @@ import * as editorCommon from 'vs/editor/common/editorCommon'; import { LinesLayout } from 'vs/editor/common/viewLayout/linesLayout'; import { IViewLayout, IViewWhitespaceViewportData, Viewport } from 'vs/editor/common/viewModel/viewModel'; import { IPartialViewLinesViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; import Event from 'vs/base/common/event'; import { IConfigurationChangedEvent } from "vs/editor/common/config/editorOptions"; @@ -71,12 +70,12 @@ export class ViewLayout extends Disposable implements IViewLayout { this._linesLayout.onFlushed(lineCount); this._updateHeight(); } - public onLinesDeleted(e: viewEvents.ViewLinesDeletedEvent): void { - this._linesLayout.onLinesDeleted(e.fromLineNumber, e.toLineNumber); + public onLinesDeleted(fromLineNumber: number, toLineNumber: number): void { + this._linesLayout.onLinesDeleted(fromLineNumber, toLineNumber); this._updateHeight(); } - public onLinesInserted(e: viewEvents.ViewLinesInsertedEvent): void { - this._linesLayout.onLinesInserted(e.fromLineNumber, e.toLineNumber); + public onLinesInserted(fromLineNumber: number, toLineNumber: number): void { + this._linesLayout.onLinesInserted(fromLineNumber, toLineNumber); this._updateHeight(); } diff --git a/src/vs/editor/common/viewModel/viewEventHandler.ts b/src/vs/editor/common/viewModel/viewEventHandler.ts index 4a76918e20b..3ef6a84a4e4 100644 --- a/src/vs/editor/common/viewModel/viewEventHandler.ts +++ b/src/vs/editor/common/viewModel/viewEventHandler.ts @@ -70,9 +70,6 @@ export class ViewEventHandler extends Disposable { public onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean { return false; } - public onScrollRequest(e: viewEvents.ViewScrollRequestEvent): boolean { - return false; - } public onTokensChanged(e: viewEvents.ViewTokensChangedEvent): boolean { return false; } @@ -166,12 +163,6 @@ export class ViewEventHandler extends Disposable { } break; - case viewEvents.ViewEventType.ViewScrollRequest: - if (this.onScrollRequest(e)) { - shouldRender = true; - } - break; - case viewEvents.ViewEventType.ViewTokensChanged: if (this.onTokensChanged(e)) { shouldRender = true; diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index 2abd774314c..7ee4226bfc9 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -83,7 +83,7 @@ export interface IViewLayout { */ getWhitespaceViewportData(): IViewWhitespaceViewportData[]; - // TODO@Alex + // TODO@Alex whitespace management should work via a change accessor sort of thing onHeightMaybeChanged(); // --------------- End vertical whitespace management diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 94cf029a9ce..432debeaa81 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -217,7 +217,6 @@ export class ViewModel extends Disposable implements IViewModel { this.viewLayout.setScrollPosition({ scrollTop: e.desiredScrollTop }); - eventsCollector.emit(new viewEvents.ViewScrollRequestEvent(e.desiredScrollTop)); // TODO@Alex: delete this ev type break; } default: @@ -312,7 +311,7 @@ export class ViewModel extends Disposable implements IViewModel { const linesDeletedEvent = this.lines.onModelLinesDeleted(versionId, change.fromLineNumber, change.toLineNumber); if (linesDeletedEvent !== null) { eventsCollector.emit(linesDeletedEvent); - this.viewLayout.onLinesDeleted(linesDeletedEvent); + this.viewLayout.onLinesDeleted(linesDeletedEvent.fromLineNumber, linesDeletedEvent.toLineNumber); } hadOtherModelChange = true; break; @@ -321,24 +320,24 @@ export class ViewModel extends Disposable implements IViewModel { const linesInsertedEvent = this.lines.onModelLinesInserted(versionId, change.fromLineNumber, change.toLineNumber, change.detail.split('\n')); if (linesInsertedEvent !== null) { eventsCollector.emit(linesInsertedEvent); - this.viewLayout.onLinesInserted(linesInsertedEvent); + this.viewLayout.onLinesInserted(linesInsertedEvent.fromLineNumber, linesInsertedEvent.toLineNumber); } hadOtherModelChange = true; break; } case textModelEvents.RawContentChangedType.LineChanged: { - const [lineMappingChanged, viewLinesChangedEvent, viewLinesInsertedEvent, viewLinesDeletedEvent] = this.lines.onModelLineChanged(versionId, change.lineNumber, change.detail); + const [lineMappingChanged, linesChangedEvent, linesInsertedEvent, linesDeletedEvent] = this.lines.onModelLineChanged(versionId, change.lineNumber, change.detail); hadModelLineChangeThatChangedLineMapping = lineMappingChanged; - if (viewLinesChangedEvent) { - eventsCollector.emit(viewLinesChangedEvent); + if (linesChangedEvent) { + eventsCollector.emit(linesChangedEvent); } - if (viewLinesInsertedEvent) { - eventsCollector.emit(viewLinesInsertedEvent); - this.viewLayout.onLinesInserted(viewLinesInsertedEvent); + if (linesInsertedEvent) { + eventsCollector.emit(linesInsertedEvent); + this.viewLayout.onLinesInserted(linesInsertedEvent.fromLineNumber, linesInsertedEvent.toLineNumber); } - if (viewLinesDeletedEvent) { - eventsCollector.emit(viewLinesDeletedEvent); - this.viewLayout.onLinesDeleted(viewLinesDeletedEvent); + if (linesDeletedEvent) { + eventsCollector.emit(linesDeletedEvent); + this.viewLayout.onLinesDeleted(linesDeletedEvent.fromLineNumber, linesDeletedEvent.toLineNumber); } break; } diff --git a/src/vs/editor/test/common/mocks/mockCodeEditor.ts b/src/vs/editor/test/common/mocks/mockCodeEditor.ts index 92e4e0f444e..f927151d734 100644 --- a/src/vs/editor/test/common/mocks/mockCodeEditor.ts +++ b/src/vs/editor/test/common/mocks/mockCodeEditor.ts @@ -14,30 +14,12 @@ import { Cursor } from 'vs/editor/common/controller/cursor'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { Model } from 'vs/editor/common/model/model'; import { TestConfiguration } from 'vs/editor/test/common/mocks/testConfiguration'; -import { Range } from 'vs/editor/common/core/range'; import * as editorOptions from 'vs/editor/common/config/editorOptions'; export class MockCodeEditor extends CommonCodeEditor { protected _createConfiguration(options: editorOptions.IEditorOptions): CommonEditorConfiguration { return new TestConfiguration(options); } - public getCenteredRangeInViewport(): Range { return null; } - protected _getCompletelyVisibleViewRange(): Range { return null; } - protected _getCompletelyVisibleViewRangeAtScrollTop(scrollTop: number): Range { return null; } - protected _getVerticalOffsetForViewLineNumber(viewLineNumber: number): number { return 0; } - - public getScrollWidth(): number { return 0; } - public getScrollLeft(): number { return 0; } - - public getScrollHeight(): number { return 0; } - public getScrollTop(): number { return 0; } - - public setScrollLeft(newScrollLeft: number): void { } - public setScrollTop(newScrollTop: number): void { } - public setScrollPosition(position: editorCommon.INewScrollPosition): void { } - - public saveViewState(): editorCommon.ICodeEditorViewState { return null; } - public restoreViewState(state: editorCommon.IEditorViewState): void { } public layout(dimension?: editorCommon.IDimension): void { } From 3c5918c200d6b1139fa7a7951dfb1d9c44fd12e4 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 10 May 2017 00:35:41 +0200 Subject: [PATCH 0251/1164] Fixes #26313: Do not assume ownership of passed in options object --- src/vs/editor/common/config/commonEditorConfig.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 6256a8ac919..afdc566eac9 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -74,7 +74,7 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed constructor(options: editorOptions.IEditorOptions) { super(); - this._rawOptions = options || {}; + this._rawOptions = objects.mixin({}, options || {}); this._validatedOptions = editorOptions.EditorOptionsValidator.validate(this._rawOptions, EDITOR_DEFAULTS); this.editor = null; this._isDominatedByLongLines = false; From 173fc4472380aa0707195f96f4bfd465851c05ed Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 9 May 2017 20:55:09 -0700 Subject: [PATCH 0252/1164] Support Tags in TS/JS Hover Provider Fixes #26290 Adds support for displaying documentation tags from jsdoc comments (such as `@private`) in hovers --- extensions/typescript/src/features/hoverProvider.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/extensions/typescript/src/features/hoverProvider.ts b/extensions/typescript/src/features/hoverProvider.ts index 960d4964c42..9e6a8af4dc8 100644 --- a/extensions/typescript/src/features/hoverProvider.ts +++ b/extensions/typescript/src/features/hoverProvider.ts @@ -29,7 +29,7 @@ export default class TypeScriptHoverProvider implements HoverProvider { if (response && response.body) { const data = response.body; return new Hover( - [{ language: 'typescript', value: data.displayString }, data.documentation], + TypeScriptHoverProvider.getContents(data), new Range(data.start.line - 1, data.start.offset - 1, data.end.line - 1, data.end.offset - 1)); } return undefined; @@ -38,4 +38,15 @@ export default class TypeScriptHoverProvider implements HoverProvider { return null; }); } + + private static getContents(data: Proto.QuickInfoResponseBody) { + const tags: string[] = []; + for (const tag of data.tags || []) { + tags.push(`*@${tag.name}*` + (tag.text ? ` — ${tag.text}` : '')); + } + return [ + { language: 'typescript', value: data.displayString }, + data.documentation + (tags.length ? '\n\n' + tags.join(' \n') : '') + ]; + } } \ No newline at end of file From f7306841f6b3abf59bcbe739672f54f05008c7b9 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 9 May 2017 21:27:55 -0700 Subject: [PATCH 0253/1164] show jsdoc tags in sig help and for completion items Fixes #26290 Exposes jsdoc tags such as `@priver` in the signature help and in completion items --- .../src/features/completionItemProvider.ts | 4 +++- extensions/typescript/src/features/hoverProvider.ts | 8 +++----- extensions/typescript/src/features/previewer.ts | 12 ++++++++++++ .../typescript/src/features/signatureHelpProvider.ts | 5 ++++- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/extensions/typescript/src/features/completionItemProvider.ts b/extensions/typescript/src/features/completionItemProvider.ts index 9a4ad7c1f7d..3eeba2e395f 100644 --- a/extensions/typescript/src/features/completionItemProvider.ts +++ b/extensions/typescript/src/features/completionItemProvider.ts @@ -242,9 +242,11 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP return item; } const detail = details[0]; - item.documentation = Previewer.plain(detail.documentation); item.detail = Previewer.plain(detail.displayParts); + const tags = Previewer.tagsPlainPreview(detail.tags); + item.documentation = Previewer.plain(detail.documentation) + (tags ? '\n\n' + tags : ''); + if (detail && this.config.useCodeSnippetsOnMethodSuggest && (item.kind === CompletionItemKind.Function || item.kind === CompletionItemKind.Method)) { return this.isValidFunctionCompletionContext(filepath, item.position).then(shouldCompleteFunction => { if (shouldCompleteFunction) { diff --git a/extensions/typescript/src/features/hoverProvider.ts b/extensions/typescript/src/features/hoverProvider.ts index 9e6a8af4dc8..75d36131baf 100644 --- a/extensions/typescript/src/features/hoverProvider.ts +++ b/extensions/typescript/src/features/hoverProvider.ts @@ -9,6 +9,7 @@ import { HoverProvider, Hover, TextDocument, Position, Range, CancellationToken import * as Proto from '../protocol'; import { ITypescriptServiceClient } from '../typescriptService'; +import { tagsMarkdownPreview } from "./previewer"; export default class TypeScriptHoverProvider implements HoverProvider { @@ -40,13 +41,10 @@ export default class TypeScriptHoverProvider implements HoverProvider { } private static getContents(data: Proto.QuickInfoResponseBody) { - const tags: string[] = []; - for (const tag of data.tags || []) { - tags.push(`*@${tag.name}*` + (tag.text ? ` — ${tag.text}` : '')); - } + const tags = tagsMarkdownPreview(data.tags); return [ { language: 'typescript', value: data.displayString }, - data.documentation + (tags.length ? '\n\n' + tags.join(' \n') : '') + data.documentation + (tags ? '\n\n' + tags : '') ]; } } \ No newline at end of file diff --git a/extensions/typescript/src/features/previewer.ts b/extensions/typescript/src/features/previewer.ts index 0f57473fa58..e5a8ef7f7e3 100644 --- a/extensions/typescript/src/features/previewer.ts +++ b/extensions/typescript/src/features/previewer.ts @@ -12,4 +12,16 @@ export function plain(parts: Proto.SymbolDisplayPart[]): string { return ''; } return parts.map(part => part.text).join(''); +} + +export function tagsMarkdownPreview(tags: Proto.JSDocTagInfo[]): string { + return (tags || []) + .map(tag => `*@${tag.name}*` + (tag.text ? ` — ${tag.text}` : '')) + .join(' \n'); +} + +export function tagsPlainPreview(tags: Proto.JSDocTagInfo[]): string { + return (tags || []) + .map(tag => `@${tag.name}` + (tag.text ? ` — ${tag.text}` : '')) + .join('\n'); } \ No newline at end of file diff --git a/extensions/typescript/src/features/signatureHelpProvider.ts b/extensions/typescript/src/features/signatureHelpProvider.ts index 7d6f8942bfe..dc7214da7f6 100644 --- a/extensions/typescript/src/features/signatureHelpProvider.ts +++ b/extensions/typescript/src/features/signatureHelpProvider.ts @@ -61,7 +61,10 @@ export default class TypeScriptSignatureHelpProvider implements SignatureHelpPro } }); signature.label += Previewer.plain(item.suffixDisplayParts); - signature.documentation = Previewer.plain(item.documentation); + + const tags = Previewer.tagsPlainPreview(item.tags); + signature.documentation = Previewer.plain(item.documentation) + (tags ? '\n\n' + tags : ''); + result.signatures.push(signature); }); From f2b9e43a0e065ea33939a5d3b53eaff3ba7d522d Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 9 May 2017 21:30:24 -0700 Subject: [PATCH 0254/1164] Preserve newlines in signature help display Fixes #26346 **Bug** Signature help currently handles newlines differently than completion item providers. This results in inconsistent looking documentation **fix** Use `pre-wrap` for the signature help documentation the same way we do for completion items --- src/vs/editor/contrib/parameterHints/browser/parameterHints.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/editor/contrib/parameterHints/browser/parameterHints.css b/src/vs/editor/contrib/parameterHints/browser/parameterHints.css index dd628db6a5e..d6a1ffafeb7 100644 --- a/src/vs/editor/contrib/parameterHints/browser/parameterHints.css +++ b/src/vs/editor/contrib/parameterHints/browser/parameterHints.css @@ -55,6 +55,7 @@ .monaco-editor .parameter-hints-widget .docs { padding: 0 10px 0 5px; + white-space: pre-wrap; } .monaco-editor .parameter-hints-widget .buttons { From 93e42a5e46cfe9490404de8b3ebed5165f991329 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 9 May 2017 21:50:56 -0700 Subject: [PATCH 0255/1164] Use for of loop --- .../typescript/src/features/completionItemProvider.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/extensions/typescript/src/features/completionItemProvider.ts b/extensions/typescript/src/features/completionItemProvider.ts index 3eeba2e395f..d5f4bd4477c 100644 --- a/extensions/typescript/src/features/completionItemProvider.ts +++ b/extensions/typescript/src/features/completionItemProvider.ts @@ -202,13 +202,12 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP // Prevents incorrectly completing while typing spread operators. if (position.character > 0) { const preText = document.getText(new Range( - new Position(position.line, 0), - new Position(position.line, position.character - 1))); + position.line, 0, + position.line, position.character - 1)); enableDotCompletions = preText.match(/[a-z_$\)\]\}]\s*$/ig) !== null; } - for (let i = 0; i < body.length; i++) { - const element = body[i]; + for (const element of body) { const item = new MyCompletionItem(position, document, element, enableDotCompletions, !this.config.useCodeSnippetsOnMethodSuggest); completionItems.push(item); } From 44495cb309882753e853c5741203d3da6c6351fb Mon Sep 17 00:00:00 2001 From: Wagner Riffel Date: Wed, 10 May 2017 02:23:38 -0300 Subject: [PATCH 0256/1164] add missing lua goto keyword --- extensions/lua/syntaxes/lua.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/lua/syntaxes/lua.json b/extensions/lua/syntaxes/lua.json index 617dac5dfa6..0bde9524ea4 100644 --- a/extensions/lua/syntaxes/lua.json +++ b/extensions/lua/syntaxes/lua.json @@ -150,7 +150,7 @@ ] }, { - "match": "\\b(break|do|else|for|if|elseif|return|then|repeat|while|until|end|function|local|in)\\b", + "match": "\\b(break|do|else|for|if|elseif|goto|return|then|repeat|while|until|end|function|local|in)\\b", "name": "keyword.control.lua" }, { @@ -189,4 +189,4 @@ "scopeName": "source.lua", "uuid": "93E017CC-6F27-11D9-90EB-000D93589AF7", "version": "https://github.com/textmate/lua.tmbundle/commit/609fe340f40b31f4189dabbb38f885b58cf0dd26" -} \ No newline at end of file +} From 6254814d850e43303c85702120a523a5030483ce Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 10 May 2017 07:51:35 +0200 Subject: [PATCH 0257/1164] theming - progress bar --- .../theme-abyss/themes/abyss-color-theme.json | 1 + .../themes/kimbie-dark-color-theme.json | 3 +- .../themes/monokai-color-theme.json | 1 + .../themes/quietlight-color-theme.json | 3 +- .../theme-red/themes/Red-color-theme.json | 3 +- .../themes/solarized-dark-color-theme.json | 1 + .../themes/solarized-light-color-theme.json | 1 + .../themes/tomorrow-night-blue-theme.json | 1 + .../ui/keybindingLabel/keybindingLabel.css | 14 +++---- .../browser/ui/progressbar/progressbar.css | 3 +- .../browser/ui/progressbar/progressbar.ts | 39 ++++++++++++++++++- .../quickopen/browser/quickOpenWidget.ts | 12 +++++- src/vs/platform/theme/common/colorRegistry.ts | 2 + src/vs/platform/theme/common/styler.ts | 10 ++++- .../workbench/browser/parts/compositePart.ts | 2 + .../parts/editor/editorGroupsControl.ts | 2 + 16 files changed, 81 insertions(+), 17 deletions(-) diff --git a/extensions/theme-abyss/themes/abyss-color-theme.json b/extensions/theme-abyss/themes/abyss-color-theme.json index d45846b0d16..b244eb1cd6a 100644 --- a/extensions/theme-abyss/themes/abyss-color-theme.json +++ b/extensions/theme-abyss/themes/abyss-color-theme.json @@ -271,6 +271,7 @@ "inputValidation.errorBorder": "#AB395B", "badge.background": "#0063a5", + "progressBar.background": "#0063a5", "dropdown.background": "#181f2f", // "dropdown.foreground": "", diff --git a/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json b/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json index 2a9958948d8..2d5e0fadb31 100644 --- a/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json +++ b/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json @@ -43,7 +43,8 @@ // "inputValidation.warningBorder": "#5B7E7A", "inputValidation.errorBackground": "#5f0d0d", "inputValidation.errorBorder": "#9d2f23", - "badge.background": "#7f5d38" + "badge.background": "#7f5d38", + "progressBar.background": "#7f5d38" }, "tokenColors": [ { diff --git a/extensions/theme-monokai/themes/monokai-color-theme.json b/extensions/theme-monokai/themes/monokai-color-theme.json index b2ec0a432b1..439bf32d607 100644 --- a/extensions/theme-monokai/themes/monokai-color-theme.json +++ b/extensions/theme-monokai/themes/monokai-color-theme.json @@ -28,6 +28,7 @@ "tab.border": "#1e1f1c", "tab.inactiveForeground": "#ccccc7", // needs to be bright so it's readable when another editor group is focused "widget.shadow": "#1e1f1c", + "progressBar.background": "#75715E", "badge.background": "#75715E", "badge.foreground": "#f8f8f2", "editorLineNumber.foreground": "#90908a", diff --git a/extensions/theme-quietlight/themes/quietlight-color-theme.json b/extensions/theme-quietlight/themes/quietlight-color-theme.json index 4edbd8c1871..db8f30e0db2 100644 --- a/extensions/theme-quietlight/themes/quietlight-color-theme.json +++ b/extensions/theme-quietlight/themes/quietlight-color-theme.json @@ -496,6 +496,7 @@ "inputValidation.warningBorder": "#ffe055", "inputValidation.errorBackground": "#ffeaea", "inputValidation.errorBorder": "#f1897f", - "badge.background": "#705697AA" + "badge.background": "#705697AA", + "progressBar.background": "#705697" } } \ No newline at end of file diff --git a/extensions/theme-red/themes/Red-color-theme.json b/extensions/theme-red/themes/Red-color-theme.json index 19e66f7bea3..a35bfe0938b 100644 --- a/extensions/theme-red/themes/Red-color-theme.json +++ b/extensions/theme-red/themes/Red-color-theme.json @@ -50,7 +50,8 @@ "notification.background": "#662222", "pickerGroup.foreground": "#cc9999", "pickerGroup.border": "#ff000033", - "badge.background": "#cc3333" + "badge.background": "#cc3333", + "progressBar.background": "#cc3333" }, "name": "Red" } \ No newline at end of file diff --git a/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json b/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json index b1e0133a628..c89667099de 100644 --- a/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json +++ b/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json @@ -315,6 +315,7 @@ "inputValidation.errorBorder": "#a92049", "badge.background": "#047aa6", + "progressBar.background": "#047aa6", "dropdown.background": "#00212B", "dropdown.border": "#2AA19899", diff --git a/extensions/theme-solarized-light/themes/solarized-light-color-theme.json b/extensions/theme-solarized-light/themes/solarized-light-color-theme.json index 71b344458d1..0c3123614c0 100644 --- a/extensions/theme-solarized-light/themes/solarized-light-color-theme.json +++ b/extensions/theme-solarized-light/themes/solarized-light-color-theme.json @@ -314,6 +314,7 @@ // "inputValidation.errorBorder": "", "badge.background": "#B58900AA", + "progressBar.background": "#B58900", "dropdown.background": "#EEE8D5", // "dropdown.foreground": "", diff --git a/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-theme.json b/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-theme.json index 4ba744d26ba..319f8be0a61 100644 --- a/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-theme.json +++ b/extensions/theme-tomorrow-night-blue/themes/tomorrow-night-blue-theme.json @@ -31,6 +31,7 @@ "statusBar.noFolderBackground": "#001126", "statusBar.debuggingBackground": "#001126", "activityBar.background": "#001733", + "progressBar.background": "#bbdaffcc", "badge.background": "#bbdaffcc", "badge.foreground": "#001733", "sideBar.background": "#001c40", diff --git a/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.css b/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.css index 6c7d094804a..bb681b3a863 100644 --- a/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.css +++ b/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.css @@ -9,11 +9,11 @@ .monaco-kbkey { display: inline-block; - border: solid 1px #ccc; - border-bottom-color: #bbb; + border: solid 1px rgba(204, 204, 204, 0.4); + border-bottom-color: rgba(187, 187, 187, 0.4); border-radius: 3px; - box-shadow: inset 0 -1px 0 #bbb; - background-color: #ddd; + box-shadow: inset 0 -1px 0 rgba(187, 187, 187, 0.4); + background-color: rgba(221, 221, 221, 0.4); vertical-align: middle; color: #555; line-height: 10px; @@ -25,7 +25,7 @@ .vs-dark .monaco-kbkey { background-color: rgba(128, 128, 128, 0.17); color: #ccc; - border: solid 1px #333; - border-bottom-color: #444; - box-shadow: inset 0 -1px 0 #444; + border: solid 1px rgba(51, 51, 51, 0.6); + border-bottom-color: rgba(68, 68, 68, 0.6); + box-shadow: inset 0 -1px 0 rgba(68, 68, 68, 0.6); } \ No newline at end of file diff --git a/src/vs/base/browser/ui/progressbar/progressbar.css b/src/vs/base/browser/ui/progressbar/progressbar.css index b067d6edefb..511f186b224 100644 --- a/src/vs/base/browser/ui/progressbar/progressbar.css +++ b/src/vs/base/browser/ui/progressbar/progressbar.css @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ .progress-container { width: 100%; - height: 5px; + height: 5px; } .progress-container .progress-bit { @@ -13,7 +13,6 @@ position: absolute; left: 0; display: none; - background-color: #0E70C0; } .progress-container.active .progress-bit { diff --git a/src/vs/base/browser/ui/progressbar/progressbar.ts b/src/vs/base/browser/ui/progressbar/progressbar.ts index 70fb8421bc6..cbd7de00da0 100644 --- a/src/vs/base/browser/ui/progressbar/progressbar.ts +++ b/src/vs/base/browser/ui/progressbar/progressbar.ts @@ -11,6 +11,8 @@ import assert = require('vs/base/common/assert'); import { Builder, $ } from 'vs/base/browser/builder'; import DOM = require('vs/base/browser/dom'); import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { Color } from "vs/base/common/color"; +import { mixin } from "vs/base/common/objects"; const css_done = 'done'; const css_active = 'active'; @@ -19,11 +21,22 @@ const css_discrete = 'discrete'; const css_progress_container = 'progress-container'; const css_progress_bit = 'progress-bit'; +export interface IProgressBarOptions extends IProgressBarStyles { +} + +export interface IProgressBarStyles { + progressBarBackground?: Color; +} + +const defaultOpts = { + progressBarBackground: Color.fromHex('#0E70C0') +}; + /** * A progress bar with support for infinite or discrete progress. */ export class ProgressBar { - + private options: IProgressBarOptions; private toUnbind: IDisposable[]; private workedVal: number; private element: Builder; @@ -31,11 +44,17 @@ export class ProgressBar { private bit: HTMLElement; private totalWork: number; private animationStopToken: ValueCallback; + private progressBarBackground: Color; + + constructor(builder: Builder, options?: IProgressBarOptions) { + this.options = options || Object.create(null); + mixin(this.options, defaultOpts, false); - constructor(builder: Builder) { this.toUnbind = []; this.workedVal = 0; + this.progressBarBackground = this.options.progressBarBackground; + this.create(builder); } @@ -61,6 +80,8 @@ export class ProgressBar { this.bit = builder.getHTMLElement(); }); + + this.applyStyles(); } private off(): void { @@ -189,6 +210,20 @@ export class ProgressBar { return $(this.element); } + public style(styles: IProgressBarStyles): void { + this.progressBarBackground = styles.progressBarBackground; + + this.applyStyles(); + } + + protected applyStyles(): void { + if (this.element) { + const background = this.progressBarBackground ? this.progressBarBackground.toString() : null; + + this.element.style('background-color', background); + } + } + public dispose(): void { this.toUnbind = dispose(this.toUnbind); } diff --git a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts index d83ef8e8380..035dbca0d27 100644 --- a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts +++ b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts @@ -53,6 +53,7 @@ export interface IQuickOpenStyles extends IInputBoxStyles, ITreeStyles { pickerGroupForeground?: Color; pickerGroupBorder?: Color; widgetShadow?: Color; + progressBarBackground?: Color; } export interface IShowOptions { @@ -86,7 +87,8 @@ const defaultStyles = { foreground: Color.fromHex('#CCCCCC'), pickerGroupForeground: Color.fromHex('#0097FB'), pickerGroupBorder: Color.fromHex('#3F3F46'), - widgetShadow: Color.fromHex('#000000') + widgetShadow: Color.fromHex('#000000'), + progressBarBackground: Color.fromHex('#0E70C0') }; const DEFAULT_INPUT_ARIA_LABEL = nls.localize('quickOpenAriaLabel', "Quick picker. Type to narrow down results."); @@ -159,7 +161,7 @@ export class QuickOpenWidget implements IModelProvider { .on(DOM.EventType.BLUR, (e: Event) => this.loosingFocus(e), null, true); // Progress Bar - this.progressBar = new ProgressBar(div.clone()); + this.progressBar = new ProgressBar(div.clone(), { progressBarBackground: this.styles.progressBarBackground }); this.progressBar.getContainer().hide(); // Input Field @@ -352,6 +354,12 @@ export class QuickOpenWidget implements IModelProvider { this.builder.style('box-shadow', widgetShadow ? `0 5px 8px ${widgetShadow}` : null); } + if (this.progressBar) { + this.progressBar.style({ + progressBarBackground: this.styles.progressBarBackground + }); + } + if (this.inputBox) { this.inputBox.style({ inputBackground: this.styles.inputBackground, diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 314e9a861a2..4a597b87fd1 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -194,6 +194,8 @@ export const scrollbarSliderBackground = registerColor('scrollbarSlider.backgrou export const scrollbarSliderHoverBackground = registerColor('scrollbarSlider.hoverBackground', { dark: Color.fromHex('#646464').transparent(0.7), light: Color.fromHex('#646464').transparent(0.7), hc: transparent(contrastBorder, 0.8) }, nls.localize('scrollbarSliderHoverBackground', "Slider background color when hovering.")); export const scrollbarSliderActiveBackground = registerColor('scrollbarSlider.activeBackground', { dark: Color.fromHex('#BFBFBF').transparent(0.4), light: Color.fromHex('#000000').transparent(0.6), hc: contrastBorder }, nls.localize('scrollbarSliderActiveBackground', "Slider background color when active.")); +export const progressBarBackground = registerColor('progressBar.background', { dark: Color.fromHex('#0E70C0'), light: Color.fromHex('#0E70C0'), hc: contrastBorder }, nls.localize('progressBarBackground', "Background color of the progress bar that can show for long running operations.")); + /** * Editor background color. * Because of bug https://monacotools.visualstudio.com/DefaultCollection/Monaco/_workitems/edit/13254 diff --git a/src/vs/platform/theme/common/styler.ts b/src/vs/platform/theme/common/styler.ts index ec9ad4240dd..3d560356676 100644 --- a/src/vs/platform/theme/common/styler.ts +++ b/src/vs/platform/theme/common/styler.ts @@ -6,7 +6,7 @@ 'use strict'; import { ITheme, IThemeService } from 'vs/platform/theme/common/themeService'; -import { inputBackground, inputForeground, ColorIdentifier, selectForeground, selectBackground, selectBorder, inputBorder, foreground, editorBackground, contrastBorder, inputActiveOptionBorder, listFocusBackground, listActiveSelectionBackground, listActiveSelectionForeground, listInactiveSelectionForeground, listInactiveSelectionBackground, listHoverBackground, listDropBackground, pickerGroupBorder, pickerGroupForeground, widgetShadow, inputValidationInfoBorder, inputValidationInfoBackground, inputValidationWarningBorder, inputValidationWarningBackground, inputValidationErrorBorder, inputValidationErrorBackground, activeContrastBorder, buttonForeground, buttonBackground, buttonHoverBackground, ColorFunction, lighten, badgeBackground, badgeForeground } from 'vs/platform/theme/common/colorRegistry'; +import { inputBackground, inputForeground, ColorIdentifier, selectForeground, selectBackground, selectBorder, inputBorder, foreground, editorBackground, contrastBorder, inputActiveOptionBorder, listFocusBackground, listActiveSelectionBackground, listActiveSelectionForeground, listInactiveSelectionForeground, listInactiveSelectionBackground, listHoverBackground, listDropBackground, pickerGroupBorder, pickerGroupForeground, widgetShadow, inputValidationInfoBorder, inputValidationInfoBackground, inputValidationWarningBorder, inputValidationWarningBackground, inputValidationErrorBorder, inputValidationErrorBackground, activeContrastBorder, buttonForeground, buttonBackground, buttonHoverBackground, ColorFunction, lighten, badgeBackground, badgeForeground, progressBarBackground } from 'vs/platform/theme/common/colorRegistry'; import { IDisposable } from 'vs/base/common/lifecycle'; import { SIDE_BAR_SECTION_HEADER_BACKGROUND } from 'vs/workbench/common/theme'; @@ -123,6 +123,7 @@ export function attachQuickOpenStyler(widget: IThemable, themeService: IThemeSer background?: ColorIdentifier, borderColor?: ColorIdentifier, widgetShadow?: ColorIdentifier, + progressBarBackground?: ColorIdentifier, inputBackground?: ColorIdentifier, inputForeground?: ColorIdentifier, inputBorder?: ColorIdentifier, @@ -152,6 +153,7 @@ export function attachQuickOpenStyler(widget: IThemable, themeService: IThemeSer background: (style && style.background) || editorBackground, borderColor: style && style.borderColor || contrastBorder, widgetShadow: style && style.widgetShadow || widgetShadow, + progressBarBackground: style && style.progressBarBackground || progressBarBackground, pickerGroupForeground: style && style.pickerGroupForeground || pickerGroupForeground, pickerGroupBorder: style && style.pickerGroupBorder || pickerGroupBorder, inputBackground: (style && style.inputBackground) || inputBackground, @@ -228,6 +230,12 @@ export function attachButtonStyler(widget: IThemable, themeService: IThemeServic }, widget); } +export function attachProgressBarStyler(widget: IThemable, themeService: IThemeService, style?: { progressBarBackground?: ColorIdentifier }): IDisposable { + return doAttachStyler(themeService, { + progressBarBackground: (style && style.progressBarBackground) || progressBarBackground + }, widget); +} + export function attachStylerCallback(themeService: IThemeService, colors: { [name: string]: ColorIdentifier }, callback: styleFn): IDisposable { return doAttachStyler(themeService, colors, callback); } \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index 6579242059a..bb92039a1f0 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -36,6 +36,7 @@ import { IProgressService } from 'vs/platform/progress/common/progress'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { attachProgressBarStyler } from "vs/platform/theme/common/styler"; export interface ICompositeTitleLabel { @@ -487,6 +488,7 @@ export abstract class CompositePart extends Part { 'class': 'content' }, (div: Builder) => { this.progressBar = new ProgressBar(div); + this.toUnbind.push(attachProgressBarStyler(this.progressBar, this.themeService)); this.progressBar.getContainer().hide(); }); } diff --git a/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts b/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts index 898e5b288e8..0a9a2dd62d4 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts @@ -36,6 +36,7 @@ import { getCodeEditor } from 'vs/editor/common/services/codeEditorService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { editorBackground, contrastBorder, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { Themable, TABS_CONTAINER_BACKGROUND, EDITOR_GROUP_HEADER_BACKGROUND, EDITOR_GROUP_BORDER_COLOR, EDITOR_DRAG_AND_DROP_BACKGROUND, EDITOR_GROUP_BACKGROUND } from 'vs/workbench/common/theme'; +import { attachProgressBarStyler } from "vs/platform/theme/common/styler"; export enum Rochade { NONE, @@ -991,6 +992,7 @@ export class EditorGroupsControl extends Themable implements IEditorGroupsContro // Progress Bar const progressBar = new ProgressBar($(container)); + this.toUnbind.push(attachProgressBarStyler(progressBar, this.themeService)); progressBar.getContainer().hide(); container.setProperty(EditorGroupsControl.PROGRESS_BAR_CONTROL_KEY, progressBar); // associate with container }); From a890ca1c73aab6f8837b3b53f7f33be9ac16d280 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 10 May 2017 08:00:04 +0200 Subject: [PATCH 0258/1164] :lipstick: --- .../workbench/browser/parts/editor/textEditor.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/textEditor.ts b/src/vs/workbench/browser/parts/editor/textEditor.ts index 18033e72569..e485441f65f 100644 --- a/src/vs/workbench/browser/parts/editor/textEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textEditor.ts @@ -250,14 +250,14 @@ export abstract class BaseTextEditor extends BaseEditor { const editorViewState = this.getControl().saveViewState(); - let fileViewState: ITextEditorViewState = textEditorViewStateMemento[key]; - if (!fileViewState) { - fileViewState = Object.create(null); - textEditorViewStateMemento[key] = fileViewState; + let lastKnownViewState: ITextEditorViewState = textEditorViewStateMemento[key]; + if (!lastKnownViewState) { + lastKnownViewState = Object.create(null); + textEditorViewStateMemento[key] = lastKnownViewState; } if (typeof this.position === 'number') { - fileViewState[this.position] = editorViewState; + lastKnownViewState[this.position] = editorViewState; } } @@ -279,9 +279,9 @@ export abstract class BaseTextEditor extends BaseEditor { const memento = this.getMemento(this.storageService, Scope.WORKSPACE); const textEditorViewStateMemento = memento[TEXT_EDITOR_VIEW_STATE_PREFERENCE_KEY]; if (textEditorViewStateMemento) { - const fileViewState: ITextEditorViewState = textEditorViewStateMemento[key]; - if (fileViewState) { - return fileViewState[this.position]; + const viewState: ITextEditorViewState = textEditorViewStateMemento[key]; + if (viewState) { + return viewState[this.position]; } } From b2d5ca8c1faf4dbb79a79d67c7884a82a665248e Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 10 May 2017 08:16:09 +0200 Subject: [PATCH 0259/1164] clarify settings description --- src/vs/workbench/electron-browser/main.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index f20818fcf5c..520d6c4c313 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -249,7 +249,7 @@ Note that there can still be cases where this setting is ignored (e.g. when usin nls.localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'window.newWindowDimensions.fullscreen' }, "Open new windows in full screen mode.") ], 'default': 'default', - 'description': nls.localize('newWindowDimensions', "Controls the dimensions of opening a new window. By default, a new window will open in the center of the screen with small dimensions. When set to 'inherit', the window will get the same dimensions as the last active one. When set to 'maximized', the window will open maximized and fullscreen if configured to 'fullscreen'.") + 'description': nls.localize('newWindowDimensions', "Controls the dimensions of opening a new window when at least one window is already opened. By default, a new window will open in the center of the screen with small dimensions. When set to 'inherit', the window will get the same dimensions as the last window that was active. When set to 'maximized', the window will open maximized and fullscreen if configured to 'fullscreen'. Note that this setting does not have an impact on the first window that is opened. The first window will always restore the size and location as you left it before closing.") }, }; From 4f4a663a601ab30eed9a3da7e1d2ab04b3397b18 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 9 May 2017 23:22:44 -0700 Subject: [PATCH 0260/1164] update highlight js version --- extensions/markdown/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/markdown/package.json b/extensions/markdown/package.json index c0917c8bcba..972deeb93dd 100644 --- a/extensions/markdown/package.json +++ b/extensions/markdown/package.json @@ -204,7 +204,7 @@ "update-grammar": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ./syntaxes/gulpfile.js" }, "dependencies": { - "highlight.js": "^9.3.0", + "highlight.js": "^9.11.0", "markdown-it": "^8.3.1", "markdown-it-named-headers": "0.0.4", "vscode-extension-telemetry": "^0.0.7", From 2c7516672ea9f6ff057a83720d75b05bcfd5577c Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 9 May 2017 23:23:51 -0700 Subject: [PATCH 0261/1164] Cleanup some TS files --- .../typescript/src/features/baseCodeLensProvider.ts | 11 +++++++---- .../src/features/implementationsCodeLensProvider.ts | 6 +++--- .../src/features/referencesCodeLensProvider.ts | 6 +++--- extensions/typescript/src/typescriptServiceClient.ts | 7 ++++--- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/extensions/typescript/src/features/baseCodeLensProvider.ts b/extensions/typescript/src/features/baseCodeLensProvider.ts index 986cb09b8d0..dbfd54eb391 100644 --- a/extensions/typescript/src/features/baseCodeLensProvider.ts +++ b/extensions/typescript/src/features/baseCodeLensProvider.ts @@ -5,7 +5,7 @@ 'use strict'; -import { CodeLensProvider, CodeLens, CancellationToken, TextDocument, Range, Uri, Position, Event, EventEmitter, workspace, } from 'vscode'; +import { CodeLensProvider, CodeLens, CancellationToken, TextDocument, Range, Uri, Position, Event, EventEmitter, workspace, ProviderResult, } from 'vscode'; import * as Proto from '../protocol'; import { ITypescriptServiceClient } from '../typescriptService'; @@ -42,14 +42,14 @@ export abstract class TypeScriptBaseCodeLensProvider implements CodeLensProvider } } - provideCodeLenses(document: TextDocument, token: CancellationToken): Promise { + provideCodeLenses(document: TextDocument, token: CancellationToken): ProviderResult { if (!this.enabled) { - return Promise.resolve([]); + return []; } const filepath = this.client.normalizePath(document.uri); if (!filepath) { - return Promise.resolve([]); + return []; } return this.client.execute('navtree', { file: filepath }, token).then(response => { if (!response) { @@ -61,6 +61,9 @@ export abstract class TypeScriptBaseCodeLensProvider implements CodeLensProvider tree.childItems.forEach(item => this.walkNavTree(document, item, null, referenceableSpans)); } return referenceableSpans.map(span => new ReferencesCodeLens(document.uri, filepath, span)); + }, (err: any) => { + this.client.error(`'navtree' request failed with error.`, err); + return []; }); } diff --git a/extensions/typescript/src/features/implementationsCodeLensProvider.ts b/extensions/typescript/src/features/implementationsCodeLensProvider.ts index ad083c2cbe4..11f9e99da7c 100644 --- a/extensions/typescript/src/features/implementationsCodeLensProvider.ts +++ b/extensions/typescript/src/features/implementationsCodeLensProvider.ts @@ -5,7 +5,7 @@ 'use strict'; -import { CodeLens, CancellationToken, TextDocument, Range, Location } from 'vscode'; +import { CodeLens, CancellationToken, TextDocument, Range, Location, ProviderResult } from 'vscode'; import * as Proto from '../protocol'; import * as PConst from '../protocol.const'; @@ -22,9 +22,9 @@ export default class TypeScriptImplementationsCodeLensProvider extends TypeScrip super(client, 'implementationsCodeLens.enabled'); } - provideCodeLenses(document: TextDocument, token: CancellationToken): Promise { + provideCodeLenses(document: TextDocument, token: CancellationToken): ProviderResult { if (!this.client.apiVersion.has220Features()) { - return Promise.resolve([]); + return []; } return super.provideCodeLenses(document, token); } diff --git a/extensions/typescript/src/features/referencesCodeLensProvider.ts b/extensions/typescript/src/features/referencesCodeLensProvider.ts index b5d249d6d45..ffd29559e1c 100644 --- a/extensions/typescript/src/features/referencesCodeLensProvider.ts +++ b/extensions/typescript/src/features/referencesCodeLensProvider.ts @@ -5,7 +5,7 @@ 'use strict'; -import { CodeLens, CancellationToken, TextDocument, Range, Location } from 'vscode'; +import { CodeLens, CancellationToken, TextDocument, Range, Location, ProviderResult } from 'vscode'; import * as Proto from '../protocol'; import * as PConst from '../protocol.const'; @@ -22,9 +22,9 @@ export default class TypeScriptReferencesCodeLensProvider extends TypeScriptBase super(client, 'referencesCodeLens.enabled'); } - provideCodeLenses(document: TextDocument, token: CancellationToken): Promise { + provideCodeLenses(document: TextDocument, token: CancellationToken): ProviderResult { if (!this.client.apiVersion.has206Features()) { - return Promise.resolve([]); + return []; } return super.provideCodeLenses(document, token); } diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index f6292a584ca..68320e06384 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -917,7 +917,8 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient return Uri.file(filepath); } - public execute(command: string, args: any, expectsResultOrToken?: boolean | CancellationToken, token?: CancellationToken): Promise { + public execute(command: string, args: any, expectsResultOrToken?: boolean | CancellationToken): Promise { + let token: CancellationToken | undefined = undefined; let expectsResult = true; if (typeof expectsResultOrToken === 'boolean') { expectsResult = expectsResultOrToken; @@ -925,13 +926,13 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient token = expectsResultOrToken; } - let request: Proto.Request = { + const request: Proto.Request = { seq: this.sequenceNumber++, type: 'request', command: command, arguments: args }; - let requestInfo: RequestItem = { + const requestInfo: RequestItem = { request: request, promise: null, callbacks: null From f70dc43026ac0f3f950f85db286a4260f87c220e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 10 May 2017 09:38:59 +0200 Subject: [PATCH 0262/1164] single snippet controller to begin with --- .../snippet/browser/snippetController2.ts | 74 +++++------ .../test/browser/snippetController2.test.ts | 120 +++++++++--------- 2 files changed, 86 insertions(+), 108 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 84ce4e1e637..77c957ec02a 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -23,7 +23,7 @@ export class SnippetController2 { private readonly _hasNextTabstop: IContextKey; private readonly _hasPrevTabstop: IContextKey; - private _snippetStack: SnippetSession[] = []; + private _snippet: SnippetSession; private _snippetListener: IDisposable[] = []; constructor( @@ -37,7 +37,7 @@ export class SnippetController2 { dispose(): void { this._inSnippet.reset(); - dispose(this._snippetStack); + dispose(this._snippet); } getId(): string { @@ -45,67 +45,51 @@ export class SnippetController2 { } insert(template: string, overwriteBefore: number = 0, overwriteAfter: number = 0): void { - const session = new SnippetSession(this._editor, template, overwriteBefore, overwriteAfter); - const newLen = this._snippetStack.unshift(session); - if (newLen === 1) { - this._inSnippet.set(true); - this._snippetListener = [this._editor.onDidChangeCursorSelection(() => this._updateState())]; + + if (this._snippet) { + this.abort(); } - session.insert(); + + this._snippet = new SnippetSession(this._editor, template, overwriteBefore, overwriteAfter); + this._snippetListener = [this._editor.onDidChangeCursorSelection(() => this._updateState())]; + this._snippet.insert(); } private _updateState(): void { - if (!this._snippetStack[0].validateSelections()) { + if (!this._snippet) { + return; + } + if (this._snippet.isAtFinalPlaceholder || !this._snippet.validateSelections()) { return this.abort(); } - let prev = false; - let next = false; - for (let i = 0; i < this._snippetStack.length && !(prev && next); i++) { - if (!this._snippetStack[i].isAtFirstPlaceholder) { - prev = true; - } - if (!this._snippetStack[i].isAtFinalPlaceholder) { - next = true; - } - } - this._hasNextTabstop.set(next); - this._hasPrevTabstop.set(prev); + this._hasPrevTabstop.set(!this._snippet.isAtFirstPlaceholder); + this._hasNextTabstop.set(!this._snippet.isAtFinalPlaceholder); + this._inSnippet.set(true); } abort(): void { - - // remove current, check for next - const element = this._snippetStack.shift(); - dispose(element); - - // clean up if last snippet is gone - // or validate the new active snippet - if (this._snippetStack.length === 0) { - this._inSnippet.set(false); - this._hasNextTabstop.set(false); - this._hasPrevTabstop.set(false); - this._snippetListener = dispose(this._snippetListener); - - } else { - // - this._updateState(); + if (this._snippet) { + this._hasPrevTabstop.reset(); + this._hasNextTabstop.reset(); + this._inSnippet.reset(); + dispose(this._snippetListener); + dispose(this._snippet); + this._snippet = undefined; } } prev(): void { - for (let i = 0; i < this._snippetStack.length; i++) { - if (this._snippetStack[i].prev()) { - return; - } + if (this._snippet) { + this._snippet.prev(); + this._updateState(); } } next(): void { - for (let i = 0; i < this._snippetStack.length; i++) { - if (this._snippetStack[i].next()) { - return; - } + if (this._snippet) { + this._snippet.next(); + this._updateState(); } } diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts index c43ab3283b3..c26f1be9c32 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts @@ -22,6 +22,12 @@ suite('SnippetController2', function () { assert.equal(s.length, 0); } + function assertContextKeys(service: MockContextKeyService, inSnippet: boolean, hasPrev: boolean, hasNext: boolean): void { + assert.equal(SnippetController2.InSnippetMode.getValue(service), inSnippet, `inSnippetMode`); + assert.equal(SnippetController2.HasPrevTabstop.getValue(service), hasPrev, `HasPrevTabstop`); + assert.equal(SnippetController2.HasNextTabstop.getValue(service), hasNext, `HasNextTabstop`); + } + let editor: ICommonCodeEditor; let model: Model; let contextKeys: MockContextKeyService; @@ -40,7 +46,7 @@ suite('SnippetController2', function () { test('creation', function () { const ctrl = new SnippetController2(editor, contextKeys); - assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), false); + assertContextKeys(contextKeys, false, false, false); ctrl.dispose(); }); @@ -48,11 +54,11 @@ suite('SnippetController2', function () { const ctrl = new SnippetController2(editor, contextKeys); ctrl.insert('foo${1:bar}foo$0'); - assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); + assertContextKeys(contextKeys, true, false, true); assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); ctrl.abort(); - assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), false); + assertContextKeys(contextKeys, false, false, false); assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); }); @@ -60,27 +66,45 @@ suite('SnippetController2', function () { const ctrl = new SnippetController2(editor, contextKeys); ctrl.insert('${1:one}${2:two}$0'); - assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); - assert.equal(SnippetController2.HasNextTabstop.getValue(contextKeys), true); - assert.equal(SnippetController2.HasPrevTabstop.getValue(contextKeys), false); + assertContextKeys(contextKeys, true, false, true); ctrl.next(); - assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); - assert.equal(SnippetController2.HasNextTabstop.getValue(contextKeys), true); - assert.equal(SnippetController2.HasPrevTabstop.getValue(contextKeys), true); + assertContextKeys(contextKeys, true, true, true); ctrl.next(); - assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); + assertContextKeys(contextKeys, false, false, false); + + editor.trigger('test', 'type', { text: '\t' }); + assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), false); assert.equal(SnippetController2.HasNextTabstop.getValue(contextKeys), false); - assert.equal(SnippetController2.HasPrevTabstop.getValue(contextKeys), true); - - // editor.trigger('test', 'type', { text: '\t' }); - // assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), false); - // assert.equal(SnippetController2.HasNextTabstop.getValue(contextKeys), false); - // assert.equal(SnippetController2.HasPrevTabstop.getValue(contextKeys), false); + assert.equal(SnippetController2.HasPrevTabstop.getValue(contextKeys), false); }); - test('insert, insert -> cursor moves out', function () { + test('insert, insert -> cursor moves out (left/right)', function () { + const ctrl = new SnippetController2(editor, contextKeys); + + ctrl.insert('foo${1:bar}foo$0'); + assertContextKeys(contextKeys, true, false, true); + assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); + + // bad selection change + editor.setSelections([new Selection(1, 12, 1, 12), new Selection(2, 16, 2, 16)]); + assertContextKeys(contextKeys, false, false, false); + }); + + test('insert, insert -> cursor moves out (up/down)', function () { + const ctrl = new SnippetController2(editor, contextKeys); + + ctrl.insert('foo${1:bar}foo$0'); + assertContextKeys(contextKeys, true, false, true); + assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); + + // bad selection change + editor.setSelections([new Selection(2, 4, 2, 7), new Selection(3, 8, 3, 11)]); + assertContextKeys(contextKeys, false, false, false); + }); + + test('insert, insert -> cursors collapse', function () { const ctrl = new SnippetController2(editor, contextKeys); ctrl.insert('foo${1:bar}foo$0'); @@ -88,61 +112,31 @@ suite('SnippetController2', function () { assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); // bad selection change - editor.setSelections([new Selection(1, 12, 1, 12), new Selection(2, 16, 2, 16)]); - assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), false); + editor.setSelections([new Selection(1, 4, 1, 7)]); + assertContextKeys(contextKeys, false, false, false); }); - test('insert, nested -> cursor moves out 1/2', function () { - + test('insert, delete snippet text', function () { const ctrl = new SnippetController2(editor, contextKeys); - ctrl.insert('foo${1:bar}foo$0'); - assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); - assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); + ctrl.insert('${1:foobar}$0'); + assertContextKeys(contextKeys, true, false, true); + assertSelections(editor, new Selection(1, 1, 1, 7), new Selection(2, 5, 2, 11)); - ctrl.insert('ff$1bb$0'); - assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); - assertSelections(editor, new Selection(1, 6, 1, 6), new Selection(2, 10, 2, 10)); + editor.trigger('test', 'deleteLeft', {}); + assertContextKeys(contextKeys, true, false, true); + assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); - // bad selection - editor.setSelections([new Selection(3, 1, 3, 1), new Selection(1, 6, 1, 6)]); - assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), false); - }); - - test('insert, nested -> cursor moves out 2/2', function () { - - const ctrl = new SnippetController2(editor, contextKeys); - - ctrl.insert('foo${1:bar}foo$0'); - assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); - assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); - - ctrl.insert('ff$1bb$0'); - assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); - assertSelections(editor, new Selection(1, 6, 1, 6), new Selection(2, 10, 2, 10)); - - // select outer snippet - editor.setSelections([new Selection(1, 3, 1, 3), new Selection(2, 6, 2, 6)]); - assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); + editor.trigger('test', 'type', { text: 'abc' }); + assertContextKeys(contextKeys, true, false, true); ctrl.next(); - assert.equal(model.getValue(), 'fooffbbfooif\n fooffbbfoo$state\nfi'); - assertSelections(editor, new Selection(1, 11, 1, 11), new Selection(2, 15, 2, 15)); - assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); - }); + assertContextKeys(contextKeys, false, false, false); - test('insert, nested -> tab across all', function () { - const ctrl = new SnippetController2(editor, contextKeys); - - ctrl.insert('outer$1outer$0'); - assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); - assert.equal(SnippetController2.HasNextTabstop.getValue(contextKeys), true); - assert.equal(SnippetController2.HasPrevTabstop.getValue(contextKeys), false); - - ctrl.insert('inner$1inner$0'); - assert.equal(SnippetController2.InSnippetMode.getValue(contextKeys), true); - assert.equal(SnippetController2.HasNextTabstop.getValue(contextKeys), true); - // assert.equal(SnippetController2.HasPrevTabstop.getValue(contextKeys), true); + editor.trigger('test', 'tab', {}); + assertContextKeys(contextKeys, false, false, false); + // editor.trigger('test', 'type', { text: 'abc' }); + // assertContextKeys(contextKeys, false, false, false); }); }); From 9a0918eb81c63a1c0daf8a0acd5ee570bebde4e5 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 10 May 2017 08:49:58 +0200 Subject: [PATCH 0263/1164] Keep JSON nls free (for Microsoft/node-jsonc-parser#2) --- src/vs/base/common/json.ts | 18 ----------------- src/vs/base/common/jsonErrorMessages.ts | 27 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 18 deletions(-) create mode 100644 src/vs/base/common/jsonErrorMessages.ts diff --git a/src/vs/base/common/json.ts b/src/vs/base/common/json.ts index f6391913084..c54e96c9e9d 100644 --- a/src/vs/base/common/json.ts +++ b/src/vs/base/common/json.ts @@ -4,8 +4,6 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { localize } from 'vs/nls'; - export enum ScanError { None, UnexpectedEndOfComment, @@ -637,22 +635,6 @@ export enum ParseErrorCode { EndOfFileExpected } -export function getParseErrorMessage(errorCode: ParseErrorCode): string { - switch (errorCode) { - case ParseErrorCode.InvalidSymbol: return localize('error.invalidSymbol', 'Invalid symbol'); - case ParseErrorCode.InvalidNumberFormat: return localize('error.invalidNumberFormat', 'Invalid number format'); - case ParseErrorCode.PropertyNameExpected: return localize('error.propertyNameExpected', 'Property name expected'); - case ParseErrorCode.ValueExpected: return localize('error.valueExpected', 'Value expected'); - case ParseErrorCode.ColonExpected: return localize('error.colonExpected', 'Colon expected'); - case ParseErrorCode.CommaExpected: return localize('error.commaExpected', 'Comma expected'); - case ParseErrorCode.CloseBraceExpected: return localize('error.closeBraceExpected', 'Closing brace expected'); - case ParseErrorCode.CloseBracketExpected: return localize('error.closeBracketExpected', 'Closing bracket expected'); - case ParseErrorCode.EndOfFileExpected: return localize('error.endOfFileExpected', 'End of file expected'); - default: - return ''; - } -} - export type NodeType = 'object' | 'array' | 'property' | 'string' | 'number' | 'boolean' | 'null'; function getLiteralNodeType(value: any): NodeType { diff --git a/src/vs/base/common/jsonErrorMessages.ts b/src/vs/base/common/jsonErrorMessages.ts new file mode 100644 index 00000000000..96edf8e35a4 --- /dev/null +++ b/src/vs/base/common/jsonErrorMessages.ts @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +/** + * Extracted from json.ts to keep json nls free. + */ +import { localize } from 'vs/nls'; +import { ParseErrorCode } from './json'; + +export function getParseErrorMessage(errorCode: ParseErrorCode): string { + switch (errorCode) { + case ParseErrorCode.InvalidSymbol: return localize('error.invalidSymbol', 'Invalid symbol'); + case ParseErrorCode.InvalidNumberFormat: return localize('error.invalidNumberFormat', 'Invalid number format'); + case ParseErrorCode.PropertyNameExpected: return localize('error.propertyNameExpected', 'Property name expected'); + case ParseErrorCode.ValueExpected: return localize('error.valueExpected', 'Value expected'); + case ParseErrorCode.ColonExpected: return localize('error.colonExpected', 'Colon expected'); + case ParseErrorCode.CommaExpected: return localize('error.commaExpected', 'Comma expected'); + case ParseErrorCode.CloseBraceExpected: return localize('error.closeBraceExpected', 'Closing brace expected'); + case ParseErrorCode.CloseBracketExpected: return localize('error.closeBracketExpected', 'Closing bracket expected'); + case ParseErrorCode.EndOfFileExpected: return localize('error.endOfFileExpected', 'End of file expected'); + default: + return ''; + } +} \ No newline at end of file From 6915d0ffc1193e7d38a59a9d239601a84e8f9031 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 10 May 2017 10:09:54 +0200 Subject: [PATCH 0264/1164] Move getParseErrorMessage --- src/vs/base/test/common/json.test.ts | 4 ++-- src/vs/workbench/node/extensionPoints.ts | 5 +++-- .../themes/electron-browser/workbenchThemeService.ts | 3 ++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/vs/base/test/common/json.test.ts b/src/vs/base/test/common/json.test.ts index 5ad413c6f36..42a0804c113 100644 --- a/src/vs/base/test/common/json.test.ts +++ b/src/vs/base/test/common/json.test.ts @@ -6,9 +6,9 @@ import * as assert from 'assert'; import { - SyntaxKind, createScanner, parse, getLocation, Node, ParseError, parseTree, ParseErrorCode, - getParseErrorMessage, ParseOptions, Segment, findNodeAtLocation, getNodeValue, ScanError + SyntaxKind, createScanner, parse, getLocation, Node, ParseError, parseTree, ParseErrorCode, ParseOptions, Segment, findNodeAtLocation, getNodeValue, ScanError } from 'vs/base/common/json'; +import { getParseErrorMessage } from "vs/base/common/jsonErrorMessages"; function assertKinds(text: string, ...kinds: SyntaxKind[]): void { var scanner = createScanner(text); diff --git a/src/vs/workbench/node/extensionPoints.ts b/src/vs/workbench/node/extensionPoints.ts index 1eb54c3f49e..0e485dd8969 100644 --- a/src/vs/workbench/node/extensionPoints.ts +++ b/src/vs/workbench/node/extensionPoints.ts @@ -18,6 +18,7 @@ import Types = require('vs/base/common/types'); import { isValidExtensionDescription } from 'vs/platform/extensions/node/extensionValidator'; import * as semver from 'semver'; import { getIdAndVersionFromLocalExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; +import { getParseErrorMessage } from "vs/base/common/jsonErrorMessages"; const MANIFEST_FILE = 'package.json'; @@ -88,7 +89,7 @@ class ExtensionManifestParser extends ExtensionManifestHandler { try { return JSON.parse(manifestContents.toString()); } catch (e) { - this._collector.error(this._absoluteFolderPath, nls.localize('jsonParseFail', "Failed to parse {0}: {1}.", this._absoluteManifestPath, json.getParseErrorMessage(e.message))); + this._collector.error(this._absoluteFolderPath, nls.localize('jsonParseFail', "Failed to parse {0}: {1}.", this._absoluteManifestPath, getParseErrorMessage(e.message))); } return null; }, (err) => { @@ -123,7 +124,7 @@ class ExtensionManifestNLSReplacer extends ExtensionManifestHandler { return ExtensionManifestNLSReplacer.resolveOriginalMessageBundle(messageBundle.original, errors).then(originalMessages => { if (errors.length > 0) { errors.forEach((error) => { - this._collector.error(this._absoluteFolderPath, nls.localize('jsonsParseFail', "Failed to parse {0} or {1}: {2}.", messageBundle.localized, messageBundle.original, json.getParseErrorMessage(error.error))); + this._collector.error(this._absoluteFolderPath, nls.localize('jsonsParseFail', "Failed to parse {0} or {1}: {2}.", messageBundle.localized, messageBundle.original, getParseErrorMessage(error.error))); }); return extensionDescription; } diff --git a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts index 2b5a118ce74..a72c48e41d8 100644 --- a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts @@ -39,6 +39,7 @@ import pfs = require('vs/base/node/pfs'); import colorThemeSchema = require('vs/workbench/services/themes/common/colorThemeSchema'); import fileIconThemeSchema = require('vs/workbench/services/themes/common/fileIconThemeSchema'); import { IDisposable } from 'vs/base/common/lifecycle'; +import { getParseErrorMessage } from "vs/base/common/jsonErrorMessages"; // implementation @@ -753,7 +754,7 @@ function _loadIconThemeDocument(fileSetPath: string): TPromise 0) { - return TPromise.wrapError(new Error(nls.localize('error.cannotparseicontheme', "Problems parsing file icons file: {0}", errors.map(e => Json.getParseErrorMessage(e.error)).join(', ')))); + return TPromise.wrapError(new Error(nls.localize('error.cannotparseicontheme', "Problems parsing file icons file: {0}", errors.map(e => getParseErrorMessage(e.error)).join(', ')))); } return TPromise.as(contentValue); }); From 2fa0340e39277c42d8f1c6acaa47db0f8c90c09a Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 10 May 2017 10:17:17 +0200 Subject: [PATCH 0265/1164] Move getParseErrorMessage --- .../services/themes/electron-browser/colorThemeData.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts b/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts index b545524e4c1..be888161681 100644 --- a/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts +++ b/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts @@ -20,6 +20,7 @@ import { Extensions, IColorRegistry, ColorIdentifier, editorBackground, editorFo import { ThemeType } from 'vs/platform/theme/common/themeService'; import { Registry } from 'vs/platform/platform'; import { WorkbenchThemeService, IColorCustomizations } from "vs/workbench/services/themes/electron-browser/workbenchThemeService"; +import { getParseErrorMessage } from "vs/base/common/jsonErrorMessages"; let colorRegistry = Registry.as(Extensions.ColorContribution); @@ -181,7 +182,7 @@ function _loadColorThemeFromFile(themePath: string, resultRules: ITokenColorizat let errors: Json.ParseError[] = []; let contentValue = Json.parse(content.toString(), errors); if (errors.length > 0) { - return TPromise.wrapError(new Error(nls.localize('error.cannotparsejson', "Problems parsing JSON theme file: {0}", errors.map(e => Json.getParseErrorMessage(e.error)).join(', ')))); + return TPromise.wrapError(new Error(nls.localize('error.cannotparsejson', "Problems parsing JSON theme file: {0}", errors.map(e => getParseErrorMessage(e.error)).join(', ')))); } let includeCompletes = TPromise.as(null); if (contentValue.include) { From 4272facde798539df42cac22798540f176067ae5 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 10 May 2017 10:37:03 +0200 Subject: [PATCH 0266/1164] fix #26368 --- src/vs/editor/contrib/suggest/browser/suggestController.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggestController.ts b/src/vs/editor/contrib/suggest/browser/suggestController.ts index e19aad6d8ea..c7577e2fc68 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestController.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestController.ts @@ -315,11 +315,11 @@ CommonEditorRegistry.registerEditorCommand(new SuggestCommand({ CommonEditorRegistry.registerEditorCommand(new SuggestCommand({ id: 'acceptSelectedSuggestionOnEnter', - precondition: ContextKeyExpr.and(SuggestContext.Visible, SuggestContext.MakesTextEdit), + precondition: SuggestContext.Visible, handler: x => x.acceptSelectedSuggestion(), kbOpts: { weight: weight, - kbExpr: ContextKeyExpr.and(EditorContextKeys.textFocus, SuggestContext.AcceptSuggestionsOnEnter), + kbExpr: ContextKeyExpr.and(EditorContextKeys.textFocus, SuggestContext.AcceptSuggestionsOnEnter, SuggestContext.MakesTextEdit), primary: KeyCode.Enter } })); From be127659e49981129d0f310a6c2de5392ff3a7a0 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 10 May 2017 10:41:22 +0200 Subject: [PATCH 0267/1164] debug state null guard --- src/vs/workbench/parts/debug/electron-browser/debugService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 19e67a5c86e..4ea09c9bbe3 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -453,7 +453,7 @@ export class DebugService implements debug.IDebugService { return debug.State.Stopped; } const focusedProcess = this.viewModel.focusedProcess; - if (focusedProcess) { + if (focusedProcess && this.sessionStates.has(focusedProcess.getId())) { return this.sessionStates.get(focusedProcess.getId()); } if (this.sessionStates.size > 0) { From e707642a3cc91b543b9ee5626e8a2282176e26af Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 10 May 2017 10:56:50 +0200 Subject: [PATCH 0268/1164] git: don't use fs.watch fixes #25175 --- extensions/git/src/model.ts | 9 ++------- extensions/git/src/watch.ts | 23 ----------------------- 2 files changed, 2 insertions(+), 30 deletions(-) delete mode 100644 extensions/git/src/watch.ts diff --git a/extensions/git/src/model.ts b/extensions/git/src/model.ts index 1d74a87d3a3..3e8377e93eb 100644 --- a/extensions/git/src/model.ts +++ b/extensions/git/src/model.ts @@ -7,9 +7,8 @@ import { Uri, Command, EventEmitter, Event, SourceControlResourceState, SourceControlResourceDecorations, Disposable, ProgressLocation, window, workspace } from 'vscode'; import { Git, Repository, Ref, Branch, Remote, PushOptions, Commit, GitErrorCodes } from './git'; -import { anyEvent, eventToPromise, filterEvent, mapEvent, EmptyDisposable, combinedDisposable, dispose } from './util'; +import { anyEvent, eventToPromise, filterEvent, EmptyDisposable, combinedDisposable, dispose } from './util'; import { memoize, throttle, debounce } from './decorators'; -import { watch } from './watch'; import * as path from 'path'; import * as nls from 'vscode-nls'; @@ -582,11 +581,7 @@ export class Model implements Disposable { const repositoryRoot = await this._git.getRepositoryRoot(this.workspaceRoot.fsPath); this.repository = this._git.open(repositoryRoot); - const dotGitPath = path.join(repositoryRoot, '.git'); - const { event: onRawGitChange, disposable: watcher } = watch(dotGitPath); - disposables.push(watcher); - - const onGitChange = mapEvent(onRawGitChange, ({ filename }) => Uri.file(path.join(dotGitPath, filename))); + const onGitChange = filterEvent(this.onWorkspaceChange, uri => /\/\.git\//.test(uri.fsPath)); const onRelevantGitChange = filterEvent(onGitChange, uri => !/\/\.git\/index\.lock$/.test(uri.fsPath)); onRelevantGitChange(this.onFSChange, this, disposables); onRelevantGitChange(this._onDidChangeRepository.fire, this._onDidChangeRepository, disposables); diff --git a/extensions/git/src/watch.ts b/extensions/git/src/watch.ts deleted file mode 100644 index a3a51a8aea7..00000000000 --- a/extensions/git/src/watch.ts +++ /dev/null @@ -1,23 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import { EventEmitter, Event, Disposable } from 'vscode'; -import * as fs from 'fs'; - -export interface FSEvent { - eventType: string; - filename: string; -} - -export function watch(path: string): { event: Event; disposable: Disposable; } { - const emitter = new EventEmitter(); - const event = emitter.event; - const watcher = fs.watch(path, (eventType, filename) => emitter.fire({ eventType, filename })); - const disposable = new Disposable(() => watcher.close()); - - return { event, disposable }; -} From 39677057ce2ad6e29c3d1e971dfd44ceeb5fd2e4 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 10 May 2017 11:20:54 +0200 Subject: [PATCH 0269/1164] debug: if no scope is found containg the range try to search across all scopes fixes #24277 --- src/vs/workbench/parts/debug/common/debugModel.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index 2055357d274..d84b9287e29 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -341,8 +341,9 @@ export class StackFrame implements IStackFrame { return scopes; } - return [scopes.filter(scope => scope.range && Range.containsRange(scope.range, range)) - .sort((first, second) => (first.range.endLineNumber - first.range.startLineNumber) - (second.range.endLineNumber - second.range.startLineNumber)).shift()]; + const scopesContainingRange = scopes.filter(scope => scope.range && Range.containsRange(scope.range, range)) + .sort((first, second) => (first.range.endLineNumber - first.range.startLineNumber) - (second.range.endLineNumber - second.range.startLineNumber)); + return scopesContainingRange.length > 0 ? scopesContainingRange.slice(0, 1) : scopes; }); } From 7d1c2cc305e9368e76d53514ea38be17e431687e Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 10 May 2017 11:55:55 +0200 Subject: [PATCH 0270/1164] Viewlet progress bar is broken (fixes #26365) --- src/vs/base/browser/ui/progressbar/progressbar.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/base/browser/ui/progressbar/progressbar.ts b/src/vs/base/browser/ui/progressbar/progressbar.ts index cbd7de00da0..1287112824b 100644 --- a/src/vs/base/browser/ui/progressbar/progressbar.ts +++ b/src/vs/base/browser/ui/progressbar/progressbar.ts @@ -217,10 +217,10 @@ export class ProgressBar { } protected applyStyles(): void { - if (this.element) { + if (this.bit) { const background = this.progressBarBackground ? this.progressBarBackground.toString() : null; - this.element.style('background-color', background); + this.bit.style.backgroundColor = background; } } From 8e9ddf611264ab1f8dc6a293904ccc0ad8e471e1 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 10 May 2017 12:05:02 +0200 Subject: [PATCH 0271/1164] debug: when there are duplicate configurations with the same name always take first to align with native select box behavior fixes #20927 --- .../parts/debug/electron-browser/debugConfigurationManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts b/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts index 16926ebfc58..0d259effe70 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts @@ -311,7 +311,7 @@ export class ConfigurationManager implements debug.IConfigurationManager { return null; } - return config.configurations.filter(config => config && config.name === name).pop(); + return config.configurations.filter(config => config && config.name === name).shift(); } public resloveConfiguration(config: debug.IConfig): TPromise { From 063396d1cc677f4b3e593637788521b44791d038 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 10 May 2017 11:11:21 +0200 Subject: [PATCH 0272/1164] improve win32 tfs scripts --- build/tfs/win32/{compile.ps1 => build.ps1} | 13 +++++++------ build/tfs/win32/lib.ps1 | 5 +++++ build/tfs/win32/test.ps1 | 5 ----- scripts/test.bat | 12 +++++++++++- 4 files changed, 23 insertions(+), 12 deletions(-) rename build/tfs/win32/{compile.ps1 => build.ps1} (58%) delete mode 100644 build/tfs/win32/test.ps1 diff --git a/build/tfs/win32/compile.ps1 b/build/tfs/win32/build.ps1 similarity index 58% rename from build/tfs/win32/compile.ps1 rename to build/tfs/win32/build.ps1 index 7a962435818..c11b72ae864 100644 --- a/build/tfs/win32/compile.ps1 +++ b/build/tfs/win32/build.ps1 @@ -1,10 +1,5 @@ . .\build\tfs\win32\lib.ps1 -# set agent specific npm cache -if (Test-Path env:AGENT_WORKFOLDER) { - $env:npm_config_cache = "${env:AGENT_WORKFOLDER}\npm-cache" -} - # npm install exec { & .\scripts\npm.bat install } @@ -12,4 +7,10 @@ exec { & .\scripts\npm.bat install } exec { & npm run gulp -- mixin } # compile -exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-min } \ No newline at end of file +exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-min } + +# run tests +exec { & .\scripts\test.bat --build --reporter dot } + +# run integration tests +# exec { & .\scripts\test-integration.bat } \ No newline at end of file diff --git a/build/tfs/win32/lib.ps1 b/build/tfs/win32/lib.ps1 index 4ecb58e62a3..9df1a69157b 100644 --- a/build/tfs/win32/lib.ps1 +++ b/build/tfs/win32/lib.ps1 @@ -1,6 +1,11 @@ # stop when there's an error $ErrorActionPreference = 'Stop' +# set agent specific npm cache +if (Test-Path env:AGENT_WORKFOLDER) { + $env:npm_config_cache = "${env:AGENT_WORKFOLDER}\npm-cache" +} + # throw when a process exits with something other than 0 function exec([scriptblock]$cmd, [string]$errorMessage = "Error executing command: " + $cmd) { & $cmd diff --git a/build/tfs/win32/test.ps1 b/build/tfs/win32/test.ps1 deleted file mode 100644 index c9589b5d52d..00000000000 --- a/build/tfs/win32/test.ps1 +++ /dev/null @@ -1,5 +0,0 @@ -. .\build\tfs\win32\lib.ps1 - -exec { & npm run gulp -- electron } -exec { & .\scripts\test.bat --build --reporter dot } -# exec { & .\scripts\test-integration.bat } \ No newline at end of file diff --git a/scripts/test.bat b/scripts/test.bat index 0f7ce8e9a85..6ac41fcc36e 100644 --- a/scripts/test.bat +++ b/scripts/test.bat @@ -5,12 +5,22 @@ set ELECTRON_RUN_AS_NODE= pushd %~dp0\.. +:: Get Code.exe location for /f "tokens=2 delims=:," %%a in ('findstr /R /C:"\"nameShort\":.*" product.json') do set NAMESHORT=%%~a set NAMESHORT=%NAMESHORT: "=% set NAMESHORT=%NAMESHORT:"=%.exe set CODE=".build\electron\%NAMESHORT%" -rem Run tests in electron +:: Download Electron if needed +for /f "tokens=2 delims=:," %%a in ('findstr /R /C:"\"electronVersion\":.*" package.json') do set DESIREDVERSION=%%~a +set DESIREDVERSION=%DESIREDVERSION: "=% +set DESIREDVERSION=v%DESIREDVERSION:"=% +if exist .\.build\electron\version (set /p INSTALLEDVERSION=<.\.build\electron\version) else (set INSTALLEDVERSION="") + +if not exist %CODE% node .\node_modules\gulp\bin\gulp.js electron +if not "%INSTALLEDVERSION%" == "%DESIREDVERSION%" node .\node_modules\gulp\bin\gulp.js electron + +:: Run tests %CODE% .\test\electron\index.js %* popd From 21d210da229c906be495787d32a5849d81b6e380 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 10 May 2017 12:42:01 +0200 Subject: [PATCH 0273/1164] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3d3707bc48e..eeb69e17492 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "code-oss-dev", "version": "1.13.0", "electronVersion": "1.6.6", - "distro": "1337efdc669776e277c7e556d33b1dd7915fcefa", + "distro": "866fd532378acbb246f02ed97397e3f0f4dbc345", "author": { "name": "Microsoft Corporation" }, From 2cf65481652a844b9f55e66d8c8e196ca170a07f Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 10 May 2017 12:56:18 +0200 Subject: [PATCH 0274/1164] streamline windows build --- build/gulpfile.vscode.win32.js | 17 +++++++++++++++-- build/package.json | 4 ++-- build/tfs/win32/{build.ps1 => 1_build.ps1} | 0 build/tfs/win32/2_package.ps1 | 4 ++++ build/tfs/win32/3_upload.ps1 | 20 ++++++++++++++++++++ package.json | 4 +++- 6 files changed, 44 insertions(+), 5 deletions(-) rename build/tfs/win32/{build.ps1 => 1_build.ps1} (100%) create mode 100644 build/tfs/win32/2_package.ps1 create mode 100644 build/tfs/win32/3_upload.ps1 diff --git a/build/gulpfile.vscode.win32.js b/build/gulpfile.vscode.win32.js index 427e4e52538..a398076db3d 100644 --- a/build/gulpfile.vscode.win32.js +++ b/build/gulpfile.vscode.win32.js @@ -9,12 +9,14 @@ const gulp = require('gulp'); const path = require('path'); const assert = require('assert'); const cp = require('child_process'); +const _7z = require('7zip')['7z']; const util = require('./lib/util'); const pkg = require('../package.json'); const product = require('../product.json'); const repoPath = path.dirname(__dirname); const buildPath = path.join(path.dirname(repoPath), 'VSCode-win32'); +const zipPath = path.join(repoPath, '.build', 'win32', 'archive', 'VSCode-win32.zip'); const issPath = path.join(__dirname, 'win32', 'code.iss'); const innoSetupPath = path.join(path.dirname(path.dirname(require.resolve('innosetup-compiler'))), 'bin', 'ISCC.exe'); @@ -24,9 +26,9 @@ function packageInnoSetup(iss, options, cb) { const definitions = options.definitions || {}; const keys = Object.keys(definitions); - keys.forEach(key => assert(typeof definitions[key] === 'string', `Missing value for '${ key }' in Inno Setup package step`)); + keys.forEach(key => assert(typeof definitions[key] === 'string', `Missing value for '${key}' in Inno Setup package step`)); - const defs = keys.map(key => `/d${ key }=${ definitions[key] }`); + const defs = keys.map(key => `/d${key}=${definitions[key]}`); const args = [iss].concat(defs); cp.spawn(innoSetupPath, args, { stdio: 'inherit' }) @@ -57,3 +59,14 @@ function buildWin32Setup(cb) { gulp.task('clean-vscode-win32-setup', util.rimraf('.build/win32/setup')); gulp.task('vscode-win32-setup', ['clean-vscode-win32-setup'], buildWin32Setup); + +function archiveWin32Setup(cb) { + const args = ['a', '-tzip', zipPath, buildPath, '-r']; + + cp.spawn(_7z, args, { stdio: 'inherit' }) + .on('error', cb) + .on('exit', () => cb(null)); +} + +gulp.task('clean-vscode-win32-archive', util.rimraf('.build/win32/archive')); +gulp.task('vscode-win32-archive', ['clean-vscode-win32-archive'], archiveWin32Setup); diff --git a/build/package.json b/build/package.json index 2be49f6f8cd..99f1261431b 100644 --- a/build/package.json +++ b/build/package.json @@ -2,7 +2,7 @@ "name": "code-oss-dev-build", "version": "1.0.0", "devDependencies": { - "@types/xml2js": "^0.0.33", - "xml2js": "^0.4.17" + "@types/xml2js": "^0.0.33", + "xml2js": "^0.4.17" } } \ No newline at end of file diff --git a/build/tfs/win32/build.ps1 b/build/tfs/win32/1_build.ps1 similarity index 100% rename from build/tfs/win32/build.ps1 rename to build/tfs/win32/1_build.ps1 diff --git a/build/tfs/win32/2_package.ps1 b/build/tfs/win32/2_package.ps1 new file mode 100644 index 00000000000..5be478fb5a1 --- /dev/null +++ b/build/tfs/win32/2_package.ps1 @@ -0,0 +1,4 @@ +. .\build\tfs\win32\lib.ps1 + +# archive +exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-archive vscode-win32-setup } \ No newline at end of file diff --git a/build/tfs/win32/3_upload.ps1 b/build/tfs/win32/3_upload.ps1 new file mode 100644 index 00000000000..5e17893e6eb --- /dev/null +++ b/build/tfs/win32/3_upload.ps1 @@ -0,0 +1,20 @@ +. .\build\tfs\win32\lib.ps1 + +$Repo = "$(pwd)" +$Root = "$Repo\.." +$Exe = "$Repo\.build\win32\setup\VSCodeSetup.exe" +$Zip = "$Repo\.build\win32\archive\VSCode-win32.zip" +$Build = "$Root\VSCode-win32" + +# get version +$PackageJson = Get-Content -Raw -Path "$Build\resources\app\package.json" | ConvertFrom-Json +$Version = $PackageJson.version +$Quality = "$env:VSCODE_QUALITY" + +# npm install publish tools +pushd "$Repo\build\tfs" +exec { & npm i } +popd + +exec { & node build/tfs/out/publish.js $Quality win32 setup "VSCodeSetup-$Version.exe" $Version true $Exe } +exec { & node build/tfs/out/publish.js $Quality win32-archive archive "VSCode-win32-$Version.zip" $Version true $Zip } diff --git a/package.json b/package.json index eeb69e17492..88ff5afaed3 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,8 @@ "monaco-editor-setup": "node scripts/monaco-editor-setup.js", "monaco-editor-test": "mocha --only-monaco-editor", "precommit": "node build/gulpfile.hygiene.js", - "gulp": "gulp" + "gulp": "gulp", + "7z": "7z" }, "dependencies": { "applicationinsights": "0.17.1", @@ -44,6 +45,7 @@ "yauzl": "2.3.1" }, "devDependencies": { + "7zip": "0.0.6", "@types/minimist": "^1.2.0", "@types/mocha": "^2.2.39", "@types/semver": "^5.3.30", From 45d93e93255f9cdaa37955fdb79b4e460252b45b Mon Sep 17 00:00:00 2001 From: Jan Niklas Hasse Date: Tue, 2 May 2017 14:16:15 +0200 Subject: [PATCH 0275/1164] Use Chromium's new system-ui font alias https://bugs.chromium.org/p/chromium/issues/detail?id=654679 Fixes #10144. --- extensions/markdown/package.json | 2 +- src/vs/editor/browser/standalone/media/standalone-tokens.css | 2 +- src/vs/workbench/electron-browser/media/shell.css | 2 +- .../parts/terminal/electron-browser/media/widgets.css | 3 +-- .../parts/welcome/page/electron-browser/welcomePage.css | 1 - 5 files changed, 4 insertions(+), 6 deletions(-) diff --git a/extensions/markdown/package.json b/extensions/markdown/package.json index c0917c8bcba..eeda39bae67 100644 --- a/extensions/markdown/package.json +++ b/extensions/markdown/package.json @@ -143,7 +143,7 @@ }, "markdown.preview.fontFamily": { "type": "string", - "default": "-apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', 'HelveticaNeue-Light', 'Ubuntu', 'Droid Sans', sans-serif", + "default": "system-ui", "description": "%markdown.preview.fontFamily.desc%" }, "markdown.preview.fontSize": { diff --git a/src/vs/editor/browser/standalone/media/standalone-tokens.css b/src/vs/editor/browser/standalone/media/standalone-tokens.css index 89184ea1f66..8c3ae996849 100644 --- a/src/vs/editor/browser/standalone/media/standalone-tokens.css +++ b/src/vs/editor/browser/standalone/media/standalone-tokens.css @@ -6,7 +6,7 @@ /* Default standalone editor font */ .monaco-editor { - font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", "Ubuntu", "Droid Sans", sans-serif; + font-family: system-ui, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", "Ubuntu", "Droid Sans", sans-serif; } .monaco-menu .monaco-action-bar.vertical .action-item [tabindex="0"]:focus { diff --git a/src/vs/workbench/electron-browser/media/shell.css b/src/vs/workbench/electron-browser/media/shell.css index 2b5ece9a68d..a5e6c0481ee 100644 --- a/src/vs/workbench/electron-browser/media/shell.css +++ b/src/vs/workbench/electron-browser/media/shell.css @@ -15,7 +15,7 @@ /* Font Families (with CJK support) */ -.monaco-shell { font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", "Ubuntu", "Droid Sans", sans-serif; } +.monaco-shell { font-family: system-ui; } .monaco-shell:lang(zh-Hans) { font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", "Noto Sans", "Microsoft YaHei", "PingFang SC", "Hiragino Sans GB", "Source Han Sans SC", "Source Han Sans CN", "Source Han Sans", sans-serif; } .monaco-shell:lang(zh-Hant) { font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", "Noto Sans", "Microsoft Jhenghei", "PingFang TC", "Source Han Sans TC", "Source Han Sans", "Source Han Sans TW", sans-serif; } .monaco-shell:lang(ja) { font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", "Noto Sans", "Meiryo", "Hiragino Kaku Gothic Pro", "Source Han Sans J", "Source Han Sans JP", "Source Han Sans", "Sazanami Gothic", "IPA Gothic", sans-serif; } diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/widgets.css b/src/vs/workbench/parts/terminal/electron-browser/media/widgets.css index 1db9e3f40ab..49b5376ff57 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/media/widgets.css +++ b/src/vs/workbench/parts/terminal/electron-browser/media/widgets.css @@ -12,8 +12,7 @@ } .monaco-workbench .terminal-message-widget { - /* This font list is sourced from a .monaco-shell style */ - font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", "Ubuntu", "Droid Sans", sans-serif; + font-family: system-ui; font-size: 14px; line-height: 19px; padding: 4px 5px; diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css index 58d11029b89..578ee17ab92 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css +++ b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css @@ -70,7 +70,6 @@ padding: 0; margin: 0; border: none; - /*font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI Light", "HelveticaNeue-Light", "Ubuntu", "Droid Sans", sans-serif;*/ font-weight: normal; color: rgba(0,0,0,.8); font-size: 3.6em; From cf9a174b20be47d44c6da40130e209e2f1fe1e4e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 10 May 2017 14:15:53 +0200 Subject: [PATCH 0276/1164] start adding command and wireup with insert snippet --- .../contrib/snippet/browser/editorSnippets.ts | 10 ++-- .../snippet/browser/snippetController2.ts | 59 +++++++++++++++---- .../test/browser/snippetController2.test.ts | 2 +- .../electron-browser/insertSnippet.ts | 4 +- 4 files changed, 58 insertions(+), 17 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index efaba9a24c5..41409340b04 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -26,9 +26,10 @@ class OneSnippet { private _placeholderGroupsIdx: number; private static readonly _decor = { - active: { stickiness: TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges }, - activeFinal: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges }, - inactive: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges }, + active: { stickiness: TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, className: 'snippet-placeholder' }, + inactive: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, className: 'snippet-placeholder' }, + activeFinal: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, className: 'finish-snippet-placeholder' }, + inactiveFinal: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, className: 'finish-snippet-placeholder' }, snippet: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges }, }; @@ -73,7 +74,8 @@ class OneSnippet { model.getPositionAt(this._offset + placeholderOffset), model.getPositionAt(this._offset + placeholderOffset + placeholderLen) ); - const handle = accessor.addDecoration(range, OneSnippet._decor.inactive); + const options = placeholder.isFinalTabstop ? OneSnippet._decor.inactiveFinal : OneSnippet._decor.inactive; + const handle = accessor.addDecoration(range, options); this._placeholderDecorations.set(placeholder, handle); } }); diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 77c957ec02a..1c3666dc093 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -5,17 +5,23 @@ 'use strict'; -import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { RawContextKey, IContextKey, IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; -import { commonEditorContribution } from 'vs/editor/common/editorCommonExtensions'; +import { commonEditorContribution, CommonEditorRegistry } from 'vs/editor/common/editorCommonExtensions'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { SnippetSession } from './editorSnippets'; - +import { EditorCommand } from "vs/editor/common/config/config"; +import { EditorContextKeys } from "vs/editor/common/editorContextKeys"; +import { KeyCode, KeyMod } from "vs/base/common/keyCodes"; @commonEditorContribution export class SnippetController2 { - static InSnippetMode = new RawContextKey('inSnippet', false); + static get(editor: ICommonCodeEditor): SnippetController2 { + return editor.getContribution('snippetController2'); + } + + static InSnippetMode = new RawContextKey('isInSnippet', false); static HasNextTabstop = new RawContextKey('hasNextTabstop', false); static HasPrevTabstop = new RawContextKey('hasPrevTabstop', false); @@ -45,11 +51,9 @@ export class SnippetController2 { } insert(template: string, overwriteBefore: number = 0, overwriteAfter: number = 0): void { - if (this._snippet) { - this.abort(); + this.cancel(); } - this._snippet = new SnippetSession(this._editor, template, overwriteBefore, overwriteAfter); this._snippetListener = [this._editor.onDidChangeCursorSelection(() => this._updateState())]; this._snippet.insert(); @@ -60,15 +64,15 @@ export class SnippetController2 { return; } if (this._snippet.isAtFinalPlaceholder || !this._snippet.validateSelections()) { - return this.abort(); + return this.cancel(); } + this._inSnippet.set(true); this._hasPrevTabstop.set(!this._snippet.isAtFirstPlaceholder); this._hasNextTabstop.set(!this._snippet.isAtFinalPlaceholder); - this._inSnippet.set(true); } - abort(): void { + cancel(): void { if (this._snippet) { this._hasPrevTabstop.reset(); this._hasNextTabstop.reset(); @@ -94,3 +98,38 @@ export class SnippetController2 { } } + + +const CommandCtor = EditorCommand.bindToContribution(SnippetController2.get); + +CommonEditorRegistry.registerEditorCommand(new CommandCtor({ + id: 'snippet.next', + precondition: ContextKeyExpr.and(SnippetController2.InSnippetMode, SnippetController2.HasNextTabstop), + handler: ctrl => ctrl.next(), + kbOpts: { + weight: CommonEditorRegistry.commandWeight(30), + kbExpr: EditorContextKeys.textFocus, + primary: KeyCode.Tab + } +})); +CommonEditorRegistry.registerEditorCommand(new CommandCtor({ + id: 'snippet.prev', + precondition: ContextKeyExpr.and(SnippetController2.InSnippetMode, SnippetController2.HasPrevTabstop), + handler: ctrl => ctrl.prev(), + kbOpts: { + weight: CommonEditorRegistry.commandWeight(30), + kbExpr: EditorContextKeys.textFocus, + primary: KeyMod.Shift | KeyCode.Tab + } +})); +CommonEditorRegistry.registerEditorCommand(new CommandCtor({ + id: 'snippet.cancel', + precondition: SnippetController2.InSnippetMode, + handler: ctrl => ctrl.cancel(), + kbOpts: { + weight: CommonEditorRegistry.commandWeight(30), + kbExpr: EditorContextKeys.textFocus, + primary: KeyCode.Escape, + secondary: [KeyMod.Shift | KeyCode.Escape] + } +})); diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts index c26f1be9c32..2b1b271662f 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts @@ -57,7 +57,7 @@ suite('SnippetController2', function () { assertContextKeys(contextKeys, true, false, true); assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); - ctrl.abort(); + ctrl.cancel(); assertContextKeys(contextKeys, false, false, false); assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); }); diff --git a/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.ts b/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.ts index 1a20a85cf5e..3490f5c2766 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.ts +++ b/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.ts @@ -8,12 +8,12 @@ import * as nls from 'vs/nls'; import { TPromise } from 'vs/base/common/winjs.base'; import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { editorAction, ServicesAccessor, EditorAction } from 'vs/editor/common/editorCommonExtensions'; -import { SnippetController } from 'vs/editor/contrib/snippet/common/snippetController'; import { IQuickOpenService, IPickOpenEntry } from 'vs/platform/quickOpen/common/quickOpen'; import { IModeService } from 'vs/editor/common/services/modeService'; import { LanguageId } from 'vs/editor/common/modes'; import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/commands'; import { ISnippetsService, ISnippet } from 'vs/workbench/parts/snippets/electron-browser/snippetsService'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; interface ISnippetPick extends IPickOpenEntry { @@ -128,7 +128,7 @@ class InsertSnippetAction extends EditorAction { } }).then(snippet => { if (snippet) { - SnippetController.get(editor).insertSnippet(snippet.codeSnippet, 0, 0); + SnippetController2.get(editor).insert(snippet.codeSnippet, 0, 0); } }); } From 51f49f121fedc206d06228f4f79b666c4bf4be60 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 10 May 2017 14:35:11 +0200 Subject: [PATCH 0277/1164] properly handle reversed selections --- .../contrib/snippet/browser/editorSnippets.ts | 14 +++++++++++--- .../snippet/test/browser/editorSnippets.test.ts | 10 ++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index 41409340b04..998daf72e85 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -208,7 +208,15 @@ export class SnippetSession { let edits: IIdentifiedSingleEditOperation[] = []; let model = this._editor.getModel(); - for (const selection of this._editor.getSelections()) { + // sort selections by their start position but remeber + // the original index. that allows you to create correct + // offset-based selection logic without changing the + // primary selection + const indexedSelection = this._editor.getSelections() + .map((selection, idx) => ({ selection, idx })) + .sort((a, b) => Range.compareRangesUsingStarts(a.selection, b.selection)); + + for (const { selection, idx } of indexedSelection) { const range = SnippetSession.adjustRange(model, selection, this._overwriteBefore, this._overwriteAfter); const start = range.getStartPosition(); const adjustedTemplate = SnippetSession.normalizeWhitespace(model, start, this._template); @@ -216,8 +224,8 @@ export class SnippetSession { const snippet = SnippetParser.parse(adjustedTemplate); const offset = model.getOffsetAt(start) + delta; - edits.push(EditOperation.replaceMove(range, snippet.text)); - this._snippets.push(new OneSnippet(this._editor, snippet, offset)); + edits[idx] = EditOperation.replaceMove(range, snippet.text); + this._snippets[idx] = new OneSnippet(this._editor, snippet, offset); delta += snippet.text.length - model.getValueLengthInRange(range); } diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts index 0da0cbbf467..989b113ea22 100644 --- a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts @@ -75,6 +75,16 @@ suite('SnippetSession', function () { assertSelections(editor, new Selection(1, 10, 1, 10), new Selection(2, 14, 2, 14)); }); + test('text edit with reversed selection', function () { + + const session = new SnippetSession(editor, '${1:bar}$0'); + editor.setSelections([new Selection(2, 5, 2, 5), new Selection(1, 1, 1, 1)]); + + session.insert(); + assert.equal(model.getValue(), 'barfunction foo() {\n barconsole.log(a);\n}'); + assertSelections(editor, new Selection(2, 5, 2, 8), new Selection(1, 1, 1, 4)); + }); + test('snippets, repeated tabstops', function () { const session = new SnippetSession(editor, '${1:abc}foo${1:abc}$0'); session.insert(); From 751b61ee127d8ae82c998b6cb088ca17a22ad09e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 10 May 2017 14:47:11 +0200 Subject: [PATCH 0278/1164] add SnippetParser#escape for those that don't want snippet magic --- .../contrib/snippet/common/snippetParser.ts | 6 +- .../snippet/test/common/snippetParser.test.ts | 127 ++++++++++-------- 2 files changed, 74 insertions(+), 59 deletions(-) diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/common/snippetParser.ts index a69ca03386e..5eb0978e8ce 100644 --- a/src/vs/editor/contrib/snippet/common/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/common/snippetParser.ts @@ -272,6 +272,10 @@ export class TextmateSnippet { export class SnippetParser { + static escape(value: string): string { + return value.replace(/\$|}|\\/g, '\\$&'); + } + static parse(template: string): TextmateSnippet { const marker = new SnippetParser(true, false).parse(template); return new TextmateSnippet(marker); @@ -288,7 +292,7 @@ export class SnippetParser { this._enableInternal = enableInternal; } - escape(value: string): string { + text(value: string): string { return Marker.toString(this.parse(value)); } diff --git a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts index 1b02a3676c3..3ff63929bce 100644 --- a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts +++ b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts @@ -78,14 +78,12 @@ suite('SnippetParser', () => { assert.equal(scanner.next().type, TokenType.CurlyClose); }); - function assertEscape(value: string, expected: string) { + function assertText(value: string, expected: string) { const p = new SnippetParser(); - const actual = p.escape(value); + const actual = p.text(value); assert.equal(actual, expected); } - function assertMarker(marker: Marker[], ...ctors: Function[]); - function assertMarker(value: string, ...ctors: Function[]); function assertMarker(valueOrMarker: Marker[] | string, ...ctors: Function[]) { let marker: Marker[]; if (typeof valueOrMarker === 'string') { @@ -103,43 +101,56 @@ suite('SnippetParser', () => { assert.equal(marker.length, 0); } - function assertEscapeAndMarker(value: string, escaped: string, ...ctors: Function[]) { - assertEscape(value, escaped); + function assertTextAndMarker(value: string, escaped: string, ...ctors: Function[]) { + assertText(value, escaped); assertMarker(value, ...ctors); } - test('Parser, escaping', () => { - assertEscape('$', '$'); - assertEscape('\\\\$', '\\$'); - assertEscape('{', '{'); - assertEscape('\\}', '}'); - assertEscape('\\abc', '\\abc'); - assertEscape('foo${f:\\}}bar', 'foo}bar'); - assertEscape('\\{', '{'); - assertEscape('I need \\\\\\$', 'I need \\$'); - assertEscape('\\', '\\'); - assertEscape('\\{{', '{{'); - assertEscape('{{', '{{'); - assertEscape('{{dd', '{{dd'); - assertEscape('}}', '}}'); - assertEscape('ff}}', 'ff}}'); - - assertEscape('farboo', 'farboo'); - assertEscape('far{{}}boo', 'farboo'); - assertEscape('far{{123}}boo', 'far123boo'); - assertEscape('far\\{{123}}boo', 'far{{123}}boo'); - assertEscape('far{{id:bern}}boo', 'farbernboo'); - assertEscape('far{{id:bern {{basel}}}}boo', 'farbern baselboo'); - assertEscape('far{{id:bern {{id:basel}}}}boo', 'farbern baselboo'); - assertEscape('far{{id:bern {{id2:basel}}}}boo', 'farbern baselboo'); + function assertEscaped(value: string, expected: string) { + const actual = SnippetParser.escape(value); + assert.equal(actual, expected); + } + test('Parser, escaped', function () { + assertEscaped('foo$0', 'foo\\$0'); + assertEscaped('foo\\$0', 'foo\\\\\\$0'); + assertEscaped('f$1oo$0', 'f\\$1oo\\$0'); + assertEscaped('${1:foo}$0', '\\${1:foo\\}\\$0'); + assertEscaped('$', '\\$'); }); - test('Parser, TM escaping', () => { - assertEscapeAndMarker('foo${1:bar}}', 'foobar}', Text, Placeholder, Text); - assertEscapeAndMarker('foo${1:bar}${2:foo}}', 'foobarfoo}', Text, Placeholder, Placeholder, Text); + test('Parser, text', () => { + assertText('$', '$'); + assertText('\\\\$', '\\$'); + assertText('{', '{'); + assertText('\\}', '}'); + assertText('\\abc', '\\abc'); + assertText('foo${f:\\}}bar', 'foo}bar'); + assertText('\\{', '{'); + assertText('I need \\\\\\$', 'I need \\$'); + assertText('\\', '\\'); + assertText('\\{{', '{{'); + assertText('{{', '{{'); + assertText('{{dd', '{{dd'); + assertText('}}', '}}'); + assertText('ff}}', 'ff}}'); - assertEscapeAndMarker('foo${1:bar\\}${2:foo}}', 'foobar}foo', Text, Placeholder); + assertText('farboo', 'farboo'); + assertText('far{{}}boo', 'farboo'); + assertText('far{{123}}boo', 'far123boo'); + assertText('far\\{{123}}boo', 'far{{123}}boo'); + assertText('far{{id:bern}}boo', 'farbernboo'); + assertText('far{{id:bern {{basel}}}}boo', 'farbern baselboo'); + assertText('far{{id:bern {{id:basel}}}}boo', 'farbern baselboo'); + assertText('far{{id:bern {{id2:basel}}}}boo', 'farbern baselboo'); + }); + + + test('Parser, TM text', () => { + assertTextAndMarker('foo${1:bar}}', 'foobar}', Text, Placeholder, Text); + assertTextAndMarker('foo${1:bar}${2:foo}}', 'foobarfoo}', Text, Placeholder, Placeholder, Text); + + assertTextAndMarker('foo${1:bar\\}${2:foo}}', 'foobar}foo', Text, Placeholder); let [, placeholder] = new SnippetParser(true, false).parse('foo${1:bar\\}${2:foo}}'); let { defaultValue } = (placeholder); @@ -152,34 +163,34 @@ suite('SnippetParser', () => { }); test('Parser, placeholder', () => { - assertEscapeAndMarker('farboo', 'farboo', Text); - assertEscapeAndMarker('far{{}}boo', 'farboo', Text, Placeholder, Text); - assertEscapeAndMarker('far{{123}}boo', 'far123boo', Text, Placeholder, Text); - assertEscapeAndMarker('far\\{{123}}boo', 'far{{123}}boo', Text); + assertTextAndMarker('farboo', 'farboo', Text); + assertTextAndMarker('far{{}}boo', 'farboo', Text, Placeholder, Text); + assertTextAndMarker('far{{123}}boo', 'far123boo', Text, Placeholder, Text); + assertTextAndMarker('far\\{{123}}boo', 'far{{123}}boo', Text); }); test('Parser, literal code', () => { - assertEscapeAndMarker('far`123`boo', 'far`123`boo', Text); - assertEscapeAndMarker('far\\`123\\`boo', 'far\\`123\\`boo', Text); + assertTextAndMarker('far`123`boo', 'far`123`boo', Text); + assertTextAndMarker('far\\`123\\`boo', 'far\\`123\\`boo', Text); }); test('Parser, variables/tabstop', () => { - assertEscapeAndMarker('$far-boo', '-boo', Variable, Text); - assertEscapeAndMarker('\\$far-boo', '$far-boo', Text); - assertEscapeAndMarker('far$farboo', 'far', Text, Variable); - assertEscapeAndMarker('far${farboo}', 'far', Text, Variable); - assertEscapeAndMarker('$123', '', Placeholder); - assertEscapeAndMarker('$farboo', '', Variable); - assertEscapeAndMarker('$far12boo', '', Variable); + assertTextAndMarker('$far-boo', '-boo', Variable, Text); + assertTextAndMarker('\\$far-boo', '$far-boo', Text); + assertTextAndMarker('far$farboo', 'far', Text, Variable); + assertTextAndMarker('far${farboo}', 'far', Text, Variable); + assertTextAndMarker('$123', '', Placeholder); + assertTextAndMarker('$farboo', '', Variable); + assertTextAndMarker('$far12boo', '', Variable); }); test('Parser, variables/placeholder with defaults', () => { - assertEscapeAndMarker('${name:value}', 'value', Variable); - assertEscapeAndMarker('${1:value}', 'value', Placeholder); - assertEscapeAndMarker('${1:bar${2:foo}bar}', 'barfoobar', Placeholder); + assertTextAndMarker('${name:value}', 'value', Variable); + assertTextAndMarker('${1:value}', 'value', Placeholder); + assertTextAndMarker('${1:bar${2:foo}bar}', 'barfoobar', Placeholder); - assertEscapeAndMarker('${name:value', '${name:value', Text); - assertEscapeAndMarker('${1:bar${2:foobar}', '${1:barfoobar', Text, Placeholder); + assertTextAndMarker('${name:value', '${name:value', Text); + assertTextAndMarker('${1:bar${2:foobar}', '${1:barfoobar', Text, Placeholder); }); test('Parser, only textmate', () => { @@ -233,14 +244,14 @@ suite('SnippetParser', () => { test('Parser, real world, mixed', () => { - assertEscapeAndMarker( + assertTextAndMarker( 'finished:{{}}, second:{{2:name}}, first:{{1:}}, third:{{3:}}', 'finished:, second:name, first:, third:', Text, Placeholder, Text, Placeholder, Text, Placeholder, Text, Placeholder ); - assertEscapeAndMarker( + assertTextAndMarker( 'begin\\{{{1:enumerate}}\\}\n\t{{}}\nend\\{{{1:}}\\}', 'begin{enumerate}\n\t\nend{enumerate}', Text, Placeholder, Text, Placeholder, Text, Placeholder, Text @@ -249,7 +260,7 @@ suite('SnippetParser', () => { }); test('Parser, default name/value', () => { - assertEscapeAndMarker( + assertTextAndMarker( '{{first}}-{{2:}}-{{second}}-{{1:}}', 'first--second-', Placeholder, Text, Placeholder, Text, Placeholder, Text, Placeholder @@ -283,15 +294,15 @@ suite('SnippetParser', () => { }); test('backspace esapce in TM only, #16212', () => { - const actual = new SnippetParser(true, false).escape('Foo \\\\${abc}bar'); + const actual = new SnippetParser(true, false).text('Foo \\\\${abc}bar'); assert.equal(actual, 'Foo \\bar'); }); test('colon as variable/placeholder value, #16717', () => { - let actual = new SnippetParser(true, false).escape('${TM_SELECTED_TEXT:foo:bar}'); + let actual = new SnippetParser(true, false).text('${TM_SELECTED_TEXT:foo:bar}'); assert.equal(actual, 'foo:bar'); - actual = new SnippetParser(true, false).escape('${1:foo:bar}'); + actual = new SnippetParser(true, false).text('${1:foo:bar}'); assert.equal(actual, 'foo:bar'); }); From 6c2f83dfcdfc82e99fa9fee2abc595c896c227e6 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 10 May 2017 13:01:05 +0200 Subject: [PATCH 0279/1164] [theme] add theme to the view context --- src/vs/editor/browser/codeEditor.ts | 6 ++++-- .../editor/browser/standalone/standaloneCodeEditor.ts | 7 ++++--- src/vs/editor/browser/view/viewImpl.ts | 8 +++++++- src/vs/editor/browser/widget/codeEditorWidget.ts | 7 ++++++- .../editor/browser/widget/embeddedCodeEditorWidget.ts | 6 ++++-- src/vs/editor/common/view/viewContext.ts | 4 ++++ src/vs/editor/common/view/viewEvents.ts | 10 ++++++++++ src/vs/editor/common/viewModel/viewEventHandler.ts | 10 ++++++++++ .../parts/debug/electron-browser/replEditor.ts | 6 ++++-- .../walkThrough/electron-browser/walkThroughPart.ts | 6 ++++-- 10 files changed, 57 insertions(+), 13 deletions(-) diff --git a/src/vs/editor/browser/codeEditor.ts b/src/vs/editor/browser/codeEditor.ts index 721d90d9bdd..77271726ba2 100644 --- a/src/vs/editor/browser/codeEditor.ts +++ b/src/vs/editor/browser/codeEditor.ts @@ -13,6 +13,7 @@ import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; import { EditorAction, CommonEditorRegistry } from 'vs/editor/common/editorCommonExtensions'; import { EditorBrowserRegistry } from 'vs/editor/browser/editorBrowserExtensions'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; export class CodeEditor extends CodeEditorWidget { @@ -22,9 +23,10 @@ export class CodeEditor extends CodeEditorWidget { @IInstantiationService instantiationService: IInstantiationService, @ICodeEditorService codeEditorService: ICodeEditorService, @ICommandService commandService: ICommandService, - @IContextKeyService contextKeyService: IContextKeyService + @IContextKeyService contextKeyService: IContextKeyService, + @IThemeService themeService: IThemeService ) { - super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService); + super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, themeService); } protected _getContributions(): IEditorContributionCtor[] { diff --git a/src/vs/editor/browser/standalone/standaloneCodeEditor.ts b/src/vs/editor/browser/standalone/standaloneCodeEditor.ts index 3cc70066d90..7644c520feb 100644 --- a/src/vs/editor/browser/standalone/standaloneCodeEditor.ts +++ b/src/vs/editor/browser/standalone/standaloneCodeEditor.ts @@ -83,9 +83,10 @@ export class StandaloneCodeEditor extends CodeEditor implements IStandaloneCodeE @ICodeEditorService codeEditorService: ICodeEditorService, @ICommandService commandService: ICommandService, @IContextKeyService contextKeyService: IContextKeyService, - @IKeybindingService keybindingService: IKeybindingService + @IKeybindingService keybindingService: IKeybindingService, + @IThemeService themeService: IThemeService ) { - super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService); + super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, themeService); if (keybindingService instanceof StandaloneKeybindingService) { this._standaloneKeybindingService = keybindingService; @@ -213,7 +214,7 @@ export class StandaloneEditor extends StandaloneCodeEditor implements IStandalon } let model: IModel = options.model; delete options.model; - super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, keybindingService); + super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, keybindingService, standaloneThemeService); this._contextViewService = contextViewService; this._standaloneThemeService = standaloneThemeService; diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index 49a8d522741..c1cfa7f9037 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -48,6 +48,7 @@ import { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData' import { EditorScrollbar } from 'vs/editor/browser/viewParts/editorScrollbar/editorScrollbar'; import { Minimap } from 'vs/editor/browser/viewParts/minimap/minimap'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; export interface IContentWidgetData { widget: editorBrowser.IContentWidget; @@ -94,6 +95,7 @@ export class View extends ViewEventHandler { constructor( commandService: ICommandService, configuration: Configuration, + themeService: IThemeService, model: IViewModel, execCoreEditorCommandFunc: ExecCoreEditorCommandFunc ) { @@ -111,7 +113,11 @@ export class View extends ViewEventHandler { this.eventDispatcher.addEventHandler(this); // The view context is passed on to most classes (basically to reduce param. counts in ctors) - this._context = new ViewContext(configuration, model, this.eventDispatcher); + this._context = new ViewContext(configuration, themeService.getTheme(), model, this.eventDispatcher); + + this._register(themeService.onThemeChange(theme => { + this.eventDispatcher.emit(new viewEvents.ViewThemeChangedEvent()); + })); this.viewParts = []; diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index 19579878aa2..ff008292f72 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -32,6 +32,7 @@ import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IPosition } from 'vs/editor/common/core/position'; import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; import { CoreEditorCommand } from 'vs/editor/common/controller/coreCommands'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; export abstract class CodeEditorWidget extends CommonCodeEditor implements editorBrowser.ICodeEditor { @@ -70,6 +71,7 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito private _codeEditorService: ICodeEditorService; private _commandService: ICommandService; + private _themeService: IThemeService; protected domElement: HTMLElement; private _focusTracker: CodeEditorWidgetFocusTracker; @@ -87,11 +89,13 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito @IInstantiationService instantiationService: IInstantiationService, @ICodeEditorService codeEditorService: ICodeEditorService, @ICommandService commandService: ICommandService, - @IContextKeyService contextKeyService: IContextKeyService + @IContextKeyService contextKeyService: IContextKeyService, + @IThemeService themeService: IThemeService ) { super(domElement, options, instantiationService, contextKeyService); this._codeEditorService = codeEditorService; this._commandService = commandService; + this._themeService = themeService; this._focusTracker = new CodeEditorWidgetFocusTracker(domElement); this._focusTracker.onChage(() => { @@ -426,6 +430,7 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito this._view = new View( this._commandService, this._configuration, + this._themeService, this.viewModel, (editorCommand: CoreEditorCommand, args: any) => { if (!this.cursor) { diff --git a/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts b/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts index 0956a3e7d81..185f3537c51 100644 --- a/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts +++ b/src/vs/editor/browser/widget/embeddedCodeEditorWidget.ts @@ -12,6 +12,7 @@ import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService' import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { CodeEditor } from 'vs/editor/browser/codeEditor'; import { IConfigurationChangedEvent, IEditorOptions } from 'vs/editor/common/config/editorOptions'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; export class EmbeddedCodeEditorWidget extends CodeEditor { @@ -25,9 +26,10 @@ export class EmbeddedCodeEditorWidget extends CodeEditor { @IInstantiationService instantiationService: IInstantiationService, @ICodeEditorService codeEditorService: ICodeEditorService, @ICommandService commandService: ICommandService, - @IContextKeyService contextKeyService: IContextKeyService + @IContextKeyService contextKeyService: IContextKeyService, + @IThemeService themeService: IThemeService ) { - super(domElement, parentEditor.getRawConfiguration(), instantiationService, codeEditorService, commandService, contextKeyService); + super(domElement, parentEditor.getRawConfiguration(), instantiationService, codeEditorService, commandService, contextKeyService, themeService); this._parentEditor = parentEditor; this._overwriteOptions = options; diff --git a/src/vs/editor/common/view/viewContext.ts b/src/vs/editor/common/view/viewContext.ts index ebb5cc199a3..91b722b0afb 100644 --- a/src/vs/editor/common/view/viewContext.ts +++ b/src/vs/editor/common/view/viewContext.ts @@ -8,20 +8,24 @@ import { IConfiguration } from 'vs/editor/common/editorCommon'; import { IViewModel, IViewLayout } from 'vs/editor/common/viewModel/viewModel'; import { ViewEventHandler } from 'vs/editor/common/viewModel/viewEventHandler'; import { ViewEventDispatcher } from 'vs/editor/common/view/viewEventDispatcher'; +import { ITheme } from 'vs/platform/theme/common/themeService'; export class ViewContext { public readonly configuration: IConfiguration; + public readonly theme: ITheme; public readonly model: IViewModel; public readonly viewLayout: IViewLayout; public readonly privateViewEventBus: ViewEventDispatcher; constructor( configuration: IConfiguration, + theme: ITheme, model: IViewModel, privateViewEventBus: ViewEventDispatcher ) { this.configuration = configuration; + this.theme = theme; this.model = model; this.viewLayout = model.viewLayout; this.privateViewEventBus = privateViewEventBus; diff --git a/src/vs/editor/common/view/viewEvents.ts b/src/vs/editor/common/view/viewEvents.ts index 7decc3f5231..a0788dda030 100644 --- a/src/vs/editor/common/view/viewEvents.ts +++ b/src/vs/editor/common/view/viewEvents.ts @@ -27,6 +27,7 @@ export const enum ViewEventType { ViewTokensChanged = 13, ViewTokensColorsChanged = 14, ViewZonesChanged = 15, + ViewThemeChanged = 16 } export class ViewConfigurationChangedEvent { @@ -262,6 +263,14 @@ export class ViewTokensChangedEvent { } } +export class ViewThemeChangedEvent { + + public readonly type = ViewEventType.ViewThemeChanged; + + constructor() { + } +} + export class ViewTokensColorsChangedEvent { public readonly type = ViewEventType.ViewTokensColorsChanged; @@ -296,4 +305,5 @@ export type ViewEvent = ( | ViewTokensChangedEvent | ViewTokensColorsChangedEvent | ViewZonesChangedEvent + | ViewThemeChangedEvent ); diff --git a/src/vs/editor/common/viewModel/viewEventHandler.ts b/src/vs/editor/common/viewModel/viewEventHandler.ts index 3ef6a84a4e4..6696cf63894 100644 --- a/src/vs/editor/common/viewModel/viewEventHandler.ts +++ b/src/vs/editor/common/viewModel/viewEventHandler.ts @@ -79,6 +79,9 @@ export class ViewEventHandler extends Disposable { public onZonesChanged(e: viewEvents.ViewZonesChangedEvent): boolean { return false; } + public onThemeChanged(e: viewEvents.ViewThemeChangedEvent): boolean { + return false; + } // --- end event handlers @@ -181,6 +184,13 @@ export class ViewEventHandler extends Disposable { } break; + + case viewEvents.ViewEventType.ViewThemeChanged: + if (this.onThemeChanged(e)) { + shouldRender = true; + } + break; + default: console.info('View received unknown event: '); console.info(e); diff --git a/src/vs/workbench/parts/debug/electron-browser/replEditor.ts b/src/vs/workbench/parts/debug/electron-browser/replEditor.ts index 3e607802ab3..d1e61773616 100644 --- a/src/vs/workbench/parts/debug/electron-browser/replEditor.ts +++ b/src/vs/workbench/parts/debug/electron-browser/replEditor.ts @@ -19,6 +19,7 @@ import { ContextMenuController } from 'vs/editor/contrib/contextmenu/browser/con import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; import { SnippetController } from 'vs/editor/contrib/snippet/common/snippetController'; import { TabCompletionController } from 'vs/workbench/parts/snippets/electron-browser/tabCompletion'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; export class ReplInputEditor extends CodeEditorWidget { constructor( @@ -27,9 +28,10 @@ export class ReplInputEditor extends CodeEditorWidget { @IInstantiationService instantiationService: IInstantiationService, @ICodeEditorService codeEditorService: ICodeEditorService, @ICommandService commandService: ICommandService, - @IContextKeyService contextKeyService: IContextKeyService + @IContextKeyService contextKeyService: IContextKeyService, + @IThemeService themeService: IThemeService ) { - super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService); + super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, themeService); } protected _getContributions(): IEditorContributionCtor[] { diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts index 640439add9a..ae8cd2085ed 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts @@ -38,6 +38,7 @@ import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService' import { Parts, IPartService } from 'vs/workbench/services/part/common/partService'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IMessageService, Severity } from 'vs/platform/message/common/message'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; export const WALK_THROUGH_FOCUS = new RawContextKey('interactivePlaygroundFocus', false); @@ -68,9 +69,10 @@ class WalkThroughCodeEditor extends CodeEditor { @IInstantiationService instantiationService: IInstantiationService, @ICodeEditorService codeEditorService: ICodeEditorService, @ICommandService commandService: ICommandService, - @IContextKeyService contextKeyService: IContextKeyService + @IContextKeyService contextKeyService: IContextKeyService, + @IThemeService themeService: IThemeService ) { - super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService); + super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, themeService); } getTelemetryData() { From ead17dead86c1ca4d3cc5eeee163acfa0465ecfd Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 10 May 2017 15:21:28 +0200 Subject: [PATCH 0280/1164] prepare for final tabstop insertion (conflicts with old world today) --- .../contrib/snippet/common/snippetParser.ts | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/common/snippetParser.ts index 5eb0978e8ce..d8086977281 100644 --- a/src/vs/editor/contrib/snippet/common/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/common/snippetParser.ts @@ -307,24 +307,26 @@ export class SnippetParser { // * fill in default for empty placeHolders // * compact sibling Text markers - function compact(marker: Marker[], placeholders: { [name: string]: Marker[] }) { + function walk(marker: Marker[], placeholderDefaultValues: Map) { for (let i = 0; i < marker.length; i++) { const thisMarker = marker[i]; if (thisMarker instanceof Placeholder) { - if (placeholders[thisMarker.index] === undefined) { - placeholders[thisMarker.index] = thisMarker.defaultValue; + // fill in default values for repeated placeholders + // like `${1:foo}and$1` becomes ${1:foo}and${1:foo} + if (!placeholderDefaultValues.has(thisMarker.index)) { + placeholderDefaultValues.set(thisMarker.index, thisMarker.defaultValue); } else if (thisMarker.defaultValue.length === 0) { - thisMarker.defaultValue = placeholders[thisMarker.index].slice(0); + thisMarker.defaultValue = placeholderDefaultValues.get(thisMarker.index).slice(0); } if (thisMarker.defaultValue.length > 0) { - compact(thisMarker.defaultValue, placeholders); + walk(thisMarker.defaultValue, placeholderDefaultValues); } } else if (thisMarker instanceof Variable) { - compact(thisMarker.defaultValue, placeholders); + walk(thisMarker.defaultValue, placeholderDefaultValues); } else if (i > 0 && thisMarker instanceof Text && marker[i - 1] instanceof Text) { (marker[i - 1]).string += (marker[i]).string; @@ -334,7 +336,13 @@ export class SnippetParser { } } - compact(marker, Object.create(null)); + const placeholderDefaultValues = new Map(); + walk(marker, placeholderDefaultValues); + + // if (placeholderDefaultValues.size > 0 && !placeholderDefaultValues.has('0')) { + // // snippet uses tabstops but has no final tabstop + // marker.push(new Placeholder('0', [])); + // } return marker; } From 580230bbf3b3b0149804ac2163b95a0e9bfbe63a Mon Sep 17 00:00:00 2001 From: Michel Kaporin Date: Wed, 10 May 2017 15:29:26 +0200 Subject: [PATCH 0281/1164] Added --noGettingStarted flag to disable 'Getting Started' page from opening when such provided. Implements #26386. --- src/vs/platform/environment/common/environment.ts | 3 +++ src/vs/platform/environment/node/argv.ts | 3 ++- src/vs/platform/environment/node/environmentService.ts | 2 ++ .../welcome/gettingStarted/electron-browser/gettingStarted.ts | 3 ++- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 8e8fbb81a23..6c8b7d20576 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -38,6 +38,7 @@ export interface ParsedArgs { 'enable-proposed-api'?: string | string[]; 'open-url'?: string | string[]; 'prof-startup-timers': string; + noGettingStarted?: boolean; } export const IEnvironmentService = createDecorator('environmentService'); @@ -78,6 +79,8 @@ export interface IEnvironmentService { performance: boolean; profileStartup: { prefix: string, dir: string } | undefined; + noGettingStarted: boolean | undefined; + mainIPCHandle: string; sharedIPCHandle: string; diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index fa8e0558faa..0a4ea0f9c49 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -41,7 +41,8 @@ const options: minimist.Opts = { 'disable-extensions', 'list-extensions', 'show-versions', - 'nolazy' + 'nolazy', + 'noGettingStarted' ], alias: { help: 'h', diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index 15b2f19951a..d088d9c9c3b 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -100,6 +100,8 @@ export class EnvironmentService implements IEnvironmentService { get disableExtensions(): boolean { return this._args['disable-extensions']; } + get noGettingStarted(): boolean { return this._args.noGettingStarted; } + @memoize get debugExtensionHost(): { port: number; break: boolean; } { return parseExtensionHostPort(this._args, this.isBuilt); } diff --git a/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarted.ts b/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarted.ts index f57754ba1f9..76215dd8be9 100644 --- a/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarted.ts +++ b/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarted.ts @@ -69,7 +69,8 @@ export class GettingStarted implements IWorkbenchContribution { ) { this.appName = product.nameLong; - if (product.welcomePage && !environmentService.isExtensionDevelopment /* do not open a browser when we run an extension */) { + /* do not open a browser when we run an extension or --noGettingStarted is provided */ + if (product.welcomePage && !environmentService.isExtensionDevelopment && !environmentService.noGettingStarted) { this.welcomePageURL = product.welcomePage; this.handleWelcome(); } From 67daf73cc162c5d42e9e412ec00c97e96a46715c Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 10 May 2017 15:42:57 +0200 Subject: [PATCH 0282/1164] Fixes #26151: Do not trust DOM readings immediately after calling webFrame.setZoomLevel() --- src/vs/base/browser/browser.ts | 32 +++---- src/vs/editor/browser/config/configuration.ts | 94 ++++++++----------- .../browser/viewParts/minimap/minimap.ts | 3 +- .../overviewRuler/decorationsOverviewRuler.ts | 5 + .../viewParts/overviewRuler/overviewRuler.ts | 5 + .../overviewRuler/overviewRulerImpl.ts | 28 +++--- src/vs/editor/common/config/editorOptions.ts | 23 +++-- src/vs/editor/common/config/fontInfo.ts | 9 +- src/vs/editor/common/view/viewEvents.ts | 2 + src/vs/monaco.d.ts | 2 + src/vs/workbench/electron-browser/actions.ts | 5 +- src/vs/workbench/electron-browser/main.ts | 5 +- src/vs/workbench/electron-browser/window.ts | 5 +- 13 files changed, 114 insertions(+), 104 deletions(-) diff --git a/src/vs/base/browser/browser.ts b/src/vs/base/browser/browser.ts index 29d7a261edd..ed183b57cb9 100644 --- a/src/vs/base/browser/browser.ts +++ b/src/vs/base/browser/browser.ts @@ -15,10 +15,9 @@ class WindowManager { private _fullscreen: boolean; private _zoomLevel: number = 0; - private _zoomFactor: number = 0; + private _lastZoomLevelChangeTime: number = 0; - private _pixelRatioCache: number = 0; - private _pixelRatioComputed: boolean = false; + private _zoomFactor: number = 0; private _onDidChangeZoomLevel: Emitter = new Emitter(); public onDidChangeZoomLevel: Event = this._onDidChangeZoomLevel.event; @@ -30,13 +29,18 @@ class WindowManager { return this._zoomLevel; } - public setZoomLevel(zoomLevel: number): void { + public getTimeSinceLastZoomLevelChanged(): number { + return Date.now() - this._lastZoomLevelChangeTime; + } + + public setZoomLevel(zoomLevel: number, isTrusted: boolean): void { if (this._zoomLevel === zoomLevel) { return; } this._zoomLevel = zoomLevel; - this._pixelRatioComputed = false; + // See https://github.com/Microsoft/vscode/issues/26151 + this._lastZoomLevelChangeTime = isTrusted ? 0 : Date.now(); this._onDidChangeZoomLevel.fire(this._zoomLevel); } @@ -49,14 +53,6 @@ class WindowManager { } public getPixelRatio(): number { - if (!this._pixelRatioComputed) { - this._pixelRatioCache = this._computePixelRatio(); - this._pixelRatioComputed = true; - } - return this._pixelRatioCache; - } - - private _computePixelRatio(): number { let ctx = document.createElement('canvas').getContext('2d'); let dpr = window.devicePixelRatio || 1; let bsr = (ctx).webkitBackingStorePixelRatio || @@ -82,9 +78,16 @@ class WindowManager { } /** A zoom index, e.g. 1, 2, 3 */ +export function setZoomLevel(zoomLevel: number, isTrusted: boolean): void { + WindowManager.INSTANCE.setZoomLevel(zoomLevel, isTrusted); +} export function getZoomLevel(): number { return WindowManager.INSTANCE.getZoomLevel(); } +/** Returns the time (in ms) since the zoom level was changed */ +export function getTimeSinceLastZoomLevelChanged(): number { + return WindowManager.INSTANCE.getTimeSinceLastZoomLevelChanged(); +} /** The zoom scale for an index, e.g. 1, 1.2, 1.4 */ export function getZoomFactor(): number { return WindowManager.INSTANCE.getZoomFactor(); @@ -92,9 +95,6 @@ export function getZoomFactor(): number { export function getPixelRatio(): number { return WindowManager.INSTANCE.getPixelRatio(); } -export function setZoomLevel(zoomLevel: number): void { - WindowManager.INSTANCE.setZoomLevel(zoomLevel); -} export function setZoomFactor(zoomFactor: number): void { WindowManager.INSTANCE.setZoomFactor(zoomFactor); } diff --git a/src/vs/editor/browser/config/configuration.ts b/src/vs/editor/browser/config/configuration.ts index 80191982f21..b28726c1b95 100644 --- a/src/vs/editor/browser/config/configuration.ts +++ b/src/vs/editor/browser/config/configuration.ts @@ -102,7 +102,7 @@ class CSSBasedConfiguration extends Disposable { public static INSTANCE = new CSSBasedConfiguration(); private _cache: CSSBasedConfigurationCache; - private _changeMonitorTimeout: number = -1; + private _evictUntrustedReadingsTimeout: number; private _onDidChange = this._register(new Emitter()); public onDidChange: Event = this._onDidChange.event; @@ -111,16 +111,44 @@ class CSSBasedConfiguration extends Disposable { super(); this._cache = new CSSBasedConfigurationCache(); + this._evictUntrustedReadingsTimeout = -1; } public dispose(): void { - if (this._changeMonitorTimeout !== -1) { - clearTimeout(this._changeMonitorTimeout); - this._changeMonitorTimeout = -1; + if (this._evictUntrustedReadingsTimeout !== -1) { + clearTimeout(this._evictUntrustedReadingsTimeout); + this._evictUntrustedReadingsTimeout = -1; } super.dispose(); } + private _writeToCache(item: BareFontInfo, value: FontInfo): void { + this._cache.put(item, value); + + if (!value.isTrusted && this._evictUntrustedReadingsTimeout === -1) { + // Try reading again after some time + this._evictUntrustedReadingsTimeout = setTimeout(() => { + this._evictUntrustedReadingsTimeout = -1; + this._evictUntrustedReadings(); + }, 5000); + } + } + + private _evictUntrustedReadings(): void { + let values = this._cache.getValues(); + let somethingRemoved = false; + for (let i = 0, len = values.length; i < len; i++) { + let item = values[i]; + if (!item.isTrusted) { + somethingRemoved = true; + this._cache.remove(item); + } + } + if (somethingRemoved) { + this._onDidChange.fire(); + } + } + public saveFontInfo(): ISerializedFontInfo[] { // Only save trusted font info (that has been measured in this running instance) return this._cache.getValues().filter(item => item.isTrusted); @@ -131,25 +159,8 @@ class CSSBasedConfiguration extends Disposable { // The reason for this is that a font might have been installed on the OS in the meantime. for (let i = 0, len = savedFontInfo.length; i < len; i++) { let fontInfo = new FontInfo(savedFontInfo[i], false); - this._cache.put(fontInfo, fontInfo); + this._writeToCache(fontInfo, fontInfo); } - - // Remove saved font info that does not have the trusted flag. - // (this forces it to be re-read). - setTimeout(() => { - let values = this._cache.getValues(); - let somethingRemoved = false; - for (let i = 0, len = values.length; i < len; i++) { - let item = values[i]; - if (!item.isTrusted) { - somethingRemoved = true; - this._cache.remove(item); - } - } - if (somethingRemoved) { - this._onDidChange.fire(); - } - }, 5000); } public readConfiguration(bareFontInfo: BareFontInfo): FontInfo { @@ -169,45 +180,14 @@ class CSSBasedConfiguration extends Disposable { typicalFullwidthCharacterWidth: Math.max(readConfig.typicalFullwidthCharacterWidth, 5), spaceWidth: Math.max(readConfig.spaceWidth, 5), maxDigitWidth: Math.max(readConfig.maxDigitWidth, 5), - }, true); - this._installChangeMonitor(); + }, false); } - this._cache.put(bareFontInfo, readConfig); + this._writeToCache(bareFontInfo, readConfig); } return this._cache.get(bareFontInfo); } - private _installChangeMonitor(): void { - if (this._changeMonitorTimeout === -1) { - this._changeMonitorTimeout = setTimeout(() => { - this._changeMonitorTimeout = -1; - this._monitorForChanges(); - }, 500); - } - } - - private _monitorForChanges(): void { - let shouldInstallChangeMonitor = false; - let keys = this._cache.getKeys(); - for (let i = 0; i < keys.length; i++) { - let styling = keys[i]; - - let newValue = CSSBasedConfiguration._actualReadConfiguration(styling); - - if (newValue.typicalHalfwidthCharacterWidth <= 2 || newValue.typicalFullwidthCharacterWidth <= 2 || newValue.maxDigitWidth <= 2) { - // We still couldn't read the CSS config - shouldInstallChangeMonitor = true; - } else { - this._cache.put(styling, newValue); - this._onDidChange.fire(); - } - } - if (shouldInstallChangeMonitor) { - this._installChangeMonitor(); - } - } - private static createRequest(chr: string, type: CharWidthRequestType, all: CharWidthRequest[], monospace: CharWidthRequest[]): CharWidthRequest { let result = new CharWidthRequest(chr, type); all.push(result); @@ -278,6 +258,8 @@ class CSSBasedConfiguration extends Disposable { } } + // let's trust the zoom level only 2s after it was changed. + const canTrustBrowserZoomLevel = (browser.getTimeSinceLastZoomLevelChanged() > 2000); return new FontInfo({ zoomLevel: browser.getZoomLevel(), fontFamily: bareFontInfo.fontFamily, @@ -289,7 +271,7 @@ class CSSBasedConfiguration extends Disposable { typicalFullwidthCharacterWidth: typicalFullwidthCharacter.width, spaceWidth: space.width, maxDigitWidth: maxDigitWidth - }, true); + }, canTrustBrowserZoomLevel); } } diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index 43dd9161682..b24dba31f87 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -10,7 +10,6 @@ import { ViewPart, PartFingerprint, PartFingerprints } from 'vs/editor/browser/v import { ViewContext } from 'vs/editor/common/view/viewContext'; import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; import { getOrCreateMinimapCharRenderer } from 'vs/editor/common/view/runtimeMinimapCharRenderer'; -import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; import { MinimapCharRenderer, MinimapTokensColorTracker, Constants } from 'vs/editor/common/view/minimapCharRenderer'; import * as editorCommon from 'vs/editor/common/editorCommon'; @@ -107,7 +106,7 @@ class MinimapOptions { public readonly canvasOuterHeight: number; constructor(configuration: editorCommon.IConfiguration) { - const pixelRatio = browser.getPixelRatio(); + const pixelRatio = configuration.editor.pixelRatio; const layoutInfo = configuration.editor.layoutInfo; this.renderMinimap = layoutInfo.renderMinimap | 0; diff --git a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts index 5ee8d66826e..69fdbe52a17 100644 --- a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts +++ b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts @@ -59,6 +59,7 @@ export class DecorationsOverviewRuler extends ViewPart { this._context.viewLayout.getScrollHeight(), this._context.configuration.editor.lineHeight, this._context.configuration.editor.canUseTranslate3d, + this._context.configuration.editor.pixelRatio, DecorationsOverviewRuler.MIN_DECORATION_HEIGHT, DecorationsOverviewRuler.MAX_DECORATION_HEIGHT, (lineNumber: number) => this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber) @@ -116,6 +117,10 @@ export class DecorationsOverviewRuler extends ViewPart { this._overviewRuler.setCanUseTranslate3d(this._context.configuration.editor.canUseTranslate3d, false); } + if (e.pixelRatio) { + this._overviewRuler.setPixelRatio(this._context.configuration.editor.pixelRatio, false); + } + if (e.viewInfo) { this._renderBorder = this._context.configuration.editor.viewInfo.overviewRulerBorder; this._hideCursor = this._context.configuration.editor.viewInfo.hideCursorInOverviewRuler; diff --git a/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts b/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts index 8efec195d9a..65c793de876 100644 --- a/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts +++ b/src/vs/editor/browser/viewParts/overviewRuler/overviewRuler.ts @@ -26,6 +26,7 @@ export class OverviewRuler extends ViewEventHandler implements IOverviewRuler { this._context.viewLayout.getScrollHeight(), this._context.configuration.editor.lineHeight, this._context.configuration.editor.canUseTranslate3d, + this._context.configuration.editor.pixelRatio, minimumHeight, maximumHeight, (lineNumber: number) => this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber) @@ -51,6 +52,10 @@ export class OverviewRuler extends ViewEventHandler implements IOverviewRuler { this._overviewRuler.setCanUseTranslate3d(this._context.configuration.editor.canUseTranslate3d, true); } + if (e.pixelRatio) { + this._overviewRuler.setPixelRatio(this._context.configuration.editor.pixelRatio, true); + } + return true; } diff --git a/src/vs/editor/browser/viewParts/overviewRuler/overviewRulerImpl.ts b/src/vs/editor/browser/viewParts/overviewRuler/overviewRulerImpl.ts index 3cce58aa44c..03105fa944c 100644 --- a/src/vs/editor/browser/viewParts/overviewRuler/overviewRulerImpl.ts +++ b/src/vs/editor/browser/viewParts/overviewRuler/overviewRulerImpl.ts @@ -7,7 +7,6 @@ import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { OverviewRulerLane, ThemeType } from 'vs/editor/common/editorCommon'; import { IDisposable } from 'vs/base/common/lifecycle'; -import * as browser from 'vs/base/browser/browser'; import { OverviewZoneManager, ColorZone, OverviewRulerZone } from 'vs/editor/common/view/overviewZoneManager'; import { Color } from 'vs/base/common/color'; import { OverviewRulerPosition } from 'vs/editor/common/config/editorOptions'; @@ -23,7 +22,11 @@ export class OverviewRulerImpl { private _zoomListener: IDisposable; - constructor(canvasLeftOffset: number, cssClassName: string, scrollHeight: number, lineHeight: number, canUseTranslate3d: boolean, minimumHeight: number, maximumHeight: number, getVerticalOffsetForLine: (lineNumber: number) => number) { + constructor( + canvasLeftOffset: number, cssClassName: string, scrollHeight: number, lineHeight: number, + canUseTranslate3d: boolean, pixelRatio: number, minimumHeight: number, maximumHeight: number, + getVerticalOffsetForLine: (lineNumber: number) => number + ) { this._canvasLeftOffset = canvasLeftOffset; this._domNode = createFastDomNode(document.createElement('canvas')); @@ -45,15 +48,7 @@ export class OverviewRulerImpl { this._zoneManager.setOuterHeight(scrollHeight); this._zoneManager.setLineHeight(lineHeight); - this._zoomListener = browser.onDidChangeZoomLevel(() => { - this._zoneManager.setPixelRatio(browser.getPixelRatio()); - this._domNode.setWidth(this._zoneManager.getDOMWidth()); - this._domNode.setHeight(this._zoneManager.getDOMHeight()); - this._domNode.domNode.width = this._zoneManager.getCanvasWidth(); - this._domNode.domNode.height = this._zoneManager.getCanvasHeight(); - this.render(true); - }); - this._zoneManager.setPixelRatio(browser.getPixelRatio()); + this._zoneManager.setPixelRatio(pixelRatio); } public dispose(): void { @@ -142,6 +137,17 @@ export class OverviewRulerImpl { } } + public setPixelRatio(pixelRatio: number, render: boolean): void { + this._zoneManager.setPixelRatio(pixelRatio); + this._domNode.setWidth(this._zoneManager.getDOMWidth()); + this._domNode.setHeight(this._zoneManager.getDOMHeight()); + this._domNode.domNode.width = this._zoneManager.getCanvasWidth(); + this._domNode.domNode.height = this._zoneManager.getCanvasHeight(); + if (render) { + this.render(true); + } + } + public setZones(zones: OverviewRulerZone[], render: boolean): void { this._zoneManager.setZones(zones); if (render) { diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index de990d726b4..1ea498ab56b 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -746,6 +746,7 @@ export class InternalEditorOptions { readonly _internalEditorOptionsBrand: void; readonly canUseTranslate3d: boolean; + readonly pixelRatio: number; readonly editorClassName: string; readonly lineHeight: number; readonly readOnly: boolean; @@ -769,6 +770,7 @@ export class InternalEditorOptions { */ constructor(source: { canUseTranslate3d: boolean; + pixelRatio: number; editorClassName: string; lineHeight: number; readOnly: boolean; @@ -783,15 +785,16 @@ export class InternalEditorOptions { wrappingInfo: EditorWrappingInfo; contribInfo: EditorContribOptions; }) { - this.canUseTranslate3d = Boolean(source.canUseTranslate3d); - this.editorClassName = String(source.editorClassName); + this.canUseTranslate3d = source.canUseTranslate3d; + this.pixelRatio = source.pixelRatio; + this.editorClassName = source.editorClassName; this.lineHeight = source.lineHeight | 0; - this.readOnly = Boolean(source.readOnly); - this.wordSeparators = String(source.wordSeparators); - this.autoClosingBrackets = Boolean(source.autoClosingBrackets); - this.useTabStops = Boolean(source.useTabStops); - this.tabFocusMode = Boolean(source.tabFocusMode); - this.dragAndDrop = Boolean(source.dragAndDrop); + this.readOnly = source.readOnly; + this.wordSeparators = source.wordSeparators; + this.autoClosingBrackets = source.autoClosingBrackets; + this.useTabStops = source.useTabStops; + this.tabFocusMode = source.tabFocusMode; + this.dragAndDrop = source.dragAndDrop; this.layoutInfo = source.layoutInfo; this.fontInfo = source.fontInfo; this.viewInfo = source.viewInfo; @@ -805,6 +808,7 @@ export class InternalEditorOptions { public equals(other: InternalEditorOptions): boolean { return ( this.canUseTranslate3d === other.canUseTranslate3d + && this.pixelRatio === other.pixelRatio && this.editorClassName === other.editorClassName && this.lineHeight === other.lineHeight && this.readOnly === other.readOnly @@ -827,6 +831,7 @@ export class InternalEditorOptions { public createChangeEvent(newOpts: InternalEditorOptions): IConfigurationChangedEvent { return { canUseTranslate3d: (this.canUseTranslate3d !== newOpts.canUseTranslate3d), + pixelRatio: (this.pixelRatio !== newOpts.pixelRatio), editorClassName: (this.editorClassName !== newOpts.editorClassName), lineHeight: (this.lineHeight !== newOpts.lineHeight), readOnly: (this.readOnly !== newOpts.readOnly), @@ -1151,6 +1156,7 @@ export interface EditorLayoutInfo { */ export interface IConfigurationChangedEvent { readonly canUseTranslate3d: boolean; + readonly pixelRatio: boolean; readonly editorClassName: boolean; readonly lineHeight: boolean; readonly readOnly: boolean; @@ -1626,6 +1632,7 @@ export class InternalEditorOptionsFactory { return new InternalEditorOptions({ canUseTranslate3d: opts.disableTranslate3d ? false : env.canUseTranslate3d, + pixelRatio: env.pixelRatio, editorClassName: env.editorClassName, lineHeight: env.fontInfo.lineHeight, readOnly: opts.readOnly, diff --git a/src/vs/editor/common/config/fontInfo.ts b/src/vs/editor/common/config/fontInfo.ts index ae3ff7bfe9b..f6d4cffd42a 100644 --- a/src/vs/editor/common/config/fontInfo.ts +++ b/src/vs/editor/common/config/fontInfo.ts @@ -178,11 +178,4 @@ export class FontInfo extends BareFontInfo { && this.maxDigitWidth === other.maxDigitWidth ); } - - /** - * @internal - */ - public clone(): FontInfo { - return new FontInfo(this, this.isTrusted); - } -} \ No newline at end of file +} diff --git a/src/vs/editor/common/view/viewEvents.ts b/src/vs/editor/common/view/viewEvents.ts index a0788dda030..0f5ee787b72 100644 --- a/src/vs/editor/common/view/viewEvents.ts +++ b/src/vs/editor/common/view/viewEvents.ts @@ -35,6 +35,7 @@ export class ViewConfigurationChangedEvent { public readonly type = ViewEventType.ViewConfigurationChanged; public readonly canUseTranslate3d: boolean; + public readonly pixelRatio: boolean; public readonly editorClassName: boolean; public readonly lineHeight: boolean; public readonly readOnly: boolean; @@ -45,6 +46,7 @@ export class ViewConfigurationChangedEvent { constructor(source: IConfigurationChangedEvent) { this.canUseTranslate3d = source.canUseTranslate3d; + this.pixelRatio = source.pixelRatio; this.editorClassName = source.editorClassName; this.lineHeight = source.lineHeight; this.readOnly = source.readOnly; diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 94337858952..d846cf7556b 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -3222,6 +3222,7 @@ declare module monaco.editor { export class InternalEditorOptions { readonly _internalEditorOptionsBrand: void; readonly canUseTranslate3d: boolean; + readonly pixelRatio: number; readonly editorClassName: string; readonly lineHeight: number; readonly readOnly: boolean; @@ -3350,6 +3351,7 @@ declare module monaco.editor { */ export interface IConfigurationChangedEvent { readonly canUseTranslate3d: boolean; + readonly pixelRatio: boolean; readonly editorClassName: boolean; readonly lineHeight: boolean; readonly readOnly: boolean; diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index 1c9f9e8c1b2..68a3993f30c 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -242,7 +242,10 @@ export abstract class BaseZoomAction extends Action { const applyZoom = () => { webFrame.setZoomLevel(level); browser.setZoomFactor(webFrame.getZoomFactor()); - browser.setZoomLevel(level); // Ensure others can listen to zoom level changes + // See https://github.com/Microsoft/vscode/issues/26151 + // Cannot be trusted because the webFrame might take some time + // until it really applies the new zoom level + browser.setZoomLevel(webFrame.getZoomLevel(), /*isTrusted*/false); }; this.configurationEditingService.writeConfiguration(target, { key: BaseZoomAction.SETTING_KEY, value: level }).done(() => applyZoom(), error => applyZoom()); diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 77bc5addf9b..0349ffdf810 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -57,7 +57,10 @@ export function startup(configuration: IWindowConfiguration): TPromise { // Ensure others can listen to zoom level changes browser.setZoomFactor(webFrame.getZoomFactor()); - browser.setZoomLevel(webFrame.getZoomLevel()); + // See https://github.com/Microsoft/vscode/issues/26151 + // Can be trusted because we are not setting it ourselves. + browser.setZoomLevel(webFrame.getZoomLevel(), /*isTrusted*/true); + browser.setFullscreen(!!configuration.fullscreen); KeyboardMapperFactory.INSTANCE._onKeyboardLayoutChanged(configuration.isISOKeyboard); diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index 3873284472d..e9e4c2ce9df 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -321,7 +321,10 @@ export class ElectronWindow extends Themable { if (webFrame.getZoomLevel() !== newZoomLevel) { webFrame.setZoomLevel(newZoomLevel); browser.setZoomFactor(webFrame.getZoomFactor()); - browser.setZoomLevel(webFrame.getZoomLevel()); // Ensure others can listen to zoom level changes + // See https://github.com/Microsoft/vscode/issues/26151 + // Cannot be trusted because the webFrame might take some time + // until it really applies the new zoom level + browser.setZoomLevel(webFrame.getZoomLevel(), /*isTrusted*/false); } }); From f147243149c883ac3914550645695d1aef5a54af Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 10 May 2017 15:47:53 +0200 Subject: [PATCH 0283/1164] win32: get keys --- build/tfs/win32/1_build.ps1 | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index c11b72ae864..4b076080ab3 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -1,3 +1,15 @@ +Param( + [string]$AZURE_STORAGE_ACCESS_KEY_2, + [string]$MOONCAKE_STORAGE_ACCESS_KEY, + [string]$AZURE_DOCUMENTDB_MASTERKEY +) + +echo keys: +echo $AZURE_STORAGE_ACCESS_KEY_2 +echo $MOONCAKE_STORAGE_ACCESS_KEY +echo $AZURE_DOCUMENTDB_MASTERKEY +echo done! + . .\build\tfs\win32\lib.ps1 # npm install From 4fbe878844cebae80754d656b10e3b922b221ccb Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 10 May 2017 15:54:11 +0200 Subject: [PATCH 0284/1164] win32: read keys --- build/tfs/win32/1_build.ps1 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index 4b076080ab3..a8c8be74d19 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -1,13 +1,13 @@ Param( - [string]$AZURE_STORAGE_ACCESS_KEY_2, - [string]$MOONCAKE_STORAGE_ACCESS_KEY, - [string]$AZURE_DOCUMENTDB_MASTERKEY + [string]$storageKey, + [string]$mooncakeStorageKey, + [string]$documentDbKey ) echo keys: -echo $AZURE_STORAGE_ACCESS_KEY_2 -echo $MOONCAKE_STORAGE_ACCESS_KEY -echo $AZURE_DOCUMENTDB_MASTERKEY +echo key: $storageKey +echo key: $mooncakeStorageKey +echo key: $documentDbKey echo done! . .\build\tfs\win32\lib.ps1 From e4f9b9dae7a45b8a2d4249b41213e61618606233 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 10 May 2017 15:56:32 +0200 Subject: [PATCH 0285/1164] Ability to theme ruler colour. Fixes #26377 --- src/vs/editor/browser/viewParts/rulers/rulers.css | 4 ---- src/vs/editor/browser/viewParts/rulers/rulers.ts | 9 +++++++++ src/vs/editor/common/view/editorColorRegistry.ts | 1 + 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/browser/viewParts/rulers/rulers.css b/src/vs/editor/browser/viewParts/rulers/rulers.css index c2e819de649..3012d205f67 100644 --- a/src/vs/editor/browser/viewParts/rulers/rulers.css +++ b/src/vs/editor/browser/viewParts/rulers/rulers.css @@ -7,8 +7,4 @@ position: absolute; width: 1px; top: 0; - background: lightgrey; -} -.monaco-editor.vs-dark .view-ruler { - background: #5A5A5A; } \ No newline at end of file diff --git a/src/vs/editor/browser/viewParts/rulers/rulers.ts b/src/vs/editor/browser/viewParts/rulers/rulers.ts index 0c4837e7c84..56aa748b019 100644 --- a/src/vs/editor/browser/viewParts/rulers/rulers.ts +++ b/src/vs/editor/browser/viewParts/rulers/rulers.ts @@ -11,6 +11,8 @@ import { ViewPart } from 'vs/editor/browser/view/viewPart'; import { ViewContext } from 'vs/editor/common/view/viewContext'; import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { editorRuler } from 'vs/editor/common/view/editorColorRegistry'; export class Rulers extends ViewPart { @@ -97,3 +99,10 @@ export class Rulers extends ViewPart { } } } + +registerThemingParticipant((theme, collector) => { + let rulerColor = theme.getColor(editorRuler); + if (rulerColor) { + collector.addRule(`.monaco-editor .view-ruler { background-color: ${rulerColor}; }`); + } +}); diff --git a/src/vs/editor/common/view/editorColorRegistry.ts b/src/vs/editor/common/view/editorColorRegistry.ts index 386852f64f3..93223cdec71 100644 --- a/src/vs/editor/common/view/editorColorRegistry.ts +++ b/src/vs/editor/common/view/editorColorRegistry.ts @@ -18,6 +18,7 @@ export const editorCursor = registerColor('editorCursor.foreground', { dark: '#A export const editorWhitespaces = registerColor('editorWhitespace.foreground', { dark: '#e3e4e229', light: '#33333333', hc: '#e3e4e229' }, nls.localize('editorWhitespaces', 'Color of whitespace characters in the editor.')); export const editorIndentGuides = registerColor('editorIndentGuide.background', { dark: editorWhitespaces, light: editorWhitespaces, hc: editorWhitespaces }, nls.localize('editorIndentGuides', 'Color of the editor indentation guides.')); export const editorLineNumbers = registerColor('editorLineNumber.foreground', { dark: '#5A5A5A', light: '#2B91AF', hc: Color.white }, nls.localize('editorLineNumbers', 'Color of editor line numbers.')); +export const editorRuler = registerColor('editorRuler.foreground', { dark: '#5A5A5A', light: Color.lightgrey, hc: Color.white }, nls.localize('editorRuler', 'Color of the editor rulers.')); export const editorCodeLensForeground = registerColor('editorCodeLens.foreground', { dark: '#999999', light: '#999999', hc: '#999999' }, nls.localize('editorCodeLensForeground', 'Foreground color of editor code lenses')); From fb0477e61a8132bc8b923327518568372ee5015a Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 10 May 2017 15:57:00 +0200 Subject: [PATCH 0286/1164] win32: handle secrets --- build/tfs/win32/1_build.ps1 | 12 ------------ build/tfs/win32/3_upload.ps1 | 10 ++++++++++ 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index a8c8be74d19..c11b72ae864 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -1,15 +1,3 @@ -Param( - [string]$storageKey, - [string]$mooncakeStorageKey, - [string]$documentDbKey -) - -echo keys: -echo key: $storageKey -echo key: $mooncakeStorageKey -echo key: $documentDbKey -echo done! - . .\build\tfs\win32\lib.ps1 # npm install diff --git a/build/tfs/win32/3_upload.ps1 b/build/tfs/win32/3_upload.ps1 index 5e17893e6eb..55e1a5bb54b 100644 --- a/build/tfs/win32/3_upload.ps1 +++ b/build/tfs/win32/3_upload.ps1 @@ -1,3 +1,9 @@ +Param( + [string]$storageKey, + [string]$mooncakeStorageKey, + [string]$documentDbKey +) + . .\build\tfs\win32\lib.ps1 $Repo = "$(pwd)" @@ -16,5 +22,9 @@ pushd "$Repo\build\tfs" exec { & npm i } popd +$env:AZURE_STORAGE_ACCESS_KEY_2 = $storageKey +$env:MOONCAKE_STORAGE_ACCESS_KEY = $mooncakeStorageKey +$env:AZURE_DOCUMENTDB_MASTERKEY = $documentDbKey + exec { & node build/tfs/out/publish.js $Quality win32 setup "VSCodeSetup-$Version.exe" $Version true $Exe } exec { & node build/tfs/out/publish.js $Quality win32-archive archive "VSCode-win32-$Version.zip" $Version true $Zip } From e57801bc9bd0202eb3b11891c84650df2a227a05 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 10 May 2017 16:09:06 +0200 Subject: [PATCH 0287/1164] Restore window to size and location when starting app (fixes #26353) --- src/vs/code/electron-main/windows.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index a43d3844bb4..a243879c113 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -268,7 +268,7 @@ export class WindowsManager implements IWindowsMainService { const currentWindowsState: IWindowsState = { openedFolders: [], lastPluginDevelopmentHostWindow: this.windowsState.lastPluginDevelopmentHostWindow, - lastActiveWindow: this.lastClosedWindowState //will be set on Win/Linux if last window was closed, resulting in an exit + lastActiveWindow: this.lastClosedWindowState }; // 1.) Find a last active window (pick any other first window otherwise) @@ -330,7 +330,9 @@ export class WindowsManager implements IWindowsMainService { // On Windows and Linux closing the last window will trigger quit. Since we are storing all UI state // before quitting, we need to remember the UI state of this window to be able to persist it. - if (!platform.isMacintosh && this.getWindowCount() === 1) { + // On macOS we keep the last closed window state ready in case the user wants to quit right after or + // wants to open another window, in which case we use this state over the persisted one. + if (this.getWindowCount() === 1) { this.lastClosedWindowState = state; } } @@ -921,8 +923,9 @@ export class WindowsManager implements IWindowsMainService { // First Window const lastActive = this.getLastActiveWindow(); - if (!lastActive && this.windowsState.lastActiveWindow) { - return this.windowsState.lastActiveWindow.uiState; + const lastActiveState = this.lastClosedWindowState || this.windowsState.lastActiveWindow; + if (!lastActive && lastActiveState) { + return lastActiveState.uiState; } // From 6bbff65c67c119752ee7520e7a1bdfdbbe585145 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 10 May 2017 16:12:33 +0200 Subject: [PATCH 0288/1164] support insert none snippet text --- src/vs/editor/common/core/selection.ts | 10 +++++++++- .../contrib/snippet/browser/editorSnippets.ts | 17 ++++++++++++++++- .../snippet/browser/snippetController2.ts | 10 +++++++++- .../snippet/test/browser/editorSnippets.test.ts | 7 +++++++ .../test/browser/snippetController2.test.ts | 9 +++++++++ src/vs/monaco.d.ts | 4 ++++ 6 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/common/core/selection.ts b/src/vs/editor/common/core/selection.ts index e0aa9ecb314..21f2066d982 100644 --- a/src/vs/editor/common/core/selection.ts +++ b/src/vs/editor/common/core/selection.ts @@ -5,6 +5,7 @@ 'use strict'; import { Range } from 'vs/editor/common/core/range'; +import { IPosition } from 'vs/editor/common/core/position'; /** * A selection in the editor. @@ -140,6 +141,13 @@ export class Selection extends Range { // ---- + /** + * Create a `Selection` from one or two positions + */ + public static fromPositions(start: IPosition, end: IPosition = start): Selection { + return new Selection(start.lineNumber, start.column, end.lineNumber, end.column); + } + /** * Create a `Selection` from an `ISelection`. */ @@ -192,4 +200,4 @@ export class Selection extends Range { return new Selection(endLineNumber, endColumn, startLineNumber, startColumn); } -} \ No newline at end of file +} diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index 998daf72e85..f79504c2bcd 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -146,6 +146,10 @@ class OneSnippet { } } + get hasPlaceholder() { + return this._snippet.getPlaceholders().length > 0; + } + get range() { return this._snippetDecoration !== undefined && this._editor.getModel().getDecorationRange(this._snippetDecoration); } @@ -204,6 +208,7 @@ export class SnippetSession { } insert(): void { + let delta = 0; let edits: IIdentifiedSingleEditOperation[] = []; let model = this._editor.getModel(); @@ -231,7 +236,13 @@ export class SnippetSession { } // make insert edit and start with first selections - const newSelections = model.pushEditOperations(this._editor.getSelections(), edits, () => this._move(true)); + const newSelections = model.pushEditOperations(this._editor.getSelections(), edits, undoEdits => { + if (this._snippets[0].hasPlaceholder) { + return this._move(true); + } else { + return undoEdits.map(edit => Selection.fromPositions(edit.range.getEndPosition())); + } + }); this._editor.setSelections(newSelections); } @@ -262,6 +273,10 @@ export class SnippetSession { return this._snippets[0].isAtFinalPlaceholder; } + get hasPlaceholder() { + return this._snippets[0].hasPlaceholder; + } + validateSelections(): boolean { const selections = this._editor.getSelections(); if (selections.length < this._snippets.length) { diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 1c3666dc093..71096b7d1c3 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -61,8 +61,16 @@ export class SnippetController2 { private _updateState(): void { if (!this._snippet) { + // canceled in the meanwhile return; } + + if (!this._snippet.hasPlaceholder) { + // don't listen for selection changes and don't + // update context keys when the snippet is plain text + return; + } + if (this._snippet.isAtFinalPlaceholder || !this._snippet.validateSelections()) { return this.cancel(); } @@ -74,9 +82,9 @@ export class SnippetController2 { cancel(): void { if (this._snippet) { + this._inSnippet.reset(); this._hasPrevTabstop.reset(); this._hasNextTabstop.reset(); - this._inSnippet.reset(); dispose(this._snippetListener); dispose(this._snippet); this._snippet = undefined; diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts index 989b113ea22..14f92a85100 100644 --- a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts @@ -99,6 +99,13 @@ suite('SnippetSession', function () { ); }); + test('snippets, just text', function () { + const session = new SnippetSession(editor, 'foobar'); + session.insert(); + assert.equal(model.getValue(), 'foobarfunction foo() {\n foobarconsole.log(a);\n}'); + assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); + }); + test('snippets, selections and new text with newlines', () => { const session = new SnippetSession(editor, 'foo\n\t${1:bar}\n$0'); diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts index 2b1b271662f..7c9657a1ef6 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts @@ -116,6 +116,15 @@ suite('SnippetController2', function () { assertContextKeys(contextKeys, false, false, false); }); + test('insert, insert plain text -> no snippet mode', function () { + const ctrl = new SnippetController2(editor, contextKeys); + + ctrl.insert('foobar'); + assertContextKeys(contextKeys, false, false, false); + assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); + }); + + test('insert, delete snippet text', function () { const ctrl = new SnippetController2(editor, contextKeys); diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 41c5b124ffd..48c721acf4d 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -726,6 +726,10 @@ declare module monaco { * Create a new selection with a different `selectionStartLineNumber` and `selectionStartColumn`. */ setStartPosition(startLineNumber: number, startColumn: number): Selection; + /** + * Create a `Selection` from one or two positions + */ + static fromPositions(start: IPosition, end?: IPosition): Selection; /** * Create a `Selection` from an `ISelection`. */ From 841a95bc49da1a4b06c772a9218e6f344d2fd215 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 10 May 2017 16:22:05 +0200 Subject: [PATCH 0289/1164] Do not auto-close quotes after a word character (#25658) --- .../common/controller/cursorTypeOperations.ts | 19 ++++- .../test/common/controller/cursor.test.ts | 74 +++++++++++++++++-- 2 files changed, 81 insertions(+), 12 deletions(-) diff --git a/src/vs/editor/common/controller/cursorTypeOperations.ts b/src/vs/editor/common/controller/cursorTypeOperations.ts index c564895b614..cc4c9327bc9 100644 --- a/src/vs/editor/common/controller/cursorTypeOperations.ts +++ b/src/vs/editor/common/controller/cursorTypeOperations.ts @@ -16,6 +16,7 @@ import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageCo import { IndentAction } from 'vs/editor/common/modes/languageConfiguration'; import { SurroundSelectionCommand } from 'vs/editor/common/commands/surroundSelectionCommand'; import { IElectricAction } from 'vs/editor/common/modes/supports/electricCharacter'; +import { getMapForWordSeparators, WordCharacterClass } from "vs/editor/common/controller/cursorWordOperations"; export class TypeOperations { @@ -364,10 +365,20 @@ export class TypeOperations { const position = cursor.position; const lineText = model.getLineContent(position.lineNumber); - const afterCharacter = lineText.charAt(position.column - 1); + + // Do not auto-close ' or " after a word character + if ((ch === '\'' || ch === '"') && position.column > 1) { + const wordSeparators = getMapForWordSeparators(config.wordSeparators); + const characterBeforeCode = lineText.charCodeAt(position.column - 2); + const characterBeforeType = wordSeparators.get(characterBeforeCode); + if (characterBeforeType === WordCharacterClass.Regular) { + return false; + } + } // Only consider auto closing the pair if a space follows or if another autoclosed pair follows - if (afterCharacter) { + const characterAfter = lineText.charAt(position.column - 1); + if (characterAfter) { const thisBraceIsSymmetric = (config.autoClosingPairsOpen[ch] === ch); let isBeforeCloseBrace = false; @@ -376,12 +387,12 @@ export class TypeOperations { if (!thisBraceIsSymmetric && otherBraceIsSymmetric) { continue; } - if (afterCharacter === otherCloseBrace) { + if (characterAfter === otherCloseBrace) { isBeforeCloseBrace = true; break; } } - if (!isBeforeCloseBrace && !/\s/.test(afterCharacter)) { + if (!isBeforeCloseBrace && !/\s/.test(characterAfter)) { return false; } } diff --git a/src/vs/editor/test/common/controller/cursor.test.ts b/src/vs/editor/test/common/controller/cursor.test.ts index a543e5dac9a..eb7e5df87c7 100644 --- a/src/vs/editor/test/common/controller/cursor.test.ts +++ b/src/vs/editor/test/common/controller/cursor.test.ts @@ -3098,14 +3098,14 @@ suite('autoClosingPairs', () => { }, (model, cursor) => { let autoClosePositions = [ - 'var| a| =| [|];|', - 'var| b| =| |`asd|`;|', - 'var| c| =| !\'asd!\';|', - 'var| d| =| |"asd|";|', - 'var| e| =| /*3*/| 3;|', - 'var| f| =| /**| 3| */3;|', - 'var| g| =| (3+5|);|', - 'var| h| =| {| a:| !\'value!\'| |};|', + 'var a =| [|];|', + 'var b =| |`asd`;|', + 'var c =| !\'asd!\';|', + 'var d =| |"asd";|', + 'var e =| /*3*/| 3;|', + 'var f =| /**| 3 */3;|', + 'var g =| (3+5);|', + 'var h =| {| a:| !\'value!\'| |};|', ]; for (let i = 0, len = autoClosePositions.length; i < len; i++) { const lineNumber = i + 1; @@ -3125,6 +3125,64 @@ suite('autoClosingPairs', () => { mode.dispose(); }); + test('issue #25658 - Do not auto-close single/double quotes after word characters', () => { + let mode = new AutoClosingMode(); + usingCursor({ + text: [ + '', + ], + languageIdentifier: mode.getLanguageIdentifier() + }, (model, cursor) => { + + function typeCharacters(cursor: Cursor, chars: string): void { + for (let i = 0, len = chars.length; i < len; i++) { + cursorCommand(cursor, H.Type, { text: chars[i] }, 'keyboard'); + } + } + + // First gif + typeCharacters(cursor, 'teste1 = teste\' ok'); + assert.equal(model.getLineContent(1), 'teste1 = teste\' ok'); + + cursor.setSelections('test', [new Selection(1, 1000, 1, 1000)]); + typeCharacters(cursor, '\n'); + typeCharacters(cursor, 'teste2 = teste \'ok'); + assert.equal(model.getLineContent(2), 'teste2 = teste \'ok\''); + + cursor.setSelections('test', [new Selection(2, 1000, 2, 1000)]); + typeCharacters(cursor, '\n'); + typeCharacters(cursor, 'teste3 = teste" ok'); + assert.equal(model.getLineContent(3), 'teste3 = teste" ok'); + + cursor.setSelections('test', [new Selection(3, 1000, 3, 1000)]); + typeCharacters(cursor, '\n'); + typeCharacters(cursor, 'teste4 = teste "ok'); + assert.equal(model.getLineContent(4), 'teste4 = teste "ok"'); + + // Second gif + cursor.setSelections('test', [new Selection(4, 1000, 4, 1000)]); + typeCharacters(cursor, '\n'); + typeCharacters(cursor, 'teste \''); + assert.equal(model.getLineContent(5), 'teste \'\''); + + cursor.setSelections('test', [new Selection(5, 1000, 5, 1000)]); + typeCharacters(cursor, '\n'); + typeCharacters(cursor, 'teste "'); + assert.equal(model.getLineContent(6), 'teste ""'); + + cursor.setSelections('test', [new Selection(6, 1000, 6, 1000)]); + typeCharacters(cursor, '\n'); + typeCharacters(cursor, 'teste\''); + assert.equal(model.getLineContent(7), 'teste\''); + + cursor.setSelections('test', [new Selection(7, 1000, 7, 1000)]); + typeCharacters(cursor, '\n'); + typeCharacters(cursor, 'teste"'); + assert.equal(model.getLineContent(8), 'teste"'); + }); + mode.dispose(); + }); + test('issue #15825: accents on mac US intl keyboard', () => { let mode = new AutoClosingMode(); usingCursor({ From dc7edcc887e2de883638db8c8ea75862c99e8b86 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 10 May 2017 16:31:07 +0200 Subject: [PATCH 0290/1164] Fix NPE in OverviewRuler --- .../browser/viewParts/overviewRuler/overviewRulerImpl.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/vs/editor/browser/viewParts/overviewRuler/overviewRulerImpl.ts b/src/vs/editor/browser/viewParts/overviewRuler/overviewRulerImpl.ts index 03105fa944c..e1472ac7772 100644 --- a/src/vs/editor/browser/viewParts/overviewRuler/overviewRulerImpl.ts +++ b/src/vs/editor/browser/viewParts/overviewRuler/overviewRulerImpl.ts @@ -6,7 +6,6 @@ import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { OverviewRulerLane, ThemeType } from 'vs/editor/common/editorCommon'; -import { IDisposable } from 'vs/base/common/lifecycle'; import { OverviewZoneManager, ColorZone, OverviewRulerZone } from 'vs/editor/common/view/overviewZoneManager'; import { Color } from 'vs/base/common/color'; import { OverviewRulerPosition } from 'vs/editor/common/config/editorOptions'; @@ -20,8 +19,6 @@ export class OverviewRulerImpl { private _canUseTranslate3d: boolean; private _background: Color; - private _zoomListener: IDisposable; - constructor( canvasLeftOffset: number, cssClassName: string, scrollHeight: number, lineHeight: number, canUseTranslate3d: boolean, pixelRatio: number, minimumHeight: number, maximumHeight: number, @@ -52,7 +49,6 @@ export class OverviewRulerImpl { } public dispose(): void { - this._zoomListener.dispose(); this._zoneManager = null; } From e90f4d5c253d5e614a5e78375247c467fe1e8900 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 10 May 2017 16:32:58 +0200 Subject: [PATCH 0291/1164] cache & freeze snippet placeholders --- .../contrib/snippet/browser/editorSnippets.ts | 6 ++--- .../contrib/snippet/common/snippetParser.ts | 24 ++++++++++--------- .../snippet/test/common/snippetParser.test.ts | 8 +++---- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index f79504c2bcd..98ac8849de1 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -67,7 +67,7 @@ class OneSnippet { this._snippetDecoration = accessor.addDecoration(range, OneSnippet._decor.snippet); // create a decoration for each placeholder - for (const placeholder of this._snippet.getPlaceholders()) { + for (const placeholder of this._snippet.placeholders) { const placeholderOffset = this._snippet.offset(placeholder); const placeholderLen = this._snippet.len(placeholder); const range = Range.fromPositions( @@ -83,7 +83,7 @@ class OneSnippet { this._placeholderGroupsIdx = -1; this._placeholderGroups = []; let lastBucket: Placeholder[]; - this._snippet.getPlaceholders().sort(Placeholder.compareByIndex).forEach(a => { + this._snippet.placeholders.slice(0).sort(Placeholder.compareByIndex).forEach(a => { if (!lastBucket || lastBucket[0].index !== a.index) { lastBucket = [a]; this._placeholderGroups.push(lastBucket); @@ -147,7 +147,7 @@ class OneSnippet { } get hasPlaceholder() { - return this._snippet.getPlaceholders().length > 0; + return this._snippet.placeholders.length > 0; } get range() { diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/common/snippetParser.ts index d8086977281..1c6a60b2c68 100644 --- a/src/vs/editor/contrib/snippet/common/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/common/snippetParser.ts @@ -222,9 +222,22 @@ export function walk(marker: Marker[], visitor: (marker: Marker) => boolean): vo export class TextmateSnippet { readonly marker: Marker[]; + readonly placeholders: Placeholder[]; constructor(marker: Marker[]) { this.marker = marker; + this.placeholders = []; + + // fill in placeholders + walk(marker, candidate => { + if (candidate instanceof Placeholder) { + this.placeholders.push(candidate); + } + return true; + }); + + Object.freeze(this.marker); + Object.freeze(this.placeholders); } offset(marker: Marker): number { @@ -254,17 +267,6 @@ export class TextmateSnippet { return ret; } - getPlaceholders(): Placeholder[] { - const ret: Placeholder[] = []; - walk(this.marker, candidate => { - if (candidate instanceof Placeholder) { - ret.push(candidate); - } - return true; - }); - return ret; - } - get text() { return Marker.toString(this.marker); } diff --git a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts index 3ff63929bce..9665f7e14f7 100644 --- a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts +++ b/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts @@ -343,20 +343,20 @@ suite('SnippetParser', () => { test('TextmateSnippet#placeholder', () => { let snippet = SnippetParser.parse('te$1xt'); - let placeholders = snippet.getPlaceholders(); + let placeholders = snippet.placeholders; assert.equal(placeholders.length, 1); snippet = SnippetParser.parse('te$1xt$1'); - placeholders = snippet.getPlaceholders(); + placeholders = snippet.placeholders; assert.equal(placeholders.length, 2); snippet = SnippetParser.parse('te$1xt$2'); - placeholders = snippet.getPlaceholders(); + placeholders = snippet.placeholders; assert.equal(placeholders.length, 2); snippet = SnippetParser.parse('${1:bar${2:foo}bar}'); - placeholders = snippet.getPlaceholders(); + placeholders = snippet.placeholders; assert.equal(placeholders.length, 2); }); }); From f4cc58b47ba2d185137246f8771fab8f92429745 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 10 May 2017 12:52:11 +0200 Subject: [PATCH 0292/1164] debug: add StackFrame.range to model #8851 --- .../parts/debug/browser/debugEditorModelManager.ts | 6 +++--- src/vs/workbench/parts/debug/common/debug.ts | 3 +-- src/vs/workbench/parts/debug/common/debugModel.ts | 14 +++++++++----- .../electron-browser/debugEditorContribution.ts | 8 ++++---- .../parts/debug/electron-browser/debugService.ts | 2 +- .../parts/debug/electron-browser/debugViewer.ts | 10 +++++----- .../parts/debug/test/common/debugViewModel.test.ts | 2 +- .../parts/debug/test/node/debugModel.test.ts | 4 ++-- 8 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts b/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts index 883f40a1cab..c404debd95d 100644 --- a/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts +++ b/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts @@ -122,8 +122,8 @@ export class DebugEditorModelManager implements IWorkbenchContribution { } // only show decorations for the currently focussed thread. - const columnUntilEOLRange = new Range(stackFrame.lineNumber, stackFrame.column, stackFrame.lineNumber, Constants.MAX_SAFE_SMALL_INTEGER); - const range = new Range(stackFrame.lineNumber, stackFrame.column, stackFrame.lineNumber, stackFrame.column + 1); + const columnUntilEOLRange = new Range(stackFrame.range.startLineNumber, stackFrame.range.startColumn, stackFrame.range.startLineNumber, Constants.MAX_SAFE_SMALL_INTEGER); + const range = new Range(stackFrame.range.startLineNumber, stackFrame.range.startColumn, stackFrame.range.startLineNumber, stackFrame.range.startColumn + 1); // compute how to decorate the editor. Different decorations are used if this is a top stack frame, focussed stack frame, // an exception or a stack frame that did not change the line number (we only decorate the columns, not the whole line). @@ -147,7 +147,7 @@ export class DebugEditorModelManager implements IWorkbenchContribution { if (this.modelDataMap.has(modelUriStr)) { const modelData = this.modelDataMap.get(modelUriStr); - if (modelData.topStackFrameRange && modelData.topStackFrameRange.startLineNumber === stackFrame.lineNumber && modelData.topStackFrameRange.startColumn !== stackFrame.column) { + if (modelData.topStackFrameRange && modelData.topStackFrameRange.startLineNumber === stackFrame.range.startLineNumber && modelData.topStackFrameRange.startColumn !== stackFrame.range.startColumn) { result.push({ options: DebugEditorModelManager.TOP_STACK_FRAME_INLINE_DECORATION, range: columnUntilEOLRange diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index 7f8c638a686..e62a4cda48d 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -180,9 +180,8 @@ export interface IScope extends IExpressionContainer { export interface IStackFrame extends ITreeElement { thread: IThread; name: string; - lineNumber: number; - column: number; frameId: number; + range: IRange; source: Source; getScopes(): TPromise; getMostSpecificScopes(range: IRange): TPromise; diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index d84b9287e29..c3fde484138 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -311,8 +311,7 @@ export class StackFrame implements IStackFrame { public frameId: number, public source: Source, public name: string, - public lineNumber: number, - public column: number + public range: IRange ) { this.scopes = null; } @@ -352,7 +351,7 @@ export class StackFrame implements IStackFrame { } public toString(): string { - return `${this.name} (${this.source.inMemory ? this.source.name : this.source.uri.fsPath}:${this.lineNumber})`; + return `${this.name} (${this.source.inMemory ? this.source.name : this.source.uri.fsPath}:${this.range.startLineNumber})`; } public openInEditor(editorService: IWorkbenchEditorService, preserveFocus?: boolean, sideBySide?: boolean): TPromise { @@ -362,7 +361,7 @@ export class StackFrame implements IStackFrame { description: this.source.origin, options: { preserveFocus, - selection: { startLineNumber: this.lineNumber, startColumn: 1 }, + selection: { startLineNumber: this.range.startLineNumber, startColumn: 1 }, revealIfVisible: true, revealInCenterIfOutsideViewport: true, pinned: !preserveFocus @@ -444,7 +443,12 @@ export class Thread implements IThread { this.process.sources.set(source.uri.toString(), source); } - return new StackFrame(this, rsf.id, source, rsf.name, rsf.line, rsf.column); + return new StackFrame(this, rsf.id, source, rsf.name, new Range( + rsf.line, + rsf.column, + rsf.endLine === undefined ? rsf.line : rsf.endLine, + rsf.endColumn === undefined ? rsf.column : rsf.endColumn + )); }); }, (err: Error) => { if (this.stoppedDetails) { diff --git a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts index 71db8f69118..2b29b662fec 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts @@ -368,8 +368,8 @@ export class DebugEditorContribution implements IDebugEditorContribution { this.closeExceptionWidget(); } else if (sameUri) { focusedSf.thread.exceptionInfo.then(exceptionInfo => { - if (exceptionInfo && exceptionSf.lineNumber && exceptionSf.column) { - this.showExceptionWidget(exceptionInfo, exceptionSf.lineNumber, exceptionSf.column); + if (exceptionInfo && exceptionSf.range.startLineNumber && exceptionSf.range.startColumn) { + this.showExceptionWidget(exceptionInfo, exceptionSf.range.startLineNumber, exceptionSf.range.startColumn); } }); } @@ -467,11 +467,11 @@ export class DebugEditorContribution implements IDebugEditorContribution { this.removeInlineValuesScheduler.cancel(); - stackFrame.getMostSpecificScopes(new Range(stackFrame.lineNumber, stackFrame.column, stackFrame.lineNumber, stackFrame.column)) + stackFrame.getMostSpecificScopes(stackFrame.range) // Get all top level children in the scope chain .then(scopes => TPromise.join(scopes.map(scope => scope.getChildren() .then(children => { - let range = new Range(0, 0, stackFrame.lineNumber, stackFrame.column); + let range = new Range(0, 0, stackFrame.range.startLineNumber, stackFrame.range.startColumn); if (scope.range) { range = range.setStartPosition(scope.range.startLineNumber, scope.range.startColumn); } diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 4ea09c9bbe3..d9856b2456d 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -297,7 +297,7 @@ export class DebugService implements debug.IDebugService { const stackFrameToFocus = first(callStack, sf => sf.source && sf.source.available, callStack[0]); this.focusStackFrameAndEvaluate(stackFrameToFocus).done(null, errors.onUnexpectedError); this.windowService.getWindow().focus(); - aria.alert(nls.localize('debuggingPaused', "Debugging paused, reason {0}, {1} {2}", event.body.reason, stackFrameToFocus.source ? stackFrameToFocus.source.name : '', stackFrameToFocus.lineNumber)); + aria.alert(nls.localize('debuggingPaused', "Debugging paused, reason {0}, {1} {2}", event.body.reason, stackFrameToFocus.source ? stackFrameToFocus.source.name : '', stackFrameToFocus.range.startLineNumber)); return stackFrameToFocus.openInEditor(this.editorService); } diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts index 7bde56e3511..240a79e9517 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts @@ -538,10 +538,10 @@ export class CallStackRenderer implements IRenderer { data.label.textContent = stackFrame.name; data.label.title = stackFrame.name; data.fileName.textContent = getSourceName(stackFrame.source, this.contextService); - if (stackFrame.lineNumber !== undefined) { - data.lineNumber.textContent = `${stackFrame.lineNumber}`; - if (stackFrame.column) { - data.lineNumber.textContent += `:${stackFrame.column}`; + if (stackFrame.range.startLineNumber !== undefined) { + data.lineNumber.textContent = `${stackFrame.range.startLineNumber}`; + if (stackFrame.range.startColumn) { + data.lineNumber.textContent += `:${stackFrame.range.startColumn}`; } dom.removeClass(data.lineNumber, 'unavailable'); } else { @@ -565,7 +565,7 @@ export class CallstackAccessibilityProvider implements IAccessibilityProvider { return nls.localize('threadAriaLabel', "Thread {0}, callstack, debug", (element).name); } if (element instanceof StackFrame) { - return nls.localize('stackFrameAriaLabel', "Stack Frame {0} line {1} {2}, callstack, debug", (element).name, (element).lineNumber, getSourceName((element).source, this.contextService)); + return nls.localize('stackFrameAriaLabel', "Stack Frame {0} line {1} {2}, callstack, debug", (element).name, (element).range.startLineNumber, getSourceName((element).source, this.contextService)); } return null; diff --git a/src/vs/workbench/parts/debug/test/common/debugViewModel.test.ts b/src/vs/workbench/parts/debug/test/common/debugViewModel.test.ts index 31dd5f1f8d8..872818bd727 100644 --- a/src/vs/workbench/parts/debug/test/common/debugViewModel.test.ts +++ b/src/vs/workbench/parts/debug/test/common/debugViewModel.test.ts @@ -25,7 +25,7 @@ suite('Debug - View Model', () => { const mockSession = new MockSession(); const process = new Process({ name: 'mockProcess', type: 'node', request: 'launch' }, mockSession); const thread = new Thread(process, 'myThread', 1); - const frame = new StackFrame(thread, 1, null, 'app.js', 1, 1); + const frame = new StackFrame(thread, 1, null, 'app.js', { startColumn: 1, startLineNumber: 1, endColumn: undefined, endLineNumber: undefined }); model.setFocusedStackFrame(frame, process); assert.equal(model.focusedStackFrame.getId(), frame.getId()); diff --git a/src/vs/workbench/parts/debug/test/node/debugModel.test.ts b/src/vs/workbench/parts/debug/test/node/debugModel.test.ts index 1705f9d25e5..6e117d36fd8 100644 --- a/src/vs/workbench/parts/debug/test/node/debugModel.test.ts +++ b/src/vs/workbench/parts/debug/test/node/debugModel.test.ts @@ -310,7 +310,7 @@ suite('Debug - Model', () => { assert.equal(model.getWatchExpressions().length, 0); const process = new Process({ name: 'mockProcess', type: 'node', request: 'launch' }, rawSession); const thread = new Thread(process, 'mockthread', 1); - const stackFrame = new StackFrame(thread, 1, null, 'app.js', 1, 1); + const stackFrame = new StackFrame(thread, 1, null, 'app.js', { startLineNumber: 1, startColumn: 1, endLineNumber: undefined, endColumn: undefined }); model.addWatchExpression(process, stackFrame, 'console').done(); model.addWatchExpression(process, stackFrame, 'console').done(); let watchExpressions = model.getWatchExpressions(); @@ -338,7 +338,7 @@ suite('Debug - Model', () => { assert.equal(model.getReplElements().length, 0); const process = new Process({ name: 'mockProcess', type: 'node', request: 'launch' }, rawSession); const thread = new Thread(process, 'mockthread', 1); - const stackFrame = new StackFrame(thread, 1, null, 'app.js', 1, 1); + const stackFrame = new StackFrame(thread, 1, null, 'app.js', { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 10 }); model.addReplExpression(process, stackFrame, 'myVariable').done(); model.addReplExpression(process, stackFrame, 'myVariable').done(); model.addReplExpression(process, stackFrame, 'myVariable').done(); From 6cba79f72700812614563cd5e8ab04986926641e Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 10 May 2017 16:33:23 +0200 Subject: [PATCH 0293/1164] debug: introduce breakpoint endLine and endColumn to the model. On bp click select the renage in editor #8851 --- src/vs/workbench/parts/debug/common/debug.ts | 2 ++ src/vs/workbench/parts/debug/common/debugModel.ts | 4 ++++ .../parts/debug/electron-browser/debugService.ts | 6 +++--- .../parts/debug/electron-browser/debugViewer.ts | 12 +++++++++++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index e62a4cda48d..26454a01bfc 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -205,7 +205,9 @@ export interface IRawBreakpoint { export interface IBreakpoint extends IEnablement { uri: uri; lineNumber: number; + endLineNumber?: number; column: number; + endColumn?: number; condition: string; hitCondition: string; verified: boolean; diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index c3fde484138..9b4fc2979e9 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -642,6 +642,8 @@ export class Breakpoint implements IBreakpoint { public verified: boolean; public idFromAdapter: number; public message: string; + public endLineNumber: number; + public endColumn: number; private id: string; constructor( @@ -827,7 +829,9 @@ export class Model implements IModel { const bpData = data[bp.getId()]; if (bpData) { bp.lineNumber = bpData.line ? bpData.line : bp.lineNumber; + bp.endLineNumber = bpData.endLine; bp.column = bpData.column; + bp.endColumn = bpData.endColumn; bp.verified = bpData.verified; bp.idFromAdapter = bpData.id; bp.message = bpData.message; diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index d9856b2456d..157009cdbd4 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -943,9 +943,9 @@ export class DebugService implements debug.IDebugService { if (this.model.getProcesses().length === 0) { // set breakpoints back to unverified since the session ended. - const data: { [id: string]: { line: number, verified: boolean, column: number } } = {}; + const data: { [id: string]: { line: number, verified: boolean, column: number, endLine: number, endColumn: number } } = {}; this.model.getBreakpoints().forEach(bp => { - data[bp.getId()] = { line: bp.lineNumber, verified: false, column: bp.column }; + data[bp.getId()] = { line: bp.lineNumber, verified: false, column: bp.column, endLine: bp.endLineNumber, endColumn: bp.endColumn }; }); this.model.updateBreakpoints(data); @@ -1006,7 +1006,7 @@ export class DebugService implements debug.IDebugService { return; } - const data: { [id: string]: { line?: number, column?: number, verified: boolean } } = {}; + const data: { [id: string]: DebugProtocol.Breakpoint } = {}; for (let i = 0; i < breakpointsToSend.length; i++) { data[breakpointsToSend[i].getId()] = response.body.breakpoints[i]; if (!breakpointsToSend[i].column) { diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts index 240a79e9517..b29c2e15648 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts @@ -1253,11 +1253,21 @@ export class BreakpointsController extends BaseDebugController { public openBreakpointSource(breakpoint: Breakpoint, event: IKeyboardEvent | IMouseEvent, preserveFocus: boolean): void { const sideBySide = (event && (event.ctrlKey || event.metaKey)); + const selection = breakpoint.endLineNumber ? { + startLineNumber: breakpoint.lineNumber, + endLineNumber: breakpoint.endLineNumber, + startColumn: breakpoint.column, + endColumn: breakpoint.endColumn + } : { + startLineNumber: breakpoint.lineNumber, + startColumn: 1 + }; + this.editorService.openEditor({ resource: breakpoint.uri, options: { preserveFocus, - selection: { startLineNumber: breakpoint.lineNumber, startColumn: 1 }, + selection, revealIfVisible: true, revealInCenterIfOutsideViewport: true, pinned: !preserveFocus From 47c0398dbd79254fff20f65ecba8b8d13c19ad16 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 10 May 2017 16:55:40 +0200 Subject: [PATCH 0294/1164] add TextmateSnippet#resolveVariable --- .../contrib/snippet/common/snippetParser.ts | 13 ++++++++++ .../{common => browser}/snippetParser.test.ts | 0 .../snippetVariables.test.ts | 25 +++++++++++++++++++ 3 files changed, 38 insertions(+) rename src/vs/editor/contrib/snippet/test/{common => browser}/snippetParser.test.ts (100%) rename src/vs/editor/contrib/snippet/test/{common => browser}/snippetVariables.test.ts (81%) diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/common/snippetParser.ts index 1c6a60b2c68..77e829910bb 100644 --- a/src/vs/editor/contrib/snippet/common/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/common/snippetParser.ts @@ -270,6 +270,19 @@ export class TextmateSnippet { get text() { return Marker.toString(this.marker); } + + resolveVariables(resolver: { resolve(name: string): string }): void { + walk(this.marker, candidate => { + if (candidate instanceof Variable) { + candidate.resolvedValue = resolver.resolve(candidate.name); + if (candidate.isDefined) { + // remove default value from resolved variable + candidate.defaultValue.length = 0; + } + } + return true; + }); + } } export class SnippetParser { diff --git a/src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts similarity index 100% rename from src/vs/editor/contrib/snippet/test/common/snippetParser.test.ts rename to src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts diff --git a/src/vs/editor/contrib/snippet/test/common/snippetVariables.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts similarity index 81% rename from src/vs/editor/contrib/snippet/test/common/snippetVariables.test.ts rename to src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts index 0c72e96b318..ec9a2523890 100644 --- a/src/vs/editor/contrib/snippet/test/common/snippetVariables.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts @@ -9,6 +9,7 @@ import { isWindows } from 'vs/base/common/platform'; import URI from 'vs/base/common/uri'; import { Selection } from 'vs/editor/common/core/selection'; import { SnippetVariablesResolver } from 'vs/editor/contrib/snippet/common/snippetVariables'; +import { SnippetParser } from 'vs/editor/contrib/snippet/common/snippetParser'; import { MockCodeEditor, withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; import { Model } from 'vs/editor/common/model/model'; @@ -91,4 +92,28 @@ suite('Snippet Variables Resolver', function () { }); }); + test('TextmateSnippet, resolve variable', function () { + + const snippet = SnippetParser.parse('"$TM_SELECTED_TEXT"'); + + variablesTest((editor, resolver) => { + assert.equal(snippet.text, '""'); + editor.setSelection(new Selection(1, 1, 1, 5)); + snippet.resolveVariables(resolver); + assert.equal(snippet.text, '"this"'); + }); + }); + + test('TextmateSnippet, resolve variable with default', function () { + + const snippet = SnippetParser.parse('"${TM_SELECTED_TEXT:foo}"'); + + variablesTest((editor, resolver) => { + assert.equal(snippet.text, '"foo"'); + editor.setSelection(new Selection(1, 1, 1, 5)); + snippet.resolveVariables(resolver); + assert.equal(snippet.text, '"this"'); + }); + }); + }); From 41f5fc78a732eac7f63834eeac5a8667756fcfff Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 10 May 2017 07:57:54 -0700 Subject: [PATCH 0295/1164] Fixes #26371 Swap only if there isnt enough space on the right --- .../contrib/suggest/browser/suggestWidget.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index e28be9bc62e..a84c8f577cb 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -837,7 +837,6 @@ export class SuggestWidget implements IContentWidget, IDelegate const perColumnWidth = this.editor.getLayoutInfo().contentWidth / this.editor.getLayoutInfo().viewportColumn; const spaceOntheLeft = Math.floor(this.editor.getPosition().column * perColumnWidth) - this.editor.getScrollLeft(); const spaceOntheRight = this.editor.getLayoutInfo().contentWidth - spaceOntheLeft; - const columnsOccupiedByDocs = Math.floor(this.docsWidth / perColumnWidth); // Reset width this.details.element.style.width = `${this.docsWidth}px`; @@ -857,8 +856,7 @@ export class SuggestWidget implements IContentWidget, IDelegate if (this.editorGroupService.getGroupOrientation() === 'horizontal' || totalEditors === 1) { if (this.editor.getLayoutInfo().contentWidth > this.maxWidgetWidth) { if (spaceOntheRight < this.docsWidth) { - addClass(this.element, 'list-right'); - this.preferredPosition = new Position(this.editor.getPosition().lineNumber, this.editor.getPosition().column - columnsOccupiedByDocs); + this.swapDocs(); } return; } @@ -868,10 +866,17 @@ export class SuggestWidget implements IContentWidget, IDelegate // Its vertical, multiple editors, active editor is the last one and not enough space on the right for widget // TODO: Check if window width < this.maxDocsWidth, in which case we may have to drop the docs below. + if (spaceOntheRight < this.docsWidth) { + this.swapDocs(); + } + + } + + private swapDocs() { + const perColumnWidth = this.editor.getLayoutInfo().contentWidth / this.editor.getLayoutInfo().viewportColumn; + const columnsOccupiedByDocs = Math.floor(this.docsWidth / perColumnWidth); addClass(this.element, 'list-right'); this.preferredPosition = new Position(this.editor.getPosition().lineNumber, this.editor.getPosition().column - columnsOccupiedByDocs); - - return; } private showDocsBelow() { From 3dde4393dbdbba648e24673cf9ae5381d7662335 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 10 May 2017 17:18:56 +0200 Subject: [PATCH 0296/1164] Theming: Decorations overview color. Fixes #26102 --- src/vs/editor/browser/view/viewImpl.ts | 1 + .../overviewRuler/decorationsOverviewRuler.ts | 18 ++++++++++++++---- .../editor/common/view/editorColorRegistry.ts | 3 +++ src/vs/editor/common/view/viewContext.ts | 3 ++- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index c1cfa7f9037..9e113117580 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -116,6 +116,7 @@ export class View extends ViewEventHandler { this._context = new ViewContext(configuration, themeService.getTheme(), model, this.eventDispatcher); this._register(themeService.onThemeChange(theme => { + this._context.theme = theme; this.eventDispatcher.emit(new viewEvents.ViewThemeChangedEvent()); })); diff --git a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts index 69fdbe52a17..b55e1c8b651 100644 --- a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts +++ b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts @@ -15,6 +15,7 @@ import { TokenizationRegistry } from 'vs/editor/common/modes'; import { IDisposable } from 'vs/base/common/lifecycle'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { OverviewRulerZone } from 'vs/editor/common/view/overviewZoneManager'; +import { editorOverviewRulerBorder } from 'vs/editor/common/view/editorColorRegistry'; function getThemeType(themeId: string): editorCommon.ThemeType { if (themes.isHighContrastTheme(themeId)) { @@ -34,13 +35,12 @@ export class DecorationsOverviewRuler extends ViewPart { private static _CURSOR_COLOR = 'rgba(0, 0, 102, 0.8)'; private static _CURSOR_COLOR_DARK = 'rgba(152, 152, 152, 0.8)'; - private static _BORDER_COLOR = 'rgba(127,127,127,0.3)'; - private readonly _tokensColorTrackerListener: IDisposable; private _overviewRuler: OverviewRulerImpl; private _renderBorder: boolean; + private _borderColor: string; private _shouldUpdateDecorations: boolean; private _shouldUpdateCursorPosition: boolean; @@ -71,6 +71,10 @@ export class DecorationsOverviewRuler extends ViewPart { this._renderBorder = this._context.configuration.editor.viewInfo.overviewRulerBorder; + let borderColor = this._context.theme.getColor(editorOverviewRulerBorder); + this._borderColor = borderColor ? borderColor.toString() : null; + + this._updateBackground(false); this._tokensColorTrackerListener = TokenizationRegistry.onDidChange((e) => { if (e.changedColorMap) { @@ -163,6 +167,12 @@ export class DecorationsOverviewRuler extends ViewPart { return true; } + public onThemeChanged(e: viewEvents.ViewThemeChangedEvent): boolean { + let borderColor = this._context.theme.getColor(editorOverviewRulerBorder); + this._borderColor = borderColor ? borderColor.toString() : null; + return true; + } + // ---- end view event handlers public getDomNode(): HTMLElement { @@ -240,11 +250,11 @@ export class DecorationsOverviewRuler extends ViewPart { let hasRendered = this._overviewRuler.render(false); - if (hasRendered && this._renderBorder && this._overviewRuler.getLanesCount() > 0 && (this._zonesFromDecorations.length > 0 || this._zonesFromCursors.length > 0)) { + if (hasRendered && this._renderBorder && this._borderColor && this._overviewRuler.getLanesCount() > 0 && (this._zonesFromDecorations.length > 0 || this._zonesFromCursors.length > 0)) { let ctx2 = this._overviewRuler.getDomNode().getContext('2d'); ctx2.beginPath(); ctx2.lineWidth = 1; - ctx2.strokeStyle = DecorationsOverviewRuler._BORDER_COLOR; + ctx2.strokeStyle = this._borderColor; ctx2.moveTo(0, 0); ctx2.lineTo(0, this._overviewRuler.getPixelHeight()); ctx2.stroke(); diff --git a/src/vs/editor/common/view/editorColorRegistry.ts b/src/vs/editor/common/view/editorColorRegistry.ts index 93223cdec71..32befce5e40 100644 --- a/src/vs/editor/common/view/editorColorRegistry.ts +++ b/src/vs/editor/common/view/editorColorRegistry.ts @@ -25,6 +25,9 @@ export const editorCodeLensForeground = registerColor('editorCodeLens.foreground export const editorBracketMatchBackground = registerColor('editorBracketMatch.background', { dark: '#0064001a', light: '#0064001a', hc: '#0064001a' }, nls.localize('editorBracketMatchBackground', 'Background color behind matching brackets')); export const editorBracketMatchBorder = registerColor('editorBracketMatch.border', { dark: '#888', light: '#B9B9B9', hc: '#fff' }, nls.localize('editorBracketMatchBorder', 'Color for matching brackets boxes')); +export const editorOverviewRulerBorder = registerColor('editorOverviewRuler.border', { dark: '#7f7f7f4d', light: '#7f7f7f4d', hc: '#7f7f7f4d' }, nls.localize('editorOverviewRulerBorder', 'Color of the overview ruler border.')); + + // contains all color rules that used to defined in editor/browser/widget/editor.css registerThemingParticipant((theme, collector) => { diff --git a/src/vs/editor/common/view/viewContext.ts b/src/vs/editor/common/view/viewContext.ts index 91b722b0afb..7aae15aebab 100644 --- a/src/vs/editor/common/view/viewContext.ts +++ b/src/vs/editor/common/view/viewContext.ts @@ -13,11 +13,12 @@ import { ITheme } from 'vs/platform/theme/common/themeService'; export class ViewContext { public readonly configuration: IConfiguration; - public readonly theme: ITheme; public readonly model: IViewModel; public readonly viewLayout: IViewLayout; public readonly privateViewEventBus: ViewEventDispatcher; + public theme: ITheme; // will be updated + constructor( configuration: IConfiguration, theme: ITheme, From 8a0aca3fd82896d5d632768d74b9cafe3e1c1595 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 10 May 2017 17:36:00 +0200 Subject: [PATCH 0297/1164] Fixes #26279: ensure textarea has a line height of >= 1 screen pixel to get input events --- .../browser/controller/textAreaHandler.ts | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index 420e4bfafbc..c1b3df004c6 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -54,6 +54,7 @@ export class TextAreaHandler extends ViewPart { private readonly _viewController: ViewController; private readonly _viewHelper: ITextAreaHandlerHelper; + private _pixelRatio: number; private _contentLeft: number; private _contentWidth: number; private _contentHeight: number; @@ -81,14 +82,17 @@ export class TextAreaHandler extends ViewPart { this._viewController = viewController; this._viewHelper = viewHelper; - this._contentLeft = this._context.configuration.editor.layoutInfo.contentLeft; - this._contentWidth = this._context.configuration.editor.layoutInfo.contentWidth; - this._contentHeight = this._context.configuration.editor.layoutInfo.contentHeight; + const conf = this._context.configuration.editor; + + this._pixelRatio = conf.pixelRatio; + this._contentLeft = conf.layoutInfo.contentLeft; + this._contentWidth = conf.layoutInfo.contentWidth; + this._contentHeight = conf.layoutInfo.contentHeight; this._scrollLeft = 0; this._scrollTop = 0; - this._experimentalScreenReader = this._context.configuration.editor.viewInfo.experimentalScreenReader; - this._fontInfo = this._context.configuration.editor.fontInfo; - this._lineHeight = this._context.configuration.editor.lineHeight; + this._experimentalScreenReader = conf.viewInfo.experimentalScreenReader; + this._fontInfo = conf.fontInfo; + this._lineHeight = conf.lineHeight; this._visibleTextArea = null; this._selections = [new Selection(1, 1, 1, 1)]; @@ -103,7 +107,7 @@ export class TextAreaHandler extends ViewPart { this.textArea.setAttribute('autocorrect', 'off'); this.textArea.setAttribute('autocapitalize', 'off'); this.textArea.setAttribute('spellcheck', 'false'); - this.textArea.setAttribute('aria-label', this._context.configuration.editor.viewInfo.ariaLabel); + this.textArea.setAttribute('aria-label', conf.viewInfo.ariaLabel); this.textArea.setAttribute('role', 'textbox'); this.textArea.setAttribute('aria-multiline', 'true'); this.textArea.setAttribute('aria-haspopup', 'false'); @@ -260,23 +264,28 @@ export class TextAreaHandler extends ViewPart { // --- begin event handlers public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { - // Give textarea same font size & line height as editor, for the IME case (when the textarea is visible) + const conf = this._context.configuration.editor; + if (e.fontInfo) { - this._fontInfo = this._context.configuration.editor.fontInfo; + this._fontInfo = conf.fontInfo; } if (e.viewInfo) { - this._experimentalScreenReader = this._context.configuration.editor.viewInfo.experimentalScreenReader; + this._experimentalScreenReader = conf.viewInfo.experimentalScreenReader; this._textAreaInput.writeScreenReaderContent('strategy changed'); - this.textArea.setAttribute('aria-label', this._context.configuration.editor.viewInfo.ariaLabel); + this.textArea.setAttribute('aria-label', conf.viewInfo.ariaLabel); } if (e.layoutInfo) { - this._contentLeft = this._context.configuration.editor.layoutInfo.contentLeft; - this._contentWidth = this._context.configuration.editor.layoutInfo.contentWidth; - this._contentHeight = this._context.configuration.editor.layoutInfo.contentHeight; + this._contentLeft = conf.layoutInfo.contentLeft; + this._contentWidth = conf.layoutInfo.contentWidth; + this._contentHeight = conf.layoutInfo.contentHeight; } if (e.lineHeight) { - this._lineHeight = this._context.configuration.editor.lineHeight; + this._lineHeight = conf.lineHeight; } + if (e.pixelRatio) { + this._pixelRatio = conf.pixelRatio; + } + return true; } public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { @@ -400,7 +409,7 @@ export class TextAreaHandler extends ViewPart { Configuration.applyFontInfo(ta, this._fontInfo); } else { ta.setFontSize(1); - ta.setLineHeight(1); + ta.setLineHeight(Math.ceil(1 / this._pixelRatio)); } ta.setTop(top); @@ -418,6 +427,7 @@ export class TextAreaHandler extends ViewPart { const ta = this.textArea; const tac = this.textAreaCover; + Configuration.applyFontInfo(ta, this._fontInfo); ta.setTop(0); ta.setLeft(0); tac.setTop(0); From 99daa037f19ddae8f6b8af5ece62778d1a97bd96 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 10 May 2017 17:45:55 +0200 Subject: [PATCH 0298/1164] Document funny line height value (#26279) --- src/vs/editor/browser/controller/textAreaHandler.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index c1b3df004c6..2a52c37838f 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -409,6 +409,8 @@ export class TextAreaHandler extends ViewPart { Configuration.applyFontInfo(ta, this._fontInfo); } else { ta.setFontSize(1); + // Chrome does not generate input events in empty textareas that end + // up having a line height smaller than 1 screen pixel. ta.setLineHeight(Math.ceil(1 / this._pixelRatio)); } From b7ae720dfd761c76fea20ca7cfb519132774b437 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 10 May 2017 17:47:19 +0200 Subject: [PATCH 0299/1164] wire up variable resolver, resolve variables per selection --- .../contrib/snippet/browser/editorSnippets.ts | 22 +-- .../contrib/snippet/common/snippetParser.ts | 13 +- .../snippet/common/snippetVariables.ts | 53 ++++++- .../test/browser/editorSnippets.test.ts | 18 ++- .../test/browser/snippetVariables.test.ts | 129 ++++++++---------- 5 files changed, 143 insertions(+), 92 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index 98ac8849de1..650b5018d14 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -13,6 +13,7 @@ import { Selection } from 'vs/editor/common/core/selection'; import { Range } from 'vs/editor/common/core/range'; import { IPosition } from 'vs/editor/common/core/position'; import { dispose } from 'vs/base/common/lifecycle'; +import { EditorSnippetVariableResolver } from "vs/editor/contrib/snippet/common/snippetVariables"; class OneSnippet { @@ -172,21 +173,26 @@ export class SnippetSession { return templateLines.join(model.getEOL()); } - static adjustRange(model: IModel, range: Range, overwriteBefore: number, overwriteAfter: number): Range { + static adjustSelection(model: IModel, selection: Selection, overwriteBefore: number, overwriteAfter: number): Selection { if (overwriteBefore !== 0 || overwriteAfter !== 0) { - let { startLineNumber, startColumn, endLineNumber, endColumn } = range; + let { startLineNumber, startColumn, endLineNumber, endColumn } = selection; startColumn -= overwriteBefore; endColumn += overwriteAfter; - range = Range.plusRange(range, { + const range = model.validateRange(Range.plusRange(selection, { startLineNumber, startColumn, endLineNumber, endColumn, - }); - range = model.validateRange(range); + })); + + selection = Selection.createWithDirection( + range.startLineNumber, range.startColumn, + range.endLineNumber, range.endColumn, + selection.getDirection() + ); } - return range; + return selection; } private readonly _editor: ICommonCodeEditor; @@ -222,11 +228,11 @@ export class SnippetSession { .sort((a, b) => Range.compareRangesUsingStarts(a.selection, b.selection)); for (const { selection, idx } of indexedSelection) { - const range = SnippetSession.adjustRange(model, selection, this._overwriteBefore, this._overwriteAfter); + const range = SnippetSession.adjustSelection(model, selection, this._overwriteBefore, this._overwriteAfter); const start = range.getStartPosition(); const adjustedTemplate = SnippetSession.normalizeWhitespace(model, start, this._template); - const snippet = SnippetParser.parse(adjustedTemplate); + const snippet = SnippetParser.parse(adjustedTemplate).resolveVariables(new EditorSnippetVariableResolver(model, range)); const offset = model.getOffsetAt(start) + delta; edits[idx] = EditOperation.replaceMove(range, snippet.text); diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/common/snippetParser.ts index 77e829910bb..a54b2b7821f 100644 --- a/src/vs/editor/contrib/snippet/common/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/common/snippetParser.ts @@ -183,9 +183,6 @@ export class Placeholder extends Marker { get isFinalTabstop() { return this.index === '0'; } - with(defaultValue: Marker[]): Placeholder { - return new Placeholder(this.index, defaultValue); - } toString() { return Marker.toString(this.defaultValue); } @@ -201,6 +198,13 @@ export class Variable extends Marker { get isDefined(): boolean { return this.resolvedValue !== undefined; } + len(): number { + if (this.isDefined) { + return this.resolvedValue.length; + } else { + return super.len(); + } + } toString() { return this.isDefined ? this.resolvedValue : Marker.toString(this.defaultValue); } @@ -271,7 +275,7 @@ export class TextmateSnippet { return Marker.toString(this.marker); } - resolveVariables(resolver: { resolve(name: string): string }): void { + resolveVariables(resolver: { resolve(name: string): string }): this { walk(this.marker, candidate => { if (candidate instanceof Variable) { candidate.resolvedValue = resolver.resolve(candidate.name); @@ -282,6 +286,7 @@ export class TextmateSnippet { } return true; }); + return this; } } diff --git a/src/vs/editor/contrib/snippet/common/snippetVariables.ts b/src/vs/editor/contrib/snippet/common/snippetVariables.ts index 1a8e0a39604..6f2fde17793 100644 --- a/src/vs/editor/contrib/snippet/common/snippetVariables.ts +++ b/src/vs/editor/contrib/snippet/common/snippetVariables.ts @@ -6,14 +6,61 @@ 'use strict'; import { basename, dirname, normalize } from 'vs/base/common/paths'; -import * as editorCommon from 'vs/editor/common/editorCommon'; +import { ICommonCodeEditor, IModel } from 'vs/editor/common/editorCommon'; +import { Selection } from 'vs/editor/common/core/selection'; import { ISnippetVariableResolver } from './snippet'; + +export class EditorSnippetVariableResolver { + + constructor( + private readonly _model: IModel, + private readonly _selection: Selection + ) { + // + } + + resolve(name: string): string { + if (name === 'SELECTION' || name === 'TM_SELECTED_TEXT') { + return this._model.getValueInRange(this._selection); + + } else if (name === 'TM_CURRENT_LINE') { + return this._model.getLineContent(this._selection.positionLineNumber); + + } else if (name === 'TM_CURRENT_WORD') { + const info = this._model.getWordAtPosition({ + lineNumber: this._selection.positionLineNumber, + column: this._selection.positionColumn + }); + return info ? info.word : ''; + + } else if (name === 'TM_LINE_INDEX') { + return String(this._selection.positionLineNumber - 1); + + } else if (name === 'TM_LINE_NUMBER') { + return String(this._selection.positionLineNumber); + + } else if (name === 'TM_FILENAME') { + return basename(this._model.uri.fsPath); + + } else if (name === 'TM_DIRECTORY') { + const dir = dirname(this._model.uri.fsPath); + return dir !== '.' ? dir : ''; + + } else if (name === 'TM_FILEPATH') { + return this._model.uri.fsPath; + + } else { + return undefined; + } + } +} + export class SnippetVariablesResolver implements ISnippetVariableResolver { - private _editor: editorCommon.ICommonCodeEditor; + private readonly _editor: ICommonCodeEditor; - constructor(editor: editorCommon.ICommonCodeEditor) { + constructor(editor: ICommonCodeEditor) { this._editor = editor; } diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts index 14f92a85100..5902f33ec3f 100644 --- a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts @@ -52,15 +52,15 @@ suite('SnippetSession', function () { assertNormalized(new Position(2, 3), 'foo\r\tbar', 'foo\n bar'); }); - test('adjust selection (overwrite[Before|After]', function () { + test('adjust selection (overwrite[Before|After])', function () { - let range = SnippetSession.adjustRange(model, new Range(1, 2, 1, 2), 1, 0); + let range = SnippetSession.adjustSelection(model, new Selection(1, 2, 1, 2), 1, 0); assert.ok(range.equalsRange(new Range(1, 1, 1, 2))); - range = SnippetSession.adjustRange(model, new Range(1, 2, 1, 2), 1111, 0); + range = SnippetSession.adjustSelection(model, new Selection(1, 2, 1, 2), 1111, 0); assert.ok(range.equalsRange(new Range(1, 1, 1, 2))); - range = SnippetSession.adjustRange(model, new Range(1, 2, 1, 2), 0, 10); + range = SnippetSession.adjustSelection(model, new Selection(1, 2, 1, 2), 0, 10); assert.ok(range.equalsRange(new Range(1, 2, 1, 12))); - range = SnippetSession.adjustRange(model, new Range(1, 2, 1, 2), 0, 10111); + range = SnippetSession.adjustSelection(model, new Selection(1, 2, 1, 2), 0, 10111); assert.ok(range.equalsRange(new Range(1, 2, 1, 17))); }); @@ -377,5 +377,13 @@ suite('SnippetSession', function () { assertSelections(editor, new Selection(1, 11, 1, 11)); }); + test('snippets, snippet with variables', function () { + const session = new SnippetSession(editor, '@line=$TM_LINE_NUMBER$0'); + session.insert(); + + assert.equal(model.getValue(), '@line=1function foo() {\n @line=2console.log(a);\n}'); + assertSelections(editor, new Selection(1, 8, 1, 8), new Selection(2, 12, 2, 12)); + }); + }); diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts index ec9a2523890..071119f9104 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts @@ -8,112 +8,97 @@ import * as assert from 'assert'; import { isWindows } from 'vs/base/common/platform'; import URI from 'vs/base/common/uri'; import { Selection } from 'vs/editor/common/core/selection'; -import { SnippetVariablesResolver } from 'vs/editor/contrib/snippet/common/snippetVariables'; +import { EditorSnippetVariableResolver } from 'vs/editor/contrib/snippet/common/snippetVariables'; import { SnippetParser } from 'vs/editor/contrib/snippet/common/snippetParser'; -import { MockCodeEditor, withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; import { Model } from 'vs/editor/common/model/model'; suite('Snippet Variables Resolver', function () { - const model = Model.createFromString('', undefined, undefined, URI.parse('file:///foo/files/text.txt')); + let model: Model; + let resolver: EditorSnippetVariableResolver; - function variablesTest(callback: (editor: MockCodeEditor, resolver: SnippetVariablesResolver) => any) { - - - const lines: string[] = [ + setup(function () { + model = Model.createFromString([ 'this is line one', 'this is line two', ' this is line three' - ]; + ].join('\n'), undefined, undefined, URI.parse('file:///foo/files/text.txt')); - model.setValue(lines.join('\n')); + resolver = new EditorSnippetVariableResolver(model, new Selection(1, 1, 1, 1)); + }); - withMockCodeEditor(lines, { model }, editor => { - callback(editor, new SnippetVariablesResolver(editor)); - }); - } + teardown(function () { + model.dispose(); + }); test('editor variables, basics', function () { - - variablesTest((editor, resolver) => { - assert.equal(resolver.resolve('TM_FILENAME'), 'text.txt'); - assert.equal(resolver.resolve('something'), undefined); - - editor.setModel(null); - assert.throws(() => resolver.resolve('TM_FILENAME')); - }); + assert.equal(resolver.resolve('TM_FILENAME'), 'text.txt'); + assert.equal(resolver.resolve('something'), undefined); }); test('editor variables, file/dir', function () { - variablesTest((editor, resolver) => { - assert.equal(resolver.resolve('TM_FILENAME'), 'text.txt'); - if (!isWindows) { - assert.equal(resolver.resolve('TM_DIRECTORY'), '/foo/files'); - assert.equal(resolver.resolve('TM_FILEPATH'), '/foo/files/text.txt'); - } + assert.equal(resolver.resolve('TM_FILENAME'), 'text.txt'); + if (!isWindows) { + assert.equal(resolver.resolve('TM_DIRECTORY'), '/foo/files'); + assert.equal(resolver.resolve('TM_FILEPATH'), '/foo/files/text.txt'); + } - editor.setModel(Model.createFromString('', undefined, undefined, URI.parse('http://www.pb.o/abc/def/ghi'))); - assert.equal(resolver.resolve('TM_FILENAME'), 'ghi'); - if (!isWindows) { - assert.equal(resolver.resolve('TM_DIRECTORY'), '/abc/def'); - assert.equal(resolver.resolve('TM_FILEPATH'), '/abc/def/ghi'); - } + resolver = new EditorSnippetVariableResolver( + Model.createFromString('', undefined, undefined, URI.parse('http://www.pb.o/abc/def/ghi')), + new Selection(1, 1, 1, 1) + ); + assert.equal(resolver.resolve('TM_FILENAME'), 'ghi'); + if (!isWindows) { + assert.equal(resolver.resolve('TM_DIRECTORY'), '/abc/def'); + assert.equal(resolver.resolve('TM_FILEPATH'), '/abc/def/ghi'); + } + + resolver = new EditorSnippetVariableResolver( + Model.createFromString('', undefined, undefined, URI.parse('mem:fff.ts')), + new Selection(1, 1, 1, 1) + ); + assert.equal(resolver.resolve('TM_DIRECTORY'), ''); + assert.equal(resolver.resolve('TM_FILEPATH'), 'fff.ts'); - editor.setModel(Model.createFromString('', undefined, undefined, URI.parse('mem:fff.ts'))); - assert.equal(resolver.resolve('TM_DIRECTORY'), ''); - assert.equal(resolver.resolve('TM_FILEPATH'), 'fff.ts'); - }); }); test('editor variables, selection', function () { - variablesTest((editor, resolver) => { + resolver = new EditorSnippetVariableResolver(model, new Selection(1, 2, 2, 3)); + assert.equal(resolver.resolve('TM_SELECTED_TEXT'), 'his is line one\nth'); + assert.equal(resolver.resolve('TM_CURRENT_LINE'), 'this is line two'); + assert.equal(resolver.resolve('TM_LINE_INDEX'), '1'); + assert.equal(resolver.resolve('TM_LINE_NUMBER'), '2'); - editor.setSelection(new Selection(1, 2, 2, 3)); - assert.equal(resolver.resolve('TM_SELECTED_TEXT'), 'his is line one\nth'); - assert.equal(resolver.resolve('TM_CURRENT_LINE'), 'this is line two'); - assert.equal(resolver.resolve('TM_LINE_INDEX'), '1'); - assert.equal(resolver.resolve('TM_LINE_NUMBER'), '2'); + resolver = new EditorSnippetVariableResolver(model, new Selection(2, 3, 1, 2)); + assert.equal(resolver.resolve('TM_SELECTED_TEXT'), 'his is line one\nth'); + assert.equal(resolver.resolve('TM_CURRENT_LINE'), 'this is line one'); + assert.equal(resolver.resolve('TM_LINE_INDEX'), '0'); + assert.equal(resolver.resolve('TM_LINE_NUMBER'), '1'); - editor.setSelection(new Selection(2, 3, 1, 2)); - assert.equal(resolver.resolve('TM_SELECTED_TEXT'), 'his is line one\nth'); - assert.equal(resolver.resolve('TM_CURRENT_LINE'), 'this is line one'); - assert.equal(resolver.resolve('TM_LINE_INDEX'), '0'); - assert.equal(resolver.resolve('TM_LINE_NUMBER'), '1'); + resolver = new EditorSnippetVariableResolver(model, new Selection(1, 2, 1, 2)); + assert.equal(resolver.resolve('TM_SELECTED_TEXT'), ''); - editor.setSelection(new Selection(1, 2, 1, 2)); - assert.equal(resolver.resolve('TM_SELECTED_TEXT'), ''); + assert.equal(resolver.resolve('TM_CURRENT_WORD'), 'this'); - assert.equal(resolver.resolve('TM_CURRENT_WORD'), 'this'); + resolver = new EditorSnippetVariableResolver(model, new Selection(3, 1, 3, 1)); + assert.equal(resolver.resolve('TM_CURRENT_WORD'), ''); - editor.setSelection(new Selection(3, 1, 3, 1)); - assert.equal(resolver.resolve('TM_CURRENT_WORD'), ''); - }); }); test('TextmateSnippet, resolve variable', function () { + const snippet = SnippetParser.parse('"$TM_CURRENT_WORD"'); + assert.equal(snippet.text, '""'); + snippet.resolveVariables(resolver); + assert.equal(snippet.text, '"this"'); - const snippet = SnippetParser.parse('"$TM_SELECTED_TEXT"'); - - variablesTest((editor, resolver) => { - assert.equal(snippet.text, '""'); - editor.setSelection(new Selection(1, 1, 1, 5)); - snippet.resolveVariables(resolver); - assert.equal(snippet.text, '"this"'); - }); }); test('TextmateSnippet, resolve variable with default', function () { - - const snippet = SnippetParser.parse('"${TM_SELECTED_TEXT:foo}"'); - - variablesTest((editor, resolver) => { - assert.equal(snippet.text, '"foo"'); - editor.setSelection(new Selection(1, 1, 1, 5)); - snippet.resolveVariables(resolver); - assert.equal(snippet.text, '"this"'); - }); + const snippet = SnippetParser.parse('"${TM_CURRENT_WORD:foo}"'); + assert.equal(snippet.text, '"foo"'); + snippet.resolveVariables(resolver); + assert.equal(snippet.text, '"this"'); }); - }); From e2b69681d1f5c4d110a6a46c1afa42cfc9a339ad Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 10 May 2017 17:49:48 +0200 Subject: [PATCH 0300/1164] Try to disguise inputarea by using a transparent color for it --- src/vs/editor/browser/controller/textAreaHandler.css | 1 + src/vs/editor/common/view/editorColorRegistry.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/browser/controller/textAreaHandler.css b/src/vs/editor/browser/controller/textAreaHandler.css index e80b2bf6b32..69fe6c8497a 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.css +++ b/src/vs/editor/browser/controller/textAreaHandler.css @@ -13,6 +13,7 @@ resize: none; border: none; overflow: hidden; + color: transparent; background-color: transparent; } /*.monaco-editor .inputarea { diff --git a/src/vs/editor/common/view/editorColorRegistry.ts b/src/vs/editor/common/view/editorColorRegistry.ts index 32befce5e40..6be8ca4e54b 100644 --- a/src/vs/editor/common/view/editorColorRegistry.ts +++ b/src/vs/editor/common/view/editorColorRegistry.ts @@ -37,7 +37,7 @@ registerThemingParticipant((theme, collector) => { } let foreground = theme.getColor(editorForeground); if (foreground) { - collector.addRule(`.monaco-editor.${theme.selector}, .monaco-editor.${theme.selector} .inputarea { color: ${foreground}; }`); + collector.addRule(`.monaco-editor.${theme.selector}, .monaco-editor.${theme.selector} .inputarea.ime-input { color: ${foreground}; }`); } let rangeHighlight = theme.getColor(editorRangeHighlight); From eb9ed47e3d642e95b51d9da3ba110c03b1659d48 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 10 May 2017 18:01:55 +0200 Subject: [PATCH 0301/1164] :lipstick: --- .../parts/editor/editorGroupsControl.ts | 4 ++-- src/vs/workbench/common/theme.ts | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts b/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts index 0a9a2dd62d4..ea8e7c92f96 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts @@ -35,7 +35,7 @@ import { IWindowService } from 'vs/platform/windows/common/windows'; import { getCodeEditor } from 'vs/editor/common/services/codeEditorService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { editorBackground, contrastBorder, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; -import { Themable, TABS_CONTAINER_BACKGROUND, EDITOR_GROUP_HEADER_BACKGROUND, EDITOR_GROUP_BORDER_COLOR, EDITOR_DRAG_AND_DROP_BACKGROUND, EDITOR_GROUP_BACKGROUND } from 'vs/workbench/common/theme'; +import { Themable, EDITOR_GROUP_HEADER_TABS_BACKGROUND, EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND, EDITOR_GROUP_BORDER_COLOR, EDITOR_DRAG_AND_DROP_BACKGROUND, EDITOR_GROUP_BACKGROUND } from 'vs/workbench/common/theme'; import { attachProgressBarStyler } from "vs/platform/theme/common/styler"; export enum Rochade { @@ -1020,7 +1020,7 @@ export class EditorGroupsControl extends Themable implements IEditorGroupsContro const container = this.getTitleAreaControl(position).getContainer(); const contrastBorderColor = this.getColor(contrastBorder); - container.style.backgroundColor = this.getColor(this.tabOptions.showTabs ? TABS_CONTAINER_BACKGROUND : EDITOR_GROUP_HEADER_BACKGROUND); + container.style.backgroundColor = this.getColor(this.tabOptions.showTabs ? EDITOR_GROUP_HEADER_TABS_BACKGROUND : EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND); container.style.borderBottomWidth = (contrastBorderColor && this.tabOptions.showTabs) ? '1px' : null; container.style.borderBottomStyle = (contrastBorderColor && this.tabOptions.showTabs) ? 'solid' : null; container.style.borderBottomColor = this.tabOptions.showTabs ? contrastBorderColor : null; diff --git a/src/vs/workbench/common/theme.ts b/src/vs/workbench/common/theme.ts index cf64a63b777..9a4426de311 100644 --- a/src/vs/workbench/common/theme.ts +++ b/src/vs/workbench/common/theme.ts @@ -11,12 +11,6 @@ import { Color } from 'vs/base/common/color'; // < --- Tabs --- > -export const TABS_CONTAINER_BACKGROUND = registerColor('editorGroupHeader.tabsBackground', { - dark: '#252526', - light: '#F3F3F3', - hc: null -}, nls.localize('tabsContainerBackground', "Background color of the tabs container. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); - export const TAB_ACTIVE_BACKGROUND = registerColor('tab.activeBackground', { dark: editorBackground, light: editorBackground, @@ -56,7 +50,13 @@ export const EDITOR_GROUP_BACKGROUND = registerColor('editorGroup.background', { hc: null }, nls.localize('editorGroupBackground', "Background color of an editor group. Editor groups are the containers of editors. The background color shows up when dragging editor groups around.")); -export const EDITOR_GROUP_HEADER_BACKGROUND = registerColor('editorGroupHeader.noTabsBackground', { +export const EDITOR_GROUP_HEADER_TABS_BACKGROUND = registerColor('editorGroupHeader.tabsBackground', { + dark: '#252526', + light: '#F3F3F3', + hc: null +}, nls.localize('tabsContainerBackground', "Background color of the editor group title header when tabs are enabled. Editor groups are the containers of editors.")); + +export const EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND = registerColor('editorGroupHeader.noTabsBackground', { dark: editorBackground, light: editorBackground, hc: editorBackground @@ -72,7 +72,7 @@ export const EDITOR_DRAG_AND_DROP_BACKGROUND = registerColor('editorGroup.dropBa dark: Color.fromHex('#53595D').transparent(0.5), light: Color.fromHex('#3399FF').transparent(0.18), hc: null -}, nls.localize('editorDragAndDropBackground', "Background color when dragging editors around.")); +}, nls.localize('editorDragAndDropBackground', "Background color when dragging editors around. The color should have transparency so that the editor contents can still shine through.")); @@ -174,7 +174,7 @@ export const ACTIVITY_BAR_DRAG_AND_DROP_BACKGROUND = registerColor('activityBar. dark: Color.white.transparent(0.12), light: Color.white.transparent(0.12), hc: Color.white.transparent(0.12), -}, nls.localize('activityBarDragAndDropBackground', "Drag and drop feedback color for the activity bar items. The activity bar is showing on the far left or right and allows to switch between views of the side bar.")); +}, nls.localize('activityBarDragAndDropBackground', "Drag and drop feedback color for the activity bar items. The color should have transparency so that the activity bar entries can still shine through. The activity bar is showing on the far left or right and allows to switch between views of the side bar.")); export const ACTIVITY_BAR_BADGE_BACKGROUND = registerColor('activityBarBadge.background', { dark: badgeBackground, From 51c98a8ea674801ee6dc9d47344da8bdc7bc90db Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 10 May 2017 18:20:03 +0200 Subject: [PATCH 0302/1164] :lipstick: --- .../browser/parts/editor/editorPart.ts | 4 +-- src/vs/workbench/common/editor.ts | 7 ++-- .../common/editor/editorStacksModel.ts | 33 ++++++++++--------- .../files/browser/editors/textFileEditor.ts | 4 +-- .../services/history/browser/history.ts | 4 +-- .../test/browser/editorStacksModel.test.ts | 10 +++--- 6 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorPart.ts b/src/vs/workbench/browser/parts/editor/editorPart.ts index 95bee547924..bcddcea6c57 100644 --- a/src/vs/workbench/browser/parts/editor/editorPart.ts +++ b/src/vs/workbench/browser/parts/editor/editorPart.ts @@ -35,7 +35,7 @@ import { ServiceCollection } from 'vs/platform/instantiation/common/serviceColle import { IMessageService, IMessageWithAction, Severity } from 'vs/platform/message/common/message'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IProgressService } from 'vs/platform/progress/common/progress'; -import { EditorStacksModel, EditorGroup, EditorIdentifier, GroupEvent } from 'vs/workbench/common/editor/editorStacksModel'; +import { EditorStacksModel, EditorGroup, EditorIdentifier, EditorCloseEvent } from 'vs/workbench/common/editor/editorStacksModel'; import Event, { Emitter } from 'vs/base/common/event'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IThemeService } from 'vs/platform/theme/common/themeService'; @@ -234,7 +234,7 @@ export class EditorPart extends Part implements IEditorPart, IEditorGroupService this.telemetryService.publicLog('editorOpened', identifier.editor.getTelemetryDescriptor()); } - private onEditorClosed(event: GroupEvent): void { + private onEditorClosed(event: EditorCloseEvent): void { this.telemetryService.publicLog('editorClosed', event.editor.getTelemetryDescriptor()); } diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index c4013c04cad..8636bc66ef0 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -845,8 +845,8 @@ export interface IEditorStacksModel { onModelChanged: Event; - onWillCloseEditor: Event; - onEditorClosed: Event; + onWillCloseEditor: Event; + onEditorClosed: Event; groups: IEditorGroup[]; activeGroup: IEditorGroup; @@ -895,8 +895,7 @@ export interface IEditorContext extends IEditorIdentifier { event?: any; } -export interface IGroupEvent { - editor: IEditorInput; +export interface IEditorCloseEvent extends IEditorIdentifier { pinned: boolean; index: number; } diff --git a/src/vs/workbench/common/editor/editorStacksModel.ts b/src/vs/workbench/common/editor/editorStacksModel.ts index a81bd7a2fb1..c61412c99f8 100644 --- a/src/vs/workbench/common/editor/editorStacksModel.ts +++ b/src/vs/workbench/common/editor/editorStacksModel.ts @@ -6,7 +6,7 @@ 'use strict'; import Event, { Emitter, once } from 'vs/base/common/event'; -import { IEditorRegistry, Extensions, EditorInput, toResource, IEditorStacksModel, IEditorGroup, IEditorIdentifier, IGroupEvent, GroupIdentifier, IStacksModelChangeEvent, IWorkbenchEditorConfiguration, EditorOpenPositioning, SideBySideEditorInput } from 'vs/workbench/common/editor'; +import { IEditorRegistry, Extensions, EditorInput, toResource, IEditorStacksModel, IEditorGroup, IEditorIdentifier, IEditorCloseEvent, GroupIdentifier, IStacksModelChangeEvent, IWorkbenchEditorConfiguration, EditorOpenPositioning, SideBySideEditorInput } from 'vs/workbench/common/editor'; import URI from 'vs/base/common/uri'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -17,7 +17,7 @@ import { Registry } from 'vs/platform/platform'; import { Position, Direction } from 'vs/platform/editor/common/editor'; import { ResourceMap } from 'vs/base/common/map'; -export interface GroupEvent extends IGroupEvent { +export interface EditorCloseEvent extends IEditorCloseEvent { editor: EditorInput; } @@ -63,7 +63,7 @@ export class EditorGroup implements IEditorGroup { private _onEditorActivated: Emitter; private _onEditorOpened: Emitter; - private _onEditorClosed: Emitter; + private _onEditorClosed: Emitter; private _onEditorDisposed: Emitter; private _onEditorDirty: Emitter; private _onEditorLabelChange: Emitter; @@ -88,7 +88,7 @@ export class EditorGroup implements IEditorGroup { this._onEditorActivated = new Emitter(); this._onEditorOpened = new Emitter(); - this._onEditorClosed = new Emitter(); + this._onEditorClosed = new Emitter(); this._onEditorDisposed = new Emitter(); this._onEditorDirty = new Emitter(); this._onEditorLabelChange = new Emitter(); @@ -143,7 +143,7 @@ export class EditorGroup implements IEditorGroup { return this._onEditorOpened.event; } - public get onEditorClosed(): Event { + public get onEditorClosed(): Event { return this._onEditorClosed.event; } @@ -376,7 +376,7 @@ export class EditorGroup implements IEditorGroup { this.splice(index, true); // Event - this.fireEvent(this._onEditorClosed, { editor, pinned, index }, true); + this.fireEvent(this._onEditorClosed, { editor, pinned, index, group: this }, true); } public closeEditors(except: EditorInput, direction?: Direction): void { @@ -507,7 +507,7 @@ export class EditorGroup implements IEditorGroup { return !this.matches(this.preview, editor); } - private fireEvent(emitter: Emitter, arg2: EditorInput | GroupEvent, isStructuralChange: boolean): void { + private fireEvent(emitter: Emitter, arg2: EditorInput | EditorCloseEvent, isStructuralChange: boolean): void { emitter.fire(arg2); if (isStructuralChange) { @@ -699,12 +699,15 @@ export class EditorStacksModel implements IEditorStacksModel { private _onGroupActivated: Emitter; private _onGroupDeactivated: Emitter; private _onGroupRenamed: Emitter; + private _onEditorDisposed: Emitter; private _onEditorDirty: Emitter; private _onEditorLabelChange: Emitter; private _onEditorOpened: Emitter; - private _onWillCloseEditor: Emitter; - private _onEditorClosed: Emitter; + + private _onWillCloseEditor: Emitter; + private _onEditorClosed: Emitter; + private _onModelChanged: Emitter; constructor( @@ -729,8 +732,8 @@ export class EditorStacksModel implements IEditorStacksModel { this._onEditorDirty = new Emitter(); this._onEditorLabelChange = new Emitter(); this._onEditorOpened = new Emitter(); - this._onWillCloseEditor = new Emitter(); - this._onEditorClosed = new Emitter(); + this._onWillCloseEditor = new Emitter(); + this._onEditorClosed = new Emitter(); this.toDispose.push(this._onGroupOpened, this._onGroupClosed, this._onGroupActivated, this._onGroupDeactivated, this._onGroupMoved, this._onGroupRenamed, this._onModelChanged, this._onEditorDisposed, this._onEditorDirty, this._onEditorLabelChange, this._onEditorClosed, this._onWillCloseEditor); @@ -785,11 +788,11 @@ export class EditorStacksModel implements IEditorStacksModel { return this._onEditorOpened.event; } - public get onWillCloseEditor(): Event { + public get onWillCloseEditor(): Event { return this._onWillCloseEditor.event; } - public get onEditorClosed(): Event { + public get onEditorClosed(): Event { return this._onEditorClosed.event; } @@ -1161,7 +1164,7 @@ export class EditorStacksModel implements IEditorStacksModel { unbind.push(group.onEditorStateChanged(editor => this._onModelChanged.fire({ group, editor }))); unbind.push(group.onEditorOpened(editor => this._onEditorOpened.fire({ editor, group }))); unbind.push(group.onEditorClosed(event => { - this._onWillCloseEditor.fire({ editor: event.editor, group }); + this._onWillCloseEditor.fire(event); this.handleOnEditorClosed(event); this._onEditorClosed.fire(event); })); @@ -1177,7 +1180,7 @@ export class EditorStacksModel implements IEditorStacksModel { return group; } - private handleOnEditorClosed(event: GroupEvent): void { + private handleOnEditorClosed(event: EditorCloseEvent): void { const editor = event.editor; const editorsToClose = [editor]; diff --git a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts b/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts index c624ee237af..1dc4be93f83 100644 --- a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts +++ b/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts @@ -14,7 +14,7 @@ import { Action } from 'vs/base/common/actions'; import { VIEWLET_ID, TEXT_FILE_EDITOR_ID } from 'vs/workbench/parts/files/common/files'; import { ITextFileEditorModel, ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { BaseTextEditor } from 'vs/workbench/browser/parts/editor/textEditor'; -import { EditorOptions, TextEditorOptions, IEditorIdentifier } from 'vs/workbench/common/editor'; +import { EditorOptions, TextEditorOptions, IEditorCloseEvent } from 'vs/workbench/common/editor'; import { BinaryEditorModel } from 'vs/workbench/common/editor/binaryEditorModel'; import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; import { ExplorerViewlet } from 'vs/workbench/parts/files/browser/explorerViewlet'; @@ -70,7 +70,7 @@ export class TextFileEditor extends BaseTextEditor { } } - private onWillCloseEditor(e: IEditorIdentifier): void { + private onWillCloseEditor(e: IEditorCloseEvent): void { if (e.editor === this.input && this.position === this.editorGroupService.getStacksModel().positionOfGroup(e.group)) { this.doSaveTextEditorViewState(this.input); } diff --git a/src/vs/workbench/services/history/browser/history.ts b/src/vs/workbench/services/history/browser/history.ts index e745057fb92..c70df9fbe33 100644 --- a/src/vs/workbench/services/history/browser/history.ts +++ b/src/vs/workbench/services/history/browser/history.ts @@ -11,7 +11,7 @@ import objects = require('vs/base/common/objects'); import URI from 'vs/base/common/uri'; import { IEditor } from 'vs/editor/common/editorCommon'; import { IEditor as IBaseEditor, IEditorInput, ITextEditorOptions, IResourceInput } from 'vs/platform/editor/common/editor'; -import { EditorInput, IGroupEvent, IEditorRegistry, Extensions, toResource, IEditorGroup } from 'vs/workbench/common/editor'; +import { EditorInput, IEditorCloseEvent, IEditorRegistry, Extensions, toResource, IEditorGroup } from 'vs/workbench/common/editor'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { FileChangesEvent, IFileService, FileChangeType } from 'vs/platform/files/common/files'; @@ -214,7 +214,7 @@ export class HistoryService extends BaseHistoryService implements IHistoryServic } } - private onEditorClosed(event: IGroupEvent): void { + private onEditorClosed(event: IEditorCloseEvent): void { // Track closing of pinned editor to support to reopen closed editors if (event.pinned) { diff --git a/src/vs/workbench/test/browser/editorStacksModel.test.ts b/src/vs/workbench/test/browser/editorStacksModel.test.ts index 0593fc06d54..8d96c2e5c80 100644 --- a/src/vs/workbench/test/browser/editorStacksModel.test.ts +++ b/src/vs/workbench/test/browser/editorStacksModel.test.ts @@ -6,8 +6,8 @@ 'use strict'; import * as assert from 'assert'; -import { EditorStacksModel, EditorGroup, GroupEvent } from 'vs/workbench/common/editor/editorStacksModel'; -import { EditorInput, IFileEditorInput, IEditorIdentifier, IEditorGroup, IStacksModelChangeEvent, IEditorRegistry, Extensions as EditorExtensions, IEditorInputFactory, IGroupEvent } from 'vs/workbench/common/editor'; +import { EditorStacksModel, EditorGroup, EditorCloseEvent } from 'vs/workbench/common/editor/editorStacksModel'; +import { EditorInput, IFileEditorInput, IEditorIdentifier, IEditorGroup, IStacksModelChangeEvent, IEditorRegistry, Extensions as EditorExtensions, IEditorInputFactory, IEditorCloseEvent } from 'vs/workbench/common/editor'; import URI from 'vs/base/common/uri'; import { TestStorageService, TestLifecycleService, TestContextService } from 'vs/workbench/test/workbenchTestServices'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; @@ -47,14 +47,14 @@ interface ModelEvents { renamed: IEditorGroup[]; disposed: IEditorIdentifier[]; changed: IStacksModelChangeEvent[]; - editorClosed: IGroupEvent[]; - editorWillClose: IEditorIdentifier[]; + editorClosed: IEditorCloseEvent[]; + editorWillClose: IEditorCloseEvent[]; } interface GroupEvents { opened: EditorInput[]; activated: EditorInput[]; - closed: GroupEvent[]; + closed: EditorCloseEvent[]; pinned: EditorInput[]; unpinned: EditorInput[]; moved: EditorInput[]; From 3a89761e8c69a28ba050c578e3165074aa549370 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 10 May 2017 19:38:14 +0200 Subject: [PATCH 0303/1164] Fixes #24714: Regular expression with ^ in search & replace --- .../editor/contrib/find/common/findModel.ts | 10 +++---- .../find/test/common/findController.test.ts | 27 +++++++++++++++++++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/contrib/find/common/findModel.ts b/src/vs/editor/contrib/find/common/findModel.ts index ceac616aafa..526a2ea3cec 100644 --- a/src/vs/editor/contrib/find/common/findModel.ts +++ b/src/vs/editor/contrib/find/common/findModel.ts @@ -277,13 +277,13 @@ export class FindModelBoundToEditorModel { } private _moveToNextMatch(after: Position): void { - let nextMatch = this._getNextMatch(after, false); + let nextMatch = this._getNextMatch(after, false, true); if (nextMatch) { this._setCurrentFindMatch(nextMatch.range); } } - private _getNextMatch(after: Position, captureMatches: boolean, isRecursed: boolean = false): editorCommon.FindMatch { + private _getNextMatch(after: Position, captureMatches: boolean, forceMove: boolean, isRecursed: boolean = false): editorCommon.FindMatch { if (this._cannotFind()) { return null; } @@ -308,7 +308,7 @@ export class FindModelBoundToEditorModel { let nextMatch = model.findNextMatch(this._state.searchString, position, this._state.isRegex, this._state.matchCase, this._state.wholeWord, captureMatches); - if (nextMatch && nextMatch.range.isEmpty() && nextMatch.range.getStartPosition().equals(position)) { + if (forceMove && nextMatch && nextMatch.range.isEmpty() && nextMatch.range.getStartPosition().equals(position)) { // Looks like we're stuck at this position, unacceptable! let isUsingLineStops = this._state.isRegex && ( @@ -337,7 +337,7 @@ export class FindModelBoundToEditorModel { } if (!isRecursed && !searchRange.containsRange(nextMatch.range)) { - return this._getNextMatch(nextMatch.range.getEndPosition(), captureMatches, true); + return this._getNextMatch(nextMatch.range.getEndPosition(), captureMatches, forceMove, true); } return nextMatch; @@ -361,7 +361,7 @@ export class FindModelBoundToEditorModel { let replacePattern = this._getReplacePattern(); let selection = this._editor.getSelection(); - let nextMatch = this._getNextMatch(selection.getStartPosition(), replacePattern.hasReplacementPatterns); + let nextMatch = this._getNextMatch(selection.getStartPosition(), replacePattern.hasReplacementPatterns, false); if (nextMatch) { if (selection.equalsRange(nextMatch.range)) { // selection sits on a find match => replace it! diff --git a/src/vs/editor/contrib/find/test/common/findController.test.ts b/src/vs/editor/contrib/find/test/common/findController.test.ts index 13d26d2dde1..93825e61b96 100644 --- a/src/vs/editor/contrib/find/test/common/findController.test.ts +++ b/src/vs/editor/contrib/find/test/common/findController.test.ts @@ -444,6 +444,33 @@ suite('FindController', () => { }); }); + test('issue #24714: Regular expression with ^ in search & replace', () => { + withMockCodeEditor([ + '', + 'line2', + 'line3' + ], { serviceCollection: serviceCollection }, (editor, cursor) => { + + let findController = editor.registerAndInstantiateContribution(TestFindController); + + let startFindAction = new StartFindAction(); + startFindAction.run(null, editor); + + findController.getState().change({ searchString: '^', replaceString: 'x', isRegex: true }, false); + findController.moveToNextMatch(); + + assert.deepEqual(editor.getSelections().map(fromRange), [ + [2, 1, 2, 1] + ]); + + findController.replace(); + + assert.deepEqual(editor.getValue(), '\nxline2\nline3'); + + findController.dispose(); + }); + }); + function toArray(historyNavigator: HistoryNavigator): string[] { let result = []; historyNavigator.first(); From 79e83a096cfd397b12e22caf461e18a25767006e Mon Sep 17 00:00:00 2001 From: rebornix Date: Wed, 10 May 2017 11:03:55 -0700 Subject: [PATCH 0304/1164] correct afterEnterText of selection --- src/vs/editor/common/modes/languageConfigurationRegistry.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/common/modes/languageConfigurationRegistry.ts b/src/vs/editor/common/modes/languageConfigurationRegistry.ts index c4c5ee6a9e1..dcac2128476 100644 --- a/src/vs/editor/common/modes/languageConfigurationRegistry.ts +++ b/src/vs/editor/common/modes/languageConfigurationRegistry.ts @@ -289,7 +289,7 @@ export class LanguageConfigurationRegistryImpl { afterEnterText = scopedLineText.substr(range.startColumn - 1 - scopedLineTokens.firstCharOffset); } else { let endScopedLineTokens = this.getScopedLineTokens(model, range.endLineNumber); - afterEnterText = endScopedLineTokens.getLineContent().substr(range.endColumn - 1 - endScopedLineTokens.firstCharOffset); + afterEnterText = endScopedLineTokens.getLineContent().substr(range.endColumn - 1); } let lineNumber = range.startLineNumber; From 186a9a5e17aea730dfcb9a2fa93d98ed834fa51b Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 10 May 2017 21:35:41 +0200 Subject: [PATCH 0305/1164] Fixes #6478: Cancel drag-select or drag-and-drop if a non modifier key is pressed --- .../editor/browser/controller/mouseHandler.ts | 26 ++++++++----------- src/vs/editor/browser/editorDom.ts | 20 +++++++++++++- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/vs/editor/browser/controller/mouseHandler.ts b/src/vs/editor/browser/controller/mouseHandler.ts index 674dbf1c090..c88d807bc53 100644 --- a/src/vs/editor/browser/controller/mouseHandler.ts +++ b/src/vs/editor/browser/controller/mouseHandler.ts @@ -265,20 +265,18 @@ export class MouseHandler extends ViewEventHandler { class MouseDownOperation extends Disposable { - private _context: ViewContext; - private _viewController: ViewController; - private _viewHelper: IPointerHandlerHelper; - private _createMouseTarget: (e: EditorMouseEvent, testEventTarget: boolean) => editorBrowser.IMouseTarget; - private _getMouseColumn: (e: EditorMouseEvent) => number; + private readonly _context: ViewContext; + private readonly _viewController: ViewController; + private readonly _viewHelper: IPointerHandlerHelper; + private readonly _createMouseTarget: (e: EditorMouseEvent, testEventTarget: boolean) => editorBrowser.IMouseTarget; + private readonly _getMouseColumn: (e: EditorMouseEvent) => number; - private _mouseMoveMonitor: GlobalEditorMouseMoveMonitor; + private readonly _mouseMoveMonitor: GlobalEditorMouseMoveMonitor; + private readonly _onScrollTimeout: TimeoutTimer; + private readonly _mouseState: MouseDownState; private _currentSelection: Selection; - private _mouseState: MouseDownState; - - private _onScrollTimeout: TimeoutTimer; private _isActive: boolean; - private _lastMouseEvent: EditorMouseEvent; constructor( @@ -295,15 +293,13 @@ class MouseDownOperation extends Disposable { this._createMouseTarget = createMouseTarget; this._getMouseColumn = getMouseColumn; - this._currentSelection = new Selection(1, 1, 1, 1); + this._mouseMoveMonitor = this._register(new GlobalEditorMouseMoveMonitor(this._viewHelper.viewDomNode)); + this._onScrollTimeout = this._register(new TimeoutTimer()); this._mouseState = new MouseDownState(); - this._onScrollTimeout = this._register(new TimeoutTimer()); + this._currentSelection = new Selection(1, 1, 1, 1); this._isActive = false; - this._lastMouseEvent = null; - - this._mouseMoveMonitor = this._register(new GlobalEditorMouseMoveMonitor(this._viewHelper.viewDomNode)); } public dispose(): void { diff --git a/src/vs/editor/browser/editorDom.ts b/src/vs/editor/browser/editorDom.ts index 78427527605..504c830dda1 100644 --- a/src/vs/editor/browser/editorDom.ts +++ b/src/vs/editor/browser/editorDom.ts @@ -146,17 +146,35 @@ export class GlobalEditorMouseMoveMonitor extends Disposable { private _editorViewDomNode: HTMLElement; private _globalMouseMoveMonitor: GlobalMouseMoveMonitor; + private _keydownListener: IDisposable; constructor(editorViewDomNode: HTMLElement) { super(); this._editorViewDomNode = editorViewDomNode; this._globalMouseMoveMonitor = this._register(new GlobalMouseMoveMonitor()); + this._keydownListener = null; } public startMonitoring(merger: EditorMouseEventMerger, mouseMoveCallback: (e: EditorMouseEvent) => void, onStopCallback: () => void): void { + + // Add a <> keydown event listener that will cancel the monitoring + // if something other than a modifier key is pressed + this._keydownListener = dom.addStandardDisposableListener(document, 'keydown', (e) => { + const kb = e.toKeybinding(); + if (kb.isModifierKey()) { + // Allow modifier keys + return; + } + this._globalMouseMoveMonitor.stopMonitoring(true); + }, true); + let myMerger: dom.IEventMerger = (lastEvent: EditorMouseEvent, currentEvent: MouseEvent): EditorMouseEvent => { return merger(lastEvent, new EditorMouseEvent(currentEvent, this._editorViewDomNode)); }; - this._globalMouseMoveMonitor.startMonitoring(myMerger, mouseMoveCallback, onStopCallback); + + this._globalMouseMoveMonitor.startMonitoring(myMerger, mouseMoveCallback, () => { + this._keydownListener.dispose(); + onStopCallback(); + }); } } From f182e9c2fbe131723d8287335d005be7108282bf Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 10 May 2017 12:51:17 -0700 Subject: [PATCH 0306/1164] Ensure correct language mode is used for onEnter (#26358) Fixes #26351 **bug** For the code ```js const x = |; ``` with the cursor at the `|`, on enter rules should change the code to: ```js const x = | ; ``` However we currently do not handle this case. The cause is the extra semicolon at the end of the line. This causes `getEnterAction` to think we are in a javascript context for the onenter rules instead of in a js-tags context **fix** Pass in the column of the cursor when getting the language id to use for the on enter rules instead of using the end of the line. This ensures we are in the `jsx-tags` language in the above case --- .../editor/common/modes/languageConfigurationRegistry.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/common/modes/languageConfigurationRegistry.ts b/src/vs/editor/common/modes/languageConfigurationRegistry.ts index dcac2128476..ae25a6533d4 100644 --- a/src/vs/editor/common/modes/languageConfigurationRegistry.ts +++ b/src/vs/editor/common/modes/languageConfigurationRegistry.ts @@ -270,7 +270,7 @@ export class LanguageConfigurationRegistryImpl { let indentation = this.getIndentationAtPosition(model, range.startLineNumber, range.startColumn); let ignoreCurrentLine = false; - let scopedLineTokens = this.getScopedLineTokens(model, range.startLineNumber); + let scopedLineTokens = this.getScopedLineTokens(model, range.startLineNumber, range.startColumn); let onEnterSupport = this._getOnEnterSupport(scopedLineTokens.languageId); if (!onEnterSupport) { return { @@ -398,11 +398,11 @@ export class LanguageConfigurationRegistryImpl { return lineText; } - private getScopedLineTokens(model: ITokenizedModel, lineNumber: number) { + private getScopedLineTokens(model: ITokenizedModel, lineNumber: number, columnNumber?: number) { model.forceTokenization(lineNumber); let lineTokens = model.getLineTokens(lineNumber); - let column = model.getLineMaxColumn(lineNumber); - let scopedLineTokens = createScopedLineTokens(lineTokens, column - 1); + let column = isNaN(columnNumber) ? model.getLineMaxColumn(lineNumber) - 1 : columnNumber; + let scopedLineTokens = createScopedLineTokens(lineTokens, column); return scopedLineTokens; } From 55961326477e89d0b0efa6bc876eefd046465ff9 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 10 May 2017 22:16:19 +0200 Subject: [PATCH 0307/1164] [theme] update overview ruler cursor and decorations colors on theme change --- .../overviewRuler/decorationsOverviewRuler.ts | 45 ++++++++----------- .../overviewRuler/overviewRulerImpl.ts | 5 ++- src/vs/editor/common/editorCommon.ts | 9 ---- .../editor/common/view/overviewZoneManager.ts | 9 ++-- .../common/view/overviewZoneManager.test.ts | 9 ++-- src/vs/platform/theme/common/themes.ts | 17 ------- 6 files changed, 32 insertions(+), 62 deletions(-) delete mode 100644 src/vs/platform/theme/common/themes.ts diff --git a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts index b55e1c8b651..c64a856ba72 100644 --- a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts +++ b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import * as themes from 'vs/platform/theme/common/themes'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { ViewPart } from 'vs/editor/browser/view/viewPart'; import { OverviewRulerImpl } from 'vs/editor/browser/viewParts/overviewRuler/overviewRulerImpl'; @@ -15,32 +14,20 @@ import { TokenizationRegistry } from 'vs/editor/common/modes'; import { IDisposable } from 'vs/base/common/lifecycle'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { OverviewRulerZone } from 'vs/editor/common/view/overviewZoneManager'; -import { editorOverviewRulerBorder } from 'vs/editor/common/view/editorColorRegistry'; - -function getThemeType(themeId: string): editorCommon.ThemeType { - if (themes.isHighContrastTheme(themeId)) { - return editorCommon.ThemeType.HighContrast; - } - if (themes.isLightTheme(themeId)) { - return editorCommon.ThemeType.Light; - } - return editorCommon.ThemeType.Dark; -} +import { editorOverviewRulerBorder, editorCursor } from 'vs/editor/common/view/editorColorRegistry'; export class DecorationsOverviewRuler extends ViewPart { static MIN_DECORATION_HEIGHT = 6; static MAX_DECORATION_HEIGHT = 60; - private static _CURSOR_COLOR = 'rgba(0, 0, 102, 0.8)'; - private static _CURSOR_COLOR_DARK = 'rgba(152, 152, 152, 0.8)'; - private readonly _tokensColorTrackerListener: IDisposable; private _overviewRuler: OverviewRulerImpl; private _renderBorder: boolean; private _borderColor: string; + private _cursorColor: string; private _shouldUpdateDecorations: boolean; private _shouldUpdateCursorPosition: boolean; @@ -65,15 +52,11 @@ export class DecorationsOverviewRuler extends ViewPart { (lineNumber: number) => this._context.viewLayout.getVerticalOffsetForLineNumber(lineNumber) ); this._overviewRuler.setLanesCount(this._context.configuration.editor.viewInfo.overviewRulerLanes, false); - let theme = this._context.configuration.editor.viewInfo.theme; - this._overviewRuler.setThemeType(getThemeType(theme), false); this._overviewRuler.setLayout(this._context.configuration.editor.layoutInfo.overviewRuler, false); this._renderBorder = this._context.configuration.editor.viewInfo.overviewRulerBorder; - let borderColor = this._context.theme.getColor(editorOverviewRulerBorder); - this._borderColor = borderColor ? borderColor.toString() : null; - + this._updateColors(); this._updateBackground(false); this._tokensColorTrackerListener = TokenizationRegistry.onDidChange((e) => { @@ -129,7 +112,6 @@ export class DecorationsOverviewRuler extends ViewPart { this._renderBorder = this._context.configuration.editor.viewInfo.overviewRulerBorder; this._hideCursor = this._context.configuration.editor.viewInfo.hideCursorInOverviewRuler; this._shouldUpdateCursorPosition = true; - this._overviewRuler.setThemeType(getThemeType(this._context.configuration.editor.viewInfo.theme), false); this._updateBackground(false); } @@ -168,8 +150,9 @@ export class DecorationsOverviewRuler extends ViewPart { } public onThemeChanged(e: viewEvents.ViewThemeChangedEvent): boolean { - let borderColor = this._context.theme.getColor(editorOverviewRulerBorder); - this._borderColor = borderColor ? borderColor.toString() : null; + this._updateColors(); + this._shouldUpdateDecorations = true; + this._shouldUpdateCursorPosition = true; return true; } @@ -179,6 +162,16 @@ export class DecorationsOverviewRuler extends ViewPart { return this._overviewRuler.getDomNode(); } + private _updateColors() { + let borderColor = this._context.theme.getColor(editorOverviewRulerBorder); + this._borderColor = borderColor ? borderColor.toString() : null; + + let cursorColor = this._context.theme.getColor(editorCursor); + this._cursorColor = cursorColor ? cursorColor.transparent(0.7).toString() : null; + + this._overviewRuler.setThemeType(this._context.theme.type, false); + } + private _createZonesFromDecorations(): OverviewRulerZone[] { let decorations = this._context.model.getAllOverviewRulerDecorations(); let zones: OverviewRulerZone[] = []; @@ -211,9 +204,9 @@ export class DecorationsOverviewRuler extends ViewPart { cursor.lineNumber, editorCommon.OverviewRulerLane.Full, 2, - DecorationsOverviewRuler._CURSOR_COLOR, - DecorationsOverviewRuler._CURSOR_COLOR_DARK, - DecorationsOverviewRuler._CURSOR_COLOR_DARK + this._cursorColor, + this._cursorColor, + this._cursorColor )); } diff --git a/src/vs/editor/browser/viewParts/overviewRuler/overviewRulerImpl.ts b/src/vs/editor/browser/viewParts/overviewRuler/overviewRulerImpl.ts index e1472ac7772..617a850a1d7 100644 --- a/src/vs/editor/browser/viewParts/overviewRuler/overviewRulerImpl.ts +++ b/src/vs/editor/browser/viewParts/overviewRuler/overviewRulerImpl.ts @@ -5,10 +5,11 @@ 'use strict'; import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; -import { OverviewRulerLane, ThemeType } from 'vs/editor/common/editorCommon'; +import { OverviewRulerLane } from 'vs/editor/common/editorCommon'; import { OverviewZoneManager, ColorZone, OverviewRulerZone } from 'vs/editor/common/view/overviewZoneManager'; import { Color } from 'vs/base/common/color'; import { OverviewRulerPosition } from 'vs/editor/common/config/editorOptions'; +import { ThemeType, LIGHT } from 'vs/platform/theme/common/themeService'; export class OverviewRulerImpl { @@ -39,7 +40,7 @@ export class OverviewRulerImpl { this._zoneManager = new OverviewZoneManager(getVerticalOffsetForLine); this._zoneManager.setMinimumHeight(minimumHeight); this._zoneManager.setMaximumHeight(maximumHeight); - this._zoneManager.setThemeType(ThemeType.Light); + this._zoneManager.setThemeType(LIGHT); this._zoneManager.setDOMWidth(0); this._zoneManager.setDOMHeight(0); this._zoneManager.setOuterHeight(scrollHeight); diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index 9581fa63cfb..2852bb8dbea 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -2067,12 +2067,3 @@ export var Handler = { LineInsertAfter: 'lineInsertAfter', LineBreakInsert: 'lineBreakInsert', }; - -/** - * @internal - */ -export const enum ThemeType { - Light = 1, - Dark = 2, - HighContrast = 3 -} diff --git a/src/vs/editor/common/view/overviewZoneManager.ts b/src/vs/editor/common/view/overviewZoneManager.ts index 1db950495cc..a9d9ec99a1e 100644 --- a/src/vs/editor/common/view/overviewZoneManager.ts +++ b/src/vs/editor/common/view/overviewZoneManager.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { OverviewRulerLane, ThemeType } from 'vs/editor/common/editorCommon'; +import { OverviewRulerLane } from 'vs/editor/common/editorCommon'; +import { ThemeType, DARK, HIGH_CONTRAST, LIGHT } from 'vs/platform/theme/common/themeService'; export class ColorZone { _colorZoneBrand: void; @@ -57,9 +58,9 @@ export class OverviewRulerZone { public getColor(themeType: ThemeType): string { switch (themeType) { - case ThemeType.HighContrast: + case HIGH_CONTRAST: return this._hcColor; - case ThemeType.Dark: + case DARK: return this._darkColor; } return this._color; @@ -139,7 +140,7 @@ export class OverviewZoneManager { this._outerHeight = 0; this._maximumHeight = 0; this._minimumHeight = 0; - this._themeType = ThemeType.Light; + this._themeType = LIGHT; this._pixelRatio = 1; this._lastAssignedId = 0; diff --git a/src/vs/editor/test/common/view/overviewZoneManager.test.ts b/src/vs/editor/test/common/view/overviewZoneManager.test.ts index 2ebe4035af1..1cfc1a4a2b1 100644 --- a/src/vs/editor/test/common/view/overviewZoneManager.test.ts +++ b/src/vs/editor/test/common/view/overviewZoneManager.test.ts @@ -5,8 +5,9 @@ 'use strict'; import * as assert from 'assert'; -import { OverviewRulerLane, ThemeType } from 'vs/editor/common/editorCommon'; +import { OverviewRulerLane } from 'vs/editor/common/editorCommon'; import { OverviewZoneManager, ColorZone, OverviewRulerZone } from 'vs/editor/common/view/overviewZoneManager'; +import { LIGHT } from 'vs/platform/theme/common/themeService'; suite('Editor View - OverviewZoneManager', () => { @@ -16,7 +17,7 @@ suite('Editor View - OverviewZoneManager', () => { let manager = new OverviewZoneManager((lineNumber) => LINE_HEIGHT * lineNumber); manager.setMinimumHeight(6); manager.setMaximumHeight(6); - manager.setThemeType(ThemeType.Light); + manager.setThemeType(LIGHT); manager.setDOMWidth(30); manager.setDOMHeight(600); manager.setOuterHeight(LINE_COUNT * LINE_HEIGHT); @@ -46,7 +47,7 @@ suite('Editor View - OverviewZoneManager', () => { let manager = new OverviewZoneManager((lineNumber) => LINE_HEIGHT * lineNumber); manager.setMinimumHeight(6); manager.setMaximumHeight(6); - manager.setThemeType(ThemeType.Light); + manager.setThemeType(LIGHT); manager.setDOMWidth(30); manager.setDOMHeight(300); manager.setOuterHeight(LINE_COUNT * LINE_HEIGHT); @@ -75,7 +76,7 @@ suite('Editor View - OverviewZoneManager', () => { let manager = new OverviewZoneManager((lineNumber) => LINE_HEIGHT * lineNumber); manager.setMinimumHeight(6); manager.setMaximumHeight(6); - manager.setThemeType(ThemeType.Light); + manager.setThemeType(LIGHT); manager.setDOMWidth(30); manager.setDOMHeight(300); manager.setOuterHeight(LINE_COUNT * LINE_HEIGHT); diff --git a/src/vs/platform/theme/common/themes.ts b/src/vs/platform/theme/common/themes.ts deleted file mode 100644 index 072779016a3..00000000000 --- a/src/vs/platform/theme/common/themes.ts +++ /dev/null @@ -1,17 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -export function isLightTheme(themeId: string) { - return /vs($| )/.test(themeId); -} - -export function isDarkTheme(themeId: string) { - return /vs-dark($| )/.test(themeId); -} - -export function isHighContrastTheme(themeId: string) { - return /hc-black($| )/.test(themeId); -} \ No newline at end of file From 0b7f4425ef0fee913f9bfeafd29fee43a446075c Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Wed, 10 May 2017 13:37:52 -0700 Subject: [PATCH 0308/1164] Correct LC_ALL. Resolves #26227 --- extensions/git/src/git.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 4adc617a3eb..751fbccc15e 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -386,7 +386,7 @@ export class Git { options.env = assign({}, process.env, this.env, options.env || {}, { VSCODE_GIT_COMMAND: args[0], - LC_ALL: 'en_US', + LC_ALL: 'en_US.UTF-8', LANG: 'en_US.UTF-8' }); @@ -954,4 +954,4 @@ export class Repository { return { hash: match[1], message: match[2] }; } -} \ No newline at end of file +} From 1ab29cdbcf45ddda95b9b2bbeeaaa39b6a447d94 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 10 May 2017 22:49:40 +0200 Subject: [PATCH 0309/1164] Fixes #24047: Use the first select line as the source for the comment line token --- .../comment/common/lineCommentCommand.ts | 35 +++--- .../test/common/lineCommentCommand.test.ts | 110 ++++++++++++++++++ 2 files changed, 123 insertions(+), 22 deletions(-) diff --git a/src/vs/editor/contrib/comment/common/lineCommentCommand.ts b/src/vs/editor/contrib/comment/common/lineCommentCommand.ts index 9cf5de8659a..3311aa6ffae 100644 --- a/src/vs/editor/contrib/comment/common/lineCommentCommand.ts +++ b/src/vs/editor/contrib/comment/common/lineCommentCommand.ts @@ -63,34 +63,25 @@ export class LineCommentCommand implements editorCommon.ICommand { * Returns null if any of the lines doesn't support a line comment string. */ public static _gatherPreflightCommentStrings(model: editorCommon.ITokenizedModel, startLineNumber: number, endLineNumber: number): ILinePreflightData[] { - let commentStrForLanguage: string[] = []; + + model.forceTokenization(startLineNumber); + const languageId = model.getLanguageIdAtPosition(startLineNumber, 1); + + const config = LanguageConfigurationRegistry.getComments(languageId); + const commentStr = (config ? config.lineCommentToken : null); + if (!commentStr) { + // Mode does not support line comments + return null; + } + let lines: ILinePreflightData[] = []; for (let i = 0, lineCount = endLineNumber - startLineNumber + 1; i < lineCount; i++) { - let lineNumber = startLineNumber + i; - model.forceTokenization(lineNumber); - let languageId = model.getLanguageIdAtPosition(lineNumber, 1); - - // Find the commentStr for this line, if none is found then bail out: we cannot do line comments - let commentStr: string; - if (commentStrForLanguage[languageId]) { - commentStr = commentStrForLanguage[languageId]; - } else { - let config = LanguageConfigurationRegistry.getComments(languageId); - commentStr = (config ? config.lineCommentToken : null); - if (!commentStr) { - // Mode does not support line comments - return null; - } - - commentStrForLanguage[languageId] = commentStr; - } - - lines.push({ + lines[i] = { ignore: false, commentStr: commentStr, commentStrOffset: 0, commentStrLength: commentStr.length - }); + }; } return lines; diff --git a/src/vs/editor/contrib/comment/test/common/lineCommentCommand.test.ts b/src/vs/editor/contrib/comment/test/common/lineCommentCommand.test.ts index 802efd52419..1326d8bda33 100644 --- a/src/vs/editor/contrib/comment/test/common/lineCommentCommand.test.ts +++ b/src/vs/editor/contrib/comment/test/common/lineCommentCommand.test.ts @@ -9,6 +9,12 @@ import { Selection } from 'vs/editor/common/core/selection'; import { ILinePreflightData, IPreflightData, ISimpleModel, LineCommentCommand, Type } from 'vs/editor/contrib/comment/common/lineCommentCommand'; import { testCommand } from 'vs/editor/test/common/commands/commandTestUtils'; import { CommentMode } from 'vs/editor/test/common/commentMode'; +import * as modes from 'vs/editor/common/modes'; +import { NULL_STATE } from 'vs/editor/common/modes/nullMode'; +import { TokenizationResult2 } from 'vs/editor/common/core/token'; +import { MockMode } from "vs/editor/test/common/mocks/mockMode"; +import { CommentRule } from "vs/editor/common/modes/languageConfiguration"; +import { LanguageConfigurationRegistry } from "vs/editor/common/modes/languageConfigurationRegistry"; suite('Editor Contrib - Line Comment Command', () => { @@ -827,4 +833,108 @@ suite('Editor Contrib - Line Comment As Block Comment 2', () => { }); }); +suite('Editor Contrib - Line Comment in mixed modes', () => { + const OUTER_LANGUAGE_ID = new modes.LanguageIdentifier('outerMode', 3); + const INNER_LANGUAGE_ID = new modes.LanguageIdentifier('innerMode', 4); + + class OuterMode extends MockMode { + constructor(commentsConfig: CommentRule) { + super(OUTER_LANGUAGE_ID); + this._register(LanguageConfigurationRegistry.register(this.getLanguageIdentifier(), { + comments: commentsConfig + })); + + this._register(modes.TokenizationRegistry.register(this.getLanguageIdentifier().language, { + getInitialState: (): modes.IState => NULL_STATE, + tokenize: undefined, + tokenize2: (line: string, state: modes.IState): TokenizationResult2 => { + let languageId = (/^ /.test(line) ? INNER_LANGUAGE_ID : OUTER_LANGUAGE_ID); + + let tokens = new Uint32Array(1 << 1); + tokens[(0 << 1)] = 0; + tokens[(0 << 1) + 1] = ( + (modes.ColorId.DefaultForeground << modes.MetadataConsts.FOREGROUND_OFFSET) + | (languageId.id << modes.MetadataConsts.LANGUAGEID_OFFSET) + ); + return new TokenizationResult2(tokens, state); + } + })); + } + } + + class InnerMode extends MockMode { + constructor(commentsConfig: CommentRule) { + super(INNER_LANGUAGE_ID); + this._register(LanguageConfigurationRegistry.register(this.getLanguageIdentifier(), { + comments: commentsConfig + })); + } + } + + function testLineCommentCommand(lines: string[], selection: Selection, expectedLines: string[], expectedSelection: Selection): void { + let outerMode = new OuterMode({ lineComment: '//', blockComment: ['/*', '*/'] }); + let innerMode = new InnerMode({ lineComment: null, blockComment: ['{/*', '*/}'] }); + testCommand( + lines, + outerMode.getLanguageIdentifier(), + selection, + (sel) => new LineCommentCommand(sel, 4, Type.Toggle), + expectedLines, + expectedSelection + ); + innerMode.dispose(); + outerMode.dispose(); + } + + test('issue #24047 (part 1): Commenting code in JSX files', () => { + testLineCommentCommand( + [ + 'import React from \'react\';', + 'const Loader = () => (', + '
', + ' Loading...', + '
', + ');', + 'export default Loader;' + ], + new Selection(1, 1, 7, 22), + [ + '// import React from \'react\';', + '// const Loader = () => (', + '//
', + '// Loading...', + '//
', + '// );', + '// export default Loader;' + ], + new Selection(1, 4, 7, 25), + ); + }); + + test('issue #24047 (part 2): Commenting code in JSX files', () => { + testLineCommentCommand( + [ + 'import React from \'react\';', + 'const Loader = () => (', + '
', + ' Loading...', + '
', + ');', + 'export default Loader;' + ], + new Selection(3, 4, 3, 4), + [ + 'import React from \'react\';', + 'const Loader = () => (', + ' {/*
*/}', + ' Loading...', + '
', + ');', + 'export default Loader;' + ], + new Selection(3, 7, 3, 7), + ); + }); + +}); From ce0c28a6d0ff25a3fe86130ec20783cadda0c2a7 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 10 May 2017 13:53:21 -0700 Subject: [PATCH 0310/1164] Fix onEnter Rules Language Mode When There is a Selection (#26410) Fixes #26406 **Bug** If there is an active selection, the on Enter rules may use the wrong language mode which results in the incorrect `afterEnterText`. See #26406 for an example of this case **Fix** Use language mode from the selection and correctly compute offset when grabbing `afterEnterText` --- src/vs/editor/common/modes/languageConfigurationRegistry.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/common/modes/languageConfigurationRegistry.ts b/src/vs/editor/common/modes/languageConfigurationRegistry.ts index ae25a6533d4..1563ebc48de 100644 --- a/src/vs/editor/common/modes/languageConfigurationRegistry.ts +++ b/src/vs/editor/common/modes/languageConfigurationRegistry.ts @@ -288,8 +288,8 @@ export class LanguageConfigurationRegistryImpl { if (range.isEmpty()) { afterEnterText = scopedLineText.substr(range.startColumn - 1 - scopedLineTokens.firstCharOffset); } else { - let endScopedLineTokens = this.getScopedLineTokens(model, range.endLineNumber); - afterEnterText = endScopedLineTokens.getLineContent().substr(range.endColumn - 1); + const endScopedLineTokens = this.getScopedLineTokens(model, range.endLineNumber, range.endColumn); + afterEnterText = endScopedLineTokens.getLineContent().substr(range.endColumn - 1 - scopedLineTokens.firstCharOffset); } let lineNumber = range.startLineNumber; From 2aa11ada5e9c69963868e71640be8ace8ac28273 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 10 May 2017 15:52:10 -0700 Subject: [PATCH 0311/1164] Address VSCode component of #26415 --- extensions/typescript/src/features/previewer.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/extensions/typescript/src/features/previewer.ts b/extensions/typescript/src/features/previewer.ts index e5a8ef7f7e3..6fd8eb7e600 100644 --- a/extensions/typescript/src/features/previewer.ts +++ b/extensions/typescript/src/features/previewer.ts @@ -16,12 +16,24 @@ export function plain(parts: Proto.SymbolDisplayPart[]): string { export function tagsMarkdownPreview(tags: Proto.JSDocTagInfo[]): string { return (tags || []) - .map(tag => `*@${tag.name}*` + (tag.text ? ` — ${tag.text}` : '')) + .map(tag => { + const label = `*@${tag.name}*`; + if (!tag.text) { + return label; + } + return label + (tag.text.match(/\r\n|\n/g) ? '\n' + tag.text : ` — ${tag.text}`); + }) .join(' \n'); } export function tagsPlainPreview(tags: Proto.JSDocTagInfo[]): string { return (tags || []) - .map(tag => `@${tag.name}` + (tag.text ? ` — ${tag.text}` : '')) + .map(tag => { + const label = `@${tag.name}`; + if (!tag.text) { + return label; + } + return label + (tag.text.match(/\r\n|\n/g) ? '\n' + tag.text : ` — ${tag.text}`); + }) .join('\n'); } \ No newline at end of file From c047734f64e3420e949e5650ca7d59615da1f4a6 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Thu, 11 May 2017 00:54:42 +0200 Subject: [PATCH 0312/1164] node-debug@1.13.3 --- build/gulpfile.vscode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index c4227104532..7bc920e9bba 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -41,7 +41,7 @@ const nodeModules = ['electron', 'original-fs'] // Build const builtInExtensions = [ - { name: 'ms-vscode.node-debug', version: '1.13.2' }, + { name: 'ms-vscode.node-debug', version: '1.13.3' }, { name: 'ms-vscode.node-debug2', version: '1.12.4' } ]; From 9587f8f379c6203c992aab37d36053111ebc384e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 10 May 2017 16:32:09 -0700 Subject: [PATCH 0313/1164] Further tweaks to jsdoc tag rendering --- extensions/typescript/src/features/previewer.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/typescript/src/features/previewer.ts b/extensions/typescript/src/features/previewer.ts index 6fd8eb7e600..80ca1c92617 100644 --- a/extensions/typescript/src/features/previewer.ts +++ b/extensions/typescript/src/features/previewer.ts @@ -21,9 +21,9 @@ export function tagsMarkdownPreview(tags: Proto.JSDocTagInfo[]): string { if (!tag.text) { return label; } - return label + (tag.text.match(/\r\n|\n/g) ? '\n' + tag.text : ` — ${tag.text}`); + return label + (tag.text.match(/\r\n|\n/g) ? ' \n' + tag.text : ` — ${tag.text}`); }) - .join(' \n'); + .join(' \n\n'); } export function tagsPlainPreview(tags: Proto.JSDocTagInfo[]): string { From 9cce34d94989482419cf2d339b7c77f4883481ea Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 10 May 2017 16:39:10 -0700 Subject: [PATCH 0314/1164] Improve plain text display of jsdocs tags --- .../typescript/src/features/completionItemProvider.ts | 3 +-- extensions/typescript/src/features/previewer.ts | 9 +++++++-- .../typescript/src/features/signatureHelpProvider.ts | 5 +---- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/extensions/typescript/src/features/completionItemProvider.ts b/extensions/typescript/src/features/completionItemProvider.ts index d5f4bd4477c..f65d27f5009 100644 --- a/extensions/typescript/src/features/completionItemProvider.ts +++ b/extensions/typescript/src/features/completionItemProvider.ts @@ -243,8 +243,7 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP const detail = details[0]; item.detail = Previewer.plain(detail.displayParts); - const tags = Previewer.tagsPlainPreview(detail.tags); - item.documentation = Previewer.plain(detail.documentation) + (tags ? '\n\n' + tags : ''); + item.documentation = Previewer.plainDocumentation(detail.documentation, detail.tags); if (detail && this.config.useCodeSnippetsOnMethodSuggest && (item.kind === CompletionItemKind.Function || item.kind === CompletionItemKind.Method)) { return this.isValidFunctionCompletionContext(filepath, item.position).then(shouldCompleteFunction => { diff --git a/extensions/typescript/src/features/previewer.ts b/extensions/typescript/src/features/previewer.ts index 80ca1c92617..d02ab69550b 100644 --- a/extensions/typescript/src/features/previewer.ts +++ b/extensions/typescript/src/features/previewer.ts @@ -26,7 +26,7 @@ export function tagsMarkdownPreview(tags: Proto.JSDocTagInfo[]): string { .join(' \n\n'); } -export function tagsPlainPreview(tags: Proto.JSDocTagInfo[]): string { +function tagsPlainPreview(tags: Proto.JSDocTagInfo[]): string { return (tags || []) .map(tag => { const label = `@${tag.name}`; @@ -35,5 +35,10 @@ export function tagsPlainPreview(tags: Proto.JSDocTagInfo[]): string { } return label + (tag.text.match(/\r\n|\n/g) ? '\n' + tag.text : ` — ${tag.text}`); }) - .join('\n'); + .join('\n\ngit'); +} + +export function plainDocumentation(documentation: Proto.SymbolDisplayPart[], tags: Proto.JSDocTagInfo[]): string { + const parts = [plain(documentation), tagsPlainPreview(tags)]; + return parts.filter(x => x).join('\n\n'); } \ No newline at end of file diff --git a/extensions/typescript/src/features/signatureHelpProvider.ts b/extensions/typescript/src/features/signatureHelpProvider.ts index dc7214da7f6..b8247e03154 100644 --- a/extensions/typescript/src/features/signatureHelpProvider.ts +++ b/extensions/typescript/src/features/signatureHelpProvider.ts @@ -61,10 +61,7 @@ export default class TypeScriptSignatureHelpProvider implements SignatureHelpPro } }); signature.label += Previewer.plain(item.suffixDisplayParts); - - const tags = Previewer.tagsPlainPreview(item.tags); - signature.documentation = Previewer.plain(item.documentation) + (tags ? '\n\n' + tags : ''); - + signature.documentation = Previewer.plainDocumentation(item.documentation, item.tags); result.signatures.push(signature); }); From 5057c95e6b5a43ddecee0d6f663764b7c80f6c95 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 11 May 2017 07:54:36 +0200 Subject: [PATCH 0315/1164] some electron deprecation fixes --- build/npm/preinstall.js | 2 +- scripts/npm.bat | 2 +- scripts/npm.sh | 2 +- src/typings/electron.d.ts | 4 ++-- src/vs/workbench/electron-browser/bootstrap/index.js | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/build/npm/preinstall.js b/build/npm/preinstall.js index 6a65998d3f6..8bd27204e35 100644 --- a/build/npm/preinstall.js +++ b/build/npm/preinstall.js @@ -6,7 +6,7 @@ const path = require('path'); const cp = require('child_process'); -if (process.env['npm_config_disturl'] !== 'https://atom.io/download/atom-shell') { +if (process.env['npm_config_disturl'] !== 'https://atom.io/download/electron') { console.error("You can't use plain npm to install Code's dependencies."); console.error( /^win/.test(process.platform) diff --git a/scripts/npm.bat b/scripts/npm.bat index 943404a1078..aeb8e93c90c 100644 --- a/scripts/npm.bat +++ b/scripts/npm.bat @@ -1,7 +1,7 @@ @echo off setlocal -set npm_config_disturl="https://atom.io/download/atom-shell" +set npm_config_disturl="https://atom.io/download/electron" for /f "tokens=2 delims=:, " %%a in ('findstr /R /C:"\"electronVersion\":.*" "%~dp0..\package.json"') do set npm_config_target=%%~a set npm_config_arch="ia32" set npm_config_runtime="electron" diff --git a/scripts/npm.sh b/scripts/npm.sh index b56ec27c7fd..69c6d0c48ae 100755 --- a/scripts/npm.sh +++ b/scripts/npm.sh @@ -22,7 +22,7 @@ ELECTRON_VERSION=$( ELECTRON_GYP_HOME=~/.electron-gyp mkdir -p $ELECTRON_GYP_HOME -npm_config_disturl=https://atom.io/download/atom-shell \ +npm_config_disturl=https://atom.io/download/electron \ npm_config_target=$ELECTRON_VERSION \ npm_config_runtime=electron \ HOME=$ELECTRON_GYP_HOME \ diff --git a/src/typings/electron.d.ts b/src/typings/electron.d.ts index e85bb7d346f..5a1f5ea3430 100644 --- a/src/typings/electron.d.ts +++ b/src/typings/electron.d.ts @@ -4466,7 +4466,7 @@ declare namespace Electron { /** * Sets the maximum and minimum zoom level. */ - setZoomLevelLimits(minimumLevel: number, maximumLevel: number): void; + setVisualZoomLevelLimits(minimumLevel: number, maximumLevel: number): void; /** * Executes the editing command undo in web page. */ @@ -5161,7 +5161,7 @@ declare namespace Electron { /** * Sets the maximum and minimum zoom level. */ - setZoomLevelLimits(minimumLevel: number, maximumLevel: number): void; + setVisualZoomLevelLimits(minimumLevel: number, maximumLevel: number): void; /** * Sets a provider for spell checking in input fields and text areas. */ diff --git a/src/vs/workbench/electron-browser/bootstrap/index.js b/src/vs/workbench/electron-browser/bootstrap/index.js index f320447cd9a..e886c4a3469 100644 --- a/src/vs/workbench/electron-browser/bootstrap/index.js +++ b/src/vs/workbench/electron-browser/bootstrap/index.js @@ -148,7 +148,7 @@ function main() { // disable pinch zoom & apply zoom level early to avoid glitches const zoomLevel = configuration.zoomLevel; - webFrame.setZoomLevelLimits(1, 1); + webFrame.setVisualZoomLevelLimits(1, 1); if (typeof zoomLevel === 'number' && zoomLevel !== 0) { webFrame.setZoomLevel(zoomLevel); } From d64758f9b2c9748c5b9de4db205b377f89eac369 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 11 May 2017 09:14:55 +0200 Subject: [PATCH 0316/1164] win32 build --- build/tfs/win32/1_build.ps1 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index c11b72ae864..f3da6228d0d 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -1,9 +1,14 @@ +Param( + [string]$mixinPassword +) + . .\build\tfs\win32\lib.ps1 # npm install exec { & .\scripts\npm.bat install } # mixin +$env:VSCODE_MIXIN_PASSWORD = $mixinPassword exec { & npm run gulp -- mixin } # compile From f4023b382fa7491b9e986c0814ba1a2d79448c8c Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 11 May 2017 09:25:30 +0200 Subject: [PATCH 0317/1164] wire up tab completions with new controller --- .../parts/snippets/electron-browser/tabCompletion.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/parts/snippets/electron-browser/tabCompletion.ts b/src/vs/workbench/parts/snippets/electron-browser/tabCompletion.ts index 47a8ea19198..c4a714a0210 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/tabCompletion.ts +++ b/src/vs/workbench/parts/snippets/electron-browser/tabCompletion.ts @@ -15,7 +15,7 @@ import { endsWith } from 'vs/base/common/strings'; import { IDisposable } from 'vs/base/common/lifecycle'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { CommonEditorRegistry, commonEditorContribution, EditorCommand } from 'vs/editor/common/editorCommonExtensions'; -import { SnippetController, CONTEXT_SNIPPET_MODE } from 'vs/editor/contrib/snippet/common/snippetController'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { IConfigurationRegistry, Extensions as ConfigExt } from 'vs/platform/configuration/common/configurationRegistry'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; @@ -29,7 +29,7 @@ export class TabCompletionController implements editorCommon.IEditorContribution return editor.getContribution(TabCompletionController.ID); } - private _snippetController: SnippetController; + private _snippetController: SnippetController2; private _cursorChangeSubscription: IDisposable; private _currentSnippets: ISnippet[] = []; @@ -38,7 +38,7 @@ export class TabCompletionController implements editorCommon.IEditorContribution @IContextKeyService contextKeyService: IContextKeyService, @ISnippetsService snippetService: ISnippetsService ) { - this._snippetController = SnippetController.get(editor); + this._snippetController = SnippetController2.get(editor); const hasSnippets = TabCompletionController.ContextKey.bindTo(contextKeyService); this._cursorChangeSubscription = editor.onDidChangeCursorSelection(e => { @@ -76,7 +76,7 @@ export class TabCompletionController implements editorCommon.IEditorContribution performSnippetCompletions(): void { if (this._currentSnippets.length === 1) { const snippet = this._currentSnippets[0]; - this._snippetController.insertSnippet(snippet.codeSnippet, snippet.prefix.length, 0); + this._snippetController.insert(snippet.codeSnippet, snippet.prefix.length, 0); // } else { // todo@joh - show suggest widget with proposals } @@ -98,7 +98,7 @@ CommonEditorRegistry.registerEditorCommand(new TabCompletionCommand({ kbExpr: ContextKeyExpr.and( EditorContextKeys.textFocus, EditorContextKeys.tabDoesNotMoveFocus, - CONTEXT_SNIPPET_MODE.toNegated(), + SnippetController2.InSnippetMode.toNegated(), ContextKeyExpr.has('config.editor.tabCompletion') ), primary: KeyCode.Tab From bc0538294867b2f60b4d9841f87f3be49e58b6ca Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 11 May 2017 10:44:36 +0200 Subject: [PATCH 0318/1164] wire up most of the old snippet controller tests --- .../contrib/snippet/browser/editorSnippets.ts | 52 +- .../snippet/browser/snippetController2.ts | 7 +- .../test/browser/editorSnippets.test.ts | 5 +- .../browser/snippetController2.old.test.ts | 588 ++++++++++++++++++ 4 files changed, 637 insertions(+), 15 deletions(-) create mode 100644 src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts index 650b5018d14..9d1fb8f41a1 100644 --- a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts +++ b/src/vs/editor/contrib/snippet/browser/editorSnippets.ts @@ -164,11 +164,9 @@ export class SnippetSession { const lineLeadingWhitespace = getLeadingWhitespace(line, 0, position.column - 1); const templateLines = template.split(/\r\n|\r|\n/); - for (let i = 0; i < templateLines.length; i++) { + for (let i = 1; i < templateLines.length; i++) { let templateLeadingWhitespace = getLeadingWhitespace(templateLines[i]); - if (templateLeadingWhitespace.length > 0) { - templateLines[i] = model.normalizeIndentation(lineLeadingWhitespace + templateLeadingWhitespace) + templateLines[i].substr(templateLeadingWhitespace.length); - } + templateLines[i] = model.normalizeIndentation(lineLeadingWhitespace + templateLeadingWhitespace) + templateLines[i].substr(templateLeadingWhitespace.length); } return templateLines.join(model.getEOL()); } @@ -219,6 +217,12 @@ export class SnippetSession { let edits: IIdentifiedSingleEditOperation[] = []; let model = this._editor.getModel(); + // know what text the overwrite[Before|After] extensions + // of the primary curser have selected because only when + // secondary selections extend to the same text we can grow them + let firstBeforeText = model.getValueInRange(SnippetSession.adjustSelection(model, this._editor.getSelection(), this._overwriteBefore, 0)); + let firstAfterText = model.getValueInRange(SnippetSession.adjustSelection(model, this._editor.getSelection(), 0, this._overwriteAfter)); + // sort selections by their start position but remeber // the original index. that allows you to create correct // offset-based selection logic without changing the @@ -228,17 +232,37 @@ export class SnippetSession { .sort((a, b) => Range.compareRangesUsingStarts(a.selection, b.selection)); for (const { selection, idx } of indexedSelection) { - const range = SnippetSession.adjustSelection(model, selection, this._overwriteBefore, this._overwriteAfter); - const start = range.getStartPosition(); + + // extend selection with the `overwriteBefore` and `overwriteAfter` and then + // compare if this matches the extensions of the primary selection + let extensionBefore = SnippetSession.adjustSelection(model, selection, this._overwriteBefore, 0); + let extensionAfter = SnippetSession.adjustSelection(model, selection, 0, this._overwriteAfter); + if (firstBeforeText !== model.getValueInRange(extensionBefore)) { + extensionBefore = selection; + } + if (firstAfterText !== model.getValueInRange(extensionAfter)) { + extensionAfter = selection; + } + + // merge the before and after selection into one + const snippetSelection = selection + .setStartPosition(extensionBefore.startLineNumber, extensionBefore.startColumn) + .setEndPosition(extensionAfter.endLineNumber, extensionAfter.endColumn); + + // adjust the template string to match the indentation and + // whitespace rules of this insert location (can be different for each cursor) + const start = snippetSelection.getStartPosition(); const adjustedTemplate = SnippetSession.normalizeWhitespace(model, start, this._template); - const snippet = SnippetParser.parse(adjustedTemplate).resolveVariables(new EditorSnippetVariableResolver(model, range)); + const snippet = SnippetParser.parse(adjustedTemplate).resolveVariables(new EditorSnippetVariableResolver(model, snippetSelection)); const offset = model.getOffsetAt(start) + delta; + delta += snippet.text.length - model.getValueLengthInRange(snippetSelection); - edits[idx] = EditOperation.replaceMove(range, snippet.text); + // store snippets with the index of their originating selection. + // that ensures the primiary cursor stays primary despite not being + // the one with lowest start position + edits[idx] = EditOperation.replaceMove(snippetSelection, snippet.text); this._snippets[idx] = new OneSnippet(this._editor, snippet, offset); - - delta += snippet.text.length - model.getValueLengthInRange(range); } // make insert edit and start with first selections @@ -291,8 +315,12 @@ export class SnippetSession { for (const selection of selections) { let found = false; - for (const snippet of this._snippets) { - if (snippet.range.containsRange(selection)) { + for (const { range } of this._snippets) { + if (!range) { + // all deleted + return false; + } + if (range.containsRange(selection)) { found = true; break; } diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 71096b7d1c3..2229757bbb0 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -43,6 +43,8 @@ export class SnippetController2 { dispose(): void { this._inSnippet.reset(); + this._hasPrevTabstop.reset(); + this._hasNextTabstop.reset(); dispose(this._snippet); } @@ -55,7 +57,10 @@ export class SnippetController2 { this.cancel(); } this._snippet = new SnippetSession(this._editor, template, overwriteBefore, overwriteAfter); - this._snippetListener = [this._editor.onDidChangeCursorSelection(() => this._updateState())]; + this._snippetListener = [ + this._editor.onDidChangeModel(() => this.cancel()), + this._editor.onDidChangeCursorSelection(() => this._updateState()) + ]; this._snippet.insert(); } diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts index 5902f33ec3f..ecd3ede31c3 100644 --- a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts @@ -50,6 +50,7 @@ suite('SnippetSession', function () { assertNormalized(new Position(1, 1), 'foo\rbar', 'foo\nbar'); assertNormalized(new Position(2, 5), 'foo\r\tbar', 'foo\n bar'); assertNormalized(new Position(2, 3), 'foo\r\tbar', 'foo\n bar'); + assertNormalized(new Position(2, 5), 'foo\r\tbar\nfoo', 'foo\n bar\n foo'); }); test('adjust selection (overwrite[Before|After])', function () { @@ -111,12 +112,12 @@ suite('SnippetSession', function () { const session = new SnippetSession(editor, 'foo\n\t${1:bar}\n$0'); session.insert(); - assert.equal(editor.getModel().getValue(), 'foo\n bar\nfunction foo() {\n foo\n bar\nconsole.log(a);\n}'); + assert.equal(editor.getModel().getValue(), 'foo\n bar\nfunction foo() {\n foo\n bar\n console.log(a);\n}'); assertSelections(editor, new Selection(2, 5, 2, 8), new Selection(5, 9, 5, 12)); session.next(); - assertSelections(editor, new Selection(3, 1, 3, 1), new Selection(6, 1, 6, 1)); + assertSelections(editor, new Selection(3, 1, 3, 1), new Selection(6, 5, 6, 5)); }); test('snippets, selections -> next/prev', () => { diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts new file mode 100644 index 00000000000..9e15e0bed55 --- /dev/null +++ b/src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts @@ -0,0 +1,588 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import * as assert from 'assert'; +import { Position } from 'vs/editor/common/core/position'; +import { Selection } from 'vs/editor/common/core/selection'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; +import { MockCodeEditor, withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; +import { Cursor } from 'vs/editor/common/controller/cursor'; +import { IContextKeyService } from "vs/platform/contextkey/common/contextkey"; +import { ICommonCodeEditor } from "vs/editor/common/editorCommon"; + +class TestSnippetController extends SnippetController2 { + + constructor( + editor: ICommonCodeEditor, + @IContextKeyService private _contextKeyService: IContextKeyService + ) { + super(editor, _contextKeyService); + } + + isInSnippetMode(): boolean { + return SnippetController2.InSnippetMode.getValue(this._contextKeyService); + } + +} + +suite('SnippetController', () => { + + function snippetTest(cb: (editor: MockCodeEditor, cursor: Cursor, template: string, snippetController: TestSnippetController) => void, lines?: string[]): void { + + if (!lines) { + lines = [ + 'function test() {', + '\tvar x = 3;', + '\tvar arr = [];', + '\t', + '}' + ]; + }; + + withMockCodeEditor(lines, {}, (editor, cursor) => { + editor.getModel().updateOptions({ + insertSpaces: false + }); + let snippetController = editor.registerAndInstantiateContribution(TestSnippetController); + let template = [ + 'for (var ${1:index}; $1 < ${2:array}.length; $1++) {', + '\tvar element = $2[$1];', + '\t$0', + '}' + ].join('\n'); + + cb(editor, cursor, template, snippetController); + snippetController.dispose(); + }); + } + + test('Simple accepted', () => { + snippetTest((editor, cursor, template, snippetController) => { + editor.setPosition({ lineNumber: 4, column: 2 }); + + snippetController.insert(template, 0, 0); + assert.equal(editor.getModel().getLineContent(4), '\tfor (var index; index < array.length; index++) {'); + assert.equal(editor.getModel().getLineContent(5), '\t\tvar element = array[index];'); + assert.equal(editor.getModel().getLineContent(6), '\t\t'); + assert.equal(editor.getModel().getLineContent(7), '\t}'); + + editor.trigger('test', 'type', { text: 'i' }); + assert.equal(editor.getModel().getLineContent(4), '\tfor (var i; i < array.length; i++) {'); + assert.equal(editor.getModel().getLineContent(5), '\t\tvar element = array[i];'); + assert.equal(editor.getModel().getLineContent(6), '\t\t'); + assert.equal(editor.getModel().getLineContent(7), '\t}'); + + snippetController.next(); + editor.trigger('test', 'type', { text: 'arr' }); + assert.equal(editor.getModel().getLineContent(4), '\tfor (var i; i < arr.length; i++) {'); + assert.equal(editor.getModel().getLineContent(5), '\t\tvar element = arr[i];'); + assert.equal(editor.getModel().getLineContent(6), '\t\t'); + assert.equal(editor.getModel().getLineContent(7), '\t}'); + + snippetController.prev(); + editor.trigger('test', 'type', { text: 'j' }); + assert.equal(editor.getModel().getLineContent(4), '\tfor (var j; j < arr.length; j++) {'); + assert.equal(editor.getModel().getLineContent(5), '\t\tvar element = arr[j];'); + assert.equal(editor.getModel().getLineContent(6), '\t\t'); + assert.equal(editor.getModel().getLineContent(7), '\t}'); + + snippetController.next(); + snippetController.next(); + assert.deepEqual(editor.getPosition(), new Position(6, 3)); + }); + }); + + test('Simple canceled', () => { + snippetTest((editor, cursor, template, snippetController) => { + editor.setPosition({ lineNumber: 4, column: 2 }); + + snippetController.insert(template, 0, 0); + assert.equal(editor.getModel().getLineContent(4), '\tfor (var index; index < array.length; index++) {'); + assert.equal(editor.getModel().getLineContent(5), '\t\tvar element = array[index];'); + assert.equal(editor.getModel().getLineContent(6), '\t\t'); + assert.equal(editor.getModel().getLineContent(7), '\t}'); + + snippetController.cancel(); + assert.deepEqual(editor.getPosition(), new Position(4, 16)); + }); + }); + + // test('Stops when deleting lines above', () => { + // snippetTest((editor, cursor, codeSnippet, snippetController) => { + // editor.setPosition({ lineNumber: 4, column: 2 }); + // snippetController.insert(codeSnippet, 0, 0); + + // editor.getModel().applyEdits([{ + // forceMoveMarkers: false, + // identifier: null, + // isAutoWhitespaceEdit: false, + // range: new Range(1, 1, 3, 1), + // text: null + // }]); + + // assert.equal(snippetController.isInSnippetMode(), false); + // }); + // }); + + // test('Stops when deleting lines below', () => { + // snippetTest((editor, cursor, codeSnippet, snippetController) => { + // editor.setPosition({ lineNumber: 4, column: 2 }); + // snippetController.run(codeSnippet, 0, 0); + + // editor.getModel().applyEdits([{ + // forceMoveMarkers: false, + // identifier: null, + // isAutoWhitespaceEdit: false, + // range: new Range(8, 1, 8, 100), + // text: null + // }]); + + // assert.equal(snippetController.isInSnippetMode(), false); + // }); + // }); + + // test('Stops when inserting lines above', () => { + // snippetTest((editor, cursor, codeSnippet, snippetController) => { + // editor.setPosition({ lineNumber: 4, column: 2 }); + // snippetController.run(codeSnippet, 0, 0); + + // editor.getModel().applyEdits([{ + // forceMoveMarkers: false, + // identifier: null, + // isAutoWhitespaceEdit: false, + // range: new Range(1, 100, 1, 100), + // text: '\nHello' + // }]); + + // assert.equal(snippetController.isInSnippetMode(), false); + // }); + // }); + + // test('Stops when inserting lines below', () => { + // snippetTest((editor, cursor, codeSnippet, snippetController) => { + // editor.setPosition({ lineNumber: 4, column: 2 }); + // snippetController.run(codeSnippet, 0, 0); + + // editor.getModel().applyEdits([{ + // forceMoveMarkers: false, + // identifier: null, + // isAutoWhitespaceEdit: false, + // range: new Range(8, 100, 8, 100), + // text: '\nHello' + // }]); + + // assert.equal(snippetController.isInSnippetMode(), false); + // }); + // }); + + test('Stops when calling model.setValue()', () => { + snippetTest((editor, cursor, codeSnippet, snippetController) => { + editor.setPosition({ lineNumber: 4, column: 2 }); + snippetController.insert(codeSnippet, 0, 0); + + editor.getModel().setValue('goodbye'); + + assert.equal(snippetController.isInSnippetMode(), false); + }); + }); + + // test('Stops when undoing', () => { + // snippetTest((editor, cursor, codeSnippet, snippetController) => { + // editor.setPosition({ lineNumber: 4, column: 2 }); + // snippetController.run(codeSnippet, 0, 0); + + // editor.getModel().undo(); + + // assert.equal(snippetController.isInSnippetMode(), false); + // }); + // }); + + test('Stops when moving cursor outside', () => { + snippetTest((editor, cursor, codeSnippet, snippetController) => { + editor.setPosition({ lineNumber: 4, column: 2 }); + snippetController.insert(codeSnippet, 0, 0); + + editor.setPosition({ lineNumber: 1, column: 1 }); + + assert.equal(snippetController.isInSnippetMode(), false); + }); + }); + + test('Stops when disconnecting editor model', () => { + snippetTest((editor, cursor, codeSnippet, snippetController) => { + editor.setPosition({ lineNumber: 4, column: 2 }); + snippetController.insert(codeSnippet, 0, 0); + + editor.setModel(null); + + assert.equal(snippetController.isInSnippetMode(), false); + }); + }); + + test('Stops when disposing editor', () => { + snippetTest((editor, cursor, codeSnippet, snippetController) => { + editor.setPosition({ lineNumber: 4, column: 2 }); + snippetController.insert(codeSnippet, 0, 0); + + snippetController.dispose(); + + assert.equal(snippetController.isInSnippetMode(), false); + }); + }); + + test('Final tabstop with multiple selections', () => { + snippetTest((editor, cursor, codeSnippet, snippetController) => { + editor.setSelections([ + new Selection(1, 1, 1, 1), + new Selection(2, 1, 2, 1), + ]); + + codeSnippet = 'foo$0'; + snippetController.insert(codeSnippet, 0, 0); + + assert.equal(editor.getSelections().length, 2); + const [first, second] = editor.getSelections(); + assert.ok(first.equalsRange({ startLineNumber: 1, startColumn: 4, endLineNumber: 1, endColumn: 4 }), first.toString()); + assert.ok(second.equalsRange({ startLineNumber: 2, startColumn: 4, endLineNumber: 2, endColumn: 4 }), second.toString()); + }); + + snippetTest((editor, cursor, codeSnippet, snippetController) => { + editor.setSelections([ + new Selection(1, 1, 1, 1), + new Selection(2, 1, 2, 1), + ]); + + codeSnippet = 'foo$0bar'; + snippetController.insert(codeSnippet, 0, 0); + + assert.equal(editor.getSelections().length, 2); + const [first, second] = editor.getSelections(); + assert.ok(first.equalsRange({ startLineNumber: 1, startColumn: 4, endLineNumber: 1, endColumn: 4 }), first.toString()); + assert.ok(second.equalsRange({ startLineNumber: 2, startColumn: 4, endLineNumber: 2, endColumn: 4 }), second.toString()); + }); + + snippetTest((editor, cursor, codeSnippet, snippetController) => { + editor.setSelections([ + new Selection(1, 1, 1, 1), + new Selection(1, 5, 1, 5), + ]); + + codeSnippet = 'foo$0bar'; + snippetController.insert(codeSnippet, 0, 0); + + assert.equal(editor.getSelections().length, 2); + const [first, second] = editor.getSelections(); + assert.ok(first.equalsRange({ startLineNumber: 1, startColumn: 4, endLineNumber: 1, endColumn: 4 }), first.toString()); + assert.ok(second.equalsRange({ startLineNumber: 1, startColumn: 14, endLineNumber: 1, endColumn: 14 }), second.toString()); + }); + + snippetTest((editor, cursor, codeSnippet, snippetController) => { + editor.setSelections([ + new Selection(1, 1, 1, 1), + new Selection(1, 5, 1, 5), + ]); + + codeSnippet = 'foo\n$0\nbar'; + snippetController.insert(codeSnippet, 0, 0); + + assert.equal(editor.getSelections().length, 2); + const [first, second] = editor.getSelections(); + assert.ok(first.equalsRange({ startLineNumber: 2, startColumn: 1, endLineNumber: 2, endColumn: 1 }), first.toString()); + assert.ok(second.equalsRange({ startLineNumber: 4, startColumn: 1, endLineNumber: 4, endColumn: 1 }), second.toString()); + }); + + snippetTest((editor, cursor, codeSnippet, snippetController) => { + editor.setSelections([ + new Selection(1, 1, 1, 1), + new Selection(1, 5, 1, 5), + ]); + + codeSnippet = 'foo\n$0\nbar'; + snippetController.insert(codeSnippet, 0, 0); + + assert.equal(editor.getSelections().length, 2); + const [first, second] = editor.getSelections(); + assert.ok(first.equalsRange({ startLineNumber: 2, startColumn: 1, endLineNumber: 2, endColumn: 1 }), first.toString()); + assert.ok(second.equalsRange({ startLineNumber: 4, startColumn: 1, endLineNumber: 4, endColumn: 1 }), second.toString()); + }); + + snippetTest((editor, cursor, codeSnippet, snippetController) => { + editor.setSelections([ + new Selection(2, 7, 2, 7), + ]); + + codeSnippet = 'xo$0r'; + snippetController.insert(codeSnippet, 1, 0); + + assert.equal(editor.getSelections().length, 1); + assert.ok(editor.getSelection().equalsRange({ startLineNumber: 2, startColumn: 8, endColumn: 8, endLineNumber: 2 })); + }); + }); + + test('Final tabstop, #11742 simple', () => { + snippetTest((editor, cursor, codeSnippet, controller) => { + + editor.setSelection(new Selection(1, 19, 1, 19)); + + codeSnippet = '{{% url_**$1** %}}'; + controller.insert(codeSnippet, 2, 0); + + assert.equal(editor.getSelections().length, 1); + assert.ok(editor.getSelection().equalsRange({ startLineNumber: 1, startColumn: 27, endLineNumber: 1, endColumn: 27 })); + assert.equal(editor.getModel().getValue(), 'example example {{% url_**** %}}'); + + }, ['example example sc']); + + snippetTest((editor, cursor, codeSnippet, controller) => { + + editor.setSelection(new Selection(1, 3, 1, 3)); + + codeSnippet = [ + 'afterEach((done) => {', + '\t${1}test', + '});' + ].join('\n'); + + controller.insert(codeSnippet, 2, 0); + + assert.equal(editor.getSelections().length, 1); + assert.ok(editor.getSelection().equalsRange({ startLineNumber: 2, startColumn: 2, endLineNumber: 2, endColumn: 2 }), editor.getSelection().toString()); + assert.equal(editor.getModel().getValue(), 'afterEach((done) => {\n\ttest\n});'); + + }, ['af']); + + snippetTest((editor, cursor, codeSnippet, controller) => { + + editor.setSelection(new Selection(1, 3, 1, 3)); + + codeSnippet = [ + 'afterEach((done) => {', + '${1}\ttest', + '});' + ].join('\n'); + + controller.insert(codeSnippet, 2, 0); + + assert.equal(editor.getSelections().length, 1); + assert.ok(editor.getSelection().equalsRange({ startLineNumber: 2, startColumn: 1, endLineNumber: 2, endColumn: 1 }), editor.getSelection().toString()); + assert.equal(editor.getModel().getValue(), 'afterEach((done) => {\n\ttest\n});'); + + }, ['af']); + + snippetTest((editor, cursor, codeSnippet, controller) => { + + editor.setSelection(new Selection(1, 9, 1, 9)); + + codeSnippet = [ + 'aft${1}er' + ].join('\n'); + + controller.insert(codeSnippet, 8, 0); + + assert.equal(editor.getModel().getValue(), 'after'); + assert.equal(editor.getSelections().length, 1); + assert.ok(editor.getSelection().equalsRange({ startLineNumber: 1, startColumn: 4, endLineNumber: 1, endColumn: 4 }), editor.getSelection().toString()); + + }, ['afterone']); + }); + + test('Final tabstop, #11742 different indents', () => { + + snippetTest((editor, cursor, codeSnippet, controller) => { + + editor.setSelections([ + new Selection(2, 4, 2, 4), + new Selection(1, 3, 1, 3) + ]); + + codeSnippet = [ + 'afterEach((done) => {', + '\t${0}test', + '});' + ].join('\n'); + + controller.insert(codeSnippet, 2, 0); + + assert.equal(editor.getSelections().length, 2); + const [first, second] = editor.getSelections(); + + assert.ok(first.equalsRange({ startLineNumber: 5, startColumn: 3, endLineNumber: 5, endColumn: 3 }), first.toString()); + assert.ok(second.equalsRange({ startLineNumber: 2, startColumn: 2, endLineNumber: 2, endColumn: 2 }), second.toString()); + + }, ['af', '\taf']); + }); + + test('Final tabstop, #11890 stay at the beginning', () => { + + snippetTest((editor, cursor, codeSnippet, controller) => { + + editor.setSelections([ + new Selection(1, 5, 1, 5) + ]); + + codeSnippet = [ + 'afterEach((done) => {', + '${1}\ttest', + '});' + ].join('\n'); + + controller.insert(codeSnippet, 2, 0); + + assert.equal(editor.getSelections().length, 1); + const [first] = editor.getSelections(); + + assert.ok(first.equalsRange({ startLineNumber: 2, startColumn: 3, endLineNumber: 2, endColumn: 3 }), first.toString()); + + }, [' af']); + }); + + test('Final tabstop, no tabstop', () => { + + snippetTest((editor, cursor, codeSnippet, controller) => { + + editor.setSelections([ + new Selection(1, 3, 1, 3) + ]); + + codeSnippet = 'afterEach'; + + controller.insert(codeSnippet, 2, 0); + + assert.ok(editor.getSelection().equalsRange({ startLineNumber: 1, startColumn: 10, endLineNumber: 1, endColumn: 10 })); + + }, ['af', '\taf']); + }); + + test('Multiple cursor and overwriteBefore/After, issue #11060', () => { + + snippetTest((editor, cursor, codeSnippet, controller) => { + + editor.setSelections([ + new Selection(1, 7, 1, 7), + new Selection(2, 4, 2, 4) + ]); + + codeSnippet = '_foo'; + controller.insert(codeSnippet, 1, 0); + assert.equal(editor.getModel().getValue(), 'this._foo\nabc_foo'); + + }, ['this._', 'abc']); + + snippetTest((editor, cursor, codeSnippet, controller) => { + + editor.setSelections([ + new Selection(1, 7, 1, 7), + new Selection(2, 4, 2, 4) + ]); + + codeSnippet = 'XX'; + controller.insert(codeSnippet, 1, 0); + assert.equal(editor.getModel().getValue(), 'this.XX\nabcXX'); + + }, ['this._', 'abc']); + + snippetTest((editor, cursor, codeSnippet, controller) => { + + editor.setSelections([ + new Selection(1, 7, 1, 7), + new Selection(2, 4, 2, 4), + new Selection(3, 5, 3, 5) + ]); + + codeSnippet = '_foo'; + controller.insert(codeSnippet, 1, 0); + assert.equal(editor.getModel().getValue(), 'this._foo\nabc_foo\ndef_foo'); + + }, ['this._', 'abc', 'def_']); + + snippetTest((editor, cursor, codeSnippet, controller) => { + + editor.setSelections([ + new Selection(1, 7, 1, 7), // primary at `this._` + new Selection(2, 4, 2, 4), + new Selection(3, 6, 3, 6) + ]); + + codeSnippet = '._foo'; + controller.insert(codeSnippet, 2, 0); + assert.equal(editor.getModel().getValue(), 'this._foo\nabc._foo\ndef._foo'); + + }, ['this._', 'abc', 'def._']); + + snippetTest((editor, cursor, codeSnippet, controller) => { + + editor.setSelections([ + new Selection(3, 6, 3, 6), // primary at `def._` + new Selection(1, 7, 1, 7), + new Selection(2, 4, 2, 4), + ]); + + codeSnippet = '._foo'; + controller.insert(codeSnippet, 2, 0); + assert.equal(editor.getModel().getValue(), 'this._foo\nabc._foo\ndef._foo'); + + }, ['this._', 'abc', 'def._']); + + snippetTest((editor, cursor, codeSnippet, controller) => { + + editor.setSelections([ + new Selection(2, 4, 2, 4), // primary at `abc` + new Selection(3, 6, 3, 6), + new Selection(1, 7, 1, 7), + ]); + + codeSnippet = '._foo'; + controller.insert(codeSnippet, 2, 0); + assert.equal(editor.getModel().getValue(), 'this._._foo\na._foo\ndef._._foo'); + + }, ['this._', 'abc', 'def._']); + + }); + + test('Multiple cursor and overwriteBefore/After, #16277', () => { + snippetTest((editor, cursor, codeSnippet, controller) => { + + editor.setSelections([ + new Selection(1, 5, 1, 5), + new Selection(2, 5, 2, 5), + ]); + + codeSnippet = 'document'; + controller.insert(codeSnippet, 3, 0); + assert.equal(editor.getModel().getValue(), '{document}\n{document && true}'); + + }, ['{foo}', '{foo && true}']); + }); + + test('Insert snippet twice, #19449', () => { + + snippetTest((editor, cursor, codeSnippet, controller) => { + + editor.setSelections([ + new Selection(1, 1, 1, 1) + ]); + + codeSnippet = 'for (var ${1:i}=0; ${1:i} { + + editor.setSelections([ + new Selection(1, 1, 1, 1) + ]); + + codeSnippet = 'for (let ${1:i}=0; ${1:i} Date: Thu, 11 May 2017 11:05:43 +0200 Subject: [PATCH 0319/1164] Renamed --noGettingStarted to --skip-getting-started argument #26386. --- src/vs/platform/environment/common/environment.ts | 4 ++-- src/vs/platform/environment/node/argv.ts | 2 +- src/vs/platform/environment/node/environmentService.ts | 2 +- .../welcome/gettingStarted/electron-browser/gettingStarted.ts | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 6c8b7d20576..a1c53201b34 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -38,7 +38,7 @@ export interface ParsedArgs { 'enable-proposed-api'?: string | string[]; 'open-url'?: string | string[]; 'prof-startup-timers': string; - noGettingStarted?: boolean; + 'skip-getting-started'?: boolean; } export const IEnvironmentService = createDecorator('environmentService'); @@ -79,7 +79,7 @@ export interface IEnvironmentService { performance: boolean; profileStartup: { prefix: string, dir: string } | undefined; - noGettingStarted: boolean | undefined; + skipGettingStarted: boolean | undefined; mainIPCHandle: string; sharedIPCHandle: string; diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index 0a4ea0f9c49..9b90b9161bd 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -42,7 +42,7 @@ const options: minimist.Opts = { 'list-extensions', 'show-versions', 'nolazy', - 'noGettingStarted' + 'skip-getting-started' ], alias: { help: 'h', diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index d088d9c9c3b..34a82d9d571 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -100,7 +100,7 @@ export class EnvironmentService implements IEnvironmentService { get disableExtensions(): boolean { return this._args['disable-extensions']; } - get noGettingStarted(): boolean { return this._args.noGettingStarted; } + get skipGettingStarted(): boolean { return this._args['skip-getting-started']; } @memoize get debugExtensionHost(): { port: number; break: boolean; } { return parseExtensionHostPort(this._args, this.isBuilt); } diff --git a/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarted.ts b/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarted.ts index 76215dd8be9..cdb9eb088b0 100644 --- a/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarted.ts +++ b/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarted.ts @@ -69,8 +69,8 @@ export class GettingStarted implements IWorkbenchContribution { ) { this.appName = product.nameLong; - /* do not open a browser when we run an extension or --noGettingStarted is provided */ - if (product.welcomePage && !environmentService.isExtensionDevelopment && !environmentService.noGettingStarted) { + /* do not open a browser when we run an extension or --skip-getting-started is provided */ + if (product.welcomePage && !environmentService.isExtensionDevelopment && !environmentService.skipGettingStarted) { this.welcomePageURL = product.welcomePage; this.handleWelcome(); } From 7ebf725c672e9470cc590be20c0e35f99d3beedd Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 11 May 2017 11:08:28 +0200 Subject: [PATCH 0320/1164] fix bad imports --- src/vs/editor/contrib/snippet/browser/snippetController2.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 2229757bbb0..39fbe409445 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -10,9 +10,9 @@ import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { commonEditorContribution, CommonEditorRegistry } from 'vs/editor/common/editorCommonExtensions'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { SnippetSession } from './editorSnippets'; -import { EditorCommand } from "vs/editor/common/config/config"; -import { EditorContextKeys } from "vs/editor/common/editorContextKeys"; -import { KeyCode, KeyMod } from "vs/base/common/keyCodes"; +import { EditorCommand } from 'vs/editor/common/config/config'; +import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; +import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; @commonEditorContribution export class SnippetController2 { From 4c94c83eb01e799565f0e924f11ef8f76471224c Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 11 May 2017 09:36:11 +0200 Subject: [PATCH 0321/1164] Update to native-keymap@1.2.4 (#23685) --- npm-shrinkwrap.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index cc268be6f54..84aa4bbba28 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -293,9 +293,9 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz" }, "native-keymap": { - "version": "1.2.3", - "from": "native-keymap@1.2.3", - "resolved": "https://registry.npmjs.org/native-keymap/-/native-keymap-1.2.3.tgz" + "version": "1.2.4", + "from": "native-keymap@1.2.4", + "resolved": "https://registry.npmjs.org/native-keymap/-/native-keymap-1.2.4.tgz" }, "normalize-path": { "version": "2.0.1", diff --git a/package.json b/package.json index 88ff5afaed3..a9b3c8288f8 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "iconv-lite": "0.4.15", "jschardet": "^1.4.2", "minimist": "1.2.0", - "native-keymap": "1.2.3", + "native-keymap": "1.2.4", "node-pty": "0.6.4", "semver": "4.3.6", "v8-profiler": "jrieken/v8-profiler#vscode", From e968d3cebb6336619dc3c9cbe1c629df33fe6199 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 11 May 2017 11:22:46 +0200 Subject: [PATCH 0322/1164] Fixes #23685: Add support for ABNT_C1 and ABNT_C2 key codes --- src/vs/base/browser/keyboardEvent.ts | 2 + src/vs/base/common/keyCodes.ts | 7 + .../common/standalone/standaloneBase.ts | 5 + .../common/standalone/standaloneBase.test.ts | 2 + src/vs/monaco.d.ts | 4 +- .../keybinding/common/keybindingsRegistry.ts | 2 + .../common/windowsKeyboardMapper.ts | 18 +- .../keybinding/test/keybindingIO.test.ts | 4 + .../services/keybinding/test/win_por_ptb.js | 1093 +++++++++++++++++ .../services/keybinding/test/win_por_ptb.txt | 284 +++++ .../test/windowsKeyboardMapper.test.ts | 63 + 11 files changed, 1480 insertions(+), 4 deletions(-) create mode 100644 src/vs/workbench/services/keybinding/test/win_por_ptb.js create mode 100644 src/vs/workbench/services/keybinding/test/win_por_ptb.txt diff --git a/src/vs/base/browser/keyboardEvent.ts b/src/vs/base/browser/keyboardEvent.ts index ca3450b61b4..6f90f1b1b07 100644 --- a/src/vs/base/browser/keyboardEvent.ts +++ b/src/vs/base/browser/keyboardEvent.ts @@ -120,6 +120,8 @@ let KEY_CODE_MAP: { [keyCode: number]: KeyCode } = {}; KEY_CODE_MAP[190] = KeyCode.US_DOT; KEY_CODE_MAP[191] = KeyCode.US_SLASH; KEY_CODE_MAP[192] = KeyCode.US_BACKTICK; + KEY_CODE_MAP[193] = KeyCode.ABNT_C1; + KEY_CODE_MAP[194] = KeyCode.ABNT_C2; KEY_CODE_MAP[219] = KeyCode.US_OPEN_SQUARE_BRACKET; KEY_CODE_MAP[220] = KeyCode.US_BACKSLASH; KEY_CODE_MAP[221] = KeyCode.US_CLOSE_SQUARE_BRACKET; diff --git a/src/vs/base/common/keyCodes.ts b/src/vs/base/common/keyCodes.ts index ff89f086e57..c2b5c9d519a 100644 --- a/src/vs/base/common/keyCodes.ts +++ b/src/vs/base/common/keyCodes.ts @@ -190,6 +190,9 @@ export const enum KeyCode { */ KEY_IN_COMPOSITION = 109, + ABNT_C1 = 110, // Brazilian (ABNT) Keyboard + ABNT_C2 = 111, // Brazilian (ABNT) Keyboard + /** * Placed last to cover the length of the enum. * Please do not depend on this value! @@ -344,6 +347,8 @@ let STRING = createMapping((TO_STRING_MAP) => { TO_STRING_MAP[KeyCode.US_DOT] = '.'; TO_STRING_MAP[KeyCode.US_SLASH] = '/'; TO_STRING_MAP[KeyCode.US_BACKTICK] = '`'; + TO_STRING_MAP[KeyCode.ABNT_C1] = 'ABNT_C1'; + TO_STRING_MAP[KeyCode.ABNT_C2] = 'ABNT_C2'; TO_STRING_MAP[KeyCode.US_OPEN_SQUARE_BRACKET] = '['; TO_STRING_MAP[KeyCode.US_BACKSLASH] = '\\'; TO_STRING_MAP[KeyCode.US_CLOSE_SQUARE_BRACKET] = ']'; @@ -395,6 +400,8 @@ export let USER_SETTINGS = createMapping((TO_USER_SETTINGS_MAP) => { FROM_USER_SETTINGS_MAP['OEM_PERIOD'] = KeyCode.US_DOT; FROM_USER_SETTINGS_MAP['OEM_2'] = KeyCode.US_SLASH; FROM_USER_SETTINGS_MAP['OEM_3'] = KeyCode.US_BACKTICK; + FROM_USER_SETTINGS_MAP['ABNT_C1'] = KeyCode.ABNT_C1; + FROM_USER_SETTINGS_MAP['ABNT_C2'] = KeyCode.ABNT_C2; FROM_USER_SETTINGS_MAP['OEM_4'] = KeyCode.US_OPEN_SQUARE_BRACKET; FROM_USER_SETTINGS_MAP['OEM_5'] = KeyCode.US_BACKSLASH; FROM_USER_SETTINGS_MAP['OEM_6'] = KeyCode.US_CLOSE_SQUARE_BRACKET; diff --git a/src/vs/editor/common/standalone/standaloneBase.ts b/src/vs/editor/common/standalone/standaloneBase.ts index fcab19ff6e8..695aa77b9bf 100644 --- a/src/vs/editor/common/standalone/standaloneBase.ts +++ b/src/vs/editor/common/standalone/standaloneBase.ts @@ -16,6 +16,7 @@ import URI from 'vs/base/common/uri'; // -------------------------------------------- // This is repeated here so it can be exported +// because TS inlines const enums // -------------------------------------------- export enum Severity { Ignore = 0, @@ -26,6 +27,7 @@ export enum Severity { // -------------------------------------------- // This is repeated here so it can be exported +// because TS inlines const enums // -------------------------------------------- export class KeyMod { public static readonly CtrlCmd: number = ConstKeyMod.CtrlCmd; @@ -40,6 +42,7 @@ export class KeyMod { // -------------------------------------------- // This is repeated here so it can be exported +// because TS inlines const enums // -------------------------------------------- /** * Virtual Key Codes, the value does not hold any inherent meaning. @@ -213,6 +216,8 @@ export enum KeyCode { * Cover all key codes when IME is processing input. */ KEY_IN_COMPOSITION = 109, + ABNT_C1 = 110, + ABNT_C2 = 111, /** * Placed last to cover the length of the enum. * Please do not depend on this value! diff --git a/src/vs/editor/test/common/standalone/standaloneBase.test.ts b/src/vs/editor/test/common/standalone/standaloneBase.test.ts index c26df8b28e6..64849eb80cb 100644 --- a/src/vs/editor/test/common/standalone/standaloneBase.test.ts +++ b/src/vs/editor/test/common/standalone/standaloneBase.test.ts @@ -135,6 +135,8 @@ suite('KeyCode', () => { assertKeyCode(StandaloneKeyCode.NUMPAD_DECIMAL, RuntimeKeyCode.NUMPAD_DECIMAL); assertKeyCode(StandaloneKeyCode.NUMPAD_DIVIDE, RuntimeKeyCode.NUMPAD_DIVIDE); assertKeyCode(StandaloneKeyCode.KEY_IN_COMPOSITION, RuntimeKeyCode.KEY_IN_COMPOSITION); + assertKeyCode(StandaloneKeyCode.ABNT_C1, RuntimeKeyCode.ABNT_C1); + assertKeyCode(StandaloneKeyCode.ABNT_C2, RuntimeKeyCode.ABNT_C2); assertKeyCode(StandaloneKeyCode.MAX_VALUE, RuntimeKeyCode.MAX_VALUE); }); }); diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index d846cf7556b..4b12abd41b6 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -357,11 +357,13 @@ declare module monaco { * Cover all key codes when IME is processing input. */ KEY_IN_COMPOSITION = 109, + ABNT_C1 = 110, + ABNT_C2 = 111, /** * Placed last to cover the length of the enum. * Please do not depend on this value! */ - MAX_VALUE = 110, + MAX_VALUE = 112, } export class KeyMod { diff --git a/src/vs/platform/keybinding/common/keybindingsRegistry.ts b/src/vs/platform/keybinding/common/keybindingsRegistry.ts index 91440e9307f..46bdac8acc9 100644 --- a/src/vs/platform/keybinding/common/keybindingsRegistry.ts +++ b/src/vs/platform/keybinding/common/keybindingsRegistry.ts @@ -180,6 +180,8 @@ class KeybindingsRegistryImpl implements IKeybindingsRegistry { || keyCode === KeyCode.US_DOT || keyCode === KeyCode.US_SLASH || keyCode === KeyCode.US_BACKTICK + || keyCode === KeyCode.ABNT_C1 + || keyCode === KeyCode.ABNT_C2 || keyCode === KeyCode.US_OPEN_SQUARE_BRACKET || keyCode === KeyCode.US_BACKSLASH || keyCode === KeyCode.US_CLOSE_SQUARE_BRACKET diff --git a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts index a6e058cb850..80074140439 100644 --- a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts @@ -301,11 +301,21 @@ export class WindowsKeyboardMapper implements IKeyboardMapper { log(`Unknown scanCode ${strCode} in mapping.`); continue; } - if (IMMUTABLE_CODE_TO_KEY_CODE[scanCode] !== -1) { - continue; + const rawMapping = rawMappings[strCode]; + + const immutableKeyCode = IMMUTABLE_CODE_TO_KEY_CODE[scanCode]; + if (immutableKeyCode !== -1) { + const keyCode = NATIVE_KEY_CODE_TO_KEY_CODE[rawMapping.vkey] || KeyCode.Unknown; + if (keyCode === KeyCode.Unknown || immutableKeyCode === keyCode) { + continue; + } + if (scanCode !== ScanCode.NumpadComma) { + // Looks like ScanCode.NumpadComma doesn't always map to KeyCode.NUMPAD_SEPARATOR + // e.g. on POR - PTB + continue; + } } - const rawMapping = rawMappings[strCode]; const value = rawMapping.value; const withShift = rawMapping.withShift; const withAltGr = rawMapping.withAltGr; @@ -625,6 +635,8 @@ function _getNativeMap() { VK_OEM_PERIOD: KeyCode.US_DOT, VK_OEM_2: KeyCode.US_SLASH, VK_OEM_3: KeyCode.US_BACKTICK, + VK_ABNT_C1: KeyCode.ABNT_C1, + VK_ABNT_C2: KeyCode.ABNT_C2, VK_OEM_4: KeyCode.US_OPEN_SQUARE_BRACKET, VK_OEM_5: KeyCode.US_BACKSLASH, VK_OEM_6: KeyCode.US_CLOSE_SQUARE_BRACKET, diff --git a/src/vs/workbench/services/keybinding/test/keybindingIO.test.ts b/src/vs/workbench/services/keybinding/test/keybindingIO.test.ts index 2a9f0cb3f9c..c3fd1c5d78d 100644 --- a/src/vs/workbench/services/keybinding/test/keybindingIO.test.ts +++ b/src/vs/workbench/services/keybinding/test/keybindingIO.test.ts @@ -84,6 +84,8 @@ suite('keybindingIO', () => { testRoundtrip(KeyCode.US_DOT, '.', '.', '.'); testRoundtrip(KeyCode.US_SLASH, '/', '/', '/'); testRoundtrip(KeyCode.US_BACKTICK, '`', '`', '`'); + testRoundtrip(KeyCode.ABNT_C1, 'abnt_c1', 'abnt_c1', 'abnt_c1'); + testRoundtrip(KeyCode.ABNT_C2, 'abnt_c2', 'abnt_c2', 'abnt_c2'); testRoundtrip(KeyCode.US_OPEN_SQUARE_BRACKET, '[', '[', '['); testRoundtrip(KeyCode.US_BACKSLASH, '\\', '\\', '\\'); testRoundtrip(KeyCode.US_CLOSE_SQUARE_BRACKET, ']', ']', ']'); @@ -99,6 +101,8 @@ suite('keybindingIO', () => { testDeserialization('OEM_PERIOD', 'OEM_PERIOD', 'OEM_PERIOD', KeyCode.US_DOT); testDeserialization('OEM_2', 'OEM_2', 'OEM_2', KeyCode.US_SLASH); testDeserialization('OEM_3', 'OEM_3', 'OEM_3', KeyCode.US_BACKTICK); + testDeserialization('ABNT_C1', 'ABNT_C1', 'ABNT_C1', KeyCode.ABNT_C1); + testDeserialization('ABNT_C2', 'ABNT_C2', 'ABNT_C2', KeyCode.ABNT_C2); testDeserialization('OEM_4', 'OEM_4', 'OEM_4', KeyCode.US_OPEN_SQUARE_BRACKET); testDeserialization('OEM_5', 'OEM_5', 'OEM_5', KeyCode.US_BACKSLASH); testDeserialization('OEM_6', 'OEM_6', 'OEM_6', KeyCode.US_CLOSE_SQUARE_BRACKET); diff --git a/src/vs/workbench/services/keybinding/test/win_por_ptb.js b/src/vs/workbench/services/keybinding/test/win_por_ptb.js new file mode 100644 index 00000000000..683b2e24113 --- /dev/null +++ b/src/vs/workbench/services/keybinding/test/win_por_ptb.js @@ -0,0 +1,1093 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +define({ + Sleep: { + vkey: 'VK_SLEEP', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + WakeUp: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + KeyA: { + vkey: 'VK_A', + value: 'a', + withShift: 'A', + withAltGr: '', + withShiftAltGr: '' + }, + KeyB: { + vkey: 'VK_B', + value: 'b', + withShift: 'B', + withAltGr: '', + withShiftAltGr: '' + }, + KeyC: { + vkey: 'VK_C', + value: 'c', + withShift: 'C', + withAltGr: '₢', + withShiftAltGr: '' + }, + KeyD: { + vkey: 'VK_D', + value: 'd', + withShift: 'D', + withAltGr: '', + withShiftAltGr: '' + }, + KeyE: { + vkey: 'VK_E', + value: 'e', + withShift: 'E', + withAltGr: '°', + withShiftAltGr: '' + }, + KeyF: { + vkey: 'VK_F', + value: 'f', + withShift: 'F', + withAltGr: '', + withShiftAltGr: '' + }, + KeyG: { + vkey: 'VK_G', + value: 'g', + withShift: 'G', + withAltGr: '', + withShiftAltGr: '' + }, + KeyH: { + vkey: 'VK_H', + value: 'h', + withShift: 'H', + withAltGr: '', + withShiftAltGr: '' + }, + KeyI: { + vkey: 'VK_I', + value: 'i', + withShift: 'I', + withAltGr: '', + withShiftAltGr: '' + }, + KeyJ: { + vkey: 'VK_J', + value: 'j', + withShift: 'J', + withAltGr: '', + withShiftAltGr: '' + }, + KeyK: { + vkey: 'VK_K', + value: 'k', + withShift: 'K', + withAltGr: '', + withShiftAltGr: '' + }, + KeyL: { + vkey: 'VK_L', + value: 'l', + withShift: 'L', + withAltGr: '', + withShiftAltGr: '' + }, + KeyM: { + vkey: 'VK_M', + value: 'm', + withShift: 'M', + withAltGr: '', + withShiftAltGr: '' + }, + KeyN: { + vkey: 'VK_N', + value: 'n', + withShift: 'N', + withAltGr: '', + withShiftAltGr: '' + }, + KeyO: { + vkey: 'VK_O', + value: 'o', + withShift: 'O', + withAltGr: '', + withShiftAltGr: '' + }, + KeyP: { + vkey: 'VK_P', + value: 'p', + withShift: 'P', + withAltGr: '', + withShiftAltGr: '' + }, + KeyQ: { + vkey: 'VK_Q', + value: 'q', + withShift: 'Q', + withAltGr: '/', + withShiftAltGr: '' + }, + KeyR: { + vkey: 'VK_R', + value: 'r', + withShift: 'R', + withAltGr: '', + withShiftAltGr: '' + }, + KeyS: { + vkey: 'VK_S', + value: 's', + withShift: 'S', + withAltGr: '', + withShiftAltGr: '' + }, + KeyT: { + vkey: 'VK_T', + value: 't', + withShift: 'T', + withAltGr: '', + withShiftAltGr: '' + }, + KeyU: { + vkey: 'VK_U', + value: 'u', + withShift: 'U', + withAltGr: '', + withShiftAltGr: '' + }, + KeyV: { + vkey: 'VK_V', + value: 'v', + withShift: 'V', + withAltGr: '', + withShiftAltGr: '' + }, + KeyW: { + vkey: 'VK_W', + value: 'w', + withShift: 'W', + withAltGr: '?', + withShiftAltGr: '' + }, + KeyX: { + vkey: 'VK_X', + value: 'x', + withShift: 'X', + withAltGr: '', + withShiftAltGr: '' + }, + KeyY: { + vkey: 'VK_Y', + value: 'y', + withShift: 'Y', + withAltGr: '', + withShiftAltGr: '' + }, + KeyZ: { + vkey: 'VK_Z', + value: 'z', + withShift: 'Z', + withAltGr: '', + withShiftAltGr: '' + }, + Digit1: { + vkey: 'VK_1', + value: '1', + withShift: '!', + withAltGr: '¹', + withShiftAltGr: '' + }, + Digit2: { + vkey: 'VK_2', + value: '2', + withShift: '@', + withAltGr: '²', + withShiftAltGr: '' + }, + Digit3: { + vkey: 'VK_3', + value: '3', + withShift: '#', + withAltGr: '³', + withShiftAltGr: '' + }, + Digit4: { + vkey: 'VK_4', + value: '4', + withShift: '$', + withAltGr: '£', + withShiftAltGr: '' + }, + Digit5: { + vkey: 'VK_5', + value: '5', + withShift: '%', + withAltGr: '¢', + withShiftAltGr: '' + }, + Digit6: { + vkey: 'VK_6', + value: '6', + withShift: '¨', + withAltGr: '¬', + withShiftAltGr: '' + }, + Digit7: { + vkey: 'VK_7', + value: '7', + withShift: '&', + withAltGr: '', + withShiftAltGr: '' + }, + Digit8: { + vkey: 'VK_8', + value: '8', + withShift: '*', + withAltGr: '', + withShiftAltGr: '' + }, + Digit9: { + vkey: 'VK_9', + value: '9', + withShift: '(', + withAltGr: '', + withShiftAltGr: '' + }, + Digit0: { + vkey: 'VK_0', + value: '0', + withShift: ')', + withAltGr: '', + withShiftAltGr: '' + }, + Enter: { + vkey: 'VK_RETURN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Escape: { + vkey: 'VK_ESCAPE', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Backspace: { + vkey: 'VK_BACK', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Tab: { + vkey: 'VK_TAB', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Space: { + vkey: 'VK_SPACE', + value: ' ', + withShift: ' ', + withAltGr: '', + withShiftAltGr: '' + }, + Minus: { + vkey: 'VK_OEM_MINUS', + value: '-', + withShift: '_', + withAltGr: '', + withShiftAltGr: '' + }, + Equal: { + vkey: 'VK_OEM_PLUS', + value: '=', + withShift: '+', + withAltGr: '§', + withShiftAltGr: '' + }, + BracketLeft: { + vkey: 'VK_OEM_4', + value: '´', + withShift: '`', + withAltGr: '', + withShiftAltGr: '' + }, + BracketRight: { + vkey: 'VK_OEM_6', + value: '[', + withShift: '{', + withAltGr: 'ª', + withShiftAltGr: '' + }, + Backslash: { + vkey: 'VK_OEM_5', + value: ']', + withShift: '}', + withAltGr: 'º', + withShiftAltGr: '' + }, + Semicolon: { + vkey: 'VK_OEM_1', + value: 'ç', + withShift: 'Ç', + withAltGr: '', + withShiftAltGr: '' + }, + Quote: { + vkey: 'VK_OEM_7', + value: '~', + withShift: '^', + withAltGr: '', + withShiftAltGr: '' + }, + Backquote: { + vkey: 'VK_OEM_3', + value: '\'', + withShift: '"', + withAltGr: '', + withShiftAltGr: '' + }, + Comma: { + vkey: 'VK_OEM_COMMA', + value: ',', + withShift: '<', + withAltGr: '', + withShiftAltGr: '' + }, + Period: { + vkey: 'VK_OEM_PERIOD', + value: '.', + withShift: '>', + withAltGr: '', + withShiftAltGr: '' + }, + Slash: { + vkey: 'VK_OEM_2', + value: ';', + withShift: ':', + withAltGr: '', + withShiftAltGr: '' + }, + CapsLock: { + vkey: 'VK_CAPITAL', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F1: { + vkey: 'VK_F1', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F2: { + vkey: 'VK_F2', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F3: { + vkey: 'VK_F3', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F4: { + vkey: 'VK_F4', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F5: { + vkey: 'VK_F5', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F6: { + vkey: 'VK_F6', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F7: { + vkey: 'VK_F7', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F8: { + vkey: 'VK_F8', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F9: { + vkey: 'VK_F9', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F10: { + vkey: 'VK_F10', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F11: { + vkey: 'VK_F11', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F12: { + vkey: 'VK_F12', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + PrintScreen: { + vkey: 'VK_SNAPSHOT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ScrollLock: { + vkey: 'VK_SCROLL', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Pause: { + vkey: 'VK_NUMLOCK', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Insert: { + vkey: 'VK_INSERT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Home: { + vkey: 'VK_HOME', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + PageUp: { + vkey: 'VK_PRIOR', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Delete: { + vkey: 'VK_DELETE', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + End: { + vkey: 'VK_END', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + PageDown: { + vkey: 'VK_NEXT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowRight: { + vkey: 'VK_RIGHT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowLeft: { + vkey: 'VK_LEFT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowDown: { + vkey: 'VK_DOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowUp: { + vkey: 'VK_UP', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumLock: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadDivide: { + vkey: 'VK_DIVIDE', + value: '/', + withShift: '/', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadMultiply: { + vkey: 'VK_MULTIPLY', + value: '*', + withShift: '*', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadSubtract: { + vkey: 'VK_SUBTRACT', + value: '-', + withShift: '-', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadAdd: { + vkey: 'VK_ADD', + value: '+', + withShift: '+', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadEnter: { + vkey: 'VK_RETURN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad1: { + vkey: 'VK_END', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad2: { + vkey: 'VK_DOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad3: { + vkey: 'VK_NEXT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad4: { + vkey: 'VK_LEFT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad5: { + vkey: 'VK_CLEAR', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad6: { + vkey: 'VK_RIGHT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad7: { + vkey: 'VK_HOME', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad8: { + vkey: 'VK_UP', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad9: { + vkey: 'VK_PRIOR', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad0: { + vkey: 'VK_INSERT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadDecimal: { + vkey: 'VK_DELETE', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + IntlBackslash: { + vkey: 'VK_OEM_102', + value: '\\', + withShift: '|', + withAltGr: '', + withShiftAltGr: '' + }, + ContextMenu: { + vkey: 'VK_APPS', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Power: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadEqual: { + vkey: 'VK_CLEAR', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F13: { + vkey: 'VK_F13', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F14: { + vkey: 'VK_F14', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F15: { + vkey: 'VK_F15', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F16: { + vkey: 'VK_F16', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F17: { + vkey: 'VK_F17', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F18: { + vkey: 'VK_F18', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F19: { + vkey: 'VK_F19', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F20: { + vkey: 'VK_F20', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F21: { + vkey: 'VK_F21', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F22: { + vkey: 'VK_F22', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F23: { + vkey: 'VK_F23', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F24: { + vkey: 'VK_F24', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Help: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Undo: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Cut: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Copy: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Paste: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AudioVolumeMute: { + vkey: 'VK_VOLUME_MUTE', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AudioVolumeUp: { + vkey: 'VK_VOLUME_UP', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AudioVolumeDown: { + vkey: 'VK_VOLUME_DOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadComma: { + vkey: 'VK_ABNT_C2', + value: '.', + withShift: '.', + withAltGr: '', + withShiftAltGr: '' + }, + IntlRo: { + vkey: 'VK_ABNT_C1', + value: '/', + withShift: '?', + withAltGr: '°', + withShiftAltGr: '' + }, + KanaMode: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + IntlYen: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Convert: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NonConvert: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang1: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang2: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang3: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang4: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ControlLeft: { + vkey: 'VK_CONTROL', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ShiftLeft: { + vkey: 'VK_SHIFT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AltLeft: { + vkey: 'VK_MENU', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MetaLeft: { + vkey: 'VK_LWIN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ControlRight: { + vkey: 'VK_CONTROL', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ShiftRight: { + vkey: 'VK_SHIFT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AltRight: { + vkey: 'VK_MENU', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MetaRight: { + vkey: 'VK_RWIN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaTrackNext: { + vkey: 'VK_MEDIA_NEXT_TRACK', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaTrackPrevious: { + vkey: 'VK_MEDIA_PREV_TRACK', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaStop: { + vkey: 'VK_MEDIA_STOP', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Eject: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaPlayPause: { + vkey: 'VK_MEDIA_PLAY_PAUSE', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaSelect: { + vkey: 'VK_LAUNCH_MEDIA_SELECT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + LaunchMail: { + vkey: 'VK_LAUNCH_MAIL', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + LaunchApp2: { + vkey: 'VK_LAUNCH_APP2', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + LaunchApp1: { + vkey: 'VK_LAUNCH_APP1', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserSearch: { + vkey: 'VK_BROWSER_SEARCH', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserHome: { + vkey: 'VK_BROWSER_HOME', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserBack: { + vkey: 'VK_BROWSER_BACK', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserForward: { + vkey: 'VK_BROWSER_FORWARD', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserStop: { + vkey: 'VK_BROWSER_STOP', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserRefresh: { + vkey: 'VK_BROWSER_REFRESH', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserFavorites: { + vkey: 'VK_BROWSER_FAVORITES', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + } +}); \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/test/win_por_ptb.txt b/src/vs/workbench/services/keybinding/test/win_por_ptb.txt new file mode 100644 index 00000000000..1a6f16fcbdc --- /dev/null +++ b/src/vs/workbench/services/keybinding/test/win_por_ptb.txt @@ -0,0 +1,284 @@ +------------------------------------------------------------------------------------------------------------ +| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | +------------------------------------------------------------------------------------------------------------ +| KeyA | a | A | A | | +| Shift+KeyA | A | Shift+A | Shift+A | | +| Ctrl+Alt+KeyA | --- | Ctrl+Alt+A | Ctrl+Alt+A | | +| Ctrl+Shift+Alt+KeyA | --- | Ctrl+Shift+Alt+A | Ctrl+Shift+Alt+A | | +------------------------------------------------------------------------------------------------------------ +| KeyB | b | B | B | | +| Shift+KeyB | B | Shift+B | Shift+B | | +| Ctrl+Alt+KeyB | --- | Ctrl+Alt+B | Ctrl+Alt+B | | +| Ctrl+Shift+Alt+KeyB | --- | Ctrl+Shift+Alt+B | Ctrl+Shift+Alt+B | | +------------------------------------------------------------------------------------------------------------ +| KeyC | c | C | C | | +| Shift+KeyC | C | Shift+C | Shift+C | | +| Ctrl+Alt+KeyC | ₢ | Ctrl+Alt+C | Ctrl+Alt+C | | +| Ctrl+Shift+Alt+KeyC | --- | Ctrl+Shift+Alt+C | Ctrl+Shift+Alt+C | | +------------------------------------------------------------------------------------------------------------ +| KeyD | d | D | D | | +| Shift+KeyD | D | Shift+D | Shift+D | | +| Ctrl+Alt+KeyD | --- | Ctrl+Alt+D | Ctrl+Alt+D | | +| Ctrl+Shift+Alt+KeyD | --- | Ctrl+Shift+Alt+D | Ctrl+Shift+Alt+D | | +------------------------------------------------------------------------------------------------------------ +| KeyE | e | E | E | | +| Shift+KeyE | E | Shift+E | Shift+E | | +| Ctrl+Alt+KeyE | ° | Ctrl+Alt+E | Ctrl+Alt+E | | +| Ctrl+Shift+Alt+KeyE | --- | Ctrl+Shift+Alt+E | Ctrl+Shift+Alt+E | | +------------------------------------------------------------------------------------------------------------ +| KeyF | f | F | F | | +| Shift+KeyF | F | Shift+F | Shift+F | | +| Ctrl+Alt+KeyF | --- | Ctrl+Alt+F | Ctrl+Alt+F | | +| Ctrl+Shift+Alt+KeyF | --- | Ctrl+Shift+Alt+F | Ctrl+Shift+Alt+F | | +------------------------------------------------------------------------------------------------------------ +| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | +------------------------------------------------------------------------------------------------------------ +| KeyG | g | G | G | | +| Shift+KeyG | G | Shift+G | Shift+G | | +| Ctrl+Alt+KeyG | --- | Ctrl+Alt+G | Ctrl+Alt+G | | +| Ctrl+Shift+Alt+KeyG | --- | Ctrl+Shift+Alt+G | Ctrl+Shift+Alt+G | | +------------------------------------------------------------------------------------------------------------ +| KeyH | h | H | H | | +| Shift+KeyH | H | Shift+H | Shift+H | | +| Ctrl+Alt+KeyH | --- | Ctrl+Alt+H | Ctrl+Alt+H | | +| Ctrl+Shift+Alt+KeyH | --- | Ctrl+Shift+Alt+H | Ctrl+Shift+Alt+H | | +------------------------------------------------------------------------------------------------------------ +| KeyI | i | I | I | | +| Shift+KeyI | I | Shift+I | Shift+I | | +| Ctrl+Alt+KeyI | --- | Ctrl+Alt+I | Ctrl+Alt+I | | +| Ctrl+Shift+Alt+KeyI | --- | Ctrl+Shift+Alt+I | Ctrl+Shift+Alt+I | | +------------------------------------------------------------------------------------------------------------ +| KeyJ | j | J | J | | +| Shift+KeyJ | J | Shift+J | Shift+J | | +| Ctrl+Alt+KeyJ | --- | Ctrl+Alt+J | Ctrl+Alt+J | | +| Ctrl+Shift+Alt+KeyJ | --- | Ctrl+Shift+Alt+J | Ctrl+Shift+Alt+J | | +------------------------------------------------------------------------------------------------------------ +| KeyK | k | K | K | | +| Shift+KeyK | K | Shift+K | Shift+K | | +| Ctrl+Alt+KeyK | --- | Ctrl+Alt+K | Ctrl+Alt+K | | +| Ctrl+Shift+Alt+KeyK | --- | Ctrl+Shift+Alt+K | Ctrl+Shift+Alt+K | | +------------------------------------------------------------------------------------------------------------ +| KeyL | l | L | L | | +| Shift+KeyL | L | Shift+L | Shift+L | | +| Ctrl+Alt+KeyL | --- | Ctrl+Alt+L | Ctrl+Alt+L | | +| Ctrl+Shift+Alt+KeyL | --- | Ctrl+Shift+Alt+L | Ctrl+Shift+Alt+L | | +------------------------------------------------------------------------------------------------------------ +| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | +------------------------------------------------------------------------------------------------------------ +| KeyM | m | M | M | | +| Shift+KeyM | M | Shift+M | Shift+M | | +| Ctrl+Alt+KeyM | --- | Ctrl+Alt+M | Ctrl+Alt+M | | +| Ctrl+Shift+Alt+KeyM | --- | Ctrl+Shift+Alt+M | Ctrl+Shift+Alt+M | | +------------------------------------------------------------------------------------------------------------ +| KeyN | n | N | N | | +| Shift+KeyN | N | Shift+N | Shift+N | | +| Ctrl+Alt+KeyN | --- | Ctrl+Alt+N | Ctrl+Alt+N | | +| Ctrl+Shift+Alt+KeyN | --- | Ctrl+Shift+Alt+N | Ctrl+Shift+Alt+N | | +------------------------------------------------------------------------------------------------------------ +| KeyO | o | O | O | | +| Shift+KeyO | O | Shift+O | Shift+O | | +| Ctrl+Alt+KeyO | --- | Ctrl+Alt+O | Ctrl+Alt+O | | +| Ctrl+Shift+Alt+KeyO | --- | Ctrl+Shift+Alt+O | Ctrl+Shift+Alt+O | | +------------------------------------------------------------------------------------------------------------ +| KeyP | p | P | P | | +| Shift+KeyP | P | Shift+P | Shift+P | | +| Ctrl+Alt+KeyP | --- | Ctrl+Alt+P | Ctrl+Alt+P | | +| Ctrl+Shift+Alt+KeyP | --- | Ctrl+Shift+Alt+P | Ctrl+Shift+Alt+P | | +------------------------------------------------------------------------------------------------------------ +| KeyQ | q | Q | Q | | +| Shift+KeyQ | Q | Shift+Q | Shift+Q | | +| Ctrl+Alt+KeyQ | / | Ctrl+Alt+Q | Ctrl+Alt+Q | | +| Ctrl+Shift+Alt+KeyQ | --- | Ctrl+Shift+Alt+Q | Ctrl+Shift+Alt+Q | | +------------------------------------------------------------------------------------------------------------ +| KeyR | r | R | R | | +| Shift+KeyR | R | Shift+R | Shift+R | | +| Ctrl+Alt+KeyR | --- | Ctrl+Alt+R | Ctrl+Alt+R | | +| Ctrl+Shift+Alt+KeyR | --- | Ctrl+Shift+Alt+R | Ctrl+Shift+Alt+R | | +------------------------------------------------------------------------------------------------------------ +| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | +------------------------------------------------------------------------------------------------------------ +| KeyS | s | S | S | | +| Shift+KeyS | S | Shift+S | Shift+S | | +| Ctrl+Alt+KeyS | --- | Ctrl+Alt+S | Ctrl+Alt+S | | +| Ctrl+Shift+Alt+KeyS | --- | Ctrl+Shift+Alt+S | Ctrl+Shift+Alt+S | | +------------------------------------------------------------------------------------------------------------ +| KeyT | t | T | T | | +| Shift+KeyT | T | Shift+T | Shift+T | | +| Ctrl+Alt+KeyT | --- | Ctrl+Alt+T | Ctrl+Alt+T | | +| Ctrl+Shift+Alt+KeyT | --- | Ctrl+Shift+Alt+T | Ctrl+Shift+Alt+T | | +------------------------------------------------------------------------------------------------------------ +| KeyU | u | U | U | | +| Shift+KeyU | U | Shift+U | Shift+U | | +| Ctrl+Alt+KeyU | --- | Ctrl+Alt+U | Ctrl+Alt+U | | +| Ctrl+Shift+Alt+KeyU | --- | Ctrl+Shift+Alt+U | Ctrl+Shift+Alt+U | | +------------------------------------------------------------------------------------------------------------ +| KeyV | v | V | V | | +| Shift+KeyV | V | Shift+V | Shift+V | | +| Ctrl+Alt+KeyV | --- | Ctrl+Alt+V | Ctrl+Alt+V | | +| Ctrl+Shift+Alt+KeyV | --- | Ctrl+Shift+Alt+V | Ctrl+Shift+Alt+V | | +------------------------------------------------------------------------------------------------------------ +| KeyW | w | W | W | | +| Shift+KeyW | W | Shift+W | Shift+W | | +| Ctrl+Alt+KeyW | ? | Ctrl+Alt+W | Ctrl+Alt+W | | +| Ctrl+Shift+Alt+KeyW | --- | Ctrl+Shift+Alt+W | Ctrl+Shift+Alt+W | | +------------------------------------------------------------------------------------------------------------ +| KeyX | x | X | X | | +| Shift+KeyX | X | Shift+X | Shift+X | | +| Ctrl+Alt+KeyX | --- | Ctrl+Alt+X | Ctrl+Alt+X | | +| Ctrl+Shift+Alt+KeyX | --- | Ctrl+Shift+Alt+X | Ctrl+Shift+Alt+X | | +------------------------------------------------------------------------------------------------------------ +| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | +------------------------------------------------------------------------------------------------------------ +| KeyY | y | Y | Y | | +| Shift+KeyY | Y | Shift+Y | Shift+Y | | +| Ctrl+Alt+KeyY | --- | Ctrl+Alt+Y | Ctrl+Alt+Y | | +| Ctrl+Shift+Alt+KeyY | --- | Ctrl+Shift+Alt+Y | Ctrl+Shift+Alt+Y | | +------------------------------------------------------------------------------------------------------------ +| KeyZ | z | Z | Z | | +| Shift+KeyZ | Z | Shift+Z | Shift+Z | | +| Ctrl+Alt+KeyZ | --- | Ctrl+Alt+Z | Ctrl+Alt+Z | | +| Ctrl+Shift+Alt+KeyZ | --- | Ctrl+Shift+Alt+Z | Ctrl+Shift+Alt+Z | | +------------------------------------------------------------------------------------------------------------ +| Digit1 | 1 | 1 | 1 | | +| Shift+Digit1 | ! | Shift+1 | Shift+1 | | +| Ctrl+Alt+Digit1 | ¹ | Ctrl+Alt+1 | Ctrl+Alt+1 | | +| Ctrl+Shift+Alt+Digit1 | --- | Ctrl+Shift+Alt+1 | Ctrl+Shift+Alt+1 | | +------------------------------------------------------------------------------------------------------------ +| Digit2 | 2 | 2 | 2 | | +| Shift+Digit2 | @ | Shift+2 | Shift+2 | | +| Ctrl+Alt+Digit2 | ² | Ctrl+Alt+2 | Ctrl+Alt+2 | | +| Ctrl+Shift+Alt+Digit2 | --- | Ctrl+Shift+Alt+2 | Ctrl+Shift+Alt+2 | | +------------------------------------------------------------------------------------------------------------ +| Digit3 | 3 | 3 | 3 | | +| Shift+Digit3 | # | Shift+3 | Shift+3 | | +| Ctrl+Alt+Digit3 | ³ | Ctrl+Alt+3 | Ctrl+Alt+3 | | +| Ctrl+Shift+Alt+Digit3 | --- | Ctrl+Shift+Alt+3 | Ctrl+Shift+Alt+3 | | +------------------------------------------------------------------------------------------------------------ +| Digit4 | 4 | 4 | 4 | | +| Shift+Digit4 | $ | Shift+4 | Shift+4 | | +| Ctrl+Alt+Digit4 | £ | Ctrl+Alt+4 | Ctrl+Alt+4 | | +| Ctrl+Shift+Alt+Digit4 | --- | Ctrl+Shift+Alt+4 | Ctrl+Shift+Alt+4 | | +------------------------------------------------------------------------------------------------------------ +| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | +------------------------------------------------------------------------------------------------------------ +| Digit5 | 5 | 5 | 5 | | +| Shift+Digit5 | % | Shift+5 | Shift+5 | | +| Ctrl+Alt+Digit5 | ¢ | Ctrl+Alt+5 | Ctrl+Alt+5 | | +| Ctrl+Shift+Alt+Digit5 | --- | Ctrl+Shift+Alt+5 | Ctrl+Shift+Alt+5 | | +------------------------------------------------------------------------------------------------------------ +| Digit6 | 6 | 6 | 6 | | +| Shift+Digit6 | ¨ | Shift+6 | Shift+6 | | +| Ctrl+Alt+Digit6 | ¬ | Ctrl+Alt+6 | Ctrl+Alt+6 | | +| Ctrl+Shift+Alt+Digit6 | --- | Ctrl+Shift+Alt+6 | Ctrl+Shift+Alt+6 | | +------------------------------------------------------------------------------------------------------------ +| Digit7 | 7 | 7 | 7 | | +| Shift+Digit7 | & | Shift+7 | Shift+7 | | +| Ctrl+Alt+Digit7 | --- | Ctrl+Alt+7 | Ctrl+Alt+7 | | +| Ctrl+Shift+Alt+Digit7 | --- | Ctrl+Shift+Alt+7 | Ctrl+Shift+Alt+7 | | +------------------------------------------------------------------------------------------------------------ +| Digit8 | 8 | 8 | 8 | | +| Shift+Digit8 | * | Shift+8 | Shift+8 | | +| Ctrl+Alt+Digit8 | --- | Ctrl+Alt+8 | Ctrl+Alt+8 | | +| Ctrl+Shift+Alt+Digit8 | --- | Ctrl+Shift+Alt+8 | Ctrl+Shift+Alt+8 | | +------------------------------------------------------------------------------------------------------------ +| Digit9 | 9 | 9 | 9 | | +| Shift+Digit9 | ( | Shift+9 | Shift+9 | | +| Ctrl+Alt+Digit9 | --- | Ctrl+Alt+9 | Ctrl+Alt+9 | | +| Ctrl+Shift+Alt+Digit9 | --- | Ctrl+Shift+Alt+9 | Ctrl+Shift+Alt+9 | | +------------------------------------------------------------------------------------------------------------ +| Digit0 | 0 | 0 | 0 | | +| Shift+Digit0 | ) | Shift+0 | Shift+0 | | +| Ctrl+Alt+Digit0 | --- | Ctrl+Alt+0 | Ctrl+Alt+0 | | +| Ctrl+Shift+Alt+Digit0 | --- | Ctrl+Shift+Alt+0 | Ctrl+Shift+Alt+0 | | +------------------------------------------------------------------------------------------------------------ +| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | +------------------------------------------------------------------------------------------------------------ +| Minus | - | - | - | | +| Shift+Minus | _ | Shift+- | Shift+- | | +| Ctrl+Alt+Minus | --- | Ctrl+Alt+- | Ctrl+Alt+- | | +| Ctrl+Shift+Alt+Minus | --- | Ctrl+Shift+Alt+- | Ctrl+Shift+Alt+- | | +------------------------------------------------------------------------------------------------------------ +| Equal | = | = | = | | +| Shift+Equal | + | Shift+= | Shift+= | | +| Ctrl+Alt+Equal | § | Ctrl+Alt+= | Ctrl+Alt+= | | +| Ctrl+Shift+Alt+Equal | --- | Ctrl+Shift+Alt+= | Ctrl+Shift+Alt+= | | +------------------------------------------------------------------------------------------------------------ +| BracketLeft | ´ | [ | ´ | NO | +| Shift+BracketLeft | ` | Shift+[ | Shift+´ | NO | +| Ctrl+Alt+BracketLeft | --- | Ctrl+Alt+[ | Ctrl+Alt+´ | NO | +| Ctrl+Shift+Alt+BracketLeft | --- | Ctrl+Shift+Alt+[ | Ctrl+Shift+Alt+´ | NO | +------------------------------------------------------------------------------------------------------------ +| BracketRight | [ | ] | [ | NO | +| Shift+BracketRight | { | Shift+] | Shift+[ | NO | +| Ctrl+Alt+BracketRight | ª | Ctrl+Alt+] | Ctrl+Alt+[ | NO | +| Ctrl+Shift+Alt+BracketRight | --- | Ctrl+Shift+Alt+] | Ctrl+Shift+Alt+[ | NO | +------------------------------------------------------------------------------------------------------------ +| Backslash | ] | \ | ] | NO | +| Shift+Backslash | } | Shift+\ | Shift+] | NO | +| Ctrl+Alt+Backslash | º | Ctrl+Alt+\ | Ctrl+Alt+] | NO | +| Ctrl+Shift+Alt+Backslash | --- | Ctrl+Shift+Alt+\ | Ctrl+Shift+Alt+] | NO | +------------------------------------------------------------------------------------------------------------ +| IntlHash | --- | null | null | NO | +| Shift+IntlHash | --- | null | null | NO | +| Ctrl+Alt+IntlHash | --- | null | null | NO | +| Ctrl+Shift+Alt+IntlHash | --- | null | null | NO | +------------------------------------------------------------------------------------------------------------ +| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | +------------------------------------------------------------------------------------------------------------ +| Semicolon | ç | ; | ç | NO | +| Shift+Semicolon | Ç | Shift+; | Shift+ç | NO | +| Ctrl+Alt+Semicolon | --- | Ctrl+Alt+; | Ctrl+Alt+ç | NO | +| Ctrl+Shift+Alt+Semicolon | --- | Ctrl+Shift+Alt+; | Ctrl+Shift+Alt+ç | NO | +------------------------------------------------------------------------------------------------------------ +| Quote | ~ | ' | ~ | NO | +| Shift+Quote | ^ | Shift+' | Shift+~ | NO | +| Ctrl+Alt+Quote | --- | Ctrl+Alt+' | Ctrl+Alt+~ | NO | +| Ctrl+Shift+Alt+Quote | --- | Ctrl+Shift+Alt+' | Ctrl+Shift+Alt+~ | NO | +------------------------------------------------------------------------------------------------------------ +| Backquote | ' | ` | ' | NO | +| Shift+Backquote | " | Shift+` | Shift+' | NO | +| Ctrl+Alt+Backquote | --- | Ctrl+Alt+` | Ctrl+Alt+' | NO | +| Ctrl+Shift+Alt+Backquote | --- | Ctrl+Shift+Alt+` | Ctrl+Shift+Alt+' | NO | +------------------------------------------------------------------------------------------------------------ +| Comma | , | , | , | | +| Shift+Comma | < | Shift+, | Shift+, | | +| Ctrl+Alt+Comma | --- | Ctrl+Alt+, | Ctrl+Alt+, | | +| Ctrl+Shift+Alt+Comma | --- | Ctrl+Shift+Alt+, | Ctrl+Shift+Alt+, | | +------------------------------------------------------------------------------------------------------------ +| Period | . | . | . | | +| Shift+Period | > | Shift+. | Shift+. | | +| Ctrl+Alt+Period | --- | Ctrl+Alt+. | Ctrl+Alt+. | | +| Ctrl+Shift+Alt+Period | --- | Ctrl+Shift+Alt+. | Ctrl+Shift+Alt+. | | +------------------------------------------------------------------------------------------------------------ +| Slash | ; | / | ; | NO | +| Shift+Slash | : | Shift+/ | Shift+; | NO | +| Ctrl+Alt+Slash | --- | Ctrl+Alt+/ | Ctrl+Alt+; | NO | +| Ctrl+Shift+Alt+Slash | --- | Ctrl+Shift+Alt+/ | Ctrl+Shift+Alt+; | NO | +------------------------------------------------------------------------------------------------------------ +| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | +------------------------------------------------------------------------------------------------------------ +| ArrowUp | --- | UpArrow | UpArrow | | +| Shift+ArrowUp | --- | Shift+UpArrow | Shift+UpArrow | | +| Ctrl+Alt+ArrowUp | --- | Ctrl+Alt+UpArrow | Ctrl+Alt+UpArrow | | +| Ctrl+Shift+Alt+ArrowUp | --- | Ctrl+Shift+Alt+UpArrow | Ctrl+Shift+Alt+UpArrow | | +------------------------------------------------------------------------------------------------------------ +| Numpad0 | --- | NumPad0 | NumPad0 | | +| Shift+Numpad0 | --- | Shift+NumPad0 | Shift+NumPad0 | | +| Ctrl+Alt+Numpad0 | --- | Ctrl+Alt+NumPad0 | Ctrl+Alt+NumPad0 | | +| Ctrl+Shift+Alt+Numpad0 | --- | Ctrl+Shift+Alt+NumPad0 | Ctrl+Shift+Alt+NumPad0 | | +------------------------------------------------------------------------------------------------------------ +| IntlBackslash | \ | OEM_102 | \ | NO | +| Shift+IntlBackslash | | | Shift+OEM_102 | Shift+\ | NO | +| Ctrl+Alt+IntlBackslash | --- | Ctrl+Alt+OEM_102 | Ctrl+Alt+\ | NO | +| Ctrl+Shift+Alt+IntlBackslash | --- | Ctrl+Shift+Alt+OEM_102 | Ctrl+Shift+Alt+\ | NO | +------------------------------------------------------------------------------------------------------------ +| IntlRo | / | ABNT_C1 | / | NO | +| Shift+IntlRo | ? | Shift+ABNT_C1 | Shift+/ | NO | +| Ctrl+Alt+IntlRo | ° | Ctrl+Alt+ABNT_C1 | Ctrl+Alt+/ | NO | +| Ctrl+Shift+Alt+IntlRo | --- | Ctrl+Shift+Alt+ABNT_C1 | Ctrl+Shift+Alt+/ | NO | +------------------------------------------------------------------------------------------------------------ +| IntlYen | --- | null | null | NO | +| Shift+IntlYen | --- | null | null | NO | +| Ctrl+Alt+IntlYen | --- | null | null | NO | +| Ctrl+Shift+Alt+IntlYen | --- | null | null | NO | +------------------------------------------------------------------------------------------------------------ \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts index a2ff068f70b..431bfd0a20b 100644 --- a/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts @@ -406,6 +406,69 @@ suite('keyboardMapper - WINDOWS en_us', () => { }); }); + +suite('keyboardMapper - WINDOWS por_ptb', () => { + + let mapper: WindowsKeyboardMapper; + + suiteSetup((done) => { + createKeyboardMapper('win_por_ptb').then((_mapper) => { + mapper = _mapper; + done(); + }, done); + }); + + test('mapping', (done) => { + assertMapping(WRITE_FILE_IF_DIFFERENT, mapper, 'win_por_ptb.txt', done); + }); + + test('resolveKeyboardEvent Ctrl+[IntlRo]', () => { + assertResolveKeyboardEvent( + mapper, + { + ctrlKey: true, + shiftKey: false, + altKey: false, + metaKey: false, + keyCode: KeyCode.ABNT_C1, + code: null + }, + { + label: 'Ctrl+/', + ariaLabel: 'Control+/', + electronAccelerator: 'Ctrl+ABNT_C1', + userSettingsLabel: 'ctrl+abnt_c1', + isWYSIWYG: false, + isChord: false, + dispatchParts: ['ctrl+ABNT_C1', null], + } + ); + }); + + test('resolveKeyboardEvent Ctrl+[NumpadComma]', () => { + assertResolveKeyboardEvent( + mapper, + { + ctrlKey: true, + shiftKey: false, + altKey: false, + metaKey: false, + keyCode: KeyCode.ABNT_C2, + code: null + }, + { + label: 'Ctrl+.', + ariaLabel: 'Control+.', + electronAccelerator: 'Ctrl+ABNT_C2', + userSettingsLabel: 'ctrl+abnt_c2', + isWYSIWYG: false, + isChord: false, + dispatchParts: ['ctrl+ABNT_C2', null], + } + ); + }); +}); + suite('misc', () => { test('issue #23513: Toggle Sidebar Visibility and Go to Line display same key mapping in Arabic keyboard', () => { const mapper = new WindowsKeyboardMapper({ From b9988fedd62373037585a558336efce70f6055cd Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 11 May 2017 11:28:12 +0200 Subject: [PATCH 0323/1164] Revert "fix #24435" This reverts commit f3ffc2ed9b0318f236201aa2c0447eec242f4738. --- src/vs/workbench/electron-browser/bootstrap/index.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/vs/workbench/electron-browser/bootstrap/index.js b/src/vs/workbench/electron-browser/bootstrap/index.js index e886c4a3469..bedcde4bd9d 100644 --- a/src/vs/workbench/electron-browser/bootstrap/index.js +++ b/src/vs/workbench/electron-browser/bootstrap/index.js @@ -20,12 +20,7 @@ const remote = electron.remote; const ipc = electron.ipcRenderer; process.lazyEnv = new Promise(function (resolve) { - const handle = setTimeout(function () { - resolve(); - console.warn('renderer did not receive lazyEnv in time') - }, 2000); ipc.once('vscode:acceptShellEnv', function (event, shellEnv) { - clearTimeout(handle); assign(process.env, shellEnv); resolve(process.env); }); From a5b701b99e8889ac5308ed2a58bb486c2915101b Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 11 May 2017 11:28:32 +0200 Subject: [PATCH 0324/1164] debug: decorate stackFrame ranges if provided fixes #8851 --- .../debug/browser/debugEditorModelManager.ts | 12 ++++++++++++ .../debug/browser/media/debug.contribution.css | 16 ++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts b/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts index c404debd95d..58912bfea85 100644 --- a/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts +++ b/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts @@ -144,6 +144,12 @@ export class DebugEditorModelManager implements IWorkbenchContribution { options: DebugEditorModelManager.TOP_STACK_FRAME_DECORATION, range: columnUntilEOLRange }); + if (stackFrame.range.endLineNumber && stackFrame.range.endColumn) { + result.push({ + options: { className: 'debug-top-stack-frame-range' }, + range: stackFrame.range + }); + } if (this.modelDataMap.has(modelUriStr)) { const modelData = this.modelDataMap.get(modelUriStr); @@ -161,6 +167,12 @@ export class DebugEditorModelManager implements IWorkbenchContribution { options: DebugEditorModelManager.FOCUSED_STACK_FRAME_MARGIN, range }); + if (stackFrame.range.endLineNumber && stackFrame.range.endColumn) { + result.push({ + options: { className: 'debug-focused-stack-frame-range' }, + range: stackFrame.range + }); + } result.push({ options: DebugEditorModelManager.FOCUSED_STACK_FRAME_DECORATION, diff --git a/src/vs/workbench/parts/debug/browser/media/debug.contribution.css b/src/vs/workbench/parts/debug/browser/media/debug.contribution.css index f66a4e2a48c..7c67f7d14b8 100644 --- a/src/vs/workbench/parts/debug/browser/media/debug.contribution.css +++ b/src/vs/workbench/parts/debug/browser/media/debug.contribution.css @@ -13,6 +13,10 @@ background: rgba(255, 255, 102, 0.45); } +.monaco-editor .debug-top-stack-frame-range { + background: #ffeca0; +} + .monaco-editor .debug-top-stack-frame-column::before { background: url('current-arrow.svg') center center no-repeat; } @@ -21,6 +25,10 @@ background: rgba(206, 231, 206, 0.45); } +.monaco-editor .debug-focused-stack-frame-range { + background: rgba(206, 231, 206, 1); +} + .monaco-editor .debug-breakpoint-hint-glyph { background: url('breakpoint-hint.svg') center center no-repeat; } @@ -177,11 +185,19 @@ background: rgba(122, 189, 122, 0.3); } +.monaco-editor.vs-dark .debug-focused-stack-frame-range { + background: rgba(122, 189, 122, 0.5); +} + .monaco-editor.vs-dark .debug-top-stack-frame-line, .monaco-editor.vs-dark .debug-top-stack-frame-exception-line { background-color: rgba(255, 255, 0, 0.2) } +.monaco-editor.vs-dark .debug-top-stack-frame-range { + background-color: rgba(255, 255, 0, 0.3) +} + .monaco-editor.vs-dark .debug-breakpoint-glyph, .monaco-editor.vs-dark .debug-breakpoint-column.debug-breakpoint-glyph-column::before { background: url('breakpoint-dark.svg') center center no-repeat; From 583b14b9afdf14216e42311d2888120925270b24 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 11 May 2017 12:10:15 +0200 Subject: [PATCH 0325/1164] [loc][query] what is "ellapsed" (fixes #26439) --- src/vs/workbench/electron-browser/shell.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 728af5751c1..dae76fa0ddd 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -280,7 +280,7 @@ export class WorkbenchShell { private handleNegativePerformanceNumbers(i: IInstantiationService, time: number): void { this.messageService.show(Severity.Warning, { - message: nls.localize('handleNegativePerformanceNumbers', "Something went wrong measuring startup performance numbers (ellapsed: {0}ms). We would like to learn more about this issue.", time), + message: `Something went wrong measuring startup performance numbers (ellapsed: ${time}ms). We would like to learn more about this issue.`, actions: [ i.createInstance(ReportPerformanceIssueAction, ReportPerformanceIssueAction.ID, ReportPerformanceIssueAction.LABEL), CloseAction From cdac53445d378bb5f116dbaef9026b103caef7f7 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 11 May 2017 12:10:45 +0200 Subject: [PATCH 0326/1164] Fixes #26446: Artificially expand the width of collapsed decorations --- .../browser/viewParts/decorations/decorations.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/browser/viewParts/decorations/decorations.ts b/src/vs/editor/browser/viewParts/decorations/decorations.ts index 19122062c67..30434c51b69 100644 --- a/src/vs/editor/browser/viewParts/decorations/decorations.ts +++ b/src/vs/editor/browser/viewParts/decorations/decorations.ts @@ -9,7 +9,7 @@ import 'vs/css!./decorations'; import { DynamicViewOverlay } from 'vs/editor/browser/view/dynamicViewOverlay'; import { Range } from 'vs/editor/common/core/range'; import { ViewContext } from 'vs/editor/common/view/viewContext'; -import { RenderingContext } from 'vs/editor/common/view/renderingContext'; +import { RenderingContext, HorizontalRange } from 'vs/editor/common/view/renderingContext'; import { ViewModelDecoration } from 'vs/editor/common/viewModel/viewModel'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; @@ -17,12 +17,14 @@ export class DecorationsOverlay extends DynamicViewOverlay { private _context: ViewContext; private _lineHeight: number; + private _typicalHalfwidthCharacterWidth: number; private _renderResult: string[]; constructor(context: ViewContext) { super(); this._context = context; this._lineHeight = this._context.configuration.editor.lineHeight; + this._typicalHalfwidthCharacterWidth = this._context.configuration.editor.fontInfo.typicalHalfwidthCharacterWidth; this._renderResult = null; this._context.addEventHandler(this); @@ -41,6 +43,9 @@ export class DecorationsOverlay extends DynamicViewOverlay { if (e.lineHeight) { this._lineHeight = this._context.configuration.editor.lineHeight; } + if (e.fontInfo) { + this._typicalHalfwidthCharacterWidth = this._context.configuration.editor.fontInfo.typicalHalfwidthCharacterWidth; + } return true; } public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean { @@ -154,6 +159,14 @@ export class DecorationsOverlay extends DynamicViewOverlay { continue; } + if (linesVisibleRanges.length === 1 && linesVisibleRanges[0].ranges.length === 1) { + const singleVisibleRange = linesVisibleRanges[0].ranges[0]; + if (singleVisibleRange.width === 0) { + // collapsed range case => make the decoration visible by faking its width + linesVisibleRanges[0].ranges[0] = new HorizontalRange(singleVisibleRange.left, this._typicalHalfwidthCharacterWidth); + } + } + for (let j = 0, lenJ = linesVisibleRanges.length; j < lenJ; j++) { let lineVisibleRanges = linesVisibleRanges[j]; let lineIndex = lineVisibleRanges.lineNumber - visibleStartLineNumber; From 635ace77e97d830f9cd2ad5b238ed6c3be18e151 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 11 May 2017 12:20:04 +0200 Subject: [PATCH 0327/1164] Add 'Command Palette...' action to the Editor Context Menu (fixes #26442) --- .../quickopen/browser/commandsHandler.ts | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts b/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts index babd5ed62e2..e127165fe58 100644 --- a/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts +++ b/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts @@ -20,14 +20,15 @@ import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actionRegistry'; import { Registry } from 'vs/platform/platform'; import { QuickOpenHandler, QuickOpenAction } from 'vs/workbench/browser/quickopen'; -import { IEditorAction, IEditor, isCommonCodeEditor } from 'vs/editor/common/editorCommon'; +import { IEditorAction, IEditor, isCommonCodeEditor, ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { matchesWords, matchesPrefix, matchesContiguousSubString, or } from 'vs/base/common/filters'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IMessageService, Severity, IMessageWithAction } from 'vs/platform/message/common/message'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; +import { editorAction, EditorAction } from "vs/editor/common/editorCommonExtensions"; export const ALL_COMMANDS_PREFIX = '>'; export const EDITOR_COMMANDS_PREFIX = '$'; @@ -44,6 +45,30 @@ export class ShowAllCommandsAction extends QuickOpenAction { } } +@editorAction +class CommandPaletteEditorAction extends EditorAction { + + constructor() { + super({ + id: 'workbench.action.showCommands', + label: nls.localize('showCommands.label', "Command Palette..."), + alias: 'Command Palette', + precondition: null, + menuOpts: { + } + }); + } + + public run(accessor: ServicesAccessor, editor: ICommonCodeEditor): TPromise { + const quickOpenService = accessor.get(IQuickOpenService); + + // Show with prefix + quickOpenService.show(ALL_COMMANDS_PREFIX); + + return TPromise.as(null); + } +} + class BaseCommandEntry extends QuickOpenEntryGroup { private keyLabel: string; private keyAriaLabel: string; @@ -405,4 +430,4 @@ export class EditorCommandsHandler extends CommandsHandler { protected includeWorkbenchCommands(): boolean { return false; } -} +} \ No newline at end of file From 46730f7463dd101ff6dbf7b9b14e1edf6ee202aa Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 11 May 2017 14:54:51 +0200 Subject: [PATCH 0328/1164] wire up new controller to keybindings contribution --- .../preferences/browser/keybindingsEditorContribution.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts b/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts index e95d1a48d82..7f73595d894 100644 --- a/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts +++ b/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts @@ -18,8 +18,7 @@ import * as editorCommon from 'vs/editor/common/editorCommon'; import { ServicesAccessor, registerEditorCommand } from 'vs/editor/common/editorCommonExtensions'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; -import { CodeSnippet } from 'vs/editor/contrib/snippet/common/snippet'; -import { SnippetController } from 'vs/editor/contrib/snippet/common/snippetController'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { SmartSnippetInserter } from 'vs/workbench/parts/preferences/common/smartSnippetInserter'; import { DefineKeybindingOverlayWidget } from 'vs/workbench/parts/preferences/browser/keybindingWidgets'; import { FloatingClickWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; @@ -131,7 +130,7 @@ export class KeybindingEditorRenderer extends Disposable { snippetText = smartInsertInfo.prepend + snippetText + smartInsertInfo.append; this._editor.setPosition(smartInsertInfo.position); - SnippetController.get(this._editor).run(CodeSnippet.fromTextmate(snippetText), 0, 0); + SnippetController2.get(this._editor).insert(snippetText, 0, 0); } } } @@ -339,4 +338,4 @@ function isInterestingEditorModel(editor: editorCommon.ICommonCodeEditor): boole return INTERESTING_FILE.test(url); } -registerEditorCommand(new DefineKeybindingCommand()); \ No newline at end of file +registerEditorCommand(new DefineKeybindingCommand()); From 36f3b136c28f927f86c63c1b919cece4601c58da Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 11 May 2017 15:36:19 +0200 Subject: [PATCH 0329/1164] rename -> editorSnippets -> snippetSession --- src/vs/editor/contrib/snippet/browser/snippetController2.ts | 2 +- .../snippet/browser/{editorSnippets.ts => snippetSession.ts} | 0 .../browser/{editorSnippets.test.ts => snippetSession.test.ts} | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename src/vs/editor/contrib/snippet/browser/{editorSnippets.ts => snippetSession.ts} (100%) rename src/vs/editor/contrib/snippet/test/browser/{editorSnippets.test.ts => snippetSession.test.ts} (99%) diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 39fbe409445..99cb214ba62 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -9,7 +9,7 @@ import { RawContextKey, IContextKey, IContextKeyService, ContextKeyExpr } from ' import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { commonEditorContribution, CommonEditorRegistry } from 'vs/editor/common/editorCommonExtensions'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; -import { SnippetSession } from './editorSnippets'; +import { SnippetSession } from './snippetSession'; import { EditorCommand } from 'vs/editor/common/config/config'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; diff --git a/src/vs/editor/contrib/snippet/browser/editorSnippets.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts similarity index 100% rename from src/vs/editor/contrib/snippet/browser/editorSnippets.ts rename to src/vs/editor/contrib/snippet/browser/snippetSession.ts diff --git a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts similarity index 99% rename from src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts rename to src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts index ecd3ede31c3..3d852975c68 100644 --- a/src/vs/editor/contrib/snippet/test/browser/editorSnippets.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts @@ -8,7 +8,7 @@ import * as assert from 'assert'; import { Selection } from 'vs/editor/common/core/selection'; import { Range } from 'vs/editor/common/core/range'; import { IPosition, Position } from 'vs/editor/common/core/position'; -import { SnippetSession } from 'vs/editor/contrib/snippet/browser/editorSnippets'; +import { SnippetSession } from 'vs/editor/contrib/snippet/browser/snippetSession'; import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { mockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; import { Model } from "vs/editor/common/model/model"; From 0db44440a15aa3384212d4bf8dfa9127972d5396 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 11 May 2017 15:57:59 +0200 Subject: [PATCH 0330/1164] update gulp atom electron --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a9b3c8288f8..53e66f176ec 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "flatpak-bundler": "^0.1.1", "glob": "^5.0.13", "gulp": "^3.8.9", - "gulp-atom-electron": "^1.9.0", + "gulp-atom-electron": "^1.11.0", "gulp-azure-storage": "^0.7.0", "gulp-bom": "^1.0.0", "gulp-buffer": "0.0.2", From 403d7841cce68560c50ce22ca202c96557857a98 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 11 May 2017 16:42:52 +0200 Subject: [PATCH 0331/1164] be a little stricter and leave snippet mode when cursor move out of placeholders --- .../snippet/browser/snippetController2.ts | 5 +- .../contrib/snippet/browser/snippetSession.ts | 59 +++++++++++-------- .../test/browser/snippetSession.test.ts | 22 +++---- 3 files changed, 49 insertions(+), 37 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 99cb214ba62..57b2b0af6ec 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -57,11 +57,12 @@ export class SnippetController2 { this.cancel(); } this._snippet = new SnippetSession(this._editor, template, overwriteBefore, overwriteAfter); + this._snippet.insert(); this._snippetListener = [ this._editor.onDidChangeModel(() => this.cancel()), this._editor.onDidChangeCursorSelection(() => this._updateState()) ]; - this._snippet.insert(); + this._updateState(); } private _updateState(): void { @@ -76,7 +77,7 @@ export class SnippetController2 { return; } - if (this._snippet.isAtFinalPlaceholder || !this._snippet.validateSelections()) { + if (this._snippet.isAtFinalPlaceholder || !this._snippet.isSelectionWithPlaceholders()) { return this.cancel(); } diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts index 9d1fb8f41a1..474879194b1 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -21,7 +21,6 @@ class OneSnippet { private readonly _snippet: TextmateSnippet; private readonly _offset: number; - private _snippetDecoration: string; private _placeholderDecorations: Map; private _placeholderGroups: Placeholder[][]; private _placeholderGroupsIdx: number; @@ -31,7 +30,6 @@ class OneSnippet { inactive: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, className: 'snippet-placeholder' }, activeFinal: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, className: 'finish-snippet-placeholder' }, inactiveFinal: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, className: 'finish-snippet-placeholder' }, - snippet: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges }, }; constructor(editor: ICommonCodeEditor, snippet: TextmateSnippet, offset: number) { @@ -60,13 +58,6 @@ class OneSnippet { this._editor.changeDecorations(accessor => { - // create one decoration for the whole snippets - const range = Range.fromPositions( - model.getPositionAt(this._offset), - model.getPositionAt(this._offset + this._snippet.text.length) - ); - this._snippetDecoration = accessor.addDecoration(range, OneSnippet._decor.snippet); - // create a decoration for each placeholder for (const placeholder of this._snippet.placeholders) { const placeholderOffset = this._snippet.offset(placeholder); @@ -151,8 +142,17 @@ class OneSnippet { return this._snippet.placeholders.length > 0; } - get range() { - return this._snippetDecoration !== undefined && this._editor.getModel().getDecorationRange(this._snippetDecoration); + get placeholderRanges() { + const ret: Range[] = []; + this._placeholderDecorations.forEach((id, placeholder) => { + if (!placeholder.isFinalTabstop) { + const range = this._editor.getModel().getDecorationRange(id); + if (range) { + ret.push(range); + } + } + }); + return ret; } } @@ -307,27 +307,38 @@ export class SnippetSession { return this._snippets[0].hasPlaceholder; } - validateSelections(): boolean { + isSelectionWithPlaceholders(): boolean { const selections = this._editor.getSelections(); if (selections.length < this._snippets.length) { + // this means we started snippet mode with N + // selections and have M (N > M) selections. + // So one snippet is without selection -> cancel return false; } - for (const selection of selections) { - let found = false; - for (const { range } of this._snippets) { - if (!range) { - // all deleted - return false; - } + const ranges: Range[] = []; + for (const snippet of this._snippets) { + ranges.push(...snippet.placeholderRanges); + } + + if (selections.length > ranges.length) { + return false; + } + + // sort selections and ranges by their start position + // and then make sure each selection is contained by + // a placeholder range + selections.sort(Range.compareRangesUsingStarts); + ranges.sort(Range.compareRangesUsingStarts); + + outer: for (const selection of selections) { + let range: Range; + while (range = ranges.shift()) { if (range.containsRange(selection)) { - found = true; - break; + continue outer; } } - if (!found) { - return false; - } + return false; } return true; diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts index 3d852975c68..c7a132ff26f 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts @@ -299,28 +299,28 @@ suite('SnippetSession', function () { assert.equal(model.getValue(), 'foofarboobarfunction foo() {\n foofarboobarconsole.log(a);\n}'); assertSelections(editor, new Selection(1, 1, 1, 4), new Selection(2, 5, 2, 8)); - assert.equal(session.validateSelections(), true); + assert.equal(session.isSelectionWithPlaceholders(), true); editor.setSelections([new Selection(1, 1, 1, 1)]); - assert.equal(session.validateSelections(), false); + assert.equal(session.isSelectionWithPlaceholders(), false); editor.setSelections([new Selection(1, 6, 1, 6), new Selection(2, 10, 2, 10)]); - assert.equal(session.validateSelections(), true); + assert.equal(session.isSelectionWithPlaceholders(), false); // in snippet, outside placeholder editor.setSelections([new Selection(1, 6, 1, 6), new Selection(2, 10, 2, 10), new Selection(1, 1, 1, 1)]); - assert.equal(session.validateSelections(), true); + assert.equal(session.isSelectionWithPlaceholders(), false); // in snippet, outside placeholder editor.setSelections([new Selection(1, 6, 1, 6), new Selection(2, 10, 2, 10), new Selection(2, 20, 2, 21)]); - assert.equal(session.validateSelections(), false); + assert.equal(session.isSelectionWithPlaceholders(), false); // reset selection to placeholder session.next(); - assert.equal(session.validateSelections(), true); + assert.equal(session.isSelectionWithPlaceholders(), true); assertSelections(editor, new Selection(1, 10, 1, 13), new Selection(2, 14, 2, 17)); // reset selection to placeholder session.next(); - assert.equal(session.validateSelections(), true); + assert.equal(session.isSelectionWithPlaceholders(), true); assert.equal(session.isAtFinalPlaceholder, true); assertSelections(editor, new Selection(1, 13, 1, 13), new Selection(2, 17, 2, 17)); }); @@ -354,10 +354,10 @@ suite('SnippetSession', function () { const session = new SnippetSession(editor, 'farboo$0'); session.insert(); assert.equal(session.isAtFinalPlaceholder, true); - assert.equal(session.validateSelections(), true); + assert.equal(session.isSelectionWithPlaceholders(), false); editor.trigger('test', 'type', { text: 'XXX' }); - assert.equal(session.validateSelections(), false); + assert.equal(session.isSelectionWithPlaceholders(), false); }); test('snippets, typing at beginning', function () { @@ -367,12 +367,12 @@ suite('SnippetSession', function () { session.insert(); editor.setSelection(new Selection(1, 2, 1, 2)); - assert.equal(session.validateSelections(), true); + assert.equal(session.isSelectionWithPlaceholders(), false); assert.equal(session.isAtFinalPlaceholder, true); editor.trigger('test', 'type', { text: 'XXX' }); assert.equal(model.getLineContent(1), 'fXXXfarboounction foo() {'); - assert.equal(session.validateSelections(), true); + assert.equal(session.isSelectionWithPlaceholders(), false); session.next(); assertSelections(editor, new Selection(1, 11, 1, 11)); From 6a8988162e1ddf46eb4624ddbdac6fd02761406d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 11 May 2017 16:46:04 +0200 Subject: [PATCH 0332/1164] Revert "Revert "fix #24435"" This reverts commit b9988fedd62373037585a558336efce70f6055cd. --- src/vs/workbench/electron-browser/bootstrap/index.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/vs/workbench/electron-browser/bootstrap/index.js b/src/vs/workbench/electron-browser/bootstrap/index.js index bedcde4bd9d..e886c4a3469 100644 --- a/src/vs/workbench/electron-browser/bootstrap/index.js +++ b/src/vs/workbench/electron-browser/bootstrap/index.js @@ -20,7 +20,12 @@ const remote = electron.remote; const ipc = electron.ipcRenderer; process.lazyEnv = new Promise(function (resolve) { + const handle = setTimeout(function () { + resolve(); + console.warn('renderer did not receive lazyEnv in time') + }, 2000); ipc.once('vscode:acceptShellEnv', function (event, shellEnv) { + clearTimeout(handle); assign(process.env, shellEnv); resolve(process.env); }); From e5e1098fbfc38dbd8c5e0d5f204307fadb121d61 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 11 May 2017 16:46:49 +0200 Subject: [PATCH 0333/1164] increase lazyenv timeout --- src/vs/workbench/electron-browser/bootstrap/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/electron-browser/bootstrap/index.js b/src/vs/workbench/electron-browser/bootstrap/index.js index e886c4a3469..99a2c63164d 100644 --- a/src/vs/workbench/electron-browser/bootstrap/index.js +++ b/src/vs/workbench/electron-browser/bootstrap/index.js @@ -23,7 +23,7 @@ process.lazyEnv = new Promise(function (resolve) { const handle = setTimeout(function () { resolve(); console.warn('renderer did not receive lazyEnv in time') - }, 2000); + }, 10000); ipc.once('vscode:acceptShellEnv', function (event, shellEnv) { clearTimeout(handle); assign(process.env, shellEnv); From 8303715913a0b0e0a1745b0baf9484e9778a5588 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 11 May 2017 16:59:23 +0200 Subject: [PATCH 0334/1164] tfs: darwin build --- build/tfs/darwin/build.sh | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100755 build/tfs/darwin/build.sh diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh new file mode 100755 index 00000000000..72e0015e938 --- /dev/null +++ b/build/tfs/darwin/build.sh @@ -0,0 +1,37 @@ +#!/bin/sh +set -e + +# npm install +./scripts/npm.sh install + +# mixin +npm run gulp -- mixin + +# compile & upload source maps +npm run gulp -- --max_old_space_size=4096 vscode-darwin-min upload-vscode-sourcemaps + +# run tests +./scripts/test.sh --build --reporter dot + +# run integration tests +./scripts/test-integration.sh + +# npm install publish tools +(cd $BUILD_SOURCESDIRECTORY/build/tfs && npm i) + +# set up variables +REPO=`pwd` +ZIP=$REPO/../VSCode-darwin-selfsigned.zip +UNSIGNEDZIP=$REPO/../VSCode-darwin-unsigned.zip +BUILD=$REPO/../VSCode-darwin +PACKAGEJSON=`ls $BUILD/*.app/Contents/Resources/app/package.json` +VERSION=`node -p "require(\"$PACKAGEJSON\").version"` + +# archive unsigned build +( rm -rf $UNSIGNEDZIP ; cd $BUILD && zip -r -X -y $UNSIGNEDZIP * ) + +# publish unsigned build +node build/tfs/out/publish.js $VSCODE_QUALITY darwin archive-unsigned VSCode-darwin-$VSCODE_QUALITY-unsigned.zip $VERSION false $UNSIGNEDZIP + +# create signing request +node build/tfs/out/enqueue.js $VSCODE_QUALITY \ No newline at end of file From 6bc59c14130700f40490dd78385d320c4c6ccd1a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 11 May 2017 17:11:13 +0200 Subject: [PATCH 0335/1164] wire up controller with suggestions --- .../suggest/browser/suggestController.ts | 25 +++++++++---------- .../debug/electron-browser/replEditor.ts | 4 +-- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggestController.ts b/src/vs/editor/contrib/suggest/browser/suggestController.ts index c7577e2fc68..04252c5d78c 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestController.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestController.ts @@ -21,8 +21,8 @@ import { alert } from 'vs/base/browser/ui/aria/aria'; import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; -import { CodeSnippet } from 'vs/editor/contrib/snippet/common/snippet'; -import { SnippetController } from 'vs/editor/contrib/snippet/common/snippetController'; +import { SnippetParser } from 'vs/editor/contrib/snippet/common/snippetParser'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { Context as SuggestContext } from './suggest'; import { SuggestModel, State } from './suggestModel'; import { ICompletionItem } from './completionModel'; @@ -177,19 +177,18 @@ export class SuggestController implements IEditorContribution { this._editor.pushUndoStop(); } - if (suggestion.snippetType === 'textmate') { - SnippetController.get(this._editor).insertSnippet( - suggestion.insertText, - suggestion.overwriteBefore + columnDelta, - suggestion.overwriteAfter); - } else { - SnippetController.get(this._editor).run( - CodeSnippet.fromInternal(suggestion.insertText), - suggestion.overwriteBefore + columnDelta, - suggestion.overwriteAfter - ); + let { insertText } = suggestion; + if (suggestion.snippetType !== 'textmate') { + insertText = SnippetParser.escape(insertText); } + SnippetController2.get(this._editor).insert( + insertText, + suggestion.overwriteBefore + columnDelta, + suggestion.overwriteAfter + ); + + if (suggestion.command) { this._commandService.executeCommand(suggestion.command.id, ...suggestion.command.arguments).done(undefined, onUnexpectedError); } diff --git a/src/vs/workbench/parts/debug/electron-browser/replEditor.ts b/src/vs/workbench/parts/debug/electron-browser/replEditor.ts index d1e61773616..dfa70d783bd 100644 --- a/src/vs/workbench/parts/debug/electron-browser/replEditor.ts +++ b/src/vs/workbench/parts/debug/electron-browser/replEditor.ts @@ -17,7 +17,7 @@ import { MenuPreventer } from 'vs/editor/contrib/multicursor/browser/menuPrevent import { SelectionClipboard } from 'vs/editor/contrib/selectionClipboard/electron-browser/selectionClipboard'; import { ContextMenuController } from 'vs/editor/contrib/contextmenu/browser/contextmenu'; import { SuggestController } from 'vs/editor/contrib/suggest/browser/suggestController'; -import { SnippetController } from 'vs/editor/contrib/snippet/common/snippetController'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { TabCompletionController } from 'vs/workbench/parts/snippets/electron-browser/tabCompletion'; import { IThemeService } from 'vs/platform/theme/common/themeService'; @@ -40,7 +40,7 @@ export class ReplInputEditor extends CodeEditorWidget { SelectionClipboard, ContextMenuController, SuggestController, - SnippetController, + SnippetController2, TabCompletionController, ]; } From e1e1edcd21921cf05bd504f2ca16b4b4f14471c3 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 11 May 2017 17:25:13 +0200 Subject: [PATCH 0336/1164] implicit final tabstop for 'modern' snippets --- .../contrib/snippet/common/snippetParser.ts | 17 ++++++---- .../test/browser/snippetParser.test.ts | 32 +++++++++---------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/common/snippetParser.ts index a54b2b7821f..4378668eda4 100644 --- a/src/vs/editor/contrib/snippet/common/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/common/snippetParser.ts @@ -297,7 +297,7 @@ export class SnippetParser { } static parse(template: string): TextmateSnippet { - const marker = new SnippetParser(true, false).parse(template); + const marker = new SnippetParser(true, false).parse(template, true); return new TextmateSnippet(marker); } @@ -316,7 +316,7 @@ export class SnippetParser { return Marker.toString(this.parse(value)); } - parse(value: string): Marker[] { + parse(value: string, insertFinalTabstop?: boolean): Marker[] { const marker: Marker[] = []; this._scanner.text(value); @@ -359,10 +359,15 @@ export class SnippetParser { const placeholderDefaultValues = new Map(); walk(marker, placeholderDefaultValues); - // if (placeholderDefaultValues.size > 0 && !placeholderDefaultValues.has('0')) { - // // snippet uses tabstops but has no final tabstop - // marker.push(new Placeholder('0', [])); - // } + if ( + insertFinalTabstop + && placeholderDefaultValues.size > 0 + && !placeholderDefaultValues.has('0') + ) { + // the snippet uses placeholders but has no + // final tabstop defined -> insert at the end + marker.push(new Placeholder('0', [])); + } return marker; } diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts index 9665f7e14f7..faa1f5cdcfc 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts @@ -318,13 +318,13 @@ suite('SnippetParser', () => { assert.equal(lengths.length, 0); } - assertLen('text', 4); - assertLen('$1text', 0, 4); - assertLen('te$1xt', 2, 0, 2); + assertLen('text$0', 4, 0); + assertLen('$1text$0', 0, 4, 0); + assertLen('te$1xt$0', 2, 0, 2, 0); assertLen('errorContext: `${1:err}`, error: $0', 15, 0, 3, 10, 0); - assertLen('errorContext: `${1:err}`, error: $1', 15, 0, 3, 10, 0, 3); - assertLen('$TM_SELECTED_TEXT', 0); - assertLen('${TM_SELECTED_TEXT:def}', 0, 3); + assertLen('errorContext: `${1:err}`, error: $1$0', 15, 0, 3, 10, 0, 3, 0); + assertLen('$TM_SELECTED_TEXT$0', 0, 0); + assertLen('${TM_SELECTED_TEXT:def}$0', 0, 3, 0); }); test('TextmateSnippet#offset', () => { @@ -342,21 +342,21 @@ suite('SnippetParser', () => { }); test('TextmateSnippet#placeholder', () => { - let snippet = SnippetParser.parse('te$1xt'); + let snippet = SnippetParser.parse('te$1xt$0'); let placeholders = snippet.placeholders; - assert.equal(placeholders.length, 1); - - snippet = SnippetParser.parse('te$1xt$1'); - placeholders = snippet.placeholders; assert.equal(placeholders.length, 2); - - snippet = SnippetParser.parse('te$1xt$2'); + snippet = SnippetParser.parse('te$1xt$1$0'); placeholders = snippet.placeholders; - assert.equal(placeholders.length, 2); + assert.equal(placeholders.length, 3); - snippet = SnippetParser.parse('${1:bar${2:foo}bar}'); + + snippet = SnippetParser.parse('te$1xt$2$0'); placeholders = snippet.placeholders; - assert.equal(placeholders.length, 2); + assert.equal(placeholders.length, 3); + + snippet = SnippetParser.parse('${1:bar${2:foo}bar}$0'); + placeholders = snippet.placeholders; + assert.equal(placeholders.length, 3); }); }); From cd6685c06b96171194100867c8a570c5a612291b Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 11 May 2017 17:28:31 +0200 Subject: [PATCH 0337/1164] debug: respect stack frame endLine and endColumn coming from adapter --- src/vs/workbench/parts/debug/common/debugModel.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index 9b4fc2979e9..a26b1bc4661 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -446,8 +446,8 @@ export class Thread implements IThread { return new StackFrame(this, rsf.id, source, rsf.name, new Range( rsf.line, rsf.column, - rsf.endLine === undefined ? rsf.line : rsf.endLine, - rsf.endColumn === undefined ? rsf.column : rsf.endColumn + rsf.endLine, + rsf.endColumn )); }); }, (err: Error) => { From ec449b5e19d6394f0bfa231a0926969807c24a5e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 11 May 2017 17:55:43 +0200 Subject: [PATCH 0338/1164] test for later --- .../test/browser/snippetSession.test.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts index c7a132ff26f..c5544130cc6 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts @@ -378,6 +378,24 @@ suite('SnippetSession', function () { assertSelections(editor, new Selection(1, 11, 1, 11)); }); + // test('snippets, typing with nested placeholder', function () { + + // editor.setSelection(new Selection(1, 1, 1, 1)); + // const session = new SnippetSession(editor, 'This ${1:is ${2:nested}}.$0'); + // session.insert(); + // assertSelections(editor, new Selection(1, 6, 1, 15)); + + // session.next(); + // assertSelections(editor, new Selection(1, 9, 1, 15)); + + // editor.trigger('test', 'deleteLeft', {}); + // assertSelections(editor, new Selection(1, 9, 1, 9)); + + // editor.trigger('test', 'type', { text: 'XXX' }); + // session.prev(); + // assertSelections(editor, new Selection(1, 6, 1, 12)); + // }); + test('snippets, snippet with variables', function () { const session = new SnippetSession(editor, '@line=$TM_LINE_NUMBER$0'); session.insert(); From 625ce8fe2867f6ea091817877d22dca1cf853856 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 11 May 2017 17:57:54 +0200 Subject: [PATCH 0339/1164] Implement select command for tree views --- src/vs/workbench/api/node/mainThreadExplorerView.ts | 8 +++++--- src/vs/workbench/parts/explorers/browser/explorerView.ts | 7 ++++++- src/vs/workbench/parts/explorers/common/explorer.ts | 1 + 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/api/node/mainThreadExplorerView.ts b/src/vs/workbench/api/node/mainThreadExplorerView.ts index 4ffaa3977c2..8028c7069ec 100644 --- a/src/vs/workbench/api/node/mainThreadExplorerView.ts +++ b/src/vs/workbench/api/node/mainThreadExplorerView.ts @@ -73,9 +73,11 @@ class TreeExplorerNodeProvider implements IExplorerViewDataProvider { return node.contextKey; } - executeCommand(node: ITreeNode): TPromise { - return this._proxy.$getInternalCommand(this.id, node).then(command => { - return this.commandService.executeCommand(command.id, ...command.arguments); + select(node: ITreeNode): void { + this._proxy.$getInternalCommand(this.id, node).then(command => { + if (command) { + this.commandService.executeCommand(command.id, ...command.arguments); + } }); } } diff --git a/src/vs/workbench/parts/explorers/browser/explorerView.ts b/src/vs/workbench/parts/explorers/browser/explorerView.ts index 7e11e5fca63..7b7d6f375d2 100644 --- a/src/vs/workbench/parts/explorers/browser/explorerView.ts +++ b/src/vs/workbench/parts/explorers/browser/explorerView.ts @@ -135,7 +135,12 @@ class TreeExplorerView extends CollapsibleViewletView { this.toDispose.push(attachListStyler(tree, this.themeService)); this.toDispose.push(this.listService.register(tree, [this.viewFocusContext])); - + tree.addListener('selection', (event: any) => { + const selection = tree.getSelection()[0]; + if (selection) { + this.dataProvider.select(selection); + } + }); return tree; } diff --git a/src/vs/workbench/parts/explorers/common/explorer.ts b/src/vs/workbench/parts/explorers/common/explorer.ts index b6a1731fb9b..338b63463de 100644 --- a/src/vs/workbench/parts/explorers/common/explorer.ts +++ b/src/vs/workbench/parts/explorers/common/explorer.ts @@ -33,4 +33,5 @@ export interface IExplorerViewDataProvider { getLabel(element: T): string; getContextKey(element: T): string; hasChildren(element: T): boolean; + select(element: T): void; } From 705847ee6b469f5d5058af1598407149d0ce7a64 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 11 May 2017 18:11:45 +0200 Subject: [PATCH 0340/1164] tfs: darwin wait for signed build --- build/tfs/darwin/build.sh | 5 ++++- package.json | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh index 72e0015e938..8ea3d088263 100755 --- a/build/tfs/darwin/build.sh +++ b/build/tfs/darwin/build.sh @@ -34,4 +34,7 @@ VERSION=`node -p "require(\"$PACKAGEJSON\").version"` node build/tfs/out/publish.js $VSCODE_QUALITY darwin archive-unsigned VSCode-darwin-$VSCODE_QUALITY-unsigned.zip $VERSION false $UNSIGNEDZIP # create signing request -node build/tfs/out/enqueue.js $VSCODE_QUALITY \ No newline at end of file +node build/tfs/out/enqueue.js $VSCODE_QUALITY + +# wait for signed build +node build/tfs/out/waitForSignedBuild.js $VSCODE_QUALITY $VERSION \ No newline at end of file diff --git a/package.json b/package.json index 53e66f176ec..ebe68177df3 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "code-oss-dev", "version": "1.13.0", "electronVersion": "1.6.6", - "distro": "866fd532378acbb246f02ed97397e3f0f4dbc345", + "distro": "ca3585925fd1e7743ee4cba31a57c09960152346", "author": { "name": "Microsoft Corporation" }, From 97f1fc61f392c079cfa42b7a7556719431f5fa6e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 11 May 2017 19:37:52 +0200 Subject: [PATCH 0341/1164] tfs: darwin build --- build/tfs/darwin/build.sh | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh index 8ea3d088263..f1faaca849d 100755 --- a/build/tfs/darwin/build.sh +++ b/build/tfs/darwin/build.sh @@ -37,4 +37,4 @@ node build/tfs/out/publish.js $VSCODE_QUALITY darwin archive-unsigned VSCode-dar node build/tfs/out/enqueue.js $VSCODE_QUALITY # wait for signed build -node build/tfs/out/waitForSignedBuild.js $VSCODE_QUALITY $VERSION \ No newline at end of file +node build/tfs/out/waitForSignedBuild.js $VSCODE_QUALITY \ No newline at end of file diff --git a/package.json b/package.json index ebe68177df3..4f20135e41c 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "code-oss-dev", "version": "1.13.0", "electronVersion": "1.6.6", - "distro": "ca3585925fd1e7743ee4cba31a57c09960152346", + "distro": "a19a3b432030a478afa61b438c9a0dfd8f84f893", "author": { "name": "Microsoft Corporation" }, From 0d5c9f418b2c68dd87bffb8c481ebbb0022e9a41 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 11 May 2017 10:48:48 -0700 Subject: [PATCH 0342/1164] Remove Need for File Extensions in TypeScript Language Definitions (#26413) Part of #25740 To support TS Server plugins for languages like angular, we will allow extensions to register new langauges for TypeScript to watch. The angular language for example would want ng-html files to also be uploaded to TypeScript for checking The current language definitions all define both a set of language modes they support and a set of file extensions. The file extension part is unnessiary and may be incorrect depending on how a user sets up their `file.associations` in the workspace. This change removes the extensions part so that we always make use of the language mode --- .../src/features/bufferSyncSupport.ts | 4 +- extensions/typescript/src/typescriptMain.ts | 141 +++++++++--------- 2 files changed, 73 insertions(+), 72 deletions(-) diff --git a/extensions/typescript/src/features/bufferSyncSupport.ts b/extensions/typescript/src/features/bufferSyncSupport.ts index 9e9858902e4..83d5b98b775 100644 --- a/extensions/typescript/src/features/bufferSyncSupport.ts +++ b/extensions/typescript/src/features/bufferSyncSupport.ts @@ -107,7 +107,6 @@ export default class BufferSyncSupport { private _validate: boolean; private modeIds: ObjectMap; - private extensions: ObjectMap; private diagnostics: Diagnostics; private disposables: Disposable[] = []; private syncedBuffers: ObjectMap; @@ -119,12 +118,11 @@ export default class BufferSyncSupport { private emitQueue: LinkedMap; private checkGlobalTSCVersion: boolean; - constructor(client: ITypescriptServiceClient, modeIds: string[], diagnostics: Diagnostics, extensions: ObjectMap, validate: boolean = true) { + constructor(client: ITypescriptServiceClient, modeIds: string[], diagnostics: Diagnostics, validate: boolean = true) { this.client = client; this.modeIds = Object.create(null); modeIds.forEach(modeId => this.modeIds[modeId] = true); this.diagnostics = diagnostics; - this.extensions = extensions; this._validate = validate; this.projectValidationRequested = false; diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index a6e3f4b8912..99e107b9ce6 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -9,7 +9,7 @@ * ------------------------------------------------------------------------------------------ */ 'use strict'; -import { env, languages, commands, workspace, window, ExtensionContext, Memento, IndentAction, Diagnostic, DiagnosticCollection, Range, Disposable, Uri, MessageItem, TextEditor, DiagnosticSeverity } from 'vscode'; +import { env, languages, commands, workspace, window, ExtensionContext, Memento, IndentAction, Diagnostic, DiagnosticCollection, Range, Disposable, Uri, MessageItem, TextEditor, DiagnosticSeverity, TextDocument } from 'vscode'; // This must be the first statement otherwise modules might got loaded with // the wrong locale. @@ -54,7 +54,6 @@ interface LanguageDescription { id: string; diagnosticSource: string; modeIds: string[]; - extensions: string[]; configFile: string; } @@ -79,14 +78,12 @@ export function activate(context: ExtensionContext): void { id: 'typescript', diagnosticSource: 'ts', modeIds: [MODE_ID_TS, MODE_ID_TSX], - extensions: ['.ts', '.tsx'], configFile: 'tsconfig.json' }, { id: 'javascript', diagnosticSource: 'js', modeIds: [MODE_ID_JS, MODE_ID_JSX], - extensions: ['.js', '.jsx', '.es6', '.mjs'], configFile: 'jsconfig.json' } ], context.storagePath, context.globalState, context.workspaceState); @@ -136,8 +133,6 @@ export function activate(context: ExtensionContext): void { const validateSetting = 'validate.enable'; class LanguageProvider { - - private readonly extensions: ObjectMap; private syntaxDiagnostics: ObjectMap; private readonly currentDiagnostics: DiagnosticCollection; private readonly bufferSyncSupport: BufferSyncSupport; @@ -160,14 +155,11 @@ class LanguageProvider { private readonly client: TypeScriptServiceClient, private readonly description: LanguageDescription ) { - this.extensions = Object.create(null); - description.extensions.forEach(extension => this.extensions[extension] = true); - this.bufferSyncSupport = new BufferSyncSupport(client, description.modeIds, { delete: (file: string) => { this.currentDiagnostics.delete(client.asUrl(file)); } - }, this.extensions); + }); this.syntaxDiagnostics = Object.create(null); this.currentDiagnostics = languages.createDiagnosticCollection(description.id); @@ -334,13 +326,20 @@ class LanguageProvider { } } - public handles(file: string): boolean { - const extension = path.extname(file); - if ((extension && this.extensions[extension]) || this.bufferSyncSupport.handles(file)) { + public handles(file: string, doc: TextDocument): boolean { + if (doc && this.description.modeIds.indexOf(doc.languageId) >= 0) { return true; } + + if (this.bufferSyncSupport.handles(file)) { + return true; + } + const basename = path.basename(file); - return !!basename && basename === this.description.configFile; + if (!!basename && basename === this.description.configFile) { + return true; + } + return false; } public get id(): string { @@ -558,14 +557,15 @@ class TypeScriptServiceClientHost implements ITypescriptServiceClientHost { }); } - private findLanguage(file: string): LanguageProvider | null { - for (let i = 0; i < this.languages.length; i++) { - let language = this.languages[i]; - if (language.handles(file)) { - return language; + private findLanguage(file: string): Thenable { + return workspace.openTextDocument(file).then((doc: TextDocument) => { + for (const language of this.languages) { + if (language.handles(file, doc)) { + return language; + } } - } - return null; + return null; + }, () => null); } private triggerAllDiagnostics() { @@ -580,22 +580,24 @@ class TypeScriptServiceClientHost implements ITypescriptServiceClientHost { } /* internal */ syntaxDiagnosticsReceived(event: Proto.DiagnosticEvent): void { - let body = event.body; + const body = event.body; if (body && body.diagnostics) { - let language = this.findLanguage(body.file); - if (language) { - language.syntaxDiagnosticsReceived(body.file, this.createMarkerDatas(body.diagnostics, language.diagnosticSource)); - } + this.findLanguage(body.file).then(language => { + if (language) { + language.syntaxDiagnosticsReceived(body.file, this.createMarkerDatas(body.diagnostics, language.diagnosticSource)); + } + }); } } /* internal */ semanticDiagnosticsReceived(event: Proto.DiagnosticEvent): void { - let body = event.body; + const body = event.body; if (body && body.diagnostics) { - let language = this.findLanguage(body.file); - if (language) { - language.semanticDiagnosticsReceived(body.file, this.createMarkerDatas(body.diagnostics, language.diagnosticSource)); - } + this.findLanguage(body.file).then(language => { + if (language) { + language.semanticDiagnosticsReceived(body.file, this.createMarkerDatas(body.diagnostics, language.diagnosticSource)); + } + }); } /* if (Is.defined(body.queueLength)) { @@ -611,47 +613,48 @@ class TypeScriptServiceClientHost implements ITypescriptServiceClientHost { return; } - const language = body.triggerFile ? this.findLanguage(body.triggerFile) : this.findLanguage(body.configFile); - if (!language) { - return; - } - if (body.diagnostics.length === 0) { - language.configFileDiagnosticsReceived(body.configFile, []); - } else if (body.diagnostics.length >= 1) { - workspace.openTextDocument(Uri.file(body.configFile)).then((document) => { - let curly: [number, number, number] | undefined = undefined; - let nonCurly: [number, number, number] | undefined = undefined; - let diagnostic: Diagnostic; - for (let index = 0; index < document.lineCount; index++) { - const line = document.lineAt(index); - const text = line.text; - const firstNonWhitespaceCharacterIndex = line.firstNonWhitespaceCharacterIndex; - if (firstNonWhitespaceCharacterIndex < text.length) { - if (text.charAt(firstNonWhitespaceCharacterIndex) === '{') { - curly = [index, firstNonWhitespaceCharacterIndex, firstNonWhitespaceCharacterIndex + 1]; - break; - } else { - const matches = /\s*([^\s]*)(?:\s*|$)/.exec(text.substr(firstNonWhitespaceCharacterIndex)); - if (matches && matches.length >= 1) { - nonCurly = [index, firstNonWhitespaceCharacterIndex, firstNonWhitespaceCharacterIndex + matches[1].length]; + (body.triggerFile ? this.findLanguage(body.triggerFile) : this.findLanguage(body.configFile)).then(language => { + if (!language) { + return; + } + if (body.diagnostics.length === 0) { + language.configFileDiagnosticsReceived(body.configFile, []); + } else if (body.diagnostics.length >= 1) { + workspace.openTextDocument(Uri.file(body.configFile)).then((document) => { + let curly: [number, number, number] | undefined = undefined; + let nonCurly: [number, number, number] | undefined = undefined; + let diagnostic: Diagnostic; + for (let index = 0; index < document.lineCount; index++) { + const line = document.lineAt(index); + const text = line.text; + const firstNonWhitespaceCharacterIndex = line.firstNonWhitespaceCharacterIndex; + if (firstNonWhitespaceCharacterIndex < text.length) { + if (text.charAt(firstNonWhitespaceCharacterIndex) === '{') { + curly = [index, firstNonWhitespaceCharacterIndex, firstNonWhitespaceCharacterIndex + 1]; + break; + } else { + const matches = /\s*([^\s]*)(?:\s*|$)/.exec(text.substr(firstNonWhitespaceCharacterIndex)); + if (matches && matches.length >= 1) { + nonCurly = [index, firstNonWhitespaceCharacterIndex, firstNonWhitespaceCharacterIndex + matches[1].length]; + } } } } - } - const match = curly || nonCurly; - if (match) { - diagnostic = new Diagnostic(new Range(match[0], match[1], match[0], match[2]), body.diagnostics[0].text); - } else { - diagnostic = new Diagnostic(new Range(0, 0, 0, 0), body.diagnostics[0].text); - } - if (diagnostic) { - diagnostic.source = language.diagnosticSource; - language.configFileDiagnosticsReceived(body.configFile, [diagnostic]); - } - }, _error => { - language.configFileDiagnosticsReceived(body.configFile, [new Diagnostic(new Range(0, 0, 0, 0), body.diagnostics[0].text)]); - }); - } + const match = curly || nonCurly; + if (match) { + diagnostic = new Diagnostic(new Range(match[0], match[1], match[0], match[2]), body.diagnostics[0].text); + } else { + diagnostic = new Diagnostic(new Range(0, 0, 0, 0), body.diagnostics[0].text); + } + if (diagnostic) { + diagnostic.source = language.diagnosticSource; + language.configFileDiagnosticsReceived(body.configFile, [diagnostic]); + } + }, _error => { + language.configFileDiagnosticsReceived(body.configFile, [new Diagnostic(new Range(0, 0, 0, 0), body.diagnostics[0].text)]); + }); + } + }); } private createMarkerDatas(diagnostics: Proto.Diagnostic[], source: string): Diagnostic[] { From 3b3c23c9cbdf3a3ba4c41f860b469a02645e8b66 Mon Sep 17 00:00:00 2001 From: rebornix Date: Thu, 11 May 2017 11:31:05 -0700 Subject: [PATCH 0343/1164] Fix #26409 --- src/vs/editor/contrib/find/browser/findWidget.ts | 2 +- src/vs/editor/contrib/find/common/findModel.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index ea8efb1bb45..e909b466c00 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -540,7 +540,7 @@ export class FindWidget extends Widget implements IOverlayWidget { // Toggle selection button this._toggleSelectionFind = this._register(new SimpleCheckbox({ parent: findPart, - title: NLS_TOGGLE_SELECTION_FIND_TITLE, + title: NLS_TOGGLE_SELECTION_FIND_TITLE + this._keybindingLabelFor(FIND_IDS.ToggleSearchScopeCommand), onChange: () => { if (this._toggleSelectionFind.checked) { let selection = this._codeEditor.getSelection(); diff --git a/src/vs/editor/contrib/find/common/findModel.ts b/src/vs/editor/contrib/find/common/findModel.ts index 526a2ea3cec..faa2f4ff924 100644 --- a/src/vs/editor/contrib/find/common/findModel.ts +++ b/src/vs/editor/contrib/find/common/findModel.ts @@ -59,7 +59,7 @@ export const FIND_IDS = { ToggleCaseSensitiveCommand: 'toggleFindCaseSensitive', ToggleWholeWordCommand: 'toggleFindWholeWord', ToggleRegexCommand: 'toggleFindRegex', - ToggleSearchScopeCommand: 'toggleSearchScope', + ToggleSearchScopeCommand: 'toggleFindInSelection', ReplaceOneAction: 'editor.action.replaceOne', ReplaceAllAction: 'editor.action.replaceAll', SelectAllMatchesAction: 'editor.action.selectAllMatches', From 6b7fe1e471d9698708642e7c9f649938e07bbf02 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Thu, 11 May 2017 23:42:05 +0200 Subject: [PATCH 0344/1164] node-debug@1.13.4 --- build/gulpfile.vscode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 7bc920e9bba..f6709c3e98d 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -41,7 +41,7 @@ const nodeModules = ['electron', 'original-fs'] // Build const builtInExtensions = [ - { name: 'ms-vscode.node-debug', version: '1.13.3' }, + { name: 'ms-vscode.node-debug', version: '1.13.4' }, { name: 'ms-vscode.node-debug2', version: '1.12.4' } ]; From 2ef1ba7934a0815f00ef36f64ad87468473ec180 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 11 May 2017 16:56:46 -0700 Subject: [PATCH 0345/1164] Track terminal link underline on the link itself, not the panel Fixes #23621 --- .../terminal/electron-browser/media/terminal.css | 5 +++++ .../parts/terminal/electron-browser/media/xterm.css | 12 +----------- .../terminal/electron-browser/terminalLinkHandler.ts | 11 ++++++++++- .../parts/terminal/electron-browser/terminalPanel.ts | 7 ------- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css index bbd66f6978d..f35dde259bf 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css +++ b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css @@ -63,6 +63,11 @@ font-weight: normal !important; } +.monaco-workbench .panel.integrated-terminal .xterm a.active { + cursor: pointer; + text-decoration: underline; +} + /* Terminal actions */ /* Light theme */ diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css b/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css index e8a7ad1348d..e3c2b464795 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css +++ b/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css @@ -51,17 +51,7 @@ .monaco-workbench .panel.integrated-terminal .xterm a { color: inherit; - cursor: text; - text-decoration: none; -} - -.monaco-workbench .panel.integrated-terminal.ctrlcmd-held .xterm a:hover { - cursor: pointer; - text-decoration: underline; -} - -.monaco-workbench .panel.integrated-terminal.ctrlcmd-held .xterm a.xterm-invalid-link:hover { - cursor: text; + cursor: inherit; text-decoration: none; } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts index 426d16167ba..7eb83c44954 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts @@ -56,6 +56,7 @@ export type XtermLinkMatcherValidationCallback = (uri: string, element: HTMLElem export class TerminalLinkHandler { private _tooltipDisposables: IDisposable[] = []; + private _tooltipMouseMoveDisposable: IDisposable; private _widgetManager: TerminalWidgetManager; private _localLinkPattern: RegExp; @@ -165,7 +166,11 @@ export class TerminalLinkHandler { private _addTooltipEventListeners(element: HTMLElement): void { let timeout = null; let isMessageShowing = false; - this._tooltipDisposables.push(dom.addDisposableListener(element, dom.EventType.MOUSE_OVER, () => { + this._tooltipDisposables.push(dom.addDisposableListener(element, dom.EventType.MOUSE_OVER, e => { + element.classList.toggle('active', platform.isMacintosh ? e.metaKey : e.ctrlKey); + this._tooltipMouseMoveDisposable = dom.addDisposableListener(element, dom.EventType.MOUSE_MOVE, e => { + element.classList.toggle('active', platform.isMacintosh ? e.metaKey : e.ctrlKey); + }); timeout = setTimeout(() => { let message: string; if (platform.isMacintosh) { @@ -178,6 +183,10 @@ export class TerminalLinkHandler { }, 500); })); this._tooltipDisposables.push(dom.addDisposableListener(element, dom.EventType.MOUSE_OUT, () => { + element.classList.remove('active'); + if (this._tooltipMouseMoveDisposable) { + this._tooltipMouseMoveDisposable.dispose(); + } clearTimeout(timeout); this._widgetManager.closeMessage(); isMessageShowing = false; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index ee895a95919..89dcbae71da 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -151,9 +151,6 @@ export class TerminalPanel extends Panel { } private _attachEventListeners(): void { - this._register(DOM.addDisposableListener(window, DOM.EventType.KEY_DOWN, (e: KeyboardEvent) => this._refreshCtrlHeld(e))); - this._register(DOM.addDisposableListener(window, DOM.EventType.KEY_UP, (e: KeyboardEvent) => this._refreshCtrlHeld(e))); - this._register(DOM.addDisposableListener(window, DOM.EventType.FOCUS, (e: KeyboardEvent) => this._refreshCtrlHeld(e))); this._register(DOM.addDisposableListener(this._parentDomElement, 'mousedown', (event: MouseEvent) => { if (this._terminalService.terminalInstances.length === 0) { return; @@ -215,10 +212,6 @@ export class TerminalPanel extends Panel { })); } - private _refreshCtrlHeld(e: KeyboardEvent): void { - this._parentDomElement.classList.toggle('ctrlcmd-held', platform.isMacintosh ? e.metaKey : e.ctrlKey); - } - private _updateTheme(theme?: ITheme): void { if (!theme) { theme = this.themeService.getTheme(); From 4ffd4a0147bb6475133e6936da77f71a6627d4ae Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 11 May 2017 17:22:17 -0700 Subject: [PATCH 0346/1164] Don't dispose terminal link hover handlers too early Fixes #23484 --- .../electron-browser/terminalInstance.ts | 6 +++--- .../electron-browser/terminalLinkHandler.ts | 19 ++++++++++--------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 807ae0a089b..7dcd6d7eef2 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -324,6 +324,9 @@ export class TerminalInstance implements ITerminalInstance { } public dispose(): void { + if (this._linkHandler) { + this._linkHandler.dispose(); + } if (this._xterm && this._xterm.element) { this._hadFocusOnExit = DOM.hasClass(this._xterm.element, 'focus'); } @@ -492,9 +495,6 @@ export class TerminalInstance implements ITerminalInstance { if (this._widgetManager) { this._widgetManager.closeMessage(); } - if (this._linkHandler) { - this._linkHandler.disposeTooltipListeners(); - } if (this._xterm) { this._xterm.write(message.content); } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts index 7eb83c44954..49df15b331a 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts @@ -55,8 +55,8 @@ export type XtermLinkMatcherHandler = (event: MouseEvent, uri: string) => boolea export type XtermLinkMatcherValidationCallback = (uri: string, element: HTMLElement, callback: (isValid: boolean) => void) => void; export class TerminalLinkHandler { - private _tooltipDisposables: IDisposable[] = []; - private _tooltipMouseMoveDisposable: IDisposable; + private _hoverDisposables: IDisposable[] = []; + private _mouseMoveDisposable: IDisposable; private _widgetManager: TerminalWidgetManager; private _localLinkPattern: RegExp; @@ -110,8 +110,9 @@ export class TerminalLinkHandler { }); } - public disposeTooltipListeners(): void { - this._tooltipDisposables = dispose(this._tooltipDisposables); + public dispose(): void { + this._hoverDisposables = dispose(this._hoverDisposables); + this._mouseMoveDisposable = dispose(this._mouseMoveDisposable); } private _wrapLinkHandler(handler: (uri: string) => boolean | void): XtermLinkMatcherHandler { @@ -166,9 +167,9 @@ export class TerminalLinkHandler { private _addTooltipEventListeners(element: HTMLElement): void { let timeout = null; let isMessageShowing = false; - this._tooltipDisposables.push(dom.addDisposableListener(element, dom.EventType.MOUSE_OVER, e => { + this._hoverDisposables.push(dom.addDisposableListener(element, dom.EventType.MOUSE_OVER, e => { element.classList.toggle('active', platform.isMacintosh ? e.metaKey : e.ctrlKey); - this._tooltipMouseMoveDisposable = dom.addDisposableListener(element, dom.EventType.MOUSE_MOVE, e => { + this._mouseMoveDisposable = dom.addDisposableListener(element, dom.EventType.MOUSE_MOVE, e => { element.classList.toggle('active', platform.isMacintosh ? e.metaKey : e.ctrlKey); }); timeout = setTimeout(() => { @@ -182,10 +183,10 @@ export class TerminalLinkHandler { isMessageShowing = true; }, 500); })); - this._tooltipDisposables.push(dom.addDisposableListener(element, dom.EventType.MOUSE_OUT, () => { + this._hoverDisposables.push(dom.addDisposableListener(element, dom.EventType.MOUSE_OUT, () => { element.classList.remove('active'); - if (this._tooltipMouseMoveDisposable) { - this._tooltipMouseMoveDisposable.dispose(); + if (this._mouseMoveDisposable) { + this._mouseMoveDisposable.dispose(); } clearTimeout(timeout); this._widgetManager.closeMessage(); From 590c5f1fc27e7dcf52d946341214759c2f42e2c3 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 11 May 2017 21:24:25 -0700 Subject: [PATCH 0347/1164] Remove go to implementaiton from context menu Fixes #25913 --- .../editor/contrib/goToDeclaration/browser/goToDeclaration.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts index e2e84d0d951..9790e837d91 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts @@ -276,10 +276,6 @@ export class GoToImplementationAction extends ImplementationAction { kbOpts: { kbExpr: EditorContextKeys.textFocus, primary: KeyMod.CtrlCmd | KeyCode.F12 - }, - menuOpts: { - group: 'navigation', - order: 1.3 } }); } From e36e70707d5e2386be848aef5d81a3b8fad88019 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 11 May 2017 21:33:20 -0700 Subject: [PATCH 0348/1164] Added go to implementaiton and go to definition to go menu. Fixes #26461 --- src/vs/code/electron-main/menus.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index 90b2eda68ec..d6dc264d311 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -803,6 +803,8 @@ export class VSCodeMenu { const gotoSymbolInFile = this.createMenuItem(nls.localize({ key: 'miGotoSymbolInFile', comment: ['&& denotes a mnemonic'] }, "Go to &&Symbol in File..."), 'workbench.action.gotoSymbol'); const gotoSymbolInWorkspace = this.createMenuItem(nls.localize({ key: 'miGotoSymbolInWorkspace', comment: ['&& denotes a mnemonic'] }, "Go to Symbol in &&Workspace..."), 'workbench.action.showAllSymbols'); const gotoDefinition = this.createMenuItem(nls.localize({ key: 'miGotoDefinition', comment: ['&& denotes a mnemonic'] }, "Go to &&Definition"), 'editor.action.goToDeclaration'); + const gotoTypeDefinition = this.createMenuItem(nls.localize({ key: 'miGotoTypeDefinition', comment: ['&& denotes a mnemonic'] }, "Go to &&Type Definition"), 'editor.action.goToTypeDefinition'); + const goToImplementation = this.createMenuItem(nls.localize({ key: 'miGotoImplementation', comment: ['&& denotes a mnemonic'] }, "Go to &&Implementation"), 'editor.action.goToImplementation'); const gotoLine = this.createMenuItem(nls.localize({ key: 'miGotoLine', comment: ['&& denotes a mnemonic'] }, "Go to &&Line..."), 'workbench.action.gotoLine'); [ @@ -816,6 +818,8 @@ export class VSCodeMenu { gotoSymbolInFile, gotoSymbolInWorkspace, gotoDefinition, + gotoTypeDefinition, + goToImplementation, gotoLine ].forEach(item => gotoMenu.append(item)); } From f6ab171ab619a988b84fd1b91bb76e65847115a2 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 12 May 2017 07:59:00 +0200 Subject: [PATCH 0349/1164] :lipstick: --- .../quickopen/browser/commandsHandler.ts | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts b/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts index e127165fe58..dbe683fb45b 100644 --- a/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts +++ b/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts @@ -70,12 +70,14 @@ class CommandPaletteEditorAction extends EditorAction { } class BaseCommandEntry extends QuickOpenEntryGroup { + private commandId: string; private keyLabel: string; private keyAriaLabel: string; private label: string; private alias: string; constructor( + commandId: string, keyLabel: string, keyAriaLabel: string, label: string, @@ -87,6 +89,7 @@ class BaseCommandEntry extends QuickOpenEntryGroup { ) { super(); + this.commandId = commandId; this.keyLabel = keyLabel; this.keyAriaLabel = keyAriaLabel; this.label = label; @@ -100,6 +103,10 @@ class BaseCommandEntry extends QuickOpenEntryGroup { this.setHighlights(labelHighlights, null, aliasHighlights); } + public getCommandId(): string { + return this.commandId; + } + public getLabel(): string { return this.label; } @@ -155,6 +162,7 @@ class CommandEntry extends BaseCommandEntry { private actionDescriptor: SyncActionDescriptor; constructor( + commandId: string, keyLabel: string, keyAriaLabel: string, label: string, @@ -166,7 +174,7 @@ class CommandEntry extends BaseCommandEntry { @IMessageService messageService: IMessageService, @ITelemetryService telemetryService: ITelemetryService ) { - super(keyLabel, keyAriaLabel, label, meta, labelHighlights, aliasHighlights, messageService, telemetryService); + super(commandId, keyLabel, keyAriaLabel, label, meta, labelHighlights, aliasHighlights, messageService, telemetryService); this.actionDescriptor = actionDescriptor; } @@ -187,6 +195,7 @@ class EditorActionCommandEntry extends BaseCommandEntry { private action: IEditorAction; constructor( + commandId: string, keyLabel: string, keyAriaLabel: string, label: string, @@ -197,7 +206,7 @@ class EditorActionCommandEntry extends BaseCommandEntry { @IMessageService messageService: IMessageService, @ITelemetryService telemetryService: ITelemetryService ) { - super(keyLabel, keyAriaLabel, label, meta, labelHighlights, aliasHighlights, messageService, telemetryService); + super(commandId, keyLabel, keyAriaLabel, label, meta, labelHighlights, aliasHighlights, messageService, telemetryService); this.action = action; } @@ -230,6 +239,7 @@ class ActionCommandEntry extends BaseCommandEntry { private action: IAction; constructor( + commandId: string, keyLabel: string, keyAriaLabel: string, label: string, @@ -240,7 +250,7 @@ class ActionCommandEntry extends BaseCommandEntry { @IMessageService messageService: IMessageService, @ITelemetryService telemetryService: ITelemetryService ) { - super(keyLabel, keyAriaLabel, label, alias, labelHighlights, aliasHighlights, messageService, telemetryService); + super(commandId, keyLabel, keyAriaLabel, label, alias, labelHighlights, aliasHighlights, messageService, telemetryService); this.action = action; } @@ -308,7 +318,7 @@ export class CommandsHandler extends QuickOpenHandler { let entries = [...workbenchEntries, ...editorEntries, ...commandEntries]; // Remove duplicates - entries = arrays.distinct(entries, (entry) => entry.getLabel() + entry.getGroupLabel()); + entries = arrays.distinct(entries, entry => entry.getCommandId()); // Sort by name entries = entries.sort((elementA, elementB) => elementA.getLabel().toLowerCase().localeCompare(elementB.getLabel().toLowerCase())); @@ -340,7 +350,7 @@ export class CommandsHandler extends QuickOpenHandler { const labelHighlights = wordFilter(searchValue, label); const aliasHighlights = alias ? wordFilter(searchValue, alias) : null; if (labelHighlights || aliasHighlights) { - entries.push(this.instantiationService.createInstance(CommandEntry, keyLabel, keyAriaLabel, label, alias, labelHighlights, aliasHighlights, actionDescriptor)); + entries.push(this.instantiationService.createInstance(CommandEntry, actionDescriptor.id, keyLabel, keyAriaLabel, label, alias, labelHighlights, aliasHighlights, actionDescriptor)); } } } @@ -353,6 +363,9 @@ export class CommandsHandler extends QuickOpenHandler { for (let i = 0; i < actions.length; i++) { const action = actions[i]; + if (action.id === ShowAllCommandsAction.ID) { + continue; // avoid duplicates + } const keybinding = this.keybindingService.lookupKeybinding(action.id); const keyLabel = keybinding ? keybinding.getLabel() : ''; @@ -366,7 +379,7 @@ export class CommandsHandler extends QuickOpenHandler { const labelHighlights = wordFilter(searchValue, label); const aliasHighlights = alias ? wordFilter(searchValue, alias) : null; if (labelHighlights || aliasHighlights) { - entries.push(this.instantiationService.createInstance(EditorActionCommandEntry, keyLabel, keyAriaLabel, label, alias, labelHighlights, aliasHighlights, action)); + entries.push(this.instantiationService.createInstance(EditorActionCommandEntry, action.id, keyLabel, keyAriaLabel, label, alias, labelHighlights, aliasHighlights, action)); } } } @@ -401,7 +414,7 @@ export class CommandsHandler extends QuickOpenHandler { } const aliasHighlights = alias ? wordFilter(searchValue, alias) : null; if (labelHighlights || aliasHighlights) { - entries.push(this.instantiationService.createInstance(ActionCommandEntry, keyLabel, keyAriaLabel, label, alias, labelHighlights, aliasHighlights, action)); + entries.push(this.instantiationService.createInstance(ActionCommandEntry, action.id, keyLabel, keyAriaLabel, label, alias, labelHighlights, aliasHighlights, action)); } } } From b3961defce008aedacab7c5153907c9eb7f5cb82 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 11 May 2017 23:17:50 -0700 Subject: [PATCH 0350/1164] Fix crash in webview while updating zoom when webcontent is potentially destroyed. Fixes #26509 --- src/vs/workbench/parts/html/browser/webview.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/workbench/parts/html/browser/webview.ts b/src/vs/workbench/parts/html/browser/webview.ts index 799ca78bef0..7b81825984d 100644 --- a/src/vs/workbench/parts/html/browser/webview.ts +++ b/src/vs/workbench/parts/html/browser/webview.ts @@ -253,6 +253,10 @@ export default class Webview { return; } window.webContents.getZoomFactor(factor => { + if (contents.isDestroyed()) { + return; + } + contents.setZoomFactor(factor); const width = this.parent.clientWidth; From d8df161717157e82f536181e956914e92e169731 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 12 May 2017 09:34:45 +0200 Subject: [PATCH 0351/1164] remove linux build todo --- build/gulpfile.vscode.linux.js | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/build/gulpfile.vscode.linux.js b/build/gulpfile.vscode.linux.js index cc8f75a0c9c..54c73a538c2 100644 --- a/build/gulpfile.vscode.linux.js +++ b/build/gulpfile.vscode.linux.js @@ -259,20 +259,16 @@ gulp.task('clean-vscode-linux-ia32-rpm', util.rimraf('.build/linux/rpm/i386')); gulp.task('clean-vscode-linux-x64-rpm', util.rimraf('.build/linux/rpm/x86_64')); gulp.task('clean-vscode-linux-arm-rpm', util.rimraf('.build/linux/rpm/armhf')); -// TODO@joao TODO@daniel -// commented out the dependencies to the actual building of VS Code -// we gotta make sure those targets run before these run, in our TFS builds - -gulp.task('vscode-linux-ia32-prepare-deb', ['clean-vscode-linux-ia32-deb'/*, 'vscode-linux-ia32-min'*/], prepareDebPackage('ia32')); -gulp.task('vscode-linux-x64-prepare-deb', ['clean-vscode-linux-x64-deb'/*, 'vscode-linux-x64-min'*/], prepareDebPackage('x64')); -gulp.task('vscode-linux-arm-prepare-deb', ['clean-vscode-linux-arm-deb'/*, 'vscode-linux-arm-min'*/], prepareDebPackage('arm')); +gulp.task('vscode-linux-ia32-prepare-deb', ['clean-vscode-linux-ia32-deb'], prepareDebPackage('ia32')); +gulp.task('vscode-linux-x64-prepare-deb', ['clean-vscode-linux-x64-deb'], prepareDebPackage('x64')); +gulp.task('vscode-linux-arm-prepare-deb', ['clean-vscode-linux-arm-deb'], prepareDebPackage('arm')); gulp.task('vscode-linux-ia32-build-deb', ['vscode-linux-ia32-prepare-deb'], buildDebPackage('ia32')); gulp.task('vscode-linux-x64-build-deb', ['vscode-linux-x64-prepare-deb'], buildDebPackage('x64')); gulp.task('vscode-linux-arm-build-deb', ['vscode-linux-arm-prepare-deb'], buildDebPackage('arm')); -gulp.task('vscode-linux-ia32-prepare-rpm', ['clean-vscode-linux-ia32-rpm'/*, 'vscode-linux-ia32-min'*/], prepareRpmPackage('ia32')); -gulp.task('vscode-linux-x64-prepare-rpm', ['clean-vscode-linux-x64-rpm'/*, 'vscode-linux-x64-min'*/], prepareRpmPackage('x64')); -gulp.task('vscode-linux-arm-prepare-rpm', ['clean-vscode-linux-arm-rpm'/*, 'vscode-linux-arm-min'*/], prepareRpmPackage('arm')); +gulp.task('vscode-linux-ia32-prepare-rpm', ['clean-vscode-linux-ia32-rpm'], prepareRpmPackage('ia32')); +gulp.task('vscode-linux-x64-prepare-rpm', ['clean-vscode-linux-x64-rpm'], prepareRpmPackage('x64')); +gulp.task('vscode-linux-arm-prepare-rpm', ['clean-vscode-linux-arm-rpm'], prepareRpmPackage('arm')); gulp.task('vscode-linux-ia32-build-rpm', ['vscode-linux-ia32-prepare-rpm'], buildRpmPackage('ia32')); gulp.task('vscode-linux-x64-build-rpm', ['vscode-linux-x64-prepare-rpm'], buildRpmPackage('x64')); gulp.task('vscode-linux-arm-build-rpm', ['vscode-linux-arm-prepare-rpm'], buildRpmPackage('arm')); @@ -281,9 +277,9 @@ gulp.task('clean-vscode-linux-ia32-flatpak', util.rimraf('.build/linux/flatpak/i gulp.task('clean-vscode-linux-x64-flatpak', util.rimraf('.build/linux/flatpak/x86_64')); gulp.task('clean-vscode-linux-arm-flatpak', util.rimraf('.build/linux/flatpak/arm')); -gulp.task('vscode-linux-ia32-prepare-flatpak', ['clean-vscode-linux-ia32-flatpak'/*, 'vscode-linux-ia32-min'*/], prepareFlatpak('ia32')); -gulp.task('vscode-linux-x64-prepare-flatpak', ['clean-vscode-linux-x64-flatpak'/*, 'vscode-linux-x64-min'*/], prepareFlatpak('x64')); -gulp.task('vscode-linux-arm-prepare-flatpak', ['clean-vscode-linux-arm-flatpak'/*, 'vscode-linux-arm-min'*/], prepareFlatpak('arm')); +gulp.task('vscode-linux-ia32-prepare-flatpak', ['clean-vscode-linux-ia32-flatpak'], prepareFlatpak('ia32')); +gulp.task('vscode-linux-x64-prepare-flatpak', ['clean-vscode-linux-x64-flatpak'], prepareFlatpak('x64')); +gulp.task('vscode-linux-arm-prepare-flatpak', ['clean-vscode-linux-arm-flatpak'], prepareFlatpak('arm')); gulp.task('vscode-linux-ia32-flatpak', ['vscode-linux-ia32-prepare-flatpak'], buildFlatpak('ia32')); gulp.task('vscode-linux-x64-flatpak', ['vscode-linux-x64-prepare-flatpak'], buildFlatpak('x64')); From 9a0567a63868ef5a0dcfe0059645e849aca44dba Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 12 May 2017 09:57:34 +0200 Subject: [PATCH 0352/1164] allow for undo stops before/after --- .../contrib/snippet/browser/snippetController2.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 57b2b0af6ec..238a2632c10 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -52,12 +52,21 @@ export class SnippetController2 { return 'snippetController2'; } - insert(template: string, overwriteBefore: number = 0, overwriteAfter: number = 0): void { + insert(template: string, + overwriteBefore: number = 0, overwriteAfter: number = 0, + undoStopBefore: boolean = true, undoStopAfter: boolean = true + ): void { if (this._snippet) { this.cancel(); } this._snippet = new SnippetSession(this._editor, template, overwriteBefore, overwriteAfter); + if (undoStopBefore) { + this._editor.getModel().pushStackElement(); + } this._snippet.insert(); + if (undoStopAfter) { + this._editor.getModel().pushStackElement(); + } this._snippetListener = [ this._editor.onDidChangeModel(() => this.cancel()), this._editor.onDidChangeCursorSelection(() => this._updateState()) From 8d8390bc9b4b16862ff0924b213344248ec3acbf Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 12 May 2017 10:07:10 +0200 Subject: [PATCH 0353/1164] Fixes #26446: Artificially inflate the width of collapsed multiline decorations --- .../browser/viewParts/decorations/decorations.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/vs/editor/browser/viewParts/decorations/decorations.ts b/src/vs/editor/browser/viewParts/decorations/decorations.ts index 30434c51b69..e129ecb6143 100644 --- a/src/vs/editor/browser/viewParts/decorations/decorations.ts +++ b/src/vs/editor/browser/viewParts/decorations/decorations.ts @@ -159,18 +159,18 @@ export class DecorationsOverlay extends DynamicViewOverlay { continue; } - if (linesVisibleRanges.length === 1 && linesVisibleRanges[0].ranges.length === 1) { - const singleVisibleRange = linesVisibleRanges[0].ranges[0]; - if (singleVisibleRange.width === 0) { - // collapsed range case => make the decoration visible by faking its width - linesVisibleRanges[0].ranges[0] = new HorizontalRange(singleVisibleRange.left, this._typicalHalfwidthCharacterWidth); - } - } - for (let j = 0, lenJ = linesVisibleRanges.length; j < lenJ; j++) { let lineVisibleRanges = linesVisibleRanges[j]; let lineIndex = lineVisibleRanges.lineNumber - visibleStartLineNumber; + if (lineVisibleRanges.ranges.length === 1) { + const singleVisibleRange = lineVisibleRanges.ranges[0]; + if (singleVisibleRange.width === 0) { + // collapsed range case => make the decoration visible by faking its width + lineVisibleRanges.ranges[0] = new HorizontalRange(singleVisibleRange.left, this._typicalHalfwidthCharacterWidth); + } + } + for (let k = 0, lenK = lineVisibleRanges.ranges.length; k < lenK; k++) { let visibleRange = lineVisibleRanges.ranges[k]; let decorationOutput = ( From 9240c59686cc42802c07f975e6fea7a8129df017 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 12 May 2017 10:09:11 +0200 Subject: [PATCH 0354/1164] Fix #26357 --- src/vs/workbench/parts/preferences/browser/preferencesEditor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts index 9d2702ff6bc..652e97a9e23 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts @@ -159,7 +159,7 @@ export class PreferencesEditor extends BaseEditor { } public focus(): void { - this.sideBySidePreferencesWidget.focus(); + this.searchWidget.focus(); } public focusSearch(): void { From 47fbe1943dd1862f35036f2befc69977ed289546 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 12 May 2017 10:16:59 +0200 Subject: [PATCH 0355/1164] commands: handle label clashes better --- .../quickopen/browser/commandsHandler.ts | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts b/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts index dbe683fb45b..5435cc3a698 100644 --- a/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts +++ b/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts @@ -50,7 +50,7 @@ class CommandPaletteEditorAction extends EditorAction { constructor() { super({ - id: 'workbench.action.showCommands', + id: ShowAllCommandsAction.ID, label: nls.localize('showCommands.label', "Command Palette..."), alias: 'Command Palette', precondition: null, @@ -74,6 +74,7 @@ class BaseCommandEntry extends QuickOpenEntryGroup { private keyLabel: string; private keyAriaLabel: string; private label: string; + private description: string; private alias: string; constructor( @@ -111,6 +112,14 @@ class BaseCommandEntry extends QuickOpenEntryGroup { return this.label; } + public getDescription(): string { + return this.description; + } + + public setDescription(description: string): void { + this.description = description; + } + public getDetail(): string { return this.alias; } @@ -147,14 +156,14 @@ class BaseCommandEntry extends QuickOpenEntryGroup { this.telemetryService.publicLog('workbenchActionExecuted', { id: action.id, from: 'quick open' }); (action.run() || TPromise.as(null)).done(() => { action.dispose(); - }, (err) => this.onError(err)); + }, err => this.onError(err)); } catch (error) { this.onError(error); } } else { this.messageService.show(Severity.Info, nls.localize('actionNotEnabled', "Command '{0}' is not enabled in the current context.", this.getLabel())); } - }, (err) => this.onError(err)); + }, err => this.onError(err)); } } @@ -218,14 +227,14 @@ class EditorActionCommandEntry extends BaseCommandEntry { if (this.action) { try { this.telemetryService.publicLog('workbenchActionExecuted', { id: this.action.id, from: 'quick open' }); - (this.action.run() || TPromise.as(null)).done(null, (err) => this.onError(err)); + (this.action.run() || TPromise.as(null)).done(null, err => this.onError(err)); } catch (error) { this.onError(error); } } else { this.messageService.show(Severity.Info, nls.localize('actionNotEnabled', "Command '{0}' is not enabled in the current context.", this.getLabel())); } - }, (err) => this.onError(err)); + }, err => this.onError(err)); return true; } @@ -318,7 +327,18 @@ export class CommandsHandler extends QuickOpenHandler { let entries = [...workbenchEntries, ...editorEntries, ...commandEntries]; // Remove duplicates - entries = arrays.distinct(entries, entry => entry.getCommandId()); + entries = arrays.distinct(entries, entry => `${entry.getLabel()}${entry.getGroupLabel()}${entry.getCommandId()}`); + + // Handle label clashes + const commandLabels = new Set(); + entries.forEach(entry => { + const commandLabel = `${entry.getLabel()}${entry.getGroupLabel()}`; + if (commandLabels.has(commandLabel)) { + entry.setDescription(entry.getCommandId()); + } else { + commandLabels.add(commandLabel); + } + }); // Sort by name entries = entries.sort((elementA, elementB) => elementA.getLabel().toLowerCase().localeCompare(elementB.getLabel().toLowerCase())); From a5927ad2e63871467bce175e962a1f3c85eb0dcc Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 12 May 2017 10:16:01 +0200 Subject: [PATCH 0356/1164] debug: viewer get cached callStack --- .../debug/electron-browser/debugViewer.ts | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts index b29c2e15648..88619fbcc71 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts @@ -351,7 +351,7 @@ export class CallStackDataSource implements IDataSource { public getChildren(tree: ITree, element: any): TPromise { if (element instanceof Thread) { - return this.getThreadChildren(element); + return TPromise.as(this.getThreadChildren(element)); } if (element instanceof Model) { return TPromise.as(element.getProcesses()); @@ -361,17 +361,16 @@ export class CallStackDataSource implements IDataSource { return TPromise.as(process.getAllThreads()); } - private getThreadChildren(thread: Thread): TPromise { - return thread.fetchCallStack().then((callStack: any[]) => { - if (thread.stoppedDetails && thread.stoppedDetails.framesErrorMessage) { - return callStack.concat([thread.stoppedDetails.framesErrorMessage]); - } - if (thread.stoppedDetails && thread.stoppedDetails.totalFrames > callStack.length) { - return callStack.concat([new ThreadAndProcessIds(thread.process.getId(), thread.threadId)]); - } + private getThreadChildren(thread: Thread): any[] { + const callStack: any[] = thread.getCallStack(); + if (thread.stoppedDetails && thread.stoppedDetails.framesErrorMessage) { + return callStack.concat([thread.stoppedDetails.framesErrorMessage]); + } + if (thread.stoppedDetails && thread.stoppedDetails.totalFrames > callStack.length) { + return callStack.concat([new ThreadAndProcessIds(thread.process.getId(), thread.threadId)]); + } - return callStack; - }); + return callStack; } public getParent(tree: ITree, element: any): TPromise { From 64db7ea7224e5b4cd971763a0bf856b5e3906d24 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 12 May 2017 10:26:43 +0200 Subject: [PATCH 0357/1164] improve build logging --- build/tfs/darwin/build.sh | 29 ++++++++++++++++++----------- build/tfs/win32/1_build.ps1 | 10 +++++----- build/tfs/win32/2_package.ps1 | 2 +- build/tfs/win32/3_upload.ps1 | 7 +++++-- build/tfs/win32/lib.ps1 | 16 ++++++++++++---- 5 files changed, 41 insertions(+), 23 deletions(-) diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh index f1faaca849d..71f5007ad4c 100755 --- a/build/tfs/darwin/build.sh +++ b/build/tfs/darwin/build.sh @@ -1,25 +1,32 @@ #!/bin/sh set -e -# npm install +# log build step +STEP() { + echo "********************************************************************************" + echo "*** $*" + echo "********************************************************************************" + echo "" +} + +STEP "npm install" ./scripts/npm.sh install -# mixin +STEP "mixin repository from vscode-distro" npm run gulp -- mixin -# compile & upload source maps +STEP "build minified win32, upload source maps" npm run gulp -- --max_old_space_size=4096 vscode-darwin-min upload-vscode-sourcemaps -# run tests +STEP "run unit tests" ./scripts/test.sh --build --reporter dot -# run integration tests +STEP "run integration tests" ./scripts/test-integration.sh -# npm install publish tools +STEP "npm install build dependencies" (cd $BUILD_SOURCESDIRECTORY/build/tfs && npm i) -# set up variables REPO=`pwd` ZIP=$REPO/../VSCode-darwin-selfsigned.zip UNSIGNEDZIP=$REPO/../VSCode-darwin-unsigned.zip @@ -27,14 +34,14 @@ BUILD=$REPO/../VSCode-darwin PACKAGEJSON=`ls $BUILD/*.app/Contents/Resources/app/package.json` VERSION=`node -p "require(\"$PACKAGEJSON\").version"` -# archive unsigned build +STEP "create unsigned archive" ( rm -rf $UNSIGNEDZIP ; cd $BUILD && zip -r -X -y $UNSIGNEDZIP * ) -# publish unsigned build +STEP "publish unsigned archive" node build/tfs/out/publish.js $VSCODE_QUALITY darwin archive-unsigned VSCode-darwin-$VSCODE_QUALITY-unsigned.zip $VERSION false $UNSIGNEDZIP -# create signing request +STEP "create signing request" node build/tfs/out/enqueue.js $VSCODE_QUALITY -# wait for signed build +STEP "wait for signed build" node build/tfs/out/waitForSignedBuild.js $VSCODE_QUALITY \ No newline at end of file diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index f3da6228d0d..b361f593c94 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -4,18 +4,18 @@ Param( . .\build\tfs\win32\lib.ps1 -# npm install +STEP "npm install" exec { & .\scripts\npm.bat install } -# mixin +STEP "mixin repository from vscode-distro" $env:VSCODE_MIXIN_PASSWORD = $mixinPassword exec { & npm run gulp -- mixin } -# compile +STEP "build minified win32" exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-min } -# run tests +STEP "run unit tests" exec { & .\scripts\test.bat --build --reporter dot } -# run integration tests +# STEP "run integration tests" # exec { & .\scripts\test-integration.bat } \ No newline at end of file diff --git a/build/tfs/win32/2_package.ps1 b/build/tfs/win32/2_package.ps1 index 5be478fb5a1..adae1918745 100644 --- a/build/tfs/win32/2_package.ps1 +++ b/build/tfs/win32/2_package.ps1 @@ -1,4 +1,4 @@ . .\build\tfs\win32\lib.ps1 -# archive +STEP "create win32 archive and setup package" exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-archive vscode-win32-setup } \ No newline at end of file diff --git a/build/tfs/win32/3_upload.ps1 b/build/tfs/win32/3_upload.ps1 index 55e1a5bb54b..6a1fd7f132a 100644 --- a/build/tfs/win32/3_upload.ps1 +++ b/build/tfs/win32/3_upload.ps1 @@ -17,7 +17,7 @@ $PackageJson = Get-Content -Raw -Path "$Build\resources\app\package.json" | Conv $Version = $PackageJson.version $Quality = "$env:VSCODE_QUALITY" -# npm install publish tools +STEP "npm install build dependencies" pushd "$Repo\build\tfs" exec { & npm i } popd @@ -26,5 +26,8 @@ $env:AZURE_STORAGE_ACCESS_KEY_2 = $storageKey $env:MOONCAKE_STORAGE_ACCESS_KEY = $mooncakeStorageKey $env:AZURE_DOCUMENTDB_MASTERKEY = $documentDbKey -exec { & node build/tfs/out/publish.js $Quality win32 setup "VSCodeSetup-$Version.exe" $Version true $Exe } +STEP "publish win32 archive" exec { & node build/tfs/out/publish.js $Quality win32-archive archive "VSCode-win32-$Version.zip" $Version true $Zip } + +STEP "publish win32 setup" +exec { & node build/tfs/out/publish.js $Quality win32 setup "VSCodeSetup-$Version.exe" $Version true $Exe } diff --git a/build/tfs/win32/lib.ps1 b/build/tfs/win32/lib.ps1 index 9df1a69157b..e4c3244ac20 100644 --- a/build/tfs/win32/lib.ps1 +++ b/build/tfs/win32/lib.ps1 @@ -8,8 +8,16 @@ if (Test-Path env:AGENT_WORKFOLDER) { # throw when a process exits with something other than 0 function exec([scriptblock]$cmd, [string]$errorMessage = "Error executing command: " + $cmd) { - & $cmd - if ($LastExitCode -ne 0) { - throw $errorMessage - } + & $cmd + if ($LastExitCode -ne 0) { + throw $errorMessage + } +} + +# log build step +function STEP() { + Write-Host "********************************************************************************" + Write-Host "*** $args" + Write-Host "********************************************************************************" + Write-Host "" } From 3703614f56d69154ca200c1581cfbad93403621c Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 12 May 2017 10:41:17 +0200 Subject: [PATCH 0358/1164] better support for nested placeholders --- .../contrib/snippet/browser/snippetSession.ts | 37 ++++++++++++------- .../contrib/snippet/common/snippetParser.ts | 20 ++++++++++ .../test/browser/snippetParser.test.ts | 27 ++++++++++++++ .../test/browser/snippetSession.test.ts | 26 ++++++------- 4 files changed, 84 insertions(+), 26 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts index 474879194b1..2f104a3008b 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -89,31 +89,26 @@ class OneSnippet { this._init(); - let prevGroupsIdx = -1; - if (fwd && this._placeholderGroupsIdx < this._placeholderGroups.length - 1) { - prevGroupsIdx = this._placeholderGroupsIdx; this._placeholderGroupsIdx += 1; } else if (!fwd && this._placeholderGroupsIdx > 0) { - prevGroupsIdx = this._placeholderGroupsIdx; this._placeholderGroupsIdx -= 1; + + } else { + // the selection of the current placeholder might + // not acurate any more -> simply restore it } return this._editor.getModel().changeDecorations(accessor => { - // change stickness to never grow when typing at its edges - // so that in-active tabstops never grow - if (prevGroupsIdx !== -1) { - for (const placeholder of this._placeholderGroups[prevGroupsIdx]) { - const id = this._placeholderDecorations.get(placeholder); - accessor.changeDecorationOptions(id, OneSnippet._decor.inactive); - } - } + const activePlaceholders = new Set(); // change stickiness to always grow when typing at its edges // because these decorations represent the currently active - // tabstop. Special case: reaching the final tab stop + // tabstop. + // Special case #1: reaching the final tabstop + // Special case #2: placeholders enclosing active placeholders const selections: Selection[] = []; for (const placeholder of this._placeholderGroups[this._placeholderGroupsIdx]) { const id = this._placeholderDecorations.get(placeholder); @@ -121,7 +116,23 @@ class OneSnippet { selections.push(new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn)); accessor.changeDecorationOptions(id, placeholder.isFinalTabstop ? OneSnippet._decor.activeFinal : OneSnippet._decor.active); + activePlaceholders.add(placeholder); + + for (const enclosingPlaceholder of this._snippet.enclosingPlaceholders(placeholder)) { + const id = this._placeholderDecorations.get(enclosingPlaceholder); + accessor.changeDecorationOptions(id, enclosingPlaceholder.isFinalTabstop ? OneSnippet._decor.activeFinal : OneSnippet._decor.active); + activePlaceholders.add(enclosingPlaceholder); + } } + + // change stickness to never grow when typing at its edges + // so that in-active tabstops never grow + this._placeholderDecorations.forEach((id, placeholder) => { + if (!activePlaceholders.has(placeholder)) { + accessor.changeDecorationOptions(id, OneSnippet._decor.inactive); + } + }); + return selections; }); } diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/common/snippetParser.ts index 4378668eda4..ac384b0106e 100644 --- a/src/vs/editor/contrib/snippet/common/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/common/snippetParser.ts @@ -132,6 +132,12 @@ export abstract class Marker { return result; } + parent: Marker; + + protected _adopt(child: Marker): void { + child.parent = this; + } + toString() { return ''; } @@ -179,6 +185,7 @@ export class Placeholder extends Marker { constructor(public index: string = '', public defaultValue: Marker[]) { super(); + defaultValue.forEach(this._adopt, this); } get isFinalTabstop() { return this.index === '0'; @@ -194,6 +201,7 @@ export class Variable extends Marker { constructor(public name: string = '', public defaultValue: Marker[]) { super(); + defaultValue.forEach(this._adopt, this); } get isDefined(): boolean { return this.resolvedValue !== undefined; @@ -271,6 +279,18 @@ export class TextmateSnippet { return ret; } + enclosingPlaceholders(placeholder: Placeholder): Placeholder[] { + let ret: Placeholder[] = []; + let { parent } = placeholder; + while (parent) { + if (parent instanceof Placeholder) { + ret.push(parent); + } + parent = parent.parent; + } + return ret; + } + get text() { return Marker.toString(this.marker); } diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts index faa1f5cdcfc..f960afe2ffa 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts @@ -327,6 +327,33 @@ suite('SnippetParser', () => { assertLen('${TM_SELECTED_TEXT:def}$0', 0, 3, 0); }); + test('parser, parent node', function () { + let snippet = SnippetParser.parse('This ${1:is ${2:nested}}$0'); + + assert.equal(snippet.placeholders.length, 3); + let [first, second] = snippet.placeholders; + assert.equal(first.index, '1'); + assert.equal(second.index, '2'); + assert.ok(second.parent === first); + assert.ok(first.parent === undefined); + + snippet = SnippetParser.parse('${VAR:default${1:value}}$0'); + assert.equal(snippet.placeholders.length, 2); + [first] = snippet.placeholders; + assert.equal(first.index, '1'); + + assert.ok(snippet.marker[0] instanceof Variable); + assert.ok(first.parent === snippet.marker[0]); + }); + + test('TextmateSnippet#enclosingPlaceholders', function () { + let snippet = SnippetParser.parse('This ${1:is ${2:nested}}$0'); + let [first, second] = snippet.placeholders; + + assert.deepEqual(snippet.enclosingPlaceholders(first), []); + assert.deepEqual(snippet.enclosingPlaceholders(second), [first]); + }); + test('TextmateSnippet#offset', () => { let snippet = SnippetParser.parse('te$1xt'); assert.equal(snippet.offset(snippet.marker[0]), 0); diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts index c5544130cc6..8be9c9efdf1 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts @@ -378,23 +378,23 @@ suite('SnippetSession', function () { assertSelections(editor, new Selection(1, 11, 1, 11)); }); - // test('snippets, typing with nested placeholder', function () { + test('snippets, typing with nested placeholder', function () { - // editor.setSelection(new Selection(1, 1, 1, 1)); - // const session = new SnippetSession(editor, 'This ${1:is ${2:nested}}.$0'); - // session.insert(); - // assertSelections(editor, new Selection(1, 6, 1, 15)); + editor.setSelection(new Selection(1, 1, 1, 1)); + const session = new SnippetSession(editor, 'This ${1:is ${2:nested}}.$0'); + session.insert(); + assertSelections(editor, new Selection(1, 6, 1, 15)); - // session.next(); - // assertSelections(editor, new Selection(1, 9, 1, 15)); + session.next(); + assertSelections(editor, new Selection(1, 9, 1, 15)); - // editor.trigger('test', 'deleteLeft', {}); - // assertSelections(editor, new Selection(1, 9, 1, 9)); + editor.trigger('test', 'deleteLeft', {}); + assertSelections(editor, new Selection(1, 9, 1, 9)); - // editor.trigger('test', 'type', { text: 'XXX' }); - // session.prev(); - // assertSelections(editor, new Selection(1, 6, 1, 12)); - // }); + editor.trigger('test', 'type', { text: 'XXX' }); + session.prev(); + assertSelections(editor, new Selection(1, 6, 1, 12)); + }); test('snippets, snippet with variables', function () { const session = new SnippetSession(editor, '@line=$TM_LINE_NUMBER$0'); From 939398631cfadce1ec29c1f5d58dc45460d7d554 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 12 May 2017 10:51:55 +0200 Subject: [PATCH 0359/1164] show final tabstop --- src/vs/editor/contrib/snippet/browser/snippetSession.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts index 2f104a3008b..2c2c8ae4aa6 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -129,7 +129,7 @@ class OneSnippet { // so that in-active tabstops never grow this._placeholderDecorations.forEach((id, placeholder) => { if (!activePlaceholders.has(placeholder)) { - accessor.changeDecorationOptions(id, OneSnippet._decor.inactive); + accessor.changeDecorationOptions(id, placeholder.isFinalTabstop ? OneSnippet._decor.inactiveFinal : OneSnippet._decor.inactive); } }); From facba24c2dfeaa40360b1f42fae9674b76d196de Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 12 May 2017 11:03:02 +0200 Subject: [PATCH 0360/1164] bring tfs scripts to repo --- build/tfs/common/.gitignore | 2 + build/tfs/common/enqueue.ts | 86 ++++++++++++ build/tfs/common/package.json | 27 ++++ build/tfs/common/publish.ts | 241 +++++++++++++++++++++++++++++++++ build/tfs/common/tsconfig.json | 11 ++ build/tfs/common/tslint.json | 13 ++ build/tfs/common/util.ts | 69 ++++++++++ build/tfs/darwin/build.sh | 28 ++-- build/tfs/win32/1_build.ps1 | 10 +- build/tfs/win32/2_package.ps1 | 2 +- build/tfs/win32/3_upload.ps1 | 12 +- build/tfs/win32/lib.ps1 | 1 + 12 files changed, 475 insertions(+), 27 deletions(-) create mode 100644 build/tfs/common/.gitignore create mode 100644 build/tfs/common/enqueue.ts create mode 100644 build/tfs/common/package.json create mode 100644 build/tfs/common/publish.ts create mode 100644 build/tfs/common/tsconfig.json create mode 100644 build/tfs/common/tslint.json create mode 100644 build/tfs/common/util.ts diff --git a/build/tfs/common/.gitignore b/build/tfs/common/.gitignore new file mode 100644 index 00000000000..e94ecda764e --- /dev/null +++ b/build/tfs/common/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +*.js \ No newline at end of file diff --git a/build/tfs/common/enqueue.ts b/build/tfs/common/enqueue.ts new file mode 100644 index 00000000000..613805647b1 --- /dev/null +++ b/build/tfs/common/enqueue.ts @@ -0,0 +1,86 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { DocumentClient } from 'documentdb'; +import * as azure from 'azure-storage'; +import * as path from 'path'; +import { getVersion } from './util'; + +interface Asset { + platform: string; + type: string; + url: string; + mooncakeUrl: string; + hash: string; +} + +function queueSigningRequest(quality: string, commit: string): Promise { + const retryOperations = new azure.ExponentialRetryPolicyFilter(); + const queueSvc = azure + .createQueueService(process.env['AZURE_STORAGE_ACCOUNT_2'], process.env['AZURE_STORAGE_ACCESS_KEY_2']) + .withFilter(retryOperations); + + queueSvc.messageEncoder = new azure.QueueMessageEncoder.TextBase64QueueMessageEncoder(); + + const message = `${quality}/${commit}`; + + return new Promise((c, e) => queueSvc.createMessage('sign-darwin', message, err => err ? e(err) : c())); +} + +function isBuildSigned(quality: string, commit: string): Promise { + const client = new DocumentClient(process.env['AZURE_DOCUMENTDB_ENDPOINT'], { masterKey: process.env['AZURE_DOCUMENTDB_MASTERKEY'] }); + const collection = 'dbs/builds/colls/' + quality; + const updateQuery = { + query: 'SELECT TOP 1 * FROM c WHERE c.id = @id', + parameters: [{ name: '@id', value: commit }] + }; + + return new Promise((c, e) => { + client.queryDocuments(collection, updateQuery).toArray((err, results) => { + if (err) { return e(err); } + if (results.length !== 1) { return e(new Error('No such build')); } + + const [release] = results; + const assets: Asset[] = release.assets; + const isSigned = assets.some(a => a.platform === 'darwin' && a.type === 'archive'); + + c(isSigned); + }); + }); +} + +async function waitForSignedBuild(quality: string, commit: string): Promise { + let retries = 0; + + while (retries < 180) { + if (await isBuildSigned(quality, commit)) { + return; + } + + await new Promise(c => setTimeout(c, 10000)); + retries++; + } + + throw new Error('Timed out waiting for signed build'); +} + +async function main(quality: string): Promise { + const commit = getVersion(path.dirname(path.dirname(path.dirname(__dirname)))); + + console.log(`Queueing signing request for '${quality}/${commit}'...`); + await queueSigningRequest(quality, commit); + + console.log('Waiting on signed build...'); + await waitForSignedBuild(quality, commit); + + console.log('Found signed build!'); +} + +main(process.argv[2]).catch(err => { + console.error(err); + process.exit(1); +}); \ No newline at end of file diff --git a/build/tfs/common/package.json b/build/tfs/common/package.json new file mode 100644 index 00000000000..241757803a9 --- /dev/null +++ b/build/tfs/common/package.json @@ -0,0 +1,27 @@ +{ + "name": "vscode-distro", + "version": "1.0.0", + "description": "VS Code Distro", + "repository": { + "url": "https://github.com/Microsoft/vscode-distro" + }, + "main": "enqueue.js", + "scripts": { + "compile": "tsc", + "watch": "tsc --watch", + "postinstall": "npm run compile" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "@types/azure": "^0.9.18", + "@types/documentdb": "^1.10.1", + "@types/es6-promise": "0.0.32", + "@types/mime": "0.0.29", + "@types/node": "^7.0.13", + "azure-storage": "^2.1.0", + "documentdb": "^1.11.0", + "mime": "^1.3.4", + "typescript": "^2.2.2" + } +} \ No newline at end of file diff --git a/build/tfs/common/publish.ts b/build/tfs/common/publish.ts new file mode 100644 index 00000000000..03d0a3276d7 --- /dev/null +++ b/build/tfs/common/publish.ts @@ -0,0 +1,241 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as fs from 'fs'; +import * as path from 'path'; +import * as crypto from 'crypto'; +import * as azure from 'azure-storage'; +import * as mime from 'mime'; +import { DocumentClient, NewDocument } from 'documentdb'; +import { getVersion } from './util'; + +if (process.argv.length < 6) { + console.error('Usage: node publish.js '); + process.exit(-1); +} + +function log(...args: any[]) { + console.log(new Date().toISOString(), ...args); +} + +function sha1hash(file: string): Promise { + return new Promise((c, e) => { + const shasum = crypto.createHash('sha1'); + const stream = fs.createReadStream(file); + + stream + .on('data', shasum.update.bind(shasum)) + .on('error', e) + .on('close', () => c(shasum.digest('hex'))); + }); +} + +interface Config { + id: string; + frozen: boolean; +} + +function createDefaultConfig(quality: string): Config { + return { + id: quality, + frozen: false + }; +} + +function getConfig(quality: string): Promise { + const client = new DocumentClient(process.env['AZURE_DOCUMENTDB_ENDPOINT'], { masterKey: process.env['AZURE_DOCUMENTDB_MASTERKEY'] }); + const collection = 'dbs/builds/colls/config'; + const query = { + query: `SELECT TOP 1 * FROM c WHERE c.id = @quality`, + parameters: [ + { name: '@quality', value: quality } + ] + }; + + return new Promise((c, e) => { + client.queryDocuments(collection, query).toArray((err, results) => { + if (err && err.code !== 409) { return e(err); } + + c(!results || results.length === 0 ? createDefaultConfig(quality) : results[0] as any as Config); + }); + }); +} + +interface Asset { + platform: string; + type: string; + url: string; + mooncakeUrl: string; + hash: string; +} + +function createOrUpdate(commit: string, quality: string, platform: string, type: string, release: NewDocument, asset: Asset, isUpdate: boolean): Promise { + const client = new DocumentClient(process.env['AZURE_DOCUMENTDB_ENDPOINT'], { masterKey: process.env['AZURE_DOCUMENTDB_MASTERKEY'] }); + const collection = 'dbs/builds/colls/' + quality; + const updateQuery = { + query: 'SELECT TOP 1 * FROM c WHERE c.id = @id', + parameters: [{ name: '@id', value: commit }] + }; + + let updateTries = 0; + + function update(): Promise { + updateTries++; + + return new Promise((c, e) => { + client.queryDocuments(collection, updateQuery).toArray((err, results) => { + if (err) { return e(err); } + if (results.length !== 1) { return e(new Error('No documents')); } + + const release = results[0]; + + release.assets = [ + ...release.assets.filter((a: any) => !(a.platform === platform && a.type === type)), + asset + ]; + + if (isUpdate) { + release.updates[platform] = type; + } + + client.replaceDocument(release._self, release, err => { + if (err && err.code === 409 && updateTries < 5) { return c(update()); } + if (err) { return e(err); } + + log('Build successfully updated.'); + c(); + }); + }); + }); + } + + return new Promise((c, e) => { + client.createDocument(collection, release, err => { + if (err && err.code === 409) { return c(update()); } + if (err) { return e(err); } + + log('Build successfully published.'); + c(); + }); + }); +} + +async function assertContainer(blobService: azure.BlobService, quality: string): Promise { + await new Promise((c, e) => blobService.createContainerIfNotExists(quality, { publicAccessLevel: 'blob' }, err => err ? e(err) : c())); +} + +async function doesAssetExist(blobService: azure.BlobService, quality: string, blobName: string): Promise { + const existsResult = await new Promise((c, e) => blobService.doesBlobExist(quality, blobName, (err, r) => err ? e(err) : c(r))); + return existsResult.exists; +} + +async function uploadBlob(blobService: azure.BlobService, quality: string, blobName: string, file: string): Promise { + const blobOptions = { + contentType: mime.lookup(file), + cacheControl: 'max-age=31536000, public' + }; + + await new Promise((c, e) => blobService.createBlockBlobFromLocalFile(quality, blobName, file, blobOptions, err => err ? e(err) : c())); +} + +async function publish(quality: string, platform: string, type: string, name: string, version: string, _isUpdate: string, file: string): Promise { + const isUpdate = _isUpdate === 'true'; + + const queuedBy = process.env['BUILD_QUEUEDBY']; + const sourceBranch = process.env['BUILD_SOURCEBRANCH']; + const commit = getVersion(path.dirname(path.dirname(path.dirname(__dirname)))); + const isReleased = quality === 'insider' + && /^master$|^refs\/heads\/master$/.test(sourceBranch) + && /Project Collection Service Accounts|Microsoft.VisualStudio.Services.TFS/.test(queuedBy); + + log('Publishing...'); + log('Quality:', quality); + log('Platforn:', platform); + log('Type:', type); + log('Name:', name); + log('Version:', version); + log('Commit:', commit); + log('Is Update:', isUpdate); + log('Is Released:', isReleased); + log('File:', file); + + const hash = await sha1hash(file); + log('Hash:', hash); + + const blobName = commit + '/' + name; + const storageAccount = process.env['AZURE_STORAGE_ACCOUNT_2']; + + const blobService = azure.createBlobService(storageAccount, process.env['AZURE_STORAGE_ACCESS_KEY_2']) + .withFilter(new azure.ExponentialRetryPolicyFilter()); + + const mooncakeBlobService = azure.createBlobService(storageAccount, process.env['MOONCAKE_STORAGE_ACCESS_KEY'], `${storageAccount}.blob.core.chinacloudapi.cn`) + .withFilter(new azure.ExponentialRetryPolicyFilter()); + + await Promise.all([ + assertContainer(blobService, quality), + assertContainer(mooncakeBlobService, quality) + ]); + + const [blobExists, moooncakeBlobExists] = await Promise.all([ + doesAssetExist(blobService, quality, blobName), + doesAssetExist(mooncakeBlobService, quality, blobName) + ]); + + if (blobExists || moooncakeBlobExists) { + log(`Blob ${quality}, ${blobName} already exists, not publishing again.`); + return; + } + + log('Uploading blobs to Azure storage...'); + + await Promise.all([ + uploadBlob(blobService, quality, blobName, file), + uploadBlob(mooncakeBlobService, quality, blobName, file) + ]); + + log('Blobs successfully uploaded.'); + + const config = await getConfig(quality); + + log('Quality config:', config); + + const asset: Asset = { + platform: platform, + type: type, + url: `${process.env['AZURE_CDN_URL']}/${quality}/${blobName}`, + mooncakeUrl: `${process.env['MOONCAKE_CDN_URL']}/${quality}/${blobName}`, + hash: hash + }; + + const release = { + id: commit, + timestamp: (new Date()).getTime(), + version, + isReleased: config.frozen ? false : isReleased, + sourceBranch, + queuedBy, + assets: [asset], + updates: {} as any + }; + + if (isUpdate) { + release.updates[platform] = type; + } + + await createOrUpdate(commit, quality, platform, type, release, asset, isUpdate); +} + +function main(): void { + const [, , quality, platform, type, name, version, _isUpdate, file] = process.argv; + + publish(quality, platform, type, name, version, _isUpdate, file).catch(err => { + console.error(err); + process.exit(1); + }); +} + +main(); diff --git a/build/tfs/common/tsconfig.json b/build/tfs/common/tsconfig.json new file mode 100644 index 00000000000..8d56e59d09f --- /dev/null +++ b/build/tfs/common/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es5", + "noImplicitAny": true, + "noUnusedLocals": true, + "noImplicitThis": true, + "noImplicitReturns": true, + "noImplicitUseStrict": true + } +} \ No newline at end of file diff --git a/build/tfs/common/tslint.json b/build/tfs/common/tslint.json new file mode 100644 index 00000000000..e269a87c0e6 --- /dev/null +++ b/build/tfs/common/tslint.json @@ -0,0 +1,13 @@ +{ + "rules": { + "no-unused-expression": true, + "no-duplicate-variable": true, + "no-unused-variable": true, + "curly": true, + "class-name": true, + "semicolon": [ + "always" + ], + "triple-equals": true + } +} \ No newline at end of file diff --git a/build/tfs/common/util.ts b/build/tfs/common/util.ts new file mode 100644 index 00000000000..b0b3cb6c4fd --- /dev/null +++ b/build/tfs/common/util.ts @@ -0,0 +1,69 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as path from 'path'; +import * as fs from 'fs'; + +function getGitVersion(repo: string): string { + const git = path.join(repo, '.git'); + const headPath = path.join(git, 'HEAD'); + let head: string; + + try { + head = fs.readFileSync(headPath, 'utf8').trim(); + } catch (e) { + return void 0; + } + + if (/^[0-9a-f]{40}$/i.test(head)) { + return head; + } + + const refMatch = /^ref: (.*)$/.exec(head); + + if (!refMatch) { + return void 0; + } + + const ref = refMatch[1]; + const refPath = path.join(git, ref); + + try { + return fs.readFileSync(refPath, 'utf8').trim(); + } catch (e) { + // noop + } + + const packedRefsPath = path.join(git, 'packed-refs'); + let refsRaw: string; + + try { + refsRaw = fs.readFileSync(packedRefsPath, 'utf8').trim(); + } catch (e) { + return void 0; + } + + const refsRegex = /^([0-9a-f]{40})\s+(.+)$/gm; + let refsMatch: RegExpExecArray; + let refs: { [ref: string]: string } = {}; + + while (refsMatch = refsRegex.exec(refsRaw)) { + refs[refsMatch[2]] = refsMatch[1]; + } + + return refs[ref]; +} + +export function getVersion(root: string): string { + let version = process.env['BUILD_SOURCEVERSION']; + + if (!version || !/^[0-9a-f]{40}$/i.test(version)) { + version = getGitVersion(root); + } + + return version; +} \ No newline at end of file diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh index 71f5007ad4c..15c5d29e255 100755 --- a/build/tfs/darwin/build.sh +++ b/build/tfs/darwin/build.sh @@ -3,29 +3,30 @@ set -e # log build step STEP() { + echo "" echo "********************************************************************************" echo "*** $*" echo "********************************************************************************" echo "" } -STEP "npm install" +STEP "Install dependencies" ./scripts/npm.sh install -STEP "mixin repository from vscode-distro" +STEP "Mix in repository from vscode-distro" npm run gulp -- mixin -STEP "build minified win32, upload source maps" +STEP "Build minified & upload source maps" npm run gulp -- --max_old_space_size=4096 vscode-darwin-min upload-vscode-sourcemaps -STEP "run unit tests" +STEP "Run unit tests" ./scripts/test.sh --build --reporter dot -STEP "run integration tests" +STEP "Run integration tests" ./scripts/test-integration.sh -STEP "npm install build dependencies" -(cd $BUILD_SOURCESDIRECTORY/build/tfs && npm i) +STEP "Install build dependencies" +(cd $BUILD_SOURCESDIRECTORY/build/tfs/common && npm i) REPO=`pwd` ZIP=$REPO/../VSCode-darwin-selfsigned.zip @@ -34,14 +35,11 @@ BUILD=$REPO/../VSCode-darwin PACKAGEJSON=`ls $BUILD/*.app/Contents/Resources/app/package.json` VERSION=`node -p "require(\"$PACKAGEJSON\").version"` -STEP "create unsigned archive" +STEP "Create unsigned archive" ( rm -rf $UNSIGNEDZIP ; cd $BUILD && zip -r -X -y $UNSIGNEDZIP * ) -STEP "publish unsigned archive" -node build/tfs/out/publish.js $VSCODE_QUALITY darwin archive-unsigned VSCode-darwin-$VSCODE_QUALITY-unsigned.zip $VERSION false $UNSIGNEDZIP +STEP "Publish unsigned archive" +node build/tfs/common/publish.js $VSCODE_QUALITY darwin archive-unsigned VSCode-darwin-$VSCODE_QUALITY-unsigned.zip $VERSION false $UNSIGNEDZIP -STEP "create signing request" -node build/tfs/out/enqueue.js $VSCODE_QUALITY - -STEP "wait for signed build" -node build/tfs/out/waitForSignedBuild.js $VSCODE_QUALITY \ No newline at end of file +STEP "Sign build" +node build/tfs/common/enqueue.js $VSCODE_QUALITY \ No newline at end of file diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index b361f593c94..5a4f5dcba4b 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -4,18 +4,18 @@ Param( . .\build\tfs\win32\lib.ps1 -STEP "npm install" +STEP "Install dependencies" exec { & .\scripts\npm.bat install } -STEP "mixin repository from vscode-distro" +STEP "Mix in repository from vscode-distro" $env:VSCODE_MIXIN_PASSWORD = $mixinPassword exec { & npm run gulp -- mixin } -STEP "build minified win32" +STEP "Build minified" exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-min } -STEP "run unit tests" +STEP "Run unit tests" exec { & .\scripts\test.bat --build --reporter dot } -# STEP "run integration tests" +# STEP "Run integration tests" # exec { & .\scripts\test-integration.bat } \ No newline at end of file diff --git a/build/tfs/win32/2_package.ps1 b/build/tfs/win32/2_package.ps1 index adae1918745..689eccc5e30 100644 --- a/build/tfs/win32/2_package.ps1 +++ b/build/tfs/win32/2_package.ps1 @@ -1,4 +1,4 @@ . .\build\tfs\win32\lib.ps1 -STEP "create win32 archive and setup package" +STEP "Create archive and setup package" exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-archive vscode-win32-setup } \ No newline at end of file diff --git a/build/tfs/win32/3_upload.ps1 b/build/tfs/win32/3_upload.ps1 index 6a1fd7f132a..c11efbaff47 100644 --- a/build/tfs/win32/3_upload.ps1 +++ b/build/tfs/win32/3_upload.ps1 @@ -17,8 +17,8 @@ $PackageJson = Get-Content -Raw -Path "$Build\resources\app\package.json" | Conv $Version = $PackageJson.version $Quality = "$env:VSCODE_QUALITY" -STEP "npm install build dependencies" -pushd "$Repo\build\tfs" +STEP "Install build dependencies" +pushd "$Repo\build\tfs\common" exec { & npm i } popd @@ -26,8 +26,8 @@ $env:AZURE_STORAGE_ACCESS_KEY_2 = $storageKey $env:MOONCAKE_STORAGE_ACCESS_KEY = $mooncakeStorageKey $env:AZURE_DOCUMENTDB_MASTERKEY = $documentDbKey -STEP "publish win32 archive" -exec { & node build/tfs/out/publish.js $Quality win32-archive archive "VSCode-win32-$Version.zip" $Version true $Zip } +STEP "Publish archive" +exec { & node build/tfs/common/publish.js $Quality win32-archive archive "VSCode-win32-$Version.zip" $Version true $Zip } -STEP "publish win32 setup" -exec { & node build/tfs/out/publish.js $Quality win32 setup "VSCodeSetup-$Version.exe" $Version true $Exe } +STEP "Publish setup package" +exec { & node build/tfs/common/publish.js $Quality win32 setup "VSCodeSetup-$Version.exe" $Version true $Exe } diff --git a/build/tfs/win32/lib.ps1 b/build/tfs/win32/lib.ps1 index e4c3244ac20..c78d3fdf9ef 100644 --- a/build/tfs/win32/lib.ps1 +++ b/build/tfs/win32/lib.ps1 @@ -16,6 +16,7 @@ function exec([scriptblock]$cmd, [string]$errorMessage = "Error executing comman # log build step function STEP() { + Write-Host "" Write-Host "********************************************************************************" Write-Host "*** $args" Write-Host "********************************************************************************" From b548d2128d978cd2d37827464cdb5a7615a935b1 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 12 May 2017 11:24:10 +0200 Subject: [PATCH 0361/1164] split things up into api/node and api/electron-browser --- .../extensionHost.contribution.ts} | 2 +- .../mainThreadCommands.ts | 2 +- .../mainThreadConfiguration.ts | 2 +- .../mainThreadDiagnostics.ts | 2 +- .../mainThreadDocuments.ts | 2 +- .../mainThreadDocumentsAndEditors.ts | 4 +- .../mainThreadEditor.ts | 35 +-------------- .../mainThreadEditors.ts | 6 ++- .../mainThreadErrors.ts | 2 +- .../mainThreadExplorerView.ts | 2 +- .../mainThreadExtensionService.ts | 2 +- .../mainThreadFileSystemEventService.ts | 2 +- .../mainThreadHeapService.ts | 2 +- .../mainThreadLanguageFeatures.ts | 2 +- .../mainThreadLanguages.ts | 2 +- .../mainThreadMessageService.ts | 2 +- .../mainThreadOutputService.ts | 2 +- .../mainThreadProgress.ts | 2 +- .../mainThreadQuickOpen.ts | 2 +- .../mainThreadSCM.ts | 2 +- .../mainThreadSaveParticipant.ts | 2 +- .../mainThreadStatusBar.ts | 2 +- .../mainThreadStorage.ts | 4 +- .../mainThreadTask.ts | 4 +- .../mainThreadTelemetry.ts | 2 +- .../mainThreadTerminalService.ts | 2 +- .../mainThreadWorkspace.ts | 2 +- src/vs/workbench/api/node/extHost.protocol.ts | 44 ++++++++++++++++++- .../workbench/api/node/extHostTextEditor.ts | 3 +- .../workbench/api/node/extHostTextEditors.ts | 3 +- .../electron-browser/extensionHost.ts | 2 +- src/vs/workbench/electron-browser/shell.ts | 2 +- .../electron-browser/workbench.main.ts | 2 +- .../api/extHostApiCommands.test.ts | 6 +-- .../api/extHostLanguageFeatures.test.ts | 6 +-- .../api/extHostMessagerService.test.ts | 2 +- .../api/extHostTextEditor.test.ts | 3 +- .../api/mainThreadCommands.test.ts | 4 +- .../api/mainThreadDocuments.test.ts | 2 +- .../api/mainThreadDocumentsAndEditors.test.ts | 2 +- .../api/mainThreadSaveParticipant.test.ts | 4 +- 41 files changed, 94 insertions(+), 88 deletions(-) rename src/vs/workbench/api/{node/extHost.contribution.ts => electron-browser/extensionHost.contribution.ts} (98%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadCommands.ts (98%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadConfiguration.ts (95%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadDiagnostics.ts (94%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadDocuments.ts (99%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadDocumentsAndEditors.ts (99%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadEditor.ts (94%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadEditors.ts (97%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadErrors.ts (89%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadExplorerView.ts (98%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadExtensionService.ts (99%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadFileSystemEventService.ts (96%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadHeapService.ts (97%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadLanguageFeatures.ts (99%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadLanguages.ts (92%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadMessageService.ts (97%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadOutputService.ts (97%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadProgress.ts (95%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadQuickOpen.ts (97%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadSCM.ts (99%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadSaveParticipant.ts (99%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadStatusBar.ts (95%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadStorage.ts (95%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadTask.ts (97%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadTelemetry.ts (94%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadTerminalService.ts (98%) rename src/vs/workbench/api/{node => electron-browser}/mainThreadWorkspace.ts (98%) diff --git a/src/vs/workbench/api/node/extHost.contribution.ts b/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts similarity index 98% rename from src/vs/workbench/api/node/extHost.contribution.ts rename to src/vs/workbench/api/electron-browser/extensionHost.contribution.ts index 648e50ea3c1..5c84c61db35 100644 --- a/src/vs/workbench/api/node/extHost.contribution.ts +++ b/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts @@ -9,7 +9,7 @@ import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions as import { Registry } from 'vs/platform/platform'; import { IInstantiationService, IConstructorSignature0 } from 'vs/platform/instantiation/common/instantiation'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; -import { MainContext, InstanceCollection } from './extHost.protocol'; +import { MainContext, InstanceCollection } from '../node/extHost.protocol'; import { IExtensionService } from 'vs/platform/extensions/common/extensions'; // --- addressable diff --git a/src/vs/workbench/api/node/mainThreadCommands.ts b/src/vs/workbench/api/electron-browser/mainThreadCommands.ts similarity index 98% rename from src/vs/workbench/api/node/mainThreadCommands.ts rename to src/vs/workbench/api/electron-browser/mainThreadCommands.ts index 88a77f13009..bea731ce497 100644 --- a/src/vs/workbench/api/node/mainThreadCommands.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadCommands.ts @@ -8,7 +8,7 @@ import { IThreadService } from 'vs/workbench/services/thread/common/threadServic import { ICommandService, CommandsRegistry, ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; import { IDisposable } from 'vs/base/common/lifecycle'; import { TPromise } from 'vs/base/common/winjs.base'; -import { ExtHostContext, MainThreadCommandsShape, ExtHostCommandsShape } from './extHost.protocol'; +import { ExtHostContext, MainThreadCommandsShape, ExtHostCommandsShape } from '../node/extHost.protocol'; export class MainThreadCommands extends MainThreadCommandsShape { diff --git a/src/vs/workbench/api/node/mainThreadConfiguration.ts b/src/vs/workbench/api/electron-browser/mainThreadConfiguration.ts similarity index 95% rename from src/vs/workbench/api/node/mainThreadConfiguration.ts rename to src/vs/workbench/api/electron-browser/mainThreadConfiguration.ts index c77a7b026f4..75b6594d1fd 100644 --- a/src/vs/workbench/api/node/mainThreadConfiguration.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadConfiguration.ts @@ -9,7 +9,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; -import { MainThreadConfigurationShape, ExtHostContext } from './extHost.protocol'; +import { MainThreadConfigurationShape, ExtHostContext } from '../node/extHost.protocol'; export class MainThreadConfiguration extends MainThreadConfigurationShape { diff --git a/src/vs/workbench/api/node/mainThreadDiagnostics.ts b/src/vs/workbench/api/electron-browser/mainThreadDiagnostics.ts similarity index 94% rename from src/vs/workbench/api/node/mainThreadDiagnostics.ts rename to src/vs/workbench/api/electron-browser/mainThreadDiagnostics.ts index 6602a4284e3..f0abcbb6486 100644 --- a/src/vs/workbench/api/node/mainThreadDiagnostics.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDiagnostics.ts @@ -7,7 +7,7 @@ import { IMarkerService, IMarkerData } from 'vs/platform/markers/common/markers'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; -import { MainThreadDiagnosticsShape } from './extHost.protocol'; +import { MainThreadDiagnosticsShape } from '../node/extHost.protocol'; export class MainThreadDiagnostics extends MainThreadDiagnosticsShape { diff --git a/src/vs/workbench/api/node/mainThreadDocuments.ts b/src/vs/workbench/api/electron-browser/mainThreadDocuments.ts similarity index 99% rename from src/vs/workbench/api/node/mainThreadDocuments.ts rename to src/vs/workbench/api/electron-browser/mainThreadDocuments.ts index 153ddc8232f..120beef086f 100644 --- a/src/vs/workbench/api/node/mainThreadDocuments.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDocuments.ts @@ -15,7 +15,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; -import { ExtHostContext, MainThreadDocumentsShape, ExtHostDocumentsShape } from './extHost.protocol'; +import { ExtHostContext, MainThreadDocumentsShape, ExtHostDocumentsShape } from '../node/extHost.protocol'; import { ITextModelResolverService } from 'vs/editor/common/services/resolverService'; import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService'; import { ITextSource } from 'vs/editor/common/model/textSource'; diff --git a/src/vs/workbench/api/node/mainThreadDocumentsAndEditors.ts b/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts similarity index 99% rename from src/vs/workbench/api/node/mainThreadDocumentsAndEditors.ts rename to src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts index 8d710b5eceb..974d8a45c70 100644 --- a/src/vs/workbench/api/node/mainThreadDocumentsAndEditors.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts @@ -11,8 +11,8 @@ import { delta } from 'vs/base/common/arrays'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService'; import Event, { Emitter, any } from 'vs/base/common/event'; -import { ExtHostContext, ExtHostDocumentsAndEditorsShape, IModelAddedData, ITextEditorAddData, IDocumentsAndEditorsDelta } from './extHost.protocol'; -import { MainThreadTextEditor } from 'vs/workbench/api/node/mainThreadEditor'; +import { ExtHostContext, ExtHostDocumentsAndEditorsShape, IModelAddedData, ITextEditorAddData, IDocumentsAndEditorsDelta } from '../node/extHost.protocol'; +import { MainThreadTextEditor } from './mainThreadEditor'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/vs/workbench/api/node/mainThreadEditor.ts b/src/vs/workbench/api/electron-browser/mainThreadEditor.ts similarity index 94% rename from src/vs/workbench/api/node/mainThreadEditor.ts rename to src/vs/workbench/api/electron-browser/mainThreadEditor.ts index b3ba44a0361..601e99fa376 100644 --- a/src/vs/workbench/api/node/mainThreadEditor.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadEditor.ts @@ -15,19 +15,7 @@ import { SnippetController } from 'vs/editor/contrib/snippet/common/snippetContr import { EndOfLine, TextEditorLineNumbersStyle } from 'vs/workbench/api/node/extHostTypes'; import { TextEditorCursorStyle, cursorStyleToString } from 'vs/editor/common/config/editorOptions'; import { ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; - -export interface ITextEditorConfigurationUpdate { - tabSize?: number | 'auto'; - insertSpaces?: boolean | 'auto'; - cursorStyle?: TextEditorCursorStyle; - lineNumbers?: TextEditorLineNumbersStyle; -} -export interface IResolvedTextEditorConfiguration { - tabSize: number; - insertSpaces: boolean; - cursorStyle: TextEditorCursorStyle; - lineNumbers: TextEditorLineNumbersStyle; -} +import { IResolvedTextEditorConfiguration, ISelectionChangeEvent, ITextEditorConfigurationUpdate, TextEditorRevealType, IApplyEditsOptions, IUndoStopOptions } from 'vs/workbench/api/node/extHost.protocol'; function configurationsEqual(a: IResolvedTextEditorConfiguration, b: IResolvedTextEditorConfiguration) { if (a && !b || !a && b) { @@ -42,32 +30,11 @@ function configurationsEqual(a: IResolvedTextEditorConfiguration, b: IResolvedTe ); } -export interface ISelectionChangeEvent { - selections: Selection[]; - source?: string; -} - export interface IFocusTracker { onGainedFocus(): void; onLostFocus(): void; } -export enum TextEditorRevealType { - Default = 0, - InCenter = 1, - InCenterIfOutsideViewport = 2, - AtTop = 3 -} - -export interface IUndoStopOptions { - undoStopBefore: boolean; - undoStopAfter: boolean; -} - -export interface IApplyEditsOptions extends IUndoStopOptions { - setEndOfLine: EndOfLine; -} - /** * Text Editor that is permanently bound to the same model. * It can be bound or not to a CodeEditor. diff --git a/src/vs/workbench/api/node/mainThreadEditors.ts b/src/vs/workbench/api/electron-browser/mainThreadEditors.ts similarity index 97% rename from src/vs/workbench/api/node/mainThreadEditors.ts rename to src/vs/workbench/api/electron-browser/mainThreadEditors.ts index 1163612c0f0..3de296c7519 100644 --- a/src/vs/workbench/api/node/mainThreadEditors.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadEditors.ts @@ -13,11 +13,13 @@ import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService' import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { IEditorOptions, Position as EditorPosition } from 'vs/platform/editor/common/editor'; -import { TextEditorRevealType, MainThreadTextEditor, IApplyEditsOptions, IUndoStopOptions, ITextEditorConfigurationUpdate } from 'vs/workbench/api/node/mainThreadEditor'; +import { MainThreadTextEditor } from './mainThreadEditor'; +import { ITextEditorConfigurationUpdate, TextEditorRevealType, IApplyEditsOptions, IUndoStopOptions } from 'vs/workbench/api/node/extHost.protocol'; + import { MainThreadDocumentsAndEditors } from './mainThreadDocumentsAndEditors'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { equals as objectEquals } from 'vs/base/common/objects'; -import { ExtHostContext, MainThreadEditorsShape, ExtHostEditorsShape, ITextDocumentShowOptions, ITextEditorPositionData } from './extHost.protocol'; +import { ExtHostContext, MainThreadEditorsShape, ExtHostEditorsShape, ITextDocumentShowOptions, ITextEditorPositionData } from '../node/extHost.protocol'; import { IRange } from 'vs/editor/common/core/range'; import { ISelection } from 'vs/editor/common/core/selection'; diff --git a/src/vs/workbench/api/node/mainThreadErrors.ts b/src/vs/workbench/api/electron-browser/mainThreadErrors.ts similarity index 89% rename from src/vs/workbench/api/node/mainThreadErrors.ts rename to src/vs/workbench/api/electron-browser/mainThreadErrors.ts index 03ba71b8e3b..ca8962bc1f4 100644 --- a/src/vs/workbench/api/node/mainThreadErrors.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadErrors.ts @@ -5,7 +5,7 @@ 'use strict'; import * as errors from 'vs/base/common/errors'; -import { MainThreadErrorsShape } from './extHost.protocol'; +import { MainThreadErrorsShape } from '../node/extHost.protocol'; export class MainThreadErrors extends MainThreadErrorsShape { diff --git a/src/vs/workbench/api/node/mainThreadExplorerView.ts b/src/vs/workbench/api/electron-browser/mainThreadExplorerView.ts similarity index 98% rename from src/vs/workbench/api/node/mainThreadExplorerView.ts rename to src/vs/workbench/api/electron-browser/mainThreadExplorerView.ts index 8028c7069ec..19013b27409 100644 --- a/src/vs/workbench/api/node/mainThreadExplorerView.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadExplorerView.ts @@ -7,7 +7,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import Event, { Emitter } from 'vs/base/common/event'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; -import { ExtHostContext, MainThreadExplorerViewShape, ExtHostExplorerViewShape, ITreeNode } from './extHost.protocol'; +import { ExtHostContext, MainThreadExplorerViewShape, ExtHostExplorerViewShape, ITreeNode } from '../node/extHost.protocol'; import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IExplorerViewsService, IExplorerViewDataProvider, IExplorerView } from 'vs/workbench/parts/explorers/common/explorer'; diff --git a/src/vs/workbench/api/node/mainThreadExtensionService.ts b/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts similarity index 99% rename from src/vs/workbench/api/node/mainThreadExtensionService.ts rename to src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts index 05ca99e2f24..f5ba6b3cf3a 100644 --- a/src/vs/workbench/api/node/mainThreadExtensionService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts @@ -18,7 +18,7 @@ import { ExtensionsRegistry, ExtensionPoint, IExtensionPointUser, ExtensionMessa import { ExtensionScanner, MessagesCollector } from 'vs/workbench/node/extensionPoints'; import { IMessageService } from 'vs/platform/message/common/message'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; -import { ExtHostContext, ExtHostExtensionServiceShape } from './extHost.protocol'; +import { ExtHostContext, ExtHostExtensionServiceShape } from '../node/extHost.protocol'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; const SystemExtensionsRoot = path.normalize(path.join(URI.parse(require.toUrl('')).fsPath, '..', 'extensions')); diff --git a/src/vs/workbench/api/node/mainThreadFileSystemEventService.ts b/src/vs/workbench/api/electron-browser/mainThreadFileSystemEventService.ts similarity index 96% rename from src/vs/workbench/api/node/mainThreadFileSystemEventService.ts rename to src/vs/workbench/api/electron-browser/mainThreadFileSystemEventService.ts index 9e4dfebe5a6..49022aacc7c 100644 --- a/src/vs/workbench/api/node/mainThreadFileSystemEventService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadFileSystemEventService.ts @@ -6,7 +6,7 @@ import { FileChangeType, IFileService } from 'vs/platform/files/common/files'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; -import { ExtHostContext, ExtHostFileSystemEventServiceShape, FileSystemEvents } from './extHost.protocol'; +import { ExtHostContext, ExtHostFileSystemEventServiceShape, FileSystemEvents } from '../node/extHost.protocol'; export class MainThreadFileSystemEventService { diff --git a/src/vs/workbench/api/node/mainThreadHeapService.ts b/src/vs/workbench/api/electron-browser/mainThreadHeapService.ts similarity index 97% rename from src/vs/workbench/api/node/mainThreadHeapService.ts rename to src/vs/workbench/api/electron-browser/mainThreadHeapService.ts index 235556d3be3..aae6771afb5 100644 --- a/src/vs/workbench/api/node/mainThreadHeapService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadHeapService.ts @@ -7,7 +7,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; -import { ExtHostContext, ObjectIdentifier } from './extHost.protocol'; +import { ExtHostContext, ObjectIdentifier } from '../node/extHost.protocol'; import { consumeSignals, GCSignal } from 'gc-signals'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; diff --git a/src/vs/workbench/api/node/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts similarity index 99% rename from src/vs/workbench/api/node/mainThreadLanguageFeatures.ts rename to src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts index 925f5b2d019..03934ca9335 100644 --- a/src/vs/workbench/api/node/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts @@ -16,7 +16,7 @@ import { wireCancellationToken } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Position as EditorPosition } from 'vs/editor/common/core/position'; import { Range as EditorRange } from 'vs/editor/common/core/range'; -import { ExtHostContext, MainThreadLanguageFeaturesShape, ExtHostLanguageFeaturesShape } from './extHost.protocol'; +import { ExtHostContext, MainThreadLanguageFeaturesShape, ExtHostLanguageFeaturesShape } from '../node/extHost.protocol'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { LanguageConfiguration } from 'vs/editor/common/modes/languageConfiguration'; import { IHeapService } from './mainThreadHeapService'; diff --git a/src/vs/workbench/api/node/mainThreadLanguages.ts b/src/vs/workbench/api/electron-browser/mainThreadLanguages.ts similarity index 92% rename from src/vs/workbench/api/node/mainThreadLanguages.ts rename to src/vs/workbench/api/electron-browser/mainThreadLanguages.ts index c828bc0ad5f..a80c17c54f9 100644 --- a/src/vs/workbench/api/node/mainThreadLanguages.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadLanguages.ts @@ -6,7 +6,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IModeService } from 'vs/editor/common/services/modeService'; -import { MainThreadLanguagesShape } from './extHost.protocol'; +import { MainThreadLanguagesShape } from '../node/extHost.protocol'; export class MainThreadLanguages extends MainThreadLanguagesShape { diff --git a/src/vs/workbench/api/node/mainThreadMessageService.ts b/src/vs/workbench/api/electron-browser/mainThreadMessageService.ts similarity index 97% rename from src/vs/workbench/api/node/mainThreadMessageService.ts rename to src/vs/workbench/api/electron-browser/mainThreadMessageService.ts index 840111c180e..b821c9eda45 100644 --- a/src/vs/workbench/api/node/mainThreadMessageService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadMessageService.ts @@ -9,7 +9,7 @@ import { IMessageService, IChoiceService } from 'vs/platform/message/common/mess import Severity from 'vs/base/common/severity'; import { Action } from 'vs/base/common/actions'; import { TPromise as Promise } from 'vs/base/common/winjs.base'; -import { MainThreadMessageServiceShape } from './extHost.protocol'; +import { MainThreadMessageServiceShape } from '../node/extHost.protocol'; import * as vscode from 'vscode'; export class MainThreadMessageService extends MainThreadMessageServiceShape { diff --git a/src/vs/workbench/api/node/mainThreadOutputService.ts b/src/vs/workbench/api/electron-browser/mainThreadOutputService.ts similarity index 97% rename from src/vs/workbench/api/node/mainThreadOutputService.ts rename to src/vs/workbench/api/electron-browser/mainThreadOutputService.ts index 6694cc7cd8f..262344171f9 100644 --- a/src/vs/workbench/api/node/mainThreadOutputService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadOutputService.ts @@ -9,7 +9,7 @@ import { Registry } from 'vs/platform/platform'; import { IOutputService, IOutputChannel, OUTPUT_PANEL_ID, Extensions, IOutputChannelRegistry } from 'vs/workbench/parts/output/common/output'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; -import { MainThreadOutputServiceShape } from './extHost.protocol'; +import { MainThreadOutputServiceShape } from '../node/extHost.protocol'; export class MainThreadOutputService extends MainThreadOutputServiceShape { diff --git a/src/vs/workbench/api/node/mainThreadProgress.ts b/src/vs/workbench/api/electron-browser/mainThreadProgress.ts similarity index 95% rename from src/vs/workbench/api/node/mainThreadProgress.ts rename to src/vs/workbench/api/electron-browser/mainThreadProgress.ts index e7031b47d44..eb3242904e0 100644 --- a/src/vs/workbench/api/node/mainThreadProgress.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadProgress.ts @@ -6,7 +6,7 @@ import { IProgressService2, IProgress, IProgressOptions, IProgressStep } from 'vs/platform/progress/common/progress'; import { TPromise } from 'vs/base/common/winjs.base'; -import { MainThreadProgressShape } from './extHost.protocol'; +import { MainThreadProgressShape } from '../node/extHost.protocol'; export class MainThreadProgress extends MainThreadProgressShape { diff --git a/src/vs/workbench/api/node/mainThreadQuickOpen.ts b/src/vs/workbench/api/electron-browser/mainThreadQuickOpen.ts similarity index 97% rename from src/vs/workbench/api/node/mainThreadQuickOpen.ts rename to src/vs/workbench/api/electron-browser/mainThreadQuickOpen.ts index 8e5664fcb0d..8751ff66638 100644 --- a/src/vs/workbench/api/node/mainThreadQuickOpen.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadQuickOpen.ts @@ -9,7 +9,7 @@ import { asWinJsPromise } from 'vs/base/common/async'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; import { IQuickOpenService, IPickOptions, IInputOptions } from 'vs/platform/quickOpen/common/quickOpen'; import { InputBoxOptions } from 'vscode'; -import { ExtHostContext, MainThreadQuickOpenShape, ExtHostQuickOpenShape, MyQuickPickItems } from './extHost.protocol'; +import { ExtHostContext, MainThreadQuickOpenShape, ExtHostQuickOpenShape, MyQuickPickItems } from '../node/extHost.protocol'; export class MainThreadQuickOpen extends MainThreadQuickOpenShape { diff --git a/src/vs/workbench/api/node/mainThreadSCM.ts b/src/vs/workbench/api/electron-browser/mainThreadSCM.ts similarity index 99% rename from src/vs/workbench/api/node/mainThreadSCM.ts rename to src/vs/workbench/api/electron-browser/mainThreadSCM.ts index 6223b3e3bc9..fb8d1f155a5 100644 --- a/src/vs/workbench/api/node/mainThreadSCM.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadSCM.ts @@ -14,7 +14,7 @@ import { IThreadService } from 'vs/workbench/services/thread/common/threadServic import { ISCMService, ISCMProvider, ISCMResource, ISCMResourceGroup, ISCMResourceDecorations } from 'vs/workbench/services/scm/common/scm'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { ExtHostContext, MainThreadSCMShape, ExtHostSCMShape, SCMProviderFeatures, SCMRawResource, SCMGroupFeatures } from './extHost.protocol'; +import { ExtHostContext, MainThreadSCMShape, ExtHostSCMShape, SCMProviderFeatures, SCMRawResource, SCMGroupFeatures } from '../node/extHost.protocol'; import { Command } from 'vs/editor/common/modes'; class MainThreadSCMResourceGroup implements ISCMResourceGroup { diff --git a/src/vs/workbench/api/node/mainThreadSaveParticipant.ts b/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts similarity index 99% rename from src/vs/workbench/api/node/mainThreadSaveParticipant.ts rename to src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts index cfc30fcb15d..d90c6409a68 100644 --- a/src/vs/workbench/api/node/mainThreadSaveParticipant.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts @@ -22,7 +22,7 @@ import { getDocumentFormattingEdits } from 'vs/editor/contrib/format/common/form import { EditOperationsCommand } from 'vs/editor/contrib/format/common/formatCommand'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; -import { ExtHostContext, ExtHostDocumentSaveParticipantShape } from './extHost.protocol'; +import { ExtHostContext, ExtHostDocumentSaveParticipantShape } from '../node/extHost.protocol'; import { EditOperation } from 'vs/editor/common/core/editOperation'; export interface INamedSaveParticpant extends ISaveParticipant { diff --git a/src/vs/workbench/api/node/mainThreadStatusBar.ts b/src/vs/workbench/api/electron-browser/mainThreadStatusBar.ts similarity index 95% rename from src/vs/workbench/api/node/mainThreadStatusBar.ts rename to src/vs/workbench/api/electron-browser/mainThreadStatusBar.ts index ed435c97485..d64d9d3ac2b 100644 --- a/src/vs/workbench/api/node/mainThreadStatusBar.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadStatusBar.ts @@ -6,7 +6,7 @@ import { IStatusbarService, StatusbarAlignment as MainThreadStatusBarAlignment } from 'vs/platform/statusbar/common/statusbar'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { MainThreadStatusBarShape } from './extHost.protocol'; +import { MainThreadStatusBarShape } from '../node/extHost.protocol'; export class MainThreadStatusBar extends MainThreadStatusBarShape { private mapIdToDisposable: { [id: number]: IDisposable }; diff --git a/src/vs/workbench/api/node/mainThreadStorage.ts b/src/vs/workbench/api/electron-browser/mainThreadStorage.ts similarity index 95% rename from src/vs/workbench/api/node/mainThreadStorage.ts rename to src/vs/workbench/api/electron-browser/mainThreadStorage.ts index 2e8aba86eb9..5f109ae9c3d 100644 --- a/src/vs/workbench/api/node/mainThreadStorage.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadStorage.ts @@ -6,7 +6,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { MainThreadStorageShape } from './extHost.protocol'; +import { MainThreadStorageShape } from '../node/extHost.protocol'; export class MainThreadStorage extends MainThreadStorageShape { @@ -41,4 +41,4 @@ export class MainThreadStorage extends MainThreadStorageShape { } return undefined; } -} \ No newline at end of file +} diff --git a/src/vs/workbench/api/node/mainThreadTask.ts b/src/vs/workbench/api/electron-browser/mainThreadTask.ts similarity index 97% rename from src/vs/workbench/api/node/mainThreadTask.ts rename to src/vs/workbench/api/electron-browser/mainThreadTask.ts index f27cdfa54af..bbd8040c9c5 100644 --- a/src/vs/workbench/api/node/mainThreadTask.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTask.ts @@ -9,7 +9,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { ITaskService } from 'vs/workbench/parts/tasks/common/taskService'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; -import { ExtHostContext, MainThreadTaskShape, ExtHostTaskShape } from './extHost.protocol'; +import { ExtHostContext, MainThreadTaskShape, ExtHostTaskShape } from '../node/extHost.protocol'; export class MainThreadTask extends MainThreadTaskShape { @@ -33,4 +33,4 @@ export class MainThreadTask extends MainThreadTaskShape { this._taskService.unregisterTaskProvider(handle); return TPromise.as(undefined); } -} \ No newline at end of file +} diff --git a/src/vs/workbench/api/node/mainThreadTelemetry.ts b/src/vs/workbench/api/electron-browser/mainThreadTelemetry.ts similarity index 94% rename from src/vs/workbench/api/node/mainThreadTelemetry.ts rename to src/vs/workbench/api/electron-browser/mainThreadTelemetry.ts index 425123d08c6..42a15120c40 100644 --- a/src/vs/workbench/api/node/mainThreadTelemetry.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTelemetry.ts @@ -6,7 +6,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { ITelemetryService, ITelemetryInfo } from 'vs/platform/telemetry/common/telemetry'; -import { MainThreadTelemetryShape } from './extHost.protocol'; +import { MainThreadTelemetryShape } from '../node/extHost.protocol'; /** * Helper always instantiated in the main process to receive telemetry events from remote telemetry services diff --git a/src/vs/workbench/api/node/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts similarity index 98% rename from src/vs/workbench/api/node/mainThreadTerminalService.ts rename to src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index 7df3be34e0b..c59fbbe5515 100644 --- a/src/vs/workbench/api/node/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -8,7 +8,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ITerminalService, ITerminalInstance, IShellLaunchConfig } from 'vs/workbench/parts/terminal/common/terminal'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; import { TPromise } from 'vs/base/common/winjs.base'; -import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape } from './extHost.protocol'; +import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape } from '../node/extHost.protocol'; export class MainThreadTerminalService extends MainThreadTerminalServiceShape { diff --git a/src/vs/workbench/api/node/mainThreadWorkspace.ts b/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts similarity index 98% rename from src/vs/workbench/api/node/mainThreadWorkspace.ts rename to src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts index e8566c751ce..707349e5a93 100644 --- a/src/vs/workbench/api/node/mainThreadWorkspace.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts @@ -14,7 +14,7 @@ import { ICommonCodeEditor, isCommonCodeEditor } from 'vs/editor/common/editorCo import { bulkEdit, IResourceEdit } from 'vs/editor/common/services/bulkEdit'; import { TPromise } from 'vs/base/common/winjs.base'; import { Uri } from 'vscode'; -import { MainThreadWorkspaceShape } from './extHost.protocol'; +import { MainThreadWorkspaceShape } from '../node/extHost.protocol'; import { ITextModelResolverService } from 'vs/editor/common/services/resolverService'; import { IFileService } from 'vs/platform/files/common/files'; diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index ec54f95a437..1f602e9ac5f 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -35,13 +35,15 @@ import { IWorkspaceConfigurationValues } from 'vs/workbench/services/configurati import { IPickOpenEntry, IPickOptions } from 'vs/platform/quickOpen/common/quickOpen'; import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; -import { IApplyEditsOptions, IUndoStopOptions, TextEditorRevealType, ITextEditorConfigurationUpdate, IResolvedTextEditorConfiguration, ISelectionChangeEvent } from './mainThreadEditor'; +import { TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions'; +import { EndOfLine, TextEditorLineNumbersStyle } from 'vs/workbench/api/node/extHostTypes'; + import { TaskSet } from 'vs/workbench/parts/tasks/common/tasks'; import { IModelChangedEvent } from 'vs/editor/common/model/mirrorModel'; import { IPosition } from 'vs/editor/common/core/position'; import { IRange } from 'vs/editor/common/core/range'; -import { ISelection } from 'vs/editor/common/core/selection'; +import { ISelection, Selection } from 'vs/editor/common/core/selection'; export interface IEnvironment { enableProposedApiForAll: boolean; @@ -133,6 +135,44 @@ export abstract class MainThreadDocumentsShape { $trySaveDocument(uri: URI): TPromise { throw ni(); } } + +export interface ISelectionChangeEvent { + selections: Selection[]; + source?: string; +} + +export interface ITextEditorConfigurationUpdate { + tabSize?: number | 'auto'; + insertSpaces?: boolean | 'auto'; + cursorStyle?: TextEditorCursorStyle; + lineNumbers?: TextEditorLineNumbersStyle; +} + +export interface IResolvedTextEditorConfiguration { + tabSize: number; + insertSpaces: boolean; + cursorStyle: TextEditorCursorStyle; + lineNumbers: TextEditorLineNumbersStyle; +} + +export enum TextEditorRevealType { + Default = 0, + InCenter = 1, + InCenterIfOutsideViewport = 2, + AtTop = 3 +} + +export interface IUndoStopOptions { + undoStopBefore: boolean; + undoStopAfter: boolean; +} + +export interface IApplyEditsOptions extends IUndoStopOptions { + setEndOfLine: EndOfLine; +} + + + export interface ITextDocumentShowOptions { position?: EditorPosition; preserveFocus?: boolean; diff --git a/src/vs/workbench/api/node/extHostTextEditor.ts b/src/vs/workbench/api/node/extHostTextEditor.ts index ab5572a0d62..b566c23aa34 100644 --- a/src/vs/workbench/api/node/extHostTextEditor.ts +++ b/src/vs/workbench/api/node/extHostTextEditor.ts @@ -12,9 +12,8 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { ExtHostDocumentData } from 'vs/workbench/api/node/extHostDocumentData'; import { Selection, Range, Position, EndOfLine, TextEditorRevealType, TextEditorLineNumbersStyle, SnippetString } from './extHostTypes'; import { ISingleEditOperation } from 'vs/editor/common/editorCommon'; -import { IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate } from 'vs/workbench/api/node/mainThreadEditor'; import * as TypeConverters from './extHostTypeConverters'; -import { MainThreadEditorsShape } from './extHost.protocol'; +import { MainThreadEditorsShape, IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate } from './extHost.protocol'; import * as vscode from 'vscode'; import { TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions'; import { IRange } from 'vs/editor/common/core/range'; diff --git a/src/vs/workbench/api/node/extHostTextEditors.ts b/src/vs/workbench/api/node/extHostTextEditors.ts index e95c96c3bba..0f4bfdf398a 100644 --- a/src/vs/workbench/api/node/extHostTextEditors.ts +++ b/src/vs/workbench/api/node/extHostTextEditors.ts @@ -10,12 +10,11 @@ import { toThenable } from 'vs/base/common/async'; import { TPromise } from 'vs/base/common/winjs.base'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; import { TextEditorSelectionChangeKind } from './extHostTypes'; -import { IResolvedTextEditorConfiguration, ISelectionChangeEvent } from 'vs/workbench/api/node/mainThreadEditor'; import * as TypeConverters from './extHostTypeConverters'; import { TextEditorDecorationType, ExtHostTextEditor } from './extHostTextEditor'; import { ExtHostDocumentsAndEditors } from './extHostDocumentsAndEditors'; import { Position as EditorPosition } from 'vs/platform/editor/common/editor'; -import { MainContext, MainThreadEditorsShape, ExtHostEditorsShape, ITextDocumentShowOptions, ITextEditorPositionData } from './extHost.protocol'; +import { MainContext, MainThreadEditorsShape, ExtHostEditorsShape, ITextDocumentShowOptions, ITextEditorPositionData, IResolvedTextEditorConfiguration, ISelectionChangeEvent } from './extHost.protocol'; import * as vscode from 'vscode'; export class ExtHostEditors extends ExtHostEditorsShape { diff --git a/src/vs/workbench/electron-browser/extensionHost.ts b/src/vs/workbench/electron-browser/extensionHost.ts index e084eb83a99..e8f82622b43 100644 --- a/src/vs/workbench/electron-browser/extensionHost.ts +++ b/src/vs/workbench/electron-browser/extensionHost.ts @@ -30,7 +30,7 @@ import { generateRandomPipeName, Protocol } from 'vs/base/parts/ipc/node/ipc.net import { createServer, Server } from 'net'; import Event, { Emitter } from 'vs/base/common/event'; import { IInitData } from 'vs/workbench/api/node/extHost.protocol'; -import { MainProcessExtensionService } from 'vs/workbench/api/node/mainThreadExtensionService'; +import { MainProcessExtensionService } from 'vs/workbench/api/electron-browser/mainThreadExtensionService'; import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; export const EXTENSION_LOG_BROADCAST_CHANNEL = 'vscode:extensionLog'; diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index dae76fa0ddd..f5e39ca7bd4 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -53,7 +53,7 @@ import { IntegrityServiceImpl } from 'vs/platform/integrity/node/integrityServic import { IIntegrityService } from 'vs/platform/integrity/common/integrity'; import { EditorWorkerServiceImpl } from 'vs/editor/common/services/editorWorkerServiceImpl'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; -import { MainProcessExtensionService } from 'vs/workbench/api/node/mainThreadExtensionService'; +import { MainProcessExtensionService } from 'vs/workbench/api/electron-browser/mainThreadExtensionService'; import { IOptions } from 'vs/workbench/common/options'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/electron-browser/workbench.main.ts b/src/vs/workbench/electron-browser/workbench.main.ts index f71d678b112..59d932b5644 100644 --- a/src/vs/workbench/electron-browser/workbench.main.ts +++ b/src/vs/workbench/electron-browser/workbench.main.ts @@ -105,7 +105,7 @@ import 'vs/workbench/parts/performance/electron-browser/performance.contribution import 'vs/workbench/parts/cli/electron-browser/cli.contribution'; -import 'vs/workbench/api/node/extHost.contribution'; +import 'vs/workbench/api/electron-browser/extensionHost.contribution'; import 'vs/workbench/electron-browser/main.contribution'; import 'vs/workbench/electron-browser/main'; diff --git a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts index f1e0c75db19..93bf0a5b895 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts @@ -20,12 +20,12 @@ import { IThreadService } from 'vs/workbench/services/thread/common/threadServic import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IModelService } from 'vs/editor/common/services/modelService'; import { ExtHostLanguageFeatures } from 'vs/workbench/api/node/extHostLanguageFeatures'; -import { MainThreadLanguageFeatures } from 'vs/workbench/api/node/mainThreadLanguageFeatures'; -import { IHeapService } from 'vs/workbench/api/node/mainThreadHeapService'; +import { MainThreadLanguageFeatures } from 'vs/workbench/api/electron-browser/mainThreadLanguageFeatures'; +import { IHeapService } from 'vs/workbench/api/electron-browser/mainThreadHeapService'; import { ExtHostApiCommands } from 'vs/workbench/api/node/extHostApiCommands'; import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; import { ExtHostHeapService } from 'vs/workbench/api/node/extHostHeapService'; -import { MainThreadCommands } from 'vs/workbench/api/node/mainThreadCommands'; +import { MainThreadCommands } from 'vs/workbench/api/electron-browser/mainThreadCommands'; import { ExtHostDocuments } from 'vs/workbench/api/node/extHostDocuments'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/extHostDocumentsAndEditors'; import { MainContext, ExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; diff --git a/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts b/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts index 7f21fd42f19..f982995d27f 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts @@ -19,10 +19,10 @@ import { IMarkerService } from 'vs/platform/markers/common/markers'; import { MarkerService } from 'vs/platform/markers/common/markerService'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; import { ExtHostLanguageFeatures } from 'vs/workbench/api/node/extHostLanguageFeatures'; -import { MainThreadLanguageFeatures } from 'vs/workbench/api/node/mainThreadLanguageFeatures'; +import { MainThreadLanguageFeatures } from 'vs/workbench/api/electron-browser/mainThreadLanguageFeatures'; import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; -import { MainThreadCommands } from 'vs/workbench/api/node/mainThreadCommands'; -import { IHeapService } from 'vs/workbench/api/node/mainThreadHeapService'; +import { MainThreadCommands } from 'vs/workbench/api/electron-browser/mainThreadCommands'; +import { IHeapService } from 'vs/workbench/api/electron-browser/mainThreadHeapService'; import { ExtHostDocuments } from 'vs/workbench/api/node/extHostDocuments'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/extHostDocumentsAndEditors'; import { getDocumentSymbols } from 'vs/editor/contrib/quickOpen/common/quickOpen'; diff --git a/src/vs/workbench/test/electron-browser/api/extHostMessagerService.test.ts b/src/vs/workbench/test/electron-browser/api/extHostMessagerService.test.ts index 9559d13a26e..6b136cb47df 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostMessagerService.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostMessagerService.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { Action } from 'vs/base/common/actions'; -import { MainThreadMessageService } from 'vs/workbench/api/node/mainThreadMessageService'; +import { MainThreadMessageService } from 'vs/workbench/api/electron-browser/mainThreadMessageService'; import { TPromise as Promise } from 'vs/base/common/winjs.base'; suite('ExtHostMessageService', function () { diff --git a/src/vs/workbench/test/electron-browser/api/extHostTextEditor.test.ts b/src/vs/workbench/test/electron-browser/api/extHostTextEditor.test.ts index 7fc02336299..c8834439d40 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostTextEditor.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostTextEditor.test.ts @@ -8,8 +8,7 @@ import * as assert from 'assert'; import { TPromise } from 'vs/base/common/winjs.base'; import { TextEditorLineNumbersStyle } from 'vs/workbench/api/node/extHostTypes'; import { TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions'; -import { IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate } from 'vs/workbench/api/node/mainThreadEditor'; -import { MainThreadEditorsShape } from 'vs/workbench/api/node/extHost.protocol'; +import { MainThreadEditorsShape, IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate } from 'vs/workbench/api/node/extHost.protocol'; import { ExtHostTextEditorOptions, ExtHostTextEditor } from 'vs/workbench/api/node/extHostTextEditor'; import { ExtHostDocumentData } from 'vs/workbench/api/node/extHostDocumentData'; import URI from 'vs/base/common/uri'; diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadCommands.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadCommands.test.ts index 259d55117ad..616043909a0 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadCommands.test.ts @@ -6,7 +6,7 @@ 'use strict'; import * as assert from 'assert'; -import { MainThreadCommands } from 'vs/workbench/api/node/mainThreadCommands'; +import { MainThreadCommands } from 'vs/workbench/api/electron-browser/mainThreadCommands'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { OneGetThreadService } from './testThreadService'; @@ -25,4 +25,4 @@ suite('MainThreadCommands', function () { commands.$unregisterCommand('foo'); assert.equal(CommandsRegistry.getCommand('foo'), undefined); }); -}); \ No newline at end of file +}); diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadDocuments.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadDocuments.test.ts index 334b12318bb..b938c450d50 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadDocuments.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadDocuments.test.ts @@ -6,7 +6,7 @@ 'use strict'; import * as assert from 'assert'; -import { BoundModelReferenceCollection } from 'vs/workbench/api/node/mainThreadDocuments'; +import { BoundModelReferenceCollection } from 'vs/workbench/api/electron-browser/mainThreadDocuments'; import { Model } from 'vs/editor/common/model/model'; import { TPromise } from 'vs/base/common/winjs.base'; diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts index 7800874df6a..3e809f5a8e8 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts @@ -6,7 +6,7 @@ 'use strict'; import * as assert from 'assert'; -import { MainThreadDocumentsAndEditors } from 'vs/workbench/api/node/mainThreadDocumentsAndEditors'; +import { MainThreadDocumentsAndEditors } from 'vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors'; import { OneGetThreadService } from './testThreadService'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadSaveParticipant.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadSaveParticipant.test.ts index cb595b9a1b8..35fc82deda8 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadSaveParticipant.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadSaveParticipant.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { FinalNewLineParticipant } from 'vs/workbench/api/node/mainThreadSaveParticipant'; +import { FinalNewLineParticipant } from 'vs/workbench/api/electron-browser/mainThreadSaveParticipant'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { workbenchInstantiationService, TestTextFileService } from 'vs/workbench/test/workbenchTestServices'; import { toResource } from 'vs/base/test/common/utils'; @@ -72,4 +72,4 @@ suite('MainThreadSaveParticipant', function () { done(); }); }); -}); \ No newline at end of file +}); From 8b86237a81252f15cb7c87286c0faf20403d85ba Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 12 May 2017 11:33:36 +0200 Subject: [PATCH 0362/1164] wire up new controller and main thread editor --- .../api/electron-browser/mainThreadEditor.ts | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadEditor.ts b/src/vs/workbench/api/electron-browser/mainThreadEditor.ts index 601e99fa376..cd44f6778a1 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadEditor.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadEditor.ts @@ -11,7 +11,7 @@ import { IModelService } from 'vs/editor/common/services/modelService'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { Range, IRange } from 'vs/editor/common/core/range'; import { Selection, ISelection } from 'vs/editor/common/core/selection'; -import { SnippetController } from 'vs/editor/contrib/snippet/common/snippetController'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { EndOfLine, TextEditorLineNumbersStyle } from 'vs/workbench/api/node/extHostTypes'; import { TextEditorCursorStyle, cursorStyleToString } from 'vs/editor/common/config/editorOptions'; import { ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; @@ -361,10 +361,10 @@ export class MainThreadTextEditor { return false; } - const snippetController = SnippetController.get(this._codeEditor); + const snippetController = SnippetController2.get(this._codeEditor); - // cancel previous snippet mode - snippetController.leaveSnippet(); + // // cancel previous snippet mode + // snippetController.leaveSnippet(); // set selection, focus editor const selections = ranges.map(r => new Selection(r.startLineNumber, r.startColumn, r.endLineNumber, r.endColumn)); @@ -372,13 +372,7 @@ export class MainThreadTextEditor { this._codeEditor.focus(); // make modifications - if (opts.undoStopBefore) { - this._codeEditor.pushUndoStop(); - } - snippetController.insertSnippet(template, 0, 0); - if (opts.undoStopAfter) { - this._codeEditor.pushUndoStop(); - } + snippetController.insert(template, 0, 0, opts.undoStopBefore, opts.undoStopAfter); return true; } From 41f50f9b79dc883124567d915d28a4e766615620 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 12 May 2017 11:35:23 +0200 Subject: [PATCH 0363/1164] tfs: darwin use agent specific npm cache --- build/tfs/darwin/build.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh index 15c5d29e255..bcd3f788f9c 100755 --- a/build/tfs/darwin/build.sh +++ b/build/tfs/darwin/build.sh @@ -1,6 +1,12 @@ #!/bin/sh set -e +# set agent specific npm cache +if [ -z "$AGENT_WORKFOLDER" ] +then + export npm_config_cache="$AGENT_WORKFOLDER/npm-cache" +fi + # log build step STEP() { echo "" From 2b9052dd26d8923c574a87f728dc7ec596325a9d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 12 May 2017 11:39:41 +0200 Subject: [PATCH 0364/1164] tfs: darwin get secrets --- build/tfs/darwin/build.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh index bcd3f788f9c..3d1bef7f00e 100755 --- a/build/tfs/darwin/build.sh +++ b/build/tfs/darwin/build.sh @@ -1,6 +1,11 @@ #!/bin/sh set -e +export $VSCODE_MIXIN_PASSWORD = "$1" +export $AZURE_STORAGE_ACCESS_KEY_2 = "$2" +export $MOONCAKE_STORAGE_ACCESS_KEY = "$3" +export $AZURE_DOCUMENTDB_MASTERKEY = "$4" + # set agent specific npm cache if [ -z "$AGENT_WORKFOLDER" ] then From c90c3111eafde31a1733032c31bad43fa810dcbe Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 12 May 2017 11:40:28 +0200 Subject: [PATCH 0365/1164] tfs: fix darwin build --- build/tfs/darwin/build.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh index 3d1bef7f00e..b589cc0368b 100755 --- a/build/tfs/darwin/build.sh +++ b/build/tfs/darwin/build.sh @@ -1,10 +1,10 @@ #!/bin/sh set -e -export $VSCODE_MIXIN_PASSWORD = "$1" -export $AZURE_STORAGE_ACCESS_KEY_2 = "$2" -export $MOONCAKE_STORAGE_ACCESS_KEY = "$3" -export $AZURE_DOCUMENTDB_MASTERKEY = "$4" +export VSCODE_MIXIN_PASSWORD = "$1" +export AZURE_STORAGE_ACCESS_KEY_2 = "$2" +export MOONCAKE_STORAGE_ACCESS_KEY = "$3" +export AZURE_DOCUMENTDB_MASTERKEY = "$4" # set agent specific npm cache if [ -z "$AGENT_WORKFOLDER" ] From 42741c1995daa42dc56c3dd2ffa09e9ece36e532 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 12 May 2017 11:41:36 +0200 Subject: [PATCH 0366/1164] tfs: fix darwin build --- build/tfs/darwin/build.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh index b589cc0368b..e9157afe477 100755 --- a/build/tfs/darwin/build.sh +++ b/build/tfs/darwin/build.sh @@ -1,10 +1,10 @@ #!/bin/sh set -e -export VSCODE_MIXIN_PASSWORD = "$1" -export AZURE_STORAGE_ACCESS_KEY_2 = "$2" -export MOONCAKE_STORAGE_ACCESS_KEY = "$3" -export AZURE_DOCUMENTDB_MASTERKEY = "$4" +export VSCODE_MIXIN_PASSWORD="$1" +export AZURE_STORAGE_ACCESS_KEY_2="$2" +export MOONCAKE_STORAGE_ACCESS_KEY="$3" +export AZURE_DOCUMENTDB_MASTERKEY="$4" # set agent specific npm cache if [ -z "$AGENT_WORKFOLDER" ] From 24f5525a5ba10df07d7396095d28f98363cb959c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 12 May 2017 11:45:08 +0200 Subject: [PATCH 0367/1164] tfs: use scoped npm cache --- build/tfs/darwin/build.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh index e9157afe477..4ae211bfece 100755 --- a/build/tfs/darwin/build.sh +++ b/build/tfs/darwin/build.sh @@ -7,9 +7,10 @@ export MOONCAKE_STORAGE_ACCESS_KEY="$3" export AZURE_DOCUMENTDB_MASTERKEY="$4" # set agent specific npm cache -if [ -z "$AGENT_WORKFOLDER" ] +if [ -n "$AGENT_WORKFOLDER" ] then export npm_config_cache="$AGENT_WORKFOLDER/npm-cache" + echo "Using npm cache: $npm_config_cache" fi # log build step From 47996c00f590ab193192af4fcfe3cc7125c7d33d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 12 May 2017 11:51:26 +0200 Subject: [PATCH 0368/1164] tfs: accept source maps access key --- build/tfs/darwin/build.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh index 4ae211bfece..c71342fd42c 100755 --- a/build/tfs/darwin/build.sh +++ b/build/tfs/darwin/build.sh @@ -2,9 +2,10 @@ set -e export VSCODE_MIXIN_PASSWORD="$1" -export AZURE_STORAGE_ACCESS_KEY_2="$2" -export MOONCAKE_STORAGE_ACCESS_KEY="$3" -export AZURE_DOCUMENTDB_MASTERKEY="$4" +export AZURE_STORAGE_ACCESS_KEY="$2" +export AZURE_STORAGE_ACCESS_KEY_2="$3" +export MOONCAKE_STORAGE_ACCESS_KEY="$4" +export AZURE_DOCUMENTDB_MASTERKEY="$5" # set agent specific npm cache if [ -n "$AGENT_WORKFOLDER" ] From 077ea79ac29260f929f3605de46ad1830dce3893 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 12 May 2017 12:05:21 +0200 Subject: [PATCH 0369/1164] add accept command, not (yet?) bound to enter tho --- .../snippet/browser/snippetController2.ts | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 238a2632c10..948bb9a9876 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -52,7 +52,8 @@ export class SnippetController2 { return 'snippetController2'; } - insert(template: string, + insert( + template: string, overwriteBefore: number = 0, overwriteAfter: number = 0, undoStopBefore: boolean = true, undoStopAfter: boolean = true ): void { @@ -95,6 +96,12 @@ export class SnippetController2 { this._hasNextTabstop.set(!this._snippet.isAtFinalPlaceholder); } + finish(): void { + while (this._inSnippet.get()) { + this.next(); + } + } + cancel(): void { if (this._snippet) { this._inSnippet.reset(); @@ -119,7 +126,6 @@ export class SnippetController2 { this._updateState(); } } - } @@ -156,3 +162,14 @@ CommonEditorRegistry.registerEditorCommand(new CommandCtor({ secondary: [KeyMod.Shift | KeyCode.Escape] } })); + +CommonEditorRegistry.registerEditorCommand(new CommandCtor({ + id: 'snippet.accept', + precondition: SnippetController2.InSnippetMode, + handler: ctrl => ctrl.finish(), + // kbOpts: { + // weight: CommonEditorRegistry.commandWeight(30), + // kbExpr: EditorContextKeys.textFocus, + // primary: KeyCode.Enter, + // } +})); From 4006b8e629f05b6a468e23074242da4aacdcbca3 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 12 May 2017 12:16:25 +0200 Subject: [PATCH 0370/1164] Cannot read property 'push' of undefined (fixes #26513) --- .../workbench/browser/parts/activitybar/activitybarPart.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index a40dd7dd621..8951ed6b900 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -89,9 +89,6 @@ export class ActivitybarPart extends Part implements IActivityBarService { this.pinnedViewlets = this.viewletService.getViewlets().map(v => v.id); } - // Update viewlet switcher when external viewlets become ready - this.extensionService.onReady().then(() => this.updateViewletSwitcher()); - this.registerListeners(); } @@ -250,6 +247,9 @@ export class ActivitybarPart extends Part implements IActivityBarService { }); this.updateViewletSwitcher(); + + // Update viewlet switcher when external viewlets become ready + this.extensionService.onReady().then(() => this.updateViewletSwitcher()); } private updateViewletSwitcher() { From e1386feaa2f16fd7d2936908b9e9114585438a78 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 12 May 2017 12:17:33 +0200 Subject: [PATCH 0371/1164] Uncaught TypeError: Cannot read property 'style' of undefined (fixes #26514) --- src/vs/workbench/browser/parts/titlebar/titlebarPart.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts index 8873d4ed56f..eb4fa87e224 100644 --- a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts @@ -234,8 +234,10 @@ export class TitlebarPart extends Part implements ITitleService { // Part container const container = this.getContainer(); - container.style('color', this.getColor(this.isInactive ? TITLE_BAR_INACTIVE_FOREGROUND : TITLE_BAR_ACTIVE_FOREGROUND)); - container.style('background-color', this.getColor(this.isInactive ? TITLE_BAR_INACTIVE_BACKGROUND : TITLE_BAR_ACTIVE_BACKGROUND)); + if (container) { + container.style('color', this.getColor(this.isInactive ? TITLE_BAR_INACTIVE_FOREGROUND : TITLE_BAR_ACTIVE_FOREGROUND)); + container.style('background-color', this.getColor(this.isInactive ? TITLE_BAR_INACTIVE_BACKGROUND : TITLE_BAR_ACTIVE_BACKGROUND)); + } } private onTitleDoubleclick(): void { From f4c2b4d1cc8d9b30c371ab2aee43b9135bdfe300 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 12 May 2017 12:21:39 +0200 Subject: [PATCH 0372/1164] debug: fetch first call stack to improve perf #25605 --- .../parts/debug/common/debugModel.ts | 52 ++++++++++--------- .../debug/electron-browser/debugService.ts | 10 +++- .../debug/electron-browser/debugViewer.ts | 6 ++- 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index a26b1bc4661..d5bb323a1b0 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -371,15 +371,15 @@ export class StackFrame implements IStackFrame { } export class Thread implements IThread { - private promisedCallStack: TPromise; - private cachedCallStack: IStackFrame[]; + private fetchPromise: TPromise; + private callStack: IStackFrame[]; public stoppedDetails: IRawStoppedDetails; public stopped: boolean; constructor(public process: IProcess, public name: string, public threadId: number) { - this.promisedCallStack = null; + this.fetchPromise = null; this.stoppedDetails = null; - this.cachedCallStack = null; + this.callStack = null; this.stopped = false; } @@ -388,43 +388,41 @@ export class Thread implements IThread { } public clearCallStack(): void { - this.promisedCallStack = null; - this.cachedCallStack = null; + this.fetchPromise = null; + this.callStack = null; } public getCallStack(): IStackFrame[] { - return this.cachedCallStack; + return this.callStack; } /** - * Queries the debug adapter for the callstack and returns a promise with - * the stack frames of the callstack. + * Queries the debug adapter for the callstack and returns a promise + * which completes once the call stack has been retrieved. * If the thread is not stopped, it returns a promise to an empty array. - * Only gets the first 20 stack frames. Calling this method consecutive times - * with getAdditionalStackFrames = true gets the remainder of the call stack. + * Only fetches the first stack frame for performance reasons. Calling this method consecutive times + * gets the remainder of the call stack. */ - public fetchCallStack(getAdditionalStackFrames = false): TPromise { + public fetchCallStack(): TPromise { if (!this.stopped) { - return TPromise.as([]); + return TPromise.as(null); } - if (!this.promisedCallStack) { - this.promisedCallStack = this.getCallStackImpl(0).then(callStack => { - this.cachedCallStack = callStack; - return callStack; + if (!this.fetchPromise) { + this.fetchPromise = this.getCallStackImpl(0, 1).then(callStack => { + this.callStack = callStack || []; }); - } else if (getAdditionalStackFrames) { - this.promisedCallStack = this.promisedCallStack.then(callStackFirstPart => this.getCallStackImpl(callStackFirstPart.length).then(callStackSecondPart => { - this.cachedCallStack = callStackFirstPart.concat(callStackSecondPart); - return this.cachedCallStack; + } else { + this.fetchPromise = this.fetchPromise.then(() => this.getCallStackImpl(this.callStack.length, 20).then(callStackSecondPart => { + this.callStack = this.callStack.concat(callStackSecondPart); })); } - return this.promisedCallStack; + return this.fetchPromise; } - private getCallStackImpl(startFrame: number): TPromise { - return this.process.session.stackTrace({ threadId: this.threadId, startFrame, levels: 20 }).then(response => { + private getCallStackImpl(startFrame: number, levels: number): TPromise { + return this.process.session.stackTrace({ threadId: this.threadId, startFrame, levels }).then(response => { if (!response || !response.body) { return []; } @@ -781,6 +779,12 @@ export class Model implements IModel { } } + public fetchCallStack(thread: Thread): TPromise { + return thread.fetchCallStack().then(() => { + this._onDidChangeCallStack.fire(); + }); + } + public getBreakpoints(): Breakpoint[] { return this.breakpoints; } diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 157009cdbd4..2d2d483948d 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -291,7 +291,15 @@ export class DebugService implements debug.IDebugService { const thread = process && process.getThread(threadId); if (thread) { - thread.fetchCallStack().then(callStack => { + // Call fetch call stack twice, the first only return the top stack frame. + // Second retrieves the rest of the call stack. For performance reasons #25605 + this.model.fetchCallStack(thread).then(() => { + const callStack = thread.getCallStack(); + // Some adapters might not respect the number levels in StackTraceRequest and might + // return more stackFrames than requested. For those do not send an additional stackTrace request. + if (callStack.length <= 1) { + this.model.fetchCallStack(thread).done(undefined, errors.onUnexpectedError); + } if (callStack.length > 0 && !this.viewModel.focusedStackFrame) { // focus first stack frame from top that has source location if no other stack frame is focussed const stackFrameToFocus = first(callStack, sf => sf.source && sf.source.available, callStack[0]); diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts index 88619fbcc71..f5d1519568c 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts @@ -271,7 +271,7 @@ export class CallStackController extends BaseDebugController { const process = this.debugService.getModel().getProcesses().filter(p => p.getId() === threadAndProcessIds.processId).pop(); const thread = process && process.getThread(threadAndProcessIds.threadId); if (thread) { - (thread).fetchCallStack(true) + (thread).fetchCallStack() .done(() => tree.refresh(), errors.onUnexpectedError); } @@ -363,6 +363,10 @@ export class CallStackDataSource implements IDataSource { private getThreadChildren(thread: Thread): any[] { const callStack: any[] = thread.getCallStack(); + if (!callStack) { + return []; + } + if (thread.stoppedDetails && thread.stoppedDetails.framesErrorMessage) { return callStack.concat([thread.stoppedDetails.framesErrorMessage]); } From 98b5631bdb24b23efd4dca8f0d85e940a587ac17 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 12 May 2017 12:22:51 +0200 Subject: [PATCH 0373/1164] debug: refresh the variables tree lazily fixes #25605 --- .../parts/debug/electron-browser/debugViews.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViews.ts b/src/vs/workbench/parts/debug/electron-browser/debugViews.ts index 73a2367db05..3d4d2f1838b 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViews.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViews.ts @@ -80,7 +80,7 @@ export class VariablesView extends CollapsibleViewletView { } return undefined; }).done(null, errors.onUnexpectedError); - }, 700); + }, 400); } public renderHeader(container: HTMLElement): void { @@ -116,11 +116,11 @@ export class VariablesView extends CollapsibleViewletView { this.toolBar.setActions(prepareActions([collapseAction]))(); this.toDispose.push(viewModel.onDidFocusStackFrame(sf => { - // Only delay if the stack frames got cleared and there is no active stack frame - // Otherwise just update immediately - if (sf) { + // Refresh the tree immediatly if it is not visible. + // Otherwise postpone the refresh until user stops stepping. + if (!this.tree.getContentHeight()) { this.onFocusStackFrameScheduler.schedule(0); - } else if (!this.onFocusStackFrameScheduler.isScheduled()) { + } else { this.onFocusStackFrameScheduler.schedule(); } })); From cc3b14e3d97473d264b5fe80b42e49b79c97f360 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 12 May 2017 12:27:24 +0200 Subject: [PATCH 0374/1164] debug: tmp setting variablesDelay --- src/vs/workbench/parts/debug/common/debug.ts | 1 + .../parts/debug/electron-browser/debug.contribution.ts | 4 ++++ .../workbench/parts/debug/electron-browser/debugViews.ts | 8 +++++--- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index 26454a01bfc..d512ff12ece 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -302,6 +302,7 @@ export interface IDebugConfiguration { inlineValues: boolean; hideActionBar: boolean; internalConsoleOptions: string; + variablesDelay: number; } export interface IGlobalConfig { diff --git a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts index 22c7191e517..b8faa49a1a1 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts @@ -173,6 +173,10 @@ configurationRegistry.registerConfiguration({ default: false }, 'debug.internalConsoleOptions': INTERNAL_CONSOLE_OPTIONS_SCHEMA, + 'debug.variablesDelay': { + type: 'number', + default: 400 + }, 'launch': { type: 'object', description: nls.localize({ comment: ['This is the description for a setting'], key: 'launch' }, "Global debug launch configuration. Should be used as an alternative to 'launch.json' that is shared across workspaces"), diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViews.ts b/src/vs/workbench/parts/debug/electron-browser/debugViews.ts index 3d4d2f1838b..63d48fe5694 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViews.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViews.ts @@ -17,7 +17,7 @@ import { IHighlightEvent, ITree } from 'vs/base/parts/tree/browser/tree'; import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { CollapsibleState } from 'vs/base/browser/ui/splitview/splitview'; import { CollapsibleViewletView, AdaptiveCollapsibleViewletView, CollapseAction } from 'vs/workbench/browser/viewlet'; -import { IDebugService, State, IBreakpoint, IExpression, CONTEXT_BREAKPOINTS_FOCUSED, CONTEXT_WATCH_EXPRESSIONS_FOCUSED, CONTEXT_VARIABLES_FOCUSED } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugService, State, IDebugConfiguration, IBreakpoint, IExpression, CONTEXT_BREAKPOINTS_FOCUSED, CONTEXT_WATCH_EXPRESSIONS_FOCUSED, CONTEXT_VARIABLES_FOCUSED } from 'vs/workbench/parts/debug/common/debug'; import { Expression, Variable, ExceptionBreakpoint, FunctionBreakpoint, Thread, StackFrame, Breakpoint, ThreadAndProcessIds } from 'vs/workbench/parts/debug/common/debugModel'; import * as viewer from 'vs/workbench/parts/debug/electron-browser/debugViewer'; import { AddWatchExpressionAction, RemoveAllWatchExpressionsAction, AddFunctionBreakpointAction, ToggleBreakpointsActivatedAction, RemoveAllBreakpointsAction } from 'vs/workbench/parts/debug/browser/debugActions'; @@ -26,6 +26,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { MenuId } from 'vs/platform/actions/common/actions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IMessageService } from 'vs/platform/message/common/message'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IListService } from 'vs/platform/list/browser/listService'; @@ -59,7 +60,8 @@ export class VariablesView extends CollapsibleViewletView { @IInstantiationService private instantiationService: IInstantiationService, @IContextKeyService contextKeyService: IContextKeyService, @IListService private listService: IListService, - @IThemeService private themeService: IThemeService + @IThemeService private themeService: IThemeService, + @IConfigurationService private configurationService: IConfigurationService ) { super(actionRunner, !!settings[VariablesView.MEMENTO], nls.localize('variablesSection', "Variables Section"), messageService, keybindingService, contextMenuService); @@ -80,7 +82,7 @@ export class VariablesView extends CollapsibleViewletView { } return undefined; }).done(null, errors.onUnexpectedError); - }, 400); + }, this.configurationService.getConfiguration('debug').variablesDelay); } public renderHeader(container: HTMLElement): void { From 54811a0062b043b366cb139118c94a38e51782f9 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 12 May 2017 12:28:23 +0200 Subject: [PATCH 0375/1164] :lipstick: --- src/vs/code/electron-main/window.ts | 48 ++++++++++++++--------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 1421465ce4c..bf81a6c55bf 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -244,14 +244,14 @@ export class VSCodeWindow { } if (isFullscreenOrMaximized) { - this.win.maximize(); + this._win.maximize(); if (this.currentWindowMode === WindowMode.Fullscreen) { - this.win.setFullScreen(true); + this._win.setFullScreen(true); } - if (!this.win.isVisible()) { - this.win.show(); // to reduce flicker from the default window size to maximize, we only show after maximize + if (!this._win.isVisible()) { + this._win.show(); // to reduce flicker from the default window size to maximize, we only show after maximize } } @@ -386,13 +386,13 @@ export class VSCodeWindow { } // To prevent flashing, we set the window visible after the page has finished to load but before VSCode is loaded - if (!this.win.isVisible()) { + if (!this._win.isVisible()) { if (this.currentWindowMode === WindowMode.Maximized) { - this.win.maximize(); + this._win.maximize(); } - if (!this.win.isVisible()) { // maximize also makes visible - this.win.show(); + if (!this._win.isVisible()) { // maximize also makes visible + this._win.show(); } } }); @@ -602,7 +602,7 @@ export class VSCodeWindow { public serializeWindowState(): IWindowState { // fullscreen gets special treatment - if (this.win.isFullScreen()) { + if (this._win.isFullScreen()) { const display = screen.getDisplayMatching(this.getBounds()); return { @@ -621,9 +621,9 @@ export class VSCodeWindow { let mode: WindowMode; // get window mode - if (!platform.isMacintosh && this.win.isMaximized()) { + if (!platform.isMacintosh && this._win.isMaximized()) { mode = WindowMode.Maximized; - } else if (this.win.isMinimized()) { + } else if (this._win.isMinimized()) { mode = WindowMode.Minimized; } else { mode = WindowMode.Normal; @@ -750,17 +750,17 @@ export class VSCodeWindow { } public getBounds(): Electron.Rectangle { - const pos = this.win.getPosition(); - const dimension = this.win.getSize(); + const pos = this._win.getPosition(); + const dimension = this._win.getSize(); return { x: pos[0], y: pos[1], width: dimension[0], height: dimension[1] }; } public toggleFullScreen(): void { - const willBeFullScreen = !this.win.isFullScreen(); + const willBeFullScreen = !this._win.isFullScreen(); // set fullscreen flag on window - this.win.setFullScreen(willBeFullScreen); + this._win.setFullScreen(willBeFullScreen); // respect configured menu bar visibility or default to toggle if not set this.setMenuBarVisibility(this.currentMenuBarVisibility, false); @@ -785,22 +785,22 @@ export class VSCodeWindow { return; // ignore for macOS platform } - const isFullscreen = this.win.isFullScreen(); + const isFullscreen = this._win.isFullScreen(); switch (visibility) { case ('default'): - this.win.setMenuBarVisibility(!isFullscreen); - this.win.setAutoHideMenuBar(isFullscreen); + this._win.setMenuBarVisibility(!isFullscreen); + this._win.setAutoHideMenuBar(isFullscreen); break; case ('visible'): - this.win.setMenuBarVisibility(true); - this.win.setAutoHideMenuBar(false); + this._win.setMenuBarVisibility(true); + this._win.setAutoHideMenuBar(false); break; case ('toggle'): - this.win.setMenuBarVisibility(false); - this.win.setAutoHideMenuBar(true); + this._win.setMenuBarVisibility(false); + this._win.setAutoHideMenuBar(true); if (notify) { this.send('vscode:showInfoMessage', nls.localize('hiddenMenuBar', "You can still access the menu bar by pressing the **Alt** key.")); @@ -814,8 +814,8 @@ export class VSCodeWindow { // fact that we want to hide the menu without being able to bring it back via Alt key makes Electron // still show the menu. Unable to reproduce from a simple Hello World application though... setTimeout(() => { - this.win.setMenuBarVisibility(false); - this.win.setAutoHideMenuBar(false); + this._win.setMenuBarVisibility(false); + this._win.setAutoHideMenuBar(false); }); break; }; From 32af260b0d9ebf9e7d22b9a3ecbcc24c3f223968 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 12 May 2017 12:29:22 +0200 Subject: [PATCH 0376/1164] fix #26465 --- .../browser/goToDeclaration.ts | 58 +++++++++++-------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts index 9790e837d91..3f06e80bc69 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts @@ -69,10 +69,11 @@ export class DefinitionAction extends EditorAction { let model = editor.getModel(); let pos = editor.getPosition(); - return this.getDeclarationsAtPosition(model, pos).then(references => { + return this._getDeclarationsAtPosition(model, pos).then(references => { // * remove falsy references - // * remove reference at the current pos + // * find reference at the current pos + let idxOfCurrent = -1; let result: Location[] = []; for (let i = 0; i < references.length; i++) { let reference = references[i]; @@ -80,24 +81,33 @@ export class DefinitionAction extends EditorAction { continue; } let { uri, range } = reference; - if (!this._configuration.filterCurrent - || uri.toString() !== model.uri.toString() - || !Range.containsPosition(range, pos)) { - - result.push({ - uri, - range - }); + let newLen = result.push({ + uri, + range + }); + if (this._configuration.filterCurrent + && uri.toString() === model.uri.toString() + && Range.containsPosition(range, pos) + && idxOfCurrent === -1 + ) { + idxOfCurrent = newLen - 1; } } if (result.length === 0) { + // no result -> show message const info = model.getWordAtPosition(pos); - MessageController.get(editor).showMessage(this.getNoResultFoundMessage(info), pos); - return; - } + MessageController.get(editor).showMessage(this._getNoResultFoundMessage(info), pos); - return this._onResult(editorService, editor, new ReferencesModel(result)); + } else if (result.length === 1 && idxOfCurrent !== -1) { + // only the position at which we are -> adjust selection + let [current] = result; + this._openReference(editorService, current, false); + + } else { + // handle multile results + this._onResult(editorService, editor, new ReferencesModel(result)); + } }, (err) => { // report an error @@ -106,17 +116,17 @@ export class DefinitionAction extends EditorAction { }); } - protected getDeclarationsAtPosition(model: editorCommon.IModel, position: corePosition.Position): TPromise { + protected _getDeclarationsAtPosition(model: editorCommon.IModel, position: corePosition.Position): TPromise { return getDefinitionsAtPosition(model, position); } - protected getNoResultFoundMessage(info?: editorCommon.IWordAtPosition): string { + protected _getNoResultFoundMessage(info?: editorCommon.IWordAtPosition): string { return info && info.word ? nls.localize('noResultWord', "No definition found for '{0}'", info.word) : nls.localize('generic.noResults', "No definition found"); } - protected getMetaTitle(model: ReferencesModel): string { + protected _getMetaTitle(model: ReferencesModel): string { return model.references.length > 1 && nls.localize('meta.title', " – {0} definitions", model.references.length); } @@ -157,7 +167,7 @@ export class DefinitionAction extends EditorAction { if (controller) { controller.toggleWidget(target.getSelection(), TPromise.as(model), { getMetaTitle: (model) => { - return this.getMetaTitle(model); + return this._getMetaTitle(model); }, onGoto: (reference) => { controller.closeWidget(); @@ -245,17 +255,17 @@ export class PeekDefinitionAction extends DefinitionAction { } export class ImplementationAction extends DefinitionAction { - protected getDeclarationsAtPosition(model: editorCommon.IModel, position: corePosition.Position): TPromise { + protected _getDeclarationsAtPosition(model: editorCommon.IModel, position: corePosition.Position): TPromise { return getImplementationsAtPosition(model, position); } - protected getNoResultFoundMessage(info?: editorCommon.IWordAtPosition): string { + protected _getNoResultFoundMessage(info?: editorCommon.IWordAtPosition): string { return info && info.word ? nls.localize('goToImplementation.noResultWord', "No implementation found for '{0}'", info.word) : nls.localize('goToImplementation.generic.noResults', "No implementation found"); } - protected getMetaTitle(model: ReferencesModel): string { + protected _getMetaTitle(model: ReferencesModel): string { return model.references.length > 1 && nls.localize('meta.implementations.title', " – {0} implementations", model.references.length); } } @@ -303,17 +313,17 @@ export class PeekImplementationAction extends ImplementationAction { } export class TypeDefinitionAction extends DefinitionAction { - protected getDeclarationsAtPosition(model: editorCommon.IModel, position: corePosition.Position): TPromise { + protected _getDeclarationsAtPosition(model: editorCommon.IModel, position: corePosition.Position): TPromise { return getTypeDefinitionsAtPosition(model, position); } - protected getNoResultFoundMessage(info?: editorCommon.IWordAtPosition): string { + protected _getNoResultFoundMessage(info?: editorCommon.IWordAtPosition): string { return info && info.word ? nls.localize('goToTypeDefinition.noResultWord', "No type definition found for '{0}'", info.word) : nls.localize('goToTypeDefinition.generic.noResults', "No type definition found"); } - protected getMetaTitle(model: ReferencesModel): string { + protected _getMetaTitle(model: ReferencesModel): string { return model.references.length > 1 && nls.localize('meta.typeDefinitions.title', " – {0} type definitions", model.references.length); } } From f8ee7599fb46ea0e53b2a969af1b97bd0d9b4107 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 12 May 2017 12:30:02 +0200 Subject: [PATCH 0377/1164] Cannot read property 'isFullScreen' of null (fixes #26520) --- src/vs/code/electron-main/window.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index bf81a6c55bf..b7a33c5be26 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -600,6 +600,9 @@ export class VSCodeWindow { } public serializeWindowState(): IWindowState { + if (!this._win) { + return null; // avoid NPE when calling this method after the window has been disposed + } // fullscreen gets special treatment if (this._win.isFullScreen()) { From a85519060d89ee84f2d81f37aef00e3bc64bd987 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 12 May 2017 12:31:26 +0200 Subject: [PATCH 0378/1164] fix #26508 --- .../contrib/goToDeclaration/browser/goToDeclaration.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts index 3f06e80bc69..eb4fcb4e7fe 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts @@ -66,11 +66,16 @@ export class DefinitionAction extends EditorAction { const messageService = accessor.get(IMessageService); const editorService = accessor.get(IEditorService); - let model = editor.getModel(); - let pos = editor.getPosition(); + const model = editor.getModel(); + const pos = editor.getPosition(); return this._getDeclarationsAtPosition(model, pos).then(references => { + if (model.isDisposed() || editor.getModel() !== model) { + // new model, no more model + return; + } + // * remove falsy references // * find reference at the current pos let idxOfCurrent = -1; From 839e9af25748631b625bb182772265707fc5b062 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 12 May 2017 12:31:57 +0200 Subject: [PATCH 0379/1164] Fix #17255 --- .../parts/search/browser/searchResultsView.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/searchResultsView.ts b/src/vs/workbench/parts/search/browser/searchResultsView.ts index 2ea9e84cafa..92de358f92b 100644 --- a/src/vs/workbench/parts/search/browser/searchResultsView.ts +++ b/src/vs/workbench/parts/search/browser/searchResultsView.ts @@ -236,13 +236,15 @@ export class SearchAccessibilityProvider implements IAccessibilityProvider { } if (element instanceof Match) { - let match = element; - let input = tree.getInput(); - if (input.searchModel.isReplaceActive()) { - let preview = match.preview(); - return nls.localize('replacePreviewResultAria', "Replace preview result, {0}", preview.before + match.replaceString + preview.after); + const match = element; + const searchModel: SearchModel = (tree.getInput()).searchModel; + const replace = searchModel.isReplaceActive() && !!searchModel.replaceString; + const preview = match.preview(); + const range = match.range(); + if (replace) { + return nls.localize('replacePreviewResultAria', "Replace term {0} with {1} at column position {2} in line with text {3}", preview.inside, match.replaceString, range.startColumn + 1, match.text()); } - return nls.localize('searchResultAria', "{0}, Search result", match.text()); + return nls.localize('searchResultAria', "Found term {0} at column position {1} in line with text {2}", preview.inside, range.startColumn + 1, match.text()); } return undefined; } From fc28aa10062abd67f363ac6af4cb992667d11fb2 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 12 May 2017 12:35:55 +0200 Subject: [PATCH 0380/1164] Fix #17534 --- src/vs/workbench/parts/search/browser/searchResultsView.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/workbench/parts/search/browser/searchResultsView.ts b/src/vs/workbench/parts/search/browser/searchResultsView.ts index 92de358f92b..48452fee61f 100644 --- a/src/vs/workbench/parts/search/browser/searchResultsView.ts +++ b/src/vs/workbench/parts/search/browser/searchResultsView.ts @@ -213,6 +213,8 @@ export class SearchRenderer extends Disposable implements IRenderer { templateData.actions.clear(); if (searchModel.isReplaceActive()) { templateData.actions.push([this.instantiationService.createInstance(ReplaceAction, tree, match, this.viewlet), new RemoveAction(tree, match)], { icon: true, label: false }); + } else { + templateData.actions.push([new RemoveAction(tree, match)], { icon: true, label: false }); } } From 89a9b9b398e379f5ba23c5ada2436eb1cc9a9f13 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 12 May 2017 12:37:29 +0200 Subject: [PATCH 0381/1164] fix #26510 --- src/vs/editor/contrib/rename/browser/renameInputField.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/rename/browser/renameInputField.ts b/src/vs/editor/contrib/rename/browser/renameInputField.ts index 241d5f6c51d..020bfe66665 100644 --- a/src/vs/editor/contrib/rename/browser/renameInputField.ts +++ b/src/vs/editor/contrib/rename/browser/renameInputField.ts @@ -151,7 +151,7 @@ export default class RenameInputField implements IContentWidget, IDisposable { this._currentAcceptInput = () => { if (this._inputField.value.trim().length === 0 || this._inputField.value === value) { // empty or whitespace only or not changed - this._currentCancelInput(); + this.cancelInput(); return; } @@ -162,12 +162,12 @@ export default class RenameInputField implements IContentWidget, IDisposable { let onCursorChanged = () => { if (!Range.containsPosition(where, this._editor.getPosition())) { - this._currentCancelInput(); + this.cancelInput(); } }; disposeOnDone.push(this._editor.onDidChangeCursorSelection(onCursorChanged)); - disposeOnDone.push(this._editor.onDidBlurEditor(this._currentCancelInput)); + disposeOnDone.push(this._editor.onDidBlurEditor(() => this.cancelInput())); this._show(); From 217c7424831ffc17ac0126838c461e9418fc9331 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 12 May 2017 12:39:30 +0200 Subject: [PATCH 0382/1164] Cannot read property 'className' of null (fixes #26525) --- src/vs/workbench/parts/files/browser/views/explorerView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/files/browser/views/explorerView.ts b/src/vs/workbench/parts/files/browser/views/explorerView.ts index a9930687411..d1a190d8da2 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerView.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerView.ts @@ -134,7 +134,7 @@ export class ExplorerView extends CollapsibleViewletView { DOM.toggleClass(this.treeContainer, 'align-icons-and-twisties', fileIconTheme.hasFileIcons && !fileIconTheme.hasFolderIcons); }; - this.themeService.onDidFileIconThemeChange(onFileIconThemeChange); + this.toDispose.push(this.themeService.onDidFileIconThemeChange(onFileIconThemeChange)); onFileIconThemeChange(this.themeService.getFileIconTheme()); } From aa8f889b8a127dcafe6d63a5e7ea97f9380a9def Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 12 May 2017 12:42:34 +0200 Subject: [PATCH 0383/1164] fix #26512 --- src/vs/code/electron-main/app.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 03609bc5772..f15971a75de 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -113,11 +113,15 @@ export class VSCodeApplication { }); ipc.on('vscode:fetchShellEnv', (event, windowId) => { - const win = BrowserWindow.fromId(windowId); + const { webContents } = BrowserWindow.fromId(windowId); getShellEnvironment().then(shellEnv => { - win.webContents.send('vscode:acceptShellEnv', shellEnv); + if (!webContents.isDestroyed()) { + webContents.send('vscode:acceptShellEnv', shellEnv); + } }, err => { - win.webContents.send('vscode:acceptShellEnv', {}); + if (!webContents.isDestroyed()) { + webContents.send('vscode:acceptShellEnv', {}); + } console.error('Error fetching shell env', err); }); }); @@ -265,4 +269,4 @@ export class VSCodeApplication { private dispose(): void { this.toDispose = dispose(this.toDispose); } -} \ No newline at end of file +} From 1f12bc3d4fb138508150b460ce3418c3f3135910 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 12 May 2017 12:57:49 +0200 Subject: [PATCH 0384/1164] debug: fetch the rest of the callstack lazily fixes #25605 --- .../parts/debug/common/debugModel.ts | 8 ++++---- .../debug/electron-browser/debugService.ts | 19 ++++++++++++++----- .../debug/electron-browser/debugViewer.ts | 2 +- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index d5bb323a1b0..2ec0be9c6af 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -379,7 +379,7 @@ export class Thread implements IThread { constructor(public process: IProcess, public name: string, public threadId: number) { this.fetchPromise = null; this.stoppedDetails = null; - this.callStack = null; + this.callStack = []; this.stopped = false; } @@ -389,7 +389,7 @@ export class Thread implements IThread { public clearCallStack(): void { this.fetchPromise = null; - this.callStack = null; + this.callStack = []; } public getCallStack(): IStackFrame[] { @@ -779,8 +779,8 @@ export class Model implements IModel { } } - public fetchCallStack(thread: Thread): TPromise { - return thread.fetchCallStack().then(() => { + public fetchCallStack(thread: IThread): TPromise { + return (thread).fetchCallStack().then(() => { this._onDidChangeCallStack.fire(); }); } diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index 2d2d483948d..c54ba326fb5 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -7,6 +7,7 @@ import * as nls from 'vs/nls'; import * as lifecycle from 'vs/base/common/lifecycle'; import Event, { Emitter } from 'vs/base/common/event'; import * as paths from 'vs/base/common/paths'; +import { RunOnceScheduler } from 'vs/base/common/async'; import * as strings from 'vs/base/common/strings'; import { generateUuid } from 'vs/base/common/uuid'; import uri from 'vs/base/common/uri'; @@ -79,6 +80,7 @@ export class DebugService implements debug.IDebugService { private debugType: IContextKey; private debugState: IContextKey; private breakpointsToSendOnResourceSaved: Set; + private callStackScheduler: RunOnceScheduler; constructor( @IStorageService private storageService: IStorageService, @@ -117,6 +119,17 @@ export class DebugService implements debug.IDebugService { this.loadExceptionBreakpoints(), this.loadWatchExpressions()); this.toDispose.push(this.model); this.viewModel = new ViewModel(this.storageService.get(DEBUG_SELECTED_CONFIG_NAME_KEY, StorageScope.WORKSPACE, null)); + this.callStackScheduler = new RunOnceScheduler(() => { + const focusedThread = this.viewModel.focusedThread; + if (focusedThread) { + const callStack = focusedThread.getCallStack(); + // Some adapters might not respect the number levels in StackTraceRequest and might + // return more stackFrames than requested. For those do not send an additional stackTrace request. + if (callStack.length <= 1) { + this.model.fetchCallStack(focusedThread).done(undefined, errors.onUnexpectedError); + } + } + }, 420); this.registerListeners(lifecycleService); } @@ -295,11 +308,7 @@ export class DebugService implements debug.IDebugService { // Second retrieves the rest of the call stack. For performance reasons #25605 this.model.fetchCallStack(thread).then(() => { const callStack = thread.getCallStack(); - // Some adapters might not respect the number levels in StackTraceRequest and might - // return more stackFrames than requested. For those do not send an additional stackTrace request. - if (callStack.length <= 1) { - this.model.fetchCallStack(thread).done(undefined, errors.onUnexpectedError); - } + this.callStackScheduler.schedule(); if (callStack.length > 0 && !this.viewModel.focusedStackFrame) { // focus first stack frame from top that has source location if no other stack frame is focussed const stackFrameToFocus = first(callStack, sf => sf.source && sf.source.available, callStack[0]); diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts index f5d1519568c..5450d5d5099 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts @@ -370,7 +370,7 @@ export class CallStackDataSource implements IDataSource { if (thread.stoppedDetails && thread.stoppedDetails.framesErrorMessage) { return callStack.concat([thread.stoppedDetails.framesErrorMessage]); } - if (thread.stoppedDetails && thread.stoppedDetails.totalFrames > callStack.length) { + if (thread.stoppedDetails && thread.stoppedDetails.totalFrames > callStack.length && callStack.length > 1) { return callStack.concat([new ThreadAndProcessIds(thread.process.getId(), thread.threadId)]); } From 123c1f65216f4f0df8cf368c9aa0d0e06d17df5b Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 12 May 2017 12:56:51 +0200 Subject: [PATCH 0385/1164] fix #26168 --- .../contrib/codelens/browser/codelens.ts | 27 +++++-------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/src/vs/editor/contrib/codelens/browser/codelens.ts b/src/vs/editor/contrib/codelens/browser/codelens.ts index 533f5056835..b5e6fe24335 100644 --- a/src/vs/editor/contrib/codelens/browser/codelens.ts +++ b/src/vs/editor/contrib/codelens/browser/codelens.ts @@ -8,7 +8,7 @@ import 'vs/css!./codelens'; import { RunOnceScheduler, asWinJsPromise } from 'vs/base/common/async'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { Disposables, IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import Severity from 'vs/base/common/severity'; import { format, escape } from 'vs/base/common/strings'; import { TPromise } from 'vs/base/common/winjs.base'; @@ -17,7 +17,7 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { IMessageService } from 'vs/platform/message/common/message'; import { Range } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import { CodeLensProviderRegistry, CodeLensProvider, ICodeLensSymbol, Command } from 'vs/editor/common/modes'; +import { CodeLensProviderRegistry, ICodeLensSymbol, Command } from 'vs/editor/common/modes'; import * as editorBrowser from 'vs/editor/browser/editorBrowser'; import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; import { ICodeLensData, getCodeLensData } from '../common/codelens'; @@ -406,24 +406,12 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { return; } - const providerSubscriptions = new Disposables(); - this._localToDispose.push(providerSubscriptions); - - const onEvent = () => { - providerSubscriptions.dispose(); - scheduler.schedule(); - }; - - const subscribeToProviders = (result: ICodeLensData[]) => { - const seen = new Set(); - - for (const { provider } of result) { - if (provider.onDidChange && !seen.has(provider)) { - providerSubscriptions.add(provider.onDidChange(onEvent)); - seen.add(provider); - } + for (const provider of CodeLensProviderRegistry.all(model)) { + if (typeof provider.onDidChange === 'function') { + let registration = provider.onDidChange(() => scheduler.schedule()); + this._localToDispose.push(registration); } - }; + } this._detectVisibleLenses = new RunOnceScheduler(() => { this._onViewportChanged(model.getLanguageIdentifier().language); @@ -440,7 +428,6 @@ export class CodeLensContribution implements editorCommon.IEditorContribution { this._currentFindCodeLensSymbolsPromise.then((result) => { if (counterValue === this._modelChangeCounter) { // only the last one wins this.renderCodeLensSymbols(result); - subscribeToProviders(result); this._detectVisibleLenses.schedule(); } }, (error) => { From b0d401938b1bb9dca0be7772ab00d51f95d3adc9 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 12 May 2017 13:55:05 +0200 Subject: [PATCH 0386/1164] [Theme] allow to set editor gutter background. Fixes #22410 --- .../viewParts/glyphMargin/glyphMargin.ts | 12 +------ .../editor/browser/viewParts/margin/margin.ts | 2 +- .../editor/common/view/editorColorRegistry.ts | 15 ++++++--- .../contrib/find/browser/findOptionsWidget.ts | 8 ++--- .../browser/referencesWidget.ts | 32 +++++++++++-------- 5 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts b/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts index b92c9d0e559..455a49cb3fb 100644 --- a/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts +++ b/src/vs/editor/browser/viewParts/glyphMargin/glyphMargin.ts @@ -11,9 +11,6 @@ import { ViewContext } from 'vs/editor/common/view/viewContext'; import { RenderingContext } from 'vs/editor/common/view/renderingContext'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { editorBackground } from 'vs/platform/theme/common/colorRegistry'; -import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; - export class DecorationToRender { _decorationToRenderBrand: void; @@ -200,11 +197,4 @@ export class GlyphMarginOverlay extends DedupOverlay { } return this._renderResult[lineIndex]; } -} - -registerThemingParticipant((theme, collector) => { - let editorBackgroundColor = theme.getColor(editorBackground); - if (editorBackgroundColor) { - collector.addRule(`.monaco-editor.${theme.selector} .glyph-margin { background-color: ${editorBackgroundColor}; }`); - } -}); \ No newline at end of file +} \ No newline at end of file diff --git a/src/vs/editor/browser/viewParts/margin/margin.ts b/src/vs/editor/browser/viewParts/margin/margin.ts index 162ef220f32..35fcf1563b9 100644 --- a/src/vs/editor/browser/viewParts/margin/margin.ts +++ b/src/vs/editor/browser/viewParts/margin/margin.ts @@ -42,7 +42,7 @@ export class Margin extends ViewPart { private _createDomNode(): FastDomNode { let domNode = createFastDomNode(document.createElement('div')); - domNode.setClassName('margin' + ' monaco-editor-background'); + domNode.setClassName('margin'); domNode.setPosition('absolute'); domNode.setAttribute('role', 'presentation'); domNode.setAttribute('aria-hidden', 'true'); diff --git a/src/vs/editor/common/view/editorColorRegistry.ts b/src/vs/editor/common/view/editorColorRegistry.ts index 6be8ca4e54b..71d5b37551d 100644 --- a/src/vs/editor/common/view/editorColorRegistry.ts +++ b/src/vs/editor/common/view/editorColorRegistry.ts @@ -27,26 +27,33 @@ export const editorBracketMatchBorder = registerColor('editorBracketMatch.border export const editorOverviewRulerBorder = registerColor('editorOverviewRuler.border', { dark: '#7f7f7f4d', light: '#7f7f7f4d', hc: '#7f7f7f4d' }, nls.localize('editorOverviewRulerBorder', 'Color of the overview ruler border.')); +export const editorGutter = registerColor('editorGutter.background', { dark: editorBackground, light: editorBackground, hc: editorBackground }, nls.localize('editorGutter', 'Background color of the editor gutter. The gutter contains the glyph margins and the line numbers.')); + // contains all color rules that used to defined in editor/browser/widget/editor.css registerThemingParticipant((theme, collector) => { let background = theme.getColor(editorBackground); if (background) { - collector.addRule(`.monaco-editor.${theme.selector} .monaco-editor-background, .monaco-editor.${theme.selector} .inputarea.ime-input { background-color: ${background}; }`); + collector.addRule(`.monaco-editor .monaco-editor-background, .monaco-editor .inputarea.ime-input { background-color: ${background}; }`); } let foreground = theme.getColor(editorForeground); if (foreground) { - collector.addRule(`.monaco-editor.${theme.selector}, .monaco-editor.${theme.selector} .inputarea.ime-input { color: ${foreground}; }`); + collector.addRule(`.monaco-editor, .monaco-editor .inputarea.ime-input { color: ${foreground}; }`); + } + + let gutter = theme.getColor(editorGutter); + if (gutter) { + collector.addRule(`.monaco-editor .margin { background-color: ${gutter}; }`); } let rangeHighlight = theme.getColor(editorRangeHighlight); if (rangeHighlight) { - collector.addRule(`.monaco-editor.${theme.selector} .rangeHighlight { background-color: ${rangeHighlight}; }`); + collector.addRule(`.monaco-editor .rangeHighlight { background-color: ${rangeHighlight}; }`); } let outline = theme.getColor(activeContrastBorder); if (outline) { - collector.addRule(`.monaco-editor.${theme.selector} .rangeHighlight { border: 1px dotted ${outline}; }; }`); + collector.addRule(`.monaco-editor .rangeHighlight { border: 1px dotted ${outline}; }; }`); } let invisibles = theme.getColor(editorWhitespaces); diff --git a/src/vs/editor/contrib/find/browser/findOptionsWidget.ts b/src/vs/editor/contrib/find/browser/findOptionsWidget.ts index 05a5d1c9ffe..7634aa1ca30 100644 --- a/src/vs/editor/contrib/find/browser/findOptionsWidget.ts +++ b/src/vs/editor/contrib/find/browser/findOptionsWidget.ts @@ -42,7 +42,7 @@ export class FindOptionsWidget extends Widget implements IOverlayWidget { this._keybindingService = keybindingService; this._domNode = document.createElement('div'); - this._domNode.className = 'monaco-editor-background findOptionsWidget'; + this._domNode.className = 'findOptionsWidget'; this._domNode.style.display = 'none'; this._domNode.style.top = '10px'; this._domNode.setAttribute('role', 'presentation'); @@ -192,16 +192,16 @@ export class FindOptionsWidget extends Widget implements IOverlayWidget { registerThemingParticipant((theme, collector) => { let widgetBackground = theme.getColor(editorWidgetBackground); if (widgetBackground) { - collector.addRule(`.monaco-editor.${theme.selector} .findOptionsWidget { background-color: ${widgetBackground}; }`); + collector.addRule(`.monaco-editor .findOptionsWidget { background-color: ${widgetBackground}; }`); } let widgetShadowColor = theme.getColor(widgetShadow); if (widgetShadowColor) { - collector.addRule(`.monaco-editor.${theme.selector} .findOptionsWidget { box-shadow: 0 2px 8px ${widgetShadowColor}; }`); + collector.addRule(`.monaco-editor .findOptionsWidget { box-shadow: 0 2px 8px ${widgetShadowColor}; }`); } let hcBorder = theme.getColor(contrastBorder); if (hcBorder) { - collector.addRule(`.monaco-editor.${theme.selector} .findOptionsWidget { border: 2px solid ${hcBorder}; }`); + collector.addRule(`.monaco-editor .findOptionsWidget { border: 2px solid ${hcBorder}; }`); } }); \ No newline at end of file diff --git a/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts b/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts index f5bbe18e907..cc8ae4a72ec 100644 --- a/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts +++ b/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts @@ -824,6 +824,7 @@ export const peekViewResultsFileForeground = registerColor('peekViewResult.fileF export const peekViewResultsSelectionBackground = registerColor('peekViewResult.selectionBackground', { dark: '#3399ff33', light: '#3399ff33', hc: null }, nls.localize('peekViewResultsSelectionBackground', 'Background color of the selected entry in the peek view result list.')); export const peekViewResultsSelectionForeground = registerColor('peekViewResult.selectionForeground', { dark: Color.white, light: '#6C6C6C', hc: Color.white }, nls.localize('peekViewResultsSelectionForeground', 'Foreground color of the selected entry in the peek view result list.')); export const peekViewEditorBackground = registerColor('peekViewEditor.background', { dark: '#001F33', light: '#F2F8FC', hc: Color.black }, nls.localize('peekViewEditorBackground', 'Background color of the peek view editor.')); +export const peekViewEditorGutterBackground = registerColor('peekViewEditorGutter.background', { dark: peekViewEditorBackground, light: peekViewEditorBackground, hc: peekViewEditorBackground }, nls.localize('peekViewEditorGutterBackground', 'Background color of the gutter in the peek view editor.')); export const peekViewResultsMatchHighlight = registerColor('peekViewResult.matchHighlightBackground', { dark: '#ea5c004d', light: '#ea5c004d', hc: null }, nls.localize('peekViewResultsMatchHighlight', 'Match highlight color in the peek view result list.')); export const peekViewEditorMatchHighlight = registerColor('peekViewEditor.matchHighlightBackground', { dark: '#ff8f0099', light: '#f5d802de', hc: null }, nls.localize('peekViewEditorMatchHighlight', 'Match highlight color in the peek view editor.')); @@ -832,45 +833,50 @@ export const peekViewEditorMatchHighlight = registerColor('peekViewEditor.matchH registerThemingParticipant((theme, collector) => { let findMatchHighlightColor = theme.getColor(peekViewResultsMatchHighlight); if (findMatchHighlightColor) { - collector.addRule(`.monaco-editor.${theme.selector} .reference-zone-widget .ref-tree .referenceMatch { background-color: ${findMatchHighlightColor}; }`); + collector.addRule(`.monaco-editor .reference-zone-widget .ref-tree .referenceMatch { background-color: ${findMatchHighlightColor}; }`); } let referenceHighlightColor = theme.getColor(peekViewEditorMatchHighlight); if (referenceHighlightColor) { - collector.addRule(`.monaco-editor.${theme.selector} .reference-zone-widget .preview .reference-decoration { background-color: ${referenceHighlightColor}; }`); + collector.addRule(`.monaco-editor .reference-zone-widget .preview .reference-decoration { background-color: ${referenceHighlightColor}; }`); } let hcOutline = theme.getColor(activeContrastBorder); if (hcOutline) { - collector.addRule(`.monaco-editor.${theme.selector} .reference-zone-widget .ref-tree .referenceMatch { border: 1px dotted ${hcOutline}; box-sizing: border-box; }`); - collector.addRule(`.monaco-editor.${theme.selector} .reference-zone-widget .preview .reference-decoration { border: 2px solid ${hcOutline}; box-sizing: border-box; }`); + collector.addRule(`.monaco-editor .reference-zone-widget .ref-tree .referenceMatch { border: 1px dotted ${hcOutline}; box-sizing: border-box; }`); + collector.addRule(`.monaco-editor .reference-zone-widget .preview .reference-decoration { border: 2px solid ${hcOutline}; box-sizing: border-box; }`); } let resultsBackground = theme.getColor(peekViewResultsBackground); if (resultsBackground) { - collector.addRule(`.monaco-editor.${theme.selector} .reference-zone-widget .ref-tree { background-color: ${resultsBackground}; }`); + collector.addRule(`.monaco-editor .reference-zone-widget .ref-tree { background-color: ${resultsBackground}; }`); } let resultsMatchForeground = theme.getColor(peekViewResultsMatchForeground); if (resultsMatchForeground) { - collector.addRule(`.monaco-editor.${theme.selector} .reference-zone-widget .ref-tree { color: ${resultsMatchForeground}; }`); + collector.addRule(`.monaco-editor .reference-zone-widget .ref-tree { color: ${resultsMatchForeground}; }`); } let resultsFileForeground = theme.getColor(peekViewResultsFileForeground); if (resultsFileForeground) { - collector.addRule(`.monaco-editor.${theme.selector} .reference-zone-widget .ref-tree .reference-file { color: ${resultsFileForeground}; }`); + collector.addRule(`.monaco-editor .reference-zone-widget .ref-tree .reference-file { color: ${resultsFileForeground}; }`); } let resultsSelectedBackground = theme.getColor(peekViewResultsSelectionBackground); if (resultsSelectedBackground) { - collector.addRule(`.monaco-editor.${theme.selector} .reference-zone-widget .ref-tree .monaco-tree.focused .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { background-color: ${resultsSelectedBackground}; }`); + collector.addRule(`.monaco-editor .reference-zone-widget .ref-tree .monaco-tree.focused .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { background-color: ${resultsSelectedBackground}; }`); } let resultsSelectedForeground = theme.getColor(peekViewResultsSelectionForeground); if (resultsSelectedForeground) { - collector.addRule(`.monaco-editor.${theme.selector} .reference-zone-widget .ref-tree .monaco-tree.focused .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { color: ${resultsSelectedForeground} !important; }`); + collector.addRule(`.monaco-editor .reference-zone-widget .ref-tree .monaco-tree.focused .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { color: ${resultsSelectedForeground} !important; }`); } let editorBackground = theme.getColor(peekViewEditorBackground); if (editorBackground) { collector.addRule( - `.monaco-editor.${theme.selector} .reference-zone-widget .preview .monaco-editor,` + - `.monaco-editor.${theme.selector} .reference-zone-widget .preview .glyph-margin,` + - `.monaco-editor.${theme.selector} .reference-zone-widget .preview .monaco-editor-background,` + - `.monaco-editor.${theme.selector} .reference-zone-widget .preview .monaco-editor .margin .view-line {` + + `.monaco-editor .reference-zone-widget .preview .monaco-editor .monaco-editor-background,` + + `.monaco-editor .reference-zone-widget .preview .monaco-editor .inputarea.ime-input {` + ` background-color: ${editorBackground};` + `}`); } + let editorGutterBackground = theme.getColor(peekViewEditorGutterBackground); + if (editorGutterBackground) { + collector.addRule( + `.monaco-editor .reference-zone-widget .preview .monaco-editor .margin {` + + ` background-color: ${editorGutterBackground};` + + `}`); + } }); From b4a7da9219c0d08f3d9b851e54357844a01e85d2 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 12 May 2017 14:52:21 +0200 Subject: [PATCH 0387/1164] fix #26544 --- src/vs/vscode.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 95fd5de30fd..3faf70275df 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -1379,7 +1379,7 @@ declare module 'vscode' { * Provide textual content for a given uri. * * The editor will use the returned string-content to create a readonly - * [document](TextDocument). Resources allocated should be released when + * [document](#TextDocument). Resources allocated should be released when * the corresponding document has been [closed](#workspace.onDidCloseTextDocument). * * @param uri An uri which scheme matches the scheme this provider was [registered](#workspace.registerTextDocumentContentProvider) for. From 85df4550bec9667cd36c39051b42592da2e683ab Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 12 May 2017 15:25:08 +0200 Subject: [PATCH 0388/1164] debug: reduce callstack flashing by showing a stale remainder of the callstack #25605 --- src/vs/workbench/parts/debug/common/debugModel.ts | 9 +++++++++ .../parts/debug/electron-browser/debugViewer.ts | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index 2ec0be9c6af..1f3e082dc63 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -373,6 +373,7 @@ export class StackFrame implements IStackFrame { export class Thread implements IThread { private fetchPromise: TPromise; private callStack: IStackFrame[]; + private staleCallStack: IStackFrame[]; public stoppedDetails: IRawStoppedDetails; public stopped: boolean; @@ -380,6 +381,7 @@ export class Thread implements IThread { this.fetchPromise = null; this.stoppedDetails = null; this.callStack = []; + this.staleCallStack = []; this.stopped = false; } @@ -389,6 +391,9 @@ export class Thread implements IThread { public clearCallStack(): void { this.fetchPromise = null; + if (this.callStack.length) { + this.staleCallStack = this.callStack; + } this.callStack = []; } @@ -396,6 +401,10 @@ export class Thread implements IThread { return this.callStack; } + public getStaleCallStack(): IStackFrame[] { + return this.staleCallStack; + } + /** * Queries the debug adapter for the callstack and returns a promise * which completes once the call stack has been retrieved. diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts index 5450d5d5099..2c8391b709f 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts @@ -366,6 +366,11 @@ export class CallStackDataSource implements IDataSource { if (!callStack) { return []; } + if (callStack.length === 1) { + // To reduce flashing of the call stack view simply append the stale call stack + // once we have the correct data the tree will refresh and we will no longer display it. + return callStack.concat(thread.getStaleCallStack().slice(1)); + } if (thread.stoppedDetails && thread.stoppedDetails.framesErrorMessage) { return callStack.concat([thread.stoppedDetails.framesErrorMessage]); From b8146bc3a7d6f39c9f79b991d27ac8e639ce57bb Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 12 May 2017 15:29:08 +0200 Subject: [PATCH 0389/1164] Fix #26354 --- .../electron-browser/extensionTipsService.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts index 78bf2b91c71..59ee7282c26 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts @@ -40,6 +40,7 @@ export class ExtensionTipsService implements IExtensionTipsService { private _availableRecommendations: { [pattern: string]: string[] } = Object.create(null); private importantRecommendations: { [id: string]: { name: string; pattern: string; } }; private importantRecommendationsIgnoreList: string[]; + private _allRecommendations: string[]; private _disposables: IDisposable[] = []; constructor( @@ -80,13 +81,25 @@ export class ExtensionTipsService implements IExtensionTipsService { } getRecommendations(): string[] { - return Object.keys(this._recommendations); + const allRecomendations = this._getAllRecommendationsInProduct(); + return Object.keys(this._recommendations) + .filter(recommendation => allRecomendations.indexOf(recommendation) !== -1); } getKeymapRecommendations(): string[] { return product.keymapExtensionTips || []; } + private _getAllRecommendationsInProduct(): string[] { + if (!this._allRecommendations) { + this._allRecommendations = [...Object.keys(this.importantRecommendations)]; + forEach(this._availableRecommendations, ({ value: ids }) => { + this._allRecommendations.push(...ids); + }); + } + return this._allRecommendations; + } + private _suggestTips() { const extensionTips = product.extensionTips; if (!extensionTips) { From 5005b5bbb37f706b222aa6eaa675f50ec9c11b14 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 12 May 2017 15:32:11 +0200 Subject: [PATCH 0390/1164] sync font size and line height with editor, #25506 --- .../contrib/codelens/browser/codelens.css | 3 +- .../contrib/codelens/browser/codelens.ts | 42 ++++++++++++------- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/vs/editor/contrib/codelens/browser/codelens.css b/src/vs/editor/contrib/codelens/browser/codelens.css index d1563adc199..113a5a1fbb4 100644 --- a/src/vs/editor/contrib/codelens/browser/codelens.css +++ b/src/vs/editor/contrib/codelens/browser/codelens.css @@ -7,7 +7,6 @@ overflow: hidden; display: inline-block; text-overflow: ellipsis; - font-size: 90%; } .monaco-editor .codelens-decoration > span, @@ -43,4 +42,4 @@ -moz-animation: fadein 0.5s linear; -o-animation: fadein 0.5s linear; animation: fadein 0.5s linear; -} \ No newline at end of file +} diff --git a/src/vs/editor/contrib/codelens/browser/codelens.ts b/src/vs/editor/contrib/codelens/browser/codelens.ts index b5e6fe24335..ef3829e40ee 100644 --- a/src/vs/editor/contrib/codelens/browser/codelens.ts +++ b/src/vs/editor/contrib/codelens/browser/codelens.ts @@ -65,37 +65,43 @@ class CodeLensContentWidget implements editorBrowser.IContentWidget { private static ID: number = 0; // Editor.IContentWidget.allowEditorOverflow - readonly allowEditorOverflow = false; - - public suppressMouseDown: boolean; + readonly allowEditorOverflow: boolean = false; + readonly suppressMouseDown: boolean = true; private _id: string; private _domNode: HTMLElement; - private _subscription: IDisposable; + private _disposables: IDisposable[] = []; private _symbolRange: Range; private _widgetPosition: editorBrowser.IContentWidgetPosition; private _editor: editorBrowser.ICodeEditor; private _commands: { [id: string]: Command } = Object.create(null); - public constructor(editor: editorBrowser.ICodeEditor, symbolRange: Range, - commandService: ICommandService, messageService: IMessageService) { + public constructor( + editor: editorBrowser.ICodeEditor, + symbolRange: Range, + commandService: ICommandService, + messageService: IMessageService + ) { this._id = 'codeLensWidget' + (++CodeLensContentWidget.ID); this._editor = editor; - this.suppressMouseDown = true; - this.setSymbolRange(symbolRange); this._domNode = document.createElement('span'); - const lineHeight = editor.getConfiguration().lineHeight; - this._domNode.style.height = `${lineHeight}px`; - this._domNode.style.lineHeight = `${lineHeight}px`; this._domNode.innerHTML = ' '; dom.addClass(this._domNode, 'codelens-decoration'); dom.addClass(this._domNode, 'invisible-cl'); - this._subscription = dom.addDisposableListener(this._domNode, 'click', e => { + this._updateHeight(); + + this._disposables.push(this._editor.onDidChangeConfiguration(e => { + if (e.fontInfo) { + this._updateHeight(); + } + })); + + this._disposables.push(dom.addDisposableListener(this._domNode, 'click', e => { let element = e.target; if (element.tagName === 'A' && element.id) { let command = this._commands[element.id]; @@ -106,16 +112,24 @@ class CodeLensContentWidget implements editorBrowser.IContentWidget { }); } } - }); + })); this.updateVisibility(); } public dispose(): void { - this._subscription.dispose(); + dispose(this._disposables); this._symbolRange = null; } + private _updateHeight(): void { + const { fontInfo, lineHeight } = this._editor.getConfiguration(); + this._domNode.style.height = `${lineHeight}px`; + this._domNode.style.lineHeight = `${lineHeight}px`; + this._domNode.style.fontSize = `${Math.round(fontInfo.fontSize * .9)}px`; + this._domNode.innerHTML = ' '; + } + public updateVisibility(): void { if (this.isVisible()) { dom.removeClass(this._domNode, 'invisible-cl'); From b54b1a984da075e0075c721aeb54d925fb6fba62 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 12 May 2017 16:02:10 +0200 Subject: [PATCH 0391/1164] fix tests --- .../parts/debug/test/common/mockDebug.ts | 7 +++- .../parts/debug/test/node/debugModel.test.ts | 38 ++++++++----------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/vs/workbench/parts/debug/test/common/mockDebug.ts b/src/vs/workbench/parts/debug/test/common/mockDebug.ts index 4f401f39687..c2f725b82c1 100644 --- a/src/vs/workbench/parts/debug/test/common/mockDebug.ts +++ b/src/vs/workbench/parts/debug/test/common/mockDebug.ts @@ -115,7 +115,12 @@ export class MockSession implements debug.ISession { public stackTrace(args: DebugProtocol.StackTraceArguments): TPromise { return TPromise.as({ body: { - stackFrames: [] + stackFrames: [{ + id: 1, + name: 'mock', + line: 5, + column: 6 + }] } }); } diff --git a/src/vs/workbench/parts/debug/test/node/debugModel.test.ts b/src/vs/workbench/parts/debug/test/node/debugModel.test.ts index 6e117d36fd8..da310a4f622 100644 --- a/src/vs/workbench/parts/debug/test/node/debugModel.test.ts +++ b/src/vs/workbench/parts/debug/test/node/debugModel.test.ts @@ -163,24 +163,24 @@ suite('Debug - Model', () => { assert.equal(process.getAllThreads().length, 2); assert.equal(thread1.name, threadName1); assert.equal(thread1.stopped, true); - assert.equal(thread1.getCallStack(), undefined); + assert.equal(thread1.getCallStack().length, 0); assert.equal(thread1.stoppedDetails.reason, stoppedReason); assert.equal(thread2.name, threadName2); assert.equal(thread2.stopped, true); - assert.equal(thread2.getCallStack(), undefined); + assert.equal(thread2.getCallStack().length, 0); assert.equal(thread2.stoppedDetails.reason, stoppedReason); // after calling getCallStack, the callstack becomes available // and results in a request for the callstack in the debug adapter thread1.fetchCallStack().then(() => { - assert.notEqual(thread1.getCallStack(), undefined); - assert.equal(thread2.getCallStack(), undefined); + assert.notEqual(thread1.getCallStack().length, 0); + assert.equal(thread2.getCallStack().length, 0); assert.equal(sessionStub.callCount, 1); }); thread2.fetchCallStack().then(() => { - assert.notEqual(thread1.getCallStack(), undefined); - assert.notEqual(thread2.getCallStack(), undefined); + assert.notEqual(thread1.getCallStack().length, 0); + assert.notEqual(thread2.getCallStack().length, 0); assert.equal(sessionStub.callCount, 2); }); @@ -189,17 +189,17 @@ suite('Debug - Model', () => { thread1.fetchCallStack().then(() => { return thread2.fetchCallStack(); }).then(() => { - assert.equal(sessionStub.callCount, 2); + assert.equal(sessionStub.callCount, 4); }); // clearing the callstack results in the callstack not being available thread1.clearCallStack(); assert.equal(thread1.stopped, true); - assert.equal(thread1.getCallStack(), undefined); + assert.equal(thread1.getCallStack().length, 0); thread2.clearCallStack(); assert.equal(thread2.stopped, true); - assert.equal(thread2.getCallStack(), undefined); + assert.equal(thread2.getCallStack().length, 0); model.clearThreads(process.getId(), true); assert.equal(process.getThread(threadId1), null); @@ -255,39 +255,33 @@ suite('Debug - Model', () => { assert.equal(stoppedThread.name, stoppedThreadName); assert.equal(stoppedThread.stopped, true); assert.equal(process.getAllThreads().length, 2); - assert.equal(stoppedThread.getCallStack(), undefined); + assert.equal(stoppedThread.getCallStack().length, 0); assert.equal(stoppedThread.stoppedDetails.reason, stoppedReason); assert.equal(runningThread.name, runningThreadName); assert.equal(runningThread.stopped, false); - assert.equal(runningThread.getCallStack(), undefined); + assert.equal(runningThread.getCallStack().length, 0); assert.equal(runningThread.stoppedDetails, undefined); // after calling getCallStack, the callstack becomes available // and results in a request for the callstack in the debug adapter stoppedThread.fetchCallStack().then(() => { - assert.notEqual(stoppedThread.getCallStack(), undefined); - assert.equal(runningThread.getCallStack(), undefined); + assert.notEqual(stoppedThread.getCallStack().length, 0); + assert.equal(runningThread.getCallStack().length, 0); assert.equal(sessionStub.callCount, 1); }); // calling getCallStack on the running thread returns empty array // and does not return in a request for the callstack in the debug // adapter - runningThread.fetchCallStack().then(callStack => { - assert.deepEqual(callStack, []); - assert.equal(sessionStub.callCount, 1); - }); - - // calling multiple times getCallStack doesn't result in multiple calls - // to the debug adapter - stoppedThread.fetchCallStack().then(() => { + runningThread.fetchCallStack().then(() => { + assert.equal(runningThread.getCallStack().length, 0); assert.equal(sessionStub.callCount, 1); }); // clearing the callstack results in the callstack not being available stoppedThread.clearCallStack(); assert.equal(stoppedThread.stopped, true); - assert.equal(stoppedThread.getCallStack(), undefined); + assert.equal(stoppedThread.getCallStack().length, 0); model.clearThreads(process.getId(), true); assert.equal(process.getThread(stoppedThreadId), null); From fa6a481f122efc3e6ed8736914725f165e591032 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 12 May 2017 15:49:39 +0200 Subject: [PATCH 0392/1164] goto-definition-link-hover no longer used --- .../goToDeclaration/browser/goToDeclaration.css | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.css b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.css index 57e88bae1fa..3361b104429 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.css +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.css @@ -6,15 +6,4 @@ .monaco-editor .goto-definition-link { text-decoration: underline; cursor: pointer; -} - -.monaco-editor .goto-definition-link-hover { - margin: 0.5em; - padding: 0; - padding-left: 0.5em; - border-left: 4px solid rgba(0, 0, 0, 0.14); -} - -.monaco-editor.vs-dark .goto-definition-link-hover { - border-left: 4px solid rgba(255, 255, 255, 0.25); } \ No newline at end of file From 6f7fb600ee543ba0c5b8b1958391d96df4c576c1 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 12 May 2017 16:05:10 +0200 Subject: [PATCH 0393/1164] [theme] remove back/foregrund colors from editor.css --- src/vs/editor/browser/widget/media/editor.css | 23 ------------------- .../editor/common/view/editorColorRegistry.ts | 2 +- 2 files changed, 1 insertion(+), 24 deletions(-) diff --git a/src/vs/editor/browser/widget/media/editor.css b/src/vs/editor/browser/widget/media/editor.css index e47af5c00c7..9f2a59b392a 100644 --- a/src/vs/editor/browser/widget/media/editor.css +++ b/src/vs/editor/browser/widget/media/editor.css @@ -30,29 +30,6 @@ font-feature-settings: "liga" on, "calt" on; } -.monaco-editor { - color: #333; - /* - * WORKAROUND: - * Because of bug https://monacotools.visualstudio.com/DefaultCollection/Monaco/_workitems/edit/13254 - * we are *not* using the color white (or #ffffff, rgba(255,255,255)) but something very close to white. - */ - background: #fffffe; -} - -.monaco-editor.vs-dark, -.monaco-editor.vs-dark .zone-widget .monaco-editor { - color: #BBB; - background: #1E1E1E; -} - -.monaco-editor.hc-black, -.monaco-editor.hc-black .zone-widget .monaco-editor { - color: #fff; - background: #000; -} - - /* -------------------- Misc -------------------- */ .monaco-editor .overflow-guard { diff --git a/src/vs/editor/common/view/editorColorRegistry.ts b/src/vs/editor/common/view/editorColorRegistry.ts index 71d5b37551d..223e503e53a 100644 --- a/src/vs/editor/common/view/editorColorRegistry.ts +++ b/src/vs/editor/common/view/editorColorRegistry.ts @@ -35,7 +35,7 @@ registerThemingParticipant((theme, collector) => { let background = theme.getColor(editorBackground); if (background) { - collector.addRule(`.monaco-editor .monaco-editor-background, .monaco-editor .inputarea.ime-input { background-color: ${background}; }`); + collector.addRule(`.monaco-editor, .monaco-editor .monaco-editor-background, .monaco-editor .inputarea.ime-input { background-color: ${background}; }`); } let foreground = theme.getColor(editorForeground); if (foreground) { From fa05586f8b918303745803cb69160bb257dad828 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 12 May 2017 16:23:05 +0200 Subject: [PATCH 0394/1164] [theme] remove ITheme.selector --- .../browser/services/standaloneThemeServiceImpl.ts | 3 --- .../currentLineHighlight/currentLineHighlight.ts | 6 +++--- .../currentLineMarginHighlight.ts | 6 +++--- .../browser/viewParts/indentGuides/indentGuides.ts | 2 +- .../browser/viewParts/lineNumbers/lineNumbers.ts | 2 +- .../browser/viewParts/selections/selections.ts | 4 ++-- .../browser/viewParts/viewCursors/viewCursors.ts | 4 ++-- .../contrib/accessibility/browser/accessibility.ts | 6 +++--- .../goToDeclaration/browser/goToDeclaration.ts | 2 +- src/vs/editor/contrib/hover/browser/hover.ts | 8 ++++---- src/vs/editor/contrib/links/browser/links.ts | 2 +- .../contrib/suggest/browser/suggestWidget.ts | 4 ++-- .../wordHighlighter/common/wordHighlighter.ts | 14 +++++++------- src/vs/platform/theme/common/themeService.ts | 1 - .../themes/electron-browser/colorThemeData.ts | 4 +--- .../electron-browser/workbenchThemeService.ts | 1 - src/vs/workbench/test/workbenchTestServices.ts | 5 ++--- 17 files changed, 33 insertions(+), 41 deletions(-) diff --git a/src/vs/editor/browser/services/standaloneThemeServiceImpl.ts b/src/vs/editor/browser/services/standaloneThemeServiceImpl.ts index 35132a10cba..dd29c95ffc4 100644 --- a/src/vs/editor/browser/services/standaloneThemeServiceImpl.ts +++ b/src/vs/editor/browser/services/standaloneThemeServiceImpl.ts @@ -24,7 +24,6 @@ const themingRegistry = Registry.as(ThemingExtensions.ThemingC class StandaloneTheme implements IStandaloneTheme { id: string; - selector: string; private rules: ITokenThemeRule[]; base: string; private colors: { [colorId: string]: Color }; @@ -34,10 +33,8 @@ class StandaloneTheme implements IStandaloneTheme { constructor(base: string, name: string, colors: IColors, rules: ITokenThemeRule[]) { if (name.length > 0) { this.id = base + ' ' + name; - this.selector = base + '.' + name; } else { this.id = base; - this.selector = base; } this.base = base; this.rules = rules; diff --git a/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts b/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts index a8b35d09f25..ad2fcdec704 100644 --- a/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts +++ b/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts @@ -134,14 +134,14 @@ export class CurrentLineHighlightOverlay extends DynamicViewOverlay { registerThemingParticipant((theme, collector) => { let lineHighlight = theme.getColor(editorLineHighlight); if (lineHighlight) { - collector.addRule(`.monaco-editor.${theme.selector} .view-overlays .current-line { background-color: ${lineHighlight}; }`); + collector.addRule(`.monaco-editor .view-overlays .current-line { background-color: ${lineHighlight}; }`); } if (!lineHighlight || lineHighlight.isTransparent() || theme.defines(editorLineHighlightBorder)) { let lineHighlightBorder = theme.getColor(editorLineHighlightBorder); if (lineHighlightBorder) { - collector.addRule(`.monaco-editor.${theme.selector} .view-overlays .current-line { border: 2px solid ${lineHighlightBorder}; }`); + collector.addRule(`.monaco-editor .view-overlays .current-line { border: 2px solid ${lineHighlightBorder}; }`); if (theme.type === 'hc') { - collector.addRule(`.monaco-editor.${theme.selector} .view-overlays .current-line { border-width: 1px; }`); + collector.addRule(`.monaco-editor .view-overlays .current-line { border-width: 1px; }`); } } } diff --git a/src/vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight.ts b/src/vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight.ts index 5fdec71c207..4cbdf06a32e 100644 --- a/src/vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight.ts +++ b/src/vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight.ts @@ -110,14 +110,14 @@ export class CurrentLineMarginHighlightOverlay extends DynamicViewOverlay { registerThemingParticipant((theme, collector) => { let lineHighlight = theme.getColor(editorLineHighlight); if (lineHighlight) { - collector.addRule(`.monaco-editor.${theme.selector} .margin-view-overlays .current-line-margin { background-color: ${lineHighlight}; border: none; }`); + collector.addRule(`.monaco-editor .margin-view-overlays .current-line-margin { background-color: ${lineHighlight}; border: none; }`); } else { let lineHighlightBorder = theme.getColor(editorLineHighlightBorder); if (lineHighlightBorder) { - collector.addRule(`.monaco-editor.${theme.selector} .margin-view-overlays .current-line-margin { border: 2px solid ${lineHighlightBorder}; }`); + collector.addRule(`.monaco-editor .margin-view-overlays .current-line-margin { border: 2px solid ${lineHighlightBorder}; }`); } if (theme.type === 'hc') { - collector.addRule(`.monaco-editor.${theme.selector} .margin-view-overlays .current-line-margin { border-width: 1px; }`); + collector.addRule(`.monaco-editor .margin-view-overlays .current-line-margin { border-width: 1px; }`); } } }); diff --git a/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts b/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts index 7c9aa363e38..5b3a301abc0 100644 --- a/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts +++ b/src/vs/editor/browser/viewParts/indentGuides/indentGuides.ts @@ -118,6 +118,6 @@ export class IndentGuidesOverlay extends DynamicViewOverlay { registerThemingParticipant((theme, collector) => { let editorGuideColor = theme.getColor(editorIndentGuides); if (editorGuideColor) { - collector.addRule(`.monaco-editor.${theme.selector} .lines-content .cigr { background-color: ${editorGuideColor}; }`); + collector.addRule(`.monaco-editor .lines-content .cigr { background-color: ${editorGuideColor}; }`); } }); diff --git a/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts b/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts index 38205f5a997..10db29cb726 100644 --- a/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts +++ b/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts @@ -163,6 +163,6 @@ export class LineNumbersOverlay extends DynamicViewOverlay { registerThemingParticipant((theme, collector) => { let lineNumbers = theme.getColor(editorLineNumbers); if (lineNumbers) { - collector.addRule(`.monaco-editor.${theme.selector} .line-numbers { color: ${lineNumbers}; }`); + collector.addRule(`.monaco-editor .line-numbers { color: ${lineNumbers}; }`); } }); \ No newline at end of file diff --git a/src/vs/editor/browser/viewParts/selections/selections.ts b/src/vs/editor/browser/viewParts/selections/selections.ts index c517172658d..a7939523df3 100644 --- a/src/vs/editor/browser/viewParts/selections/selections.ts +++ b/src/vs/editor/browser/viewParts/selections/selections.ts @@ -397,11 +397,11 @@ export class SelectionsOverlay extends DynamicViewOverlay { registerThemingParticipant((theme, collector) => { let editorSelectionColor = theme.getColor(editorSelection); if (editorSelectionColor) { - collector.addRule(`.monaco-editor.${theme.selector} .focused .selected-text { background-color: ${editorSelectionColor}; }`); + collector.addRule(`.monaco-editor .focused .selected-text { background-color: ${editorSelectionColor}; }`); } let editorInactiveSelectionColor = theme.getColor(editorInactiveSelection); if (editorInactiveSelectionColor) { - collector.addRule(`.monaco-editor.${theme.selector} .selected-text { background-color: ${editorInactiveSelectionColor}; }`); + collector.addRule(`.monaco-editor .selected-text { background-color: ${editorInactiveSelectionColor}; }`); } // IE/Edge specific rules let outline = theme.getColor(activeContrastBorder); diff --git a/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts b/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts index 8220415f4f7..aba0ada5df6 100644 --- a/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts +++ b/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts @@ -345,9 +345,9 @@ registerThemingParticipant((theme, collector) => { let caret = theme.getColor(editorCursor); if (caret) { let oppositeCaret = caret.opposite(); - collector.addRule(`.monaco-editor.${theme.selector} .cursor { background-color: ${caret}; border-color: ${caret}; color: ${oppositeCaret}; }`); + collector.addRule(`.monaco-editor .cursor { background-color: ${caret}; border-color: ${caret}; color: ${oppositeCaret}; }`); if (theme.type === 'hc') { - collector.addRule(`.monaco-editor.${theme.selector} .cursors-layer.has-selection .cursor { border-left: 1px solid ${oppositeCaret}; border-right: 1px solid ${oppositeCaret}; }`); + collector.addRule(`.monaco-editor .cursors-layer.has-selection .cursor { border-left: 1px solid ${oppositeCaret}; border-right: 1px solid ${oppositeCaret}; }`); } } diff --git a/src/vs/editor/contrib/accessibility/browser/accessibility.ts b/src/vs/editor/contrib/accessibility/browser/accessibility.ts index dc68a6a4715..1294dc7b306 100644 --- a/src/vs/editor/contrib/accessibility/browser/accessibility.ts +++ b/src/vs/editor/contrib/accessibility/browser/accessibility.ts @@ -234,16 +234,16 @@ CommonEditorRegistry.registerEditorCommand(new AccessibilityHelpCommand({ registerThemingParticipant((theme, collector) => { let widgetBackground = theme.getColor(editorWidgetBackground); if (widgetBackground) { - collector.addRule(`.monaco-editor.${theme.selector} .accessibilityHelpWidget { background-color: ${widgetBackground}; }`); + collector.addRule(`.monaco-editor .accessibilityHelpWidget { background-color: ${widgetBackground}; }`); } let widgetShadowColor = theme.getColor(widgetShadow); if (widgetShadowColor) { - collector.addRule(`.monaco-editor.${theme.selector} .accessibilityHelpWidget { box-shadow: 0 2px 8px ${widgetShadowColor}; }`); + collector.addRule(`.monaco-editor .accessibilityHelpWidget { box-shadow: 0 2px 8px ${widgetShadowColor}; }`); } let hcBorder = theme.getColor(contrastBorder); if (hcBorder) { - collector.addRule(`.monaco-editor.${theme.selector} .accessibilityHelpWidget { border: 2px solid ${hcBorder}; }`); + collector.addRule(`.monaco-editor .accessibilityHelpWidget { border: 2px solid ${hcBorder}; }`); } }); diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts index eb4fcb4e7fe..82183b88ce1 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclaration.ts @@ -633,6 +633,6 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC registerThemingParticipant((theme, collector) => { let activeLinkForeground = theme.getColor(editorActiveLinkForeground); if (activeLinkForeground) { - collector.addRule(`.monaco-editor.${theme.selector} .goto-definition-link { color: ${activeLinkForeground} !important; }`); + collector.addRule(`.monaco-editor .goto-definition-link { color: ${activeLinkForeground} !important; }`); } }); diff --git a/src/vs/editor/contrib/hover/browser/hover.ts b/src/vs/editor/contrib/hover/browser/hover.ts index 4ad6fba3fb3..97456adcbf4 100644 --- a/src/vs/editor/contrib/hover/browser/hover.ts +++ b/src/vs/editor/contrib/hover/browser/hover.ts @@ -176,15 +176,15 @@ class ShowHoverAction extends EditorAction { registerThemingParticipant((theme, collector) => { let editorHoverHighlightColor = theme.getColor(editorHoverHighlight); if (editorHoverHighlightColor) { - collector.addRule(`.monaco-editor.${theme.selector} .hoverHighlight { background-color: ${editorHoverHighlightColor}; }`); + collector.addRule(`.monaco-editor .hoverHighlight { background-color: ${editorHoverHighlightColor}; }`); } let hoverBackground = theme.getColor(editorHoverBackground); if (hoverBackground) { - collector.addRule(`.monaco-editor.${theme.selector} .monaco-editor-hover { background-color: ${hoverBackground}; }`); + collector.addRule(`.monaco-editor .monaco-editor-hover { background-color: ${hoverBackground}; }`); } let hoverBorder = theme.getColor(editorHoverBorder); if (hoverBorder) { - collector.addRule(`.monaco-editor.${theme.selector} .monaco-editor-hover { border: 1px solid ${hoverBorder}; }`); - collector.addRule(`.monaco-editor.${theme.selector} .monaco-editor-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`); + collector.addRule(`.monaco-editor .monaco-editor-hover { border: 1px solid ${hoverBorder}; }`); + collector.addRule(`.monaco-editor .monaco-editor-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`); } }); diff --git a/src/vs/editor/contrib/links/browser/links.ts b/src/vs/editor/contrib/links/browser/links.ts index cb507783d81..3be7d77a575 100644 --- a/src/vs/editor/contrib/links/browser/links.ts +++ b/src/vs/editor/contrib/links/browser/links.ts @@ -348,6 +348,6 @@ class OpenLinkAction extends EditorAction { registerThemingParticipant((theme, collector) => { let activeLinkForeground = theme.getColor(editorActiveLinkForeground); if (activeLinkForeground) { - collector.addRule(`.monaco-editor.${theme.selector} .detected-link-active { color: ${activeLinkForeground} !important; }`); + collector.addRule(`.monaco-editor .detected-link-active { color: ${activeLinkForeground} !important; }`); } }); \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index a84c8f577cb..f157853bbdf 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -951,10 +951,10 @@ export class SuggestWidget implements IContentWidget, IDelegate registerThemingParticipant((theme, collector) => { let matchHighlight = theme.getColor(editorSuggestWidgetHighlightForeground); if (matchHighlight) { - collector.addRule(`.monaco-editor.${theme.selector} .suggest-widget:not(.frozen) .monaco-highlighted-label .highlight { color: ${matchHighlight}; }`); + collector.addRule(`.monaco-editor .suggest-widget:not(.frozen) .monaco-highlighted-label .highlight { color: ${matchHighlight}; }`); } let foreground = theme.getColor(editorSuggestWidgetForeground); if (foreground) { - collector.addRule(`.monaco-editor.${theme.selector} .suggest-widget { color: ${foreground}; }`); + collector.addRule(`.monaco-editor .suggest-widget { color: ${foreground}; }`); } }); diff --git a/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts b/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts index 720a2871a70..927263b989a 100644 --- a/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts +++ b/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts @@ -319,22 +319,22 @@ class WordHighlighterContribution implements editorCommon.IEditorContribution { registerThemingParticipant((theme, collector) => { let selectionHighlight = theme.getColor(editorSelectionHighlight); if (selectionHighlight) { - collector.addRule(`.monaco-editor.${theme.selector} .focused .selectionHighlight { background-color: ${selectionHighlight}; }`); - collector.addRule(`.monaco-editor.${theme.selector} .selectionHighlight { background-color: ${selectionHighlight.transparent(0.5)}; }`); + collector.addRule(`.monaco-editor. .focused .selectionHighlight { background-color: ${selectionHighlight}; }`); + collector.addRule(`.monaco-editor. .selectionHighlight { background-color: ${selectionHighlight.transparent(0.5)}; }`); } let wordHighlight = theme.getColor(editorWordHighlight); if (wordHighlight) { - collector.addRule(`.monaco-editor.${theme.selector} .wordHighlight { background-color: ${wordHighlight}; }`); + collector.addRule(`.monaco-editor. .wordHighlight { background-color: ${wordHighlight}; }`); } let wordHighlightStrong = theme.getColor(editorWordHighlightStrong); if (wordHighlightStrong) { - collector.addRule(`.monaco-editor.${theme.selector} .wordHighlightStrong { background-color: ${wordHighlightStrong}; }`); + collector.addRule(`.monaco-editor. .wordHighlightStrong { background-color: ${wordHighlightStrong}; }`); } let hcOutline = theme.getColor(activeContrastBorder); if (hcOutline) { - collector.addRule(`.monaco-editor.${theme.selector} .selectionHighlight { border: 1px dotted ${hcOutline}; box-sizing: border-box; }`); - collector.addRule(`.monaco-editor.${theme.selector} .wordHighlight { border: 1px dashed ${hcOutline}; box-sizing: border-box; }`); - collector.addRule(`.monaco-editor.${theme.selector} .wordHighlightStrong { border: 1px dashed ${hcOutline}; box-sizing: border-box; }`); + collector.addRule(`.monaco-editor. .selectionHighlight { border: 1px dotted ${hcOutline}; box-sizing: border-box; }`); + collector.addRule(`.monaco-editor. .wordHighlight { border: 1px dashed ${hcOutline}; box-sizing: border-box; }`); + collector.addRule(`.monaco-editor. .wordHighlightStrong { border: 1px dashed ${hcOutline}; box-sizing: border-box; }`); } }); \ No newline at end of file diff --git a/src/vs/platform/theme/common/themeService.ts b/src/vs/platform/theme/common/themeService.ts index d6d7c4a0639..37f6eb59b7c 100644 --- a/src/vs/platform/theme/common/themeService.ts +++ b/src/vs/platform/theme/common/themeService.ts @@ -20,7 +20,6 @@ export const HIGH_CONTRAST = 'hc'; export type ThemeType = 'light' | 'dark' | 'hc'; export interface ITheme { - readonly selector: string; readonly type: ThemeType; /** diff --git a/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts b/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts index be888161681..aa101644f89 100644 --- a/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts +++ b/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts @@ -33,7 +33,6 @@ export class ColorThemeData implements IColorTheme { label: string; settingsId: string; description?: string; - selector: string; tokenColors?: ITokenColorizationRule[]; isLoaded: boolean; path?: string; @@ -111,7 +110,7 @@ export class ColorThemeData implements IColorTheme { id: this.id, label: this.label, settingsId: this.settingsId, - selector: this.selector, + selector: this.id.split(' ').join('.'), // to not break old clients tokenColors: this.tokenColors, extensionData: this.extensionData, colorMap: colorMapData @@ -160,7 +159,6 @@ export function fromExtensionTheme(theme: IThemeExtensionPoint, normalizedAbsolu themeData.id = `${baseTheme} ${themeSelector}`; themeData.label = theme.label || Paths.basename(theme.path); themeData.settingsId = theme.id || themeData.label; - themeData.selector = `${baseTheme}.${themeSelector}`; themeData.description = theme.description; themeData.path = normalizedAbsolutePath; themeData.extensionData = extensionData; diff --git a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts index a72c48e41d8..799975ed9d4 100644 --- a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts @@ -246,7 +246,6 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { let initialTheme = new ColorThemeData(); initialTheme.id = isLightTheme ? VS_LIGHT_THEME : VS_DARK_THEME; initialTheme.label = ''; - initialTheme.selector = isLightTheme ? VS_LIGHT_THEME : VS_DARK_THEME; initialTheme.settingsId = null; initialTheme.isLoaded = false; initialTheme.tokenColors = [{ settings: {} }]; diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 37cc7b6cb35..bc6068ce24e 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -50,7 +50,7 @@ import { IWindowsService, IWindowService } from 'vs/platform/windows/common/wind import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { RawTextSource, IRawTextSource } from 'vs/editor/common/model/textSource'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { IThemeService, ITheme, IThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { IThemeService, ITheme, IThemingParticipant, ThemeType } from 'vs/platform/theme/common/themeService'; import { IDisposable } from 'vs/base/common/lifecycle'; import { Color } from 'vs/base/common/color'; import { isLinux } from 'vs/base/common/platform'; @@ -999,8 +999,7 @@ export class TestWindowsService implements IWindowsService { } export class TestTheme implements ITheme { - selector: string; - type: 'light' | 'dark' | 'hc'; + type: ThemeType; getColor(color: string, useDefault?: boolean): Color { throw new Error('Method not implemented.'); From 996623e0ae100eaa471cd7e46f728ca870d94668 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 12 May 2017 16:30:07 +0200 Subject: [PATCH 0395/1164] debug: use false as the default value for allThreadsContinued fixes #18195 --- .../workbench/parts/debug/electron-browser/rawDebugSession.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts b/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts index f0d9a852f02..0df197051a3 100644 --- a/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts +++ b/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts @@ -79,7 +79,7 @@ export class RawDebugSession extends v8.V8Protocol implements debug.ISession { super(id); this.emittedStopped = false; this.readyForBreakpoints = false; - this.allThreadsContinued = false; + this.allThreadsContinued = true; this.sentPromises = []; this._onDidInitialize = new Emitter(); From a5f82bdcc6f2414a1158a9240ed7c9ba79e33da8 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 12 May 2017 16:31:16 +0200 Subject: [PATCH 0396/1164] Fix #16580 --- .../actions/toggleActivityBarVisibility.ts | 6 +--- .../browser/actions/toggleSidebarPosition.ts | 6 +--- .../actions/toggleStatusbarVisibility.ts | 6 +--- .../browser/parts/editor/editorStatus.ts | 4 +-- src/vs/workbench/electron-browser/actions.ts | 4 +-- src/vs/workbench/electron-browser/window.ts | 2 +- .../toggleRenderControlCharacter.ts | 6 +--- .../toggleRenderWhitespace.ts | 6 +--- .../electron-browser/extensionTipsService.ts | 4 +-- .../browser/preferencesRenderers.ts | 2 +- .../page/electron-browser/welcomePage.ts | 3 +- .../node/configurationEditingService.ts | 29 ++++++++++++++----- 12 files changed, 33 insertions(+), 45 deletions(-) diff --git a/src/vs/workbench/browser/actions/toggleActivityBarVisibility.ts b/src/vs/workbench/browser/actions/toggleActivityBarVisibility.ts index 3718e0927b9..0c191dd5a55 100644 --- a/src/vs/workbench/browser/actions/toggleActivityBarVisibility.ts +++ b/src/vs/workbench/browser/actions/toggleActivityBarVisibility.ts @@ -10,7 +10,6 @@ import { Registry } from 'vs/platform/platform'; import { Action } from 'vs/base/common/actions'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actionRegistry'; -import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; @@ -25,7 +24,6 @@ export class ToggleActivityBarVisibilityAction extends Action { id: string, label: string, @IPartService private partService: IPartService, - @IMessageService private messageService: IMessageService, @IConfigurationEditingService private configurationEditingService: IConfigurationEditingService ) { super(id, label); @@ -37,9 +35,7 @@ export class ToggleActivityBarVisibilityAction extends Action { const visibility = this.partService.isVisible(Parts.ACTIVITYBAR_PART); const newVisibilityValue = !visibility; - this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: ToggleActivityBarVisibilityAction.activityBarVisibleKey, value: newVisibilityValue }).then(null, error => { - this.messageService.show(Severity.Error, error); - }); + this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: ToggleActivityBarVisibilityAction.activityBarVisibleKey, value: newVisibilityValue }); return TPromise.as(null); } diff --git a/src/vs/workbench/browser/actions/toggleSidebarPosition.ts b/src/vs/workbench/browser/actions/toggleSidebarPosition.ts index 1fc53c621d6..57364bd9188 100644 --- a/src/vs/workbench/browser/actions/toggleSidebarPosition.ts +++ b/src/vs/workbench/browser/actions/toggleSidebarPosition.ts @@ -9,7 +9,6 @@ import nls = require('vs/nls'); import { Registry } from 'vs/platform/platform'; import { Action } from 'vs/base/common/actions'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; -import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actionRegistry'; import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; import { IPartService, Position } from 'vs/workbench/services/part/common/partService'; @@ -25,7 +24,6 @@ export class ToggleSidebarPositionAction extends Action { id: string, label: string, @IPartService private partService: IPartService, - @IMessageService private messageService: IMessageService, @IConfigurationEditingService private configurationEditingService: IConfigurationEditingService ) { super(id, label); @@ -37,9 +35,7 @@ export class ToggleSidebarPositionAction extends Action { const position = this.partService.getSideBarPosition(); const newPositionValue = (position === Position.LEFT) ? 'right' : 'left'; - this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: ToggleSidebarPositionAction.sidebarPositionConfigurationKey, value: newPositionValue }).then(null, error => { - this.messageService.show(Severity.Error, error); - }); + this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: ToggleSidebarPositionAction.sidebarPositionConfigurationKey, value: newPositionValue }); return TPromise.as(null); } diff --git a/src/vs/workbench/browser/actions/toggleStatusbarVisibility.ts b/src/vs/workbench/browser/actions/toggleStatusbarVisibility.ts index d06dafc4db0..ae231cc643c 100644 --- a/src/vs/workbench/browser/actions/toggleStatusbarVisibility.ts +++ b/src/vs/workbench/browser/actions/toggleStatusbarVisibility.ts @@ -10,7 +10,6 @@ import { Registry } from 'vs/platform/platform'; import { Action } from 'vs/base/common/actions'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actionRegistry'; -import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; @@ -25,7 +24,6 @@ export class ToggleStatusbarVisibilityAction extends Action { id: string, label: string, @IPartService private partService: IPartService, - @IMessageService private messageService: IMessageService, @IConfigurationEditingService private configurationEditingService: IConfigurationEditingService ) { super(id, label); @@ -37,9 +35,7 @@ export class ToggleStatusbarVisibilityAction extends Action { const visibility = this.partService.isVisible(Parts.STATUSBAR_PART); const newVisibilityValue = !visibility; - this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: ToggleStatusbarVisibilityAction.statusbarVisibleKey, value: newVisibilityValue }).then(null, error => { - this.messageService.show(Severity.Error, error); - }); + this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: ToggleStatusbarVisibilityAction.statusbarVisibleKey, value: newVisibilityValue }); return TPromise.as(null); } diff --git a/src/vs/workbench/browser/parts/editor/editorStatus.ts b/src/vs/workbench/browser/parts/editor/editorStatus.ts index b7fcf752dba..94c97b90690 100644 --- a/src/vs/workbench/browser/parts/editor/editorStatus.ts +++ b/src/vs/workbench/browser/parts/editor/editorStatus.ts @@ -21,7 +21,6 @@ import { IMode } from 'vs/editor/common/modes'; import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorInput'; import { IFileEditorInput, EncodingMode, IEncodingSupport, toResource, SideBySideEditorInput } from 'vs/workbench/common/editor'; import { IDisposable, combinedDisposable, dispose } from 'vs/base/common/lifecycle'; -import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; import { IEditorAction, ICommonCodeEditor, EndOfLineSequence, IModel } from 'vs/editor/common/editorCommon'; @@ -706,7 +705,6 @@ export class ChangeModeAction extends Action { @IModelService private modelService: IModelService, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IConfigurationEditingService private configurationEditingService: IConfigurationEditingService, - @IMessageService private messageService: IMessageService, @IWorkspaceConfigurationService private configurationService: IWorkspaceConfigurationService, @IQuickOpenService private quickOpenService: IQuickOpenService, @IPreferencesService private preferencesService: IPreferencesService, @@ -886,7 +884,7 @@ export class ChangeModeAction extends Action { currentAssociations[associationKey] = language.id; // Write config - this.configurationEditingService.writeConfiguration(target, { key: ChangeModeAction.FILE_ASSOCIATION_KEY, value: currentAssociations }).done(null, (error) => this.messageService.show(Severity.Error, error.toString())); + this.configurationEditingService.writeConfiguration(target, { key: ChangeModeAction.FILE_ASSOCIATION_KEY, value: currentAssociations }); } }); }); diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index 68a3993f30c..c21c6700f29 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -197,9 +197,7 @@ export class ToggleMenuBarAction extends Action { newVisibilityValue = 'default'; } - this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: ToggleMenuBarAction.menuBarVisibilityKey, value: newVisibilityValue }).then(null, error => { - this.messageService.show(Severity.Error, error); - }); + this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: ToggleMenuBarAction.menuBarVisibilityKey, value: newVisibilityValue }); return TPromise.as(null); } diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index e9e4c2ce9df..c0230d6cc12 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -464,7 +464,7 @@ export class ElectronWindow extends Themable { newAutoSaveValue = AutoSaveConfiguration.AFTER_DELAY; } - this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: ElectronWindow.AUTO_SAVE_SETTING, value: newAutoSaveValue }).done(null, error => this.messageService.show(Severity.Error, error)); + this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: ElectronWindow.AUTO_SAVE_SETTING, value: newAutoSaveValue }); } private includesFolder(resources: URI[]): TPromise { diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.ts b/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.ts index 6e8205b0cdd..584821e2d3a 100644 --- a/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.ts +++ b/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.ts @@ -8,7 +8,6 @@ import * as nls from 'vs/nls'; import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { editorAction, ServicesAccessor, EditorAction } from 'vs/editor/common/editorCommonExtensions'; import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; -import { IMessageService, Severity } from 'vs/platform/message/common/message'; @editorAction export class ToggleRenderControlCharacterAction extends EditorAction { @@ -24,12 +23,9 @@ export class ToggleRenderControlCharacterAction extends EditorAction { public run(accessor: ServicesAccessor, editor: ICommonCodeEditor): void { const configurationEditingService = accessor.get(IConfigurationEditingService); - const messageService = accessor.get(IMessageService); let newRenderControlCharacters = !editor.getConfiguration().viewInfo.renderControlCharacters; - configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: 'editor.renderControlCharacters', value: newRenderControlCharacters }).then(null, error => { - messageService.show(Severity.Error, error); - }); + configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: 'editor.renderControlCharacters', value: newRenderControlCharacters }); } } diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.ts b/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.ts index 7697db1cbcf..f8e373a96f0 100644 --- a/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.ts +++ b/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.ts @@ -8,7 +8,6 @@ import * as nls from 'vs/nls'; import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { editorAction, ServicesAccessor, EditorAction } from 'vs/editor/common/editorCommonExtensions'; import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; -import { IMessageService, Severity } from 'vs/platform/message/common/message'; @editorAction export class ToggleRenderWhitespaceAction extends EditorAction { @@ -24,7 +23,6 @@ export class ToggleRenderWhitespaceAction extends EditorAction { public run(accessor: ServicesAccessor, editor: ICommonCodeEditor): void { const configurationEditingService = accessor.get(IConfigurationEditingService); - const messageService = accessor.get(IMessageService); let renderWhitespace = editor.getConfiguration().viewInfo.renderWhitespace; let newRenderWhitespace: string; @@ -34,8 +32,6 @@ export class ToggleRenderWhitespaceAction extends EditorAction { newRenderWhitespace = 'none'; } - configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: 'editor.renderWhitespace', value: newRenderWhitespace }).then(null, error => { - messageService.show(Severity.Error, error); - }); + configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: 'editor.renderWhitespace', value: newRenderWhitespace }); } } diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts index 59ee7282c26..c5f9866b41e 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts @@ -279,9 +279,7 @@ export class ExtensionTipsService implements IExtensionTipsService { private setIgnoreRecommendationsConfig(configVal: boolean) { let target = ConfigurationTarget.USER; const configKey = 'extensions.ignoreRecommendations'; - this.configurationEditingService.writeConfiguration(target, { key: configKey, value: configVal }).then(null, error => { - this.messageService.show(Severity.Error, error); - }); + this.configurationEditingService.writeConfiguration(target, { key: configKey, value: configVal }); if (configVal) { const ignoreWorkspaceRecommendationsStorageKey = 'extensionsAssistant/workspaceRecommendationsIgnore'; this.storageService.store(ignoreWorkspaceRecommendationsStorageKey, true, StorageScope.WORKSPACE); diff --git a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts index e16b24e47d0..16f4f0ed57c 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts @@ -101,7 +101,7 @@ export class UserSettingsRenderer extends Disposable implements IPreferencesRend this.telemetryService.publicLog('defaultSettingsActions.copySetting', { userConfigurationKeys: [key] }); const overrideIdentifier = source.overrideOf ? overrideIdentifierFromKey(source.overrideOf.key) : null; this.configurationEditingService.writeConfiguration(this.preferencesModel.configurationTarget, { key, value, overrideIdentifier }, !this.textFileService.isDirty(this.preferencesModel.uri)) - .then(() => this.onSettingUpdated(source), error => this.messageService.show(Severity.Error, error)); + .then(() => this.onSettingUpdated(source)); } private onModelChanged(): void { diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts index 7231ee075f8..d60458ba1d9 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts +++ b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts @@ -168,8 +168,7 @@ class WelcomePage { showOnStartup.setAttribute('checked', 'checked'); } showOnStartup.addEventListener('click', e => { - this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: enabledKey, value: showOnStartup.checked }) - .then(null, error => this.messageService.show(Severity.Error, error)); + this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: enabledKey, value: showOnStartup.checked }); }); recentlyOpened.then(({ folders }) => { diff --git a/src/vs/workbench/services/configuration/node/configurationEditingService.ts b/src/vs/workbench/services/configuration/node/configurationEditingService.ts index 758951c5535..022f5fb0226 100644 --- a/src/vs/workbench/services/configuration/node/configurationEditingService.ts +++ b/src/vs/workbench/services/configuration/node/configurationEditingService.ts @@ -29,6 +29,8 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IConfigurationEditingService, ConfigurationEditingErrorCode, IConfigurationEditingError, ConfigurationTarget, IConfigurationValue } from 'vs/workbench/services/configuration/common/configurationEditing'; import { ITextModelResolverService, ITextEditorModel } from 'vs/editor/common/services/resolverService'; import { OVERRIDE_PROPERTY_PATTERN } from 'vs/platform/configuration/common/configurationRegistry'; +import { IChoiceService, Severity } from 'vs/platform/message/common/message'; +import { ICommandService } from 'vs/platform/commands/common/commands'; interface IConfigurationEditOperation extends IConfigurationValue { resource: URI; @@ -52,13 +54,15 @@ export class ConfigurationEditingService implements IConfigurationEditingService @IEnvironmentService private environmentService: IEnvironmentService, @IFileService private fileService: IFileService, @ITextModelResolverService private textModelResolverService: ITextModelResolverService, - @ITextFileService private textFileService: ITextFileService + @ITextFileService private textFileService: ITextFileService, + @IChoiceService private choiceService: IChoiceService, + @ICommandService private commandService: ICommandService ) { this.queue = new Queue(); } writeConfiguration(target: ConfigurationTarget, value: IConfigurationValue, save: boolean = true): TPromise { - return this.queue.queue(() => this.doWriteConfiguration(target, value, save)); // queue up writes to prevent race conditions + return this.queue.queue(() => this.doWriteConfiguration(target, value, save).then(() => null, error => this.onError(error, target))); // queue up writes to prevent race conditions } private doWriteConfiguration(target: ConfigurationTarget, value: IConfigurationValue, save: boolean): TPromise { @@ -92,6 +96,17 @@ export class ConfigurationEditingService implements IConfigurationEditingService return false; } + private onError(error: IConfigurationEditingError, target: ConfigurationTarget): TPromise { + this.choiceService.choose(Severity.Error, error.message, [nls.localize('open', "Open Settings"), nls.localize('close', "Close")], 1) + .then(value => { + switch (value) { + case 0: + this.commandService.executeCommand(ConfigurationTarget.USER === target ? 'workbench.action.openGlobalSettings' : 'workbench.action.openWorkspaceSettings'); + } + }); + return TPromise.wrapError(error); + } + private wrapError(code: ConfigurationEditingErrorCode, target: ConfigurationTarget): TPromise { const message = this.toErrorMessage(code, target); @@ -110,20 +125,20 @@ export class ConfigurationEditingService implements IConfigurationEditingService case ConfigurationEditingErrorCode.ERROR_INVALID_TARGET: return nls.localize('errorInvalidTarget', "Unable to write to the configuration file (Invalid Target)"); // User issues - case ConfigurationEditingErrorCode.ERROR_NO_WORKSPACE_OPENED: return nls.localize('errorNoWorkspaceOpened', "Unable to write settings because no folder is opened. Please open a folder first and try again."); + case ConfigurationEditingErrorCode.ERROR_NO_WORKSPACE_OPENED: return nls.localize('errorNoWorkspaceOpened', "Unable to write into settings because no folder is opened. Please open a folder first and try again."); case ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION: { if (target === ConfigurationTarget.USER) { - return nls.localize('errorInvalidConfiguration', "Unable to write settings. Please open **User Settings** to correct errors/warnings in the file and try again."); + return nls.localize('errorInvalidConfiguration', "Unable to write into settings. Please open **User Settings** to correct errors/warnings in the file and try again."); } - return nls.localize('errorInvalidConfigurationWorkspace', "Unable to write settings. Please open **Workspace Settings** to correct errors/warnings in the file and try again."); + return nls.localize('errorInvalidConfigurationWorkspace', "Unable to write into settings. Please open **Workspace Settings** to correct errors/warnings in the file and try again."); }; case ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY: { if (target === ConfigurationTarget.USER) { - return nls.localize('errorConfigurationFileDirty', "Unable to write settings because the file is dirty. Please save the **User Settings** file and try again."); + return nls.localize('errorConfigurationFileDirty', "Unable to write into settings because the file is dirty. Please save the **User Settings** file and try again."); } - return nls.localize('errorConfigurationFileDirtyWorkspace', "Unable to write settings because the file is dirty. Please save the **Workspace Settings** file and try again."); + return nls.localize('errorConfigurationFileDirtyWorkspace', "Unable to write into settings because the file is dirty. Please save the **Workspace Settings** file and try again."); }; } } From 6519bee914f379f50bb3ba767377cdf4a28c2844 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 12 May 2017 16:31:48 +0200 Subject: [PATCH 0397/1164] [theme] css fix, dots left over --- .../wordHighlighter/common/wordHighlighter.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts b/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts index 927263b989a..e0eca99d8f3 100644 --- a/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts +++ b/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts @@ -319,22 +319,22 @@ class WordHighlighterContribution implements editorCommon.IEditorContribution { registerThemingParticipant((theme, collector) => { let selectionHighlight = theme.getColor(editorSelectionHighlight); if (selectionHighlight) { - collector.addRule(`.monaco-editor. .focused .selectionHighlight { background-color: ${selectionHighlight}; }`); - collector.addRule(`.monaco-editor. .selectionHighlight { background-color: ${selectionHighlight.transparent(0.5)}; }`); + collector.addRule(`.monaco-editor .focused .selectionHighlight { background-color: ${selectionHighlight}; }`); + collector.addRule(`.monaco-editor .selectionHighlight { background-color: ${selectionHighlight.transparent(0.5)}; }`); } let wordHighlight = theme.getColor(editorWordHighlight); if (wordHighlight) { - collector.addRule(`.monaco-editor. .wordHighlight { background-color: ${wordHighlight}; }`); + collector.addRule(`.monaco-editor .wordHighlight { background-color: ${wordHighlight}; }`); } let wordHighlightStrong = theme.getColor(editorWordHighlightStrong); if (wordHighlightStrong) { - collector.addRule(`.monaco-editor. .wordHighlightStrong { background-color: ${wordHighlightStrong}; }`); + collector.addRule(`.monaco-editor .wordHighlightStrong { background-color: ${wordHighlightStrong}; }`); } let hcOutline = theme.getColor(activeContrastBorder); if (hcOutline) { - collector.addRule(`.monaco-editor. .selectionHighlight { border: 1px dotted ${hcOutline}; box-sizing: border-box; }`); - collector.addRule(`.monaco-editor. .wordHighlight { border: 1px dashed ${hcOutline}; box-sizing: border-box; }`); - collector.addRule(`.monaco-editor. .wordHighlightStrong { border: 1px dashed ${hcOutline}; box-sizing: border-box; }`); + collector.addRule(`.monaco-editor .selectionHighlight { border: 1px dotted ${hcOutline}; box-sizing: border-box; }`); + collector.addRule(`.monaco-editor .wordHighlight { border: 1px dashed ${hcOutline}; box-sizing: border-box; }`); + collector.addRule(`.monaco-editor .wordHighlightStrong { border: 1px dashed ${hcOutline}; box-sizing: border-box; }`); } }); \ No newline at end of file From ab483f64895520b02e925561bcfe478e86729b0d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 12 May 2017 15:31:19 +0200 Subject: [PATCH 0398/1164] clean publish scripts --- build/tfs/common/enqueue.ts | 4 +-- build/tfs/common/publish.ts | 47 +++++++++++-------------- build/tfs/common/util.ts | 69 ------------------------------------- 3 files changed, 23 insertions(+), 97 deletions(-) delete mode 100644 build/tfs/common/util.ts diff --git a/build/tfs/common/enqueue.ts b/build/tfs/common/enqueue.ts index 613805647b1..e055ed4a938 100644 --- a/build/tfs/common/enqueue.ts +++ b/build/tfs/common/enqueue.ts @@ -5,10 +5,10 @@ 'use strict'; +import { execSync } from 'child_process'; import { DocumentClient } from 'documentdb'; import * as azure from 'azure-storage'; import * as path from 'path'; -import { getVersion } from './util'; interface Asset { platform: string; @@ -69,7 +69,7 @@ async function waitForSignedBuild(quality: string, commit: string): Promise { - const commit = getVersion(path.dirname(path.dirname(path.dirname(__dirname)))); + const commit = execSync('git rev-parse HEAD', { encoding: 'utf8' }).trim(); console.log(`Queueing signing request for '${quality}/${commit}'...`); await queueSigningRequest(quality, commit); diff --git a/build/tfs/common/publish.ts b/build/tfs/common/publish.ts index 03d0a3276d7..025689cea7d 100644 --- a/build/tfs/common/publish.ts +++ b/build/tfs/common/publish.ts @@ -6,22 +6,17 @@ 'use strict'; import * as fs from 'fs'; -import * as path from 'path'; +import { execSync } from 'child_process'; import * as crypto from 'crypto'; import * as azure from 'azure-storage'; import * as mime from 'mime'; import { DocumentClient, NewDocument } from 'documentdb'; -import { getVersion } from './util'; if (process.argv.length < 6) { console.error('Usage: node publish.js '); process.exit(-1); } -function log(...args: any[]) { - console.log(new Date().toISOString(), ...args); -} - function sha1hash(file: string): Promise { return new Promise((c, e) => { const shasum = crypto.createHash('sha1'); @@ -106,7 +101,7 @@ function createOrUpdate(commit: string, quality: string, platform: string, type: if (err && err.code === 409 && updateTries < 5) { return c(update()); } if (err) { return e(err); } - log('Build successfully updated.'); + console.log('Build successfully updated.'); c(); }); }); @@ -118,7 +113,7 @@ function createOrUpdate(commit: string, quality: string, platform: string, type: if (err && err.code === 409) { return c(update()); } if (err) { return e(err); } - log('Build successfully published.'); + console.log('Build successfully published.'); c(); }); }); @@ -142,29 +137,28 @@ async function uploadBlob(blobService: azure.BlobService, quality: string, blobN await new Promise((c, e) => blobService.createBlockBlobFromLocalFile(quality, blobName, file, blobOptions, err => err ? e(err) : c())); } -async function publish(quality: string, platform: string, type: string, name: string, version: string, _isUpdate: string, file: string): Promise { +async function publish(commit: string, quality: string, platform: string, type: string, name: string, version: string, _isUpdate: string, file: string): Promise { const isUpdate = _isUpdate === 'true'; const queuedBy = process.env['BUILD_QUEUEDBY']; const sourceBranch = process.env['BUILD_SOURCEBRANCH']; - const commit = getVersion(path.dirname(path.dirname(path.dirname(__dirname)))); const isReleased = quality === 'insider' && /^master$|^refs\/heads\/master$/.test(sourceBranch) && /Project Collection Service Accounts|Microsoft.VisualStudio.Services.TFS/.test(queuedBy); - log('Publishing...'); - log('Quality:', quality); - log('Platforn:', platform); - log('Type:', type); - log('Name:', name); - log('Version:', version); - log('Commit:', commit); - log('Is Update:', isUpdate); - log('Is Released:', isReleased); - log('File:', file); + console.log('Publishing...'); + console.log('Quality:', quality); + console.log('Platforn:', platform); + console.log('Type:', type); + console.log('Name:', name); + console.log('Version:', version); + console.log('Commit:', commit); + console.log('Is Update:', isUpdate); + console.log('Is Released:', isReleased); + console.log('File:', file); const hash = await sha1hash(file); - log('Hash:', hash); + console.log('Hash:', hash); const blobName = commit + '/' + name; const storageAccount = process.env['AZURE_STORAGE_ACCOUNT_2']; @@ -186,22 +180,22 @@ async function publish(quality: string, platform: string, type: string, name: st ]); if (blobExists || moooncakeBlobExists) { - log(`Blob ${quality}, ${blobName} already exists, not publishing again.`); + console.log(`Blob ${quality}, ${blobName} already exists, not publishing again.`); return; } - log('Uploading blobs to Azure storage...'); + console.log('Uploading blobs to Azure storage...'); await Promise.all([ uploadBlob(blobService, quality, blobName, file), uploadBlob(mooncakeBlobService, quality, blobName, file) ]); - log('Blobs successfully uploaded.'); + console.log('Blobs successfully uploaded.'); const config = await getConfig(quality); - log('Quality config:', config); + console.log('Quality config:', config); const asset: Asset = { platform: platform, @@ -231,8 +225,9 @@ async function publish(quality: string, platform: string, type: string, name: st function main(): void { const [, , quality, platform, type, name, version, _isUpdate, file] = process.argv; + const commit = execSync('git rev-parse HEAD', { encoding: 'utf8' }).trim(); - publish(quality, platform, type, name, version, _isUpdate, file).catch(err => { + publish(commit, quality, platform, type, name, version, _isUpdate, file).catch(err => { console.error(err); process.exit(1); }); diff --git a/build/tfs/common/util.ts b/build/tfs/common/util.ts deleted file mode 100644 index b0b3cb6c4fd..00000000000 --- a/build/tfs/common/util.ts +++ /dev/null @@ -1,69 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import * as path from 'path'; -import * as fs from 'fs'; - -function getGitVersion(repo: string): string { - const git = path.join(repo, '.git'); - const headPath = path.join(git, 'HEAD'); - let head: string; - - try { - head = fs.readFileSync(headPath, 'utf8').trim(); - } catch (e) { - return void 0; - } - - if (/^[0-9a-f]{40}$/i.test(head)) { - return head; - } - - const refMatch = /^ref: (.*)$/.exec(head); - - if (!refMatch) { - return void 0; - } - - const ref = refMatch[1]; - const refPath = path.join(git, ref); - - try { - return fs.readFileSync(refPath, 'utf8').trim(); - } catch (e) { - // noop - } - - const packedRefsPath = path.join(git, 'packed-refs'); - let refsRaw: string; - - try { - refsRaw = fs.readFileSync(packedRefsPath, 'utf8').trim(); - } catch (e) { - return void 0; - } - - const refsRegex = /^([0-9a-f]{40})\s+(.+)$/gm; - let refsMatch: RegExpExecArray; - let refs: { [ref: string]: string } = {}; - - while (refsMatch = refsRegex.exec(refsRaw)) { - refs[refsMatch[2]] = refsMatch[1]; - } - - return refs[ref]; -} - -export function getVersion(root: string): string { - let version = process.env['BUILD_SOURCEVERSION']; - - if (!version || !/^[0-9a-f]{40}$/i.test(version)) { - version = getGitVersion(root); - } - - return version; -} \ No newline at end of file From d92829f2a53d5aa582e65b4541410aebd53f716a Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 12 May 2017 16:38:39 +0200 Subject: [PATCH 0399/1164] tfs: linux build first steps --- build/gulpfile.hygiene.js | 3 +- build/tfs/linux/build-x64.sh | 4 + build/tfs/linux/build.sh | 117 +++++++++++++ build/tfs/linux/repoapi_client.sh | 262 ++++++++++++++++++++++++++++++ 4 files changed, 385 insertions(+), 1 deletion(-) create mode 100644 build/tfs/linux/build-x64.sh create mode 100644 build/tfs/linux/build.sh create mode 100755 build/tfs/linux/repoapi_client.sh diff --git a/build/gulpfile.hygiene.js b/build/gulpfile.hygiene.js index ee2d5864302..594774e2c16 100644 --- a/build/gulpfile.hygiene.js +++ b/build/gulpfile.hygiene.js @@ -40,7 +40,8 @@ const eolFilter = [ '!**/*.{svg,exe,png,bmp,scpt,bat,cmd,cur,ttf,woff,eot}', '!build/{lib,tslintRules}/**/*.js', '!build/monaco/**', - '!build/win32/**' + '!build/win32/**', + '!build/**/*.sh' ]; const indentationFilter = [ diff --git a/build/tfs/linux/build-x64.sh b/build/tfs/linux/build-x64.sh new file mode 100644 index 00000000000..43eb1ad7be4 --- /dev/null +++ b/build/tfs/linux/build-x64.sh @@ -0,0 +1,4 @@ +#!/bin/bash +set -e +DIRNAME=$(dirname $(readlink -f $0)) +$DIRNAME/build.sh x64 "$@" \ No newline at end of file diff --git a/build/tfs/linux/build.sh b/build/tfs/linux/build.sh new file mode 100644 index 00000000000..ed2ac6d3758 --- /dev/null +++ b/build/tfs/linux/build.sh @@ -0,0 +1,117 @@ +#!/bin/sh +set -e + +export ARCH="$ARCH" +export VSCODE_MIXIN_PASSWORD="$2" +export AZURE_STORAGE_ACCESS_KEY="$3" +export AZURE_STORAGE_ACCESS_KEY_2="$4" +export MOONCAKE_STORAGE_ACCESS_KEY="$5" +export AZURE_DOCUMENTDB_MASTERKEY="$6" +export LINUX_REPO_PASSWORD="$7" + +# set agent specific npm cache +if [ -n "$AGENT_WORKFOLDER" ] +then + export npm_config_cache="$AGENT_WORKFOLDER/npm-cache" + echo "Using npm cache: $npm_config_cache" +fi + +# log build step +STEP() { + echo "" + echo "********************************************************************************" + echo "*** $*" + echo "********************************************************************************" + echo "" +} + +STEP "Install dependencies" +./scripts/npm.sh install --arch=x64 --unsafe-perm + +STEP "Mix in repository from vscode-distro" +npm run gulp -- mixin + +STEP "Build minified" +npm run gulp -- --max_old_space_size=4096 vscode-linux-x64-min + +STEP "Build Debian package" +npm run gulp -- --max_old_space_size=4096 vscode-linux-x64-build-deb + +STEP "Build RPM package" +npm run gulp -- --max_old_space_size=4096 vscode-linux-x64-build-rpm + +STEP "Run unit tests" +./scripts/test.sh --xvfb --build --reporter dot + +STEP "Install build dependencies" +(cd $BUILD_SOURCESDIRECTORY/build/tfs/common && npm install --unsafe-perm) + +# Variables +PLATFORM_LINUX="linux-$ARCH" +PLATFORM_DEB="linux-deb-$ARCH" +PLATFORM_RPM="linux-rpm-$ARCH" +[[ "$ARCH" == "ia32" ]] && DEB_ARCH="i386" || DEB_ARCH="amd64" +[[ "$ARCH" == "ia32" ]] && RPM_ARCH="i386" || RPM_ARCH="x86_64" +REPO="`pwd`" +ROOT="$REPO/.." +BUILDNAME="VSCode-$PLATFORM_LINUX" +BUILD="$ROOT/$BUILDNAME" +BUILD_VERSION="$(ls $REPO/.build/linux/deb/$DEB_ARCH/deb/ | sed -e 's/code-[a-z]*_//g' -e 's/\.deb$//g')" +[ -z "$VSCODE_QUALITY" ] && TARBALL_FILENAME="code-$BUILD_VERSION.tar.gz" || TARBALL_FILENAME="code-$VSCODE_QUALITY-$BUILD_VERSION.tar.gz" +TARBALL_PATH="$ROOT/$TARBALL_FILENAME" +PACKAGEJSON="$BUILD/resources/app/package.json" +VERSION=$(node -p "require(\"$PACKAGEJSON\").version") + +STEP "Create tar.gz archive" +rm -rf $ROOT/code-*.tar.* +pushd $ROOT +tar -czvf $TARBALL_PATH $BUILDNAME +popd + +STEP "Publish tar.gz archive" +node build/tfs/out/publish.js $VSCODE_QUALITY $PLATFORM_LINUX archive-unsigned $TARBALL_FILENAME $VERSION true $TARBALL_PATH + +STEP "Publish Debian package" +DEB_FILENAME="$(ls $REPO/.build/linux/deb/$DEB_ARCH/deb/)" +DEB_PATH="$REPO/.build/linux/deb/$DEB_ARCH/deb/$DEB_FILENAME" +node build/tfs/out/publish.js $VSCODE_QUALITY $PLATFORM_DEB package $DEB_FILENAME $VERSION true $DEB_PATH + +STEP "Publish RPM package" +RPM_FILENAME="$(ls $REPO/.build/linux/rpm/$RPM_ARCH/ | grep .rpm)" +RPM_PATH="$REPO/.build/linux/rpm/$RPM_ARCH/$RPM_FILENAME" +node build/tfs/out/publish.js $VSCODE_QUALITY $PLATFORM_RPM package $RPM_FILENAME $VERSION true $RPM_PATH + +STEP "Publish to repositories" +if [ -z "$VSCODE_QUALITY" ]; then + echo "VSCODE_QUALITY is not set, skipping repo package publish" +else + if [ "$BUILD_SOURCEBRANCH" = "master" ] || [ "$BUILD_SOURCEBRANCH" = "refs/heads/master" ]; then + if [[ $BUILD_QUEUEDBY = *"Project Collection Service Accounts"* || $BUILD_QUEUEDBY = *"Microsoft.VisualStudio.Services.TFS"* ]]; then + # Get necessary information + pushd $REPO && COMMIT_HASH=$(git rev-parse HEAD) && popd + PACKAGE_NAME="$(ls $REPO/.build/linux/deb/$DEB_ARCH/deb/ | sed -e 's/_.*//g')" + DEB_URL="https://az764295.vo.msecnd.net/$VSCODE_QUALITY/$COMMIT_HASH/$DEB_FILENAME" + RPM_URL="https://az764295.vo.msecnd.net/$VSCODE_QUALITY/$COMMIT_HASH/$RPM_FILENAME" + PACKAGE_VERSION="$(ls $REPO/.build/linux/deb/$DEB_ARCH/deb/ | sed -e 's/code-[a-z]*_//g' -e 's/\_.*$//g')" + # Write config files needed by API, use eval to force environment variable expansion + DIRNAME=$(dirname $(readlink -f $0)) + pushd $DIRNAME + # Submit to apt repo + if [ "$DEB_ARCH" = "amd64" ]; then + eval echo '{ \"server\": \"azure-apt-cat.cloudapp.net\", \"protocol\": \"https\", \"port\": \"443\", \"repositoryId\": \"58a4adf642421134a1a48d1a\", \"username\": \"$LINUX_REPO_USERNAME\", \"password\": \"$LINUX_REPO_PASSWORD\" }' > apt-config.json + eval echo '{ \"name\": \"$PACKAGE_NAME\", \"version\": \"$PACKAGE_VERSION\", \"repositoryId\": \"58a4adf642421134a1a48d1a\", \"sourceUrl\": \"$DEB_URL\" }' > apt-addpkg.json + echo "Submitting apt-addpkg.json:" + cat apt-addpkg.json + ./repoapi_client.sh -config apt-config.json -addpkg apt-addpkg.json + fi + # Submit to yum repo (disabled as it's manual until signing is automated) + # eval echo '{ \"server\": \"azure-apt-cat.cloudapp.net\", \"protocol\": \"https\", \"port\": \"443\", \"repositoryId\": \"58a4ae3542421134a1a48d1b\", \"username\": \"$LINUX_REPO_USERNAME\", \"password\": \"$LINUX_REPO_PASSWORD\" }' > yum-config.json + # eval echo '{ \"name\": \"$PACKAGE_NAME\", \"version\": \"$PACKAGE_VERSION\", \"repositoryId\": \"58a4ae3542421134a1a48d1b\", \"sourceUrl\": \"$RPM_URL\" }' > yum-addpkg.json + # echo "Submitting yum-addpkg.json:" + # cat yum-addpkg.json + # ./repoapi_client.sh -config yum-config.json -addpkg yum-addpkg.json + popd + echo "To check repo publish status run ./repoapi_client.sh -config config.json -check " + fi + fi +fi diff --git a/build/tfs/linux/repoapi_client.sh b/build/tfs/linux/repoapi_client.sh new file mode 100755 index 00000000000..b214ef10726 --- /dev/null +++ b/build/tfs/linux/repoapi_client.sh @@ -0,0 +1,262 @@ +#!/bin/bash -e +# This is a VERY basic script for Create/Delete operations on repos and packages +# +cmd=$1 +urls=urls.txt +defaultPackageFile=new_package.json +defaultRepoFile=new_repo.json + +function Bail +{ + echo "ERROR: $@" + exit 1 +} + +function BailIfFileMissing { + file="$1" + if [ ! -f "$file" ]; then + Bail "File $file does not exist" + fi +} + +function Usage { + echo "USAGE: Manage repos and packages in an apt repository" + echo "$0 -config FILENAME -listrepos | -listpkgs | -addrepo FILENAME | -addpkg FILENAME |" + echo "-addpkgs FILENAME | -check ID | -delrepo REPOID | -delpkg PKGID" + echo -e "\t-config FILENAME : JSON file containing API server name and creds" + echo -e "\t-listrepos : List repositories" + echo -e "\t-listpkgs [REGEX] : List packages, optionally filter by REGEX" + echo -e "\t-addrepo FILENAME : Create a new repo using the specified JSON file" + echo -e "\t-addpkg FILENAME : Add package to repo using the specified JSON file" + echo -e "\t-addpkgs FILENAME : Add packages to repo using urls contained in FILENAME" + echo -e "\t-check ID : Check upload operation by ID" + echo -e "\t-delrepo REPOID : Delete the specified repo by ID" + echo -e "\t-delpkg PKGID : Delete the specified package by ID" + exit 1 +} + +function ParseFromJson { + if [ -z "$secretContents" ]; then + Bail "Unable to parse value because no JSON contents were specified" + elif [ -z "$1" ]; then + Bail "Unable to parse value from JSON because no key was specified" + fi + # Write value directly to stdout to be used by caller + echo $secretContents | jq "$1" | tr -d '"' +} + +function ParseConfigFile { + configFile="$1" + if [ -z "$configFile" ]; then + echo "Must specify -config option" + Usage + fi + BailIfFileMissing "$configFile" + secretContents=$(cat "$configFile") + + server=$(ParseFromJson .server) + protocol=$(ParseFromJson .protocol) + port=$(ParseFromJson .port) + repositoryId=$(ParseFromJson .repositoryId) + user=$(ParseFromJson .username) + pass=$(ParseFromJson .password) + baseurl="$protocol://$user:$pass@$server:$port" +} + +# List Repositories +function ListRepositories +{ + echo "Fetching repo list from $server..." + curl -k "$baseurl/v1/repositories" | sed 's/,/,\n/g' | sed 's/^"/\t"/g' + echo "" +} + +# List packages, using $1 as a regex to filter results +function ListPackages +{ + echo "Fetching package list from $server" + curl -k "$baseurl/v1/packages" | sed 's/{/\n{/g' | egrep "$1" | sed 's/,/,\n/g' | sed 's/^"/\t"/g' + echo "" +} + +# Create a new Repo using the specified JSON file +function AddRepo +{ + repoFile=$1 + if [ -z $repoFile ]; then + Bail "Error: Must specify a JSON-formatted file. Reference $defaultRepoFile.template" + fi + if [ ! -f $repoFile ]; then + Bail "Error: Cannot create repo - $repoFile does not exist" + fi + packageUrl=$(grep "url" $repoFile | head -n 1 | awk '{print $2}' | tr -d ',') + echo "Creating new repo on $server [$packageUrl]" + curl -i -k "$baseurl/v1/repositories" --data @./$repoFile -H "Content-Type: application/json" + echo "" +} + +# Upload a single package using the specified JSON file +function AddPackage +{ + packageFile=$1 + if [ -z $packageFile ]; then + Bail "Error: Must specify a JSON-formatted file. Reference $defaultPackageFile.template" + fi + if [ ! -f $packageFile ]; then + Bail "Error: Cannot add package - $packageFile does not exist" + fi + packageUrl=$(grep "sourceUrl" $packageFile | head -n 1 | awk '{print $2}') + echo "Adding package to $server [$packageUrl]" + curl -i -k "$baseurl/v1/packages" --data @./$packageFile -H "Content-Type: application/json" + echo "" +} + +# Upload a single package by dynamically creating a JSON file using a provided URL +function AddPackageByUrl +{ + url=$(echo "$1") + if [ -z "$url" ]; then + Bail "Unable to publish package because no URL was specified" + fi + tmpFile=$(mktemp) + tmpOut=$(mktemp) + if ! wget -q "$url" -O $tmpFile; then + rm -f $tmpFile $tmpFile + Bail "Unable to download URL $url" + elif dpkg -I $tmpFile > $tmpOut 2> /dev/null; then + echo "File is deb format" + pkgName=$(grep "^\s*Package:" $tmpOut | awk '{print $2}') + pkgVer=$(grep "^\s*Version:" $tmpOut | awk '{print $2}') + elif rpm -qpi $tmpFile > $tmpOut 2> /dev/null; then + echo "File is rpm format" + pkgName=$(egrep "^Name" $tmpOut | tr -d ':' | awk '{print $2}') + pkgVer=$(egrep "^Version" $tmpOut | tr -d ':' | awk '{print $2}') + else + rm -f $tmpFile $tmpOut + Bail "File is not a valid deb/rpm package $url" + fi + + rm -f $tmpFile $tmpOut + if [ -z "$pkgName" ]; then + Bail "Unable to parse package name for $url" + elif [ -z "$pkgVer" ]; then + Bail "Unable to parse package version number for $url" + fi + + # Create Package .json file + escapedUrl=$(echo "$url" | sed 's/\//\\\//g' | sed 's/\&/\\\&/g') + cp $defaultPackageFile.template $defaultPackageFile + sed -i "s/PACKAGENAME/$pkgName/g" $defaultPackageFile + sed -i "s/PACKAGEVERSION/$pkgVer/g" $defaultPackageFile + sed -i "s/PACKAGEURL/$escapedUrl/g" $defaultPackageFile + sed -i "s/REPOSITORYID/$repositoryId/g" $defaultPackageFile + # Perform Upload + AddPackage $defaultPackageFile + # Cleanup + rm -f $defaultPackageFile +} + +# Upload multiple packages by reading urls line-by-line from the specified file +function AddPackages +{ + urlFile=$1 + if [ -z $urlFile ]; then + Bail "Must specify a flat text file containing one or more URLs" + fi + if [ ! -f $urlFile ]; then + Bail "Cannot add packages. File $urlFile does not exist" + fi + for url in $(cat $urlFile); do + if [ -n "$url" ]; then + AddPackageByUrl "$url" + fi + sleep 5 + done +} + +# Check upload by ID +function CheckUpload { + id=$1 + if [ -z "$id" ]; then + Bail "Must specify an ID" + fi + curl -k $baseurl/v1/packages/queue/$id + echo "" +} + +# Delete the specified repo +function DeleteRepo +{ + repoId=$1 + if [ -z $repoId ]; then + Bail "Please specify repository ID. Run -listrepos for a list of IDs" + fi + curl -I -k -X DELETE "$baseurl/v1/repositories/$repoId" +} + +# Delete the specified package +function DeletePackage +{ + packageId=$1 + if [ -z $packageId ]; then + Bail "Please specify package ID. Run -listpkgs for a list of IDs" + fi + echo Removing pkgId $packageId from repo $repositoryId + curl -I -k -X DELETE "$baseurl/v1/packages/$packageId" +} + +# Parse params +# Not using getopts because this uses multi-char flags +operation= +while (( "$#" )); do + if [[ "$1" == "-config" ]]; then + shift + configFile="$1" + elif [[ "$1" == "-listrepos" ]]; then + operation=ListRepositories + elif [[ "$1" == "-listpkgs" ]]; then + operation=ListPackages + if [ -n "$2" ]; then + shift + operand="$1" + fi + elif [[ "$1" == "-addrepo" ]]; then + operation=AddRepo + shift + operand="$1" + elif [[ "$1" == "-addpkg" ]]; then + operation=AddPackage + shift + operand="$1" + elif [[ "$1" == "-addpkgs" ]]; then + operation=AddPackages + shift + operand="$1" + elif [[ "$1" == "-check" ]]; then + operation=CheckUpload + shift + operand="$1" + elif [[ "$1" == "-delrepo" ]]; then + operation=DeleteRepo + shift + operand="$1" + elif [[ "$1" == "-delpkg" ]]; then + operation=DeletePackage + shift + operand="$1" + else + Usage + fi + shift +done + +echo "Performing $operation $operand" +# Parse config file +ParseConfigFile "$configFile" + +# Exit if no operation was specified +if [ -z "operation" ]; then + Usage +fi + +$operation "$operand" From 6e3427b1bada44f88c8d85aff6f62c233d9aaea0 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 12 May 2017 16:43:18 +0200 Subject: [PATCH 0400/1164] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4f20135e41c..9ed66ec3a04 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "code-oss-dev", "version": "1.13.0", "electronVersion": "1.6.6", - "distro": "a19a3b432030a478afa61b438c9a0dfd8f84f893", + "distro": "e040c79dac021045cd488b8192515113014d67d4", "author": { "name": "Microsoft Corporation" }, From 73d7b085e73cacc02e19c49d186f9e3fe5ce3dc6 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 12 May 2017 16:43:09 +0200 Subject: [PATCH 0401/1164] don't search for nothing, fixes #26423 --- src/vs/base/common/filters.ts | 10 ++++++++++ src/vs/base/test/common/filters.test.ts | 15 +++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/vs/base/common/filters.ts b/src/vs/base/common/filters.ts index dc376f9150b..360da9f2384 100644 --- a/src/vs/base/common/filters.ts +++ b/src/vs/base/common/filters.ts @@ -478,6 +478,9 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { return undefined; } + // keep track of the maximum score + let maxScore = -1; + for (i = 1; i <= patternLen; i++) { let lastLowWordChar = ''; @@ -509,6 +512,9 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { } _scores[i][j] = score; + if (score > maxScore) { + maxScore = score; + } let diag = _table[i - 1][j - 1] + (score > 1 ? 1 : score); let top = _table[i - 1][j] + -1; @@ -544,6 +550,10 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { } } + if (maxScore <= 1) { + return undefined; + } + if (_debug) { console.log(printTable(_table, pattern, patternLen, word, wordLen)); console.log(printTable(_arrows, pattern, patternLen, word, wordLen)); diff --git a/src/vs/base/test/common/filters.test.ts b/src/vs/base/test/common/filters.test.ts index 3e9c41b735c..1e9a6a1e713 100644 --- a/src/vs/base/test/common/filters.test.ts +++ b/src/vs/base/test/common/filters.test.ts @@ -305,6 +305,21 @@ suite('Filters', () => { ); }); + test('fuzzyScore, issue #26423', function () { + assertMatches( + 'fsfsfs', + 'dsafdsafdsafdsafdsafdsafdsafasdfdsa', + undefined, + fuzzyScore + ); + assertMatches( + 'fsfsfsfsfsfsfsf', + 'dsafdsafdsafdsafdsafdsafdsafasdfdsafdsafdsafdsafdsfdsafdsfdfdfasdnfdsajfndsjnafjndsajlknfdsa', + undefined, + fuzzyScore + ); + }); + function assertTopScore(filter: typeof fuzzyScore, pattern: string, expected: number, ...words: string[]) { let topScore = -(100 * 10); let topIdx = 0; From 0977de9948e99e5949030e9de40fb4fd68bb4924 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 12 May 2017 16:48:00 +0200 Subject: [PATCH 0402/1164] [php] update php grammar --- extensions/php/syntaxes/php.tmLanguage.json | 901 ++++++++++++------ .../php/test/colorize-results/test_php.json | 30 +- extensions/theme-defaults/themes/dark_vs.json | 4 +- .../theme-defaults/themes/light_vs.json | 4 +- 4 files changed, 643 insertions(+), 296 deletions(-) diff --git a/extensions/php/syntaxes/php.tmLanguage.json b/extensions/php/syntaxes/php.tmLanguage.json index 9586638c4d2..36af0819d40 100644 --- a/extensions/php/syntaxes/php.tmLanguage.json +++ b/extensions/php/syntaxes/php.tmLanguage.json @@ -40,14 +40,14 @@ "begin": "<\\?(?i:php|=)?", "beginCaptures": { "0": { - "name": "punctuation.section.embedded.begin.metatag.php" + "name": "punctuation.section.embedded.begin.php" } }, "contentName": "source.php", "end": "(\\?)>", "endCaptures": { "0": { - "name": "punctuation.section.embedded.end.metatag.php" + "name": "punctuation.section.embedded.end.php" }, "1": { "name": "source.php" @@ -66,14 +66,14 @@ "begin": "<\\?(?i:php|=)?(?![^?]*\\?>)", "beginCaptures": { "0": { - "name": "punctuation.section.embedded.begin.metatag.php" + "name": "punctuation.section.embedded.begin.php" } }, "contentName": "source.php", "end": "(\\?)>", "endCaptures": { "0": { - "name": "punctuation.section.embedded.end.metatag.php" + "name": "punctuation.section.embedded.end.php" }, "1": { "name": "source.php" @@ -90,13 +90,13 @@ "begin": "<\\?(?i:php|=)?", "beginCaptures": { "0": { - "name": "punctuation.section.embedded.begin.metatag.php" + "name": "punctuation.section.embedded.begin.php" } }, "end": ">", "endCaptures": { "0": { - "name": "punctuation.section.embedded.end.metatag.php" + "name": "punctuation.section.embedded.end.php" } }, "name": "meta.embedded.line.php", @@ -107,7 +107,7 @@ "name": "source.php" }, "2": { - "name": "punctuation.section.embedded.end.metatag.php" + "name": "punctuation.section.embedded.end.php" }, "3": { "name": "source.php" @@ -122,7 +122,7 @@ "end": "(\\?)(?=>)", "endCaptures": { "0": { - "name": "punctuation.section.embedded.end.metatag.php" + "name": "punctuation.section.embedded.end.php" }, "1": { "name": "source.php" @@ -196,14 +196,18 @@ "comments": { "patterns": [ { - "begin": "/\\*\\*(?:#@\\+)?\\s*$", - "captures": { + "begin": "/\\*\\*(?=\\s)", + "beginCaptures": { "0": { "name": "punctuation.definition.comment.php" } }, - "comment": "This now only highlights a docblock if the first line contains only /**\n\t\t\t\t\t\t\t\t- this is to stop highlighting everything as invalid when people do comment banners with /******** ...\n\t\t\t\t\t\t\t\t- Now matches /**#@+ too - used for docblock templates: http://manual.phpdoc.org/HTMLframesConverter/default/phpDocumentor/tutorial_phpDocumentor.howto.pkg.html#basics.docblocktemplate", "end": "\\*/", + "endCaptures": { + "0": { + "name": "punctuation.definition.comment.php" + } + }, "name": "comment.block.documentation.phpdoc.php", "patterns": [ { @@ -222,7 +226,7 @@ "name": "comment.block.php" }, { - "begin": "(^[ \\t]+)?(?=//)", + "begin": "(^\\s+)?(?=//)", "beginCaptures": { "1": { "name": "punctuation.whitespace.comment.leading.php" @@ -243,7 +247,7 @@ ] }, { - "begin": "(^[ \\t]+)?(?=#)", + "begin": "(^\\s+)?(?=#)", "beginCaptures": { "1": { "name": "punctuation.whitespace.comment.leading.php" @@ -559,15 +563,6 @@ { "begin": "(?=<<<\\s*(\"?)([a-zA-Z_]+[a-zA-Z0-9_]*)(\\1)\\s*$)", "end": "(?!\\G)", - "injections": { - "*": { - "patterns": [ - { - "include": "#interpolation" - } - ] - } - }, "name": "string.unquoted.heredoc.php", "patterns": [ { @@ -576,298 +571,650 @@ ] }, { - "begin": "(?=<<<\\s*('?)([a-zA-Z_]+[a-zA-Z0-9_]*)(\\1)\\s*$)", + "begin": "(?=<<<\\s*'([a-zA-Z_]+[a-zA-Z0-9_]*)'\\s*$)", "end": "(?!\\G)", - "name": "string.unquoted.heredoc.nowdoc.php", + "name": "string.unquoted.nowdoc.php", "patterns": [ { - "include": "#heredoc_interior" + "include": "#nowdoc_interior" } ] } - ], - "repository": { - "heredoc_interior": { + ] + }, + "heredoc_interior": { + "patterns": [ + { + "begin": "(<<<)\\s*(\"?)(HTML)(\\2)(\\s*)$", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.php" + }, + "1": { + "name": "punctuation.definition.string.php" + }, + "3": { + "name": "keyword.operator.heredoc.php" + }, + "5": { + "name": "invalid.illegal.trailing-whitespace.php" + } + }, + "contentName": "text.html", + "end": "^(\\3)\\b", + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.php" + }, + "1": { + "name": "keyword.operator.heredoc.php" + } + }, + "name": "meta.embedded.html", "patterns": [ { - "begin": "(<<<)\\s*(['\"]?)(HTML)(\\2)\\s*$\\n?", - "beginCaptures": { - "0": { - "name": "punctuation.section.embedded.begin.php" - }, + "include": "#interpolation" + }, + { + "include": "text.html.basic" + } + ] + }, + { + "begin": "(<<<)\\s*(\"?)(XML)(\\2)(\\s*)$", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.php" + }, + "1": { + "name": "punctuation.definition.string.php" + }, + "3": { + "name": "keyword.operator.heredoc.php" + }, + "5": { + "name": "invalid.illegal.trailing-whitespace.php" + } + }, + "contentName": "text.xml", + "end": "^(\\3)\\b", + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.php" + }, + "1": { + "name": "keyword.operator.heredoc.php" + } + }, + "name": "meta.embedded.xml", + "patterns": [ + { + "include": "#interpolation" + }, + { + "include": "text.xml" + } + ] + }, + { + "begin": "(<<<)\\s*(\"?)(SQL)(\\2)(\\s*)$", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.php" + }, + "1": { + "name": "punctuation.definition.string.php" + }, + "3": { + "name": "keyword.operator.heredoc.php" + }, + "5": { + "name": "invalid.illegal.trailing-whitespace.php" + } + }, + "contentName": "source.sql", + "end": "^(\\3)\\b", + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.php" + }, + "1": { + "name": "keyword.operator.heredoc.php" + } + }, + "name": "meta.embedded.sql", + "patterns": [ + { + "include": "#interpolation" + }, + { + "include": "source.sql" + } + ] + }, + { + "begin": "(<<<)\\s*(\"?)(JAVASCRIPT|JS)(\\2)(\\s*)$", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.php" + }, + "1": { + "name": "punctuation.definition.string.php" + }, + "3": { + "name": "keyword.operator.heredoc.php" + }, + "5": { + "name": "invalid.illegal.trailing-whitespace.php" + } + }, + "contentName": "source.js", + "end": "^(\\3)\\b", + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.php" + }, + "1": { + "name": "keyword.operator.heredoc.php" + } + }, + "name": "meta.embedded.js", + "patterns": [ + { + "include": "#interpolation" + }, + { + "include": "source.js" + } + ] + }, + { + "begin": "(<<<)\\s*(\"?)(JSON)(\\2)(\\s*)$", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.php" + }, + "1": { + "name": "punctuation.definition.string.php" + }, + "3": { + "name": "keyword.operator.heredoc.php" + }, + "5": { + "name": "invalid.illegal.trailing-whitespace.php" + } + }, + "contentName": "source.json", + "end": "^(\\3)\\b", + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.php" + }, + "1": { + "name": "keyword.operator.heredoc.php" + } + }, + "name": "meta.embedded.json", + "patterns": [ + { + "include": "#interpolation" + }, + { + "include": "source.json" + } + ] + }, + { + "begin": "(<<<)\\s*(\"?)(CSS)(\\2)(\\s*)$", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.php" + }, + "1": { + "name": "punctuation.definition.string.php" + }, + "3": { + "name": "keyword.operator.heredoc.php" + }, + "5": { + "name": "invalid.illegal.trailing-whitespace.php" + } + }, + "contentName": "source.css", + "end": "^(\\3)\\b", + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.php" + }, + "1": { + "name": "keyword.operator.heredoc.php" + } + }, + "name": "meta.embedded.css", + "patterns": [ + { + "include": "#interpolation" + }, + { + "include": "source.css" + } + ] + }, + { + "begin": "(<<<)\\s*(\"?)(REGEXP?)(\\2)(\\s*)$", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.php" + }, + "1": { + "name": "punctuation.definition.string.php" + }, + "3": { + "name": "keyword.operator.heredoc.php" + }, + "5": { + "name": "invalid.illegal.trailing-whitespace.php" + } + }, + "contentName": "string.regexp.heredoc.php", + "end": "^(\\3)\\b", + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.php" + }, + "1": { + "name": "keyword.operator.heredoc.php" + } + }, + "patterns": [ + { + "include": "#interpolation" + }, + { + "comment": "Escaped from the regexp – there can also be 2 backslashes (since 1 will escape the first)", + "match": "(\\\\){1,2}[.$^\\[\\]{}]", + "name": "constant.character.escape.regex.php" + }, + { + "captures": { "1": { - "name": "punctuation.definition.string.php" + "name": "punctuation.definition.arbitrary-repitition.php" }, "3": { - "name": "keyword.operator.heredoc.php" + "name": "punctuation.definition.arbitrary-repitition.php" } }, - "contentName": "text.html", - "end": "^(\\3)\\b", - "endCaptures": { + "match": "(\\{)\\d+(,\\d+)?(\\})", + "name": "string.regexp.arbitrary-repitition.php" + }, + { + "begin": "\\[(?:\\^?\\])?", + "captures": { "0": { - "name": "punctuation.section.embedded.end.php" - }, - "1": { - "name": "keyword.operator.heredoc.php" + "name": "punctuation.definition.character-class.php" } }, - "name": "meta.embedded.html", + "end": "\\]", + "name": "string.regexp.character-class.php", "patterns": [ { - "include": "text.html.basic" + "match": "\\\\[\\\\'\\[\\]]", + "name": "constant.character.escape.php" } ] }, { - "begin": "(<<<)\\s*(['\"]?)(XML)(\\2)\\s*$\\n?", - "beginCaptures": { - "0": { - "name": "punctuation.section.embedded.begin.php" - }, - "1": { - "name": "punctuation.definition.string.php" - }, - "3": { - "name": "keyword.operator.heredoc.php" - } - }, - "contentName": "text.xml", - "end": "^(\\3)\\b", - "endCaptures": { - "0": { - "name": "punctuation.section.embedded.end.php" - }, - "1": { - "name": "keyword.operator.heredoc.php" - } - }, - "name": "meta.embedded.xml", - "patterns": [ - { - "include": "text.xml" - } - ] + "match": "[$^+*]", + "name": "keyword.operator.regexp.php" }, { - "begin": "(<<<)\\s*(['\"]?)(SQL)(\\2)\\s*$\\n?", + "begin": "(?<=^|\\s)(#)\\s(?=[[a-zA-Z0-9,. \\t?!-][^\\x{00}-\\x{7F}]]*$)", "beginCaptures": { - "0": { - "name": "punctuation.section.embedded.begin.php" - }, "1": { - "name": "punctuation.definition.string.php" - }, - "3": { - "name": "keyword.operator.heredoc.php" + "name": "punctuation.definition.comment.php" } }, - "contentName": "source.sql", - "end": "^(\\3)\\b", + "comment": "We are restrictive in what we allow to go after the comment character to avoid false positives, since the availability of comments depend on regexp flags.", + "end": "$\\n?", "endCaptures": { "0": { - "name": "punctuation.section.embedded.end.php" - }, - "1": { - "name": "keyword.operator.heredoc.php" + "name": "punctuation.definition.comment.php" } }, - "name": "meta.embedded.sql", - "patterns": [ - { - "include": "source.sql" - } - ] + "name": "comment.line.number-sign.php" + } + ] + }, + { + "begin": "(<<<)\\s*(\"?)([a-zA-Z_]+[a-zA-Z0-9_]*)(\\2)(\\s*)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.string.php" }, - { - "begin": "(<<<)\\s*(['\"]?)(JAVASCRIPT)(\\2)\\s*$\\n?", - "beginCaptures": { - "0": { - "name": "punctuation.section.embedded.begin.php" - }, - "1": { - "name": "punctuation.definition.string.php" - }, - "3": { - "name": "keyword.operator.heredoc.php" - } - }, - "contentName": "source.js", - "end": "^(\\3)\\b", - "endCaptures": { - "0": { - "name": "punctuation.section.embedded.end.php" - }, - "1": { - "name": "keyword.operator.heredoc.php" - } - }, - "name": "meta.embedded.js", - "patterns": [ - { - "include": "source.js" - } - ] + "3": { + "name": "keyword.operator.heredoc.php" }, + "5": { + "name": "invalid.illegal.trailing-whitespace.php" + } + }, + "end": "^(\\3)\\b", + "endCaptures": { + "1": { + "name": "keyword.operator.heredoc.php" + } + }, + "patterns": [ { - "begin": "(<<<)\\s*(['\"]?)(JSON)(\\2)\\s*$\\n?", - "beginCaptures": { - "0": { - "name": "punctuation.section.embedded.begin.php" - }, - "1": { - "name": "punctuation.definition.string.php" - }, - "3": { - "name": "keyword.operator.heredoc.php" - } - }, - "contentName": "source.json", - "end": "^(\\3)\\b", - "endCaptures": { - "0": { - "name": "punctuation.section.embedded.end.php" - }, - "1": { - "name": "keyword.operator.heredoc.php" - } - }, - "name": "meta.embedded.json", - "patterns": [ - { - "include": "source.json" - } - ] - }, - { - "begin": "(<<<)\\s*(['\"]?)(CSS)(\\2)\\s*$\\n?", - "beginCaptures": { - "0": { - "name": "punctuation.section.embedded.begin.php" - }, - "1": { - "name": "punctuation.definition.string.php" - }, - "3": { - "name": "keyword.operator.heredoc.php" - } - }, - "contentName": "source.css", - "end": "^(\\3)\\b", - "endCaptures": { - "0": { - "name": "punctuation.section.embedded.end.php" - }, - "1": { - "name": "keyword.operator.heredoc.php" - } - }, - "name": "meta.embedded.css", - "patterns": [ - { - "include": "source.css" - } - ] - }, - { - "begin": "(<<<)\\s*(['\"]?)(REGEX)(\\2)\\s*$\\n?", - "beginCaptures": { - "0": { - "name": "punctuation.section.embedded.begin.php" - }, - "1": { - "name": "punctuation.definition.string.php" - }, - "3": { - "name": "keyword.operator.heredoc.php" - } - }, - "contentName": "string.regexp.heredoc.php", - "end": "^(\\3)\\b", - "endCaptures": { - "0": { - "name": "punctuation.section.embedded.end.php" - }, - "1": { - "name": "keyword.operator.heredoc.php" - } - }, - "patterns": [ - { - "comment": "Escaped from the regexp – there can also be 2 backslashes (since 1 will escape the first)", - "match": "(\\\\){1,2}[.$^\\[\\]{}]", - "name": "constant.character.escape.regex.php" - }, - { - "captures": { - "1": { - "name": "punctuation.definition.arbitrary-repitition.php" - }, - "3": { - "name": "punctuation.definition.arbitrary-repitition.php" - } - }, - "match": "(\\{)\\d+(,\\d+)?(\\})", - "name": "string.regexp.arbitrary-repitition.php" - }, - { - "begin": "\\[(?:\\^?\\])?", - "captures": { - "0": { - "name": "punctuation.definition.character-class.php" - } - }, - "end": "\\]", - "name": "string.regexp.character-class.php", - "patterns": [ - { - "match": "\\\\[\\\\'\\[\\]]", - "name": "constant.character.escape.php" - } - ] - }, - { - "match": "[$^+*]", - "name": "keyword.operator.regexp.php" - }, - { - "begin": "(?<=^|\\s)(#)\\s(?=[[a-zA-Z0-9,. \\t?!-][^\\x{00}-\\x{7F}]]*$)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.comment.php" - } - }, - "comment": "We are restrictive in what we allow to go after the comment character to avoid false positives, since the availability of comments depend on regexp flags.", - "end": "$\\n?", - "endCaptures": { - "0": { - "name": "punctuation.definition.comment.php" - } - }, - "name": "comment.line.number-sign.php" - } - ] - }, - { - "begin": "(<<<)\\s*(['\"]?)([a-zA-Z_]+[a-zA-Z0-9_]*)(\\2)", - "beginCaptures": { - "1": { - "name": "punctuation.definition.string.php" - }, - "3": { - "name": "keyword.operator.heredoc.php" - } - }, - "end": "^(\\3)\\b", - "endCaptures": { - "1": { - "name": "keyword.operator.heredoc.php" - } - } + "include": "#interpolation" } ] } - } + ] + }, + "nowdoc_interior": { + "patterns": [ + { + "begin": "(<<<)\\s*'(HTML)'(\\s*)$", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.php" + }, + "1": { + "name": "punctuation.definition.string.php" + }, + "2": { + "name": "keyword.operator.nowdoc.php" + }, + "3": { + "name": "invalid.illegal.trailing-whitespace.php" + } + }, + "contentName": "text.html", + "end": "^(\\2)\\b", + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.php" + }, + "1": { + "name": "keyword.operator.nowdoc.php" + } + }, + "name": "meta.embedded.html", + "patterns": [ + { + "include": "text.html.basic" + } + ] + }, + { + "begin": "(<<<)\\s*'(XML)'(\\s*)$", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.php" + }, + "1": { + "name": "punctuation.definition.string.php" + }, + "2": { + "name": "keyword.operator.nowdoc.php" + }, + "3": { + "name": "invalid.illegal.trailing-whitespace.php" + } + }, + "contentName": "text.xml", + "end": "^(\\2)\\b", + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.php" + }, + "1": { + "name": "keyword.operator.nowdoc.php" + } + }, + "name": "meta.embedded.xml", + "patterns": [ + { + "include": "text.xml" + } + ] + }, + { + "begin": "(<<<)\\s*'(SQL)'(\\s*)$", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.php" + }, + "1": { + "name": "punctuation.definition.string.php" + }, + "2": { + "name": "keyword.operator.nowdoc.php" + }, + "3": { + "name": "invalid.illegal.trailing-whitespace.php" + } + }, + "contentName": "source.sql", + "end": "^(\\2)\\b", + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.php" + }, + "1": { + "name": "keyword.operator.nowdoc.php" + } + }, + "name": "meta.embedded.sql", + "patterns": [ + { + "include": "source.sql" + } + ] + }, + { + "begin": "(<<<)\\s*'(JAVASCRIPT|JS)'(\\s*)$", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.php" + }, + "1": { + "name": "punctuation.definition.string.php" + }, + "2": { + "name": "keyword.operator.nowdoc.php" + }, + "3": { + "name": "invalid.illegal.trailing-whitespace.php" + } + }, + "contentName": "source.js", + "end": "^(\\2)\\b", + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.php" + }, + "1": { + "name": "keyword.operator.nowdoc.php" + } + }, + "name": "meta.embedded.js", + "patterns": [ + { + "include": "source.js" + } + ] + }, + { + "begin": "(<<<)\\s*'(JSON)'(\\s*)$", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.php" + }, + "1": { + "name": "punctuation.definition.string.php" + }, + "2": { + "name": "keyword.operator.nowdoc.php" + }, + "3": { + "name": "invalid.illegal.trailing-whitespace.php" + } + }, + "contentName": "source.json", + "end": "^(\\2)\\b", + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.php" + }, + "1": { + "name": "keyword.operator.nowdoc.php" + } + }, + "name": "meta.embedded.json", + "patterns": [ + { + "include": "source.json" + } + ] + }, + { + "begin": "(<<<)\\s*'(CSS)'(\\s*)$", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.php" + }, + "1": { + "name": "punctuation.definition.string.php" + }, + "2": { + "name": "keyword.operator.nowdoc.php" + }, + "3": { + "name": "invalid.illegal.trailing-whitespace.php" + } + }, + "contentName": "source.css", + "end": "^(\\2)\\b", + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.php" + }, + "1": { + "name": "keyword.operator.nowdoc.php" + } + }, + "name": "meta.embedded.css", + "patterns": [ + { + "include": "source.css" + } + ] + }, + { + "begin": "(<<<)\\s*'(REGEXP?)'(\\s*)$", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.php" + }, + "1": { + "name": "punctuation.definition.string.php" + }, + "2": { + "name": "keyword.operator.nowdoc.php" + }, + "3": { + "name": "invalid.illegal.trailing-whitespace.php" + } + }, + "contentName": "string.regexp.nowdoc.php", + "end": "^(\\2)\\b", + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.php" + }, + "1": { + "name": "keyword.operator.nowdoc.php" + } + }, + "patterns": [ + { + "comment": "Escaped from the regexp – there can also be 2 backslashes (since 1 will escape the first)", + "match": "(\\\\){1,2}[.$^\\[\\]{}]", + "name": "constant.character.escape.regex.php" + }, + { + "captures": { + "1": { + "name": "punctuation.definition.arbitrary-repitition.php" + }, + "3": { + "name": "punctuation.definition.arbitrary-repitition.php" + } + }, + "match": "(\\{)\\d+(,\\d+)?(\\})", + "name": "string.regexp.arbitrary-repitition.php" + }, + { + "begin": "\\[(?:\\^?\\])?", + "captures": { + "0": { + "name": "punctuation.definition.character-class.php" + } + }, + "end": "\\]", + "name": "string.regexp.character-class.php", + "patterns": [ + { + "match": "\\\\[\\\\'\\[\\]]", + "name": "constant.character.escape.php" + } + ] + }, + { + "match": "[$^+*]", + "name": "keyword.operator.regexp.php" + }, + { + "begin": "(?<=^|\\s)(#)\\s(?=[[a-zA-Z0-9,. \\t?!-][^\\x{00}-\\x{7F}]]*$)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.comment.php" + } + }, + "comment": "We are restrictive in what we allow to go after the comment character to avoid false positives, since the availability of comments depend on regexp flags.", + "end": "$\\n?", + "endCaptures": { + "0": { + "name": "punctuation.definition.comment.php" + } + }, + "name": "comment.line.number-sign.php" + } + ] + }, + { + "begin": "(<<<)\\s*'([a-zA-Z_]+[a-zA-Z0-9_]*)'(\\s*)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.string.php" + }, + "2": { + "name": "keyword.operator.nowdoc.php" + }, + "3": { + "name": "invalid.illegal.trailing-whitespace.php" + } + }, + "end": "^(\\2)\\b", + "endCaptures": { + "1": { + "name": "keyword.operator.nowdoc.php" + } + } + } + ] }, "instantiation": { "begin": "(?i)(new)\\s+", @@ -2628,5 +2975,5 @@ ] } }, - "version": "https://github.com/atom/language-php/commit/6c48772bfdf5ed057501952f8454900b91ff140a" + "version": "https://github.com/atom/language-php/commit/fca6a6763bd5e07b2cc0a82fda502dbf3bce5dea" } \ No newline at end of file diff --git a/extensions/php/test/colorize-results/test_php.json b/extensions/php/test/colorize-results/test_php.json index 72e7f6a86a4..ee3715fefce 100644 --- a/extensions/php/test/colorize-results/test_php.json +++ b/extensions/php/test/colorize-results/test_php.json @@ -221,12 +221,12 @@ }, { "c": "", - "t": "text.html.php meta.embedded.block.php punctuation.section.embedded.end.metatag.php", + "t": "text.html.php meta.embedded.block.php punctuation.section.embedded.end.php", "r": { - "dark_plus": "punctuation.section.embedded.end.metatag.php: #569CD6", - "light_plus": "punctuation.section.embedded.end.metatag.php: #800000", - "dark_vs": "punctuation.section.embedded.end.metatag.php: #569CD6", - "light_vs": "punctuation.section.embedded.end.metatag.php: #800000", + "dark_plus": "punctuation.section.embedded.end.php: #569CD6", + "light_plus": "punctuation.section.embedded.end.php: #800000", + "dark_vs": "punctuation.section.embedded.end.php: #569CD6", + "light_vs": "punctuation.section.embedded.end.php: #800000", "hc_black": "default: #FFFFFF" } }, diff --git a/extensions/theme-defaults/themes/dark_vs.json b/extensions/theme-defaults/themes/dark_vs.json index 08b4ecfee9b..40bcc308f28 100644 --- a/extensions/theme-defaults/themes/dark_vs.json +++ b/extensions/theme-defaults/themes/dark_vs.json @@ -302,8 +302,8 @@ }, { "scope": [ - "punctuation.section.embedded.begin.metatag.php", - "punctuation.section.embedded.end.metatag.php" + "punctuation.section.embedded.begin.php", + "punctuation.section.embedded.end.php" ], "settings": { "foreground": "#569cd6" diff --git a/extensions/theme-defaults/themes/light_vs.json b/extensions/theme-defaults/themes/light_vs.json index b97b25eecd8..8d5fabb13a3 100644 --- a/extensions/theme-defaults/themes/light_vs.json +++ b/extensions/theme-defaults/themes/light_vs.json @@ -318,8 +318,8 @@ }, { "scope": [ - "punctuation.section.embedded.begin.metatag.php", - "punctuation.section.embedded.end.metatag.php" + "punctuation.section.embedded.begin.php", + "punctuation.section.embedded.end.php" ], "settings": { "foreground": "#800000" From 2787e333385a2798082bbe0256c06bd8f7e622f3 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 12 May 2017 17:03:25 +0200 Subject: [PATCH 0403/1164] #16580 Show open settings only for appropriate errors - File dirty - Errors in file --- .../electron-browser/themes.contribution.ts | 1 - .../node/configurationEditingService.ts | 32 +++++++++++++------ 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts b/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts index 8ae5925e78b..9724e10c4ae 100644 --- a/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts +++ b/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts @@ -65,7 +65,6 @@ export class SelectColorThemeAction extends Action { this.themeService.setColorTheme(theme.id, target).done(null, err => { - this.messageService.show(Severity.Info, localize('problemChangingTheme', "Problem setting theme: {0}", err)); this.themeService.setColorTheme(currentTheme.id, null); } ); diff --git a/src/vs/workbench/services/configuration/node/configurationEditingService.ts b/src/vs/workbench/services/configuration/node/configurationEditingService.ts index 022f5fb0226..cbafdb6f2fc 100644 --- a/src/vs/workbench/services/configuration/node/configurationEditingService.ts +++ b/src/vs/workbench/services/configuration/node/configurationEditingService.ts @@ -29,7 +29,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IConfigurationEditingService, ConfigurationEditingErrorCode, IConfigurationEditingError, ConfigurationTarget, IConfigurationValue } from 'vs/workbench/services/configuration/common/configurationEditing'; import { ITextModelResolverService, ITextEditorModel } from 'vs/editor/common/services/resolverService'; import { OVERRIDE_PROPERTY_PATTERN } from 'vs/platform/configuration/common/configurationRegistry'; -import { IChoiceService, Severity } from 'vs/platform/message/common/message'; +import { IChoiceService, IMessageService, Severity } from 'vs/platform/message/common/message'; import { ICommandService } from 'vs/platform/commands/common/commands'; interface IConfigurationEditOperation extends IConfigurationValue { @@ -56,6 +56,7 @@ export class ConfigurationEditingService implements IConfigurationEditingService @ITextModelResolverService private textModelResolverService: ITextModelResolverService, @ITextFileService private textFileService: ITextFileService, @IChoiceService private choiceService: IChoiceService, + @IMessageService private messageService: IMessageService, @ICommandService private commandService: ICommandService ) { this.queue = new Queue(); @@ -97,16 +98,27 @@ export class ConfigurationEditingService implements IConfigurationEditingService } private onError(error: IConfigurationEditingError, target: ConfigurationTarget): TPromise { - this.choiceService.choose(Severity.Error, error.message, [nls.localize('open', "Open Settings"), nls.localize('close', "Close")], 1) - .then(value => { - switch (value) { - case 0: - this.commandService.executeCommand(ConfigurationTarget.USER === target ? 'workbench.action.openGlobalSettings' : 'workbench.action.openWorkspaceSettings'); - } - }); + switch (error.code) { + case ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION: + case ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY: + this.choiceService.choose(Severity.Error, error.message, [nls.localize('open', "Open Settings"), nls.localize('close', "Close")], 1) + .then(option => { + switch (option) { + case 0: + this.openSettings(target); + } + }); + break; + default: + this.messageService.show(Severity.Error, error.message); + } return TPromise.wrapError(error); } + private openSettings(target: ConfigurationTarget): void { + this.commandService.executeCommand(ConfigurationTarget.USER === target ? 'workbench.action.openGlobalSettings' : 'workbench.action.openWorkspaceSettings'); + } + private wrapError(code: ConfigurationEditingErrorCode, target: ConfigurationTarget): TPromise { const message = this.toErrorMessage(code, target); @@ -180,7 +192,7 @@ export class ConfigurationEditingService implements IConfigurationEditingService return parseErrors.length > 0; } - private resolveAndValidate(target: ConfigurationTarget, operation: IConfigurationEditOperation, save: boolean): TPromise> { + private resolveAndValidate(target: ConfigurationTarget, operation: IConfigurationEditOperation, checkDirty: boolean): TPromise> { // Any key must be a known setting from the registry (unless this is a standalone config) if (!operation.isWorkspaceStandalone) { @@ -202,7 +214,7 @@ export class ConfigurationEditingService implements IConfigurationEditingService // Target cannot be dirty if not writing into buffer const resource = operation.resource; - if (save && this.textFileService.isDirty(resource)) { + if (checkDirty && this.textFileService.isDirty(resource)) { return this.wrapError(ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY, target); } From 8c7a5a4564ff5209bb3a7886664e62eff9038c56 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 12 May 2017 17:13:15 +0200 Subject: [PATCH 0404/1164] #16580 fix tests --- .../test/node/configurationEditingService.test.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts b/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts index 8e0131f17a4..3a53e2a1de2 100644 --- a/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts +++ b/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts @@ -42,7 +42,7 @@ import { IModeService } from 'vs/editor/common/services/modeService'; import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl'; import { IModelService } from 'vs/editor/common/services/modelService'; import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; - +import { IChoiceService, IMessageService } from 'vs/platform/message/common/message'; class SettingsTestEnvironmentService extends EnvironmentService { @@ -126,6 +126,14 @@ suite('ConfigurationEditingService', () => { instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); instantiationService.stub(ITextModelResolverService, instantiationService.createInstance(TextModelResolverService)); instantiationService.stub(IBackupFileService, new TestBackupFileService()); + instantiationService.stub(IChoiceService, { + choose: (severity, message, options, cancelId): TPromise => { + return TPromise.as(cancelId); + } + }); + instantiationService.stub(IMessageService, { + show: (severity, message, options, cancelId): void => { } + }); testObject = instantiationService.createInstance(ConfigurationEditingService); return configurationService.initialize(); From 2d6f1fd24b425be83c87f62dddf2efbe73ee84f1 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 12 May 2017 17:17:30 +0200 Subject: [PATCH 0405/1164] tfs: linux build exec bit --- build/tfs/linux/build-x64.sh | 0 build/tfs/linux/build.sh | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 build/tfs/linux/build-x64.sh mode change 100644 => 100755 build/tfs/linux/build.sh diff --git a/build/tfs/linux/build-x64.sh b/build/tfs/linux/build-x64.sh old mode 100644 new mode 100755 diff --git a/build/tfs/linux/build.sh b/build/tfs/linux/build.sh old mode 100644 new mode 100755 From 414a28c19c005e4666cec3f92313e27a350a095d Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 12 May 2017 17:43:35 +0200 Subject: [PATCH 0406/1164] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9ed66ec3a04..e2494bd6b0d 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "code-oss-dev", "version": "1.13.0", "electronVersion": "1.6.6", - "distro": "e040c79dac021045cd488b8192515113014d67d4", + "distro": "299457aa71fc00d449a7d85f18289203a14065ef", "author": { "name": "Microsoft Corporation" }, From 5f7b56d27cf3c93361d258cc04582f49a6cbed24 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 12 May 2017 18:03:53 +0200 Subject: [PATCH 0407/1164] move emmet to electron-browser, make it use new controller --- .../editor/contrib/snippet/common/snippet.ts | 62 ++++++++++++++++++- .../contrib/snippet/common/snippetParser.ts | 7 --- .../electron-browser/workbench.main.ts | 2 +- .../actions/balance.ts | 2 +- .../actions/base64.ts | 2 +- .../actions/editPoints.ts | 2 +- .../actions/evaluateMath.ts | 2 +- .../actions/expandAbbreviation.ts | 2 +- .../actions/incrementDecrement.ts | 2 +- .../actions/matchingPair.ts | 2 +- .../actions/mergeLines.ts | 2 +- .../actions/reflectCssValue.ts | 2 +- .../actions/removeTag.ts | 2 +- .../actions/selectItem.ts | 2 +- .../actions/splitJoinTag.ts | 2 +- .../actions/toggleComment.ts | 2 +- .../actions/updateImageSize.ts | 2 +- .../actions/updateTag.ts | 2 +- .../actions/wrapWithAbbreviation.ts | 2 +- .../editorAccessor.ts | 13 +++- .../emmet.contribution.ts | 0 .../{node => electron-browser}/emmet.d.ts | 0 .../emmetActions.ts | 2 +- .../editorAccessor.test.ts | 2 +- 24 files changed, 90 insertions(+), 30 deletions(-) rename src/vs/workbench/parts/emmet/{node => electron-browser}/actions/balance.ts (96%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/actions/base64.ts (98%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/actions/editPoints.ts (97%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/actions/evaluateMath.ts (96%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/actions/expandAbbreviation.ts (98%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/actions/incrementDecrement.ts (98%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/actions/matchingPair.ts (96%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/actions/mergeLines.ts (95%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/actions/reflectCssValue.ts (96%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/actions/removeTag.ts (95%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/actions/selectItem.ts (97%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/actions/splitJoinTag.ts (95%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/actions/toggleComment.ts (96%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/actions/updateImageSize.ts (96%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/actions/updateTag.ts (97%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/actions/wrapWithAbbreviation.ts (97%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/editorAccessor.ts (95%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/emmet.contribution.ts (100%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/emmet.d.ts (100%) rename src/vs/workbench/parts/emmet/{node => electron-browser}/emmetActions.ts (99%) rename src/vs/workbench/parts/emmet/test/{node => electron-browser}/editorAccessor.test.ts (98%) diff --git a/src/vs/editor/contrib/snippet/common/snippet.ts b/src/vs/editor/contrib/snippet/common/snippet.ts index b9049993493..84c1b1490ef 100644 --- a/src/vs/editor/contrib/snippet/common/snippet.ts +++ b/src/vs/editor/contrib/snippet/common/snippet.ts @@ -7,7 +7,7 @@ import * as strings from 'vs/base/common/strings'; import { Range } from 'vs/editor/common/core/range'; -import { Marker, Variable, Placeholder, Text, SnippetParser } from 'vs/editor/contrib/snippet/common/snippetParser'; +import { Marker, Variable, Placeholder, Text, SnippetParser, walk } from 'vs/editor/contrib/snippet/common/snippetParser'; export interface IIndentationNormalizer { normalizeIndentation(str: string): string; @@ -52,7 +52,67 @@ export class CodeSnippet implements ICodeSnippet { return snippet; } + static fixEmmetFinalTabstop(template: string): string { + + let matchFinalStops = template.match(/\$\{0\}|\$0/g); + if (!matchFinalStops || matchFinalStops.length === 1) { + return template; + } + + // string to string conversion that tries to fix the + // snippet in-place + + let marker = new SnippetParser(true, false).parse(template); + let maxIndex = -Number.MIN_VALUE; + + // find highest placeholder index + walk(marker, candidate => { + if (candidate instanceof Placeholder) { + let index = Number(candidate.index); + if (index > maxIndex) { + maxIndex = index; + } + } + return true; + }); + + // rewrite final tabstops + walk(marker, candidate => { + if (candidate instanceof Placeholder) { + if (candidate.isFinalTabstop) { + candidate.index = String(++maxIndex); + } + } + return true; + }); + + // write back as string + function toSnippetString(marker: Marker): string { + if (marker instanceof Text) { + return marker.string; + } else if (marker instanceof Placeholder) { + if (marker.defaultValue.length > 0) { + return `\${${marker.index}:${marker.defaultValue.map(toSnippetString).join('')}}`; + } else { + return `\$${marker.index}`; + } + } else if (marker instanceof Variable) { + if (marker.defaultValue.length > 0) { + return `\${${marker.name}:${marker.defaultValue.map(toSnippetString).join('')}}`; + } else { + return `\$${marker.name}`; + } + } else { + throw new Error('unexpected marker: ' + marker); + } + } + return marker.map(toSnippetString).join(''); + } + static fromEmmet(template: string): CodeSnippet { + + CodeSnippet.fixEmmetFinalTabstop(template); + let matchFinalStops = template.match(/\$\{0\}|\$0/g); if (!matchFinalStops || matchFinalStops.length === 1) { return CodeSnippet.fromTextmate(template); diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/common/snippetParser.ts index ac384b0106e..0506b2b187b 100644 --- a/src/vs/editor/contrib/snippet/common/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/common/snippetParser.ts @@ -156,13 +156,6 @@ export class Text extends Marker { len(): number { return this.string.length; } - with(string: string): Text { - if (this.string !== string) { - return new Text(string); - } else { - return this; - } - } } export class Placeholder extends Marker { diff --git a/src/vs/workbench/electron-browser/workbench.main.ts b/src/vs/workbench/electron-browser/workbench.main.ts index 59d932b5644..d0d2f6888e9 100644 --- a/src/vs/workbench/electron-browser/workbench.main.ts +++ b/src/vs/workbench/electron-browser/workbench.main.ts @@ -81,7 +81,7 @@ import 'vs/workbench/parts/relauncher/electron-browser/relauncher.contribution'; import 'vs/workbench/parts/tasks/electron-browser/task.contribution'; import 'vs/workbench/parts/emmet/browser/emmet.browser.contribution'; -import 'vs/workbench/parts/emmet/node/emmet.contribution'; +import 'vs/workbench/parts/emmet/electron-browser/emmet.contribution'; // Code Editor enhacements import 'vs/workbench/parts/codeEditor/codeEditor.contribution'; diff --git a/src/vs/workbench/parts/emmet/node/actions/balance.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/balance.ts similarity index 96% rename from src/vs/workbench/parts/emmet/node/actions/balance.ts rename to src/vs/workbench/parts/emmet/electron-browser/actions/balance.ts index 73e410694a3..10f58a6a5c2 100644 --- a/src/vs/workbench/parts/emmet/node/actions/balance.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/balance.ts @@ -6,7 +6,7 @@ 'use strict'; import nls = require('vs/nls'); -import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/node/emmetActions'; +import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; import { editorAction } from 'vs/editor/common/editorCommonExtensions'; diff --git a/src/vs/workbench/parts/emmet/node/actions/base64.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/base64.ts similarity index 98% rename from src/vs/workbench/parts/emmet/node/actions/base64.ts rename to src/vs/workbench/parts/emmet/electron-browser/actions/base64.ts index 5aef2083c34..2cf45dbd7f7 100644 --- a/src/vs/workbench/parts/emmet/node/actions/base64.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/base64.ts @@ -11,7 +11,7 @@ import { fileExists } from 'vs/base/node/pfs'; import fs = require('fs'); import { dirname, join, normalize, isValidBasename } from 'vs/base/common/paths'; -import { EmmetEditorAction, EmmetActionContext } from 'vs/workbench/parts/emmet/node/emmetActions'; +import { EmmetEditorAction, EmmetActionContext } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; import { Action } from 'vs/base/common/actions'; import { ServicesAccessor, editorAction } from 'vs/editor/common/editorCommonExtensions'; diff --git a/src/vs/workbench/parts/emmet/node/actions/editPoints.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.ts similarity index 97% rename from src/vs/workbench/parts/emmet/node/actions/editPoints.ts rename to src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.ts index aa89a2d9d7a..d74d9e32771 100644 --- a/src/vs/workbench/parts/emmet/node/actions/editPoints.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.ts @@ -6,7 +6,7 @@ 'use strict'; import nls = require('vs/nls'); -import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/node/emmetActions'; +import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; import { editorAction } from 'vs/editor/common/editorCommonExtensions'; diff --git a/src/vs/workbench/parts/emmet/node/actions/evaluateMath.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.ts similarity index 96% rename from src/vs/workbench/parts/emmet/node/actions/evaluateMath.ts rename to src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.ts index df8a9de1bc3..5eb52a5b5c1 100644 --- a/src/vs/workbench/parts/emmet/node/actions/evaluateMath.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.ts @@ -6,7 +6,7 @@ 'use strict'; import nls = require('vs/nls'); -import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/node/emmetActions'; +import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; import { editorAction } from 'vs/editor/common/editorCommonExtensions'; diff --git a/src/vs/workbench/parts/emmet/node/actions/expandAbbreviation.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts similarity index 98% rename from src/vs/workbench/parts/emmet/node/actions/expandAbbreviation.ts rename to src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts index 75f7ae270f3..85f464b2865 100644 --- a/src/vs/workbench/parts/emmet/node/actions/expandAbbreviation.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts @@ -6,7 +6,7 @@ 'use strict'; import nls = require('vs/nls'); -import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/node/emmetActions'; +import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; import { editorAction } from 'vs/editor/common/editorCommonExtensions'; import { Handler, ICommonCodeEditor } from 'vs/editor/common/editorCommon'; diff --git a/src/vs/workbench/parts/emmet/node/actions/incrementDecrement.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.ts similarity index 98% rename from src/vs/workbench/parts/emmet/node/actions/incrementDecrement.ts rename to src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.ts index 44db17292f1..527820f3126 100644 --- a/src/vs/workbench/parts/emmet/node/actions/incrementDecrement.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.ts @@ -6,7 +6,7 @@ 'use strict'; import nls = require('vs/nls'); -import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/node/emmetActions'; +import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; import { editorAction } from 'vs/editor/common/editorCommonExtensions'; diff --git a/src/vs/workbench/parts/emmet/node/actions/matchingPair.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.ts similarity index 96% rename from src/vs/workbench/parts/emmet/node/actions/matchingPair.ts rename to src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.ts index 707709b439a..4dea6318bd2 100644 --- a/src/vs/workbench/parts/emmet/node/actions/matchingPair.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.ts @@ -6,7 +6,7 @@ 'use strict'; import nls = require('vs/nls'); -import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/node/emmetActions'; +import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; import { editorAction } from 'vs/editor/common/editorCommonExtensions'; diff --git a/src/vs/workbench/parts/emmet/node/actions/mergeLines.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.ts similarity index 95% rename from src/vs/workbench/parts/emmet/node/actions/mergeLines.ts rename to src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.ts index e90f53a5bb8..9333f8b8053 100644 --- a/src/vs/workbench/parts/emmet/node/actions/mergeLines.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.ts @@ -6,7 +6,7 @@ 'use strict'; import nls = require('vs/nls'); -import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/node/emmetActions'; +import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; import { editorAction } from 'vs/editor/common/editorCommonExtensions'; diff --git a/src/vs/workbench/parts/emmet/node/actions/reflectCssValue.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.ts similarity index 96% rename from src/vs/workbench/parts/emmet/node/actions/reflectCssValue.ts rename to src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.ts index 8683775c625..405a3585fd8 100644 --- a/src/vs/workbench/parts/emmet/node/actions/reflectCssValue.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.ts @@ -6,7 +6,7 @@ 'use strict'; import nls = require('vs/nls'); -import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/node/emmetActions'; +import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; import { editorAction } from 'vs/editor/common/editorCommonExtensions'; diff --git a/src/vs/workbench/parts/emmet/node/actions/removeTag.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.ts similarity index 95% rename from src/vs/workbench/parts/emmet/node/actions/removeTag.ts rename to src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.ts index b24c78755bd..076be1ef8df 100644 --- a/src/vs/workbench/parts/emmet/node/actions/removeTag.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.ts @@ -6,7 +6,7 @@ 'use strict'; import nls = require('vs/nls'); -import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/node/emmetActions'; +import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; import { editorAction } from 'vs/editor/common/editorCommonExtensions'; diff --git a/src/vs/workbench/parts/emmet/node/actions/selectItem.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.ts similarity index 97% rename from src/vs/workbench/parts/emmet/node/actions/selectItem.ts rename to src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.ts index b22d4f4765c..f301c1a6e3a 100644 --- a/src/vs/workbench/parts/emmet/node/actions/selectItem.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.ts @@ -6,7 +6,7 @@ 'use strict'; import nls = require('vs/nls'); -import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/node/emmetActions'; +import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; import { editorAction } from 'vs/editor/common/editorCommonExtensions'; diff --git a/src/vs/workbench/parts/emmet/node/actions/splitJoinTag.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.ts similarity index 95% rename from src/vs/workbench/parts/emmet/node/actions/splitJoinTag.ts rename to src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.ts index eb0a7115473..b26d13b1c03 100644 --- a/src/vs/workbench/parts/emmet/node/actions/splitJoinTag.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.ts @@ -6,7 +6,7 @@ 'use strict'; import nls = require('vs/nls'); -import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/node/emmetActions'; +import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; import { editorAction } from 'vs/editor/common/editorCommonExtensions'; diff --git a/src/vs/workbench/parts/emmet/node/actions/toggleComment.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.ts similarity index 96% rename from src/vs/workbench/parts/emmet/node/actions/toggleComment.ts rename to src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.ts index 4d7f164cecb..4eb599b30ff 100644 --- a/src/vs/workbench/parts/emmet/node/actions/toggleComment.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.ts @@ -6,7 +6,7 @@ 'use strict'; import nls = require('vs/nls'); -import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/node/emmetActions'; +import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; import { editorAction } from 'vs/editor/common/editorCommonExtensions'; diff --git a/src/vs/workbench/parts/emmet/node/actions/updateImageSize.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.ts similarity index 96% rename from src/vs/workbench/parts/emmet/node/actions/updateImageSize.ts rename to src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.ts index 1583dae99a3..c165ff518ab 100644 --- a/src/vs/workbench/parts/emmet/node/actions/updateImageSize.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.ts @@ -6,7 +6,7 @@ 'use strict'; import nls = require('vs/nls'); -import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/node/emmetActions'; +import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; import { editorAction } from 'vs/editor/common/editorCommonExtensions'; diff --git a/src/vs/workbench/parts/emmet/node/actions/updateTag.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.ts similarity index 97% rename from src/vs/workbench/parts/emmet/node/actions/updateTag.ts rename to src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.ts index 463d711f4f0..914f3bd64e2 100644 --- a/src/vs/workbench/parts/emmet/node/actions/updateTag.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.ts @@ -6,7 +6,7 @@ 'use strict'; import nls = require('vs/nls'); -import { EmmetEditorAction, EmmetActionContext } from 'vs/workbench/parts/emmet/node/emmetActions'; +import { EmmetEditorAction, EmmetActionContext } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; import { ServicesAccessor, editorAction } from 'vs/editor/common/editorCommonExtensions'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; diff --git a/src/vs/workbench/parts/emmet/node/actions/wrapWithAbbreviation.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.ts similarity index 97% rename from src/vs/workbench/parts/emmet/node/actions/wrapWithAbbreviation.ts rename to src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.ts index 16e571f45ed..ab7d540a331 100644 --- a/src/vs/workbench/parts/emmet/node/actions/wrapWithAbbreviation.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.ts @@ -6,7 +6,7 @@ 'use strict'; import nls = require('vs/nls'); -import { EmmetEditorAction, EmmetActionContext } from 'vs/workbench/parts/emmet/node/emmetActions'; +import { EmmetEditorAction, EmmetActionContext } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; import { ServicesAccessor, editorAction } from 'vs/editor/common/editorCommonExtensions'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; diff --git a/src/vs/workbench/parts/emmet/node/editorAccessor.ts b/src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts similarity index 95% rename from src/vs/workbench/parts/emmet/node/editorAccessor.ts rename to src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts index 480bf4e8f64..15079c88a2c 100644 --- a/src/vs/workbench/parts/emmet/node/editorAccessor.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts @@ -9,7 +9,7 @@ import { ICommonCodeEditor, Handler } from 'vs/editor/common/editorCommon'; import strings = require('vs/base/common/strings'); import snippets = require('vs/editor/contrib/snippet/common/snippet'); import { Range } from 'vs/editor/common/core/range'; -import { SnippetController } from 'vs/editor/contrib/snippet/common/snippetController'; +import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { LanguageId, LanguageIdentifier } from 'vs/editor/common/modes'; import { Position } from 'vs/editor/common/core/position'; @@ -92,8 +92,15 @@ export class EditorAccessor implements emmet.Editor { if (!range) { return; } - let codeSnippet = snippets.CodeSnippet.fromEmmet(value); - SnippetController.get(this._editor).runWithReplaceRange(codeSnippet, range); + + const tweakedValue = snippets.CodeSnippet.fixEmmetFinalTabstop(value); + + // let selection define the typing range + this._editor.setSelection(range); + SnippetController2.get(this._editor).insert(tweakedValue); + + // let codeSnippet = snippets.CodeSnippet.fromEmmet(value); + // SnippetController.get(this._editor).runWithReplaceRange(codeSnippet, range); } public getRangeToReplace(value: string, start: number, end: number): Range { diff --git a/src/vs/workbench/parts/emmet/node/emmet.contribution.ts b/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.ts similarity index 100% rename from src/vs/workbench/parts/emmet/node/emmet.contribution.ts rename to src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.ts diff --git a/src/vs/workbench/parts/emmet/node/emmet.d.ts b/src/vs/workbench/parts/emmet/electron-browser/emmet.d.ts similarity index 100% rename from src/vs/workbench/parts/emmet/node/emmet.d.ts rename to src/vs/workbench/parts/emmet/electron-browser/emmet.d.ts diff --git a/src/vs/workbench/parts/emmet/node/emmetActions.ts b/src/vs/workbench/parts/emmet/electron-browser/emmetActions.ts similarity index 99% rename from src/vs/workbench/parts/emmet/node/emmetActions.ts rename to src/vs/workbench/parts/emmet/electron-browser/emmetActions.ts index 9f5b8e089b7..d73bc725327 100644 --- a/src/vs/workbench/parts/emmet/node/emmetActions.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/emmetActions.ts @@ -13,7 +13,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { grammarsExtPoint, ITMSyntaxExtensionPoint } from 'vs/editor/node/textMate/TMGrammars'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { EditorAccessor, IGrammarContributions } from 'vs/workbench/parts/emmet/node/editorAccessor'; +import { EditorAccessor, IGrammarContributions } from 'vs/workbench/parts/emmet/electron-browser/editorAccessor'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IExtensionService, ExtensionPointContribution } from 'vs/platform/extensions/common/extensions'; import { IMessageService } from 'vs/platform/message/common/message'; diff --git a/src/vs/workbench/parts/emmet/test/node/editorAccessor.test.ts b/src/vs/workbench/parts/emmet/test/electron-browser/editorAccessor.test.ts similarity index 98% rename from src/vs/workbench/parts/emmet/test/node/editorAccessor.test.ts rename to src/vs/workbench/parts/emmet/test/electron-browser/editorAccessor.test.ts index 7374c917f28..f395f892499 100644 --- a/src/vs/workbench/parts/emmet/test/node/editorAccessor.test.ts +++ b/src/vs/workbench/parts/emmet/test/electron-browser/editorAccessor.test.ts @@ -5,7 +5,7 @@ 'use strict'; -import { EditorAccessor, ILanguageIdentifierResolver, IGrammarContributions } from 'vs/workbench/parts/emmet/node/editorAccessor'; +import { EditorAccessor, ILanguageIdentifierResolver, IGrammarContributions } from 'vs/workbench/parts/emmet/electron-browser/editorAccessor'; import { withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; import assert = require('assert'); import { LanguageId, LanguageIdentifier } from 'vs/editor/common/modes'; From 0756b0d146639f8f8e1269745fc7742e8e36ae8b Mon Sep 17 00:00:00 2001 From: Fernando Tolentino Date: Fri, 12 May 2017 13:51:33 -0300 Subject: [PATCH 0408/1164] Intelli-sense in extensions file --- .../configuration-editing/src/extension.ts | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/extensions/configuration-editing/src/extension.ts b/extensions/configuration-editing/src/extension.ts index 30a1da21e55..f41e74fc735 100644 --- a/extensions/configuration-editing/src/extension.ts +++ b/extensions/configuration-editing/src/extension.ts @@ -24,6 +24,9 @@ export function activate(context): void { //settings.json suggestions context.subscriptions.push(registerSettingsCompletions()); + //extensions.json suggestions + context.subscriptions.push(registerExtensionsCompletions()); + // launch.json decorations context.subscriptions.push(vscode.window.onDidChangeActiveTextEditor(editor => updateLaunchJsonDecorations(editor), null, context.subscriptions)); context.subscriptions.push(vscode.workspace.onDidChangeTextDocument(event => { @@ -61,11 +64,25 @@ function registerSettingsCompletions(): vscode.Disposable { }); } -function newSimpleCompletionItem(text: string, range: vscode.Range, description?: string): vscode.CompletionItem { +function registerExtensionsCompletions(): vscode.Disposable { + return vscode.languages.registerCompletionItemProvider({ pattern: '**/extensions.json' }, { + provideCompletionItems(document, position, token) { + const location = getLocation(document.getText(), document.offsetAt(position)); + const range = document.getWordRangeAtPosition(position) || new vscode.Range(position, position); + if (location.path[0] === 'recommendations') { + return vscode.extensions.all + .filter(e => !e.id.startsWith('vscode.')) + .map(e => newSimpleCompletionItem(e.id, range, undefined, '"' + e.id + '"')); + } + } + }); +} + +function newSimpleCompletionItem(text: string, range: vscode.Range, description?: string, insertText?: string): vscode.CompletionItem { const item = new vscode.CompletionItem(text); item.kind = vscode.CompletionItemKind.Value; item.detail = description; - item.insertText = text; + item.insertText = insertText || text; item.range = range; return item; From 6560c871e30438a55bd522be802a7d989db4a63e Mon Sep 17 00:00:00 2001 From: Daniel Ye Date: Fri, 12 May 2017 15:20:06 -0700 Subject: [PATCH 0409/1164] 2017-05-12. Merged in translations. --- .../chs/extensions/git/out/commands.i18n.json | 2 ++ ...rectiveCommentCompletionProvider.i18n.json | 10 ++++++++++ .../extensions/typescript/package.i18n.json | 2 +- .../base/common/jsonErrorMessages.i18n.json | 6 ++++++ .../src/vs/code/electron-main/menus.i18n.json | 1 - .../common/config/editorOptions.i18n.json | 8 ++++++++ .../common/view/editorColorRegistry.i18n.json | 4 +++- .../contrib/hover/browser/hover.i18n.json | 5 +---- .../browser/referencesWidget.i18n.json | 2 -- .../suggest/browser/suggestWidget.i18n.json | 2 -- .../menusExtensionPoint.i18n.json | 1 + .../theme/common/colorRegistry.i18n.json | 6 +++--- .../mainThreadExtensionService.i18n.json | 6 ++++++ .../mainThreadMessageService.i18n.json | 6 ++++++ .../api/node/extHostExplorerView.i18n.json | 9 +++++++++ .../browser/actions/configureLocale.i18n.json | 2 +- .../src/vs/workbench/common/theme.i18n.json | 6 ------ .../main.contribution.i18n.json | 2 +- .../debug/browser/debugActions.i18n.json | 1 + .../debug/browser/linkDetector.i18n.json | 9 +++++++++ .../parts/debug/common/debug.i18n.json | 8 ++++++++ .../electron-browser/debugCommands.i18n.json | 8 ++++++++ .../electron-browser/replViewer.i18n.json | 2 -- .../parts/debug/node/debugAdapter.i18n.json | 3 +-- .../extensionTipsService.i18n.json | 5 ++++- .../extensions.contribution.i18n.json | 3 ++- .../browser/files.contribution.i18n.json | 4 ++-- .../browser/searchResultsView.i18n.json | 4 +--- .../task.contribution.i18n.json | 2 +- .../terminalColorRegistry.i18n.json | 2 ++ .../themes.contribution.i18n.json | 1 - .../configurationEditingService.i18n.json | 7 +------ .../keybindingService.i18n.json | 3 --- .../cht/extensions/git/out/commands.i18n.json | 2 ++ ...rectiveCommentCompletionProvider.i18n.json | 6 ++++++ .../extensions/typescript/package.i18n.json | 1 - .../base/common/jsonErrorMessages.i18n.json | 6 ++++++ .../src/vs/code/electron-main/menus.i18n.json | 1 - .../config/commonEditorConfig.i18n.json | 1 + .../common/config/editorOptions.i18n.json | 8 ++++++++ .../contrib/hover/browser/hover.i18n.json | 5 +---- .../browser/referencesWidget.i18n.json | 2 -- .../suggest/browser/suggestWidget.i18n.json | 2 -- .../menusExtensionPoint.i18n.json | 1 - .../theme/common/colorRegistry.i18n.json | 7 ++++--- .../mainThreadExtensionService.i18n.json | 6 ++++++ .../mainThreadMessageService.i18n.json | 6 ++++++ .../api/node/extHostExplorerView.i18n.json | 9 +++++++++ .../browser/actions/configureLocale.i18n.json | 1 - .../src/vs/workbench/common/theme.i18n.json | 6 ------ .../main.contribution.i18n.json | 1 - .../debug/browser/linkDetector.i18n.json | 9 +++++++++ .../parts/debug/common/debug.i18n.json | 8 ++++++++ .../electron-browser/debugCommands.i18n.json | 6 ++++++ .../electron-browser/replViewer.i18n.json | 2 -- .../parts/debug/node/debugAdapter.i18n.json | 2 -- .../extensionTipsService.i18n.json | 4 +++- .../browser/files.contribution.i18n.json | 2 -- .../browser/searchResultsView.i18n.json | 4 +--- .../task.contribution.i18n.json | 1 - .../themes.contribution.i18n.json | 1 - .../configurationEditingService.i18n.json | 7 +------ .../keybindingService.i18n.json | 3 --- .../deu/extensions/git/out/commands.i18n.json | 2 ++ i18n/deu/extensions/git/package.i18n.json | 4 ++-- ...rectiveCommentCompletionProvider.i18n.json | 6 ++++++ .../extensions/typescript/package.i18n.json | 1 - .../base/common/jsonErrorMessages.i18n.json | 6 ++++++ .../src/vs/code/electron-main/menus.i18n.json | 1 - .../config/commonEditorConfig.i18n.json | 1 + .../common/config/editorOptions.i18n.json | 8 ++++++++ .../contrib/hover/browser/hover.i18n.json | 5 +---- .../browser/referencesWidget.i18n.json | 2 -- .../suggest/browser/suggestWidget.i18n.json | 2 -- .../theme/common/colorRegistry.i18n.json | 6 +++--- .../mainThreadExtensionService.i18n.json | 6 ++++++ .../mainThreadMessageService.i18n.json | 6 ++++++ .../api/node/extHostExplorerView.i18n.json | 9 +++++++++ .../browser/actions/configureLocale.i18n.json | 1 - .../src/vs/workbench/common/theme.i18n.json | 6 ------ .../main.contribution.i18n.json | 1 - .../debug/browser/linkDetector.i18n.json | 9 +++++++++ .../parts/debug/common/debug.i18n.json | 8 ++++++++ .../electron-browser/debugCommands.i18n.json | 6 ++++++ .../electron-browser/replViewer.i18n.json | 2 -- .../parts/debug/node/debugAdapter.i18n.json | 2 -- .../extensionTipsService.i18n.json | 4 +++- .../browser/files.contribution.i18n.json | 2 -- .../browser/searchResultsView.i18n.json | 4 +--- .../task.contribution.i18n.json | 1 - .../themes.contribution.i18n.json | 1 - .../configurationEditingService.i18n.json | 7 +------ .../keybindingService.i18n.json | 3 --- .../esn/extensions/git/out/commands.i18n.json | 2 ++ ...rectiveCommentCompletionProvider.i18n.json | 6 ++++++ .../extensions/typescript/package.i18n.json | 1 - .../base/common/jsonErrorMessages.i18n.json | 6 ++++++ .../src/vs/code/electron-main/menus.i18n.json | 2 +- .../common/config/editorOptions.i18n.json | 8 ++++++++ .../common/view/editorColorRegistry.i18n.json | 4 +++- .../contrib/hover/browser/hover.i18n.json | 5 +---- .../browser/referencesWidget.i18n.json | 2 -- .../suggest/browser/suggestWidget.i18n.json | 2 -- .../theme/common/colorRegistry.i18n.json | 6 +++--- .../mainThreadExtensionService.i18n.json | 6 ++++++ .../mainThreadMessageService.i18n.json | 6 ++++++ .../api/node/extHostExplorerView.i18n.json | 9 +++++++++ .../browser/actions/configureLocale.i18n.json | 2 +- .../src/vs/workbench/common/theme.i18n.json | 6 ------ .../main.contribution.i18n.json | 2 +- .../debug/browser/linkDetector.i18n.json | 9 +++++++++ .../parts/debug/common/debug.i18n.json | 8 ++++++++ .../electron-browser/debugCommands.i18n.json | 6 ++++++ .../electron-browser/replViewer.i18n.json | 2 -- .../parts/debug/node/debugAdapter.i18n.json | 3 +-- .../extensionTipsService.i18n.json | 6 +++++- .../extensions.contribution.i18n.json | 3 ++- .../browser/files.contribution.i18n.json | 4 ++-- .../browser/searchResultsView.i18n.json | 4 +--- .../terminalColorRegistry.i18n.json | 2 ++ .../themes.contribution.i18n.json | 1 - .../configurationEditingService.i18n.json | 7 +------ .../keybindingService.i18n.json | 3 --- .../fra/extensions/git/out/commands.i18n.json | 2 ++ ...rectiveCommentCompletionProvider.i18n.json | 6 ++++++ .../extensions/typescript/package.i18n.json | 1 - .../base/common/jsonErrorMessages.i18n.json | 6 ++++++ .../src/vs/code/electron-main/menus.i18n.json | 1 - .../common/config/editorOptions.i18n.json | 8 ++++++++ .../contrib/hover/browser/hover.i18n.json | 5 +---- .../browser/referencesWidget.i18n.json | 2 -- .../suggest/browser/suggestWidget.i18n.json | 2 -- .../theme/common/colorRegistry.i18n.json | 6 +++--- .../mainThreadExtensionService.i18n.json | 6 ++++++ .../mainThreadMessageService.i18n.json | 6 ++++++ .../api/node/extHostExplorerView.i18n.json | 9 +++++++++ .../browser/actions/configureLocale.i18n.json | 1 - .../src/vs/workbench/common/theme.i18n.json | 6 ------ .../main.contribution.i18n.json | 1 - .../debug/browser/linkDetector.i18n.json | 9 +++++++++ .../parts/debug/common/debug.i18n.json | 8 ++++++++ .../electron-browser/debugCommands.i18n.json | 6 ++++++ .../electron-browser/replViewer.i18n.json | 2 -- .../parts/debug/node/debugAdapter.i18n.json | 2 -- .../extensionTipsService.i18n.json | 4 +++- .../browser/files.contribution.i18n.json | 2 -- .../browser/searchResultsView.i18n.json | 4 +--- .../task.contribution.i18n.json | 1 - .../themes.contribution.i18n.json | 1 - .../configurationEditingService.i18n.json | 7 +------ .../keybindingService.i18n.json | 3 --- .../ita/extensions/git/out/commands.i18n.json | 2 ++ ...rectiveCommentCompletionProvider.i18n.json | 6 ++++++ .../extensions/typescript/package.i18n.json | 1 - .../base/common/jsonErrorMessages.i18n.json | 6 ++++++ .../src/vs/code/electron-main/menus.i18n.json | 1 - .../common/config/editorOptions.i18n.json | 8 ++++++++ .../contrib/hover/browser/hover.i18n.json | 5 +---- .../browser/referencesWidget.i18n.json | 2 -- .../suggest/browser/suggestWidget.i18n.json | 2 -- .../theme/common/colorRegistry.i18n.json | 6 +++--- .../mainThreadExtensionService.i18n.json | 6 ++++++ .../mainThreadMessageService.i18n.json | 6 ++++++ .../api/node/extHostExplorerView.i18n.json | 9 +++++++++ .../browser/actions/configureLocale.i18n.json | 1 - .../src/vs/workbench/common/theme.i18n.json | 6 ------ .../main.contribution.i18n.json | 1 - .../debug/browser/linkDetector.i18n.json | 9 +++++++++ .../parts/debug/common/debug.i18n.json | 8 ++++++++ .../electron-browser/debugCommands.i18n.json | 6 ++++++ .../electron-browser/replViewer.i18n.json | 2 -- .../parts/debug/node/debugAdapter.i18n.json | 2 -- .../extensionTipsService.i18n.json | 4 +++- .../browser/files.contribution.i18n.json | 2 -- .../browser/searchResultsView.i18n.json | 4 +--- .../task.contribution.i18n.json | 1 - .../themes.contribution.i18n.json | 1 - .../configurationEditingService.i18n.json | 7 +------ .../keybindingService.i18n.json | 3 --- .../jpn/extensions/git/out/commands.i18n.json | 3 +++ i18n/jpn/extensions/git/package.i18n.json | 4 +++- ...rectiveCommentCompletionProvider.i18n.json | 10 ++++++++++ .../extensions/typescript/package.i18n.json | 2 +- .../base/common/jsonErrorMessages.i18n.json | 6 ++++++ .../src/vs/code/electron-main/menus.i18n.json | 3 ++- .../config/commonEditorConfig.i18n.json | 3 ++- .../common/config/editorOptions.i18n.json | 8 ++++++++ .../common/view/editorColorRegistry.i18n.json | 5 ++++- .../contrib/hover/browser/hover.i18n.json | 5 +---- .../browser/referencesWidget.i18n.json | 4 ++-- .../suggest/browser/suggestWidget.i18n.json | 2 -- .../theme/common/colorRegistry.i18n.json | 20 ++++++++++++++++--- .../mainThreadExtensionService.i18n.json | 6 ++++++ .../mainThreadMessageService.i18n.json | 6 ++++++ .../api/node/extHostExplorerView.i18n.json | 9 +++++++++ .../browser/actions/configureLocale.i18n.json | 2 +- .../src/vs/workbench/common/theme.i18n.json | 6 ------ .../main.contribution.i18n.json | 2 +- .../debug/browser/linkDetector.i18n.json | 9 +++++++++ .../parts/debug/common/debug.i18n.json | 8 ++++++++ .../electron-browser/debugCommands.i18n.json | 6 ++++++ .../electron-browser/replViewer.i18n.json | 2 -- .../parts/debug/node/debugAdapter.i18n.json | 3 +-- .../browser/extensionsActions.i18n.json | 2 +- .../extensionTipsService.i18n.json | 6 +++++- .../extensions.contribution.i18n.json | 3 ++- .../browser/files.contribution.i18n.json | 2 -- .../browser/viewPickerHandler.i18n.json | 2 +- .../browser/searchResultsView.i18n.json | 4 +--- .../task.contribution.i18n.json | 2 +- .../terminal.contribution.i18n.json | 20 +++++++++---------- .../terminalActions.i18n.json | 10 +++++----- .../terminalColorRegistry.i18n.json | 2 ++ .../terminalInstance.i18n.json | 4 ++-- .../themes.contribution.i18n.json | 1 - .../electron-browser/watermark.i18n.json | 2 +- .../configurationEditingService.i18n.json | 7 +------ .../keybindingService.i18n.json | 3 --- .../kor/extensions/git/out/commands.i18n.json | 2 ++ ...rectiveCommentCompletionProvider.i18n.json | 6 ++++++ .../extensions/typescript/package.i18n.json | 1 - .../base/common/jsonErrorMessages.i18n.json | 6 ++++++ .../src/vs/code/electron-main/menus.i18n.json | 1 - .../common/config/editorOptions.i18n.json | 8 ++++++++ .../contrib/hover/browser/hover.i18n.json | 5 +---- .../browser/referencesWidget.i18n.json | 2 -- .../suggest/browser/suggestWidget.i18n.json | 2 -- .../theme/common/colorRegistry.i18n.json | 6 +++--- .../mainThreadExtensionService.i18n.json | 6 ++++++ .../mainThreadMessageService.i18n.json | 6 ++++++ .../api/node/extHostExplorerView.i18n.json | 9 +++++++++ .../browser/actions/configureLocale.i18n.json | 1 - .../src/vs/workbench/common/theme.i18n.json | 6 ------ .../main.contribution.i18n.json | 1 - .../debug/browser/linkDetector.i18n.json | 9 +++++++++ .../parts/debug/common/debug.i18n.json | 8 ++++++++ .../electron-browser/debugCommands.i18n.json | 6 ++++++ .../electron-browser/replViewer.i18n.json | 2 -- .../parts/debug/node/debugAdapter.i18n.json | 2 -- .../extensionTipsService.i18n.json | 4 +++- .../browser/files.contribution.i18n.json | 2 -- .../browser/searchResultsView.i18n.json | 4 +--- .../task.contribution.i18n.json | 1 - .../themes.contribution.i18n.json | 1 - .../configurationEditingService.i18n.json | 7 +------ .../keybindingService.i18n.json | 3 --- .../rus/extensions/git/out/commands.i18n.json | 2 ++ ...rectiveCommentCompletionProvider.i18n.json | 6 ++++++ .../extensions/typescript/package.i18n.json | 1 - .../base/common/jsonErrorMessages.i18n.json | 6 ++++++ .../src/vs/code/electron-main/menus.i18n.json | 7 +++---- .../common/config/editorOptions.i18n.json | 8 ++++++++ .../contrib/hover/browser/hover.i18n.json | 5 +---- .../browser/referencesWidget.i18n.json | 2 -- .../suggest/browser/suggestWidget.i18n.json | 2 -- .../theme/common/colorRegistry.i18n.json | 8 +++++--- .../mainThreadExtensionService.i18n.json | 6 ++++++ .../mainThreadMessageService.i18n.json | 6 ++++++ .../api/node/extHostExplorerView.i18n.json | 9 +++++++++ .../browser/actions/configureLocale.i18n.json | 1 - .../src/vs/workbench/common/theme.i18n.json | 6 ------ .../main.contribution.i18n.json | 1 - .../debug/browser/linkDetector.i18n.json | 9 +++++++++ .../parts/debug/common/debug.i18n.json | 8 ++++++++ .../electron-browser/debugCommands.i18n.json | 6 ++++++ .../electron-browser/replViewer.i18n.json | 2 -- .../parts/debug/node/debugAdapter.i18n.json | 2 -- .../extensionTipsService.i18n.json | 4 +++- .../browser/files.contribution.i18n.json | 2 -- .../browser/searchResultsView.i18n.json | 4 +--- .../task.contribution.i18n.json | 1 - .../themes.contribution.i18n.json | 1 - .../configurationEditingService.i18n.json | 7 +------ .../keybindingService.i18n.json | 3 --- 274 files changed, 786 insertions(+), 411 deletions(-) create mode 100644 i18n/chs/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/chs/src/vs/base/common/jsonErrorMessages.i18n.json create mode 100644 i18n/chs/src/vs/editor/common/config/editorOptions.i18n.json create mode 100644 i18n/chs/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json create mode 100644 i18n/chs/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json create mode 100644 i18n/chs/src/vs/workbench/api/node/extHostExplorerView.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/debug/common/debug.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json create mode 100644 i18n/cht/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/cht/src/vs/base/common/jsonErrorMessages.i18n.json create mode 100644 i18n/cht/src/vs/editor/common/config/editorOptions.i18n.json create mode 100644 i18n/cht/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json create mode 100644 i18n/cht/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json create mode 100644 i18n/cht/src/vs/workbench/api/node/extHostExplorerView.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/debug/common/debug.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json create mode 100644 i18n/deu/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/deu/src/vs/base/common/jsonErrorMessages.i18n.json create mode 100644 i18n/deu/src/vs/editor/common/config/editorOptions.i18n.json create mode 100644 i18n/deu/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json create mode 100644 i18n/deu/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json create mode 100644 i18n/deu/src/vs/workbench/api/node/extHostExplorerView.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/debug/common/debug.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json create mode 100644 i18n/esn/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/esn/src/vs/base/common/jsonErrorMessages.i18n.json create mode 100644 i18n/esn/src/vs/editor/common/config/editorOptions.i18n.json create mode 100644 i18n/esn/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json create mode 100644 i18n/esn/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json create mode 100644 i18n/esn/src/vs/workbench/api/node/extHostExplorerView.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/debug/common/debug.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json create mode 100644 i18n/fra/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/fra/src/vs/base/common/jsonErrorMessages.i18n.json create mode 100644 i18n/fra/src/vs/editor/common/config/editorOptions.i18n.json create mode 100644 i18n/fra/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json create mode 100644 i18n/fra/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json create mode 100644 i18n/fra/src/vs/workbench/api/node/extHostExplorerView.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/debug/common/debug.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json create mode 100644 i18n/ita/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/ita/src/vs/base/common/jsonErrorMessages.i18n.json create mode 100644 i18n/ita/src/vs/editor/common/config/editorOptions.i18n.json create mode 100644 i18n/ita/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json create mode 100644 i18n/ita/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json create mode 100644 i18n/ita/src/vs/workbench/api/node/extHostExplorerView.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/debug/common/debug.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json create mode 100644 i18n/jpn/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/jpn/src/vs/base/common/jsonErrorMessages.i18n.json create mode 100644 i18n/jpn/src/vs/editor/common/config/editorOptions.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/api/node/extHostExplorerView.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/debug/common/debug.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json create mode 100644 i18n/kor/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/kor/src/vs/base/common/jsonErrorMessages.i18n.json create mode 100644 i18n/kor/src/vs/editor/common/config/editorOptions.i18n.json create mode 100644 i18n/kor/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json create mode 100644 i18n/kor/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json create mode 100644 i18n/kor/src/vs/workbench/api/node/extHostExplorerView.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/debug/common/debug.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json create mode 100644 i18n/rus/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/rus/src/vs/base/common/jsonErrorMessages.i18n.json create mode 100644 i18n/rus/src/vs/editor/common/config/editorOptions.i18n.json create mode 100644 i18n/rus/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json create mode 100644 i18n/rus/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json create mode 100644 i18n/rus/src/vs/workbench/api/node/extHostExplorerView.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/debug/common/debug.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json diff --git a/i18n/chs/extensions/git/out/commands.i18n.json b/i18n/chs/extensions/git/out/commands.i18n.json index 2bf666865ec..d6b0baf0919 100644 --- a/i18n/chs/extensions/git/out/commands.i18n.json +++ b/i18n/chs/extensions/git/out/commands.i18n.json @@ -18,6 +18,8 @@ "discard": "放弃更改", "confirm discard all": "确定要放弃所有更改吗?此操作不可撤销!", "discardAll": "放弃所有更改", + "yes": "是", + "always": "始终", "no changes": "没有要提交的更改。", "commit message": "提交消息", "provide commit message": "请提供提交消息", diff --git a/i18n/chs/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/chs/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..de76bf9b5f5 --- /dev/null +++ b/i18n/chs/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ts-check": "在 JavaScript 文件中启用语义检查。必须在文件顶部。", + "ts-nocheck": "在 JavaScript 文件中禁用语义检查。必须在文件顶部。", + "ts-ignore": "取消文件下一行的 @ts-check 错误提示。" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript/package.i18n.json b/i18n/chs/extensions/typescript/package.i18n.json index 1e24a1e8d40..8f2d24aa7ea 100644 --- a/i18n/chs/extensions/typescript/package.i18n.json +++ b/i18n/chs/extensions/typescript/package.i18n.json @@ -35,7 +35,7 @@ "javascript.goToProjectConfig.title": "转到项目配置", "typescript.referencesCodeLens.enabled": "启用/禁用引用 CodeLens。要求 TypeScript >= 2.0.6。", "typescript.implementationsCodeLens.enabled": "启用/禁用实现 CodeLens。要求 TypeScript >= 2.2.0。", - "typescript.openTsServerLog.title": "打开 TS 服务器日志文件", + "typescript.openTsServerLog.title": "打开 TS 服务器日志", "typescript.selectTypeScriptVersion.title": "选择 TypeScript 版本", "jsDocCompletion.enabled": "启用/禁用自动 JSDoc 注释", "javascript.implicitProjectConfig.checkJs": "启用/禁用 JavaScript 文件的语义检查。现有的 jsconfig.json 或\n tsconfig.json 文件会覆盖此设置。要求 TypeScript >=2.3.1。", diff --git a/i18n/chs/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/chs/src/vs/base/common/jsonErrorMessages.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/base/common/jsonErrorMessages.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/code/electron-main/menus.i18n.json b/i18n/chs/src/vs/code/electron-main/menus.i18n.json index f049e294f3b..e5052dcc94f 100644 --- a/i18n/chs/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/chs/src/vs/code/electron-main/menus.i18n.json @@ -69,7 +69,6 @@ "miSmartSelectShrink": "缩小选定范围(&&S)", "miViewExplorer": "资源管理器(&&E)", "miViewSearch": "搜索(&&S)", - "miViewGit": "GIT(&&G)", "miViewDebug": "调试(&&D)", "miViewExtensions": "扩展(&&X)", "miToggleOutput": "输出(&&O)", diff --git a/i18n/chs/src/vs/editor/common/config/editorOptions.i18n.json b/i18n/chs/src/vs/editor/common/config/editorOptions.i18n.json new file mode 100644 index 00000000000..9d5691d3e42 --- /dev/null +++ b/i18n/chs/src/vs/editor/common/config/editorOptions.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorViewAccessibleLabel": "编辑器内容" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json index d517535edca..77510fb7e49 100644 --- a/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -10,5 +10,7 @@ "caret": "编辑器光标颜色。", "editorWhitespaces": "编辑器中空白字符颜色。", "editorIndentGuides": "编辑器缩进参考线颜色。", - "editorLineNumbers": "编辑器行号颜色。" + "editorLineNumbers": "编辑器行号颜色。", + "editorCodeLensForeground": "编辑器 CodeLens 的前景色", + "editorBracketMatchBackground": "匹配括号的背景色" } \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/hover/browser/hover.i18n.json b/i18n/chs/src/vs/editor/contrib/hover/browser/hover.i18n.json index 2d214d20aca..65910844481 100644 --- a/i18n/chs/src/vs/editor/contrib/hover/browser/hover.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/hover/browser/hover.i18n.json @@ -4,8 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "showHover": "显示悬停", - "hoverHighlight": "在显示软键盘的字下方突出显示。", - "hoverBackground": "编辑器悬停的背景颜色。", - "hoverBorder": "编辑器软键盘边框颜色。" + "showHover": "显示悬停" } \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json b/i18n/chs/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json index e200e46e376..ae160d59235 100644 --- a/i18n/chs/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json @@ -16,8 +16,6 @@ "peekViewTitleInfoForeground": "速览视图标题信息颜色。", "peekViewBorder": "速览视图边框和箭头颜色。", "peekViewResultsBackground": "速览视图结果列表背景颜色。", - "peekViewResultsMatchForeground": "在速览视图结果列表中匹配条目前景色。", - "peekViewResultsFileForeground": "速览视图结果列表中的文件条目前景色。", "peekViewResultsSelectionBackground": "速览视图结果列表中所选条目的背景颜色。", "peekViewResultsSelectionForeground": "速览视图结果列表中所选条目的前景色。", "peekViewEditorBackground": "速览视图编辑器背景颜色。", diff --git a/i18n/chs/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/chs/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 12737ed6d9b..215e790d4d5 100644 --- a/i18n/chs/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,10 +9,8 @@ "editorSuggestWidgetForeground": "建议小组件的前景颜色。", "editorSuggestWidgetSelectedBackground": "建议小组件中被选择条目的背景颜色。", "editorSuggestWidgetHighlightForeground": "建议小组件中匹配内容的高亮颜色。", - "readMore": "阅读更多...{0}", "suggestionWithDetailsAriaLabel": "{0}(建议)具有详细信息", "suggestionAriaLabel": "{0},建议", - "goback": "返回", "suggestWidget.loading": "正在加载...", "suggestWidget.noSuggestions": "无建议。", "suggestionAriaAccepted": "{0},已接受", diff --git a/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index 9065a3c4a53..806db0f0748 100644 --- a/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -19,6 +19,7 @@ "menus.editorTabContext": "编辑器选项卡上下文菜单", "menus.debugCallstackContext": "调试调用堆栈上下文菜单", "menus.scmTitle": "源代码管理标题菜单", + "menus.resourceGroupContext": "源代码管理资源组上下文菜单", "menus.resourceStateContext": "源代码管理资源状态上下文菜单", "nonempty": "应为非空值。", "opticon": "可以省略属性“图标”或者它必须是一个字符串或类似“{dark, light}”的文本", diff --git a/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json index 5f7643de9e4..fe64e285097 100644 --- a/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -28,8 +28,6 @@ "listActiveSelectionBackground": "已选项在列表或树活动时的背景颜色。活动的列表或树具有键盘焦点,非活动的没有。", "listInactiveSelectionBackground": "已选项在列表或树非活动时的背景颜色。活动的列表或树具有键盘焦点,非活动的没有。", "listActiveSelectionForeground": "已选项在列表或树活动时的前景颜色。活动的列表或树具有键盘焦点,非活动的没有。", - "listFocusAndSelectionBackground": "被选中且聚焦的项目在列表或树活动时的背景颜色。活动的列表或树具有键盘焦点,非活动的没有。此颜色比单独的选择和焦点颜色的优先级高。", - "listFocusAndSelectionForeground": "被选中且聚焦的项目在列表或树活动时的前景颜色。活动的列表或树具有键盘焦点,非活动的没有。此颜色比单独的选择和焦点颜色的优先级高。", "listHoverBackground": "使用鼠标移动项目时,列表或树的背景颜色。", "listDropBackground": "使用鼠标移动项目时,列表或树进行拖放的背景颜色。", "highlight": "在列表或树中搜索时,其中匹配内容的高亮颜色。", @@ -50,7 +48,9 @@ "editorFindMatch": "当前搜索匹配项的颜色。", "findMatchHighlight": "其他搜索匹配项的颜色。", "findRangeHighlight": "限制搜索的范围的颜色。", + "hoverHighlight": "在显示软键盘的字下方突出显示。", + "hoverBackground": "编辑器软键盘背景色。", + "hoverBorder": "编辑器软键盘边框颜色。", "activeLinkForeground": "活动链接颜色。", - "linkForeground": "链接颜色。", "editorWidgetBackground": "编辑器组件(如查找/替换)背景颜色。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/api/node/extHostExplorerView.i18n.json b/i18n/chs/src/vs/workbench/api/node/extHostExplorerView.i18n.json new file mode 100644 index 00000000000..dc7534a7060 --- /dev/null +++ b/i18n/chs/src/vs/workbench/api/node/extHostExplorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "treeExplorer.notRegistered": "没有注册 ID 为“{0}”的 TreeExplorerNodeProvider。", + "treeExplorer.failedToProvideRootNode": "TreeExplorerNodeProvider“{0}”无法提供根节点。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/browser/actions/configureLocale.i18n.json b/i18n/chs/src/vs/workbench/browser/actions/configureLocale.i18n.json index 37269b60c8f..c8f8f1edc8f 100644 --- a/i18n/chs/src/vs/workbench/browser/actions/configureLocale.i18n.json +++ b/i18n/chs/src/vs/workbench/browser/actions/configureLocale.i18n.json @@ -7,7 +7,7 @@ "configureLocale": "配置语言", "displayLanguage": "定义 VSCode 的显示语言。", "doc": "请参阅 {0},了解支持的语言列表。", - "restart": "要更改值需要重启 VSCode。", + "restart": "更改此值需要重启 VSCode。", "fail.createSettings": "无法创建“{0}”({1})。", "JsonSchema.locale": "要使用的 UI 语言。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/common/theme.i18n.json b/i18n/chs/src/vs/workbench/common/theme.i18n.json index 82541213ad4..d268b3ff224 100644 --- a/i18n/chs/src/vs/workbench/common/theme.i18n.json +++ b/i18n/chs/src/vs/workbench/common/theme.i18n.json @@ -4,19 +4,14 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "tabsContainerBackground": "选项卡容器的边框颜色。选项卡是编辑器区域中编辑器的容器。可在一个编辑器组中打开多个选项卡。可以存在多个编辑器组。", "tabActiveBackground": "活动选项卡的背景色。在编辑器区域,选项卡是编辑器的容器。可在一个编辑器组中打开多个选项卡。可以有多个编辑器组。", "tabInactiveBackground": "非活动选项卡的背景色。在编辑器区域,选项卡是编辑器的容器。可在一个编辑器组中打开多个选项卡。可以有多个编辑器组。", "tabBorder": "用于将选项卡彼此分隔开的边框。选项卡是编辑器区域中编辑器的容器。可在一个编辑器组中打开多个选项卡。可以存在多个编辑器组。", "tabActiveEditorGroupActiveForeground": "活动组中活动选项卡的前景色。在编辑器区域,选项卡是编辑器的容器。可在一个编辑器组中打开多个选项卡。可以有多个编辑器组。", - "tabActiveEditorGroupInactiveForeground": "非活动组中活动选项卡的前景色。在编辑器区域,选项卡是编辑器的容器。可在一个编辑器组中打开多个选项卡。可以有多个编辑器组。", "tabInactiveEditorGroupActiveForeground": "活动组中非活动选项卡的前景色。在编辑器区域,选项卡是编辑器的容器。可在一个编辑器组中打开多个选项卡。可以有多个编辑器组。", - "tabInactiveEditorGroupInactiveForeground": "非活动组中非活动选项卡的前景色。在编辑器区域,选项卡是编辑器的容器。可在一个编辑器组中打开多个选项卡。可以有多个编辑器组。", "editorGroupBackground": "编辑器组的背景颜色。编辑器组是编辑器的容器。此颜色在拖动编辑器组时显示。", "editorGroupHeaderBackground": "禁用选项卡时编辑器组标题的背景颜色。编辑器组是编辑器的容器。", "editorGroupBorder": "将多个编辑器组彼此分隔开的颜色。编辑器组是编辑器的容器。", - "editorDragAndDropBackground": "随意拖动编辑器时的背景色。", - "editorMasterDetailsBorder": "并排编辑器中将主视图与细节视图分隔开的边框颜色。", "panelBackground": "面板的背景色。面板显示在编辑器区域下方,可包含输出和集成终端等视图。", "panelBorder": "分隔到编辑器的顶部面板边框色。面板显示在编辑器区域下方,可包含输出和集成终端等视图。", "panelActiveTitleForeground": "活动面板的标题颜色。面板显示在编辑器区域下方,并包含输出和集成终端等视图。", @@ -31,7 +26,6 @@ "statusBarProminentItemHoverBackground": "状态栏突出显示项在悬停时的背景颜色。突出显示项比状态栏中的其他条目更显眼,表明其重要性更高。状态栏显示在窗口底部。", "activityBarBackground": "活动栏背景色。活动栏显示在最左侧或最右侧,并允许在侧边栏的视图间切换。", "activityBarForeground": "活动栏前景色(例如用于图标)。活动栏显示在最左侧或最右侧,并允许在侧边栏的视图间切换。", - "activityBarDragAndDropBackground": "活动栏项的拖放反馈颜色。活动栏显示在最左侧或最右侧,并允许在侧边栏的视图间切换。", "activityBarBadgeBackground": "活动通知徽章背景色。活动栏显示在最左侧或最右侧,并允许在侧边栏的视图间切换。", "activityBarBadgeForeground": "活动通知徽章前景色。活动栏显示在最左侧或最右侧,并允许在侧边栏的视图间切换。", "sideBarBackground": "侧边栏背景色。侧边栏是资源管理器和搜索等视图的容器。", diff --git a/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json index ee33fc5f243..a2d7a1d364c 100644 --- a/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -41,12 +41,12 @@ "window.newWindowDimensions.inherit": "以与上一个活动窗口相同的尺寸打开新窗口。", "window.newWindowDimensions.maximized": "打开最大化的新窗口。", "window.newWindowDimensions.fullscreen": "在全屏模式下打开新窗口。", - "newWindowDimensions": "控制打开新窗口的尺寸。默认情况下,新窗口将以小尺寸在屏幕的中央打开。当设置为 \"inherit\" 时,窗口将获取与上一活动窗口相同的尺寸。当设置为 \"maximized\" 时,窗口将以最大化形式打开,如果配置为 \"fullscreen\",窗口将以全屏形式打开。", "window.menuBarVisibility.default": "菜单仅在全屏模式下隐藏。", "window.menuBarVisibility.visible": "菜单始终可见,即使处于全屏模式下。", "window.menuBarVisibility.toggle": "菜单隐藏,但可以通过 Alt 键显示。", "window.menuBarVisibility.hidden": "菜单始终隐藏。", "menuBarVisibility": "控制菜单栏的可见性。“切换”设置表示隐藏菜单栏,按一次 Alt 键则将显示此菜单栏。默认情况下,除非窗口为全屏,否则菜单栏可见。", + "enableMenuBarMnemonics": "如果启用,则可使用 Alt 快捷键打开主菜单。禁用助记键允许将这些 Alt 快捷键绑定到编辑器命令。", "autoDetectHighContrast": "如果已启用,将自动更改为高对比度主题;如果 Windows 正在使用高对比度主题,则当离开 Windows 高对比度主题时会更改为深色主题。", "titleBarStyle": "调整窗口标题栏的外观。更改需要在完全重启后才能应用。", "window.nativeTabs": "\n启用macOS Sierra窗口选项卡。请注意,更改需要完全重新启动程序才能生效。如果配置此选项,本机选项卡将禁用自定义标题栏样式。", diff --git a/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 2ed88fc7545..258e88045a6 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -6,6 +6,7 @@ { "openLaunchJson": "打开 {0}", "launchJsonNeedsConfigurtion": "配置或修复 \"launch.json\"", + "noFolderDebugConfig": "请先打开一个文件夹以进行高级调试配置。", "startDebug": "开始调试", "startWithoutDebugging": "开始执行(不调试)", "selectAndStartDebugging": "选择并开始调试", diff --git a/i18n/chs/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json new file mode 100644 index 00000000000..e0672f811fd --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileLinkMac": "点击以跟进(Cmd + 点击打开到侧边)", + "fileLink": "点击以跟进(Ctrl + 点击打开到侧边))" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/common/debug.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/common/debug.i18n.json new file mode 100644 index 00000000000..8f7407863de --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/debug/common/debug.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "internalConsoleOptions": "内部调试控制台的控制行为。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json new file mode 100644 index 00000000000..b984c5a3f68 --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noFolderDebugConfig": "请先打开一个文件夹以进行高级调试配置。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json index f8362fa633f..16828d670d2 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json @@ -5,8 +5,6 @@ // Do not edit this file. It is machine generated. { "stateCapture": "对象状态捕获自第一个评估", - "fileLinkMac": "点击以跟进(Cmd + 点击打开到侧边)", - "fileLink": "点击以跟进(Ctrl + 点击打开到侧边))", "replVariableAriaLabel": "变量 {0} 具有值 {1}、读取 Eval 打印循环,调试", "replExpressionAriaLabel": "表达式 {0} 具有值 {1},读取 Eval 打印循环,调试", "replValueOutputAriaLabel": "{0},读取 Eval 打印循环,调试", diff --git a/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 59d49516599..54243f83ce3 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,13 +7,12 @@ "debugAdapterBinNotFound": "调试适配器可执行的“{0}”不存在。", "debugAdapterCannotDetermineExecutable": "无法确定调试适配器“{0}”的可执行文件。", "debugType": "配置类型。", - "debugTypeNotRecognised": "无法识别此调试类型。请安装相应的调试扩展。", + "debugTypeNotRecognised": "无法识别此调试类型。确保已经安装并启用相应的调试扩展。", "node2NotSupported": "不再支持 \"node2\",改用 \"node\",并将 \"protocol\" 属性设为 \"inspector\"。", "debugName": "配置名称;在启动配置下拉菜单中显示。", "debugRequest": "请求配置类型。可以是“启动”或“附加”。", "debugServer": "仅用于调试扩展开发: 如果已指定端口,VS 代码会尝试连接到在服务器模式中运行的调试适配器", "debugPrelaunchTask": "调试会话开始前要运行的任务。", - "internalConsoleOptions": "内部调试控制台的控制行为。", "debugWindowsConfiguration": "特定于 Windows 的启动配置属性。", "debugOSXConfiguration": "特定于 OS X 的启动配置属性。", "debugLinuxConfiguration": "特定于 Linux 的启动配置属性。", diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 8bcde2a904f..1a78dfcd728 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,5 +8,8 @@ "showRecommendations": "显示建议", "neverShowAgain": "不再显示", "close": "关闭", - "workspaceRecommended": "此工作区具有扩展建议。" + "workspaceRecommended": "此工作区具有扩展建议。", + "ignoreAll": "是,忽略全部", + "no": "否", + "cancel": "取消" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json index e65debf45a6..1320378fc4d 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json @@ -10,5 +10,6 @@ "extensions": "扩展", "view": "查看", "extensionsConfigurationTitle": "扩展", - "extensionsAutoUpdate": "自动更新扩展" + "extensionsAutoUpdate": "自动更新扩展", + "extensionsIgnoreRecommendations": "忽略推荐的扩展" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index b519747f41a..7ceecf29ccc 100644 --- a/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -27,8 +27,8 @@ "autoSaveDelay": "控制延迟(以秒为单位),在该延迟后将自动保存更新后的文件。仅在 \"files.autoSave'\" 设置为“{0}”时适用。", "watcherExclude": "配置文件路径的 glob 模式以从文件监视排除。更改此设置要求重启。如果在启动时遇到 Code 消耗大量 CPU 时间,则可以排除大型文件夹以减少初始加载。", "hotExit.off": "禁用热退出。", - "hotExit.onExit": "应用程序关闭时 - 即当 Windows/Linux 上的最后一个窗口关闭或触发 workbench.action.quit 命令时(命令托盘、键绑定、菜单)- 将触发热退出。下次启动时将还原所有已备份的窗口。", - "hotExit.onExitAndWindowClose": "应用程序关闭时 - 即当 Windows/Linux 上的最后一个窗口关闭或触发 workbench.action.quit 命令时(命令托盘、键绑定、菜单)- 将触发热退出。下次启动时将还原所有未打开文件夹的所有窗口。若要将文件夹窗口还原成关闭前的模式,请将 \"window.reopenFolders\" 设置为“所有”。", + "hotExit.onExit": "应用程序关闭时将触发热退出。在 Windows/Linux 上关闭最后一个窗口或触发 workbench.action.quit 命令(命令托盘、键绑定、菜单)会引起应用程序关闭。下次启动时将还原所有已备份的窗口。", + "hotExit.onExitAndWindowClose": "应用程序关闭时将触发热退出。在 Windows/Linux 上关闭最后一个窗口、触发 workbench.action.quit 命令(命令托盘、键绑定、菜单)会引起应用程序关闭。对于任何有文件夹打开的窗口,则不论该窗口是否是最后一个窗口。下次启动时将还原所有未打开文件夹的窗口。若要还原打开有文件夹的窗口,请将“window.reopenFolders”设置为“all”。", "hotExit": "控制是否在会话间记住未保存的文件,以允许在退出编辑器时跳过保存提示。", "defaultLanguage": "分配给新文件的默认语言模式。", "editorConfigurationTitle": "编辑器", diff --git a/i18n/chs/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json b/i18n/chs/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json index cfb58fab2ae..66f5e523f6b 100644 --- a/i18n/chs/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json @@ -6,7 +6,5 @@ { "searchMatches": "已找到 {0} 个匹配项", "searchMatch": "已找到 {0} 个匹配项", - "fileMatchAriaLabel": "文件夹 {2} 的文件 {1} 中有 {0} 个匹配项,搜索结果", - "replacePreviewResultAria": "替换预览结果, {0}", - "searchResultAria": "{0},搜索结果" + "fileMatchAriaLabel": "文件夹 {2} 的文件 {1} 中有 {0} 个匹配项,搜索结果" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index a1a07ebb7f9..e8ff5a94c0b 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -18,7 +18,7 @@ "problems": "问题", "manyMarkers": "99+", "tasks": "任务", - "TaskSystem.noHotSwap": "更改任务执行引擎需要重启 VS 代码。已忽略更改。", + "TaskSystem.noHotSwap": "更改任务执行引擎需要重启 VS Code。已忽略更改。", "TaskService.noBuildTask": "未定义任何生成任务。使用 \"isBuildCommand\" 在 tasks.json 文件中标记任务。", "TaskService.noTestTask": "未定义任何测试任务。使用 \"isTestCommand\" 在 tasks.json 文件中标记任务。", "TaskServer.noTask": "未找到要执行的请求任务 {0}。", diff --git a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json index bc85c5bd23b..396e41e5c52 100644 --- a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "terminal.background": "终端的背景颜色,允许终端的颜色与面板不同。", + "terminal.foreground": "终端的前景颜色。", "terminal.ansiColor": "终端中的 ANSI 颜色“{0}”。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 1e8d0fdd5a8..6e5483236d8 100644 --- a/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,7 +6,6 @@ { "selectTheme.label": "颜色主题", "installColorThemes": "安装其他颜色主题...", - "problemChangingTheme": "设置主题时出现问题: {0}", "themes.selectTheme": "选择颜色主题", "selectIconTheme.label": "文件图标主题", "installIconThemes": "安装其他文件图标主题...", diff --git a/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 78d407bf40b..067feb41358 100644 --- a/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -5,10 +5,5 @@ // Do not edit this file. It is machine generated. { "errorUnknownKey": "无法写入配置文件(未知密钥)", - "errorInvalidTarget": "无法写入到配置文件(无效的目标)", - "errorNoWorkspaceOpened": "无法写入设置,因为没有打开任何文件夹。请先打开一个文件夹,然后重试。", - "errorInvalidConfiguration": "无法写入设置。请打开 **用户设置** 更正文件中的错误/警告,然后重试。", - "errorInvalidConfigurationWorkspace": "无法写入设置。请打开 **工作区设置** 更正文件中的错误/警告,然后重试。", - "errorConfigurationFileDirty": "无法写入设置,因为该文件已更新。请保存 **用户设置** 文件,然后重试。", - "errorConfigurationFileDirtyWorkspace": "无法写入设置,因为该文件已更新。请保存 **工作区设置** 文件,然后重试。" + "errorInvalidTarget": "无法写入到配置文件(无效的目标)" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/chs/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index bafde878dc4..162baf8c31f 100644 --- a/i18n/chs/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -14,9 +14,6 @@ "vscode.extension.contributes.keybindings.win": "Windows 特定的键或键序列。", "vscode.extension.contributes.keybindings.when": "键处于活动状态时的条件。", "vscode.extension.contributes.keybindings": "用于键绑定。", - "openDocumentation": "了解详细信息", - "keybindingMigration.ok": "确定", - "keybindingMigration.prompt": "已为你的键盘布局更改某些键盘快捷键。", "invalid.keybindings": "无效的“contributes.{0}”: {1}", "unboundCommands": "以下是其他可用命令:", "keybindings.json.title": "键绑定配置", diff --git a/i18n/cht/extensions/git/out/commands.i18n.json b/i18n/cht/extensions/git/out/commands.i18n.json index 446fe9ba049..2c6e6503951 100644 --- a/i18n/cht/extensions/git/out/commands.i18n.json +++ b/i18n/cht/extensions/git/out/commands.i18n.json @@ -18,6 +18,8 @@ "discard": "捨棄變更", "confirm discard all": "確定要捨棄所有變更嗎? 此動作無法復原!", "discardAll": "捨棄所有變更", + "yes": "是", + "always": "永遠", "no changes": "沒有任何變更要認可。", "commit message": "認可訊息", "provide commit message": "請提供認可訊息", diff --git a/i18n/cht/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/cht/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript/package.i18n.json b/i18n/cht/extensions/typescript/package.i18n.json index c5b2c54edf8..c0d77144501 100644 --- a/i18n/cht/extensions/typescript/package.i18n.json +++ b/i18n/cht/extensions/typescript/package.i18n.json @@ -35,7 +35,6 @@ "javascript.goToProjectConfig.title": "移至專案組態", "typescript.referencesCodeLens.enabled": "啟用/停用參考 CodeLens。需要 TypeScript >= 2.0.6。", "typescript.implementationsCodeLens.enabled": "啟用/停用實作 CodeLens。需要 TypeScript >= 2.2.0。", - "typescript.openTsServerLog.title": "開啟 TS 伺服器記錄檔", "typescript.selectTypeScriptVersion.title": "選取 TypeScript 版本", "jsDocCompletion.enabled": "啟用/停用自動 JSDoc 註解", "javascript.implicitProjectConfig.checkJs": "啟用/停用 JavaScript 檔案的語意檢查。現有的 jsconfig.json 或 tsconfig.json 檔案會覆寫此設定。需要 TypeScript >=2.3.1。", diff --git a/i18n/cht/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/cht/src/vs/base/common/jsonErrorMessages.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/base/common/jsonErrorMessages.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/code/electron-main/menus.i18n.json b/i18n/cht/src/vs/code/electron-main/menus.i18n.json index 20490cb499d..a1fa3f356dd 100644 --- a/i18n/cht/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/cht/src/vs/code/electron-main/menus.i18n.json @@ -69,7 +69,6 @@ "miSmartSelectShrink": "壓縮選取範圍(&&S)", "miViewExplorer": "檔案總管(&&E)", "miViewSearch": "搜尋(&&S)", - "miViewGit": "Git(&&G)", "miViewDebug": "偵錯 (&&D)", "miViewExtensions": "擴充功能(&&X)", "miToggleOutput": "輸出(&&O)", diff --git a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json index ec8f05fe340..23eb6654668 100644 --- a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -62,6 +62,7 @@ "renderLineHighlight": "控制編輯器應如何轉譯目前反白的行,可能的值有 'none'、'gutter'、'line' 和 'all'。", "codeLens": "控制編輯器是否顯示程式碼濾鏡", "folding": "控制編輯器是否已啟用程式碼摺疊功能", + "hideFoldIcons": "自動隱藏摺疊圖示", "matchBrackets": "當選取某側的括號時,強調顯示另一側的配對括號。", "glyphMargin": "控制編輯器是否應轉譯垂直字符邊界。字符邊界最常用來進行偵錯。", "useTabStops": "插入和刪除接在定位停駐點後的空白字元", diff --git a/i18n/cht/src/vs/editor/common/config/editorOptions.i18n.json b/i18n/cht/src/vs/editor/common/config/editorOptions.i18n.json new file mode 100644 index 00000000000..f48289922ad --- /dev/null +++ b/i18n/cht/src/vs/editor/common/config/editorOptions.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorViewAccessibleLabel": "編輯器內容" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/hover/browser/hover.i18n.json b/i18n/cht/src/vs/editor/contrib/hover/browser/hover.i18n.json index 43422adfd16..7895cc33c1f 100644 --- a/i18n/cht/src/vs/editor/contrib/hover/browser/hover.i18n.json +++ b/i18n/cht/src/vs/editor/contrib/hover/browser/hover.i18n.json @@ -4,8 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "showHover": "動態顯示", - "hoverHighlight": "在顯示了動態顯示的單字下方醒目提示。", - "hoverBackground": "編輯器動態顯示的背景色彩。", - "hoverBorder": "編輯器動態顯示的框線色彩。" + "showHover": "動態顯示" } \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json b/i18n/cht/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json index 3386dfa6e21..65c92c77404 100644 --- a/i18n/cht/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json +++ b/i18n/cht/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json @@ -16,8 +16,6 @@ "peekViewTitleInfoForeground": "預覽檢視標題資訊的色彩。", "peekViewBorder": "預覽檢視之框線與箭頭的色彩。", "peekViewResultsBackground": "預覽檢視中結果清單的背景色彩。", - "peekViewResultsMatchForeground": "在預覽檢視之結果清單中比對輸入時的前景。", - "peekViewResultsFileForeground": "在預覽檢視之結果清單中輸入檔案時的前景。", "peekViewResultsSelectionBackground": "在預覽檢視之結果清單中選取項目時的背景色彩。", "peekViewResultsSelectionForeground": "在預覽檢視之結果清單中選取項目時的前景色彩。", "peekViewEditorBackground": "預覽檢視編輯器的背景色彩。", diff --git a/i18n/cht/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/cht/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 64120957b4f..e7251477a6c 100644 --- a/i18n/cht/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/cht/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,10 +9,8 @@ "editorSuggestWidgetForeground": "建議小工具的前景色彩。", "editorSuggestWidgetSelectedBackground": "建議小工具中所選項目的背景色彩。", "editorSuggestWidgetHighlightForeground": "建議小工具中相符醒目提示的色彩。", - "readMore": "進一步了解...{0}", "suggestionWithDetailsAriaLabel": "{0},建議,有詳細資料", "suggestionAriaLabel": "{0},建議", - "goback": "返回", "suggestWidget.loading": "正在載入...", "suggestWidget.noSuggestions": "無建議。", "suggestionAriaAccepted": "{0},接受", diff --git a/i18n/cht/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/cht/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index 993d9fa74a6..9414bc08e6a 100644 --- a/i18n/cht/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/cht/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -5,7 +5,6 @@ // Do not edit this file. It is machine generated. { "requirearray": "功能表項目必須為陣列", - "requirestring": "屬性 '{0}' 為強制項目且必須屬於 `string` 類型", "optstring": "屬性 `{0}` 可以省略或必須屬於 `string` 類型", "vscode.extension.contributes.menuItem.command": "所要執行命令的識別碼。命令必須在 'commands' 區段中宣告", "vscode.extension.contributes.menuItem.alt": "所要執行替代命令的識別碼。命令必須在 'commands' 區段中宣告", diff --git a/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json index 7ab7c658bae..2064ef5c178 100644 --- a/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -7,6 +7,7 @@ "invalid.color": "色彩格式無效。請使用 #RGB、#RGBA、#RRGGBB 或 #RRGGBBAA", "schema.colors": "工作台中使用的色彩。", "foreground": "整體的前景色彩。僅當未被任何元件覆疊時,才會使用此色彩。", + "errorForeground": "整體錯誤訊息的前景色彩。僅當未被任何元件覆蓋時,才會使用此色彩。", "focusBorder": "焦點項目的整體邊界色彩。只在沒有任何元件覆寫此色彩時,才會加以使用。", "contrastBorder": "項目周圍的額外邊界,可將項目從其他項目中區隔出來以提高對比。", "activeContrastBorder": "使用中項目周圍的額外邊界,可將項目從其他項目中區隔出來以提高對比。", @@ -28,8 +29,6 @@ "listActiveSelectionBackground": "當清單/樹狀為使用中狀態時,所選項目的清單/樹狀背景色彩。使用中的清單/樹狀有鍵盤焦點,非使用中者則沒有。", "listInactiveSelectionBackground": "當清單/樹狀為非使用中狀態時,所選項目的清單/樹狀背景色彩。使用中的清單/樹狀有鍵盤焦點,非使用中者則沒有。", "listActiveSelectionForeground": "當清單/樹狀為使用中狀態時,所選項目的清單/樹狀前景色彩。使用中的清單/樹狀有鍵盤焦點,非使用中者則沒有。", - "listFocusAndSelectionBackground": "當清單/樹狀為使用中狀態時,焦點和所選項目的清單/樹狀背景色彩。使用中的清單/樹狀有鍵盤焦點,非使用中者則沒有。此色彩優先於個別選取項目及焦點色彩。", - "listFocusAndSelectionForeground": "當清單/樹狀為使用中狀態時,焦點和所選項目的清單/樹狀前景色彩。使用中的清單/樹狀有鍵盤焦點,非使用中者則沒有。此色彩優先於個別選取項目及焦點色彩。", "listHoverBackground": "使用滑鼠暫留在項目時的清單/樹狀背景。", "listDropBackground": "使用滑鼠四處移動項目時的清單/樹狀拖放背景。", "highlight": "在清單/樹狀內搜尋時,相符醒目提示的清單/樹狀前景色彩。", @@ -50,7 +49,9 @@ "editorFindMatch": "符合目前搜尋的色彩。", "findMatchHighlight": "符合其他搜尋的色彩。", "findRangeHighlight": "限制搜尋之範圍的色彩。", + "hoverHighlight": "在顯示了動態顯示的單字下方醒目提示。", + "hoverBackground": "編輯器動態顯示的背景色彩。", + "hoverBorder": "編輯器動態顯示的框線色彩。", "activeLinkForeground": "使用中之連結的色彩。", - "linkForeground": "連結的色彩。", "editorWidgetBackground": "編輯器小工具的背景色彩,例如尋找/取代。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/api/node/extHostExplorerView.i18n.json b/i18n/cht/src/vs/workbench/api/node/extHostExplorerView.i18n.json new file mode 100644 index 00000000000..24e5da79005 --- /dev/null +++ b/i18n/cht/src/vs/workbench/api/node/extHostExplorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "treeExplorer.notRegistered": "未註冊識別碼為 '{0}' 的 TreeExplorerNodeProvider。", + "treeExplorer.failedToProvideRootNode": "TreeExplorerNodeProvider '{0}' 無法提供根節點。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/actions/configureLocale.i18n.json b/i18n/cht/src/vs/workbench/browser/actions/configureLocale.i18n.json index 3e4cd2547c5..f0c2e15a100 100644 --- a/i18n/cht/src/vs/workbench/browser/actions/configureLocale.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/actions/configureLocale.i18n.json @@ -7,7 +7,6 @@ "configureLocale": "設定語言", "displayLanguage": "定義 VSCode 的顯示語言。", "doc": "如需支援的語言清單,請參閱 {0}。", - "restart": "變更值必須重新啟動 VSCode。", "fail.createSettings": "無法建立 '{0}' ({1})。", "JsonSchema.locale": "要使用的 UI 語言。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/common/theme.i18n.json b/i18n/cht/src/vs/workbench/common/theme.i18n.json index ad80aac3089..2d8bce1a636 100644 --- a/i18n/cht/src/vs/workbench/common/theme.i18n.json +++ b/i18n/cht/src/vs/workbench/common/theme.i18n.json @@ -4,19 +4,14 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "tabsContainerBackground": "索引標籤容器的背景色彩。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", "tabActiveBackground": "使用中之索引標籤的背景色彩。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", "tabInactiveBackground": "非使用中之索引標籤的背景色彩。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", "tabBorder": "用以分隔索引標籤彼此的框線。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", "tabActiveEditorGroupActiveForeground": "使用中的群組內,使用中之索引標籤的前景色彩。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", - "tabActiveEditorGroupInactiveForeground": "非使用中的群組內,使用中之索引標籤的前景色彩。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", "tabInactiveEditorGroupActiveForeground": "使用中的群組內,非使用中之索引標籤的前景色彩。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", - "tabInactiveEditorGroupInactiveForeground": "非使用中的群組內,非使用中之索引標籤的前景色彩。索引標籤是編輯器在編輯器區域中的容器。同一個編輯器群組中的多個索引標籤可以同時開啟。可能會有多個編輯器群組。", "editorGroupBackground": "編輯器群組的背景色彩。編輯器群組是編輯器的容器。當拖曳編輯器群組時會顯示背景色彩。", "editorGroupHeaderBackground": "當索引標籤禁用的時候編輯器群組標題的背景顏色。編輯器群組是編輯器的容器。", "editorGroupBorder": "用以分隔多個編輯器群組彼此的色彩。編輯器群組是編輯器的容器。", - "editorDragAndDropBackground": "拖曳編輯器時的背景色彩。", - "editorMasterDetailsBorder": "並排編輯器中將主視窗和詳細視窗分隔開的框線色彩。\n範例包括diff編輯器和設定編輯器。", "panelBackground": "面板的前景色彩。面板會顯示在編輯器區域的下方,其中包含諸如輸出與整合式終端機等檢視。", "panelBorder": "面板頂端用以分隔編輯器的邊框色彩。面板會顯示在編輯器區域的下方,其中包含諸如輸出與整合式終端機等檢視。", "panelActiveTitleForeground": "使用中之面板標題的標題色彩。面板會顯示在編輯器區域的下方,其中包含諸如輸出與整合式終端機等檢視。", @@ -31,7 +26,6 @@ "statusBarProminentItemHoverBackground": "狀態列突出項目暫留時的背景顏色。突出項目比狀態列的其他項目更顯眼,用於表示重要性更高。狀態列會顯示在視窗的底部。", "activityBarBackground": "活動列背景的色彩。活動列會顯示在最左側或最右側,並可切換不同的提要欄位檢視。", "activityBarForeground": "活動列的前背景色彩(例如用於圖示)。此活動列會顯示在最左側或最右側,讓您可以切換提要欄位的不同檢視。", - "activityBarDragAndDropBackground": "拖放活動列項目之意見回應時的色彩。此活動列會顯示在最左側或最右側,讓您可以切換提要欄位的不同檢視。", "activityBarBadgeBackground": "活動通知徽章的背景色彩。此活動列會顯示在最左側或最右側,讓您可以切換提要欄位的不同檢視。", "activityBarBadgeForeground": "活動通知徽章的前背景色彩。此活動列會顯示在最左側或最右側,讓您可以切換提要欄位的不同檢視。", "sideBarBackground": "提要欄位的背景色彩。提要欄位是檢視 (例如 Explorer 與搜尋) 的容器。", diff --git a/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json index f23a60a5640..c1874024aee 100644 --- a/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -41,7 +41,6 @@ "window.newWindowDimensions.inherit": "以相同於上一個使用中之視窗的維度開啟新視窗。", "window.newWindowDimensions.maximized": "開啟並最大化新視窗。", "window.newWindowDimensions.fullscreen": "在全螢幕模式下開啟新視窗。", - "newWindowDimensions": "控制開啟新視窗的維度。根據預設,新視窗會以小型維度在畫面中央開啟。設為 'inherit' 時,視窗的維度會和上一個使用中視窗相同。設為 'maximized' 時,視窗會開到最大,若設為 'fullscreen' 則全螢幕開啟。", "window.menuBarVisibility.default": "只在全螢幕模式時隱藏功能表。", "window.menuBarVisibility.visible": "一律顯示功能表,即使在全螢幕模式時亦然。", "window.menuBarVisibility.toggle": "隱藏功能表,但可經由 Alt 鍵加以顯示。", diff --git a/i18n/cht/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json new file mode 100644 index 00000000000..e2098f79ad8 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileLinkMac": "按一下以追蹤 (Cmd + 按一下滑鼠左鍵開至側邊)", + "fileLink": "按一下以追蹤 (Ctrl + 按一下滑鼠左鍵開至側邊)" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/common/debug.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/common/debug.i18n.json new file mode 100644 index 00000000000..63a60fc01a2 --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/debug/common/debug.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "internalConsoleOptions": "內部偵錯主控台的控制項行為。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json index 1c7a91ba5c9..e7982d93dfd 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json @@ -5,8 +5,6 @@ // Do not edit this file. It is machine generated. { "stateCapture": "第一次評估會擷取物件狀態", - "fileLinkMac": "按一下以追蹤 (Cmd + 按一下滑鼠左鍵開至側邊)", - "fileLink": "按一下以追蹤 (Ctrl + 按一下滑鼠左鍵開至側邊)", "replVariableAriaLabel": "變數 {0} 具有值 {1},「讀取、求值、輸出」迴圈,偵錯", "replExpressionAriaLabel": "運算式 {0} 具有值 {1},「讀取、求值、輸出」迴圈,偵錯", "replValueOutputAriaLabel": "{0},「讀取、求值、輸出」迴圈,偵錯", diff --git a/i18n/cht/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/cht/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index d2d63b8b78c..fbd7d7b23df 100644 --- a/i18n/cht/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,13 +7,11 @@ "debugAdapterBinNotFound": "偵錯配接器可執行檔 '{0}' 不存在。", "debugAdapterCannotDetermineExecutable": "無法判斷偵錯配接器 '{0}' 的可執行檔。", "debugType": "組態的類型。", - "debugTypeNotRecognised": "無法辨識此偵錯類型。請安裝對應的偵錯延伸模組。", "node2NotSupported": "\"node2\" 已不再支援,請改用 \"node\",並將 \"protocol\" 屬性設為 \"inspector\"。", "debugName": "組態的名稱; 出現在啟動組態下拉式功能表中。", "debugRequest": "要求組態的類型。可以是 [啟動] 或 [附加]。", "debugServer": "僅限偵錯延伸模組開發: 如果指定了連接埠,VS Code 會嘗試連線至以伺服器模式執行的偵錯配接器", "debugPrelaunchTask": "偵錯工作階段啟動前要執行的工作。", - "internalConsoleOptions": "內部偵錯主控台的控制項行為。", "debugWindowsConfiguration": "Windows 特定的啟動設定屬性。", "debugOSXConfiguration": "OS X 特定的啟動設定屬性。", "debugLinuxConfiguration": "Linux 特定的啟動設定屬性。", diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 785e1cb774a..7855f3a13f5 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,5 +8,7 @@ "showRecommendations": "顯示建議", "neverShowAgain": "不要再顯示", "close": "關閉", - "workspaceRecommended": "此工作區具有擴充功能建議。" + "workspaceRecommended": "此工作區具有擴充功能建議。", + "no": "否", + "cancel": "取消" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index d18aa96ecaf..07e8bfd5963 100644 --- a/i18n/cht/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -27,8 +27,6 @@ "autoSaveDelay": "控制要自動儲存已變更之檔案前必須經過的延遲時間 (毫秒)。僅當 'files.autoSave' 設為 \"{0}\" 時才適用。", "watcherExclude": "將檔案路徑的 Glob 模式設定為從檔案監控排除。需要重新啟動才能變更此設定。當您發現 Code 在啟動時使用大量 CPU 時間時,可以排除較大的資料夾以降低初始負載。", "hotExit.off": "停用 Hot Exit。", - "hotExit.onExit": "Hot Exit 將會在關閉應用程式時觸發,也就是在 Windows/Linux 上關閉上一個視窗,或是觸發 workbench.action.quit 命令 (命令選擇區、按鍵繫結關係、功能表) 時觸發。具有備份的所有視窗都會在下次啟動時還原。", - "hotExit.onExitAndWindowClose": "Hot Exit 將會在關閉應用程式時觸發,也就是在 Windows/Linux 上關閉上一個視窗,或是觸發 workbench.action.quit 命令 (命令選擇區、按鍵繫結關係、功能表) 時觸發,也會針對已開啟資料夾的任何視窗觸發,而不論其是否為上一個視窗。具有備份的所有視窗都會在下次啟動時還原。若要將資料夾視窗還原成關機前的狀態,請將 \"window.reopenFolders\" 設定為 \"all\"。", "hotExit": "控制是否讓不同工作階段記住未儲存的檔案,並允許在結束編輯器時跳過儲存提示。", "defaultLanguage": "指派給新檔案的預設語言模式。", "editorConfigurationTitle": "編輯器", diff --git a/i18n/cht/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json b/i18n/cht/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json index e2c76d595ed..0dacece4839 100644 --- a/i18n/cht/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json @@ -6,7 +6,5 @@ { "searchMatches": "找到 {0} 個相符", "searchMatch": "找到 {0} 個相符", - "fileMatchAriaLabel": "資料夾 {2} 的檔案 {1} 中有 {0} 個相符,搜尋結果", - "replacePreviewResultAria": "取代預覽結果,{0}", - "searchResultAria": "{0},搜尋結果" + "fileMatchAriaLabel": "資料夾 {2} 的檔案 {1} 中有 {0} 個相符,搜尋結果" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index c0537ee4cdf..f73c9b1e8a6 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -18,7 +18,6 @@ "problems": "問題", "manyMarkers": "99+", "tasks": "工作", - "TaskSystem.noHotSwap": "變更工作執行引擎需要重新啟動 VS Code。已略過變更。", "TaskService.noBuildTask": "未定義任何建置工作。請使用 'isBuildCommand' 標記 tasks.json 檔案中的工作。", "TaskService.noTestTask": "未定義任何建置工作。請使用 'isTestCommand' 標記 tasks.json 檔案中的工作。", "TaskServer.noTask": "找不到所要求要執行的工作 {0}。", diff --git a/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index d5c740838a6..891c5bae600 100644 --- a/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,7 +6,6 @@ { "selectTheme.label": "色彩佈景主題", "installColorThemes": "安裝其他的色彩佈景主題...", - "problemChangingTheme": "設定佈景主題時發生問題: {0}", "themes.selectTheme": "選取色彩佈景主題", "selectIconTheme.label": "檔案圖示佈景主題", "installIconThemes": "安裝其他的檔案圖示主題...", diff --git a/i18n/cht/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/cht/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 377d6da8f30..95764540d13 100644 --- a/i18n/cht/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -5,10 +5,5 @@ // Do not edit this file. It is machine generated. { "errorUnknownKey": "無法寫入組態檔 (不明的按鍵)", - "errorInvalidTarget": "無法寫入組態檔 (目標無效)", - "errorNoWorkspaceOpened": "因為未開啟任何資料夾,所以無法寫入設定。請開啟資料夾後再試一次。", - "errorInvalidConfiguration": "無法寫入設定。請開啟 **使用者設定** 以修正檔案中的錯誤/警告後再試一次。", - "errorInvalidConfigurationWorkspace": "無法寫入設定。請開啟 **工作區設定** 以修正檔案中的錯誤/警告後再試一次。", - "errorConfigurationFileDirty": "因為檔案已變更,所以無法寫入設定。請儲存 **使用者設定** 檔案後再試一次。", - "errorConfigurationFileDirtyWorkspace": "因為檔案已變更,所以無法寫入設定。請儲存 **工作區設定** 檔案後再試一次。" + "errorInvalidTarget": "無法寫入組態檔 (目標無效)" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/cht/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index 02d0580da76..783e4921558 100644 --- a/i18n/cht/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -14,9 +14,6 @@ "vscode.extension.contributes.keybindings.win": "Windows 特定按鍵或按鍵順序。", "vscode.extension.contributes.keybindings.when": "按鍵為使用中時的條件。", "vscode.extension.contributes.keybindings": "提供按鍵繫結關係。", - "openDocumentation": "深入了解", - "keybindingMigration.ok": "確定", - "keybindingMigration.prompt": "您的鍵盤配置已有一些鍵盤快速鍵變更了。", "invalid.keybindings": "`contributes.{0}` 無效: {1}", "unboundCommands": "其他可用命令如下: ", "keybindings.json.title": "按鍵繫結關係組態", diff --git a/i18n/deu/extensions/git/out/commands.i18n.json b/i18n/deu/extensions/git/out/commands.i18n.json index ee0bf862856..d0fbcdb0a28 100644 --- a/i18n/deu/extensions/git/out/commands.i18n.json +++ b/i18n/deu/extensions/git/out/commands.i18n.json @@ -18,6 +18,8 @@ "discard": "Änderungen verwerfen", "confirm discard all": "Möchten Sie wirklich ALLE Änderungen verwerfen? Dieser Vorgang kann nicht rückgängig gemacht werden!", "discardAll": "ALLE Änderungen verwerfen", + "yes": "Ja", + "always": "Immer", "no changes": "Keine Änderungen zum Speichern vorhanden.", "commit message": "Commit-Nachricht", "provide commit message": "Geben Sie eine Commit-Nachrichte ein.", diff --git a/i18n/deu/extensions/git/package.i18n.json b/i18n/deu/extensions/git/package.i18n.json index 91f8db11a7f..379f38b08fe 100644 --- a/i18n/deu/extensions/git/package.i18n.json +++ b/i18n/deu/extensions/git/package.i18n.json @@ -11,7 +11,7 @@ "command.openFile": "Datei öffnen", "command.stage": "Änderungen bereitstellen", "command.stageAll": "Alle Änderungen bereitstellen", - "command.stageSelectedRanges": "Gewählte Bereiche staffeln", + "command.stageSelectedRanges": "Gewählte Bereiche bereitstellen", "command.revertSelectedRanges": "Ausgewählte Bereiche zurücksetzen", "command.unstage": "Bereitstellung der Änderungen aufheben", "command.unstageAll": "Bereitstellung aller Änderungen aufheben", @@ -20,7 +20,7 @@ "command.cleanAll": "Alle Änderungen verwerfen", "command.commit": "Commit", "command.commitStaged": "Commit bereitgestellt", - "command.commitStagedSigned": "Gestaffelt committen (abgemeldet)", + "command.commitStagedSigned": "Bereitgestelltes committen (unterzeichnet)", "command.commitAll": "Commit für alle ausführen", "command.commitAllSigned": "Alle committen (abgemeldet)", "command.undoCommit": "Letzten Commit rückgängig machen", diff --git a/i18n/deu/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/deu/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript/package.i18n.json b/i18n/deu/extensions/typescript/package.i18n.json index 61d500f2b84..d749c1d297f 100644 --- a/i18n/deu/extensions/typescript/package.i18n.json +++ b/i18n/deu/extensions/typescript/package.i18n.json @@ -35,7 +35,6 @@ "javascript.goToProjectConfig.title": "Zur Projektkonfiguration wechseln", "typescript.referencesCodeLens.enabled": "Aktiviert oder deaktiviert CodeLens-Verweise. Erfordert TypeScript 2.0.6 oder höher.", "typescript.implementationsCodeLens.enabled": "Aktiviert oder deaktiviert CodeLens-Implementierungen. Erfordert TypeScript 2.2.0 oder höher.", - "typescript.openTsServerLog.title": "TS Server-Protokolldatei öffnen", "typescript.selectTypeScriptVersion.title": "TypeScript-Version wählen", "jsDocCompletion.enabled": "Automatische JSDoc-Kommentare aktivieren/deaktivieren", "javascript.implicitProjectConfig.checkJs": "Aktiviert/deaktiviert die Semantikprüfung bei JavaScript-Dateien. Diese Einstellung wird von vorhandenen \"jsconfig.json\"- oder \"tsconfig.json\"-Dateien außer Kraft gesetzt. Erfordert TypeScript 2.3.1 oder höher.", diff --git a/i18n/deu/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/deu/src/vs/base/common/jsonErrorMessages.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/base/common/jsonErrorMessages.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/code/electron-main/menus.i18n.json b/i18n/deu/src/vs/code/electron-main/menus.i18n.json index 55751eba867..9b4d51238e4 100644 --- a/i18n/deu/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/deu/src/vs/code/electron-main/menus.i18n.json @@ -69,7 +69,6 @@ "miSmartSelectShrink": "Au&&swahl verkleinern", "miViewExplorer": "&&Explorer", "miViewSearch": "&&Suchen", - "miViewGit": "&&Git", "miViewDebug": "&&Debuggen", "miViewExtensions": "E&&xtensions", "miToggleOutput": "&&Ausgabe", diff --git a/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json index 2fe70e62eed..c3e22e8d671 100644 --- a/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -62,6 +62,7 @@ "renderLineHighlight": "Steuert, wie der Editor die aktuelle Zeilenhervorhebung rendern soll. Mögliche Werte sind \"none\", \"gutter\", \"line\" und \"all\".", "codeLens": "Steuert, ob der Editor CodeLenses anzeigt.", "folding": "Steuert, ob für den Editor Codefaltung aktiviert ist.", + "hideFoldIcons": "Steuert, ob die Falt-Symbole an der Leiste automatisch ausgeblendet werden.", "matchBrackets": "Übereinstimmende Klammern hervorheben, wenn eine davon ausgewählt wird.", "glyphMargin": "Steuert, ob der Editor den vertikalen Glyphenrand rendert. Der Glyphenrand wird hauptsächlich zum Debuggen verwendet.", "useTabStops": "Das Einfügen und Löschen von Leerzeichen folgt auf Tabstopps.", diff --git a/i18n/deu/src/vs/editor/common/config/editorOptions.i18n.json b/i18n/deu/src/vs/editor/common/config/editorOptions.i18n.json new file mode 100644 index 00000000000..2e06d6b808a --- /dev/null +++ b/i18n/deu/src/vs/editor/common/config/editorOptions.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorViewAccessibleLabel": "Editor-Inhalt" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/hover/browser/hover.i18n.json b/i18n/deu/src/vs/editor/contrib/hover/browser/hover.i18n.json index d1a57ea3274..44bcefc0805 100644 --- a/i18n/deu/src/vs/editor/contrib/hover/browser/hover.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/hover/browser/hover.i18n.json @@ -4,8 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "showHover": "Hovern anzeigen", - "hoverHighlight": "Hervorhebung eines Worts, unter dem ein Mauszeiger angezeigt wird.", - "hoverBackground": "Background color of the editor hover.", - "hoverBorder": "Rahmenfarbe des Editor-Mauszeigers." + "showHover": "Hovern anzeigen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json b/i18n/deu/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json index 5423f336ae3..d115a4e214a 100644 --- a/i18n/deu/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json @@ -16,8 +16,6 @@ "peekViewTitleInfoForeground": "Farbe der Titelinformationen in der Peek-Ansicht.", "peekViewBorder": "Farbe der Peek-Ansichtsränder und des Pfeils.", "peekViewResultsBackground": "Hintergrundfarbe der Ergebnisliste in der Peek-Ansicht.", - "peekViewResultsMatchForeground": "Vordergrund für Übereinstimmungseinträge in der Ergebnisliste der Peek-Ansicht.", - "peekViewResultsFileForeground": "Vordergrund für Dateieinträge in der Ergebnisliste der Peek-Ansicht.", "peekViewResultsSelectionBackground": "Hintergrundfarbe des ausgewählten Eintrags in der Ergebnisliste der Peek-Ansicht.", "peekViewResultsSelectionForeground": "Vordergrundfarbe des ausgewählten Eintrags in der Ergebnisliste der Peek-Ansicht.", "peekViewEditorBackground": "Hintergrundfarbe des Peek-Editors.", diff --git a/i18n/deu/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/deu/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 7e17060c7d1..b63b3d41898 100644 --- a/i18n/deu/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,10 +9,8 @@ "editorSuggestWidgetForeground": "Vordergrundfarbe des Vorschlagswidgets.", "editorSuggestWidgetSelectedBackground": "Hintergrundfarbe des ausgewählten Eintrags im Vorschlagswidget.", "editorSuggestWidgetHighlightForeground": "Farbe der Trefferhervorhebung im Vorschlagswidget.", - "readMore": "Mehr anzeigen...{0}", "suggestionWithDetailsAriaLabel": "{0}, Vorschlag, hat Details", "suggestionAriaLabel": "{0}, Vorschlag", - "goback": "Zurück", "suggestWidget.loading": "Wird geladen...", "suggestWidget.noSuggestions": "Keine Vorschläge.", "suggestionAriaAccepted": "{0}, angenommen", diff --git a/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json index cbffdc17751..f29acd79682 100644 --- a/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -28,8 +28,6 @@ "listActiveSelectionBackground": "Hintergrundfarbe der Liste/Struktur für das ausgewählte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.", "listInactiveSelectionBackground": "Hintergrundfarbe der Liste/Struktur für das ausgewählte Element, wenn die Liste/Struktur inaktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.", "listActiveSelectionForeground": "Vordergrundfarbe der Liste/Struktur für das ausgewählte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.", - "listFocusAndSelectionBackground": "Hintergrundfarbe der Liste/Struktur für das fokussierte und ausgewählte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht. Diese Farbe hat Vorrang vor der individuellen Auswahl und den Fokusfarben.", - "listFocusAndSelectionForeground": "Vordergrundfarbe der Liste/Struktur für das fokussierte und ausgewählte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht. Diese Farbe hat Vorrang vor der individuellen Auswahl und den Fokusfarben.", "listHoverBackground": "Hintergrund der Liste/Struktur, wenn mit der Maus auf Elemente gezeigt wird.", "listDropBackground": "Drag & Drop-Hintergrund der Liste/Struktur, wenn Elemente mithilfe der Maus verschoben werden.", "highlight": "Vordergrundfarbe der Liste/Struktur zur Trefferhervorhebung beim Suchen innerhalb der Liste/Struktur.", @@ -50,7 +48,9 @@ "editorFindMatch": "Farbe des aktuellen Suchergebnisses.", "findMatchHighlight": "Farbe der anderen Suchtreffer.", "findRangeHighlight": "Farbe des Bereichs zur Einschränkung der Suche.", + "hoverHighlight": "Hervorhebung eines Worts, unter dem ein Mauszeiger angezeigt wird.", + "hoverBackground": "Background color of the editor hover.", + "hoverBorder": "Rahmenfarbe des Editor-Mauszeigers.", "activeLinkForeground": "Farbe der aktiven Links.", - "linkForeground": "Farbe der Links.", "editorWidgetBackground": "Hintergrundfarbe von Editor-Widgets wie zum Beispiel Suchen/Ersetzen." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/api/node/extHostExplorerView.i18n.json b/i18n/deu/src/vs/workbench/api/node/extHostExplorerView.i18n.json new file mode 100644 index 00000000000..c6eed83d999 --- /dev/null +++ b/i18n/deu/src/vs/workbench/api/node/extHostExplorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "treeExplorer.notRegistered": "Es ist kein TreeExplorerNodeProvider mit ID \"{0}\" registriert.", + "treeExplorer.failedToProvideRootNode": "TreeExplorerNodeProvider \"{0}\" hat keinen Stammknoten bereitgestellt." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/browser/actions/configureLocale.i18n.json b/i18n/deu/src/vs/workbench/browser/actions/configureLocale.i18n.json index 32abf05f8cb..a6835e15a6d 100644 --- a/i18n/deu/src/vs/workbench/browser/actions/configureLocale.i18n.json +++ b/i18n/deu/src/vs/workbench/browser/actions/configureLocale.i18n.json @@ -7,7 +7,6 @@ "configureLocale": "Sprache konfigurieren", "displayLanguage": "Definiert die Anzeigesprache von VSCode.", "doc": "Unter {0} finden Sie eine Liste der unterstützten Sprachen.", - "restart": "Das Ändern des Werts erfordert einen Neustart von VSCode.", "fail.createSettings": "{0} ({1}) kann nicht erstellt werden.", "JsonSchema.locale": "Die zu verwendende Sprache der Benutzeroberfläche." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/common/theme.i18n.json b/i18n/deu/src/vs/workbench/common/theme.i18n.json index 3fab9e56ce5..825c4c4c377 100644 --- a/i18n/deu/src/vs/workbench/common/theme.i18n.json +++ b/i18n/deu/src/vs/workbench/common/theme.i18n.json @@ -4,19 +4,14 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "tabsContainerBackground": "Hintergrundfarbe der aktiven Registerkarte. Registerkarten sind die Container für Editors im Editorbereich. In einer Editorgruppe können mehrere Registerkarten geöffnet werden. Mehrere Editorgruppen können vorhanden sein.", "tabActiveBackground": "Hintergrundfarbe der aktiven Registerkarte. Registerkarten sind die Container für Editors im Editorbereich. In einer Editorgruppe können mehrere Registerkarten geöffnet werden. Mehrere Editorgruppen können vorhanden sein.", "tabInactiveBackground": "Hintergrundfarbe der inaktiven Registerkarte. Registerkarten sind die Container für Editors im Editorbereich. In einer Editorgruppe können mehrere Registerkarten geöffnet werden. Mehrere Editorgruppen können vorhanden sein.", "tabBorder": "Rahmen zum Trennen von Registerkarten. Registerkarten sind die Container für Editoren im Editor-Bereich. In einer Editor-Gruppe können mehrere Registerkarten geöffnet werden. Mehrere Editor-Gruppen sind möglich.", "tabActiveEditorGroupActiveForeground": "Vordergrundfarbe der aktiven Registerkarte in einer aktiven Gruppe. Registerkarten sind die Container für Editors im Editorbereich. In einer Editorgruppe können mehrere Registerkarten geöffnet werden. Mehrere Editorgruppen können vorhanden sein.", - "tabActiveEditorGroupInactiveForeground": "Vordergrundfarbe der aktiven Registerkarte in einer inaktiven Gruppe. Registerkarten sind die Container für Editors im Editorbereich. In einer Editorgruppe können mehrere Registerkarten geöffnet werden. Mehrere Editorgruppen können vorhanden sein.", "tabInactiveEditorGroupActiveForeground": "Vordergrundfarbe der inaktiven Registerkarte in einer aktiven Gruppe. Registerkarten sind die Container für Editors im Editorbereich. In einer Editorgruppe können mehrere Registerkarten geöffnet werden. Mehrere Editorgruppen können vorhanden sein.", - "tabInactiveEditorGroupInactiveForeground": "Vordergrundfarbe der inaktiven Registerkarte in einer inaktiven Gruppe. Registerkarten sind die Container für Editors im Editorbereich. In einer Editorgruppe können mehrere Registerkarten geöffnet werden. Mehrere Editorgruppen können vorhanden sein.", "editorGroupBackground": "Hintergrundfarbe einer Editor-Gruppe. Editor-Gruppen sind die Container der Editoren. Die Hintergrundfarbe wird beim Ziehen von Editoren angezeigt.", "editorGroupHeaderBackground": "Hintergrundfarbe der Titelüberschrift des Editors, wenn die Registerkarten deaktiviert sind. Editor-Gruppen sind die Container der Editoren.", "editorGroupBorder": "Farbe zum Trennen mehrerer Editor-Gruppen. Editor-Gruppen sind die Container der Editoren.", - "editorDragAndDropBackground": "Hintergrundfarbe beim Ziehen von Editoren.", - "editorMasterDetailsBorder": "Rahmenfarbe zum Trennen der Details der Masterseite für Editoren mit der Ansicht \"Nebeneinander\". Beispiele sind etwa Diff-Editoren und der Einstellungseditor.", "panelBackground": "Hintergrundfarbe des Panels. Panels werden unter dem Editorbereich angezeigt und enthalten Ansichten wie die Ausgabe und das integrierte Terminal.", "panelBorder": "Farbe des oberen Panelrahmens, der das Panel vom Editor abtrennt. Panels werden unter dem Editorbereich angezeigt und enthalten Ansichten wie die Ausgabe und das integrierten Terminal.", "panelActiveTitleForeground": "Titelfarbe für den aktiven Bereich. Bereiche werden unter dem Editorbereich angezeigt und enthalten Ansichten wie Ausgabe und integriertes Terminal.", @@ -31,7 +26,6 @@ "statusBarProminentItemHoverBackground": "Hintergrundfarbe für markante Elemente der Statusleiste, wenn auf diese gezeigt wird. Markante Elemente sind im Vergleich zu anderen Statusleisteneinträgen hervorgehoben, um auf ihre Bedeutung hinzuweisen. Die Statusleiste wird unten im Fenster angezeigt.", "activityBarBackground": "Hintergrundfarbe der Aktivitätsleiste. Die Aktivitätsleiste wird ganz links oder rechts angezeigt und ermöglicht das Wechseln zwischen verschiedenen Ansichten der Seitenleiste.", "activityBarForeground": "Vordergrundfarbe der Aktivitätsleiste (z. B. für Symbole). Die Aktivitätsleiste wird ganz links oder rechts angezeigt und ermöglicht das Wechseln zwischen verschiedenen Ansichten der Seitenleiste.", - "activityBarDragAndDropBackground": "Drag Drop-Feedbackfarbe für Elemente der Aktivitätsleiste. Die Aktivitätsleiste wird ganz links oder ganz rechts angezeigt und ermöglicht den Wechsel zwischen Ansichten der Seitenleiste.", "activityBarBadgeBackground": "Hintergrundfarbe für Aktivitätsinfobadge. Die Aktivitätsleiste wird ganz links oder ganz rechts angezeigt und ermöglicht den Wechsel zwischen Ansichten der Seitenleiste.", "activityBarBadgeForeground": "Vordergrundfarbe für Aktivitätsinfobadge. Die Aktivitätsleiste wird ganz links oder ganz rechts angezeigt und ermöglicht den Wechsel zwischen Ansichten der Seitenleiste.", "sideBarBackground": "Hintergrundfarbe der Seitenleiste. Die Seitenleiste ist der Container für Ansichten wie den Explorer und die Suche.", diff --git a/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json index 9f73db52ca6..e519ed643e2 100644 --- a/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -41,7 +41,6 @@ "window.newWindowDimensions.inherit": "Öffnet neue Fenster mit den gleichen Abmessungen wie das letzte aktive Fenster.", "window.newWindowDimensions.maximized": "Öffnet neue Fenster maximiert.", "window.newWindowDimensions.fullscreen": "Öffnet neue Fenster im Vollbildmodus.", - "newWindowDimensions": "Steuert die Abmessungen beim Öffnen eines neuen Fensters. Standardmäßig wird in der Mitte des Bildschirms ein neues Fenster mit kleinen Abmessungen geöffnet. Bei der Einstellung \"inherit\" erhält das Fenster die gleichen Abmessungen wie das letzte aktive Fenster. Bei der Einstellung \"maximized\" wird das Fenster maximiert geöffnet, und bei \"fullscreen\" wird es im Vollbildmodus geöffnet.", "window.menuBarVisibility.default": "Das Menü ist nur im Vollbildmodus ausgeblendet.", "window.menuBarVisibility.visible": "Das Menu wird immer angezeigt, auch im Vollbildmodus.", "window.menuBarVisibility.toggle": "Das Menu ist ausgeblendet, kann aber mit der Alt-Taste angezeigt werden.", diff --git a/i18n/deu/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json new file mode 100644 index 00000000000..0506a861bbf --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileLinkMac": "Zum Öffnen klicken (CMD+KLICKEN für seitliche Anzeige)", + "fileLink": "Zum Öffnen klicken (STRG+KLICKEN für seitliche Anzeige)" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/common/debug.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/common/debug.i18n.json new file mode 100644 index 00000000000..a4c31f57de4 --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/debug/common/debug.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "internalConsoleOptions": "Steuert das Verhalten der internen Debugging-Konsole." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json index a145fe55185..dded802b64c 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json @@ -5,8 +5,6 @@ // Do not edit this file. It is machine generated. { "stateCapture": "Der Objektstatus wird aus der ersten Auswertung erfasst.", - "fileLinkMac": "Zum Öffnen klicken (CMD+KLICKEN für seitliche Anzeige)", - "fileLink": "Zum Öffnen klicken (STRG+KLICKEN für seitliche Anzeige)", "replVariableAriaLabel": "Variable {0} besitzt den Wert {1}, Read Eval Print-Loop, Debuggen", "replExpressionAriaLabel": "Ausdruck {0} besitzt den Wert {1}, Read Eval Print-Loop, Debuggen", "replValueOutputAriaLabel": "{0}, Read Eval Print-Loop, Debuggen", diff --git a/i18n/deu/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/deu/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 7f72591cc14..094d1188c24 100644 --- a/i18n/deu/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,13 +7,11 @@ "debugAdapterBinNotFound": "Die ausführbare Datei \"{0}\" des Debugadapters ist nicht vorhanden.", "debugAdapterCannotDetermineExecutable": "Die ausführbare Datei \"{0}\" des Debugadapters kann nicht bestimmt werden.", "debugType": "Der Typ der Konfiguration.", - "debugTypeNotRecognised": "Dieser Debugging-Typ wurde nicht erkannt. Bitte installiere die dazugehörige Debugging-Erweiterung.", "node2NotSupported": "\"node2\" wird nicht mehr unterstützt, verwenden Sie stattdessen \"node\", und legen Sie das Attribut \"protocol\" auf \"inspector\" fest.", "debugName": "Der Name der Konfiguration. Er wird im Dropdownmenü der Startkonfiguration angezeigt.", "debugRequest": "Der Anforderungstyp der Konfiguration. Der Wert kann \"launch\" oder \"attach\" sein.", "debugServer": "Nur für die Entwicklung von Debugerweiterungen: Wenn ein Port angegeben ist, versucht der VS-Code, eine Verbindung mit einem Debugadapter herzustellen, der im Servermodus ausgeführt wird.", "debugPrelaunchTask": "Ein Task, der ausgeführt werden soll, bevor die Debugsitzung beginnt.", - "internalConsoleOptions": "Steuert das Verhalten der internen Debugging-Konsole.", "debugWindowsConfiguration": "Windows-spezifische Startkonfigurationsattribute.", "debugOSXConfiguration": "OS X-spezifische Startkonfigurationsattribute.", "debugLinuxConfiguration": "Linux-spezifische Startkonfigurationsattribute.", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index e734318d0be..ab33ef36c7a 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,5 +8,7 @@ "showRecommendations": "Empfehlungen anzeigen", "neverShowAgain": "Nicht mehr anzeigen", "close": "Schließen", - "workspaceRecommended": "Für diesen Arbeitsbereich sind Extensionempfehlungen verfügbar." + "workspaceRecommended": "Für diesen Arbeitsbereich sind Extensionempfehlungen verfügbar.", + "no": "Nein", + "cancel": "Abbrechen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 6613fe557a2..8880b15033b 100644 --- a/i18n/deu/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -27,8 +27,6 @@ "autoSaveDelay": "Steuert die Verzögerung in Millisekunden, nach der eine geänderte Datei automatisch gespeichert wird. Nur gültig, wenn \"files.autoSave\" auf \"{0}\" festgelegt ist.", "watcherExclude": "Konfigurieren Sie Globmuster von Dateipfaden, die aus der Dateiüberwachung ausgeschlossen werden sollen. Das Ändern dieser Einstellung erfordert einen Neustart. Wenn Ihr Code beim Starten viel CPU-Zeit benötigt, können Sie große Ordner ausschließen, um die Anfangslast zu verringern.", "hotExit.off": "Hot Exit deaktivieren.", - "hotExit.onExit": "Hot Exit wird beim Schließen der Anwendung ausgelöst, d. h. wenn unter Windows/Linux das letzte Fenster geschlossen wird oder wenn der Befehl \"workbench.action.quit\" ausgelöst wird (Befehlspalette, Tastenzuordnung, Menü). Alle Fenster mit Sicherungen werden beim nächsten Start wiederhergestellt.", - "hotExit.onExitAndWindowClose": "Hot Exit wird beim Schließen der Anwendung ausgelöst, d. h. wenn unter Windows/Linux das letzte Fenster geschlossen wird oder wenn der Befehl \"workbench.action.quit\" ausgelöst wird (Befehlspalette, Tastenzuordnung, Menü) sowie für jedes Fenster mit einem geöffneten Ordner, unabhängig davon, ob dies das letzte Fenster ist. Alle Fenster ohne geöffnete Ordner werden beim nächsten Start wiederhergestellt. Legen Sie \"window.reopenFolders\" auf \"all\" fest, damit die Ordnerfenster wie vor dem Heruntergefahren wiederhergestellt werden.", "hotExit": "Steuert, ob nicht gespeicherten Dateien zwischen den Sitzungen beibehlten werden, die Aufforderung zum Speichern wird beim Beenden des Editors übersprungen.", "defaultLanguage": "Der Standardsprachmodus, der neuen Dateien zugewiesen wird.", "editorConfigurationTitle": "Editor", diff --git a/i18n/deu/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json b/i18n/deu/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json index c15dc7a27b9..e7724dc5035 100644 --- a/i18n/deu/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json @@ -6,7 +6,5 @@ { "searchMatches": "{0} Übereinstimmungen gefunden", "searchMatch": "{0} Übereinstimmung gefunden", - "fileMatchAriaLabel": "{0} Übereinstimmungen in der Datei \"{1}\" des Ordners \"{2}\", Suchergebnis", - "replacePreviewResultAria": "Vorschauergebnis ersetzen, {0}", - "searchResultAria": "{0}, Suchergebnis" + "fileMatchAriaLabel": "{0} Übereinstimmungen in der Datei \"{1}\" des Ordners \"{2}\", Suchergebnis" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 49ebe70befe..aedbe077c16 100644 --- a/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -18,7 +18,6 @@ "problems": "Probleme", "manyMarkers": "mehr als 99", "tasks": "Aufgaben", - "TaskSystem.noHotSwap": "Zum Ändern des Aufgabenausführungsmoduls muss VS Code neu gestartet werden. Die Änderung wird ignoriert.", "TaskService.noBuildTask": "Keine Buildaufgabe definiert. Markieren Sie eine Aufgabe mit 'isBuildCommand' in der tasks.json-Datei.", "TaskService.noTestTask": "Keine Testaufgabe definiert. Markieren Sie eine Aufgabe mit 'isTestCommand' in der tasks.json-Datei.", "TaskServer.noTask": "Die angeforderte auszuführende Aufgabe {0} wurde nicht gefunden.", diff --git a/i18n/deu/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 30cc79ff848..82b8c378940 100644 --- a/i18n/deu/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,7 +6,6 @@ { "selectTheme.label": "Farbdesign", "installColorThemes": "Zusätzliche Farbschemas installieren...", - "problemChangingTheme": "Problem beim Festlegen des Designs: {0}", "themes.selectTheme": "Farbdesign auswählen", "selectIconTheme.label": "Dateisymboldesign", "installIconThemes": "Zusätzliche Dateisymbolschemas installieren...", diff --git a/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 58ed1dbea5c..c0942a6e215 100644 --- a/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -5,10 +5,5 @@ // Do not edit this file. It is machine generated. { "errorUnknownKey": "Die Konfigurationsdatei kann nicht geschrieben werden (unbekannter Schlüssel).", - "errorInvalidTarget": "In die Konfigurationsdatei kann nicht geschrieben werden (ungültiges Ziel).", - "errorNoWorkspaceOpened": "Einstellungen können nicht geschrieben werden, weil kein Ordner geöffnet ist. Öffnen Sie zuerst einen Ordner, und versuchen Sie es erneut.", - "errorInvalidConfiguration": "Einstellungen können nicht geschrieben werden. Öffnen Sie **Benutzereinstellungen**, um Fehler/Warnungen in der Datei zu korrigieren, und versuchen Sie es erneut.", - "errorInvalidConfigurationWorkspace": "Einstellungen können nicht geschrieben werden. Öffnen Sie **Arbeitsbereichseinstellungen**, um Fehler/Warnungen in der Datei zu korrigieren, und versuchen Sie es erneut.", - "errorConfigurationFileDirty": "Einstellungen können nicht geschrieben werden, weil die Datei geändert wurde. Speichern Sie die Datei **Benutzereinstellungen\", und versuchen Sie es erneut.", - "errorConfigurationFileDirtyWorkspace": "Einstellungen können nicht geschrieben werden, weil die Datei geändert wurde. Speichern Sie die Datei **Arbeitsbereichseinstellungen\", und versuchen Sie es erneut." + "errorInvalidTarget": "In die Konfigurationsdatei kann nicht geschrieben werden (ungültiges Ziel)." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/deu/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index 96626f238f8..2bf19b5b050 100644 --- a/i18n/deu/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -14,9 +14,6 @@ "vscode.extension.contributes.keybindings.win": "Der Windows-spezifische Schlüssel oder die Schlüsselsequenz.", "vscode.extension.contributes.keybindings.when": "Die Bedingung, wann der Schlüssel aktiv ist.", "vscode.extension.contributes.keybindings": "Trägt Tastenbindungen bei.", - "openDocumentation": "Weitere Informationen", - "keybindingMigration.ok": "OK", - "keybindingMigration.prompt": "Für Ihr Tastaturlayout haben sich einige Tastenkombinationen geändert.", "invalid.keybindings": "Ungültige Angabe \"contributes.{0}\": {1}", "unboundCommands": "Die folgenden weiteren Befehle sind verfügbar: ", "keybindings.json.title": "Tastenbindungskonfiguration", diff --git a/i18n/esn/extensions/git/out/commands.i18n.json b/i18n/esn/extensions/git/out/commands.i18n.json index 9dab0b5e8a8..db106e2f05c 100644 --- a/i18n/esn/extensions/git/out/commands.i18n.json +++ b/i18n/esn/extensions/git/out/commands.i18n.json @@ -18,6 +18,8 @@ "discard": "Descartar cambios", "confirm discard all": "¿Está seguro de que quiere descartar TODOS los cambios? Esta acción es irreversible.", "discardAll": "Descartar cambios", + "yes": "Sí", + "always": "Siempre", "no changes": "No hay cambios para confirmar.", "commit message": "Mensaje de confirmación", "provide commit message": "Proporcione un mensaje de confirmación", diff --git a/i18n/esn/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/esn/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript/package.i18n.json b/i18n/esn/extensions/typescript/package.i18n.json index 28c86fc6060..70f4c257c8f 100644 --- a/i18n/esn/extensions/typescript/package.i18n.json +++ b/i18n/esn/extensions/typescript/package.i18n.json @@ -35,7 +35,6 @@ "javascript.goToProjectConfig.title": "Ir a configuración del proyecto", "typescript.referencesCodeLens.enabled": "Habilita o deshabilita referencias de CodeLens. Requiere TypeScript >= 2.0.6.", "typescript.implementationsCodeLens.enabled": "Habilita o deshabilita implementaciones de CodeLens. Requiere TypeScript >= 2.2.0.", - "typescript.openTsServerLog.title": "Abrir archivo de registro del servidor de TS", "typescript.selectTypeScriptVersion.title": "Seleccionar versión de TypeScript", "jsDocCompletion.enabled": "Habilita o deshabilita comentarios automaticos de JSDoc", "javascript.implicitProjectConfig.checkJs": "Habilita/deshabilita la comprobación semántica de los archivos JavaScript. Los archivos jsconfig.json o tsconfig.json reemplazan esta configuración. Se requiere TypeScript >=2.3.1.", diff --git a/i18n/esn/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/esn/src/vs/base/common/jsonErrorMessages.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/base/common/jsonErrorMessages.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/code/electron-main/menus.i18n.json b/i18n/esn/src/vs/code/electron-main/menus.i18n.json index 5e16ab703c7..156ec87d003 100644 --- a/i18n/esn/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/esn/src/vs/code/electron-main/menus.i18n.json @@ -14,6 +14,7 @@ "mHelp": "Ayuda", "miNewWindow": "&&Nueva ventana", "mAbout": "Acerca de {0}", + "mServices": "Servicios", "mHide": "Ocultar {0}", "mHideOthers": "Ocultar otros", "mShowAll": "Mostrar todo", @@ -69,7 +70,6 @@ "miSmartSelectShrink": "&&Reducir selección", "miViewExplorer": "&&Explorador", "miViewSearch": "&&Buscar", - "miViewGit": "&&Git", "miViewDebug": "&&Depurar", "miViewExtensions": "E&&xtensiones", "miToggleOutput": "&&Salida", diff --git a/i18n/esn/src/vs/editor/common/config/editorOptions.i18n.json b/i18n/esn/src/vs/editor/common/config/editorOptions.i18n.json new file mode 100644 index 00000000000..b1da401aa98 --- /dev/null +++ b/i18n/esn/src/vs/editor/common/config/editorOptions.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorViewAccessibleLabel": "Contenido del editor" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json index 6c525e9a528..a34fb8f6c80 100644 --- a/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -10,5 +10,7 @@ "caret": "Color del cursor del editor.", "editorWhitespaces": "Color de los caracteres de espacio en blanco del editor.", "editorIndentGuides": "Color de las guías de sangría del editor.", - "editorLineNumbers": "Color de números de línea del editor." + "editorLineNumbers": "Color de números de línea del editor.", + "editorCodeLensForeground": "Color principal de lentes de código en el editor", + "editorBracketMatchBackground": "Color de fondo tras corchetes coincidentes" } \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/hover/browser/hover.i18n.json b/i18n/esn/src/vs/editor/contrib/hover/browser/hover.i18n.json index 0ed29121cae..c190af1321d 100644 --- a/i18n/esn/src/vs/editor/contrib/hover/browser/hover.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/hover/browser/hover.i18n.json @@ -4,8 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "showHover": "Mostrar al mantener el puntero", - "hoverHighlight": "Resaltado debajo de la palabra para la que se muestra un recuadro al mantener el puntero.", - "hoverBackground": "Color de fondo al mantener el puntero en el editor.", - "hoverBorder": "Color del borde al mantener el puntero en el editor." + "showHover": "Mostrar al mantener el puntero" } \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json b/i18n/esn/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json index 21b8d8ce3d6..d5f1fe00dd2 100644 --- a/i18n/esn/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json @@ -16,8 +16,6 @@ "peekViewTitleInfoForeground": "Color de la información del título de la vista de inspección.", "peekViewBorder": "Color de los bordes y la flecha de la vista de inspección.", "peekViewResultsBackground": "Color de fondo de la lista de resultados de vista de inspección.", - "peekViewResultsMatchForeground": "Buscar coincidencia con el primer plano de entrada de la lista de resultados de vista de inspección.", - "peekViewResultsFileForeground": "Primer plano de la entrada de archivo en la lista de resultados de vista de inspección.", "peekViewResultsSelectionBackground": "Color de fondo de la entrada seleccionada en la lista de resultados de vista de inspección.", "peekViewResultsSelectionForeground": "Color de primer plano de la entrada seleccionada en la lista de resultados de vista de inspección.", "peekViewEditorBackground": "Color de fondo del editor de vista de inspección.", diff --git a/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index c39e54e06e8..6f314db4b76 100644 --- a/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,10 +9,8 @@ "editorSuggestWidgetForeground": "Color de primer plano del widget sugerido.", "editorSuggestWidgetSelectedBackground": "Color de fondo de la entrada seleccionada del widget sugerido.", "editorSuggestWidgetHighlightForeground": "Color del resaltado coincidido en el widget sugerido.", - "readMore": "Leer más...{0}", "suggestionWithDetailsAriaLabel": "{0}, sugerencia, con detalles", "suggestionAriaLabel": "{0}, sugerencia", - "goback": "Volver", "suggestWidget.loading": "Cargando...", "suggestWidget.noSuggestions": "No hay sugerencias.", "suggestionAriaAccepted": "{0}, aceptada", diff --git a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json index 9d9422600d4..891fb1b41ee 100644 --- a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -28,8 +28,6 @@ "listActiveSelectionBackground": "Color de fondo de la lista o el árbol del elemento seleccionado cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", "listInactiveSelectionBackground": "Color de fondo de la lista o el árbol del elemento seleccionado cuando la lista o el árbol están inactivos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", "listActiveSelectionForeground": "Color de primer plano de la lista o el árbol del elemento con el foco cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", - "listFocusAndSelectionBackground": "Color de fondo de la lista o el árbol del elemento con foco y seleccionado cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no. Este color tiene preferencia sobre los colores de selección y foco individuales.", - "listFocusAndSelectionForeground": "Color de primer plano de la lista o el árbol del elemento con foco y seleccionado cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no. Este color tiene preferencia sobre los colores de selección y foco individuales.", "listHoverBackground": "Fondo de la lista o el árbol al mantener el mouse sobre los elementos.", "listDropBackground": "Fondo de arrastrar y colocar la lista o el árbol al mover los elementos con el mouse.", "highlight": "Color de primer plano de la lista o el árbol de las coincidencias resaltadas al buscar dentro de la lista o el ábol.", @@ -50,7 +48,9 @@ "editorFindMatch": "Color de la coincidencia de búsqueda actual.", "findMatchHighlight": "Color de las demás coincidencias de búsqueda.", "findRangeHighlight": "Color del intervalo que limita la búsqueda.", + "hoverHighlight": "Resaltado debajo de la palabra para la que se muestra un recuadro al mantener el puntero.", + "hoverBackground": "Color de fondo al mantener el puntero en el editor.", + "hoverBorder": "Color del borde al mantener el puntero en el editor.", "activeLinkForeground": "Color de los vínculos activos.", - "linkForeground": "Color de los vínculos.", "editorWidgetBackground": "Color de fondo del editor de widgets como buscar/reemplazar" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/api/node/extHostExplorerView.i18n.json b/i18n/esn/src/vs/workbench/api/node/extHostExplorerView.i18n.json new file mode 100644 index 00000000000..7d556561528 --- /dev/null +++ b/i18n/esn/src/vs/workbench/api/node/extHostExplorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "treeExplorer.notRegistered": "No hay registrado ningún TreeExplorerNodeProvider con el identificador \"{0}\".", + "treeExplorer.failedToProvideRootNode": "TreeExplorerNodeProvider \"{0}\" no pudo proporcionar el nodo raíz." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/browser/actions/configureLocale.i18n.json b/i18n/esn/src/vs/workbench/browser/actions/configureLocale.i18n.json index 21745b9eaa0..949ae20646f 100644 --- a/i18n/esn/src/vs/workbench/browser/actions/configureLocale.i18n.json +++ b/i18n/esn/src/vs/workbench/browser/actions/configureLocale.i18n.json @@ -7,7 +7,7 @@ "configureLocale": "Configurar idioma", "displayLanguage": "Define el lenguaje para mostrar de VSCode.", "doc": "Consulte {0} para obtener una lista de idiomas compatibles.", - "restart": "Al cambiar el valor, es necesario reiniciar VSCode.", + "restart": "Al cambiar el valor se requiere reiniciar VSCode.", "fail.createSettings": "No se puede crear '{0}' ({1}).", "JsonSchema.locale": "Idioma de la interfaz de usuario que debe usarse." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/common/theme.i18n.json b/i18n/esn/src/vs/workbench/common/theme.i18n.json index c6ab3bc258a..d75793eedac 100644 --- a/i18n/esn/src/vs/workbench/common/theme.i18n.json +++ b/i18n/esn/src/vs/workbench/common/theme.i18n.json @@ -4,19 +4,14 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "tabsContainerBackground": "Color de fondo del contenedor de las pestañas. Las pestañas son contenedores de editores en el área de editores. Se pueden abrir varias pestañas en un grupo de editores y puede haber varios grupos de editores.", "tabActiveBackground": "Color de fondo de la pestaña activa. Las pestañas son los contenedores de los editores en el área de editores. Se pueden abrir varias pestañas en un grupo de editores. Puede haber varios grupos de editores.", "tabInactiveBackground": "Color de fondo de la pestaña inactiva. Las pestañas son los contenedores de los editores en el área de editores. Se pueden abrir varias pestañas en un grupo de editores. Puede haber varios grupos de editores.", "tabBorder": "Borde para separar las pestañas entre sí. Las pestañas son contenedores de editores en el área de editores. Se pueden abrir varias pestañas en un grupo de editores. Puede haber varios grupos de editores.", "tabActiveEditorGroupActiveForeground": "Color de primer plano de la pestaña activa en un grupo activo. Las pestañas son los contenedores de los editores en el área de editores. Se pueden abrir varias pestañas en un grupo de editores. Puede haber varios grupos de editores.", - "tabActiveEditorGroupInactiveForeground": "Color de primer plano de la pestaña activa en un grupo inactivo. Las pestañas son los contenedores de los editores en el área de editores. Se pueden abrir varias pestañas en un grupo de editores. Puede haber varios grupos de editores.", "tabInactiveEditorGroupActiveForeground": "Color de primer plano de la pestaña inactiva en un grupo activo. Las pestañas son los contenedores de los editores en el área de editores. Se pueden abrir varias pestañas en un grupo de editores. Puede haber varios grupos de editores.", - "tabInactiveEditorGroupInactiveForeground": "Color de primer plano de la pestaña inactiva en un grupo inactivo. Las pestañas son los contenedores de los editores en el área de editores. Se pueden abrir varias pestañas en un grupo de editores. Puede haber varios grupos de editores.", "editorGroupBackground": "Color de fondo de un grupo de editores. Los grupos de editores son los contenedores de los editores. El color de fondo se ve cuando se mueven arrastrando los grupos de editores.", "editorGroupHeaderBackground": "Color de fondo del encabezado del título del grupo de editores cuando las fichas están deshabilitadas. Los grupos de editores son contenedores de editores.", "editorGroupBorder": "Color para separar varios grupos de editores entre sí. Los grupos de editores son los contenedores de los editores.", - "editorDragAndDropBackground": "Color de fondo cuando se arrastran editores.", - "editorMasterDetailsBorder": "Color del borde para separar los detalles del lado maestro de editores en paralelo, por ejemplo el editor de diff y el de configuración.", "panelBackground": "Color de fondo del panel. Los paneles se muestran debajo del área de editores y contienen vistas, como Salida y Terminal integrado.", "panelBorder": "Color del borde superior del panel que lo separa del editor. Los paneles se muestran debajo del área de editores y contienen vistas, como Salida y Terminal integrado.", "panelActiveTitleForeground": "Color del título del panel activo. Los paneles se muestran debajo del área del editor y contienen vistas como Salida y Terminal integrado.", @@ -31,7 +26,6 @@ "statusBarProminentItemHoverBackground": "Color de fondo de los elementos destacados en la barra de estado cuando se mantiene el mouse sobre estos elementos. Estos elementos sobresalen para indicar importancia. La barra de estado está ubicada en la parte inferior de la ventana.", "activityBarBackground": "Color de fondo de la barra de actividad, que se muestra en el lado izquierdo o derecho y que permite cambiar entre diferentes vistas de la barra lateral.", "activityBarForeground": "Color de fondo de la barra de actividad (por ejemplo utilizado por los iconos). La barra de actividad muestra en el lado izquierdo o derecho y permite cambiar entre diferentes vistas de la barra lateral.", - "activityBarDragAndDropBackground": "Color de arrastrar y colocar comentarios de la barra de actividad. La barra de actividad se muestra en el extremo izquierdo o derecho y permite cambiar entre vistas de la barra lateral.", "activityBarBadgeBackground": "Color de fondo de distintivo de notificación de actividad. La barra de actividad se muestra en el extremo izquierdo o derecho y permite cambiar entre vistas de la barra lateral.", "activityBarBadgeForeground": "Color de primer plano de distintivo de notificación de actividad. La barra de actividad se muestra en el extremo izquierdo o derecho y permite cambiar entre vistas de la barra lateral.", "sideBarBackground": "Color de fondo de la barra lateral, que es el contenedor de vistas como Explorador y Búsqueda.", diff --git a/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json index 4ebbc371d0d..62df1ce4df9 100644 --- a/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -41,12 +41,12 @@ "window.newWindowDimensions.inherit": "Abrir las nuevas ventanas con la misma dimensión que la última activa.", "window.newWindowDimensions.maximized": "Abrir las nuevas ventanas maximizadas.", "window.newWindowDimensions.fullscreen": "Abrir las nuevas ventanas en modo de pantalla completa.", - "newWindowDimensions": "Controla las dimensiones de la apertura de una nueva ventana. De manera predeterminada, una nueva ventana se abrirá en el centro de la pantalla con dimensiones reducidas. Si se establece en \"inherit\", la ventana tendrá las mismas dimensiones que la última activa. Si se establece en \"maximized\", la ventana se abrirá en su valor máximo y a pantalla completa si se establece en \"fullscreen\".", "window.menuBarVisibility.default": "El menú solo está oculto en modo de pantalla completa.", "window.menuBarVisibility.visible": "El menú está siempre visible incluso en modo de pantalla completa.", "window.menuBarVisibility.toggle": "El menú está oculto pero se puede mostrar mediante la tecla Alt.", "window.menuBarVisibility.hidden": "El menú está siempre oculto.", "menuBarVisibility": "Controla la visibilidad de la barra de menús. El valor \"alternar\" significa que la barra de menús está oculta y que se mostrará al presionar una sola vez la tecla Alt. La barra de menús estará visible de forma predeterminada, a menos que se use el modo de pantalla completa para la ventana.", + "enableMenuBarMnemonics": "Si se activa, los menús principales se pueden abrir por mediación de los métodos abreviados Alt-tecla. Desactivar los mnemónicos permite vincular estos métodos Alt-tecla a comandos del editor.", "autoDetectHighContrast": "Si está habilitado, se cambiará automáticamente al tema de contraste alto si Windows utiliza un tema de contraste alto, y al tema oscuro si cambia desde un tema de contraste alto de Windows.", "titleBarStyle": "Ajuste la apariencia de la barra de título de la ventana. Se debe realizar un reinicio completo para aplicar los cambios.", "window.nativeTabs": "Habilita las fichas de ventana en macOS Sierra. Note que los cambios requieren que reinicie el equipo y las fichas nativas deshabilitan cualquier estilo personalizado que haya configurado.", diff --git a/i18n/esn/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json new file mode 100644 index 00000000000..7b43ce773f7 --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileLinkMac": "Clic para seguir (Cmd + clic se abre en el lateral)", + "fileLink": "Clic para seguir (Ctrl + clic se abre en el lateral)" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/common/debug.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/common/debug.i18n.json new file mode 100644 index 00000000000..ba49f6334da --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/debug/common/debug.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "internalConsoleOptions": "Controla el comportamiento de la consola de depuración interna." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json index e430f864249..c71edc9f51f 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json @@ -5,8 +5,6 @@ // Do not edit this file. It is machine generated. { "stateCapture": "El estado del objeto se captura desde la primera evaluación", - "fileLinkMac": "Clic para seguir (Cmd + clic se abre en el lateral)", - "fileLink": "Clic para seguir (Ctrl + clic se abre en el lateral)", "replVariableAriaLabel": "La variable {0} tiene el valor {1}, read–eval–print loop, depuración", "replExpressionAriaLabel": "La expresión {0} tiene el valor {1}, read–eval–print loop, depuración", "replValueOutputAriaLabel": "{0}, read–eval–print loop, depuración", diff --git a/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 7a35ad366fb..00a55728fff 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,13 +7,12 @@ "debugAdapterBinNotFound": "El ejecutable del adaptador de depuración \"{0}\" no existe.", "debugAdapterCannotDetermineExecutable": "No se puede determinar el ejecutable para el adaptador de depuración \"{0}\".", "debugType": "Tipo de configuración.", - "debugTypeNotRecognised": "Este tipo de depuración no se reconoce. Instale la correspondiente extensión de depuración.", + "debugTypeNotRecognised": "Este tipo de depuración no se reconoce. Compruebe que tiene instalada la correspondiente extensión de depuración y que está habilitada.", "node2NotSupported": "\"node2\" ya no se admite; use \"node\" en su lugar y establezca el atributo \"protocol\" en \"inspector\".", "debugName": "Nombre de la configuración. Aparece en el menú desplegable de la configuración de inicio.", "debugRequest": "Tipo de solicitud de la configuración. Puede ser \"launch\" o \"attach\".", "debugServer": "Solo para el desarrollo de extensiones de depuración: si se especifica un puerto, VS Code intenta conectarse a un adaptador de depuración que se ejecuta en modo servidor", "debugPrelaunchTask": "Tarea que se va a ejecutar antes de iniciarse la sesión de depuración.", - "internalConsoleOptions": "Controla el comportamiento de la consola de depuración interna.", "debugWindowsConfiguration": "Atributos de configuración de inicio específicos de Windows.", "debugOSXConfiguration": "Atributos de configuración de inicio específicos de OS X.", "debugLinuxConfiguration": "Atributos de configuración de inicio específicos de Linux.", diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index e9448e4adfd..845e8de1c17 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,5 +8,9 @@ "showRecommendations": "Mostrar recomendaciones", "neverShowAgain": "No volver a mostrar", "close": "Cerrar", - "workspaceRecommended": "Esta área de trabajo tiene recomendaciones de extensión." + "workspaceRecommended": "Esta área de trabajo tiene recomendaciones de extensión.", + "ignoreExtensionRecommendations": "¿Desea despreciar todas las recomendaciones de extensión?", + "ignoreAll": "Sí, despreciar todas.", + "no": "No", + "cancel": "Cancelar" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json index c7bb64b9c26..cfbe38f24db 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json @@ -10,5 +10,6 @@ "extensions": "Extensiones", "view": "Ver", "extensionsConfigurationTitle": "Extensiones", - "extensionsAutoUpdate": "Actualizar extensiones automáticamente" + "extensionsAutoUpdate": "Actualizar extensiones automáticamente", + "extensionsIgnoreRecommendations": "No tener en cuenta las recomendaciones de extensión." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index d7457f5305a..9b8bcb5fdf1 100644 --- a/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -27,8 +27,8 @@ "autoSaveDelay": "Controla el retraso en MS tras el cual un archivo con modificaciones se guarda automáticamente. Solo se aplica si \"files.autoSave\" está establecido en \"{0}\"", "watcherExclude": "Configure patrones globales de las rutas de acceso de archivo que se van a excluir de la inspección de archivos. Al cambiar esta configuración, es necesario reiniciar. Si observa que Code consume mucho tiempo de CPU al iniciarse, puede excluir las carpetas grandes para reducir la carga inicial.", "hotExit.off": "Deshabilita la salida rápida.", - "hotExit.onExit": "La salida rápida se desencadena al cerrar la aplicación, es decir, al cerrarse la última ventana en Windows o Linux, o cuando se desencadena el comando workbench.action.quit (paleta de comandos, enlace de teclado, menú). Todas las ventanas con copias de seguridad se restaurarán en el próximo inicio.", - "hotExit.onExitAndWindowClose": "hotExit se desencadena al cerrar la aplicación, es decir, al cerrarse la última ventana en Windows/Linux o cuando se desencadena el comando workbench.action.quit (paleta de comandos, enlace de teclado, menú). También para cualquier ventana que tenga una carpeta abierta, independientemente de que sea o no la última ventana. Todas las ventanas sin carpetas abiertas se restaurarán la próxima vez que se inicie. Para restaurar las ventanas con carpetas tal cual estaban antes de cerrarse, establezca \"window.reopenFolders\" en \"all\".", + "hotExit.onExit": "hotExit se desencadena al cerrar la aplicación, es decir, al cerrarse la última ventana en Windows/Linux o cuando se desencadena el comando workbench.action.quit (paleta de comandos, enlace de teclado, menú). Todas las ventanas con copias de seguridad se restaurarán la próxima vez que se inicie.", + "hotExit.onExitAndWindowClose": "HotExit se desencadena al cerrar la aplicación, es decir, al cerrarse la última ventana en Windows/Linux o cuando se desencadena el comando workbench.action.quit (paleta de comandos, enlace de teclado, menú). También para cualquier ventana que tenga una carpeta abierta, independientemente de que sea o no la última ventana. Todas las ventanas sin carpetas abiertas se restaurarán la próxima vez que se inicie. Para restaurar las ventanas con carpetas tal cual estaban antes de cerrarse, establezca \"window.reopenFolders\" en \"all\".", "hotExit": "Controla si los archivos no guardados se recuerdan entre las sesiones, lo que permite omitir el mensaje para guardar al salir del editor.", "defaultLanguage": "El modo de lenguaje predeterminado que se asigna a nuevos archivos.", "editorConfigurationTitle": "Editor", diff --git a/i18n/esn/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json b/i18n/esn/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json index c7aea1a3bf6..af465625f5d 100644 --- a/i18n/esn/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json @@ -6,7 +6,5 @@ { "searchMatches": "{0} coincidencias encontradas", "searchMatch": "{0} coincidencia encontrada", - "fileMatchAriaLabel": "{0} coincidencias en el archivo {1} de la carpeta {2}, resultados de la búsqueda", - "replacePreviewResultAria": "Reemplazar resultado de vista previa, {0}", - "searchResultAria": "{0}, resultado de la búsqueda" + "fileMatchAriaLabel": "{0} coincidencias en el archivo {1} de la carpeta {2}, resultados de la búsqueda" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json index eb668d70a13..d371b1e3d8c 100644 --- a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "terminal.background": "El color de fondo del terminal, esto permite colorear el terminal de forma diferente al panel.", + "terminal.foreground": "El color de primer plano del terminal.", "terminal.ansiColor": "Color ANSI \"{0}\" en el terminal." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index a2ca73e3dc1..2193bcd8383 100644 --- a/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,7 +6,6 @@ { "selectTheme.label": "Tema de color", "installColorThemes": "Instalar temas de color adicionales...", - "problemChangingTheme": "Problema al configurar el tema: {0}", "themes.selectTheme": "Seleccionar tema de color", "selectIconTheme.label": "Tema de icono de archivo", "installIconThemes": "Instalar temas de icono de archivo adicionles...", diff --git a/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index e1dbe78e59e..0a6a55d48a2 100644 --- a/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -5,10 +5,5 @@ // Do not edit this file. It is machine generated. { "errorUnknownKey": "No se puede escribir en el archivo de configuración (clave desconocida)", - "errorInvalidTarget": "No se puede escribir en el archivo de configuración (destino no válido).", - "errorNoWorkspaceOpened": "No se puede escribir la configuración porque no hay ninguna carpeta abierta. Abra una carpeta primero y vuelva a intentarlo.", - "errorInvalidConfiguration": "No se puede escribir la configuración. Abra el archivo **Configuración de usuario** para corregir los errores o advertencias del archivo y vuelva a intentarlo.", - "errorInvalidConfigurationWorkspace": "No se puede escribir la configuración. Abra **Configuración de área de trabajo** para corregir los errores o advertencias del archivo y vuelva a intentarlo.", - "errorConfigurationFileDirty": "No se puede escribir la configuración porque el archivo se ha modificado. Guarde el archivo **Configuración de usuario** y vuelva a intentarlo.", - "errorConfigurationFileDirtyWorkspace": "No se puede escribir la configuración porque el archivo se ha modificado. Guarde el archivo **Configuración de área de trabajo** y vuelva a intentarlo." + "errorInvalidTarget": "No se puede escribir en el archivo de configuración (destino no válido)." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/esn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index 0ae924e1932..587fdef7461 100644 --- a/i18n/esn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -14,9 +14,6 @@ "vscode.extension.contributes.keybindings.win": "Tecla o secuencia de teclas específica de Windows.", "vscode.extension.contributes.keybindings.when": "Condición cuando la tecla está activa.", "vscode.extension.contributes.keybindings": "Aporta enlaces de teclado.", - "openDocumentation": "Más información", - "keybindingMigration.ok": "Aceptar", - "keybindingMigration.prompt": "Algunos métodos abreviados de teclado han cambiado para su distribución de teclado.", "invalid.keybindings": "Valor de \"contributes.{0}\" no válido: {1}", "unboundCommands": "Aquí hay otros comandos disponibles: ", "keybindings.json.title": "Configuración de enlaces de teclado", diff --git a/i18n/fra/extensions/git/out/commands.i18n.json b/i18n/fra/extensions/git/out/commands.i18n.json index 2f26d293f1e..3601e044f8b 100644 --- a/i18n/fra/extensions/git/out/commands.i18n.json +++ b/i18n/fra/extensions/git/out/commands.i18n.json @@ -18,6 +18,8 @@ "discard": "Ignorer les modifications", "confirm discard all": "Voulez-vous vraiment ignorer TOUTES les modifications ? Cette action est IRRÉVERSIBLE.", "discardAll": "Ignorer TOUTES les modifications", + "yes": "Oui", + "always": "Toujours", "no changes": "Il n'existe aucun changement à valider.", "commit message": "Message de validation", "provide commit message": "Indiquez un message de validation", diff --git a/i18n/fra/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/fra/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript/package.i18n.json b/i18n/fra/extensions/typescript/package.i18n.json index 5fc1a277d93..043054ffa7f 100644 --- a/i18n/fra/extensions/typescript/package.i18n.json +++ b/i18n/fra/extensions/typescript/package.i18n.json @@ -35,7 +35,6 @@ "javascript.goToProjectConfig.title": "Accéder à la configuration du projet", "typescript.referencesCodeLens.enabled": "Activer/désactiver CodeLens dans les références. Nécessite TypeScript >= 2.0.6.", "typescript.implementationsCodeLens.enabled": "Activer/désactiver CodeLens dans les implémentations. Nécessite TypeScript >= 2.2.0.", - "typescript.openTsServerLog.title": "Ouvrir le fichier journal du serveur TS", "typescript.selectTypeScriptVersion.title": "Sélectionner la version de TypeScript", "jsDocCompletion.enabled": "Activer/désactiver les commentaires JSDoc automatiques", "javascript.implicitProjectConfig.checkJs": "Activer/désactiver la vérification sémantique des fichiers JavaScript. Les fichiers jsconfig.json ou tsconfig.json existants remplacent ce paramètre. Nécessite TypeScript >=2.3.1.", diff --git a/i18n/fra/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/fra/src/vs/base/common/jsonErrorMessages.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/base/common/jsonErrorMessages.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/code/electron-main/menus.i18n.json b/i18n/fra/src/vs/code/electron-main/menus.i18n.json index 6f57138a058..767d8088cca 100644 --- a/i18n/fra/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/fra/src/vs/code/electron-main/menus.i18n.json @@ -69,7 +69,6 @@ "miSmartSelectShrink": "&&Réduire la sélection", "miViewExplorer": "&&Explorateur", "miViewSearch": "&&Rechercher", - "miViewGit": "&&Git", "miViewDebug": "&&Déboguer", "miViewExtensions": "E&&xtensions", "miToggleOutput": "&&Sortie", diff --git a/i18n/fra/src/vs/editor/common/config/editorOptions.i18n.json b/i18n/fra/src/vs/editor/common/config/editorOptions.i18n.json new file mode 100644 index 00000000000..bf45d0601aa --- /dev/null +++ b/i18n/fra/src/vs/editor/common/config/editorOptions.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorViewAccessibleLabel": "Contenu d'éditeur" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/hover/browser/hover.i18n.json b/i18n/fra/src/vs/editor/contrib/hover/browser/hover.i18n.json index c2d6b7a05c8..f2c7ed17560 100644 --- a/i18n/fra/src/vs/editor/contrib/hover/browser/hover.i18n.json +++ b/i18n/fra/src/vs/editor/contrib/hover/browser/hover.i18n.json @@ -4,8 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "showHover": "Afficher par pointage", - "hoverHighlight": "Mettez en surbrillance ci-dessous le mot pour lequel un pointage s'affiche.", - "hoverBackground": "Couleur d'arrière-plan du pointage de l'éditeur.", - "hoverBorder": "Couleur de bordure du pointage de l'éditeur." + "showHover": "Afficher par pointage" } \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json b/i18n/fra/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json index bb2792bf3e4..b2ba0b9ad35 100644 --- a/i18n/fra/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json +++ b/i18n/fra/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json @@ -16,8 +16,6 @@ "peekViewTitleInfoForeground": "Couleur des informations sur le titre de l'affichage d'aperçu.", "peekViewBorder": "Couleur des bordures et de la flèche de l'affichage d'aperçu.", "peekViewResultsBackground": "Couleur d'arrière-plan de la liste des résultats de l'affichage d'aperçu.", - "peekViewResultsMatchForeground": "Premier plan de l'entrée correspondante dans la liste des résultats de l'affichage d'aperçu.", - "peekViewResultsFileForeground": "Premier plan de l'entrée de fichier dans la liste des résultats de l'affichage d'aperçu.", "peekViewResultsSelectionBackground": "Couleur d'arrière-plan de l'entrée sélectionnée dans la liste des résultats de l'affichage d'aperçu.", "peekViewResultsSelectionForeground": "Couleur de premier plan de l'entrée sélectionnée dans la liste des résultats de l'affichage d'aperçu.", "peekViewEditorBackground": "Couleur d'arrière-plan de l'éditeur d'affichage d'aperçu.", diff --git a/i18n/fra/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/fra/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 3e58c829119..0632013723d 100644 --- a/i18n/fra/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/fra/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,10 +9,8 @@ "editorSuggestWidgetForeground": "Couleur de premier plan du widget de suggestion.", "editorSuggestWidgetSelectedBackground": "Couleur d'arrière-plan de l'entrée sélectionnée dans le widget de suggestion.", "editorSuggestWidgetHighlightForeground": "Couleur de la surbrillance des correspondances dans le widget de suggestion.", - "readMore": "En savoir plus...{0}", "suggestionWithDetailsAriaLabel": "{0}, suggestion, avec détails", "suggestionAriaLabel": "{0}, suggestion", - "goback": "Précédent", "suggestWidget.loading": "Chargement...", "suggestWidget.noSuggestions": "Pas de suggestions.", "suggestionAriaAccepted": "{0}, accepté", diff --git a/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json index 45d1776b2ba..d4fb6e415de 100644 --- a/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -28,8 +28,6 @@ "listActiveSelectionBackground": "Couleur d'arrière-plan de la liste/l'arborescence de l'élément sélectionné quand la liste/l'arborescence est active. Une liste/arborescence active peut être sélectionnée au clavier, elle ne l'est pas quand elle est inactive.", "listInactiveSelectionBackground": "Couleur d'arrière-plan de la liste/l'arborescence pour l'élément sélectionné quand la liste/l'arborescence est inactive. Une liste/aborescence active peut être sélectionnée au clavier, elle ne l'est pas quand elle est inactive.", "listActiveSelectionForeground": "Couleur de premier plan de la liste/l'arborescence pour l'élément sélectionné quand la liste/l'arborescence est active. Une liste/aborescence active peut être sélectionnée au clavier, elle ne l'est pas quand elle est inactive.", - "listFocusAndSelectionBackground": "Couleur d'arrière-plan de la liste/l'arborescence pour l'élément ayant le focus et sélectionné quand la liste/l'arborescence est active. Une liste/aborescence active peut être sélectionnée au clavier, elle ne l'est pas quand elle est inactive. Cette couleur l'emporte sur les couleurs individuelles de la sélection et du focus.", - "listFocusAndSelectionForeground": "Couleur de premier plan de la liste/l'arborescence pour l'élément ayant le focus et sélectionné quand la liste/l'arborescence est active. Une liste/aborescence active peut être sélectionnée au clavier, elle ne l'est pas quand elle est inactive. Cette couleur l'emporte sur les couleurs individuelles de la sélection et du focus.", "listHoverBackground": "Arrière-plan de la liste/l'arborescence pendant le pointage sur des éléments avec la souris.", "listDropBackground": "Arrière-plan de l'opération de glisser-déplacer dans une liste/arborescence pendant le déplacement d'éléments avec la souris.", "highlight": "Couleur de premier plan dans la liste/l'arborescence pour la surbrillance des correspondances pendant la recherche dans une liste/arborescence.", @@ -50,7 +48,9 @@ "editorFindMatch": "Couleur du résultat de recherche actif.", "findMatchHighlight": "Couleur des autres résultats de recherche.", "findRangeHighlight": "Couleur de la plage limitant la recherche.", + "hoverHighlight": "Mettez en surbrillance ci-dessous le mot pour lequel un pointage s'affiche.", + "hoverBackground": "Couleur d'arrière-plan du pointage de l'éditeur.", + "hoverBorder": "Couleur de bordure du pointage de l'éditeur.", "activeLinkForeground": "Couleur des liens actifs.", - "linkForeground": "Couleur des liens.", "editorWidgetBackground": "Couleur d'arrière-plan des gadgets de l'éditeur tels que rechercher/remplacer." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/api/node/extHostExplorerView.i18n.json b/i18n/fra/src/vs/workbench/api/node/extHostExplorerView.i18n.json new file mode 100644 index 00000000000..ff14373fbdc --- /dev/null +++ b/i18n/fra/src/vs/workbench/api/node/extHostExplorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "treeExplorer.notRegistered": "Aucun TreeExplorerNodeProvider ayant l'ID '{0}' n'est inscrit.", + "treeExplorer.failedToProvideRootNode": "Le TreeExplorerNodeProvider '{0}' n'a pas pu fournir le nœud racine." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/browser/actions/configureLocale.i18n.json b/i18n/fra/src/vs/workbench/browser/actions/configureLocale.i18n.json index 97d34c7a9e9..ef4f2686d9e 100644 --- a/i18n/fra/src/vs/workbench/browser/actions/configureLocale.i18n.json +++ b/i18n/fra/src/vs/workbench/browser/actions/configureLocale.i18n.json @@ -7,7 +7,6 @@ "configureLocale": "Configurer la langue", "displayLanguage": "Définit le langage affiché par VSCode.", "doc": "Consultez {0} pour connaître la liste des langues prises en charge.", - "restart": "Si la valeur change, VSCode doit redémarrer.", "fail.createSettings": "Impossible de créer '{0}' ({1}).", "JsonSchema.locale": "Langue d'interface utilisateur (IU) à utiliser." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/common/theme.i18n.json b/i18n/fra/src/vs/workbench/common/theme.i18n.json index e958fad7ce5..8363fa14b9a 100644 --- a/i18n/fra/src/vs/workbench/common/theme.i18n.json +++ b/i18n/fra/src/vs/workbench/common/theme.i18n.json @@ -4,19 +4,14 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "tabsContainerBackground": "Couleur d'arrière-plan du conteneur d'onglets. Les onglets sont les conteneurs des éditeurs dans la zone d'éditeurs. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", "tabActiveBackground": "Couleur d'arrière-plan de l'onglet actif. Les onglets sont les conteneurs des éditeurs dans la zone d'éditeurs. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", "tabInactiveBackground": "Couleur d'arrière-plan de l'onglet inactif. Les onglets sont les conteneurs des éditeurs dans la zone d'éditeurs. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", "tabBorder": "Bordure séparant les onglets les uns des autres. Les onglets sont les conteneurs des éditeurs dans la zone d'éditeurs. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", "tabActiveEditorGroupActiveForeground": "Couleur de premier plan de l'onglet actif dans un groupe actif. Les onglets sont les conteneurs des éditeurs dans la zone d'éditeurs. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", - "tabActiveEditorGroupInactiveForeground": "Couleur de premier plan de l'onglet actif dans un groupe inactif. Les onglets sont les conteneurs des éditeurs dans la zone d'éditeurs. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", "tabInactiveEditorGroupActiveForeground": "Couleur de premier plan de l'onglet inactif dans un groupe actif. Les onglets sont les conteneurs des éditeurs dans la zone d'éditeurs. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", - "tabInactiveEditorGroupInactiveForeground": "Couleur de premier plan de l'onglet inactif dans un groupe inactif. Les onglets sont les conteneurs des éditeurs dans la zone d'éditeurs. Vous pouvez ouvrir plusieurs onglets dans un groupe d'éditeurs. Il peut exister plusieurs groupes d'éditeurs.", "editorGroupBackground": "Couleur d'arrière-plan d'un groupe d'éditeurs. Les groupes d'éditeurs sont les conteneurs des éditeurs. La couleur d'arrière-plan s'affiche pendant le glissement de groupes d'éditeurs.", "editorGroupHeaderBackground": "Couleur d'arrière-plan de l'en-tête du titre du groupe d'éditeurs quand les onglets sont désactivés. Les groupes d'éditeurs sont les conteneurs des éditeurs.", "editorGroupBorder": "Couleur séparant plusieurs groupes d'éditeurs les uns des autres. Les groupes d'éditeurs sont les conteneurs des éditeurs.", - "editorDragAndDropBackground": "Couleur d'arrière-plan durant le déplacement des éditeurs.", - "editorMasterDetailsBorder": "Couleur de bordure séparant les détails côté maître des éditeurs côte à côte. Par exemple, les éditeurs de différences et l'éditeur de paramètres.", "panelBackground": "Couleur d'arrière-plan du panneau. Les panneaux s'affichent sous la zone d'éditeurs et contiennent des affichages tels que la sortie et le terminal intégré.", "panelBorder": "Couleur de bordure de panneau dans la partie supérieure de séparation de l'éditeur. Les panneaux s'affichent sous la zone d'éditeurs et contiennent des affichages tels que la sortie et le terminal intégré.", "panelActiveTitleForeground": "Couleur du titre du panneau actif. Les panneaux se situent sous la zone de l'éditeur et contiennent des affichages comme la sortie et le terminal intégré.", @@ -31,7 +26,6 @@ "statusBarProminentItemHoverBackground": "Couleur d'arrière-plan des éléments importants de la barre d'état pendant le pointage. Les éléments importants se différencient des autres entrées de la barre d'état pour indiquer l'importance. La barre d'état est affichée en bas de la fenêtre.", "activityBarBackground": "Couleur d'arrière-plan de la barre d'activités. La barre d'activités s'affiche complètement à gauche ou à droite, et permet de naviguer entre les affichages de la barre latérale.", "activityBarForeground": "Couleur de premier plan de la barre d'activités (par ex., utilisée pour les icônes). La barre d'activités s'affiche complètement à gauche ou à droite, et permet de parcourir les vues de la barre latérale.", - "activityBarDragAndDropBackground": "Couleur des commentaires sur une opération de glisser-déplacer pour les éléments de la barre d'activités. La barre d'activités, située à l'extrême gauche ou droite, permet de basculer entre les affichages de la barre latérale.", "activityBarBadgeBackground": "Couleur d'arrière-plan du badge de notification d'activité. La barre d'activités, située à l'extrême gauche ou droite, permet de basculer entre les affichages de la barre latérale.", "activityBarBadgeForeground": "Couleur de premier plan du badge de notification d'activité. La barre d'activités, située à l'extrême gauche ou droite, permet de basculer entre les affichages de la barre latérale.", "sideBarBackground": "Couleur d'arrière-plan de la barre latérale. La barre latérale est le conteneur des affichages tels que ceux de l'exploration et la recherche.", diff --git a/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json index e03298e0044..7d14c23b2b5 100644 --- a/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -41,7 +41,6 @@ "window.newWindowDimensions.inherit": "Permet d'ouvrir les nouvelles fenêtres avec la même dimension que la dernière fenêtre active.", "window.newWindowDimensions.maximized": "Permet d'ouvrir les nouvelles fenêtres de manière agrandie.", "window.newWindowDimensions.fullscreen": "Permet d'ouvrir les nouvelles fenêtres en mode plein écran.", - "newWindowDimensions": "Contrôle les dimensions d'ouverture d'une nouvelle fenêtre. Par défaut, une nouvelle fenêtre s'ouvre au centre de l'écran avec des dimensions réduites. Quand le paramètre a la valeur 'inherit', la fenêtre a les mêmes dimensions que la dernière fenêtre active. Quand le paramètre a la valeur 'maximized', la fenêtre s'ouvre en mode plein écran et dans sa taille maximale, si elle est configurée avec la valeur 'fullscreen'.", "window.menuBarVisibility.default": "Le menu n'est masqué qu'en mode plein écran.", "window.menuBarVisibility.visible": "Le menu est toujours visible même en mode plein écran.", "window.menuBarVisibility.toggle": "Le menu est masqué mais il peut être affiché via la touche Alt.", diff --git a/i18n/fra/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json new file mode 100644 index 00000000000..7b029bfc1e7 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileLinkMac": "Cliquez pour suivre (Commande + clic permet d'ouvrir sur le côté)", + "fileLink": "Cliquez pour suivre (Ctrl + clic permet d'ouvrir sur le côté)" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/common/debug.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/common/debug.i18n.json new file mode 100644 index 00000000000..23ae9b5eef6 --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/debug/common/debug.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "internalConsoleOptions": "Contrôle le comportement de la console de débogage interne." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json index 837c20b08ff..9fa5e84fe4a 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json @@ -5,8 +5,6 @@ // Do not edit this file. It is machine generated. { "stateCapture": "L'état de l'objet est capturé à partir de la première évaluation", - "fileLinkMac": "Cliquez pour suivre (Commande + clic permet d'ouvrir sur le côté)", - "fileLink": "Cliquez pour suivre (Ctrl + clic permet d'ouvrir sur le côté)", "replVariableAriaLabel": "La variable {0} a la valeur {1}, boucle REPL (Read Eval Print Loop), débogage", "replExpressionAriaLabel": "L'expression {0} a la valeur {1}, boucle REPL (Read Eval Print Loop), débogage", "replValueOutputAriaLabel": "{0}, boucle REPL (Read Eval Print Loop), débogage", diff --git a/i18n/fra/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/fra/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index bcdf182d522..b52cacf9ab2 100644 --- a/i18n/fra/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,13 +7,11 @@ "debugAdapterBinNotFound": "L'exécutable d'adaptateur de débogage '{0}' n'existe pas.", "debugAdapterCannotDetermineExecutable": "Impossible de déterminer l'exécutable pour l'adaptateur de débogage '{0}'.", "debugType": "Type de configuration.", - "debugTypeNotRecognised": "Ce type de débogage n'est pas reconnu. Installez l'extension de débogage correspondante.", "node2NotSupported": "\"node2\" n'est plus pris en charge. Utilisez \"node\" à la place, et affectez la valeur \"inspector\" à l'attribut \"protocol\".", "debugName": "Le nom de la configuration s'affiche dans le menu déroulant de la configuration de lancement.", "debugRequest": "Type de requête de configuration. Il peut s'agir de \"launch\" ou \"attach\".", "debugServer": "Pour le développement d'une extension de débogage uniquement : si un port est spécifié, VS Code tente de se connecter à un adaptateur de débogage s'exécutant en mode serveur", "debugPrelaunchTask": "Tâche à exécuter avant le démarrage de la session de débogage.", - "internalConsoleOptions": "Contrôle le comportement de la console de débogage interne.", "debugWindowsConfiguration": "Attributs de configuration de lancement spécifiques à Windows.", "debugOSXConfiguration": "Attributs de configuration de lancement spécifiques à OS X.", "debugLinuxConfiguration": "Attributs de configuration de lancement spécifiques à Linux.", diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 46cfb8cb55b..c4a2f4bc59d 100644 --- a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,5 +8,7 @@ "showRecommendations": "Afficher les recommandations", "neverShowAgain": "Ne plus afficher", "close": "Fermer", - "workspaceRecommended": "Cet espace de travail a des recommandations d'extension." + "workspaceRecommended": "Cet espace de travail a des recommandations d'extension.", + "no": "Non", + "cancel": "Annuler" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 13f0487e367..8d72ad31935 100644 --- a/i18n/fra/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -27,8 +27,6 @@ "autoSaveDelay": "Contrôle le délai en ms au bout duquel un fichier à l'intégrité compromise est enregistré automatiquement. S'applique uniquement quand 'files.autoSave' a la valeur '{0}'", "watcherExclude": "Configurez les modèles Glob des chemins de fichiers à exclure de la surveillance des fichiers. La modification de ce paramètre nécessite un redémarrage. Si vous constatez que le code consomme beaucoup de temps processeur au démarrage, excluez les dossiers volumineux pour réduire la charge initiale.", "hotExit.off": "Désactivez la sortie à chaud.", - "hotExit.onExit": "La sortie à chaud se déclenche à la fermeture de l'application, c'est-à-dire quand la dernière fenêtre est fermée dans Windows/Linux, ou quand la commande workbench.action.quit se déclenche (palette de commandes, combinaison de touches, menu). Toutes les fenêtres avec des sauvegardes sont restaurées au prochain lancement.", - "hotExit.onExitAndWindowClose": "La sortie à chaud se déclenche à la fermeture de l'application, c'est-à-dire quand la dernière fenêtre est fermée dans Windows/Linux, ou quand la commande workbench.action.quit se déclenche (palette de commandes, combinaison de touches, menu), ainsi que toute fenêtre comportant un dossier ouvert, qu'il s'agisse ou non de la dernière fenêtre. Toutes les fenêtres qui n'ont pas de dossiers ouverts sont restaurées au prochain lancement. Pour restaurer les fenêtres de dossiers telles qu'elles étaient avant l'arrêt, affectez à \"window.reopenFolders\" la valeur \"all\".", "hotExit": "Contrôle si les fichiers non enregistrés sont mémorisés entre les sessions, ce qui permet d'ignorer la demande d'enregistrement à la sortie de l'éditeur.", "defaultLanguage": "Mode de langage par défaut affecté aux nouveaux fichiers.", "editorConfigurationTitle": "Éditeur", diff --git a/i18n/fra/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json b/i18n/fra/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json index ea443e85fbe..b89dba6f17f 100644 --- a/i18n/fra/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json @@ -6,7 +6,5 @@ { "searchMatches": "{0} correspondances trouvées", "searchMatch": "{0} correspondance trouvée", - "fileMatchAriaLabel": "{0} correspondances dans le fichier {1} du dossier {2}, Résultat de la recherche", - "replacePreviewResultAria": "Résultat de l'aperçu du remplacement, {0}", - "searchResultAria": "{0}, Résultat de la recherche" + "fileMatchAriaLabel": "{0} correspondances dans le fichier {1} du dossier {2}, Résultat de la recherche" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index e0173fcde81..e59f5fcb09a 100644 --- a/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -18,7 +18,6 @@ "problems": "Problèmes", "manyMarkers": "99", "tasks": "Tâches", - "TaskSystem.noHotSwap": "Le changement du moteur d'exécution de tâches nécessite le redémarrage de VS Code. Changement ignoré.", "TaskService.noBuildTask": "Aucune tâche de build définie. Marquez une tâche avec 'isBuildCommand' dans le fichier tasks.json.", "TaskService.noTestTask": "Aucune tâche de test définie. Marquez une tâche avec 'isTestCommand' dans le fichier tasks.json.", "TaskServer.noTask": "La tâche {0} à exécuter est introuvable.", diff --git a/i18n/fra/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 17bcf71d09f..f816cae6ee3 100644 --- a/i18n/fra/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,7 +6,6 @@ { "selectTheme.label": "Thème de couleur", "installColorThemes": "Installer des thèmes de couleurs supplémentaires...", - "problemChangingTheme": "Problème de définition du thème : {0}", "themes.selectTheme": "Sélectionner le thème de couleur", "selectIconTheme.label": "Thème d'icône de fichier", "installIconThemes": "Installer des thèmes d'icônes de fichiers supplémentaires...", diff --git a/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index df367cb95ef..ba4ae258d25 100644 --- a/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -5,10 +5,5 @@ // Do not edit this file. It is machine generated. { "errorUnknownKey": "Impossible d'écrire dans le fichier de configuration (clé inconnue)", - "errorInvalidTarget": "Impossible d'écrire dans le fichier config (cible non valide)", - "errorNoWorkspaceOpened": "Impossible d'écrire les paramètres, car aucun dossier n'est ouvert. Ouvrez d'abord un dossier, puis réessayez.", - "errorInvalidConfiguration": "Impossible d'écrire les paramètres. Ouvrez les **Paramètres utilisateur** pour corriger les erreurs/avertissements présents dans le fichier, puis réessayez.", - "errorInvalidConfigurationWorkspace": "Impossible d'écrire les paramètres. Ouvrez les **Paramètres d'espace de travail** pour corriger les erreurs/avertissements présents dans le fichier, puis réessayez.", - "errorConfigurationFileDirty": "Impossible d'écrire les paramètres, car l'intégrité du fichier est compromise. Enregistrez le fichier des **Paramètres utilisateur**, puis réessayez.", - "errorConfigurationFileDirtyWorkspace": "Impossible d'écrire les paramètres, car l'intégrité du fichier est compromise. Enregistrez le fichier des **Paramètres d'espace de travail**, puis réessayez." + "errorInvalidTarget": "Impossible d'écrire dans le fichier config (cible non valide)" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/fra/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index e70e749cfa8..60ec894aa9e 100644 --- a/i18n/fra/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -14,9 +14,6 @@ "vscode.extension.contributes.keybindings.win": "Touche ou séquence de touches spécifique à Windows.", "vscode.extension.contributes.keybindings.when": "Condition quand la touche est active.", "vscode.extension.contributes.keybindings": "Ajoute des combinaisons de touches.", - "openDocumentation": "En savoir plus", - "keybindingMigration.ok": "OK", - "keybindingMigration.prompt": "Certains raccourcis clavier ont changé pour votre disposition de clavier.", "invalid.keybindings": "'contributes.{0}' non valide : {1}", "unboundCommands": "Voici d'autres commandes disponibles : ", "keybindings.json.title": "Configuration des combinaisons de touches", diff --git a/i18n/ita/extensions/git/out/commands.i18n.json b/i18n/ita/extensions/git/out/commands.i18n.json index 8e28758d234..a95a76b686a 100644 --- a/i18n/ita/extensions/git/out/commands.i18n.json +++ b/i18n/ita/extensions/git/out/commands.i18n.json @@ -18,6 +18,8 @@ "discard": "Rimuovi modifiche", "confirm discard all": "Sei sicuro di voler annullare TUTTE le modifiche? Quest'azione è IRREVERSIBILE!", "discardAll": "Rimuovi TUTTE le modifiche", + "yes": "Sì", + "always": "Sempre", "no changes": "Non ci sono modifiche di cui eseguire il commit.", "commit message": "Messaggio di commit", "provide commit message": "Specificare un messaggio di commit", diff --git a/i18n/ita/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/ita/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript/package.i18n.json b/i18n/ita/extensions/typescript/package.i18n.json index 00ac1f3529e..001fdcf5484 100644 --- a/i18n/ita/extensions/typescript/package.i18n.json +++ b/i18n/ita/extensions/typescript/package.i18n.json @@ -35,7 +35,6 @@ "javascript.goToProjectConfig.title": "Passa a Configurazione progetto", "typescript.referencesCodeLens.enabled": "Abilita/Disabilita le finestre CodeLens per i riferimenti. Richiede una versione di TypeScript uguale o successiva alla 2.0.6.", "typescript.implementationsCodeLens.enabled": "Abilita/Disabilita le finestre CodeLens per le implementazioni. Richiede una versione di TypeScript uguale o successiva alla 2.2.0.", - "typescript.openTsServerLog.title": "Apri file di log del server TypeScript", "typescript.selectTypeScriptVersion.title": "Seleziona la versione di TypeScript", "jsDocCompletion.enabled": "Abilita/Disabilita commenti automatici JSDoc", "javascript.implicitProjectConfig.checkJs": "Abilita/disabilita il controllo semantico di file JavaScript. File jsconfig.json o tsconfig.json esistenti sovrascrivono su questa impostazione. Richiede TypeScript >= 2.3.1.", diff --git a/i18n/ita/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/ita/src/vs/base/common/jsonErrorMessages.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/base/common/jsonErrorMessages.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/code/electron-main/menus.i18n.json b/i18n/ita/src/vs/code/electron-main/menus.i18n.json index 0647c24f408..86c52fb5640 100644 --- a/i18n/ita/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/ita/src/vs/code/electron-main/menus.i18n.json @@ -69,7 +69,6 @@ "miSmartSelectShrink": "&&Riduci selezione", "miViewExplorer": "&&Esplora risorse", "miViewSearch": "Cerca", - "miViewGit": "&&Git", "miViewDebug": "&&Debug", "miViewExtensions": "E&&stensioni", "miToggleOutput": "&&Output", diff --git a/i18n/ita/src/vs/editor/common/config/editorOptions.i18n.json b/i18n/ita/src/vs/editor/common/config/editorOptions.i18n.json new file mode 100644 index 00000000000..9c443a0f33d --- /dev/null +++ b/i18n/ita/src/vs/editor/common/config/editorOptions.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorViewAccessibleLabel": "Contenuto editor" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/hover/browser/hover.i18n.json b/i18n/ita/src/vs/editor/contrib/hover/browser/hover.i18n.json index b5b21cc37d7..385b42e5290 100644 --- a/i18n/ita/src/vs/editor/contrib/hover/browser/hover.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/hover/browser/hover.i18n.json @@ -4,8 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "showHover": "Visualizza passaggio del mouse", - "hoverHighlight": "Evidenzia sotto la parola di cui viene mostrata un'area sensibile al passaggio", - "hoverBackground": "Colore di sfondo dell'area sensibile al passaggio del mouse dell'editor", - "hoverBorder": "Colore di sfondo dell'area sensibile al passaggio del mouse dell'editor" + "showHover": "Visualizza passaggio del mouse" } \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json b/i18n/ita/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json index b86cbe1b982..60ce91d8df1 100644 --- a/i18n/ita/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json @@ -16,8 +16,6 @@ "peekViewTitleInfoForeground": "Colore delle informazioni del titolo della visualizzazione rapida.", "peekViewBorder": "Colore dei bordi e della freccia della visualizzazione rapida.", "peekViewResultsBackground": "Colore di sfondo dell'elenco risultati della visualizzazione rapida.", - "peekViewResultsMatchForeground": "Primo piano per l'immissione di corrispondenze nell'elenco risultati della visualizzazione rapida.", - "peekViewResultsFileForeground": "Primo piano per l'immissione di file nell'elenco risultati della visualizzazione rapida.", "peekViewResultsSelectionBackground": "Colore di sfondo della voce selezionata nell'elenco risultati della visualizzazione rapida.", "peekViewResultsSelectionForeground": "Colore primo piano della voce selezionata nell'elenco risultati della visualizzazione rapida.", "peekViewEditorBackground": "Colore di sfondo dell'editor di visualizzazioni rapide.", diff --git a/i18n/ita/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/ita/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 6d495a04fda..bbb46151abd 100644 --- a/i18n/ita/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,10 +9,8 @@ "editorSuggestWidgetForeground": "Colore primo piano del widget dei suggerimenti.", "editorSuggestWidgetSelectedBackground": "Colore di sfondo della voce selezionata del widget dei suggerimenti.", "editorSuggestWidgetHighlightForeground": "Colore delle evidenziazioni corrispondenze nel widget dei suggerimenti.", - "readMore": "Altre informazioni...{0}", "suggestionWithDetailsAriaLabel": "{0}, suggerimento, con dettagli", "suggestionAriaLabel": "{0}, suggerimento", - "goback": "Indietro", "suggestWidget.loading": "Caricamento...", "suggestWidget.noSuggestions": "Non ci sono suggerimenti.", "suggestionAriaAccepted": "{0}, accettato", diff --git a/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json index 8b28f9f169f..8cde4edb29b 100644 --- a/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -28,8 +28,6 @@ "listActiveSelectionBackground": "Colore sfondo Elenco/Struttura ad albero per l'elemento selezionato quando l'Elenco/Struttura ad albero è attivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no.", "listInactiveSelectionBackground": "Colore sfondo Elenco/Struttura ad albero per l'elemento selezionato quando l'Elenco/Struttura ad albero è inattivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no.", "listActiveSelectionForeground": "Colore primo piano Elenco/Struttura ad albero per l'elemento selezionato quando l'Elenco/Struttura ad albero è attivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no.", - "listFocusAndSelectionBackground": "Colore sfondo Elenco/Struttura ad albero per l'elemento evidenziato e selezionato quando l'Elenco/Struttura ad albero è attivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no. Questo colore ha la precedenza su colori specificati singolarmente per selezione e focus.", - "listFocusAndSelectionForeground": "Colore primo piano Elenco/Struttura ad albero per l'elemento evidenziato e selezionato quando l'Elenco/Struttura ad albero è attivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no. Questo colore ha la precedenza su colori specificati singolarmente per selezione e focus.", "listHoverBackground": "Sfondo Elenco/Struttura ad albero al passaggio del mouse sugli elementi.", "listDropBackground": "Sfondo Elenco/Struttura ad albero durante il trascinamento degli elementi selezionati.", "highlight": "Colore primo piano Elenco/Struttura ad albero delle occorrenze trovate durante la ricerca nell'Elenco/Struttura ad albero.", @@ -50,7 +48,9 @@ "editorFindMatch": "Colore della corrispondenza di ricerca corrente.", "findMatchHighlight": "Colore delle altre corrispondenze di ricerca.", "findRangeHighlight": "Colore dell'intervallo di ricerca.", + "hoverHighlight": "Evidenziazione sotto la parola per cui è visualizzata un'area sensibile al passaggio del mouse.", + "hoverBackground": "Colore di sfondo dell'area sensibile al passaggio del mouse dell'editor.", + "hoverBorder": "Colore del bordo dell'area sensibile al passaggio del mouse dell'editor.", "activeLinkForeground": "Colore dei collegamenti attivi.", - "linkForeground": "Colore dei collegamenti.", "editorWidgetBackground": "Colore di sfondo dei widget dell'editor, ad esempio Trova/Sostituisci." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/api/node/extHostExplorerView.i18n.json b/i18n/ita/src/vs/workbench/api/node/extHostExplorerView.i18n.json new file mode 100644 index 00000000000..8905123ff84 --- /dev/null +++ b/i18n/ita/src/vs/workbench/api/node/extHostExplorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "treeExplorer.notRegistered": "Non è stato registrato alcun elemento TreeExplorerNodeProvider con ID '{0}'.", + "treeExplorer.failedToProvideRootNode": "Con l'elemento TreeExplorerNodeProvider '{0}' non è stato possibile fornire il nodo radice." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/browser/actions/configureLocale.i18n.json b/i18n/ita/src/vs/workbench/browser/actions/configureLocale.i18n.json index a124f7f6f31..c9c8c1ec3e5 100644 --- a/i18n/ita/src/vs/workbench/browser/actions/configureLocale.i18n.json +++ b/i18n/ita/src/vs/workbench/browser/actions/configureLocale.i18n.json @@ -7,7 +7,6 @@ "configureLocale": "Configura lingua", "displayLanguage": "Definisce la lingua visualizzata di VSCode.", "doc": "Per un elenco delle lingue supportate, vedere {0}.", - "restart": "Se si modifica il valore, è necessario riavviare VSCode.", "fail.createSettings": "Non è possibile creare '{0}' ({1}).", "JsonSchema.locale": "Linguaggio dell'interfaccia utente da usare." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/common/theme.i18n.json b/i18n/ita/src/vs/workbench/common/theme.i18n.json index ea57126fbcd..05253aee2c4 100644 --- a/i18n/ita/src/vs/workbench/common/theme.i18n.json +++ b/i18n/ita/src/vs/workbench/common/theme.i18n.json @@ -4,19 +4,14 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "tabsContainerBackground": "Colore di sfondo del contenitore delle schede. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", "tabActiveBackground": "Colore di sfondo delle schede attive. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", "tabInactiveBackground": "Colore di sfondo delle schede inattive. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", "tabBorder": "Bordo per separare le schede l'una dall'altra. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", "tabActiveEditorGroupActiveForeground": "Colore di primo piano delle schede attive in un gruppo attivo. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", - "tabActiveEditorGroupInactiveForeground": "Colore di primo piano delle schede attive in un gruppo inattivo. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", "tabInactiveEditorGroupActiveForeground": "Colore di primo piano delle schede inattive in un gruppo attivo. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", - "tabInactiveEditorGroupInactiveForeground": "Colore di primo piano delle schede inattiva in un gruppo inattivo. Le schede sono i contenitori degli editor nell'area degli editor. È possibile aprire più schede in un gruppo di editor e possono esistere più gruppi di editor.", "editorGroupBackground": "Colore di sfondo di un gruppo di editor. I gruppi di editor sono contenitori di editor. Il colore di sfondo viene visualizzato quando si trascinano i gruppi di editor in un'altra posizione.", "editorGroupHeaderBackground": "Colore di sfondo dell'intestazione del titolo dell'editor quando le schede sono disabilitate. I gruppi di editor sono contenitori di editor.", "editorGroupBorder": "Colore per separare più gruppi di editor l'uno dall'altro. I gruppi di editor sono i contenitori degli editor.", - "editorDragAndDropBackground": "Colore di sfondo durante lo spostamento degli editor.", - "editorMasterDetailsBorder": "Colore del bordo per separare i dettagli dal lato master per gli editor affiancati. Gli esempi includono editor diff e l'editor impostazioni.", "panelBackground": "Colore di sfondo dei pannelli. I pannelli sono visualizzati sotto l'area degli editor e contengono visualizzazioni quali quella di output e del terminale integrato.", "panelBorder": "Colore del bordo dei pannelli nella parte superiore di separazione dall'editor. I pannelli sono visualizzati sotto l'area degli editor e contengono visualizzazioni quali quella di output e del terminale integrato.", "panelActiveTitleForeground": "Colore del titolo del pannello attivo. I pannelli sono visualizzati sotto l'area degli editor e contengono visualizzazioni quali quella di output e quella del terminale integrato.", @@ -31,7 +26,6 @@ "statusBarProminentItemHoverBackground": "Colore di sfondo degli elementi rilevanti della barra di stato al passaggio del mouse. Gli elementi rilevanti spiccano rispetto ad altre voci della barra di stato. La barra di stato è visualizzata nella parte inferiore della finestra.", "activityBarBackground": "Colore di sfondo della barra attività. La barra attività viene visualizzata nella parte inferiore sinistra/destra e consente il passaggio tra diverse visualizzazioni della barra laterale", "activityBarForeground": "Colore primo piano della barra attività (ad es. quello utilizzato per le icone). La barra attività viene mostrata all'estrema sinistra o destra e permette di alternare le visualizzazioni della barra laterale.", - "activityBarDragAndDropBackground": "Colore feedback drag and drop degli elementi della barra attività. La barra attività viene visualizzata nella parte inferiore sinistra/destra e consente il passaggio tra diverse visualizzazioni della barra laterale", "activityBarBadgeBackground": "Colore di sfondo della notifica utente dell'attività. La barra attività viene visualizzata all'estrema sinistra o all'estrema destra e consente di spostarsi tra le visualizzazioni della barra laterale.", "activityBarBadgeForeground": "Colore primo piano della notifica utente dell'attività. La barra attività viene visualizzata all'estrema sinistra o all'estrema destra e consente di spostarsi tra le visualizzazioni della barra laterale.", "sideBarBackground": "Colore di sfondo della barra laterale. La barra laterale è il contenitore per visualizzazioni come Explorer e ricerca.", diff --git a/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json index caac04b4d8e..c034a8cc727 100644 --- a/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -41,7 +41,6 @@ "window.newWindowDimensions.inherit": "Apre nuove finestre le cui dimensioni sono uguali a quelle dell'ultima finestra attiva.", "window.newWindowDimensions.maximized": "Apre nuove finestre ingrandite a schermo intero.", "window.newWindowDimensions.fullscreen": "Apre nuove finestre nella modalità a schermo intero.", - "newWindowDimensions": "Controlla le dimensioni relative all'apertura di una nuova finestra. Per impostazione predefinita, una nuova finestra di dimensioni ridotte viene aperta al centro della schermata. Se è impostata su 'inherit', la finestra assumerà le stesse dimensioni dell'ultima finestra attiva. Se è impostata su 'maximized', la finestra aperta risulterà ingrandita, mentre con 'fullscreen' verrà visualizzata a schermo intero.", "window.menuBarVisibility.default": "Il menu è nascosto solo nella modalità a schermo intero.", "window.menuBarVisibility.visible": "Il menu è sempre visibile, anche nella modalità a schermo intero.", "window.menuBarVisibility.toggle": "Il menu è nascosto ma può essere visualizzato premendo ALT.", diff --git a/i18n/ita/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json new file mode 100644 index 00000000000..91b52a6addb --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileLinkMac": "Fare clic per aprire (CMD+clic apre lateralmente)", + "fileLink": "Fare clic per aprire (CTRL+clic apre lateralmente)" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/common/debug.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/common/debug.i18n.json new file mode 100644 index 00000000000..17c61dfb9bd --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/debug/common/debug.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "internalConsoleOptions": "Controlla il comportamento della console di debug interna." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json index 0ba55e0fb51..fff7cbcba9e 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json @@ -5,8 +5,6 @@ // Do not edit this file. It is machine generated. { "stateCapture": "Lo stato dell'oggetto viene acquisito dalla prima valutazione", - "fileLinkMac": "Fare clic per aprire (CMD+clic apre lateralmente)", - "fileLink": "Fare clic per aprire (CTRL+clic apre lateralmente)", "replVariableAriaLabel": "Il valore della variabile {0} è {1}, ciclo Read Eval Print, debug", "replExpressionAriaLabel": "Il valore dell'espressione {0} è {1}, ciclo Read Eval Print, debug", "replValueOutputAriaLabel": "{0}, ciclo Read Eval Print, debug", diff --git a/i18n/ita/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/ita/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 1c2127860d5..53d3bcdd1ee 100644 --- a/i18n/ita/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,13 +7,11 @@ "debugAdapterBinNotFound": "Il file eseguibile '{0}' dell'adattatore di debug non esiste.", "debugAdapterCannotDetermineExecutable": "Non è possibile determinare il file eseguibile per l'adattatore di debug '{0}'.", "debugType": "Tipo di configurazione.", - "debugTypeNotRecognised": "Questo tipo di debug non è riconosciuto. Installare l'estensione di debug corrispondente.", "node2NotSupported": "\"node2\" non è più supportato. In alternativa, usare \"node\" e impostare l'attributo \"protocol\" su \"inspector\".", "debugName": "Nome della configurazione. Viene visualizzato nel menu a discesa della configurazione di avvio.", "debugRequest": "Tipo della richiesta di configurazione. Può essere \"launch\" o \"attach\".", "debugServer": "Solo per lo sviluppo dell'estensione di debug: se si specifica una porta, Visual Studio Code prova a connettersi a un adattatore di debug in esecuzione in modalità server", "debugPrelaunchTask": "Attività da eseguire prima dell'avvio della sessione di debug.", - "internalConsoleOptions": "Controlla il comportamento della console di debug interna.", "debugWindowsConfiguration": "Attributi della configurazione di avvio specifici di Windows.", "debugOSXConfiguration": "Attributi della configurazione di avvio specifici di OS X.", "debugLinuxConfiguration": "Attributi della configurazione di avvio specifici di Linux.", diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 56e75fc5770..f84b219fb4e 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,5 +8,7 @@ "showRecommendations": "Mostra gli elementi consigliati", "neverShowAgain": "Non visualizzare più questo messaggio", "close": "Chiudi", - "workspaceRecommended": "Per questa area di lavoro sono disponibili estensioni consigliate." + "workspaceRecommended": "Per questa area di lavoro sono disponibili estensioni consigliate.", + "no": "No", + "cancel": "Annulla" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index cec14eebc71..5f1557087a0 100644 --- a/i18n/ita/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -27,8 +27,6 @@ "autoSaveDelay": "Controlla il ritardo in ms dopo il quale un file dirty viene salvato automaticamente. Si applica solo quando 'files.autoSave' è impostato su '{0}'", "watcherExclude": "Consente di configurare i criteri GLOB dei percorsi file da escludere dal controllo dei file. Se si modifica questa impostazione, è necessario riavviare. Quando si nota che Code consuma troppo tempo della CPU all'avvio, è possibile escludere le cartelle di grandi dimensioni per ridurre il carico iniziale.", "hotExit.off": "Disabilita Hot Exit.", - "hotExit.onExit": "La funzionalità Hot Exit verrà attivata alla chiusura dell'applicazione, ovvero quando si chiude l'ultima finestra in Windows/Linux o quando si attiva il comando workbench.action.quit (riquadro comandi, tasto di scelta rapida, menu). Tutte le finestre con backup verranno ripristinate al successivo avvio.", - "hotExit.onExitAndWindowClose": "La funzionalità Hot Exit verrà attivata alla chiusura dell'applicazione, ovvero quando si chiude l'ultima finestra in Windows/Linux o quando si attiva il comando workbench.action.quit (riquadro comandi, tasto di scelta rapida, menu), nonché per qualsiasi finestra con una cartella aperta indipendentemente dal fatto che sia l'ultima. Tutte le finestre senza cartelle aperte verranno ripristinate al successivo avvio. Per riportare le finestre di cartelle allo stato in cui si trovavano prima dell'arresto, impostare \"window.reopenFolders\" su \"all\".", "hotExit": "Controlla se i file non salvati verranno memorizzati tra una sessione e l'altra, consentendo di ignorare il prompt di salvataggio alla chiusura dell'editor.", "defaultLanguage": "Modalità linguaggio predefinita assegnata ai nuovi file.", "editorConfigurationTitle": "Editor", diff --git a/i18n/ita/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json b/i18n/ita/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json index 774cffef37d..ef09ca3283a 100644 --- a/i18n/ita/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json @@ -6,7 +6,5 @@ { "searchMatches": "{0} corrispondenze trovate", "searchMatch": "{0} corrispondenza trovata", - "fileMatchAriaLabel": "{0} corrispondenze nel file {1} della cartella {2}, risultato della ricerca", - "replacePreviewResultAria": "Risultato dell'anteprima sostituzione, {0}", - "searchResultAria": "{0}, risultato della ricerca" + "fileMatchAriaLabel": "{0} corrispondenze nel file {1} della cartella {2}, risultato della ricerca" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 9ff412434bc..7be3f013ead 100644 --- a/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -18,7 +18,6 @@ "problems": "Problemi", "manyMarkers": "Più di 99", "tasks": "Attività", - "TaskSystem.noHotSwap": "Per modificare il motore di esecuzione delle attività, è necessario riavviare VS Code. La modifica verrà ignorata.", "TaskService.noBuildTask": "Non è stata definita alcuna attività di Build. Contrassegnare un'attività con 'isBuildCommand' nel file tasks.json .", "TaskService.noTestTask": "Non è stata definita alcuna attività di test. Contrassegnare un'attività con 'isTestCommand' nel file tasks.json .", "TaskServer.noTask": "Attività {0} richiesta per l'esecuzione non trovata", diff --git a/i18n/ita/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 823156a4842..ce44a7ad0a2 100644 --- a/i18n/ita/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,7 +6,6 @@ { "selectTheme.label": "Tema colori", "installColorThemes": "Installa temi colori aggiuntivi...", - "problemChangingTheme": "Problema durante l'impostazione del tema: {0}", "themes.selectTheme": "Seleziona tema colori", "selectIconTheme.label": "Tema icona file", "installIconThemes": "Installa temi dell'icona file aggiuntivi...", diff --git a/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 3072dac1446..22b05065173 100644 --- a/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -5,10 +5,5 @@ // Do not edit this file. It is machine generated. { "errorUnknownKey": "Non è possibile scrivere nel file di configurazione. La chiave è sconosciuta", - "errorInvalidTarget": "Non è possibile scrivere nel file di configurazione (destinazione non valida)", - "errorNoWorkspaceOpened": "Non è possibile scrivere le impostazioni perché non è stata aperta alcuna cartella. Aprire prima una cartella e riprovare.", - "errorInvalidConfiguration": "Non è possibile scrivere le impostazioni. Aprire **Impostazioni utente** per correggere errori/avvisi nel file e riprovare.", - "errorInvalidConfigurationWorkspace": "Non è possibile scrivere le impostazioni. Aprire **Impostazioni area di lavoro** per correggere errori/avvisi nel file e riprovare.", - "errorConfigurationFileDirty": "Non è possibile scrivere le impostazioni perché il file è stato modificato ma non salvato. Salvare il file delle **Impostazioni utente** e riprovare.", - "errorConfigurationFileDirtyWorkspace": "Non è possibile scrivere le impostazioni perché il file stato modificato ma non salvato. Salvare il file delle **Impostazioni area di lavoro** e riprovare." + "errorInvalidTarget": "Non è possibile scrivere nel file di configurazione (destinazione non valida)" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/ita/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index d9dd939d22d..95f4dd73cd4 100644 --- a/i18n/ita/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -14,9 +14,6 @@ "vscode.extension.contributes.keybindings.win": "Tasto o sequenza di tasti specifica di Windows.", "vscode.extension.contributes.keybindings.when": "Condizione quando il tasto è attivo.", "vscode.extension.contributes.keybindings": "Tasti di scelta rapida per contributes.", - "openDocumentation": "Altre informazioni", - "keybindingMigration.ok": "OK", - "keybindingMigration.prompt": "Alcune scelte rapide da tastiera sono state modificate per il layout di tastiera corrente.", "invalid.keybindings": "Il valore di `contributes.{0}` non è valido: {1}", "unboundCommands": "Altri comandi disponibili: ", "keybindings.json.title": "Configurazione dei tasti di scelta rapida", diff --git a/i18n/jpn/extensions/git/out/commands.i18n.json b/i18n/jpn/extensions/git/out/commands.i18n.json index e84147ee8b4..cacb74d2a00 100644 --- a/i18n/jpn/extensions/git/out/commands.i18n.json +++ b/i18n/jpn/extensions/git/out/commands.i18n.json @@ -18,6 +18,9 @@ "discard": "変更を破棄", "confirm discard all": "すべての変更を破棄しますか? 変更は戻りません!", "discardAll": "すべての変更を破棄", + "no staged changes": "コミットするステージされた変更がありません。\\n\\nすべての変更を自動的にステージして、直接コミットしますか?", + "yes": "はい", + "always": "常に行う", "no changes": "コミットする必要のある変更はありません。", "commit message": "コミット メッセージ", "provide commit message": "コミット メッセージを入力してください", diff --git a/i18n/jpn/extensions/git/package.i18n.json b/i18n/jpn/extensions/git/package.i18n.json index c13c203332a..66c511eaf69 100644 --- a/i18n/jpn/extensions/git/package.i18n.json +++ b/i18n/jpn/extensions/git/package.i18n.json @@ -42,5 +42,7 @@ "config.countBadge": "Git バッジ カウンターを制御します。`all` はすべての変更をカウントします。 `tracked` は追跡している変更のみカウントします。 `off` はカウントをオフします。", "config.checkoutType": "`Checkout to...` を実行するときに表示されるブランチの種類を制御します。`all` はすべての参照を表示します。`local` はローカル ブランチのみ、`tags` はタグのみ、`remote` はリモート ブランチのみを表示します。 ", "config.ignoreLegacyWarning": "旧 Git の警告を無視します", - "config.ignoreLimitWarning": "リポジトリ内に変更が多い場合は警告を無視します" + "config.ignoreLimitWarning": "リポジトリ内に変更が多い場合は警告を無視します", + "config.defaultCloneDirectory": "Git リポジトリをクローンする既定の場所", + "config.enableSmartCommit": "ステージされた変更がない場合はすべての変更をコミットします。" } \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/jpn/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..d6577333f0d --- /dev/null +++ b/i18n/jpn/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ts-check": "JavaScript ファイルのセマンティック チェックを有効にします。 ファイルの先頭にある必要があります。", + "ts-nocheck": "JavaScript ファイルのセマンティック チェックを無効にします。 ファイルの先頭にある必要があります。", + "ts-ignore": "ファイルの次の行で @ts-check エラーを抑制します。" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript/package.i18n.json b/i18n/jpn/extensions/typescript/package.i18n.json index ebe67b59e75..18396cdce3a 100644 --- a/i18n/jpn/extensions/typescript/package.i18n.json +++ b/i18n/jpn/extensions/typescript/package.i18n.json @@ -35,7 +35,7 @@ "javascript.goToProjectConfig.title": "プロジェクト構成に移動", "typescript.referencesCodeLens.enabled": "CodeLens の参照を有効/無効にします。TypeScript 2.0.6 以上が必要です。", "typescript.implementationsCodeLens.enabled": "CodeLens の実装を有効/無効にします。TypeScript 2.2.0 以上が必要です。", - "typescript.openTsServerLog.title": "TS サーバーのログ ファイルを開く", + "typescript.openTsServerLog.title": "TS サーバーのログを開く", "typescript.selectTypeScriptVersion.title": "TypeScript のバージョンの選択", "jsDocCompletion.enabled": " 自動 JSDoc コメントを有効/無効にします", "javascript.implicitProjectConfig.checkJs": "JavaScript ファイルのセマンティック チェックを有効/無効にします。既存の jsconfi.json や tsconfi.json ファイルの設定はこれより優先されます。TypeScript は 2.3.1 以上である必要があります。", diff --git a/i18n/jpn/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/jpn/src/vs/base/common/jsonErrorMessages.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/base/common/jsonErrorMessages.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/code/electron-main/menus.i18n.json b/i18n/jpn/src/vs/code/electron-main/menus.i18n.json index a1b610411e1..7ded317439b 100644 --- a/i18n/jpn/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/jpn/src/vs/code/electron-main/menus.i18n.json @@ -14,6 +14,7 @@ "mHelp": "ヘルプ(&&H)", "miNewWindow": "新しいウィンドウ(&&W)", "mAbout": "{0} のバージョン情報", + "mServices": "サービス", "mHide": "{0} を非表示にする", "mHideOthers": "その他を非表示にする", "mShowAll": "すべて表示", @@ -69,7 +70,7 @@ "miSmartSelectShrink": "選択範囲の縮小(&&S)", "miViewExplorer": "エクスプローラー(&&E)", "miViewSearch": "検索(&&S)", - "miViewGit": "Git(&&G)", + "miViewSCM": "SCM(&&S)", "miViewDebug": "デバッグ(&&D)", "miViewExtensions": "拡張機能(&&X)", "miToggleOutput": "出力(&&O)", diff --git a/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json index 3086fa1d367..a202eb95765 100644 --- a/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -60,8 +60,9 @@ "renderControlCharacters": "エディターで制御文字を表示する必要があるかどうかを制御します", "renderIndentGuides": "エディターでインデントのガイドを表示する必要があるかどうかを制御します", "renderLineHighlight": "エディターが現在の行をどのように強調表示するかを制御します。考えられる値は 'none'、'gutter'、'line'、'all' です。", - "codeLens": "エディターでコード レンズを表示するかをどうかを制御する", + "codeLens": "エディターで CodeLens を表示するかどうかを制御する", "folding": "エディターでコードの折りたたみを有効にするかどうかを制御します", + "hideFoldIcons": "余白上の展開アイコンを自動的に非表示にするかどうかを制御します 。", "matchBrackets": "かっこを選択すると、対応するかっこを強調表示します。", "glyphMargin": "エディターで縦のグリフ余白が表示されるかどうかを制御します。ほとんどの場合、グリフ余白はデバッグに使用されます。", "useTabStops": "空白の挿入や削除はタブ位置に従って行われます", diff --git a/i18n/jpn/src/vs/editor/common/config/editorOptions.i18n.json b/i18n/jpn/src/vs/editor/common/config/editorOptions.i18n.json new file mode 100644 index 00000000000..3fdfb4e461b --- /dev/null +++ b/i18n/jpn/src/vs/editor/common/config/editorOptions.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorViewAccessibleLabel": "エディターのコンテンツ" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json index 005a4a5743e..10aa21d3488 100644 --- a/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -10,5 +10,8 @@ "caret": "エディターのカーソルの色。", "editorWhitespaces": "エディターのスペース文字の色。", "editorIndentGuides": "エディター インデント ガイドの色。", - "editorLineNumbers": "エディターの行番号の色。" + "editorLineNumbers": "エディターの行番号の色。", + "editorCodeLensForeground": "CodeLens エディターの前景色。", + "editorBracketMatchBackground": "一致するかっこの背景色", + "editorBracketMatchBorder": "一致するかっこ内のボックスの色" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/hover/browser/hover.i18n.json b/i18n/jpn/src/vs/editor/contrib/hover/browser/hover.i18n.json index 59dfc6718b6..13ad7162719 100644 --- a/i18n/jpn/src/vs/editor/contrib/hover/browser/hover.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/hover/browser/hover.i18n.json @@ -4,8 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "showHover": "ホバーの表示", - "hoverHighlight": "ホバーが表示されているワードの下を強調表示します。", - "hoverBackground": "エディター ホバーの背景色。", - "hoverBorder": "エディター ホバーの境界線の色。" + "showHover": "ホバーの表示" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json b/i18n/jpn/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json index f96e5015ff1..d66571a0e23 100644 --- a/i18n/jpn/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json @@ -16,8 +16,8 @@ "peekViewTitleInfoForeground": "ピーク ビューのタイトル情報の色。", "peekViewBorder": "ピーク ビューの境界と矢印の色。", "peekViewResultsBackground": "ピーク ビュー結果リストの背景色。", - "peekViewResultsMatchForeground": "ピーク ビュー結果リストの一致したエントリの前景色。", - "peekViewResultsFileForeground": "ピーク ビュー結果リストのファイル エントリの前景色。", + "peekViewResultsMatchForeground": "ピーク ビュー結果リストのライン ノードの前景色。", + "peekViewResultsFileForeground": "ピーク ビュー結果リストのファイル ノードの前景色。", "peekViewResultsSelectionBackground": "ピーク ビュー結果リストの選択済みエントリの背景色。", "peekViewResultsSelectionForeground": "ピーク ビュー結果リストの選択済みエントリの前景色。", "peekViewEditorBackground": "ピーク ビュー エディターの背景色。", diff --git a/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 225b4c1b85d..c57f70f47ef 100644 --- a/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,10 +9,8 @@ "editorSuggestWidgetForeground": "候補ウィジェットの前景色。", "editorSuggestWidgetSelectedBackground": "候補ウィジェット内で選択済みエントリの背景色。", "editorSuggestWidgetHighlightForeground": "候補のウィジェット内で一致したハイライトの色。", - "readMore": "詳細を表示...{0}", "suggestionWithDetailsAriaLabel": "{0}、候補、詳細あり", "suggestionAriaLabel": "{0}、候補", - "goback": "戻る", "suggestWidget.loading": "読み込んでいます...", "suggestWidget.noSuggestions": "候補はありません。", "suggestionAriaAccepted": "{0}、受け入れ済み", diff --git a/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json index cae6a6693a2..40f629313c2 100644 --- a/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -7,14 +7,25 @@ "invalid.color": "無効な色形式です。 #RGB、#RGBA、#RRGGBB、#RRGGBBAA のいずれかを使用してください", "schema.colors": "ワークベンチで使用する色。", "foreground": "全体の前景色。この色は、コンポーネントによってオーバーライドされていない場合にのみ使用されます。", + "errorForeground": "エラー メッセージ全体の前景色。この色は、コンポーネントによって上書きされていない場合にのみ使用されます。", + "descriptionForeground": "追加情報を提供する説明文の前景色、例:ラベル。", "focusBorder": "フォーカスされた要素の境界線全体の色。この色はコンポーネントによって上書きされていない場合にのみ使用されます。", "contrastBorder": "コントラストを強めるために、他の要素と隔てる追加の境界線。", "activeContrastBorder": "コントラストを強めるために、アクティブな他要素と隔てる追加の境界線。", + "selectionBackground": "ワークベンチ内のテキスト選択の背景色 (例: 入力フィールドやテキストエリア)。エディター内やターミナル内の選択には適用されないことに注意してください。", + "textSeparatorForeground": "テキストの区切り文字の色。", + "textLinkForeground": "テキスト内のリンクの前景色。", + "textLinkActiveForeground": "テキスト内のアクティブなリンクの前景色。", + "textPreformatForeground": "フォーマット済みテキスト セグメントの前景色。", + "textBlockQuoteBackground": "テキスト内のブロック引用の背景色。", + "textBlockQuoteBorder": "テキスト内のブロック引用の境界線色。", + "textCodeBlockBackground": "テキスト内のコード ブロックの背景色。", "widgetShadow": "エディター内の検索/置換窓など、エディター ウィジェットの影の色。", "inputBoxBackground": "入力ボックスの背景。", "inputBoxForeground": "入力ボックスの前景。", "inputBoxBorder": "入力ボックスの境界線。", "inputBoxActiveOptionBorder": "入力フィールドのアクティブ オプションの境界線の色。", + "inputPlaceholderForeground": "入力ボックスのプレースホルダー テキストの前景色。", "inputValidationInfoBackground": "情報の重大度を示す入力検証の背景色。", "inputValidationInfoBorder": "情報の重大度を示す入力検証の境界線色。", "inputValidationWarningBackground": "警告の重大度を示す入力検証の背景色。", @@ -28,8 +39,7 @@ "listActiveSelectionBackground": "ツリーリストがアクティブのとき、選択された項目のツリーリスト背景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", "listInactiveSelectionBackground": "ツリーリストが非アクティブのとき、フォーカスされた項目のツリーリスト背景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", "listActiveSelectionForeground": "ツリーリストがアクティブのとき、選択された項目のツリーリスト前景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", - "listFocusAndSelectionBackground": "ツリーリストがアクティブのとき、フォーカスと選択された項目のツリーリスト背景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。この色は、各選択とフォーカスの色設定より優先します。", - "listFocusAndSelectionForeground": "ツリーリストがアクティブのとき、フォーカスと選択された項目のツリーリスト前景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。この色は、各選択とフォーカスの色設定より優先します。", + "listInactiveSelectionForeground": "ツリーリストが非アクティブのとき、選択された項目のツリーリスト前景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", "listHoverBackground": "マウス操作で項目をホバーするときのツリーリスト背景。", "listDropBackground": "マウス操作で項目を移動するときのツリーリスト ドラッグ アンド ドロップの背景。", "highlight": "ツリーリスト内を検索しているとき、一致した強調のツリーリスト前景色。", @@ -38,6 +48,8 @@ "buttonForeground": "ボタンの前景色。", "buttonBackground": "ボタンの背景色。", "buttonHoverBackground": "ホバー時のボタン背景色。", + "badgeBackground": "バッジの背景色。バッジとは小さな情報ラベルのことです。例:検索結果の数", + "badgeForeground": "バッジの前景色。バッジとは小さな情報ラベルのことです。例:検索結果の数", "scrollbarShadow": "ビューがスクロールされたことを示すスクロール バーの影。", "scrollbarSliderBackground": "スライダーの背景色。", "scrollbarSliderHoverBackground": "ホバー時のスライダー背景色。", @@ -50,7 +62,9 @@ "editorFindMatch": "現在の検索一致項目の色。", "findMatchHighlight": "他の検索一致項目の色。", "findRangeHighlight": "検索を制限する範囲の色。", + "hoverHighlight": "ホバーが表示されているワードの下を強調表示します。", + "hoverBackground": "エディター ホバーの背景色。", + "hoverBorder": "エディター ホバーの境界線の色。", "activeLinkForeground": "アクティブなリンクの色。", - "linkForeground": "リンクの色。", "editorWidgetBackground": "検索/置換窓など、エディター ウィジェットの背景色。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/api/node/extHostExplorerView.i18n.json b/i18n/jpn/src/vs/workbench/api/node/extHostExplorerView.i18n.json new file mode 100644 index 00000000000..6447043d7ee --- /dev/null +++ b/i18n/jpn/src/vs/workbench/api/node/extHostExplorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "treeExplorer.notRegistered": "ID '{0}' の TreeExplorerNodeProvider は登録されていません。", + "treeExplorer.failedToProvideRootNode": "TreeExplorerNodeProvider '{0}' がルート ノードの指定に失敗しました。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/browser/actions/configureLocale.i18n.json b/i18n/jpn/src/vs/workbench/browser/actions/configureLocale.i18n.json index ccad0f32648..21107d326ab 100644 --- a/i18n/jpn/src/vs/workbench/browser/actions/configureLocale.i18n.json +++ b/i18n/jpn/src/vs/workbench/browser/actions/configureLocale.i18n.json @@ -7,7 +7,7 @@ "configureLocale": "言語を構成する", "displayLanguage": "VSCode の表示言語を定義します。", "doc": "サポートされている言語の一覧については、{0} をご覧ください。", - "restart": "VSCode の再起動に必要な値を変更します。", + "restart": "値を変更するには VS Code の再起動が必要です。", "fail.createSettings": "'{0}' ({1}) を作成できません。", "JsonSchema.locale": "使用する UI 言語。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/common/theme.i18n.json b/i18n/jpn/src/vs/workbench/common/theme.i18n.json index f1767a29556..5b74eef0a2f 100644 --- a/i18n/jpn/src/vs/workbench/common/theme.i18n.json +++ b/i18n/jpn/src/vs/workbench/common/theme.i18n.json @@ -4,19 +4,14 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "tabsContainerBackground": "タブ コンテナーの背景色。タブはエディター領域内にあるエディターのコンテナーです。複数のタブを 1 つのエディター グループで開くことができます。複数のエディター グループがある可能性があります。", "tabActiveBackground": "アクティブ タブの背景色。タブはエディター領域におけるエディターのコンテナーです。1 つのエディター グループで複数のタブを開くことができます。エディター グループを複数にすることもできます。", "tabInactiveBackground": "非アクティブ タブの背景色。タブはエディター領域におけるエディターのコンテナーです。1 つのエディター グループで複数のタブを開くことができます。エディター グループを複数にすることもできます。", "tabBorder": "タブ同士を分けるための境界線。タブはエディター領域内にあるエディターのコンテナーです。複数のタブを 1 つのエディター グループで開くことができます。複数のエディター グループがある可能性があります。", "tabActiveEditorGroupActiveForeground": "アクティブ グループ内のアクティブ タブの前景色。タブはエディター領域におけるエディターのコンテナーです。1 つのエディター グループで複数のタブを開くことができます。エディター グループを複数にすることもできます。", - "tabActiveEditorGroupInactiveForeground": "非アクティブ グループ内のアクティブ タブの前景色。タブはエディター領域におけるエディターのコンテナーです。1 つのエディター グループで複数のタブを開くことができます。エディター グループを複数にすることもできます。", "tabInactiveEditorGroupActiveForeground": "アクティブ グループ内の非アクティブ タブの前景色。タブはエディター領域におけるエディターのコンテナーです。1 つのエディター グループで複数のタブを開くことができます。エディター グループを複数にすることもできます。", - "tabInactiveEditorGroupInactiveForeground": "非アクティブ タブの前景色。タブはエディター領域におけるエディターのコンテナーです。1 つのエディター グループで複数のタブを開くことができます。エディター グループを複数にすることもできます。", "editorGroupBackground": "エディター グループの背景色。エディター グループはエディターのコンテナーです。背景色はエディター グループをドラッグすると表示されます。", "editorGroupHeaderBackground": "タブが無効な場合の エディター グループ タイトル ヘッダーの背景色。エディター グループはエディターのコンテナーです。", "editorGroupBorder": "複数のエディター グループを互いに分離するための色。エディター グループはエディターのコンテナーです。", - "editorDragAndDropBackground": "エディターのドラッグ時の背景色。", - "editorMasterDetailsBorder": "エディターを横並びに表示している場合に、詳細をマスター側から分けて表示するための境界線色。たとえば、差分エディターや設定エディターです。", "panelBackground": "パネルの背景色。パネルはエディター領域の下に表示され、出力や統合ターミナルなどのビューを含みます。", "panelBorder": "エディターとの区切りを示すパネル上部の罫線の色。パネルはエディター領域の下に表示され、出力や統合ターミナルなどのビューを含みます。", "panelActiveTitleForeground": "アクティブ パネルのタイトルの色。パネルはエディター領域の下に表示され、出力や統合ターミナルなどのビューを含みます。", @@ -31,7 +26,6 @@ "statusBarProminentItemHoverBackground": "ホバーしたときのステータス バーの重要な項目の背景色。重要な項目は、重要性を示すために他のステータスバーの項目から際立っています。 ステータス バーはウィンドウの下部に表示されます。", "activityBarBackground": "アクティビティ バーの背景色。アクティビティ バーは左端または右端に表示され、サイド バーのビューを切り替えることができます。", "activityBarForeground": "アクティビティ バーの前景色 (例: アイコンの色)。アクティビティ バーは左端または右端に表示され、サイド バーのビューを切り替えることができます。", - "activityBarDragAndDropBackground": "アクティビティ バーの項目のドラッグ アンド ドロップ フィードバックの色。アクティビティ バーは左端または右端に表示され、サイド バーの表示を切り替えることができます。", "activityBarBadgeBackground": "アクティビティ通知バッジの背景色。アクティビティ バーは左端または右端に表示され、サイド バーの表示を切り替えることができます。", "activityBarBadgeForeground": "アクティビティ通知バッジの前景色。アクティビティ バーは左端または右端に表示され、サイド バーの表示を切り替えることができます。", "sideBarBackground": "サイド バーの背景色。サイド バーは、エクスプローラーや検索などのビューが入るコンテナーです。", diff --git a/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json index 5912f182d82..3ced82ae8cb 100644 --- a/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -41,12 +41,12 @@ "window.newWindowDimensions.inherit": "新しいウィンドウを、最後にアクティブだったウィンドウと同じサイズで開きます。", "window.newWindowDimensions.maximized": "新しいウィンドウを最大化した状態で開きます。", "window.newWindowDimensions.fullscreen": "新しいウィンドウを全画面表示モードで開きます。", - "newWindowDimensions": "新しいウィンドウを開くときのサイズを制御します。既定では、新しいウィンドウは画面の中央に小さいサイズで開きます。'inherit' に設定すると、最後のアクティブ ウィンドウと同じサイズで開きます。'maximized' に設定するとウィンドウは最大サイズで開き、'fullscreen' に設定すると全画面になります。", "window.menuBarVisibility.default": "メニューは全画面表示モードの場合にのみ非表示です。", "window.menuBarVisibility.visible": "全画面表示モードの場合も含めて、常にメニューが表示されます。", "window.menuBarVisibility.toggle": "メニューは非表示ですが、Alt キーを押すと表示できます。", "window.menuBarVisibility.hidden": "メニューは常に非表示です。", "menuBarVisibility": "メニュー バーの表示/非表示を制御します。'切り替え' 設定は Alt キーを 1 回押すとメニュー バーの表示/非表示が切り替わることを意味します。既定では、ウィンドウが全画面表示の場合を除き、メニュー バーは表示されます。", + "enableMenuBarMnemonics": "有効にすると、Alt キー ショートカットを使用してメイン メニューを開くことができます。ニーモニックを無効にすると、これらの Alt キー ショートカットをエディター コマンドの代わりにバインドできます。", "autoDetectHighContrast": "有効にすると、Windows でハイ コントラスト テーマが使用されている場合にはハイ コントラスト テーマに自動的に変更され、Windows のハイ コントラスト テーマから切り替えられている場合にはダーク テーマに自動的に変更されます。", "titleBarStyle": "ウィンドウのタイトル バーの外観を調整します。変更を適用するには、完全に再起動する必要があります。", "window.nativeTabs": "macOS Sierra ウィンドウ タブを有効にします。この変更を適用するには完全な再起動が必要であり、ネイティブ タブでカスタムのタイトル バー スタイルが構成されていた場合はそれが無効になることに注意してください。", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json new file mode 100644 index 00000000000..88f436125ff --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileLinkMac": "クリックして従う (Cmd を押しながらクリックすると横に開きます)", + "fileLink": "クリックして従う (Ctrl を押しながらクリックすると横に開きます)" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/common/debug.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/common/debug.i18n.json new file mode 100644 index 00000000000..5f4689ab404 --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/debug/common/debug.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "internalConsoleOptions": "内部デバッグ コンソールの動作を制御します。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json index 0aaca371445..38c84790727 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json @@ -5,8 +5,6 @@ // Do not edit this file. It is machine generated. { "stateCapture": "最初の評価からオブジェクトの状態がキャプチャされます", - "fileLinkMac": "クリックして従う (Cmd を押しながらクリックすると横に開きます)", - "fileLink": "クリックして従う (Ctrl を押しながらクリックすると横に開きます)", "replVariableAriaLabel": "変数 {0} に値 {1} があります、Read Eval Print Loop、デバッグ", "replExpressionAriaLabel": "式 {0} に値 {1} があります、Read Eval Print Loop、デバッグ", "replValueOutputAriaLabel": "{0}、Read Eval Print Loop、デバッグ", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index efdfa523258..d63fe387f50 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,13 +7,12 @@ "debugAdapterBinNotFound": "デバッグ アダプターの実行可能ファイル '{0}' がありません。", "debugAdapterCannotDetermineExecutable": "デバッグ アダプター '{0}' の実行可能ファイルを判別できません。", "debugType": "構成の種類。", - "debugTypeNotRecognised": "デバッグの種類は認識されませんでした。対応するデバッグの拡張機能をインストールしてください。", + "debugTypeNotRecognised": "デバッグの種類は認識されませんでした。対応するデバッグの拡張機能がインストールされており、有効になっていることを確認してください。", "node2NotSupported": "\"node2\" はサポートされていません。代わりに \"node\" を使用し、\"protocol\" 属性を \"inspector\" に設定してください。", "debugName": "構成の名前。起動構成のドロップダウン メニューに表示されます。", "debugRequest": "構成の要求の種類。\"launch\" または \"attach\" です。", "debugServer": "デバッグ拡張機能の開発のみ。ポートが指定の VS Code の場合、サーバー モードで実行中のデバッグ アダプターへの接続が試行されます。", "debugPrelaunchTask": "デバッグ セッションの開始前に実行するタスク。", - "internalConsoleOptions": "内部デバッグ コンソールの動作を制御します。", "debugWindowsConfiguration": "Windows 固有の起動構成の属性。", "debugOSXConfiguration": "OS X 固有の起動構成の属性。", "debugLinuxConfiguration": "Linux 固有の起動構成の属性。", diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index 644c72bc995..b12d5ba07d8 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -23,7 +23,7 @@ "disableAction": "無効にする", "checkForUpdates": "更新の確認", "updateAll": "すべての拡張機能を更新します", - "reloadAction": "再読み込む", + "reloadAction": "再読み込み", "postUpdateTooltip": "再度読み込んで更新する", "postUpdateMessage": "このウィンドウを再度読み込んで、更新済みの拡張機能 '{0}' をアクティブ化しますか?", "postEnableTooltip": "再度読み込んでアクティブにする", diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 41b230f31e5..f7a0d5005fc 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,5 +8,9 @@ "showRecommendations": "推奨事項を表示", "neverShowAgain": "今後は表示しない", "close": "閉じる", - "workspaceRecommended": "このワークスペースには拡張機能の推奨事項があります。" + "workspaceRecommended": "このワークスペースには拡張機能の推奨事項があります。", + "ignoreExtensionRecommendations": "すべての拡張機能の推奨事項を無視しますか?", + "ignoreAll": "はい、すべて無視します", + "no": "いいえ", + "cancel": "キャンセル" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json index 1beba30be54..e9f31ea4af6 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json @@ -10,5 +10,6 @@ "extensions": "拡張機能", "view": "表示", "extensionsConfigurationTitle": "拡張機能", - "extensionsAutoUpdate": "拡張機能を自動的に更新します" + "extensionsAutoUpdate": "拡張機能を自動的に更新します", + "extensionsIgnoreRecommendations": "拡張機能の推奨事項を無視する" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index c77cc35a0f3..15c3aee15db 100644 --- a/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -27,8 +27,6 @@ "autoSaveDelay": "ダーティ ファイルの自動保存の遅延をミリ秒単位で制御します。'files.autoSave' が '{0}' に設定されている場合のみ適用されます", "watcherExclude": "ファイル モニタリングから除外するファイル パスの glob パターンを構成します。この設定を変更すると、再起動が必要になります。始動時に Code が消費する CPU 時間が多い場合は、大規模なフォルダーを除外して初期ロードを減らせます。", "hotExit.off": "Hot Exit を無効にします。", - "hotExit.onExit": "アプリケーションが閉じると (Windows/Linux で最後のウィンドウが閉じるとき、または workbench.action.quit コマンドがトリガーされるとき (コマンド パレット、キー バインド、メニュー))、Hot Exit がトリガーされます。バックアップされているすべてのウィンドウは、次の起動時に復元されます。", - "hotExit.onExitAndWindowClose": "アプリケーションが閉じると (Windows/Linux で最後のウィンドウが閉じるとき、または workbench.action.quit コマンドがトリガーするとき (コマンド パレット、キー バインド、メニュー))、Hot Exit がトリガーされます。また、フォルダーが開かれているウィンドウについても、それが最後のウィンドウかどうかに関係なく、Hot Exit がトリガーされます。フォルダーが開かれていないウィンドウはすべて、次回の起動時に復元されます。フォルダーのウィンドウをシャットダウン前と同じ状態に復元するには、\"window.reopenFolders\" を \"all\" に設定します。", "hotExit": "エディターを終了するときに保存を確認するダイアログを省略し、保存されていないファイルをセッション後も保持するかどうかを制御します。", "defaultLanguage": "新しいファイルに割り当てられる既定の言語モード。", "editorConfigurationTitle": "エディター", diff --git a/i18n/jpn/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.i18n.json b/i18n/jpn/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.i18n.json index 10e002dad4b..51d21107be0 100644 --- a/i18n/jpn/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.i18n.json @@ -7,7 +7,7 @@ "entryAriaLabel": "{0}、ビューの選択", "views": "ビュー", "panels": "パネル", - "terminals": "端末", + "terminals": "ターミナル", "terminalTitle": "{0}: {1}", "channels": "出力", "openView": "ビューを開く", diff --git a/i18n/jpn/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json b/i18n/jpn/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json index e7c97d566fc..241116f3364 100644 --- a/i18n/jpn/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json @@ -6,7 +6,5 @@ { "searchMatches": "一致する項目が {0} 件見つかりました", "searchMatch": "一致する項目が {0} 件見つかりました", - "fileMatchAriaLabel": "フォルダー {2} のファイル {1} 内で {0} 件の一致、検索結果", - "replacePreviewResultAria": "プレビュー結果の置換、{0}", - "searchResultAria": "{0}、検索結果" + "fileMatchAriaLabel": "フォルダー {2} のファイル {1} 内で {0} 件の一致、検索結果" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index 8329808fc1e..81375f18706 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -14,7 +14,7 @@ "ConfigureTaskRunnerAction.label": "タスク ランナーの構成", "ConfigureBuildTaskAction.label": "ビルド タスクを構成します", "CloseMessageAction.label": "閉じる", - "ShowTerminalAction.label": "端末の表示", + "ShowTerminalAction.label": "ターミナルの表示", "problems": "問題", "manyMarkers": "99+", "tasks": "タスク", diff --git a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json index 0465847b150..11afc0e1f72 100644 --- a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -5,22 +5,22 @@ // Do not edit this file. It is machine generated. { "terminalIntegratedConfigurationTitle": "統合端末", - "terminal.integrated.shell.linux": "端末が Linux で使用するシェルのパス。", - "terminal.integrated.shellArgs.linux": "Linux 端末で使用するコマンド ライン引数。", - "terminal.integrated.shell.osx": "端末が OS X で使用するシェルのパス。", + "terminal.integrated.shell.linux": "ターミナルが Linux で使用するシェルのパス。", + "terminal.integrated.shellArgs.linux": "Linux のターミナルで使用するコマンド ライン引数。", + "terminal.integrated.shell.osx": "ターミナルが OS X で使用するシェルのパス。", "terminal.integrated.shellArgs.osx": "OS X 端末で使用するコマンド ライン引数。", - "terminal.integrated.shell.windows": "端末が Windows で使用するシェルのパス。Windows に付属のシェル (cmd、PowerShell、または Bash on Ubuntu) を使用する場合、64 ビット バージョンを使用するには、C:\\Windows\\System32 ではなく、C:\\Windows\\sysnative を選びます。", + "terminal.integrated.shell.windows": "ターミナルが Windows で使用するシェルのパス。Windows に付属のシェル (cmd、PowerShell、または Bash on Ubuntu) を使用する場合、64 ビット バージョンを使用するには、C:\\Windows\\System32 ではなく、C:\\Windows\\sysnative を選びます。", "terminal.integrated.shellArgs.windows": "Windows ターミナル上の場合に使用されるコマンド ライン引数。", - "terminal.integrated.rightClickCopyPaste": "設定している場合、端末内で右クリックしたときにコンテキスト メニューを表示させず、選択範囲がある場合はコピー、選択範囲がない場合は貼り付けの操作を行います。", + "terminal.integrated.rightClickCopyPaste": "設定している場合、ターミナル内で右クリックしたときにコンテキスト メニューを表示させず、選択範囲がある場合はコピー、選択範囲がない場合は貼り付けの操作を行います。", "terminal.integrated.fontFamily": "端末のフォント ファミリを制御します。既定値は editor.fontFamily になります。", - "terminal.integrated.fontLigatures": "端末でフォントの合字が有効かどうかを制御します。", - "terminal.integrated.fontSize": "端末のフォント サイズをピクセル単位で制御します。", - "terminal.integrated.lineHeight": "端末の行の高さを制御します。この数値に端末のフォント サイズを乗算すると、実際の行の高さ (ピクセル単位) になります。", + "terminal.integrated.fontLigatures": "ターミナルでフォントの合字が有効かどうかを制御します。", + "terminal.integrated.fontSize": "ターミナルのフォント サイズをピクセル単位で制御します。", + "terminal.integrated.lineHeight": "ターミナルの行の高さを制御します。この数値にターミナルのフォント サイズを乗算すると、実際の行の高さ (ピクセル単位) になります。", "terminal.integrated.enableBold": "ターミナル内で太字を有効にするかどうか。これにはターミナルシェルからのサポートがひつようです。", - "terminal.integrated.cursorBlinking": "端末のカーソルを点滅させるかどうかを制御します。", + "terminal.integrated.cursorBlinking": "ターミナルのカーソルを点滅させるかどうかを制御します。", "terminal.integrated.cursorStyle": "端末のカーソルのスタイルを制御します。", "terminal.integrated.scrollback": "端末がそのバッファーに保持できる最大行数を制御します。", - "terminal.integrated.setLocaleVariables": "端末の開始時にロケール変数を設定するかどうかを制御します。OS X では既定で true になり、その他のプラットフォームでは false です。", + "terminal.integrated.setLocaleVariables": "ターミナルの開始時にロケール変数を設定するかどうかを制御します。OS X では既定で true になり、その他のプラットフォームでは false です。", "terminal.integrated.cwd": "端末を起動する明示的な開始パスです。これはシェル プロセスの現在の作業ディレクトリ (cwd) として使用されます。特にルート ディレクトリが cwd に適していない場合に、ワークスペースの設定で役立ちます。", "terminal.integrated.confirmOnExit": "アクティブなターミナル セッションがある場合に終了の確認をするかどうか。", "terminal.integrated.commandsToSkipShell": "キーバインドがシェルに送信されず、代わりに常に Code で処理されるコマンド ID のセット。これにより、ターミナルがフォーカスされていない場合と同じ動作をするシェルによって通常使用されるキーバインドを使用できるようになります。例: Ctrl+p で Quick Open を起動します。", diff --git a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 1ed0e372072..799b12a797b 100644 --- a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -4,19 +4,19 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "workbench.action.terminal.toggleTerminal": "統合端末の切り替え", + "workbench.action.terminal.toggleTerminal": "統合ターミナルの切り替え", "workbench.action.terminal.kill": "アクティブな端末インスタンスを強制終了", "workbench.action.terminal.kill.short": "端末の強制終了", "workbench.action.terminal.copySelection": "選択内容のコピー", "workbench.action.terminal.new": "新しい統合端末の作成", - "workbench.action.terminal.new.short": "新しい端末", + "workbench.action.terminal.new.short": "新しいターミナル", "workbench.action.terminal.focus": "端末にフォーカス", "workbench.action.terminal.focusNext": "次の端末にフォーカス", "workbench.action.terminal.focusAtIndex": "ターミナル {0} にフォーカス", - "workbench.action.terminal.focusPrevious": "前の端末にフォーカス", - "workbench.action.terminal.paste": "アクティブな端末に貼り付け", + "workbench.action.terminal.focusPrevious": "前のターミナルにフォーカス", + "workbench.action.terminal.paste": "アクティブなターミナルに貼り付け", "workbench.action.terminal.DefaultShell": "既定のシェルの選択", - "workbench.action.terminal.runSelectedText": "アクティブな端末で選択したテキストを実行", + "workbench.action.terminal.runSelectedText": "アクティブなターミナルで選択したテキストを実行", "workbench.action.terminal.runActiveFile": "アクティブなファイルをアクティブなターミナルで実行", "workbench.action.terminal.runActiveFile.noFile": "ターミナルで実行できるのは、ディスク上のファイルのみです", "workbench.action.terminal.switchTerminalInstance": "端末インスタンスをスイッチ", diff --git a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json index 7880bacd288..50f3054a326 100644 --- a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "terminal.background": "ターミナルの背景色。パネルごとに異なる色を指定できます。", + "terminal.foreground": "ターミナルの前景色。", "terminal.ansiColor": "ターミナルの '{0}' ANSI カラー。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json index ab5a0deee5d..a898f37da7b 100644 --- a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "terminal.integrated.copySelection.noSelection": "ターミナルにフォーカスがない場合は、ターミナルの選択をコピーできません", - "terminal.integrated.exitedWithCode": "端末処理が終了しました (終了コード: {0})", + "terminal.integrated.exitedWithCode": "ターミナルの処理が終了しました (終了コード: {0})", "terminal.integrated.waitOnExit": "任意のキーを押して端末を終了します", - "terminal.integrated.launchFailed": "端末プロセス コマンド `{0}{1}` を起動できませんでした (終了コード: {2})" + "terminal.integrated.launchFailed": "ターミナル プロセス コマンド `{0}{1}` を起動できませんでした (終了コード: {2})" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index c22c825281d..9ede3f8b975 100644 --- a/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,7 +6,6 @@ { "selectTheme.label": "配色テーマ", "installColorThemes": "その他の色のテーマをインストール...", - "problemChangingTheme": "テーマの設定で問題が発生しました: {0}", "themes.selectTheme": "配色テーマの選択", "selectIconTheme.label": "ファイル アイコンのテーマ", "installIconThemes": "その他のファイル アイコンのテーマをインストール...", diff --git a/i18n/jpn/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json b/i18n/jpn/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json index e2eae85639c..33d502728a1 100644 --- a/i18n/jpn/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json @@ -11,7 +11,7 @@ "watermark.openFileFolder": "ファイルまたはフォルダーを開く", "watermark.openRecent": "最近開いた項目", "watermark.newUntitledFile": "無題の新規ファイル", - "watermark.toggleTerminal": "端末の切り替え", + "watermark.toggleTerminal": "ターミナルの切り替え", "watermark.findInFiles": "フォルダーを指定して検索", "watermark.startDebugging": "デバッグの開始", "watermark.selectTheme": "テーマの変更", diff --git a/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 05b5cdcae7b..817519ffbe5 100644 --- a/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -5,10 +5,5 @@ // Do not edit this file. It is machine generated. { "errorUnknownKey": "構成ファイルに書き込めません (不明なキー)", - "errorInvalidTarget": "構成ファイルに書き込めません (無効なターゲット)", - "errorNoWorkspaceOpened": "開いているフォルダーがないため、設定を書き込めません。最初にフォルダーを開いてから、もう一度お試しください。", - "errorInvalidConfiguration": "設定を書き込めません。**User Settings** を開いて、ファイル内のエラー/警告を修正してからもう一度お試しください。", - "errorInvalidConfigurationWorkspace": "設定を書き込めません。**Workspace Settings** を開いて、ファイル内のエラー/警告を修正してからもう一度お試しください。", - "errorConfigurationFileDirty": "ファイルが変更されているため、設定を書き込めません。**User Settings** ファイルを保存してから、もう一度お試しください。", - "errorConfigurationFileDirtyWorkspace": "ファイルが変更されているため、設定を書き込めません。**Workspace Settings** ファイルを保存してから、もう一度お試しください。" + "errorInvalidTarget": "構成ファイルに書き込めません (無効なターゲット)" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/jpn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index 590d8c39681..3920f3ceeb5 100644 --- a/i18n/jpn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -14,9 +14,6 @@ "vscode.extension.contributes.keybindings.win": "Windows 固有のキーまたはキー シーケンス。", "vscode.extension.contributes.keybindings.when": "キーがアクティブの場合の条件。", "vscode.extension.contributes.keybindings": "キー バインドを提供します。", - "openDocumentation": "詳細情報", - "keybindingMigration.ok": "OK", - "keybindingMigration.prompt": "使用中のキーボード レイアウトに合わせて一部のキーボード ショートカットが変更されました。", "invalid.keybindings": "正しくない `contributes.{0}`: {1}", "unboundCommands": "他に使用できるコマンドは次のとおりです: ", "keybindings.json.title": "キー バインドの構成", diff --git a/i18n/kor/extensions/git/out/commands.i18n.json b/i18n/kor/extensions/git/out/commands.i18n.json index 99d98e59a53..9798aa482fa 100644 --- a/i18n/kor/extensions/git/out/commands.i18n.json +++ b/i18n/kor/extensions/git/out/commands.i18n.json @@ -18,6 +18,8 @@ "discard": "변경 내용 취소", "confirm discard all": "모든 변경 내용을 취소하시겠습니까? 이 작업은 되돌릴 수 없습니다.", "discardAll": "모든 변경 내용 취소", + "yes": "예", + "always": "항상", "no changes": "커밋할 변경 내용이 없습니다.", "commit message": "커밋 메시지", "provide commit message": "커밋 메시지를 제공하세요.", diff --git a/i18n/kor/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/kor/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript/package.i18n.json b/i18n/kor/extensions/typescript/package.i18n.json index 032e92f8c4d..a2f98f7c04b 100644 --- a/i18n/kor/extensions/typescript/package.i18n.json +++ b/i18n/kor/extensions/typescript/package.i18n.json @@ -35,7 +35,6 @@ "javascript.goToProjectConfig.title": "프로젝트 구성으로 이동", "typescript.referencesCodeLens.enabled": "참조 CodeLens 사용하거나 사용하지 않도록 설정합니다. TypeScript >= 2.0.6이 필요합니다.", "typescript.implementationsCodeLens.enabled": "구현 CodeLens를 사용하거나 사용하지 않도록 설정합니다. TypeScript >= 2.2.0이 필요합니다.", - "typescript.openTsServerLog.title": "TS 서버 로그 파일 열기", "typescript.selectTypeScriptVersion.title": "TypeScript 버전 선택", "jsDocCompletion.enabled": "자동 JSDoc 주석 사용/사용 안 함", "javascript.implicitProjectConfig.checkJs": "JavaScript 파일의 의미 체계 검사를 사용/사용하지 않습니다. 기존 jsconfig.json 또는 tsconfig.json 파일은 이 설정을 재정의합니다. TypeScript >=2.3.1이 필요합니다. ", diff --git a/i18n/kor/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/kor/src/vs/base/common/jsonErrorMessages.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/base/common/jsonErrorMessages.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/code/electron-main/menus.i18n.json b/i18n/kor/src/vs/code/electron-main/menus.i18n.json index 76675a56471..a8faf00b858 100644 --- a/i18n/kor/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/kor/src/vs/code/electron-main/menus.i18n.json @@ -69,7 +69,6 @@ "miSmartSelectShrink": "선택 영역 축소(&&S)", "miViewExplorer": "탐색기(&&E)", "miViewSearch": "검색(&&S)", - "miViewGit": "Git(&&G)", "miViewDebug": "디버그(&&D)", "miViewExtensions": "확장(&&X)", "miToggleOutput": "출력(&&O)", diff --git a/i18n/kor/src/vs/editor/common/config/editorOptions.i18n.json b/i18n/kor/src/vs/editor/common/config/editorOptions.i18n.json new file mode 100644 index 00000000000..4118aae2aa7 --- /dev/null +++ b/i18n/kor/src/vs/editor/common/config/editorOptions.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorViewAccessibleLabel": "편집기 콘텐츠" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/hover/browser/hover.i18n.json b/i18n/kor/src/vs/editor/contrib/hover/browser/hover.i18n.json index f2f8c2fde82..af972da445a 100644 --- a/i18n/kor/src/vs/editor/contrib/hover/browser/hover.i18n.json +++ b/i18n/kor/src/vs/editor/contrib/hover/browser/hover.i18n.json @@ -4,8 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "showHover": "가리키기 표시", - "hoverHighlight": "호버가 표시된 단어 아래를 강조 표시합니다.", - "hoverBackground": "편집기 호버의 배경색.", - "hoverBorder": "편집기 호버의 테두리 색입니다." + "showHover": "가리키기 표시" } \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json b/i18n/kor/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json index 502c4b44ac9..d5cc24a60e7 100644 --- a/i18n/kor/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json +++ b/i18n/kor/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json @@ -16,8 +16,6 @@ "peekViewTitleInfoForeground": "Peek 뷰 제목 정보 색입니다.", "peekViewBorder": "Peek 뷰 테두리 및 화살표 색입니다.", "peekViewResultsBackground": "Peek 뷰 결과 목록의 배경색입니다.", - "peekViewResultsMatchForeground": "Peek 뷰 결과 목록의 일치 항목 전경입니다.", - "peekViewResultsFileForeground": "Peek 뷰 결과 목록의 파일 항목 전경입니다.", "peekViewResultsSelectionBackground": "Peek 뷰 결과 목록에서 선택된 항목의 배경색입니다.", "peekViewResultsSelectionForeground": "Peek 뷰 결과 목록에서 선택된 항목의 전경색입니다.", "peekViewEditorBackground": "Peek 뷰 편집기의 배경색입니다.", diff --git a/i18n/kor/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/kor/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 5903be2fd57..35c92b65eea 100644 --- a/i18n/kor/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/kor/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,10 +9,8 @@ "editorSuggestWidgetForeground": "제안 위젯의 전경색입니다.", "editorSuggestWidgetSelectedBackground": "제한 위젯에서 선택된 항목의 배경색입니다.", "editorSuggestWidgetHighlightForeground": "제안 위젯의 일치 항목 강조 표시 색입니다.", - "readMore": "자세히 알아보기...{0}", "suggestionWithDetailsAriaLabel": "{0}, 제안, 세부 정보 있음", "suggestionAriaLabel": "{0}, 제안", - "goback": "뒤로 이동", "suggestWidget.loading": "로드 중...", "suggestWidget.noSuggestions": "제안 항목이 없습니다.", "suggestionAriaAccepted": "{0}, 수락됨", diff --git a/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json index 411e1a2c08a..2a49f2851c0 100644 --- a/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -28,8 +28,6 @@ "listActiveSelectionBackground": "목록/트리가 활성 상태인 경우 선택한 항목의 목록/트리 배경색입니다. 목록/트리가 활성 상태이면 키보드 포커스를 가지며, 비활성 상태이면 포커스가 없습니다.", "listInactiveSelectionBackground": "목록/트리가 비활성 상태인 경우 선택한 항목의 목록/트리 배경색입니다. 목록/트리가 활성 상태이면 키보드 포커스를 가지며, 비활성 상태이면 포커스가 없습니다.", "listActiveSelectionForeground": "목록/트리가 활성 상태인 경우 선택한 항목의 목록/트리 전경색입니다. 목록/트리가 활성 상태이면 키보드 포커스를 가지며, 비활성 상태이면 포커스가 없습니다.", - "listFocusAndSelectionBackground": "목록/트리가 활성 상태인 경우 포커스가 있는 선택한 항목의 목록/트리 배경색입니다. 목록/트리가 활성 상태이면 키보드 포커스를 가지며, 비활성 상태이면 포커스가 없습니다. 이 색은 개별 선택 및 포커스 색보다 우선합니다.", - "listFocusAndSelectionForeground": "목록/트리가 활성 상태인 경우 포커스가 있는 선택한 항목의 목록/트리 전경색입니다. 목록/트리가 활성 상태이면 키보드 포커스를 가지며, 비활성 상태이면 포커스가 없습니다. 이 색은 개별 선택 및 포커스 색보다 우선합니다.", "listHoverBackground": "마우스로 항목을 가리킬 때 목록/트리 배경입니다.", "listDropBackground": "마우스로 항목을 이동할 때 목록/트리 끌어서 놓기 배경입니다.", "highlight": "목록/트리 내에서 검색할 때 일치 항목 강조 표시의 목록/트리 전경색입니다.", @@ -50,7 +48,9 @@ "editorFindMatch": "현재 검색 일치 항목의 색입니다.", "findMatchHighlight": "기타 검색 일치 항목의 색입니다.", "findRangeHighlight": "검색을 제한하는 영역의 색을 지정합니다.", + "hoverHighlight": "호버가 표시된 단어 아래를 강조 표시합니다.", + "hoverBackground": "편집기 호버의 배경색.", + "hoverBorder": "편집기 호버의 테두리 색입니다.", "activeLinkForeground": "활성 링크의 색입니다.", - "linkForeground": "링크 색입니다.", "editorWidgetBackground": "찾기/바꾸기 같은 편집기 위젯의 배경색입니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/api/node/extHostExplorerView.i18n.json b/i18n/kor/src/vs/workbench/api/node/extHostExplorerView.i18n.json new file mode 100644 index 00000000000..b5a93203559 --- /dev/null +++ b/i18n/kor/src/vs/workbench/api/node/extHostExplorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "treeExplorer.notRegistered": "ID가 '{0}'인 등록된 TreeExplorerNodeProvider가 없습니다.", + "treeExplorer.failedToProvideRootNode": "TreeExplorerNodeProvider '{0}'에서 루트 노드를 제공하지 못했습니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/browser/actions/configureLocale.i18n.json b/i18n/kor/src/vs/workbench/browser/actions/configureLocale.i18n.json index 46230055683..72443813473 100644 --- a/i18n/kor/src/vs/workbench/browser/actions/configureLocale.i18n.json +++ b/i18n/kor/src/vs/workbench/browser/actions/configureLocale.i18n.json @@ -7,7 +7,6 @@ "configureLocale": "언어 구성", "displayLanguage": "VSCode의 표시 언어를 정의합니다.", "doc": "지원되는 언어 목록은 {0} 을(를) 참조하세요.", - "restart": "값을 변경하려면 VSCode를 다시 시작해야 합니다.", "fail.createSettings": "'{0}'({1})을(를) 만들 수 없습니다.", "JsonSchema.locale": "사용할 UI 언어입니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/common/theme.i18n.json b/i18n/kor/src/vs/workbench/common/theme.i18n.json index 1cd988db67e..ca6f547f854 100644 --- a/i18n/kor/src/vs/workbench/common/theme.i18n.json +++ b/i18n/kor/src/vs/workbench/common/theme.i18n.json @@ -4,19 +4,14 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "tabsContainerBackground": "탭 컨테이너의 배경색입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", "tabActiveBackground": "활성 탭 배경색입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에서 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", "tabInactiveBackground": "비활성 탭 배경색입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에서 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", "tabBorder": "탭을 서로 구분하기 위한 테두리입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", "tabActiveEditorGroupActiveForeground": "활성 그룹의 활성 탭 전경색입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에서 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", - "tabActiveEditorGroupInactiveForeground": "비활성 그룹의 활성 탭 전경색입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에서 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", "tabInactiveEditorGroupActiveForeground": "활성 그룹의 비활성 탭 전경색입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에서 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", - "tabInactiveEditorGroupInactiveForeground": "비활성 그룹의 비활성 탭 전경색입니다. 탭은 편집기 영역에서 편집기의 컨테이너입니다. 한 편집기 그룹에서 여러 탭을 열 수 있습니다. 여러 편집기 그룹이 있을 수 있습니다.", "editorGroupBackground": "편집기 그룹의 배경색입니다. 편집기 그룹은 편집기의 컨테이너입니다. 배경색은 편집기 그룹을 끌 때 표시됩니다.", "editorGroupHeaderBackground": "탭을 사용하지 않도록 설정한 경우 편집기 그룹 제목 머리글의 배경색입니다. 편집기 그룹은 편집기의 컨테이너입니다.", "editorGroupBorder": "여러 편집기 그룹을 서로 구분하기 위한 색입니다. 편집기 그룹은 편집기의 컨테이너입니다.", - "editorDragAndDropBackground": "편집기를 끌어올 때의 배경색입니다.", - "editorMasterDetailsBorder": "병렬 편집기에서 마스터 쪽의 세부 정보를 구분하기 위한 테두리 색입니다. Diff 편집기, 설정 편집기 등을 예로 들 수 있습니다.", "panelBackground": "패널 배경색입니다. 패널은 편집기 영역 아래에 표시되며 출력 및 통합 터미널 같은 보기가 포함됩니다.", "panelBorder": "편집기와 구분되는 맨 위의 패널 테두리 색입니다. 패널은 편집기 영역 아래에 표시되며 출력 및 통합 터미널 같은 보기가 포함됩니다.", "panelActiveTitleForeground": "활성 패널의 제목 색입니다. 패널은 편집기 영역 아래에 표시되며 출력 및 통합 터미널 같은 보기가 포함됩니다.", @@ -31,7 +26,6 @@ "statusBarProminentItemHoverBackground": "마우스로 가리킬 때의 상태 표시줄 주요 항목 배경색입니다. 주요 항목은 중요도를를 나타내는 다른 상태 표시줄 항목보다 눈에 잘 띕니다. 상태 표시줄은 창의 맨 아래에 표시됩니다.", "activityBarBackground": "작업 막대 배경색입니다. 작업 막대는 맨 왼쪽이나 오른쪽에 표시되며 사이드바의 뷰 간을 전환하는 데 사용할 수 있습니다.", "activityBarForeground": "작업 막대 전경 색(예: 아이콘에 사용됨)입니다. 작업 막대는 오른쪽이나 왼쪽 끝에 표시되며 사이드바의 보기 간을 전환할 수 있습니다.", - "activityBarDragAndDropBackground": "작업 막대 항목의 끌어서 놓기 피드백 색입니다. 작업 막대는 왼쪽이나 오른쪽 끝에 표시되며 사이드바의 보기를 전환할 수 있습니다.", "activityBarBadgeBackground": "활동 알림 배지 배경색입니다. 작업 막대는 왼쪽이나 오른쪽 끝에 표시되며 사이드바의 보기를 전환할 수 있습니다.", "activityBarBadgeForeground": "활동 알림 배지 전경색입니다. 작업 막대는 왼쪽이나 오른쪽 끝에 표시되며 사이드바의 보기를 전환할 수 있습니다.", "sideBarBackground": "사이드바 배경색입니다. 사이드바는 탐색기 및 검색과 같은 뷰의 컨테이너입니다.", diff --git a/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json index ca403839f42..603999dbae9 100644 --- a/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -41,7 +41,6 @@ "window.newWindowDimensions.inherit": "마지막 활성 창과 동일한 크기로 새 창을 엽니다.", "window.newWindowDimensions.maximized": "최대화된 새 창을 엽니다.", "window.newWindowDimensions.fullscreen": "전체 화면 모드에서 새 창을 엽니다.", - "newWindowDimensions": "새 창을 열 때 크기를 제어합니다. 기본적으로 새 창은 화면 가운데에 작은 크기로 열립니다. 'inherit'으로 설정할 경우 마지막 활성 창과 동일한 크기로 창이 열립니다. 'maximized'로 설정할 경우 창이 최대화되어 열리고 'fullscreen'으로 구성할 경우 전체 화면으로 열립니다.", "window.menuBarVisibility.default": "메뉴가 전체 화면 모드에서만 숨겨집니다.", "window.menuBarVisibility.visible": "메뉴가 전체 화면 모드에서도 항상 표시됩니다.", "window.menuBarVisibility.toggle": "메뉴가 숨겨져 있지만 키를 통해 메뉴를 표시할 수 있습니다.", diff --git a/i18n/kor/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json new file mode 100644 index 00000000000..f69056da38c --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileLinkMac": "클릭하여 이동(측면에서 열려면 Cmd 키를 누르고 클릭)", + "fileLink": "클릭하여 이동(측면에서 열려면 Ctrl 키를 누르고 클릭)" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/common/debug.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/common/debug.i18n.json new file mode 100644 index 00000000000..1fd1591aa39 --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/debug/common/debug.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "internalConsoleOptions": "내부 디버그 콘솔의 동작을 제어합니다." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json index 8145efa9749..9c417b8c7dd 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json @@ -5,8 +5,6 @@ // Do not edit this file. It is machine generated. { "stateCapture": "개체 상태는 첫 번재 평가에서 캡처됩니다.", - "fileLinkMac": "클릭하여 이동(측면에서 열려면 Cmd 키를 누르고 클릭)", - "fileLink": "클릭하여 이동(측면에서 열려면 Ctrl 키를 누르고 클릭)", "replVariableAriaLabel": "{0} 변수에 {1} 값이 있습니다. 읽기 평가 인쇄 루프, 디버그", "replExpressionAriaLabel": "{0} 식에 {1} 값이 있습니다. 읽기 평가 인쇄 루프, 디버그", "replValueOutputAriaLabel": "{0}, 읽기 평가 인쇄 루프, 디버그", diff --git a/i18n/kor/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/kor/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index bac1b32e92a..fb59d091ab9 100644 --- a/i18n/kor/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,13 +7,11 @@ "debugAdapterBinNotFound": "디버그 어댑터 실행 파일 '{0}'이(가) 없습니다.", "debugAdapterCannotDetermineExecutable": "디버그 어댑터 '{0}'에 대한 실행 파일을 확인할 수 없습니다.", "debugType": "구성의 형식입니다.", - "debugTypeNotRecognised": "이 디버그 형식은 인식되지 않습니다. 해당하는 디버그 확장을 설치하세요.", "node2NotSupported": "\"node2\"는 더 이상 지원되지 않습니다. 대신 \"node\"를 사용하고 \"protocol\" 특성을 \"inspector\"로 설정하세요.", "debugName": "구성 이름이며, 구성 시작 드롭다운 메뉴에 표시됩니다.", "debugRequest": "구성 형식을 요청합니다. \"시작\" 또는 \"연결\"일 수 있습니다.", "debugServer": "디버그 확장 배포 전용입니다. 포트가 지정된 경우 VS Code에서는 서버 모드로 실행하는 디버그 어댑터에 연결을 시도합니다.", "debugPrelaunchTask": "디버그 세션이 시작되기 이전에 실행할 작업입니다.", - "internalConsoleOptions": "내부 디버그 콘솔의 동작을 제어합니다.", "debugWindowsConfiguration": "Windows 특정 시작 구성 특성입니다.", "debugOSXConfiguration": "OS X 특정 시작 구성 특성입니다.", "debugLinuxConfiguration": "Linux 특정 시작 구성 특성입니다.", diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 76bb8574a7e..84dc72bd8eb 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,5 +8,7 @@ "showRecommendations": "권장 사항 표시", "neverShowAgain": "다시 표시 안 함", "close": "닫기", - "workspaceRecommended": "이 작업 영역에 확장 권장 사항이 있습니다." + "workspaceRecommended": "이 작업 영역에 확장 권장 사항이 있습니다.", + "no": "아니요", + "cancel": "취소" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index aafef40ec7e..f9b799b1655 100644 --- a/i18n/kor/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -27,8 +27,6 @@ "autoSaveDelay": "더티 파일을 자동으로 저장할 때까지의 지연(밀리초)을 제어합니다. 'files.autoSave'를 '{0}'(으)로 설정한 경우에만 적용됩니다.", "watcherExclude": "파일 감시에서 제외할 파일 경로의 GLOB 패턴을 구성하세요. 이 설정을 변경하려면 다시 시작해야 합니다. 시작 시 Code에서 CPU 시간을 많이 차지하면 대용량 폴더를 제외하여 초기 로드를 줄일 수 있습니다.", "hotExit.off": "핫 종료를 사용하지 않습니다.", - "hotExit.onExit": "핫 종료는 응용 프로그램을 닫을 때 트리거됩니다. 즉 Windows/Linux에서 마지막 창을 닫을 때나 workbench.action.quit 명령이 트리거될 때(명령 팔레트, 키 바인딩, 메뉴)입니다. 다음 실행 시 백업을 포함한 모든 창이 복원됩니다.", - "hotExit.onExitAndWindowClose": "핫 종료는 응용 프로그램을 닫을 때 트리거됩니다. 즉 Windows/Linux에서 마지막 창을 닫을 때나 workbench.action.quit 명령이 트리거될 때(명령 팔레트, 키 바인딩, 메뉴), 또한 마지막 창인지 여부에 상관없이 폴더가 열린 모든 창의 경우입니다. 열린 폴더가 없는 모든 창은 다음 실행 시 복원됩니다. 종료되기 전에 폴더 창을 복원하려면 \"window.reopenFolders\"를 \"all\"로 설정합니다.", "hotExit": "저장하지 않은 파일을 세션 간에 기억하여, 편집기를 종료할 때 저장할지 묻는 메시지를 건너뛸지 여부를 제어합니다.", "defaultLanguage": "새 파일에 할당되는 기본 언어 모드입니다.", "editorConfigurationTitle": "편집기", diff --git a/i18n/kor/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json b/i18n/kor/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json index 50e19120bf9..5346ff5c5cf 100644 --- a/i18n/kor/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json @@ -6,7 +6,5 @@ { "searchMatches": "일치하는 {0}개 항목을 찾음", "searchMatch": "일치하는 {0}개 항목을 찾음", - "fileMatchAriaLabel": "{2} 폴더의 {1} 파일에 {0}개의 일치 항목이 있음, 검색 결과", - "replacePreviewResultAria": "미리 보기 바꾸기 결과, {0}", - "searchResultAria": "{0}, 검색 결과" + "fileMatchAriaLabel": "{2} 폴더의 {1} 파일에 {0}개의 일치 항목이 있음, 검색 결과" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index c5708dad5de..4e1c891e83f 100644 --- a/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -18,7 +18,6 @@ "problems": "문제", "manyMarkers": "99+", "tasks": "작업", - "TaskSystem.noHotSwap": "작업 실행 엔진을 변경하면 VS Code를 다시 시작해야 합니다. 변경이 무시됩니다.", "TaskService.noBuildTask": "정의된 빌드 작업이 없습니다. tasks.json 파일에서 작업을 'isBuildCommand'로 표시하세요.", "TaskService.noTestTask": "정의된 테스트 작업이 없습니다. tasks.json 파일에서 작업을 'isTestCommand'로 표시하세요.", "TaskServer.noTask": "실행하도록 요청한 작업 {0}을(를) 찾을 수 없습니다.", diff --git a/i18n/kor/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 90ad2a84f59..96dd1b9aebb 100644 --- a/i18n/kor/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,7 +6,6 @@ { "selectTheme.label": "색 테마", "installColorThemes": "추가 색 테마 설치...", - "problemChangingTheme": "테마를 설정하는 동안 문제 발생: {0}", "themes.selectTheme": "색 테마 선택", "selectIconTheme.label": "파일 아이콘 테마", "installIconThemes": "추가 파일 아이콘 테마 설치...", diff --git a/i18n/kor/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/kor/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index a897bbf9abe..58630d59484 100644 --- a/i18n/kor/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/kor/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -5,10 +5,5 @@ // Do not edit this file. It is machine generated. { "errorUnknownKey": "구성 파일에 쓸 수 없습니다(알 수 없는 키).", - "errorInvalidTarget": "구성 파일에 쓸 수 없습니다(잘못된 대상).", - "errorNoWorkspaceOpened": "폴더가 열려 있지 않으므로 설정을 쓸 수 없습니다. 먼저 폴더를 열고 다시 시도하세요.", - "errorInvalidConfiguration": "설정을 쓸 수 없습니다. **사용자 설정**을 열어 파일에서 오류/경고를 해결하고 다시 시도하세요.", - "errorInvalidConfigurationWorkspace": "설정을 쓸 수 없습니다. **작업 영역 설정**을 열어 파일에서 오류/경고를 해결하고 다시 시도하세요.", - "errorConfigurationFileDirty": "파일이 변경되어 설정을 쓸 수 없습니다. **사용자 설정** 파일을 저장하고 다시 시도하세요.", - "errorConfigurationFileDirtyWorkspace": "파일이 변경되어 설정을 쓸 수 없습니다. **작업 영역 설정** 파일을 저장하고 다시 시도하세요." + "errorInvalidTarget": "구성 파일에 쓸 수 없습니다(잘못된 대상)." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/kor/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index 86a6dfd7761..1d3e36aa30f 100644 --- a/i18n/kor/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/kor/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -14,9 +14,6 @@ "vscode.extension.contributes.keybindings.win": "Windows 특정 키 또는 키 시퀀스", "vscode.extension.contributes.keybindings.when": "키가 활성화되는 조건입니다.", "vscode.extension.contributes.keybindings": "키 바인딩을 적용합니다.", - "openDocumentation": "자세한 정보", - "keybindingMigration.ok": "확인", - "keybindingMigration.prompt": "키보드 레이아웃에 대해 일부 바로 가기 키가 변경되었습니다.", "invalid.keybindings": "잘못된 `contributes.{0}`입니다. {1}", "unboundCommands": "사용 가능한 다른 명령:", "keybindings.json.title": "키 바인딩 구성", diff --git a/i18n/rus/extensions/git/out/commands.i18n.json b/i18n/rus/extensions/git/out/commands.i18n.json index a55cd67aaa0..0e28cfd0b9a 100644 --- a/i18n/rus/extensions/git/out/commands.i18n.json +++ b/i18n/rus/extensions/git/out/commands.i18n.json @@ -18,6 +18,8 @@ "discard": "Отменить изменения", "confirm discard all": "Вы действительно хотите отменить все изменения? Отменить это действие нельзя!", "discardAll": "Отменить все изменения", + "yes": "Да", + "always": "Всегда", "no changes": "Нет изменений для фиксации.", "commit message": "Сообщение о фиксации", "provide commit message": "Введите сообщение фиксации.", diff --git a/i18n/rus/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/rus/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript/package.i18n.json b/i18n/rus/extensions/typescript/package.i18n.json index 683ce96350f..c7a879594d3 100644 --- a/i18n/rus/extensions/typescript/package.i18n.json +++ b/i18n/rus/extensions/typescript/package.i18n.json @@ -35,7 +35,6 @@ "javascript.goToProjectConfig.title": "Перейти к конфигурации проекта", "typescript.referencesCodeLens.enabled": "Включить или отключить CodeLens для ссылок. Требуется TypeScript >= 2.0.6.", "typescript.implementationsCodeLens.enabled": "Включить или отключить CodeLens для реализаций. Требуется TypeScript >= 2.2.0.", - "typescript.openTsServerLog.title": "Открытие файла журнала сервера TS", "typescript.selectTypeScriptVersion.title": "Выберите версию TypeScript.", "jsDocCompletion.enabled": "Включить или отключить JSDoc коментарии", "javascript.implicitProjectConfig.checkJs": "Включает/отключает семантическую проверку файлов JavaScript. Этот параметр может переопределяться в файле jsconfig.json или tsconfig.json. Требуется TypeScript 2.3.1 или более поздней версии.", diff --git a/i18n/rus/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/rus/src/vs/base/common/jsonErrorMessages.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/base/common/jsonErrorMessages.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/code/electron-main/menus.i18n.json b/i18n/rus/src/vs/code/electron-main/menus.i18n.json index d970ca1ef1c..2caee2db03b 100644 --- a/i18n/rus/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/rus/src/vs/code/electron-main/menus.i18n.json @@ -5,9 +5,9 @@ // Do not edit this file. It is machine generated. { "mFile": "&&Файл", - "mEdit": "&&Изменить", - "mSelection": "&&Выделений", - "mView": "&&Просмотреть", + "mEdit": "&&Правка", + "mSelection": "&&Выделение", + "mView": "&&Вид", "mGoto": "&&Перейти", "mDebug": "&&Отладка", "mWindow": "Окно", @@ -69,7 +69,6 @@ "miSmartSelectShrink": "&&Сжать выделение", "miViewExplorer": "Проводник", "miViewSearch": "Поиск", - "miViewGit": "&&Git", "miViewDebug": "Отладка", "miViewExtensions": "Р&&асширения", "miToggleOutput": "Вывод", diff --git a/i18n/rus/src/vs/editor/common/config/editorOptions.i18n.json b/i18n/rus/src/vs/editor/common/config/editorOptions.i18n.json new file mode 100644 index 00000000000..90b3992a47d --- /dev/null +++ b/i18n/rus/src/vs/editor/common/config/editorOptions.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorViewAccessibleLabel": "Содержимое редактора" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/hover/browser/hover.i18n.json b/i18n/rus/src/vs/editor/contrib/hover/browser/hover.i18n.json index 1140ec28ea0..61fdcdb90de 100644 --- a/i18n/rus/src/vs/editor/contrib/hover/browser/hover.i18n.json +++ b/i18n/rus/src/vs/editor/contrib/hover/browser/hover.i18n.json @@ -4,8 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "showHover": "Показать при наведении", - "hoverHighlight": "Выделение под словом, для которого показано наведение.", - "hoverBackground": "Цвет фона при наведении указателя на редактор.", - "hoverBorder": "Цвет границ при наведении указателя на редактор." + "showHover": "Показать при наведении" } \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json b/i18n/rus/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json index e5f25fad694..222d24b8288 100644 --- a/i18n/rus/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json +++ b/i18n/rus/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json @@ -16,8 +16,6 @@ "peekViewTitleInfoForeground": "Цвет сведений о заголовке быстрого редактора.", "peekViewBorder": "Цвет границ быстрого редактора и массива.", "peekViewResultsBackground": "Цвет фона в списке результатов представления быстрого редактора.", - "peekViewResultsMatchForeground": "Передний план совпадений в списке результатов быстрого редактора.", - "peekViewResultsFileForeground": "Передний план записи файла в списке результатов быстрого редактора.", "peekViewResultsSelectionBackground": "Цвет фона выбранной записи в списке результатов быстрого редактора.", "peekViewResultsSelectionForeground": "Цвет переднего плана выбранной записи в списке результатов быстрого редактора.", "peekViewEditorBackground": "Цвет фона быстрого редактора.", diff --git a/i18n/rus/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/rus/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 1b508516908..9f09465ad47 100644 --- a/i18n/rus/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/rus/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,10 +9,8 @@ "editorSuggestWidgetForeground": "Цвет переднего плана мини-приложения предложений.", "editorSuggestWidgetSelectedBackground": "Фоновый цвет выбранной записи в мини-приложении предложений.", "editorSuggestWidgetHighlightForeground": "Цвет выделения соответствия в мини-приложении предложений.", - "readMore": "Подробнее...{0}", "suggestionWithDetailsAriaLabel": "{0}, предложение, содержит данные", "suggestionAriaLabel": "{0}, предложение", - "goback": "Вернуться", "suggestWidget.loading": "Идет загрузка...", "suggestWidget.noSuggestions": "Предложения отсутствуют.", "suggestionAriaAccepted": "{0}, принято", diff --git a/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json index fa30062c9db..9b7785d5ac6 100644 --- a/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -7,9 +7,11 @@ "invalid.color": "Недопустимый формат цвета. Используйте #RGB, #RGBA, #RRGGBB или #RRGGBBAA", "schema.colors": "Цвета, используемые на рабочем месте.", "foreground": "Общий цвет переднего плана. Этот цвет используется, только если его не переопределит компонент.", + "errorForeground": "Общий цвет переднего плана для сообщений об ошибках. Этот цвет используется только если его не переопределяет компонент.", "focusBorder": "Общий цвет границ для элементов с фокусом. Этот цвет используется только в том случае, если не переопределен в компоненте.", "contrastBorder": "Дополнительная граница вокруг элементов, которая отделяет их от других элементов для улучшения контраста.", "activeContrastBorder": "Дополнительная граница вокруг активных элементов, которая отделяет их от других элементов для улучшения контраста.", + "textSeparatorForeground": "Цвет для разделителей текста.", "widgetShadow": "Цвет тени мини-приложений редактора, таких как \"Найти/заменить\".", "inputBoxBackground": "Фон поля ввода.", "inputBoxForeground": "Передний план поля ввода.", @@ -28,8 +30,6 @@ "listActiveSelectionBackground": "Фоновый цвет выбранного элемента List/Tree, когда элемент List/Tree активен. На активном элементе List/Tree есть фокус клавиатуры, на неактивном — нет.", "listInactiveSelectionBackground": "Фоновый цвет выбранного элемента List/Tree, когда элемент List/Tree неактивен. На активном элементе List/Tree есть фокус клавиатуры, на неактивном — нет.", "listActiveSelectionForeground": "Цвет переднего плана выбранного элемента List/Tree, когда элемент List/Tree активен. На активном элементе List/Tree есть фокус клавиатуры, на неактивном — нет.", - "listFocusAndSelectionBackground": "Фоновый цвет находящегося в фокусе и выбранного элемента List/Tree, когда элемент List/Tree активен. На активном элементе List/Tree есть фокус клавиатуры, на неактивном — нет. Этот цвет имеет приоритет над индивидуальными цветами выделения и фокуса.", - "listFocusAndSelectionForeground": "Цвет переднего плана находящегося в фокусе и выбранного элемента List/Tree, когда элемент List/Tree активен. На активном элементе List/Tree есть фокус клавиатуры, на неактивном — нет. Этот цвет имеет приоритет над индивидуальными цветами выделения и фокуса.", "listHoverBackground": "Фоновый цвет элементов List/Tree при наведении курсора мыши.", "listDropBackground": "Фоновый цвет элементов List/Tree при перемещении с помощью мыши.", "highlight": "Цвет переднего плана для выделения соответствия при поиске по элементу List/Tree.", @@ -50,7 +50,9 @@ "editorFindMatch": "Цвет текущего поиска совпадений.", "findMatchHighlight": "Цвет других совпадений поиска.", "findRangeHighlight": "Цвет диапазона, ограничивающего поиск.", + "hoverHighlight": "Выделение под словом, для которого показано наведение.", + "hoverBackground": "Цвет фона при наведении указателя на редактор.", + "hoverBorder": "Цвет границ при наведении указателя на редактор.", "activeLinkForeground": "Цвет активных ссылок.", - "linkForeground": "Цвет ссылок.", "editorWidgetBackground": "Цвет фона виджетов редактора, таких как найти/заменить." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/api/node/extHostExplorerView.i18n.json b/i18n/rus/src/vs/workbench/api/node/extHostExplorerView.i18n.json new file mode 100644 index 00000000000..69ab93e32fa --- /dev/null +++ b/i18n/rus/src/vs/workbench/api/node/extHostExplorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "treeExplorer.notRegistered": "TreeExplorerNodeProvider с идентификатором \"{0}\" не зарегистрирован.", + "treeExplorer.failedToProvideRootNode": "TreeExplorerNodeProvider \"{0}\" не удалось предоставить корневой узел." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/browser/actions/configureLocale.i18n.json b/i18n/rus/src/vs/workbench/browser/actions/configureLocale.i18n.json index b6db31f0ebd..4b803b9827d 100644 --- a/i18n/rus/src/vs/workbench/browser/actions/configureLocale.i18n.json +++ b/i18n/rus/src/vs/workbench/browser/actions/configureLocale.i18n.json @@ -7,7 +7,6 @@ "configureLocale": "Настроить язык", "displayLanguage": "Определяет язык интерфейса VSCode.", "doc": "Список поддерживаемых языков см. в {0}.", - "restart": "Для изменения значения требуется перезапуск VSCode.", "fail.createSettings": "Невозможно создать \"{0}\" ({1}).", "JsonSchema.locale": "Язык пользовательского интерфейса." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/common/theme.i18n.json b/i18n/rus/src/vs/workbench/common/theme.i18n.json index f3d59ca959e..76b8cda3228 100644 --- a/i18n/rus/src/vs/workbench/common/theme.i18n.json +++ b/i18n/rus/src/vs/workbench/common/theme.i18n.json @@ -4,19 +4,14 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "tabsContainerBackground": "Цвет фона контейнера вкладок. Вкладки — это контейнеры для редакторов в области редакторов. В одной группе редакторов можно открыть несколько вкладок. Может быть несколько групп редакторов.", "tabActiveBackground": "Цвет фона активной вкладки. Вкладки — это контейнеры для редакторов в области редактора. В одной группе редакторов можно открыть несколько вкладок. Может присутствовать несколько групп редакторов.", "tabInactiveBackground": "Цвет фона неактивной вкладки. Вкладки — это контейнеры для редакторов в области редактора. В одной группе редакторов можно открыть несколько вкладок. Может присутствовать несколько групп редакторов.", "tabBorder": "Граница для разделения вкладок. Вкладки — это контейнеры для редакторов в области редакторов. В одной группе редакторов можно открыть несколько вкладок. Может быть несколько групп редакторов.", "tabActiveEditorGroupActiveForeground": "Цвет переднего плана активной вкладки в активной группе. Вкладки — это контейнеры для редакторов в области редактора. В одной группе редакторов можно открыть несколько вкладок. Может присутствовать несколько групп редакторов.", - "tabActiveEditorGroupInactiveForeground": "Цвет переднего плана активной вкладки в неактивной группе. Вкладки — это контейнеры для редакторов в области редактора. В одной группе редакторов можно открыть несколько вкладок. Может присутствовать несколько групп редакторов.", "tabInactiveEditorGroupActiveForeground": "Цвет переднего плана неактивной вкладки в активной группе. Вкладки — это контейнеры для редакторов в области редактора. В одной группе редакторов можно открыть несколько вкладок. Может присутствовать несколько групп редакторов.", - "tabInactiveEditorGroupInactiveForeground": "Цвет переднего плана неактивной вкладки в неактивной группе. Вкладки — это контейнеры для редакторов в области редактора. В одной группе редакторов можно открыть несколько вкладок. Может присутствовать несколько групп редакторов.", "editorGroupBackground": "Цвет фона группы редакторов. Группы редакторов представляют собой контейнеры редакторов. Цвет фона отображается при перетаскивании групп редакторов.", "editorGroupHeaderBackground": "Цвет фона для заголовка группы редакторов, когда вкладки отключены. Группы редакторов представляют собой контейнеры редакторов.", "editorGroupBorder": "Цвет для разделения нескольких групп редакторов. Группы редакторов — это контейнеры редакторов.", - "editorDragAndDropBackground": "Цвет фона при перетаскивании редакторов.", - "editorMasterDetailsBorder": "Цвет контура для отделения сведений от главной панели для параллельных редакторов. К примерам таких редакторов относятся редакторы несовпадений и редактор параметров.", "panelBackground": "Цвет фона панели. Панели показаны под областью редактора и содержат такие представления, как выходные данные и встроенный терминал.", "panelBorder": "Цвет верхней границы панели, отделяющей ее от редактора. Панели показаны под областью редактора и содержат такие представления, как выходные данные и встроенный терминал.", "panelActiveTitleForeground": "Цвет заголовка для активной панели. Панели отображаются под областью редактора и содержат такие представления, как окно вывода и встроенный терминал.", @@ -31,7 +26,6 @@ "statusBarProminentItemHoverBackground": "Цвет фона приоритетных элементов панели состояния при наведении. Приоритетные элементы выделяются на фоне других элементов панели состояния, чтобы подчеркнуть их значение. Панель состояния отображается в нижней части окна.", "activityBarBackground": "Цвет фона панели действий. Панель действий отображается слева или справа и позволяет переключаться между представлениями боковой панели.", "activityBarForeground": "Цвет переднего плана панели действий (например, цвет, используемый для значков). Панель действий отображается слева или справа и позволяет переключаться между представлениями боковой панели.", - "activityBarDragAndDropBackground": "Цвет обратной связи при перетаскивании для элементов панели действий. Панель действий отображается слева или справа и позволяет переключаться между представлениями боковой панели.", "activityBarBadgeBackground": "Цвет фона значка уведомлений о действиях. Панель действий отображается слева или справа и позволяет переключаться между представлениями боковой панели.", "activityBarBadgeForeground": "Цвет переднего плана значка уведомлений о действиях. Панель действий отображается слева или справа и позволяет переключаться между представлениями боковой панели.", "sideBarBackground": "Цвет фона боковой панели. Боковая панель — это контейнер таких представлений, как проводник и поиск.", diff --git a/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json index f2bf9369173..ff2b65c8fab 100644 --- a/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -41,7 +41,6 @@ "window.newWindowDimensions.inherit": "Открывать новые окна того же размера, что и последнее активное окно.", "window.newWindowDimensions.maximized": "Открывать новые окна в развернутом состоянии.", "window.newWindowDimensions.fullscreen": "Открывать новые окна в полноэкранном режиме.", - "newWindowDimensions": "Определяет размеры открывающегося нового окна. По умолчанию новое окно небольшого размера будет открываться по центру экрана. Если задано значение inherit, окно будет открываться с теми же размерами, что и последнее активное окно. Если задано значение maximized, окно будет открываться в максимальном размере, и в полноэкранном режиме, если задано значение fullscreen.", "window.menuBarVisibility.default": "Меню скрыто только в полноэкранном режиме.", "window.menuBarVisibility.visible": "Меню всегда видимо, даже в полноэкранном режиме.", "window.menuBarVisibility.toggle": "Меню скрыто, но его можно вывести с помощью клавиши ALT.", diff --git a/i18n/rus/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json new file mode 100644 index 00000000000..fab9558d4c2 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileLinkMac": "Щелкните, чтобы отслеживать (чтобы открыть сбоку экрана, щелкните, удерживая клавишу CMD)", + "fileLink": "Щелкните, чтобы отслеживать (чтобы открыть сбоку экрана, щелкните, удерживая клавишу CTRL)" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/common/debug.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/common/debug.i18n.json new file mode 100644 index 00000000000..7f2fb6520d0 --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/debug/common/debug.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "internalConsoleOptions": "Управляет поведением внутренней консоли отладки." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json index 188f271b73e..4c742d270df 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json @@ -5,8 +5,6 @@ // Do not edit this file. It is machine generated. { "stateCapture": "Состояние объекта записывается после первого вычисления", - "fileLinkMac": "Щелкните, чтобы отслеживать (чтобы открыть сбоку экрана, щелкните, удерживая клавишу CMD)", - "fileLink": "Щелкните, чтобы отслеживать (чтобы открыть сбоку экрана, щелкните, удерживая клавишу CTRL)", "replVariableAriaLabel": "Переменная \"{0}\" имеет значение \"{1}\", read–eval–print loop, отладка", "replExpressionAriaLabel": "Выражение \"{0}\" имеет значение \"{1}\", read–eval–print loop, отладка", "replValueOutputAriaLabel": "{0}, read–eval–print loop, отладка", diff --git a/i18n/rus/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/rus/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 8ea4b501a1e..90a5d4e861e 100644 --- a/i18n/rus/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,13 +7,11 @@ "debugAdapterBinNotFound": "Исполняемый файл адаптера отладки \"{0}\" не существует.", "debugAdapterCannotDetermineExecutable": "Невозможно определить исполняемый файл для адаптера отладки \"{0}\".", "debugType": "Тип конфигурации.", - "debugTypeNotRecognised": "Не удается распознать тип отладки. Установите соответствующее расширение отладки.", "node2NotSupported": "Значение \"node2\" больше не поддерживается; используйте \"node\" и задайте для атрибута \"protocol\" значение \"inspector\".", "debugName": "Имя конфигурации; отображается в раскрывающемся меню конфигурации запуска.", "debugRequest": "Запросите тип конфигурации. Возможные типы: \"запуск\" и \"подключение\".", "debugServer": "Только для разработки расширений отладки: если указан порт, VS Code пытается подключиться к адаптеру отладки, запущенному в режиме сервера.", "debugPrelaunchTask": "Задача, выполняемая перед началом сеанса отладки.", - "internalConsoleOptions": "Управляет поведением внутренней консоли отладки.", "debugWindowsConfiguration": "Атрибуты конфигурации запуска для Windows.", "debugOSXConfiguration": "Атрибуты конфигурации запуска для OS X.", "debugLinuxConfiguration": "Атрибуты конфигурации запуска для Linux.", diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 6380e0caa1e..e3fabddede9 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,5 +8,7 @@ "showRecommendations": "Показать рекомендации", "neverShowAgain": "Больше не показывать", "close": "Закрыть", - "workspaceRecommended": "Эта рабочая область включает рекомендации по расширениям." + "workspaceRecommended": "Эта рабочая область включает рекомендации по расширениям.", + "no": "Нет", + "cancel": "Отмена" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index a548f83b670..952d7106938 100644 --- a/i18n/rus/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -27,8 +27,6 @@ "autoSaveDelay": "Определяет задержку в мс, после которой измененный файл сохраняется автоматически. Действует, только если параметр \"files.autoSave\" имеет значение \"{0}\".", "watcherExclude": "Настройте стандартные маски путей файлов, чтобы исключить их из списка отслеживаемых файлов. После изменения этого параметра потребуется перезагрузка. При отображении сообщения \"Код потребляет большое количество процессорного времени при запуске\" вы можете исключить большие папки, чтобы уменьшить первоначальную загрузку.", "hotExit.off": "Отключите \"горячий\" выход.", - "hotExit.onExit": "\"Горячий\" выход будет активирован при закрытии приложения, то есть когда закрывается последнее окно в Windows или Linux или при активации команды workbench.action.quit (палитра команд, настраиваемое сочетание клавиш, меню). Все окна с резервными копиями будут восстановлены при следующем запуске.", - "hotExit.onExitAndWindowClose": "\"Горячий\" выход будет активирован при закрытии приложения, то есть когда закрывается последнее окно в Windows или Linux или при активации команды workbench.action.quit (палитра команд, настраиваемое сочетание клавиш, меню) и в любых окнах, где открыта папка, даже если это не последнее окно. Окна без открытых папок будут восстановлены при следующем запуске. Чтобы восстановить окна с папками, перед завершением работы задайте для \"window.reopenFolders\" значение \"all\".", "hotExit": "Определяет, запоминаются ли несохраненные файлы между сеансами. В этом случае приглашение на их сохранение при выходе из редактора не появляется.", "defaultLanguage": "Режим языка по умолчанию, который назначается новым файлам.", "editorConfigurationTitle": "Редактор", diff --git a/i18n/rus/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json b/i18n/rus/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json index e7f3725b953..845c4f038e9 100644 --- a/i18n/rus/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json @@ -6,7 +6,5 @@ { "searchMatches": "Найдено соответствий: {0}", "searchMatch": "Найдено соответствие: {0}", - "fileMatchAriaLabel": "Совпадений в файле {1} папки {2}: {0}, результат поиска", - "replacePreviewResultAria": "Результаты предварительного просмотра замены, {0}", - "searchResultAria": "{0}, результат поиска" + "fileMatchAriaLabel": "Совпадений в файле {1} папки {2}: {0}, результат поиска" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json index da2bdae0add..031f694786c 100644 --- a/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -18,7 +18,6 @@ "problems": "Проблемы", "manyMarkers": "99+", "tasks": "Задачи", - "TaskSystem.noHotSwap": "Чтобы изменить подсистему выполнения задач, нужно перезапустить VS Code. Изменение игнорируется.", "TaskService.noBuildTask": "Задача сборки не определена. Отметьте задачу с помощью \"isBuildCommand\" в файле tasks.json.", "TaskService.noTestTask": "Задача теста не определена. Отметьте задачу с помощью \"isTestCommand\" в файле tasks.json.", "TaskServer.noTask": "Запрошенная задача {0} для выполнения не найдена.", diff --git a/i18n/rus/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 7cd864203ea..21f6cd4a2cb 100644 --- a/i18n/rus/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,7 +6,6 @@ { "selectTheme.label": "Цветовая тема", "installColorThemes": "Установить дополнительные цветовые темы...", - "problemChangingTheme": "Проблема при задании темы: {0}", "themes.selectTheme": "Выберите цветовую тему", "selectIconTheme.label": "Тема значков файлов", "installIconThemes": "Установить дополнительные темы значков файлов...", diff --git a/i18n/rus/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/rus/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 819e2b3d58b..0e4643e39d8 100644 --- a/i18n/rus/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/rus/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -5,10 +5,5 @@ // Do not edit this file. It is machine generated. { "errorUnknownKey": "Не удается выполнить запись в файл конфигурации (неизвестный ключ)", - "errorInvalidTarget": "Не удается выполнить запись в файл конфигурации (недопустимый целевой объект).", - "errorNoWorkspaceOpened": "Не удается записать параметры, так как нет открытых папок. Откройте папку и повторите попытку.", - "errorInvalidConfiguration": "Не удается выполнить запись параметров. Откройте файл **User Settings**, чтобы разрешить ошибки и предупреждения в файле, и повторите попытку.", - "errorInvalidConfigurationWorkspace": "Не удается выполнить запись параметров. Откройте файл **Workspace Settings**, чтобы разрешить ошибки и предупреждения в файле, и повторите попытку.", - "errorConfigurationFileDirty": "Не удается выполнить запись параметров, так как файл изменен. Сохраните файл **User Settings** и повторите попытку.", - "errorConfigurationFileDirtyWorkspace": "Не удается выполнить запись параметров, так как файл изменен. Сохраните файл **Workspace Settings** и повторите попытку." + "errorInvalidTarget": "Не удается выполнить запись в файл конфигурации (недопустимый целевой объект)." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/rus/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json index e7103548926..1a285aa0137 100644 --- a/i18n/rus/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json +++ b/i18n/rus/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -14,9 +14,6 @@ "vscode.extension.contributes.keybindings.win": "Клавиша или последовательность клавиш для Windows.", "vscode.extension.contributes.keybindings.when": "Условие, когда клавиша нажата.", "vscode.extension.contributes.keybindings": "Добавляет настраиваемые сочетания клавиш.", - "openDocumentation": "Дополнительные сведения", - "keybindingMigration.ok": "ОК", - "keybindingMigration.prompt": "Некоторые сочетания клавиш для вашей раскладки клавиатуры изменились.", "invalid.keybindings": "Недопустимое значение \"contributes.{0}\": {1}", "unboundCommands": "Доступные команды: ", "keybindings.json.title": "Настройка настраиваемых сочетаний клавиш", From 2b9679b5fb61ba62e61db89b7fcc067738710d7f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 12 May 2017 18:21:33 -0700 Subject: [PATCH 0410/1164] Pick up TS 2.3.3-insiders --- extensions/npm-shrinkwrap.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/npm-shrinkwrap.json b/extensions/npm-shrinkwrap.json index 34796990f9d..344c2b4d790 100644 --- a/extensions/npm-shrinkwrap.json +++ b/extensions/npm-shrinkwrap.json @@ -3,9 +3,9 @@ "version": "0.0.1", "dependencies": { "typescript": { - "version": "2.3.2", - "from": "typescript@typescript@2.3.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.3.2.tgz" + "version": "2.3.3-insiders.20170512,", + "from": "typescript@typescript@2.3.3-insiders.20170512", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.3.3-insiders.20170512.tgz" } } } diff --git a/package.json b/package.json index e2494bd6b0d..17b69cfc392 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "sinon": "^1.17.2", "source-map": "^0.4.4", "tslint": "^4.3.1", - "typescript": "2.3.2", + "typescript": "2.3.3-insiders.20170512", "typescript-formatter": "4.0.1", "uglify-js": "2.4.8", "underscore": "^1.8.2", From 513b3b406d5754ef4d80c21172e80ca410784a73 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 12 May 2017 18:52:26 -0700 Subject: [PATCH 0411/1164] Fix name for ts 2.3.3 --- extensions/extension-editing/src/extension.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/extension-editing/src/extension.ts b/extensions/extension-editing/src/extension.ts index cda1ed07ce9..647385b059b 100644 --- a/extensions/extension-editing/src/extension.ts +++ b/extensions/extension-editing/src/extension.ts @@ -74,7 +74,7 @@ namespace ast { const spans: number[] = []; ts.forEachChild(sourceFile, function visit(node: ts.Node) { - const declIdent = (node).name; + const declIdent = (node).name; if (declIdent && declIdent.kind === ts.SyntaxKind.Identifier) { identifiers.push((declIdent).text); spans.push(node.pos, node.end); From 092ea70b9aa21d263d8ddbd7052b50fdc594169e Mon Sep 17 00:00:00 2001 From: mappu Date: Sat, 13 May 2017 14:38:35 +1200 Subject: [PATCH 0412/1164] extension/php: detect language via shebang (#26581) Fixes #26580 --- extensions/php/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/php/package.json b/extensions/php/package.json index 7f1aa550478..a72bd56f64d 100644 --- a/extensions/php/package.json +++ b/extensions/php/package.json @@ -27,6 +27,7 @@ "PHP", "php" ], + "firstLine": "^#!/.*\\bphp\\b", "mimetypes": [ "application/x-php" ], @@ -119,4 +120,4 @@ "devDependencies": { "@types/node": "^7.0.4" } -} \ No newline at end of file +} From f856147a01af2f1417bcff1b65f2693a14f43603 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 12 May 2017 20:24:40 -0700 Subject: [PATCH 0413/1164] Split js and ts setting for references code lens Fixes #26418 Allows enabling or disabling the references code lenses in either javascript or typescript. Previously, the setting enabled it in both language automatically. Enable the code lenses in ts files by default --- extensions/typescript/package.json | 7 ++- extensions/typescript/package.nls.json | 3 +- .../src/features/baseCodeLensProvider.ts | 15 +++--- .../implementationsCodeLensProvider.ts | 12 +++-- .../features/referencesCodeLensProvider.ts | 12 +++-- extensions/typescript/src/typescriptMain.ts | 52 ++++++++----------- 6 files changed, 55 insertions(+), 46 deletions(-) diff --git a/extensions/typescript/package.json b/extensions/typescript/package.json index 1d239313b43..9526dddcdbd 100644 --- a/extensions/typescript/package.json +++ b/extensions/typescript/package.json @@ -107,9 +107,14 @@ "default": true, "description": "%typescript.check.npmIsInstalled%" }, - "typescript.referencesCodeLens.enabled": { + "javascript.referencesCodeLens.enabled": { "type": "boolean", "default": false, + "description": "%javascript.referencesCodeLens.enabled%" + }, + "typescript.referencesCodeLens.enabled": { + "type": "boolean", + "default": true, "description": "%typescript.referencesCodeLens.enabled%" }, "typescript.implementationsCodeLens.enabled": { diff --git a/extensions/typescript/package.nls.json b/extensions/typescript/package.nls.json index 2217759f722..f14b731bdad 100644 --- a/extensions/typescript/package.nls.json +++ b/extensions/typescript/package.nls.json @@ -28,7 +28,8 @@ "javascript.validate.enable": "Enable/disable JavaScript validation.", "typescript.goToProjectConfig.title": "Go to Project Configuration", "javascript.goToProjectConfig.title": "Go to Project Configuration", - "typescript.referencesCodeLens.enabled": "Enable/disable references CodeLens. Requires TypeScript >= 2.0.6.", + "javascript.referencesCodeLens.enabled": "Enable/disable references CodeLens in JavaScript files.", + "typescript.referencesCodeLens.enabled": "Enable/disable references CodeLens in TypeScript files. Requires TypeScript >= 2.0.6.", "typescript.implementationsCodeLens.enabled": "Enable/disable implementations CodeLens. Requires TypeScript >= 2.2.0.", "typescript.openTsServerLog.title": "Open TS Server log", "typescript.selectTypeScriptVersion.title": "Select TypeScript Version", diff --git a/extensions/typescript/src/features/baseCodeLensProvider.ts b/extensions/typescript/src/features/baseCodeLensProvider.ts index dbfd54eb391..9d2c4bfb768 100644 --- a/extensions/typescript/src/features/baseCodeLensProvider.ts +++ b/extensions/typescript/src/features/baseCodeLensProvider.ts @@ -5,7 +5,7 @@ 'use strict'; -import { CodeLensProvider, CodeLens, CancellationToken, TextDocument, Range, Uri, Position, Event, EventEmitter, workspace, ProviderResult, } from 'vscode'; +import { CodeLensProvider, CodeLens, CancellationToken, TextDocument, Range, Uri, Position, Event, EventEmitter, ProviderResult, } from 'vscode'; import * as Proto from '../protocol'; import { ITypescriptServiceClient } from '../typescriptService'; @@ -21,23 +21,20 @@ export class ReferencesCodeLens extends CodeLens { } export abstract class TypeScriptBaseCodeLensProvider implements CodeLensProvider { - private enabled: boolean = false; + private enabled: boolean = true; private onDidChangeCodeLensesEmitter = new EventEmitter(); public constructor( - protected client: ITypescriptServiceClient, - private toggleSettingName: string + protected client: ITypescriptServiceClient ) { } public get onDidChangeCodeLenses(): Event { return this.onDidChangeCodeLensesEmitter.event; } - public updateConfiguration(): void { - const typeScriptConfig = workspace.getConfiguration('typescript'); - const wasEnabled = this.enabled; - this.enabled = typeScriptConfig.get(this.toggleSettingName, false); - if (wasEnabled !== this.enabled) { + protected setEnabled(enabled: false): void { + if (this.enabled !== enabled) { + this.enabled = enabled; this.onDidChangeCodeLensesEmitter.fire(); } } diff --git a/extensions/typescript/src/features/implementationsCodeLensProvider.ts b/extensions/typescript/src/features/implementationsCodeLensProvider.ts index 11f9e99da7c..793176bb4f6 100644 --- a/extensions/typescript/src/features/implementationsCodeLensProvider.ts +++ b/extensions/typescript/src/features/implementationsCodeLensProvider.ts @@ -5,7 +5,7 @@ 'use strict'; -import { CodeLens, CancellationToken, TextDocument, Range, Location, ProviderResult } from 'vscode'; +import { CodeLens, CancellationToken, TextDocument, Range, Location, ProviderResult, workspace } from 'vscode'; import * as Proto from '../protocol'; import * as PConst from '../protocol.const'; @@ -17,9 +17,15 @@ const localize = nls.loadMessageBundle(); export default class TypeScriptImplementationsCodeLensProvider extends TypeScriptBaseCodeLensProvider { public constructor( - client: ITypescriptServiceClient + client: ITypescriptServiceClient, + private readonly language: string ) { - super(client, 'implementationsCodeLens.enabled'); + super(client); + } + + public updateConfiguration(): void { + const config = workspace.getConfiguration(this.language); + this.setEnabled(config.get('implementationsCodeLens.enabled', false)); } provideCodeLenses(document: TextDocument, token: CancellationToken): ProviderResult { diff --git a/extensions/typescript/src/features/referencesCodeLensProvider.ts b/extensions/typescript/src/features/referencesCodeLensProvider.ts index ffd29559e1c..46ecf347e72 100644 --- a/extensions/typescript/src/features/referencesCodeLensProvider.ts +++ b/extensions/typescript/src/features/referencesCodeLensProvider.ts @@ -5,7 +5,7 @@ 'use strict'; -import { CodeLens, CancellationToken, TextDocument, Range, Location, ProviderResult } from 'vscode'; +import { CodeLens, CancellationToken, TextDocument, Range, Location, ProviderResult, workspace } from 'vscode'; import * as Proto from '../protocol'; import * as PConst from '../protocol.const'; @@ -17,9 +17,15 @@ const localize = nls.loadMessageBundle(); export default class TypeScriptReferencesCodeLensProvider extends TypeScriptBaseCodeLensProvider { public constructor( - client: ITypescriptServiceClient + client: ITypescriptServiceClient, + private readonly language: string ) { - super(client, 'referencesCodeLens.enabled'); + super(client); + } + + public updateConfiguration(): void { + const config = workspace.getConfiguration(this.language); + this.setEnabled(config.get('referencesCodeLens.enabled', false)); } provideCodeLenses(document: TextDocument, token: CancellationToken): ProviderResult { diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index 99e107b9ce6..276b931a661 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -137,13 +137,10 @@ class LanguageProvider { private readonly currentDiagnostics: DiagnosticCollection; private readonly bufferSyncSupport: BufferSyncSupport; - private completionItemProvider: CompletionItemProvider; private formattingProvider: FormattingProvider; private formattingProviderRegistration: Disposable | null; private typingsStatus: TypingsStatus; - private referenceCodeLensProvider: ReferenceCodeLensProvider; - private implementationCodeLensProvider: ImplementationCodeLensProvider; - private JsDocCompletionProvider: JsDocCompletionProvider; + private toUpdateOnConfigurationChanged: ({ updateConfiguration: () => void })[] = []; private _validate: boolean = true; @@ -205,9 +202,10 @@ class LanguageProvider { const selector = this.description.modeIds; const config = workspace.getConfiguration(this.id); - this.completionItemProvider = new CompletionItemProvider(client, this.typingsStatus); - this.completionItemProvider.updateConfiguration(); - this.disposables.push(languages.registerCompletionItemProvider(selector, this.completionItemProvider, '.')); + const completionItemProvider = new CompletionItemProvider(client, this.typingsStatus); + completionItemProvider.updateConfiguration(); + this.toUpdateOnConfigurationChanged.push(completionItemProvider); + this.disposables.push(languages.registerCompletionItemProvider(selector, completionItemProvider, '.')); this.disposables.push(languages.registerCompletionItemProvider(selector, new DirectiveCommentCompletionProvider(client), '@')); @@ -218,9 +216,9 @@ class LanguageProvider { this.formattingProviderRegistration = languages.registerDocumentRangeFormattingEditProvider(selector, this.formattingProvider); } - this.JsDocCompletionProvider = new JsDocCompletionProvider(client); - this.JsDocCompletionProvider.updateConfiguration(); - this.disposables.push(languages.registerCompletionItemProvider(selector, this.JsDocCompletionProvider, '*')); + const jsDocCompletionProvider = new JsDocCompletionProvider(client); + jsDocCompletionProvider.updateConfiguration(); + this.disposables.push(languages.registerCompletionItemProvider(selector, jsDocCompletionProvider, '*')); this.disposables.push(languages.registerHoverProvider(selector, new HoverProvider(client))); this.disposables.push(languages.registerDefinitionProvider(selector, new DefinitionProvider(client))); @@ -230,14 +228,6 @@ class LanguageProvider { this.disposables.push(languages.registerSignatureHelpProvider(selector, new SignatureHelpProvider(client), '(', ',')); this.disposables.push(languages.registerRenameProvider(selector, new RenameProvider(client))); - this.referenceCodeLensProvider = new ReferenceCodeLensProvider(client); - this.referenceCodeLensProvider.updateConfiguration(); - this.disposables.push(languages.registerCodeLensProvider(selector, this.referenceCodeLensProvider)); - - this.implementationCodeLensProvider = new ImplementationCodeLensProvider(client); - this.implementationCodeLensProvider.updateConfiguration(); - this.disposables.push(languages.registerCodeLensProvider(selector, this.implementationCodeLensProvider)); - this.disposables.push(languages.registerCodeActionsProvider(selector, new CodeActionProvider(client, this.description.id))); this.registerVersionDependentProviders(); @@ -245,6 +235,17 @@ class LanguageProvider { this.description.modeIds.forEach(modeId => { this.disposables.push(languages.registerWorkspaceSymbolProvider(new WorkspaceSymbolProvider(client, modeId))); + const referenceCodeLensProvider = new ReferenceCodeLensProvider(client, modeId); + referenceCodeLensProvider.updateConfiguration(); + this.toUpdateOnConfigurationChanged.push(referenceCodeLensProvider); + this.disposables.push(languages.registerCodeLensProvider(selector, referenceCodeLensProvider)); + + const implementationCodeLensProvider = new ImplementationCodeLensProvider(client, modeId); + implementationCodeLensProvider.updateConfiguration(); + this.toUpdateOnConfigurationChanged.push(implementationCodeLensProvider); + this.disposables.push(languages.registerCodeLensProvider(selector, implementationCodeLensProvider)); + + this.disposables.push(languages.setLanguageConfiguration(modeId, { indentationRules: { // ^(.*\*/)?\s*\}.*$ @@ -302,15 +303,7 @@ class LanguageProvider { private configurationChanged(): void { const config = workspace.getConfiguration(this.id); this.updateValidate(config.get(validateSetting, true)); - if (this.completionItemProvider) { - this.completionItemProvider.updateConfiguration(); - } - if (this.referenceCodeLensProvider) { - this.referenceCodeLensProvider.updateConfiguration(); - } - if (this.implementationCodeLensProvider) { - this.implementationCodeLensProvider.updateConfiguration(); - } + if (this.formattingProvider) { this.formattingProvider.updateConfiguration(config); if (!this.formattingProvider.isEnabled() && this.formattingProviderRegistration) { @@ -321,8 +314,9 @@ class LanguageProvider { this.formattingProviderRegistration = languages.registerDocumentRangeFormattingEditProvider(this.description.modeIds, this.formattingProvider); } } - if (this.JsDocCompletionProvider) { - this.JsDocCompletionProvider.updateConfiguration(); + + for (const toUpdate of this.toUpdateOnConfigurationChanged) { + toUpdate.updateConfiguration(); } } From 78676ce503e17bd5a0bde93211de499e45c1c36f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 12 May 2017 20:50:36 -0700 Subject: [PATCH 0414/1164] Ensure the default js/tsconfig has content when first created. Fixes #21209 --- extensions/typescript/src/typescriptMain.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index 276b931a661..69901efcc65 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -9,7 +9,7 @@ * ------------------------------------------------------------------------------------------ */ 'use strict'; -import { env, languages, commands, workspace, window, ExtensionContext, Memento, IndentAction, Diagnostic, DiagnosticCollection, Range, Disposable, Uri, MessageItem, TextEditor, DiagnosticSeverity, TextDocument } from 'vscode'; +import { env, languages, commands, workspace, window, ExtensionContext, Memento, IndentAction, Diagnostic, DiagnosticCollection, Range, Disposable, Uri, MessageItem, TextEditor, DiagnosticSeverity, TextDocument, SnippetString } from 'vscode'; // This must be the first statement otherwise modules might got loaded with // the wrong locale. @@ -531,10 +531,15 @@ class TypeScriptServiceClientHost implements ITypescriptServiceClientHost { switch (selected && selected.id) { case ProjectConfigAction.CreateConfig: const configFile = Uri.file(path.join(rootPath, isTypeScriptProject ? 'tsconfig.json' : 'jsconfig.json')); + const col = window.activeTextEditor ? window.activeTextEditor.viewColumn : undefined; return workspace.openTextDocument(configFile) - .then(undefined, _ => workspace.openTextDocument(configFile.with({ scheme: 'untitled' }))) - .then(doc => - window.showTextDocument(doc, window.activeTextEditor ? window.activeTextEditor.viewColumn : undefined)); + .then(doc => { + return window.showTextDocument(doc, col); + }, _ => { + return workspace.openTextDocument(configFile.with({ scheme: 'untitled' })) + .then(doc => window.showTextDocument(doc, col)) + .then(editor => editor.insertSnippet(new SnippetString('{\n\t$0\n}'))); + }); case ProjectConfigAction.LearnMore: if (isTypeScriptProject) { From 81fc317dd8bb2dd5be03387dd9765bc24259c9d6 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Sun, 14 May 2017 10:10:56 -0700 Subject: [PATCH 0415/1164] Don't show extra empty lines in the Search output channel when searching with ripgrep disabled --- src/vs/workbench/parts/search/browser/searchViewlet.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index 4d12455d04f..e0c38df0a0f 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -988,7 +988,10 @@ export class SearchViewlet extends Viewlet { let isDone = false; const outputChannel = this.outputService.getChannel('search'); let onComplete = (completed?: ISearchComplete) => { - outputChannel.append('\n'); + if (query.useRipgrep) { + outputChannel.append('\n'); + } + isDone = true; // Complete up to 100% as needed @@ -1102,7 +1105,10 @@ export class SearchViewlet extends Viewlet { }; let onError = (e: any) => { - outputChannel.append('\n'); + if (query.useRipgrep) { + outputChannel.append('\n'); + } + if (errors.isPromiseCanceledError(e)) { onComplete(null); } else { From 5f5df7cb97980275a9b9f45cedf4c27cdbd877df Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 14 May 2017 12:07:01 -0700 Subject: [PATCH 0416/1164] Add commands to control workspace shell settings Fixes #23362 --- .../parts/terminal/common/terminal.ts | 3 ++ .../parts/terminal/common/terminalService.ts | 4 ++ .../electron-browser/terminal.contribution.ts | 4 +- .../electron-browser/terminalActions.ts | 38 ++++++++++++++++++- .../electron-browser/terminalConfigHelper.ts | 4 ++ 5 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index 836381fcd12..bd7df535e4e 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -71,6 +71,8 @@ export interface ITerminalConfigHelper { * Merges the default shell path and args into the provided launch configuration */ mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig): void; + /** Sets whether a workspace shell configuration is allowed or not */ + setWorkspaceShellAllowed(isAllowed: boolean): void; } export interface ITerminalFont { @@ -146,6 +148,7 @@ export interface ITerminalService { setContainers(panelContainer: HTMLElement, terminalContainer: HTMLElement): void; updateConfig(): void; selectDefaultWindowsShell(): TPromise; + setWorkspaceShellAllowed(isAllowed: boolean): void; } export interface ITerminalInstance { diff --git a/src/vs/workbench/parts/terminal/common/terminalService.ts b/src/vs/workbench/parts/terminal/common/terminalService.ts index dafe6cead2a..a3e2adecfc9 100644 --- a/src/vs/workbench/parts/terminal/common/terminalService.ts +++ b/src/vs/workbench/parts/terminal/common/terminalService.ts @@ -210,4 +210,8 @@ export abstract class TerminalService implements ITerminalService { public updateConfig(): void { this.terminalInstances.forEach(instance => instance.updateConfig()); } + + public setWorkspaceShellAllowed(isAllowed: boolean): void { + this.configHelper.setWorkspaceShellAllowed(isAllowed); + } } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts index 1e5cae2592b..6becf5badb0 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts @@ -17,7 +17,7 @@ import { TERMINAL_DEFAULT_SHELL_LINUX, TERMINAL_DEFAULT_SHELL_OSX, TERMINAL_DEFA import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actionRegistry'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { KillTerminalAction, CopyTerminalSelectionAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextTerminalAction, FocusPreviousTerminalAction, FocusTerminalAtIndexAction, SelectDefaultShellWindowsTerminalAction, RunSelectedTextInTerminalAction, RunActiveFileInTerminalAction, ScrollDownTerminalAction, ScrollDownPageTerminalAction, ScrollToBottomTerminalAction, ScrollUpTerminalAction, ScrollUpPageTerminalAction, ScrollToTopTerminalAction, TerminalPasteAction, ToggleTerminalAction, ClearTerminalAction } from 'vs/workbench/parts/terminal/electron-browser/terminalActions'; +import { KillTerminalAction, CopyTerminalSelectionAction, CreateNewTerminalAction, FocusActiveTerminalAction, FocusNextTerminalAction, FocusPreviousTerminalAction, FocusTerminalAtIndexAction, SelectDefaultShellWindowsTerminalAction, RunSelectedTextInTerminalAction, RunActiveFileInTerminalAction, ScrollDownTerminalAction, ScrollDownPageTerminalAction, ScrollToBottomTerminalAction, ScrollUpTerminalAction, ScrollUpPageTerminalAction, ScrollToTopTerminalAction, TerminalPasteAction, ToggleTerminalAction, ClearTerminalAction, AllowWorkspaceShellTerminalCommand, DisallowWorkspaceShellTerminalCommand } from 'vs/workbench/parts/terminal/electron-browser/terminalActions'; import { Registry } from 'vs/platform/platform'; import { ShowAllCommandsAction } from 'vs/workbench/parts/quickopen/browser/commandsHandler'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; @@ -266,5 +266,7 @@ actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ClearTerminalAct if (platform.isWindows) { actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(SelectDefaultShellWindowsTerminalAction, SelectDefaultShellWindowsTerminalAction.ID, SelectDefaultShellWindowsTerminalAction.LABEL), 'Terminal: Select Default Shell', category); } +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(AllowWorkspaceShellTerminalCommand, AllowWorkspaceShellTerminalCommand.ID, AllowWorkspaceShellTerminalCommand.LABEL), 'Terminal: Allow Workspace Shell Configuration', category); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DisallowWorkspaceShellTerminalCommand, DisallowWorkspaceShellTerminalCommand.ID, DisallowWorkspaceShellTerminalCommand.LABEL), 'Terminal: Disallow Workspace Shell Configuration', category); registerColors(); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts index d790e30fd1c..58cd361fd34 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts @@ -496,4 +496,40 @@ export class ClearTerminalAction extends Action { } return TPromise.as(void 0); } -} \ No newline at end of file +} + +export class AllowWorkspaceShellTerminalCommand extends Action { + + public static ID = 'workbench.action.terminal.allowWorkspaceShell'; + public static LABEL = nls.localize('workbench.action.terminal.allowWorkspaceShell', "Allow Workspace Shell Configuration"); + + constructor( + id: string, label: string, + @ITerminalService private terminalService: ITerminalService + ) { + super(id, label); + } + + public run(event?: any): TPromise { + this.terminalService.setWorkspaceShellAllowed(true); + return TPromise.as(void 0); + } +} + +export class DisallowWorkspaceShellTerminalCommand extends Action { + + public static ID = 'workbench.action.terminal.disallowWorkspaceShell'; + public static LABEL = nls.localize('workbench.action.terminal.disallowWorkspaceShell', "Disallow Workspace Shell Configuration"); + + constructor( + id: string, label: string, + @ITerminalService private terminalService: ITerminalService + ) { + super(id, label); + } + + public run(event?: any): TPromise { + this.terminalService.setWorkspaceShellAllowed(false); + return TPromise.as(void 0); + } +} diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts index fd87efa9993..5f4e739354e 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts @@ -100,6 +100,10 @@ export class TerminalConfigHelper implements ITerminalConfigHelper { return this._measureFont(fontFamily, fontSize, lineHeight); } + public setWorkspaceShellAllowed(isAllowed: boolean): void { + this._storageService.store(IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, isAllowed, StorageScope.WORKSPACE); + } + public mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig): void { // Check whether there is a workspace setting const platformKey = platform.isWindows ? 'windows' : platform.isMacintosh ? 'osx' : 'linux'; From 3ce087b99e75c6640649abab2bd1178d622c03ae Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 14 May 2017 22:17:42 +0200 Subject: [PATCH 0417/1164] #16580 Provide option to not to notify error by default. This is needed for extension API --- .../electron-browser/mainThreadConfiguration.ts | 4 ++-- .../preferences/browser/preferencesRenderers.ts | 17 ++++++++++++++--- .../preferences/browser/preferencesService.ts | 2 +- .../common/configurationEditing.ts | 13 ++++++++++++- .../node/configurationEditingService.ts | 16 ++++++++++------ 5 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadConfiguration.ts b/src/vs/workbench/api/electron-browser/mainThreadConfiguration.ts index 75b6594d1fd..f3d1533b7db 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadConfiguration.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadConfiguration.ts @@ -35,10 +35,10 @@ export class MainThreadConfiguration extends MainThreadConfigurationShape { } $updateConfigurationOption(target: ConfigurationTarget, key: string, value: any): TPromise { - return this._configurationEditingService.writeConfiguration(target, { key, value }); + return this._configurationEditingService.writeConfiguration(target, { key, value }, { donotNotifyError: true }); } $removeConfigurationOption(target: ConfigurationTarget, key: string): TPromise { - return this._configurationEditingService.writeConfiguration(target, { key, value: undefined }); + return this._configurationEditingService.writeConfiguration(target, { key, value: undefined }, { donotNotifyError: true }); } } diff --git a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts index 16f4f0ed57c..adcb8af04f2 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts @@ -24,7 +24,7 @@ import { IContextMenuService, ContextSubMenu } from 'vs/platform/contextview/bro import { SettingsGroupTitleWidget, EditPreferenceWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { RangeHighlightDecorations } from 'vs/workbench/common/editor/rangeDecorations'; -import { IConfigurationEditingService } from 'vs/workbench/services/configuration/common/configurationEditing'; +import { IConfigurationEditingService, IConfigurationEditingError, ConfigurationEditingErrorCode, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { overrideIdentifierFromKey } from 'vs/platform/configuration/common/model'; import { IMarkerService, IMarkerData } from 'vs/platform/markers/common/markers'; @@ -100,8 +100,19 @@ export class UserSettingsRenderer extends Disposable implements IPreferencesRend public updatePreference(key: string, value: any, source: ISetting): void { this.telemetryService.publicLog('defaultSettingsActions.copySetting', { userConfigurationKeys: [key] }); const overrideIdentifier = source.overrideOf ? overrideIdentifierFromKey(source.overrideOf.key) : null; - this.configurationEditingService.writeConfiguration(this.preferencesModel.configurationTarget, { key, value, overrideIdentifier }, !this.textFileService.isDirty(this.preferencesModel.uri)) - .then(() => this.onSettingUpdated(source)); + this.configurationEditingService.writeConfiguration(this.preferencesModel.configurationTarget, { key, value, overrideIdentifier }, { donotSave: this.textFileService.isDirty(this.preferencesModel.uri), donotNotifyError: true }) + .then(() => this.onSettingUpdated(source), error => { + this.messageService.show(Severity.Error, this.toErrorMessage(error, this.preferencesModel.configurationTarget)); + }); + } + + private toErrorMessage(error: IConfigurationEditingError, target: ConfigurationTarget): string { + switch (error.code) { + case ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION: { + return nls.localize('errorInvalidConfiguration', "Unable to write into settings. Correct errors/warnings in the file and try again."); + }; + } + return error.message; } private onModelChanged(): void { diff --git a/src/vs/workbench/parts/preferences/browser/preferencesService.ts b/src/vs/workbench/parts/preferences/browser/preferencesService.ts index 03b8646a1bc..436d010bd46 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesService.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesService.ts @@ -325,7 +325,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic } return { lineNumber: setting.valueRange.startLineNumber, column: setting.valueRange.startColumn + 1 }; } - return this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: languageKey, value: {} }, false) + return this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: languageKey, value: {} }, { donotSave: true }) .then(() => { setting = settingsModel.getPreference(languageKey); let content = eol + this.spaces(2, configuration) + eol + this.spaces(1, configuration); diff --git a/src/vs/workbench/services/configuration/common/configurationEditing.ts b/src/vs/workbench/services/configuration/common/configurationEditing.ts index 0ba753cef21..d687ee387a3 100644 --- a/src/vs/workbench/services/configuration/common/configurationEditing.ts +++ b/src/vs/workbench/services/configuration/common/configurationEditing.ts @@ -61,6 +61,17 @@ export interface IConfigurationValue { overrideIdentifier?: string; } +export interface IConfigurationEditingOptions { + /** + * If `true`, do not saves the configuration. Default is `false`. + */ + donotSave?: boolean; + /** + * If `true`, do not notifies the error to user by showing the message box. Default is `false`. + */ + donotNotifyError?: boolean; +} + export interface IConfigurationEditingService { _serviceBrand: ServiceIdentifier; @@ -69,5 +80,5 @@ export interface IConfigurationEditingService { * Allows to write the configuration value to either the user or workspace configuration file and save it if asked to save. * The returned promise will be in error state in any of the error cases from [ConfigurationEditingErrorCode](#ConfigurationEditingErrorCode) */ - writeConfiguration(target: ConfigurationTarget, value: IConfigurationValue, save?: boolean): TPromise; + writeConfiguration(target: ConfigurationTarget, value: IConfigurationValue, options?: IConfigurationEditingOptions): TPromise; } \ No newline at end of file diff --git a/src/vs/workbench/services/configuration/node/configurationEditingService.ts b/src/vs/workbench/services/configuration/node/configurationEditingService.ts index cbafdb6f2fc..70d1426b1f5 100644 --- a/src/vs/workbench/services/configuration/node/configurationEditingService.ts +++ b/src/vs/workbench/services/configuration/node/configurationEditingService.ts @@ -26,7 +26,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { keyFromOverrideIdentifier } from 'vs/platform/configuration/common/model'; import { WORKSPACE_CONFIG_DEFAULT_PATH, WORKSPACE_STANDALONE_CONFIGURATIONS } from 'vs/workbench/services/configuration/common/configuration'; import { IFileService } from 'vs/platform/files/common/files'; -import { IConfigurationEditingService, ConfigurationEditingErrorCode, IConfigurationEditingError, ConfigurationTarget, IConfigurationValue } from 'vs/workbench/services/configuration/common/configurationEditing'; +import { IConfigurationEditingService, ConfigurationEditingErrorCode, IConfigurationEditingError, ConfigurationTarget, IConfigurationValue, IConfigurationEditingOptions } from 'vs/workbench/services/configuration/common/configurationEditing'; import { ITextModelResolverService, ITextEditorModel } from 'vs/editor/common/services/resolverService'; import { OVERRIDE_PROPERTY_PATTERN } from 'vs/platform/configuration/common/configurationRegistry'; import { IChoiceService, IMessageService, Severity } from 'vs/platform/message/common/message'; @@ -62,15 +62,19 @@ export class ConfigurationEditingService implements IConfigurationEditingService this.queue = new Queue(); } - writeConfiguration(target: ConfigurationTarget, value: IConfigurationValue, save: boolean = true): TPromise { - return this.queue.queue(() => this.doWriteConfiguration(target, value, save).then(() => null, error => this.onError(error, target))); // queue up writes to prevent race conditions + writeConfiguration(target: ConfigurationTarget, value: IConfigurationValue, options: IConfigurationEditingOptions = {}): TPromise { + return this.queue.queue(() => this.doWriteConfiguration(target, value, options) // queue up writes to prevent race conditions + .then(() => null, + error => { + return options.donotNotifyError ? TPromise.wrapError(error) : this.onError(error, target); + })); } - private doWriteConfiguration(target: ConfigurationTarget, value: IConfigurationValue, save: boolean): TPromise { + private doWriteConfiguration(target: ConfigurationTarget, value: IConfigurationValue, options: IConfigurationEditingOptions): TPromise { const operation = this.getConfigurationEditOperation(target, value); - return this.resolveAndValidate(target, operation, save) - .then(reference => this.writeToBuffer(reference.object.textEditorModel, operation, save) + return this.resolveAndValidate(target, operation, !options.donotSave) + .then(reference => this.writeToBuffer(reference.object.textEditorModel, operation, !options.donotSave) .then(() => reference.dispose())); } From bed4aad1e055eda2f5d864bbba6968ea77262b1c Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Sun, 14 May 2017 17:48:39 -0700 Subject: [PATCH 0418/1164] Attempt to fix #26373 --- src/vs/editor/contrib/suggest/browser/media/suggest.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index 166f7ff94b6..aa846a258fb 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -133,6 +133,7 @@ .monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .type { opacity: 0.7; + word-break: break-all; } .monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > p { From 959f22920b035f75d2b33f82c1e1139bff1f65f5 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 15 May 2017 09:55:08 +0200 Subject: [PATCH 0419/1164] remove unused import --- build/tfs/common/enqueue.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/build/tfs/common/enqueue.ts b/build/tfs/common/enqueue.ts index e055ed4a938..875227bdd39 100644 --- a/build/tfs/common/enqueue.ts +++ b/build/tfs/common/enqueue.ts @@ -8,7 +8,6 @@ import { execSync } from 'child_process'; import { DocumentClient } from 'documentdb'; import * as azure from 'azure-storage'; -import * as path from 'path'; interface Asset { platform: string; From 14b3bb9f8a1b17eb89a8e7705fa728f2192fb481 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 15 May 2017 10:15:14 +0200 Subject: [PATCH 0420/1164] a little more height, #25506 --- src/vs/editor/contrib/codelens/browser/codelens.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/codelens/browser/codelens.ts b/src/vs/editor/contrib/codelens/browser/codelens.ts index ef3829e40ee..428fa8ba7ae 100644 --- a/src/vs/editor/contrib/codelens/browser/codelens.ts +++ b/src/vs/editor/contrib/codelens/browser/codelens.ts @@ -124,7 +124,7 @@ class CodeLensContentWidget implements editorBrowser.IContentWidget { private _updateHeight(): void { const { fontInfo, lineHeight } = this._editor.getConfiguration(); - this._domNode.style.height = `${lineHeight}px`; + this._domNode.style.height = `${Math.round(lineHeight * 1.1)}px`; this._domNode.style.lineHeight = `${lineHeight}px`; this._domNode.style.fontSize = `${Math.round(fontInfo.fontSize * .9)}px`; this._domNode.innerHTML = ' '; From 4d0b7c79d3b66737208cb5165f3831eb21b5fd6f Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 15 May 2017 10:36:22 +0200 Subject: [PATCH 0421/1164] build: wire in mixin password as GH token --- build/gulpfile.vscode.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index f6709c3e98d..e65f51d5c6a 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -130,7 +130,8 @@ const config = { darwinCredits: darwinCreditsTemplate ? new Buffer(darwinCreditsTemplate({ commit: commit, date: new Date().toISOString() })) : void 0, linuxExecutableName: product.applicationName, winIcon: 'resources/win32/code.ico', - token: process.env['GITHUB_TOKEN'] || void 0 + token: process.env['VSCODE_MIXIN_PASSWORD'] || process.env['GITHUB_TOKEN'] || void 0, + repo: product.electronRepository || void 0 }; gulp.task('clean-electron', util.rimraf('.build/electron')); From 73cfad0c02a3e96d5878113d3cfca59524fea625 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 15 May 2017 10:52:42 +0200 Subject: [PATCH 0422/1164] debug: filter out variables with no name specified fixes #26589 --- src/vs/workbench/parts/debug/common/debugModel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index 1f3e082dc63..b01aaafac97 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -180,7 +180,7 @@ export class ExpressionContainer implements IExpressionContainer { count, filter }).then(response => { - return response && response.body && response.body.variables ? distinct(response.body.variables.filter(v => !!v), v => v.name).map( + return response && response.body && response.body.variables ? distinct(response.body.variables.filter(v => !!v && v.name), v => v.name).map( v => new Variable(this.process, this, v.variablesReference, v.name, v.evaluateName, v.value, v.namedVariables, v.indexedVariables, v.type) ) : []; }, (e: Error) => [new Variable(this.process, this, 0, null, e.message, '', 0, 0, null, false)]); From d5ce11b978c03f0f3f4408851ac63b1945549010 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 15 May 2017 12:10:32 +0200 Subject: [PATCH 0423/1164] swap commands id and context keys --- .../contrib/snippet/browser/snippetController2.ts | 10 +++++----- .../editor/contrib/snippet/common/snippetController.ts | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 948bb9a9876..329caa67f7b 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -21,7 +21,7 @@ export class SnippetController2 { return editor.getContribution('snippetController2'); } - static InSnippetMode = new RawContextKey('isInSnippet', false); + static InSnippetMode = new RawContextKey('inSnippetMode', false); static HasNextTabstop = new RawContextKey('hasNextTabstop', false); static HasPrevTabstop = new RawContextKey('hasPrevTabstop', false); @@ -132,7 +132,7 @@ export class SnippetController2 { const CommandCtor = EditorCommand.bindToContribution(SnippetController2.get); CommonEditorRegistry.registerEditorCommand(new CommandCtor({ - id: 'snippet.next', + id: 'jumpToNextSnippetPlaceholder', precondition: ContextKeyExpr.and(SnippetController2.InSnippetMode, SnippetController2.HasNextTabstop), handler: ctrl => ctrl.next(), kbOpts: { @@ -142,7 +142,7 @@ CommonEditorRegistry.registerEditorCommand(new CommandCtor({ } })); CommonEditorRegistry.registerEditorCommand(new CommandCtor({ - id: 'snippet.prev', + id: 'jumpToPrevSnippetPlaceholder', precondition: ContextKeyExpr.and(SnippetController2.InSnippetMode, SnippetController2.HasPrevTabstop), handler: ctrl => ctrl.prev(), kbOpts: { @@ -152,7 +152,7 @@ CommonEditorRegistry.registerEditorCommand(new CommandCtor({ } })); CommonEditorRegistry.registerEditorCommand(new CommandCtor({ - id: 'snippet.cancel', + id: 'leaveSnippet', precondition: SnippetController2.InSnippetMode, handler: ctrl => ctrl.cancel(), kbOpts: { @@ -164,7 +164,7 @@ CommonEditorRegistry.registerEditorCommand(new CommandCtor({ })); CommonEditorRegistry.registerEditorCommand(new CommandCtor({ - id: 'snippet.accept', + id: 'acceptSnippet', precondition: SnippetController2.InSnippetMode, handler: ctrl => ctrl.finish(), // kbOpts: { diff --git a/src/vs/editor/contrib/snippet/common/snippetController.ts b/src/vs/editor/contrib/snippet/common/snippetController.ts index e5cdde2bb38..3a6dc9730f1 100644 --- a/src/vs/editor/contrib/snippet/common/snippetController.ts +++ b/src/vs/editor/contrib/snippet/common/snippetController.ts @@ -715,12 +715,12 @@ export class SnippetController { } } -export var CONTEXT_SNIPPET_MODE = new RawContextKey('inSnippetMode', false); +export var CONTEXT_SNIPPET_MODE = new RawContextKey('old.inSnippetMode', false); const SnippetCommand = EditorCommand.bindToContribution(SnippetController.get); CommonEditorRegistry.registerEditorCommand(new SnippetCommand({ - id: 'jumpToNextSnippetPlaceholder', + id: 'old.jumpToNextSnippetPlaceholder', precondition: CONTEXT_SNIPPET_MODE, handler: x => x.jumpToNextPlaceholder(), kbOpts: { @@ -730,7 +730,7 @@ CommonEditorRegistry.registerEditorCommand(new SnippetCommand({ } })); CommonEditorRegistry.registerEditorCommand(new SnippetCommand({ - id: 'jumpToPrevSnippetPlaceholder', + id: 'old.jumpToPrevSnippetPlaceholder', precondition: CONTEXT_SNIPPET_MODE, handler: x => x.jumpToPrevPlaceholder(), kbOpts: { @@ -740,7 +740,7 @@ CommonEditorRegistry.registerEditorCommand(new SnippetCommand({ } })); CommonEditorRegistry.registerEditorCommand(new SnippetCommand({ - id: 'acceptSnippet', + id: 'old.acceptSnippet', precondition: CONTEXT_SNIPPET_MODE, handler: x => x.acceptSnippet(), kbOpts: { @@ -750,7 +750,7 @@ CommonEditorRegistry.registerEditorCommand(new SnippetCommand({ } })); CommonEditorRegistry.registerEditorCommand(new SnippetCommand({ - id: 'leaveSnippet', + id: 'old.leaveSnippet', precondition: CONTEXT_SNIPPET_MODE, handler: x => x.leaveSnippet(), kbOpts: { From 1361982ebaa4c4cc6b454cf091f722b699c30f13 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 15 May 2017 12:21:14 +0200 Subject: [PATCH 0424/1164] tfs: add linux docker file --- build/gulpfile.hygiene.js | 3 ++- build/tfs/linux/Dockerfile | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 build/tfs/linux/Dockerfile diff --git a/build/gulpfile.hygiene.js b/build/gulpfile.hygiene.js index 594774e2c16..b2566cdac1b 100644 --- a/build/gulpfile.hygiene.js +++ b/build/gulpfile.hygiene.js @@ -41,7 +41,8 @@ const eolFilter = [ '!build/{lib,tslintRules}/**/*.js', '!build/monaco/**', '!build/win32/**', - '!build/**/*.sh' + '!build/**/*.sh', + '!**/Dockerfile' ]; const indentationFilter = [ diff --git a/build/tfs/linux/Dockerfile b/build/tfs/linux/Dockerfile new file mode 100644 index 00000000000..df3629d4ff9 --- /dev/null +++ b/build/tfs/linux/Dockerfile @@ -0,0 +1,34 @@ +FROM microsoft/vsts-agent:ubuntu-16.04-standard +MAINTAINER Joao Moreno + +RUN dpkg --add-architecture i386 +RUN apt-get update +RUN apt-get install -y build-essential +RUN apt-get install -y gcc-4.9-multilib +RUN apt-get install -y g++-4.9-multilib +RUN apt-get install -y zip +RUN apt-get install -y rpm +RUN apt-get install -y createrepo +RUN apt-get install -y libgtk2.0-0 +RUN apt-get install -y libgconf-2-4 +RUN apt-get install -y libnss3 +RUN apt-get install -y libasound2 +RUN apt-get install -y libxtst6 +RUN apt-get install -y libfuse2 +RUN apt-get install -y libgtk2.0-0:i386 +RUN apt-get install -y libnotify-bin +RUN apt-get install -y libnotify4:i386 +RUN apt-get install -y libgconf-2-4:i386 +RUN apt-get install -y libnss3:i386 +RUN apt-get install -y libx11-dev:i386 +RUN apt-get install -y libxkbfile-dev:i386 +RUN apt-get install -y libxtst6:i386 +RUN apt-get install -y libxss1:i386 +RUN apt-get install -y libxss1 +RUN apt-get install -y python-gtk2 +RUN apt-get install -y jq +RUN apt-get install -y libx11-xcb-dev:i386 +RUN apt-get install -y libx11-xcb-dev +RUN apt-get install -y xvfb +RUN apt-get install -y libx11-dev +RUN apt-get install -y libxkbfile-dev From 4b4783dfb382a50b1d07aca4530e0b96e589ddf6 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 15 May 2017 12:28:25 +0200 Subject: [PATCH 0425/1164] empty commit From 4e194f0e590ae66930239c91ddff737b4d226d8e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 15 May 2017 14:21:29 +0200 Subject: [PATCH 0426/1164] tfs: add fakeroot to linux Dockerfile --- build/tfs/linux/Dockerfile | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/build/tfs/linux/Dockerfile b/build/tfs/linux/Dockerfile index df3629d4ff9..811a15ddedd 100644 --- a/build/tfs/linux/Dockerfile +++ b/build/tfs/linux/Dockerfile @@ -9,26 +9,20 @@ RUN apt-get install -y g++-4.9-multilib RUN apt-get install -y zip RUN apt-get install -y rpm RUN apt-get install -y createrepo -RUN apt-get install -y libgtk2.0-0 -RUN apt-get install -y libgconf-2-4 -RUN apt-get install -y libnss3 -RUN apt-get install -y libasound2 -RUN apt-get install -y libxtst6 -RUN apt-get install -y libfuse2 -RUN apt-get install -y libgtk2.0-0:i386 -RUN apt-get install -y libnotify-bin -RUN apt-get install -y libnotify4:i386 -RUN apt-get install -y libgconf-2-4:i386 -RUN apt-get install -y libnss3:i386 -RUN apt-get install -y libx11-dev:i386 -RUN apt-get install -y libxkbfile-dev:i386 -RUN apt-get install -y libxtst6:i386 -RUN apt-get install -y libxss1:i386 -RUN apt-get install -y libxss1 RUN apt-get install -y python-gtk2 RUN apt-get install -y jq -RUN apt-get install -y libx11-xcb-dev:i386 -RUN apt-get install -y libx11-xcb-dev RUN apt-get install -y xvfb -RUN apt-get install -y libx11-dev +RUN apt-get install -y fakeroot +RUN apt-get install -y libgtk2.0-0 libgtk2.0-0:i386 +RUN apt-get install -y libgconf-2-4 libgconf-2-4:i386 +RUN apt-get install -y libnss3 libnss3:i386 +RUN apt-get install -y libasound2 +RUN apt-get install -y libxtst6 libxtst6:i386 +RUN apt-get install -y libfuse2 +RUN apt-get install -y libnotify-bin +RUN apt-get install -y libnotify4:i386 +RUN apt-get install -y libx11-dev libx11-dev:i386 +RUN apt-get install -y libxkbfile-dev:i386 +RUN apt-get install -y libxss1 libxss1:i386 +RUN apt-get install -y libx11-xcb-dev libx11-xcb-dev:i386 RUN apt-get install -y libxkbfile-dev From fb5e9f1171c38d288b77a7904e719693138cdf88 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 15 May 2017 14:52:13 +0200 Subject: [PATCH 0427/1164] tfs: use bash --- build/tfs/linux/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tfs/linux/build.sh b/build/tfs/linux/build.sh index ed2ac6d3758..7be220227ad 100755 --- a/build/tfs/linux/build.sh +++ b/build/tfs/linux/build.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash set -e export ARCH="$ARCH" From c754761cef6c484ba352a1c09094a603e05ee2ed Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 15 May 2017 15:20:30 +0200 Subject: [PATCH 0428/1164] tfs: fix linux build --- build/tfs/linux/build.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/build/tfs/linux/build.sh b/build/tfs/linux/build.sh index 7be220227ad..28a34d6227b 100755 --- a/build/tfs/linux/build.sh +++ b/build/tfs/linux/build.sh @@ -1,7 +1,7 @@ #!/bin/bash set -e -export ARCH="$ARCH" +export ARCH="$1" export VSCODE_MIXIN_PASSWORD="$2" export AZURE_STORAGE_ACCESS_KEY="$3" export AZURE_STORAGE_ACCESS_KEY_2="$4" @@ -26,19 +26,19 @@ STEP() { } STEP "Install dependencies" -./scripts/npm.sh install --arch=x64 --unsafe-perm +./scripts/npm.sh install --arch=$ARCH --unsafe-perm STEP "Mix in repository from vscode-distro" npm run gulp -- mixin STEP "Build minified" -npm run gulp -- --max_old_space_size=4096 vscode-linux-x64-min +npm run gulp -- --max_old_space_size=4096 "vscode-linux-$ARCH-min" STEP "Build Debian package" -npm run gulp -- --max_old_space_size=4096 vscode-linux-x64-build-deb +npm run gulp -- --max_old_space_size=4096 "vscode-linux-$ARCH-build-deb" STEP "Build RPM package" -npm run gulp -- --max_old_space_size=4096 vscode-linux-x64-build-rpm +npm run gulp -- --max_old_space_size=4096 "vscode-linux-$ARCH-build-rpm" STEP "Run unit tests" ./scripts/test.sh --xvfb --build --reporter dot From d6e800520fef59901f091cf671836f5ec0534ef3 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 12 May 2017 17:42:45 +0200 Subject: [PATCH 0429/1164] editorScrollbar: move off editor.viewInfo.theme --- .../viewParts/editorScrollbar/editorScrollbar.ts | 11 +++++++---- src/vs/platform/theme/common/themeService.ts | 8 ++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts index aff8334b64c..11d53265128 100644 --- a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts +++ b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts @@ -13,6 +13,7 @@ import { ViewContext } from 'vs/editor/common/view/viewContext'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; +import { getThemeTypeSelector } from "vs/platform/theme/common/themeService"; export class EditorScrollbar extends ViewPart { @@ -33,7 +34,7 @@ export class EditorScrollbar extends ViewPart { let scrollbarOptions: ScrollableElementCreationOptions = { canUseTranslate3d: editor.canUseTranslate3d, listenOnDomNode: viewDomNode.domNode, - className: 'editor-scrollable' + ' ' + editor.viewInfo.theme, + className: 'editor-scrollable' + ' ' + getThemeTypeSelector(context.theme.type), useShadows: false, lazyRender: true, @@ -120,10 +121,8 @@ export class EditorScrollbar extends ViewPart { // --- begin event handlers public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { - const editor = this._context.configuration.editor; - - this.scrollbar.updateClassName('editor-scrollable' + ' ' + editor.viewInfo.theme); if (e.viewInfo || e.canUseTranslate3d) { + const editor = this._context.configuration.editor; let newOpts: ScrollableElementChangeOptions = { canUseTranslate3d: editor.canUseTranslate3d, handleMouseWheel: editor.viewInfo.scrollbar.handleMouseWheel, @@ -139,6 +138,10 @@ export class EditorScrollbar extends ViewPart { public onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean { return true; } + public onThemeChanged(e: viewEvents.ViewThemeChangedEvent): boolean { + this.scrollbar.updateClassName('editor-scrollable' + ' ' + getThemeTypeSelector(this._context.theme.type)); + return true; + } // --- end event handlers diff --git a/src/vs/platform/theme/common/themeService.ts b/src/vs/platform/theme/common/themeService.ts index 37f6eb59b7c..64e028e6215 100644 --- a/src/vs/platform/theme/common/themeService.ts +++ b/src/vs/platform/theme/common/themeService.ts @@ -19,6 +19,14 @@ export const LIGHT = 'light'; export const HIGH_CONTRAST = 'hc'; export type ThemeType = 'light' | 'dark' | 'hc'; +export function getThemeTypeSelector(type: ThemeType): string { + switch (type) { + case DARK: return 'vs-dark'; + case HIGH_CONTRAST: return 'hc-black'; + default: return 'vs'; + } +} + export interface ITheme { readonly type: ThemeType; From 4529dd40e9dde141add509456566e165f3e1a79c Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 15 May 2017 15:47:34 +0200 Subject: [PATCH 0430/1164] File icons were not updated (fixes #26526) --- src/vs/workbench/browser/labels.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/browser/labels.ts b/src/vs/workbench/browser/labels.ts index 3d6f853fc0f..7f698036e98 100644 --- a/src/vs/workbench/browser/labels.ts +++ b/src/vs/workbench/browser/labels.ts @@ -60,7 +60,7 @@ export class ResourceLabel extends IconLabel { } public setLabel(label: IEditorLabel, options?: IResourceLabelOptions): void { - const hasResourceChanged = this.hasResourceChanged(label); + const hasResourceChanged = this.hasResourceChanged(label, options); this.label = label; this.options = options; @@ -68,10 +68,17 @@ export class ResourceLabel extends IconLabel { this.render(hasResourceChanged); } - private hasResourceChanged(label: IEditorLabel): boolean { + private hasResourceChanged(label: IEditorLabel, options: IResourceLabelOptions): boolean { const newResource = label ? label.resource : void 0; const oldResource = this.label ? this.label.resource : void 0; + const newIsFolder = options ? options.isFolder : false; + const oldIsFolder = this.options ? this.options.isFolder : false; + + if (newIsFolder !== oldIsFolder) { + return true; // same resource but different kind (file, folder) + } + if (newResource && oldResource) { return newResource.toString() !== oldResource.toString(); } From 72c32b23f1e9a52eb2bdb2f82b9ca9f126cf0cf6 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 15 May 2017 15:49:30 +0200 Subject: [PATCH 0431/1164] Cannot read property 'loadURL' of null (fixes #26588) --- src/vs/code/electron-main/window.ts | 3 --- src/vs/code/electron-main/windows.ts | 8 ++++++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index b7a33c5be26..bf81a6c55bf 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -600,9 +600,6 @@ export class VSCodeWindow { } public serializeWindowState(): IWindowState { - if (!this._win) { - return null; // avoid NPE when calling this method after the window has been disposed - } // fullscreen gets special treatment if (this._win.isFullScreen()) { diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index a243879c113..d271878e3b1 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -1204,6 +1204,10 @@ export class WindowsManager implements IWindowsMainService { detail: nls.localize('appStalledDetail', "You can reopen or close the window or keep waiting."), noLink: true }, result => { + if (!vscodeWindow.win) { + return; // Return early if the window has been going down already + } + if (result === 0) { vscodeWindow.reload(); } else if (result === 2) { @@ -1223,6 +1227,10 @@ export class WindowsManager implements IWindowsMainService { detail: nls.localize('appCrashedDetail', "We are sorry for the inconvenience! You can reopen the window to continue where you left off."), noLink: true }, result => { + if (!vscodeWindow.win) { + return; // Return early if the window has been going down already + } + if (result === 0) { vscodeWindow.reload(); } else if (result === 1) { From aae145d4787213d2cabffab60c3557187a318ec4 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 15 May 2017 15:50:36 +0200 Subject: [PATCH 0432/1164] window.newWindowDimensions: inherit not working with minimized window (fixes #26586) --- src/vs/code/electron-main/window.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index bf81a6c55bf..6108321a551 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -42,7 +42,7 @@ export interface IWindowCreationOptions { export enum WindowMode { Maximized, Normal, - Minimized, + Minimized, // not used anymore, but also cannot remove due to existing stored UI state (needs migration) Fullscreen } @@ -623,8 +623,6 @@ export class VSCodeWindow { // get window mode if (!platform.isMacintosh && this._win.isMaximized()) { mode = WindowMode.Maximized; - } else if (this._win.isMinimized()) { - mode = WindowMode.Minimized; } else { mode = WindowMode.Normal; } @@ -632,7 +630,7 @@ export class VSCodeWindow { // we don't want to save minimized state, only maximized or normal if (mode === WindowMode.Maximized) { state.mode = WindowMode.Maximized; - } else if (mode !== WindowMode.Minimized) { + } else { state.mode = WindowMode.Normal; } From d7be7a4b934b306b32386a13771dfb77c0f1a685 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 15 May 2017 15:52:46 +0200 Subject: [PATCH 0433/1164] Allow to theme editor scroll shadow (fixes #25528) --- .../scrollDecoration/scrollDecoration.css | 9 --------- .../viewParts/scrollDecoration/scrollDecoration.ts | 9 +++++++++ src/vs/editor/browser/widget/diffEditorWidget.ts | 1 - .../preferences/browser/media/preferences.css | 8 -------- .../parts/preferences/browser/preferencesEditor.ts | 14 +++++++++++++- 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.css b/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.css index 1950c6abc4d..1eabd692f83 100644 --- a/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.css +++ b/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.css @@ -8,13 +8,4 @@ top: 0; left: 0; height: 6px; - box-shadow: #DDD 0 6px 6px -6px inset; -} - -.monaco-editor.vs-dark .scroll-decoration { - box-shadow: #000 0 6px 6px -6px inset; -} - -.monaco-editor.hc-black .scroll-decoration { - box-shadow: none; } \ No newline at end of file diff --git a/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts b/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts index 3c015c2fabb..3b4252ea035 100644 --- a/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts +++ b/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts @@ -11,6 +11,8 @@ import { ViewPart } from 'vs/editor/browser/view/viewPart'; import { ViewContext } from 'vs/editor/common/view/viewContext'; import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { registerThemingParticipant } from "vs/platform/theme/common/themeService"; +import { scrollbarShadow } from "vs/platform/theme/common/colorRegistry"; export class ScrollDecorationViewPart extends ViewPart { @@ -86,3 +88,10 @@ export class ScrollDecorationViewPart extends ViewPart { this._domNode.setClassName(this._shouldShow ? 'scroll-decoration' : ''); } } + +registerThemingParticipant((theme, collector) => { + let shadow = theme.getColor(scrollbarShadow); + if (shadow) { + collector.addRule(`.monaco-editor .scroll-decoration { box-shadow: ${shadow} 0 6px 6px -6px inset; }`); + } +}); \ No newline at end of file diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index 113637bf6ff..af15fcfd15c 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -1958,7 +1958,6 @@ export const diffRemoved = registerColor('diffEditor.removedTextBackground', { d export const diffInsertedOutline = registerColor('diffEditor.insertedTextBorder', { dark: null, light: null, hc: '#33ff2eff' }, nls.localize('diffEditorInsertedOutline', 'Outline color for the text that got inserted.')); export const diffRemovedOutline = registerColor('diffEditor.removedTextBorder', { dark: null, light: null, hc: '#FF008F' }, nls.localize('diffEditorRemovedOutline', 'Outline color for text that got removed.')); - registerThemingParticipant((theme, collector) => { let added = theme.getColor(diffInserted); if (added) { diff --git a/src/vs/workbench/parts/preferences/browser/media/preferences.css b/src/vs/workbench/parts/preferences/browser/media/preferences.css index 58079f256d1..5913b98e6a8 100644 --- a/src/vs/workbench/parts/preferences/browser/media/preferences.css +++ b/src/vs/workbench/parts/preferences/browser/media/preferences.css @@ -135,14 +135,6 @@ padding-left:10px; } -.vs-dark .preferences-editor .side-by-side-preferences-editor > .editable-preferences-editor-container { - box-shadow: -6px 0 5px -5px black; -} - -.preferences-editor .side-by-side-preferences-editor > .editable-preferences-editor-container { - box-shadow: -6px 0 5px -5px #DDD; -} - .monaco-editor .settings-group-title-widget { z-index: 1; } diff --git a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts index 652e97a9e23..b6491b24484 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts @@ -53,6 +53,9 @@ import { FindController } from 'vs/editor/contrib/find/browser/find'; import { SelectionHighlighter } from 'vs/editor/contrib/find/common/findController'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { IThemeService } from "vs/platform/theme/common/themeService"; +import { attachStylerCallback } from "vs/platform/theme/common/styler"; +import { scrollbarShadow } from "vs/platform/theme/common/colorRegistry"; export class PreferencesEditorInput extends SideBySideEditorInput { public static ID: string = 'workbench.editorinputs.preferencesEditorInput'; @@ -329,7 +332,7 @@ class SideBySidePreferencesWidget extends Widget { private sash: VSash; - constructor(parent: HTMLElement, @IInstantiationService private instantiationService: IInstantiationService) { + constructor(parent: HTMLElement, @IInstantiationService private instantiationService: IInstantiationService, @IThemeService private themeService: IThemeService) { super(); this.create(parent); } @@ -346,6 +349,15 @@ class SideBySidePreferencesWidget extends Widget { this.editablePreferencesEditorContainer = DOM.append(parentElement, DOM.$('.editable-preferences-editor-container')); this.editablePreferencesEditorContainer.style.position = 'absolute'; + this._register(attachStylerCallback(this.themeService, { scrollbarShadow }, colors => { + const shadow = colors.scrollbarShadow ? colors.scrollbarShadow.toString() : null; + + if (shadow) { + this.editablePreferencesEditorContainer.style.boxShadow = `-6px 0 5px -5px ${shadow}`; + } else { + this.editablePreferencesEditorContainer.style.boxShadow = null; + } + })); } public setInput(defaultPreferencesEditorInput: DefaultPreferencesEditorInput, editablePreferencesEditorInput: EditorInput, options?: EditorOptions): TPromise<{ defaultPreferencesRenderer: IPreferencesRenderer, editablePreferencesRenderer: IPreferencesRenderer }> { From dc390816852b81cf8fc3ff0626d5f14d5c4f7344 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 15 May 2017 15:54:35 +0200 Subject: [PATCH 0434/1164] Add "list.hoverForeground" and "list.focusForeground" (fixes #26277) --- src/vs/base/browser/ui/list/listWidget.ts | 10 ++++++++++ src/vs/base/parts/tree/browser/tree.ts | 2 ++ src/vs/base/parts/tree/browser/treeView.ts | 8 ++++++++ src/vs/platform/theme/common/colorRegistry.ts | 4 +++- src/vs/platform/theme/common/styler.ts | 10 +++++++++- 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index 29795a31b98..5643cc768a9 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -405,6 +405,7 @@ export interface IListOptions extends IListViewOptions, IMouseControllerOptio export interface IListStyles { listFocusBackground?: Color; + listFocusForeground?: Color; listActiveSelectionBackground?: Color; listActiveSelectionForeground?: Color; listFocusAndSelectionBackground?: Color; @@ -413,6 +414,7 @@ export interface IListStyles { listInactiveSelectionForeground?: Color; listInactiveFocusBackground?: Color; listHoverBackground?: Color; + listHoverForeground?: Color; listDropBackground?: Color; listFocusOutline?: Color; listInactiveFocusOutline?: Color; @@ -818,6 +820,10 @@ export class List implements ISpliceable, IDisposable { content.push(`.monaco-list.${this.idPrefix}:focus .monaco-list-row.focused { background-color: ${styles.listFocusBackground}; }`); } + if (styles.listFocusForeground) { + content.push(`.monaco-list.${this.idPrefix}:focus .monaco-list-row.focused { color: ${styles.listFocusForeground}; }`); + } + if (styles.listActiveSelectionBackground) { content.push(`.monaco-list.${this.idPrefix}:focus .monaco-list-row.selected { background-color: ${styles.listActiveSelectionBackground}; }`); content.push(`.monaco-list.${this.idPrefix}:focus .monaco-list-row.selected:hover { background-color: ${styles.listActiveSelectionBackground}; }`); // overwrite :hover style in this case! @@ -853,6 +859,10 @@ export class List implements ISpliceable, IDisposable { content.push(`.monaco-list.${this.idPrefix} .monaco-list-row:hover { background-color: ${styles.listHoverBackground}; }`); } + if (styles.listHoverForeground) { + content.push(`.monaco-list.${this.idPrefix} .monaco-list-row:hover { color: ${styles.listHoverForeground}; }`); + } + if (styles.listSelectionOutline) { content.push(`.monaco-list.${this.idPrefix} .monaco-list-row.selected { outline: 1px dotted ${styles.listSelectionOutline}; }`); } diff --git a/src/vs/base/parts/tree/browser/tree.ts b/src/vs/base/parts/tree/browser/tree.ts index 0d253f2b083..07943806dc2 100644 --- a/src/vs/base/parts/tree/browser/tree.ts +++ b/src/vs/base/parts/tree/browser/tree.ts @@ -665,6 +665,7 @@ export interface ITreeOptions extends ITreeStyles { export interface ITreeStyles { listFocusBackground?: Color; + listFocusForeground?: Color; listActiveSelectionBackground?: Color; listActiveSelectionForeground?: Color; listFocusAndSelectionBackground?: Color; @@ -672,6 +673,7 @@ export interface ITreeStyles { listInactiveSelectionBackground?: Color; listInactiveSelectionForeground?: Color; listHoverBackground?: Color; + listHoverForeground?: Color; listDropBackground?: Color; listFocusOutline?: Color; } diff --git a/src/vs/base/parts/tree/browser/treeView.ts b/src/vs/base/parts/tree/browser/treeView.ts index 5d40c9cd3d6..0836cf0bbec 100644 --- a/src/vs/base/parts/tree/browser/treeView.ts +++ b/src/vs/base/parts/tree/browser/treeView.ts @@ -561,6 +561,10 @@ export class TreeView extends HeightMap { content.push(`.monaco-tree.monaco-tree-instance-${this.instance}.focused .monaco-tree-rows > .monaco-tree-row.focused:not(.highlighted) { background-color: ${styles.listFocusBackground}; }`); } + if (styles.listFocusForeground) { + content.push(`.monaco-tree.monaco-tree-instance-${this.instance}.focused .monaco-tree-rows > .monaco-tree-row.focused:not(.highlighted) { color: ${styles.listFocusForeground}; }`); + } + if (styles.listActiveSelectionBackground) { content.push(`.monaco-tree.monaco-tree-instance-${this.instance}.focused .monaco-tree-rows > .monaco-tree-row.selected:not(.highlighted) { background-color: ${styles.listActiveSelectionBackground}; }`); } @@ -589,6 +593,10 @@ export class TreeView extends HeightMap { content.push(`.monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row:hover:not(.highlighted):not(.selected):not(.focused) { background-color: ${styles.listHoverBackground}; }`); } + if (styles.listHoverForeground) { + content.push(`.monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row:hover:not(.highlighted):not(.selected):not(.focused) { color: ${styles.listHoverForeground}; }`); + } + if (styles.listDropBackground) { content.push(` .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-wrapper.drop-target, diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 4a597b87fd1..5c2a75960e2 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -171,11 +171,13 @@ export const selectForeground = registerColor('dropdown.foreground', { dark: '#F export const selectBorder = registerColor('dropdown.border', { dark: selectBackground, light: '#CECECE', hc: contrastBorder }, nls.localize('dropdownBorder', "Dropdown border.")); export const listFocusBackground = registerColor('list.focusBackground', { dark: '#073655', light: '#DCEBFC', hc: null }, nls.localize('listFocusBackground', "List/Tree background color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); +export const listFocusForeground = registerColor('list.focusForeground', { dark: null, light: null, hc: null }, nls.localize('listFocusForeground', "List/Tree foreground color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); export const listActiveSelectionBackground = registerColor('list.activeSelectionBackground', { dark: '#094771', light: '#3399FF', hc: null }, nls.localize('listActiveSelectionBackground', "List/Tree background color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); -export const listInactiveSelectionBackground = registerColor('list.inactiveSelectionBackground', { dark: '#3F3F46', light: '#CCCEDB', hc: null }, nls.localize('listInactiveSelectionBackground', "List/Tree background color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")); export const listActiveSelectionForeground = registerColor('list.activeSelectionForeground', { dark: Color.white, light: Color.white, hc: null }, nls.localize('listActiveSelectionForeground', "List/Tree foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")); +export const listInactiveSelectionBackground = registerColor('list.inactiveSelectionBackground', { dark: '#3F3F46', light: '#CCCEDB', hc: null }, nls.localize('listInactiveSelectionBackground', "List/Tree background color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")); export const listInactiveSelectionForeground = registerColor('list.inactiveSelectionForeground', { dark: null, light: null, hc: null }, nls.localize('listInactiveSelectionForeground', "List/Tree foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")); export const listHoverBackground = registerColor('list.hoverBackground', { dark: '#2A2D2E', light: '#F0F0F0', hc: null }, nls.localize('listHoverBackground', "List/Tree background when hovering over items using the mouse.")); +export const listHoverForeground = registerColor('list.hoverForeground', { dark: null, light: null, hc: null }, nls.localize('listHoverForeground', "List/Tree foreground when hovering over items using the mouse.")); export const listDropBackground = registerColor('list.dropBackground', { dark: listFocusBackground, light: listFocusBackground, hc: null }, nls.localize('listDropBackground', "List/Tree drag and drop background when moving items around using the mouse.")); export const listHighlightForeground = registerColor('list.highlightForeground', { dark: '#0097fb', light: '#007acc', hc: focusBorder }, nls.localize('highlight', 'List/Tree foreground color of the match highlights when searching inside the list/tree.')); diff --git a/src/vs/platform/theme/common/styler.ts b/src/vs/platform/theme/common/styler.ts index 3d560356676..979bec60a2c 100644 --- a/src/vs/platform/theme/common/styler.ts +++ b/src/vs/platform/theme/common/styler.ts @@ -6,7 +6,7 @@ 'use strict'; import { ITheme, IThemeService } from 'vs/platform/theme/common/themeService'; -import { inputBackground, inputForeground, ColorIdentifier, selectForeground, selectBackground, selectBorder, inputBorder, foreground, editorBackground, contrastBorder, inputActiveOptionBorder, listFocusBackground, listActiveSelectionBackground, listActiveSelectionForeground, listInactiveSelectionForeground, listInactiveSelectionBackground, listHoverBackground, listDropBackground, pickerGroupBorder, pickerGroupForeground, widgetShadow, inputValidationInfoBorder, inputValidationInfoBackground, inputValidationWarningBorder, inputValidationWarningBackground, inputValidationErrorBorder, inputValidationErrorBackground, activeContrastBorder, buttonForeground, buttonBackground, buttonHoverBackground, ColorFunction, lighten, badgeBackground, badgeForeground, progressBarBackground } from 'vs/platform/theme/common/colorRegistry'; +import { inputBackground, inputForeground, ColorIdentifier, selectForeground, selectBackground, selectBorder, inputBorder, foreground, editorBackground, contrastBorder, inputActiveOptionBorder, listFocusBackground, listFocusForeground, listActiveSelectionBackground, listActiveSelectionForeground, listInactiveSelectionForeground, listInactiveSelectionBackground, listHoverBackground, listHoverForeground, listDropBackground, pickerGroupBorder, pickerGroupForeground, widgetShadow, inputValidationInfoBorder, inputValidationInfoBackground, inputValidationWarningBorder, inputValidationWarningBackground, inputValidationErrorBorder, inputValidationErrorBackground, activeContrastBorder, buttonForeground, buttonBackground, buttonHoverBackground, ColorFunction, lighten, badgeBackground, badgeForeground, progressBarBackground } from 'vs/platform/theme/common/colorRegistry'; import { IDisposable } from 'vs/base/common/lifecycle'; import { SIDE_BAR_SECTION_HEADER_BACKGROUND } from 'vs/workbench/common/theme'; @@ -136,6 +136,7 @@ export function attachQuickOpenStyler(widget: IThemable, themeService: IThemeSer pickerGroupForeground?: ColorIdentifier, pickerGroupBorder?: ColorIdentifier, listFocusBackground?: ColorIdentifier, + listFocusForeground?: ColorIdentifier, listActiveSelectionBackground?: ColorIdentifier, listActiveSelectionForeground?: ColorIdentifier, listFocusAndSelectionBackground?: ColorIdentifier, @@ -143,6 +144,7 @@ export function attachQuickOpenStyler(widget: IThemable, themeService: IThemeSer listInactiveSelectionBackground?: ColorIdentifier, listInactiveSelectionForeground?: ColorIdentifier, listHoverBackground?: ColorIdentifier, + listHoverForeground?: ColorIdentifier, listDropBackground?: ColorIdentifier, listFocusOutline?: ColorIdentifier, listSelectionOutline?: ColorIdentifier, @@ -166,6 +168,7 @@ export function attachQuickOpenStyler(widget: IThemable, themeService: IThemeSer inputValidationErrorBorder: (style && style.inputValidationErrorBorder) || inputValidationErrorBorder, inputValidationErrorBackground: (style && style.inputValidationErrorBackground) || inputValidationErrorBackground, listFocusBackground: (style && style.listFocusBackground) || listFocusBackground, + listFocusForeground: (style && style.listFocusForeground) || listFocusForeground, listActiveSelectionBackground: (style && style.listActiveSelectionBackground) || lighten(listActiveSelectionBackground, 0.1), listActiveSelectionForeground: (style && style.listActiveSelectionForeground) || listActiveSelectionForeground, listFocusAndSelectionBackground: style && style.listFocusAndSelectionBackground || listActiveSelectionBackground, @@ -173,6 +176,7 @@ export function attachQuickOpenStyler(widget: IThemable, themeService: IThemeSer listInactiveSelectionBackground: (style && style.listInactiveSelectionBackground) || listInactiveSelectionBackground, listInactiveSelectionForeground: (style && style.listInactiveSelectionForeground) || listInactiveSelectionForeground, listHoverBackground: (style && style.listHoverBackground) || listHoverBackground, + listHoverForeground: (style && style.listHoverForeground) || listHoverForeground, listDropBackground: (style && style.listDropBackground) || listDropBackground, listFocusOutline: (style && style.listFocusOutline) || activeContrastBorder, listSelectionOutline: (style && style.listSelectionOutline) || activeContrastBorder, @@ -182,6 +186,7 @@ export function attachQuickOpenStyler(widget: IThemable, themeService: IThemeSer export function attachListStyler(widget: IThemable, themeService: IThemeService, style?: { listFocusBackground?: ColorIdentifier, + listFocusForeground?: ColorIdentifier, listActiveSelectionBackground?: ColorIdentifier, listActiveSelectionForeground?: ColorIdentifier, listFocusAndSelectionBackground?: ColorIdentifier, @@ -190,6 +195,7 @@ export function attachListStyler(widget: IThemable, themeService: IThemeService, listInactiveSelectionBackground?: ColorIdentifier, listInactiveSelectionForeground?: ColorIdentifier, listHoverBackground?: ColorIdentifier, + listHoverForeground?: ColorIdentifier, listDropBackground?: ColorIdentifier, listFocusOutline?: ColorIdentifier, listInactiveFocusOutline?: ColorIdentifier, @@ -198,6 +204,7 @@ export function attachListStyler(widget: IThemable, themeService: IThemeService, }): IDisposable { return doAttachStyler(themeService, { listFocusBackground: (style && style.listFocusBackground) || listFocusBackground, + listFocusForeground: (style && style.listFocusForeground) || listFocusForeground, listActiveSelectionBackground: (style && style.listActiveSelectionBackground) || lighten(listActiveSelectionBackground, 0.1), listActiveSelectionForeground: (style && style.listActiveSelectionForeground) || listActiveSelectionForeground, listFocusAndSelectionBackground: style && style.listFocusAndSelectionBackground || listActiveSelectionBackground, @@ -206,6 +213,7 @@ export function attachListStyler(widget: IThemable, themeService: IThemeService, listInactiveSelectionBackground: (style && style.listInactiveSelectionBackground) || listInactiveSelectionBackground, listInactiveSelectionForeground: (style && style.listInactiveSelectionForeground) || listInactiveSelectionForeground, listHoverBackground: (style && style.listHoverBackground) || listHoverBackground, + listHoverForeground: (style && style.listHoverForeground) || listHoverForeground, listDropBackground: (style && style.listDropBackground) || listDropBackground, listFocusOutline: (style && style.listFocusOutline) || activeContrastBorder, listSelectionOutline: (style && style.listSelectionOutline) || activeContrastBorder, From 696cfa8513892caea5455e661b29424ce00e4a17 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 15 May 2017 15:55:49 +0200 Subject: [PATCH 0435/1164] Sidebar is not clickable after changing Date & Time (fixes #25830) --- .../workbench/browser/parts/activitybar/activitybarActions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts index be928651ff2..e1133c4e5ce 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts @@ -84,7 +84,7 @@ export class ViewletActivityAction extends ActivityAction { // prevent accident trigger on a doubleclick (to help nervous people) const now = Date.now(); - if (now - this.lastRun < ViewletActivityAction.preventDoubleClickDelay) { + if (now > this.lastRun /* https://github.com/Microsoft/vscode/issues/25830 */ && now - this.lastRun < ViewletActivityAction.preventDoubleClickDelay) { return TPromise.as(true); } this.lastRun = now; From 515a6e0d3d0e7262ed4c482a3ebbb78d626b8e96 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 15 May 2017 15:56:05 +0200 Subject: [PATCH 0436/1164] extract edit making logic, #24855 --- .../contrib/snippet/browser/snippetSession.ts | 70 +++++++++++-------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts index 2c2c8ae4aa6..726ceadb12e 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -15,7 +15,7 @@ import { IPosition } from 'vs/editor/common/core/position'; import { dispose } from 'vs/base/common/lifecycle'; import { EditorSnippetVariableResolver } from "vs/editor/contrib/snippet/common/snippetVariables"; -class OneSnippet { +export class OneSnippet { private readonly _editor: ICommonCodeEditor; private readonly _snippet: TextmateSnippet; @@ -204,41 +204,24 @@ export class SnippetSession { return selection; } - private readonly _editor: ICommonCodeEditor; - private readonly _template: string; - private readonly _overwriteBefore: number; - private readonly _overwriteAfter: number; - private readonly _snippets: OneSnippet[]; - - constructor(editor: ICommonCodeEditor, template: string, overwriteBefore: number = 0, overwriteAfter: number = 0) { - this._editor = editor; - this._template = template; - this._overwriteBefore = overwriteBefore; - this._overwriteAfter = overwriteAfter; - this._snippets = []; - } - - dispose(): void { - dispose(this._snippets); - } - - insert(): void { + static makeInsertEditsAndSnippets(editor: ICommonCodeEditor, template: string, overwriteBefore: number = 0, overwriteAfter: number = 0): { edits: IIdentifiedSingleEditOperation[], snippets: OneSnippet[] } { let delta = 0; let edits: IIdentifiedSingleEditOperation[] = []; - let model = this._editor.getModel(); + let snippets: OneSnippet[] = []; + let model = editor.getModel(); // know what text the overwrite[Before|After] extensions // of the primary curser have selected because only when // secondary selections extend to the same text we can grow them - let firstBeforeText = model.getValueInRange(SnippetSession.adjustSelection(model, this._editor.getSelection(), this._overwriteBefore, 0)); - let firstAfterText = model.getValueInRange(SnippetSession.adjustSelection(model, this._editor.getSelection(), 0, this._overwriteAfter)); + let firstBeforeText = model.getValueInRange(SnippetSession.adjustSelection(model, editor.getSelection(), overwriteBefore, 0)); + let firstAfterText = model.getValueInRange(SnippetSession.adjustSelection(model, editor.getSelection(), 0, overwriteAfter)); // sort selections by their start position but remeber // the original index. that allows you to create correct // offset-based selection logic without changing the // primary selection - const indexedSelection = this._editor.getSelections() + const indexedSelection = editor.getSelections() .map((selection, idx) => ({ selection, idx })) .sort((a, b) => Range.compareRangesUsingStarts(a.selection, b.selection)); @@ -246,8 +229,8 @@ export class SnippetSession { // extend selection with the `overwriteBefore` and `overwriteAfter` and then // compare if this matches the extensions of the primary selection - let extensionBefore = SnippetSession.adjustSelection(model, selection, this._overwriteBefore, 0); - let extensionAfter = SnippetSession.adjustSelection(model, selection, 0, this._overwriteAfter); + let extensionBefore = SnippetSession.adjustSelection(model, selection, overwriteBefore, 0); + let extensionAfter = SnippetSession.adjustSelection(model, selection, 0, overwriteAfter); if (firstBeforeText !== model.getValueInRange(extensionBefore)) { extensionBefore = selection; } @@ -263,7 +246,7 @@ export class SnippetSession { // adjust the template string to match the indentation and // whitespace rules of this insert location (can be different for each cursor) const start = snippetSelection.getStartPosition(); - const adjustedTemplate = SnippetSession.normalizeWhitespace(model, start, this._template); + const adjustedTemplate = SnippetSession.normalizeWhitespace(model, start, template); const snippet = SnippetParser.parse(adjustedTemplate).resolveVariables(new EditorSnippetVariableResolver(model, snippetSelection)); const offset = model.getOffsetAt(start) + delta; @@ -273,9 +256,40 @@ export class SnippetSession { // that ensures the primiary cursor stays primary despite not being // the one with lowest start position edits[idx] = EditOperation.replaceMove(snippetSelection, snippet.text); - this._snippets[idx] = new OneSnippet(this._editor, snippet, offset); + snippets[idx] = new OneSnippet(editor, snippet, offset); } + return { edits, snippets }; + } + + private readonly _editor: ICommonCodeEditor; + private readonly _template: string; + private readonly _overwriteBefore: number; + private readonly _overwriteAfter: number; + private _snippets: OneSnippet[]; + + constructor(editor: ICommonCodeEditor, template: string, overwriteBefore: number = 0, overwriteAfter: number = 0) { + this._editor = editor; + this._template = template; + this._overwriteBefore = overwriteBefore; + this._overwriteAfter = overwriteAfter; + this._snippets = []; + } + + dispose(): void { + dispose(this._snippets); + } + + insert(): void { + + const model = this._editor.getModel(); + const { edits, snippets } = SnippetSession.makeInsertEditsAndSnippets( + this._editor, this._template, this._overwriteBefore, this._overwriteAfter + ); + + // keep snippets around + this._snippets = snippets; + // make insert edit and start with first selections const newSelections = model.pushEditOperations(this._editor.getSelections(), edits, undoEdits => { if (this._snippets[0].hasPlaceholder) { From 9acf72b252650eac43f2423a5ed35884272d347a Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 15 May 2017 16:03:40 +0200 Subject: [PATCH 0437/1164] [theme] remove editorOptions.theme --- .../standalone/standaloneCodeEditor.ts | 43 ++++++++----------- .../browser/standalone/standaloneEditor.ts | 9 +++- src/vs/editor/browser/view/viewImpl.ts | 15 +++++-- .../editor/browser/widget/codeEditorWidget.ts | 10 ----- .../editor/browser/widget/diffEditorWidget.ts | 26 +++++------ .../common/config/commonEditorConfig.ts | 17 +------- src/vs/editor/common/config/editorOptions.ts | 34 ++++++++++----- src/vs/monaco.d.ts | 27 +++++++++--- .../browser/parts/editor/textDiffEditor.ts | 4 +- .../browser/parts/editor/textEditor.ts | 6 +-- .../parts/editor/textResourceEditor.ts | 4 +- .../parts/debug/electron-browser/repl.ts | 6 +-- .../files/browser/editors/textFileEditor.ts | 4 +- .../parts/output/browser/outputPanel.ts | 4 +- .../preferences/browser/preferencesEditor.ts | 6 +-- .../electron-browser/walkThroughPart.ts | 13 +++--- 16 files changed, 117 insertions(+), 111 deletions(-) diff --git a/src/vs/editor/browser/standalone/standaloneCodeEditor.ts b/src/vs/editor/browser/standalone/standaloneCodeEditor.ts index 7644c520feb..2a3a9789ed4 100644 --- a/src/vs/editor/browser/standalone/standaloneCodeEditor.ts +++ b/src/vs/editor/browser/standalone/standaloneCodeEditor.ts @@ -44,12 +44,26 @@ export interface IEditorConstructionOptions extends IEditorOptions { * To not create automatically a model, use `model: null`. */ language?: string; + /** + * Initial theme to be used for rendering. + * The current out-of-the-box available themes are: 'vs' (default), 'vs-dark', 'hc-black'. + * You can create custom themes via `monaco.editor.defineTheme`. + * To switch a theme, use `monaco.editor.setTheme` + */ + theme?: string; } /** * The options to create a diff editor. */ export interface IDiffEditorConstructionOptions extends IDiffEditorOptions { + /** + * Initial theme to be used for rendering. + * The current out-of-the-box available themes are: 'vs' (default), 'vs-dark', 'hc-black'. + * You can create custom themes via `monaco.editor.defineTheme`. + * To switch a theme, use `monaco.editor.setTheme` + */ + theme?: string; } export interface IStandaloneCodeEditor extends ICodeEditor { @@ -193,7 +207,6 @@ export class StandaloneCodeEditor extends CodeEditor implements IStandaloneCodeE export class StandaloneEditor extends StandaloneCodeEditor implements IStandaloneCodeEditor { private _contextViewService: IEditorContextViewService; - private _standaloneThemeService: IStandaloneThemeService; private _ownsModel: boolean; constructor( @@ -206,18 +219,17 @@ export class StandaloneEditor extends StandaloneCodeEditor implements IStandalon @IContextKeyService contextKeyService: IContextKeyService, @IKeybindingService keybindingService: IKeybindingService, @IContextViewService contextViewService: IContextViewService, - @IStandaloneThemeService standaloneThemeService: IStandaloneThemeService + @IStandaloneThemeService themeService: IStandaloneThemeService ) { options = options || {}; if (typeof options.theme === 'string') { - options.theme = standaloneThemeService.setTheme(options.theme); + themeService.setTheme(options.theme); } let model: IModel = options.model; delete options.model; - super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, keybindingService, standaloneThemeService); + super(domElement, options, instantiationService, codeEditorService, commandService, contextKeyService, keybindingService, themeService); this._contextViewService = contextViewService; - this._standaloneThemeService = standaloneThemeService; this._register(toDispose); if (typeof model === 'undefined') { @@ -245,13 +257,6 @@ export class StandaloneEditor extends StandaloneCodeEditor implements IStandalon this.dispose(); } - public updateOptions(newOptions: IEditorOptions): void { - if (typeof newOptions.theme === 'string') { - newOptions.theme = this._standaloneThemeService.setTheme(newOptions.theme); - } - super.updateOptions(newOptions); - } - _attachModel(model: IModel): void { super._attachModel(model); if (this._view) { @@ -271,7 +276,6 @@ export class StandaloneEditor extends StandaloneCodeEditor implements IStandalon export class StandaloneDiffEditor extends DiffEditorWidget implements IStandaloneDiffEditor { private _contextViewService: IEditorContextViewService; - private _standaloneThemeService: IStandaloneThemeService; private _standaloneKeybindingService: StandaloneKeybindingService; constructor( @@ -282,14 +286,13 @@ export class StandaloneDiffEditor extends DiffEditorWidget implements IStandalon @IContextKeyService contextKeyService: IContextKeyService, @IKeybindingService keybindingService: IKeybindingService, @IContextViewService contextViewService: IContextViewService, - @IStandaloneThemeService standaloneColorService: IStandaloneThemeService, @IEditorWorkerService editorWorkerService: IEditorWorkerService, @ICodeEditorService codeEditorService: ICodeEditorService, - @IThemeService themeService: IThemeService + @IStandaloneThemeService themeService: IStandaloneThemeService ) { options = options || {}; if (typeof options.theme === 'string') { - options.theme = standaloneColorService.setTheme(options.theme); + options.theme = themeService.setTheme(options.theme); } super(domElement, options, editorWorkerService, contextKeyService, instantiationService, codeEditorService, themeService); @@ -299,7 +302,6 @@ export class StandaloneDiffEditor extends DiffEditorWidget implements IStandalon } this._contextViewService = contextViewService; - this._standaloneThemeService = standaloneColorService; this._register(toDispose); @@ -314,13 +316,6 @@ export class StandaloneDiffEditor extends DiffEditorWidget implements IStandalon this.dispose(); } - public updateOptions(newOptions: IEditorOptions): void { - if (typeof newOptions.theme === 'string') { - newOptions.theme = this._standaloneThemeService.setTheme(newOptions.theme); - } - super.updateOptions(newOptions); - } - protected _createInnerEditor(instantiationService: IInstantiationService, container: HTMLElement, options: IEditorOptions): CodeEditor { return instantiationService.createInstance(StandaloneCodeEditor, container, options); } diff --git a/src/vs/editor/browser/standalone/standaloneEditor.ts b/src/vs/editor/browser/standalone/standaloneEditor.ts index 5e5fb63939e..776016912c4 100644 --- a/src/vs/editor/browser/standalone/standaloneEditor.ts +++ b/src/vs/editor/browser/standalone/standaloneEditor.ts @@ -125,7 +125,6 @@ export function createDiffEditor(domElement: HTMLElement, options?: IDiffEditorC services.get(IContextKeyService), services.get(IKeybindingService), services.get(IContextViewService), - services.get(IStandaloneThemeService), services.get(IEditorWorkerService), services.get(ICodeEditorService), services.get(IStandaloneThemeService) @@ -309,6 +308,13 @@ export function defineTheme(themeName: string, themeData: IStandaloneThemeData): StaticServices.standaloneThemeService.get().defineTheme(themeName, themeData); } +/** + * Switches to a theme. + */ +export function setTheme(themeName: string): void { + StaticServices.standaloneThemeService.get().setTheme(themeName); +} + /** * @internal */ @@ -336,6 +342,7 @@ export function createMonacoEditorAPI(): typeof monaco.editor { colorizeModelLine: colorizeModelLine, tokenize: tokenize, defineTheme: defineTheme, + setTheme: setTheme, // enums ScrollbarVisibility: ScrollbarVisibility, diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index 9e113117580..9a2390c4a36 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -48,7 +48,7 @@ import { ViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData' import { EditorScrollbar } from 'vs/editor/browser/viewParts/editorScrollbar/editorScrollbar'; import { Minimap } from 'vs/editor/browser/viewParts/minimap/minimap'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IThemeService, getThemeTypeSelector } from 'vs/platform/theme/common/themeService'; export interface IContentWidgetData { widget: editorBrowser.IContentWidget; @@ -118,6 +118,7 @@ export class View extends ViewEventHandler { this._register(themeService.onThemeChange(theme => { this._context.theme = theme; this.eventDispatcher.emit(new viewEvents.ViewThemeChangedEvent()); + this.render(true, false); })); this.viewParts = []; @@ -144,7 +145,7 @@ export class View extends ViewEventHandler { this.linesContent.setPosition('absolute'); this.domNode = createFastDomNode(document.createElement('div')); - this.domNode.setClassName(this._context.configuration.editor.editorClassName); + this.domNode.setClassName(this.getEditorClassName()); this.overflowGuardContainer = createFastDomNode(document.createElement('div')); PartFingerprints.write(this.overflowGuardContainer, PartFingerprint.OverflowGuard); @@ -305,11 +306,15 @@ export class View extends ViewEventHandler { } + private getEditorClassName() { + return this._context.configuration.editor.editorClassName + ' ' + getThemeTypeSelector(this._context.theme.type); + } + // --- begin event handlers public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { if (e.editorClassName) { - this.domNode.setClassName(this._context.configuration.editor.editorClassName); + this.domNode.setClassName(this.getEditorClassName()); } if (e.layoutInfo) { this._setLayout(); @@ -329,6 +334,10 @@ export class View extends ViewEventHandler { this.outgoingEvents.emitScrollChanged(e); return false; } + public onThemeChanged(e: viewEvents.ViewThemeChangedEvent): boolean { + this.domNode.setClassName(this.getEditorClassName()); + return false; + } // --- end event handlers diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index ff008292f72..b149d37a111 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -158,16 +158,6 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito super.dispose(); } - public updateOptions(newOptions: IEditorOptions): void { - let oldTheme = this._configuration.editor.viewInfo.theme; - super.updateOptions(newOptions); - let newTheme = this._configuration.editor.viewInfo.theme; - - if (oldTheme !== newTheme) { - this.render(); - } - } - public colorizeModelLine(lineNumber: number, model: editorCommon.IModel = this.model): string { if (!model) { return ''; diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index 113637bf6ff..f9f95be97e0 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -32,7 +32,7 @@ import { ServiceCollection } from 'vs/platform/instantiation/common/serviceColle import { ColorId, MetadataConsts, FontStyle } from 'vs/editor/common/modes'; import Event, { Emitter } from 'vs/base/common/event'; import * as editorOptions from 'vs/editor/common/config/editorOptions'; -import { registerThemingParticipant, IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; +import { registerThemingParticipant, IThemeService, ITheme, getThemeTypeSelector } from 'vs/platform/theme/common/themeService'; import { registerColor, scrollbarShadow } from 'vs/platform/theme/common/colorRegistry'; import { Color, RGBA } from 'vs/base/common/color'; import { OverviewRulerZone } from 'vs/editor/common/view/overviewZoneManager'; @@ -148,7 +148,6 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE private readonly id: number; - private _theme: string; private _domElement: HTMLElement; protected readonly _containerDomElement: HTMLElement; private readonly _overviewDomElement: HTMLElement; @@ -213,7 +212,6 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE this._domElement = domElement; options = options || {}; - this._theme = options.theme || editorOptions.EDITOR_DEFAULTS.viewInfo.theme; // renderSideBySide this._renderSideBySide = true; if (typeof options.renderSideBySide !== 'undefined') { @@ -240,7 +238,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE this._updateDecorationsRunner = this._register(new RunOnceScheduler(() => this._updateDecorations(), 0)); this._containerDomElement = document.createElement('div'); - this._containerDomElement.className = DiffEditorWidget._getClassName(this._theme, this._renderSideBySide); + this._containerDomElement.className = DiffEditorWidget._getClassName(this._themeService.getTheme(), this._renderSideBySide); this._containerDomElement.style.position = 'relative'; this._containerDomElement.style.height = '100%'; this._domElement.appendChild(this._containerDomElement); @@ -305,11 +303,12 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE this._codeEditorService.addDiffEditor(this); - themeService.onThemeChange(t => { + this._register(themeService.onThemeChange(t => { if (this._strategy && this._strategy.applyColors(t)) { this._updateDecorationsRunner.schedule(); } - }); + this._containerDomElement.className = DiffEditorWidget._getClassName(this._themeService.getTheme(), this._renderSideBySide); + })); } public get ignoreTrimWhitespace(): boolean { @@ -324,12 +323,12 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE return this._renderIndicators; } - private static _getClassName(theme: string, renderSideBySide: boolean): string { + private static _getClassName(theme: ITheme, renderSideBySide: boolean): string { let result = 'monaco-diff-editor monaco-editor-background '; if (renderSideBySide) { result += 'side-by-side '; } - result += theme; + result += getThemeTypeSelector(theme.type); return result; } @@ -486,8 +485,6 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE } public updateOptions(newOptions: editorOptions.IDiffEditorOptions): void { - // Handle new theme - this._theme = newOptions && newOptions.theme ? newOptions.theme : this._theme; // Handle side by side let renderSideBySideChanged = false; @@ -523,9 +520,6 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE this._originalIsEditable = Boolean(newOptions.originalEditable); } - // Update class name - this._containerDomElement.className = DiffEditorWidget._getClassName(this._theme, this._renderSideBySide); - this.modifiedEditor.updateOptions(this._adjustOptionsForRightHandSide(newOptions)); this.originalEditor.updateOptions(this._adjustOptionsForLeftHandSide(newOptions, this._originalIsEditable)); @@ -542,6 +536,8 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE } else { this._setStrategy(new DiffEdtorWidgetInline(this._createDataSource(), this._enableSplitViewResizing)); } + // Update class name + this._containerDomElement.className = DiffEditorWidget._getClassName(this._themeService.getTheme(), this._renderSideBySide); } } @@ -892,7 +888,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE let result = this._adjustOptionsForSubEditor(options); result.readOnly = !isEditable; result.overviewRulerLanes = 1; - result.theme = this._theme + ' original-in-monaco-diff-editor'; + result.extraEditorClassName = 'original-in-monaco-diff-editor'; return result; } @@ -900,7 +896,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE let result = this._adjustOptionsForSubEditor(options); result.revealHorizontalRightPadding = editorOptions.EDITOR_DEFAULTS.viewInfo.revealHorizontalRightPadding + DiffEditorWidget.ENTIRE_DIFF_OVERVIEW_WIDTH; result.scrollbar.verticalHasArrows = false; - result.theme = this._theme + ' modified-in-monaco-diff-editor'; + result.extraEditorClassName = 'modified-in-monaco-diff-editor'; return result; } diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index afdc566eac9..a7751d58adc 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -111,12 +111,11 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed const opts = this._validatedOptions; const partialEnv = this._getEnvConfiguration(); const bareFontInfo = BareFontInfo.createFromRawSettings(this._rawOptions, partialEnv.zoomLevel); - const editorClassName = this._getEditorClassName(opts.viewInfo.theme, opts.viewInfo.fontLigatures, opts.mouseStyle); const env: editorOptions.IEnvironmentalOptions = { outerWidth: partialEnv.outerWidth, outerHeight: partialEnv.outerHeight, fontInfo: this.readConfiguration(bareFontInfo), - editorClassName: editorClassName + ' ' + partialEnv.extraEditorClassName, + extraEditorClassName: partialEnv.extraEditorClassName, isDominatedByLongLines: this._isDominatedByLongLines, lineNumbersDigitCount: this._lineNumbersDigitCount, canUseTranslate3d: partialEnv.canUseTranslate3d, @@ -154,20 +153,6 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed } return r ? r : 1; } - - private _getEditorClassName(theme: string, fontLigatures: boolean, mouseStyle: 'text' | 'default' | 'copy'): string { - let extra = ''; - if (fontLigatures) { - extra += 'enable-ligatures '; - } - if (mouseStyle === 'default') { - extra += 'mouse-default '; - } else if (mouseStyle === 'copy') { - extra += 'mouse-copy '; - } - return 'monaco-editor ' + extra + theme; - } - protected abstract _getEnvConfiguration(): IEnvConfiguration; protected abstract readConfiguration(styling: BareFontInfo): FontInfo; diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 1ea498ab56b..6d41b717618 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -170,11 +170,9 @@ export interface IEditorOptions { */ roundedSelection?: boolean; /** - * Theme to be used for rendering. - * The current out-of-the-box available themes are: 'vs' (default), 'vs-dark', 'hc-black'. - * You can create custom themes via `monaco.editor.defineTheme`. + * Class name to be added to the editor. */ - theme?: string; + extraEditorClassName?: string; /** * Should the editor be read only. * Defaults to false. @@ -683,7 +681,7 @@ export interface EditorWrappingInfo { } export interface InternalEditorViewOptions { - readonly theme: string; + readonly extraEditorClassName: string; readonly disableMonospaceOptimizations: boolean; readonly experimentalScreenReader: boolean; readonly rulers: number[]; @@ -893,7 +891,7 @@ export class InternalEditorOptions { */ private static _equalsViewOptions(a: InternalEditorViewOptions, b: InternalEditorViewOptions): boolean { return ( - a.theme === b.theme + a.extraEditorClassName === b.extraEditorClassName && a.disableMonospaceOptimizations === b.disableMonospaceOptimizations && a.experimentalScreenReader === b.experimentalScreenReader && this._equalsNumberArrays(a.rulers, b.rulers) @@ -1179,7 +1177,7 @@ export interface IEnvironmentalOptions { readonly outerWidth: number; readonly outerHeight: number; readonly fontInfo: FontInfo; - readonly editorClassName: string; + readonly extraEditorClassName: string; readonly isDominatedByLongLines: boolean; readonly lineNumbersDigitCount: number; readonly canUseTranslate3d: boolean; @@ -1473,7 +1471,7 @@ export class EditorOptionsValidator { const minimap = this._sanitizeMinimapOpts(opts.minimap, defaults.minimap); return { - theme: _string(opts.theme, defaults.theme), + extraEditorClassName: _string(opts.extraEditorClassName, defaults.extraEditorClassName), disableMonospaceOptimizations: disableMonospaceOptimizations, experimentalScreenReader: _boolean(opts.experimentalScreenReader, defaults.experimentalScreenReader), rulers: rulers, @@ -1630,10 +1628,26 @@ export class InternalEditorOptionsFactory { wordWrapBreakObtrusiveCharacters: opts.wordWrapBreakObtrusiveCharacters, }; + let className = 'monaco-editor'; + if (opts.viewInfo.extraEditorClassName) { + className += ' ' + opts.viewInfo.extraEditorClassName; + } + if (env.extraEditorClassName) { + className += ' ' + env.extraEditorClassName; + } + if (opts.viewInfo.fontLigatures) { + className += ' enable-ligatures'; + } + if (opts.mouseStyle === 'default') { + className += ' mouse-default'; + } else if (opts.mouseStyle === 'copy') { + className += ' mouse-copy'; + } + return new InternalEditorOptions({ canUseTranslate3d: opts.disableTranslate3d ? false : env.canUseTranslate3d, pixelRatio: env.pixelRatio, - editorClassName: env.editorClassName, + editorClassName: className, lineHeight: env.fontInfo.lineHeight, readOnly: opts.readOnly, wordSeparators: opts.wordSeparators, @@ -1853,7 +1867,7 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { useTabStops: true, viewInfo: { - theme: 'vs', + extraEditorClassName: '', disableMonospaceOptimizations: false, experimentalScreenReader: true, rulers: [], diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 8571c7ae3d9..ec0a1873919 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -892,6 +892,11 @@ declare module monaco.editor { */ export function defineTheme(themeName: string, themeData: IStandaloneThemeData): void; + /** + * Switches to a theme. + */ + export function setTheme(themeName: string): void; + export type BuiltinTheme = 'vs' | 'vs-dark' | 'hc-black'; export interface IStandaloneThemeData { @@ -965,12 +970,26 @@ declare module monaco.editor { * To not create automatically a model, use `model: null`. */ language?: string; + /** + * Initial theme to be used for rendering. + * The current out-of-the-box available themes are: 'vs' (default), 'vs-dark', 'hc-black'. + * You can create custom themes via `monaco.editor.defineTheme`. + * To switch a theme, use `monaco.editor.setTheme` + */ + theme?: string; } /** * The options to create a diff editor. */ export interface IDiffEditorConstructionOptions extends IDiffEditorOptions { + /** + * Initial theme to be used for rendering. + * The current out-of-the-box available themes are: 'vs' (default), 'vs-dark', 'hc-black'. + * You can create custom themes via `monaco.editor.defineTheme`. + * To switch a theme, use `monaco.editor.setTheme` + */ + theme?: string; } export interface IStandaloneCodeEditor extends ICodeEditor { @@ -2717,11 +2736,9 @@ declare module monaco.editor { */ roundedSelection?: boolean; /** - * Theme to be used for rendering. - * The current out-of-the-box available themes are: 'vs' (default), 'vs-dark', 'hc-black'. - * You can create custom themes via `monaco.editor.defineTheme`. + * Class name to be added to the editor. */ - theme?: string; + extraEditorClassName?: string; /** * Should the editor be read only. * Defaults to false. @@ -3163,7 +3180,7 @@ declare module monaco.editor { } export interface InternalEditorViewOptions { - readonly theme: string; + readonly extraEditorClassName: string; readonly disableMonospaceOptimizations: boolean; readonly experimentalScreenReader: boolean; readonly rulers: number[]; diff --git a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts index cf310d07ac4..e22ac2936ab 100644 --- a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts @@ -30,7 +30,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { IModeService } from 'vs/editor/common/services/modeService'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; @@ -53,7 +53,7 @@ export class TextDiffEditor extends BaseTextEditor { @IStorageService storageService: IStorageService, @IConfigurationService configurationService: IConfigurationService, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, - @IWorkbenchThemeService themeService: IWorkbenchThemeService, + @IThemeService themeService: IThemeService, @IEditorGroupService editorGroupService: IEditorGroupService, @IModeService modeService: IModeService, @ITextFileService textFileService: ITextFileService diff --git a/src/vs/workbench/browser/parts/editor/textEditor.ts b/src/vs/workbench/browser/parts/editor/textEditor.ts index e485441f65f..d9cb5e09200 100644 --- a/src/vs/workbench/browser/parts/editor/textEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textEditor.ts @@ -21,7 +21,7 @@ import { IStorageService } from 'vs/platform/storage/common/storage'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Scope } from 'vs/workbench/common/memento'; import { getCodeEditor } from 'vs/editor/common/services/codeEditorService'; import { IModeService } from 'vs/editor/common/services/modeService'; @@ -58,7 +58,7 @@ export abstract class BaseTextEditor extends BaseEditor { @IInstantiationService private _instantiationService: IInstantiationService, @IStorageService private storageService: IStorageService, @IConfigurationService private _configurationService: IConfigurationService, - @IWorkbenchThemeService protected themeService: IWorkbenchThemeService, + @IThemeService protected themeService: IThemeService, @IModeService private modeService: IModeService, @ITextFileService private textFileService: ITextFileService, @IEditorGroupService protected editorGroupService: IEditorGroupService @@ -66,7 +66,6 @@ export abstract class BaseTextEditor extends BaseEditor { super(id, telemetryService, themeService); this.toUnbind.push(this.configurationService.onDidUpdateConfiguration(e => this.handleConfigurationChangeEvent(e.config))); - this.toUnbind.push(themeService.onDidColorThemeChange(e => this.handleConfigurationChangeEvent())); // TODO@theme this should be done from the editor itself and not from the outside } protected get instantiationService(): IInstantiationService { @@ -125,7 +124,6 @@ export abstract class BaseTextEditor extends BaseEditor { objects.assign(overrides, { overviewRulerLanes: 3, lineNumbersMinChars: 3, - theme: this.themeService.getColorTheme().id, fixedOverflowWidgets: true }); diff --git a/src/vs/workbench/browser/parts/editor/textResourceEditor.ts b/src/vs/workbench/browser/parts/editor/textResourceEditor.ts index c54d7aef429..dda89f7447b 100644 --- a/src/vs/workbench/browser/parts/editor/textResourceEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textResourceEditor.ts @@ -19,7 +19,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { IModeService } from 'vs/editor/common/services/modeService'; @@ -38,7 +38,7 @@ export class TextResourceEditor extends BaseTextEditor { @IInstantiationService instantiationService: IInstantiationService, @IStorageService storageService: IStorageService, @IConfigurationService configurationService: IConfigurationService, - @IWorkbenchThemeService themeService: IWorkbenchThemeService, + @IThemeService themeService: IThemeService, @IUntitledEditorService private untitledEditorService: IUntitledEditorService, @IEditorGroupService editorGroupService: IEditorGroupService, @IModeService modeService: IModeService, diff --git a/src/vs/workbench/parts/debug/electron-browser/repl.ts b/src/vs/workbench/parts/debug/electron-browser/repl.ts index f473819c540..b2eafe01521 100644 --- a/src/vs/workbench/parts/debug/electron-browser/repl.ts +++ b/src/vs/workbench/parts/debug/electron-browser/repl.ts @@ -38,11 +38,11 @@ import * as debug from 'vs/workbench/parts/debug/common/debug'; import { ClearReplAction } from 'vs/workbench/parts/debug/browser/debugActions'; import { ReplHistory } from 'vs/workbench/parts/debug/common/replHistory'; import { Panel } from 'vs/workbench/browser/panel'; -import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IListService } from 'vs/platform/list/browser/listService'; import { attachListStyler } from 'vs/platform/theme/common/styler'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; const $ = dom.$; @@ -89,7 +89,7 @@ export class Repl extends Panel implements IPrivateReplService { @IInstantiationService private instantiationService: IInstantiationService, @IStorageService private storageService: IStorageService, @IPanelService private panelService: IPanelService, - @IWorkbenchThemeService protected themeService: IWorkbenchThemeService, + @IThemeService protected themeService: IThemeService, @IModelService private modelService: IModelService, @IContextKeyService private contextKeyService: IContextKeyService, @IListService private listService: IListService @@ -105,7 +105,6 @@ export class Repl extends Panel implements IPrivateReplService { this.toDispose.push(this.debugService.getModel().onDidChangeReplElements(() => { this.refreshReplElements(this.debugService.getModel().getReplElements().length === 0); })); - this.toDispose.push(this.themeService.onDidColorThemeChange(e => this.replInput.updateOptions(this.getReplInputOptions()))); // TODO@theme this should be done from the editor itself and not from the outside this.toDispose.push(this.panelService.onDidPanelOpen(panel => this.refreshReplElements(true))); } @@ -280,7 +279,6 @@ export class Repl extends Panel implements IPrivateReplService { }, lineDecorationsWidth: 0, scrollBeyondLastLine: false, - theme: this.themeService.getColorTheme().id, renderLineHighlight: 'none', fixedOverflowWidgets: true }; diff --git a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts b/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts index 1dc4be93f83..3929604de10 100644 --- a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts +++ b/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts @@ -28,7 +28,7 @@ import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { CancelAction } from 'vs/platform/message/common/message'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { IModeService } from 'vs/editor/common/services/modeService'; @@ -49,7 +49,7 @@ export class TextFileEditor extends BaseTextEditor { @IHistoryService private historyService: IHistoryService, @IConfigurationService configurationService: IConfigurationService, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, - @IWorkbenchThemeService themeService: IWorkbenchThemeService, + @IThemeService themeService: IThemeService, @IEditorGroupService editorGroupService: IEditorGroupService, @IModeService modeService: IModeService, @ITextFileService textFileService: ITextFileService, diff --git a/src/vs/workbench/parts/output/browser/outputPanel.ts b/src/vs/workbench/parts/output/browser/outputPanel.ts index da6f5e9ff4c..217bb1972c6 100644 --- a/src/vs/workbench/parts/output/browser/outputPanel.ts +++ b/src/vs/workbench/parts/output/browser/outputPanel.ts @@ -21,7 +21,7 @@ import { EditorInput, EditorOptions } from 'vs/workbench/common/editor'; import { TextResourceEditor } from 'vs/workbench/browser/parts/editor/textResourceEditor'; import { OutputEditors, OUTPUT_PANEL_ID, IOutputService, CONTEXT_IN_OUTPUT } from 'vs/workbench/parts/output/common/output'; import { SwitchOutputAction, SwitchOutputActionItem, ClearOutputAction, ToggleOutputScrollLockAction } from 'vs/workbench/parts/output/browser/outputActions'; -import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { IModeService } from 'vs/editor/common/services/modeService'; @@ -37,7 +37,7 @@ export class OutputPanel extends TextResourceEditor { @IInstantiationService instantiationService: IInstantiationService, @IStorageService storageService: IStorageService, @IConfigurationService configurationService: IConfigurationService, - @IWorkbenchThemeService themeService: IWorkbenchThemeService, + @IThemeService themeService: IThemeService, @IOutputService private outputService: IOutputService, @IUntitledEditorService untitledEditorService: IUntitledEditorService, @IContextKeyService private contextKeyService: IContextKeyService, diff --git a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts index 652e97a9e23..5b5610e1d0e 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts @@ -32,7 +32,7 @@ import { SearchWidget, SettingsTabsWidget } from 'vs/workbench/parts/preferences import { ContextKeyExpr, IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { Command } from 'vs/editor/common/editorCommonExtensions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IStorageService } from 'vs/platform/storage/common/storage'; @@ -111,7 +111,7 @@ export class PreferencesEditor extends BaseEditor { @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IContextKeyService private contextKeyService: IContextKeyService, @IInstantiationService private instantiationService: IInstantiationService, - @IWorkbenchThemeService themeService: IWorkbenchThemeService + @IThemeService themeService: IThemeService ) { super(PreferencesEditor.ID, telemetryService, themeService); this.defaultSettingsEditorContextKey = CONTEXT_SETTINGS_EDITOR.bindTo(this.contextKeyService); @@ -461,7 +461,7 @@ export class DefaultPreferencesEditor extends BaseTextEditor { @IInstantiationService instantiationService: IInstantiationService, @IStorageService storageService: IStorageService, @IConfigurationService configurationService: IConfigurationService, - @IWorkbenchThemeService themeService: IWorkbenchThemeService, + @IThemeService themeService: IThemeService, @IPreferencesService private preferencesService: IPreferencesService, @IModelService private modelService: IModelService, @IModeService modeService: IModeService, diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts index ae8cd2085ed..d0c04742e17 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts @@ -17,7 +17,6 @@ import { EditorOptions } from 'vs/workbench/common/editor'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { WalkThroughInput } from 'vs/workbench/parts/welcome/walkThrough/node/walkThroughInput'; -import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { marked } from 'vs/base/common/marked/marked'; import { IModeService } from 'vs/editor/common/services/modeService'; @@ -38,7 +37,7 @@ import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService' import { Parts, IPartService } from 'vs/workbench/services/part/common/partService'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IMessageService, Severity } from 'vs/platform/message/common/message'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; export const WALK_THROUGH_FOCUS = new RawContextKey('interactivePlaygroundFocus', false); @@ -94,7 +93,7 @@ export class WalkThroughPart extends BaseEditor { constructor( @ITelemetryService telemetryService: ITelemetryService, @IInstantiationService private instantiationService: IInstantiationService, - @IWorkbenchThemeService protected themeService: IWorkbenchThemeService, + @IThemeService protected themeService: IThemeService, @IOpenerService private openerService: IOpenerService, @IFileService private fileService: IFileService, @IModelService protected modelService: IModelService, @@ -328,8 +327,8 @@ export class WalkThroughPart extends BaseEditor { innerContent.classList.add('walkThroughContent'); // only for markdown files const markdown = this.expandMacros(content); innerContent.innerHTML = marked(markdown, { renderer }); - this.style(innerContent); - this.contentDisposables.push(this.themeService.onDidColorThemeChange(() => this.style(innerContent))); + this.style(this.themeService.getTheme(), innerContent); + this.contentDisposables.push(this.themeService.onThemeChange(theme => this.style(theme, innerContent))); this.content.appendChild(innerContent); model.snippets.forEach((snippet, i) => { @@ -378,7 +377,6 @@ export class WalkThroughPart extends BaseEditor { } })); - this.contentDisposables.push(this.themeService.onDidColorThemeChange(theme => editor.updateOptions({ theme: theme.id }))); // TODO@theme this should be done from the editor itself and not from the outside this.contentDisposables.push(this.configurationService.onDidUpdateConfiguration(() => editor.updateOptions(this.getEditorOptions(snippet.textEditorModel.getModeId())))); this.contentDisposables.push(once(editor.onMouseDown)(() => { @@ -429,7 +427,6 @@ export class WalkThroughPart extends BaseEditor { overviewRulerLanes: 3, fixedOverflowWidgets: true, lineNumbersMinChars: 1, - theme: this.themeService.getColorTheme().id, minimap: false, }; } @@ -443,7 +440,7 @@ export class WalkThroughPart extends BaseEditor { } } - private style(div: HTMLElement) { + private style(theme: ITheme, div: HTMLElement) { const styleElement = this.partService.getContainer(Parts.EDITOR_PART); // TODO@theme styles should come in via theme registry const { color, backgroundColor, fontFamily, fontWeight, fontSize } = window.getComputedStyle(styleElement); div.style.color = color; From fc9a929dd0f5ab5029c8c9a01e0e221892364a74 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 15 May 2017 16:19:31 +0200 Subject: [PATCH 0438/1164] Fix #19161 --- src/vs/workbench/electron-browser/actions.ts | 2 +- .../node/configurationEditingService.ts | 63 +++++++++++++------ .../node/configurationEditingService.test.ts | 24 ++++++- 3 files changed, 67 insertions(+), 22 deletions(-) diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index c21c6700f29..b5b380afb6a 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -246,7 +246,7 @@ export abstract class BaseZoomAction extends Action { browser.setZoomLevel(webFrame.getZoomLevel(), /*isTrusted*/false); }; - this.configurationEditingService.writeConfiguration(target, { key: BaseZoomAction.SETTING_KEY, value: level }).done(() => applyZoom(), error => applyZoom()); + this.configurationEditingService.writeConfiguration(target, { key: BaseZoomAction.SETTING_KEY, value: level }, { donotNotifyError: true }).done(() => applyZoom(), error => applyZoom()); } } diff --git a/src/vs/workbench/services/configuration/node/configurationEditingService.ts b/src/vs/workbench/services/configuration/node/configurationEditingService.ts index 70d1426b1f5..a2ace0b1b2c 100644 --- a/src/vs/workbench/services/configuration/node/configurationEditingService.ts +++ b/src/vs/workbench/services/configuration/node/configurationEditingService.ts @@ -42,6 +42,10 @@ interface IValidationResult { exists?: boolean; } +interface ConfigurationEditingOptions extends IConfigurationEditingOptions { + force?: boolean; +} + export class ConfigurationEditingService implements IConfigurationEditingService { public _serviceBrand: any; @@ -66,16 +70,17 @@ export class ConfigurationEditingService implements IConfigurationEditingService return this.queue.queue(() => this.doWriteConfiguration(target, value, options) // queue up writes to prevent race conditions .then(() => null, error => { - return options.donotNotifyError ? TPromise.wrapError(error) : this.onError(error, target); + return options.donotNotifyError ? TPromise.wrapError(error) : this.onError(error, target, value); })); } - private doWriteConfiguration(target: ConfigurationTarget, value: IConfigurationValue, options: IConfigurationEditingOptions): TPromise { + private doWriteConfiguration(target: ConfigurationTarget, value: IConfigurationValue, options: ConfigurationEditingOptions): TPromise { const operation = this.getConfigurationEditOperation(target, value); - return this.resolveAndValidate(target, operation, !options.donotSave) - .then(reference => this.writeToBuffer(reference.object.textEditorModel, operation, !options.donotSave) - .then(() => reference.dispose())); + const checkDirtyConfiguration = !(options.force || options.donotSave); + const saveConfiguration = options.force || !options.donotSave; + return this.resolveAndValidate(target, operation, checkDirtyConfiguration) + .then(reference => this.writeToBuffer(reference.object.textEditorModel, operation, saveConfiguration)); } private writeToBuffer(model: editorCommon.IModel, operation: IConfigurationEditOperation, save: boolean): TPromise { @@ -101,17 +106,13 @@ export class ConfigurationEditingService implements IConfigurationEditingService return false; } - private onError(error: IConfigurationEditingError, target: ConfigurationTarget): TPromise { + private onError(error: IConfigurationEditingError, target: ConfigurationTarget, value: IConfigurationValue): TPromise { switch (error.code) { case ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION: + this.onInvalidConfigurationError(error, target); + break; case ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY: - this.choiceService.choose(Severity.Error, error.message, [nls.localize('open', "Open Settings"), nls.localize('close', "Close")], 1) - .then(option => { - switch (option) { - case 0: - this.openSettings(target); - } - }); + this.onConfigurationFileDirtyError(error, target, value); break; default: this.messageService.show(Severity.Error, error.message); @@ -119,6 +120,30 @@ export class ConfigurationEditingService implements IConfigurationEditingService return TPromise.wrapError(error); } + private onInvalidConfigurationError(error: IConfigurationEditingError, target: ConfigurationTarget): void { + this.choiceService.choose(Severity.Error, error.message, [nls.localize('open', "Open Settings"), nls.localize('close', "Close")], 1) + .then(option => { + switch (option) { + case 0: + this.openSettings(target); + } + }); + } + + private onConfigurationFileDirtyError(error: IConfigurationEditingError, target: ConfigurationTarget, value: IConfigurationValue): void { + this.choiceService.choose(Severity.Error, error.message, [nls.localize('saveAndRetry', "Save Settings and Retry"), nls.localize('open', "Open Settings"), nls.localize('close', "Close")], 2) + .then(option => { + switch (option) { + case 0: + this.writeConfiguration(target, value, { force: true }); + break; + case 1: + this.openSettings(target); + break; + } + }); + } + private openSettings(target: ConfigurationTarget): void { this.commandService.executeCommand(ConfigurationTarget.USER === target ? 'workbench.action.openGlobalSettings' : 'workbench.action.openWorkspaceSettings'); } @@ -216,18 +241,18 @@ export class ConfigurationEditingService implements IConfigurationEditingService return this.wrapError(ConfigurationEditingErrorCode.ERROR_NO_WORKSPACE_OPENED, target); } - // Target cannot be dirty if not writing into buffer - const resource = operation.resource; - if (checkDirty && this.textFileService.isDirty(resource)) { - return this.wrapError(ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY, target); - } - return this.resolveModelReference(operation.resource) .then(reference => { const model = reference.object.textEditorModel; + if (this.hasParseErrors(model, operation)) { return this.wrapError(ConfigurationEditingErrorCode.ERROR_INVALID_CONFIGURATION, target); } + + // Target cannot be dirty if not writing into buffer + if (checkDirty && this.textFileService.isDirty(operation.resource)) { + return this.wrapError(ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY, target); + } return reference; }); } diff --git a/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts b/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts index 3a53e2a1de2..a444ccfb9cf 100644 --- a/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts +++ b/src/vs/workbench/services/configuration/test/node/configurationEditingService.test.ts @@ -5,6 +5,7 @@ 'use strict'; +import * as sinon from 'sinon'; import assert = require('assert'); import os = require('os'); import path = require('path'); @@ -55,12 +56,13 @@ class SettingsTestEnvironmentService extends EnvironmentService { suite('ConfigurationEditingService', () => { - let instantiationService; + let instantiationService: TestInstantiationService; let testObject: ConfigurationEditingService; let parentDir; let workspaceDir; let globalSettingsFile; let workspaceSettingsDir; + let choiceService; suiteSetup(() => { const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); @@ -126,7 +128,7 @@ suite('ConfigurationEditingService', () => { instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); instantiationService.stub(ITextModelResolverService, instantiationService.createInstance(TextModelResolverService)); instantiationService.stub(IBackupFileService, new TestBackupFileService()); - instantiationService.stub(IChoiceService, { + choiceService = instantiationService.stub(IChoiceService, { choose: (severity, message, options, cancelId): TPromise => { return TPromise.as(cancelId); } @@ -197,6 +199,24 @@ suite('ConfigurationEditingService', () => { (error: IConfigurationEditingError) => assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY)); }); + test('dirty error is not thrown if not asked to save', () => { + instantiationService.stub(ITextFileService, 'isDirty', true); + return testObject.writeConfiguration(ConfigurationTarget.USER, { key: 'configurationEditing.service.testSetting', value: 'value' }, { donotSave: true }) + .then(() => null, error => assert.fail('Should not fail.')); + }); + + test('do not notify error', () => { + instantiationService.stub(ITextFileService, 'isDirty', true); + const target = sinon.stub(); + instantiationService.stubPromise(IChoiceService, 'choose', target); + return testObject.writeConfiguration(ConfigurationTarget.USER, { key: 'configurationEditing.service.testSetting', value: 'value' }, { donotNotifyError: true }) + .then(() => assert.fail('Should fail with ERROR_CONFIGURATION_FILE_DIRTY error.'), + (error: IConfigurationEditingError) => { + assert.equal(false, target.calledOnce); + assert.equal(error.code, ConfigurationEditingErrorCode.ERROR_CONFIGURATION_FILE_DIRTY); + }); + }); + test('write one setting - empty file', () => { return testObject.writeConfiguration(ConfigurationTarget.USER, { key: 'configurationEditing.service.testSetting', value: 'value' }) .then(() => { From 31d232e9bb68c47b0f36bfa2211d09e6e68d7a49 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 15 May 2017 16:33:06 +0200 Subject: [PATCH 0439/1164] Fix #26576 --- .../workbench/parts/preferences/browser/media/preferences.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/workbench/parts/preferences/browser/media/preferences.css b/src/vs/workbench/parts/preferences/browser/media/preferences.css index 5913b98e6a8..d590de6d74f 100644 --- a/src/vs/workbench/parts/preferences/browser/media/preferences.css +++ b/src/vs/workbench/parts/preferences/browser/media/preferences.css @@ -23,6 +23,10 @@ border-bottom: 1px solid #2d2d2d; } +.preferences-editor > .preferences-editors-container.side-by-side-preferences-editor { + position: relative; +} + .settings-tabs-widget { display: flex; flex-wrap: wrap; From 136f6a9630fec93111e3c7e75d3c6b76bd1f085c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 15 May 2017 16:50:27 +0200 Subject: [PATCH 0440/1164] tfs: fix linux build --- build/tfs/linux/build.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build/tfs/linux/build.sh b/build/tfs/linux/build.sh index 28a34d6227b..92d12beeb34 100755 --- a/build/tfs/linux/build.sh +++ b/build/tfs/linux/build.sh @@ -69,17 +69,17 @@ tar -czvf $TARBALL_PATH $BUILDNAME popd STEP "Publish tar.gz archive" -node build/tfs/out/publish.js $VSCODE_QUALITY $PLATFORM_LINUX archive-unsigned $TARBALL_FILENAME $VERSION true $TARBALL_PATH +node build/tfs/common/publish.js $VSCODE_QUALITY $PLATFORM_LINUX archive-unsigned $TARBALL_FILENAME $VERSION true $TARBALL_PATH STEP "Publish Debian package" DEB_FILENAME="$(ls $REPO/.build/linux/deb/$DEB_ARCH/deb/)" DEB_PATH="$REPO/.build/linux/deb/$DEB_ARCH/deb/$DEB_FILENAME" -node build/tfs/out/publish.js $VSCODE_QUALITY $PLATFORM_DEB package $DEB_FILENAME $VERSION true $DEB_PATH +node build/tfs/common/publish.js $VSCODE_QUALITY $PLATFORM_DEB package $DEB_FILENAME $VERSION true $DEB_PATH STEP "Publish RPM package" RPM_FILENAME="$(ls $REPO/.build/linux/rpm/$RPM_ARCH/ | grep .rpm)" RPM_PATH="$REPO/.build/linux/rpm/$RPM_ARCH/$RPM_FILENAME" -node build/tfs/out/publish.js $VSCODE_QUALITY $PLATFORM_RPM package $RPM_FILENAME $VERSION true $RPM_PATH +node build/tfs/common/publish.js $VSCODE_QUALITY $PLATFORM_RPM package $RPM_FILENAME $VERSION true $RPM_PATH STEP "Publish to repositories" if [ -z "$VSCODE_QUALITY" ]; then From 38446892b25a601fa2403fb8fae7e9eed8b4e0db Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 15 May 2017 17:20:01 +0200 Subject: [PATCH 0441/1164] tfs: add linux ia32 --- build/tfs/linux/build-ia32.sh | 3 +++ build/tfs/linux/build-x64.sh | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100755 build/tfs/linux/build-ia32.sh diff --git a/build/tfs/linux/build-ia32.sh b/build/tfs/linux/build-ia32.sh new file mode 100755 index 00000000000..0b0f1c2a458 --- /dev/null +++ b/build/tfs/linux/build-ia32.sh @@ -0,0 +1,3 @@ +#!/bin/bash +set -e +./build/tfs/linux/build.sh ia32 "$@" \ No newline at end of file diff --git a/build/tfs/linux/build-x64.sh b/build/tfs/linux/build-x64.sh index 43eb1ad7be4..fb5b38e02b3 100755 --- a/build/tfs/linux/build-x64.sh +++ b/build/tfs/linux/build-x64.sh @@ -1,4 +1,3 @@ #!/bin/bash set -e -DIRNAME=$(dirname $(readlink -f $0)) -$DIRNAME/build.sh x64 "$@" \ No newline at end of file +./build/tfs/linux/build.sh x64 "$@" \ No newline at end of file From ec819e0b914e7d919f908d719be53a4fa97c62e1 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 15 May 2017 17:37:44 +0200 Subject: [PATCH 0442/1164] fix linux build --- build/tfs/linux/Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build/tfs/linux/Dockerfile b/build/tfs/linux/Dockerfile index 811a15ddedd..a19afcc5fc8 100644 --- a/build/tfs/linux/Dockerfile +++ b/build/tfs/linux/Dockerfile @@ -4,8 +4,7 @@ MAINTAINER Joao Moreno RUN dpkg --add-architecture i386 RUN apt-get update RUN apt-get install -y build-essential -RUN apt-get install -y gcc-4.9-multilib -RUN apt-get install -y g++-4.9-multilib +RUN apt-get install -y gcc-multilib g++-multilib RUN apt-get install -y zip RUN apt-get install -y rpm RUN apt-get install -y createrepo From ccb75cd5084a1112b7ece9167a689602a68a6d31 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 15 May 2017 17:16:32 +0200 Subject: [PATCH 0443/1164] :lipstick: --- src/vs/base/common/arrays.ts | 14 ++++++++++ .../contrib/snippet/browser/snippetSession.ts | 26 ++++++------------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/vs/base/common/arrays.ts b/src/vs/base/common/arrays.ts index e23dde3c9ac..d2a168900c9 100644 --- a/src/vs/base/common/arrays.ts +++ b/src/vs/base/common/arrays.ts @@ -66,6 +66,20 @@ export function findFirst(array: T[], p: (x: T) => boolean): number { return low; } +export function groupBy(data: T[], compare: (a: T, b: T) => number): T[][] { + const result: T[][] = []; + let currentGroup: T[]; + for (const element of data.slice(0).sort(compare)) { + if (!currentGroup || compare(currentGroup[0], element) !== 0) { + currentGroup = [element]; + result.push(currentGroup); + } else { + currentGroup.push(element); + } + } + return result; +} + /** * Takes two *sorted* arrays and computes their delta (removed, added elements). * Finishes in `Math.min(before.length, after.length)` steps. diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts index 726ceadb12e..0a7859a4bcc 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -12,6 +12,7 @@ import { TextmateSnippet, Placeholder, SnippetParser } from '../common/snippetPa import { Selection } from 'vs/editor/common/core/selection'; import { Range } from 'vs/editor/common/core/range'; import { IPosition } from 'vs/editor/common/core/position'; +import { groupBy } from 'vs/base/common/arrays'; import { dispose } from 'vs/base/common/lifecycle'; import { EditorSnippetVariableResolver } from "vs/editor/contrib/snippet/common/snippetVariables"; @@ -36,17 +37,19 @@ export class OneSnippet { this._editor = editor; this._snippet = snippet; this._offset = offset; + + this._placeholderGroups = groupBy(snippet.placeholders, Placeholder.compareByIndex); + this._placeholderGroupsIdx = -1; } dispose(): void { - if (!this._placeholderDecorations) { - return; + if (this._placeholderDecorations) { + this._editor.changeDecorations(accessor => this._placeholderDecorations.forEach(handle => accessor.removeDecoration(handle))); } - this._editor.changeDecorations(accessor => this._placeholderDecorations.forEach(handle => accessor.removeDecoration(handle))); this._placeholderGroups.length = 0; } - private _init(): void { + private _initDecorations(): void { if (this._placeholderDecorations) { // already initialized @@ -57,7 +60,6 @@ export class OneSnippet { const model = this._editor.getModel(); this._editor.changeDecorations(accessor => { - // create a decoration for each placeholder for (const placeholder of this._snippet.placeholders) { const placeholderOffset = this._snippet.offset(placeholder); @@ -71,23 +73,11 @@ export class OneSnippet { this._placeholderDecorations.set(placeholder, handle); } }); - - this._placeholderGroupsIdx = -1; - this._placeholderGroups = []; - let lastBucket: Placeholder[]; - this._snippet.placeholders.slice(0).sort(Placeholder.compareByIndex).forEach(a => { - if (!lastBucket || lastBucket[0].index !== a.index) { - lastBucket = [a]; - this._placeholderGroups.push(lastBucket); - } else { - lastBucket.push(a); - } - }); } move(fwd: boolean): Selection[] { - this._init(); + this._initDecorations(); if (fwd && this._placeholderGroupsIdx < this._placeholderGroups.length - 1) { this._placeholderGroupsIdx += 1; From ba9df688788f7d111dd7a3e6119298be5bf39d0a Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 15 May 2017 21:44:18 +0200 Subject: [PATCH 0444/1164] Allow theming of parameter hints #26671 --- .../parameterHints/browser/parameterHints.css | 31 +------------------ .../browser/parameterHintsWidget.ts | 19 +++++++++++- .../contrib/suggest/browser/suggestWidget.ts | 4 +-- src/vs/platform/theme/common/colorRegistry.ts | 17 +++++----- 4 files changed, 30 insertions(+), 41 deletions(-) diff --git a/src/vs/editor/contrib/parameterHints/browser/parameterHints.css b/src/vs/editor/contrib/parameterHints/browser/parameterHints.css index d6a1ffafeb7..abb195c2d0b 100644 --- a/src/vs/editor/contrib/parameterHints/browser/parameterHints.css +++ b/src/vs/editor/contrib/parameterHints/browser/parameterHints.css @@ -5,8 +5,6 @@ .monaco-editor .parameter-hints-widget { z-index: 10; - background-color: #F3F3F3; - border: 1px solid rgb(200, 200, 200); display: flex; flex-direction: column; line-height: 1.5em; @@ -41,18 +39,10 @@ flex-direction: column; } -.monaco-editor .parameter-hints-widget.multiple .body { - border-left: 1px solid rgba(204, 204, 204, 0.5); -} - .monaco-editor .parameter-hints-widget .signature { padding: 4px 5px; } -.monaco-editor .parameter-hints-widget .signature.has-docs { - border-bottom: 1px solid rgba(204, 204, 204, 0.5); -} - .monaco-editor .parameter-hints-widget .docs { padding: 0 10px 0 5px; white-space: pre-wrap; @@ -118,19 +108,7 @@ margin-right: 0.5em; } -/*** VS Dark */ - -.monaco-editor.vs-dark .parameter-hints-widget { - background-color: #2D2D30; - border-color: rgba(85,85,85,0.5); -} - -.monaco-editor.hc-black .parameter-hints-widget .body, -.monaco-editor.vs-dark .parameter-hints-widget .body, -.monaco-editor.hc-black .parameter-hints-widget .signature, -.monaco-editor.vs-dark .parameter-hints-widget .signature { - border-color: rgba(85,85,85,0.5); -} +/*** VS Dark & High Contrast*/ .monaco-editor.hc-black .parameter-hints-widget .button.previous, .monaco-editor.vs-dark .parameter-hints-widget .button.previous { @@ -140,11 +118,4 @@ .monaco-editor.hc-black .parameter-hints-widget .button.next, .monaco-editor.vs-dark .parameter-hints-widget .button.next { background-image: url('arrow-down-dark.svg'); -} - -/*** High Contrast */ - -.monaco-editor.hc-black .parameter-hints-widget { - background-color: #0C141F; - border: 2px solid #6FC3DF; } \ No newline at end of file diff --git a/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts b/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts index fd8a7952870..a9fec25edf6 100644 --- a/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts +++ b/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.ts @@ -24,6 +24,8 @@ import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableEle import { CharacterSet } from 'vs/editor/common/core/characterClassifier'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; import { ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { registerThemingParticipant, HIGH_CONTRAST } from 'vs/platform/theme/common/themeService'; +import { editorHoverBackground, editorHoverBorder } from 'vs/platform/theme/common/colorRegistry'; const $ = dom.$; @@ -471,4 +473,19 @@ export class ParameterHintsWidget implements IContentWidget, IDisposable { this.disposables = dispose(this.disposables); this.model = null; } -} \ No newline at end of file +} + +registerThemingParticipant((theme, collector) => { + let border = theme.getColor(editorHoverBorder); + if (border) { + let borderWidth = theme.type === HIGH_CONTRAST ? 2 : 1; + collector.addRule(`.monaco-editor .parameter-hints-widget { border: ${borderWidth}px solid ${border}; }`); + collector.addRule(`.monaco-editor .parameter-hints-widget.multiple .body { border-left: 1px solid ${border.transparent(0.5)}; }`); + collector.addRule(`.monaco-editor .parameter-hints-widget .signature.has-docs { border-bottom: 1px solid ${border.transparent(0.5)}; }`); + + } + let background = theme.getColor(editorHoverBackground); + if (background) { + collector.addRule(`.monaco-editor .parameter-hints-widget { background-color: ${background}; }`); + } +}); \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index f157853bbdf..c472a24e5c6 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -29,7 +29,7 @@ import { alert } from 'vs/base/browser/ui/aria/aria'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { attachListStyler } from 'vs/platform/theme/common/styler'; import { IThemeService, ITheme, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { registerColor, editorWidgetBackground, contrastBorder, listFocusBackground, activeContrastBorder, listHighlightForeground, editorForeground } from 'vs/platform/theme/common/colorRegistry'; +import { registerColor, editorWidgetBackground, listFocusBackground, activeContrastBorder, listHighlightForeground, editorForeground, editorWidgetBorder } from 'vs/platform/theme/common/colorRegistry'; import { Position } from 'vs/editor/common/core/position'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; @@ -47,7 +47,7 @@ interface ISuggestionTemplateData { * Suggest widget colors */ export const editorSuggestWidgetBackground = registerColor('editorSuggestWidget.background', { dark: editorWidgetBackground, light: editorWidgetBackground, hc: editorWidgetBackground }, nls.localize('editorSuggestWidgetBackground', 'Background color of the suggest widget.')); -export const editorSuggestWidgetBorder = registerColor('editorSuggestWidget.border', { dark: '#454545', light: '#C8C8C8', hc: contrastBorder }, nls.localize('editorSuggestWidgetBorder', 'Border color of the suggest widget.')); +export const editorSuggestWidgetBorder = registerColor('editorSuggestWidget.border', { dark: editorWidgetBorder, light: editorWidgetBorder, hc: editorWidgetBorder }, nls.localize('editorSuggestWidgetBorder', 'Border color of the suggest widget.')); export const editorSuggestWidgetForeground = registerColor('editorSuggestWidget.foreground', { dark: editorForeground, light: editorForeground, hc: editorForeground }, nls.localize('editorSuggestWidgetForeground', 'Foreground color of the suggest widget.')); export const editorSuggestWidgetSelectedBackground = registerColor('editorSuggestWidget.selectedBackground', { dark: listFocusBackground, light: listFocusBackground, hc: listFocusBackground }, nls.localize('editorSuggestWidgetSelectedBackground', 'Background color of the selected entry in the suggest widget.')); export const editorSuggestWidgetHighlightForeground = registerColor('editorSuggestWidget.highlightForeground', { dark: listHighlightForeground, light: listHighlightForeground, hc: listHighlightForeground }, nls.localize('editorSuggestWidgetHighlightForeground', 'Color of the match highlights in the suggest widget.')); diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 5c2a75960e2..23f915d5a7e 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -210,6 +210,13 @@ export const editorBackground = registerColor('editor.background', { light: '#ff */ export const editorForeground = registerColor('editor.foreground', { light: '#333333', dark: '#BBBBBB', hc: Color.white }, nls.localize('editorForeground', "Editor default foreground color.")); +/** + * Editor widgets + */ +export const editorWidgetBackground = registerColor('editorWidget.background', { dark: '#2D2D30', light: '#EFEFF2', hc: '#0C141F' }, nls.localize('editorWidgetBackground', 'Background color of editor widgets, such as find/replace.')); +export const editorWidgetBorder = registerColor('editorWidget.border', { dark: '#454545', light: '#C8C8C8', hc: contrastBorder }, nls.localize('editorWidgetBorder', 'Border color of the editor widget.')); + + /** * Editor selection colors. */ @@ -228,20 +235,14 @@ export const editorFindRangeHighlight = registerColor('editor.findRangeHighlight * Editor hover */ export const editorHoverHighlight = registerColor('editor.hoverHighlightBackground', { light: '#ADD6FF26', dark: '#264f7840', hc: '#ADD6FF26' }, nls.localize('hoverHighlight', 'Highlight below the word for which a hover is shown.')); -export const editorHoverBackground = registerColor('editorHoverWidget.background', { light: '#F3F3F3', dark: '#2D2D30', hc: '#0C141F' }, nls.localize('hoverBackground', 'Background color of the editor hover.')); -export const editorHoverBorder = registerColor('editorHoverWidget.border', { light: '#CCCCCC', dark: '#555555', hc: '#CCCCCC' }, nls.localize('hoverBorder', 'Border color of the editor hover.')); +export const editorHoverBackground = registerColor('editorHoverWidget.background', { light: editorWidgetBackground, dark: editorWidgetBackground, hc: editorWidgetBackground }, nls.localize('hoverBackground', 'Background color of the editor hover.')); +export const editorHoverBorder = registerColor('editorHoverWidget.border', { light: editorWidgetBorder, dark: editorWidgetBorder, hc: editorWidgetBorder }, nls.localize('hoverBorder', 'Border color of the editor hover.')); /** * Editor link colors */ export const editorActiveLinkForeground = registerColor('editorLink.activeForeground', { dark: '#4E94CE', light: Color.blue, hc: Color.cyan }, nls.localize('activeLinkForeground', 'Color of active links.')); -/** - * Find widget - */ -export const editorWidgetBackground = registerColor('editorWidget.background', { dark: '#2D2D30', light: '#EFEFF2', hc: '#0C141F' }, nls.localize('editorWidgetBackground', 'Background color of editor widgets, such as find/replace.')); - - // ----- color functions export function darken(colorValue: ColorValue, factor: number): ColorFunction { From dd41aedbc3230dd6de2d265102eccaed4c5bcb3d Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 15 May 2017 21:48:50 +0200 Subject: [PATCH 0445/1164] Fix duplicated import in preferenceEditor --- src/vs/workbench/parts/preferences/browser/preferencesEditor.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts index da757c92cf5..0aae0f5f0ff 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts @@ -53,7 +53,6 @@ import { FindController } from 'vs/editor/contrib/find/browser/find'; import { SelectionHighlighter } from 'vs/editor/contrib/find/common/findController'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { IThemeService } from "vs/platform/theme/common/themeService"; import { attachStylerCallback } from "vs/platform/theme/common/styler"; import { scrollbarShadow } from "vs/platform/theme/common/colorRegistry"; From 4ceb904f3301378271790ac982161b879f8551ba Mon Sep 17 00:00:00 2001 From: Fernando Tolentino Date: Mon, 15 May 2017 16:54:29 -0300 Subject: [PATCH 0446/1164] exclude vscode-markdown and already entered extensions --- extensions/configuration-editing/src/extension.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/extensions/configuration-editing/src/extension.ts b/extensions/configuration-editing/src/extension.ts index f41e74fc735..78b855feb81 100644 --- a/extensions/configuration-editing/src/extension.ts +++ b/extensions/configuration-editing/src/extension.ts @@ -70,10 +70,17 @@ function registerExtensionsCompletions(): vscode.Disposable { const location = getLocation(document.getText(), document.offsetAt(position)); const range = document.getWordRangeAtPosition(position) || new vscode.Range(position, position); if (location.path[0] === 'recommendations') { + const config = vscode.workspace && vscode.workspace.getConfiguration('extensions.json'); + const alreadyEnteredExtensions = config.get('recommendations') || []; return vscode.extensions.all - .filter(e => !e.id.startsWith('vscode.')) + .filter(e => !( + e.id.startsWith('vscode.') + || e.id === 'Microsoft.vscode-markdown' + || alreadyEnteredExtensions.indexOf(e.id) > -1 + )) .map(e => newSimpleCompletionItem(e.id, range, undefined, '"' + e.id + '"')); } + return []; } }); } From 752ff222909d7bbba472e5f915c85403d622283b Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 15 May 2017 22:06:12 +0200 Subject: [PATCH 0447/1164] [theme] style 'inspect tm scopes' (for #23506) --- .../electron-browser/inspectTMScopes.css | 11 +++++----- .../electron-browser/inspectTMScopes.ts | 21 ++++++++++++++++--- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.css b/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.css index 6f02755f597..0c4905290d2 100644 --- a/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.css +++ b/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.css @@ -4,8 +4,6 @@ *--------------------------------------------------------------------------------------------*/ .tm-inspect-widget { - background-color: #F3F3F3; - border: 1px solid #CCC; z-index: 50; -webkit-user-select: text; -ms-user-select: text; @@ -16,14 +14,15 @@ padding: 10px; } -.monaco-editor.vs-dark .tm-inspect-widget { background-color: #2D2D30; border-color: #555; } - -.monaco-editor.hc-black .tm-inspect-widget { background-color: #0C141F; } - .tm-token { font-family: monospace; } +.tm-metadata-separator { + height: 1px; + border: 0; +} + .tm-token-length { font-weight: normal; font-size: 60%; diff --git a/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.ts b/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.ts index f8bfa8c6447..b0792b493ef 100644 --- a/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.ts +++ b/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.ts @@ -26,6 +26,8 @@ import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/work import { Color } from 'vs/base/common/color'; import { IMessageService } from 'vs/platform/message/common/message'; import Severity from 'vs/base/common/severity'; +import { registerThemingParticipant, HIGH_CONTRAST } from 'vs/platform/theme/common/themeService'; +import { editorHoverBackground, editorHoverBorder } from 'vs/platform/theme/common/colorRegistry'; @editorContribution class InspectTMScopesController extends Disposable implements IEditorContribution { @@ -251,7 +253,7 @@ class InspectTMScopesWidget extends Disposable implements IContentWidget { let tokenText = this._model.getLineContent(position.lineNumber).substring(tokenStartIndex, tokenEndIndex); result += `

${renderTokenText(tokenText)}(${tokenText.length} ${tokenText.length === 1 ? 'char' : 'chars'})

`; - result += `
`; + result += ``; let metadata = this._decodeMetadata(data.tokens2[(token2Index << 1) + 1]); result += ``; @@ -263,7 +265,7 @@ class InspectTMScopesWidget extends Disposable implements IContentWidget { result += ``; let theme = this._themeService.getColorTheme(); - result += `
`; + result += ``; let matchingRule = findMatchingThemeRule(theme, data.tokens1[token1Index].scopes); if (matchingRule) { result += `${matchingRule.rawSelector}\n${JSON.stringify(matchingRule.settings, null, '\t')}`; @@ -271,7 +273,7 @@ class InspectTMScopesWidget extends Disposable implements IContentWidget { result += `No theme selector.`; } - result += `
`; + result += ``; result += `
diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css index d9606cb815d..4c76f3ef4c2 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css +++ b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css @@ -301,16 +301,3 @@ .monaco-workbench.linux > .part.editor > .content .welcomePage li.linux-only { display: list-item; } - -.monaco-workbench > .part.editor > .content .welcomePageContainer .scm-only { - display: none; -} -.monaco-workbench > .part.editor > .content .welcomePageContainer.scmEnabled .scm-only { - display: initial; -} -.monaco-workbench > .part.editor > .content .welcomePageContainer.scmEnabled li.scm-only { - display: list-item; -} -.monaco-workbench > .part.editor > .content .welcomePageContainer.scmEnabled .git-only { - display: none; -} \ No newline at end of file diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/vs_code_editor_walkthrough.md b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/vs_code_editor_walkthrough.md index b311703b479..6dedb7d9978 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/vs_code_editor_walkthrough.md +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/vs_code_editor_walkthrough.md @@ -157,7 +157,7 @@ ul>li.item$*5 ## Thanks! Well if you have got this far then you will have touched on some of the editing features in Visual Studio Code. But don't stop now :) We have lots of additional [documentation](https://code.visualstudio.com/docs) and [introductory videos](https://code.visualstudio.com/docs/getstarted/introvideos) for the product that will help you learn how to use it. And while you are here, here are a few additional things you can try: - Open the Integrated Terminal by pressing kb(workbench.action.terminal.toggleTerminal) then see what's possible by [reviewing the terminal documentation](https://code.visualstudio.com/docs/editor/integrated-terminal) -- Work with version control by pressing kb(workbench.view.git)kb(workbench.view.scm) understand how to stage, commit, change branches, and view diffs and more by reviewing the [version control documentation](https://code.visualstudio.com/docs/editor/versioncontrol) +- Work with version control by pressing kb(workbench.view.scm) understand how to stage, commit, change branches, and view diffs and more by reviewing the [version control documentation](https://code.visualstudio.com/docs/editor/versioncontrol) - Browse thousands of extensions in our integrated gallery by pressing with kb(workbench.view.extensions) the [documentation](https://code.visualstudio.com/docs/editor/extension-gallery) will show you how to see the most popular extensions, disable installed ones and more. OK that's all for now, diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css index 176d0ae0e05..a10262088f1 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css @@ -161,16 +161,6 @@ display: initial; } -.monaco-workbench > .part.editor > .content .walkThroughContent .scm-only { - display: none; -} -.monaco-workbench > .part.editor > .content .walkThroughContent.scmEnabled .scm-only { - display: initial; -} -.monaco-workbench > .part.editor > .content .walkThroughContent.scmEnabled .git-only { - display: none; -} - .vs .monaco-workbench > .part.editor > .content .walkThroughContent .monaco-editor-background, .vs .monaco-workbench > .part.editor > .content .walkThroughContent .glyph-margin { background:rgba(0,0,0,.08); diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts index 14de89be99c..1c94c56a9ec 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts @@ -329,7 +329,6 @@ export class WalkThroughPart extends BaseEditor { if (!strings.endsWith(input.getResource().path, '.md')) { this.content.innerHTML = content; this.updateSizeClasses(); - this.updateMarkerClasses(); this.addThemeListener(); this.decorateContent(); if (input.onReady) { @@ -430,7 +429,6 @@ export class WalkThroughPart extends BaseEditor { })); }); this.updateSizeClasses(); - this.updateMarkerClasses(); this.addThemeListener(); if (input.onReady) { input.onReady(innerContent); @@ -460,15 +458,6 @@ export class WalkThroughPart extends BaseEditor { }; } - private updateMarkerClasses() { - const innerContent = this.content.firstElementChild; - - // TODO@christof - if (true && innerContent) { - innerContent.classList.add('scmEnabled'); - } - } - private addThemeListener() { const innerContent = this.content.firstElementChild as HTMLElement; this.contentDisposables.push(new WalkThroughTheming(this.themeService, innerContent)); From 8ac7e555d1790267bf58e1922fc2f737a4d1c1ab Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 16 May 2017 17:46:53 +0200 Subject: [PATCH 0481/1164] use stableSort in code-lens --- src/vs/base/common/arrays.ts | 27 +++++++++++++++++++ src/vs/base/test/common/arrays.test.ts | 13 +++++++++ .../contrib/codelens/common/codelens.ts | 4 ++- 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/vs/base/common/arrays.ts b/src/vs/base/common/arrays.ts index d2a168900c9..ce2d4100429 100644 --- a/src/vs/base/common/arrays.ts +++ b/src/vs/base/common/arrays.ts @@ -66,6 +66,33 @@ export function findFirst(array: T[], p: (x: T) => boolean): number { return low; } +/** + * Like `Array#sort` but always stable. Comes at a cost: iterates 2n-times, + * creates n-objects in addition to sorting (log(n)) + */ +export function stableSort(data: T[], compare: (a: T, b: T) => number): T[] { + + let data2: { idx: number; e: T }[] = data; + + for (let idx = 0; idx < data2.length; idx++) { + data2[idx] = { idx, e: data[idx] }; + } + + data2.sort((a, b) => { + let ret = compare(a.e, b.e); + if (ret === 0) { + ret = a.idx - b.idx; + } + return ret; + }); + + for (let idx = 0; idx < data2.length; idx++) { + data[idx] = data2[idx].e; + } + + return data; +} + export function groupBy(data: T[], compare: (a: T, b: T) => number): T[][] { const result: T[][] = []; let currentGroup: T[]; diff --git a/src/vs/base/test/common/arrays.test.ts b/src/vs/base/test/common/arrays.test.ts index 95b7108f988..5037261bc73 100644 --- a/src/vs/base/test/common/arrays.test.ts +++ b/src/vs/base/test/common/arrays.test.ts @@ -33,6 +33,19 @@ suite('Arrays', () => { assert.equal(array[idx], 1); }); + test('stableSort', function () { + let counter = 0; + let data = arrays.fill(10000, () => ({ n: 1, m: counter++ })); + + arrays.stableSort(data, (a, b) => a.n - b.n); + + let lastM = -1; + for (const element of data) { + assert.ok(lastM < element.m); + lastM = element.m; + } + }); + test('delta', function () { function compare(a: number, b: number): number { return a - b; diff --git a/src/vs/editor/contrib/codelens/common/codelens.ts b/src/vs/editor/contrib/codelens/common/codelens.ts index 864b3f2a25e..28424195ae2 100644 --- a/src/vs/editor/contrib/codelens/common/codelens.ts +++ b/src/vs/editor/contrib/codelens/common/codelens.ts @@ -6,6 +6,7 @@ 'use strict'; import { illegalArgument, onUnexpectedExternalError } from 'vs/base/common/errors'; +import { stableSort } from 'vs/base/common/arrays'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import { IModel } from 'vs/editor/common/editorCommon'; @@ -33,7 +34,8 @@ export function getCodeLensData(model: IModel): TPromise { }, onUnexpectedExternalError)); return TPromise.join(promises).then(() => { - return symbols.sort((a, b) => { + + return stableSort(symbols, (a, b) => { // sort by lineNumber, provider-rank, and column if (a.symbol.range.startLineNumber < b.symbol.range.startLineNumber) { return -1; From 6bddd906b09a329fb42e5e7397a676d3dc422c2b Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Tue, 16 May 2017 17:47:05 +0200 Subject: [PATCH 0482/1164] adopt stableSort for ext host diagnostics --- .../workbench/api/node/extHostDiagnostics.ts | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/api/node/extHostDiagnostics.ts b/src/vs/workbench/api/node/extHostDiagnostics.ts index f7d240175d3..7b720e5eec1 100644 --- a/src/vs/workbench/api/node/extHostDiagnostics.ts +++ b/src/vs/workbench/api/node/extHostDiagnostics.ts @@ -12,6 +12,7 @@ import Severity from 'vs/base/common/severity'; import * as vscode from 'vscode'; import { MainContext, MainThreadDiagnosticsShape, ExtHostDiagnosticsShape } from './extHost.protocol'; import { DiagnosticSeverity } from './extHostTypes'; +import { stableSort } from 'vs/base/common/arrays'; export class DiagnosticCollection implements vscode.DiagnosticCollection { @@ -74,13 +75,10 @@ export class DiagnosticCollection implements vscode.DiagnosticCollection { toSync = []; let lastUri: vscode.Uri; - // ensure stable-sort: keep the original - // index for otherwise equal items - const sortedTuples = first - .map((tuple, idx) => ({ tuple, idx })) - .sort(DiagnosticCollection._compareIndexedTuplesByUri); + // ensure stable-sort + stableSort(first, DiagnosticCollection._compareIndexedTuplesByUri); - for (const { tuple } of sortedTuples) { + for (const tuple of first) { const [uri, diagnostics] = tuple; if (!lastUri || uri.toString() !== lastUri.toString()) { if (lastUri && this._data.get(lastUri.toString()).length === 0) { @@ -208,14 +206,10 @@ export class DiagnosticCollection implements vscode.DiagnosticCollection { } } - private static _compareIndexedTuplesByUri(a: { tuple: [vscode.Uri, vscode.Diagnostic[]]; idx: number }, b: { tuple: [vscode.Uri, vscode.Diagnostic[]]; idx: number }): number { - if (a.tuple[0].toString() < b.tuple[0].toString()) { + private static _compareIndexedTuplesByUri(a: [vscode.Uri, vscode.Diagnostic[]], b: [vscode.Uri, vscode.Diagnostic[]]): number { + if (a[0].toString() < b[0].toString()) { return -1; - } else if (a.tuple[0].toString() > b.tuple[0].toString()) { - return 1; - } else if (a.idx < b.idx) { - return -1; - } else if (a.idx > b.idx) { + } else if (a[0].toString() > b[0].toString()) { return 1; } else { return 0; From c71091755c7cd4ba557dacd1e6dd42c55dc41642 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 16 May 2017 18:12:27 +0200 Subject: [PATCH 0483/1164] dynamically fetch product dependencies --- build/gulpfile.vscode.js | 12 +++++++----- build/tfs/common/installDistro.ts | 25 +++++++++++++++++++++++++ build/tfs/darwin/build.sh | 10 ++++++++++ build/tfs/linux/build.sh | 10 ++++++++++ build/tfs/win32/1_build.ps1 | 15 ++++++++++++++- package.json | 5 +++-- src/vs/platform/node/product.ts | 1 - 7 files changed, 69 insertions(+), 9 deletions(-) create mode 100644 build/tfs/common/installDistro.ts diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index e65f51d5c6a..b000df8c87a 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -31,8 +31,9 @@ const shrinkwrap = require('../npm-shrinkwrap.json'); const crypto = require('crypto'); const i18n = require('./lib/i18n'); +const productDependencies = Object.keys(product.dependencies || {}); const dependencies = Object.keys(shrinkwrap.dependencies) - .concat(Array.isArray(product.extraNodeModules) ? product.extraNodeModules : []); // additional dependencies from our product configuration + .concat(productDependencies); // additional dependencies from our product configuration const baseModules = Object.keys(process.binding('natives')).filter(n => !/^_|\//.test(n)); const nodeModules = ['electron', 'original-fs'] .concat(dependencies) @@ -273,7 +274,8 @@ function packageTask(platform, arch, opts) { .pipe(util.cleanNodeModule('windows-foreground-love', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node'])) .pipe(util.cleanNodeModule('gc-signals', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node', 'src/index.js'])) .pipe(util.cleanNodeModule('v8-profiler', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node', 'src/index.js'])) - .pipe(util.cleanNodeModule('node-pty', ['binding.gyp', 'build/**', 'src/**', 'tools/**'], ['build/Release/**'])); + .pipe(util.cleanNodeModule('node-pty', ['binding.gyp', 'build/**', 'src/**', 'tools/**'], ['build/Release/**'])) + .pipe(util.cleanNodeModule('vsda', ['**'], ['package.json', 'index.js', '**/*.node'])); let all = es.merge( packageJsonStream, @@ -363,7 +365,7 @@ const apiHostname = process.env.TRANSIFEX_API_URL; const apiName = process.env.TRANSIFEX_API_NAME; const apiToken = process.env.TRANSIFEX_API_TOKEN; -gulp.task('vscode-translations-push', ['optimize-vscode'], function() { +gulp.task('vscode-translations-push', ['optimize-vscode'], function () { const pathToMetadata = './out-vscode/nls.metadata.json'; const pathToExtensions = './extensions/**/*.nls.json'; const pathToSetup = 'build/win32/**/{Default.isl,messages.en.isl}'; @@ -375,7 +377,7 @@ gulp.task('vscode-translations-push', ['optimize-vscode'], function() { ).pipe(i18n.pushXlfFiles(apiHostname, apiName, apiToken)); }); -gulp.task('vscode-translations-pull', function() { +gulp.task('vscode-translations-pull', function () { return es.merge( i18n.pullXlfFiles('vscode-editor', apiHostname, apiName, apiToken, vscodeLanguages), i18n.pullXlfFiles('vscode-workbench', apiHostname, apiName, apiToken, vscodeLanguages), @@ -384,7 +386,7 @@ gulp.task('vscode-translations-pull', function() { ).pipe(vfs.dest('../vscode-localization')); }); -gulp.task('vscode-translations-import', function() { +gulp.task('vscode-translations-import', function () { return gulp.src('../vscode-localization/**/*.xlf').pipe(i18n.prepareJsonFiles()).pipe(vfs.dest('./i18n')); }); diff --git a/build/tfs/common/installDistro.ts b/build/tfs/common/installDistro.ts new file mode 100644 index 00000000000..fddc7b88a09 --- /dev/null +++ b/build/tfs/common/installDistro.ts @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const cp = require('child_process'); +const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm'; + +function npmInstall(package: string): void { + const result = cp.spawnSync(npm, ['install', package], { + stdio: 'inherit' + }); + + if (result.error || result.status !== 0) { + process.exit(1); + } +} + +const product = require('../../../product.json'); +const dependencies = product.dependencies || {} as { [name: string]: string; }; + +Object.keys(dependencies).forEach(name => { + const url = dependencies[name]; + npmInstall(url); +}); \ No newline at end of file diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh index c71342fd42c..7236231655d 100755 --- a/build/tfs/darwin/build.sh +++ b/build/tfs/darwin/build.sh @@ -6,6 +6,13 @@ export AZURE_STORAGE_ACCESS_KEY="$2" export AZURE_STORAGE_ACCESS_KEY_2="$3" export MOONCAKE_STORAGE_ACCESS_KEY="$4" export AZURE_DOCUMENTDB_MASTERKEY="$5" +VSO_PAT="$6" + +# Create a .netrc file to download distro dependencies +cat > ~/.netrc < ~/.netrc < Date: Tue, 16 May 2017 18:18:26 +0200 Subject: [PATCH 0484/1164] tfs: fix windows build --- build/tfs/win32/1_build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index d78e1e7131b..1f120965a17 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -12,7 +12,7 @@ $env:HOME=$env:USERPROFILE @" machine monacotools.visualstudio.com password ${vsoPAT} -"@ | Out-File ~/_netrc -Encoding ASCII +"@ | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII STEP "Install dependencies" exec { & .\scripts\npm.bat install } From 46d7ea756c1706e5d1056799063df937276c4be9 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 16 May 2017 18:24:38 +0200 Subject: [PATCH 0485/1164] Fix a couple of issues --- src/vs/base/browser/fastDomNode.ts | 2 +- src/vs/editor/browser/config/configuration.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/base/browser/fastDomNode.ts b/src/vs/base/browser/fastDomNode.ts index ce9561984d4..ee1dd6cd58f 100644 --- a/src/vs/base/browser/fastDomNode.ts +++ b/src/vs/base/browser/fastDomNode.ts @@ -40,7 +40,7 @@ export abstract class FastDomNode { this._fontWeight = ''; this._fontSize = -1; this._lineHeight = -1; - this._letterSpacing = -1; + this._letterSpacing = -100; this._className = ''; this._display = ''; this._position = ''; diff --git a/src/vs/editor/browser/config/configuration.ts b/src/vs/editor/browser/config/configuration.ts index c5d2edb1a93..73a05a745c1 100644 --- a/src/vs/editor/browser/config/configuration.ts +++ b/src/vs/editor/browser/config/configuration.ts @@ -285,6 +285,7 @@ export class Configuration extends CommonEditorConfiguration { domNode.style.fontWeight = fontInfo.fontWeight; domNode.style.fontSize = fontInfo.fontSize + 'px'; domNode.style.lineHeight = fontInfo.lineHeight + 'px'; + domNode.style.letterSpacing = fontInfo.letterSpacing + 'px'; } public static applyFontInfo(domNode: FastDomNode, fontInfo: BareFontInfo): void { From b59478b06dbca256699bcd8d6a41e7cd76b75c4a Mon Sep 17 00:00:00 2001 From: Amy Qiu Date: Tue, 16 May 2017 09:56:41 -0700 Subject: [PATCH 0486/1164] Address comments --- src/vs/workbench/parts/search/browser/searchViewlet.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index 560a3d127a0..fcc011c2b73 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -175,7 +175,7 @@ export class SearchViewlet extends Viewlet { const exclusionsUsePattern = this.viewletSettings['query.exclusionsUsePattern']; const includesUsePattern = this.viewletSettings['query.includesUsePattern']; const patternIncludes = this.viewletSettings['query.folderIncludes'] || ''; - const userExtended = this.viewletSettings['query.userExtended'] || ''; + const queryDetailsExpanded = this.viewletSettings['query.queryDetailsExpanded'] || ''; const useIgnoreFiles = typeof this.viewletSettings['query.useIgnoreFiles'] === 'boolean' ? this.viewletSettings['query.useIgnoreFiles'] : this.configurationService.getConfiguration().search.useIgnoreFilesByDefault; @@ -269,7 +269,7 @@ export class SearchViewlet extends Viewlet { this.actionRegistry[action.id] = action; }); - if (filePatterns !== '' || patternExclusions !== '' || patternIncludes !== '' || userExtended !== '') { + if (filePatterns !== '' || patternExclusions !== '' || patternIncludes !== '' || queryDetailsExpanded !== '') { this.toggleQueryDetails(true, true, true); } @@ -850,7 +850,7 @@ export class SearchViewlet extends Viewlet { let cls = 'more'; show = typeof show === 'undefined' ? !dom.hasClass(this.queryDetails, cls) : Boolean(show); - this.viewletSettings['query.userExtended'] = show; + this.viewletSettings['query.queryDetailsExpanded'] = show; skipLayout = Boolean(skipLayout); if (show) { From 6885b84099e60f8a8c5ce2ff1bf5f80ac29c43a2 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 16 May 2017 18:57:51 +0200 Subject: [PATCH 0487/1164] tfs: fix dependencies --- build/gulpfile.vscode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index b000df8c87a..fa65e2a782a 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -275,7 +275,7 @@ function packageTask(platform, arch, opts) { .pipe(util.cleanNodeModule('gc-signals', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node', 'src/index.js'])) .pipe(util.cleanNodeModule('v8-profiler', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node', 'src/index.js'])) .pipe(util.cleanNodeModule('node-pty', ['binding.gyp', 'build/**', 'src/**', 'tools/**'], ['build/Release/**'])) - .pipe(util.cleanNodeModule('vsda', ['**'], ['package.json', 'index.js', '**/*.node'])); + .pipe(util.cleanNodeModule('vsda', ['binding.gyp', 'build/**', '*.bat', '*.sh', '*.cpp', '*.h'], ['**/*.node'])); let all = es.merge( packageJsonStream, From 784770efea5948693d651652f06f9dab6e0e5cb7 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Tue, 16 May 2017 10:24:05 -0700 Subject: [PATCH 0488/1164] Quick link and embedded editor background color (fixes #25798) --- .../page/electron-browser/welcomePage.css | 18 -------- .../page/electron-browser/welcomePage.ts | 20 +++++++- .../electron-browser/walkThroughPart.css | 15 ------ .../electron-browser/walkThroughPart.ts | 46 ++++++------------- .../walkThrough/node/walkThroughUtils.ts | 25 ++++++++++ 5 files changed, 59 insertions(+), 65 deletions(-) create mode 100644 src/vs/workbench/parts/welcome/walkThrough/node/walkThroughUtils.ts diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css index 4c76f3ef4c2..49de2c1751e 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css +++ b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css @@ -209,12 +209,8 @@ .monaco-workbench > .part.editor > .content .welcomePage .commands li button { color: #6c6c6c; - background:rgba(0,0,0,.04); border: none; } -.monaco-workbench > .part.editor > .content .welcomePage .commands li button:hover { - background:rgba(0,0,0,.10); -} .vs-dark .monaco-workbench > .part.editor > .content .welcomePage .commands li button > h3 { color: #ccc; @@ -226,19 +222,6 @@ .vs-dark .monaco-workbench > .part.editor > .content .welcomePage .commands li button { color: #828282; - background: rgba(0, 0, 0, .2); -} - -.vs-dark .monaco-workbench > .part.editor > .content .welcomePage .commands li button:hover { - background: rgba(200, 235, 255, .072); -} - -.vs-dark .monaco-workbench > .part.editor > .content .welcomePageContainer.extra-dark .commands li button { - background: rgba(200, 235, 255, .042); -} - -.vs-dark .monaco-workbench > .part.editor > .content .welcomePageContainer.extra-dark .commands li button:hover { - background: rgba(200, 235, 255, .072); } .monaco-workbench > .part.editor > .content .welcomePage .commands li button:focus { @@ -248,7 +231,6 @@ .hc-black .monaco-workbench > .part.editor > .content .welcomePage .commands li button { color: white; - background: black; border-color: #f38518; border-width: 1px; border-style: solid; diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts index 8c760ab3502..bc6be38608d 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts +++ b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts @@ -33,8 +33,10 @@ import { used } from 'vs/workbench/parts/welcome/page/electron-browser/vs_code_w import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { tildify } from 'vs/base/common/labels'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; import { isLinux } from 'vs/base/common/platform'; +import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { registerColor } from 'vs/platform/theme/common/colorRegistry'; +import { getExtraColor } from 'vs/workbench/parts/welcome/walkThrough/node/walkThroughUtils'; used(); @@ -361,3 +363,19 @@ class WelcomePage { this.disposables = dispose(this.disposables); } } + +// theming + +const quickLinkBackground = registerColor('welcomePage.quickLinkBackground', { dark: null, light: null, hc: null }, localize('welcomePage.quickLinkBackground', 'Background color for the quick links on the Welcome page.')); +const quickLinkHoverBackground = registerColor('welcomePage.quickLinkHoverBackground', { dark: null, light: null, hc: null }, localize('welcomePage.quickLinkHoverBackground', 'Hover background color for the quick links on the Welcome page.')); + +registerThemingParticipant((theme, collector) => { + const color = getExtraColor(theme, quickLinkBackground, { dark: 'rgba(0, 0, 0, .2)', extra_dark: 'rgba(200, 235, 255, .042)', light: 'rgba(0,0,0,.04)', hc: 'black' }); + if (color) { + collector.addRule(`.monaco-workbench > .part.editor > .content .welcomePage .commands li button { background: ${color}; }`); + } + const hover = getExtraColor(theme, quickLinkHoverBackground, { dark: 'rgba(200, 235, 255, .072)', extra_dark: 'rgba(200, 235, 255, .072)', light: 'rgba(0,0,0,.10)', hc: null }); + if (hover) { + collector.addRule(`.monaco-workbench > .part.editor > .content .welcomePage .commands li button:hover { background: ${hover}; }`); + } +}); diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css index a10262088f1..baaf1f3ceed 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css @@ -161,21 +161,6 @@ display: initial; } -.vs .monaco-workbench > .part.editor > .content .walkThroughContent .monaco-editor-background, -.vs .monaco-workbench > .part.editor > .content .walkThroughContent .glyph-margin { - background:rgba(0,0,0,.08); -} - -.vs-dark .monaco-workbench > .part.editor > .content .walkThroughContent .monaco-editor-background, -.vs-dark .monaco-workbench > .part.editor > .content .walkThroughContent .glyph-margin { - background: rgba(0, 0, 0, .4); -} - -.vs-dark .monaco-workbench > .part.editor > .content .walkThroughContent.extra-dark .monaco-editor-background, -.vs-dark .monaco-workbench > .part.editor > .content .walkThroughContent.extra-dark .glyph-margin { - background: rgba(200, 235, 255, .064); -} - .hc-black .monaco-workbench > .part.editor > .content .walkThroughContent .monaco-editor { border: 1px white solid } diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts index 1c94c56a9ec..1db49ecead1 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts @@ -37,9 +37,9 @@ import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService' import { Parts, IPartService } from 'vs/workbench/services/part/common/partService'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IMessageService, Severity } from 'vs/platform/message/common/message'; -import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; -import { editorBackground } from 'vs/platform/theme/common/colorRegistry'; -import { Themable } from 'vs/workbench/common/theme'; +import { IThemeService, ITheme, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { registerColor } from 'vs/platform/theme/common/colorRegistry'; +import { getExtraColor } from 'vs/workbench/parts/welcome/walkThrough/node/walkThroughUtils'; export const WALK_THROUGH_FOCUS = new RawContextKey('interactivePlaygroundFocus', false); @@ -81,27 +81,6 @@ class WalkThroughCodeEditor extends CodeEditor { } } -class WalkThroughTheming extends Themable { - - constructor( - themeService: IThemeService, - private container: HTMLElement - ) { - super(themeService); - this.update(themeService.getTheme()); - } - - protected onThemeChange(theme: ITheme): void { - super.onThemeChange(theme); - this.update(theme); - } - - private update(theme: ITheme): void { - const background = theme.getColor(editorBackground); - this.container.classList.toggle('extra-dark', background.getLuminosity() < 0.004); - } -} - export class WalkThroughPart extends BaseEditor { static ID: string = 'workbench.editor.walkThroughPart'; @@ -329,7 +308,6 @@ export class WalkThroughPart extends BaseEditor { if (!strings.endsWith(input.getResource().path, '.md')) { this.content.innerHTML = content; this.updateSizeClasses(); - this.addThemeListener(); this.decorateContent(); if (input.onReady) { input.onReady(this.content.firstElementChild as HTMLElement); @@ -429,7 +407,6 @@ export class WalkThroughPart extends BaseEditor { })); }); this.updateSizeClasses(); - this.addThemeListener(); if (input.onReady) { input.onReady(innerContent); } @@ -458,11 +435,6 @@ export class WalkThroughPart extends BaseEditor { }; } - private addThemeListener() { - const innerContent = this.content.firstElementChild as HTMLElement; - this.contentDisposables.push(new WalkThroughTheming(this.themeService, innerContent)); - } - private style(theme: ITheme, div: HTMLElement) { const styleElement = this.partService.getContainer(Parts.EDITOR_PART); // TODO@theme styles should come in via theme registry const { color, backgroundColor, fontFamily, fontWeight, fontSize } = window.getComputedStyle(styleElement); @@ -552,3 +524,15 @@ export class WalkThroughPart extends BaseEditor { super.dispose(); } } + +// theming + +const embeddedEditorBackground = registerColor('walkThrough.embeddedEditorBackground', { dark: null, light: null, hc: null }, localize('walkThrough.embeddedEditorBackground', 'Background color for the embedded editors on the Interactive Playground.')); + +registerThemingParticipant((theme, collector) => { + const color = getExtraColor(theme, embeddedEditorBackground, { dark: 'rgba(0, 0, 0, .4)', extra_dark: 'rgba(200, 235, 255, .064)', light: 'rgba(0,0,0,.08)', hc: null }); + if (color) { + collector.addRule(`.monaco-workbench > .part.editor > .content .walkThroughContent .monaco-editor-background, + .monaco-workbench > .part.editor > .content .walkThroughContent .margin-view-overlays { background: ${color}; }`); + } +}); \ No newline at end of file diff --git a/src/vs/workbench/parts/welcome/walkThrough/node/walkThroughUtils.ts b/src/vs/workbench/parts/welcome/walkThrough/node/walkThroughUtils.ts new file mode 100644 index 00000000000..00d03ceace0 --- /dev/null +++ b/src/vs/workbench/parts/welcome/walkThrough/node/walkThroughUtils.ts @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { ITheme } from 'vs/platform/theme/common/themeService'; +import { editorBackground, ColorDefaults, ColorValue } from 'vs/platform/theme/common/colorRegistry'; + +export function getExtraColor(theme: ITheme, colorId: string, defaults: ColorDefaults & { extra_dark: string }): ColorValue { + const color = theme.getColor(colorId); + if (color) { + return color; + } + + if (theme.type === 'dark') { + const background = theme.getColor(editorBackground); + if (background && background.getLuminosity() < 0.004) { + return defaults.extra_dark; + } + } + + return defaults[theme.type]; +} \ No newline at end of file From c30b023538bd2afb12ccee7c613453614e30e48b Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 16 May 2017 10:31:29 -0700 Subject: [PATCH 0489/1164] Add support for terminal scrollbar active theme color --- .../parts/terminal/electron-browser/terminalInstance.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 2aec4c85834..b7e6f6a378f 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -30,7 +30,7 @@ import { TerminalConfigHelper } from 'vs/workbench/parts/terminal/electron-brows import { TerminalLinkHandler } from 'vs/workbench/parts/terminal/electron-browser/terminalLinkHandler'; import { TerminalWidgetManager } from 'vs/workbench/parts/terminal/browser/terminalWidgetManager'; import { registerThemingParticipant, ITheme, ICssStyleCollector } from "vs/platform/theme/common/themeService"; -import { scrollbarSliderBackground, scrollbarSliderHoverBackground } from "vs/platform/theme/common/colorRegistry"; +import { scrollbarSliderBackground, scrollbarSliderHoverBackground, scrollbarSliderActiveBackground } from "vs/platform/theme/common/colorRegistry"; /** The amount of time to consider terminal errors to be related to the launch */ const LAUNCHING_DURATION = 500; @@ -765,4 +765,9 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { if (scrollbarSliderHoverBackgroundColor) { collector.addRule(`.monaco-workbench .panel.integrated-terminal .xterm .xterm-viewport::-webkit-scrollbar-thumb:hover { background-color: ${scrollbarSliderHoverBackgroundColor}; }`); } + + const scrollbarSliderActiveBackgroundColor = theme.getColor(scrollbarSliderActiveBackground); + if (scrollbarSliderActiveBackgroundColor) { + collector.addRule(`.monaco-workbench .panel.integrated-terminal .xterm .xterm-viewport::-webkit-scrollbar-thumb:active { background-color: ${scrollbarSliderActiveBackgroundColor}; }`); + } }); \ No newline at end of file From 9009c7e5d4c455e70f82529675b5276f55df5918 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Tue, 16 May 2017 10:31:55 -0700 Subject: [PATCH 0490/1164] Clean up --- .../electron-browser/walkThroughPart.ts | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts index 1db49ecead1..fc6f2c76630 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts @@ -34,10 +34,10 @@ import { once } from 'vs/base/common/event'; import { isObject } from 'vs/base/common/types'; import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/commands'; import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService'; -import { Parts, IPartService } from 'vs/workbench/services/part/common/partService'; +import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IMessageService, Severity } from 'vs/platform/message/common/message'; -import { IThemeService, ITheme, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { registerColor } from 'vs/platform/theme/common/colorRegistry'; import { getExtraColor } from 'vs/workbench/parts/welcome/walkThrough/node/walkThroughUtils'; @@ -328,8 +328,6 @@ export class WalkThroughPart extends BaseEditor { innerContent.classList.add('walkThroughContent'); // only for markdown files const markdown = this.expandMacros(content); innerContent.innerHTML = marked(markdown, { renderer }); - this.style(this.themeService.getTheme(), innerContent); - this.contentDisposables.push(this.themeService.onThemeChange(theme => this.style(theme, innerContent))); this.content.appendChild(innerContent); model.snippets.forEach((snippet, i) => { @@ -435,16 +433,6 @@ export class WalkThroughPart extends BaseEditor { }; } - private style(theme: ITheme, div: HTMLElement) { - const styleElement = this.partService.getContainer(Parts.EDITOR_PART); // TODO@theme styles should come in via theme registry - const { color, backgroundColor, fontFamily, fontWeight, fontSize } = window.getComputedStyle(styleElement); - div.style.color = color; - div.style.backgroundColor = backgroundColor; - div.style.fontFamily = fontFamily; - div.style.fontWeight = fontWeight; - div.style.fontSize = fontSize; - } - private expandMacros(input: string) { return input.replace(/kb\(([a-z.\d\-]+)\)/gi, (match: string, kb: string) => { const keybinding = this.keybindingService.lookupKeybinding(kb); From ebb5c05734e180d6ba75e78c26ba1e1ca474a2f4 Mon Sep 17 00:00:00 2001 From: Fernando Tolentino Date: Tue, 16 May 2017 15:32:12 -0300 Subject: [PATCH 0491/1164] using json-parser to get existing recommendations --- .../configuration-editing/src/extension.ts | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/extensions/configuration-editing/src/extension.ts b/extensions/configuration-editing/src/extension.ts index 78b855feb81..92a3075f8b3 100644 --- a/extensions/configuration-editing/src/extension.ts +++ b/extensions/configuration-editing/src/extension.ts @@ -6,7 +6,7 @@ 'use strict'; import * as vscode from 'vscode'; -import { getLocation, visit } from 'jsonc-parser'; +import { getLocation, visit, parse } from 'jsonc-parser'; import * as path from 'path'; import { SettingsDocument } from './settingsDocumentHelper'; @@ -70,15 +70,17 @@ function registerExtensionsCompletions(): vscode.Disposable { const location = getLocation(document.getText(), document.offsetAt(position)); const range = document.getWordRangeAtPosition(position) || new vscode.Range(position, position); if (location.path[0] === 'recommendations') { - const config = vscode.workspace && vscode.workspace.getConfiguration('extensions.json'); - const alreadyEnteredExtensions = config.get('recommendations') || []; - return vscode.extensions.all - .filter(e => !( - e.id.startsWith('vscode.') - || e.id === 'Microsoft.vscode-markdown' - || alreadyEnteredExtensions.indexOf(e.id) > -1 - )) - .map(e => newSimpleCompletionItem(e.id, range, undefined, '"' + e.id + '"')); + const config = parse(document.getText()); + const alreadyEnteredExtensions = config && config.recommendations || []; + if (Array.isArray(alreadyEnteredExtensions)) { + return vscode.extensions.all + .filter(e => !( + e.id.startsWith('vscode.') + || e.id === 'Microsoft.vscode-markdown' + || alreadyEnteredExtensions.indexOf(e.id) > -1 + )) + .map(e => newSimpleCompletionItem(e.id, range, undefined, '"' + e.id + '"')); + } } return []; } From 794ac6074f34dbc3405c611135e6510e0689b241 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 16 May 2017 21:49:32 +0200 Subject: [PATCH 0492/1164] tfs: clean vsda --- build/gulpfile.vscode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index fa65e2a782a..e51fa9c2ec2 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -275,7 +275,7 @@ function packageTask(platform, arch, opts) { .pipe(util.cleanNodeModule('gc-signals', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node', 'src/index.js'])) .pipe(util.cleanNodeModule('v8-profiler', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node', 'src/index.js'])) .pipe(util.cleanNodeModule('node-pty', ['binding.gyp', 'build/**', 'src/**', 'tools/**'], ['build/Release/**'])) - .pipe(util.cleanNodeModule('vsda', ['binding.gyp', 'build/**', '*.bat', '*.sh', '*.cpp', '*.h'], ['**/*.node'])); + .pipe(util.cleanNodeModule('vsda', ['binding.gyp', 'README.md', 'build/**', '*.bat', '*.sh', '*.cpp', '*.h'], ['build/Release/vsda.node'])); let all = es.merge( packageJsonStream, From bb44d4386b631444191a961d7b41d5326bcb9bdf Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 16 May 2017 11:33:06 -0700 Subject: [PATCH 0493/1164] Remove linkedmap --- .../src/features/bufferSyncSupport.ts | 54 ++---- .../typescript/src/features/linkedMap.ts | 168 ------------------ 2 files changed, 15 insertions(+), 207 deletions(-) delete mode 100644 extensions/typescript/src/features/linkedMap.ts diff --git a/extensions/typescript/src/features/bufferSyncSupport.ts b/extensions/typescript/src/features/bufferSyncSupport.ts index 83d5b98b775..2c1b414723d 100644 --- a/extensions/typescript/src/features/bufferSyncSupport.ts +++ b/extensions/typescript/src/features/bufferSyncSupport.ts @@ -7,11 +7,10 @@ import * as cp from 'child_process'; import * as fs from 'fs'; -import { workspace, window, TextDocument, TextDocumentChangeEvent, TextDocumentContentChangeEvent, Disposable, MessageItem } from 'vscode'; +import { workspace, window, TextDocument, TextDocumentChangeEvent, TextDocumentContentChangeEvent, Disposable, MessageItem, Uri, commands } from 'vscode'; import * as Proto from '../protocol'; import { ITypescriptServiceClient } from '../typescriptService'; import { Delayer } from '../utils/async'; -import LinkedMap from './linkedMap'; import * as nls from 'vscode-nls'; let localize = nls.loadMessageBundle(); @@ -29,17 +28,12 @@ const Mode2ScriptKind: ObjectMap<'TS' | 'JS' | 'TSX' | 'JSX'> = { class SyncedBuffer { - private document: TextDocument; - private filepath: string; - private diagnosticRequestor: IDiagnosticRequestor; - private client: ITypescriptServiceClient; - - constructor(document: TextDocument, filepath: string, diagnosticRequestor: IDiagnosticRequestor, client: ITypescriptServiceClient) { - this.document = document; - this.filepath = filepath; - this.diagnosticRequestor = diagnosticRequestor; - this.client = client; - } + constructor( + private readonly document: TextDocument, + private readonly filepath: string, + private readonly diagnosticRequestor: IDiagnosticRequestor, + private readonly client: ITypescriptServiceClient + ) { } public open(): void { const args: Proto.OpenRequestArgs = { @@ -66,23 +60,22 @@ class SyncedBuffer { } public close(): void { - let args: Proto.FileRequestArgs = { + const args: Proto.FileRequestArgs = { file: this.filepath }; this.client.execute('close', args, false); } - onContentChanged(events: TextDocumentContentChangeEvent[]): void { - let filePath = this.client.normalizePath(this.document.uri); + public onContentChanged(events: TextDocumentContentChangeEvent[]): void { + const filePath = this.client.normalizePath(this.document.uri); if (!filePath) { return; } - for (let i = 0; i < events.length; i++) { - let event = events[i]; - let range = event.range; - let text = event.text; - let args: Proto.ChangeRequestArgs = { + for (const event of events) { + const range = event.range; + const text = event.text; + const args: Proto.ChangeRequestArgs = { file: filePath, line: range.start.line + 1, offset: range.start.character + 1, @@ -115,7 +108,6 @@ export default class BufferSyncSupport { private pendingDiagnostics: { [key: string]: number; }; private diagnosticDelayer: Delayer; - private emitQueue: LinkedMap; private checkGlobalTSCVersion: boolean; constructor(client: ITypescriptServiceClient, modeIds: string[], diagnostics: Diagnostics, validate: boolean = true) { @@ -131,7 +123,6 @@ export default class BufferSyncSupport { this.diagnosticDelayer = new Delayer(300); this.syncedBuffers = Object.create(null); - this.emitQueue = new LinkedMap(); const tsConfig = workspace.getConfiguration('typescript'); this.checkGlobalTSCVersion = client.checkGlobalTSCVersion && this.modeIds['typescript'] === true && tsConfig.get(checkTscVersionSettingKey, true); @@ -297,21 +288,6 @@ export default class BufferSyncSupport { id: number; } - function openUrl(url: string) { - let cmd: string; - switch (process.platform) { - case 'darwin': - cmd = 'open'; - break; - case 'win32': - cmd = 'start'; - break; - default: - cmd = 'xdg-open'; - } - return cp.exec(cmd + ' ' + url); - } - let tscVersion: string | undefined = undefined; try { let out = cp.execSync('tsc --version', { encoding: 'utf8' }); @@ -345,7 +321,7 @@ export default class BufferSyncSupport { } switch (selected.id) { case 1: - openUrl('http://go.microsoft.com/fwlink/?LinkId=826239'); + commands.executeCommand('vscode.open', Uri.parse('http://go.microsoft.com/fwlink/?LinkId=826239')); break; case 2: const tsConfig = workspace.getConfiguration('typescript'); diff --git a/extensions/typescript/src/features/linkedMap.ts b/extensions/typescript/src/features/linkedMap.ts deleted file mode 100644 index 9f0a41a02bb..00000000000 --- a/extensions/typescript/src/features/linkedMap.ts +++ /dev/null @@ -1,168 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -interface Item { - previous: Item | undefined; - next: Item | undefined; - key: string; - value: T; -} - -export default class LinkedMap { - - private map: ObjectMap>; - private head: Item | undefined; - private tail: Item | undefined; - private _length: number; - - constructor() { - this.map = Object.create(null); - this.head = undefined; - this.tail = undefined; - this._length = 0; - } - - public isEmpty(): boolean { - return !this.head && !this.tail; - } - - public length(): number { - return this._length; - } - - public get(key: string): T | undefined { - const item = this.map[key]; - if (!item) { - return undefined; - } - return item.value; - } - - public add(key: string, value: T, touch = false): void { - let item = this.map[key]; - if (item) { - item.value = value; - if (touch) { - this.touch(item); - } - } - else { - item = { key, value, next: undefined, previous: undefined }; - if (touch) { - this.addItemFirst(item); - } - else { - this.addItemLast(item); - } - this.map[key] = item; - this._length++; - } - } - - public remove(key: string): T | undefined { - const item = this.map[key]; - if (!item) { - return undefined; - } - delete this.map[key]; - this.removeItem(item); - this._length--; - return item.value; - } - - public shift(): T | undefined { - if (!this.head && !this.tail) { - return undefined; - } - if (!this.head || !this.tail) { - throw new Error('Invalid list'); - } - const item = this.head; - delete this.map[item.key]; - this.removeItem(item); - this._length--; - return item.value; - } - - private addItemFirst(item: Item): void { - // First time Insert - if (!this.head && !this.tail) { - this.tail = item; - } else if (!this.head) { - throw new Error('Invalid list'); - } else { - item.next = this.head; - this.head.previous = item; - } - this.head = item; - } - - private addItemLast(item: Item): void { - // First time Insert - if (!this.head && !this.tail) { - this.head = item; - } else if (!this.tail) { - throw new Error('Invalid list'); - } else { - item.previous = this.tail; - this.tail.next = item; - } - this.tail = item; - } - - private removeItem(item: Item): void { - if (item === this.head && item === this.tail) { - this.head = undefined; - this.tail = undefined; - } - else if (item === this.head) { - this.head = item.next; - } - else if (item === this.tail) { - this.tail = item.previous; - } - else { - const next = item.next; - const previous = item.previous; - if (!next || !previous) { - throw new Error('Invalid list'); - } - next.previous = previous; - previous.next = next; - } - } - - private touch(item: Item): void { - if (item === this.head) { - return; - } - - const next = item.next; - const previous = item.previous; - - // Unlink the item - if (item === this.tail) { - this.tail = previous; - } - else { - // Both next and previous are not null since item was neither head nor tail. - if (next) { - next.previous = previous; - } - if (previous) { - previous.next = next; - } - } - - // Insert the node at head - item.previous = undefined; - item.next = this.head; - if (!this.head) { - throw new Error('Invalid list'); - } - this.head.previous = item; - this.head = item; - } -} From 8786a903f0ab92a4dc6640ff511ab28fc53f6a03 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 16 May 2017 11:58:42 -0700 Subject: [PATCH 0494/1164] use Switch instead of map for looking up modes --- .../src/features/bufferSyncSupport.ts | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/extensions/typescript/src/features/bufferSyncSupport.ts b/extensions/typescript/src/features/bufferSyncSupport.ts index 2c1b414723d..f0928f2c127 100644 --- a/extensions/typescript/src/features/bufferSyncSupport.ts +++ b/extensions/typescript/src/features/bufferSyncSupport.ts @@ -19,12 +19,15 @@ interface IDiagnosticRequestor { requestDiagnostic(filepath: string): void; } -const Mode2ScriptKind: ObjectMap<'TS' | 'JS' | 'TSX' | 'JSX'> = { - 'typescript': 'TS', - 'typescriptreact': 'TSX', - 'javascript': 'JS', - 'javascriptreact': 'JSX' -}; +function mode2ScriptKind(mode: string): 'TS' | 'TSX' | 'JS' | 'JSX' | undefined { + switch (mode) { + case 'typescript': return 'TS'; + case 'typescriptreact': return 'TSX'; + case 'javascript': return 'JS'; + case 'javascriptreact': return 'JSX'; + } + return undefined; +} class SyncedBuffer { @@ -42,7 +45,7 @@ class SyncedBuffer { }; if (this.client.apiVersion.has203Features()) { - const scriptKind = Mode2ScriptKind[this.document.languageId]; + const scriptKind = mode2ScriptKind(this.document.languageId); if (scriptKind) { args.scriptKindName = scriptKind; } @@ -104,8 +107,6 @@ export default class BufferSyncSupport { private disposables: Disposable[] = []; private syncedBuffers: ObjectMap; - private projectValidationRequested: boolean; - private pendingDiagnostics: { [key: string]: number; }; private diagnosticDelayer: Delayer; private checkGlobalTSCVersion: boolean; @@ -117,8 +118,6 @@ export default class BufferSyncSupport { this.diagnostics = diagnostics; this._validate = validate; - this.projectValidationRequested = false; - this.pendingDiagnostics = Object.create(null); this.diagnosticDelayer = new Delayer(300); From 53b18c79e792d8f10d4245162c728986b3f2b76b Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 16 May 2017 12:48:11 -0700 Subject: [PATCH 0495/1164] Mark some buffersync members readonly --- .../src/features/bufferSyncSupport.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/extensions/typescript/src/features/bufferSyncSupport.ts b/extensions/typescript/src/features/bufferSyncSupport.ts index f0928f2c127..9372c7e4074 100644 --- a/extensions/typescript/src/features/bufferSyncSupport.ts +++ b/extensions/typescript/src/features/bufferSyncSupport.ts @@ -99,22 +99,21 @@ export interface Diagnostics { const checkTscVersionSettingKey = 'check.tscVersion'; export default class BufferSyncSupport { - private client: ITypescriptServiceClient; + private readonly client: ITypescriptServiceClient; private _validate: boolean; - private modeIds: ObjectMap; + private readonly modeIds: Set; private diagnostics: Diagnostics; - private disposables: Disposable[] = []; - private syncedBuffers: ObjectMap; + private readonly disposables: Disposable[] = []; + private readonly syncedBuffers: ObjectMap; private pendingDiagnostics: { [key: string]: number; }; - private diagnosticDelayer: Delayer; + private readonly diagnosticDelayer: Delayer; private checkGlobalTSCVersion: boolean; constructor(client: ITypescriptServiceClient, modeIds: string[], diagnostics: Diagnostics, validate: boolean = true) { this.client = client; - this.modeIds = Object.create(null); - modeIds.forEach(modeId => this.modeIds[modeId] = true); + this.modeIds = new Set(modeIds); this.diagnostics = diagnostics; this._validate = validate; @@ -124,7 +123,7 @@ export default class BufferSyncSupport { this.syncedBuffers = Object.create(null); const tsConfig = workspace.getConfiguration('typescript'); - this.checkGlobalTSCVersion = client.checkGlobalTSCVersion && this.modeIds['typescript'] === true && tsConfig.get(checkTscVersionSettingKey, true); + this.checkGlobalTSCVersion = client.checkGlobalTSCVersion && this.modeIds.has('typescript') === true && tsConfig.get(checkTscVersionSettingKey, true); } public listen(): void { @@ -163,7 +162,7 @@ export default class BufferSyncSupport { } private onDidOpenTextDocument(document: TextDocument): void { - if (!this.modeIds[document.languageId]) { + if (!this.modeIds.has(document.languageId)) { return; } let resource = document.uri; From 604248eebdb33d291edf4f2abc1f083f7d639d23 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 16 May 2017 13:54:01 -0700 Subject: [PATCH 0496/1164] Remove unused Writer type --- .../src/features/bufferSyncSupport.ts | 4 ++-- .../typescript/src/utils/wireProtocol.ts | 21 ------------------- 2 files changed, 2 insertions(+), 23 deletions(-) diff --git a/extensions/typescript/src/features/bufferSyncSupport.ts b/extensions/typescript/src/features/bufferSyncSupport.ts index 9372c7e4074..dfb32d759da 100644 --- a/extensions/typescript/src/features/bufferSyncSupport.ts +++ b/extensions/typescript/src/features/bufferSyncSupport.ts @@ -103,7 +103,7 @@ export default class BufferSyncSupport { private _validate: boolean; private readonly modeIds: Set; - private diagnostics: Diagnostics; + private readonly diagnostics: Diagnostics; private readonly disposables: Disposable[] = []; private readonly syncedBuffers: ObjectMap; @@ -123,7 +123,7 @@ export default class BufferSyncSupport { this.syncedBuffers = Object.create(null); const tsConfig = workspace.getConfiguration('typescript'); - this.checkGlobalTSCVersion = client.checkGlobalTSCVersion && this.modeIds.has('typescript') === true && tsConfig.get(checkTscVersionSettingKey, true); + this.checkGlobalTSCVersion = client.checkGlobalTSCVersion && this.modeIds.has('typescript') && tsConfig.get(checkTscVersionSettingKey, true); } public listen(): void { diff --git a/extensions/typescript/src/utils/wireProtocol.ts b/extensions/typescript/src/utils/wireProtocol.ts index 0227b3be7e6..b1a4d8a0d89 100644 --- a/extensions/typescript/src/utils/wireProtocol.ts +++ b/extensions/typescript/src/utils/wireProtocol.ts @@ -172,24 +172,3 @@ export class Reader { } } } - -export class Writer { - - private writable: stream.Writable; - - public constructor(writable: stream.Writable) { - this.writable = writable; - } - - public write(msg: T): void { - let json = JSON.stringify(msg); - let buffer: string[] = [ - ContentLength, - Buffer.byteLength(json, 'utf8').toString(), - '\r\n\r\n', - json, - '\r\n' - ]; - this.writable.write(buffer.join(''), 'utf8'); - } -} \ No newline at end of file From 614eaacd5355b77cc2ce2220a9b927e754ecf5cf Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 16 May 2017 22:56:52 +0200 Subject: [PATCH 0497/1164] tfs: fix darwin build --- build/tfs/darwin/build.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh index 7236231655d..ecbcaec27b7 100755 --- a/build/tfs/darwin/build.sh +++ b/build/tfs/darwin/build.sh @@ -33,12 +33,12 @@ STEP() { STEP "Install dependencies" ./scripts/npm.sh install -STEP "Install distro dependencies" -npm run install-distro - STEP "Mix in repository from vscode-distro" npm run gulp -- mixin +STEP "Install distro dependencies" +npm run install-distro + STEP "Build minified & upload source maps" npm run gulp -- --max_old_space_size=4096 vscode-darwin-min upload-vscode-sourcemaps From 087a2d2f2480993f219bcb2a0465dcfd2231e227 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 16 May 2017 14:05:10 -0700 Subject: [PATCH 0498/1164] Default to not updating scroll position if no valid editor is found. Part of #25910 --- extensions/markdown/src/previewContentProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/markdown/src/previewContentProvider.ts b/extensions/markdown/src/previewContentProvider.ts index e1ce84caba3..ef210649e20 100644 --- a/extensions/markdown/src/previewContentProvider.ts +++ b/extensions/markdown/src/previewContentProvider.ts @@ -206,7 +206,7 @@ export class MDDocumentContentProvider implements vscode.TextDocumentContentProv return vscode.workspace.openTextDocument(sourceUri).then(document => { this.config = MarkdownPreviewConfig.getCurrentConfig(); - let initialLine = 0; + let initialLine: number | undefined = undefined; const editor = vscode.window.activeTextEditor; if (editor && editor.document.uri.fsPath === sourceUri.fsPath) { initialLine = editor.selection.active.line; From 418f91d044ab3eda3cff4bda74f70d7313dab762 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Tue, 16 May 2017 23:35:28 +0200 Subject: [PATCH 0499/1164] tfs: better build perf measurements --- build/tfs/common/common.sh | 34 +++++++++++++++++++++ build/tfs/darwin/build.sh | 62 +++++++++++++++----------------------- 2 files changed, 59 insertions(+), 37 deletions(-) create mode 100755 build/tfs/common/common.sh diff --git a/build/tfs/common/common.sh b/build/tfs/common/common.sh new file mode 100755 index 00000000000..d85788664e9 --- /dev/null +++ b/build/tfs/common/common.sh @@ -0,0 +1,34 @@ +#!/bin/bash +set -e + +# set agent specific npm cache +if [ -n "$AGENT_WORKFOLDER" ] +then + export npm_config_cache="$AGENT_WORKFOLDER/npm-cache" + echo "Using npm cache: $npm_config_cache" +fi + +SUMMARY="" +step() { + START=$SECONDS + TASK=$1; shift + echo "" + echo "*****************************************************************************" + echo "Start: $TASK" + echo "*****************************************************************************" + "$@" + DURATION=$(echo "$SECONDS - $START" | bc) + echo "*****************************************************************************" + echo "End: $TASK, $DURATION seconds" + echo "*****************************************************************************" + SUMMARY="$SUMMARY$TASK;$DURATION seconds"$'\n' +} + +done_steps() { + echo "" + echo "Task Summary" + echo "============" + echo "${SUMMARY}" | column -t -s';' +} + +trap done_steps EXIT \ No newline at end of file diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh index ecbcaec27b7..5cafa89f536 100755 --- a/build/tfs/darwin/build.sh +++ b/build/tfs/darwin/build.sh @@ -1,5 +1,6 @@ #!/bin/sh -set -e + +. build/tfs/common/common.sh export VSCODE_MIXIN_PASSWORD="$1" export AZURE_STORAGE_ACCESS_KEY="$2" @@ -14,42 +15,27 @@ machine monacotools.visualstudio.com password $VSO_PAT END -# set agent specific npm cache -if [ -n "$AGENT_WORKFOLDER" ] -then - export npm_config_cache="$AGENT_WORKFOLDER/npm-cache" - echo "Using npm cache: $npm_config_cache" -fi +step "Install dependencies" \ + ./scripts/npm.sh install -# log build step -STEP() { - echo "" - echo "********************************************************************************" - echo "*** $*" - echo "********************************************************************************" - echo "" -} +step "Mix in repository from vscode-distro" \ + npm run gulp -- mixin -STEP "Install dependencies" -./scripts/npm.sh install +step "Install distro dependencies" \ + npm run install-distro -STEP "Mix in repository from vscode-distro" -npm run gulp -- mixin +step "Build minified & upload source maps" \ + npm run gulp -- --max_old_space_size=4096 vscode-darwin-min upload-vscode-sourcemaps -STEP "Install distro dependencies" -npm run install-distro +step "Run unit tests" \ + ./scripts/test.sh --build --reporter dot -STEP "Build minified & upload source maps" -npm run gulp -- --max_old_space_size=4096 vscode-darwin-min upload-vscode-sourcemaps +step "Run integration tests" \ + ./scripts/test-integration.sh -STEP "Run unit tests" -./scripts/test.sh --build --reporter dot - -STEP "Run integration tests" -./scripts/test-integration.sh - -STEP "Install build dependencies" -(cd $BUILD_SOURCESDIRECTORY/build/tfs/common && npm i) +(cd $BUILD_SOURCESDIRECTORY/build/tfs/common && \ + step "Install build dependencies" \ + npm i) REPO=`pwd` ZIP=$REPO/../VSCode-darwin-selfsigned.zip @@ -58,11 +44,13 @@ BUILD=$REPO/../VSCode-darwin PACKAGEJSON=`ls $BUILD/*.app/Contents/Resources/app/package.json` VERSION=`node -p "require(\"$PACKAGEJSON\").version"` -STEP "Create unsigned archive" -( rm -rf $UNSIGNEDZIP ; cd $BUILD && zip -r -X -y $UNSIGNEDZIP * ) +rm -rf $UNSIGNEDZIP +(cd $BUILD && \ + step "Create unsigned archive" \ + zip -r -X -y $UNSIGNEDZIP *) -STEP "Publish unsigned archive" -node build/tfs/common/publish.js $VSCODE_QUALITY darwin archive-unsigned VSCode-darwin-$VSCODE_QUALITY-unsigned.zip $VERSION false $UNSIGNEDZIP +step "Publish unsigned archive" \ + node build/tfs/common/publish.js $VSCODE_QUALITY darwin archive-unsigned VSCode-darwin-$VSCODE_QUALITY-unsigned.zip $VERSION false $UNSIGNEDZIP -STEP "Sign build" -node build/tfs/common/enqueue.js $VSCODE_QUALITY \ No newline at end of file +step "Sign build" \ + node build/tfs/common/enqueue.js $VSCODE_QUALITY \ No newline at end of file From 50ed5aa111e344bd60b168ec271eaf59c9fb7075 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Tue, 16 May 2017 14:59:24 -0700 Subject: [PATCH 0500/1164] Split Quick Links section (fixes #22097) --- src/vs/platform/telemetry/common/telemetry.ts | 2 +- .../telemetry/common/telemetryUtils.ts | 10 +++--- .../electron-browser/vs_code_welcome_page.ts | 35 +++++++++++++------ .../page/electron-browser/welcomePage.ts | 13 +++++-- 4 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/vs/platform/telemetry/common/telemetry.ts b/src/vs/platform/telemetry/common/telemetry.ts index c3f6d2f3650..983743b9205 100644 --- a/src/vs/platform/telemetry/common/telemetry.ts +++ b/src/vs/platform/telemetry/common/telemetry.ts @@ -25,7 +25,7 @@ export interface ITelemetryExperiments { showNewUserWatermark: boolean; openUntitledFile: boolean; enableWelcomePage: boolean; - reorderQuickLinks: boolean; + mergeQuickLinks: boolean; } export interface ITelemetryService { diff --git a/src/vs/platform/telemetry/common/telemetryUtils.ts b/src/vs/platform/telemetry/common/telemetryUtils.ts index 32dca3259a4..e3370d3d865 100644 --- a/src/vs/platform/telemetry/common/telemetryUtils.ts +++ b/src/vs/platform/telemetry/common/telemetryUtils.ts @@ -23,7 +23,7 @@ export const defaultExperiments: ITelemetryExperiments = { showNewUserWatermark: false, openUntitledFile: true, enableWelcomePage: true, - reorderQuickLinks: false, + mergeQuickLinks: false, }; export const NullTelemetryService = { @@ -57,7 +57,7 @@ export function loadExperiments(accessor: ServicesAccessor): ITelemetryExperimen showNewUserWatermark, openUntitledFile, enableWelcomePage, - reorderQuickLinks, + mergeQuickLinks, } = splitExperimentsRandomness(); const newUserDuration = 24 * 60 * 60 * 1000; @@ -72,7 +72,7 @@ export function loadExperiments(accessor: ServicesAccessor): ITelemetryExperimen showNewUserWatermark, openUntitledFile, enableWelcomePage, - reorderQuickLinks, + mergeQuickLinks, }); } @@ -95,13 +95,13 @@ function splitExperimentsRandomness(): ITelemetryExperiments { const random1 = getExperimentsRandomness(); const [random2, showNewUserWatermark] = splitRandom(random1); const [random3, openUntitledFile] = splitRandom(random2); - const [random4, reorderQuickLinks] = splitRandom(random3); + const [random4, mergeQuickLinks] = splitRandom(random3); const [, enableWelcomePage] = splitRandom(random4); return { showNewUserWatermark, openUntitledFile, enableWelcomePage, - reorderQuickLinks, + mergeQuickLinks, }; } diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts b/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts index eb50f1972a1..90c5975cded 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts +++ b/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts @@ -40,6 +40,7 @@ export default () => ` @@ -47,21 +48,33 @@ export default () => `

-

${escape(localize('welcomePage.quickLinks', "Quick links"))}

-
    -
  • -
  • -
  • -
  • -
  • -
  • -
  • -
+ +
  • +
  • + +
    +
    +

    ${escape(localize('welcomePage.learn', "Learn"))}

    +
      +
    • +
    • +
    • +
    +
    + diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts index bc6be38608d..9501600cec0 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts +++ b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts @@ -195,13 +195,22 @@ class WelcomePage { }); }).then(null, onUnexpectedError); - if (this.telemetryService.getExperiments().reorderQuickLinks) { + const customize = container.querySelector('.commands .section.customize'); + const learn = container.querySelector('.commands .section.learn'); + const quickLinks = container.querySelector('.commands .section.quickLinks'); + if (this.telemetryService.getExperiments().mergeQuickLinks) { + const ul = quickLinks.querySelector('ul'); reorderedQuickLinks.forEach(clazz => { const link = container.querySelector(`.commands .${clazz}`); if (link) { - link.parentElement.appendChild(link); + ul.appendChild(link); } }); + customize.remove(); + learn.remove(); + container.querySelector('.keybindingsReferenceLink').remove(); + } else { + quickLinks.remove(); } container.addEventListener('click', event => { From 405271c17d818ff543a0310acea5636fa26246d5 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 16 May 2017 15:42:01 -0700 Subject: [PATCH 0501/1164] Move getting active line out of inner openTextDocument --- extensions/markdown/src/previewContentProvider.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/extensions/markdown/src/previewContentProvider.ts b/extensions/markdown/src/previewContentProvider.ts index ef210649e20..e4265cf9eb0 100644 --- a/extensions/markdown/src/previewContentProvider.ts +++ b/extensions/markdown/src/previewContentProvider.ts @@ -203,15 +203,15 @@ export class MDDocumentContentProvider implements vscode.TextDocumentContentProv public provideTextDocumentContent(uri: vscode.Uri): Thenable { const sourceUri = vscode.Uri.parse(uri.query); + let initialLine: number | undefined = undefined; + const editor = vscode.window.activeTextEditor; + if (editor && editor.document.uri.fsPath === sourceUri.fsPath) { + initialLine = editor.selection.active.line; + } + return vscode.workspace.openTextDocument(sourceUri).then(document => { this.config = MarkdownPreviewConfig.getCurrentConfig(); - let initialLine: number | undefined = undefined; - const editor = vscode.window.activeTextEditor; - if (editor && editor.document.uri.fsPath === sourceUri.fsPath) { - initialLine = editor.selection.active.line; - } - const initialData = { previewUri: uri.toString(), source: sourceUri.toString(), From 17004573e3e4a5cf17a701fcdcf11a028807e471 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 16 May 2017 17:00:43 -0700 Subject: [PATCH 0502/1164] Always Show File Names in Symbol Search Results (#26518) * Fixes #26370 Updates the symbol search results to always display the filename. This feature was previously added to the TS extension specifically, so this change removes that work in favor of a change to the core symbol search experience * Use dash with filename --- .../src/features/workspaceSymbolProvider.ts | 15 ++------------- src/vs/workbench/browser/quickopen.ts | 2 +- .../parts/search/browser/openSymbolHandler.ts | 13 +++++++++---- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/extensions/typescript/src/features/workspaceSymbolProvider.ts b/extensions/typescript/src/features/workspaceSymbolProvider.ts index c8a192726e7..8593c4a8955 100644 --- a/extensions/typescript/src/features/workspaceSymbolProvider.ts +++ b/extensions/typescript/src/features/workspaceSymbolProvider.ts @@ -7,8 +7,6 @@ import { workspace, window, Uri, WorkspaceSymbolProvider, SymbolInformation, SymbolKind, Range, Location, CancellationToken } from 'vscode'; -import * as path from 'path'; - import * as Proto from '../protocol'; import { ITypescriptServiceClient } from '../typescriptService'; @@ -76,17 +74,8 @@ export default class TypeScriptWorkspaceSymbolProvider implements WorkspaceSymbo if (item.kind === 'method' || item.kind === 'function') { label += '()'; } - const containerNameParts: string[] = []; - if (item.containerName) { - containerNameParts.push(item.containerName); - } - const fileUri = this.client.asUrl(item.file); - const fileName = path.basename(fileUri.fsPath); - if (fileName) { - containerNameParts.push(fileName); - } - result.push(new SymbolInformation(label, getSymbolKind(item), containerNameParts.join(' — '), - new Location(fileUri, range))); + result.push(new SymbolInformation(label, getSymbolKind(item), item.containerName || '', + new Location(this.client.asUrl(item.file), range))); } } return result; diff --git a/src/vs/workbench/browser/quickopen.ts b/src/vs/workbench/browser/quickopen.ts index 1281c2e600b..ebb31e7a833 100644 --- a/src/vs/workbench/browser/quickopen.ts +++ b/src/vs/workbench/browser/quickopen.ts @@ -288,7 +288,7 @@ export class EditorQuickOpenEntry extends QuickOpenEntry implements IEditorQuick */ export class EditorQuickOpenEntryGroup extends QuickOpenEntryGroup implements IEditorQuickOpenEntry { - public getInput(): IEditorInput { + public getInput(): IEditorInput | IResourceInput { return null; } diff --git a/src/vs/workbench/parts/search/browser/openSymbolHandler.ts b/src/vs/workbench/parts/search/browser/openSymbolHandler.ts index 842c9461c05..9ac3c54aa86 100644 --- a/src/vs/workbench/parts/search/browser/openSymbolHandler.ts +++ b/src/vs/workbench/parts/search/browser/openSymbolHandler.ts @@ -25,6 +25,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IWorkspaceSymbolProvider, getWorkspaceSymbols } from 'vs/workbench/parts/search/common/search'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { basename } from 'vs/base/common/paths'; class SymbolEntry extends EditorQuickOpenEntry { @@ -50,11 +51,15 @@ class SymbolEntry extends EditorQuickOpenEntry { } public getDescription(): string { - let result = this._bearing.containerName; - if (!result && this._bearing.location.uri) { - result = labels.getPathLabel(this._bearing.location.uri, this._contextService, this._environmentService); + const containerName = this._bearing.containerName; + if (this._bearing.location.uri) { + if (containerName) { + return `${containerName} — ${basename(this._bearing.location.uri.fsPath)}`; + } else { + return labels.getPathLabel(this._bearing.location.uri, this._contextService, this._environmentService); + } } - return result; + return containerName; } public getIcon(): string { From 4514ddd1807ac3b90e65b98da981ab1a8f59f3a0 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 16 May 2017 18:33:22 -0700 Subject: [PATCH 0503/1164] Add option to exclude unique names from suggestion lists in JS files Fixes #26595 **Problem** TS includes all unique names in a file in the completion list for JavaScript files. This is often desirable, but may result in unexpected completions **Fix** Add a new option `javascript.nameSuggestions` to filter these suggestions out. --- extensions/typescript/package.json | 7 ++++++- extensions/typescript/package.nls.json | 3 ++- .../src/features/completionItemProvider.ts | 15 +++++++++++++-- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/extensions/typescript/package.json b/extensions/typescript/package.json index 9526dddcdbd..cb4fa518bf0 100644 --- a/extensions/typescript/package.json +++ b/extensions/typescript/package.json @@ -307,6 +307,11 @@ "type": "boolean", "default": false, "description": "%javascript.implicitProjectConfig.checkJs%" + }, + "javascript.nameSuggestions": { + "type": "boolean", + "default": true, + "description": "%javascript.nameSuggestions%" } } }, @@ -461,4 +466,4 @@ } ] } -} +} \ No newline at end of file diff --git a/extensions/typescript/package.nls.json b/extensions/typescript/package.nls.json index f14b731bdad..faa59a26d7f 100644 --- a/extensions/typescript/package.nls.json +++ b/extensions/typescript/package.nls.json @@ -35,5 +35,6 @@ "typescript.selectTypeScriptVersion.title": "Select TypeScript Version", "jsDocCompletion.enabled": "Enable/disable auto JSDoc comments", "javascript.implicitProjectConfig.checkJs": "Enable/disable semantic checking of JavaScript files. Existing jsconfig.json or tsconfig.json files override this setting. Requires TypeScript >=2.3.1.", - "typescript.check.npmIsInstalled": "Check if NPM is installed for automatic typings acquisition" + "typescript.check.npmIsInstalled": "Check if NPM is installed for automatic typings acquisition", + "javascript.nameSuggestions": "Enable/disable including unique names from the file in JavaScript suggestion lists." } diff --git a/extensions/typescript/src/features/completionItemProvider.ts b/extensions/typescript/src/features/completionItemProvider.ts index f65d27f5009..618c84174bc 100644 --- a/extensions/typescript/src/features/completionItemProvider.ts +++ b/extensions/typescript/src/features/completionItemProvider.ts @@ -128,11 +128,13 @@ class MyCompletionItem extends CompletionItem { } interface Configuration { - useCodeSnippetsOnMethodSuggest?: boolean; + useCodeSnippetsOnMethodSuggest: boolean; + nameSuggestions: boolean; } namespace Configuration { export const useCodeSnippetsOnMethodSuggest = 'useCodeSnippetsOnMethodSuggest'; + export const nameSuggestions = 'nameSuggestions'; } export default class TypeScriptCompletionItemProvider implements CompletionItemProvider { @@ -143,13 +145,19 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP private client: ITypescriptServiceClient, private typingsStatus: TypingsStatus ) { - this.config = { useCodeSnippetsOnMethodSuggest: false }; + this.config = { + useCodeSnippetsOnMethodSuggest: false, + nameSuggestions: true + }; } public updateConfiguration(): void { // Use shared setting for js and ts const typeScriptConfig = workspace.getConfiguration('typescript'); this.config.useCodeSnippetsOnMethodSuggest = typeScriptConfig.get(Configuration.useCodeSnippetsOnMethodSuggest, false); + + const jsConfig = workspace.getConfiguration('javascript'); + this.config.nameSuggestions = jsConfig.get(Configuration.nameSuggestions, true); } public provideCompletionItems(document: TextDocument, position: Position, token: CancellationToken): Promise { @@ -208,6 +216,9 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP } for (const element of body) { + if (element.kind === PConst.Kind.warning && !this.config.nameSuggestions) { + continue; + } const item = new MyCompletionItem(position, document, element, enableDotCompletions, !this.config.useCodeSnippetsOnMethodSuggest); completionItems.push(item); } From 46b81d14de09a5e98ec7d44e5b1d3c3c0bd53d77 Mon Sep 17 00:00:00 2001 From: Yu-Hsin Hung Date: Wed, 17 May 2017 11:43:36 +0800 Subject: [PATCH 0504/1164] Fix for terminal.foreground not working when terminal.background is not set --- .../workbench/parts/terminal/electron-browser/terminalPanel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index 89dcbae71da..7c905e2903d 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -235,7 +235,7 @@ export class TerminalPanel extends Panel { css += `.monaco-workbench .panel.integrated-terminal .terminal-outer-container { background-color: ${bgColor}; }`; } const fgColor = theme.getColor(TERMINAL_FOREGROUND_COLOR); - if (bgColor) { + if (fgColor) { css += `.monaco-workbench .panel.integrated-terminal .xterm { color: ${fgColor}; }`; } From 9843623452cbb9eea0c57e2ccc371b4d2c3c2d37 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 16 May 2017 22:20:12 -0700 Subject: [PATCH 0505/1164] Make TextEditorOptions.fromEditor static (#26779) Refactors TextEditorOptions.fromEditor to a static method instead of an instance method. This method is only called after creation of the options object and currently requires using a weird cast in a few places --- .../browser/parts/editor/editorActions.ts | 7 ++----- .../browser/parts/editor/editorGroupsControl.ts | 3 +-- .../workbench/browser/parts/editor/editorPart.ts | 3 +-- src/vs/workbench/common/editor.ts | 16 +++++++++------- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editorActions.ts b/src/vs/workbench/browser/parts/editor/editorActions.ts index 4419e710283..f7f5e2e9b83 100644 --- a/src/vs/workbench/browser/parts/editor/editorActions.ts +++ b/src/vs/workbench/browser/parts/editor/editorActions.ts @@ -60,8 +60,7 @@ export class SplitEditorAction extends Action { let options: EditorOptions; const codeEditor = getCodeEditor(editorToSplit); if (codeEditor) { - options = new TextEditorOptions(); - (options).fromEditor(codeEditor); + options = TextEditorOptions.fromEditor(codeEditor); } else { options = new EditorOptions(); } @@ -317,9 +316,7 @@ export abstract class BaseFocusSideGroupAction extends Action { let options: EditorOptions; const codeEditor = getCodeEditor(referenceEditor); if (codeEditor) { - options = new TextEditorOptions(); - options.pinned = true; - (options).fromEditor(codeEditor); + options = TextEditorOptions.fromEditor(codeEditor, { pinned: true }); } else { options = EditorOptions.create({ pinned: true }); } diff --git a/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts b/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts index ea8e7c92f96..dea7059b171 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts @@ -1054,8 +1054,7 @@ export class EditorGroupsControl extends Themable implements IEditorGroupsContro const activeEditor = $this.editorService.getActiveEditor(); const editor = getCodeEditor(activeEditor); if (editor && activeEditor.position === stacks.positionOfGroup(identifier.group) && identifier.editor.matches(activeEditor.input)) { - options = TextEditorOptions.create({ pinned: true }); - (options).fromEditor(editor); + options = TextEditorOptions.fromEditor(editor, { pinned: true }); } return options; diff --git a/src/vs/workbench/browser/parts/editor/editorPart.ts b/src/vs/workbench/browser/parts/editor/editorPart.ts index bcddcea6c57..be76d1a4ff6 100644 --- a/src/vs/workbench/browser/parts/editor/editorPart.ts +++ b/src/vs/workbench/browser/parts/editor/editorPart.ts @@ -878,8 +878,7 @@ export class EditorPart extends Part implements IEditorPart, IEditorGroupService const activeEditor = this.getActiveEditor(); const codeEditor = getCodeEditor(activeEditor); if (codeEditor && activeEditor.position === this.stacks.positionOfGroup(fromGroup) && input.matches(activeEditor.input)) { - options = TextEditorOptions.create({ pinned: true, index, inactive, preserveFocus }); - (options).fromEditor(codeEditor); + options = TextEditorOptions.fromEditor(codeEditor, { pinned: true, index, inactive, preserveFocus }); } // A move to another group is an open first... diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index 8636bc66ef0..12cf8f3ea74 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -685,24 +685,26 @@ export class TextEditorOptions extends EditorOptions { } /** - * Sets the view state to be used when the editor is opening. + * Create a TextEditorOptions inline to be used when the editor is opening. */ - public fromEditor(editor: IEditor): void { + public static fromEditor(editor: IEditor, settings?: IEditorOptions): TextEditorOptions { + const options = TextEditorOptions.create(settings); // View state - this.editorViewState = editor.saveViewState(); + options.editorViewState = editor.saveViewState(); // Selected editor options const codeEditor = editor; if (typeof codeEditor.getConfiguration === 'function') { const config = codeEditor.getConfiguration(); if (config && config.viewInfo && config.wrappingInfo) { - this.editorOptions = Object.create(null); - this.editorOptions.renderWhitespace = config.viewInfo.renderWhitespace; - this.editorOptions.renderControlCharacters = config.viewInfo.renderControlCharacters; - this.editorOptions.wordWrap = config.wrappingInfo.isViewportWrapping ? 'on' : 'off'; + options.editorOptions = Object.create(null); + options.editorOptions.renderWhitespace = config.viewInfo.renderWhitespace; + options.editorOptions.renderControlCharacters = config.viewInfo.renderControlCharacters; + options.editorOptions.wordWrap = config.wrappingInfo.isViewportWrapping ? 'on' : 'off'; } } + return options; } /** From 3999d8112b494d120944432af8ed2338d78e7329 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 17 May 2017 07:51:53 +0200 Subject: [PATCH 0506/1164] tfs: linux build stats --- build/tfs/darwin/build.sh | 6 +-- build/tfs/linux/build.sh | 84 ++++++++++++++++----------------------- 2 files changed, 35 insertions(+), 55 deletions(-) diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh index 5cafa89f536..fb71e9885e1 100755 --- a/build/tfs/darwin/build.sh +++ b/build/tfs/darwin/build.sh @@ -9,11 +9,7 @@ export MOONCAKE_STORAGE_ACCESS_KEY="$4" export AZURE_DOCUMENTDB_MASTERKEY="$5" VSO_PAT="$6" -# Create a .netrc file to download distro dependencies -cat > ~/.netrc < ~/.netrc step "Install dependencies" \ ./scripts/npm.sh install diff --git a/build/tfs/linux/build.sh b/build/tfs/linux/build.sh index cdf4add3107..1c5afd88aa9 100755 --- a/build/tfs/linux/build.sh +++ b/build/tfs/linux/build.sh @@ -1,5 +1,6 @@ #!/bin/bash -set -e + +. build/tfs/common/common.sh export ARCH="$1" export VSCODE_MIXIN_PASSWORD="$2" @@ -10,51 +11,32 @@ export AZURE_DOCUMENTDB_MASTERKEY="$6" export LINUX_REPO_PASSWORD="$7" VSO_PAT="$8" -# Create a .netrc file to download distro dependencies -cat > ~/.netrc < ~/.netrc -# set agent specific npm cache -if [ -n "$AGENT_WORKFOLDER" ] -then - export npm_config_cache="$AGENT_WORKFOLDER/npm-cache" - echo "Using npm cache: $npm_config_cache" -fi +step "Install dependencies" \ + ./scripts/npm.sh install --arch=$ARCH --unsafe-perm -# log build step -STEP() { - echo "" - echo "********************************************************************************" - echo "*** $*" - echo "********************************************************************************" - echo "" -} +step "Mix in repository from vscode-distro" \ + npm run gulp -- mixin -STEP "Install dependencies" -./scripts/npm.sh install --arch=$ARCH --unsafe-perm +step "Install distro dependencies" \ + npm run install-distro -STEP "Mix in repository from vscode-distro" -npm run gulp -- mixin +step "Build minified" \ + npm run gulp -- --max_old_space_size=4096 "vscode-linux-$ARCH-min" -STEP "Install distro dependencies" -npm run install-distro +step "Build Debian package" \ + npm run gulp -- --max_old_space_size=4096 "vscode-linux-$ARCH-build-deb" -STEP "Build minified" -npm run gulp -- --max_old_space_size=4096 "vscode-linux-$ARCH-min" +step "Build RPM package" \ + npm run gulp -- --max_old_space_size=4096 "vscode-linux-$ARCH-build-rpm" -STEP "Build Debian package" -npm run gulp -- --max_old_space_size=4096 "vscode-linux-$ARCH-build-deb" +#step "Run unit tests" \ + #[[ "$ARCH" == "x64" ]] && ./scripts/test.sh --xvfb --build --reporter dot -STEP "Build RPM package" -npm run gulp -- --max_old_space_size=4096 "vscode-linux-$ARCH-build-rpm" - -STEP "Run unit tests" -#[[ "$ARCH" == "x64" ]] && ./scripts/test.sh --xvfb --build --reporter dot - -STEP "Install build dependencies" -(cd $BUILD_SOURCESDIRECTORY/build/tfs/common && npm install --unsafe-perm) +(cd $BUILD_SOURCESDIRECTORY/build/tfs/common && \ + step "Install build dependencies" \ + npm install --unsafe-perm) # Variables PLATFORM_LINUX="linux-$ARCH" @@ -72,26 +54,26 @@ TARBALL_PATH="$ROOT/$TARBALL_FILENAME" PACKAGEJSON="$BUILD/resources/app/package.json" VERSION=$(node -p "require(\"$PACKAGEJSON\").version") -STEP "Create tar.gz archive" rm -rf $ROOT/code-*.tar.* -pushd $ROOT -tar -czvf $TARBALL_PATH $BUILDNAME -popd +(cd $ROOT && \ + step "Create tar.gz archive" \ + tar -czvf $TARBALL_PATH $BUILDNAME) -STEP "Publish tar.gz archive" -node build/tfs/common/publish.js $VSCODE_QUALITY $PLATFORM_LINUX archive-unsigned $TARBALL_FILENAME $VERSION true $TARBALL_PATH +step "Publish tar.gz archive" \ + node build/tfs/common/publish.js $VSCODE_QUALITY $PLATFORM_LINUX archive-unsigned $TARBALL_FILENAME $VERSION true $TARBALL_PATH -STEP "Publish Debian package" DEB_FILENAME="$(ls $REPO/.build/linux/deb/$DEB_ARCH/deb/)" DEB_PATH="$REPO/.build/linux/deb/$DEB_ARCH/deb/$DEB_FILENAME" -node build/tfs/common/publish.js $VSCODE_QUALITY $PLATFORM_DEB package $DEB_FILENAME $VERSION true $DEB_PATH -STEP "Publish RPM package" +step "Publish Debian package" \ + node build/tfs/common/publish.js $VSCODE_QUALITY $PLATFORM_DEB package $DEB_FILENAME $VERSION true $DEB_PATH + RPM_FILENAME="$(ls $REPO/.build/linux/rpm/$RPM_ARCH/ | grep .rpm)" RPM_PATH="$REPO/.build/linux/rpm/$RPM_ARCH/$RPM_FILENAME" -node build/tfs/common/publish.js $VSCODE_QUALITY $PLATFORM_RPM package $RPM_FILENAME $VERSION true $RPM_PATH -STEP "Publish to repositories" +step "Publish RPM package" \ + node build/tfs/common/publish.js $VSCODE_QUALITY $PLATFORM_RPM package $RPM_FILENAME $VERSION true $RPM_PATH + if [ -z "$VSCODE_QUALITY" ]; then echo "VSCODE_QUALITY is not set, skipping repo package publish" else @@ -112,7 +94,9 @@ else eval echo '{ \"name\": \"$PACKAGE_NAME\", \"version\": \"$PACKAGE_VERSION\", \"repositoryId\": \"58a4adf642421134a1a48d1a\", \"sourceUrl\": \"$DEB_URL\" }' > apt-addpkg.json echo "Submitting apt-addpkg.json:" cat apt-addpkg.json - ./repoapi_client.sh -config apt-config.json -addpkg apt-addpkg.json + + step "Publish to repositories" \ + ./repoapi_client.sh -config apt-config.json -addpkg apt-addpkg.json fi # Submit to yum repo (disabled as it's manual until signing is automated) # eval echo '{ \"server\": \"azure-apt-cat.cloudapp.net\", \"protocol\": \"https\", \"port\": \"443\", \"repositoryId\": \"58a4ae3542421134a1a48d1b\", \"username\": \"$LINUX_REPO_USERNAME\", \"password\": \"$LINUX_REPO_PASSWORD\" }' > yum-config.json From d2d9c02ea6f74d3775405851f4db667780fb06bb Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 17 May 2017 08:02:53 +0200 Subject: [PATCH 0507/1164] tfs: update dockerfile --- build/tfs/linux/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/build/tfs/linux/Dockerfile b/build/tfs/linux/Dockerfile index 771d132e662..70142abfa77 100644 --- a/build/tfs/linux/Dockerfile +++ b/build/tfs/linux/Dockerfile @@ -25,3 +25,4 @@ RUN apt-get install -y libxkbfile-dev:i386 RUN apt-get install -y libxss1 libxss1:i386 RUN apt-get install -y libx11-xcb-dev libx11-xcb-dev:i386 RUN apt-get install -y libxkbfile-dev +RUN apt-get install -y bc bsdmainutils From 28bcf9d05ba9d5b169a49f5b14b44a9ef9caa3ce Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 17 May 2017 08:21:55 +0200 Subject: [PATCH 0508/1164] theming - search viewlet --- .../editor/browser/widget/diffEditorWidget.ts | 13 +--- src/vs/platform/theme/common/colorRegistry.ts | 14 +++- .../search/browser/media/searchviewlet.css | 64 +------------------ .../parts/search/browser/searchViewlet.ts | 34 ++++++++-- 4 files changed, 46 insertions(+), 79 deletions(-) diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index 00a9e0f42e1..8ab50398262 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -6,7 +6,6 @@ 'use strict'; import 'vs/css!./media/diffEditor'; -import * as nls from 'vs/nls'; import { RunOnceScheduler } from 'vs/base/common/async'; import { Disposable } from 'vs/base/common/lifecycle'; import * as objects from 'vs/base/common/objects'; @@ -33,8 +32,8 @@ import { ColorId, MetadataConsts, FontStyle } from 'vs/editor/common/modes'; import Event, { Emitter } from 'vs/base/common/event'; import * as editorOptions from 'vs/editor/common/config/editorOptions'; import { registerThemingParticipant, IThemeService, ITheme, getThemeTypeSelector } from 'vs/platform/theme/common/themeService'; -import { registerColor, scrollbarShadow } from 'vs/platform/theme/common/colorRegistry'; -import { Color, RGBA } from 'vs/base/common/color'; +import { scrollbarShadow, diffInserted, diffRemoved, defaultInsertColor, defaultRemoveColor, diffInsertedOutline, diffRemovedOutline } from 'vs/platform/theme/common/colorRegistry'; +import { Color } from 'vs/base/common/color'; import { OverviewRulerZone } from 'vs/editor/common/view/overviewZoneManager'; import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; @@ -1946,14 +1945,6 @@ function createFakeLinesDiv(): HTMLElement { return r; } -const defaultInsertColor = Color.fromRGBA(new RGBA(155, 185, 85, 255 * 0.2)); -const defaultRemoveColor = Color.fromRGBA(new RGBA(255, 0, 0, 255 * 0.2)); - -export const diffInserted = registerColor('diffEditor.insertedTextBackground', { dark: defaultInsertColor, light: defaultInsertColor, hc: null }, nls.localize('diffEditorInserted', 'Background color for text that got inserted.')); -export const diffRemoved = registerColor('diffEditor.removedTextBackground', { dark: defaultRemoveColor, light: defaultRemoveColor, hc: null }, nls.localize('diffEditorRemoved', 'Background color for text that got removed.')); -export const diffInsertedOutline = registerColor('diffEditor.insertedTextBorder', { dark: null, light: null, hc: '#33ff2eff' }, nls.localize('diffEditorInsertedOutline', 'Outline color for the text that got inserted.')); -export const diffRemovedOutline = registerColor('diffEditor.removedTextBorder', { dark: null, light: null, hc: '#FF008F' }, nls.localize('diffEditorRemovedOutline', 'Outline color for text that got removed.')); - registerThemingParticipant((theme, collector) => { let added = theme.getColor(diffInserted); if (added) { diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 23f915d5a7e..d8aa35889d8 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -6,7 +6,7 @@ import platform = require('vs/platform/platform'); import { IJSONSchema } from 'vs/base/common/jsonSchema'; -import { Color } from 'vs/base/common/color'; +import { Color, RGBA } from 'vs/base/common/color'; import { ITheme } from 'vs/platform/theme/common/themeService'; import nls = require('vs/nls'); @@ -243,6 +243,18 @@ export const editorHoverBorder = registerColor('editorHoverWidget.border', { lig */ export const editorActiveLinkForeground = registerColor('editorLink.activeForeground', { dark: '#4E94CE', light: Color.blue, hc: Color.cyan }, nls.localize('activeLinkForeground', 'Color of active links.')); +/** + * Diff Editor Colors + */ +export const defaultInsertColor = Color.fromRGBA(new RGBA(155, 185, 85, 255 * 0.2)); +export const defaultRemoveColor = Color.fromRGBA(new RGBA(255, 0, 0, 255 * 0.2)); + +export const diffInserted = registerColor('diffEditor.insertedTextBackground', { dark: defaultInsertColor, light: defaultInsertColor, hc: null }, nls.localize('diffEditorInserted', 'Background color for text that got inserted.')); +export const diffRemoved = registerColor('diffEditor.removedTextBackground', { dark: defaultRemoveColor, light: defaultRemoveColor, hc: null }, nls.localize('diffEditorRemoved', 'Background color for text that got removed.')); + +export const diffInsertedOutline = registerColor('diffEditor.insertedTextBorder', { dark: null, light: null, hc: '#33ff2eff' }, nls.localize('diffEditorInsertedOutline', 'Outline color for the text that got inserted.')); +export const diffRemovedOutline = registerColor('diffEditor.removedTextBorder', { dark: null, light: null, hc: '#FF008F' }, nls.localize('diffEditorRemovedOutline', 'Outline color for text that got removed.')); + // ----- color functions export function darken(colorValue: ColorValue, factor: number): ColorFunction { diff --git a/src/vs/workbench/parts/search/browser/media/searchviewlet.css b/src/vs/workbench/parts/search/browser/media/searchviewlet.css index c223b283c85..946b5b2edfa 100644 --- a/src/vs/workbench/parts/search/browser/media/searchviewlet.css +++ b/src/vs/workbench/parts/search/browser/media/searchviewlet.css @@ -203,28 +203,6 @@ font-style: italic; } -.search-viewlet .checkbox { - display: inline-block; - visibility: hidden; - border: 1px solid rgba(128, 128, 128, 0.5); - width: 0; - height: 12px; - margin-right: 0; - position: relative; - top: 2px; - transition: width 150ms, margin-right 150ms ease-in; -} - -.search-viewlet .linematch .checkbox.checked { - background-position: -66px -150px; -} - -.search-viewlet .select .linematch .checkbox { - visibility: visible; - width: 12px; - margin-right: 4px; -} - .search-viewlet .query-clear { background: url("action-query-clear.svg") center center no-repeat; } @@ -354,16 +332,8 @@ background: url('excludeSettings-dark.svg') center center no-repeat; } -.search-viewlet .findInFileMatch, -.monaco-editor .findInFileMatch { - background-color: rgba(234, 92, 0, 0.3); - animation-duration: 0; - animation-name: inherit !important; -} - .search-viewlet .replace.findInFileMatch { text-decoration: line-through; - background-color: rgba(255, 0, 0, 0.2); } .search-viewlet .findInFileMatch, @@ -371,45 +341,18 @@ white-space: pre; } -.search-viewlet .replaceMatch { - background-color: rgba(155, 185, 85, 0.5); -} - .hc-black .monaco-workbench .search-viewlet .replaceMatch, -.hc-black .monaco-workbench .search-viewlet .findInFileMatch, -.monaco-editor.hc-black .findInFileMatch { +.hc-black .monaco-workbench .search-viewlet .findInFileMatch { background: none !important; - border: 1px dotted #f38518; box-sizing: border-box; } -.hc-black .monaco-workbench .search-viewlet .replace.findInFileMatch { - border: 1px dashed #FF008F; -} - -.hc-black .monaco-workbench .search-viewlet .replaceMatch { - border: 1px dashed rgb(51, 255, 46); -} - .monaco-workbench .search-viewlet a.prominent { text-decoration: underline; } /* Theming */ -.search-viewlet .highlight { - color: black; - background-color: rgba(234, 92, 0, 0.3); -} - -.vs .search-viewlet .filematch .name { - color: #1E1E1E; -} - -.vs .search-viewlet .monaco-tree.focused .monaco-tree-row.selected .filematch .name { - color: #FFF; -} - .vs .search-viewlet .search-widget .toggle-replace-button:hover { background-color: rgba(0, 0, 0, 0.1) !important; } @@ -426,10 +369,6 @@ background-image: url('expando-expanded.svg'); } -.vs-dark .search-viewlet .monaco-tree .filematch .name { - color: #FFF; -} - .vs-dark .search-viewlet .query-clear { background: url("action-query-clear-dark.svg") center center no-repeat; } @@ -440,7 +379,6 @@ } .vs-dark .search-viewlet .message { - color: #FFF; opacity: .5; } diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index fcc011c2b73..ebb3c5d3217 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -57,7 +57,7 @@ import { OpenFolderAction, OpenFileFolderAction } from 'vs/workbench/browser/act import * as Constants from 'vs/workbench/parts/search/common/constants'; import { IListService } from 'vs/platform/list/browser/listService'; import { IThemeService, ITheme, ICssStyleCollector, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { editorFindMatchHighlight } from 'vs/platform/theme/common/colorRegistry'; +import { editorFindMatchHighlight, diffInserted, diffRemoved, diffInsertedOutline, diffRemovedOutline, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; import FileResultsNavigation from 'vs/workbench/browser/fileResultsNavigation'; import { attachListStyler } from 'vs/platform/theme/common/styler'; import { IOutputService } from 'vs/workbench/parts/output/common/output'; @@ -1369,9 +1369,35 @@ export class SearchViewlet extends Viewlet { } registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { - let matchHighlightColor = theme.getColor(editorFindMatchHighlight); + const matchHighlightColor = theme.getColor(editorFindMatchHighlight); if (matchHighlightColor) { - collector.addRule(`.search-viewlet .findInFileMatch { background-color: ${matchHighlightColor}; }`); - collector.addRule(`.search-viewlet .highlight { background-color: ${matchHighlightColor}; }`); + collector.addRule(`.monaco-workbench .search-viewlet .findInFileMatch { background-color: ${matchHighlightColor}; }`); + } + + const diffInsertedColor = theme.getColor(diffInserted); + if (diffInsertedColor) { + collector.addRule(`.monaco-workbench .search-viewlet .replaceMatch { background-color: ${diffInsertedColor}; }`); + } + + const diffRemovedColor = theme.getColor(diffRemoved); + if (diffRemovedColor) { + collector.addRule(`.monaco-workbench .search-viewlet .replace.findInFileMatch { background-color: ${diffRemovedColor}; }`); + } + + const diffInsertedOutlineColor = theme.getColor(diffInsertedOutline); + if (diffInsertedOutlineColor) { + collector.addRule(`.monaco-workbench .search-viewlet .replaceMatch:not(:empty) { border: 1px dashed ${diffInsertedOutlineColor}; }`); + } + + const diffRemovedOutlineColor = theme.getColor(diffRemovedOutline); + if (diffRemovedOutlineColor) { + collector.addRule(`.monaco-workbench .search-viewlet .replace.findInFileMatch { border: 1px dashed ${diffRemovedOutlineColor}; }`); + } + + const activeContrastBorderColor = theme.getColor(activeContrastBorder); + if (activeContrastBorderColor) { + collector.addRule(` + .monaco-workbench .search-viewlet .findInFileMatch { border: 1px dashed ${activeContrastBorderColor}; } + `); } }); \ No newline at end of file From c123897472817cf25f059bb6e2372a5120f737f3 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 17 May 2017 09:27:21 +0200 Subject: [PATCH 0509/1164] tfs: update bash step function --- build/tfs/common/common.sh | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/build/tfs/common/common.sh b/build/tfs/common/common.sh index d85788664e9..52f53537943 100755 --- a/build/tfs/common/common.sh +++ b/build/tfs/common/common.sh @@ -8,7 +8,7 @@ then echo "Using npm cache: $npm_config_cache" fi -SUMMARY="" +SUMMARY="Task;Duration"$'\n' step() { START=$SECONDS TASK=$1; shift @@ -17,17 +17,23 @@ step() { echo "Start: $TASK" echo "*****************************************************************************" "$@" - DURATION=$(echo "$SECONDS - $START" | bc) + + # Calculate total duration + TOTAL=$(echo "$SECONDS - $START" | bc) + M=$(echo "$TOTAL / 60" | bc) + S=$(echo "$TOTAL % 60" | bc) + DURATION="$(printf "%02d" $M):$(printf "%02d" $S)" + echo "*****************************************************************************" - echo "End: $TASK, $DURATION seconds" + echo "End: $TASK, Total: $DURATION" echo "*****************************************************************************" - SUMMARY="$SUMMARY$TASK;$DURATION seconds"$'\n' + SUMMARY="$SUMMARY$TASK;$DURATION"$'\n' } done_steps() { echo "" - echo "Task Summary" - echo "============" + echo "Build Summary" + echo "=============" echo "${SUMMARY}" | column -t -s';' } From 0a93ace1c79bd6515366f37ddaea620b51e2cf59 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 17 May 2017 09:43:42 +0200 Subject: [PATCH 0510/1164] fix build --- build/gulpfile.hygiene.js | 1 + 1 file changed, 1 insertion(+) diff --git a/build/gulpfile.hygiene.js b/build/gulpfile.hygiene.js index b2566cdac1b..1c716b56f99 100644 --- a/build/gulpfile.hygiene.js +++ b/build/gulpfile.hygiene.js @@ -42,6 +42,7 @@ const eolFilter = [ '!build/monaco/**', '!build/win32/**', '!build/**/*.sh', + '!build/tfs/**/*.js', '!**/Dockerfile' ]; From 2fbc979be2bd0fec6dc2af713367b2930f818121 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 17 May 2017 10:03:11 +0200 Subject: [PATCH 0511/1164] Split editor command (Cmd+|) throws exception (fixes #26801) --- src/vs/workbench/common/editor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index 12cf8f3ea74..95235bc57e5 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -645,7 +645,7 @@ export class TextEditorOptions extends EditorOptions { /** * Helper to create TextEditorOptions inline. */ - public static create(settings: ITextEditorOptions): TextEditorOptions { + public static create(settings: ITextEditorOptions = Object.create(null)): TextEditorOptions { const options = new TextEditorOptions(); options.preserveFocus = settings.preserveFocus; options.forceOpen = settings.forceOpen; From 506ec62591a949c2d0f3686817b6a5f40c207fc2 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 17 May 2017 10:29:50 +0200 Subject: [PATCH 0512/1164] tfs: improve win32 step --- build/tfs/win32/1_build.ps1 | 37 ++++++++++++++++++++--------------- build/tfs/win32/2_package.ps1 | 7 +++++-- build/tfs/win32/3_upload.ps1 | 21 ++++++++++++-------- build/tfs/win32/lib.ps1 | 32 +++++++++++++++++++++++------- 4 files changed, 64 insertions(+), 33 deletions(-) diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index 1f120965a17..940cf92a7a3 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -9,26 +9,31 @@ Param( $env:HOME=$env:USERPROFILE # Create a _netrc file to download distro dependencies -@" -machine monacotools.visualstudio.com -password ${vsoPAT} -"@ | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII +"machine monacotools.visualstudio.com password ${vsoPAT}" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII -STEP "Install dependencies" -exec { & .\scripts\npm.bat install } +step "Install dependencies" { + exec { & .\scripts\npm.bat install } +} -STEP "Mix in repository from vscode-distro" $env:VSCODE_MIXIN_PASSWORD = $mixinPassword -exec { & npm run gulp -- mixin } +step "Mix in repository from vscode-distro" { + exec { & npm run gulp -- mixin } +} -STEP "Install distro dependencies" -exec { & npm run install-distro } +step "Install distro dependencies" { + exec { & npm run install-distro } +} -STEP "Build minified" -exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-min } +step "Build minified" { + exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-min } +} -STEP "Run unit tests" -exec { & .\scripts\test.bat --build --reporter dot } +step "Run unit tests" { + exec { & .\scripts\test.bat --build --reporter dot } +} -# STEP "Run integration tests" -# exec { & .\scripts\test-integration.bat } \ No newline at end of file +# step "Run integration tests" { +# exec { & .\scripts\test-integration.bat } +# } + +done \ No newline at end of file diff --git a/build/tfs/win32/2_package.ps1 b/build/tfs/win32/2_package.ps1 index 689eccc5e30..7d29cca6c3a 100644 --- a/build/tfs/win32/2_package.ps1 +++ b/build/tfs/win32/2_package.ps1 @@ -1,4 +1,7 @@ . .\build\tfs\win32\lib.ps1 -STEP "Create archive and setup package" -exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-archive vscode-win32-setup } \ No newline at end of file +step "Create archive and setup package" { + exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-archive vscode-win32-setup } +} + +done \ No newline at end of file diff --git a/build/tfs/win32/3_upload.ps1 b/build/tfs/win32/3_upload.ps1 index c11efbaff47..9c0a7ca2bf1 100644 --- a/build/tfs/win32/3_upload.ps1 +++ b/build/tfs/win32/3_upload.ps1 @@ -17,17 +17,22 @@ $PackageJson = Get-Content -Raw -Path "$Build\resources\app\package.json" | Conv $Version = $PackageJson.version $Quality = "$env:VSCODE_QUALITY" -STEP "Install build dependencies" -pushd "$Repo\build\tfs\common" -exec { & npm i } -popd +step "Install build dependencies" { + pushd "$Repo\build\tfs\common" + exec { & npm i } + popd +} $env:AZURE_STORAGE_ACCESS_KEY_2 = $storageKey $env:MOONCAKE_STORAGE_ACCESS_KEY = $mooncakeStorageKey $env:AZURE_DOCUMENTDB_MASTERKEY = $documentDbKey -STEP "Publish archive" -exec { & node build/tfs/common/publish.js $Quality win32-archive archive "VSCode-win32-$Version.zip" $Version true $Zip } +step "Publish archive" { + exec { & node build/tfs/common/publish.js $Quality win32-archive archive "VSCode-win32-$Version.zip" $Version true $Zip } +} -STEP "Publish setup package" -exec { & node build/tfs/common/publish.js $Quality win32 setup "VSCodeSetup-$Version.exe" $Version true $Exe } +step "Publish setup package" { + exec { & node build/tfs/common/publish.js $Quality win32 setup "VSCodeSetup-$Version.exe" $Version true $Exe } +} + +done \ No newline at end of file diff --git a/build/tfs/win32/lib.ps1 b/build/tfs/win32/lib.ps1 index c78d3fdf9ef..610b4d7fcdf 100644 --- a/build/tfs/win32/lib.ps1 +++ b/build/tfs/win32/lib.ps1 @@ -14,11 +14,29 @@ function exec([scriptblock]$cmd, [string]$errorMessage = "Error executing comman } } -# log build step -function STEP() { - Write-Host "" - Write-Host "********************************************************************************" - Write-Host "*** $args" - Write-Host "********************************************************************************" - Write-Host "" +$Summary = @() +function step($Task, $Step) { + echo "" + echo "*****************************************************************************" + echo "Start: $Task" + echo "*****************************************************************************" + echo "" + + $Stopwatch = [Diagnostics.Stopwatch]::StartNew() + Invoke-Command $Step + $Stopwatch.Stop() + $Formatted = "{0:g}" -f $Stopwatch.Elapsed + + echo "*****************************************************************************" + echo "End: $Task, Total: $Formatted" + echo "*****************************************************************************" + + $global:Summary += @{ "$Task" = $Formatted } } + +function done() { + echo "" + echo "Build Summary" + echo "=============" + $global:Summary | Format-Table @{L="Task";E={$_.Name}}, @{L="Duration";E={$_.Value}} +} \ No newline at end of file From 3df725b2c9dc3538fdaaee592a183900e3eb9196 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 17 May 2017 10:45:25 +0200 Subject: [PATCH 0513/1164] Bracket matching box too large (regression from #26104) --- .../editor/contrib/bracketMatching/browser/bracketMatching.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/bracketMatching/browser/bracketMatching.css b/src/vs/editor/contrib/bracketMatching/browser/bracketMatching.css index d0acbab2da4..3acf3fd25bf 100644 --- a/src/vs/editor/contrib/bracketMatching/browser/bracketMatching.css +++ b/src/vs/editor/contrib/bracketMatching/browser/bracketMatching.css @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ .monaco-editor .bracket-match { - background-color: rgba(0, 100, 0, 0.1); + box-sizing: border-box; } From 70912d13f81220398554fb3a2250f0c98611acff Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 17 May 2017 11:13:45 +0200 Subject: [PATCH 0514/1164] tfs: remove windows build step --- build/tfs/win32/3_upload.ps1 | 7 ------- 1 file changed, 7 deletions(-) diff --git a/build/tfs/win32/3_upload.ps1 b/build/tfs/win32/3_upload.ps1 index 9c0a7ca2bf1..5b7e4a0f482 100644 --- a/build/tfs/win32/3_upload.ps1 +++ b/build/tfs/win32/3_upload.ps1 @@ -16,13 +16,6 @@ $Build = "$Root\VSCode-win32" $PackageJson = Get-Content -Raw -Path "$Build\resources\app\package.json" | ConvertFrom-Json $Version = $PackageJson.version $Quality = "$env:VSCODE_QUALITY" - -step "Install build dependencies" { - pushd "$Repo\build\tfs\common" - exec { & npm i } - popd -} - $env:AZURE_STORAGE_ACCESS_KEY_2 = $storageKey $env:MOONCAKE_STORAGE_ACCESS_KEY = $mooncakeStorageKey $env:AZURE_DOCUMENTDB_MASTERKEY = $documentDbKey From 2fb3b186bc7c67616a00147e1d9e74eb3665e2a1 Mon Sep 17 00:00:00 2001 From: isidor Date: Wed, 17 May 2017 11:44:32 +0200 Subject: [PATCH 0515/1164] debug toolbar: default position all the way to the right and introduce telemetry #2513 --- .../parts/debug/browser/debugActionsWidget.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts b/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts index 549480112b9..dc9a9d0d19d 100644 --- a/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts +++ b/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts @@ -114,7 +114,9 @@ export class DebugActionsWidget extends Themable implements IWorkbenchContributi const mouseClickEvent = new StandardMouseEvent(event); if (mouseClickEvent.detail === 2) { // double click on debug bar centers it again #8250 - this.setXCoordinate(0.5 * window.innerWidth); + const widgetWidth = this.$el.getHTMLElement().clientWidth; + this.setXCoordinate(window.innerWidth - widgetWidth); + this.storePosition(); } }); @@ -129,8 +131,7 @@ export class DebugActionsWidget extends Themable implements IWorkbenchContributi // Reduce x by width of drag handle to reduce jarring #16604 this.setXCoordinate(mouseMoveEvent.posx - 14); }).once('mouseup', (e: MouseEvent) => { - const mouseMoveEvent = new StandardMouseEvent(e); - this.storageService.store(DEBUG_ACTIONS_WIDGET_POSITION_KEY, mouseMoveEvent.posx / window.innerWidth, StorageScope.WORKSPACE); + this.storePosition(); this.dragArea.removeClass('dragged'); $window.off('mousemove'); }); @@ -140,6 +141,12 @@ export class DebugActionsWidget extends Themable implements IWorkbenchContributi this.toDispose.push(browser.onDidChangeZoomLevel(() => this.positionDebugWidget())); } + private storePosition(): void { + const position = parseFloat(this.$el.getComputedStyle().left) / window.innerWidth; + this.storageService.store(DEBUG_ACTIONS_WIDGET_POSITION_KEY, position, StorageScope.WORKSPACE); + this.telemetryService.publicLog(DEBUG_ACTIONS_WIDGET_POSITION_KEY, { position }); + } + protected updateStyles(): void { super.updateStyles(); @@ -167,7 +174,7 @@ export class DebugActionsWidget extends Themable implements IWorkbenchContributi return; } if (x === undefined) { - x = parseFloat(this.storageService.get(DEBUG_ACTIONS_WIDGET_POSITION_KEY, StorageScope.WORKSPACE, '0.5')) * window.innerWidth; + x = parseFloat(this.storageService.get(DEBUG_ACTIONS_WIDGET_POSITION_KEY, StorageScope.WORKSPACE, '1')) * window.innerWidth; } const widgetWidth = this.$el.getHTMLElement().clientWidth; From 1fb2d844ede7a3d0f1554cf66f0f79999017fe85 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 17 May 2017 11:48:46 +0200 Subject: [PATCH 0516/1164] remove build from test script --- build/tfs/linux/build.sh | 6 +++--- scripts/test.sh | 7 ------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/build/tfs/linux/build.sh b/build/tfs/linux/build.sh index 1c5afd88aa9..f86e9f71827 100755 --- a/build/tfs/linux/build.sh +++ b/build/tfs/linux/build.sh @@ -25,15 +25,15 @@ step "Install distro dependencies" \ step "Build minified" \ npm run gulp -- --max_old_space_size=4096 "vscode-linux-$ARCH-min" +# step "Run unit tests" \ +# [[ "$ARCH" == "x64" ]] && ./scripts/test.sh --xvfb --build --reporter dot + step "Build Debian package" \ npm run gulp -- --max_old_space_size=4096 "vscode-linux-$ARCH-build-deb" step "Build RPM package" \ npm run gulp -- --max_old_space_size=4096 "vscode-linux-$ARCH-build-rpm" -#step "Run unit tests" \ - #[[ "$ARCH" == "x64" ]] && ./scripts/test.sh --xvfb --build --reporter dot - (cd $BUILD_SOURCESDIRECTORY/build/tfs/common && \ step "Install build dependencies" \ npm install --unsafe-perm) diff --git a/scripts/test.sh b/scripts/test.sh index ebe39774193..19b79bf5843 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -26,17 +26,10 @@ test -d node_modules || ./scripts/npm.sh install # Get electron (test -f "$CODE" && [ $INTENDED_VERSION == $INSTALLED_VERSION ]) || ./node_modules/.bin/gulp electron -# Build -test -d out || ./node_modules/.bin/gulp compile -echo "code $CODE" - # Unit Tests -export VSCODE_DEV=1 - if [[ "$1" == "--xvfb" ]]; then cd $ROOT ; \ xvfb-run "$CODE" test/electron/index.js "$@" - elif [[ "$OSTYPE" == "darwin"* ]]; then cd $ROOT ; ulimit -n 4096 ; \ "$CODE" \ From db42b305980f53f86eaa50fac6f24e988858bcd1 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 17 May 2017 13:41:42 +0200 Subject: [PATCH 0517/1164] add startupTimer, use it some places --- build/gulpfile.vscode.js | 1 + src/vs/base/common/startupTimers.d.ts | 32 +++++++ src/vs/base/common/startupTimers.js | 88 +++++++++++++++++++ .../electron-browser/bootstrap/index.js | 5 ++ .../workbench/electron-browser/workbench.ts | 4 +- 5 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 src/vs/base/common/startupTimers.d.ts create mode 100644 src/vs/base/common/startupTimers.js diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index e51fa9c2ec2..a7a811dac22 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -60,6 +60,7 @@ const vscodeResources = [ 'out-build/bootstrap-amd.js', 'out-build/paths.js', 'out-build/vs/**/*.{svg,png,cur,html}', + 'out-build/vs/base/common/startupTimers.js', 'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh}', 'out-build/vs/base/browser/ui/octiconLabel/octicons/**', 'out-build/vs/workbench/browser/media/*-theme.css', diff --git a/src/vs/base/common/startupTimers.d.ts b/src/vs/base/common/startupTimers.d.ts new file mode 100644 index 00000000000..fa9b5363877 --- /dev/null +++ b/src/vs/base/common/startupTimers.d.ts @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare interface TickStart { + name: string; + started: number; +} + +export declare class Tick { + + readonly duration: number; + readonly name: string; + readonly started: number; + readonly stopped: number; + + static compareByStart(a: Tick, b: Tick): number; +} + +declare interface TickController { + while>(t: T): T; + stop(stopped?: number): void; +} + +export function startTimer(name: string, started?: number): TickController; + +export function stopTimer(name: string, stopped?: number); + +export function ticks(): ReadonlyArray; + +export function disable(): void; diff --git a/src/vs/base/common/startupTimers.js b/src/vs/base/common/startupTimers.js new file mode 100644 index 00000000000..cbaeab198af --- /dev/null +++ b/src/vs/base/common/startupTimers.js @@ -0,0 +1,88 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +if (typeof define !== "function" && typeof module === "object" && typeof module.exports === "object") { + + global.define = function (dep, callback) { + module.exports = callback(); + global.define = undefined; + } +} +define([], function () { + + function Tick(name, started, stopped) { + this.name = name + this.started = started + this.stopped = stopped + this.duration = stopped - started; + } + Tick.compareByStart = function (a, b) { + if (a.started < b.started) { + return -1; + } else if (a.started > b.started) { + return 1; + } else { + return 0; + } + }; + + // This module can be loaded in an amd and commonjs-context. + // Because we want both instances to use the same tick-data + // we store them globally + global._perfStarts = global._perfStarts || new Map(); + global._perfTicks = global._perfTicks || []; + + const _starts = global._perfStarts; + const _ticks = global._perfTicks; + + function startTimer(name, started = Date.now()) { + if (_starts.has(name)) { + throw new Error(`${name} already exists`); + } + _starts.set(name, { name, started }); + const stop = stopTimer.bind(undefined, name); + return { + stop, + while(thenable) { + thenable.then(_ => stop(), _ => stop()); + return thenable; + } + }; + } + + function stopTimer(name, stopped = Date.now()) { + const start = _starts.get(name); + const tick = new Tick(start.name, start.started, stopped); + _ticks.push(tick); + _starts.delete(name); + } + + function ticks() { + return _ticks; + } + + const exports = { + Tick: Tick, + startTimer: startTimer, + stopTimer: stopTimer, + ticks: ticks, + disable: disable + }; + + function disable() { + const emptyController = Object.freeze({ while(t) { return t }, stop() { } }); + const emptyTicks = Object.create([]); + exports.startTimer = function () { return emptyController; } + exports.stopTimer = function () { }; + exports.ticks = function () { return emptyTicks; } + + delete global._perfStarts; + delete global._perfTicks; + } + + return exports; +}); diff --git a/src/vs/workbench/electron-browser/bootstrap/index.js b/src/vs/workbench/electron-browser/bootstrap/index.js index 4ba9e05b9a6..5cbd46ad920 100644 --- a/src/vs/workbench/electron-browser/bootstrap/index.js +++ b/src/vs/workbench/electron-browser/bootstrap/index.js @@ -14,6 +14,7 @@ if (window.location.search.indexOf('prof-startup') >= 0) { /*global window,document,define*/ +const { startTimer } = require('../../../base/common/startupTimers') const path = require('path'); const electron = require('electron'); const remote = electron.remote; @@ -158,8 +159,10 @@ function main() { // In the bundled version the nls plugin is packaged with the loader so the NLS Plugins // loads as soon as the loader loads. To be able to have pseudo translation + const loaderTimer = startTimer('require:loader.js') createScript(rootUrl + '/vs/loader.js', function () { define('fs', ['original-fs'], function (originalFS) { return originalFS; }); // replace the patched electron fs with the original node fs for all AMD code + loaderTimer.stop(); window.MonacoEnvironment = {}; @@ -189,11 +192,13 @@ function main() { beforeLoadWorkbenchMain: Date.now() }; + const workbenchMainTimer = startTimer('require:workbench.main') require([ 'vs/workbench/electron-browser/workbench.main', 'vs/nls!vs/workbench/electron-browser/workbench.main', 'vs/css!vs/workbench/electron-browser/workbench.main' ], function () { + workbenchMainTimer.stop(); timers.afterLoadWorkbenchMain = Date.now(); process.lazyEnv.then(function () { diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 4621ddd167c..ec1d8a831af 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -16,6 +16,7 @@ import { Delayer } from 'vs/base/common/async'; import * as browser from 'vs/base/browser/browser'; import assert = require('vs/base/common/assert'); import { StopWatch } from 'vs/base/common/stopwatch'; +import { startTimer } from 'vs/base/common/startupTimers'; import errors = require('vs/base/common/errors'); import { BackupFileService } from 'vs/workbench/services/backup/node/backupFileService'; import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; @@ -297,7 +298,8 @@ export class Workbench implements IPartService { } viewletRestoreStopWatch = StopWatch.create(); - compositeAndEditorPromises.push(this.viewletService.openViewlet(viewletIdToRestore).then(() => { + const tick = startTimer(`restoreViewlet:${viewletIdToRestore}`); + compositeAndEditorPromises.push(tick.while(this.viewletService.openViewlet(viewletIdToRestore)).then(() => { viewletRestoreStopWatch.stop(); })); } From 8ba5b8cd7b566aebbb26e38cb6f0558199b27599 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 17 May 2017 14:05:46 +0200 Subject: [PATCH 0518/1164] Support crashReporterHockeyAppSubmitURL (#26814) --- build/gulpfile.mixin.js | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/build/gulpfile.mixin.js b/build/gulpfile.mixin.js index 5c62226deda..71c45d4bcf9 100644 --- a/build/gulpfile.mixin.js +++ b/build/gulpfile.mixin.js @@ -68,7 +68,26 @@ gulp.task('mixin', function () { .pipe(buffer()) .pipe(json(function (patch) { const original = require('../product.json'); - return assign(original, patch); + const result = assign(original, patch); + + // HockeyApp Support + if (patch.crashReporterHockeyAppSubmitURL && result.crashReporter) { + + // Receive submitURL for the platform we are building for + result.crashReporter.submitURL = (function () { + if (process.platform === 'win32') { return patch.crashReporterHockeyAppSubmitURL.win32; } + if (process.platform === 'darwin') { return patch.crashReporterHockeyAppSubmitURL.darwin; } + if (process.platform === 'linux' && arch === 'x64') { return patch.crashReporterHockeyAppSubmitURL.linux64; } + if (process.platform === 'linux' && arch !== 'x64') { return patch.crashReporterHockeyAppSubmitURL.linux32; } + + return void 0; + })(); + + // No longer need crashReporterHockeyAppSubmitURL after this + result.crashReporterHockeyAppSubmitURL = void 0; + } + + return result; })) .pipe(productJsonFilter.restore); From 2587b41b95e2fa52ddaa06d604a8872aef59af79 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 17 May 2017 14:18:11 +0200 Subject: [PATCH 0519/1164] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b22df3cc3ee..850dc7a4a01 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "code-oss-dev", "version": "1.13.0", "electronVersion": "1.6.6", - "distro": "a08520285a5d8cb174da73cbec07cc7aff0cee3b", + "distro": "75907509ec4038a8ebcce47fa85eab15bfe33aac", "author": { "name": "Microsoft Corporation" }, From 777d2e55583821e09c4ea9e48f42d9388a08a282 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 17 May 2017 14:35:53 +0200 Subject: [PATCH 0520/1164] use ES5 --- src/vs/base/common/startupTimers.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/vs/base/common/startupTimers.js b/src/vs/base/common/startupTimers.js index cbaeab198af..086e8e38cfe 100644 --- a/src/vs/base/common/startupTimers.js +++ b/src/vs/base/common/startupTimers.js @@ -39,7 +39,10 @@ define([], function () { const _starts = global._perfStarts; const _ticks = global._perfTicks; - function startTimer(name, started = Date.now()) { + function startTimer(name, started) { + if (typeof started !== 'number') { + started = Date.now(); + } if (_starts.has(name)) { throw new Error(`${name} already exists`); } @@ -48,13 +51,16 @@ define([], function () { return { stop, while(thenable) { - thenable.then(_ => stop(), _ => stop()); + thenable.then(function() { stop() }, function() { stop() }); return thenable; } }; } - function stopTimer(name, stopped = Date.now()) { + function stopTimer(name, stopped) { + if (typeof stopped !== 'number') { + stopped = Date.now(); + } const start = _starts.get(name); const tick = new Tick(start.name, start.started, stopped); _ticks.push(tick); From 08a377742cfda820369aa7a0d3127982a0c28a1f Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 17 May 2017 14:44:24 +0200 Subject: [PATCH 0521/1164] more ES5 --- src/vs/base/common/startupTimers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/base/common/startupTimers.js b/src/vs/base/common/startupTimers.js index 086e8e38cfe..a08a196de03 100644 --- a/src/vs/base/common/startupTimers.js +++ b/src/vs/base/common/startupTimers.js @@ -44,7 +44,7 @@ define([], function () { started = Date.now(); } if (_starts.has(name)) { - throw new Error(`${name} already exists`); + throw new Error("${name}" + " already exists"); } _starts.set(name, { name, started }); const stop = stopTimer.bind(undefined, name); From 71fbd74e174825de7d146ec972e218bd68a892fe Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 17 May 2017 14:56:44 +0200 Subject: [PATCH 0522/1164] less ES5 --- src/vs/base/common/startupTimers.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/vs/base/common/startupTimers.js b/src/vs/base/common/startupTimers.js index a08a196de03..6bf8cefeeed 100644 --- a/src/vs/base/common/startupTimers.js +++ b/src/vs/base/common/startupTimers.js @@ -46,12 +46,12 @@ define([], function () { if (_starts.has(name)) { throw new Error("${name}" + " already exists"); } - _starts.set(name, { name, started }); + _starts.set(name, { name: name, started: started }); const stop = stopTimer.bind(undefined, name); return { - stop, - while(thenable) { - thenable.then(function() { stop() }, function() { stop() }); + stop: stop, + while: function (thenable) { + thenable.then(function () { stop(); }, function () { stop(); }); return thenable; } }; @@ -80,11 +80,11 @@ define([], function () { }; function disable() { - const emptyController = Object.freeze({ while(t) { return t }, stop() { } }); + const emptyController = Object.freeze({ while: function (t) { return t; }, stop: function () { } }); const emptyTicks = Object.create([]); - exports.startTimer = function () { return emptyController; } + exports.startTimer = function () { return emptyController; }; exports.stopTimer = function () { }; - exports.ticks = function () { return emptyTicks; } + exports.ticks = function () { return emptyTicks; }; delete global._perfStarts; delete global._perfTicks; From 669b83d5fc538051a34a12150f0f1f375470a1e9 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 17 May 2017 15:09:57 +0200 Subject: [PATCH 0523/1164] less ES6 in JS files --- src/vs/base/common/startupTimers.js | 6 +++--- src/vs/workbench/electron-browser/bootstrap/index.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/base/common/startupTimers.js b/src/vs/base/common/startupTimers.js index 6bf8cefeeed..7284305ecf8 100644 --- a/src/vs/base/common/startupTimers.js +++ b/src/vs/base/common/startupTimers.js @@ -15,9 +15,9 @@ if (typeof define !== "function" && typeof module === "object" && typeof module. define([], function () { function Tick(name, started, stopped) { - this.name = name - this.started = started - this.stopped = stopped + this.name = name; + this.started = started; + this.stopped = stopped; this.duration = stopped - started; } Tick.compareByStart = function (a, b) { diff --git a/src/vs/workbench/electron-browser/bootstrap/index.js b/src/vs/workbench/electron-browser/bootstrap/index.js index 5cbd46ad920..c86ae1ddbbf 100644 --- a/src/vs/workbench/electron-browser/bootstrap/index.js +++ b/src/vs/workbench/electron-browser/bootstrap/index.js @@ -14,7 +14,7 @@ if (window.location.search.indexOf('prof-startup') >= 0) { /*global window,document,define*/ -const { startTimer } = require('../../../base/common/startupTimers') +const startTimer = require('../../../base/common/startupTimers').startTimer; const path = require('path'); const electron = require('electron'); const remote = electron.remote; From f4a351fc08f04f853d15072ad30d28792799d07f Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Wed, 17 May 2017 16:13:23 +0200 Subject: [PATCH 0524/1164] Move tslint settings to tslint.json --- .vscode/settings.json | 2 -- tslint.json | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index ee2a86a54f5..19cb4832e99 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -16,8 +16,6 @@ "i18n/**": true, "extensions/**/out/**": true }, - "tslint.enable": true, - "tslint.rulesDirectory": "build/lib/tslint", "lcov.path": [ "./.build/coverage/lcov.info", "./.build/coverage-single/lcov.info" diff --git a/tslint.json b/tslint.json index aae82a05a27..9c0f132b77e 100644 --- a/tslint.json +++ b/tslint.json @@ -1,4 +1,7 @@ { + "rulesDirectory": [ + "build/lib/tslint" + ], "rules": { "no-unused-expression": true, "no-duplicate-variable": true, From 84d4fc595c11b8c0c6d7107f9173f6361173cd92 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 17 May 2017 15:59:13 +0200 Subject: [PATCH 0525/1164] support to profile a tick, move to /node --- build/gulpfile.vscode.js | 2 +- src/vs/base/node/profiler.ts | 6 +-- .../base/{common => node}/startupTimers.d.ts | 5 +++ src/vs/base/{common => node}/startupTimers.js | 38 +++++++++++++++---- .../workbench/electron-browser/workbench.ts | 2 +- 5 files changed, 41 insertions(+), 12 deletions(-) rename src/vs/base/{common => node}/startupTimers.d.ts (88%) rename src/vs/base/{common => node}/startupTimers.js (71%) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index a7a811dac22..042e45d4cd4 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -60,7 +60,7 @@ const vscodeResources = [ 'out-build/bootstrap-amd.js', 'out-build/paths.js', 'out-build/vs/**/*.{svg,png,cur,html}', - 'out-build/vs/base/common/startupTimers.js', + 'out-build/vs/base/node/startupTimers.js', 'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh}', 'out-build/vs/base/browser/ui/octiconLabel/octicons/**', 'out-build/vs/workbench/browser/media/*-theme.css', diff --git a/src/vs/base/node/profiler.ts b/src/vs/base/node/profiler.ts index febca07118e..c19ba021b69 100644 --- a/src/vs/base/node/profiler.ts +++ b/src/vs/base/node/profiler.ts @@ -45,7 +45,7 @@ export function stopProfiling(dir: string, prefix: string): TPromise { }); } -function removePiiPaths(profile: Profile) { +export function removePiiPaths(profile: Profile) { const stack = [profile.head]; while (stack.length > 0) { const element = stack.pop(); @@ -66,14 +66,14 @@ declare interface Profiler { stopProfiling(): Profile; } -declare interface Profile { +export declare interface Profile { title: string; export(callback: (err, data) => void); delete(); head: ProfileSample; } -declare interface ProfileSample { +export declare interface ProfileSample { // bailoutReason:"" // callUID:2333 // children:Array[39] diff --git a/src/vs/base/common/startupTimers.d.ts b/src/vs/base/node/startupTimers.d.ts similarity index 88% rename from src/vs/base/common/startupTimers.d.ts rename to src/vs/base/node/startupTimers.d.ts index fa9b5363877..bcc276e506d 100644 --- a/src/vs/base/common/startupTimers.d.ts +++ b/src/vs/base/node/startupTimers.d.ts @@ -3,6 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { Profile } from './profiler' + declare interface TickStart { name: string; started: number; @@ -14,6 +16,7 @@ export declare class Tick { readonly name: string; readonly started: number; readonly stopped: number; + readonly profile: Profile; static compareByStart(a: Tick, b: Tick): number; } @@ -29,4 +32,6 @@ export function stopTimer(name: string, stopped?: number); export function ticks(): ReadonlyArray; +export function setProfileList(names: string[]): void; + export function disable(): void; diff --git a/src/vs/base/common/startupTimers.js b/src/vs/base/node/startupTimers.js similarity index 71% rename from src/vs/base/common/startupTimers.js rename to src/vs/base/node/startupTimers.js index 7284305ecf8..e34c97b8f70 100644 --- a/src/vs/base/common/startupTimers.js +++ b/src/vs/base/node/startupTimers.js @@ -5,20 +5,32 @@ 'use strict'; -if (typeof define !== "function" && typeof module === "object" && typeof module.exports === "object") { +var requireProfiler; +if (typeof define !== "function" && typeof module === "object" && typeof module.exports === "object") { + // this is commonjs, fake amd global.define = function (dep, callback) { module.exports = callback(); global.define = undefined; } + requireProfiler = function () { + return require('v8-profiler'); + } +} else { + // this is amd + requireProfiler = function () { + return require.__$__nodeRequire('v8-profiler'); + } } + define([], function () { - function Tick(name, started, stopped) { - this.name = name; - this.started = started; - this.stopped = stopped; + function Tick(name, started, stopped, profile) { + this.name = name + this.started = started + this.stopped = stopped this.duration = stopped - started; + this.profile = profile; } Tick.compareByStart = function (a, b) { if (a.started < b.started) { @@ -35,9 +47,11 @@ define([], function () { // we store them globally global._perfStarts = global._perfStarts || new Map(); global._perfTicks = global._perfTicks || []; + global._perfToBeProfiled = global._perfToBeProfiled || new Set(); const _starts = global._perfStarts; const _ticks = global._perfTicks; + const _toBeProfiled = global._perfToBeProfiled function startTimer(name, started) { if (typeof started !== 'number') { @@ -46,6 +60,9 @@ define([], function () { if (_starts.has(name)) { throw new Error("${name}" + " already exists"); } + if (_toBeProfiled.has(name)) { + requireProfiler().startProfiling(name, true); + } _starts.set(name, { name: name, started: started }); const stop = stopTimer.bind(undefined, name); return { @@ -61,8 +78,9 @@ define([], function () { if (typeof stopped !== 'number') { stopped = Date.now(); } + const profile = _toBeProfiled.has(name) ? requireProfiler().stopProfiling(name) : undefined; const start = _starts.get(name); - const tick = new Tick(start.name, start.started, stopped); + const tick = new Tick(start.name, start.started, stopped, profile); _ticks.push(tick); _starts.delete(name); } @@ -71,12 +89,18 @@ define([], function () { return _ticks; } + function setProfileList(names) { + _toBeProfiled.clear(); + names.forEach(function (name) { _toBeProfiled.add(name) }); + } + const exports = { Tick: Tick, startTimer: startTimer, stopTimer: stopTimer, ticks: ticks, - disable: disable + setProfileList: setProfileList, + disable: disable, }; function disable() { diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index ec1d8a831af..4a47295048f 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -16,7 +16,7 @@ import { Delayer } from 'vs/base/common/async'; import * as browser from 'vs/base/browser/browser'; import assert = require('vs/base/common/assert'); import { StopWatch } from 'vs/base/common/stopwatch'; -import { startTimer } from 'vs/base/common/startupTimers'; +import { startTimer } from 'vs/base/node/startupTimers'; import errors = require('vs/base/common/errors'); import { BackupFileService } from 'vs/workbench/services/backup/node/backupFileService'; import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; From c0fd0eba1b727081485a6661c62408e59d85fd4f Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 17 May 2017 16:37:26 +0200 Subject: [PATCH 0526/1164] tfs: fix npm distro install --- build/tfs/darwin/build.sh | 5 +++-- build/tfs/linux/build.sh | 5 +++-- scripts/env.sh | 6 ++++++ 3 files changed, 12 insertions(+), 4 deletions(-) create mode 100755 scripts/env.sh diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh index fb71e9885e1..88e4e11648c 100755 --- a/build/tfs/darwin/build.sh +++ b/build/tfs/darwin/build.sh @@ -1,6 +1,7 @@ #!/bin/sh -. build/tfs/common/common.sh +. ./scripts/env.sh +. ./build/tfs/common/common.sh export VSCODE_MIXIN_PASSWORD="$1" export AZURE_STORAGE_ACCESS_KEY="$2" @@ -12,7 +13,7 @@ VSO_PAT="$6" echo "machine monacotools.visualstudio.com password $VSO_PAT" > ~/.netrc step "Install dependencies" \ - ./scripts/npm.sh install + npm install step "Mix in repository from vscode-distro" \ npm run gulp -- mixin diff --git a/build/tfs/linux/build.sh b/build/tfs/linux/build.sh index f86e9f71827..ec5485416e5 100755 --- a/build/tfs/linux/build.sh +++ b/build/tfs/linux/build.sh @@ -1,6 +1,7 @@ #!/bin/bash -. build/tfs/common/common.sh +. ./scripts/env.sh +. ./build/tfs/common/common.sh export ARCH="$1" export VSCODE_MIXIN_PASSWORD="$2" @@ -14,7 +15,7 @@ VSO_PAT="$8" echo "machine monacotools.visualstudio.com password $VSO_PAT" > ~/.netrc step "Install dependencies" \ - ./scripts/npm.sh install --arch=$ARCH --unsafe-perm + npm install --arch=$ARCH --unsafe-perm step "Mix in repository from vscode-distro" \ npm run gulp -- mixin diff --git a/scripts/env.sh b/scripts/env.sh new file mode 100755 index 00000000000..66860f099fe --- /dev/null +++ b/scripts/env.sh @@ -0,0 +1,6 @@ +#!/bin/bash +export npm_config_disturl=https://atom.io/download/electron +export npm_config_target=$(node -p "require('./package.json').version") +export npm_config_runtime=electron +export npm_config_cache="$HOME/.npm-electron" +mkdir -p "$npm_config_cache" \ No newline at end of file From 15a6f0b4e9bbfe82b7c84b7eede7affb7057fc31 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 17 May 2017 16:44:14 +0200 Subject: [PATCH 0527/1164] fix --- scripts/env.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/env.sh b/scripts/env.sh index 66860f099fe..35d09f66bb2 100755 --- a/scripts/env.sh +++ b/scripts/env.sh @@ -1,6 +1,6 @@ #!/bin/bash export npm_config_disturl=https://atom.io/download/electron -export npm_config_target=$(node -p "require('./package.json').version") +export npm_config_target=$(node -p "require('./package.json').electronVersion") export npm_config_runtime=electron export npm_config_cache="$HOME/.npm-electron" mkdir -p "$npm_config_cache" \ No newline at end of file From 65d736eea88ce3e62214bd75ece6df7513aceff1 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 17 May 2017 16:46:08 +0200 Subject: [PATCH 0528/1164] fix windows build --- build/tfs/win32/1_build.ps1 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index 940cf92a7a3..bd13cb3c821 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -8,11 +8,17 @@ Param( # In order to get _netrc to work, we need a HOME variable setup $env:HOME=$env:USERPROFILE +$env:npm_config_disturl="https://atom.io/download/electron" +$env:npm_config_target="1.6.6" +$env:npm_config_runtime="electron" +$env:npm_config_cache="$HOME/.npm-electron" +mkdir -p "$env:npm_config_cache" + # Create a _netrc file to download distro dependencies "machine monacotools.visualstudio.com password ${vsoPAT}" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII step "Install dependencies" { - exec { & .\scripts\npm.bat install } + exec { & npm install } } $env:VSCODE_MIXIN_PASSWORD = $mixinPassword From d4f3981b74900af494770b6c21e297d95760a155 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 17 May 2017 16:49:07 +0200 Subject: [PATCH 0529/1164] tfs win build --- build/tfs/win32/1_build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index bd13cb3c821..80523ea3e09 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -12,7 +12,7 @@ $env:npm_config_disturl="https://atom.io/download/electron" $env:npm_config_target="1.6.6" $env:npm_config_runtime="electron" $env:npm_config_cache="$HOME/.npm-electron" -mkdir -p "$env:npm_config_cache" +# mkdir -p "$env:npm_config_cache" # Create a _netrc file to download distro dependencies "machine monacotools.visualstudio.com password ${vsoPAT}" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII From d7d749b65a3e71b8dfdeebcbd25981a2752cf311 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Wed, 17 May 2017 08:35:06 -0700 Subject: [PATCH 0530/1164] Add 'more' to the Recent section (fixes #25583) --- .../page/electron-browser/vs_code_welcome_page.ts | 1 + .../welcome/page/electron-browser/welcomePage.css | 4 ++++ .../welcome/page/electron-browser/welcomePage.ts | 3 ++- .../walkThrough/electron-browser/walkThroughPart.ts | 11 +++++++++++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts b/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts index 90c5975cded..dbc50a757c3 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts +++ b/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts @@ -32,6 +32,7 @@ export default () => `

    ${escape(localize('welcomePage.recent', "Recent"))}

    ${escape(localize('welcomePage.noRecentFolders', "No recent folders"))}

    diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css index 49de2c1751e..78cee53838d 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css +++ b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css @@ -138,6 +138,10 @@ display: initial; } +.monaco-workbench > .part.editor > .content .welcomePage .splash .recent li.moreRecent { + margin-top: 5px; +} + .monaco-workbench > .part.editor > .content .welcomePage .splash .recent li { min-width: 0; white-space: nowrap; diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts index 9501600cec0..cb7607b1648 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts +++ b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts @@ -160,6 +160,7 @@ class WelcomePage { return; } const ul = container.querySelector('.recent ul'); + const before = ul.firstElementChild; folders.slice(0, 5).forEach(folder => { const li = document.createElement('li'); @@ -191,7 +192,7 @@ class WelcomePage { span.title = folder; li.appendChild(span); - ul.appendChild(li); + ul.insertBefore(li, before); }); }).then(null, onUnexpectedError); diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts index fc6f2c76630..2fcbace413f 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts @@ -309,6 +309,7 @@ export class WalkThroughPart extends BaseEditor { this.content.innerHTML = content; this.updateSizeClasses(); this.decorateContent(); + this.contentDisposables.push(this.keybindingService.onDidUpdateKeybindings(() => this.decorateContent())); if (input.onReady) { input.onReady(this.content.firstElementChild as HTMLElement); } @@ -447,9 +448,19 @@ export class WalkThroughPart extends BaseEditor { const command = key.getAttribute('data-command'); const keybinding = command && this.keybindingService.lookupKeybinding(command); const label = keybinding ? keybinding.getLabel() : UNBOUND_COMMAND; + while (key.firstChild) { + key.removeChild(key.firstChild); + } key.appendChild(document.createTextNode(label)); }); + const ifkeys = this.content.querySelectorAll('.if_shortcut[data-command]'); + Array.prototype.forEach.call(ifkeys, (key: HTMLElement) => { + const command = key.getAttribute('data-command'); + const keybinding = command && this.keybindingService.lookupKeybinding(command); + key.style.display = !keybinding ? 'none' : ''; + }); } + private saveTextEditorViewState(resource: URI): void { const memento = this.getMemento(this.storageService, Scope.WORKSPACE); let editorViewStateMemento = memento[WALK_THROUGH_EDITOR_VIEW_STATE_PREFERENCE_KEY]; From ed6b7a8bfd2969cf9673b5e974eca4e91f6e8727 Mon Sep 17 00:00:00 2001 From: Michel Kaporin Date: Wed, 17 May 2017 17:37:44 +0200 Subject: [PATCH 0531/1164] Fixes #25777 --- src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts | 1 + src/vs/workbench/parts/debug/browser/exceptionWidget.ts | 2 +- .../workbench/parts/debug/browser/media/exceptionWidget.css | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts b/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts index b4441f6b13a..1c987bf7d9f 100644 --- a/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts +++ b/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts @@ -275,6 +275,7 @@ export abstract class ZoneWidget extends Widget implements IHorizontalSashLayout // Render the widget as zone (rendering) and widget (lifecycle) const viewZoneDomNode = document.createElement('div'); + viewZoneDomNode.style.overflow = 'hidden'; const lineHeight = this.editor.getConfiguration().lineHeight; // adjust heightInLines to viewport diff --git a/src/vs/workbench/parts/debug/browser/exceptionWidget.ts b/src/vs/workbench/parts/debug/browser/exceptionWidget.ts index 7e5f9676374..a54e0e1ff20 100644 --- a/src/vs/workbench/parts/debug/browser/exceptionWidget.ts +++ b/src/vs/workbench/parts/debug/browser/exceptionWidget.ts @@ -33,7 +33,7 @@ export class ExceptionWidget extends ZoneWidget { @IThemeService themeService: IThemeService, @IInstantiationService private instantiationService: IInstantiationService ) { - super(editor, { showFrame: true, showArrow: true, frameWidth: 1 }); + super(editor, { showFrame: true, showArrow: true, frameWidth: 1, className: 'exception-widget-container' }); this._backgroundColor = Color.white; diff --git a/src/vs/workbench/parts/debug/browser/media/exceptionWidget.css b/src/vs/workbench/parts/debug/browser/media/exceptionWidget.css index 07cafebe864..ba5443e0a2c 100644 --- a/src/vs/workbench/parts/debug/browser/media/exceptionWidget.css +++ b/src/vs/workbench/parts/debug/browser/media/exceptionWidget.css @@ -3,6 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +.monaco-editor .zone-widget.exception-widget-container { + overflow: hidden; +} + .monaco-editor .zone-widget .zone-widget-container.exception-widget { padding: 6px 10px; white-space: pre-wrap; From b12085b2e769ea7b5a33c8ad89ad4d85ba0b0589 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Wed, 17 May 2017 08:46:25 -0700 Subject: [PATCH 0532/1164] Add hint about preview to theme selector (fixes #26057) --- .../parts/themes/electron-browser/themes.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts b/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts index 9724e10c4ae..9dfc911fc99 100644 --- a/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts +++ b/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts @@ -70,7 +70,7 @@ export class SelectColorThemeAction extends Action { ); }; - const placeHolder = localize('themes.selectTheme', "Select Color Theme"); + const placeHolder = localize('themes.selectTheme', "Select Color Theme (Up/Down Keys to Preview)"); const autoFocusIndex = firstIndex(picks, p => p.id === currentTheme.id); const delayer = new Delayer(100); From cc8771da0b0037e0f11374d132bd4617cab8b765 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 17 May 2017 16:42:31 +0200 Subject: [PATCH 0533/1164] :lipstick: --- src/vs/workbench/electron-browser/bootstrap/index.js | 4 ++-- src/vs/workbench/electron-browser/workbench.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/electron-browser/bootstrap/index.js b/src/vs/workbench/electron-browser/bootstrap/index.js index c86ae1ddbbf..6e787311d84 100644 --- a/src/vs/workbench/electron-browser/bootstrap/index.js +++ b/src/vs/workbench/electron-browser/bootstrap/index.js @@ -159,7 +159,7 @@ function main() { // In the bundled version the nls plugin is packaged with the loader so the NLS Plugins // loads as soon as the loader loads. To be able to have pseudo translation - const loaderTimer = startTimer('require:loader.js') + const loaderTimer = startTimer('load:loader') createScript(rootUrl + '/vs/loader.js', function () { define('fs', ['original-fs'], function (originalFS) { return originalFS; }); // replace the patched electron fs with the original node fs for all AMD code loaderTimer.stop(); @@ -192,7 +192,7 @@ function main() { beforeLoadWorkbenchMain: Date.now() }; - const workbenchMainTimer = startTimer('require:workbench.main') + const workbenchMainTimer = startTimer('load:workbench.main') require([ 'vs/workbench/electron-browser/workbench.main', 'vs/nls!vs/workbench/electron-browser/workbench.main', diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 4a47295048f..0899853678e 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -298,7 +298,7 @@ export class Workbench implements IPartService { } viewletRestoreStopWatch = StopWatch.create(); - const tick = startTimer(`restoreViewlet:${viewletIdToRestore}`); + const tick = startTimer(`restore:${viewletIdToRestore}`); compositeAndEditorPromises.push(tick.while(this.viewletService.openViewlet(viewletIdToRestore)).then(() => { viewletRestoreStopWatch.stop(); })); From 028a86d4c7dc0a6ae01ab0a25c86a4c939ad8a7d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 17 May 2017 16:46:16 +0200 Subject: [PATCH 0534/1164] fix bad merge --- src/vs/workbench/electron-browser/bootstrap/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/electron-browser/bootstrap/index.js b/src/vs/workbench/electron-browser/bootstrap/index.js index 6e787311d84..c01da62847a 100644 --- a/src/vs/workbench/electron-browser/bootstrap/index.js +++ b/src/vs/workbench/electron-browser/bootstrap/index.js @@ -14,7 +14,7 @@ if (window.location.search.indexOf('prof-startup') >= 0) { /*global window,document,define*/ -const startTimer = require('../../../base/common/startupTimers').startTimer; +const startTimer = require('../../../base/node/startupTimers').startTimer; const path = require('path'); const electron = require('electron'); const remote = electron.remote; From 5573e3a64fd904d6d8ff72cd8c34dcf6f3444e03 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Wed, 17 May 2017 10:39:17 -0700 Subject: [PATCH 0535/1164] Add interactive playground to Help menu (fixes #23481) --- src/vs/code/electron-main/menus.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index d6dc264d311..91ccab243c9 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -926,6 +926,7 @@ export class VSCodeMenu { const keyboardShortcutsUrl = isLinux ? product.keyboardShortcutsUrlLinux : isMacintosh ? product.keyboardShortcutsUrlMac : product.keyboardShortcutsUrlWin; arrays.coalesce([ new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miWelcome', comment: ['&& denotes a mnemonic'] }, "&&Welcome")), click: () => this.windowsService.sendToFocused('vscode:runAction', 'workbench.action.showWelcomePage') }), + new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miInteractivePlayground', comment: ['&& denotes a mnemonic'] }, "&&Interactive Playground")), click: () => this.windowsService.sendToFocused('vscode:runAction', 'workbench.action.showInteractivePlayground') }), product.documentationUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miDocumentation', comment: ['&& denotes a mnemonic'] }, "&&Documentation")), click: () => this.windowsService.sendToFocused('vscode:runAction', 'workbench.action.openDocumentationUrl') }) : null, product.releaseNotesUrl ? new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'miReleaseNotes', comment: ['&& denotes a mnemonic'] }, "&&Release Notes")), click: () => this.windowsService.sendToFocused('vscode:runAction', 'update.showCurrentReleaseNotes') }) : null, __separator__(), From ecf1ca70d650505e9c046cf5f6a5d0b0e13e732c Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 17 May 2017 10:50:18 -0700 Subject: [PATCH 0536/1164] node-pty@0.6.5 Fixes #17609 --- npm-shrinkwrap.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 84aa4bbba28..35505b635ab 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -338,9 +338,9 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, "node-pty": { - "version": "0.6.4", - "from": "node-pty@0.6.4", - "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-0.6.4.tgz", + "version": "0.6.5", + "from": "node-pty@0.6.5", + "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-0.6.5.tgz", "dependencies": { "nan": { "version": "2.5.0", diff --git a/package.json b/package.json index 850dc7a4a01..5ea6aaffec2 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "jschardet": "^1.4.2", "minimist": "1.2.0", "native-keymap": "1.2.4", - "node-pty": "0.6.4", + "node-pty": "0.6.5", "semver": "4.3.6", "v8-profiler": "jrieken/v8-profiler#vscode", "vscode-debugprotocol": "1.19.0", From e0969a51364576eab0677c067cb0bff320d72f3e Mon Sep 17 00:00:00 2001 From: Ramya Rao Date: Wed, 17 May 2017 11:13:09 -0700 Subject: [PATCH 0537/1164] Toggle expanded docs, add stickyness to expansion (#26783) * Toggle expanded docs, add stickyness to expansion * New command for moving focus to/from details * Store user choice in local storage * Refactoring * Show prev width for suggest list unless docs expand * Add keybinding to Read Less button --- .../contrib/suggest/browser/media/suggest.css | 82 +++++++++++-- .../suggest/browser/suggestController.ts | 18 +++ .../contrib/suggest/browser/suggestWidget.ts | 108 +++++++++++++++--- 3 files changed, 184 insertions(+), 24 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index 2329d006eab..ad198d8aa3f 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -9,15 +9,16 @@ width: 660px; } -.monaco-editor .suggest-widget > .tree, +.monaco-editor .suggest-widget.docs-expanded > .tree, .monaco-editor .suggest-widget > .details { width: 330px; } .monaco-editor .suggest-widget.small, -.monaco-editor .suggest-widget.small > .tree, +.monaco-editor .suggest-widget > .tree, +.monaco-editor .suggest-widget.small.docs-expanded > .tree, .monaco-editor .suggest-widget.small > .details { - width: 400px; + width: 430px; } .monaco-editor .suggest-widget.visible { @@ -72,6 +73,55 @@ font-weight: bold; } +.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header > .go-back, +.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .docs-details { + opacity: 0.6; + background-position: center center; + background-repeat: no-repeat; + background-size: 70%; + color: #0035DD; + cursor: pointer; +} + +.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header > .go-back { + background-image: url('./back.svg'); +} + +.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .docs-details { + background-image: url('./info.svg'); +} + +.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header > .go-back:hover, +.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .docs-details:hover { + opacity: 1; +} + +.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .type-label { + margin-left: 0.8em; + flex: 1; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + opacity: 0.7; +} + +.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .type-label > .monaco-tokenized-source { + display: inline; +} + +.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .docs-details, +.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .type-label, +.monaco-editor .suggest-widget.docs-expanded .monaco-list .monaco-list-row.focused > .contents > .main > .docs-details, +.monaco-editor .suggest-widget.docs-expanded .monaco-list .monaco-list-row.focused > .contents > .main > .type-label { + display: none; +} + +.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused > .contents > .main > .docs-details, +.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused > .contents > .main > .type-label, +.monaco-editor .suggest-widget.docs-expanded.small .monaco-list .monaco-list-row.focused > .contents > .main > .type-label { + display: inline; +} + .monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon { display: block; height: 16px; @@ -141,9 +191,20 @@ white-space: pre-wrap; } -.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .type { +.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header { + padding: 4px 5px; + display: flex; + box-sizing: border-box; + border-bottom: 1px solid rgba(204, 204, 204, 0.5); +} + +.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header > .type { + flex: 2; + overflow: hidden; + text-overflow: ellipsis; opacity: 0.7; word-break: break-all; + margin: 0; } .monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > p { @@ -155,12 +216,19 @@ display: none; } -/* High Contrast Theming */ +/* Dark theme */ -.monaco-editor.hc-black .suggest-widget .details > .monaco-scrollable-element > .body > .docs { - color: #C07A7A; +.monaco-editor.vs-dark .suggest-widget .details > .monaco-scrollable-element > .body > .header { + border-color: rgba(85,85,85,0.5); } +.monaco-editor.vs-dark .suggest-widget .details > .monaco-scrollable-element > .body > .header > .go-back, +.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .docs-details { + color: #4E94CE; +} + +/* High Contrast Theming */ + .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon, .monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon { background-image: url('Misc_inverse_16x.svg'); } diff --git a/src/vs/editor/contrib/suggest/browser/suggestController.ts b/src/vs/editor/contrib/suggest/browser/suggestController.ts index 04252c5d78c..0468b72476d 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestController.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestController.ts @@ -262,6 +262,12 @@ export class SuggestController implements IEditorContribution { } toggleSuggestionDetails(): void { + if (this._widget) { + this._widget.toggleDetails(); + } + } + + toggleSuggestionFocus(): void { if (this._widget) { this._widget.toggleDetailsFocus(); } @@ -408,3 +414,15 @@ CommonEditorRegistry.registerEditorCommand(new SuggestCommand({ mac: { primary: KeyMod.WinCtrl | KeyCode.Space } } })); + +CommonEditorRegistry.registerEditorCommand(new SuggestCommand({ + id: 'toggleSuggestionFocus', + precondition: SuggestContext.Visible, + handler: x => x.toggleSuggestionFocus(), + kbOpts: { + weight: weight, + kbExpr: EditorContextKeys.textFocus, + primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.Space, + mac: { primary: KeyMod.WinCtrl | KeyMod.Alt | KeyCode.Space } + } +})); diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 2a169a02ec7..6b52946e154 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -13,7 +13,7 @@ import Event, { Emitter, chain } from 'vs/base/common/event'; import { TPromise } from 'vs/base/common/winjs.base'; import { isPromiseCanceledError, onUnexpectedError } from 'vs/base/common/errors'; import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; -import { addClass, append, $, hide, removeClass, show, toggleClass, getDomNodePagePosition } from 'vs/base/browser/dom'; +import { addClass, append, $, hide, removeClass, show, toggleClass, getDomNodePagePosition, hasClass } from 'vs/base/browser/dom'; import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; import { IDelegate, IListEvent, IRenderer } from 'vs/base/browser/ui/list/list'; import { List } from 'vs/base/browser/ui/list/listWidget'; @@ -30,6 +30,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { attachListStyler } from 'vs/platform/theme/common/styler'; import { IThemeService, ITheme, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { registerColor, editorWidgetBackground, listFocusBackground, activeContrastBorder, listHighlightForeground, editorForeground, editorWidgetBorder } from 'vs/platform/theme/common/colorRegistry'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; const sticky = false; // for development purposes @@ -38,6 +39,8 @@ interface ISuggestionTemplateData { icon: HTMLElement; colorspan: HTMLElement; highlightedLabel: HighlightedLabel; + typeLabel: HTMLElement; + documentationDetails: HTMLElement; disposables: IDisposable[]; } @@ -66,15 +69,12 @@ function canExpandCompletionItem(item: ICompletionItem) { class Renderer implements IRenderer { - private triggerKeybindingLabel: string; - constructor( private widget: SuggestWidget, private editor: ICodeEditor, - @IKeybindingService keybindingService: IKeybindingService + private triggerKeybindingLabel: string ) { - const kb = keybindingService.lookupKeybinding('editor.action.triggerSuggest'); - this.triggerKeybindingLabel = !kb ? '' : ` (${kb.getLabel()})`; + } get templateId(): string { @@ -93,6 +93,11 @@ class Renderer implements IRenderer { const main = append(text, $('.main')); data.highlightedLabel = new HighlightedLabel(main); data.disposables.push(data.highlightedLabel); + data.typeLabel = append(main, $('span.type-label')); + + data.documentationDetails = append(main, $('span.docs-details')); + data.documentationDetails.title = nls.localize('readMore', "Read More...{0}", this.triggerKeybindingLabel); + const configureFont = () => { const configuration = this.editor.getConfiguration(); const fontFamily = configuration.fontInfo.fontFamily; @@ -106,6 +111,8 @@ class Renderer implements IRenderer { main.style.lineHeight = lineHeightPx; data.icon.style.height = lineHeightPx; data.icon.style.width = lineHeightPx; + data.documentationDetails.style.height = lineHeightPx; + data.documentationDetails.style.width = lineHeightPx; }; configureFont(); @@ -139,7 +146,24 @@ class Renderer implements IRenderer { } data.highlightedLabel.set(suggestion.label, createMatches(element.matches)); + data.typeLabel.textContent = (suggestion.detail || '').replace(/\n.*$/m, ''); + if (canExpandCompletionItem(element)) { + show(data.documentationDetails); + data.documentationDetails.onmousedown = e => { + e.stopPropagation(); + e.preventDefault(); + }; + data.documentationDetails.onclick = e => { + e.stopPropagation(); + e.preventDefault(); + this.widget.toggleDetails(); + }; + } else { + hide(data.documentationDetails); + data.documentationDetails.onmousedown = null; + data.documentationDetails.onclick = null; + } } @@ -161,6 +185,8 @@ const enum State { class SuggestionDetails { private el: HTMLElement; + private back: HTMLElement; + private header: HTMLElement; private scrollbar: DomScrollableElement; private body: HTMLElement; private type: HTMLElement; @@ -171,7 +197,8 @@ class SuggestionDetails { constructor( container: HTMLElement, private widget: SuggestWidget, - private editor: ICodeEditor + private editor: ICodeEditor, + private triggerKeybindingLabel: string ) { this.disposables = []; @@ -184,7 +211,12 @@ class SuggestionDetails { append(this.el, this.scrollbar.getDomNode()); this.disposables.push(this.scrollbar); - this.type = append(this.body, $('p.type')); + this.header = append(this.body, $('.header')); + this.type = append(this.header, $('p.type')); + + this.back = append(this.header, $('span.go-back')); + this.back.title = nls.localize('goback', "Read less...{0}", triggerKeybindingLabel); + this.docs = append(this.body, $('p.docs')); this.ariaLabel = null; @@ -211,7 +243,17 @@ class SuggestionDetails { this.type.innerText = item.suggestion.detail || ''; this.docs.textContent = item.suggestion.documentation; - this.el.style.height = this.type.clientHeight + this.docs.clientHeight + 'px'; + this.el.style.height = this.type.clientHeight + this.docs.clientHeight + 8 + 'px'; + + this.back.onmousedown = e => { + e.preventDefault(); + e.stopPropagation(); + }; + this.back.onclick = e => { + e.preventDefault(); + e.stopPropagation(); + this.widget.toggleDetails(); + }; this.body.scrollTop = 0; this.scrollbar.scanDomNode(); @@ -251,10 +293,14 @@ class SuggestionDetails { const configuration = this.editor.getConfiguration(); const fontFamily = configuration.fontInfo.fontFamily; const fontSize = configuration.contribInfo.suggestFontSize || configuration.fontInfo.fontSize; + const lineHeight = configuration.contribInfo.suggestLineHeight || configuration.fontInfo.lineHeight; const fontSizePx = `${fontSize}px`; + const lineHeightPx = `${lineHeight}px`; this.el.style.fontSize = fontSizePx; this.type.style.fontFamily = fontFamily; + this.back.style.height = lineHeightPx; + this.back.style.width = lineHeightPx; } dispose(): void { @@ -308,18 +354,24 @@ export class SuggestWidget implements IContentWidget, IDelegate private readonly maxWidgetWidth = 660; private readonly listWidth = 330; - private readonly minWidgetWidth = 400; + private readonly minWidgetWidth = 430; + private storageService: IStorageService; constructor( private editor: ICodeEditor, @ITelemetryService private telemetryService: ITelemetryService, @IContextKeyService contextKeyService: IContextKeyService, @IInstantiationService instantiationService: IInstantiationService, - @IThemeService themeService: IThemeService + @IThemeService themeService: IThemeService, + @IStorageService storageService: IStorageService, + @IKeybindingService keybindingService: IKeybindingService ) { + const kb = keybindingService.lookupKeybinding('editor.action.triggerSuggest'); + const triggerKeybindingLabel = !kb ? '' : ` (${kb.getLabel()})`; + this.isAuto = false; this.focusedItem = null; - + this.storageService = storageService; this.element = $('.editor-widget.suggest-widget'); if (!this.editor.getConfiguration().contribInfo.iconsInSuggestions) { @@ -328,9 +380,9 @@ export class SuggestWidget implements IContentWidget, IDelegate this.messageElement = append(this.element, $('.message')); this.listElement = append(this.element, $('.tree')); - this.details = new SuggestionDetails(this.element, this, this.editor); + this.details = new SuggestionDetails(this.element, this, this.editor, triggerKeybindingLabel); - let renderer: IRenderer = instantiationService.createInstance(Renderer, this, this.editor); + let renderer: IRenderer = instantiationService.createInstance(Renderer, this, this.editor, triggerKeybindingLabel); this.list = new List(this.listElement, this, [renderer], { useShadows: false, @@ -547,8 +599,11 @@ export class SuggestWidget implements IContentWidget, IDelegate this.show(); break; case State.Open: - hide(this.messageElement); - show(this.listElement, this.details.element); + hide(this.messageElement, this.details.element); + show(this.listElement); + if (this.storageService.getBoolean('expandSuggestionDocs', StorageScope.GLOBAL, false)) { + show(this.details.element); + } this.show(); break; case State.Frozen: @@ -740,10 +795,26 @@ export class SuggestWidget implements IContentWidget, IDelegate } } + toggleDetails(): void { + let expandDocs = this.storageService.getBoolean('expandSuggestionDocs', StorageScope.GLOBAL, false); + if (expandDocs) { + hide(this.details.element); + removeClass(this.element, 'docs-expanded'); + } else { + show(this.details.element); + addClass(this.element, 'docs-expanded'); + this.show(); + } + this.storageService.store('expandSuggestionDocs', !expandDocs, StorageScope.GLOBAL); + } + showDetails(): void { if (this.state !== State.Open && this.state !== State.Details) { return; } + if (this.storageService.getBoolean('expandSuggestionDocs', StorageScope.GLOBAL, false)) { + addClass(this.element, 'docs-expanded'); + } this.show(); this.editor.focus(); @@ -792,7 +863,10 @@ export class SuggestWidget implements IContentWidget, IDelegate private updateWidgetHeight(): number { let height = 0; - let maxSuggestionsToShow = this.editor.getLayoutInfo().contentWidth > this.minWidgetWidth ? 11 : 5; + let maxSuggestionsToShow = 11; + if (hasClass(this.element, 'small')) { + maxSuggestionsToShow = 5; + } if (this.state === State.Empty || this.state === State.Loading) { height = this.unfocusedHeight; From b8521876bb14a4ce5720da31baa3904bf2505a00 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 17 May 2017 22:16:40 +0200 Subject: [PATCH 0538/1164] fix windows build --- build/tfs/win32/1_build.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index 80523ea3e09..88b39fea4f9 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -12,6 +12,7 @@ $env:npm_config_disturl="https://atom.io/download/electron" $env:npm_config_target="1.6.6" $env:npm_config_runtime="electron" $env:npm_config_cache="$HOME/.npm-electron" +$env:npm_config_arch="ia32" # mkdir -p "$env:npm_config_cache" # Create a _netrc file to download distro dependencies From dea44c8f0b4022f6c138ddae2e6b8874bdedad1e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 17 May 2017 14:17:31 -0700 Subject: [PATCH 0539/1164] Preserve Webview Scroll Position (#26426) * Preserve Webview Scroll Position Fixes #22995 **Bug** If you switch away from an editor that users a webview, the scroll position is currently not preserved. This effects our release notes and the markdown preview. The root cause is that the webview is disposed of when the view is hidden. **Fix** Add some presisted state to track scrollProgress through the webview. Use this state in the standard html editor and in the release notes. * Use view state * Continue prototype memento based approach * Preserve Webview Scroll Position Fixes #22995 **Bug** If you switch away from an editor that users a webview, the scroll position is currently not preserved. This effects our release notes and the markdown preview. The root cause is that the webview is disposed of when the view is hidden. **Fix** Add some presisted state to track scrollProgress through the webview. Use this state in the standard html editor and in the release notes. * Revert changes to ReleaseNotesInput --- .../browser/parts/editor/webviewEditor.ts | 70 +++++++++++++++++++ .../parts/html/browser/htmlPreviewPart.ts | 48 +++++++++++-- .../parts/html/browser/webview-pre.js | 61 +++++++++++++--- .../workbench/parts/html/browser/webview.ts | 17 +++++ .../workbench/parts/html/common/htmlInput.ts | 2 +- .../electron-browser/releaseNotesEditor.ts | 45 ++++++++++-- .../electron-browser/releaseNotesInput.ts | 1 + 7 files changed, 223 insertions(+), 21 deletions(-) create mode 100644 src/vs/workbench/browser/parts/editor/webviewEditor.ts diff --git a/src/vs/workbench/browser/parts/editor/webviewEditor.ts b/src/vs/workbench/browser/parts/editor/webviewEditor.ts new file mode 100644 index 00000000000..cf852a3d1a5 --- /dev/null +++ b/src/vs/workbench/browser/parts/editor/webviewEditor.ts @@ -0,0 +1,70 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { BaseEditor } from "vs/workbench/browser/parts/editor/baseEditor"; +import URI from "vs/base/common/uri"; +import { IStorageService } from "vs/platform/storage/common/storage"; +import { Scope } from "vs/workbench/common/memento"; + +export interface HtmlPreviewEditorViewState { + scrollYPercentage: number; +} + +interface HtmlPreviewEditorViewStates { + 0?: HtmlPreviewEditorViewState; + 1?: HtmlPreviewEditorViewState; + 2?: HtmlPreviewEditorViewState; +} + +/** + * This class is only intended to be subclassed and not instantiated. + */ +export abstract class WebviewEditor extends BaseEditor { + constructor( + id: string, + telemetryService: ITelemetryService, + themeService: IThemeService, + private storageService: IStorageService + ) { + super(id, telemetryService, themeService); + } + + private get viewStateStorageKey(): string { + return this.getId() + '.editorViewState'; + } + + protected saveViewState(resource: URI | string, editorViewState: HtmlPreviewEditorViewState): void { + const memento = this.getMemento(this.storageService, Scope.WORKSPACE); + let editorViewStateMemento = memento[this.viewStateStorageKey]; + if (!editorViewStateMemento) { + editorViewStateMemento = Object.create(null); + memento[this.viewStateStorageKey] = editorViewStateMemento; + } + + let fileViewState: HtmlPreviewEditorViewStates = editorViewStateMemento[resource.toString()]; + if (!fileViewState) { + fileViewState = Object.create(null); + editorViewStateMemento[resource.toString()] = fileViewState; + } + + if (typeof this.position === 'number') { + fileViewState[this.position] = editorViewState; + } + } + + protected loadViewState(resource: URI | string): HtmlPreviewEditorViewState | null { + const memento = this.getMemento(this.storageService, Scope.WORKSPACE); + const editorViewStateMemento = memento[this.viewStateStorageKey]; + if (editorViewStateMemento) { + const fileViewState: HtmlPreviewEditorViewStates = editorViewStateMemento[resource.toString()]; + if (fileViewState) { + return fileViewState[this.position]; + } + } + return null; + } +} \ No newline at end of file diff --git a/src/vs/workbench/parts/html/browser/htmlPreviewPart.ts b/src/vs/workbench/parts/html/browser/htmlPreviewPart.ts index f310cdcb4d1..b6999b4c70d 100644 --- a/src/vs/workbench/parts/html/browser/htmlPreviewPart.ts +++ b/src/vs/workbench/parts/html/browser/htmlPreviewPart.ts @@ -12,7 +12,6 @@ import { IModel } from 'vs/editor/common/editorCommon'; import { Dimension, Builder } from 'vs/base/browser/builder'; import { empty as EmptyDisposable, IDisposable, dispose, IReference } from 'vs/base/common/lifecycle'; import { EditorOptions, EditorInput } from 'vs/workbench/common/editor'; -import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { Position } from 'vs/platform/editor/common/editor'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; @@ -24,12 +23,13 @@ import { ITextModelResolverService, ITextEditorModel } from 'vs/editor/common/se import { Parts, IPartService } from 'vs/workbench/services/part/common/partService'; import Webview from './webview'; - +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { WebviewEditor } from 'vs/workbench/browser/parts/editor/webviewEditor'; /** * An implementation of editor for showing HTML content in an IFrame by leveraging the HTML input. */ -export class HtmlPreviewPart extends BaseEditor { +export class HtmlPreviewPart extends WebviewEditor { static ID: string = 'workbench.editor.htmlPreviewPart'; @@ -46,15 +46,18 @@ export class HtmlPreviewPart extends BaseEditor { private _modelChangeSubscription = EmptyDisposable; private _themeChangeSubscription = EmptyDisposable; + private scrollYPercentage: number = 0; + constructor( @ITelemetryService telemetryService: ITelemetryService, @ITextModelResolverService textModelResolverService: ITextModelResolverService, @IThemeService protected themeService: IThemeService, @IOpenerService openerService: IOpenerService, @IWorkspaceContextService contextService: IWorkspaceContextService, - @IPartService private partService: IPartService + @IPartService private partService: IPartService, + @IStorageService storageService: IStorageService ) { - super(HtmlPreviewPart.ID, telemetryService, themeService); + super(HtmlPreviewPart.ID, telemetryService, themeService, storageService); this._textModelResolverService = textModelResolverService; this._openerService = openerService; @@ -84,11 +87,19 @@ export class HtmlPreviewPart extends BaseEditor { if (!this._webview) { this._webview = new Webview(this._container, this.partService.getContainer(Parts.EDITOR_PART)); this._webview.baseUrl = this._baseUrl && this._baseUrl.toString(true); + if (this.input && this.input instanceof HtmlInput) { + const state = this.loadViewState(this.input.getResource()); + this.scrollYPercentage = state ? state.scrollYPercentage : 0; + this.webview.initialScrollProgress = this.scrollYPercentage; + } this._webviewDisposables = [ this._webview, this._webview.onDidClickLink(uri => this._openerService.open(uri)), - this._webview.onDidLoadContent(data => this.telemetryService.publicLog('previewHtml', data.stats)) + this._webview.onDidLoadContent(data => this.telemetryService.publicLog('previewHtml', data.stats)), + this._webview.onDidScroll(data => { + this.scrollYPercentage = data.scrollYPercentage; + }) ]; } return this._webview; @@ -143,11 +154,25 @@ export class HtmlPreviewPart extends BaseEditor { } public clearInput(): void { + if (this.input instanceof HtmlInput) { + this.saveViewState(this.input.getResource(), { + scrollYPercentage: this.scrollYPercentage + }); + } dispose(this._modelRef); this._modelRef = undefined; super.clearInput(); } + public shutdown(): void { + if (this.input instanceof HtmlInput) { + this.saveViewState(this.input.getResource(), { + scrollYPercentage: this.scrollYPercentage + }); + } + super.shutdown(); + } + public sendMessage(data: any): void { this.webview.sendMessage(data); } @@ -158,6 +183,12 @@ export class HtmlPreviewPart extends BaseEditor { return TPromise.as(undefined); } + if (this.input instanceof HtmlInput) { + this.saveViewState(this.input.getResource(), { + scrollYPercentage: this.scrollYPercentage + }); + } + if (this._modelRef) { this._modelRef.dispose(); } @@ -182,12 +213,15 @@ export class HtmlPreviewPart extends BaseEditor { this._modelChangeSubscription = this.model.onDidChangeContent(() => { if (this.model) { + this.scrollYPercentage = 0; this.webview.contents = this.model.getLinesContent(); } }); + const state = this.loadViewState(resourceUri); + this.scrollYPercentage = state ? state.scrollYPercentage : 0; this.webview.baseUrl = resourceUri.toString(true); this.webview.contents = this.model.getLinesContent(); - + this.webview.initialScrollProgress = this.scrollYPercentage; return undefined; }); }); diff --git a/src/vs/workbench/parts/html/browser/webview-pre.js b/src/vs/workbench/parts/html/browser/webview-pre.js index 8c8a30e742f..51c9c257225 100644 --- a/src/vs/workbench/parts/html/browser/webview-pre.js +++ b/src/vs/workbench/parts/html/browser/webview-pre.js @@ -9,7 +9,9 @@ const ipcRenderer = require('electron').ipcRenderer; - const initData = {}; + const initData = { + initialScrollProgress: undefined + }; function styleBody(body) { if (!body) { @@ -26,10 +28,14 @@ return document.getElementById('_target'); } + /** + * @param {MouseEvent} event + */ function handleInnerClick(event) { if (!event || !event.view || !event.view.document) { return; } + /** @type {any} */ var node = event.target; while (node) { if (node.tagName === "A" && node.href) { @@ -51,6 +57,27 @@ } } + var isHandlingScroll = false; + function handleInnerScroll(event) { + if (isHandlingScroll) { + return; + } + + const progress = event.target.body.scrollTop / event.target.body.clientHeight; + if (isNaN(progress)) { + return; + } + + isHandlingScroll = true; + window.requestAnimationFrame(function () { + try { + ipcRenderer.sendToHost('did-scroll', progress); + } catch (e) { + // noop + } + isHandlingScroll = false; + }); + } document.addEventListener("DOMContentLoaded", function (event) { ipcRenderer.on('baseUrl', function (event, value) { @@ -123,7 +150,23 @@ } // keep current scrollTop around and use later - const scrollTop = frame && frame.contentDocument && frame.contentDocument.body ? frame.contentDocument.body.scrollTop : 0; + let setInitialScrollPosition; + if (frame) { + const scrollY = frame.contentDocument && frame.contentDocument.body ? frame.contentDocument.body.scrollTop : 0; + setInitialScrollPosition = function (body) { + body.scrollTop = scrollY; + } + } else { + // First load + setInitialScrollPosition = function (body, window) { + body.scrollTop = 0; + if (!isNaN(initData.initialScrollProgress)) { + window.addEventListener('load', function() { + body.scrollTop = body.clientHeight * initData.initialScrollProgress + }); + } + } + } const newFrame = document.createElement('iframe'); newFrame.setAttribute('id', '_target'); @@ -140,17 +183,12 @@ }; newFrame.contentWindow.addEventListener('DOMContentLoaded', function (e) { - /** - * @type {any} - */ + /** @type {any} */ const contentDocument = e.target; if (contentDocument.body) { - // Workaround for https://github.com/Microsoft/vscode/issues/12865 // check new scrollTop and reset if neccessary - if (scrollTop !== contentDocument.body.scrollTop) { - contentDocument.body.scrollTop = scrollTop; - } + setInitialScrollPosition(contentDocument.body, this); // Bubble out link clicks contentDocument.body.addEventListener('click', handleInnerClick); @@ -166,6 +204,7 @@ const newFrame = getTarget(); if (newFrame.contentDocument === contentDocument) { newFrame.style.display = 'block'; + this.addEventListener('scroll', handleInnerScroll); } }); @@ -186,6 +225,10 @@ } }); + ipcRenderer.on('initial-scroll-position', function (event, progress) { + initData.initialScrollProgress = progress; + }); + // forward messages from the embedded iframe window.onmessage = function (message) { ipcRenderer.sendToHost(message.data.command, message.data.data); diff --git a/src/vs/workbench/parts/html/browser/webview.ts b/src/vs/workbench/parts/html/browser/webview.ts index 7b81825984d..b7a13ed8f07 100644 --- a/src/vs/workbench/parts/html/browser/webview.ts +++ b/src/vs/workbench/parts/html/browser/webview.ts @@ -52,6 +52,8 @@ export default class Webview { private _onDidClickLink = new Emitter(); private _onDidLoadContent = new Emitter<{ stats: any }>(); + private _onDidScroll = new Emitter<{ scrollYPercentage: number }>(); + constructor( private parent: HTMLElement, private _styleElement: Element @@ -108,6 +110,13 @@ export default class Webview { this.layout(); return; } + + if (event.channel === 'did-scroll') { + if (event.args && typeof event.args[0] === 'number') { + this._onDidScroll.fire({ scrollYPercentage: event.args[0] }); + } + return; + } }) ]; @@ -134,12 +143,20 @@ export default class Webview { return this._onDidLoadContent.event; } + get onDidScroll(): Event<{ scrollYPercentage: number }> { + return this._onDidScroll.event; + } + private _send(channel: string, ...args: any[]): void { this._ready .then(() => this._webview.send(channel, ...args)) .done(void 0, console.error); } + set initialScrollProgress(value: number) { + this._send('initial-scroll-position', value); + } + set contents(value: string[]) { this._send('content', value); } diff --git a/src/vs/workbench/parts/html/common/htmlInput.ts b/src/vs/workbench/parts/html/common/htmlInput.ts index 87b699c7853..e66c1e1f350 100644 --- a/src/vs/workbench/parts/html/common/htmlInput.ts +++ b/src/vs/workbench/parts/html/common/htmlInput.ts @@ -7,5 +7,5 @@ import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; export class HtmlInput extends ResourceEditorInput { - // just a marker class + // marker class } diff --git a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts b/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts index 89c44b66a9e..466aa77c62d 100644 --- a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts +++ b/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts @@ -10,7 +10,6 @@ import { marked } from 'vs/base/common/marked/marked'; import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; import { Builder } from 'vs/base/browser/builder'; import { append, $ } from 'vs/base/browser/dom'; -import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ReleaseNotesInput } from './releaseNotesInput'; @@ -20,6 +19,8 @@ import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IModeService } from 'vs/editor/common/services/modeService'; import { tokenizeToString } from 'vs/editor/common/modes/textToHtmlTokenizer'; import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; +import { WebviewEditor } from 'vs/workbench/browser/parts/editor/webviewEditor'; +import { IStorageService } from "vs/platform/storage/common/storage"; function renderBody(body: string): string { return ` @@ -33,7 +34,7 @@ function renderBody(body: string): string { `; } -export class ReleaseNotesEditor extends BaseEditor { +export class ReleaseNotesEditor extends WebviewEditor { static ID: string = 'workbench.editor.releaseNotes'; @@ -41,15 +42,17 @@ export class ReleaseNotesEditor extends BaseEditor { private webview: WebView; private contentDisposables: IDisposable[] = []; + private scrollYPercentage: number = 0; constructor( @ITelemetryService telemetryService: ITelemetryService, @IThemeService protected themeService: IThemeService, @IOpenerService private openerService: IOpenerService, @IModeService private modeService: IModeService, - @IPartService private partService: IPartService + @IPartService private partService: IPartService, + @IStorageService storageService: IStorageService ) { - super(ReleaseNotesEditor.ID, telemetryService, themeService); + super(ReleaseNotesEditor.ID, telemetryService, themeService, storageService); } createEditor(parent: Builder): void { @@ -92,10 +95,20 @@ export class ReleaseNotesEditor extends BaseEditor { .then(body => { this.webview = new WebView(this.content, this.partService.getContainer(Parts.EDITOR_PART)); this.webview.baseUrl = `https://code.visualstudio.com/raw/`; + + if (this.input && this.input instanceof ReleaseNotesInput) { + const state = this.loadViewState(this.input.version); + if (state) { + this.webview.initialScrollProgress = state.scrollYPercentage; + } + } this.webview.style(this.themeService.getTheme()); this.webview.contents = [body]; this.webview.onDidClickLink(link => this.openerService.open(link), null, this.contentDisposables); + this.webview.onDidScroll(event => { + this.scrollYPercentage = event.scrollYPercentage; + }, null, this.contentDisposables); this.themeService.onThemeChange(themeId => this.webview.style(themeId), null, this.contentDisposables); this.contentDisposables.push(this.webview); this.contentDisposables.push(toDisposable(() => this.webview = null)); @@ -120,4 +133,28 @@ export class ReleaseNotesEditor extends BaseEditor { this.contentDisposables = dispose(this.contentDisposables); super.dispose(); } + + protected getViewState() { + return { + scrollYPercentage: this.scrollYPercentage + }; + } + + public clearInput(): void { + if (this.input instanceof ReleaseNotesInput) { + this.saveViewState(this.input.version, { + scrollYPercentage: this.scrollYPercentage + }); + } + super.clearInput(); + } + + public shutdown(): void { + if (this.input instanceof ReleaseNotesInput) { + this.saveViewState(this.input.version, { + scrollYPercentage: this.scrollYPercentage + }); + } + super.shutdown(); + } } diff --git a/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.ts b/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.ts index 83f6636b877..c7e45a55ebd 100644 --- a/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.ts +++ b/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.ts @@ -13,6 +13,7 @@ export class ReleaseNotesInput extends EditorInput { static get ID() { return 'workbench.releaseNotes.input'; } + get version(): string { return this._version; } get text(): string { return this._text; } From e18df5b2688b9cd1bbe41a61983cbcd36ab5fd0c Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 17 May 2017 14:32:55 -0700 Subject: [PATCH 0540/1164] Screenreader support for when docs are expanded --- .../contrib/suggest/browser/suggestWidget.ts | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 6b52946e154..601dd6efc80 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -356,6 +356,7 @@ export class SuggestWidget implements IContentWidget, IDelegate private readonly listWidth = 330; private readonly minWidgetWidth = 430; private storageService: IStorageService; + private expandDocs: boolean; constructor( private editor: ICodeEditor, @@ -366,6 +367,7 @@ export class SuggestWidget implements IContentWidget, IDelegate @IStorageService storageService: IStorageService, @IKeybindingService keybindingService: IKeybindingService ) { + this.expandDocs = storageService.getBoolean('expandSuggestionDocs', StorageScope.GLOBAL, false); const kb = keybindingService.lookupKeybinding('editor.action.triggerSuggest'); const triggerKeybindingLabel = !kb ? '' : ` (${kb.getLabel()})`; @@ -556,9 +558,12 @@ export class SuggestWidget implements IContentWidget, IDelegate this.list.setFocus([index]); this.list.reveal(index); - this.showDetails(); - this.adjustDocsPosition(); - this._ariaAlert(this._getSuggestionAriaAlertLabel(item)); + + if (this.expandDocs) { + this.showDetails(); + this.adjustDocsPosition(); + this._ariaAlert(this.details.getAriaLabel()); + } }) .then(null, err => !isPromiseCanceledError(err) && onUnexpectedError(err)) .then(() => this.currentSuggestionDetails = null); @@ -599,10 +604,12 @@ export class SuggestWidget implements IContentWidget, IDelegate this.show(); break; case State.Open: - hide(this.messageElement, this.details.element); + hide(this.messageElement); show(this.listElement); - if (this.storageService.getBoolean('expandSuggestionDocs', StorageScope.GLOBAL, false)) { + if (this.expandDocs) { show(this.details.element); + } else { + hide(this.details.element); } this.show(); break; @@ -704,10 +711,6 @@ export class SuggestWidget implements IContentWidget, IDelegate switch (this.state) { case State.Hidden: return false; - case State.Details: - this.list.focusNext(1, true); - this.renderDetails(); - return true; case State.Loading: return !this.isAuto; default: @@ -750,10 +753,6 @@ export class SuggestWidget implements IContentWidget, IDelegate switch (this.state) { case State.Hidden: return false; - case State.Details: - this.list.focusPrevious(1, true); - this.renderDetails(); - return true; case State.Loading: return !this.isAuto; default: @@ -796,23 +795,23 @@ export class SuggestWidget implements IContentWidget, IDelegate } toggleDetails(): void { - let expandDocs = this.storageService.getBoolean('expandSuggestionDocs', StorageScope.GLOBAL, false); - if (expandDocs) { + this.expandDocs = !this.expandDocs; + this.storageService.store('expandSuggestionDocs', this.expandDocs, StorageScope.GLOBAL); + + if (!this.expandDocs) { hide(this.details.element); removeClass(this.element, 'docs-expanded'); } else { - show(this.details.element); - addClass(this.element, 'docs-expanded'); - this.show(); + this.showDetails(); } - this.storageService.store('expandSuggestionDocs', !expandDocs, StorageScope.GLOBAL); } showDetails(): void { if (this.state !== State.Open && this.state !== State.Details) { return; } - if (this.storageService.getBoolean('expandSuggestionDocs', StorageScope.GLOBAL, false)) { + if (this.expandDocs) { + show(this.details.element); addClass(this.element, 'docs-expanded'); } From 14c752b7c2f28f52a284a67d82e40ed134af8616 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 17 May 2017 14:39:54 -0700 Subject: [PATCH 0541/1164] small cleanups to webview --- .../parts/html/browser/htmlPreviewPart.ts | 14 +++++--------- src/vs/workbench/parts/html/browser/webview.ts | 2 +- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/parts/html/browser/htmlPreviewPart.ts b/src/vs/workbench/parts/html/browser/htmlPreviewPart.ts index b6999b4c70d..038c8c4cd99 100644 --- a/src/vs/workbench/parts/html/browser/htmlPreviewPart.ts +++ b/src/vs/workbench/parts/html/browser/htmlPreviewPart.ts @@ -33,8 +33,6 @@ export class HtmlPreviewPart extends WebviewEditor { static ID: string = 'workbench.editor.htmlPreviewPart'; - private _textModelResolverService: ITextModelResolverService; - private _openerService: IOpenerService; private _webview: Webview; private _webviewDisposables: IDisposable[]; private _container: HTMLDivElement; @@ -50,17 +48,15 @@ export class HtmlPreviewPart extends WebviewEditor { constructor( @ITelemetryService telemetryService: ITelemetryService, - @ITextModelResolverService textModelResolverService: ITextModelResolverService, - @IThemeService protected themeService: IThemeService, - @IOpenerService openerService: IOpenerService, + @ITextModelResolverService private textModelResolverService: ITextModelResolverService, + @IThemeService themeService: IThemeService, + @IOpenerService private openerService: IOpenerService, @IWorkspaceContextService contextService: IWorkspaceContextService, @IPartService private partService: IPartService, @IStorageService storageService: IStorageService ) { super(HtmlPreviewPart.ID, telemetryService, themeService, storageService); - this._textModelResolverService = textModelResolverService; - this._openerService = openerService; this._baseUrl = contextService.toResource('/'); } @@ -95,7 +91,7 @@ export class HtmlPreviewPart extends WebviewEditor { this._webviewDisposables = [ this._webview, - this._webview.onDidClickLink(uri => this._openerService.open(uri)), + this._webview.onDidClickLink(uri => this.openerService.open(uri)), this._webview.onDidLoadContent(data => this.telemetryService.publicLog('previewHtml', data.stats)), this._webview.onDidScroll(data => { this.scrollYPercentage = data.scrollYPercentage; @@ -200,7 +196,7 @@ export class HtmlPreviewPart extends WebviewEditor { return super.setInput(input, options).then(() => { const resourceUri = input.getResource(); - return this._textModelResolverService.createModelReference(resourceUri).then(ref => { + return this.textModelResolverService.createModelReference(resourceUri).then(ref => { const model = ref.object; if (model instanceof BaseTextEditorModel) { diff --git a/src/vs/workbench/parts/html/browser/webview.ts b/src/vs/workbench/parts/html/browser/webview.ts index b7a13ed8f07..cfccdeec5b3 100644 --- a/src/vs/workbench/parts/html/browser/webview.ts +++ b/src/vs/workbench/parts/html/browser/webview.ts @@ -93,7 +93,7 @@ export default class Webview { addDisposableListener(this._webview, 'dom-ready', () => { this.layout(); }), - addDisposableListener(this._webview, 'crashed', function () { + addDisposableListener(this._webview, 'crashed', () => { console.error('embedded page crashed'); }), addDisposableListener(this._webview, 'ipc-message', (event) => { From 78298312caeaf01057df124331ce5eb328ca69c4 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 17 May 2017 15:08:01 -0700 Subject: [PATCH 0542/1164] Add close icon to close expanded suggest docs --- .../contrib/suggest/browser/media/back.svg | 1 - .../suggest/browser/media/close-dark.svg | 1 + .../contrib/suggest/browser/media/close.svg | 1 + .../contrib/suggest/browser/media/suggest.css | 18 ++++++------------ .../contrib/suggest/browser/suggestWidget.ts | 14 +++++++------- 5 files changed, 15 insertions(+), 20 deletions(-) delete mode 100644 src/vs/editor/contrib/suggest/browser/media/back.svg create mode 100644 src/vs/editor/contrib/suggest/browser/media/close-dark.svg create mode 100644 src/vs/editor/contrib/suggest/browser/media/close.svg diff --git a/src/vs/editor/contrib/suggest/browser/media/back.svg b/src/vs/editor/contrib/suggest/browser/media/back.svg deleted file mode 100644 index 487340cd69a..00000000000 --- a/src/vs/editor/contrib/suggest/browser/media/back.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/media/close-dark.svg b/src/vs/editor/contrib/suggest/browser/media/close-dark.svg new file mode 100644 index 00000000000..751e89b3b02 --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/media/close-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/media/close.svg b/src/vs/editor/contrib/suggest/browser/media/close.svg new file mode 100644 index 00000000000..fde34404d4e --- /dev/null +++ b/src/vs/editor/contrib/suggest/browser/media/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index ad198d8aa3f..fd183518cc8 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -73,25 +73,24 @@ font-weight: bold; } -.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header > .go-back, +.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header > .close, .monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .docs-details { opacity: 0.6; background-position: center center; background-repeat: no-repeat; background-size: 70%; - color: #0035DD; cursor: pointer; } -.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header > .go-back { - background-image: url('./back.svg'); +.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header > .close { + background-image: url('./close.svg'); } .monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .docs-details { background-image: url('./info.svg'); } -.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header > .go-back:hover, +.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header > .close:hover, .monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .docs-details:hover { opacity: 1; } @@ -218,13 +217,8 @@ /* Dark theme */ -.monaco-editor.vs-dark .suggest-widget .details > .monaco-scrollable-element > .body > .header { - border-color: rgba(85,85,85,0.5); -} - -.monaco-editor.vs-dark .suggest-widget .details > .monaco-scrollable-element > .body > .header > .go-back, -.monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .docs-details { - color: #4E94CE; +.monaco-editor.vs-dark .suggest-widget .details > .monaco-scrollable-element > .body > .header > .close{ + background-image: url('./close-dark.svg'); } /* High Contrast Theming */ diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 601dd6efc80..3fc14e54264 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -185,7 +185,7 @@ const enum State { class SuggestionDetails { private el: HTMLElement; - private back: HTMLElement; + private close: HTMLElement; private header: HTMLElement; private scrollbar: DomScrollableElement; private body: HTMLElement; @@ -214,8 +214,8 @@ class SuggestionDetails { this.header = append(this.body, $('.header')); this.type = append(this.header, $('p.type')); - this.back = append(this.header, $('span.go-back')); - this.back.title = nls.localize('goback', "Read less...{0}", triggerKeybindingLabel); + this.close = append(this.header, $('span.close')); + this.close.title = nls.localize('readLess', "Read less...{0}", triggerKeybindingLabel); this.docs = append(this.body, $('p.docs')); this.ariaLabel = null; @@ -245,11 +245,11 @@ class SuggestionDetails { this.el.style.height = this.type.clientHeight + this.docs.clientHeight + 8 + 'px'; - this.back.onmousedown = e => { + this.close.onmousedown = e => { e.preventDefault(); e.stopPropagation(); }; - this.back.onclick = e => { + this.close.onclick = e => { e.preventDefault(); e.stopPropagation(); this.widget.toggleDetails(); @@ -299,8 +299,8 @@ class SuggestionDetails { this.el.style.fontSize = fontSizePx; this.type.style.fontFamily = fontFamily; - this.back.style.height = lineHeightPx; - this.back.style.width = lineHeightPx; + this.close.style.height = lineHeightPx; + this.close.style.width = lineHeightPx; } dispose(): void { From d8ce0d822e4e808b713902f09c4e2ff919146ef7 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 17 May 2017 16:07:35 -0700 Subject: [PATCH 0543/1164] Remove scrollbar from small suggestion docs --- .../contrib/suggest/browser/media/suggest.css | 30 +++++++++++++++++-- .../contrib/suggest/browser/suggestWidget.ts | 9 +++--- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index fd183518cc8..b17aac149b5 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -9,11 +9,23 @@ width: 660px; } -.monaco-editor .suggest-widget.docs-expanded > .tree, -.monaco-editor .suggest-widget > .details { +.monaco-editor .suggest-widget.docs-expanded > .tree { width: 330px; } +.monaco-editor .suggest-widget > .details { + /* .details does not use border-box, so subtract the border height here (2px). This is the case + because the height of .details is set prorammatically based on .header and .docs, we don't want + our JS to care about the size of the border (which changes based on theme type). */ + width: 328px; +} + +.monaco-editor .suggest-widget > .details, +.monaco-editor .suggest-widget > .tree { + border-style: solid; + border-width: 1px; +} + .monaco-editor .suggest-widget.small, .monaco-editor .suggest-widget > .tree, .monaco-editor .suggest-widget.small.docs-expanded > .tree, @@ -30,6 +42,8 @@ .monaco-editor .suggest-widget > .message { padding-left: 22px; + border-style: solid; + border-width: 1px; } .monaco-editor .suggest-widget > .tree { @@ -171,7 +185,6 @@ display: flex; flex-direction: column; cursor: default; - box-sizing: border-box; } .monaco-editor .suggest-widget .details.no-docs { @@ -223,6 +236,17 @@ /* High Contrast Theming */ + +.monaco-editor.hc-black .suggest-widget > .tree, +.monaco-editor.hc-black .suggest-widget > .message { + border-width: 2px; +} + +.monaco-editor.hc-black .suggest-widget > .details { + border-width: 2px; + width: 326px; +} + .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon, .monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon { background-image: url('Misc_inverse_16x.svg'); } diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 3fc14e54264..13e3ecb3b54 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -243,7 +243,7 @@ class SuggestionDetails { this.type.innerText = item.suggestion.detail || ''; this.docs.textContent = item.suggestion.documentation; - this.el.style.height = this.type.clientHeight + this.docs.clientHeight + 8 + 'px'; + this.el.style.height = this.header.offsetHeight + this.docs.offsetHeight + 'px'; this.close.onmousedown = e => { e.preventDefault(); @@ -488,10 +488,9 @@ export class SuggestWidget implements IContentWidget, IDelegate } let borderColor = theme.getColor(editorSuggestWidgetBorder); if (borderColor) { - let borderWidth = theme.type === 'hc' ? 2 : 1; - this.listElement.style.border = `${borderWidth}px solid ${borderColor}`; - this.details.element.style.border = `${borderWidth}px solid ${borderColor}`; - this.messageElement.style.border = `${borderWidth}px solid ${borderColor}`; + this.listElement.style.borderColor = borderColor.toString(); + this.details.element.style.borderColor = borderColor.toString(); + this.messageElement.style.borderColor = borderColor.toString(); } } From 6ec7c698553a43115b7885b3ec5188462320f06c Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 17 May 2017 16:13:26 -0700 Subject: [PATCH 0544/1164] Use focusBorderColor when details is in focus --- .../contrib/suggest/browser/media/suggest.css | 9 ++++----- .../contrib/suggest/browser/suggestWidget.ts | 14 +++++++++++++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index b17aac149b5..4febb443944 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -228,15 +228,14 @@ display: none; } -/* Dark theme */ -.monaco-editor.vs-dark .suggest-widget .details > .monaco-scrollable-element > .body > .header > .close{ +/* High Contrast and Dark Theming */ + +.monaco-editor.vs-dark .suggest-widget .details > .monaco-scrollable-element > .body > .header > .close, +.monaco-editor.hc-black .suggest-widget .details > .monaco-scrollable-element > .body > .header > .close { background-image: url('./close-dark.svg'); } -/* High Contrast Theming */ - - .monaco-editor.hc-black .suggest-widget > .tree, .monaco-editor.hc-black .suggest-widget > .message { border-width: 2px; diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 13e3ecb3b54..36ba2953a93 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -29,7 +29,7 @@ import { alert } from 'vs/base/browser/ui/aria/aria'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { attachListStyler } from 'vs/platform/theme/common/styler'; import { IThemeService, ITheme, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { registerColor, editorWidgetBackground, listFocusBackground, activeContrastBorder, listHighlightForeground, editorForeground, editorWidgetBorder } from 'vs/platform/theme/common/colorRegistry'; +import { registerColor, editorWidgetBackground, listFocusBackground, activeContrastBorder, listHighlightForeground, editorForeground, editorWidgetBorder, focusBorder } from 'vs/platform/theme/common/colorRegistry'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; const sticky = false; // for development purposes @@ -357,6 +357,8 @@ export class SuggestWidget implements IContentWidget, IDelegate private readonly minWidgetWidth = 430; private storageService: IStorageService; private expandDocs: boolean; + private detailsFocusBorderColor: string; + private detailsBorderColor: string; constructor( private editor: ICodeEditor, @@ -492,6 +494,10 @@ export class SuggestWidget implements IContentWidget, IDelegate this.details.element.style.borderColor = borderColor.toString(); this.messageElement.style.borderColor = borderColor.toString(); } + let focusBorderColor = theme.getColor(focusBorder); + if (focusBorderColor) { + this.detailsFocusBorderColor = focusBorderColor.toString(); + } } private onListFocus(e: IListEvent): void { @@ -788,8 +794,14 @@ export class SuggestWidget implements IContentWidget, IDelegate toggleDetailsFocus(): void { if (this.state === State.Details) { this.setState(State.Open); + if (this.detailsBorderColor) { + this.details.element.style.borderColor = this.detailsBorderColor; + } } else if (this.state === State.Open) { this.setState(State.Details); + if (this.detailsFocusBorderColor) { + this.details.element.style.borderColor = this.detailsFocusBorderColor; + } } } From 95f392458a7308d15c0b2ab71e9ba62887a12844 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 17 May 2017 16:41:29 -0700 Subject: [PATCH 0545/1164] Move close icon to fix case when there is docs but no details --- .../contrib/suggest/browser/media/suggest.css | 20 +++++++------------ .../contrib/suggest/browser/suggestWidget.ts | 10 ++++------ 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index 4febb443944..5e2b764763e 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -87,7 +87,7 @@ font-weight: bold; } -.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header > .close, +.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .close, .monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .docs-details { opacity: 0.6; background-position: center center; @@ -96,15 +96,16 @@ cursor: pointer; } -.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header > .close { +.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .close { background-image: url('./close.svg'); + float: right; } .monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .docs-details { background-image: url('./info.svg'); } -.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header > .close:hover, +.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .close:hover, .monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .docs-details:hover { opacity: 1; } @@ -203,14 +204,7 @@ white-space: pre-wrap; } -.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header { - padding: 4px 5px; - display: flex; - box-sizing: border-box; - border-bottom: 1px solid rgba(204, 204, 204, 0.5); -} - -.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .header > .type { +.monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .type { flex: 2; overflow: hidden; text-overflow: ellipsis; @@ -231,8 +225,8 @@ /* High Contrast and Dark Theming */ -.monaco-editor.vs-dark .suggest-widget .details > .monaco-scrollable-element > .body > .header > .close, -.monaco-editor.hc-black .suggest-widget .details > .monaco-scrollable-element > .body > .header > .close { +.monaco-editor.vs-dark .suggest-widget .details > .monaco-scrollable-element > .body > .close, +.monaco-editor.hc-black .suggest-widget .details > .monaco-scrollable-element > .body > .close { background-image: url('./close-dark.svg'); } diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 36ba2953a93..7c7fc8c1869 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -186,7 +186,6 @@ class SuggestionDetails { private el: HTMLElement; private close: HTMLElement; - private header: HTMLElement; private scrollbar: DomScrollableElement; private body: HTMLElement; private type: HTMLElement; @@ -211,11 +210,10 @@ class SuggestionDetails { append(this.el, this.scrollbar.getDomNode()); this.disposables.push(this.scrollbar); - this.header = append(this.body, $('.header')); - this.type = append(this.header, $('p.type')); - - this.close = append(this.header, $('span.close')); + this.close = append(this.body, $('span.close')); this.close.title = nls.localize('readLess', "Read less...{0}", triggerKeybindingLabel); + this.type = append(this.body, $('p.type')); + this.docs = append(this.body, $('p.docs')); this.ariaLabel = null; @@ -243,7 +241,7 @@ class SuggestionDetails { this.type.innerText = item.suggestion.detail || ''; this.docs.textContent = item.suggestion.documentation; - this.el.style.height = this.header.offsetHeight + this.docs.offsetHeight + 'px'; + this.el.style.height = this.type.offsetHeight + this.docs.offsetHeight + 'px'; this.close.onmousedown = e => { e.preventDefault(); From 1a653e1a2d7c71b5add8cac670b9136b3bf90a0e Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 17 May 2017 16:49:56 -0700 Subject: [PATCH 0546/1164] Use full width only when docs are expanded --- src/vs/editor/contrib/suggest/browser/media/suggest.css | 5 ++++- src/vs/editor/contrib/suggest/browser/suggestWidget.ts | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index 5e2b764763e..ac6e53ec7a0 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -6,6 +6,9 @@ /* Suggest */ .monaco-editor .suggest-widget { z-index: 40; +} + +.monaco-editor .suggest-widget.docs-expanded { width: 660px; } @@ -26,7 +29,7 @@ border-width: 1px; } -.monaco-editor .suggest-widget.small, +.monaco-editor .suggest-widget, .monaco-editor .suggest-widget > .tree, .monaco-editor .suggest-widget.small.docs-expanded > .tree, .monaco-editor .suggest-widget.small > .details { diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 7c7fc8c1869..e18d24a58ef 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -810,6 +810,7 @@ export class SuggestWidget implements IContentWidget, IDelegate if (!this.expandDocs) { hide(this.details.element); removeClass(this.element, 'docs-expanded'); + this.editor.layoutContentWidget(this); } else { this.showDetails(); } From 67e76b818c7638456502ae7f1364febdece0a0c7 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 17 May 2017 15:55:07 -0700 Subject: [PATCH 0547/1164] Fix webview scroll positon sometimes being reset Fixes #25125 **Bug** Sometimes the scroll position of webviews is reset. The root cause seems to be rapid edits to the markdown preview resulting in the creation of multiple old content iframes **Fix** Only maintain two iframes at most. Ensure that these are properly used when updating --- .../parts/html/browser/webview-pre.js | 47 +++++++++++-------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/src/vs/workbench/parts/html/browser/webview-pre.js b/src/vs/workbench/parts/html/browser/webview-pre.js index 51c9c257225..08b6318591d 100644 --- a/src/vs/workbench/parts/html/browser/webview-pre.js +++ b/src/vs/workbench/parts/html/browser/webview-pre.js @@ -24,8 +24,15 @@ /** * @return {HTMLIFrameElement} */ - function getTarget() { - return document.getElementById('_target'); + function getActiveFrame() { + return document.getElementById('active-frame'); + } + + /** + * @return {HTMLIFrameElement} + */ + function getPendingFrame() { + return document.getElementById('pending-frame'); } /** @@ -89,7 +96,7 @@ initData.activeTheme = activeTheme; // webview - var target = getTarget() + var target = getActiveFrame() if (!target) { return; } @@ -105,7 +112,7 @@ // propagate focus ipcRenderer.on('focus', function () { - const target = getTarget(); + const target = getActiveFrame(); if (target) { target.contentWindow.focus(); } @@ -144,10 +151,7 @@ styleBody(newDocument.body); - const frame = getTarget(); - if (frame) { - frame.setAttribute('id', '_oldTarget'); - } + const frame = getActiveFrame(); // keep current scrollTop around and use later let setInitialScrollPosition; @@ -161,15 +165,22 @@ setInitialScrollPosition = function (body, window) { body.scrollTop = 0; if (!isNaN(initData.initialScrollProgress)) { - window.addEventListener('load', function() { + window.addEventListener('load', function () { body.scrollTop = body.clientHeight * initData.initialScrollProgress }); } } } + // Clean up old pending frames and set current one as new one + const previousPendingFrame = getPendingFrame(); + if (previousPendingFrame) { + previousPendingFrame.setAttribute('id', ''); + document.body.removeChild(previousPendingFrame); + } + const newFrame = document.createElement('iframe'); - newFrame.setAttribute('id', '_target'); + newFrame.setAttribute('id', 'pending-frame'); newFrame.setAttribute('frameborder', '0'); newFrame.setAttribute('sandbox', 'allow-scripts allow-forms allow-same-origin'); newFrame.style.cssText = "margin: 0; overflow: hidden; position: absolute; width: 100%; height: 100%; display: none"; @@ -194,15 +205,13 @@ contentDocument.body.addEventListener('click', handleInnerClick); } - // Clean up old frames - [].forEach.call(document.body.getElementsByTagName('iframe'), function (frame) { - if (frame.id !== '_target') { - document.body.removeChild(frame); - } - }); - - const newFrame = getTarget(); + const newFrame = getPendingFrame(); if (newFrame.contentDocument === contentDocument) { + const oldActiveFrame = getActiveFrame(); + if (oldActiveFrame) { + document.body.removeChild(oldActiveFrame); + } + newFrame.setAttribute('id', 'active-frame'); newFrame.style.display = 'block'; this.addEventListener('scroll', handleInnerScroll); } @@ -219,7 +228,7 @@ // Forward message to the embedded iframe ipcRenderer.on('message', function (event, data) { - const target = getTarget(); + const target = getActiveFrame(); if (target) { target.contentWindow.postMessage(data, document.location.origin); } From a67048c2feb654e3441098f3b7e2479ffab83e8a Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 17 May 2017 17:14:55 -0700 Subject: [PATCH 0548/1164] Fix a potential null reference --- src/vs/workbench/parts/html/browser/webview-pre.js | 2 +- src/vs/workbench/parts/html/browser/webview.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/html/browser/webview-pre.js b/src/vs/workbench/parts/html/browser/webview-pre.js index 08b6318591d..48ee0e03b64 100644 --- a/src/vs/workbench/parts/html/browser/webview-pre.js +++ b/src/vs/workbench/parts/html/browser/webview-pre.js @@ -206,7 +206,7 @@ } const newFrame = getPendingFrame(); - if (newFrame.contentDocument === contentDocument) { + if (newFrame && newFrame.contentDocument === contentDocument) { const oldActiveFrame = getActiveFrame(); if (oldActiveFrame) { document.body.removeChild(oldActiveFrame); diff --git a/src/vs/workbench/parts/html/browser/webview.ts b/src/vs/workbench/parts/html/browser/webview.ts index cfccdeec5b3..b8d6922a844 100644 --- a/src/vs/workbench/parts/html/browser/webview.ts +++ b/src/vs/workbench/parts/html/browser/webview.ts @@ -266,7 +266,7 @@ export default class Webview { return; } const window = contents.getOwnerBrowserWindow(); - if (!window || !window.webContents) { + if (!window || !window.webContents || window.webContents.isDestroyed()) { return; } window.webContents.getZoomFactor(factor => { From 799fa528dbe3da6c116637a7c5adf03bf5a762d0 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 17 May 2017 17:39:00 -0700 Subject: [PATCH 0549/1164] Load script async in markdown preview --- extensions/markdown/media/main.js | 11 +++++++++-- extensions/markdown/src/previewContentProvider.ts | 2 +- src/vs/workbench/parts/html/browser/webview-pre.js | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/extensions/markdown/media/main.js b/extensions/markdown/media/main.js index 1718be3f453..1b7ac343e09 100644 --- a/extensions/markdown/media/main.js +++ b/extensions/markdown/media/main.js @@ -145,7 +145,7 @@ var marker = new ActiveLineMarker(); const settings = JSON.parse(document.getElementById('vscode-markdown-preview-data').getAttribute('data-settings')); - window.addEventListener('load', () => { + function onLoad() { if (settings.scrollPreviewWithEditorSelection) { const initialLine = +settings.line; if (!isNaN(initialLine)) { @@ -155,7 +155,14 @@ }, 0); } } - }); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', onLoad); + } else { + onLoad(); + } + window.addEventListener('resize', () => { scrollDisabled = true; diff --git a/extensions/markdown/src/previewContentProvider.ts b/extensions/markdown/src/previewContentProvider.ts index e4265cf9eb0..789fe49547f 100644 --- a/extensions/markdown/src/previewContentProvider.ts +++ b/extensions/markdown/src/previewContentProvider.ts @@ -196,7 +196,7 @@ export class MDDocumentContentProvider implements vscode.TextDocumentContentProv private getScripts(nonce: string): string { const scripts = [this.getMediaPath('main.js')].concat(this.extraScripts.map(resource => resource.toString())); return scripts - .map(source => ``) + .map(source => ``) .join('\n'); } diff --git a/src/vs/workbench/parts/html/browser/webview-pre.js b/src/vs/workbench/parts/html/browser/webview-pre.js index 48ee0e03b64..0a63595c8c8 100644 --- a/src/vs/workbench/parts/html/browser/webview-pre.js +++ b/src/vs/workbench/parts/html/browser/webview-pre.js @@ -86,7 +86,7 @@ }); } - document.addEventListener("DOMContentLoaded", function (event) { + document.addEventListener('DOMContentLoaded', function (event) { ipcRenderer.on('baseUrl', function (event, value) { initData.baseUrl = value; }); From 0b48b8c193453c02ad085dd71f53c2712d566c7b Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 17 May 2017 17:38:47 -0700 Subject: [PATCH 0550/1164] Fix bug when change to expandDocs in one editor doesnt show up in another --- .../contrib/suggest/browser/suggestWidget.ts | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index e18d24a58ef..9836f775845 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -354,7 +354,6 @@ export class SuggestWidget implements IContentWidget, IDelegate private readonly listWidth = 330; private readonly minWidgetWidth = 430; private storageService: IStorageService; - private expandDocs: boolean; private detailsFocusBorderColor: string; private detailsBorderColor: string; @@ -367,7 +366,6 @@ export class SuggestWidget implements IContentWidget, IDelegate @IStorageService storageService: IStorageService, @IKeybindingService keybindingService: IKeybindingService ) { - this.expandDocs = storageService.getBoolean('expandSuggestionDocs', StorageScope.GLOBAL, false); const kb = keybindingService.lookupKeybinding('editor.action.triggerSuggest'); const triggerKeybindingLabel = !kb ? '' : ` (${kb.getLabel()})`; @@ -562,10 +560,12 @@ export class SuggestWidget implements IContentWidget, IDelegate this.list.setFocus([index]); this.list.reveal(index); - if (this.expandDocs) { + if (this.storageService.getBoolean('expandSuggestionDocs', StorageScope.GLOBAL, false)) { this.showDetails(); this.adjustDocsPosition(); this._ariaAlert(this.details.getAriaLabel()); + } else { + removeClass(this.element, 'docs-expanded'); } }) .then(null, err => !isPromiseCanceledError(err) && onUnexpectedError(err)) @@ -609,7 +609,7 @@ export class SuggestWidget implements IContentWidget, IDelegate case State.Open: hide(this.messageElement); show(this.listElement); - if (this.expandDocs) { + if (this.storageService.getBoolean('expandSuggestionDocs', StorageScope.GLOBAL, false)) { show(this.details.element); } else { hide(this.details.element); @@ -804,14 +804,14 @@ export class SuggestWidget implements IContentWidget, IDelegate } toggleDetails(): void { - this.expandDocs = !this.expandDocs; - this.storageService.store('expandSuggestionDocs', this.expandDocs, StorageScope.GLOBAL); - if (!this.expandDocs) { + if (this.storageService.getBoolean('expandSuggestionDocs', StorageScope.GLOBAL, false)) { + this.storageService.store('expandSuggestionDocs', false, StorageScope.GLOBAL); hide(this.details.element); removeClass(this.element, 'docs-expanded'); this.editor.layoutContentWidget(this); } else { + this.storageService.store('expandSuggestionDocs', true, StorageScope.GLOBAL); this.showDetails(); } } @@ -820,10 +820,9 @@ export class SuggestWidget implements IContentWidget, IDelegate if (this.state !== State.Open && this.state !== State.Details) { return; } - if (this.expandDocs) { - show(this.details.element); - addClass(this.element, 'docs-expanded'); - } + + show(this.details.element); + addClass(this.element, 'docs-expanded'); this.show(); this.editor.focus(); From e0a8ca570dbe19290dc4d6f3b5499fdcd52d6f26 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 17 May 2017 17:40:08 -0700 Subject: [PATCH 0551/1164] Re-ordering css for better readability --- .../contrib/suggest/browser/media/suggest.css | 68 +++++++++++-------- .../contrib/suggest/browser/suggestWidget.ts | 22 +++--- 2 files changed, 49 insertions(+), 41 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index ac6e53ec7a0..d5e20221956 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -6,36 +6,13 @@ /* Suggest */ .monaco-editor .suggest-widget { z-index: 40; + width: 430px; } .monaco-editor .suggest-widget.docs-expanded { width: 660px; } -.monaco-editor .suggest-widget.docs-expanded > .tree { - width: 330px; -} - -.monaco-editor .suggest-widget > .details { - /* .details does not use border-box, so subtract the border height here (2px). This is the case - because the height of .details is set prorammatically based on .header and .docs, we don't want - our JS to care about the size of the border (which changes based on theme type). */ - width: 328px; -} - -.monaco-editor .suggest-widget > .details, -.monaco-editor .suggest-widget > .tree { - border-style: solid; - border-width: 1px; -} - -.monaco-editor .suggest-widget, -.monaco-editor .suggest-widget > .tree, -.monaco-editor .suggest-widget.small.docs-expanded > .tree, -.monaco-editor .suggest-widget.small > .details { - width: 430px; -} - .monaco-editor .suggest-widget.visible { -webkit-transition: left .05s ease-in-out; -moz-transition: left .05s ease-in-out; @@ -49,10 +26,14 @@ border-width: 1px; } +/** Styles for the list element **/ .monaco-editor .suggest-widget > .tree { height: 100%; + width: 430px; float: left; box-sizing: border-box; + border-style: solid; + border-width: 1px; } .monaco-editor .suggest-widget.list-right > .tree { @@ -63,6 +44,16 @@ float: none; } +.monaco-editor .suggest-widget.docs-expanded > .tree { + width: 330px; +} + +.monaco-editor .suggest-widget.small.docs-expanded > .tree { + width: 430px; +} + +/** Styles for each row in the list element **/ + .monaco-editor .suggest-widget .monaco-list .monaco-list-row { display: flex; -mox-box-sizing: border-box; @@ -90,8 +81,10 @@ font-weight: bold; } +/** Icon styles **/ + .monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .close, -.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .docs-details { +.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .readMore { opacity: 0.6; background-position: center center; background-repeat: no-repeat; @@ -104,15 +97,17 @@ float: right; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .docs-details { +.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .readMore { background-image: url('./info.svg'); } .monaco-editor .suggest-widget .details > .monaco-scrollable-element > .body > .close:hover, -.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .docs-details:hover { +.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .readMore:hover { opacity: 1; } +/** Type Info and icon next to the label in the focused completion item **/ + .monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .type-label { margin-left: 0.8em; flex: 1; @@ -126,19 +121,21 @@ display: inline; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .docs-details, +.monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .readMore, .monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .type-label, -.monaco-editor .suggest-widget.docs-expanded .monaco-list .monaco-list-row.focused > .contents > .main > .docs-details, +.monaco-editor .suggest-widget.docs-expanded .monaco-list .monaco-list-row.focused > .contents > .main > .readMore, .monaco-editor .suggest-widget.docs-expanded .monaco-list .monaco-list-row.focused > .contents > .main > .type-label { display: none; } -.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused > .contents > .main > .docs-details, +.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused > .contents > .main > .readMore, .monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused > .contents > .main > .type-label, .monaco-editor .suggest-widget.docs-expanded.small .monaco-list .monaco-list-row.focused > .contents > .main > .type-label { display: inline; } +/** Styles for each row in the list **/ + .monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon { display: block; height: 16px; @@ -184,11 +181,22 @@ display: inline-block; } +/** Styles for the docs of the completion item in focus **/ .monaco-editor .suggest-widget .details { max-height: 216px; display: flex; flex-direction: column; cursor: default; + /* .details does not use border-box, so subtract the border height here (2px). This is the case + because the height of .details is set prorammatically based on .header and .docs, we don't want + our JS to care about the size of the border (which changes based on theme type). */ + width: 328px; + border-style: solid; + border-width: 1px; +} + +.monaco-editor .suggest-widget.small > .details { + width: 430px; } .monaco-editor .suggest-widget .details.no-docs { diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 9836f775845..2c11eb765de 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -40,7 +40,7 @@ interface ISuggestionTemplateData { colorspan: HTMLElement; highlightedLabel: HighlightedLabel; typeLabel: HTMLElement; - documentationDetails: HTMLElement; + readMore: HTMLElement; disposables: IDisposable[]; } @@ -95,8 +95,8 @@ class Renderer implements IRenderer { data.disposables.push(data.highlightedLabel); data.typeLabel = append(main, $('span.type-label')); - data.documentationDetails = append(main, $('span.docs-details')); - data.documentationDetails.title = nls.localize('readMore', "Read More...{0}", this.triggerKeybindingLabel); + data.readMore = append(main, $('span.readMore')); + data.readMore.title = nls.localize('readMore', "Read More...{0}", this.triggerKeybindingLabel); const configureFont = () => { const configuration = this.editor.getConfiguration(); @@ -111,8 +111,8 @@ class Renderer implements IRenderer { main.style.lineHeight = lineHeightPx; data.icon.style.height = lineHeightPx; data.icon.style.width = lineHeightPx; - data.documentationDetails.style.height = lineHeightPx; - data.documentationDetails.style.width = lineHeightPx; + data.readMore.style.height = lineHeightPx; + data.readMore.style.width = lineHeightPx; }; configureFont(); @@ -149,20 +149,20 @@ class Renderer implements IRenderer { data.typeLabel.textContent = (suggestion.detail || '').replace(/\n.*$/m, ''); if (canExpandCompletionItem(element)) { - show(data.documentationDetails); - data.documentationDetails.onmousedown = e => { + show(data.readMore); + data.readMore.onmousedown = e => { e.stopPropagation(); e.preventDefault(); }; - data.documentationDetails.onclick = e => { + data.readMore.onclick = e => { e.stopPropagation(); e.preventDefault(); this.widget.toggleDetails(); }; } else { - hide(data.documentationDetails); - data.documentationDetails.onmousedown = null; - data.documentationDetails.onclick = null; + hide(data.readMore); + data.readMore.onmousedown = null; + data.readMore.onclick = null; } } From 966a6e10c73988cf013f40f2de10b71380aa5a54 Mon Sep 17 00:00:00 2001 From: Daniel Ye Date: Wed, 17 May 2017 18:00:26 -0700 Subject: [PATCH 0552/1164] 2017-05-17. Merged in translations. --- .../chs/extensions/git/out/commands.i18n.json | 1 + i18n/chs/extensions/git/package.i18n.json | 4 ++- .../out/typescriptServiceClient.i18n.json | 1 - .../typescript/out/utils/logger.i18n.json | 6 ++++ .../extensions/typescript/package.i18n.json | 1 - .../resourceviewer/resourceViewer.i18n.json | 2 +- .../base/common/jsonErrorMessages.i18n.json | 12 +++++++- .../src/vs/code/electron-main/menus.i18n.json | 12 +++++--- .../config/commonEditorConfig.i18n.json | 2 +- .../common/view/editorColorRegistry.i18n.json | 6 +++- .../theme/common/colorRegistry.i18n.json | 17 +++++++++-- .../mainThreadExtensionService.i18n.json | 5 +++- .../mainThreadMessageService.i18n.json | 6 +++- .../main.contribution.i18n.json | 1 + .../actions/balance.i18n.json | 6 ++++ .../actions/editPoints.i18n.json | 6 ++++ .../actions/evaluateMath.i18n.json | 6 ++++ .../actions/expandAbbreviation.i18n.json | 6 ++++ .../actions/incrementDecrement.i18n.json | 6 ++++ .../actions/matchingPair.i18n.json | 6 ++++ .../actions/mergeLines.i18n.json | 6 ++++ .../actions/reflectCssValue.i18n.json | 6 ++++ .../actions/removeTag.i18n.json | 6 ++++ .../actions/selectItem.i18n.json | 6 ++++ .../actions/splitJoinTag.i18n.json | 6 ++++ .../actions/toggleComment.i18n.json | 6 ++++ .../actions/updateImageSize.i18n.json | 6 ++++ .../actions/updateTag.i18n.json | 6 ++++ .../actions/wrapWithAbbreviation.i18n.json | 6 ++++ .../emmet.contribution.i18n.json | 6 ++++ .../extensionTipsService.i18n.json | 1 + .../browser/commandsHandler.i18n.json | 1 + .../themes.contribution.i18n.json | 1 - .../vs_code_welcome_page.i18n.json | 28 ++++++++--------- .../configurationEditingService.i18n.json | 7 ++++- .../out/typescriptServiceClient.i18n.json | 1 - .../typescript/out/utils/logger.i18n.json | 6 ++++ .../extensions/typescript/package.i18n.json | 1 - .../resourceviewer/resourceViewer.i18n.json | 3 -- .../common/view/editorColorRegistry.i18n.json | 5 +++- .../browser/referencesWidget.i18n.json | 2 ++ .../menusExtensionPoint.i18n.json | 1 + .../theme/common/colorRegistry.i18n.json | 16 ++++++++-- .../mainThreadExtensionService.i18n.json | 5 +++- .../mainThreadMessageService.i18n.json | 6 +++- .../actions/balance.i18n.json | 6 ++++ .../actions/editPoints.i18n.json | 6 ++++ .../actions/evaluateMath.i18n.json | 6 ++++ .../actions/expandAbbreviation.i18n.json | 6 ++++ .../actions/incrementDecrement.i18n.json | 6 ++++ .../actions/matchingPair.i18n.json | 6 ++++ .../actions/mergeLines.i18n.json | 6 ++++ .../actions/reflectCssValue.i18n.json | 6 ++++ .../actions/removeTag.i18n.json | 6 ++++ .../actions/selectItem.i18n.json | 6 ++++ .../actions/splitJoinTag.i18n.json | 6 ++++ .../actions/toggleComment.i18n.json | 6 ++++ .../actions/updateImageSize.i18n.json | 6 ++++ .../actions/updateTag.i18n.json | 6 ++++ .../actions/wrapWithAbbreviation.i18n.json | 6 ++++ .../emmet.contribution.i18n.json | 6 ++++ .../themes.contribution.i18n.json | 1 - .../vs_code_welcome_page.i18n.json | 28 ++++++++--------- .../configurationEditingService.i18n.json | 2 ++ i18n/deu/extensions/git/package.i18n.json | 4 +-- .../out/typescriptServiceClient.i18n.json | 1 - .../typescript/out/utils/logger.i18n.json | 6 ++++ .../extensions/typescript/package.i18n.json | 1 - .../base/common/jsonErrorMessages.i18n.json | 12 +++++++- .../src/vs/code/electron-main/menus.i18n.json | 4 +-- .../theme/common/colorRegistry.i18n.json | 6 ++-- .../mainThreadExtensionService.i18n.json | 5 +++- .../mainThreadMessageService.i18n.json | 6 +++- .../actions/balance.i18n.json | 6 ++++ .../actions/editPoints.i18n.json | 6 ++++ .../actions/evaluateMath.i18n.json | 6 ++++ .../actions/expandAbbreviation.i18n.json | 6 ++++ .../actions/incrementDecrement.i18n.json | 6 ++++ .../actions/matchingPair.i18n.json | 6 ++++ .../actions/mergeLines.i18n.json | 6 ++++ .../actions/reflectCssValue.i18n.json | 6 ++++ .../actions/removeTag.i18n.json | 6 ++++ .../actions/selectItem.i18n.json | 6 ++++ .../actions/splitJoinTag.i18n.json | 6 ++++ .../actions/toggleComment.i18n.json | 6 ++++ .../actions/updateImageSize.i18n.json | 6 ++++ .../actions/updateTag.i18n.json | 6 ++++ .../actions/wrapWithAbbreviation.i18n.json | 6 ++++ .../emmet.contribution.i18n.json | 6 ++++ .../browser/extensionEditor.i18n.json | 2 +- .../browser/extensionsActions.i18n.json | 16 +++++----- .../browser/extensionsQuickOpen.i18n.json | 4 +-- .../common/extensionsInput.i18n.json | 2 +- .../extensionTipsService.i18n.json | 4 ++- .../extensions.contribution.i18n.json | 9 +++--- .../extensionsActions.i18n.json | 2 +- .../extensionsViewlet.i18n.json | 4 +-- .../themes.contribution.i18n.json | 1 - .../vs_code_welcome_page.i18n.json | 30 +++++++++---------- .../configurationEditingService.i18n.json | 2 ++ .../esn/extensions/git/out/commands.i18n.json | 1 + i18n/esn/extensions/git/package.i18n.json | 4 ++- ...rectiveCommentCompletionProvider.i18n.json | 6 +++- .../out/typescriptServiceClient.i18n.json | 1 - .../typescript/out/utils/logger.i18n.json | 6 ++++ .../extensions/typescript/package.i18n.json | 2 +- .../base/common/jsonErrorMessages.i18n.json | 12 +++++++- .../src/vs/code/electron-main/menus.i18n.json | 3 ++ .../config/commonEditorConfig.i18n.json | 1 + .../common/view/editorColorRegistry.i18n.json | 6 +++- .../browser/referencesWidget.i18n.json | 3 ++ .../theme/common/colorRegistry.i18n.json | 21 +++++++++++-- .../mainThreadExtensionService.i18n.json | 5 +++- .../mainThreadMessageService.i18n.json | 6 +++- .../src/vs/workbench/common/theme.i18n.json | 3 ++ .../main.contribution.i18n.json | 1 + .../debug/browser/debugActions.i18n.json | 1 + .../electron-browser/debugCommands.i18n.json | 4 ++- .../actions/balance.i18n.json | 6 ++++ .../actions/editPoints.i18n.json | 6 ++++ .../actions/evaluateMath.i18n.json | 6 ++++ .../actions/expandAbbreviation.i18n.json | 6 ++++ .../actions/incrementDecrement.i18n.json | 6 ++++ .../actions/matchingPair.i18n.json | 6 ++++ .../actions/mergeLines.i18n.json | 6 ++++ .../actions/reflectCssValue.i18n.json | 6 ++++ .../actions/removeTag.i18n.json | 6 ++++ .../actions/selectItem.i18n.json | 6 ++++ .../actions/splitJoinTag.i18n.json | 6 ++++ .../actions/toggleComment.i18n.json | 6 ++++ .../actions/updateImageSize.i18n.json | 6 ++++ .../actions/updateTag.i18n.json | 6 ++++ .../actions/wrapWithAbbreviation.i18n.json | 6 ++++ .../emmet.contribution.i18n.json | 6 ++++ .../browser/commandsHandler.i18n.json | 1 + .../browser/searchResultsView.i18n.json | 4 ++- .../themes.contribution.i18n.json | 1 - .../vs_code_welcome_page.i18n.json | 28 ++++++++--------- .../configurationEditingService.i18n.json | 9 +++++- .../out/typescriptServiceClient.i18n.json | 1 - .../typescript/out/utils/logger.i18n.json | 6 ++++ .../extensions/typescript/package.i18n.json | 1 - .../base/common/jsonErrorMessages.i18n.json | 12 +++++++- .../theme/common/colorRegistry.i18n.json | 6 ++-- .../mainThreadExtensionService.i18n.json | 5 +++- .../mainThreadMessageService.i18n.json | 6 +++- .../actions/balance.i18n.json | 6 ++++ .../actions/editPoints.i18n.json | 6 ++++ .../actions/evaluateMath.i18n.json | 6 ++++ .../actions/expandAbbreviation.i18n.json | 6 ++++ .../actions/incrementDecrement.i18n.json | 6 ++++ .../actions/matchingPair.i18n.json | 6 ++++ .../actions/mergeLines.i18n.json | 6 ++++ .../actions/reflectCssValue.i18n.json | 6 ++++ .../actions/removeTag.i18n.json | 6 ++++ .../actions/selectItem.i18n.json | 6 ++++ .../actions/splitJoinTag.i18n.json | 6 ++++ .../actions/toggleComment.i18n.json | 6 ++++ .../actions/updateImageSize.i18n.json | 6 ++++ .../actions/updateTag.i18n.json | 6 ++++ .../actions/wrapWithAbbreviation.i18n.json | 6 ++++ .../emmet.contribution.i18n.json | 6 ++++ .../themes.contribution.i18n.json | 1 - .../vs_code_welcome_page.i18n.json | 28 ++++++++--------- .../configurationEditingService.i18n.json | 2 ++ .../out/typescriptServiceClient.i18n.json | 1 - .../typescript/out/utils/logger.i18n.json | 6 ++++ .../extensions/typescript/package.i18n.json | 1 - .../base/common/jsonErrorMessages.i18n.json | 12 +++++++- .../theme/common/colorRegistry.i18n.json | 6 ++-- .../mainThreadExtensionService.i18n.json | 5 +++- .../mainThreadMessageService.i18n.json | 6 +++- .../actions/balance.i18n.json | 6 ++++ .../actions/editPoints.i18n.json | 6 ++++ .../actions/evaluateMath.i18n.json | 6 ++++ .../actions/expandAbbreviation.i18n.json | 6 ++++ .../actions/incrementDecrement.i18n.json | 6 ++++ .../actions/matchingPair.i18n.json | 6 ++++ .../actions/mergeLines.i18n.json | 6 ++++ .../actions/reflectCssValue.i18n.json | 6 ++++ .../actions/removeTag.i18n.json | 6 ++++ .../actions/selectItem.i18n.json | 6 ++++ .../actions/splitJoinTag.i18n.json | 6 ++++ .../actions/toggleComment.i18n.json | 6 ++++ .../actions/updateImageSize.i18n.json | 6 ++++ .../actions/updateTag.i18n.json | 6 ++++ .../actions/wrapWithAbbreviation.i18n.json | 6 ++++ .../emmet.contribution.i18n.json | 6 ++++ .../themes.contribution.i18n.json | 1 - .../vs_code_welcome_page.i18n.json | 28 ++++++++--------- .../configurationEditingService.i18n.json | 2 ++ .../jpn/extensions/git/out/commands.i18n.json | 2 +- .../extensions/git/out/scmProvider.i18n.json | 2 +- .../out/typescriptServiceClient.i18n.json | 1 - .../typescript/out/utils/logger.i18n.json | 6 ++++ .../extensions/typescript/package.i18n.json | 1 - .../base/common/jsonErrorMessages.i18n.json | 12 +++++++- .../src/vs/code/electron-main/menus.i18n.json | 4 ++- .../common/view/editorColorRegistry.i18n.json | 5 +++- .../browser/referencesWidget.i18n.json | 1 + .../theme/common/colorRegistry.i18n.json | 7 +++-- .../mainThreadExtensionService.i18n.json | 5 +++- .../mainThreadMessageService.i18n.json | 6 +++- .../src/vs/workbench/common/theme.i18n.json | 3 ++ .../main.contribution.i18n.json | 1 + .../debug/browser/debugActions.i18n.json | 1 + .../electron-browser/debugCommands.i18n.json | 4 ++- .../actions/balance.i18n.json | 6 ++++ .../actions/editPoints.i18n.json | 6 ++++ .../actions/evaluateMath.i18n.json | 6 ++++ .../actions/expandAbbreviation.i18n.json | 6 ++++ .../actions/incrementDecrement.i18n.json | 6 ++++ .../actions/matchingPair.i18n.json | 6 ++++ .../actions/mergeLines.i18n.json | 6 ++++ .../actions/reflectCssValue.i18n.json | 6 ++++ .../actions/removeTag.i18n.json | 6 ++++ .../actions/selectItem.i18n.json | 6 ++++ .../actions/splitJoinTag.i18n.json | 6 ++++ .../actions/toggleComment.i18n.json | 6 ++++ .../actions/updateImageSize.i18n.json | 6 ++++ .../actions/updateTag.i18n.json | 6 ++++ .../actions/wrapWithAbbreviation.i18n.json | 6 ++++ .../emmet.contribution.i18n.json | 6 ++++ .../browser/commandsHandler.i18n.json | 1 + .../browser/searchResultsView.i18n.json | 4 ++- .../tasks/browser/restartQuickOpen.i18n.json | 2 +- .../themes.contribution.i18n.json | 3 +- .../vs_code_welcome_page.i18n.json | 28 ++++++++--------- .../configurationEditingService.i18n.json | 9 +++++- .../out/typescriptServiceClient.i18n.json | 1 - .../typescript/out/utils/logger.i18n.json | 6 ++++ .../extensions/typescript/package.i18n.json | 1 - .../base/common/jsonErrorMessages.i18n.json | 12 +++++++- .../theme/common/colorRegistry.i18n.json | 6 ++-- .../mainThreadExtensionService.i18n.json | 5 +++- .../mainThreadMessageService.i18n.json | 6 +++- .../actions/balance.i18n.json | 6 ++++ .../actions/editPoints.i18n.json | 6 ++++ .../actions/evaluateMath.i18n.json | 6 ++++ .../actions/expandAbbreviation.i18n.json | 6 ++++ .../actions/incrementDecrement.i18n.json | 6 ++++ .../actions/matchingPair.i18n.json | 6 ++++ .../actions/mergeLines.i18n.json | 6 ++++ .../actions/reflectCssValue.i18n.json | 6 ++++ .../actions/removeTag.i18n.json | 6 ++++ .../actions/selectItem.i18n.json | 6 ++++ .../actions/splitJoinTag.i18n.json | 6 ++++ .../actions/toggleComment.i18n.json | 6 ++++ .../actions/updateImageSize.i18n.json | 6 ++++ .../actions/updateTag.i18n.json | 6 ++++ .../actions/wrapWithAbbreviation.i18n.json | 6 ++++ .../emmet.contribution.i18n.json | 6 ++++ .../themes.contribution.i18n.json | 1 - .../vs_code_welcome_page.i18n.json | 28 ++++++++--------- .../configurationEditingService.i18n.json | 2 ++ .../out/typescriptServiceClient.i18n.json | 1 - .../typescript/out/utils/logger.i18n.json | 6 ++++ .../extensions/typescript/package.i18n.json | 1 - .../base/common/jsonErrorMessages.i18n.json | 12 +++++++- .../theme/common/colorRegistry.i18n.json | 6 ++-- .../mainThreadExtensionService.i18n.json | 5 +++- .../mainThreadMessageService.i18n.json | 6 +++- .../actions/balance.i18n.json | 6 ++++ .../actions/editPoints.i18n.json | 6 ++++ .../actions/evaluateMath.i18n.json | 6 ++++ .../actions/expandAbbreviation.i18n.json | 6 ++++ .../actions/incrementDecrement.i18n.json | 6 ++++ .../actions/matchingPair.i18n.json | 6 ++++ .../actions/mergeLines.i18n.json | 6 ++++ .../actions/reflectCssValue.i18n.json | 6 ++++ .../actions/removeTag.i18n.json | 6 ++++ .../actions/selectItem.i18n.json | 6 ++++ .../actions/splitJoinTag.i18n.json | 6 ++++ .../actions/toggleComment.i18n.json | 6 ++++ .../actions/updateImageSize.i18n.json | 6 ++++ .../actions/updateTag.i18n.json | 6 ++++ .../actions/wrapWithAbbreviation.i18n.json | 6 ++++ .../emmet.contribution.i18n.json | 6 ++++ .../themes.contribution.i18n.json | 1 - .../vs_code_welcome_page.i18n.json | 28 ++++++++--------- .../configurationEditingService.i18n.json | 2 ++ 281 files changed, 1426 insertions(+), 259 deletions(-) create mode 100644 i18n/chs/extensions/typescript/out/utils/logger.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json create mode 100644 i18n/cht/extensions/typescript/out/utils/logger.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json create mode 100644 i18n/deu/extensions/typescript/out/utils/logger.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json create mode 100644 i18n/esn/extensions/typescript/out/utils/logger.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json create mode 100644 i18n/fra/extensions/typescript/out/utils/logger.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json create mode 100644 i18n/ita/extensions/typescript/out/utils/logger.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json create mode 100644 i18n/jpn/extensions/typescript/out/utils/logger.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json create mode 100644 i18n/kor/extensions/typescript/out/utils/logger.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json create mode 100644 i18n/rus/extensions/typescript/out/utils/logger.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json diff --git a/i18n/chs/extensions/git/out/commands.i18n.json b/i18n/chs/extensions/git/out/commands.i18n.json index d6b0baf0919..3a000b98773 100644 --- a/i18n/chs/extensions/git/out/commands.i18n.json +++ b/i18n/chs/extensions/git/out/commands.i18n.json @@ -18,6 +18,7 @@ "discard": "放弃更改", "confirm discard all": "确定要放弃所有更改吗?此操作不可撤销!", "discardAll": "放弃所有更改", + "no staged changes": "现在没有暂存的更改以供提交\n\n是否要直接自动暂存所有更改并提交?", "yes": "是", "always": "始终", "no changes": "没有要提交的更改。", diff --git a/i18n/chs/extensions/git/package.i18n.json b/i18n/chs/extensions/git/package.i18n.json index 06d049a0aeb..3ae1cbfe222 100644 --- a/i18n/chs/extensions/git/package.i18n.json +++ b/i18n/chs/extensions/git/package.i18n.json @@ -42,5 +42,7 @@ "config.countBadge": "控制 Git 徽章计数器。“all”计算所有更改。“tracked”只计算跟踪的更改。“off”关闭此功能。", "config.checkoutType": "控制运行“签出到...”时列出的分支的类型。“all”显示所有 refs,“local”只显示本地分支,“tags”只显示标签,“remote”只显示远程分支。", "config.ignoreLegacyWarning": "忽略旧版 Git 警告", - "config.ignoreLimitWarning": "忽略“存储库中存在大量更改”的警告" + "config.ignoreLimitWarning": "忽略“存储库中存在大量更改”的警告", + "config.defaultCloneDirectory": "克隆 Git 存储库的默认位置", + "config.enableSmartCommit": "在没有暂存的更改时提交所有更改。" } \ No newline at end of file diff --git a/i18n/chs/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/chs/extensions/typescript/out/typescriptServiceClient.i18n.json index 79910794a22..06c4e0ea585 100644 --- a/i18n/chs/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/chs/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "channelName": "TypeScript", "noServerFound": "路径 {0} 未指向有效的 tsserver 安装。请回退到捆绑的 TypeScript 版本。", "noBundledServerFound": "其他应用程序(例如运行异常的病毒检测工具)已删除 VSCode 的 tsserver。请重新安装 VS Code。", "versionNumber.custom": "自定义", diff --git a/i18n/chs/extensions/typescript/out/utils/logger.i18n.json b/i18n/chs/extensions/typescript/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/extensions/typescript/out/utils/logger.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript/package.i18n.json b/i18n/chs/extensions/typescript/package.i18n.json index 8f2d24aa7ea..5e077ba8d02 100644 --- a/i18n/chs/extensions/typescript/package.i18n.json +++ b/i18n/chs/extensions/typescript/package.i18n.json @@ -33,7 +33,6 @@ "javascript.validate.enable": "启用/禁用 JavaScript 验证。", "typescript.goToProjectConfig.title": "转到项目配置", "javascript.goToProjectConfig.title": "转到项目配置", - "typescript.referencesCodeLens.enabled": "启用/禁用引用 CodeLens。要求 TypeScript >= 2.0.6。", "typescript.implementationsCodeLens.enabled": "启用/禁用实现 CodeLens。要求 TypeScript >= 2.2.0。", "typescript.openTsServerLog.title": "打开 TS 服务器日志", "typescript.selectTypeScriptVersion.title": "选择 TypeScript 版本", diff --git a/i18n/chs/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/chs/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index 8f887744626..7b395b9c15a 100644 --- a/i18n/chs/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/chs/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,7 +6,7 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "图像太大,无法在编辑器中显示。 ", - "resourceOpenExternalButton": "打开图像", + "resourceOpenExternalButton": "打开图片", "resourceOpenExternalText": " 是否使用外部程序?", "nativeBinaryError": "文件将不在编辑器中显示,因为它是二进制文件、非常大或使用不支持的文本编码。", "sizeB": "{0} B", diff --git a/i18n/chs/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/chs/src/vs/base/common/jsonErrorMessages.i18n.json index 8b6ad71cd4e..a8dcb4d1020 100644 --- a/i18n/chs/src/vs/base/common/jsonErrorMessages.i18n.json +++ b/i18n/chs/src/vs/base/common/jsonErrorMessages.i18n.json @@ -3,4 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "error.invalidSymbol": "符号无效", + "error.invalidNumberFormat": "数字格式无效", + "error.propertyNameExpected": "需要属性名", + "error.valueExpected": "需要值", + "error.colonExpected": "需要冒号", + "error.commaExpected": "需要逗号", + "error.closeBraceExpected": "需要右大括号", + "error.closeBracketExpected": "需要右括号", + "error.endOfFileExpected": "预期的文件结尾" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/code/electron-main/menus.i18n.json b/i18n/chs/src/vs/code/electron-main/menus.i18n.json index e5052dcc94f..d2d3d4ed796 100644 --- a/i18n/chs/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/chs/src/vs/code/electron-main/menus.i18n.json @@ -14,6 +14,7 @@ "mHelp": "帮助(&&H)", "miNewWindow": "新建窗口(&&W)", "mAbout": "关于 {0}", + "mServices": "服务", "mHide": "隐藏 {0}", "mHideOthers": "隐藏其他", "mShowAll": "全部显示", @@ -54,9 +55,9 @@ "miShowEmmetCommands": "Emmet(&&M)...", "miToggleLineComment": "切换行注释(&&T)", "miToggleBlockComment": "切换块注释(&&B)", - "miInsertCursorAbove": "在上面添加游标(&&A)", - "miInsertCursorBelow": "在下面添加游标(&&D)", - "miInsertCursorAtEndOfEachLineSelected": "在行尾添加游标(&&U)", + "miInsertCursorAbove": "在上面添加光标(&&A)", + "miInsertCursorBelow": "在下面添加光标(&&D)", + "miInsertCursorAtEndOfEachLineSelected": "在行尾添加光标(&&U)", "miAddSelectionToNextFindMatch": "添加下一个匹配项(&&N)", "miAddSelectionToPreviousFindMatch": "添加上一个匹配项(&&R)", "miSelectHighlights": "选择所有匹配项(&&O)", @@ -69,6 +70,7 @@ "miSmartSelectShrink": "缩小选定范围(&&S)", "miViewExplorer": "资源管理器(&&E)", "miViewSearch": "搜索(&&S)", + "miViewSCM": "SCM(&&C)", "miViewDebug": "调试(&&D)", "miViewExtensions": "扩展(&&X)", "miToggleOutput": "输出(&&O)", @@ -113,9 +115,11 @@ "miGotoSymbolInFile": "转到文件中的符号(&&S)...", "miGotoSymbolInWorkspace": "转到工作区中的符号(&&W)...", "miGotoDefinition": "转到定义(&&D)...", + "miGotoTypeDefinition": "转到类型定义(&&T)", + "miGotoImplementation": "转到实现(&&I)", "miGotoLine": "转到行(&&L)...", "miStartDebugging": "启动调试(&&S)", - "miStartWithoutDebugging": "在不调试的情况下启动(&&W)", + "miStartWithoutDebugging": "非调试启动(&&W)", "miStopDebugging": "停止调试(&&S)", "miRestart Debugging": "重启调试(&&R)", "miOpenConfigurations": "打开配置(&&C)", diff --git a/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json index 4a8ec7c378a..97e41cde2c5 100644 --- a/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -26,7 +26,6 @@ "wordWrap.on": "将在视区宽度处换行。", "wordWrap.wordWrapColumn": "将在 \"editor.wordWrapColumn\" 处换行。", "wordWrap.bounded": "将在最小视区和 \"editor.wordWrapColumn\" 处换行。", - "wordWrap": "控制换行方式。可以选择:\n - “off” (禁用换行),\n - “on” (视区换行),\n - “wordWrapColumn” (在 \"editor.wordWrapColumn\" 处换行`) 或\n - “bounded” (在视区和 \"editor.wordWrapColumn\" 中的最小值处换行)。", "wordWrapColumn": "在 \"editor.wordWrap\" 为 \"wordWrapColumn\" 或 \"bounded\" 时控制编辑器列的换行。", "wrappingIndent": "控制换行的行的缩进。可以是\\\\\"none\\\\\"、 \\\\\"same\\\\\" 或 \\\\\"indent\\\\\"。", "mouseWheelScrollSensitivity": "要对鼠标滚轮滚动事件的 \"deltaX\" 和 \"deltaY\" 使用的乘数 ", @@ -62,6 +61,7 @@ "renderLineHighlight": "控制编辑器应如何呈现当前行突出显示,可能为“无”、“装订线”、“线”和“全部”。", "codeLens": "控制编辑器是否显示代码滤镜", "folding": "控制编辑器是否启用代码折叠功能", + "hideFoldIcons": "控制是否自动隐藏导航线上的折叠图标。", "matchBrackets": "当选择其中一项时,将突出显示匹配的括号。", "glyphMargin": "控制编辑器是否应呈现垂直字形边距。字形边距最常用于调试。", "useTabStops": "在制表位后插入和删除空格", diff --git a/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json index 77510fb7e49..dc0edc0650c 100644 --- a/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/chs/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -11,6 +11,10 @@ "editorWhitespaces": "编辑器中空白字符颜色。", "editorIndentGuides": "编辑器缩进参考线颜色。", "editorLineNumbers": "编辑器行号颜色。", + "editorRuler": "编辑器标尺的颜色。", "editorCodeLensForeground": "编辑器 CodeLens 的前景色", - "editorBracketMatchBackground": "匹配括号的背景色" + "editorBracketMatchBackground": "匹配括号的背景色", + "editorBracketMatchBorder": "匹配括号外框颜色", + "editorOverviewRulerBorder": "概览标尺边框的颜色。", + "editorGutter": "编辑器导航线的背景色。导航线包括边缘符号和行号。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json index fe64e285097..6e56d819256 100644 --- a/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -7,14 +7,24 @@ "invalid.color": "颜色格式无效。请使用 #RGB、#RGBA、#RRGGBB 或 #RRGGBBAA", "schema.colors": "工作台中使用的颜色。", "foreground": "整体前景色。此颜色仅在不被组件覆盖时适用。", + "errorForeground": "错误信息的整体前景色。此颜色仅在不被组件覆盖时适用。", + "descriptionForeground": "提供其他信息的说明文本的前景色,例如标签文本。", "focusBorder": "焦点元素的整体边框颜色。此颜色仅在不被其他组件覆盖时适用。", "contrastBorder": "在元素周围额外的一层边框,用来提高对比度从而区别其他元素。", "activeContrastBorder": "在活动元素周围额外的一层边框,用来提高对比度从而区别其他元素。", + "selectionBackground": "工作台所选文本的背景颜色(例如输入字段或文本区域)。注意,本设置不适用于编辑器和终端。", + "textSeparatorForeground": "文字分隔符的颜色。", + "textLinkForeground": "文本中链接的前景色。", + "textLinkActiveForeground": "文本中活动链接的前景色。", + "textBlockQuoteBackground": "文本中块引用的背景颜色。", + "textBlockQuoteBorder": "文本中块引用的边框颜色。", + "textCodeBlockBackground": "文本中代码块的背景颜色。", "widgetShadow": "编辑器内小组件(如查找/替换)的阴影颜色。", "inputBoxBackground": "输入框背景色。", "inputBoxForeground": "输入框前景色。", "inputBoxBorder": "输入框边框。", "inputBoxActiveOptionBorder": "输入字段中已激活选项的边框颜色。", + "inputPlaceholderForeground": "输入框中占位符的前景色。", "inputValidationInfoBackground": "严重性为信息时输入验证的背景颜色。", "inputValidationInfoBorder": "严重性为信息时输入验证的边框颜色。", "inputValidationWarningBackground": "严重性为警告时输入验证的背景颜色。", @@ -26,8 +36,8 @@ "dropdownBorder": "下拉列表边框。", "listFocusBackground": "焦点项在列表或树活动时的背景颜色。活动的列表或树具有键盘焦点,非活动的没有。", "listActiveSelectionBackground": "已选项在列表或树活动时的背景颜色。活动的列表或树具有键盘焦点,非活动的没有。", - "listInactiveSelectionBackground": "已选项在列表或树非活动时的背景颜色。活动的列表或树具有键盘焦点,非活动的没有。", "listActiveSelectionForeground": "已选项在列表或树活动时的前景颜色。活动的列表或树具有键盘焦点,非活动的没有。", + "listInactiveSelectionBackground": "已选项在列表或树非活动时的背景颜色。活动的列表或树具有键盘焦点,非活动的没有。", "listHoverBackground": "使用鼠标移动项目时,列表或树的背景颜色。", "listDropBackground": "使用鼠标移动项目时,列表或树进行拖放的背景颜色。", "highlight": "在列表或树中搜索时,其中匹配内容的高亮颜色。", @@ -40,8 +50,10 @@ "scrollbarSliderBackground": "滑块的背景颜色。", "scrollbarSliderHoverBackground": "滑块在悬停时的背景颜色。", "scrollbarSliderActiveBackground": "滑块在活动的背景颜色。", + "progressBarBackground": "表示长时间操作的进度条的背景色。", "editorBackground": "编辑器背景颜色。", "editorForeground": "编辑器默认前景色。", + "editorWidgetBackground": "编辑器组件(如查找/替换)背景颜色。", "editorSelection": "编辑器所选内容的颜色。", "editorInactiveSelection": "非活动编辑器中所选内容的颜色。", "editorSelectionHighlight": "与所选内容具有相同内容的区域颜色。", @@ -51,6 +63,5 @@ "hoverHighlight": "在显示软键盘的字下方突出显示。", "hoverBackground": "编辑器软键盘背景色。", "hoverBorder": "编辑器软键盘边框颜色。", - "activeLinkForeground": "活动链接颜色。", - "editorWidgetBackground": "编辑器组件(如查找/替换)背景颜色。" + "activeLinkForeground": "活动链接颜色。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json index 8b6ad71cd4e..1b83e2539f4 100644 --- a/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json +++ b/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "overwritingExtension": "使用扩展程序 {1} 覆盖扩展程序 {0}。", + "extensionUnderDevelopment": "正在 {0} 处加载开发扩展程序" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json index 8b6ad71cd4e..d95075ca825 100644 --- a/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json +++ b/i18n/chs/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "close": "关闭", + "cancel": "取消", + "ok": "确定" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json index a2d7a1d364c..375f183373b 100644 --- a/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -41,6 +41,7 @@ "window.newWindowDimensions.inherit": "以与上一个活动窗口相同的尺寸打开新窗口。", "window.newWindowDimensions.maximized": "打开最大化的新窗口。", "window.newWindowDimensions.fullscreen": "在全屏模式下打开新窗口。", + "newWindowDimensions": "控制在已有窗口时新打开窗口的尺寸。默认情况下,新窗口将以小尺寸在屏幕的中央打开。当设置为“inherit”时,新窗口将继承上一活动窗口的尺寸,设置为“maximized”时窗口将被最大化,设置为“fullscreen”时则变为全屏。请注意,此设置对第一个打开的窗口无效。第一个窗口总是会恢复关闭前的大小和位置。", "window.menuBarVisibility.default": "菜单仅在全屏模式下隐藏。", "window.menuBarVisibility.visible": "菜单始终可见,即使处于全屏模式下。", "window.menuBarVisibility.toggle": "菜单隐藏,但可以通过 Alt 键显示。", diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index 1a78dfcd728..2db4a66e7e7 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -9,6 +9,7 @@ "neverShowAgain": "不再显示", "close": "关闭", "workspaceRecommended": "此工作区具有扩展建议。", + "ignoreExtensionRecommendations": "你是否要忽略所有推荐的扩展?", "ignoreAll": "是,忽略全部", "no": "否", "cancel": "取消" diff --git a/i18n/chs/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json b/i18n/chs/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json index 01fb87d2213..bdf7aa2a3b1 100644 --- a/i18n/chs/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "showTriggerActions": "显示所有命令", + "showCommands.label": "命令面板...", "entryAriaLabelWithKey": "{0}、{1} ,命令", "entryAriaLabel": "{0},命令", "canNotRun": "无法从此处运行命令“{0}”。", diff --git a/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 6e5483236d8..ea901c652ca 100644 --- a/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,7 +6,6 @@ { "selectTheme.label": "颜色主题", "installColorThemes": "安装其他颜色主题...", - "themes.selectTheme": "选择颜色主题", "selectIconTheme.label": "文件图标主题", "installIconThemes": "安装其他文件图标主题...", "noIconThemeLabel": "无", diff --git a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index a1751e24660..d72b1788e10 100644 --- a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -15,22 +15,10 @@ "welcomePage.help": "帮助", "welcomePage.productDocumentation": "产品文档", "welcomePage.introductoryVideos": "入门视频", + "welcomePage.keybindingsReference": "键盘快捷方式参考", "welcomePage.gitHubRepository": "GitHub 存储库", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "启动时显示欢迎页", - "welcomePage.quickLinks": "快速链接", - "welcomePage.interactivePlayground": "交互式演练场", - "welcomePage.interactivePlaygroundDescription": "在简短演练中试用编辑器的基本功能", - "welcomePage.interfaceOverview": "界面概述", - "welcomePage.interfaceOverviewDescription": "查看突出显示主要 UI 组件的叠加图", - "welcomePage.colorTheme": "颜色主题", - "welcomePage.colorThemeDescription": "使编辑器和代码呈现你喜欢的外观", - "welcomePage.keybindingsReference": "键盘快捷方式参考", - "welcomePage.keybindingsReferenceDescription": "包含常见键盘快捷方式的可打印 PDF 文件", - "welcomePage.showCommands": "查找并运行所有命令", - "welcomePage.showCommandsDescription": "从控制面板快速访问并搜索命令({0})", - "welcomePage.configureSettings": "配置设置", - "welcomePage.configureSettingsDescription": "通过调整设置来解锁 VS Code 的全部功能", "welcomePage.installKeymapDescription": "安装键盘快捷方式", "welcomePage.installKeymap": "安装 {0}、{1}、{2} 和 {3} 的键盘快捷方式", "welcomePage.vim": "Vim", @@ -39,5 +27,17 @@ "welcomePage.sublimeCurrent": "Sublime (当前)", "welcomePage.atom": "Atom", "welcomePage.atomCurrent": "Atom (当前)", - "welcomePage.others": "其他" + "welcomePage.others": "其他", + "welcomePage.colorTheme": "颜色主题", + "welcomePage.colorThemeDescription": "使编辑器和代码呈现你喜欢的外观", + "welcomePage.configureSettings": "配置设置", + "welcomePage.configureSettingsDescription": "通过调整设置来解锁 VS Code 的全部功能", + "welcomePage.showCommands": "查找并运行所有命令", + "welcomePage.showCommandsDescription": "从控制面板快速访问并搜索命令({0})", + "welcomePage.interfaceOverview": "界面概述", + "welcomePage.interfaceOverviewDescription": "查看突出显示主要 UI 组件的叠加图", + "welcomePage.interactivePlayground": "交互式演练场", + "welcomePage.interactivePlaygroundDescription": "在简短演练中试用编辑器的基本功能", + "welcomePage.quickLinks": "快速链接", + "welcomePage.keybindingsReferenceDescription": "包含常见键盘快捷方式的可打印 PDF 文件" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 067feb41358..a7a1da08c20 100644 --- a/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,6 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "open": "打开设置", + "close": "关闭", "errorUnknownKey": "无法写入配置文件(未知密钥)", - "errorInvalidTarget": "无法写入到配置文件(无效的目标)" + "errorInvalidTarget": "无法写入到配置文件(无效的目标)", + "errorNoWorkspaceOpened": "没有打开任何文件夹,因此无法写入设置。请先打开一个文件夹,然后重试。", + "errorInvalidConfiguration": "无法写入设置。请打开 **用户设置** 更正文件中的错误/警告,然后重试。", + "errorInvalidConfigurationWorkspace": "无法写入设置。请打开 **工作区设置** 更正文件中的错误/警告,然后重试。" } \ No newline at end of file diff --git a/i18n/cht/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/cht/extensions/typescript/out/typescriptServiceClient.i18n.json index cbb3857f331..0ac728237d9 100644 --- a/i18n/cht/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/cht/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "channelName": "TypeScript", "noServerFound": "路徑 {0} 未指向有效的 tsserver 安裝。即將回復為配套的 TypeScript 版本。", "noBundledServerFound": "其他應用程式已刪除了 VSCode 的 tsserver,例如行為不當的病毒偵測工具。請重新安裝 VS Code。", "versionNumber.custom": "自訂", diff --git a/i18n/cht/extensions/typescript/out/utils/logger.i18n.json b/i18n/cht/extensions/typescript/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/extensions/typescript/out/utils/logger.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript/package.i18n.json b/i18n/cht/extensions/typescript/package.i18n.json index c0d77144501..40830ab8a6c 100644 --- a/i18n/cht/extensions/typescript/package.i18n.json +++ b/i18n/cht/extensions/typescript/package.i18n.json @@ -33,7 +33,6 @@ "javascript.validate.enable": "啟用/停用 JavaScript 驗證。", "typescript.goToProjectConfig.title": "移至專案組態", "javascript.goToProjectConfig.title": "移至專案組態", - "typescript.referencesCodeLens.enabled": "啟用/停用參考 CodeLens。需要 TypeScript >= 2.0.6。", "typescript.implementationsCodeLens.enabled": "啟用/停用實作 CodeLens。需要 TypeScript >= 2.2.0。", "typescript.selectTypeScriptVersion.title": "選取 TypeScript 版本", "jsDocCompletion.enabled": "啟用/停用自動 JSDoc 註解", diff --git a/i18n/cht/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/cht/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index da6b8c6d2c0..e50c19fed72 100644 --- a/i18n/cht/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/cht/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -5,9 +5,6 @@ // Do not edit this file. It is machine generated. { "imgMeta": "{0}x{1} {2}", - "largeImageError": "因為影像太大,所以無法在編輯器中顯示。", - "resourceOpenExternalButton": "開啟影像", - "resourceOpenExternalText": " 要使用外部程式嗎?", "nativeBinaryError": "檔案為二進位檔、非常大或使用不支援的文字編碼,因此將不會顯示於編輯器中。", "sizeB": "{0}B", "sizeKB": "{0}KB", diff --git a/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json index 810bd9dd09b..3597fc58634 100644 --- a/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -10,5 +10,8 @@ "caret": "編輯器游標的色彩。", "editorWhitespaces": "編輯器中空白字元的色彩。", "editorIndentGuides": "編輯器縮排輔助線的色彩。", - "editorLineNumbers": "編輯器行號的色彩。" + "editorLineNumbers": "編輯器行號的色彩。", + "editorCodeLensForeground": "編輯器程式碼濾鏡的前景色彩", + "editorBracketMatchBackground": "成對括號背景色彩", + "editorBracketMatchBorder": "成對括號邊框色彩" } \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json b/i18n/cht/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json index 65c92c77404..e0be46a962e 100644 --- a/i18n/cht/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json +++ b/i18n/cht/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json @@ -16,6 +16,8 @@ "peekViewTitleInfoForeground": "預覽檢視標題資訊的色彩。", "peekViewBorder": "預覽檢視之框線與箭頭的色彩。", "peekViewResultsBackground": "預覽檢視中結果清單的背景色彩。", + "peekViewResultsMatchForeground": "預覽檢視結果列表中行節點的前景色彩", + "peekViewResultsFileForeground": "預覽檢視結果列表中檔案節點的前景色彩", "peekViewResultsSelectionBackground": "在預覽檢視之結果清單中選取項目時的背景色彩。", "peekViewResultsSelectionForeground": "在預覽檢視之結果清單中選取項目時的前景色彩。", "peekViewEditorBackground": "預覽檢視編輯器的背景色彩。", diff --git a/i18n/cht/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/cht/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json index 9414bc08e6a..993d9fa74a6 100644 --- a/i18n/cht/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json +++ b/i18n/cht/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "requirearray": "功能表項目必須為陣列", + "requirestring": "屬性 '{0}' 為強制項目且必須屬於 `string` 類型", "optstring": "屬性 `{0}` 可以省略或必須屬於 `string` 類型", "vscode.extension.contributes.menuItem.command": "所要執行命令的識別碼。命令必須在 'commands' 區段中宣告", "vscode.extension.contributes.menuItem.alt": "所要執行替代命令的識別碼。命令必須在 'commands' 區段中宣告", diff --git a/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json index 2064ef5c178..67ff64fbd80 100644 --- a/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -8,14 +8,21 @@ "schema.colors": "工作台中使用的色彩。", "foreground": "整體的前景色彩。僅當未被任何元件覆疊時,才會使用此色彩。", "errorForeground": "整體錯誤訊息的前景色彩。僅當未被任何元件覆蓋時,才會使用此色彩。", + "descriptionForeground": "提供附加訊息的前景顏色,例如標籤", "focusBorder": "焦點項目的整體邊界色彩。只在沒有任何元件覆寫此色彩時,才會加以使用。", "contrastBorder": "項目周圍的額外邊界,可將項目從其他項目中區隔出來以提高對比。", "activeContrastBorder": "使用中項目周圍的額外邊界,可將項目從其他項目中區隔出來以提高對比。", + "selectionBackground": "作業區域選取的背景顏色(例如輸入或文字區域)。請注意,這不適用於編輯器與終端機中的選取。", + "textSeparatorForeground": "文字分隔符號的顏色。", + "textLinkForeground": "內文連結的前景色彩", + "textLinkActiveForeground": "內文使用連結的前景色彩", + "textCodeBlockBackground": "文字區塊的背景顏色。", "widgetShadow": "小工具的陰影色彩,例如編輯器中的尋找/取代。", "inputBoxBackground": "輸入方塊的背景。", "inputBoxForeground": "輸入方塊的前景。", "inputBoxBorder": "輸入方塊的框線。", "inputBoxActiveOptionBorder": "輸入欄位中可使用之項目的框線色彩。", + "inputPlaceholderForeground": "文字輸入替代字符的前景顏色。", "inputValidationInfoBackground": "資訊嚴重性的輸入驗證背景色彩。", "inputValidationInfoBorder": "資訊嚴重性的輸入驗證邊界色彩。", "inputValidationWarningBackground": "資訊警告的輸入驗證背景色彩。", @@ -27,8 +34,9 @@ "dropdownBorder": "下拉式清單的框線。", "listFocusBackground": "當清單/樹狀為使用中狀態時,焦點項目的清單/樹狀背景色彩。使用中的清單/樹狀有鍵盤焦點,非使用中者則沒有。", "listActiveSelectionBackground": "當清單/樹狀為使用中狀態時,所選項目的清單/樹狀背景色彩。使用中的清單/樹狀有鍵盤焦點,非使用中者則沒有。", - "listInactiveSelectionBackground": "當清單/樹狀為非使用中狀態時,所選項目的清單/樹狀背景色彩。使用中的清單/樹狀有鍵盤焦點,非使用中者則沒有。", "listActiveSelectionForeground": "當清單/樹狀為使用中狀態時,所選項目的清單/樹狀前景色彩。使用中的清單/樹狀有鍵盤焦點,非使用中者則沒有。", + "listInactiveSelectionBackground": "當清單/樹狀為非使用中狀態時,所選項目的清單/樹狀背景色彩。使用中的清單/樹狀有鍵盤焦點,非使用中者則沒有。", + "listInactiveSelectionForeground": "當清單/樹狀為使用中狀態時,所選項目的清單/樹狀前景色彩。使用中的清單/樹狀有鍵盤焦點,非使用中則沒有。", "listHoverBackground": "使用滑鼠暫留在項目時的清單/樹狀背景。", "listDropBackground": "使用滑鼠四處移動項目時的清單/樹狀拖放背景。", "highlight": "在清單/樹狀內搜尋時,相符醒目提示的清單/樹狀前景色彩。", @@ -37,12 +45,15 @@ "buttonForeground": "按鈕前景色彩。", "buttonBackground": "按鈕背景色彩。", "buttonHoverBackground": "暫留時的按鈕背景色彩。", + "badgeBackground": "標記的背景顏色。標記為小型的訊息標籤,例如搜尋結果的數量。", + "badgeForeground": "標記的前景顏色。標記為小型的訊息標籤,例如搜尋結果的數量。", "scrollbarShadow": "指出在捲動該檢視的捲軸陰影。", "scrollbarSliderBackground": "滑桿背景色彩。", "scrollbarSliderHoverBackground": "暫留時的滑桿背景色彩。", "scrollbarSliderActiveBackground": "使用中狀態時的滑桿背景色彩。", "editorBackground": "編輯器的背景色彩。", "editorForeground": "編輯器的預設前景色彩。", + "editorWidgetBackground": "編輯器小工具的背景色彩,例如尋找/取代。", "editorSelection": "編輯器選取範圍的色彩。", "editorInactiveSelection": "非使用中之編輯器選取範圍的色彩。", "editorSelectionHighlight": "選取時,內容相同之區域的色彩。", @@ -52,6 +63,5 @@ "hoverHighlight": "在顯示了動態顯示的單字下方醒目提示。", "hoverBackground": "編輯器動態顯示的背景色彩。", "hoverBorder": "編輯器動態顯示的框線色彩。", - "activeLinkForeground": "使用中之連結的色彩。", - "editorWidgetBackground": "編輯器小工具的背景色彩,例如尋找/取代。" + "activeLinkForeground": "使用中之連結的色彩。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json index 8b6ad71cd4e..36b2b7b357e 100644 --- a/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json +++ b/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "overwritingExtension": "正在以 {1} 覆寫延伸模組 {0}。", + "extensionUnderDevelopment": "正在載入位於 {0} 的開發延伸模組" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json index 8b6ad71cd4e..4d3f09317ea 100644 --- a/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json +++ b/i18n/cht/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "close": "關閉", + "cancel": "取消", + "ok": "確定" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 891c5bae600..877f81d59fd 100644 --- a/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,7 +6,6 @@ { "selectTheme.label": "色彩佈景主題", "installColorThemes": "安裝其他的色彩佈景主題...", - "themes.selectTheme": "選取色彩佈景主題", "selectIconTheme.label": "檔案圖示佈景主題", "installIconThemes": "安裝其他的檔案圖示主題...", "noIconThemeLabel": "無", diff --git a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 5e5be1740d8..d9994a0fc55 100644 --- a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -15,22 +15,10 @@ "welcomePage.help": "說明", "welcomePage.productDocumentation": "產品文件", "welcomePage.introductoryVideos": "簡介影片", + "welcomePage.keybindingsReference": "鍵盤快速鍵參考", "welcomePage.gitHubRepository": "GitHub 存放庫", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "啟動時顯示歡迎頁面", - "welcomePage.quickLinks": "快速連結", - "welcomePage.interactivePlayground": "Interactive Playground", - "welcomePage.interactivePlaygroundDescription": "嘗試使用逐步解說短片中的一些基本編輯器功能", - "welcomePage.interfaceOverview": "介面概觀", - "welcomePage.interfaceOverviewDescription": "使用視覺覆疊效果強調顯示 UI 的主要元件", - "welcomePage.colorTheme": "彩色佈景主題", - "welcomePage.colorThemeDescription": "將編輯器及您的程式碼設定成您喜愛的外觀", - "welcomePage.keybindingsReference": "鍵盤快速鍵參考", - "welcomePage.keybindingsReferenceDescription": "可列印的 PDF,附有最常用的鍵盤快速鍵", - "welcomePage.showCommands": "尋找及執行所有命令", - "welcomePage.showCommandsDescription": "從控制台快速存取及搜尋命令 ({0})", - "welcomePage.configureSettings": "組態設定", - "welcomePage.configureSettingsDescription": "微調設定就能發揮 VS Code 的所有功能", "welcomePage.installKeymapDescription": "安裝鍵盤快速鍵", "welcomePage.installKeymap": "安裝鍵盤快速鍵 {0}、{1}、{2} 及 {3}", "welcomePage.vim": "活力", @@ -39,5 +27,17 @@ "welcomePage.sublimeCurrent": "壯麗 (目前)", "welcomePage.atom": "Atom", "welcomePage.atomCurrent": "Atom (目前)", - "welcomePage.others": "其他" + "welcomePage.others": "其他", + "welcomePage.colorTheme": "彩色佈景主題", + "welcomePage.colorThemeDescription": "將編輯器及您的程式碼設定成您喜愛的外觀", + "welcomePage.configureSettings": "組態設定", + "welcomePage.configureSettingsDescription": "微調設定就能發揮 VS Code 的所有功能", + "welcomePage.showCommands": "尋找及執行所有命令", + "welcomePage.showCommandsDescription": "從控制台快速存取及搜尋命令 ({0})", + "welcomePage.interfaceOverview": "介面概觀", + "welcomePage.interfaceOverviewDescription": "使用視覺覆疊效果強調顯示 UI 的主要元件", + "welcomePage.interactivePlayground": "Interactive Playground", + "welcomePage.interactivePlaygroundDescription": "嘗試使用逐步解說短片中的一些基本編輯器功能", + "welcomePage.quickLinks": "快速連結", + "welcomePage.keybindingsReferenceDescription": "可列印的 PDF,附有最常用的鍵盤快速鍵" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/cht/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 95764540d13..66d7f136aff 100644 --- a/i18n/cht/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/cht/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,6 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "open": "開啟設定", + "close": "關閉", "errorUnknownKey": "無法寫入組態檔 (不明的按鍵)", "errorInvalidTarget": "無法寫入組態檔 (目標無效)" } \ No newline at end of file diff --git a/i18n/deu/extensions/git/package.i18n.json b/i18n/deu/extensions/git/package.i18n.json index 379f38b08fe..c11e465ce45 100644 --- a/i18n/deu/extensions/git/package.i18n.json +++ b/i18n/deu/extensions/git/package.i18n.json @@ -15,7 +15,7 @@ "command.revertSelectedRanges": "Ausgewählte Bereiche zurücksetzen", "command.unstage": "Bereitstellung der Änderungen aufheben", "command.unstageAll": "Bereitstellung aller Änderungen aufheben", - "command.unstageSelectedRanges": "Staffelung gewählter Bereiche aufheben", + "command.unstageSelectedRanges": "Bereitstellung gewählter Bereiche aufheben", "command.clean": "Änderungen verwerfen", "command.cleanAll": "Alle Änderungen verwerfen", "command.commit": "Commit", @@ -25,7 +25,7 @@ "command.commitAllSigned": "Alle committen (abgemeldet)", "command.undoCommit": "Letzten Commit rückgängig machen", "command.checkout": "Auschecken an...", - "command.branch": "Branch wird erstellt...", + "command.branch": "Branch erstellen...", "command.pull": "Pull", "command.pullRebase": "Pull (Rebase)", "command.push": "Push", diff --git a/i18n/deu/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/deu/extensions/typescript/out/typescriptServiceClient.i18n.json index d2333f5052c..5cda5156ae6 100644 --- a/i18n/deu/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/deu/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "channelName": "TypeScript", "noServerFound": "Der Pfad \"{0}\" zeigt nicht auf eine gültige tsserver-Installation. Fallback auf gebündelte TypeScript-Version wird durchgeführt.", "noBundledServerFound": "Der tsserver von VSCode wurde von einer anderen Anwendung wie etwa einem fehlerhaften Tool zur Viruserkennung gelöscht. Führen Sie eine Neuinstallation von VS Code durch.", "versionNumber.custom": "benutzerdefiniert", diff --git a/i18n/deu/extensions/typescript/out/utils/logger.i18n.json b/i18n/deu/extensions/typescript/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/extensions/typescript/out/utils/logger.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript/package.i18n.json b/i18n/deu/extensions/typescript/package.i18n.json index d749c1d297f..d48740fd4d3 100644 --- a/i18n/deu/extensions/typescript/package.i18n.json +++ b/i18n/deu/extensions/typescript/package.i18n.json @@ -33,7 +33,6 @@ "javascript.validate.enable": "JavaScript-Überprüfung aktivieren/deaktivieren.", "typescript.goToProjectConfig.title": "Zur Projektkonfiguration wechseln", "javascript.goToProjectConfig.title": "Zur Projektkonfiguration wechseln", - "typescript.referencesCodeLens.enabled": "Aktiviert oder deaktiviert CodeLens-Verweise. Erfordert TypeScript 2.0.6 oder höher.", "typescript.implementationsCodeLens.enabled": "Aktiviert oder deaktiviert CodeLens-Implementierungen. Erfordert TypeScript 2.2.0 oder höher.", "typescript.selectTypeScriptVersion.title": "TypeScript-Version wählen", "jsDocCompletion.enabled": "Automatische JSDoc-Kommentare aktivieren/deaktivieren", diff --git a/i18n/deu/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/deu/src/vs/base/common/jsonErrorMessages.i18n.json index 8b6ad71cd4e..e4b0b451c6c 100644 --- a/i18n/deu/src/vs/base/common/jsonErrorMessages.i18n.json +++ b/i18n/deu/src/vs/base/common/jsonErrorMessages.i18n.json @@ -3,4 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "error.invalidSymbol": "Ungültiges Symbol", + "error.invalidNumberFormat": "Ungültiges Zahlenformat.", + "error.propertyNameExpected": "Ein Eigenschaftenname wurde erwartet.", + "error.valueExpected": "Ein Wert wurde erwartet.", + "error.colonExpected": "Ein Doppelpunkt wurde erwartet.", + "error.commaExpected": "Ein Komma wurde erwartet.", + "error.closeBraceExpected": "Eine schließende geschweifte Klammer wurde erwartet.", + "error.closeBracketExpected": "Eine schließende Klammer wurde erwartet.", + "error.endOfFileExpected": "Das Dateiende wurde erwartet." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/code/electron-main/menus.i18n.json b/i18n/deu/src/vs/code/electron-main/menus.i18n.json index 9b4d51238e4..2a26af07f79 100644 --- a/i18n/deu/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/deu/src/vs/code/electron-main/menus.i18n.json @@ -6,7 +6,7 @@ { "mFile": "&&Datei", "mEdit": "&&Bearbeiten", - "mSelection": "&&Aktion auswählen", + "mSelection": "&&Auswahl", "mView": "&&Anzeigen", "mGoto": "Los", "mDebug": "&&Debuggen", @@ -115,7 +115,7 @@ "miGotoDefinition": "Gehe &&zu Definition", "miGotoLine": "Gehe zu &&Zeile...", "miStartDebugging": "&&Debugging starten", - "miStartWithoutDebugging": "&&Ohne Debuggen starten", + "miStartWithoutDebugging": "&&Ohne Debugging starten", "miStopDebugging": "&&Debugging beenden", "miRestart Debugging": "&&Debugging erneut starten", "miOpenConfigurations": "&&Konfigurationen öffnen", diff --git a/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json index f29acd79682..90e66cbb9c0 100644 --- a/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -26,8 +26,8 @@ "dropdownBorder": "Rahmen für Dropdown.", "listFocusBackground": "Hintergrundfarbe der Liste/Struktur für das fokussierte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.", "listActiveSelectionBackground": "Hintergrundfarbe der Liste/Struktur für das ausgewählte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.", - "listInactiveSelectionBackground": "Hintergrundfarbe der Liste/Struktur für das ausgewählte Element, wenn die Liste/Struktur inaktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.", "listActiveSelectionForeground": "Vordergrundfarbe der Liste/Struktur für das ausgewählte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.", + "listInactiveSelectionBackground": "Hintergrundfarbe der Liste/Struktur für das ausgewählte Element, wenn die Liste/Struktur inaktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.", "listHoverBackground": "Hintergrund der Liste/Struktur, wenn mit der Maus auf Elemente gezeigt wird.", "listDropBackground": "Drag & Drop-Hintergrund der Liste/Struktur, wenn Elemente mithilfe der Maus verschoben werden.", "highlight": "Vordergrundfarbe der Liste/Struktur zur Trefferhervorhebung beim Suchen innerhalb der Liste/Struktur.", @@ -42,6 +42,7 @@ "scrollbarSliderActiveBackground": "Hintergrundfarbe des Schiebereglers, wenn dieser aktiv ist.", "editorBackground": "Hintergrundfarbe des Editors.", "editorForeground": "Standardvordergrundfarbe des Editors.", + "editorWidgetBackground": "Hintergrundfarbe von Editor-Widgets wie zum Beispiel Suchen/Ersetzen.", "editorSelection": "Farbe der Editor-Auswahl.", "editorInactiveSelection": "Farbe der Auswahl in einem inaktiven Editor.", "editorSelectionHighlight": "Farbe für Bereiche, deren Inhalt der Auswahl entspricht.", @@ -51,6 +52,5 @@ "hoverHighlight": "Hervorhebung eines Worts, unter dem ein Mauszeiger angezeigt wird.", "hoverBackground": "Background color of the editor hover.", "hoverBorder": "Rahmenfarbe des Editor-Mauszeigers.", - "activeLinkForeground": "Farbe der aktiven Links.", - "editorWidgetBackground": "Hintergrundfarbe von Editor-Widgets wie zum Beispiel Suchen/Ersetzen." + "activeLinkForeground": "Farbe der aktiven Links." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json index 8b6ad71cd4e..1d3dbda78ae 100644 --- a/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json +++ b/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "overwritingExtension": "Die Erweiterung \"{0}\" wird mit \"{1}\" überschrieben.", + "extensionUnderDevelopment": "Die Entwicklungserweiterung unter \"{0}\" wird geladen." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json index 8b6ad71cd4e..d76b48e30db 100644 --- a/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json +++ b/i18n/deu/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "close": "Schließen", + "cancel": "Abbrechen", + "ok": "OK" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json index 66aee761ca9..c893534d59c 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json @@ -15,7 +15,7 @@ "changelog": "ChangeLog", "dependencies": "Abhängigkeiten", "noReadme": "Keine INFODATEI verfügbar.", - "noChangelog": "Es ist kein Änderungsprotokoll verfügbar.", + "noChangelog": "Es ist kein ChangeLog verfügbar.", "noContributions": "Keine Beiträge", "noDependencies": "Keine Abhängigkeiten", "settings": "Einstellungen ({0})", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index d87f46daa42..3fc196fe64e 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -22,7 +22,7 @@ "disableGloballyAction": "Immer", "disableAction": "Deaktivieren", "checkForUpdates": "Nach Updates suchen", - "updateAll": "Alle Extensions aktualisieren", + "updateAll": "Alle Erweiterungen aktualisieren", "reloadAction": "Neu starten", "postUpdateTooltip": "Zum Aktualisieren erneut laden", "postUpdateMessage": "Dieses Fenster erneut laden, um die aktualisierte Erweiterung \"{0}\" zu aktivieren?", @@ -33,15 +33,15 @@ "postUninstallTooltip": "Zum Deaktivieren erneut laden", "postUninstallMessage": "Dieses Fenster erneut laden, um die deinstallierte Erweiterung \"{0}\" zu deaktivieren?", "reload": "Fenster &&erneut laden", - "toggleExtensionsViewlet": "Extensions anzeigen", - "installExtensions": "Extensions installieren", - "showInstalledExtensions": "Installierte Extensions anzeigen", + "toggleExtensionsViewlet": "Erweiterungen anzeigen", + "installExtensions": "Erweiterungen installieren", + "showInstalledExtensions": "Installierte Erweiterungen anzeigen", "showDisabledExtensions": "Deaktivierte Erweiterungen anzeigen", "clearExtensionsInput": "Extensioneingabe löschen", - "showOutdatedExtensions": "Veraltete Extensions anzeigen", - "showPopularExtensions": "Beliebte Extensions anzeigen", - "showRecommendedExtensions": "Empfohlene Extensions anzeigen", - "showWorkspaceRecommendedExtensions": "Für den Arbeitsbereich empfohlene Extensions anzeigen", + "showOutdatedExtensions": "Veraltete Erweiterungen anzeigen", + "showPopularExtensions": "Beliebte Erweiterungen anzeigen", + "showRecommendedExtensions": "Empfohlene Erweiterungen anzeigen", + "showWorkspaceRecommendedExtensions": "Für den Arbeitsbereich empfohlene Erweiterungen anzeigen", "showRecommendedKeymapExtensions": "Empfohlene Tastenzuordnungen anzeigen", "showRecommendedKeymapExtensionsShort": "Tastenzuordnungen", "configureWorkspaceRecommendedExtensions": "Empfohlene Erweiterungen konfigurieren (Arbeitsbereich)", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.i18n.json index e5f434b98b2..6772e6da405 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "manage": "Drücken Sie die EINGABETASTE, um Ihre Extensions zu verwalten.", + "manage": "Drücken Sie die EINGABETASTE, um Ihre Erweiterungen zu verwalten.", "searchFor": "Drücken Sie die EINGABETASTE, um nach \"{0}\" in Marketplace zu suchen.", - "noExtensionsToInstall": "Geben Sie einen Extensionnamen ein." + "noExtensionsToInstall": "Geben Sie einen Erweiterungsnamen ein." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/extensions/common/extensionsInput.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/common/extensionsInput.i18n.json index d2cb0550504..0e1519f5cd4 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/common/extensionsInput.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/common/extensionsInput.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "extensionsInputName": "Extension: {0}" + "extensionsInputName": "Erweiterung: {0}" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json index ab33ef36c7a..b580aff8fbe 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -8,7 +8,9 @@ "showRecommendations": "Empfehlungen anzeigen", "neverShowAgain": "Nicht mehr anzeigen", "close": "Schließen", - "workspaceRecommended": "Für diesen Arbeitsbereich sind Extensionempfehlungen verfügbar.", + "workspaceRecommended": "Für diesen Arbeitsbereich sind Erweiterungsempfehlungen verfügbar.", + "ignoreExtensionRecommendations": "Möchten Sie alle Erweiterungsempfehlungen ignorieren?", + "ignoreAll": "Ja, alles ignorieren", "no": "Nein", "cancel": "Abbrechen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json index b2acacf886c..952bcc59803 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json @@ -4,11 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "extensionsCommands": "Extensions verwalten", - "galleryExtensionsCommands": "Katalogextensions installieren", - "extension": "Extension", + "extensionsCommands": "Erweiterungen verwalten", + "galleryExtensionsCommands": "Katalogerweiterungen installieren", + "extension": "Erweiterung", "extensions": "Extensions", "view": "Anzeigen", "extensionsConfigurationTitle": "Extensions", - "extensionsAutoUpdate": "Extensions automatisch aktualisieren" + "extensionsAutoUpdate": "Erweiterungen automatisch aktualisieren", + "extensionsIgnoreRecommendations": "Erweiterungsempfehlungen ignorieren" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json index b323c51e402..56a40560962 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "openExtensionsFolder": "Extensionordner öffnen", + "openExtensionsFolder": "Erweiterungsordner öffnen", "installVSIX": "Aus VSIX installieren...", "InstallVSIXAction.success": "Die Erweiterung wurde erfolgreich installiert. Führen Sie einen Neustart aus, um sie zu aktivieren.", "InstallVSIXAction.reloadNow": "Jetzt erneut laden" diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json index ae64fcc4f47..154eb0da6ad 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -4,12 +4,12 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "searchExtensions": "Nach Extensions in Marketplace suchen", + "searchExtensions": "Nach Erweiterungen im Marketplace suchen", "extensions": "Extensions", "sort by installs": "Sortieren nach: Installationsanzahl", "sort by rating": "Sortieren nach: Bewertung", "sort by name": "Sortieren nach: Name", "no extensions found": "Es wurden keine Erweiterungen gefunden.", "suggestProxyError": "Marketplace hat \"ECONNREFUSED\" zurückgegeben. Überprüfen Sie die Einstellung \"http.proxy\".", - "outdatedExtensions": "{0} veraltete Extensions" + "outdatedExtensions": "{0} veraltete Erweiterungen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 82b8c378940..cc616e88ee2 100644 --- a/i18n/deu/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,7 +6,6 @@ { "selectTheme.label": "Farbdesign", "installColorThemes": "Zusätzliche Farbschemas installieren...", - "themes.selectTheme": "Farbdesign auswählen", "selectIconTheme.label": "Dateisymboldesign", "installIconThemes": "Zusätzliche Dateisymbolschemas installieren...", "noIconThemeLabel": "Keine", diff --git a/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 96b687256c6..0a1018ac4fa 100644 --- a/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "welcomePage.vscode": "Visual Studio-Code", + "welcomePage.vscode": "Visual Studio Code", "welcomePage.editingEvolved": "Fortschrittliche Bearbeitung", "welcomePage.start": "Starten", "welcomePage.newFile": "Neue Datei", @@ -15,22 +15,10 @@ "welcomePage.help": "Hilfe", "welcomePage.productDocumentation": "Produktdokumentation", "welcomePage.introductoryVideos": "Einführungsvideos", + "welcomePage.keybindingsReference": "Referenz für Tastenkombinationen", "welcomePage.gitHubRepository": "GitHub-Repository", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "Willkommensseite beim Start anzeigen", - "welcomePage.quickLinks": "Direktlinks", - "welcomePage.interactivePlayground": "Interaktiver Playground", - "welcomePage.interactivePlaygroundDescription": "Testen Sie die wichtigsten Editorfunktionen in einer kurzen exemplarischen Vorgehensweise.", - "welcomePage.interfaceOverview": "Überblick über die Schnittstelle", - "welcomePage.interfaceOverviewDescription": "Erhalten Sie eine visuelle Überlagerung, die die wichtigsten Komponenten der Benutzeroberfläche hervorhebt.", - "welcomePage.colorTheme": "Farbdesign", - "welcomePage.colorThemeDescription": "Passen Sie das Aussehen des Editors und Ihres Codes an Ihre Wünsche an.", - "welcomePage.keybindingsReference": "Referenz für Tastenkombinationen", - "welcomePage.keybindingsReferenceDescription": "Eine druckbare PDF mit den wichtigsten Tastenkombinationen", - "welcomePage.showCommands": "Alle Befehle suchen und ausführen", - "welcomePage.showCommandsDescription": "Über die Einstellungen ({0}) können Sie Befehle schnell suchen und darauf zugreifen.", - "welcomePage.configureSettings": "Einstellungen konfigurieren", - "welcomePage.configureSettingsDescription": "Optimieren Sie die Einstellungen, um VS Code bestmöglich zu nutzen.", "welcomePage.installKeymapDescription": "Tastenkombinationen installieren", "welcomePage.installKeymap": "Installieren Sie die Tastenkombinationen von {0} {1}, {2} und {3}.", "welcomePage.vim": "Vim", @@ -39,5 +27,17 @@ "welcomePage.sublimeCurrent": "Sublime (aktuell)", "welcomePage.atom": "Atom", "welcomePage.atomCurrent": "Atom (aktuell)", - "welcomePage.others": "Andere" + "welcomePage.others": "Andere", + "welcomePage.colorTheme": "Farbdesign", + "welcomePage.colorThemeDescription": "Passen Sie das Aussehen des Editors und Ihres Codes an Ihre Wünsche an.", + "welcomePage.configureSettings": "Einstellungen konfigurieren", + "welcomePage.configureSettingsDescription": "Optimieren Sie die Einstellungen, um VS Code bestmöglich zu nutzen.", + "welcomePage.showCommands": "Alle Befehle suchen und ausführen", + "welcomePage.showCommandsDescription": "Über die Einstellungen ({0}) können Sie Befehle schnell suchen und darauf zugreifen.", + "welcomePage.interfaceOverview": "Überblick über die Schnittstelle", + "welcomePage.interfaceOverviewDescription": "Erhalten Sie eine visuelle Überlagerung, die die wichtigsten Komponenten der Benutzeroberfläche hervorhebt.", + "welcomePage.interactivePlayground": "Interaktiver Playground", + "welcomePage.interactivePlaygroundDescription": "Testen Sie die wichtigsten Editorfunktionen in einer kurzen exemplarischen Vorgehensweise.", + "welcomePage.quickLinks": "Direktlinks", + "welcomePage.keybindingsReferenceDescription": "Eine druckbare PDF mit den wichtigsten Tastenkombinationen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index c0942a6e215..0c8e653b4e5 100644 --- a/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/deu/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,6 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "open": "Einstellungen öffnen", + "close": "Schließen", "errorUnknownKey": "Die Konfigurationsdatei kann nicht geschrieben werden (unbekannter Schlüssel).", "errorInvalidTarget": "In die Konfigurationsdatei kann nicht geschrieben werden (ungültiges Ziel)." } \ No newline at end of file diff --git a/i18n/esn/extensions/git/out/commands.i18n.json b/i18n/esn/extensions/git/out/commands.i18n.json index db106e2f05c..1897af0ac26 100644 --- a/i18n/esn/extensions/git/out/commands.i18n.json +++ b/i18n/esn/extensions/git/out/commands.i18n.json @@ -18,6 +18,7 @@ "discard": "Descartar cambios", "confirm discard all": "¿Está seguro de que quiere descartar TODOS los cambios? Esta acción es irreversible.", "discardAll": "Descartar cambios", + "no staged changes": "No hay elementos almacenados provisionalmente.\n\n¿Desea almacenar de forma provisional todos sus cambios y confirmarlos directamente?", "yes": "Sí", "always": "Siempre", "no changes": "No hay cambios para confirmar.", diff --git a/i18n/esn/extensions/git/package.i18n.json b/i18n/esn/extensions/git/package.i18n.json index ee4b5566a5e..504bfa02569 100644 --- a/i18n/esn/extensions/git/package.i18n.json +++ b/i18n/esn/extensions/git/package.i18n.json @@ -42,5 +42,7 @@ "config.countBadge": "Controla el contador de insignia de Git. \"Todo\" cuenta todos los cambios. \"Seguimiento\" solamente cuenta los cambios realizados. \"Desactivado\" lo desconecta.", "config.checkoutType": "Controla el tipo de ramas listadas cuando ejecuta \"Desproteger\". \"Todo\" muetra todas las referencias, \"local\" solamente las ramas locales y \"remoto\" las ramas remotas.", "config.ignoreLegacyWarning": "Ignora las advertencias hereradas de Git", - "config.ignoreLimitWarning": "\nIgnora advertencias cuando se encuentran muchos cambios en un repositorio." + "config.ignoreLimitWarning": "\nIgnora advertencias cuando se encuentran muchos cambios en un repositorio.", + "config.defaultCloneDirectory": "La ubicación predeterminada en la que se clona un repositorio git", + "config.enableSmartCommit": "Confirmar todos los cambios cuando no hay elementos almacenados provisionalmente." } \ No newline at end of file diff --git a/i18n/esn/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/esn/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json index 8b6ad71cd4e..e9580039979 100644 --- a/i18n/esn/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json +++ b/i18n/esn/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "ts-check": "Habilita la verificación semántica en un archivo de JavaScript. Debe estar al principio del archivo.", + "ts-nocheck": "Deshabilita la verificación semántica en un archivo de JavaScript. Debe estar al principio del archivo.", + "ts-ignore": "Suprime los errores @ts-check en la siguiente línea de un archivo. " +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/esn/extensions/typescript/out/typescriptServiceClient.i18n.json index 404195c7bb3..dd6d27fed4a 100644 --- a/i18n/esn/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/esn/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "channelName": "TypeScript", "noServerFound": "La ruta de acceso {0} no apunta a una instalación válida de tsserver. Se usará la versión de TypeScript del paquete.", "noBundledServerFound": "Otra aplicación (por ejemplo, una herramienta de detección de virus con un comportamiento erróneo) eliminó el tsserver de VSCode. Debe reinstalar VS Code.", "versionNumber.custom": "personalizada", diff --git a/i18n/esn/extensions/typescript/out/utils/logger.i18n.json b/i18n/esn/extensions/typescript/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/extensions/typescript/out/utils/logger.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript/package.i18n.json b/i18n/esn/extensions/typescript/package.i18n.json index 70f4c257c8f..80029cd25d6 100644 --- a/i18n/esn/extensions/typescript/package.i18n.json +++ b/i18n/esn/extensions/typescript/package.i18n.json @@ -33,8 +33,8 @@ "javascript.validate.enable": "Habilita o deshabilita la validación de JavaScript.", "typescript.goToProjectConfig.title": "Ir a configuración del proyecto", "javascript.goToProjectConfig.title": "Ir a configuración del proyecto", - "typescript.referencesCodeLens.enabled": "Habilita o deshabilita referencias de CodeLens. Requiere TypeScript >= 2.0.6.", "typescript.implementationsCodeLens.enabled": "Habilita o deshabilita implementaciones de CodeLens. Requiere TypeScript >= 2.2.0.", + "typescript.openTsServerLog.title": "Abrir registro del servidor de TS", "typescript.selectTypeScriptVersion.title": "Seleccionar versión de TypeScript", "jsDocCompletion.enabled": "Habilita o deshabilita comentarios automaticos de JSDoc", "javascript.implicitProjectConfig.checkJs": "Habilita/deshabilita la comprobación semántica de los archivos JavaScript. Los archivos jsconfig.json o tsconfig.json reemplazan esta configuración. Se requiere TypeScript >=2.3.1.", diff --git a/i18n/esn/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/esn/src/vs/base/common/jsonErrorMessages.i18n.json index 8b6ad71cd4e..a9b302bfa97 100644 --- a/i18n/esn/src/vs/base/common/jsonErrorMessages.i18n.json +++ b/i18n/esn/src/vs/base/common/jsonErrorMessages.i18n.json @@ -3,4 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "error.invalidSymbol": "Símbolo no válido", + "error.invalidNumberFormat": "Formato de número no válido", + "error.propertyNameExpected": "Se esperaba el nombre de la propiedad", + "error.valueExpected": "Se esperaba un valor", + "error.colonExpected": "Se esperaban dos puntos", + "error.commaExpected": "Se esperaba una coma", + "error.closeBraceExpected": "Se esperaba una llave de cierre", + "error.closeBracketExpected": "Se esperaba un corchete de cierre", + "error.endOfFileExpected": "Se esperaba un fin de archivo" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/code/electron-main/menus.i18n.json b/i18n/esn/src/vs/code/electron-main/menus.i18n.json index 156ec87d003..06ce8e40cb3 100644 --- a/i18n/esn/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/esn/src/vs/code/electron-main/menus.i18n.json @@ -70,6 +70,7 @@ "miSmartSelectShrink": "&&Reducir selección", "miViewExplorer": "&&Explorador", "miViewSearch": "&&Buscar", + "miViewSCM": "S&&CM", "miViewDebug": "&&Depurar", "miViewExtensions": "E&&xtensiones", "miToggleOutput": "&&Salida", @@ -114,6 +115,8 @@ "miGotoSymbolInFile": "Ir al &&símbolo en el archivo...", "miGotoSymbolInWorkspace": "Ir al símbolo en el área de &&trabajo...", "miGotoDefinition": "Ir a &&definición", + "miGotoTypeDefinition": "Ir a la definición de &&Tipo", + "miGotoImplementation": "Ir a la &&Implementación", "miGotoLine": "Ir a la &&línea...", "miStartDebugging": "I&&niciar depuración", "miStartWithoutDebugging": "Iniciar &&sin depurar", diff --git a/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json index deeb605c6a6..a8373baa8d6 100644 --- a/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -62,6 +62,7 @@ "renderLineHighlight": "Controla cómo el editor debe presentar el resaltado de línea. Las posibilidades son \"ninguno\", \"margen\", \"línea\" y \"todo\".", "codeLens": "Controla si el editor muestra lentes de código", "folding": "Controla si el editor tiene habilitado el plegado de código.", + "hideFoldIcons": "Controla cuándo los iconos de plegado del margen son ocultados automáticamente.", "matchBrackets": "Resaltar corchetes coincidentes cuando se seleccione uno de ellos.", "glyphMargin": "Controla si el editor debe representar el margen de glifo vertical. El margen de glifo se usa, principalmente, para depuración.", "useTabStops": "La inserción y eliminación del espacio en blanco sigue a las tabulaciones.", diff --git a/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json index a34fb8f6c80..fcdba2ee5ad 100644 --- a/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/esn/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -11,6 +11,10 @@ "editorWhitespaces": "Color de los caracteres de espacio en blanco del editor.", "editorIndentGuides": "Color de las guías de sangría del editor.", "editorLineNumbers": "Color de números de línea del editor.", + "editorRuler": "Color de las reglas del editor", "editorCodeLensForeground": "Color principal de lentes de código en el editor", - "editorBracketMatchBackground": "Color de fondo tras corchetes coincidentes" + "editorBracketMatchBackground": "Color de fondo tras corchetes coincidentes", + "editorBracketMatchBorder": "Color de bloques con corchetes coincidentes", + "editorOverviewRulerBorder": "Color del borde de la regla de visión general.", + "editorGutter": "Color de fondo del margen del editor. Este espacio contiene los márgenes de glifos y los números de línea." } \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json b/i18n/esn/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json index d5f1fe00dd2..1e3309b1cf6 100644 --- a/i18n/esn/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json @@ -16,9 +16,12 @@ "peekViewTitleInfoForeground": "Color de la información del título de la vista de inspección.", "peekViewBorder": "Color de los bordes y la flecha de la vista de inspección.", "peekViewResultsBackground": "Color de fondo de la lista de resultados de vista de inspección.", + "peekViewResultsMatchForeground": "Color de primer plano de los nodos de inspección en la lista de resultados.", + "peekViewResultsFileForeground": "Color de primer plano de los archivos de inspección en la lista de resultados.", "peekViewResultsSelectionBackground": "Color de fondo de la entrada seleccionada en la lista de resultados de vista de inspección.", "peekViewResultsSelectionForeground": "Color de primer plano de la entrada seleccionada en la lista de resultados de vista de inspección.", "peekViewEditorBackground": "Color de fondo del editor de vista de inspección.", + "peekViewEditorGutterBackground": "Color de fondo del margen en el editor de vista de inspección.", "peekViewResultsMatchHighlight": "Buscar coincidencia con el color de resaltado de la lista de resultados de vista de inspección.", "peekViewEditorMatchHighlight": "Buscar coincidencia del color de resultado del editor de vista de inspección." } \ No newline at end of file diff --git a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json index 891fb1b41ee..987f41fef7b 100644 --- a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -7,14 +7,25 @@ "invalid.color": "Formato de color no válido. Use #TGB, #RBGA, #RRGGBB o #RRGGBBAA", "schema.colors": "Colores usados en el área de trabajo.", "foreground": "Color de primer plano general. Este color solo se usa si un componente no lo invalida.", + "errorForeground": "Color de primer plano general para los mensajes de erroe. Este color solo se usa si un componente no lo invalida.", + "descriptionForeground": "Color de primer plano para el texto descriptivo que proporciona información adicional, por ejemplo para una etiqueta.", "focusBorder": "Color de borde de los elementos con foco. Este color solo se usa si un componente no lo invalida.", "contrastBorder": "Un borde adicional alrededor de los elementos para separarlos unos de otros y así mejorar el contraste.", "activeContrastBorder": "Un borde adicional alrededor de los elementos activos para separarlos unos de otros y así mejorar el contraste.", + "selectionBackground": "El color de fondo del texto seleccionado en la área de trabajo (por ejemplo, campos de entrada o áreas de texto). Esto no se aplica a las selecciones dentro del editor o el terminal.", + "textSeparatorForeground": "Color para los separadores de texto.", + "textLinkForeground": "Color de primer plano para los vínculos en el texto.", + "textLinkActiveForeground": "Color de primer plano para los vínculos activos en el texto.", + "textPreformatForeground": "Color de primer plano para los segmentos de texto con formato previo.", + "textBlockQuoteBackground": "Color de fondo para los bloques en texto.", + "textBlockQuoteBorder": "Color de borde para los bloques en texto.", + "textCodeBlockBackground": "Color de fondo para los bloques de código en el texto.", "widgetShadow": "Color de sombra de los widgets dentro del editor, como buscar/reemplazar", "inputBoxBackground": "Fondo de cuadro de entrada.", "inputBoxForeground": "Primer plano de cuadro de entrada.", "inputBoxBorder": "Borde de cuadro de entrada.", "inputBoxActiveOptionBorder": "Color de borde de opciones activadas en campos de entrada.", + "inputPlaceholderForeground": "Color de primer plano para el marcador de posición de texto", "inputValidationInfoBackground": "Color de fondo de validación de entrada para gravedad de información.", "inputValidationInfoBorder": "Color de borde de validación de entrada para gravedad de información.", "inputValidationWarningBackground": "Color de fondo de validación de entrada para advertencia de información.", @@ -26,8 +37,9 @@ "dropdownBorder": "Borde de lista desplegable.", "listFocusBackground": "Color de fondo de la lista o el árbol del elemento con el foco cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", "listActiveSelectionBackground": "Color de fondo de la lista o el árbol del elemento seleccionado cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", - "listInactiveSelectionBackground": "Color de fondo de la lista o el árbol del elemento seleccionado cuando la lista o el árbol están inactivos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", "listActiveSelectionForeground": "Color de primer plano de la lista o el árbol del elemento con el foco cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", + "listInactiveSelectionBackground": "Color de fondo de la lista o el árbol del elemento seleccionado cuando la lista o el árbol están inactivos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", + "listInactiveSelectionForeground": "Color de primer plano de la lista o el árbol del elemento con el foco cuando la lista o el árbol esta inactiva. Una lista o un árbol tiene el foco del teclado cuando está activo, cuando esta inactiva no.", "listHoverBackground": "Fondo de la lista o el árbol al mantener el mouse sobre los elementos.", "listDropBackground": "Fondo de arrastrar y colocar la lista o el árbol al mover los elementos con el mouse.", "highlight": "Color de primer plano de la lista o el árbol de las coincidencias resaltadas al buscar dentro de la lista o el ábol.", @@ -36,12 +48,16 @@ "buttonForeground": "Color de primer plano del botón.", "buttonBackground": "Color de fondo del botón.", "buttonHoverBackground": "Color de fondo del botón al mantener el puntero.", + "badgeBackground": "Color de fondo de la insignia. Las insignias son pequeñas etiquetas de información, por ejemplo los resultados de un número de resultados.", + "badgeForeground": "Color de fondo de la insignia. Las insignias son pequeñas etiquetas de información, por ejemplo los resultados de un número de resultados.", "scrollbarShadow": "Sombra de la barra de desplazamiento indica que la vista se ha despazado.", "scrollbarSliderBackground": "Color de fondo del control deslizante.", "scrollbarSliderHoverBackground": "Color de fondo del control deslizante al mantener el puntero.", "scrollbarSliderActiveBackground": "Color de fondo del control deslizante cuando está activo.", + "progressBarBackground": "Color de fondo para la barra de progreso que se puede mostrar para las operaciones de larga duración.", "editorBackground": "Color de fondo del editor.", "editorForeground": "Color de primer plano predeterminado del editor.", + "editorWidgetBackground": "Color de fondo del editor de widgets como buscar/reemplazar", "editorSelection": "Color de la selección del editor.", "editorInactiveSelection": "Color de la selección en un editor inactivo.", "editorSelectionHighlight": "Color de las regiones con el mismo contenido que la selección.", @@ -51,6 +67,5 @@ "hoverHighlight": "Resaltado debajo de la palabra para la que se muestra un recuadro al mantener el puntero.", "hoverBackground": "Color de fondo al mantener el puntero en el editor.", "hoverBorder": "Color del borde al mantener el puntero en el editor.", - "activeLinkForeground": "Color de los vínculos activos.", - "editorWidgetBackground": "Color de fondo del editor de widgets como buscar/reemplazar" + "activeLinkForeground": "Color de los vínculos activos." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json index 8b6ad71cd4e..c8303dca7e8 100644 --- a/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json +++ b/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "overwritingExtension": "Sobrescribiendo la extensión {0} con {1}.", + "extensionUnderDevelopment": "Cargando la extensión de desarrollo en {0}" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json index 8b6ad71cd4e..68632e8f819 100644 --- a/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json +++ b/i18n/esn/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "close": "Cerrar", + "cancel": "Cancelar", + "ok": "Aceptar" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/common/theme.i18n.json b/i18n/esn/src/vs/workbench/common/theme.i18n.json index d75793eedac..97f9736e665 100644 --- a/i18n/esn/src/vs/workbench/common/theme.i18n.json +++ b/i18n/esn/src/vs/workbench/common/theme.i18n.json @@ -10,8 +10,10 @@ "tabActiveEditorGroupActiveForeground": "Color de primer plano de la pestaña activa en un grupo activo. Las pestañas son los contenedores de los editores en el área de editores. Se pueden abrir varias pestañas en un grupo de editores. Puede haber varios grupos de editores.", "tabInactiveEditorGroupActiveForeground": "Color de primer plano de la pestaña inactiva en un grupo activo. Las pestañas son los contenedores de los editores en el área de editores. Se pueden abrir varias pestañas en un grupo de editores. Puede haber varios grupos de editores.", "editorGroupBackground": "Color de fondo de un grupo de editores. Los grupos de editores son los contenedores de los editores. El color de fondo se ve cuando se mueven arrastrando los grupos de editores.", + "tabsContainerBackground": "Color de fondo del encabezado del título del grupo de editores cuando las fichas están habilitadas. Los grupos de editores son contenedores de editores.", "editorGroupHeaderBackground": "Color de fondo del encabezado del título del grupo de editores cuando las fichas están deshabilitadas. Los grupos de editores son contenedores de editores.", "editorGroupBorder": "Color para separar varios grupos de editores entre sí. Los grupos de editores son los contenedores de los editores.", + "editorDragAndDropBackground": "Color de fondo cuando se arrastran los editores. El color debería tener transparencia para que el contenido del editor pueda brillar a su través.", "panelBackground": "Color de fondo del panel. Los paneles se muestran debajo del área de editores y contienen vistas, como Salida y Terminal integrado.", "panelBorder": "Color del borde superior del panel que lo separa del editor. Los paneles se muestran debajo del área de editores y contienen vistas, como Salida y Terminal integrado.", "panelActiveTitleForeground": "Color del título del panel activo. Los paneles se muestran debajo del área del editor y contienen vistas como Salida y Terminal integrado.", @@ -26,6 +28,7 @@ "statusBarProminentItemHoverBackground": "Color de fondo de los elementos destacados en la barra de estado cuando se mantiene el mouse sobre estos elementos. Estos elementos sobresalen para indicar importancia. La barra de estado está ubicada en la parte inferior de la ventana.", "activityBarBackground": "Color de fondo de la barra de actividad, que se muestra en el lado izquierdo o derecho y que permite cambiar entre diferentes vistas de la barra lateral.", "activityBarForeground": "Color de fondo de la barra de actividad (por ejemplo utilizado por los iconos). La barra de actividad muestra en el lado izquierdo o derecho y permite cambiar entre diferentes vistas de la barra lateral.", + "activityBarDragAndDropBackground": "Arrastre y suelte el color de las sugerencias para los elementos de la barra de actividad. El color debería tener transparencias, de forma que los elementos de la barra continúen siendo visibles a través de él. La barra de actividad se muestra en el extremo izquierdo o derecho y permite cambiar entre distintas vistas de la barra lateral.", "activityBarBadgeBackground": "Color de fondo de distintivo de notificación de actividad. La barra de actividad se muestra en el extremo izquierdo o derecho y permite cambiar entre vistas de la barra lateral.", "activityBarBadgeForeground": "Color de primer plano de distintivo de notificación de actividad. La barra de actividad se muestra en el extremo izquierdo o derecho y permite cambiar entre vistas de la barra lateral.", "sideBarBackground": "Color de fondo de la barra lateral, que es el contenedor de vistas como Explorador y Búsqueda.", diff --git a/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json index 62df1ce4df9..cbf9d0deef3 100644 --- a/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -41,6 +41,7 @@ "window.newWindowDimensions.inherit": "Abrir las nuevas ventanas con la misma dimensión que la última activa.", "window.newWindowDimensions.maximized": "Abrir las nuevas ventanas maximizadas.", "window.newWindowDimensions.fullscreen": "Abrir las nuevas ventanas en modo de pantalla completa.", + "newWindowDimensions": "Controla las dimensiones de la nueva ventana cuando ya existe alguna ventana abierta. Por defecto, una nueva ventana se abrirá en el centro de la pantalla con dimensiones pequeñas. Cuando se establece como 'heredar', la ventana tomará las dimensiones de la última ventana activa. Cuando se establece a 'maximizar', la ventana se abrirá maximizada, y a pantalla completa si fue configurada como 'pantalla completa'. Tenga en cuenta que esta configuración no afecta a la primera ventana abierta. La primera ventana siempre restaurará el tamaño y posición en la que quedó antes de ser cerrada.", "window.menuBarVisibility.default": "El menú solo está oculto en modo de pantalla completa.", "window.menuBarVisibility.visible": "El menú está siempre visible incluso en modo de pantalla completa.", "window.menuBarVisibility.toggle": "El menú está oculto pero se puede mostrar mediante la tecla Alt.", diff --git a/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index 820ecf1008f..f03e5fb4d1c 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -6,6 +6,7 @@ { "openLaunchJson": "Abrir {0}", "launchJsonNeedsConfigurtion": "Configurar o reparar 'launch.json'", + "noFolderDebugConfig": "Abra una carpeta para trabajar con la configuración avanzada de depuración.", "startDebug": "Iniciar depuración", "startWithoutDebugging": "Iniciar sin depurar", "selectAndStartDebugging": "Seleccionar e iniciar la depuración", diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json index 8b6ad71cd4e..516affc1204 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "noFolderDebugConfig": "Abra una carpeta para trabajar con la configuración avanzada de depuración." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json b/i18n/esn/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json index 787f634d287..08fdf2cfd2e 100644 --- a/i18n/esn/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "showTriggerActions": "Mostrar todos los comandos", + "showCommands.label": "Paleta de comandos...", "entryAriaLabelWithKey": "{0}, {1}, comandos", "entryAriaLabel": "{0}, comandos", "canNotRun": "El comando '{0}' no puede ejecutarse desde aquí.", diff --git a/i18n/esn/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json b/i18n/esn/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json index af465625f5d..06b841c9cab 100644 --- a/i18n/esn/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json @@ -6,5 +6,7 @@ { "searchMatches": "{0} coincidencias encontradas", "searchMatch": "{0} coincidencia encontrada", - "fileMatchAriaLabel": "{0} coincidencias en el archivo {1} de la carpeta {2}, resultados de la búsqueda" + "fileMatchAriaLabel": "{0} coincidencias en el archivo {1} de la carpeta {2}, resultados de la búsqueda", + "replacePreviewResultAria": "Reemplazar el termino {0} con {1} en la columna con posición {2} en la línea de texto {3}", + "searchResultAria": "Encontró el término {0} en la columna de posición {1} en la línea con el texto {2}." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 2193bcd8383..e39c3a6cfd2 100644 --- a/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,7 +6,6 @@ { "selectTheme.label": "Tema de color", "installColorThemes": "Instalar temas de color adicionales...", - "themes.selectTheme": "Seleccionar tema de color", "selectIconTheme.label": "Tema de icono de archivo", "installIconThemes": "Instalar temas de icono de archivo adicionles...", "noIconThemeLabel": "Ninguno", diff --git a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 560b16de17c..eebabe22162 100644 --- a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -15,22 +15,10 @@ "welcomePage.help": "Ayuda", "welcomePage.productDocumentation": "Documentación del producto", "welcomePage.introductoryVideos": "Vídeos de introducción", + "welcomePage.keybindingsReference": "Referencia de métodos abreviados de teclado", "welcomePage.gitHubRepository": "Repositorio de GitHub", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "Mostrar página principal al inicio", - "welcomePage.quickLinks": "Vínculos rápidos", - "welcomePage.interactivePlayground": "Área de juegos interactiva", - "welcomePage.interactivePlaygroundDescription": "Pruebe las características esenciales del editor en un tutorial corto", - "welcomePage.interfaceOverview": "Introducción a la interfaz", - "welcomePage.interfaceOverviewDescription": "Obtenga una superposición que resalta los componentes principales de la interfaz de usuario", - "welcomePage.colorTheme": "Tema de color", - "welcomePage.colorThemeDescription": "Modifique a su gusto la apariencia del editor y el código", - "welcomePage.keybindingsReference": "Referencia de métodos abreviados de teclado", - "welcomePage.keybindingsReferenceDescription": "Un PDF imprimible con los métodos abreviados de teclado más comunes", - "welcomePage.showCommands": "Buscar y ejecutar todos los comandos", - "welcomePage.showCommandsDescription": "Acceda rápidamente y busque comandos desde el panel de control ({0})", - "welcomePage.configureSettings": "Definir la configuración", - "welcomePage.configureSettingsDescription": "Revele el poder total de VS Code cambiando la configuración", "welcomePage.installKeymapDescription": "Instalar los métodos abreviados de teclado", "welcomePage.installKeymap": "Instale los métodos abreviados de teclado de {0}, {1} {2} y {3}", "welcomePage.vim": "Vim", @@ -39,5 +27,17 @@ "welcomePage.sublimeCurrent": "Sublime (actual)", "welcomePage.atom": "Atom", "welcomePage.atomCurrent": "Atom (actual)", - "welcomePage.others": "otros" + "welcomePage.others": "otros", + "welcomePage.colorTheme": "Tema de color", + "welcomePage.colorThemeDescription": "Modifique a su gusto la apariencia del editor y el código", + "welcomePage.configureSettings": "Definir la configuración", + "welcomePage.configureSettingsDescription": "Revele el poder total de VS Code cambiando la configuración", + "welcomePage.showCommands": "Buscar y ejecutar todos los comandos", + "welcomePage.showCommandsDescription": "Acceda rápidamente y busque comandos desde el panel de control ({0})", + "welcomePage.interfaceOverview": "Introducción a la interfaz", + "welcomePage.interfaceOverviewDescription": "Obtenga una superposición que resalta los componentes principales de la interfaz de usuario", + "welcomePage.interactivePlayground": "Área de juegos interactiva", + "welcomePage.interactivePlaygroundDescription": "Pruebe las características esenciales del editor en un tutorial corto", + "welcomePage.quickLinks": "Vínculos rápidos", + "welcomePage.keybindingsReferenceDescription": "Un PDF imprimible con los métodos abreviados de teclado más comunes" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 0a6a55d48a2..108c1b85824 100644 --- a/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,6 +4,13 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "open": "Abrir configuración", + "close": "Cerrar", "errorUnknownKey": "No se puede escribir en el archivo de configuración (clave desconocida)", - "errorInvalidTarget": "No se puede escribir en el archivo de configuración (destino no válido)." + "errorInvalidTarget": "No se puede escribir en el archivo de configuración (destino no válido).", + "errorNoWorkspaceOpened": "No se pudo guardar la configuración porque no tiene una carpeta abierta. Abra una carpeta primero y vuelva a intentarlo.", + "errorInvalidConfiguration": "No se pudo guardar la configuración. Abra el archivo **Configuración de usuario** para corregir los errores o advertencias del archivo y vuelva a intentarlo.", + "errorInvalidConfigurationWorkspace": "No se pudo guardar la configuración. Abra **Configuración de área de trabajo** para corregir los errores o advertencias del archivo y vuelva a intentarlo.", + "errorConfigurationFileDirty": "No se pudo guardar la configuración porque el archivo se ha modificado. Guarde el archivo **Configuración de usuario** y vuelva a intentarlo.", + "errorConfigurationFileDirtyWorkspace": "No se pudo guardar la configuración porque el archivo se ha modificado. Guarde el archivo **Configuración de área de trabajo** y vuelva a intentarlo." } \ No newline at end of file diff --git a/i18n/fra/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/fra/extensions/typescript/out/typescriptServiceClient.i18n.json index 3707e724af7..85899be0806 100644 --- a/i18n/fra/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/fra/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "channelName": "TypeScript", "noServerFound": "Le chemin {0} ne pointe pas vers une installation tsserver valide. Utilisation par défaut de la version TypeScript groupée.", "noBundledServerFound": "Le tsserver de VSCode a été supprimé par une autre application, par exemple un outil de détection de virus mal configuré. Réinstallez VS Code.", "versionNumber.custom": "personnalisé", diff --git a/i18n/fra/extensions/typescript/out/utils/logger.i18n.json b/i18n/fra/extensions/typescript/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/extensions/typescript/out/utils/logger.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript/package.i18n.json b/i18n/fra/extensions/typescript/package.i18n.json index 043054ffa7f..d60399d9b5b 100644 --- a/i18n/fra/extensions/typescript/package.i18n.json +++ b/i18n/fra/extensions/typescript/package.i18n.json @@ -33,7 +33,6 @@ "javascript.validate.enable": "Activez/désactivez la validation JavaScript.", "typescript.goToProjectConfig.title": "Accéder à la configuration du projet", "javascript.goToProjectConfig.title": "Accéder à la configuration du projet", - "typescript.referencesCodeLens.enabled": "Activer/désactiver CodeLens dans les références. Nécessite TypeScript >= 2.0.6.", "typescript.implementationsCodeLens.enabled": "Activer/désactiver CodeLens dans les implémentations. Nécessite TypeScript >= 2.2.0.", "typescript.selectTypeScriptVersion.title": "Sélectionner la version de TypeScript", "jsDocCompletion.enabled": "Activer/désactiver les commentaires JSDoc automatiques", diff --git a/i18n/fra/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/fra/src/vs/base/common/jsonErrorMessages.i18n.json index 8b6ad71cd4e..5c2fcbf92b8 100644 --- a/i18n/fra/src/vs/base/common/jsonErrorMessages.i18n.json +++ b/i18n/fra/src/vs/base/common/jsonErrorMessages.i18n.json @@ -3,4 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "error.invalidSymbol": "Symbole non valide", + "error.invalidNumberFormat": "Format de nombre non valide", + "error.propertyNameExpected": "Nom de propriété attendu", + "error.valueExpected": "Valeur attendue", + "error.colonExpected": "Signe des deux points attendu", + "error.commaExpected": "Virgule attendue", + "error.closeBraceExpected": "Accolade fermante attendue", + "error.closeBracketExpected": "Crochet fermant attendu", + "error.endOfFileExpected": "Fin de fichier attendue" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json index d4fb6e415de..c626b2d262b 100644 --- a/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -26,8 +26,8 @@ "dropdownBorder": "Bordure de la liste déroulante.", "listFocusBackground": "Couleur d'arrière-plan de la liste/l'arborescence pour l'élément ayant le focus quand la liste/l'arborescence est active. Une liste/aborescence active peut être sélectionnée au clavier, elle ne l'est pas quand elle est inactive.", "listActiveSelectionBackground": "Couleur d'arrière-plan de la liste/l'arborescence de l'élément sélectionné quand la liste/l'arborescence est active. Une liste/arborescence active peut être sélectionnée au clavier, elle ne l'est pas quand elle est inactive.", - "listInactiveSelectionBackground": "Couleur d'arrière-plan de la liste/l'arborescence pour l'élément sélectionné quand la liste/l'arborescence est inactive. Une liste/aborescence active peut être sélectionnée au clavier, elle ne l'est pas quand elle est inactive.", "listActiveSelectionForeground": "Couleur de premier plan de la liste/l'arborescence pour l'élément sélectionné quand la liste/l'arborescence est active. Une liste/aborescence active peut être sélectionnée au clavier, elle ne l'est pas quand elle est inactive.", + "listInactiveSelectionBackground": "Couleur d'arrière-plan de la liste/l'arborescence pour l'élément sélectionné quand la liste/l'arborescence est inactive. Une liste/aborescence active peut être sélectionnée au clavier, elle ne l'est pas quand elle est inactive.", "listHoverBackground": "Arrière-plan de la liste/l'arborescence pendant le pointage sur des éléments avec la souris.", "listDropBackground": "Arrière-plan de l'opération de glisser-déplacer dans une liste/arborescence pendant le déplacement d'éléments avec la souris.", "highlight": "Couleur de premier plan dans la liste/l'arborescence pour la surbrillance des correspondances pendant la recherche dans une liste/arborescence.", @@ -42,6 +42,7 @@ "scrollbarSliderActiveBackground": "Couleur d'arrière-plan du curseur actif.", "editorBackground": "Couleur d'arrière-plan de l'éditeur.", "editorForeground": "Couleur de premier plan par défaut de l'éditeur.", + "editorWidgetBackground": "Couleur d'arrière-plan des gadgets de l'éditeur tels que rechercher/remplacer.", "editorSelection": "Couleur de la sélection de l'éditeur.", "editorInactiveSelection": "Couleur de la sélection dans un éditeur inactif.", "editorSelectionHighlight": "Couleur des régions dont le contenu est identique à la sélection.", @@ -51,6 +52,5 @@ "hoverHighlight": "Mettez en surbrillance ci-dessous le mot pour lequel un pointage s'affiche.", "hoverBackground": "Couleur d'arrière-plan du pointage de l'éditeur.", "hoverBorder": "Couleur de bordure du pointage de l'éditeur.", - "activeLinkForeground": "Couleur des liens actifs.", - "editorWidgetBackground": "Couleur d'arrière-plan des gadgets de l'éditeur tels que rechercher/remplacer." + "activeLinkForeground": "Couleur des liens actifs." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json index 8b6ad71cd4e..7e050bb0177 100644 --- a/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json +++ b/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "overwritingExtension": "Remplacement de l'extension {0} par {1}.", + "extensionUnderDevelopment": "Chargement de l'extension de développement sur {0}" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json index 8b6ad71cd4e..560eb4d7f26 100644 --- a/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json +++ b/i18n/fra/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "close": "Fermer", + "cancel": "Annuler", + "ok": "OK" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index f816cae6ee3..515d4f6f9c5 100644 --- a/i18n/fra/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,7 +6,6 @@ { "selectTheme.label": "Thème de couleur", "installColorThemes": "Installer des thèmes de couleurs supplémentaires...", - "themes.selectTheme": "Sélectionner le thème de couleur", "selectIconTheme.label": "Thème d'icône de fichier", "installIconThemes": "Installer des thèmes d'icônes de fichiers supplémentaires...", "noIconThemeLabel": "Aucun", diff --git a/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 2c738238b0d..f533c1e348e 100644 --- a/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -15,22 +15,10 @@ "welcomePage.help": "Aide", "welcomePage.productDocumentation": "Documentation du produit", "welcomePage.introductoryVideos": "Vidéos d'introduction", + "welcomePage.keybindingsReference": "Référence des raccourcis clavier", "welcomePage.gitHubRepository": "Dépôt GitHub", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "Afficher la page d'accueil au démarrage", - "welcomePage.quickLinks": "Liens rapides", - "welcomePage.interactivePlayground": "Terrain de jeu interactif", - "welcomePage.interactivePlaygroundDescription": "Essayez les fonctionnalités essentielles de l'éditeur en suivant une brève procédure pas à pas", - "welcomePage.interfaceOverview": "Vue d'ensemble de l'interface", - "welcomePage.interfaceOverviewDescription": "Obtenez une superposition visuelle mettant en évidence les principaux composants de l'IU", - "welcomePage.colorTheme": "Thème de couleur", - "welcomePage.colorThemeDescription": "Personnalisez l'apparence de l'éditeur et de votre code", - "welcomePage.keybindingsReference": "Référence des raccourcis clavier", - "welcomePage.keybindingsReferenceDescription": "Fichier PDF imprimable avec les raccourcis clavier les plus usuels", - "welcomePage.showCommands": "Rechercher et exécuter toutes les commandes", - "welcomePage.showCommandsDescription": "Utilisez et recherchez rapidement des commandes dans le Panneau de configuration ({0})", - "welcomePage.configureSettings": "Configurer les paramètres", - "welcomePage.configureSettingsDescription": "Déverrouillez toute la puissance de VS Code en adaptant les paramètres", "welcomePage.installKeymapDescription": "Installer les raccourcis clavier", "welcomePage.installKeymap": "Installez les raccourcis clavier de {0}, {1}, {2} et {3}", "welcomePage.vim": "Vim", @@ -39,5 +27,17 @@ "welcomePage.sublimeCurrent": "Sublime (actuel)", "welcomePage.atom": "Atom", "welcomePage.atomCurrent": "Atom (actuel)", - "welcomePage.others": "autres" + "welcomePage.others": "autres", + "welcomePage.colorTheme": "Thème de couleur", + "welcomePage.colorThemeDescription": "Personnalisez l'apparence de l'éditeur et de votre code", + "welcomePage.configureSettings": "Configurer les paramètres", + "welcomePage.configureSettingsDescription": "Déverrouillez toute la puissance de VS Code en adaptant les paramètres", + "welcomePage.showCommands": "Rechercher et exécuter toutes les commandes", + "welcomePage.showCommandsDescription": "Utilisez et recherchez rapidement des commandes dans le Panneau de configuration ({0})", + "welcomePage.interfaceOverview": "Vue d'ensemble de l'interface", + "welcomePage.interfaceOverviewDescription": "Obtenez une superposition visuelle mettant en évidence les principaux composants de l'IU", + "welcomePage.interactivePlayground": "Terrain de jeu interactif", + "welcomePage.interactivePlaygroundDescription": "Essayez les fonctionnalités essentielles de l'éditeur en suivant une brève procédure pas à pas", + "welcomePage.quickLinks": "Liens rapides", + "welcomePage.keybindingsReferenceDescription": "Fichier PDF imprimable avec les raccourcis clavier les plus usuels" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index ba4ae258d25..8c86edbfa40 100644 --- a/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/fra/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,6 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "open": "Ouvrir les paramètres", + "close": "Fermer", "errorUnknownKey": "Impossible d'écrire dans le fichier de configuration (clé inconnue)", "errorInvalidTarget": "Impossible d'écrire dans le fichier config (cible non valide)" } \ No newline at end of file diff --git a/i18n/ita/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/ita/extensions/typescript/out/typescriptServiceClient.i18n.json index 97e691e49af..4261bf8e881 100644 --- a/i18n/ita/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/ita/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "channelName": "TypeScript", "noServerFound": "Il percorso {0} non punta a un'installazione valida di tsserver. Verrà eseguito il fallback alla versione in bundle di TypeScript.", "noBundledServerFound": "Il file tsserver di VSCode è stato eliminato da un'altra applicazione, ad esempio uno strumento di rilevamento virus che non funziona correttamente. Reinstallare VSCode.", "versionNumber.custom": "personalizzato", diff --git a/i18n/ita/extensions/typescript/out/utils/logger.i18n.json b/i18n/ita/extensions/typescript/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/extensions/typescript/out/utils/logger.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript/package.i18n.json b/i18n/ita/extensions/typescript/package.i18n.json index 001fdcf5484..c6928c13332 100644 --- a/i18n/ita/extensions/typescript/package.i18n.json +++ b/i18n/ita/extensions/typescript/package.i18n.json @@ -33,7 +33,6 @@ "javascript.validate.enable": "Abilita/Disabilita la convalida JavaScript.", "typescript.goToProjectConfig.title": "Passa a Configurazione progetto", "javascript.goToProjectConfig.title": "Passa a Configurazione progetto", - "typescript.referencesCodeLens.enabled": "Abilita/Disabilita le finestre CodeLens per i riferimenti. Richiede una versione di TypeScript uguale o successiva alla 2.0.6.", "typescript.implementationsCodeLens.enabled": "Abilita/Disabilita le finestre CodeLens per le implementazioni. Richiede una versione di TypeScript uguale o successiva alla 2.2.0.", "typescript.selectTypeScriptVersion.title": "Seleziona la versione di TypeScript", "jsDocCompletion.enabled": "Abilita/Disabilita commenti automatici JSDoc", diff --git a/i18n/ita/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/ita/src/vs/base/common/jsonErrorMessages.i18n.json index 8b6ad71cd4e..2ffc2a9d464 100644 --- a/i18n/ita/src/vs/base/common/jsonErrorMessages.i18n.json +++ b/i18n/ita/src/vs/base/common/jsonErrorMessages.i18n.json @@ -3,4 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "error.invalidSymbol": "Simbolo non valido", + "error.invalidNumberFormat": "Formato di numero non valido", + "error.propertyNameExpected": "È previsto un nome di proprietà", + "error.valueExpected": "È previsto un valore", + "error.colonExpected": "Sono previsti i due punti", + "error.commaExpected": "È prevista la virgola", + "error.closeBraceExpected": "È prevista la parentesi graffa di chiusura", + "error.closeBracketExpected": "È prevista la parentesi quadra di chiusura", + "error.endOfFileExpected": "È prevista la fine del file" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json index 8cde4edb29b..927b93f7b8d 100644 --- a/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -26,8 +26,8 @@ "dropdownBorder": "Bordo dell'elenco a discesa.", "listFocusBackground": "Colore sfondo Elenco/Struttura ad albero per l'elemento evidenziato quando l'Elenco/Struttura ad albero è attivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no.", "listActiveSelectionBackground": "Colore sfondo Elenco/Struttura ad albero per l'elemento selezionato quando l'Elenco/Struttura ad albero è attivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no.", - "listInactiveSelectionBackground": "Colore sfondo Elenco/Struttura ad albero per l'elemento selezionato quando l'Elenco/Struttura ad albero è inattivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no.", "listActiveSelectionForeground": "Colore primo piano Elenco/Struttura ad albero per l'elemento selezionato quando l'Elenco/Struttura ad albero è attivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no.", + "listInactiveSelectionBackground": "Colore sfondo Elenco/Struttura ad albero per l'elemento selezionato quando l'Elenco/Struttura ad albero è inattivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no.", "listHoverBackground": "Sfondo Elenco/Struttura ad albero al passaggio del mouse sugli elementi.", "listDropBackground": "Sfondo Elenco/Struttura ad albero durante il trascinamento degli elementi selezionati.", "highlight": "Colore primo piano Elenco/Struttura ad albero delle occorrenze trovate durante la ricerca nell'Elenco/Struttura ad albero.", @@ -42,6 +42,7 @@ "scrollbarSliderActiveBackground": "Colore di sfondo dello Slider quando attivo.", "editorBackground": "Colore di sfondo dell'editor.", "editorForeground": "Colore primo piano predefinito dell'editor.", + "editorWidgetBackground": "Colore di sfondo dei widget dell'editor, ad esempio Trova/Sostituisci.", "editorSelection": "Colore della selezione dell'editor.", "editorInactiveSelection": "Colore della selezione in un editor inattivo.", "editorSelectionHighlight": "Colore delle aree con lo stesso contenuto della selezione.", @@ -51,6 +52,5 @@ "hoverHighlight": "Evidenziazione sotto la parola per cui è visualizzata un'area sensibile al passaggio del mouse.", "hoverBackground": "Colore di sfondo dell'area sensibile al passaggio del mouse dell'editor.", "hoverBorder": "Colore del bordo dell'area sensibile al passaggio del mouse dell'editor.", - "activeLinkForeground": "Colore dei collegamenti attivi.", - "editorWidgetBackground": "Colore di sfondo dei widget dell'editor, ad esempio Trova/Sostituisci." + "activeLinkForeground": "Colore dei collegamenti attivi." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json index 8b6ad71cd4e..606de953f3a 100644 --- a/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json +++ b/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "overwritingExtension": "Sovrascrittura dell'estensione {0} con {1}.", + "extensionUnderDevelopment": "Caricamento dell'estensione di sviluppo in {0}" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json index 8b6ad71cd4e..e2fbc59847f 100644 --- a/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json +++ b/i18n/ita/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "close": "Chiudi", + "cancel": "Annulla", + "ok": "OK" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index ce44a7ad0a2..cf402ad3802 100644 --- a/i18n/ita/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,7 +6,6 @@ { "selectTheme.label": "Tema colori", "installColorThemes": "Installa temi colori aggiuntivi...", - "themes.selectTheme": "Seleziona tema colori", "selectIconTheme.label": "Tema icona file", "installIconThemes": "Installa temi dell'icona file aggiuntivi...", "noIconThemeLabel": "Nessuno", diff --git a/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 3a98deaa2c0..1ea541dafa1 100644 --- a/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -15,22 +15,10 @@ "welcomePage.help": "Guida", "welcomePage.productDocumentation": "Documentazione del prodotto", "welcomePage.introductoryVideos": "Video introduttivi", + "welcomePage.keybindingsReference": "Riferimento per tasti di scelta rapida", "welcomePage.gitHubRepository": "Repository GitHub", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "Mostra la pagina iniziale all'avvio", - "welcomePage.quickLinks": "Collegamenti rapidi", - "welcomePage.interactivePlayground": "Playground interattivo", - "welcomePage.interactivePlaygroundDescription": "Breve panoramica delle funzionalità essenziali dell'editor", - "welcomePage.interfaceOverview": "Panoramica dell'interfaccia", - "welcomePage.interfaceOverviewDescription": "Immagine in sovrimpressione che evidenzia i principali componenti dell'interfaccia utente", - "welcomePage.colorTheme": "Tema colori", - "welcomePage.colorThemeDescription": "Tutto quel che serve per configurare editor e codice nel modo desiderato", - "welcomePage.keybindingsReference": "Riferimento per tasti di scelta rapida", - "welcomePage.keybindingsReferenceDescription": "PDF stampabile con i tasti di scelta rapida più comuni", - "welcomePage.showCommands": "Trova ed esegui tutti i comandi", - "welcomePage.showCommandsDescription": "Accesso e ricerca rapida di comandi dal pannello di controllo ({0})", - "welcomePage.configureSettings": "Configura le impostazioni", - "welcomePage.configureSettingsDescription": "Perfeziona le impostazioni per sfruttare appieno tutta la potenza di Visual Studio Code", "welcomePage.installKeymapDescription": "Installa i tasti di scelta rapida", "welcomePage.installKeymap": "Installa i tasti di scelta rapida di {0}, {1}, {2} e {3}", "welcomePage.vim": "Vim", @@ -39,5 +27,17 @@ "welcomePage.sublimeCurrent": "Sublime (corrente)", "welcomePage.atom": "Atom", "welcomePage.atomCurrent": "Atom (corrente)", - "welcomePage.others": "altri" + "welcomePage.others": "altri", + "welcomePage.colorTheme": "Tema colori", + "welcomePage.colorThemeDescription": "Tutto quel che serve per configurare editor e codice nel modo desiderato", + "welcomePage.configureSettings": "Configura le impostazioni", + "welcomePage.configureSettingsDescription": "Perfeziona le impostazioni per sfruttare appieno tutta la potenza di Visual Studio Code", + "welcomePage.showCommands": "Trova ed esegui tutti i comandi", + "welcomePage.showCommandsDescription": "Accesso e ricerca rapida di comandi dal pannello di controllo ({0})", + "welcomePage.interfaceOverview": "Panoramica dell'interfaccia", + "welcomePage.interfaceOverviewDescription": "Immagine in sovrimpressione che evidenzia i principali componenti dell'interfaccia utente", + "welcomePage.interactivePlayground": "Playground interattivo", + "welcomePage.interactivePlaygroundDescription": "Breve panoramica delle funzionalità essenziali dell'editor", + "welcomePage.quickLinks": "Collegamenti rapidi", + "welcomePage.keybindingsReferenceDescription": "PDF stampabile con i tasti di scelta rapida più comuni" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 22b05065173..52726bd226c 100644 --- a/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/ita/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,6 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "open": "Apri impostazioni", + "close": "Chiudi", "errorUnknownKey": "Non è possibile scrivere nel file di configurazione. La chiave è sconosciuta", "errorInvalidTarget": "Non è possibile scrivere nel file di configurazione (destinazione non valida)" } \ No newline at end of file diff --git a/i18n/jpn/extensions/git/out/commands.i18n.json b/i18n/jpn/extensions/git/out/commands.i18n.json index cacb74d2a00..8ecbb563965 100644 --- a/i18n/jpn/extensions/git/out/commands.i18n.json +++ b/i18n/jpn/extensions/git/out/commands.i18n.json @@ -32,7 +32,7 @@ "pick remote": "リモートを選んで、ブランチ '{0}' を次に公開します:", "sync is unpredictable": "このアクションはコミットを '{0}' との間でプッシュしたりプルしたりします。", "ok": "OK", - "never again": "了解しました。今後は表示しない", + "never again": "OK、今後は表示しない", "no remotes to publish": "リポジトリには、発行先として構成されているリモートがありません。", "disabled": "このワークスペースでは、Git が無効になっているか、サポートされていません", "clean repo": "チェックアウトの前に、リポジトリの作業ツリーを消去してください。", diff --git a/i18n/jpn/extensions/git/out/scmProvider.i18n.json b/i18n/jpn/extensions/git/out/scmProvider.i18n.json index 7fded37328a..fe8b64ab93b 100644 --- a/i18n/jpn/extensions/git/out/scmProvider.i18n.json +++ b/i18n/jpn/extensions/git/out/scmProvider.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "commit": "Commit" + "commit": "コミット" } \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/jpn/extensions/typescript/out/typescriptServiceClient.i18n.json index fd5967f381b..cc6f0e1ea1a 100644 --- a/i18n/jpn/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/jpn/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "channelName": "TypeScript", "noServerFound": "パス {0} は、有効な tsserver インストールを指していません。バンドルされている TypeScript バージョンにフォールバックしています。", "noBundledServerFound": "適切に動作しないウイルス検出ツールなどの他のアプリケーションにより、VSCode の tsserver は削除されました。VS Code を再インストールしてください。", "versionNumber.custom": "カスタム", diff --git a/i18n/jpn/extensions/typescript/out/utils/logger.i18n.json b/i18n/jpn/extensions/typescript/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/extensions/typescript/out/utils/logger.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript/package.i18n.json b/i18n/jpn/extensions/typescript/package.i18n.json index 18396cdce3a..e30965564d0 100644 --- a/i18n/jpn/extensions/typescript/package.i18n.json +++ b/i18n/jpn/extensions/typescript/package.i18n.json @@ -33,7 +33,6 @@ "javascript.validate.enable": "JavaScript の検証を有効/無効にします。", "typescript.goToProjectConfig.title": "プロジェクト構成に移動", "javascript.goToProjectConfig.title": "プロジェクト構成に移動", - "typescript.referencesCodeLens.enabled": "CodeLens の参照を有効/無効にします。TypeScript 2.0.6 以上が必要です。", "typescript.implementationsCodeLens.enabled": "CodeLens の実装を有効/無効にします。TypeScript 2.2.0 以上が必要です。", "typescript.openTsServerLog.title": "TS サーバーのログを開く", "typescript.selectTypeScriptVersion.title": "TypeScript のバージョンの選択", diff --git a/i18n/jpn/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/jpn/src/vs/base/common/jsonErrorMessages.i18n.json index 8b6ad71cd4e..21cbaadbdbc 100644 --- a/i18n/jpn/src/vs/base/common/jsonErrorMessages.i18n.json +++ b/i18n/jpn/src/vs/base/common/jsonErrorMessages.i18n.json @@ -3,4 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "error.invalidSymbol": "シンボルが無効です", + "error.invalidNumberFormat": "数値表示形式が無効です", + "error.propertyNameExpected": "プロパティ名が必要です", + "error.valueExpected": "値が必要です", + "error.colonExpected": "コロンが必要です", + "error.commaExpected": "コンマが必要です", + "error.closeBraceExpected": "右中かっこが必要です", + "error.closeBracketExpected": "右角かっこが必要です", + "error.endOfFileExpected": "ファイルの終わりが必要です" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/code/electron-main/menus.i18n.json b/i18n/jpn/src/vs/code/electron-main/menus.i18n.json index 7ded317439b..1231ec0a275 100644 --- a/i18n/jpn/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/jpn/src/vs/code/electron-main/menus.i18n.json @@ -58,7 +58,7 @@ "miInsertCursorAbove": "カーソルを上に挿入(&&A)", "miInsertCursorBelow": "カーソルを下に挿入(&&D)", "miInsertCursorAtEndOfEachLineSelected": "カーソルを行末に挿入(&&U)", - "miAddSelectionToNextFindMatch": "次の出現個所を追加(&&N)", + "miAddSelectionToNextFindMatch": "次の出現箇所を追加(&&N)", "miAddSelectionToPreviousFindMatch": "前の出現箇所を追加(&&R)", "miSelectHighlights": "すべての出現箇所を選択(&&O)", "miCopyLinesUp": "行を上へコピー(&&C)", @@ -115,6 +115,8 @@ "miGotoSymbolInFile": "ファイル内のシンボルへ移動(&&S)...", "miGotoSymbolInWorkspace": "ワークスペース内のシンボルへ移動(&&W)...", "miGotoDefinition": "定義に移動(&&D)", + "miGotoTypeDefinition": "型定義に移動(&&T)", + "miGotoImplementation": "実装に移動(&&I)", "miGotoLine": "指定行へ移動(&&L)...", "miStartDebugging": "デバッグの開始(&&S)", "miStartWithoutDebugging": "デバッグなしで開始(&&W)", diff --git a/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json index 10aa21d3488..f364e5e0d14 100644 --- a/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -11,7 +11,10 @@ "editorWhitespaces": "エディターのスペース文字の色。", "editorIndentGuides": "エディター インデント ガイドの色。", "editorLineNumbers": "エディターの行番号の色。", + "editorRuler": "エディター ルーラーの色。", "editorCodeLensForeground": "CodeLens エディターの前景色。", "editorBracketMatchBackground": "一致するかっこの背景色", - "editorBracketMatchBorder": "一致するかっこ内のボックスの色" + "editorBracketMatchBorder": "一致するかっこ内のボックスの色", + "editorOverviewRulerBorder": "概要ルーラーの境界色。", + "editorGutter": "エディターの余白の背景色。余白にはグリフ マージンと行番号が含まれます。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json b/i18n/jpn/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json index d66571a0e23..8fedf2e46b0 100644 --- a/i18n/jpn/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json @@ -21,6 +21,7 @@ "peekViewResultsSelectionBackground": "ピーク ビュー結果リストの選択済みエントリの背景色。", "peekViewResultsSelectionForeground": "ピーク ビュー結果リストの選択済みエントリの前景色。", "peekViewEditorBackground": "ピーク ビュー エディターの背景色。", + "peekViewEditorGutterBackground": "ピーク ビュー エディターの余白の背景色。", "peekViewResultsMatchHighlight": "ピーク ビュー結果リストの一致した強調表示色。", "peekViewEditorMatchHighlight": "ピーク ビュー エディターの一致した強調表示色。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json index 40f629313c2..750764aa27a 100644 --- a/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -37,8 +37,8 @@ "dropdownBorder": "ドロップダウンの境界線。", "listFocusBackground": "ツリーリストがアクティブのとき、フォーカスされた項目のツリーリスト背景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", "listActiveSelectionBackground": "ツリーリストがアクティブのとき、選択された項目のツリーリスト背景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", - "listInactiveSelectionBackground": "ツリーリストが非アクティブのとき、フォーカスされた項目のツリーリスト背景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", "listActiveSelectionForeground": "ツリーリストがアクティブのとき、選択された項目のツリーリスト前景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", + "listInactiveSelectionBackground": "ツリーリストが非アクティブのとき、フォーカスされた項目のツリーリスト背景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", "listInactiveSelectionForeground": "ツリーリストが非アクティブのとき、選択された項目のツリーリスト前景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", "listHoverBackground": "マウス操作で項目をホバーするときのツリーリスト背景。", "listDropBackground": "マウス操作で項目を移動するときのツリーリスト ドラッグ アンド ドロップの背景。", @@ -54,8 +54,10 @@ "scrollbarSliderBackground": "スライダーの背景色。", "scrollbarSliderHoverBackground": "ホバー時のスライダー背景色。", "scrollbarSliderActiveBackground": "アクティブ時のスライダー背景色。", + "progressBarBackground": "時間のかかる操作で表示するプログレス バーの背景色。", "editorBackground": "エディターの背景色。", "editorForeground": "エディターの既定の前景色。", + "editorWidgetBackground": "検索/置換窓など、エディター ウィジェットの背景色。", "editorSelection": "エディターの選択範囲の色。", "editorInactiveSelection": "非アクティブなエディターの選択範囲の色。", "editorSelectionHighlight": "選択範囲と同じコンテンツの領域の色。", @@ -65,6 +67,5 @@ "hoverHighlight": "ホバーが表示されているワードの下を強調表示します。", "hoverBackground": "エディター ホバーの背景色。", "hoverBorder": "エディター ホバーの境界線の色。", - "activeLinkForeground": "アクティブなリンクの色。", - "editorWidgetBackground": "検索/置換窓など、エディター ウィジェットの背景色。" + "activeLinkForeground": "アクティブなリンクの色。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json index 8b6ad71cd4e..df697c332c2 100644 --- a/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json +++ b/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "overwritingExtension": "拡張機能 {0} を {1} で上書きしています。", + "extensionUnderDevelopment": "開発の拡張機能を {0} に読み込んでいます" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json index 8b6ad71cd4e..c3df3145deb 100644 --- a/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json +++ b/i18n/jpn/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "close": "閉じる", + "cancel": "キャンセル", + "ok": "OK" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/common/theme.i18n.json b/i18n/jpn/src/vs/workbench/common/theme.i18n.json index 5b74eef0a2f..b361c556bdc 100644 --- a/i18n/jpn/src/vs/workbench/common/theme.i18n.json +++ b/i18n/jpn/src/vs/workbench/common/theme.i18n.json @@ -10,8 +10,10 @@ "tabActiveEditorGroupActiveForeground": "アクティブ グループ内のアクティブ タブの前景色。タブはエディター領域におけるエディターのコンテナーです。1 つのエディター グループで複数のタブを開くことができます。エディター グループを複数にすることもできます。", "tabInactiveEditorGroupActiveForeground": "アクティブ グループ内の非アクティブ タブの前景色。タブはエディター領域におけるエディターのコンテナーです。1 つのエディター グループで複数のタブを開くことができます。エディター グループを複数にすることもできます。", "editorGroupBackground": "エディター グループの背景色。エディター グループはエディターのコンテナーです。背景色はエディター グループをドラッグすると表示されます。", + "tabsContainerBackground": "タブが有効な場合の エディター グループ タイトル ヘッダーの背景色。エディター グループはエディターのコンテナーです。", "editorGroupHeaderBackground": "タブが無効な場合の エディター グループ タイトル ヘッダーの背景色。エディター グループはエディターのコンテナーです。", "editorGroupBorder": "複数のエディター グループを互いに分離するための色。エディター グループはエディターのコンテナーです。", + "editorDragAndDropBackground": "エディターの周囲をドラッグしているときの背景色。エディターのコンテンツが最後まで輝くために、色は透過である必要があります。", "panelBackground": "パネルの背景色。パネルはエディター領域の下に表示され、出力や統合ターミナルなどのビューを含みます。", "panelBorder": "エディターとの区切りを示すパネル上部の罫線の色。パネルはエディター領域の下に表示され、出力や統合ターミナルなどのビューを含みます。", "panelActiveTitleForeground": "アクティブ パネルのタイトルの色。パネルはエディター領域の下に表示され、出力や統合ターミナルなどのビューを含みます。", @@ -26,6 +28,7 @@ "statusBarProminentItemHoverBackground": "ホバーしたときのステータス バーの重要な項目の背景色。重要な項目は、重要性を示すために他のステータスバーの項目から際立っています。 ステータス バーはウィンドウの下部に表示されます。", "activityBarBackground": "アクティビティ バーの背景色。アクティビティ バーは左端または右端に表示され、サイド バーのビューを切り替えることができます。", "activityBarForeground": "アクティビティ バーの前景色 (例: アイコンの色)。アクティビティ バーは左端または右端に表示され、サイド バーのビューを切り替えることができます。", + "activityBarDragAndDropBackground": "アクティビティ バーの項目のドラッグ アンド ドロップ フィードバックの色。アクティビティ バーが最後まで輝くために、色は透過である必要があります。アクティビティ バーは左端または右端に表示され、サイド バーの表示を切り替えることができます。", "activityBarBadgeBackground": "アクティビティ通知バッジの背景色。アクティビティ バーは左端または右端に表示され、サイド バーの表示を切り替えることができます。", "activityBarBadgeForeground": "アクティビティ通知バッジの前景色。アクティビティ バーは左端または右端に表示され、サイド バーの表示を切り替えることができます。", "sideBarBackground": "サイド バーの背景色。サイド バーは、エクスプローラーや検索などのビューが入るコンテナーです。", diff --git a/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json index 3ced82ae8cb..e69cb0fb627 100644 --- a/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -41,6 +41,7 @@ "window.newWindowDimensions.inherit": "新しいウィンドウを、最後にアクティブだったウィンドウと同じサイズで開きます。", "window.newWindowDimensions.maximized": "新しいウィンドウを最大化した状態で開きます。", "window.newWindowDimensions.fullscreen": "新しいウィンドウを全画面表示モードで開きます。", + "newWindowDimensions": "既に 1 つ以上のウィンドウを開いているとき、新しく開くウィンドウのサイズを制御します。既定では、新しいウィンドウを画面中央に小さいサイズで開きます。'inherit' に設定すると、最後のアクティブ ウィンドウと同じサイズで開きます。'maximized' に設定するとウィンドウは最大サイズで開き、'fullscreen' に設定すると全画面になります。この設定は、最初に開いたウィンドウに適用されないことに注意してください。最初のウィンドウは常に、前回閉じたサイズと位置で復元します。", "window.menuBarVisibility.default": "メニューは全画面表示モードの場合にのみ非表示です。", "window.menuBarVisibility.visible": "全画面表示モードの場合も含めて、常にメニューが表示されます。", "window.menuBarVisibility.toggle": "メニューは非表示ですが、Alt キーを押すと表示できます。", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json index e41cc2280f6..7e7505788b6 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -6,6 +6,7 @@ { "openLaunchJson": "{0} を開く", "launchJsonNeedsConfigurtion": "'launch.json' を構成または修正してください", + "noFolderDebugConfig": "高度なデバッグ構成を行うには、最初にフォルダーを開いてください。", "startDebug": "デバッグの開始", "startWithoutDebugging": "デバッグなしで開始", "selectAndStartDebugging": "選択してデバッグを開始", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json index 8b6ad71cd4e..3601388ef3a 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "noFolderDebugConfig": "高度なデバッグ構成を行うには、最初にフォルダーを開いてください。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json b/i18n/jpn/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json index 6caf000135d..d6cc11eda2e 100644 --- a/i18n/jpn/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "showTriggerActions": "すべてのコマンドの表示", + "showCommands.label": "コマンド パレット...", "entryAriaLabelWithKey": "{0}、{1}、コマンド", "entryAriaLabel": "{0}、コマンド", "canNotRun": "コマンド '{0}' はここからは実行できません。", diff --git a/i18n/jpn/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json b/i18n/jpn/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json index 241116f3364..ae61bd9d4c9 100644 --- a/i18n/jpn/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json @@ -6,5 +6,7 @@ { "searchMatches": "一致する項目が {0} 件見つかりました", "searchMatch": "一致する項目が {0} 件見つかりました", - "fileMatchAriaLabel": "フォルダー {2} のファイル {1} 内で {0} 件の一致、検索結果" + "fileMatchAriaLabel": "フォルダー {2} のファイル {1} 内で {0} 件の一致、検索結果", + "replacePreviewResultAria": "テキスト {3} の {2} 列目の {0} を {1} に置換します", + "searchResultAria": "テキスト {2} の {1} 列目に {0} が見つかりました" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json index 52ca786c8e4..eb8ef6b8069 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}, tasks", + "entryAriaLabel": "{0}、タスク", "tasksAriaLabel": "再開するタスクの名前を入力します", "noTasksMatching": "No tasks matching", "noTasksFound": "再開するタスクはありません" diff --git a/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 9ede3f8b975..89ac9d8c928 100644 --- a/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -5,8 +5,7 @@ // Do not edit this file. It is machine generated. { "selectTheme.label": "配色テーマ", - "installColorThemes": "その他の色のテーマをインストール...", - "themes.selectTheme": "配色テーマの選択", + "installColorThemes": "その他の配色テーマをインストール...", "selectIconTheme.label": "ファイル アイコンのテーマ", "installIconThemes": "その他のファイル アイコンのテーマをインストール...", "noIconThemeLabel": "なし", diff --git a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index d4254f6ae36..997a9ed0f2c 100644 --- a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -15,22 +15,10 @@ "welcomePage.help": "ヘルプ", "welcomePage.productDocumentation": "製品ドキュメント", "welcomePage.introductoryVideos": "紹介ビデオ", + "welcomePage.keybindingsReference": "キーボード ショートカットの参照資料", "welcomePage.gitHubRepository": "GitHub リポジトリ", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "起動時にウェルカム ページを表示", - "welcomePage.quickLinks": "クイック リンク", - "welcomePage.interactivePlayground": "対話型プレイグラウンド", - "welcomePage.interactivePlaygroundDescription": "エディターの基本機能を簡潔なチュートリアルで体験します", - "welcomePage.interfaceOverview": "インターフェイスの概要", - "welcomePage.interfaceOverviewDescription": "UI の主要コンポーネントを解説した視覚オーバーレイを表示します", - "welcomePage.colorTheme": "配色テーマ", - "welcomePage.colorThemeDescription": "エディターとコードの外観を自由に設定します", - "welcomePage.keybindingsReference": "キーボード ショートカットの参照資料", - "welcomePage.keybindingsReferenceDescription": "最も一般的なキーボード ショートカットを掲載した印刷可能な PDF です", - "welcomePage.showCommands": "すべてのコマンドの検索と実行", - "welcomePage.showCommandsDescription": "コントロール パネルからコマンドを検索してすばやくアクセスします ({0})", - "welcomePage.configureSettings": "設定を構成する", - "welcomePage.configureSettingsDescription": "VS Code の全機能を活用するために設定を微調整します", "welcomePage.installKeymapDescription": "キーボード ショートカットをインストールします", "welcomePage.installKeymap": "{0}、{1}、{2}、{3} のキーボード ショートカットをインストール", "welcomePage.vim": "Vim", @@ -39,5 +27,17 @@ "welcomePage.sublimeCurrent": "Sublime (最新)", "welcomePage.atom": "Atom", "welcomePage.atomCurrent": "Atom (最新)", - "welcomePage.others": "その他" + "welcomePage.others": "その他", + "welcomePage.colorTheme": "配色テーマ", + "welcomePage.colorThemeDescription": "エディターとコードの外観を自由に設定します", + "welcomePage.configureSettings": "設定を構成する", + "welcomePage.configureSettingsDescription": "VS Code の全機能を活用するために設定を微調整します", + "welcomePage.showCommands": "すべてのコマンドの検索と実行", + "welcomePage.showCommandsDescription": "コントロール パネルからコマンドを検索してすばやくアクセスします ({0})", + "welcomePage.interfaceOverview": "インターフェイスの概要", + "welcomePage.interfaceOverviewDescription": "UI の主要コンポーネントを解説した視覚オーバーレイを表示します", + "welcomePage.interactivePlayground": "対話型プレイグラウンド", + "welcomePage.interactivePlaygroundDescription": "エディターの基本機能を簡潔なチュートリアルで体験します", + "welcomePage.quickLinks": "クイック リンク", + "welcomePage.keybindingsReferenceDescription": "最も一般的なキーボード ショートカットを掲載した印刷可能な PDF です" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 817519ffbe5..0c7056bc9fc 100644 --- a/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,6 +4,13 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "open": "設定を開く", + "close": "閉じる", "errorUnknownKey": "構成ファイルに書き込めません (不明なキー)", - "errorInvalidTarget": "構成ファイルに書き込めません (無効なターゲット)" + "errorInvalidTarget": "構成ファイルに書き込めません (無効なターゲット)", + "errorNoWorkspaceOpened": "開いているフォルダーがないため、設定を書き込めません。最初にフォルダーを開いてから、もう一度お試しください。", + "errorInvalidConfiguration": "設定を書き込めません。**User Settings** を開いて、ファイル内のエラー/警告を修正してからもう一度お試しください。", + "errorInvalidConfigurationWorkspace": "設定を書き込めません。**Workspace Settings** を開いて、ファイル内のエラー/警告を修正してからもう一度お試しください。", + "errorConfigurationFileDirty": "ファイルが変更されているため、設定を書き込めません。**User Settings** ファイルを保存してから、もう一度お試しください。", + "errorConfigurationFileDirtyWorkspace": "ファイルが変更されているため、設定を書き込めません。**Workspace Settings** ファイルを保存してから、もう一度お試しください。" } \ No newline at end of file diff --git a/i18n/kor/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/kor/extensions/typescript/out/typescriptServiceClient.i18n.json index 5ce4069a9b5..50cd48bc2e2 100644 --- a/i18n/kor/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/kor/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "channelName": "TypeScript", "noServerFound": "경로 {0}이(가) 올바른 tsserver 설치를 가리키지 않습니다. 포함된 TypeScript 버전을 대신 사용합니다.", "noBundledServerFound": "잘못 동작하는 바이러스 감지 도구와 같은 다른 응용 프로그램에서 VSCode의 tsserver가 삭제되었습니다. VS Code를 다시 설치하세요.", "versionNumber.custom": "사용자 지정", diff --git a/i18n/kor/extensions/typescript/out/utils/logger.i18n.json b/i18n/kor/extensions/typescript/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/extensions/typescript/out/utils/logger.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript/package.i18n.json b/i18n/kor/extensions/typescript/package.i18n.json index a2f98f7c04b..4e1ce76b213 100644 --- a/i18n/kor/extensions/typescript/package.i18n.json +++ b/i18n/kor/extensions/typescript/package.i18n.json @@ -33,7 +33,6 @@ "javascript.validate.enable": "JavaScript 유효성 검사를 사용하거나 사용하지 않습니다.", "typescript.goToProjectConfig.title": "프로젝트 구성으로 이동", "javascript.goToProjectConfig.title": "프로젝트 구성으로 이동", - "typescript.referencesCodeLens.enabled": "참조 CodeLens 사용하거나 사용하지 않도록 설정합니다. TypeScript >= 2.0.6이 필요합니다.", "typescript.implementationsCodeLens.enabled": "구현 CodeLens를 사용하거나 사용하지 않도록 설정합니다. TypeScript >= 2.2.0이 필요합니다.", "typescript.selectTypeScriptVersion.title": "TypeScript 버전 선택", "jsDocCompletion.enabled": "자동 JSDoc 주석 사용/사용 안 함", diff --git a/i18n/kor/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/kor/src/vs/base/common/jsonErrorMessages.i18n.json index 8b6ad71cd4e..ac05a5533ca 100644 --- a/i18n/kor/src/vs/base/common/jsonErrorMessages.i18n.json +++ b/i18n/kor/src/vs/base/common/jsonErrorMessages.i18n.json @@ -3,4 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "error.invalidSymbol": "잘못된 기호", + "error.invalidNumberFormat": "잘못된 숫자 형식", + "error.propertyNameExpected": "속성 이름 필요", + "error.valueExpected": "값 필요", + "error.colonExpected": "콜론이 필요합니다.", + "error.commaExpected": "쉼표가 필요합니다.", + "error.closeBraceExpected": "닫는 괄호 필요", + "error.closeBracketExpected": "닫는 대괄호 필요", + "error.endOfFileExpected": "파일 끝 필요" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json index 2a49f2851c0..d5555899eba 100644 --- a/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -26,8 +26,8 @@ "dropdownBorder": "드롭다운 테두리입니다.", "listFocusBackground": "목록/트리가 활성 상태인 경우 포커스가 있는 항목의 목록/트리 배경색입니다. 목록/트리가 활성 상태이면 키보드 포커스를 가지며, 비활성 상태이면 포커스가 없습니다.", "listActiveSelectionBackground": "목록/트리가 활성 상태인 경우 선택한 항목의 목록/트리 배경색입니다. 목록/트리가 활성 상태이면 키보드 포커스를 가지며, 비활성 상태이면 포커스가 없습니다.", - "listInactiveSelectionBackground": "목록/트리가 비활성 상태인 경우 선택한 항목의 목록/트리 배경색입니다. 목록/트리가 활성 상태이면 키보드 포커스를 가지며, 비활성 상태이면 포커스가 없습니다.", "listActiveSelectionForeground": "목록/트리가 활성 상태인 경우 선택한 항목의 목록/트리 전경색입니다. 목록/트리가 활성 상태이면 키보드 포커스를 가지며, 비활성 상태이면 포커스가 없습니다.", + "listInactiveSelectionBackground": "목록/트리가 비활성 상태인 경우 선택한 항목의 목록/트리 배경색입니다. 목록/트리가 활성 상태이면 키보드 포커스를 가지며, 비활성 상태이면 포커스가 없습니다.", "listHoverBackground": "마우스로 항목을 가리킬 때 목록/트리 배경입니다.", "listDropBackground": "마우스로 항목을 이동할 때 목록/트리 끌어서 놓기 배경입니다.", "highlight": "목록/트리 내에서 검색할 때 일치 항목 강조 표시의 목록/트리 전경색입니다.", @@ -42,6 +42,7 @@ "scrollbarSliderActiveBackground": "활성 상태인 경우 슬라이더 배경색입니다.", "editorBackground": "편집기 배경색입니다.", "editorForeground": "편집기 기본 전경색입니다.", + "editorWidgetBackground": "찾기/바꾸기 같은 편집기 위젯의 배경색입니다.", "editorSelection": "편집기 선택 영역의 색입니다.", "editorInactiveSelection": "비활성 편집기 선택 영역의 색입니다.", "editorSelectionHighlight": "선택 영역과 동일한 콘텐츠가 있는 영역의 색입니다.", @@ -51,6 +52,5 @@ "hoverHighlight": "호버가 표시된 단어 아래를 강조 표시합니다.", "hoverBackground": "편집기 호버의 배경색.", "hoverBorder": "편집기 호버의 테두리 색입니다.", - "activeLinkForeground": "활성 링크의 색입니다.", - "editorWidgetBackground": "찾기/바꾸기 같은 편집기 위젯의 배경색입니다." + "activeLinkForeground": "활성 링크의 색입니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json index 8b6ad71cd4e..a0a766dacfd 100644 --- a/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json +++ b/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "overwritingExtension": "확장 {0}을(를) {1}(으)로 덮어쓰는 중입니다.", + "extensionUnderDevelopment": "{0}에서 개발 확장 로드 중" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json index 8b6ad71cd4e..68f2beaa1e0 100644 --- a/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json +++ b/i18n/kor/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "close": "닫기", + "cancel": "취소", + "ok": "확인" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 96dd1b9aebb..25cf1e96203 100644 --- a/i18n/kor/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,7 +6,6 @@ { "selectTheme.label": "색 테마", "installColorThemes": "추가 색 테마 설치...", - "themes.selectTheme": "색 테마 선택", "selectIconTheme.label": "파일 아이콘 테마", "installIconThemes": "추가 파일 아이콘 테마 설치...", "noIconThemeLabel": "없음", diff --git a/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index c7b22dc29a4..8cb064b9a49 100644 --- a/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -15,22 +15,10 @@ "welcomePage.help": "도움말", "welcomePage.productDocumentation": "제품 설명서", "welcomePage.introductoryVideos": "소개 비디오", + "welcomePage.keybindingsReference": "바로 가기 키 참조", "welcomePage.gitHubRepository": "GitHub 리포지토리", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "시작 시 시작 페이지 표시", - "welcomePage.quickLinks": "빠른 링크", - "welcomePage.interactivePlayground": "대화형 실습", - "welcomePage.interactivePlaygroundDescription": "짧은 연습에서 기본 편집기 기능 사용해 보기", - "welcomePage.interfaceOverview": "인터페이스 개요", - "welcomePage.interfaceOverviewDescription": "UI의 주요 구성 요소를 강조 표시하는 시각적 오버레이 가져오기", - "welcomePage.colorTheme": "색 테마", - "welcomePage.colorThemeDescription": "편집기 및 코드가 좋아하는 방식으로 표시되게 만들기", - "welcomePage.keybindingsReference": "바로 가기 키 참조", - "welcomePage.keybindingsReferenceDescription": "가장 일반적인 바로 가기 키가 포함된 인쇄 가능한 PDF", - "welcomePage.showCommands": "모든 명령 찾기 및 실행", - "welcomePage.showCommandsDescription": "제어판에서 명령을 빠르게 검색 및 액세스({0})", - "welcomePage.configureSettings": "설정 구성", - "welcomePage.configureSettingsDescription": "설정을 조정하여 VS Code 의 전체 기능 잠금 해제", "welcomePage.installKeymapDescription": "바로 가기 키 설치", "welcomePage.installKeymap": "{0}, {1}, {2} 및 {3}의 바로 가기 키 설치", "welcomePage.vim": "Vim", @@ -39,5 +27,17 @@ "welcomePage.sublimeCurrent": "Sublime(현재)", "welcomePage.atom": "Atom", "welcomePage.atomCurrent": "Atom(현재)", - "welcomePage.others": "기타" + "welcomePage.others": "기타", + "welcomePage.colorTheme": "색 테마", + "welcomePage.colorThemeDescription": "편집기 및 코드가 좋아하는 방식으로 표시되게 만들기", + "welcomePage.configureSettings": "설정 구성", + "welcomePage.configureSettingsDescription": "설정을 조정하여 VS Code 의 전체 기능 잠금 해제", + "welcomePage.showCommands": "모든 명령 찾기 및 실행", + "welcomePage.showCommandsDescription": "제어판에서 명령을 빠르게 검색 및 액세스({0})", + "welcomePage.interfaceOverview": "인터페이스 개요", + "welcomePage.interfaceOverviewDescription": "UI의 주요 구성 요소를 강조 표시하는 시각적 오버레이 가져오기", + "welcomePage.interactivePlayground": "대화형 실습", + "welcomePage.interactivePlaygroundDescription": "짧은 연습에서 기본 편집기 기능 사용해 보기", + "welcomePage.quickLinks": "빠른 링크", + "welcomePage.keybindingsReferenceDescription": "가장 일반적인 바로 가기 키가 포함된 인쇄 가능한 PDF" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/kor/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 58630d59484..131b473a69b 100644 --- a/i18n/kor/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/kor/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,6 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "open": "설정 열기", + "close": "닫기", "errorUnknownKey": "구성 파일에 쓸 수 없습니다(알 수 없는 키).", "errorInvalidTarget": "구성 파일에 쓸 수 없습니다(잘못된 대상)." } \ No newline at end of file diff --git a/i18n/rus/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/rus/extensions/typescript/out/typescriptServiceClient.i18n.json index aefaafd9373..bda2060f087 100644 --- a/i18n/rus/extensions/typescript/out/typescriptServiceClient.i18n.json +++ b/i18n/rus/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "channelName": "TypeScript", "noServerFound": "Путь {0} не указывает на допустимый файл программы установки tsserver. Выполняется откат до пакетной версии TypeScript.", "noBundledServerFound": "Файл tsserver VSCode был удален другим приложением, например, в результате ошибочного срабатывания средства обнаружения вирусов. Переустановите VSCode.", "versionNumber.custom": "пользовательский", diff --git a/i18n/rus/extensions/typescript/out/utils/logger.i18n.json b/i18n/rus/extensions/typescript/out/utils/logger.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/extensions/typescript/out/utils/logger.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript/package.i18n.json b/i18n/rus/extensions/typescript/package.i18n.json index c7a879594d3..eefc82f18b2 100644 --- a/i18n/rus/extensions/typescript/package.i18n.json +++ b/i18n/rus/extensions/typescript/package.i18n.json @@ -33,7 +33,6 @@ "javascript.validate.enable": "Включение или отключение проверки JavaScript.", "typescript.goToProjectConfig.title": "Перейти к конфигурации проекта", "javascript.goToProjectConfig.title": "Перейти к конфигурации проекта", - "typescript.referencesCodeLens.enabled": "Включить или отключить CodeLens для ссылок. Требуется TypeScript >= 2.0.6.", "typescript.implementationsCodeLens.enabled": "Включить или отключить CodeLens для реализаций. Требуется TypeScript >= 2.2.0.", "typescript.selectTypeScriptVersion.title": "Выберите версию TypeScript.", "jsDocCompletion.enabled": "Включить или отключить JSDoc коментарии", diff --git a/i18n/rus/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/rus/src/vs/base/common/jsonErrorMessages.i18n.json index 8b6ad71cd4e..ec94fb83023 100644 --- a/i18n/rus/src/vs/base/common/jsonErrorMessages.i18n.json +++ b/i18n/rus/src/vs/base/common/jsonErrorMessages.i18n.json @@ -3,4 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "error.invalidSymbol": "Недопустимый символ", + "error.invalidNumberFormat": "Недопустимый числовой формат", + "error.propertyNameExpected": "Требуется имя свойства", + "error.valueExpected": "Требуется значение", + "error.colonExpected": "Требуется двоеточие", + "error.commaExpected": "Требуется запятая", + "error.closeBraceExpected": "Требуется закрывающая фигурная скобка", + "error.closeBracketExpected": "Требуется закрывающая квадратная скобка", + "error.endOfFileExpected": "Ожидается конец файла" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json index 9b7785d5ac6..9ce2d835836 100644 --- a/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -28,8 +28,8 @@ "dropdownBorder": "Граница раскрывающегося списка.", "listFocusBackground": "Фоновый цвет находящегося в фокусе элемента List/Tree, когда элемент List/Tree активен. На активном элементе List/Tree есть фокус клавиатуры, на неактивном — нет.", "listActiveSelectionBackground": "Фоновый цвет выбранного элемента List/Tree, когда элемент List/Tree активен. На активном элементе List/Tree есть фокус клавиатуры, на неактивном — нет.", - "listInactiveSelectionBackground": "Фоновый цвет выбранного элемента List/Tree, когда элемент List/Tree неактивен. На активном элементе List/Tree есть фокус клавиатуры, на неактивном — нет.", "listActiveSelectionForeground": "Цвет переднего плана выбранного элемента List/Tree, когда элемент List/Tree активен. На активном элементе List/Tree есть фокус клавиатуры, на неактивном — нет.", + "listInactiveSelectionBackground": "Фоновый цвет выбранного элемента List/Tree, когда элемент List/Tree неактивен. На активном элементе List/Tree есть фокус клавиатуры, на неактивном — нет.", "listHoverBackground": "Фоновый цвет элементов List/Tree при наведении курсора мыши.", "listDropBackground": "Фоновый цвет элементов List/Tree при перемещении с помощью мыши.", "highlight": "Цвет переднего плана для выделения соответствия при поиске по элементу List/Tree.", @@ -44,6 +44,7 @@ "scrollbarSliderActiveBackground": "Цвет фона активного ползунка.", "editorBackground": "Цвет фона редактора.", "editorForeground": "Цвет переднего плана редактора по умолчанию.", + "editorWidgetBackground": "Цвет фона виджетов редактора, таких как найти/заменить.", "editorSelection": "Цвет выделения редактора.", "editorInactiveSelection": "Цвет выделения в неактивном редакторе.", "editorSelectionHighlight": "Цвет регионов с тем же содержимым, что и в выделении.", @@ -53,6 +54,5 @@ "hoverHighlight": "Выделение под словом, для которого показано наведение.", "hoverBackground": "Цвет фона при наведении указателя на редактор.", "hoverBorder": "Цвет границ при наведении указателя на редактор.", - "activeLinkForeground": "Цвет активных ссылок.", - "editorWidgetBackground": "Цвет фона виджетов редактора, таких как найти/заменить." + "activeLinkForeground": "Цвет активных ссылок." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json index 8b6ad71cd4e..b44407fa3f2 100644 --- a/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json +++ b/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "overwritingExtension": "Идет перезапись расширения {0} на {1}.", + "extensionUnderDevelopment": "Идет загрузка расширения разработки в {0}." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json index 8b6ad71cd4e..f2dc9ba9a20 100644 --- a/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json +++ b/i18n/rus/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "close": "Закрыть", + "cancel": "Отмена", + "ok": "ОК" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 21f6cd4a2cb..60eb5ce7cf9 100644 --- a/i18n/rus/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,7 +6,6 @@ { "selectTheme.label": "Цветовая тема", "installColorThemes": "Установить дополнительные цветовые темы...", - "themes.selectTheme": "Выберите цветовую тему", "selectIconTheme.label": "Тема значков файлов", "installIconThemes": "Установить дополнительные темы значков файлов...", "noIconThemeLabel": "Нет", diff --git a/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 4457de0a2d6..19a58cb1728 100644 --- a/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -15,22 +15,10 @@ "welcomePage.help": "Справка", "welcomePage.productDocumentation": "Документация по продукту", "welcomePage.introductoryVideos": "Вступительные видео", + "welcomePage.keybindingsReference": "Справочник по сочетаниям клавиш", "welcomePage.gitHubRepository": "Репозиторий GitHub", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "Отображать страницу приветствия при запуске", - "welcomePage.quickLinks": "Быстрые ссылки", - "welcomePage.interactivePlayground": "Интерактивная площадка", - "welcomePage.interactivePlaygroundDescription": "Опробуйте основные функции редактора в ходе краткого пошагового руководства.", - "welcomePage.interfaceOverview": "Общие сведения об интерфейсе", - "welcomePage.interfaceOverviewDescription": "Используйте визуальное наложение с выделением основных компонентов пользовательского интерфейса.", - "welcomePage.colorTheme": "Цветовая тема", - "welcomePage.colorThemeDescription": "Настройте редактор и код удобным образом.", - "welcomePage.keybindingsReference": "Справочник по сочетаниям клавиш", - "welcomePage.keybindingsReferenceDescription": "Подготовленный к печати PDF-файл с самыми частыми сочетаниями клавиш", - "welcomePage.showCommands": "Найти и выполнить все команды.", - "welcomePage.showCommandsDescription": "Быстрый доступ и поиск команд на панели управления ({0})", - "welcomePage.configureSettings": "Настройка параметров", - "welcomePage.configureSettingsDescription": "Используйте все возможности VS Code, подобрав нужные параметры.", "welcomePage.installKeymapDescription": "Установка сочетаний клавиш", "welcomePage.installKeymap": "Установите сочетания клавиш {0}, {1}, {2} и {3}.", "welcomePage.vim": "Vim", @@ -39,5 +27,17 @@ "welcomePage.sublimeCurrent": "Sublime (текущий)", "welcomePage.atom": "Atom", "welcomePage.atomCurrent": "Atom (текущий)", - "welcomePage.others": "Другие" + "welcomePage.others": "Другие", + "welcomePage.colorTheme": "Цветовая тема", + "welcomePage.colorThemeDescription": "Настройте редактор и код удобным образом.", + "welcomePage.configureSettings": "Настройка параметров", + "welcomePage.configureSettingsDescription": "Используйте все возможности VS Code, подобрав нужные параметры.", + "welcomePage.showCommands": "Найти и выполнить все команды.", + "welcomePage.showCommandsDescription": "Быстрый доступ и поиск команд на панели управления ({0})", + "welcomePage.interfaceOverview": "Общие сведения об интерфейсе", + "welcomePage.interfaceOverviewDescription": "Используйте визуальное наложение с выделением основных компонентов пользовательского интерфейса.", + "welcomePage.interactivePlayground": "Интерактивная площадка", + "welcomePage.interactivePlaygroundDescription": "Опробуйте основные функции редактора в ходе краткого пошагового руководства.", + "welcomePage.quickLinks": "Быстрые ссылки", + "welcomePage.keybindingsReferenceDescription": "Подготовленный к печати PDF-файл с самыми частыми сочетаниями клавиш" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/rus/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 0e4643e39d8..e87cb2bac28 100644 --- a/i18n/rus/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/rus/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -4,6 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "open": "Открыть параметры", + "close": "Закрыть", "errorUnknownKey": "Не удается выполнить запись в файл конфигурации (неизвестный ключ)", "errorInvalidTarget": "Не удается выполнить запись в файл конфигурации (недопустимый целевой объект)." } \ No newline at end of file From 26bf10d9a4f9b98bc853cdfdb77f65388525e68b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 18 May 2017 07:26:55 +0200 Subject: [PATCH 0553/1164] Theme: inconsistency for text field inside extensions sidebar (fixes #26798) --- src/vs/base/browser/ui/progressbar/progressbar.css | 8 -------- .../referenceSearch/browser/referencesWidget.css | 10 ---------- .../referenceSearch/browser/referencesWidget.ts | 10 +++++++--- .../editor/contrib/rename/browser/renameInputField.ts | 4 ++-- .../extensions/electron-browser/extensionsViewlet.ts | 11 +++++------ 5 files changed, 14 insertions(+), 29 deletions(-) diff --git a/src/vs/base/browser/ui/progressbar/progressbar.css b/src/vs/base/browser/ui/progressbar/progressbar.css index 511f186b224..cd910840fb8 100644 --- a/src/vs/base/browser/ui/progressbar/progressbar.css +++ b/src/vs/base/browser/ui/progressbar/progressbar.css @@ -51,14 +51,6 @@ -moz-animation-timing-function: linear; } -.progress-container.infinite.done .progress-bit { - transition: opacity 200ms linear; - -webkit-transition: opacity 200ms linear; - -o-transition: opacity 200ms linear; - -moz-transition: opacity 200ms linear; - -ms-transition: opacity 200ms linear; -} - @keyframes progress { from { left: 0; width: 2%; } 50% { left: 50%; width: 5%; } to { left: 98%; width: 2%; } } @-ms-keyframes progress { from { left: 0; width: 2%; } 50% { left: 50%; width: 5%; } to { left: 98%; width: 2%; } } @-webkit-keyframes progress { from { left: 0; width: 2%; } 50% { left: 50%; width: 5%; } to { left: 98%; width: 2%; } } diff --git a/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.css b/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.css index 54a5b82fa70..4ef06b9f902 100644 --- a/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.css +++ b/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.css @@ -61,12 +61,6 @@ line-height: 22px; } -.monaco-editor .reference-zone-widget .ref-tree .reference-file .directory { - opacity: 0.7; - margin-left: 0.5em; - font-size: 0.9em; -} - .monaco-editor .reference-zone-widget .monaco-count-badge { margin-right: 12px; } @@ -96,8 +90,4 @@ .monaco-editor.hc-black .reference-zone-widget .ref-tree .reference-file { line-height: 20px; font-weight: bold; -} - -.monaco-editor.hc-black .reference-zone-widget .ref-tree .reference-file .directory { - font-weight: normal; } \ No newline at end of file diff --git a/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts b/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts index cc8ae4a72ec..cd68e923530 100644 --- a/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts +++ b/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts @@ -27,7 +27,7 @@ import { LeftRightWidget } from 'vs/base/browser/ui/leftRightWidget/leftRightWid import * as tree from 'vs/base/parts/tree/browser/tree'; import { DefaultController, LegacyRenderer } from 'vs/base/parts/tree/browser/treeDefaults'; import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IInstantiationService, optional } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { Range, IRange } from 'vs/editor/common/core/range'; @@ -43,6 +43,7 @@ import { registerThemingParticipant, ITheme, IThemeService } from 'vs/platform/t import { attachListStyler, attachBadgeStyler } from 'vs/platform/theme/common/styler'; import { IModelDecorationsChangedEvent } from 'vs/editor/common/model/textModelEvents'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; +import { IEnvironmentService } from "vs/platform/environment/common/environment"; class DecorationsManager implements IDisposable { @@ -345,15 +346,18 @@ class Controller extends DefaultController { class Renderer extends LegacyRenderer { private _contextService: IWorkspaceContextService; private _themeService: IThemeService; + private _environmentService: IEnvironmentService; constructor( @IWorkspaceContextService contextService: IWorkspaceContextService, - @IThemeService themeService: IThemeService + @IThemeService themeService: IThemeService, + @optional(IEnvironmentService) environmentService: IEnvironmentService ) { super(); this._contextService = contextService; this._themeService = themeService; + this._environmentService = environmentService; } public getHeight(tree: tree.ITree, element: any): number { @@ -371,7 +375,7 @@ class Renderer extends LegacyRenderer { /* tslint:disable:no-unused-expression */ new LeftRightWidget(fileReferencesContainer, (left: HTMLElement) => { - const label = new FileLabel(left, element.uri, this._contextService); + const label = new FileLabel(left, element.uri, this._contextService, this._environmentService); toDispose.push(label); return null; diff --git a/src/vs/editor/contrib/rename/browser/renameInputField.ts b/src/vs/editor/contrib/rename/browser/renameInputField.ts index 020bfe66665..11564d8e05a 100644 --- a/src/vs/editor/contrib/rename/browser/renameInputField.ts +++ b/src/vs/editor/contrib/rename/browser/renameInputField.ts @@ -13,7 +13,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { Range } from 'vs/editor/common/core/range'; import { ContentWidgetPositionPreference, ICodeEditor, IContentWidget, IContentWidgetPosition } from 'vs/editor/browser/editorBrowser'; import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; -import { inputBackground, inputBorder, inputForeground, widgetShadow, focusBorder } from 'vs/platform/theme/common/colorRegistry'; +import { inputBackground, inputBorder, inputForeground, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; import { Position } from 'vs/editor/common/core/position'; export default class RenameInputField implements IContentWidget, IDisposable { @@ -79,7 +79,7 @@ export default class RenameInputField implements IContentWidget, IDisposable { const background = theme.getColor(inputBackground); const foreground = theme.getColor(inputForeground); const widgetShadowColor = theme.getColor(widgetShadow); - const border = theme.getColor(inputBorder) || theme.getColor(focusBorder); + const border = theme.getColor(inputBorder); this._inputField.style.backgroundColor = background ? background.toString() : null; this._inputField.style.color = foreground ? foreground.toString() : null; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts index eddc26ea885..59764a21fb6 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts @@ -50,7 +50,7 @@ import { IActivityBarService, ProgressBadge, NumberBadge } from 'vs/workbench/se import { IExtensionService } from 'vs/platform/extensions/common/extensions'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { inputForeground, inputBackground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; +import { inputForeground, inputBackground, inputBorder } from 'vs/platform/theme/common/colorRegistry'; import { attachListStyler } from 'vs/platform/theme/common/styler'; interface SearchInputEvent extends Event { @@ -146,14 +146,13 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { public updateStyles(): void { super.updateStyles(); - const contrastBorderColor = this.getColor(contrastBorder); - this.searchBox.style.backgroundColor = this.getColor(inputBackground); this.searchBox.style.color = this.getColor(inputForeground); - this.searchBox.style.borderWidth = contrastBorderColor ? '1px' : null; - this.searchBox.style.borderStyle = contrastBorderColor ? 'solid' : null; - this.searchBox.style.borderColor = contrastBorderColor; + const inputBorderColor = this.getColor(inputBorder); + this.searchBox.style.borderWidth = inputBorderColor ? '1px' : null; + this.searchBox.style.borderStyle = inputBorderColor ? 'solid' : null; + this.searchBox.style.borderColor = inputBorderColor; } setVisible(visible: boolean): TPromise { From b673a06683fbe46472c2833784885ab582a11117 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 18 May 2017 07:59:11 +0200 Subject: [PATCH 0554/1164] WorkbenchKeybindingService._cachedResolver stale after ElectronWindow.setup (fixes #26823) --- .../electron-browser/main.contribution.ts | 7 +++++- src/vs/workbench/electron-browser/window.ts | 18 -------------- .../workbench/electron-browser/workbench.ts | 24 ++++++++++++++++++- 3 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index 520d6c4c313..46b0bce9b76 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -14,7 +14,7 @@ import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'v import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actionRegistry'; import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes'; import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform'; -import { CloseEditorAction, KeybindingsReferenceAction, OpenDocumentationUrlAction, OpenIntroductoryVideosUrlAction, ReportIssueAction, ReportPerformanceIssueAction, ZoomResetAction, ZoomOutAction, ZoomInAction, ToggleFullScreenAction, ToggleMenuBarAction, CloseFolderAction, CloseWindowAction, SwitchWindow, NewWindowAction, CloseMessagesAction, NavigateUpAction, NavigateDownAction, NavigateLeftAction, NavigateRightAction, IncreaseViewSizeAction, DecreaseViewSizeAction } from 'vs/workbench/electron-browser/actions'; +import { CloseEditorAction, KeybindingsReferenceAction, OpenDocumentationUrlAction, OpenIntroductoryVideosUrlAction, ReportIssueAction, ReportPerformanceIssueAction, ZoomResetAction, ZoomOutAction, ZoomInAction, ToggleFullScreenAction, ToggleMenuBarAction, CloseFolderAction, CloseWindowAction, SwitchWindow, NewWindowAction, CloseMessagesAction, NavigateUpAction, NavigateDownAction, NavigateLeftAction, NavigateRightAction, IncreaseViewSizeAction, DecreaseViewSizeAction, ShowStartupPerformance, ToggleSharedProcessAction } from 'vs/workbench/electron-browser/actions'; import { MessagesVisibleContext } from 'vs/workbench/electron-browser/workbench'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; import { registerCommands } from 'vs/workbench/electron-browser/commands'; @@ -75,6 +75,11 @@ workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(Naviga workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(IncreaseViewSizeAction, IncreaseViewSizeAction.ID, IncreaseViewSizeAction.LABEL, null), 'View: Increase View Size', viewCategory); workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(DecreaseViewSizeAction, DecreaseViewSizeAction.ID, DecreaseViewSizeAction.LABEL, null), 'View: Decrease View Size', viewCategory); +// Developer related actions +const developerCategory = nls.localize('developer', "Developer"); +workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowStartupPerformance, ShowStartupPerformance.ID, ShowStartupPerformance.LABEL), 'Developer: Startup Performance', developerCategory); +workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleSharedProcessAction, ToggleSharedProcessAction.ID, ToggleSharedProcessAction.LABEL), 'Developer: Toggle Shared Process', developerCategory); + // Configuration: Workbench const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index c0230d6cc12..3c144fe2912 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -34,13 +34,8 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IPath, IOpenFileRequest, IWindowConfiguration } from 'vs/workbench/electron-browser/common'; import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; import { ITitleService } from 'vs/workbench/services/title/common/titleService'; -import { Registry } from 'vs/platform/platform'; -import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actionRegistry'; -import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { IWorkbenchThemeService, VS_HC_THEME, VS_DARK_THEME } from 'vs/workbench/services/themes/common/workbenchThemeService'; import * as browser from 'vs/base/browser/browser'; -import { ReloadWindowAction, ToggleDevToolsAction, ShowStartupPerformance, OpenRecentAction, ToggleSharedProcessAction } from 'vs/workbench/electron-browser/actions'; -import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { Position, IResourceInput, IUntitledResourceInput } from 'vs/platform/editor/common/editor'; @@ -344,19 +339,6 @@ export class ElectronWindow extends Themable { } } }); - - // Developer related actions - const developerCategory = nls.localize('developer', "Developer"); - const workbenchActionsRegistry = Registry.as(Extensions.WorkbenchActions); - const isDeveloping = !this.environmentService.isBuilt || this.environmentService.isExtensionDevelopment; - workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ReloadWindowAction, ReloadWindowAction.ID, ReloadWindowAction.LABEL, isDeveloping ? { primary: KeyMod.CtrlCmd | KeyCode.KEY_R } : void 0), 'Reload Window'); - workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleDevToolsAction, ToggleDevToolsAction.ID, ToggleDevToolsAction.LABEL, isDeveloping ? { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_I, mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_I } } : void 0), 'Developer: Toggle Developer Tools', developerCategory); - workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowStartupPerformance, ShowStartupPerformance.ID, ShowStartupPerformance.LABEL), 'Developer: Startup Performance', developerCategory); - workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleSharedProcessAction, ToggleSharedProcessAction.ID, ToggleSharedProcessAction.LABEL), 'Developer: Toggle Shared Process', developerCategory); - - // Action registered here to prevent a keybinding conflict with reload window - const fileCategory = nls.localize('file', "File"); - workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenRecentAction, OpenRecentAction.ID, OpenRecentAction.LABEL, { primary: isDeveloping ? null : KeyMod.CtrlCmd | KeyCode.KEY_R, mac: { primary: KeyMod.WinCtrl | KeyCode.KEY_R } }), 'File: Open Recent', fileCategory); } private resolveKeybindings(actionIds: string[]): TPromise<{ id: string; label: string, isNative: boolean; }[]> { diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 0899853678e..35a31823fd0 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -85,12 +85,17 @@ import { ILifecycleService, ShutdownReason } from 'vs/platform/lifecycle/common/ import { IWindowService } from 'vs/platform/windows/common/windows'; import { IMessageService } from 'vs/platform/message/common/message'; import { IStatusbarService } from 'vs/platform/statusbar/common/statusbar'; -import { IMenuService } from 'vs/platform/actions/common/actions'; +import { IMenuService, SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { MenuService } from 'vs/platform/actions/common/menuService'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWindowConfiguration } from 'vs/workbench/electron-browser/common'; +import { localize } from "vs/nls"; +import { IWorkbenchActionRegistry, Extensions } from "vs/workbench/common/actionRegistry"; +import { OpenRecentAction, ToggleDevToolsAction, ReloadWindowAction } from "vs/workbench/electron-browser/actions"; +import { KeyMod } from "vs/base/common/keyCodes"; +import { KeyCode } from "vs/editor/common/standalone/standaloneBase"; export const MessagesVisibleContext = new RawContextKey('globalMessageVisible', false); export const EditorsVisibleContext = new RawContextKey('editorIsOpen', false); @@ -258,6 +263,9 @@ export class Workbench implements IPartService { // Create Workbench this.createWorkbench(); + // Install some global actions + this.createGlobalActions(); + // Services this.initServices(); if (this.callbacks && this.callbacks.onServicesCreated) { @@ -362,6 +370,20 @@ export class Workbench implements IPartService { } } + private createGlobalActions(): void { + + // Developer related actions + const developerCategory = localize('developer', "Developer"); + const workbenchActionsRegistry = Registry.as(Extensions.WorkbenchActions); + const isDeveloping = !this.environmentService.isBuilt || this.environmentService.isExtensionDevelopment; + workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ReloadWindowAction, ReloadWindowAction.ID, ReloadWindowAction.LABEL, isDeveloping ? { primary: KeyMod.CtrlCmd | KeyCode.KEY_R } : void 0), 'Reload Window'); + workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleDevToolsAction, ToggleDevToolsAction.ID, ToggleDevToolsAction.LABEL, isDeveloping ? { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_I, mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_I } } : void 0), 'Developer: Toggle Developer Tools', developerCategory); + + // Action registered here to prevent a keybinding conflict with reload window + const fileCategory = localize('file', "File"); + workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenRecentAction, OpenRecentAction.ID, OpenRecentAction.LABEL, { primary: isDeveloping ? null : KeyMod.CtrlCmd | KeyCode.KEY_R, mac: { primary: KeyMod.WinCtrl | KeyCode.KEY_R } }), 'File: Open Recent', fileCategory); + } + private resolveEditorsToOpen(): TPromise { // Files to open, diff or create From 17a6e12e02e817df2888233db4d5e35d55b3e0b9 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 07:59:32 +0200 Subject: [PATCH 0555/1164] tfs: create env.ps1 --- build/tfs/win32/1_build.ps1 | 13 +++---------- scripts/env.ps1 | 5 +++++ 2 files changed, 8 insertions(+), 10 deletions(-) create mode 100644 scripts/env.ps1 diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index 88b39fea4f9..9ee8909ad8b 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -3,23 +3,16 @@ Param( [string]$vsoPAT ) +. .\scripts\env.ps1 . .\build\tfs\win32\lib.ps1 +# Create a _netrc file to download distro dependencies # In order to get _netrc to work, we need a HOME variable setup $env:HOME=$env:USERPROFILE - -$env:npm_config_disturl="https://atom.io/download/electron" -$env:npm_config_target="1.6.6" -$env:npm_config_runtime="electron" -$env:npm_config_cache="$HOME/.npm-electron" -$env:npm_config_arch="ia32" -# mkdir -p "$env:npm_config_cache" - -# Create a _netrc file to download distro dependencies "machine monacotools.visualstudio.com password ${vsoPAT}" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII step "Install dependencies" { - exec { & npm install } + exec { & npm install --arch ia32 } } $env:VSCODE_MIXIN_PASSWORD = $mixinPassword diff --git a/scripts/env.ps1 b/scripts/env.ps1 new file mode 100644 index 00000000000..3d34630f391 --- /dev/null +++ b/scripts/env.ps1 @@ -0,0 +1,5 @@ +$env:npm_config_disturl="https://atom.io/download/electron" +$env:npm_config_target=(node -p "require('./package.json').electronVersion") +$env:npm_config_runtime="electron" +$env:npm_config_cache="$HOME/.npm-electron" +New-Item -Path "$env:npm_config_cache" -Type directory -Force | out-null \ No newline at end of file From 3bb9b5314ef50bd8225aba0565cadc6ca19bc821 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 18 May 2017 08:15:00 +0200 Subject: [PATCH 0556/1164] no ES6 in JS --- src/vs/workbench/parts/html/browser/webview-pre.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/html/browser/webview-pre.js b/src/vs/workbench/parts/html/browser/webview-pre.js index 0a63595c8c8..da511a2c866 100644 --- a/src/vs/workbench/parts/html/browser/webview-pre.js +++ b/src/vs/workbench/parts/html/browser/webview-pre.js @@ -154,7 +154,7 @@ const frame = getActiveFrame(); // keep current scrollTop around and use later - let setInitialScrollPosition; + var setInitialScrollPosition; if (frame) { const scrollY = frame.contentDocument && frame.contentDocument.body ? frame.contentDocument.body.scrollTop : 0; setInitialScrollPosition = function (body) { From 4c786b00677f5be9f793fcabf7ff13a087c69ceb Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 18 May 2017 08:15:44 +0200 Subject: [PATCH 0557/1164] Fixes #26575: More workarounds for Chromium line height quirks --- src/vs/editor/browser/controller/textAreaHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index 2a52c37838f..f56d75f5b8e 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -411,7 +411,7 @@ export class TextAreaHandler extends ViewPart { ta.setFontSize(1); // Chrome does not generate input events in empty textareas that end // up having a line height smaller than 1 screen pixel. - ta.setLineHeight(Math.ceil(1 / this._pixelRatio)); + ta.setLineHeight(Math.ceil(Math.max(this._pixelRatio, 1 / this._pixelRatio))); } ta.setTop(top); From bc0c78790a9d27814e6098068900903cd5c6d878 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 08:17:24 +0200 Subject: [PATCH 0558/1164] tfs: fix windows build --- build/tfs/win32/1_build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index 9ee8909ad8b..926aa3ebfed 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -12,7 +12,7 @@ $env:HOME=$env:USERPROFILE "machine monacotools.visualstudio.com password ${vsoPAT}" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII step "Install dependencies" { - exec { & npm install --arch ia32 } + exec { & npm install --arch=ia32 } } $env:VSCODE_MIXIN_PASSWORD = $mixinPassword From 8f634171639530d31f03610c25a5202fabb5637a Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 18 May 2017 08:35:51 +0200 Subject: [PATCH 0559/1164] Only show a certain subset of decorations when they are collapsed --- .../browser/viewParts/decorations/decorations.ts | 14 ++++++++------ src/vs/editor/common/editorCommon.ts | 5 +++++ .../common/model/textModelWithDecorations.ts | 3 +++ src/vs/editor/common/services/modelServiceImpl.ts | 1 + .../editor/contrib/find/common/findDecorations.ts | 1 + 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/browser/viewParts/decorations/decorations.ts b/src/vs/editor/browser/viewParts/decorations/decorations.ts index e129ecb6143..165b9fb9281 100644 --- a/src/vs/editor/browser/viewParts/decorations/decorations.ts +++ b/src/vs/editor/browser/viewParts/decorations/decorations.ts @@ -146,24 +146,26 @@ export class DecorationsOverlay extends DynamicViewOverlay { let visibleStartLineNumber = ctx.visibleRange.startLineNumber; for (let i = 0, lenI = decorations.length; i < lenI; i++) { - let d = decorations[i]; + const d = decorations[i]; if (d.source.options.isWholeLine) { continue; } - let className = d.source.options.className; + const className = d.source.options.className; let linesVisibleRanges = ctx.linesVisibleRangesForRange(d.range, /*TODO@Alex*/className === 'findMatch'); if (!linesVisibleRanges) { continue; } + const showIfCollapsed = d.source.options.showIfCollapsed; + for (let j = 0, lenJ = linesVisibleRanges.length; j < lenJ; j++) { let lineVisibleRanges = linesVisibleRanges[j]; - let lineIndex = lineVisibleRanges.lineNumber - visibleStartLineNumber; + const lineIndex = lineVisibleRanges.lineNumber - visibleStartLineNumber; - if (lineVisibleRanges.ranges.length === 1) { + if (showIfCollapsed && lineVisibleRanges.ranges.length === 1) { const singleVisibleRange = lineVisibleRanges.ranges[0]; if (singleVisibleRange.width === 0) { // collapsed range case => make the decoration visible by faking its width @@ -172,8 +174,8 @@ export class DecorationsOverlay extends DynamicViewOverlay { } for (let k = 0, lenK = lineVisibleRanges.ranges.length; k < lenK; k++) { - let visibleRange = lineVisibleRanges.ranges[k]; - let decorationOutput = ( + const visibleRange = lineVisibleRanges.ranges[k]; + const decorationOutput = ( '
    Date: Thu, 18 May 2017 08:56:47 +0200 Subject: [PATCH 0561/1164] add 32bit libasound dependency to dockerfile --- build/tfs/linux/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tfs/linux/Dockerfile b/build/tfs/linux/Dockerfile index 70142abfa77..59994333b80 100644 --- a/build/tfs/linux/Dockerfile +++ b/build/tfs/linux/Dockerfile @@ -15,7 +15,7 @@ RUN apt-get install -y fakeroot RUN apt-get install -y libgtk2.0-0 libgtk2.0-0:i386 RUN apt-get install -y libgconf-2-4 libgconf-2-4:i386 RUN apt-get install -y libnss3 libnss3:i386 -RUN apt-get install -y libasound2 +RUN apt-get install -y libasound2 libasound2:i386 RUN apt-get install -y libxtst6 libxtst6:i386 RUN apt-get install -y libfuse2 RUN apt-get install -y libnotify-bin From d9e7a2e2122f8cad9504102ddfb475259e6d92a4 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 18 May 2017 09:39:07 +0200 Subject: [PATCH 0562/1164] configure .eslintrc to use ecma script 3 for things in src --- src/.eslintrc | 7 ++++-- src/vs/base/node/startupTimers.js | 36 ++++++++++++++++--------------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/.eslintrc b/src/.eslintrc index d84b7b2534d..fc504686e19 100644 --- a/src/.eslintrc +++ b/src/.eslintrc @@ -1,7 +1,10 @@ { + "parserOptions": { + "ecmaVersion": 3 + }, "env": { "node": true, - "es6": false + "es6": true }, "rules": { "no-console": 0, @@ -11,4 +14,4 @@ "semi": "warn" }, "extends": "eslint:recommended" -} \ No newline at end of file +} diff --git a/src/vs/base/node/startupTimers.js b/src/vs/base/node/startupTimers.js index e34c97b8f70..8f0494fc0ac 100644 --- a/src/vs/base/node/startupTimers.js +++ b/src/vs/base/node/startupTimers.js @@ -5,6 +5,8 @@ 'use strict'; +/*global define*/ + var requireProfiler; if (typeof define !== "function" && typeof module === "object" && typeof module.exports === "object") { @@ -12,23 +14,23 @@ if (typeof define !== "function" && typeof module === "object" && typeof module. global.define = function (dep, callback) { module.exports = callback(); global.define = undefined; - } + }; requireProfiler = function () { return require('v8-profiler'); - } + }; } else { // this is amd requireProfiler = function () { return require.__$__nodeRequire('v8-profiler'); - } + }; } define([], function () { function Tick(name, started, stopped, profile) { - this.name = name - this.started = started - this.stopped = stopped + this.name = name; + this.started = started; + this.stopped = stopped; this.duration = stopped - started; this.profile = profile; } @@ -49,9 +51,9 @@ define([], function () { global._perfTicks = global._perfTicks || []; global._perfToBeProfiled = global._perfToBeProfiled || new Set(); - const _starts = global._perfStarts; - const _ticks = global._perfTicks; - const _toBeProfiled = global._perfToBeProfiled + var _starts = global._perfStarts; + var _ticks = global._perfTicks; + var _toBeProfiled = global._perfToBeProfiled; function startTimer(name, started) { if (typeof started !== 'number') { @@ -64,7 +66,7 @@ define([], function () { requireProfiler().startProfiling(name, true); } _starts.set(name, { name: name, started: started }); - const stop = stopTimer.bind(undefined, name); + var stop = stopTimer.bind(undefined, name); return { stop: stop, while: function (thenable) { @@ -78,9 +80,9 @@ define([], function () { if (typeof stopped !== 'number') { stopped = Date.now(); } - const profile = _toBeProfiled.has(name) ? requireProfiler().stopProfiling(name) : undefined; - const start = _starts.get(name); - const tick = new Tick(start.name, start.started, stopped, profile); + var profile = _toBeProfiled.has(name) ? requireProfiler().stopProfiling(name) : undefined; + var start = _starts.get(name); + var tick = new Tick(start.name, start.started, stopped, profile); _ticks.push(tick); _starts.delete(name); } @@ -91,10 +93,10 @@ define([], function () { function setProfileList(names) { _toBeProfiled.clear(); - names.forEach(function (name) { _toBeProfiled.add(name) }); + names.forEach(function (name) { _toBeProfiled.add(name); }); } - const exports = { + var exports = { Tick: Tick, startTimer: startTimer, stopTimer: stopTimer, @@ -104,8 +106,8 @@ define([], function () { }; function disable() { - const emptyController = Object.freeze({ while: function (t) { return t; }, stop: function () { } }); - const emptyTicks = Object.create([]); + var emptyController = Object.freeze({ while: function (t) { return t; }, stop: function () { } }); + var emptyTicks = Object.create([]); exports.startTimer = function () { return emptyController; }; exports.stopTimer = function () { }; exports.ticks = function () { return emptyTicks; }; From beee645a294454573a0f7c3ebce4ce69866dc09b Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 18 May 2017 10:05:56 +0200 Subject: [PATCH 0563/1164] [css] update grammar --- extensions/css/syntaxes/css.tmLanguage.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/extensions/css/syntaxes/css.tmLanguage.json b/extensions/css/syntaxes/css.tmLanguage.json index 0d5a3c2775e..072b9cd3051 100644 --- a/extensions/css/syntaxes/css.tmLanguage.json +++ b/extensions/css/syntaxes/css.tmLanguage.json @@ -182,7 +182,7 @@ }, { "begin": "(?i)(?=@media(\\s|\\(|/\\*|$))", - "end": "(?<=})", + "end": "(?<=})(?!\\G)", "patterns": [ { "begin": "(?i)\\G(@)media", @@ -226,7 +226,7 @@ }, { "begin": "(?i)(?=@counter-style([\\s'\"{;]|/\\*|$))", - "end": "(?<=})", + "end": "(?<=})(?!\\G)", "patterns": [ { "begin": "(?i)\\G(@)counter-style", @@ -292,7 +292,7 @@ }, { "begin": "(?i)(?=@document([\\s'\"{;]|/\\*|$))", - "end": "(?<=})", + "end": "(?<=})(?!\\G)", "patterns": [ { "begin": "(?i)\\G(@)document", @@ -377,11 +377,11 @@ ] }, { - "begin": "(?i)(?=@keyframes([\\s'\"{;]|/\\*|$))", - "end": "(?<=})", + "begin": "(?i)(?=@(?:-(?:webkit|moz|o|ms)-)?keyframes([\\s'\"{;]|/\\*|$))", + "end": "(?<=})(?!\\G)", "patterns": [ { - "begin": "(?i)\\G(@)keyframes", + "begin": "(?i)\\G(@)(?:-(?:webkit|moz|o|ms)-)?keyframes", "beginCaptures": { "0": { "name": "keyword.control.at-rule.keyframes.css" @@ -455,7 +455,7 @@ }, { "begin": "(?i)(?=@supports(\\s|\\(|/\\*|$))", - "end": "(?<=})|(?=;)", + "end": "(?<=})(?!\\G)|(?=;)", "patterns": [ { "begin": "(?i)\\G(@)supports", @@ -1409,7 +1409,7 @@ "name": "invalid.illegal.colon.css" } }, - "match": "(?xi)\n(:)(:*)\n(?: active|any-link|checked|default|disabled|empty|enabled|first\n | (?:first|last|only)-(?:child|of-type)|focus|fullscreen|host|hover\n | in-range|indeterminate|invalid|left|link|optional|out-of-range\n | read-only|read-write|required|right|root|scope|target|unresolved\n | valid|visited\n)(?![\\w-])", + "match": "(?xi)\n(:)(:*)\n(?: active|any-link|checked|default|disabled|empty|enabled|first\n | (?:first|last|only)-(?:child|of-type)|focus|fullscreen|host|hover\n | in-range|indeterminate|invalid|left|link|optional|out-of-range\n | read-only|read-write|required|right|root|scope|target|unresolved\n | valid|visited\n)(?![\\w-]|\\s*[;}])", "name": "entity.other.attribute-name.pseudo-class.css" }, "pseudo-elements": { @@ -1421,7 +1421,7 @@ "name": "punctuation.definition.entity.css" } }, - "match": "(?xi)\n(?:\n (::?) # Elements using both : and :: notation\n (?: after\n | before\n | first-letter\n | first-line\n | (?:-(?:ah|apple|atsc|epub|hp|khtml|moz\n |ms|o|rim|ro|tc|wap|webkit|xv)\n | (?:mso|prince))\n -[a-z-]+\n )\n |\n (::) # Double-colon only\n (?: backdrop\n | content\n | grammar-error\n | marker\n | placeholder\n | selection\n | shadow\n | spelling-error\n )\n)\n(?![\\w-])", + "match": "(?xi)\n(?:\n (::?) # Elements using both : and :: notation\n (?: after\n | before\n | first-letter\n | first-line\n | (?:-(?:ah|apple|atsc|epub|hp|khtml|moz\n |ms|o|rim|ro|tc|wap|webkit|xv)\n | (?:mso|prince))\n -[a-z-]+\n )\n |\n (::) # Double-colon only\n (?: backdrop\n | content\n | grammar-error\n | marker\n | placeholder\n | selection\n | shadow\n | spelling-error\n )\n)\n(?![\\w-]|\\s*[;}])", "name": "entity.other.attribute-name.pseudo-element.css" }, "rule-list": { @@ -1797,5 +1797,5 @@ ] } }, - "version": "https://github.com/atom/language-css/commit/a2c17d3526e6381992b173d6cead428419751e34" + "version": "https://github.com/atom/language-css/commit/df34a7a41fa6acd6d867c6c2214dba12dc0a4c31" } \ No newline at end of file From aae591bd9e99e84b048c3628c7e1d0dce977639e Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 18 May 2017 10:06:00 +0200 Subject: [PATCH 0564/1164] Move ViewModelCursors out of the ViewModel --- src/vs/editor/browser/view/viewImpl.ts | 6 + .../currentLineHighlight.ts | 3 - .../currentLineMarginHighlight.ts | 2 - .../viewParts/viewCursors/viewCursor.ts | 6 - .../viewParts/viewCursors/viewCursors.ts | 5 - .../editor/browser/widget/codeEditorWidget.ts | 1 + src/vs/editor/common/commonCodeEditor.ts | 13 +- .../common/viewModel/viewModelCursors.ts | 90 +++++++++++-- .../editor/common/viewModel/viewModelImpl.ts | 118 ++++++------------ 9 files changed, 138 insertions(+), 106 deletions(-) diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index 9a2390c4a36..cc7605339cc 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -49,6 +49,7 @@ import { EditorScrollbar } from 'vs/editor/browser/viewParts/editorScrollbar/edi import { Minimap } from 'vs/editor/browser/viewParts/minimap/minimap'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { IThemeService, getThemeTypeSelector } from 'vs/platform/theme/common/themeService'; +import { ViewModelCursors } from "vs/editor/common/viewModel/viewModelCursors"; export interface IContentWidgetData { widget: editorBrowser.IContentWidget; @@ -97,6 +98,7 @@ export class View extends ViewEventHandler { configuration: Configuration, themeService: IThemeService, model: IViewModel, + cursor: ViewModelCursors, execCoreEditorCommandFunc: ExecCoreEditorCommandFunc ) { super(); @@ -136,6 +138,10 @@ export class View extends ViewEventHandler { this._register(model.addEventListener((events: viewEvents.ViewEvent[]) => { this.eventDispatcher.emitMany(events); })); + + this._register(cursor.addEventListener((events: viewEvents.ViewEvent[]) => { + this.eventDispatcher.emitMany(events); + })); } private createViewParts(): void { diff --git a/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts b/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts index ad2fcdec704..cdc9c97ff25 100644 --- a/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts +++ b/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts @@ -84,9 +84,6 @@ export class CurrentLineHighlightOverlay extends DynamicViewOverlay { return false; } public onFlushed(e: viewEvents.ViewFlushedEvent): boolean { - this._primaryCursorIsInEditableRange = true; - this._selectionIsEmpty = true; - this._primaryCursorLineNumber = 1; return true; } public onLinesDeleted(e: viewEvents.ViewLinesDeletedEvent): boolean { diff --git a/src/vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight.ts b/src/vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight.ts index 4cbdf06a32e..2e0f6dbdb15 100644 --- a/src/vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight.ts +++ b/src/vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight.ts @@ -67,8 +67,6 @@ export class CurrentLineMarginHighlightOverlay extends DynamicViewOverlay { return hasChanged; } public onFlushed(e: viewEvents.ViewFlushedEvent): boolean { - this._primaryCursorIsInEditableRange = true; - this._primaryCursorLineNumber = 1; return true; } public onLinesDeleted(e: viewEvents.ViewLinesDeletedEvent): boolean { diff --git a/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts b/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts index 5efeefa3c28..974facb28f2 100644 --- a/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts +++ b/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts @@ -130,12 +130,6 @@ export class ViewCursor { return true; } - public onFlushed(): boolean { - this.updatePosition(new Position(1, 1)); - this._isInEditableRange = true; - return true; - } - private _prepareRender(ctx: RenderingContext): ViewCursorRenderData { if (this._cursorStyle === TextEditorCursorStyle.Line || this._cursorStyle === TextEditorCursorStyle.LineThin) { const visibleRange = ctx.visibleRangeForPosition(this._position); diff --git a/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts b/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts index aba0ada5df6..4617e931f31 100644 --- a/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts +++ b/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts @@ -139,11 +139,6 @@ export class ViewCursors extends ViewPart { return true; } public onFlushed(e: viewEvents.ViewFlushedEvent): boolean { - this._primaryCursor.onFlushed(); - for (let i = 0, len = this._secondaryCursors.length; i < len; i++) { - this._domNode.removeChild(this._secondaryCursors[i].getDomNode()); - } - this._secondaryCursors = []; return true; } public onFocusChanged(e: viewEvents.ViewFocusChangedEvent): boolean { diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index b149d37a111..2d98476d439 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -422,6 +422,7 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito this._configuration, this._themeService, this.viewModel, + this.viewCursor, (editorCommand: CoreEditorCommand, args: any) => { if (!this.cursor) { return; diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index 104436dd806..64c0a5486f1 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -28,6 +28,7 @@ import { import * as editorOptions from 'vs/editor/common/config/editorOptions'; import { CursorEventType, ICursorPositionChangedEvent, VerticalRevealType, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; +import { ViewModelCursors } from "vs/editor/common/viewModel/viewModelCursors"; let EDITOR_ID = 0; @@ -99,6 +100,7 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo protected viewModel: ViewModel; protected cursor: Cursor; + protected viewCursor: ViewModelCursors; protected readonly _instantiationService: IInstantiationService; protected readonly _contextKeyService: IContextKeyService; @@ -932,7 +934,11 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo this._enableEmptySelectionClipboard() ); - this.viewModel.addEventSource(this.cursor); + this.viewCursor = new ViewModelCursors( + this._configuration, + this.viewModel, + this.cursor + ); this._createView(); @@ -994,6 +1000,11 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo this.cursor = null; } + if (this.viewCursor) { + this.viewCursor.dispose(); + this.viewCursor = null; + } + if (this.viewModel) { this.viewModel.dispose(); this.viewModel = null; diff --git a/src/vs/editor/common/viewModel/viewModelCursors.ts b/src/vs/editor/common/viewModel/viewModelCursors.ts index 90ec0e37eb2..1b37e3ef3d9 100644 --- a/src/vs/editor/common/viewModel/viewModelCursors.ts +++ b/src/vs/editor/common/viewModel/viewModelCursors.ts @@ -6,10 +6,13 @@ import * as editorCommon from 'vs/editor/common/editorCommon'; import { Position } from 'vs/editor/common/core/position'; -import { ICoordinatesConverter, ViewEventsCollector } from 'vs/editor/common/viewModel/viewModel'; +import { ICoordinatesConverter, ViewEventsCollector, IViewModel } from 'vs/editor/common/viewModel/viewModel'; import { Selection } from 'vs/editor/common/core/selection'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { ICursorRevealRangeEvent } from 'vs/editor/common/controller/cursorEvents'; +import { ICursorRevealRangeEvent, CursorEventType, CursorScrollRequest } from 'vs/editor/common/controller/cursorEvents'; +import { Cursor } from "vs/editor/common/controller/cursor"; +import { ViewEventEmitter } from "vs/editor/common/viewModel/viewModelImpl"; +import { EmitterEvent } from "vs/base/common/eventEmitter"; export interface ICursorPositionChangedEvent { readonly position: Position; @@ -26,19 +29,88 @@ export interface ICursorSelectionChangedEvent { readonly secondaryViewSelections: Selection[]; } -export class ViewModelCursors { +function containsLineMappingChanged(events: viewEvents.ViewEvent[]): boolean { + for (let i = 0, len = events.length; i < len; i++) { + if (events[i].type === viewEvents.ViewEventType.ViewLineMappingChanged) { + return true; + } + } + return false; +} + +export class ViewModelCursors extends ViewEventEmitter { private readonly configuration: editorCommon.IConfiguration; + private readonly viewModel: IViewModel; + private readonly cursor: Cursor; private readonly coordinatesConverter: ICoordinatesConverter; private lastCursorPositionChangedEvent: ICursorPositionChangedEvent; private lastCursorSelectionChangedEvent: ICursorSelectionChangedEvent; - constructor(configuration: editorCommon.IConfiguration, coordinatesConverter: ICoordinatesConverter) { + constructor(configuration: editorCommon.IConfiguration, viewModel: IViewModel, cursor: Cursor) { + super(); this.configuration = configuration; - this.coordinatesConverter = coordinatesConverter; + this.viewModel = viewModel; + this.cursor = cursor; + this.coordinatesConverter = viewModel.coordinatesConverter; this.lastCursorPositionChangedEvent = null; this.lastCursorSelectionChangedEvent = null; + + this._register(cursor.addBulkListener((events: EmitterEvent[]) => { + const eventsCollector = new ViewEventsCollector(); + this._onCursorEvents(eventsCollector, events); + this._emit(eventsCollector.finalize()); + })); + + this._register(viewModel.addEventListener((events: viewEvents.ViewEvent[]) => { + if (!containsLineMappingChanged(events)) { + return; + } + const eventsCollector = new ViewEventsCollector(); + this.onLineMappingChanged(eventsCollector); + this._emit(eventsCollector.finalize()); + })); + } + + private _onCursorEvents(eventsCollector: ViewEventsCollector, events: EmitterEvent[]): void { + for (let i = 0, len = events.length; i < len; i++) { + const _e = events[i]; + const type = _e.type; + const data = _e.data; + + switch (type) { + case CursorEventType.CursorPositionChanged: { + const e = data; + this.onCursorPositionChanged(eventsCollector, e); + break; + } + case CursorEventType.CursorSelectionChanged: { + const e = data; + this.onCursorSelectionChanged(eventsCollector, e); + break; + } + case CursorEventType.CursorRevealRange: { + const e = data; + this.onCursorRevealRange(eventsCollector, e); + break; + } + case CursorEventType.CursorScrollRequest: { + const e = data; + this.viewModel.viewLayout.setScrollPosition({ + scrollTop: e.desiredScrollTop + }); + break; + } + default: + console.info('View received unknown event: '); + console.info(type, data); + } + } + } + + public dispose(): void { + super.dispose(); } /** @@ -52,7 +124,7 @@ export class ViewModelCursors { return position; } - public onCursorPositionChanged(eventsCollector: ViewEventsCollector, e: ICursorPositionChangedEvent): void { + private onCursorPositionChanged(eventsCollector: ViewEventsCollector, e: ICursorPositionChangedEvent): void { this.lastCursorPositionChangedEvent = e; const stopRenderingLineAfter = this.configuration.editor.viewInfo.stopRenderingLineAfter; @@ -66,13 +138,13 @@ export class ViewModelCursors { eventsCollector.emit(new viewEvents.ViewCursorPositionChangedEvent(position, secondaryPositions, e.isInEditableRange)); } - public onCursorSelectionChanged(eventsCollector: ViewEventsCollector, e: ICursorSelectionChangedEvent): void { + private onCursorSelectionChanged(eventsCollector: ViewEventsCollector, e: ICursorSelectionChangedEvent): void { this.lastCursorSelectionChangedEvent = e; eventsCollector.emit(new viewEvents.ViewCursorSelectionChangedEvent(e.viewSelection, e.secondaryViewSelections)); } - public onCursorRevealRange(eventsCollector: ViewEventsCollector, e: ICursorRevealRangeEvent): void { + private onCursorRevealRange(eventsCollector: ViewEventsCollector, e: ICursorRevealRangeEvent): void { // Ensure event has viewRange const viewRange = ( e.viewRange @@ -86,7 +158,7 @@ export class ViewModelCursors { )); } - public onLineMappingChanged(eventsCollector: ViewEventsCollector): void { + private onLineMappingChanged(eventsCollector: ViewEventsCollector): void { if (this.lastCursorPositionChangedEvent) { const toViewPos = (pos: Position) => this.coordinatesConverter.convertModelPositionToViewPosition(pos); let e: ICursorPositionChangedEvent = { diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 432debeaa81..0ffdbddf6af 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -13,7 +13,6 @@ import { Selection } from 'vs/editor/common/core/selection'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { TokenizationRegistry, ColorId, LanguageId } from 'vs/editor/common/modes'; import { tokenizeLineToHTML } from 'vs/editor/common/modes/textToHtmlTokenizer'; -import { ViewModelCursors } from 'vs/editor/common/viewModel/viewModelCursors'; import { ViewModelDecorations } from 'vs/editor/common/viewModel/viewModelDecorations'; import { MinimapLinesRenderingData, ViewLineRenderingData, ViewModelDecoration, IViewModelListener, IViewModel, ICoordinatesConverter, ViewEventsCollector } from 'vs/editor/common/viewModel/viewModel'; import { SplitLinesCollection } from 'vs/editor/common/viewModel/splitLinesCollection'; @@ -22,8 +21,7 @@ import * as errors from 'vs/base/common/errors'; import { MinimapTokensColorTracker } from 'vs/editor/common/view/minimapCharRenderer'; import * as textModelEvents from 'vs/editor/common/model/textModelEvents'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; -import { CursorEventType, ICursorPositionChangedEvent, VerticalRevealType, ICursorSelectionChangedEvent, ICursorRevealRangeEvent, CursorScrollRequest } from 'vs/editor/common/controller/cursorEvents'; -import { Cursor } from 'vs/editor/common/controller/cursor'; +import { VerticalRevealType } from 'vs/editor/common/controller/cursorEvents'; import { CharacterHardWrappingLineMapperFactory } from "vs/editor/common/viewModel/characterHardWrappingLineMapper"; import { ViewLayout } from 'vs/editor/common/viewLayout/viewLayout'; @@ -87,7 +85,43 @@ export class CoordinatesConverter implements ICoordinatesConverter { } -export class ViewModel extends Disposable implements IViewModel { +export class ViewEventEmitter extends Disposable { + private _listeners: IViewModelListener[]; + + constructor() { + super(); + this._listeners = []; + } + + public dispose(): void { + this._listeners = []; + super.dispose(); + } + + protected _emit(events: viewEvents.ViewEvent[]): void { + const listeners = this._listeners.slice(0); + for (let i = 0, len = listeners.length; i < len; i++) { + safeInvokeListener(listeners[i], events); + } + } + + public addEventListener(listener: (events: viewEvents.ViewEvent[]) => void): IDisposable { + this._listeners.push(listener); + return { + dispose: () => { + let listeners = this._listeners; + for (let i = 0, len = listeners.length; i < len; i++) { + if (listeners[i] === listener) { + listeners.splice(i, 1); + break; + } + } + } + }; + } +} + +export class ViewModel extends ViewEventEmitter implements IViewModel { private readonly editorId: number; private readonly configuration: editorCommon.IConfiguration; @@ -97,11 +131,9 @@ export class ViewModel extends Disposable implements IViewModel { public readonly viewLayout: ViewLayout; private readonly decorations: ViewModelDecorations; - private readonly cursors: ViewModelCursors; private _isDisposing: boolean; private _centeredViewLine: number; - private _listeners: IViewModelListener[]; constructor(editorId: number, configuration: editorCommon.IConfiguration, model: editorCommon.IModel) { super(); @@ -139,12 +171,9 @@ export class ViewModel extends Disposable implements IViewModel { this._isDisposing = false; this._centeredViewLine = -1; - this._listeners = []; this.decorations = new ViewModelDecorations(this.editorId, this.model, this.configuration, this.coordinatesConverter); - this.cursors = new ViewModelCursors(this.configuration, this.coordinatesConverter); - this._register(this.model.addBulkListener((events: EmitterEvent[]) => { if (this._isDisposing) { // Disposing the lines might end up sending model decoration changed events @@ -171,61 +200,9 @@ export class ViewModel extends Disposable implements IViewModel { this._isDisposing = true; this.decorations.dispose(); this.lines.dispose(); - this._listeners = []; super.dispose(); } - private _emit(events: viewEvents.ViewEvent[]): void { - const listeners = this._listeners.slice(0); - for (let i = 0, len = listeners.length; i < len; i++) { - safeInvokeListener(listeners[i], events); - } - } - - public addEventSource(cursor: Cursor): void { - this._register(cursor.addBulkListener((events: EmitterEvent[]) => { - const eventsCollector = new ViewEventsCollector(); - this._onCursorEvents(eventsCollector, events); - this._emit(eventsCollector.finalize()); - })); - } - - private _onCursorEvents(eventsCollector: ViewEventsCollector, events: EmitterEvent[]): void { - for (let i = 0, len = events.length; i < len; i++) { - const _e = events[i]; - const type = _e.type; - const data = _e.data; - - switch (type) { - case CursorEventType.CursorPositionChanged: { - const e = data; - this.cursors.onCursorPositionChanged(eventsCollector, e); - break; - } - case CursorEventType.CursorSelectionChanged: { - const e = data; - this.cursors.onCursorSelectionChanged(eventsCollector, e); - break; - } - case CursorEventType.CursorRevealRange: { - const e = data; - this.cursors.onCursorRevealRange(eventsCollector, e); - break; - } - case CursorEventType.CursorScrollRequest: { - const e = data; - this.viewLayout.setScrollPosition({ - scrollTop: e.desiredScrollTop - }); - break; - } - default: - console.info('View received unknown event: '); - console.info(type, data); - } - } - } - private _onConfigurationChanged(eventsCollector: ViewEventsCollector, e: IConfigurationChangedEvent): void { // We might need to restore the current centered view range, so save it (if available) @@ -238,7 +215,6 @@ export class ViewModel extends Disposable implements IViewModel { eventsCollector.emit(new viewEvents.ViewFlushedEvent()); eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); this.decorations.onLineMappingChanged(eventsCollector); - this.cursors.onLineMappingChanged(eventsCollector); this.viewLayout.onFlushed(this.getLineCount()); revealPreviousCenteredModelRange = true; } @@ -377,7 +353,6 @@ export class ViewModel extends Disposable implements IViewModel { eventsCollector.emit(new viewEvents.ViewFlushedEvent()); eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); this.decorations.onLineMappingChanged(eventsCollector); - this.cursors.onLineMappingChanged(eventsCollector); this.viewLayout.onFlushed(this.getLineCount()); } @@ -401,7 +376,6 @@ export class ViewModel extends Disposable implements IViewModel { if (!hadOtherModelChange && hadModelLineChangeThatChangedLineMapping) { eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); this.decorations.onLineMappingChanged(eventsCollector); - this.cursors.onLineMappingChanged(eventsCollector); } } @@ -412,27 +386,11 @@ export class ViewModel extends Disposable implements IViewModel { eventsCollector.emit(new viewEvents.ViewFlushedEvent()); eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); this.decorations.onLineMappingChanged(eventsCollector); - this.cursors.onLineMappingChanged(eventsCollector); this.viewLayout.onFlushed(this.getLineCount()); } this._emit(eventsCollector.finalize()); } - public addEventListener(listener: (events: viewEvents.ViewEvent[]) => void): IDisposable { - this._listeners.push(listener); - return { - dispose: () => { - let listeners = this._listeners; - for (let i = 0, len = listeners.length; i < len; i++) { - if (listeners[i] === listener) { - listeners.splice(i, 1); - break; - } - } - } - }; - } - public getCenteredRangeInViewport(): Range { if (this._centeredViewLine === -1) { // Never got rendered or not rendered since last content change event From 8a1fab94a26d1fc83551804bc69eb2df94b129ab Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 18 May 2017 10:04:11 +0200 Subject: [PATCH 0565/1164] hc black: use more token colors (same as dark+) fixes #17178 --- .../theme-defaults/themes/hc_black.json | 388 ++++-------------- .../themes/hc_black_defaults.json | 309 +++++++++++++- 2 files changed, 399 insertions(+), 298 deletions(-) diff --git a/extensions/theme-defaults/themes/hc_black.json b/extensions/theme-defaults/themes/hc_black.json index 4fb65f26e8b..401ed6a0ab6 100644 --- a/extensions/theme-defaults/themes/hc_black.json +++ b/extensions/theme-defaults/themes/hc_black.json @@ -2,310 +2,104 @@ "$schema": "vscode://schemas/color-theme", "name": "Dark High Contrast", "include": "./hc_black_defaults.json", - "settings": [ - { - "settings": { - "foreground": "#FFFFFF", - "background": "#000000" - } - }, - { - "scope": "emphasis", - "settings": { - "fontStyle": "italic" - } - }, - { - "scope": "strong", - "settings": { - "fontStyle": "bold" - } - }, - { - "scope": "meta.diff.header", - "settings": { - "foreground": "#000080" - } - }, - - { - "scope": "comment", - "settings": { - "foreground": "#7ca668" - } - }, - { - "scope": "constant.language", - "settings": { - "foreground": "#569cd6" - } - }, + "tokenColors": [ { + "name": "Function declarations", "scope": [ - "constant.numeric", + "entity.name.function", + "support.function", + "support.constant.handlebars" + ], + "settings": { + "foreground": "#DCDCAA" + } + }, + { + "name": "Types declaration and references", + "scope": [ + "meta.return-type", + "support.class", + "support.type", + "entity.name.type", + "entity.name.class", + "storage.type.cs", + "storage.type.generic.cs", + "storage.type.modifier.cs", + "storage.type.variable.cs", + "storage.type.annotation.java", + "storage.type.generic.java", + "storage.type.java", + "storage.type.object.array.java", + "storage.type.primitive.array.java", + "storage.type.primitive.java", + "storage.type.token.java", + "storage.type.groovy", + "storage.type.annotation.groovy", + "storage.type.parameters.groovy", + "storage.type.generic.groovy", + "storage.type.object.array.groovy", + "storage.type.primitive.array.groovy", + "storage.type.primitive.groovy" + ], + "settings": { + "foreground": "#4EC9B0" + } + }, + { + "name": "Types declaration and references, TS grammar specific", + "scope": [ + "meta.type.cast.expr", + "meta.type.new.expr", + "support.constant.math", + "support.constant.dom", + "support.constant.json", + "entity.other.inherited-class" + ], + "settings": { + "foreground": "#4EC9B0" + } + }, + { + "name": "Control flow keywords", + "scope": "keyword.control", + "settings": { + "foreground": "#C586C0" + } + }, + { + "name": "Variable and parameter name", + "scope": [ + "variable", + "meta.definition.variable.name", + "support.variable" + ], + "settings": { + "foreground": "#9CDCFE" + } + }, + { + "name": "Object keys, TS grammar specific", + "scope": [ + "meta.object-literal.key", + "meta.object-literal.key entity.name.function" + ], + "settings": { + "foreground": "#9CDCFE" + } + }, + { + "name": "CSS property value", + "scope": [ + "support.constant.property-value", + "support.constant.font-name", + "support.constant.media-type", + "support.constant.media", "constant.other.color.rgb-value", "constant.other.rgb-value", "support.constant.color" ], "settings": { - "foreground": "#b5cea8" - } - }, - { - "scope": "constant.regexp", - "settings": { - "foreground": "#b46695" - } - }, - { - "scope": "entity.name.tag", - "settings": { - "foreground": "#569cd6" - } - }, - { - "scope": "entity.name.tag.css", - "settings": { - "foreground": "#d7ba7d" - } - }, - { - "scope": "entity.other.attribute-name", - "settings": { - "foreground": "#9cdcfe" - } - }, - { - "scope": [ - "entity.other.attribute-name.class.css", - "entity.other.attribute-name.class.mixin.css", - "entity.other.attribute-name.id.css", - "entity.other.attribute-name.parent-selector.css", - "entity.other.attribute-name.pseudo-class.css", - "entity.other.attribute-name.pseudo-element.css", - - "source.css.less entity.other.attribute-name.id", - - "entity.other.attribute-name.attribute.scss", - "entity.other.attribute-name.scss" - ], - "settings": { - "foreground": "#d7ba7d" - } - }, - { - "scope": "invalid", - "settings": { - "foreground": "#f44747" - } - }, - { - "scope": "markup.underline", - "settings": { - "fontStyle": "underline" - } - }, - { - "scope": "markup.bold", - "settings": { - "fontStyle": "bold" - } - }, - { - "scope": "markup.heading", - "settings": { - "foreground": "#6796e6" - } - }, - { - "scope": "markup.italic", - "settings": { - "fontStyle": "italic" - } - }, - { - "scope": "markup.inserted", - "settings": { - "foreground": "#b5cea8" - } - }, - { - "scope": "markup.deleted", - "settings": { - "foreground": "#ce9178" - } - }, - { - "scope": "markup.changed", - "settings": { - "foreground": "#569cd6" - } - }, - { - "scope": "meta.selector", - "settings": { - "foreground": "#d7ba7d" - } - }, - { - "name": "brackets of XML/HTML tags", - "scope": [ - "punctuation.definition.tag" - ], - "settings": { - "foreground": "#808080" - } - }, - { - "scope": "meta.preprocessor", - "settings": { - "foreground": "#569cd6" - } - }, - { - "scope": "meta.preprocessor.string", - "settings": { - "foreground": "#ce9178" - } - }, - { - "scope": "meta.preprocessor.numeric", - "settings": { - "foreground": "#b5cea8" - } - }, - { - "scope": "meta.structure.dictionary.key.python", - "settings": { - "foreground": "#9cdcfe" - } - }, - { - "scope": "storage", - "settings": { - "foreground": "#569cd6" - } - }, - { - "scope": "storage.type", - "settings": { - "foreground": "#569cd6" - } - }, - { - "scope": "storage.modifier", - "settings": { - "foreground": "#569cd6" - } - }, - { - "scope": "string", - "settings": { - "foreground": "#ce9178" - } - }, - { - "scope": "string.tag", - "settings": { - "foreground": "#ce9178" - } - }, - { - "scope": "string.value", - "settings": { - "foreground": "#ce9178" - } - }, - { - "scope": "string.regexp", - "settings": { - "foreground": "#d16969" - } - }, - { - "name": "JavaScript string interpolation ${}", - "scope": [ - "punctuation.definition.template-expression.begin.js", - "punctuation.definition.template-expression.begin.ts", - "punctuation.definition.template-expression.end.ts", - "punctuation.definition.template-expression.end.js" - ], - "settings": { - "foreground": "#569cd6" - } - }, - { - "scope": [ - "support.type.vendored.property-name", - "support.type.property-name", - "variable.css", - "variable.scss", - "variable.other.less" - ], - "settings": { - "foreground": "#d4d4d4" - } - }, - { - "scope": "keyword", - "settings": { - "foreground": "#569cd6" - } - }, - { - "scope": "keyword.control", - "settings": { - "foreground": "#569cd6" - } - }, - { - "scope": "keyword.operator", - "settings": { - "foreground": "#d4d4d4" - } - }, - { - "scope": [ - "keyword.operator.new", - "keyword.operator.expression", - "keyword.operator.cast", - "keyword.operator.sizeof", - "keyword.operator.logical.python" - ], - "settings": { - "foreground": "#569cd6" - } - }, - { - "scope": "keyword.other.unit", - "settings": { - "foreground": "#b5cea8" - } - }, - { - "scope": "support.function.git-rebase", - "settings": { - "foreground": "#d4d4d4" - } - }, - { - "scope": "constant.sha.git-rebase", - "settings": { - "foreground": "#b5cea8" - } - }, - { - "name": "coloring of the Java import and package identifiers", - "scope": ["storage.modifier.import.java", "storage.modifier.package.java"], - "settings": { - "foreground": "#d4d4d4" - } - }, - { - "name": "coloring of the TS this", - "scope": "variable.language.this", - "settings": { - "foreground": "#569cd6" + "foreground": "#CE9178" } } ] diff --git a/extensions/theme-defaults/themes/hc_black_defaults.json b/extensions/theme-defaults/themes/hc_black_defaults.json index ceda83b4465..b98e3e17b26 100644 --- a/extensions/theme-defaults/themes/hc_black_defaults.json +++ b/extensions/theme-defaults/themes/hc_black_defaults.json @@ -5,5 +5,312 @@ "editor.background": "#000000", "editor.foreground": "#FFFFFF", "editorIndentGuide.background": "#FFFFFF" - } + }, + "settings": [ + { + "settings": { + "foreground": "#FFFFFF", + "background": "#000000" + } + }, + { + "scope": "emphasis", + "settings": { + "fontStyle": "italic" + } + }, + { + "scope": "strong", + "settings": { + "fontStyle": "bold" + } + }, + { + "scope": "meta.diff.header", + "settings": { + "foreground": "#000080" + } + }, + + { + "scope": "comment", + "settings": { + "foreground": "#7ca668" + } + }, + { + "scope": "constant.language", + "settings": { + "foreground": "#569cd6" + } + }, + { + "scope": [ + "constant.numeric", + "constant.other.color.rgb-value", + "constant.other.rgb-value", + "support.constant.color" + ], + "settings": { + "foreground": "#b5cea8" + } + }, + { + "scope": "constant.regexp", + "settings": { + "foreground": "#b46695" + } + }, + { + "scope": "entity.name.tag", + "settings": { + "foreground": "#569cd6" + } + }, + { + "scope": "entity.name.tag.css", + "settings": { + "foreground": "#d7ba7d" + } + }, + { + "scope": "entity.other.attribute-name", + "settings": { + "foreground": "#9cdcfe" + } + }, + { + "scope": [ + "entity.other.attribute-name.class.css", + "entity.other.attribute-name.class.mixin.css", + "entity.other.attribute-name.id.css", + "entity.other.attribute-name.parent-selector.css", + "entity.other.attribute-name.pseudo-class.css", + "entity.other.attribute-name.pseudo-element.css", + + "source.css.less entity.other.attribute-name.id", + + "entity.other.attribute-name.attribute.scss", + "entity.other.attribute-name.scss" + ], + "settings": { + "foreground": "#d7ba7d" + } + }, + { + "scope": "invalid", + "settings": { + "foreground": "#f44747" + } + }, + { + "scope": "markup.underline", + "settings": { + "fontStyle": "underline" + } + }, + { + "scope": "markup.bold", + "settings": { + "fontStyle": "bold" + } + }, + { + "scope": "markup.heading", + "settings": { + "foreground": "#6796e6" + } + }, + { + "scope": "markup.italic", + "settings": { + "fontStyle": "italic" + } + }, + { + "scope": "markup.inserted", + "settings": { + "foreground": "#b5cea8" + } + }, + { + "scope": "markup.deleted", + "settings": { + "foreground": "#ce9178" + } + }, + { + "scope": "markup.changed", + "settings": { + "foreground": "#569cd6" + } + }, + { + "scope": "meta.selector", + "settings": { + "foreground": "#d7ba7d" + } + }, + { + "name": "brackets of XML/HTML tags", + "scope": [ + "punctuation.definition.tag" + ], + "settings": { + "foreground": "#808080" + } + }, + { + "scope": "meta.preprocessor", + "settings": { + "foreground": "#569cd6" + } + }, + { + "scope": "meta.preprocessor.string", + "settings": { + "foreground": "#ce9178" + } + }, + { + "scope": "meta.preprocessor.numeric", + "settings": { + "foreground": "#b5cea8" + } + }, + { + "scope": "meta.structure.dictionary.key.python", + "settings": { + "foreground": "#9cdcfe" + } + }, + { + "scope": "storage", + "settings": { + "foreground": "#569cd6" + } + }, + { + "scope": "storage.type", + "settings": { + "foreground": "#569cd6" + } + }, + { + "scope": "storage.modifier", + "settings": { + "foreground": "#569cd6" + } + }, + { + "scope": "string", + "settings": { + "foreground": "#ce9178" + } + }, + { + "scope": "string.tag", + "settings": { + "foreground": "#ce9178" + } + }, + { + "scope": "string.value", + "settings": { + "foreground": "#ce9178" + } + }, + { + "scope": "string.regexp", + "settings": { + "foreground": "#d16969" + } + }, + { + "name": "JavaScript string interpolation ${}", + "scope": [ + "punctuation.definition.template-expression.begin.js", + "punctuation.definition.template-expression.begin.ts", + "punctuation.definition.template-expression.end.ts", + "punctuation.definition.template-expression.end.js" + ], + "settings": { + "foreground": "#569cd6" + } + }, + { + "scope": [ + "support.type.vendored.property-name", + "support.type.property-name", + "variable.css", + "variable.scss", + "variable.other.less" + ], + "settings": { + "foreground": "#d4d4d4" + } + }, + { + "scope": "keyword", + "settings": { + "foreground": "#569cd6" + } + }, + { + "scope": "keyword.control", + "settings": { + "foreground": "#569cd6" + } + }, + { + "scope": "keyword.operator", + "settings": { + "foreground": "#d4d4d4" + } + }, + { + "scope": [ + "keyword.operator.new", + "keyword.operator.expression", + "keyword.operator.cast", + "keyword.operator.sizeof", + "keyword.operator.logical.python" + ], + "settings": { + "foreground": "#569cd6" + } + }, + { + "scope": "keyword.other.unit", + "settings": { + "foreground": "#b5cea8" + } + }, + { + "scope": "support.function.git-rebase", + "settings": { + "foreground": "#d4d4d4" + } + }, + { + "scope": "constant.sha.git-rebase", + "settings": { + "foreground": "#b5cea8" + } + }, + { + "name": "coloring of the Java import and package identifiers", + "scope": ["storage.modifier.import.java", "storage.modifier.package.java"], + "settings": { + "foreground": "#d4d4d4" + } + }, + { + "name": "coloring of the TS this", + "scope": "variable.language.this", + "settings": { + "foreground": "#569cd6" + } + } + ] } \ No newline at end of file From bd77d243b452afcf909ae37d156bfc7bb60af6c2 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 18 May 2017 10:17:34 +0200 Subject: [PATCH 0566/1164] [scss] update grammar (fies #26837) --- extensions/scss/syntaxes/scss.json | 473 ++++---- .../test-cssvariables_scss.json | 27 +- .../scss/test/colorize-results/test_scss.json | 1006 ++++++++--------- 3 files changed, 773 insertions(+), 733 deletions(-) diff --git a/extensions/scss/syntaxes/scss.json b/extensions/scss/syntaxes/scss.json index 921c511a494..1f09bd75e56 100644 --- a/extensions/scss/syntaxes/scss.json +++ b/extensions/scss/syntaxes/scss.json @@ -65,9 +65,6 @@ } ], "repository": { - "at_rule__": { - "comment": "Note how all @rules are prefixed." - }, "at_rule_charset": { "begin": "\\s*((@)charset\\b)\\s*", "captures": { @@ -78,7 +75,6 @@ "name": "punctuation.definition.keyword.scss" } }, - "comment": "Charset", "end": "\\s*((?=;|$))", "name": "meta.at-rule.charset.scss", "patterns": [ @@ -255,7 +251,6 @@ "name": "entity.name.function.scss" } }, - "comment": "Function with Attributes", "end": "\\s*(?={)", "name": "meta.at-rule.function.scss", "patterns": [ @@ -276,7 +271,6 @@ "name": "entity.name.function.scss" } }, - "comment": "Simple Function", "match": "\\s*((@)function\\b)\\s*", "name": "meta.at-rule.function.scss" } @@ -508,15 +502,68 @@ }, "name": "meta.at-rule.media.scss", "patterns": [ + { + "include": "#comment_block" + }, + { + "include": "#comment_line" + }, { "match": "\\b(only)\\b", "name": "keyword.control.operator" }, { - "include": "#media_features" - }, - { - "include": "#property_values" + "begin": "\\(", + "beginCaptures": { + "0": { + "name": "punctuation.definition.media-query.begin.bracket.round.scss" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.media-query.end.bracket.round.scss" + } + }, + "name": "meta.property-list.media-query.scss", + "patterns": [ + { + "begin": "(?(['\"])(?:[^\\\\]|\\\\.)*?(\\6)))))?\\s*(])", - "name": "meta.attribute-selector.scss" + } }, "selector_class": { - "begin": "(\\.)(?=[\\w-]|#{)", - "beginCaptures": { + "match": "(?x)\n(\\.) # Valid class-name\n(\n (?: [-a-zA-Z_0-9]|[^\\x00-\\x7F] # Valid identifier characters\n | \\\\(?:[0-9a-fA-F]{1,6}|.) # Escape sequence\n | \\#\\{ # Interpolation (escaped to avoid Coffeelint errors)\n | \\$ # Possible start of interpolation variable\n | } # Possible end of interpolation\n )+\n) # Followed by either:\n(?= $ # - End of the line\n | [\\s,.\\#)\\[:{>+~|] # - Another selector\n | /\\* # - A block comment\n)", + "name": "entity.other.attribute-name.class.css", + "captures": { "1": { "name": "punctuation.definition.entity.css" + }, + "2": { + "patterns": [ + { + "include": "#interpolation" + }, + { + "match": "\\\\([0-9a-fA-F]{1,6}|.)", + "name": "constant.character.escape.scss" + }, + { + "match": "\\$|}", + "name": "invalid.illegal.scss" + } + ] } - }, - "end": "(?![\\w-]|(#{))", - "name": "entity.other.attribute-name.class.css", - "patterns": [ - { - "include": "#interpolation" - } - ] - }, - "selector_entities": { - "match": "(?x)\n\\b\n(a|abbr|acronym|address|area|article|aside|audio|\nb|base|bdi|bdo|big|blockquote|body|br|button|\ncanvas|caption|circle|cite|code|col|colgroup|\ndata|datalist|dd|del|details|dfn|dialog|div|dl|dt|\nellipse|em|embed|eventsource|\nfieldset|figure|figcaption|footer|form|frame|frameset|\ng|\n(h[1-6])|head|header|hgroup|hr|html|\ni|iframe|img|image|input|ins|\nkbd|keygen|\nlabel|legend|li|line(?!-)|link|\nmain|map|mark|menu|menuitem|meta|meter|\nnav|noframes|noscript|\nobject(?!-)|ol|optgroup|option|output|\np|param|path|picture|polygon|polyline|pre|progress|\nq|\nrb|rect|rp|rt|rtc|ruby|\ns|samp|script|section|select|small|source|span|strike|strong|style|sub|summary|sup|svg|\ntable(?!-)|tbody|td|template|text(?!-)|textarea|textpath|tfoot|th|thead|time|title|tr|track|tspan|tt|\nu|ul|\nvar|video|\nwbr)\n\\b", - "name": "entity.name.tag.scss" + } }, "selector_custom": { - "match": "\\b([a-zA-Z0-9]+(-[a-zA-Z0-9]+)+)(?=\\.|\\s++[^:]|\\s*[,{]|:(link|visited|hover|active|focus|target|lang|disabled|enabled|checked|indeterminate|root|nth-(child|last-child|of-type|last-of-type)|first-child|last-child|first-of-type|last-of-type|only-child|only-of-type|empty|not|valid|invalid)(\\([0-9A-Za-z]*\\))?)", + "match": "\\b([a-zA-Z0-9]+(-[a-zA-Z0-9]+)+)(?=\\.|\\s++[^:]|\\s*[,\\[{]|:(link|visited|hover|active|focus|target|lang|disabled|enabled|checked|indeterminate|root|nth-(child|last-child|of-type|last-of-type)|first-child|last-child|first-of-type|last-of-type|only-child|only-of-type|empty|not|valid|invalid)(\\([0-9A-Za-z]*\\))?)", "name": "entity.name.tag.custom.scss" }, "selector_id": { + "match": "(?x)\n(\\#) # Valid id-name\n(\n (?: [-a-zA-Z_0-9]|[^\\x00-\\x7F] # Valid identifier characters\n | \\\\(?:[0-9a-fA-F]{1,6}|.) # Escape sequence\n | \\#\\{ # Interpolation (escaped to avoid Coffeelint errors)\n | \\$ # Possible start of interpolation variable\n | } # Possible end of interpolation\n )+\n) # Followed by either:\n(?= $ # - End of the line\n | [\\s,.\\#)\\[:{>+~|] # - Another selector\n | /\\* # - A block comment\n)", + "name": "entity.other.attribute-name.id.css", "captures": { "1": { "name": "punctuation.definition.entity.css" + }, + "2": { + "patterns": [ + { + "include": "#interpolation" + }, + { + "match": "\\\\([0-9a-fA-F]{1,6}|.)", + "name": "constant.character.escape.scss" + }, + { + "match": "\\$|}", + "name": "invalid.illegal.identifier.scss" + } + ] } - }, - "match": "(#)[a-zA-Z][a-zA-Z0-9_-]*", - "name": "entity.other.attribute-name.id.css" + } }, "selector_placeholder": { + "match": "(?x)\n(%) # Valid placeholder-name\n(\n (?: [-a-zA-Z_0-9]|[^\\x00-\\x7F] # Valid identifier characters\n | \\\\(?:[0-9a-fA-F]{1,6}|.) # Escape sequence\n | \\#\\{ # Interpolation (escaped to avoid Coffeelint errors)\n | \\$ # Possible start of interpolation variable\n | } # Possible end of interpolation\n )+\n) # Followed by either:\n(?= $ # - End of the line\n | [\\s,.\\#)\\[:{>+~|] # - Another selector\n | /\\* # - A block comment\n)", + "name": "entity.other.attribute-name.placeholder.css", "captures": { "1": { - "name": "punctuation.definition.entity.scss" + "name": "punctuation.definition.entity.css" + }, + "2": { + "patterns": [ + { + "include": "#interpolation" + }, + { + "match": "\\\\([0-9a-fA-F]{1,6}|.)", + "name": "constant.character.escape.scss" + }, + { + "match": "\\$|}", + "name": "invalid.illegal.identifier.scss" + } + ] } - }, - "match": "(%)[a-zA-Z0-9_-]+", - "name": "entity.other.attribute-name.placeholder.scss" + } }, "parent_selector_suffix": { - "match": "(?<=&)[a-zA-Z0-9_-]+", - "name": "entity.other.attribute-name.parent-selector-suffix.scss" + "match": "(?x)\n(?<=&)\n(\n (?: [-a-zA-Z_0-9]|[^\\x00-\\x7F] # Valid identifier characters\n | \\\\(?:[0-9a-fA-F]{1,6}|.) # Escape sequence\n | \\#\\{ # Interpolation (escaped to avoid Coffeelint errors)\n | \\$ # Possible start of interpolation variable\n | } # Possible end of interpolation\n )+\n) # Followed by either:\n(?= $ # - End of the line\n | [\\s,.\\#)\\[:{>+~|] # - Another selector\n | /\\* # - A block comment\n)", + "name": "entity.other.attribute-name.parent-selector-suffix.css", + "captures": { + "1": { + "name": "punctuation.definition.entity.css" + }, + "2": { + "patterns": [ + { + "include": "#interpolation" + }, + { + "match": "\\\\([0-9a-fA-F]{1,6}|.)", + "name": "constant.character.escape.scss" + }, + { + "match": "\\$|}", + "name": "invalid.illegal.identifier.scss" + } + ] + } + } }, "selector_pseudo_class": { "patterns": [ @@ -1494,6 +1538,9 @@ } }, "patterns": [ + { + "include": "#interpolation" + }, { "match": "\\d+", "name": "constant.numeric.scss" @@ -1509,32 +1556,14 @@ ] }, { - "match": "(?x)\n(:)\\b\n(link|visited|hover|active|focus|target|lang|disabled|enabled|checked|\nindeterminate|root|first-child|last-child|first-of-type|last-of-type|\nonly-child|only-of-type|empty|not|valid|invalid)\\b", - "captures": { - "0": { - "name": "entity.other.attribute-name.pseudo-class.css" - }, - "1": { - "name": "punctuation.definition.entity.css" - } - } + "include": "source.css#pseudo-classes" } ] }, - "selector_pseudo_element": { - "captures": { - "1": { - "name": "punctuation.definition.entity.css" - } - }, - "match": "(:+)((-(moz|webkit|ms)-)?(after|before|first-letter|first-line|selection))\\b", - "name": "entity.other.attribute-name.pseudo-element.css" - }, "selectors": { - "comment": "Stuff for Selectors.", "patterns": [ { - "include": "#selector_entities" + "include": "source.css#tag-names" }, { "include": "#selector_custom" @@ -1555,7 +1584,7 @@ "include": "#tag_parent_reference" }, { - "include": "#selector_pseudo_element" + "include": "source.css#pseudo-elements" }, { "include": "#selector_attribute" @@ -1669,5 +1698,5 @@ "name": "variable.scss" } }, - "version": "https://github.com/atom/language-sass/commit/63b3aa0ed8f25b80a109c110bdfbd9950bd0df27" + "version": "https://github.com/atom/language-sass/commit/f477576a0ff819657495142f7e64e577a837fadb" } \ No newline at end of file diff --git a/extensions/scss/test/colorize-results/test-cssvariables_scss.json b/extensions/scss/test/colorize-results/test-cssvariables_scss.json index 686e91d75e4..caf9d121a46 100644 --- a/extensions/scss/test/colorize-results/test-cssvariables_scss.json +++ b/extensions/scss/test/colorize-results/test-cssvariables_scss.json @@ -166,7 +166,7 @@ }, { "c": "(", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss punctuation.definition.begin.bracket.round.scss", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -264,8 +264,19 @@ } }, { - "c": ");", - "t": "source.css.scss meta.property-list.scss", + "c": ")", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss punctuation.definition.end.bracket.round.scss", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ";", + "t": "source.css.scss meta.property-list.scss punctuation.terminator.rule.scss", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -287,13 +298,13 @@ }, { "c": "body", - "t": "source.css.scss entity.name.tag.scss", + "t": "source.css.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -331,7 +342,7 @@ }, { "c": "padding-left", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", diff --git a/extensions/scss/test/colorize-results/test_scss.json b/extensions/scss/test/colorize-results/test_scss.json index 3310661788d..94003b0d826 100644 --- a/extensions/scss/test/colorize-results/test_scss.json +++ b/extensions/scss/test/colorize-results/test_scss.json @@ -254,7 +254,7 @@ }, { "c": "width", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -331,13 +331,13 @@ }, { "c": "p", - "t": "source.css.scss meta.property-list.scss entity.name.tag.scss", + "t": "source.css.scss meta.property-list.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -353,13 +353,13 @@ }, { "c": "div", - "t": "source.css.scss meta.property-list.scss entity.name.tag.scss", + "t": "source.css.scss meta.property-list.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -397,7 +397,7 @@ }, { "c": "font-size", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -474,13 +474,13 @@ }, { "c": "a", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss entity.name.tag.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -518,7 +518,7 @@ }, { "c": "font-weight", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -551,7 +551,7 @@ }, { "c": "bold", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.css", "r": { "dark_plus": "support.constant.property-value: #CE9178", "light_plus": "support.constant.property-value: #0451A5", @@ -628,13 +628,13 @@ }, { "c": "pre", - "t": "source.css.scss meta.property-list.scss entity.name.tag.scss", + "t": "source.css.scss meta.property-list.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -672,7 +672,7 @@ }, { "c": "font-size", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -859,7 +859,7 @@ }, { "c": "color", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -892,7 +892,7 @@ }, { "c": "black", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.constant.color.w3c-standard-color-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.constant.color.w3c-standard-color-name.css", "r": { "dark_plus": "support.constant.color: #CE9178", "light_plus": "support.constant.color: #0451A5", @@ -925,13 +925,13 @@ }, { "c": "a", - "t": "source.css.scss meta.property-list.scss entity.name.tag.scss", + "t": "source.css.scss meta.property-list.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -969,7 +969,7 @@ }, { "c": "font-weight", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -1002,7 +1002,7 @@ }, { "c": "bold", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.css", "r": { "dark_plus": "support.constant.property-value: #CE9178", "light_plus": "support.constant.property-value: #0451A5", @@ -1101,7 +1101,7 @@ }, { "c": "color", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -1134,7 +1134,7 @@ }, { "c": "red", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.color.w3c-standard-color-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.color.w3c-standard-color-name.css", "r": { "dark_plus": "support.constant.color: #CE9178", "light_plus": "support.constant.color: #0451A5", @@ -1299,13 +1299,13 @@ }, { "c": "font", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss entity.name.tag.css", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name: #FF0000", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name: #FF0000", - "hc_black": "support.type.property-name: #D4D4D4" + "dark_plus": "entity.name.tag.css: #D7BA7D", + "light_plus": "entity.name.tag: #800000", + "dark_vs": "entity.name.tag.css: #D7BA7D", + "light_vs": "entity.name.tag: #800000", + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -1409,7 +1409,7 @@ }, { "c": "family", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -1453,7 +1453,7 @@ }, { "c": "size", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -1530,7 +1530,7 @@ }, { "c": "weight", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -1563,7 +1563,7 @@ }, { "c": "bold", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.css", "r": { "dark_plus": "support.constant.property-value: #CE9178", "light_plus": "support.constant.property-value: #0451A5", @@ -1662,13 +1662,13 @@ }, { "c": "tr", - "t": "source.css.scss entity.name.tag.scss", + "t": "source.css.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -1728,13 +1728,13 @@ }, { "c": "foo", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss invalid.illegal.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss", "r": { - "dark_plus": "invalid: #F44747", - "light_plus": "invalid: #CD3131", - "dark_vs": "invalid: #F44747", - "light_vs": "invalid: #CD3131", - "hc_black": "invalid: #F44747" + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { @@ -1805,13 +1805,13 @@ }, { "c": "foo", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss invalid.illegal.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss", "r": { - "dark_plus": "invalid: #F44747", - "light_plus": "invalid: #CD3131", - "dark_vs": "invalid: #F44747", - "light_vs": "invalid: #CD3131", - "hc_black": "invalid: #F44747" + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { @@ -1904,13 +1904,13 @@ }, { "c": "foo", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss invalid.illegal.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss", "r": { - "dark_plus": "invalid: #F44747", - "light_plus": "invalid: #CD3131", - "dark_vs": "invalid: #F44747", - "light_vs": "invalid: #CD3131", - "hc_black": "invalid: #F44747" + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { @@ -2014,13 +2014,13 @@ }, { "c": "foo", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss invalid.illegal.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss", "r": { - "dark_plus": "invalid: #F44747", - "light_plus": "invalid: #CD3131", - "dark_vs": "invalid: #F44747", - "light_vs": "invalid: #CD3131", - "hc_black": "invalid: #F44747" + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { @@ -2113,13 +2113,13 @@ }, { "c": "foo", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss invalid.illegal.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss", "r": { - "dark_plus": "invalid: #F44747", - "light_plus": "invalid: #CD3131", - "dark_vs": "invalid: #F44747", - "light_vs": "invalid: #CD3131", - "hc_black": "invalid: #F44747" + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { @@ -2212,13 +2212,13 @@ }, { "c": "foo", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss invalid.illegal.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss", "r": { - "dark_plus": "invalid: #F44747", - "light_plus": "invalid: #CD3131", - "dark_vs": "invalid: #F44747", - "light_vs": "invalid: #CD3131", - "hc_black": "invalid: #F44747" + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { @@ -2465,13 +2465,13 @@ }, { "c": "body", - "t": "source.css.scss entity.name.tag.scss", + "t": "source.css.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -2509,7 +2509,7 @@ }, { "c": "color", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -2542,7 +2542,7 @@ }, { "c": "black", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.constant.color.w3c-standard-color-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.constant.color.w3c-standard-color-name.css", "r": { "dark_plus": "support.constant.color: #CE9178", "light_plus": "support.constant.color: #0451A5", @@ -2652,13 +2652,13 @@ }, { "c": "a", - "t": "source.css.scss entity.name.tag.scss", + "t": "source.css.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -2696,7 +2696,7 @@ }, { "c": "color", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -2729,7 +2729,7 @@ }, { "c": "green", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.constant.color.w3c-standard-color-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.constant.color.w3c-standard-color-name.css", "r": { "dark_plus": "support.constant.color: #CE9178", "light_plus": "support.constant.color: #0451A5", @@ -3103,7 +3103,7 @@ }, { "c": "width", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -3323,13 +3323,13 @@ }, { "c": "font", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss entity.name.tag.css", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name: #FF0000", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name: #FF0000", - "hc_black": "support.type.property-name: #D4D4D4" + "dark_plus": "entity.name.tag.css: #D7BA7D", + "light_plus": "entity.name.tag: #800000", + "dark_vs": "entity.name.tag.css: #D7BA7D", + "light_vs": "entity.name.tag: #800000", + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -3532,13 +3532,13 @@ }, { "c": "border", - "t": "source.css.scss meta.set.variable.scss support.type.property-name.scss", + "t": "source.css.scss meta.set.variable.scss support.constant.property-value.css", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name: #FF0000", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name: #FF0000", - "hc_black": "support.type.property-name: #D4D4D4" + "dark_plus": "support.constant.property-value: #CE9178", + "light_plus": "support.constant.property-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "support.constant.property-value: #0451A5", + "hc_black": "default: #FFFFFF" } }, { @@ -3554,13 +3554,13 @@ }, { "c": "p", - "t": "source.css.scss entity.name.tag.scss", + "t": "source.css.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -3674,7 +3674,7 @@ } }, { - "c": "-", + "c": "-color", "t": "source.css.scss meta.property-list.scss meta.property-name.scss", "r": { "dark_plus": "default: #D4D4D4", @@ -3684,17 +3684,6 @@ "hc_black": "default: #FFFFFF" } }, - { - "c": "color", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", - "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name: #FF0000", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name: #FF0000", - "hc_black": "support.type.property-name: #D4D4D4" - } - }, { "c": ":", "t": "source.css.scss meta.property-list.scss punctuation.separator.key-value.scss", @@ -3719,7 +3708,7 @@ }, { "c": "blue", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.constant.color.w3c-standard-color-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.constant.color.w3c-standard-color-name.css", "r": { "dark_plus": "support.constant.color: #CE9178", "light_plus": "support.constant.color: #0451A5", @@ -3873,7 +3862,7 @@ }, { "c": "100", - "t": "source.css.scss meta.set.variable.scss constant.numeric.color.rgb-value.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.scss", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -3906,7 +3895,7 @@ }, { "c": "100", - "t": "source.css.scss meta.set.variable.scss constant.numeric.color.rgb-value.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.scss", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -3939,7 +3928,7 @@ }, { "c": "225", - "t": "source.css.scss meta.set.variable.scss constant.numeric.color.rgb-value.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.scss", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4060,13 +4049,13 @@ }, { "c": "p", - "t": "source.css.scss entity.name.tag.scss", + "t": "source.css.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -4104,7 +4093,7 @@ }, { "c": "width", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -4137,7 +4126,7 @@ }, { "c": "(", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss punctuation.definition.begin.bracket.round.scss", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -4224,8 +4213,19 @@ } }, { - "c": ") ", - "t": "source.css.scss meta.property-list.scss", + "c": ")", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss punctuation.definition.end.bracket.round.scss", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -4236,18 +4236,40 @@ }, { "c": "*", - "t": "source.css.scss meta.property-list.scss entity.name.tag.wildcard.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.operator.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" } }, { - "c": " 3;", - "t": "source.css.scss meta.property-list.scss", + "c": " ", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "3", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "r": { + "dark_plus": "constant.numeric: #B5CEA8", + "light_plus": "constant.numeric: #09885A", + "dark_vs": "constant.numeric: #B5CEA8", + "light_vs": "constant.numeric: #09885A", + "hc_black": "constant.numeric: #B5CEA8" + } + }, + { + "c": ";", + "t": "source.css.scss meta.property-list.scss punctuation.terminator.rule.scss", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -4269,7 +4291,7 @@ }, { "c": "color", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -4401,7 +4423,7 @@ }, { "c": "font-family", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -4522,7 +4544,7 @@ }, { "c": "margin", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -4643,7 +4665,7 @@ }, { "c": "auto", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.css", "r": { "dark_plus": "support.constant.property-value: #CE9178", "light_plus": "support.constant.property-value: #0451A5", @@ -4676,13 +4698,13 @@ }, { "c": "content", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss entity.name.tag.css", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name: #FF0000", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name: #FF0000", - "hc_black": "support.type.property-name: #D4D4D4" + "dark_plus": "entity.name.tag.css: #D7BA7D", + "light_plus": "entity.name.tag: #800000", + "dark_vs": "entity.name.tag.css: #D7BA7D", + "light_vs": "entity.name.tag: #800000", + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -4852,7 +4874,7 @@ }, { "c": "color", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -5039,7 +5061,7 @@ }, { "c": "color", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -5709,7 +5731,7 @@ } }, { - "c": " (", + "c": " ", "t": "source.css.scss meta.property-list.scss meta.at-rule.return.scss", "r": { "dark_plus": "default: #D4D4D4", @@ -5719,6 +5741,17 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "(", + "t": "source.css.scss meta.property-list.scss meta.at-rule.return.scss punctuation.definition.begin.bracket.round.scss", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, { "c": "$n", "t": "source.css.scss meta.property-list.scss meta.at-rule.return.scss variable.scss", @@ -5775,7 +5808,18 @@ } }, { - "c": ") ", + "c": ")", + "t": "source.css.scss meta.property-list.scss meta.at-rule.return.scss punctuation.definition.end.bracket.round.scss", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", "t": "source.css.scss meta.property-list.scss meta.at-rule.return.scss", "r": { "dark_plus": "default: #D4D4D4", @@ -5897,7 +5941,7 @@ }, { "c": "width", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -6645,7 +6689,7 @@ }, { "c": "width", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -6787,7 +6831,7 @@ } }, { - "c": " (", + "c": " ", "t": "source.css.scss meta.property-list.scss meta.at-rule.media.scss", "r": { "dark_plus": "default: #D4D4D4", @@ -6797,9 +6841,20 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "(", + "t": "source.css.scss meta.property-list.scss meta.at-rule.media.scss meta.property-list.media-query.scss punctuation.definition.media-query.begin.bracket.round.scss", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, { "c": "orientation", - "t": "source.css.scss meta.property-list.scss meta.at-rule.media.scss support.type.property-name.media.css", + "t": "source.css.scss meta.property-list.scss meta.at-rule.media.scss meta.property-list.media-query.scss meta.property-name.media-query.scss support.type.property-name.media.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -6809,8 +6864,19 @@ } }, { - "c": ": ", - "t": "source.css.scss meta.property-list.scss meta.at-rule.media.scss", + "c": ":", + "t": "source.css.scss meta.property-list.scss meta.at-rule.media.scss meta.property-list.media-query.scss punctuation.separator.key-value.scss", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.css.scss meta.property-list.scss meta.at-rule.media.scss meta.property-list.media-query.scss", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -6821,7 +6887,7 @@ }, { "c": "landscape", - "t": "source.css.scss meta.property-list.scss meta.at-rule.media.scss support.constant.property-value.scss", + "t": "source.css.scss meta.property-list.scss meta.at-rule.media.scss meta.property-list.media-query.scss meta.property-value.media-query.scss support.constant.property-value.css", "r": { "dark_plus": "support.constant.property-value: #CE9178", "light_plus": "support.constant.property-value: #0451A5", @@ -6831,7 +6897,18 @@ } }, { - "c": ") ", + "c": ")", + "t": "source.css.scss meta.property-list.scss meta.at-rule.media.scss meta.property-list.media-query.scss punctuation.definition.media-query.end.bracket.round.scss", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", "t": "source.css.scss meta.property-list.scss meta.at-rule.media.scss", "r": { "dark_plus": "default: #D4D4D4", @@ -6865,7 +6942,7 @@ }, { "c": "width", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -7052,7 +7129,7 @@ }, { "c": "border", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -7162,7 +7239,7 @@ }, { "c": "background-color", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -7315,7 +7392,7 @@ } }, { - "c": " ", + "c": " .error", "t": "source.css.scss meta.property-list.scss meta.at-rule.import.scss", "r": { "dark_plus": "default: #D4D4D4", @@ -7325,28 +7402,6 @@ "hc_black": "default: #FFFFFF" } }, - { - "c": ".", - "t": "source.css.scss meta.property-list.scss meta.at-rule.import.scss entity.other.attribute-name.class.css punctuation.definition.entity.css", - "r": { - "dark_plus": "entity.other.attribute-name.class.css: #D7BA7D", - "light_plus": "entity.other.attribute-name.class.css: #800000", - "dark_vs": "entity.other.attribute-name.class.css: #D7BA7D", - "light_vs": "entity.other.attribute-name.class.css: #800000", - "hc_black": "entity.other.attribute-name.class.css: #D7BA7D" - } - }, - { - "c": "error", - "t": "source.css.scss meta.property-list.scss meta.at-rule.import.scss entity.other.attribute-name.class.css", - "r": { - "dark_plus": "entity.other.attribute-name.class.css: #D7BA7D", - "light_plus": "entity.other.attribute-name.class.css: #800000", - "dark_vs": "entity.other.attribute-name.class.css: #D7BA7D", - "light_vs": "entity.other.attribute-name.class.css: #800000", - "hc_black": "entity.other.attribute-name.class.css: #D7BA7D" - } - }, { "c": ";", "t": "source.css.scss meta.property-list.scss", @@ -7371,7 +7426,7 @@ }, { "c": "border-width", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -7469,7 +7524,7 @@ } }, { - "c": " ", + "c": " a", "t": "source.css.scss", "r": { "dark_plus": "default: #D4D4D4", @@ -7479,20 +7534,9 @@ "hc_black": "default: #FFFFFF" } }, - { - "c": "a", - "t": "source.css.scss entity.name.tag.scss", - "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" - } - }, { "c": "%", - "t": "source.css.scss entity.other.attribute-name.placeholder.scss punctuation.definition.entity.scss", + "t": "source.css.scss entity.other.attribute-name.placeholder.css punctuation.definition.entity.css", "r": { "dark_plus": "entity.other.attribute-name: #9CDCFE", "light_plus": "entity.other.attribute-name: #FF0000", @@ -7503,7 +7547,7 @@ }, { "c": "extreme", - "t": "source.css.scss entity.other.attribute-name.placeholder.scss", + "t": "source.css.scss entity.other.attribute-name.placeholder.css", "r": { "dark_plus": "entity.other.attribute-name: #9CDCFE", "light_plus": "entity.other.attribute-name: #FF0000", @@ -7547,7 +7591,7 @@ }, { "c": "color", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -7580,7 +7624,7 @@ }, { "c": "blue", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.constant.color.w3c-standard-color-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.constant.color.w3c-standard-color-name.css", "r": { "dark_plus": "support.constant.color: #CE9178", "light_plus": "support.constant.color: #0451A5", @@ -7613,7 +7657,7 @@ }, { "c": "font-weight", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -7646,7 +7690,7 @@ }, { "c": "bold", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.css", "r": { "dark_plus": "support.constant.property-value: #CE9178", "light_plus": "support.constant.property-value: #0451A5", @@ -7679,7 +7723,7 @@ }, { "c": "font-size", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -7844,7 +7888,7 @@ }, { "c": "%", - "t": "source.css.scss meta.property-list.scss meta.at-rule.import.scss entity.other.attribute-name.placeholder.scss punctuation.definition.entity.scss", + "t": "source.css.scss meta.property-list.scss meta.at-rule.import.scss entity.other.attribute-name.placeholder.css punctuation.definition.entity.css", "r": { "dark_plus": "entity.other.attribute-name: #9CDCFE", "light_plus": "entity.other.attribute-name: #FF0000", @@ -7855,7 +7899,7 @@ }, { "c": "extreme", - "t": "source.css.scss meta.property-list.scss meta.at-rule.import.scss entity.other.attribute-name.placeholder.scss", + "t": "source.css.scss meta.property-list.scss meta.at-rule.import.scss entity.other.attribute-name.placeholder.css", "r": { "dark_plus": "entity.other.attribute-name: #9CDCFE", "light_plus": "entity.other.attribute-name: #FF0000", @@ -8889,7 +8933,7 @@ }, { "c": "position", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -8922,7 +8966,7 @@ }, { "c": "relative", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.css", "r": { "dark_plus": "support.constant.property-value: #CE9178", "light_plus": "support.constant.property-value: #0451A5", @@ -8955,7 +8999,7 @@ }, { "c": "left", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -9021,7 +9065,7 @@ }, { "c": "top", - "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -9153,13 +9197,13 @@ }, { "c": "p", - "t": "source.css.scss entity.name.tag.scss", + "t": "source.css.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -9362,7 +9406,7 @@ }, { "c": "border", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -9428,7 +9472,7 @@ }, { "c": "solid", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.css", "r": { "dark_plus": "support.constant.property-value: #CE9178", "light_plus": "support.constant.property-value: #0451A5", @@ -9604,7 +9648,7 @@ }, { "c": "border", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -9670,7 +9714,7 @@ }, { "c": "dotted", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.css", "r": { "dark_plus": "support.constant.property-value: #CE9178", "light_plus": "support.constant.property-value: #0451A5", @@ -9746,29 +9790,7 @@ } }, { - "c": " ", - "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "null", - "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss support.constant.property-value.scss", - "r": { - "dark_plus": "support.constant.property-value: #CE9178", - "light_plus": "support.constant.property-value: #0451A5", - "dark_vs": "default: #D4D4D4", - "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": " ", + "c": " null ", "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss", "r": { "dark_plus": "default: #D4D4D4", @@ -9802,7 +9824,7 @@ }, { "c": "border", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -9868,7 +9890,7 @@ }, { "c": "double", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.css", "r": { "dark_plus": "support.constant.property-value: #CE9178", "light_plus": "support.constant.property-value: #0451A5", @@ -10000,13 +10022,13 @@ }, { "c": "p", - "t": "source.css.scss entity.name.tag.scss", + "t": "source.css.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -10143,7 +10165,7 @@ }, { "c": "color", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -10176,7 +10198,7 @@ }, { "c": "blue", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.color.w3c-standard-color-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.color.w3c-standard-color-name.css", "r": { "dark_plus": "support.constant.color: #CE9178", "light_plus": "support.constant.color: #0451A5", @@ -10275,7 +10297,7 @@ }, { "c": "color", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -10308,7 +10330,7 @@ }, { "c": "black", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.color.w3c-standard-color-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.color.w3c-standard-color-name.css", "r": { "dark_plus": "support.constant.color: #CE9178", "light_plus": "support.constant.color: #0451A5", @@ -10649,7 +10671,7 @@ }, { "c": "width", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -11034,7 +11056,7 @@ }, { "c": "background-image", - "t": "source.css.scss meta.at-rule.each.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -11507,7 +11529,7 @@ }, { "c": "width", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -12122,7 +12144,7 @@ } }, { - "c": " (", + "c": " ", "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss", "r": { "dark_plus": "default: #D4D4D4", @@ -12132,6 +12154,17 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "(", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss punctuation.definition.begin.bracket.round.scss", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, { "c": "unit", "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss support.function.misc.scss", @@ -12177,29 +12210,7 @@ } }, { - "c": " ", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "==", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss keyword.operator.comparison.scss", - "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", - "hc_black": "keyword.operator: #D4D4D4" - } - }, - { - "c": " ", + "c": " == ", "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss", "r": { "dark_plus": "default: #D4D4D4", @@ -12243,7 +12254,18 @@ } }, { - "c": ") ", + "c": ")", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss punctuation.definition.end.bracket.round.scss", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss", "r": { "dark_plus": "default: #D4D4D4", @@ -12265,7 +12287,7 @@ } }, { - "c": " (", + "c": " ", "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss", "r": { "dark_plus": "default: #D4D4D4", @@ -12275,6 +12297,17 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "(", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss punctuation.definition.begin.bracket.round.scss", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, { "c": "$i", "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss variable.scss", @@ -12287,7 +12320,7 @@ } }, { - "c": " ", + "c": " == ", "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss", "r": { "dark_plus": "default: #D4D4D4", @@ -12298,19 +12331,8 @@ } }, { - "c": "==", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss keyword.operator.comparison.scss", - "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", - "hc_black": "keyword.operator: #D4D4D4" - } - }, - { - "c": " (", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss", + "c": "(", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss punctuation.definition.begin.bracket.round.scss", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -12375,7 +12397,18 @@ } }, { - "c": ")) ", + "c": "))", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss punctuation.definition.end.bracket.round.scss", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss", "r": { "dark_plus": "default: #D4D4D4", @@ -12794,13 +12827,13 @@ }, { "c": "font", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss entity.name.tag.css", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name: #FF0000", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name: #FF0000", - "hc_black": "support.type.property-name: #D4D4D4" + "dark_plus": "entity.name.tag.css: #D7BA7D", + "light_plus": "entity.name.tag: #800000", + "dark_vs": "entity.name.tag.css: #D7BA7D", + "light_vs": "entity.name.tag: #800000", + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -12838,7 +12871,7 @@ }, { "c": "family", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -12871,7 +12904,7 @@ }, { "c": "Arial", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.font-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.font-name.css", "r": { "dark_plus": "support.constant.font-name: #CE9178", "light_plus": "support.constant.font-name: #0451A5", @@ -12904,7 +12937,7 @@ }, { "c": "size", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -12981,7 +13014,7 @@ }, { "c": "weight", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -13014,7 +13047,7 @@ }, { "c": "bold", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.css", "r": { "dark_plus": "support.constant.property-value: #CE9178", "light_plus": "support.constant.property-value: #0451A5", @@ -13069,7 +13102,7 @@ }, { "c": "color", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -13267,7 +13300,7 @@ }, { "c": "padding", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -13553,7 +13586,7 @@ }, { "c": "border", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -13597,7 +13630,7 @@ }, { "c": "color", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -13663,7 +13696,7 @@ }, { "c": "width", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -13729,13 +13762,13 @@ }, { "c": "style", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss entity.name.tag.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -13762,7 +13795,7 @@ }, { "c": "dashed", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss support.constant.property-value.css", "r": { "dark_plus": "support.constant.property-value: #CE9178", "light_plus": "support.constant.property-value: #0451A5", @@ -13817,13 +13850,13 @@ }, { "c": "p", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss entity.name.tag.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -13916,7 +13949,7 @@ }, { "c": "blue", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss support.constant.color.w3c-standard-color-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss support.constant.color.w3c-standard-color-name.css", "r": { "dark_plus": "support.constant.color: #CE9178", "light_plus": "support.constant.color: #0451A5", @@ -14114,13 +14147,13 @@ }, { "c": "-moz-box-shadow", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.vendored.property-name.css", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name: #FF0000", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name: #FF0000", - "hc_black": "support.type.property-name: #D4D4D4" + "dark_plus": "support.type.vendored.property-name: #9CDCFE", + "light_plus": "support.type.vendored.property-name: #FF0000", + "dark_vs": "support.type.vendored.property-name: #9CDCFE", + "light_vs": "support.type.vendored.property-name: #FF0000", + "hc_black": "support.type.vendored.property-name: #D4D4D4" } }, { @@ -14180,13 +14213,13 @@ }, { "c": "-webkit-box-shadow", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.vendored.property-name.css", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name: #FF0000", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name: #FF0000", - "hc_black": "support.type.property-name: #D4D4D4" + "dark_plus": "support.type.vendored.property-name: #9CDCFE", + "light_plus": "support.type.vendored.property-name: #FF0000", + "dark_vs": "support.type.vendored.property-name: #9CDCFE", + "light_vs": "support.type.vendored.property-name: #FF0000", + "hc_black": "support.type.vendored.property-name: #D4D4D4" } }, { @@ -14246,7 +14279,7 @@ }, { "c": "box-shadow", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -14895,7 +14928,7 @@ }, { "c": "color", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -14961,7 +14994,7 @@ }, { "c": "background-color", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -15027,7 +15060,7 @@ }, { "c": "border-color", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -15511,13 +15544,13 @@ }, { "c": "html", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss entity.name.tag.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -15742,7 +15775,7 @@ }, { "c": "background-image", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -16105,13 +16138,13 @@ }, { "c": "=", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.attribute-selector.scss punctuation.separator.operator.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.attribute-selector.scss keyword.operator.scss", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" } }, { @@ -16127,13 +16160,13 @@ }, { "c": "external", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.attribute-selector.scss string.quoted.double.attribute-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.attribute-selector.scss", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { @@ -16215,13 +16248,13 @@ }, { "c": "content", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss entity.name.tag.css", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name: #FF0000", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name: #FF0000", - "hc_black": "support.type.property-name: #D4D4D4" + "dark_plus": "entity.name.tag.css: #D7BA7D", + "light_plus": "entity.name.tag: #800000", + "dark_vs": "entity.name.tag.css: #D7BA7D", + "light_vs": "entity.name.tag: #800000", + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -16413,7 +16446,7 @@ }, { "c": "margin-left", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -16490,7 +16523,7 @@ }, { "c": "margin-right", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -16600,13 +16633,13 @@ }, { "c": "tr", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss entity.name.tag.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -16666,13 +16699,13 @@ }, { "c": "foo", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss invalid.illegal.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss", "r": { - "dark_plus": "invalid: #F44747", - "light_plus": "invalid: #CD3131", - "dark_vs": "invalid: #F44747", - "light_vs": "invalid: #CD3131", - "hc_black": "invalid: #F44747" + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { @@ -16820,7 +16853,7 @@ }, { "c": "white", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss support.constant.color.w3c-standard-color-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss support.constant.color.w3c-standard-color-name.css", "r": { "dark_plus": "support.constant.color: #CE9178", "light_plus": "support.constant.color: #0451A5", @@ -16864,7 +16897,7 @@ }, { "c": "default", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss support.constant.property-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss support.constant.property-value.css", "r": { "dark_plus": "support.constant.property-value: #CE9178", "light_plus": "support.constant.property-value: #0451A5", @@ -16963,7 +16996,7 @@ }, { "c": "black", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss support.constant.color.w3c-standard-color-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss support.constant.color.w3c-standard-color-name.css", "r": { "dark_plus": "support.constant.color: #CE9178", "light_plus": "support.constant.color: #0451A5", @@ -17029,7 +17062,7 @@ }, { "c": "margin-top", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -17073,7 +17106,7 @@ }, { "c": "margin-bottom", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -17128,7 +17161,7 @@ }, { "c": "margin-top", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -17314,7 +17347,7 @@ } }, { - "c": " ", + "c": " false", "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.mixin.scss", "r": { "dark_plus": "default: #D4D4D4", @@ -17324,17 +17357,6 @@ "hc_black": "default: #FFFFFF" } }, - { - "c": "false", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.mixin.scss support.constant.property-value.scss", - "r": { - "dark_plus": "support.constant.property-value: #CE9178", - "light_plus": "support.constant.property-value: #0451A5", - "dark_vs": "default: #D4D4D4", - "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" - } - }, { "c": ")", "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.mixin.scss punctuation.definition.parameters.end.bracket.round.scss", @@ -17402,7 +17424,7 @@ } }, { - "c": " ", + "c": " .", "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.import.scss", "r": { "dark_plus": "default: #D4D4D4", @@ -17412,31 +17434,20 @@ "hc_black": "default: #FFFFFF" } }, - { - "c": ".", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.import.scss entity.other.attribute-name.class.css punctuation.definition.entity.css", - "r": { - "dark_plus": "entity.other.attribute-name.class.css: #D7BA7D", - "light_plus": "entity.other.attribute-name.class.css: #800000", - "dark_vs": "entity.other.attribute-name.class.css: #D7BA7D", - "light_vs": "entity.other.attribute-name.class.css: #800000", - "hc_black": "entity.other.attribute-name.class.css: #D7BA7D" - } - }, { "c": "#{", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.import.scss entity.other.attribute-name.class.css variable.interpolation.scss punctuation.definition.interpolation.begin.bracket.curly.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.import.scss variable.interpolation.scss punctuation.definition.interpolation.begin.bracket.curly.scss", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", - "dark_vs": "entity.other.attribute-name.class.css: #D7BA7D", - "light_vs": "entity.other.attribute-name.class.css: #800000", - "hc_black": "entity.other.attribute-name.class.css: #D7BA7D" + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { "c": "$a", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.import.scss entity.other.attribute-name.class.css variable.interpolation.scss variable.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.import.scss variable.interpolation.scss variable.scss", "r": { "dark_plus": "variable.scss: #9CDCFE", "light_plus": "variable.scss: #FF0000", @@ -17447,13 +17458,13 @@ }, { "c": "}", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.import.scss entity.other.attribute-name.class.css variable.interpolation.scss punctuation.definition.interpolation.end.bracket.curly.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.import.scss variable.interpolation.scss punctuation.definition.interpolation.end.bracket.curly.scss", "r": { "dark_plus": "variable: #9CDCFE", "light_plus": "variable: #001080", - "dark_vs": "entity.other.attribute-name.class.css: #D7BA7D", - "light_vs": "entity.other.attribute-name.class.css: #800000", - "hc_black": "entity.other.attribute-name.class.css: #D7BA7D" + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { @@ -17612,13 +17623,13 @@ }, { "c": "a", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss entity.name.tag.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -17733,13 +17744,13 @@ }, { "c": "b", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss entity.name.tag.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss entity.name.tag.css", "r": { - "dark_plus": "entity.name.tag: #569CD6", + "dark_plus": "entity.name.tag.css: #D7BA7D", "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", + "dark_vs": "entity.name.tag.css: #D7BA7D", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { @@ -17810,13 +17821,13 @@ }, { "c": "foo", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss invalid.illegal.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss", "r": { - "dark_plus": "invalid: #F44747", - "light_plus": "invalid: #CD3131", - "dark_vs": "invalid: #F44747", - "light_vs": "invalid: #CD3131", - "hc_black": "invalid: #F44747" + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { @@ -18063,7 +18074,7 @@ }, { "c": "font-family", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -18129,7 +18140,7 @@ }, { "c": "src", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -18425,7 +18436,7 @@ } }, { - "c": "-", + "c": "-style", "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss", "r": { "dark_plus": "default: #D4D4D4", @@ -18435,17 +18446,6 @@ "hc_black": "default: #FFFFFF" } }, - { - "c": "style", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", - "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name: #FF0000", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name: #FF0000", - "hc_black": "support.type.property-name: #D4D4D4" - } - }, { "c": ":", "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss punctuation.separator.key-value.scss", @@ -18503,13 +18503,13 @@ }, { "c": "foo-", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss invalid.illegal.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss", "r": { - "dark_plus": "invalid: #F44747", - "light_plus": "invalid: #CD3131", - "dark_vs": "invalid: #F44747", - "light_vs": "invalid: #CD3131", - "hc_black": "invalid: #F44747" + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { @@ -18635,13 +18635,13 @@ }, { "c": "-bar-", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss invalid.illegal.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss", "r": { - "dark_plus": "invalid: #F44747", - "light_plus": "invalid: #CD3131", - "dark_vs": "invalid: #F44747", - "light_vs": "invalid: #CD3131", - "hc_black": "invalid: #F44747" + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { @@ -18734,13 +18734,13 @@ }, { "c": "foo-", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss invalid.illegal.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss", "r": { - "dark_plus": "invalid: #F44747", - "light_plus": "invalid: #CD3131", - "dark_vs": "invalid: #F44747", - "light_vs": "invalid: #CD3131", - "hc_black": "invalid: #F44747" + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { @@ -18778,13 +18778,13 @@ }, { "c": "-bar", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss invalid.illegal.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss", "r": { - "dark_plus": "invalid: #F44747", - "light_plus": "invalid: #CD3131", - "dark_vs": "invalid: #F44747", - "light_vs": "invalid: #CD3131", - "hc_black": "invalid: #F44747" + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { @@ -18976,7 +18976,7 @@ }, { "c": "opacity", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -19108,7 +19108,7 @@ }, { "c": "opacity", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -19295,7 +19295,7 @@ }, { "c": "opacity", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -19427,7 +19427,7 @@ }, { "c": "opacity", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -19526,13 +19526,13 @@ }, { "c": "-o-keyframes", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss invalid.illegal.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-name.scss support.type.vendored.property-name.css", "r": { - "dark_plus": "invalid: #F44747", - "light_plus": "invalid: #CD3131", - "dark_vs": "invalid: #F44747", - "light_vs": "invalid: #CD3131", - "hc_black": "invalid: #F44747" + "dark_plus": "support.type.vendored.property-name: #9CDCFE", + "light_plus": "support.type.vendored.property-name: #FF0000", + "dark_vs": "support.type.vendored.property-name: #9CDCFE", + "light_vs": "support.type.vendored.property-name: #FF0000", + "hc_black": "support.type.vendored.property-name: #D4D4D4" } }, { @@ -19614,7 +19614,7 @@ }, { "c": "opacity", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -19724,7 +19724,7 @@ }, { "c": "opacity", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -19933,7 +19933,7 @@ }, { "c": "opacity", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -20065,7 +20065,7 @@ }, { "c": "opacity", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-name.scss support.type.property-name.css", "r": { "dark_plus": "support.type.property-name: #9CDCFE", "light_plus": "support.type.property-name: #FF0000", @@ -20208,18 +20208,18 @@ }, { "c": "=", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.attribute-selector.scss punctuation.separator.operator.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.attribute-selector.scss keyword.operator.scss", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" } }, { "c": "'", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.attribute-selector.scss string.quoted.double.attribute-value.scss punctuation.definition.string.begin.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.attribute-selector.scss string.quoted.single.attribute-value.scss punctuation.definition.string.begin.scss", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -20230,18 +20230,18 @@ }, { "c": "test-1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.attribute-selector.scss string.quoted.double.attribute-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.attribute-selector.scss", "r": { - "dark_plus": "string: #CE9178", - "light_plus": "string: #A31515", - "dark_vs": "string: #CE9178", - "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { "c": "'", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.attribute-selector.scss string.quoted.double.attribute-value.scss punctuation.definition.string.end.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.attribute-selector.scss string.quoted.single.attribute-value.scss punctuation.definition.string.end.scss", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -20318,13 +20318,13 @@ }, { "c": "content", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-name.scss support.type.property-name.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss entity.name.tag.css", "r": { - "dark_plus": "support.type.property-name: #9CDCFE", - "light_plus": "support.type.property-name: #FF0000", - "dark_vs": "support.type.property-name: #9CDCFE", - "light_vs": "support.type.property-name: #FF0000", - "hc_black": "support.type.property-name: #D4D4D4" + "dark_plus": "entity.name.tag.css: #D7BA7D", + "light_plus": "entity.name.tag: #800000", + "dark_vs": "entity.name.tag.css: #D7BA7D", + "light_vs": "entity.name.tag: #800000", + "hc_black": "entity.name.tag.css: #D7BA7D" } }, { From 8b77c7170fff27f820eb216a79c6313ab7f71052 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 18 May 2017 10:35:46 +0200 Subject: [PATCH 0567/1164] [less] update grammar --- extensions/less/syntaxes/less.tmLanguage.json | 119 ++++-------------- .../test/colorize-results/14119_less.json | 12 +- .../test-cssvariables_less.json | 86 ++++++++----- .../less/test/colorize-results/test_less.json | 51 +++++--- 4 files changed, 116 insertions(+), 152 deletions(-) diff --git a/extensions/less/syntaxes/less.tmLanguage.json b/extensions/less/syntaxes/less.tmLanguage.json index f9605e2f845..902eb4e8d01 100644 --- a/extensions/less/syntaxes/less.tmLanguage.json +++ b/extensions/less/syntaxes/less.tmLanguage.json @@ -209,7 +209,7 @@ "include": "#brace_round" }, { - "include": "#commas" + "include": "source.css#commas" }, { "include": "#strings" @@ -241,8 +241,7 @@ "name": "meta.at-rule.media.css" }, { - "match": "\\b(width|scan|resolution|orientation|monochrome|min-width|min-resolution|min-monochrome|min-height|min-device-width|min-device-height|min-device-aspect-ratio|min-color-index|min-color|min-aspect-ratio|max-width|max-resolution|max-monochrome|max-height|max-device-width|max-device-height|max-device-aspect-ratio|max-color-index|max-color|max-aspect-ratio|height|grid|device-width|device-height|device-aspect-ratio|color-index|color|aspect-ratio)\\b", - "name": "support.type.property-name.media-feature.media.css" + "include": "source.css#media-features" }, { "match": "\\b(tv|tty|screen|projection|print|handheld|embossed|braille|aural|all)\\b", @@ -309,19 +308,22 @@ "name": "meta.property-list.css", "patterns": [ { - "include": "#pseudo_elements" + "include": "source.css#pseudo-elements" }, { - "include": "#pseudo_classes" + "include": "source.css#pseudo-classes" + }, + { + "include": "source.css#tag-names" + }, + { + "include": "source.css#commas" }, { "include": "#variable_interpolation" }, { - "include": "#property_names" - }, - { - "include": "#property_names_svg" + "include": "source.css#property-names" }, { "include": "#property_values" @@ -344,22 +346,17 @@ "name": "keyword.control.logical.operator.less" }, { - "match": "(?x)\n(? Date: Thu, 18 May 2017 10:50:30 +0200 Subject: [PATCH 0568/1164] test fixes for #17178 --- .../bat/test/colorize-results/test_bat.json | 10 +- .../test/colorize-results/test_clj.json | 40 +- .../colorize-results/test-regex_coffee.json | 8 +- .../test/colorize-results/test_coffee.json | 60 +-- .../cpp/test/colorize-results/test_c.json | 36 +- .../cpp/test/colorize-results/test_cc.json | 38 +- .../cpp/test/colorize-results/test_cpp.json | 26 +- .../csharp/test/colorize-results/test_cs.json | 26 +- .../colorize-results/test-variables_css.json | 10 +- .../css/test/colorize-results/test_css.json | 182 ++++---- .../fsharp/test/colorize-results/test_fs.json | 16 +- .../test/colorize-results/test-13777_go.json | 2 +- .../go/test/colorize-results/test_go.json | 24 +- .../test/colorize-results/test_groovy.json | 216 ++++----- .../colorize-results/test_handlebars.json | 88 ++-- .../test/colorize-results/test_hbs.json | 94 ++-- .../hlsl/test/colorize-results/test_hlsl.json | 8 +- .../test/colorize-results/12750_html.json | 8 +- .../test/colorize-results/25920_html.json | 2 +- .../html/test/colorize-results/test_html.json | 34 +- .../test/colorize-results/basic_java.json | 54 +-- .../test/colorize-results/test6916_js.json | 30 +- .../test/colorize-results/test_js.json | 142 +++--- .../test/colorize-results/test_jsx.json | 74 +-- .../test-cssvariables_less.json | 10 +- .../less/test/colorize-results/test_less.json | 42 +- .../lua/test/colorize-results/test_lua.json | 30 +- .../make/test/colorize-results/makefile.json | 42 +- .../test/colorize-results/test_m.json | 86 ++-- .../perl/test/colorize-results/test2_pl.json | 228 ++++----- .../perl/test/colorize-results/test_pl.json | 128 ++--- .../php/test/colorize-results/test_php.json | 136 +++--- .../test/colorize-results/test_ps1.json | 82 ++-- .../pug/test/colorize-results/test_pug.json | 28 +- .../python/test/colorize-results/test_py.json | 136 +++--- .../r/test/colorize-results/test_r.json | 12 +- .../test/colorize-results/test_cshtml.json | 56 +-- .../ruby/test/colorize-results/test_rb.json | 104 ++--- .../test/colorize-results/test-6611_rs.json | 8 +- .../rust/test/colorize-results/test_rs.json | 18 +- .../test-cssvariables_scss.json | 6 +- .../scss/test/colorize-results/test_scss.json | 416 ++++++++--------- .../test/colorize-results/test_shader.json | 14 +- .../test/colorize-results/test_sh.json | 88 ++-- .../sql/test/colorize-results/test_sql.json | 2 +- .../test/colorize-results/test_swift.json | 8 +- .../colorize-results/test-brackets_tsx.json | 16 +- .../test-function-inv_ts.json | 12 +- .../colorize-results/test-issue11_ts.json | 104 ++--- .../colorize-results/test-issue5431_ts.json | 18 +- .../colorize-results/test-issue5465_ts.json | 6 +- .../colorize-results/test-issue5566_ts.json | 8 +- .../colorize-results/test-keywords_ts.json | 6 +- .../colorize-results/test-members_ts.json | 14 +- .../test-object-literals_ts.json | 16 +- .../colorize-results/test-strings_ts.json | 20 +- .../test/colorize-results/test-this_ts.json | 2 +- .../test/colorize-results/test_ts.json | 438 +++++++++--------- .../vb/test/colorize-results/test_vb.json | 94 ++-- .../yaml/test/colorize-results/test_yaml.json | 16 +- 60 files changed, 1839 insertions(+), 1839 deletions(-) diff --git a/extensions/bat/test/colorize-results/test_bat.json b/extensions/bat/test/colorize-results/test_bat.json index f69d64df672..d909fe69bef 100644 --- a/extensions/bat/test/colorize-results/test_bat.json +++ b/extensions/bat/test/colorize-results/test_bat.json @@ -95,7 +95,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -106,7 +106,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -139,7 +139,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -161,7 +161,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -216,7 +216,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { diff --git a/extensions/clojure/test/colorize-results/test_clj.json b/extensions/clojure/test/colorize-results/test_clj.json index 11324fed559..190c08af9f3 100644 --- a/extensions/clojure/test/colorize-results/test_clj.json +++ b/extensions/clojure/test/colorize-results/test_clj.json @@ -40,7 +40,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -161,7 +161,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -700,7 +700,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -942,7 +942,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -975,7 +975,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1063,7 +1063,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1118,7 +1118,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1195,7 +1195,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1646,7 +1646,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1734,7 +1734,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1866,7 +1866,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1987,7 +1987,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2130,7 +2130,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2218,7 +2218,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2427,7 +2427,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2570,7 +2570,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2680,7 +2680,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2768,7 +2768,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2823,7 +2823,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2999,7 +2999,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { diff --git a/extensions/coffeescript/test/colorize-results/test-regex_coffee.json b/extensions/coffeescript/test/colorize-results/test-regex_coffee.json index 298c569afaa..99cd587f50d 100644 --- a/extensions/coffeescript/test/colorize-results/test-regex_coffee.json +++ b/extensions/coffeescript/test/colorize-results/test-regex_coffee.json @@ -7,7 +7,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -183,7 +183,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -304,7 +304,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -359,7 +359,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/coffeescript/test/colorize-results/test_coffee.json b/extensions/coffeescript/test/colorize-results/test_coffee.json index ddc88670619..0dd197a1337 100644 --- a/extensions/coffeescript/test/colorize-results/test_coffee.json +++ b/extensions/coffeescript/test/colorize-results/test_coffee.json @@ -62,7 +62,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -84,7 +84,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -117,7 +117,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -161,7 +161,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -194,7 +194,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -238,7 +238,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -293,7 +293,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -348,7 +348,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -370,7 +370,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -392,7 +392,7 @@ "light_plus": "entity.other.inherited-class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.other.inherited-class: #4EC9B0" } }, { @@ -414,7 +414,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -447,7 +447,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -491,7 +491,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -546,7 +546,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -579,7 +579,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -645,7 +645,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -700,7 +700,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -722,7 +722,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -766,7 +766,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -788,7 +788,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -865,7 +865,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -887,7 +887,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -909,7 +909,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -997,7 +997,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1041,7 +1041,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1118,7 +1118,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1151,7 +1151,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1173,7 +1173,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1206,7 +1206,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1448,7 +1448,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { diff --git a/extensions/cpp/test/colorize-results/test_c.json b/extensions/cpp/test/colorize-results/test_c.json index 746ba3324f7..d3bac881c43 100644 --- a/extensions/cpp/test/colorize-results/test_c.json +++ b/extensions/cpp/test/colorize-results/test_c.json @@ -73,7 +73,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -84,7 +84,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -139,7 +139,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -150,7 +150,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -271,7 +271,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -524,7 +524,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -612,7 +612,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -931,7 +931,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1107,7 +1107,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1305,7 +1305,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1437,7 +1437,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1624,7 +1624,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1646,7 +1646,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1910,7 +1910,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -2097,7 +2097,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2295,7 +2295,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -2438,7 +2438,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -2724,7 +2724,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { diff --git a/extensions/cpp/test/colorize-results/test_cc.json b/extensions/cpp/test/colorize-results/test_cc.json index ba1667e092d..3f7be3caeb8 100644 --- a/extensions/cpp/test/colorize-results/test_cc.json +++ b/extensions/cpp/test/colorize-results/test_cc.json @@ -7,7 +7,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -18,7 +18,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -40,7 +40,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "meta.preprocessor: #569CD6", "light_vs": "meta.preprocessor: #0000FF", - "hc_black": "meta.preprocessor: #569CD6" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -62,7 +62,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -194,7 +194,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -359,7 +359,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -524,7 +524,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -623,7 +623,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -634,7 +634,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -678,7 +678,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -755,7 +755,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -843,7 +843,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -975,7 +975,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1206,7 +1206,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1228,7 +1228,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1316,7 +1316,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1492,7 +1492,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1558,7 +1558,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1767,7 +1767,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { diff --git a/extensions/cpp/test/colorize-results/test_cpp.json b/extensions/cpp/test/colorize-results/test_cpp.json index 2e0c66b817e..8527e98a4f2 100644 --- a/extensions/cpp/test/colorize-results/test_cpp.json +++ b/extensions/cpp/test/colorize-results/test_cpp.json @@ -29,7 +29,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -40,7 +40,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -95,7 +95,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -139,7 +139,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -183,7 +183,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -337,7 +337,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -458,7 +458,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -513,7 +513,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -623,7 +623,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -876,7 +876,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -986,7 +986,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1184,7 +1184,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1239,7 +1239,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { diff --git a/extensions/csharp/test/colorize-results/test_cs.json b/extensions/csharp/test/colorize-results/test_cs.json index 89d2fa8ff3b..1bb74d46cd0 100644 --- a/extensions/csharp/test/colorize-results/test_cs.json +++ b/extensions/csharp/test/colorize-results/test_cs.json @@ -29,7 +29,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -73,7 +73,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -128,7 +128,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -216,7 +216,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -755,7 +755,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -832,7 +832,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -854,7 +854,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -975,7 +975,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1074,7 +1074,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1151,7 +1151,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1173,7 +1173,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1195,7 +1195,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1272,7 +1272,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/css/test/colorize-results/test-variables_css.json b/extensions/css/test/colorize-results/test-variables_css.json index 0c1eb979025..218818607d4 100644 --- a/extensions/css/test/colorize-results/test-variables_css.json +++ b/extensions/css/test/colorize-results/test-variables_css.json @@ -205,7 +205,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -227,7 +227,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -359,7 +359,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -425,7 +425,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -447,7 +447,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/css/test/colorize-results/test_css.json b/extensions/css/test/colorize-results/test_css.json index 1afdf71cd02..6daa830028e 100644 --- a/extensions/css/test/colorize-results/test_css.json +++ b/extensions/css/test/colorize-results/test_css.json @@ -238,7 +238,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -249,7 +249,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -315,7 +315,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -326,7 +326,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -348,7 +348,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -425,7 +425,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -436,7 +436,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -458,7 +458,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -887,7 +887,7 @@ "light_plus": "support.constant.font-name: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.font-name: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.font-name: #CE9178" } }, { @@ -920,7 +920,7 @@ "light_plus": "support.constant.font-name: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.font-name: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.font-name: #CE9178" } }, { @@ -1052,7 +1052,7 @@ "light_plus": "constant.other.color.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.color.rgb-value: #0451A5", - "hc_black": "constant.other.color.rgb-value: #B5CEA8" + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -1063,7 +1063,7 @@ "light_plus": "constant.other.color.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.color.rgb-value: #0451A5", - "hc_black": "constant.other.color.rgb-value: #B5CEA8" + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -1129,7 +1129,7 @@ "light_plus": "constant.other.color.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.color.rgb-value: #0451A5", - "hc_black": "constant.other.color.rgb-value: #B5CEA8" + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -1140,7 +1140,7 @@ "light_plus": "constant.other.color.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.color.rgb-value: #0451A5", - "hc_black": "constant.other.color.rgb-value: #B5CEA8" + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -1162,7 +1162,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1184,7 +1184,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1217,7 +1217,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -1239,7 +1239,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -1261,7 +1261,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -1459,7 +1459,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1481,7 +1481,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -1624,7 +1624,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -1657,7 +1657,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -1679,7 +1679,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -1712,7 +1712,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -1734,7 +1734,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -1932,7 +1932,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1954,7 +1954,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -2075,7 +2075,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -2119,7 +2119,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -2350,7 +2350,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -2460,7 +2460,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -2482,7 +2482,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -2537,7 +2537,7 @@ "light_plus": "support.constant.font-name: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.font-name: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.font-name: #CE9178" } }, { @@ -2570,7 +2570,7 @@ "light_plus": "support.constant.font-name: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.font-name: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.font-name: #CE9178" } }, { @@ -2779,7 +2779,7 @@ "light_plus": "constant.other.color.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.color.rgb-value: #0451A5", - "hc_black": "constant.other.color.rgb-value: #B5CEA8" + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -2790,7 +2790,7 @@ "light_plus": "constant.other.color.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.color.rgb-value: #0451A5", - "hc_black": "constant.other.color.rgb-value: #B5CEA8" + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -2922,7 +2922,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -2988,7 +2988,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -3054,7 +3054,7 @@ "light_plus": "constant.other.color.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.color.rgb-value: #0451A5", - "hc_black": "constant.other.color.rgb-value: #B5CEA8" + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -3065,7 +3065,7 @@ "light_plus": "constant.other.color.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.color.rgb-value: #0451A5", - "hc_black": "constant.other.color.rgb-value: #B5CEA8" + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -3197,7 +3197,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -3263,7 +3263,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -3329,7 +3329,7 @@ "light_plus": "constant.other.color.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.color.rgb-value: #0451A5", - "hc_black": "constant.other.color.rgb-value: #B5CEA8" + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -3340,7 +3340,7 @@ "light_plus": "constant.other.color.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.color.rgb-value: #0451A5", - "hc_black": "constant.other.color.rgb-value: #B5CEA8" + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -3406,7 +3406,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -3626,7 +3626,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -3692,7 +3692,7 @@ "light_plus": "constant.other.color.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.color.rgb-value: #0451A5", - "hc_black": "constant.other.color.rgb-value: #B5CEA8" + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -3703,7 +3703,7 @@ "light_plus": "constant.other.color.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.color.rgb-value: #0451A5", - "hc_black": "constant.other.color.rgb-value: #B5CEA8" + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -3813,7 +3813,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -3967,7 +3967,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -3989,7 +3989,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4022,7 +4022,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -4044,7 +4044,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -4066,7 +4066,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -4352,7 +4352,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -4693,7 +4693,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -4715,7 +4715,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -4737,7 +4737,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4770,7 +4770,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -4792,7 +4792,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -4814,7 +4814,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -4957,7 +4957,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -5177,7 +5177,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -5320,7 +5320,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -5386,7 +5386,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -5705,7 +5705,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -6024,7 +6024,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -6167,7 +6167,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -6244,7 +6244,7 @@ "light_plus": "support.constant.font-name: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.font-name: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.font-name: #CE9178" } }, { @@ -6310,7 +6310,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -6431,7 +6431,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -6926,7 +6926,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -7344,7 +7344,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -7663,7 +7663,7 @@ "light_plus": "support.constant.font-name: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.font-name: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.font-name: #CE9178" } }, { @@ -7696,7 +7696,7 @@ "light_plus": "support.constant.font-name: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.font-name: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.font-name: #CE9178" } }, { @@ -7762,7 +7762,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -7784,7 +7784,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -7806,7 +7806,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -7839,7 +7839,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -7861,7 +7861,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -7883,7 +7883,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -8301,7 +8301,7 @@ "light_plus": "constant.other.color.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.color.rgb-value: #0451A5", - "hc_black": "constant.other.color.rgb-value: #B5CEA8" + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -8312,7 +8312,7 @@ "light_plus": "constant.other.color.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.color.rgb-value: #0451A5", - "hc_black": "constant.other.color.rgb-value: #B5CEA8" + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -8642,7 +8642,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -8664,7 +8664,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -8686,7 +8686,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8719,7 +8719,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -8741,7 +8741,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -8763,7 +8763,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -8829,7 +8829,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { diff --git a/extensions/fsharp/test/colorize-results/test_fs.json b/extensions/fsharp/test/colorize-results/test_fs.json index 26bad9ce441..2f161a6fccc 100644 --- a/extensions/fsharp/test/colorize-results/test_fs.json +++ b/extensions/fsharp/test/colorize-results/test_fs.json @@ -51,7 +51,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -117,7 +117,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -293,7 +293,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -392,7 +392,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -590,7 +590,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -744,7 +744,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -766,7 +766,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -865,7 +865,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/go/test/colorize-results/test-13777_go.json b/extensions/go/test/colorize-results/test-13777_go.json index 07d3160e914..b893f1333e3 100644 --- a/extensions/go/test/colorize-results/test-13777_go.json +++ b/extensions/go/test/colorize-results/test-13777_go.json @@ -29,7 +29,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/go/test/colorize-results/test_go.json b/extensions/go/test/colorize-results/test_go.json index 2004ff9a219..0aa2e9063d9 100644 --- a/extensions/go/test/colorize-results/test_go.json +++ b/extensions/go/test/colorize-results/test_go.json @@ -194,7 +194,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -249,7 +249,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -337,7 +337,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -425,7 +425,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -458,7 +458,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -513,7 +513,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -634,7 +634,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -722,7 +722,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -832,7 +832,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -887,7 +887,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -975,7 +975,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1085,7 +1085,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { diff --git a/extensions/groovy/test/colorize-results/test_groovy.json b/extensions/groovy/test/colorize-results/test_groovy.json index 7e74addd23e..ee78a65becc 100644 --- a/extensions/groovy/test/colorize-results/test_groovy.json +++ b/extensions/groovy/test/colorize-results/test_groovy.json @@ -29,7 +29,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -150,7 +150,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -205,7 +205,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -260,7 +260,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -282,7 +282,7 @@ "light_plus": "storage.type.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.groovy: #4EC9B0" } }, { @@ -304,7 +304,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -370,7 +370,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -436,7 +436,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -524,7 +524,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -623,7 +623,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -1437,7 +1437,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1481,7 +1481,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1492,7 +1492,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1569,7 +1569,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1602,7 +1602,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1646,7 +1646,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1679,7 +1679,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1701,7 +1701,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1712,7 +1712,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -2207,7 +2207,7 @@ "light_plus": "storage.type.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.groovy: #4EC9B0" } }, { @@ -2405,7 +2405,7 @@ "light_plus": "storage.type.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.groovy: #4EC9B0" } }, { @@ -2482,7 +2482,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2504,7 +2504,7 @@ "light_plus": "storage.type.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.groovy: #4EC9B0" } }, { @@ -2658,7 +2658,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -3274,7 +3274,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -3307,7 +3307,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -3318,7 +3318,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -3340,7 +3340,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -3362,7 +3362,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -3373,7 +3373,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -3395,7 +3395,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -3472,7 +3472,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3505,7 +3505,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3549,7 +3549,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -3582,7 +3582,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -3604,7 +3604,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -3615,7 +3615,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -3670,7 +3670,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -3791,7 +3791,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -3879,7 +3879,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -3978,7 +3978,7 @@ "light_plus": "storage.type.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.groovy: #4EC9B0" } }, { @@ -4000,7 +4000,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -4121,7 +4121,7 @@ "light_plus": "storage.type.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.groovy: #4EC9B0" } }, { @@ -4143,7 +4143,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -4187,7 +4187,7 @@ "light_plus": "storage.type.primitive.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.primitive.groovy: #4EC9B0" } }, { @@ -4209,7 +4209,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -4231,7 +4231,7 @@ "light_plus": "storage.type.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.groovy: #4EC9B0" } }, { @@ -4253,7 +4253,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4297,7 +4297,7 @@ "light_plus": "variable.language: #0000FF", "dark_vs": "variable.language: #569CD6", "light_vs": "variable.language: #0000FF", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4429,7 +4429,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -4528,7 +4528,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -4583,7 +4583,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -4649,7 +4649,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -4715,7 +4715,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -4737,7 +4737,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -4803,7 +4803,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -4869,7 +4869,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -4902,7 +4902,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -5012,7 +5012,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -5089,7 +5089,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -5298,7 +5298,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -5771,7 +5771,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -5826,7 +5826,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6057,7 +6057,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6453,7 +6453,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6596,7 +6596,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -6981,7 +6981,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -7124,7 +7124,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -7432,7 +7432,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -7476,7 +7476,7 @@ "light_plus": "storage.type.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.groovy: #4EC9B0" } }, { @@ -7564,7 +7564,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -7652,7 +7652,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -7696,7 +7696,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -7784,7 +7784,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -7839,7 +7839,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -7872,7 +7872,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -7916,7 +7916,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -8048,7 +8048,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -8125,7 +8125,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -8180,7 +8180,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8246,7 +8246,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -8334,7 +8334,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -8378,7 +8378,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -8510,7 +8510,7 @@ "light_plus": "meta.definition.variable.name: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.definition.variable.name: #9CDCFE" } }, { @@ -8554,7 +8554,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8587,7 +8587,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8851,7 +8851,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -8873,7 +8873,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8906,7 +8906,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -9005,7 +9005,7 @@ "light_plus": "storage.type.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.groovy: #4EC9B0" } }, { @@ -9148,7 +9148,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -9192,7 +9192,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -9214,7 +9214,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -9478,7 +9478,7 @@ "light_plus": "storage.type.annotation.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.annotation.groovy: #4EC9B0" } }, { @@ -9489,7 +9489,7 @@ "light_plus": "storage.type.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.groovy: #4EC9B0" } }, { @@ -9511,7 +9511,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -9566,7 +9566,7 @@ "light_plus": "storage.type.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.groovy: #4EC9B0" } }, { @@ -9654,7 +9654,7 @@ "light_plus": "storage.type.object.array.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.object.array.groovy: #4EC9B0" } }, { @@ -9830,7 +9830,7 @@ "light_plus": "storage.type.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.groovy: #4EC9B0" } }, { @@ -9918,7 +9918,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -10083,7 +10083,7 @@ "light_plus": "storage.type.annotation.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.annotation.groovy: #4EC9B0" } }, { @@ -10094,7 +10094,7 @@ "light_plus": "storage.type.primitive.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.primitive.groovy: #4EC9B0" } }, { @@ -10116,7 +10116,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -10138,7 +10138,7 @@ "light_plus": "storage.type.primitive.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.primitive.groovy: #4EC9B0" } }, { @@ -10160,7 +10160,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10193,7 +10193,7 @@ "light_plus": "storage.type.primitive.groovy: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.primitive.groovy: #4EC9B0" } }, { @@ -10215,7 +10215,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10303,7 +10303,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { diff --git a/extensions/handlebars/test/colorize-results/test_handlebars.json b/extensions/handlebars/test/colorize-results/test_handlebars.json index cdf6cca84cc..a14353771e5 100644 --- a/extensions/handlebars/test/colorize-results/test_handlebars.json +++ b/extensions/handlebars/test/colorize-results/test_handlebars.json @@ -150,7 +150,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -161,7 +161,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -172,7 +172,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -227,7 +227,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -249,7 +249,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -260,7 +260,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -315,7 +315,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -326,7 +326,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -337,7 +337,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -359,7 +359,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -370,7 +370,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -381,7 +381,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -436,7 +436,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -546,7 +546,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -568,7 +568,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -579,7 +579,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -590,7 +590,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -634,7 +634,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -656,7 +656,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -667,7 +667,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -832,7 +832,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -997,7 +997,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1019,7 +1019,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1030,7 +1030,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1085,7 +1085,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1096,7 +1096,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1107,7 +1107,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1162,7 +1162,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1437,7 +1437,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1459,7 +1459,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1470,7 +1470,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1602,7 +1602,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "string: #CE9178", "light_vs": "string.quoted.double.handlebars: #0000FF", - "hc_black": "string: #CE9178" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1613,7 +1613,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string.quoted.double.handlebars: #0000FF", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1624,7 +1624,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "string: #CE9178", "light_vs": "string.quoted.double.handlebars: #0000FF", - "hc_black": "string: #CE9178" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1646,7 +1646,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "string: #CE9178", "light_vs": "string.quoted.double.handlebars: #0000FF", - "hc_black": "string: #CE9178" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1657,7 +1657,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string.quoted.double.handlebars: #0000FF", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1668,7 +1668,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "string: #CE9178", "light_vs": "string.quoted.double.handlebars: #0000FF", - "hc_black": "string: #CE9178" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1701,7 +1701,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1712,7 +1712,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1723,7 +1723,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1844,7 +1844,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1855,7 +1855,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1866,7 +1866,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1921,7 +1921,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { diff --git a/extensions/handlebars/test/colorize-results/test_hbs.json b/extensions/handlebars/test/colorize-results/test_hbs.json index c359f0eabc5..466499b590c 100644 --- a/extensions/handlebars/test/colorize-results/test_hbs.json +++ b/extensions/handlebars/test/colorize-results/test_hbs.json @@ -194,7 +194,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -216,7 +216,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -227,7 +227,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -359,7 +359,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "string: #CE9178", "light_vs": "string.quoted.double.handlebars: #0000FF", - "hc_black": "string: #CE9178" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -370,7 +370,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string.quoted.double.handlebars: #0000FF", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -381,7 +381,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "string: #CE9178", "light_vs": "string.quoted.double.handlebars: #0000FF", - "hc_black": "string: #CE9178" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -403,7 +403,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "string: #CE9178", "light_vs": "string.quoted.double.handlebars: #0000FF", - "hc_black": "string: #CE9178" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -414,7 +414,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string.quoted.double.handlebars: #0000FF", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -425,7 +425,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "string: #CE9178", "light_vs": "string.quoted.double.handlebars: #0000FF", - "hc_black": "string: #CE9178" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -458,7 +458,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -469,7 +469,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -480,7 +480,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -601,7 +601,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -612,7 +612,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -623,7 +623,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -678,7 +678,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -733,7 +733,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -744,7 +744,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -755,7 +755,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -777,7 +777,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -788,7 +788,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -799,7 +799,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -821,7 +821,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -832,7 +832,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -843,7 +843,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1052,7 +1052,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1074,7 +1074,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1085,7 +1085,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1140,7 +1140,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1151,7 +1151,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1162,7 +1162,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1184,7 +1184,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1195,7 +1195,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1206,7 +1206,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1261,7 +1261,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1415,7 +1415,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1437,7 +1437,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1459,7 +1459,7 @@ "light_plus": "variable: #001080", "dark_vs": "entity.other.attribute-name: #9CDCFE", "light_vs": "entity.other.attribute-name: #FF0000", - "hc_black": "entity.other.attribute-name: #9CDCFE" + "hc_black": "variable: #9CDCFE" } }, { @@ -1525,7 +1525,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1635,7 +1635,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1657,7 +1657,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1668,7 +1668,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1690,7 +1690,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1712,7 +1712,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1734,7 +1734,7 @@ "light_plus": "variable: #001080", "dark_vs": "entity.other.attribute-name: #9CDCFE", "light_vs": "entity.other.attribute-name: #FF0000", - "hc_black": "entity.other.attribute-name: #9CDCFE" + "hc_black": "variable: #9CDCFE" } }, { @@ -1800,7 +1800,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { @@ -1822,7 +1822,7 @@ "light_plus": "support.constant.handlebars: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.handlebars: #DCDCAA" } }, { diff --git a/extensions/hlsl/test/colorize-results/test_hlsl.json b/extensions/hlsl/test/colorize-results/test_hlsl.json index 0f245f64b56..06022858d4a 100644 --- a/extensions/hlsl/test/colorize-results/test_hlsl.json +++ b/extensions/hlsl/test/colorize-results/test_hlsl.json @@ -73,7 +73,7 @@ "light_plus": "support.variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.variable: #9CDCFE" } }, { @@ -117,7 +117,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -183,7 +183,7 @@ "light_plus": "support.variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.variable: #9CDCFE" } }, { @@ -249,7 +249,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { diff --git a/extensions/html/test/colorize-results/12750_html.json b/extensions/html/test/colorize-results/12750_html.json index 0e544efdcf8..88c372b5581 100644 --- a/extensions/html/test/colorize-results/12750_html.json +++ b/extensions/html/test/colorize-results/12750_html.json @@ -117,7 +117,7 @@ "light_plus": "support.variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.variable: #9CDCFE" } }, { @@ -139,7 +139,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -304,7 +304,7 @@ "light_plus": "support.variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.variable: #9CDCFE" } }, { @@ -326,7 +326,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { diff --git a/extensions/html/test/colorize-results/25920_html.json b/extensions/html/test/colorize-results/25920_html.json index 94298771d7e..d8cf7ad33df 100644 --- a/extensions/html/test/colorize-results/25920_html.json +++ b/extensions/html/test/colorize-results/25920_html.json @@ -458,7 +458,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/html/test/colorize-results/test_html.json b/extensions/html/test/colorize-results/test_html.json index b9b6fbc789b..987bfae286c 100644 --- a/extensions/html/test/colorize-results/test_html.json +++ b/extensions/html/test/colorize-results/test_html.json @@ -645,7 +645,7 @@ "light_plus": "support.constant.color: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.color: #0451A5", - "hc_black": "support.constant.color: #B5CEA8" + "hc_black": "support.constant.color: #CE9178" } }, { @@ -711,7 +711,7 @@ "light_plus": "constant.other.color.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.color.rgb-value: #0451A5", - "hc_black": "constant.other.color.rgb-value: #B5CEA8" + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -722,7 +722,7 @@ "light_plus": "constant.other.color.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.color.rgb-value: #0451A5", - "hc_black": "constant.other.color.rgb-value: #B5CEA8" + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -1459,7 +1459,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1481,7 +1481,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1569,7 +1569,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1591,7 +1591,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1635,7 +1635,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -1646,7 +1646,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -1723,7 +1723,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -1734,7 +1734,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -1778,7 +1778,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -1789,7 +1789,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -1921,7 +1921,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1965,7 +1965,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2108,7 +2108,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2130,7 +2130,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { diff --git a/extensions/java/test/colorize-results/basic_java.json b/extensions/java/test/colorize-results/basic_java.json index 11b55c9a630..b3353eabc69 100644 --- a/extensions/java/test/colorize-results/basic_java.json +++ b/extensions/java/test/colorize-results/basic_java.json @@ -337,7 +337,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -403,7 +403,7 @@ "light_plus": "storage.type.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.java: #4EC9B0" } }, { @@ -656,7 +656,7 @@ "light_plus": "storage.type.primitive.array.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.primitive.array.java: #4EC9B0" } }, { @@ -678,7 +678,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -700,7 +700,7 @@ "light_plus": "storage.type.primitive.array.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.primitive.array.java: #4EC9B0" } }, { @@ -722,7 +722,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -777,7 +777,7 @@ "light_plus": "storage.type.primitive.array.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.primitive.array.java: #4EC9B0" } }, { @@ -854,7 +854,7 @@ "light_plus": "storage.type.primitive.array.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.primitive.array.java: #4EC9B0" } }, { @@ -931,7 +931,7 @@ "light_plus": "storage.type.primitive.array.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.primitive.array.java: #4EC9B0" } }, { @@ -1085,7 +1085,7 @@ "light_plus": "storage.type.annotation.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.annotation.java: #4EC9B0" } }, { @@ -1228,7 +1228,7 @@ "light_plus": "storage.type.primitive.array.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.primitive.array.java: #4EC9B0" } }, { @@ -1250,7 +1250,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1272,7 +1272,7 @@ "light_plus": "storage.type.primitive.array.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.primitive.array.java: #4EC9B0" } }, { @@ -1294,7 +1294,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1338,7 +1338,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1360,7 +1360,7 @@ "light_plus": "storage.type.primitive.array.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.primitive.array.java: #4EC9B0" } }, { @@ -1536,7 +1536,7 @@ "light_plus": "storage.type.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.java: #4EC9B0" } }, { @@ -1723,7 +1723,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1833,7 +1833,7 @@ "light_plus": "storage.type.annotation.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.annotation.java: #4EC9B0" } }, { @@ -1877,7 +1877,7 @@ "light_plus": "storage.type.primitive.array.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.primitive.array.java: #4EC9B0" } }, { @@ -1899,7 +1899,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1954,7 +1954,7 @@ "light_plus": "storage.type.primitive.array.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.primitive.array.java: #4EC9B0" } }, { @@ -2031,7 +2031,7 @@ "light_plus": "storage.type.generic.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.generic.java: #4EC9B0" } }, { @@ -2042,7 +2042,7 @@ "light_plus": "storage.type.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.java: #4EC9B0" } }, { @@ -2053,7 +2053,7 @@ "light_plus": "storage.type.generic.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.generic.java: #4EC9B0" } }, { @@ -2097,7 +2097,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2119,7 +2119,7 @@ "light_plus": "storage.type.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.java: #4EC9B0" } }, { diff --git a/extensions/javascript/test/colorize-results/test6916_js.json b/extensions/javascript/test/colorize-results/test6916_js.json index 92e3ffc82eb..a3e9cc286fc 100644 --- a/extensions/javascript/test/colorize-results/test6916_js.json +++ b/extensions/javascript/test/colorize-results/test6916_js.json @@ -7,7 +7,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -51,7 +51,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -95,7 +95,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -139,7 +139,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -183,7 +183,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -227,7 +227,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -249,7 +249,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -271,7 +271,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -293,7 +293,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -337,7 +337,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -359,7 +359,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -381,7 +381,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -425,7 +425,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -447,7 +447,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -469,7 +469,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/javascript/test/colorize-results/test_js.json b/extensions/javascript/test/colorize-results/test_js.json index afcb74133d9..4d2acf6739f 100644 --- a/extensions/javascript/test/colorize-results/test_js.json +++ b/extensions/javascript/test/colorize-results/test_js.json @@ -95,7 +95,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -139,7 +139,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -238,7 +238,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -282,7 +282,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -381,7 +381,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -425,7 +425,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -524,7 +524,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -568,7 +568,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -667,7 +667,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -711,7 +711,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -810,7 +810,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -854,7 +854,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -876,7 +876,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -898,7 +898,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -942,7 +942,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -953,7 +953,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -1030,7 +1030,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1107,7 +1107,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1140,7 +1140,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1162,7 +1162,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1305,7 +1305,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1327,7 +1327,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1349,7 +1349,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1448,7 +1448,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -1459,7 +1459,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -1569,7 +1569,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1591,7 +1591,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1635,7 +1635,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1657,7 +1657,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1679,7 +1679,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1778,7 +1778,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1800,7 +1800,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1965,7 +1965,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2009,7 +2009,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2031,7 +2031,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2130,7 +2130,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -2141,7 +2141,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -2251,7 +2251,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2273,7 +2273,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2372,7 +2372,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -2383,7 +2383,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -2493,7 +2493,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2515,7 +2515,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2537,7 +2537,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2559,7 +2559,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2592,7 +2592,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2636,7 +2636,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2658,7 +2658,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2680,7 +2680,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2779,7 +2779,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2801,7 +2801,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2977,7 +2977,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2999,7 +2999,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3054,7 +3054,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3076,7 +3076,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -3142,7 +3142,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3219,7 +3219,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -3274,7 +3274,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3351,7 +3351,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3395,7 +3395,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3417,7 +3417,7 @@ "light_plus": "support.variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.variable: #9CDCFE" } }, { @@ -3450,7 +3450,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3494,7 +3494,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3527,7 +3527,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3593,7 +3593,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3615,7 +3615,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3670,7 +3670,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -3692,7 +3692,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3714,7 +3714,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3791,7 +3791,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -3813,7 +3813,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/javascript/test/colorize-results/test_jsx.json b/extensions/javascript/test/colorize-results/test_jsx.json index 65e9462cc40..7a9eb1f5ca0 100644 --- a/extensions/javascript/test/colorize-results/test_jsx.json +++ b/extensions/javascript/test/colorize-results/test_jsx.json @@ -29,7 +29,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -73,7 +73,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -95,7 +95,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -139,7 +139,7 @@ "light_plus": "meta.object-literal.key entity.name.function: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key entity.name.function: #9CDCFE" } }, { @@ -150,7 +150,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -249,7 +249,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -293,7 +293,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -304,7 +304,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -403,7 +403,7 @@ "light_plus": "meta.object-literal.key entity.name.function: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key entity.name.function: #9CDCFE" } }, { @@ -414,7 +414,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -469,7 +469,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -557,7 +557,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -579,7 +579,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -711,7 +711,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -755,7 +755,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -766,7 +766,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -821,7 +821,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -843,7 +843,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -931,7 +931,7 @@ "light_plus": "meta.object-literal.key entity.name.function: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key entity.name.function: #9CDCFE" } }, { @@ -942,7 +942,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -1096,7 +1096,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1162,7 +1162,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1184,7 +1184,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1250,7 +1250,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1316,7 +1316,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1338,7 +1338,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1393,7 +1393,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1459,7 +1459,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1481,7 +1481,7 @@ "light_plus": "support.variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.variable: #9CDCFE" } }, { @@ -1536,7 +1536,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1679,7 +1679,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1899,7 +1899,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2108,7 +2108,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2130,7 +2130,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2163,7 +2163,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "entity.name.tag: #569CD6", "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" + "hc_black": "support.class: #4EC9B0" } }, { @@ -2350,7 +2350,7 @@ "light_plus": "support.variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.variable: #9CDCFE" } }, { @@ -2372,7 +2372,7 @@ "light_plus": "support.variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.variable: #9CDCFE" } }, { diff --git a/extensions/less/test/colorize-results/test-cssvariables_less.json b/extensions/less/test/colorize-results/test-cssvariables_less.json index 787a2e7ba6c..bca9cd3c3a9 100644 --- a/extensions/less/test/colorize-results/test-cssvariables_less.json +++ b/extensions/less/test/colorize-results/test-cssvariables_less.json @@ -227,7 +227,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -249,7 +249,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -381,7 +381,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -447,7 +447,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -469,7 +469,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/less/test/colorize-results/test_less.json b/extensions/less/test/colorize-results/test_less.json index 11d728f6f92..4cc47220238 100644 --- a/extensions/less/test/colorize-results/test_less.json +++ b/extensions/less/test/colorize-results/test_less.json @@ -7,7 +7,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -18,7 +18,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -84,7 +84,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -95,7 +95,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -183,7 +183,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -194,7 +194,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -348,7 +348,7 @@ "light_plus": "constant.other.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.rgb-value: #0451A5", - "hc_black": "constant.other.rgb-value: #B5CEA8" + "hc_black": "constant.other.rgb-value: #CE9178" } }, { @@ -458,7 +458,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -491,7 +491,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -788,7 +788,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -821,7 +821,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -953,7 +953,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1074,7 +1074,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -1217,7 +1217,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1360,7 +1360,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -1921,7 +1921,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -2174,7 +2174,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -2504,7 +2504,7 @@ "light_plus": "constant.other.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.rgb-value: #0451A5", - "hc_black": "constant.other.rgb-value: #B5CEA8" + "hc_black": "constant.other.rgb-value: #CE9178" } }, { @@ -2559,7 +2559,7 @@ "light_plus": "constant.other.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.rgb-value: #0451A5", - "hc_black": "constant.other.rgb-value: #B5CEA8" + "hc_black": "constant.other.rgb-value: #CE9178" } }, { @@ -3109,7 +3109,7 @@ "light_plus": "constant.other.rgb-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "constant.other.rgb-value: #0451A5", - "hc_black": "constant.other.rgb-value: #B5CEA8" + "hc_black": "constant.other.rgb-value: #CE9178" } }, { @@ -3186,7 +3186,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { diff --git a/extensions/lua/test/colorize-results/test_lua.json b/extensions/lua/test/colorize-results/test_lua.json index 534b5717ac2..6b49d5c15e7 100644 --- a/extensions/lua/test/colorize-results/test_lua.json +++ b/extensions/lua/test/colorize-results/test_lua.json @@ -51,7 +51,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -73,7 +73,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -106,7 +106,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -139,7 +139,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -205,7 +205,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -227,7 +227,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -271,7 +271,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -293,7 +293,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -337,7 +337,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -403,7 +403,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -425,7 +425,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -447,7 +447,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -546,7 +546,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -645,7 +645,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -667,7 +667,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { diff --git a/extensions/make/test/colorize-results/makefile.json b/extensions/make/test/colorize-results/makefile.json index efd8b433423..01cf41a1d53 100644 --- a/extensions/make/test/colorize-results/makefile.json +++ b/extensions/make/test/colorize-results/makefile.json @@ -7,7 +7,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -40,7 +40,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -84,7 +84,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -128,7 +128,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -172,7 +172,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -216,7 +216,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -249,7 +249,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -271,7 +271,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -304,7 +304,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "support.function: #DCDCAA" } }, { @@ -337,7 +337,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -392,7 +392,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "support.function: #DCDCAA" } }, { @@ -447,7 +447,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -502,7 +502,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -513,7 +513,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -546,7 +546,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "support.function: #DCDCAA" } }, { @@ -601,7 +601,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -612,7 +612,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -645,7 +645,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -678,7 +678,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -711,7 +711,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "support.function: #DCDCAA" } }, { @@ -766,7 +766,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } } ] \ No newline at end of file diff --git a/extensions/objective-c/test/colorize-results/test_m.json b/extensions/objective-c/test/colorize-results/test_m.json index 542815fa192..ed1bda084e3 100644 --- a/extensions/objective-c/test/colorize-results/test_m.json +++ b/extensions/objective-c/test/colorize-results/test_m.json @@ -51,7 +51,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -62,7 +62,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -117,7 +117,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -128,7 +128,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -271,7 +271,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -293,7 +293,7 @@ "light_plus": "meta.return-type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.return-type: #4EC9B0" } }, { @@ -315,7 +315,7 @@ "light_plus": "meta.return-type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.return-type: #4EC9B0" } }, { @@ -326,7 +326,7 @@ "light_plus": "meta.return-type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.return-type: #4EC9B0" } }, { @@ -337,7 +337,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -348,7 +348,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -370,7 +370,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -414,7 +414,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -458,7 +458,7 @@ "light_plus": "meta.return-type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.return-type: #4EC9B0" } }, { @@ -480,7 +480,7 @@ "light_plus": "meta.return-type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.return-type: #4EC9B0" } }, { @@ -491,7 +491,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -502,7 +502,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -546,7 +546,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -579,7 +579,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -634,7 +634,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -799,7 +799,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -865,7 +865,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -953,7 +953,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -1250,7 +1250,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -1316,7 +1316,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1448,7 +1448,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1503,7 +1503,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1602,7 +1602,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1932,7 +1932,7 @@ "light_plus": "meta.return-type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.return-type: #4EC9B0" } }, { @@ -1954,7 +1954,7 @@ "light_plus": "meta.return-type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.return-type: #4EC9B0" } }, { @@ -1965,7 +1965,7 @@ "light_plus": "meta.return-type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.return-type: #4EC9B0" } }, { @@ -1976,7 +1976,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1987,7 +1987,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2075,7 +2075,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2097,7 +2097,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2108,7 +2108,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2196,7 +2196,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2383,7 +2383,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "meta.selector: #D7BA7D", "light_vs": "meta.selector: #800000", - "hc_black": "meta.selector: #D7BA7D" + "hc_black": "support.function: #DCDCAA" } }, { @@ -2438,7 +2438,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -2515,7 +2515,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -2658,7 +2658,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2713,7 +2713,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2779,7 +2779,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2823,7 +2823,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { diff --git a/extensions/perl/test/colorize-results/test2_pl.json b/extensions/perl/test/colorize-results/test2_pl.json index 550b80232e3..ef4bcabf439 100644 --- a/extensions/perl/test/colorize-results/test2_pl.json +++ b/extensions/perl/test/colorize-results/test2_pl.json @@ -7,7 +7,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -51,7 +51,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -62,7 +62,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -106,7 +106,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -150,7 +150,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -161,7 +161,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -205,7 +205,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -216,7 +216,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -282,7 +282,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -326,7 +326,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -337,7 +337,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -381,7 +381,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -392,7 +392,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -414,7 +414,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -425,7 +425,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -491,7 +491,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -546,7 +546,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -557,7 +557,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -590,7 +590,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -612,7 +612,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -623,7 +623,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -645,7 +645,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -656,7 +656,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -733,7 +733,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -744,7 +744,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -788,7 +788,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -799,7 +799,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -865,7 +865,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -876,7 +876,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -898,7 +898,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -909,7 +909,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -953,7 +953,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -964,7 +964,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1019,7 +1019,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1041,7 +1041,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1063,7 +1063,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1074,7 +1074,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1151,7 +1151,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1162,7 +1162,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1206,7 +1206,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1228,7 +1228,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1250,7 +1250,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1261,7 +1261,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1360,7 +1360,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1437,7 +1437,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1448,7 +1448,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1470,7 +1470,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1481,7 +1481,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1525,7 +1525,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1536,7 +1536,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1624,7 +1624,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1635,7 +1635,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1679,7 +1679,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1701,7 +1701,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1723,7 +1723,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1734,7 +1734,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1800,7 +1800,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1866,7 +1866,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1877,7 +1877,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1921,7 +1921,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1943,7 +1943,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1965,7 +1965,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1976,7 +1976,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1998,7 +1998,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -2020,7 +2020,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2031,7 +2031,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2053,7 +2053,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2064,7 +2064,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2086,7 +2086,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -2108,7 +2108,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2119,7 +2119,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2185,7 +2185,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2196,7 +2196,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2218,7 +2218,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -2240,7 +2240,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2284,7 +2284,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2339,7 +2339,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2350,7 +2350,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2372,7 +2372,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2383,7 +2383,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2405,7 +2405,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2416,7 +2416,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2460,7 +2460,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -2471,7 +2471,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -2493,7 +2493,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -2504,7 +2504,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -2603,7 +2603,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -2614,7 +2614,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -2636,7 +2636,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -2647,7 +2647,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -2691,7 +2691,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2713,7 +2713,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2735,7 +2735,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2746,7 +2746,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2768,7 +2768,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2779,7 +2779,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2856,7 +2856,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2922,7 +2922,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2933,7 +2933,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2955,7 +2955,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2966,7 +2966,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3010,7 +3010,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -3021,7 +3021,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -3054,7 +3054,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3065,7 +3065,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3087,7 +3087,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3098,7 +3098,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3120,7 +3120,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -3142,7 +3142,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3153,7 +3153,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3175,7 +3175,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3186,7 +3186,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3263,7 +3263,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3274,7 +3274,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/perl/test/colorize-results/test_pl.json b/extensions/perl/test/colorize-results/test_pl.json index b07bdb97e20..dd6dc702ac1 100644 --- a/extensions/perl/test/colorize-results/test_pl.json +++ b/extensions/perl/test/colorize-results/test_pl.json @@ -7,7 +7,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -51,7 +51,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -62,7 +62,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -106,7 +106,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -172,7 +172,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -183,7 +183,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -205,7 +205,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -216,7 +216,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -238,7 +238,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -249,7 +249,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -315,7 +315,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -337,7 +337,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -348,7 +348,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -546,7 +546,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -568,7 +568,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -579,7 +579,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -634,7 +634,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -744,7 +744,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -755,7 +755,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -832,7 +832,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -865,7 +865,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -876,7 +876,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -898,7 +898,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -909,7 +909,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -931,7 +931,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -942,7 +942,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1129,7 +1129,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1195,7 +1195,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1206,7 +1206,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1228,7 +1228,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1239,7 +1239,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1272,7 +1272,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1294,7 +1294,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1316,7 +1316,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1327,7 +1327,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1371,7 +1371,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1415,7 +1415,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1426,7 +1426,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1503,7 +1503,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1580,7 +1580,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1591,7 +1591,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1624,7 +1624,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1646,7 +1646,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1657,7 +1657,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1723,7 +1723,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1745,7 +1745,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1756,7 +1756,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1811,7 +1811,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1822,7 +1822,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1844,7 +1844,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1855,7 +1855,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1910,7 +1910,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1987,7 +1987,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2031,7 +2031,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2042,7 +2042,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2064,7 +2064,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -2086,7 +2086,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2097,7 +2097,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2141,7 +2141,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2152,7 +2152,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2185,7 +2185,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2207,7 +2207,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2218,7 +2218,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2240,7 +2240,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { diff --git a/extensions/php/test/colorize-results/test_php.json b/extensions/php/test/colorize-results/test_php.json index ee3715fefce..4cf717c50c3 100644 --- a/extensions/php/test/colorize-results/test_php.json +++ b/extensions/php/test/colorize-results/test_php.json @@ -271,7 +271,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -447,7 +447,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -458,7 +458,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -502,7 +502,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -909,7 +909,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -931,7 +931,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -975,7 +975,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -997,7 +997,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1008,7 +1008,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1085,7 +1085,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1096,7 +1096,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1173,7 +1173,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1184,7 +1184,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1239,7 +1239,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1250,7 +1250,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1294,7 +1294,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1316,7 +1316,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1327,7 +1327,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1371,7 +1371,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1382,7 +1382,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1426,7 +1426,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1459,7 +1459,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1470,7 +1470,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1514,7 +1514,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1536,7 +1536,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1547,7 +1547,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1569,7 +1569,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1580,7 +1580,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1690,7 +1690,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1701,7 +1701,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1767,7 +1767,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1811,7 +1811,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1822,7 +1822,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1888,7 +1888,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1899,7 +1899,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1921,7 +1921,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1932,7 +1932,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1976,7 +1976,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1987,7 +1987,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2009,7 +2009,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2020,7 +2020,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2163,7 +2163,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -2185,7 +2185,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -2229,7 +2229,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2240,7 +2240,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2284,7 +2284,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -2361,7 +2361,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -2405,7 +2405,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -2416,7 +2416,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -2515,7 +2515,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2537,7 +2537,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2548,7 +2548,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2625,7 +2625,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2636,7 +2636,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2713,7 +2713,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2724,7 +2724,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2779,7 +2779,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2801,7 +2801,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2812,7 +2812,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2900,7 +2900,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2911,7 +2911,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3010,7 +3010,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -3054,7 +3054,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -3065,7 +3065,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -3087,7 +3087,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -3098,7 +3098,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -3175,7 +3175,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3186,7 +3186,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/powershell/test/colorize-results/test_ps1.json b/extensions/powershell/test/colorize-results/test_ps1.json index 794ed90dcf4..bce680fee40 100644 --- a/extensions/powershell/test/colorize-results/test_ps1.json +++ b/extensions/powershell/test/colorize-results/test_ps1.json @@ -40,7 +40,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -73,7 +73,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -117,7 +117,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -216,7 +216,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -260,7 +260,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -315,7 +315,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -337,7 +337,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -370,7 +370,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -381,7 +381,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -458,7 +458,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -491,7 +491,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -623,7 +623,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -667,7 +667,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -766,7 +766,7 @@ "light_plus": "variable: #001080", "dark_vs": "entity.other.attribute-name: #9CDCFE", "light_vs": "entity.other.attribute-name: #FF0000", - "hc_black": "entity.other.attribute-name: #9CDCFE" + "hc_black": "variable: #9CDCFE" } }, { @@ -821,7 +821,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -865,7 +865,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -920,7 +920,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -986,7 +986,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1041,7 +1041,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1382,7 +1382,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1459,7 +1459,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1514,7 +1514,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1569,7 +1569,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1690,7 +1690,7 @@ "light_plus": "support.variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.variable: #9CDCFE" } }, { @@ -1701,7 +1701,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1745,7 +1745,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1822,7 +1822,7 @@ "light_plus": "support.variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.variable: #9CDCFE" } }, { @@ -1833,7 +1833,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1855,7 +1855,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1888,7 +1888,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1954,7 +1954,7 @@ "light_plus": "support.variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "support.variable: #9CDCFE" } }, { @@ -1965,7 +1965,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -2031,7 +2031,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2075,7 +2075,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2119,7 +2119,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2174,7 +2174,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2273,7 +2273,7 @@ "light_plus": "support.variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.variable: #9CDCFE" } }, { @@ -2284,7 +2284,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2328,7 +2328,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2350,7 +2350,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -2405,7 +2405,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/pug/test/colorize-results/test_pug.json b/extensions/pug/test/colorize-results/test_pug.json index 69bd4db3a9c..ad73e9dbaf5 100644 --- a/extensions/pug/test/colorize-results/test_pug.json +++ b/extensions/pug/test/colorize-results/test_pug.json @@ -315,7 +315,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -337,7 +337,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -612,7 +612,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -634,7 +634,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -678,7 +678,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -744,7 +744,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -755,7 +755,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -854,7 +854,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -964,7 +964,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string.interpolated.jade: #0000FF", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -986,7 +986,7 @@ "light_plus": "support.variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string.interpolated.jade: #0000FF", - "hc_black": "string: #CE9178" + "hc_black": "support.variable: #9CDCFE" } }, { @@ -1602,7 +1602,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1646,7 +1646,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1668,7 +1668,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1778,7 +1778,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { diff --git a/extensions/python/test/colorize-results/test_py.json b/extensions/python/test/colorize-results/test_py.json index 081349fd61b..5d58f2c7297 100644 --- a/extensions/python/test/colorize-results/test_py.json +++ b/extensions/python/test/colorize-results/test_py.json @@ -7,7 +7,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -29,7 +29,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -84,7 +84,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -216,7 +216,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -238,7 +238,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -271,7 +271,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -458,7 +458,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -480,7 +480,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -579,7 +579,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -667,7 +667,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -689,7 +689,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -744,7 +744,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -854,7 +854,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -942,7 +942,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1030,7 +1030,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1162,7 +1162,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1173,7 +1173,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1921,7 +1921,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1976,7 +1976,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1998,7 +1998,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2031,7 +2031,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2075,7 +2075,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2119,7 +2119,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -2185,7 +2185,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2240,7 +2240,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2284,7 +2284,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2306,7 +2306,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3175,7 +3175,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -3197,7 +3197,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3285,7 +3285,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -3406,7 +3406,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -3747,7 +3747,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -3890,7 +3890,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -3934,7 +3934,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -3956,7 +3956,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3989,7 +3989,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4033,7 +4033,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4077,7 +4077,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -4242,7 +4242,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -4341,7 +4341,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -4396,7 +4396,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -4418,7 +4418,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4451,7 +4451,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4495,7 +4495,7 @@ "light_plus": "variable.language: #0000FF", "dark_vs": "variable.language: #569CD6", "light_vs": "variable.language: #0000FF", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4550,7 +4550,7 @@ "light_plus": "variable.language: #0000FF", "dark_vs": "variable.language: #569CD6", "light_vs": "variable.language: #0000FF", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4649,7 +4649,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -4671,7 +4671,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4715,7 +4715,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4759,7 +4759,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -4825,7 +4825,7 @@ "light_plus": "variable.language: #0000FF", "dark_vs": "variable.language: #569CD6", "light_vs": "variable.language: #0000FF", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4869,7 +4869,7 @@ "light_plus": "variable.language: #0000FF", "dark_vs": "variable.language: #569CD6", "light_vs": "variable.language: #0000FF", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4968,7 +4968,7 @@ "light_plus": "variable.language: #0000FF", "dark_vs": "variable.language: #569CD6", "light_vs": "variable.language: #0000FF", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5056,7 +5056,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -5078,7 +5078,7 @@ "light_plus": "variable.language: #0000FF", "dark_vs": "variable.language: #569CD6", "light_vs": "variable.language: #0000FF", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5496,7 +5496,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -5551,7 +5551,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -5606,7 +5606,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5705,7 +5705,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -5760,7 +5760,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -5782,7 +5782,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -5804,7 +5804,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -5837,7 +5837,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -5903,7 +5903,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -5925,7 +5925,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -5969,7 +5969,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6585,7 +6585,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6618,7 +6618,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6651,7 +6651,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { diff --git a/extensions/r/test/colorize-results/test_r.json b/extensions/r/test/colorize-results/test_r.json index bcd1217fd33..545fbd4b31f 100644 --- a/extensions/r/test/colorize-results/test_r.json +++ b/extensions/r/test/colorize-results/test_r.json @@ -205,7 +205,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -249,7 +249,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -271,7 +271,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -293,7 +293,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -337,7 +337,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -381,7 +381,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/razor/test/colorize-results/test_cshtml.json b/extensions/razor/test/colorize-results/test_cshtml.json index 8c8c54c9830..b87c41d8f04 100644 --- a/extensions/razor/test/colorize-results/test_cshtml.json +++ b/extensions/razor/test/colorize-results/test_cshtml.json @@ -7,7 +7,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -40,7 +40,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -62,7 +62,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -84,7 +84,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -117,7 +117,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -139,7 +139,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -227,7 +227,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -249,7 +249,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -326,7 +326,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -348,7 +348,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -392,7 +392,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -425,7 +425,7 @@ "light_plus": "storage.type.cs: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.cs: #4EC9B0" } }, { @@ -480,7 +480,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -502,7 +502,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -546,7 +546,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -579,7 +579,7 @@ "light_plus": "storage.type.cs: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" + "hc_black": "storage.type.cs: #4EC9B0" } }, { @@ -667,7 +667,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -711,7 +711,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -799,7 +799,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -887,7 +887,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -909,7 +909,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -931,7 +931,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1041,7 +1041,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1085,7 +1085,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1118,7 +1118,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -3164,7 +3164,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -3318,7 +3318,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -3340,7 +3340,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/ruby/test/colorize-results/test_rb.json b/extensions/ruby/test/colorize-results/test_rb.json index 0a64f6f6aed..5b3da189b47 100644 --- a/extensions/ruby/test/colorize-results/test_rb.json +++ b/extensions/ruby/test/colorize-results/test_rb.json @@ -95,7 +95,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -117,7 +117,7 @@ "light_plus": "entity.other.inherited-class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.other.inherited-class: #4EC9B0" } }, { @@ -128,7 +128,7 @@ "light_plus": "entity.other.inherited-class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.other.inherited-class: #4EC9B0" } }, { @@ -139,7 +139,7 @@ "light_plus": "entity.other.inherited-class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.other.inherited-class: #4EC9B0" } }, { @@ -150,7 +150,7 @@ "light_plus": "entity.other.inherited-class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.other.inherited-class: #4EC9B0" } }, { @@ -161,7 +161,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -260,7 +260,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -282,7 +282,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -326,7 +326,7 @@ "light_plus": "entity.other.inherited-class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.other.inherited-class: #4EC9B0" } }, { @@ -370,7 +370,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -392,7 +392,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -414,7 +414,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -436,7 +436,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -480,7 +480,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -766,7 +766,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -788,7 +788,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -810,7 +810,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -832,7 +832,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -898,7 +898,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -975,7 +975,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1052,7 +1052,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1063,7 +1063,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1195,7 +1195,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1272,7 +1272,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1349,7 +1349,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1426,7 +1426,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1481,7 +1481,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -1503,7 +1503,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1536,7 +1536,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1547,7 +1547,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1602,7 +1602,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1613,7 +1613,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1657,7 +1657,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -1701,7 +1701,7 @@ "light_plus": "variable.language: #0000FF", "dark_vs": "variable.language: #569CD6", "light_vs": "variable.language: #0000FF", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1734,7 +1734,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1745,7 +1745,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1789,7 +1789,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -1833,7 +1833,7 @@ "light_plus": "variable.language: #0000FF", "dark_vs": "variable.language: #569CD6", "light_vs": "variable.language: #0000FF", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1866,7 +1866,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1877,7 +1877,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1965,7 +1965,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1976,7 +1976,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2042,7 +2042,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2053,7 +2053,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2119,7 +2119,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2141,7 +2141,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -2273,7 +2273,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -2328,7 +2328,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2416,7 +2416,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2801,7 +2801,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2823,7 +2823,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2834,7 +2834,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } } ] \ No newline at end of file diff --git a/extensions/rust/test/colorize-results/test-6611_rs.json b/extensions/rust/test/colorize-results/test-6611_rs.json index 5136a3a57d5..d397562ce5c 100644 --- a/extensions/rust/test/colorize-results/test-6611_rs.json +++ b/extensions/rust/test/colorize-results/test-6611_rs.json @@ -304,7 +304,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -414,7 +414,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -513,7 +513,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -601,7 +601,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { diff --git a/extensions/rust/test/colorize-results/test_rs.json b/extensions/rust/test/colorize-results/test_rs.json index cc273390c62..977fe6bd28c 100644 --- a/extensions/rust/test/colorize-results/test_rs.json +++ b/extensions/rust/test/colorize-results/test_rs.json @@ -73,7 +73,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -106,7 +106,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -161,7 +161,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -304,7 +304,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -348,7 +348,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -370,7 +370,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -436,7 +436,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -469,7 +469,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -524,7 +524,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { diff --git a/extensions/scss/test/colorize-results/test-cssvariables_scss.json b/extensions/scss/test/colorize-results/test-cssvariables_scss.json index caf9d121a46..ff30ea6b973 100644 --- a/extensions/scss/test/colorize-results/test-cssvariables_scss.json +++ b/extensions/scss/test/colorize-results/test-cssvariables_scss.json @@ -227,7 +227,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -381,7 +381,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -447,7 +447,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { diff --git a/extensions/scss/test/colorize-results/test_scss.json b/extensions/scss/test/colorize-results/test_scss.json index 94003b0d826..4f699f59ebf 100644 --- a/extensions/scss/test/colorize-results/test_scss.json +++ b/extensions/scss/test/colorize-results/test_scss.json @@ -95,7 +95,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -106,7 +106,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -557,7 +557,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -898,7 +898,7 @@ "light_plus": "support.constant.color: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.color: #0451A5", - "hc_black": "support.constant.color: #B5CEA8" + "hc_black": "support.constant.color: #CE9178" } }, { @@ -1008,7 +1008,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -1140,7 +1140,7 @@ "light_plus": "support.constant.color: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.color: #0451A5", - "hc_black": "support.constant.color: #B5CEA8" + "hc_black": "support.constant.color: #CE9178" } }, { @@ -1569,7 +1569,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -2548,7 +2548,7 @@ "light_plus": "support.constant.color: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.color: #0451A5", - "hc_black": "support.constant.color: #B5CEA8" + "hc_black": "support.constant.color: #CE9178" } }, { @@ -2735,7 +2735,7 @@ "light_plus": "support.constant.color: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.color: #0451A5", - "hc_black": "support.constant.color: #B5CEA8" + "hc_black": "support.constant.color: #CE9178" } }, { @@ -3362,7 +3362,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3384,7 +3384,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3406,7 +3406,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3428,7 +3428,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3538,7 +3538,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -3582,7 +3582,7 @@ "light_plus": "variable: #001080", "dark_vs": "entity.other.attribute-name.class.css: #D7BA7D", "light_vs": "entity.other.attribute-name.class.css: #800000", - "hc_black": "entity.other.attribute-name.class.css: #D7BA7D" + "hc_black": "variable: #9CDCFE" } }, { @@ -3604,7 +3604,7 @@ "light_plus": "variable: #001080", "dark_vs": "entity.other.attribute-name.class.css: #D7BA7D", "light_vs": "entity.other.attribute-name.class.css: #800000", - "hc_black": "entity.other.attribute-name.class.css: #D7BA7D" + "hc_black": "variable: #9CDCFE" } }, { @@ -3648,7 +3648,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3670,7 +3670,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3714,7 +3714,7 @@ "light_plus": "support.constant.color: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.color: #0451A5", - "hc_black": "support.constant.color: #B5CEA8" + "hc_black": "support.constant.color: #CE9178" } }, { @@ -3846,7 +3846,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -4671,7 +4671,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -4759,7 +4759,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -4781,7 +4781,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -4803,7 +4803,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -4825,7 +4825,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -4913,7 +4913,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -5100,7 +5100,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -5133,7 +5133,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5199,7 +5199,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5276,7 +5276,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5518,7 +5518,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -5529,7 +5529,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -5551,7 +5551,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -5628,7 +5628,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -5639,7 +5639,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -5980,7 +5980,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -6090,7 +6090,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6101,7 +6101,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6200,7 +6200,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -6277,7 +6277,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6288,7 +6288,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6354,7 +6354,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -6398,7 +6398,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -6420,7 +6420,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -6519,7 +6519,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6530,7 +6530,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6772,7 +6772,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6783,7 +6783,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6805,7 +6805,7 @@ "light_plus": "support.constant.media: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.media: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.media: #CE9178" } }, { @@ -6893,7 +6893,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -7377,7 +7377,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -7388,7 +7388,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -7630,7 +7630,7 @@ "light_plus": "support.constant.color: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.color: #0451A5", - "hc_black": "support.constant.color: #B5CEA8" + "hc_black": "support.constant.color: #CE9178" } }, { @@ -7696,7 +7696,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -7861,7 +7861,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -7872,7 +7872,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -7993,7 +7993,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -8004,7 +8004,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -8037,7 +8037,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -8048,7 +8048,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -8070,7 +8070,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -8169,7 +8169,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -8180,7 +8180,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -8202,7 +8202,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -8279,7 +8279,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -8290,7 +8290,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -8334,7 +8334,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -8356,7 +8356,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -8554,7 +8554,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -8565,7 +8565,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -8587,7 +8587,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -8664,7 +8664,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -8675,7 +8675,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -8719,7 +8719,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -8741,7 +8741,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -8972,7 +8972,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -9247,7 +9247,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -9258,7 +9258,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -9478,7 +9478,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -9533,7 +9533,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -9544,7 +9544,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -9720,7 +9720,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -9775,7 +9775,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -9786,7 +9786,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -9896,7 +9896,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -10072,7 +10072,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -10083,7 +10083,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -10204,7 +10204,7 @@ "light_plus": "support.constant.color: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.color: #0451A5", - "hc_black": "support.constant.color: #B5CEA8" + "hc_black": "support.constant.color: #CE9178" } }, { @@ -10259,7 +10259,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -10270,7 +10270,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -10336,7 +10336,7 @@ "light_plus": "support.constant.color: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.color: #0451A5", - "hc_black": "support.constant.color: #B5CEA8" + "hc_black": "support.constant.color: #CE9178" } }, { @@ -10424,7 +10424,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -10435,7 +10435,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -10479,7 +10479,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -10523,7 +10523,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -10611,7 +10611,7 @@ "light_plus": "variable: #001080", "dark_vs": "entity.other.attribute-name.class.css: #D7BA7D", "light_vs": "entity.other.attribute-name.class.css: #800000", - "hc_black": "entity.other.attribute-name.class.css: #D7BA7D" + "hc_black": "variable: #9CDCFE" } }, { @@ -10633,7 +10633,7 @@ "light_plus": "variable: #001080", "dark_vs": "entity.other.attribute-name.class.css: #D7BA7D", "light_vs": "entity.other.attribute-name.class.css: #800000", - "hc_black": "entity.other.attribute-name.class.css: #D7BA7D" + "hc_black": "variable: #9CDCFE" } }, { @@ -10853,7 +10853,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -10864,7 +10864,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -10908,7 +10908,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -10985,7 +10985,7 @@ "light_plus": "variable: #001080", "dark_vs": "entity.other.attribute-name.class.css: #D7BA7D", "light_vs": "entity.other.attribute-name.class.css: #800000", - "hc_black": "entity.other.attribute-name.class.css: #D7BA7D" + "hc_black": "variable: #9CDCFE" } }, { @@ -11007,7 +11007,7 @@ "light_plus": "variable: #001080", "dark_vs": "entity.other.attribute-name.class.css: #D7BA7D", "light_vs": "entity.other.attribute-name.class.css: #800000", - "hc_black": "entity.other.attribute-name.class.css: #D7BA7D" + "hc_black": "variable: #9CDCFE" } }, { @@ -11095,7 +11095,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -11139,7 +11139,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -11161,7 +11161,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -11326,7 +11326,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -11337,7 +11337,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -11469,7 +11469,7 @@ "light_plus": "variable: #001080", "dark_vs": "entity.other.attribute-name.class.css: #D7BA7D", "light_vs": "entity.other.attribute-name.class.css: #800000", - "hc_black": "entity.other.attribute-name.class.css: #D7BA7D" + "hc_black": "variable: #9CDCFE" } }, { @@ -11491,7 +11491,7 @@ "light_plus": "variable: #001080", "dark_vs": "entity.other.attribute-name.class.css: #D7BA7D", "light_vs": "entity.other.attribute-name.class.css: #800000", - "hc_black": "entity.other.attribute-name.class.css: #D7BA7D" + "hc_black": "variable: #9CDCFE" } }, { @@ -11821,7 +11821,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -11832,7 +11832,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -11854,7 +11854,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -11964,7 +11964,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -11975,7 +11975,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -12019,7 +12019,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -12063,7 +12063,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -12129,7 +12129,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -12140,7 +12140,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -12173,7 +12173,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -12525,7 +12525,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -12536,7 +12536,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -12657,7 +12657,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -12668,7 +12668,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -12756,7 +12756,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -12767,7 +12767,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -12789,7 +12789,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -12910,7 +12910,7 @@ "light_plus": "support.constant.font-name: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.font-name: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.font-name: #CE9178" } }, { @@ -13053,7 +13053,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -13240,7 +13240,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -13251,7 +13251,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -13273,7 +13273,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -13416,7 +13416,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -13427,7 +13427,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -13449,7 +13449,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -13801,7 +13801,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -13900,7 +13900,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -13911,7 +13911,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -13933,7 +13933,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -13955,7 +13955,7 @@ "light_plus": "support.constant.color: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.color: #0451A5", - "hc_black": "support.constant.color: #B5CEA8" + "hc_black": "support.constant.color: #CE9178" } }, { @@ -14032,7 +14032,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -14043,7 +14043,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -14065,7 +14065,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -14406,7 +14406,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -14417,7 +14417,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -14439,7 +14439,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -14780,7 +14780,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -14791,7 +14791,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -14813,7 +14813,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -15308,7 +15308,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -15319,7 +15319,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -15341,7 +15341,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -15451,7 +15451,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -15462,7 +15462,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -15484,7 +15484,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -15594,7 +15594,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -15649,7 +15649,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -15660,7 +15660,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -15682,7 +15682,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -15814,7 +15814,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -15847,7 +15847,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -15913,7 +15913,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -15924,7 +15924,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -15990,7 +15990,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -16001,7 +16001,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -16023,7 +16023,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -16375,7 +16375,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -16386,7 +16386,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -16408,7 +16408,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -16859,7 +16859,7 @@ "light_plus": "support.constant.color: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.color: #0451A5", - "hc_black": "support.constant.color: #B5CEA8" + "hc_black": "support.constant.color: #CE9178" } }, { @@ -16903,7 +16903,7 @@ "light_plus": "support.constant.property-value: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.property-value: #0451A5", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.property-value: #CE9178" } }, { @@ -17002,7 +17002,7 @@ "light_plus": "support.constant.color: #0451A5", "dark_vs": "default: #D4D4D4", "light_vs": "support.constant.color: #0451A5", - "hc_black": "support.constant.color: #B5CEA8" + "hc_black": "support.constant.color: #CE9178" } }, { @@ -17189,7 +17189,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -17277,7 +17277,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -17288,7 +17288,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -17310,7 +17310,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -17409,7 +17409,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -17420,7 +17420,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -17442,7 +17442,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -17464,7 +17464,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -17497,7 +17497,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -17508,7 +17508,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -17530,7 +17530,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -17552,7 +17552,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -17871,7 +17871,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -17882,7 +17882,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -17904,7 +17904,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -18025,7 +18025,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -18036,7 +18036,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -18179,7 +18179,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -18333,7 +18333,7 @@ "light_plus": "variable: #001080", "dark_vs": "entity.other.attribute-name.class.css: #D7BA7D", "light_vs": "entity.other.attribute-name.class.css: #800000", - "hc_black": "entity.other.attribute-name.class.css: #D7BA7D" + "hc_black": "variable: #9CDCFE" } }, { @@ -18355,7 +18355,7 @@ "light_plus": "variable: #001080", "dark_vs": "entity.other.attribute-name.class.css: #D7BA7D", "light_vs": "entity.other.attribute-name.class.css: #800000", - "hc_black": "entity.other.attribute-name.class.css: #D7BA7D" + "hc_black": "variable: #9CDCFE" } }, { @@ -18410,7 +18410,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -18432,7 +18432,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -18520,7 +18520,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -18542,7 +18542,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -18608,7 +18608,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -18630,7 +18630,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -18652,7 +18652,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -18674,7 +18674,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -18751,7 +18751,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -18773,7 +18773,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -18883,7 +18883,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -18894,7 +18894,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -19202,7 +19202,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -19213,7 +19213,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -19818,7 +19818,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -19829,7 +19829,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -19851,7 +19851,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { diff --git a/extensions/shaderlab/test/colorize-results/test_shader.json b/extensions/shaderlab/test/colorize-results/test_shader.json index 2769b1e9713..7f731af089f 100644 --- a/extensions/shaderlab/test/colorize-results/test_shader.json +++ b/extensions/shaderlab/test/colorize-results/test_shader.json @@ -95,7 +95,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -238,7 +238,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -293,7 +293,7 @@ "light_plus": "support.variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.variable: #9CDCFE" } }, { @@ -359,7 +359,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -381,7 +381,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -425,7 +425,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -535,7 +535,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { diff --git a/extensions/shellscript/test/colorize-results/test_sh.json b/extensions/shellscript/test/colorize-results/test_sh.json index 93acd4ac00c..3bb5e394f1e 100644 --- a/extensions/shellscript/test/colorize-results/test_sh.json +++ b/extensions/shellscript/test/colorize-results/test_sh.json @@ -29,7 +29,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -84,7 +84,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -95,7 +95,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -238,7 +238,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -260,7 +260,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -337,7 +337,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -348,7 +348,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -458,7 +458,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -491,7 +491,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -502,7 +502,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -557,7 +557,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -590,7 +590,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -601,7 +601,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -623,7 +623,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -634,7 +634,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -656,7 +656,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -678,7 +678,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -821,7 +821,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -832,7 +832,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -887,7 +887,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -975,7 +975,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -986,7 +986,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1030,7 +1030,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1151,7 +1151,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1206,7 +1206,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1228,7 +1228,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1239,7 +1239,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1294,7 +1294,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1448,7 +1448,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1503,7 +1503,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1514,7 +1514,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1657,7 +1657,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1679,7 +1679,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1701,7 +1701,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1734,7 +1734,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1745,7 +1745,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1778,7 +1778,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1800,7 +1800,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1822,7 +1822,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1855,7 +1855,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1866,7 +1866,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1899,7 +1899,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1943,7 +1943,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -1954,7 +1954,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/sql/test/colorize-results/test_sql.json b/extensions/sql/test/colorize-results/test_sql.json index a17bd7e32f7..7b133d4de64 100644 --- a/extensions/sql/test/colorize-results/test_sql.json +++ b/extensions/sql/test/colorize-results/test_sql.json @@ -51,7 +51,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { diff --git a/extensions/swift/test/colorize-results/test_swift.json b/extensions/swift/test/colorize-results/test_swift.json index 2da06bcd479..f421ae1fba8 100644 --- a/extensions/swift/test/colorize-results/test_swift.json +++ b/extensions/swift/test/colorize-results/test_swift.json @@ -161,7 +161,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -216,7 +216,7 @@ "light_plus": "meta.return-type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.return-type: #4EC9B0" } }, { @@ -227,7 +227,7 @@ "light_plus": "meta.return-type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.return-type: #4EC9B0" } }, { @@ -238,7 +238,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { diff --git a/extensions/typescript/test/colorize-results/test-brackets_tsx.json b/extensions/typescript/test/colorize-results/test-brackets_tsx.json index 26c893e42af..92fe70a1da2 100644 --- a/extensions/typescript/test/colorize-results/test-brackets_tsx.json +++ b/extensions/typescript/test/colorize-results/test-brackets_tsx.json @@ -29,7 +29,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -73,7 +73,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -95,7 +95,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -194,7 +194,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -238,7 +238,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -271,7 +271,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -293,7 +293,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -359,7 +359,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/typescript/test/colorize-results/test-function-inv_ts.json b/extensions/typescript/test/colorize-results/test-function-inv_ts.json index 5e3326255f7..c99ec3d0ce2 100644 --- a/extensions/typescript/test/colorize-results/test-function-inv_ts.json +++ b/extensions/typescript/test/colorize-results/test-function-inv_ts.json @@ -7,7 +7,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -29,7 +29,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -51,7 +51,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -95,7 +95,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -117,7 +117,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -150,7 +150,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/typescript/test/colorize-results/test-issue11_ts.json b/extensions/typescript/test/colorize-results/test-issue11_ts.json index dec1231bd19..c7ee2e71f21 100644 --- a/extensions/typescript/test/colorize-results/test-issue11_ts.json +++ b/extensions/typescript/test/colorize-results/test-issue11_ts.json @@ -29,7 +29,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -95,7 +95,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -139,7 +139,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -238,7 +238,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -304,7 +304,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -370,7 +370,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -425,7 +425,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -480,7 +480,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -535,7 +535,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -590,7 +590,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -645,7 +645,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -700,7 +700,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -755,7 +755,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -810,7 +810,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -865,7 +865,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -920,7 +920,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -975,7 +975,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1030,7 +1030,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1085,7 +1085,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1162,7 +1162,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1217,7 +1217,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1316,7 +1316,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1426,7 +1426,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1503,7 +1503,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1723,7 +1723,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -1745,7 +1745,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -1778,7 +1778,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -1866,7 +1866,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -1888,7 +1888,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -1954,7 +1954,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2042,7 +2042,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -2152,7 +2152,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -2229,7 +2229,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -2306,7 +2306,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -2328,7 +2328,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -2405,7 +2405,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2482,7 +2482,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2515,7 +2515,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -2548,7 +2548,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2592,7 +2592,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -2647,7 +2647,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -2680,7 +2680,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -2735,7 +2735,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2768,7 +2768,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -2790,7 +2790,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -2834,7 +2834,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -2867,7 +2867,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -2911,7 +2911,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -2966,7 +2966,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3252,7 +3252,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3340,7 +3340,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -3362,7 +3362,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { diff --git a/extensions/typescript/test/colorize-results/test-issue5431_ts.json b/extensions/typescript/test/colorize-results/test-issue5431_ts.json index 8f699a350f5..9d1dd3c555b 100644 --- a/extensions/typescript/test/colorize-results/test-issue5431_ts.json +++ b/extensions/typescript/test/colorize-results/test-issue5431_ts.json @@ -29,7 +29,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -51,7 +51,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -84,7 +84,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -117,7 +117,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -194,7 +194,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -238,7 +238,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -370,7 +370,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -414,7 +414,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -469,7 +469,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { diff --git a/extensions/typescript/test/colorize-results/test-issue5465_ts.json b/extensions/typescript/test/colorize-results/test-issue5465_ts.json index f43dc3fba29..f4a61d6e1ac 100644 --- a/extensions/typescript/test/colorize-results/test-issue5465_ts.json +++ b/extensions/typescript/test/colorize-results/test-issue5465_ts.json @@ -40,7 +40,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -106,7 +106,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -183,7 +183,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { diff --git a/extensions/typescript/test/colorize-results/test-issue5566_ts.json b/extensions/typescript/test/colorize-results/test-issue5566_ts.json index 1d4071b8100..86357c7c0cd 100644 --- a/extensions/typescript/test/colorize-results/test-issue5566_ts.json +++ b/extensions/typescript/test/colorize-results/test-issue5566_ts.json @@ -29,7 +29,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -117,7 +117,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -205,7 +205,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -315,7 +315,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { diff --git a/extensions/typescript/test/colorize-results/test-keywords_ts.json b/extensions/typescript/test/colorize-results/test-keywords_ts.json index ac1e6e571f7..016639c505d 100644 --- a/extensions/typescript/test/colorize-results/test-keywords_ts.json +++ b/extensions/typescript/test/colorize-results/test-keywords_ts.json @@ -7,7 +7,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -51,7 +51,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -172,7 +172,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { diff --git a/extensions/typescript/test/colorize-results/test-members_ts.json b/extensions/typescript/test/colorize-results/test-members_ts.json index e6937242dc4..05e924b9c13 100644 --- a/extensions/typescript/test/colorize-results/test-members_ts.json +++ b/extensions/typescript/test/colorize-results/test-members_ts.json @@ -29,7 +29,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -73,7 +73,7 @@ "light_plus": "entity.other.inherited-class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.other.inherited-class: #4EC9B0" } }, { @@ -139,7 +139,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -172,7 +172,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -271,7 +271,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -293,7 +293,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -337,7 +337,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { diff --git a/extensions/typescript/test/colorize-results/test-object-literals_ts.json b/extensions/typescript/test/colorize-results/test-object-literals_ts.json index 36b795a88e5..1b5123075e0 100644 --- a/extensions/typescript/test/colorize-results/test-object-literals_ts.json +++ b/extensions/typescript/test/colorize-results/test-object-literals_ts.json @@ -29,7 +29,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -95,7 +95,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -106,7 +106,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -150,7 +150,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -161,7 +161,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -183,7 +183,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -216,7 +216,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { @@ -227,7 +227,7 @@ "light_plus": "meta.object-literal.key: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "meta.object-literal.key: #9CDCFE" } }, { diff --git a/extensions/typescript/test/colorize-results/test-strings_ts.json b/extensions/typescript/test/colorize-results/test-strings_ts.json index c3486c526ff..fd42a3a3930 100644 --- a/extensions/typescript/test/colorize-results/test-strings_ts.json +++ b/extensions/typescript/test/colorize-results/test-strings_ts.json @@ -29,7 +29,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -106,7 +106,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -161,7 +161,7 @@ "light_plus": "support.class: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.class: #4EC9B0" } }, { @@ -183,7 +183,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -271,7 +271,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -315,7 +315,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -370,7 +370,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -414,7 +414,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -480,7 +480,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { @@ -524,7 +524,7 @@ "light_plus": "variable: #001080", "dark_vs": "string: #CE9178", "light_vs": "string: #A31515", - "hc_black": "string: #CE9178" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/typescript/test/colorize-results/test-this_ts.json b/extensions/typescript/test/colorize-results/test-this_ts.json index 0efe6a8d69c..bb626c7e100 100644 --- a/extensions/typescript/test/colorize-results/test-this_ts.json +++ b/extensions/typescript/test/colorize-results/test-this_ts.json @@ -51,7 +51,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { diff --git a/extensions/typescript/test/colorize-results/test_ts.json b/extensions/typescript/test/colorize-results/test_ts.json index d407ffa3a5b..72fb99dba53 100644 --- a/extensions/typescript/test/colorize-results/test_ts.json +++ b/extensions/typescript/test/colorize-results/test_ts.json @@ -95,7 +95,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -139,7 +139,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -183,7 +183,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -249,7 +249,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -282,7 +282,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -337,7 +337,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -370,7 +370,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -425,7 +425,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -458,7 +458,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -513,7 +513,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -546,7 +546,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -579,7 +579,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -612,7 +612,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -645,7 +645,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -678,7 +678,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -755,7 +755,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -799,7 +799,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -854,7 +854,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -898,7 +898,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -953,7 +953,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -997,7 +997,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1063,7 +1063,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1107,7 +1107,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -1173,7 +1173,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1206,7 +1206,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -1261,7 +1261,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1294,7 +1294,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -1349,7 +1349,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1382,7 +1382,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -1437,7 +1437,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1470,7 +1470,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -1525,7 +1525,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1558,7 +1558,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -1613,7 +1613,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1646,7 +1646,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -1701,7 +1701,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1734,7 +1734,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -1789,7 +1789,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1822,7 +1822,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -1877,7 +1877,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1998,7 +1998,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2097,7 +2097,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2196,7 +2196,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2317,7 +2317,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2438,7 +2438,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2559,7 +2559,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2680,7 +2680,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2779,7 +2779,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2878,7 +2878,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2944,7 +2944,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -3010,7 +3010,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -3098,7 +3098,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -3164,7 +3164,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -3208,7 +3208,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -3252,7 +3252,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3296,7 +3296,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -3373,7 +3373,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3395,7 +3395,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3439,7 +3439,7 @@ "light_plus": "support.constant.math: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.constant.math: #4EC9B0" } }, { @@ -3461,7 +3461,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -3538,7 +3538,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3571,7 +3571,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -3593,7 +3593,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3714,7 +3714,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -3780,7 +3780,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -3846,7 +3846,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3912,7 +3912,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -3956,7 +3956,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -3989,7 +3989,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -4066,7 +4066,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4132,7 +4132,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4154,7 +4154,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4176,7 +4176,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4198,7 +4198,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4220,7 +4220,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4286,7 +4286,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -4308,7 +4308,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4352,7 +4352,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -4396,7 +4396,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -4418,7 +4418,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4506,7 +4506,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -4627,7 +4627,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -4704,7 +4704,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4792,7 +4792,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -4814,7 +4814,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -4858,7 +4858,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -4935,7 +4935,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5001,7 +5001,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -5023,7 +5023,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5089,7 +5089,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5155,7 +5155,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -5177,7 +5177,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5199,7 +5199,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5232,7 +5232,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5254,7 +5254,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5287,7 +5287,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5309,7 +5309,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5353,7 +5353,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -5375,7 +5375,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5463,7 +5463,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5540,7 +5540,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5562,7 +5562,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5639,7 +5639,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -5661,7 +5661,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -5683,7 +5683,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5760,7 +5760,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5782,7 +5782,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5859,7 +5859,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -5881,7 +5881,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -5958,7 +5958,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -5980,7 +5980,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -6024,7 +6024,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -6101,7 +6101,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -6178,7 +6178,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6222,7 +6222,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -6310,7 +6310,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -6376,7 +6376,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -6442,7 +6442,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6486,7 +6486,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -6574,7 +6574,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -6651,7 +6651,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -6717,7 +6717,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6739,7 +6739,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -6827,7 +6827,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -6904,7 +6904,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6937,7 +6937,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -6981,7 +6981,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -7003,7 +7003,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -7025,7 +7025,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -7069,7 +7069,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -7102,7 +7102,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -7124,7 +7124,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -7168,7 +7168,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -7223,7 +7223,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -7333,7 +7333,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -7355,7 +7355,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -7432,7 +7432,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -7454,7 +7454,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -7498,7 +7498,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -7531,7 +7531,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -7575,7 +7575,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -7630,7 +7630,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -7652,7 +7652,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -7740,7 +7740,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -7828,7 +7828,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -7894,7 +7894,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -7938,7 +7938,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8004,7 +8004,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8037,7 +8037,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -8092,7 +8092,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -8136,7 +8136,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8158,7 +8158,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8180,7 +8180,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8213,7 +8213,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8290,7 +8290,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -8312,7 +8312,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8389,7 +8389,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8466,7 +8466,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -8510,7 +8510,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8587,7 +8587,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8653,7 +8653,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8686,7 +8686,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8774,7 +8774,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8851,7 +8851,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -8895,7 +8895,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -8972,7 +8972,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -9038,7 +9038,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -9071,7 +9071,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -9137,7 +9137,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -9159,7 +9159,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -9181,7 +9181,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -9225,7 +9225,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -9247,7 +9247,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -9280,7 +9280,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -9390,7 +9390,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -9412,7 +9412,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -9434,7 +9434,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -9500,7 +9500,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -9522,7 +9522,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -9599,7 +9599,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -9621,7 +9621,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -9665,7 +9665,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -9720,7 +9720,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -9764,7 +9764,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -9863,7 +9863,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -9929,7 +9929,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -9973,7 +9973,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10028,7 +10028,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10050,7 +10050,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10116,7 +10116,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10171,7 +10171,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10193,7 +10193,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -10215,7 +10215,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10237,7 +10237,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10303,7 +10303,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10336,7 +10336,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10358,7 +10358,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10402,7 +10402,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10457,7 +10457,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10512,7 +10512,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10578,7 +10578,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10600,7 +10600,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10644,7 +10644,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10666,7 +10666,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10732,7 +10732,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10798,7 +10798,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10853,7 +10853,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10875,7 +10875,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -10897,7 +10897,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10919,7 +10919,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -10985,7 +10985,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -11018,7 +11018,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -11040,7 +11040,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -11084,7 +11084,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -11139,7 +11139,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -11194,7 +11194,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -11304,7 +11304,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -11370,7 +11370,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -11392,7 +11392,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { diff --git a/extensions/vb/test/colorize-results/test_vb.json b/extensions/vb/test/colorize-results/test_vb.json index abbc7e6a32f..b4567db9c74 100644 --- a/extensions/vb/test/colorize-results/test_vb.json +++ b/extensions/vb/test/colorize-results/test_vb.json @@ -40,7 +40,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -62,7 +62,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -106,7 +106,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -128,7 +128,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -293,7 +293,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -348,7 +348,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -359,7 +359,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -370,7 +370,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -403,7 +403,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -447,7 +447,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -458,7 +458,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -469,7 +469,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -502,7 +502,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -546,7 +546,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -557,7 +557,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -568,7 +568,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -601,7 +601,7 @@ "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.type: #4EC9B0" } }, { @@ -722,7 +722,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -766,7 +766,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -788,7 +788,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -832,7 +832,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -865,7 +865,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -898,7 +898,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -920,7 +920,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -942,7 +942,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -964,7 +964,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1019,7 +1019,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1052,7 +1052,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1250,7 +1250,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1272,7 +1272,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1294,7 +1294,7 @@ "light_plus": "support.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "support.function: #DCDCAA" } }, { @@ -1349,7 +1349,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1382,7 +1382,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1415,7 +1415,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1514,7 +1514,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { @@ -1536,7 +1536,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1624,7 +1624,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1646,7 +1646,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1668,7 +1668,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -1866,7 +1866,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1888,7 +1888,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1910,7 +1910,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -1998,7 +1998,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2031,7 +2031,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2064,7 +2064,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -2119,7 +2119,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -2163,7 +2163,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { diff --git a/extensions/yaml/test/colorize-results/test_yaml.json b/extensions/yaml/test/colorize-results/test_yaml.json index 8bea09ae57d..e4e35ba7eef 100644 --- a/extensions/yaml/test/colorize-results/test_yaml.json +++ b/extensions/yaml/test/colorize-results/test_yaml.json @@ -84,7 +84,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -95,7 +95,7 @@ "light_plus": "entity.name.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.type: #4EC9B0" } }, { @@ -348,7 +348,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -359,7 +359,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -447,7 +447,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -458,7 +458,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { @@ -579,7 +579,7 @@ "light_plus": "keyword.control: #AF00DB", "dark_vs": "keyword.control: #569CD6", "light_vs": "keyword.control: #0000FF", - "hc_black": "keyword.control: #569CD6" + "hc_black": "keyword.control: #C586C0" } }, { @@ -590,7 +590,7 @@ "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { From 2bae11e918213340133c2c177b7588ae16f5c124 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 11:05:17 +0200 Subject: [PATCH 0569/1164] increase max_old_space_size --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bdf9d6ec67c..d7036074be8 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "monaco-editor-setup": "node scripts/monaco-editor-setup.js", "monaco-editor-test": "mocha --only-monaco-editor", "precommit": "node build/gulpfile.hygiene.js", - "gulp": "gulp", + "gulp": "gulp --max_old_space_size=4096", "7z": "7z" }, "dependencies": { From 57570d5cb79fcb03aeb9c08cc2b6f5bc203274cf Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 18 May 2017 11:11:44 +0200 Subject: [PATCH 0570/1164] [php] update grammar (fixes #26543) --- extensions/php/syntaxes/php.tmLanguage.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/php/syntaxes/php.tmLanguage.json b/extensions/php/syntaxes/php.tmLanguage.json index 36af0819d40..d7e3a548ade 100644 --- a/extensions/php/syntaxes/php.tmLanguage.json +++ b/extensions/php/syntaxes/php.tmLanguage.json @@ -1651,7 +1651,7 @@ ] }, { - "begin": "(?x)\\s*\n\t\t\t\t\t ((?:(?:final|abstract|public|private|protected|static)\\s+)*)\n\t\t\t\t (function)\n\t\t\t\t (?:\\s+|(\\s*&\\s*))\n\t\t\t\t (?:\n\t\t\t\t (__(?:call|construct|debugInfo|destruct|get|set|isset|unset|tostring|clone|set_state|sleep|wakeup|autoload|invoke|callStatic))\n\t\t\t\t |([a-zA-Z0-9_]+)\n\t\t\t\t )\n\t\t\t\t \\s*\n\t\t\t\t (\\()", + "begin": "(?x)\\s*\n\t\t\t\t\t ((?:(?:final|abstract|public|private|protected|static)\\s+)*)\n\t\t\t\t (function)\n\t\t\t\t (?:\\s+|(\\s*&\\s*))\n\t\t\t\t (?:\n\t\t\t\t (__(?:call|construct|debugInfo|destruct|get|set|isset|unset|tostring|clone|set_state|sleep|wakeup|autoload|invoke|callStatic))\n\t\t\t\t |([a-zA-Z_\\x{7f}-\\x{ff}][a-zA-Z0-9_\\x{7f}-\\x{ff}]*)\n\t\t\t\t )\n\t\t\t\t \\s*\n\t\t\t\t (\\()", "beginCaptures": { "1": { "patterns": [ @@ -2100,7 +2100,7 @@ "match": "(@xlink)\\s+(.+)\\s*$" }, { - "match": "\\@(a(pi|bstract|uthor)|c(ategory|opyright)|example|global|internal|li(cense|nk)|method|p(roperty(\\-read|\\-write|)|ackage|aram)|return|s(ee|ince|ource|tatic|ubpackage)|t(hrows|odo)|v(ar|ersion)|uses|deprecated|final|ignore)\\b", + "match": "\\@(a(pi|bstract|uthor)|c(ategory|opyright)|example|global|in(herit[Dd]oc|ternal)|li(cense|nk)|method|p(roperty(\\-read|\\-write|)|ackage|aram)|return|s(ee|ince|ource|tatic|ubpackage)|t(hrows|odo)|v(ar|ersion)|uses|deprecated|final|ignore)\\b", "name": "keyword.other.phpdoc.php" }, { @@ -2109,7 +2109,7 @@ "name": "keyword.other.phpdoc.php" } }, - "match": "\\{(@(link)).+?\\}", + "match": "\\{(@(link|inherit[Dd]oc)).+?\\}", "name": "meta.tag.inline.phpdoc.php" } ] @@ -2975,5 +2975,5 @@ ] } }, - "version": "https://github.com/atom/language-php/commit/fca6a6763bd5e07b2cc0a82fda502dbf3bce5dea" + "version": "https://github.com/atom/language-php/commit/22047c19f52f686de471d0deccae0cb1332997b6" } \ No newline at end of file From 7e03c9d106ebee683e280252a50d9fd7b6a8e68e Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 18 May 2017 11:16:39 +0200 Subject: [PATCH 0571/1164] hc theme - improve colors (inspired by high contrast ms word) --- extensions/theme-defaults/themes/hc_black.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/extensions/theme-defaults/themes/hc_black.json b/extensions/theme-defaults/themes/hc_black.json index 401ed6a0ab6..0db3c99f1fc 100644 --- a/extensions/theme-defaults/themes/hc_black.json +++ b/extensions/theme-defaults/themes/hc_black.json @@ -2,6 +2,11 @@ "$schema": "vscode://schemas/color-theme", "name": "Dark High Contrast", "include": "./hc_black_defaults.json", + "colors": { + "selection.background": "#008000", + "statusBar.background": "#008000", + "editor.selectionBackground": "#FFFFFF" + }, "tokenColors": [ { "name": "Function declarations", From 3e8103ceeca6db9fa1493d0c1ee72780d9a2479b Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 18 May 2017 10:28:39 +0200 Subject: [PATCH 0572/1164] Simplify cursor creation --- .../editor/browser/widget/codeEditorWidget.ts | 5 ++- src/vs/editor/common/commonCodeEditor.ts | 34 ++----------------- .../editor/common/viewModel/viewModelImpl.ts | 22 ++++++++++++ 3 files changed, 29 insertions(+), 32 deletions(-) diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index 2d98476d439..29d8baf1cad 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -182,7 +182,10 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito } public getCompletelyVisibleLinesRangeInViewport(): Range { - const viewRange = this._getCompletelyVisibleViewRange(); + if (!this.hasView) { + return null; + } + const viewRange = this.viewModel.getCompletelyVisibleViewRange(); return this.viewModel.coordinatesConverter.convertViewRangeToModelRange(viewRange); } diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index 64c0a5486f1..2b9facec788 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -243,34 +243,6 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo return this.viewModel.getCenteredRangeInViewport(); } - protected _getCompletelyVisibleViewRange(): Range { - if (!this.hasView) { - return null; - } - const partialData = this.viewModel.viewLayout.getLinesViewportData(); - const startViewLineNumber = partialData.completelyVisibleStartLineNumber; - const endViewLineNumber = partialData.completelyVisibleEndLineNumber; - - return new Range( - startViewLineNumber, this.viewModel.getLineMinColumn(startViewLineNumber), - endViewLineNumber, this.viewModel.getLineMaxColumn(endViewLineNumber) - ); - } - - protected _getCompletelyVisibleViewRangeAtScrollTop(scrollTop: number): Range { - if (!this.hasView) { - return null; - } - const partialData = this.viewModel.viewLayout.getLinesViewportDataAtScrollTop(scrollTop); - const startViewLineNumber = partialData.completelyVisibleStartLineNumber; - const endViewLineNumber = partialData.completelyVisibleEndLineNumber; - - return new Range( - startViewLineNumber, this.viewModel.getLineMinColumn(startViewLineNumber), - endViewLineNumber, this.viewModel.getLineMaxColumn(endViewLineNumber) - ); - } - public getVisibleColumnFromPosition(rawPosition: IPosition): number { if (!this.model) { return rawPosition.column; @@ -880,13 +852,13 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo viewModel: this.viewModel, coordinatesConverter: this.viewModel.coordinatesConverter, getScrollTop: (): number => { - return this.getScrollTop(); + return this.viewModel.viewLayout.getScrollTop(); }, getCompletelyVisibleViewRange: (): Range => { - return this._getCompletelyVisibleViewRange(); + return this.viewModel.getCompletelyVisibleViewRange(); }, getCompletelyVisibleViewRangeAtScrollTop: (scrollTop: number): Range => { - return this._getCompletelyVisibleViewRangeAtScrollTop(scrollTop); + return this.viewModel.getCompletelyVisibleViewRangeAtScrollTop(scrollTop); }, getVerticalOffsetForViewLineNumber: (viewLineNumber: number): number => { return this.viewModel.viewLayout.getVerticalOffsetForLineNumber(viewLineNumber); diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 0ffdbddf6af..c0d92a40102 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -401,6 +401,28 @@ export class ViewModel extends ViewEventEmitter implements IViewModel { return this.coordinatesConverter.convertViewRangeToModelRange(currentCenteredViewRange); } + public getCompletelyVisibleViewRange(): Range { + const partialData = this.viewLayout.getLinesViewportData(); + const startViewLineNumber = partialData.completelyVisibleStartLineNumber; + const endViewLineNumber = partialData.completelyVisibleEndLineNumber; + + return new Range( + startViewLineNumber, this.getLineMinColumn(startViewLineNumber), + endViewLineNumber, this.getLineMaxColumn(endViewLineNumber) + ); + } + + public getCompletelyVisibleViewRangeAtScrollTop(scrollTop: number): Range { + const partialData = this.viewLayout.getLinesViewportDataAtScrollTop(scrollTop); + const startViewLineNumber = partialData.completelyVisibleStartLineNumber; + const endViewLineNumber = partialData.completelyVisibleEndLineNumber; + + return new Range( + startViewLineNumber, this.getLineMinColumn(startViewLineNumber), + endViewLineNumber, this.getLineMaxColumn(endViewLineNumber) + ); + } + public getTabSize(): number { return this.model.getOptions().tabSize; } From 371000f2066f615cc39c10ba5e32af0937f63804 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 18 May 2017 10:49:10 +0200 Subject: [PATCH 0573/1164] Move emptySelectionClipboard out of contribInfo --- .../common/config/commonEditorConfig.ts | 2 +- src/vs/editor/common/config/editorOptions.ts | 71 ++++++++++--------- .../contrib/clipboard/browser/clipboard.ts | 6 +- src/vs/editor/editor.main.ts | 2 +- src/vs/monaco.d.ts | 3 +- 5 files changed, 46 insertions(+), 38 deletions(-) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index e804b2bd36b..2c7aacd044a 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -385,7 +385,7 @@ const editorConfiguration: IConfigurationNode = { }, 'editor.emptySelectionClipboard': { 'type': 'boolean', - 'default': EDITOR_DEFAULTS.contribInfo.emptySelectionClipboard, + 'default': EDITOR_DEFAULTS.emptySelectionClipboard, 'description': nls.localize('emptySelectionClipboard', "Controls whether copying without a selection copies the current line.") }, 'editor.wordBasedSuggestions': { diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 2bc5f7ad1f9..529555dbab5 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -729,7 +729,6 @@ export interface EditorContribOptions { readonly acceptSuggestionOnEnter: boolean; readonly acceptSuggestionOnCommitCharacter: boolean; readonly snippetSuggestions: 'top' | 'bottom' | 'inline' | 'none'; - readonly emptySelectionClipboard: boolean; readonly wordBasedSuggestions: boolean; readonly suggestFontSize: number; readonly suggestLineHeight: number; @@ -741,6 +740,36 @@ export interface EditorContribOptions { readonly matchBrackets: boolean; } +/** + * Validated configuration options for the editor. + * This is a 1 to 1 validated/parsed version of IEditorOptions merged on top of the defaults. + * @internal + */ +export interface IValidatedEditorOptions { + readonly inDiffEditor: boolean; + readonly wordSeparators: string; + readonly lineNumbersMinChars: number; + readonly lineDecorationsWidth: number | string; + readonly readOnly: boolean; + readonly mouseStyle: 'text' | 'default' | 'copy'; + readonly disableTranslate3d: boolean; + readonly automaticLayout: boolean; + readonly wordWrap: 'off' | 'on' | 'wordWrapColumn' | 'bounded'; + readonly wordWrapColumn: number; + readonly wordWrapMinified: boolean; + readonly wrappingIndent: WrappingIndent; + readonly wordWrapBreakBeforeCharacters: string; + readonly wordWrapBreakAfterCharacters: string; + readonly wordWrapBreakObtrusiveCharacters: string; + readonly autoClosingBrackets: boolean; + readonly dragAndDrop: boolean; + readonly emptySelectionClipboard: boolean; + readonly useTabStops: boolean; + + readonly viewInfo: InternalEditorViewOptions; + readonly contribInfo: EditorContribOptions; +} + /** * Internal configuration options (transformed or computed) for the editor. */ @@ -759,6 +788,7 @@ export class InternalEditorOptions { readonly useTabStops: boolean; readonly tabFocusMode: boolean; readonly dragAndDrop: boolean; + readonly emptySelectionClipboard: boolean; // ---- grouped options readonly layoutInfo: EditorLayoutInfo; @@ -781,6 +811,7 @@ export class InternalEditorOptions { useTabStops: boolean; tabFocusMode: boolean; dragAndDrop: boolean; + emptySelectionClipboard: boolean; layoutInfo: EditorLayoutInfo; fontInfo: FontInfo; viewInfo: InternalEditorViewOptions; @@ -797,6 +828,7 @@ export class InternalEditorOptions { this.useTabStops = source.useTabStops; this.tabFocusMode = source.tabFocusMode; this.dragAndDrop = source.dragAndDrop; + this.emptySelectionClipboard = source.emptySelectionClipboard; this.layoutInfo = source.layoutInfo; this.fontInfo = source.fontInfo; this.viewInfo = source.viewInfo; @@ -819,6 +851,7 @@ export class InternalEditorOptions { && this.useTabStops === other.useTabStops && this.tabFocusMode === other.tabFocusMode && this.dragAndDrop === other.dragAndDrop + && this.emptySelectionClipboard === other.emptySelectionClipboard && InternalEditorOptions._equalsLayoutInfo(this.layoutInfo, other.layoutInfo) && this.fontInfo.equals(other.fontInfo) && InternalEditorOptions._equalsViewOptions(this.viewInfo, other.viewInfo) @@ -842,6 +875,7 @@ export class InternalEditorOptions { useTabStops: (this.useTabStops !== newOpts.useTabStops), tabFocusMode: (this.tabFocusMode !== newOpts.tabFocusMode), dragAndDrop: (this.dragAndDrop !== newOpts.dragAndDrop), + emptySelectionClipboard: (this.emptySelectionClipboard !== newOpts.emptySelectionClipboard), layoutInfo: (!InternalEditorOptions._equalsLayoutInfo(this.layoutInfo, newOpts.layoutInfo)), fontInfo: (!this.fontInfo.equals(newOpts.fontInfo)), viewInfo: (!InternalEditorOptions._equalsViewOptions(this.viewInfo, newOpts.viewInfo)), @@ -1004,7 +1038,6 @@ export class InternalEditorOptions { && a.acceptSuggestionOnEnter === b.acceptSuggestionOnEnter && a.acceptSuggestionOnCommitCharacter === b.acceptSuggestionOnCommitCharacter && a.snippetSuggestions === b.snippetSuggestions - && a.emptySelectionClipboard === b.emptySelectionClipboard && a.wordBasedSuggestions === b.wordBasedSuggestions && a.suggestFontSize === b.suggestFontSize && a.suggestLineHeight === b.suggestLineHeight @@ -1167,6 +1200,7 @@ export interface IConfigurationChangedEvent { readonly useTabStops: boolean; readonly tabFocusMode: boolean; readonly dragAndDrop: boolean; + readonly emptySelectionClipboard: boolean; readonly layoutInfo: boolean; readonly fontInfo: boolean; readonly viewInfo: boolean; @@ -1189,34 +1223,6 @@ export interface IEnvironmentalOptions { readonly tabFocusMode: boolean; } -/** - * Validated configuration options for the editor. - * @internal - */ -export interface IValidatedEditorOptions { - inDiffEditor: boolean; - wordSeparators: string; - lineNumbersMinChars: number; - lineDecorationsWidth: number | string; - readOnly: boolean; - mouseStyle: 'text' | 'default' | 'copy'; - disableTranslate3d: boolean; - automaticLayout: boolean; - wordWrap: 'off' | 'on' | 'wordWrapColumn' | 'bounded'; - wordWrapColumn: number; - wordWrapMinified: boolean; - wrappingIndent: WrappingIndent; - wordWrapBreakBeforeCharacters: string; - wordWrapBreakAfterCharacters: string; - wordWrapBreakObtrusiveCharacters: string; - autoClosingBrackets: boolean; - dragAndDrop: boolean; - useTabStops: boolean; - - viewInfo: InternalEditorViewOptions; - contribInfo: EditorContribOptions; -} - function _boolean(value: any, defaultValue: T): boolean | T { if (typeof value === 'undefined') { return defaultValue; @@ -1358,6 +1364,7 @@ export class EditorOptionsValidator { wordWrapBreakObtrusiveCharacters: _string(opts.wordWrapBreakObtrusiveCharacters, defaults.wordWrapBreakObtrusiveCharacters), autoClosingBrackets: _boolean(opts.autoClosingBrackets, defaults.autoClosingBrackets), dragAndDrop: _boolean(opts.dragAndDrop, defaults.dragAndDrop), + emptySelectionClipboard: _boolean(opts.emptySelectionClipboard, defaults.emptySelectionClipboard), useTabStops: _boolean(opts.useTabStops, defaults.useTabStops), viewInfo: viewInfo, contribInfo: contribInfo, @@ -1527,7 +1534,6 @@ export class EditorOptionsValidator { acceptSuggestionOnEnter: _boolean(opts.acceptSuggestionOnEnter, defaults.acceptSuggestionOnEnter), acceptSuggestionOnCommitCharacter: _boolean(opts.acceptSuggestionOnCommitCharacter, defaults.acceptSuggestionOnCommitCharacter), snippetSuggestions: _stringSet<'top' | 'bottom' | 'inline' | 'none'>(opts.snippetSuggestions, defaults.snippetSuggestions, ['top', 'bottom', 'inline', 'none']), - emptySelectionClipboard: _boolean(opts.emptySelectionClipboard, defaults.emptySelectionClipboard), wordBasedSuggestions: _boolean(opts.wordBasedSuggestions, defaults.wordBasedSuggestions), suggestFontSize: _clampedInt(opts.suggestFontSize, defaults.suggestFontSize, 0, 1000), suggestLineHeight: _clampedInt(opts.suggestLineHeight, defaults.suggestLineHeight, 0, 1000), @@ -1659,6 +1665,7 @@ export class InternalEditorOptionsFactory { useTabStops: opts.useTabStops, tabFocusMode: opts.readOnly ? true : env.tabFocusMode, dragAndDrop: opts.dragAndDrop, + emptySelectionClipboard: opts.emptySelectionClipboard, layoutInfo: layoutInfo, fontInfo: env.fontInfo, viewInfo: opts.viewInfo, @@ -1869,6 +1876,7 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { wordWrapBreakObtrusiveCharacters: '.', autoClosingBrackets: true, dragAndDrop: false, + emptySelectionClipboard: true, useTabStops: true, viewInfo: { @@ -1933,7 +1941,6 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { acceptSuggestionOnEnter: true, acceptSuggestionOnCommitCharacter: true, snippetSuggestions: 'inline', - emptySelectionClipboard: true, wordBasedSuggestions: true, suggestFontSize: 0, suggestLineHeight: 0, diff --git a/src/vs/editor/contrib/clipboard/browser/clipboard.ts b/src/vs/editor/contrib/clipboard/browser/clipboard.ts index 5f0be755a14..5dc8118dfe3 100644 --- a/src/vs/editor/contrib/clipboard/browser/clipboard.ts +++ b/src/vs/editor/contrib/clipboard/browser/clipboard.ts @@ -81,7 +81,7 @@ class ExecCommandCutAction extends ExecCommandAction { } public run(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor): void { - var enableEmptySelectionClipboard = editor.getConfiguration().contribInfo.emptySelectionClipboard && browser.enableEmptySelectionClipboard; + var enableEmptySelectionClipboard = editor.getConfiguration().emptySelectionClipboard && browser.enableEmptySelectionClipboard; if (!enableEmptySelectionClipboard && editor.getSelection().isEmpty()) { return; @@ -113,7 +113,7 @@ class ExecCommandCopyAction extends ExecCommandAction { } public run(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor): void { - var enableEmptySelectionClipboard = editor.getConfiguration().contribInfo.emptySelectionClipboard && browser.enableEmptySelectionClipboard; + var enableEmptySelectionClipboard = editor.getConfiguration().emptySelectionClipboard && browser.enableEmptySelectionClipboard; if (!enableEmptySelectionClipboard && editor.getSelection().isEmpty()) { return; @@ -162,7 +162,7 @@ class ExecCommandCopyWithSyntaxHighlightingAction extends ExecCommandAction { } public run(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor): void { - var enableEmptySelectionClipboard = editor.getConfiguration().contribInfo.emptySelectionClipboard && browser.enableEmptySelectionClipboard; + var enableEmptySelectionClipboard = editor.getConfiguration().emptySelectionClipboard && browser.enableEmptySelectionClipboard; if (!enableEmptySelectionClipboard && editor.getSelection().isEmpty()) { return; diff --git a/src/vs/editor/editor.main.ts b/src/vs/editor/editor.main.ts index 7820913b7de..8e3a8c151dd 100644 --- a/src/vs/editor/editor.main.ts +++ b/src/vs/editor/editor.main.ts @@ -17,7 +17,7 @@ import { createMonacoLanguagesAPI } from 'vs/editor/browser/standalone/standalon import { EDITOR_DEFAULTS, WrappingIndent } from "vs/editor/common/config/editorOptions"; // Set defaults for standalone editor -EDITOR_DEFAULTS.wrappingIndent = WrappingIndent.None; +(EDITOR_DEFAULTS).wrappingIndent = WrappingIndent.None; (EDITOR_DEFAULTS.contribInfo).folding = false; (EDITOR_DEFAULTS.viewInfo).glyphMargin = false; diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 43916db530c..a06eec92796 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -3232,7 +3232,6 @@ declare module monaco.editor { readonly acceptSuggestionOnEnter: boolean; readonly acceptSuggestionOnCommitCharacter: boolean; readonly snippetSuggestions: 'top' | 'bottom' | 'inline' | 'none'; - readonly emptySelectionClipboard: boolean; readonly wordBasedSuggestions: boolean; readonly suggestFontSize: number; readonly suggestLineHeight: number; @@ -3259,6 +3258,7 @@ declare module monaco.editor { readonly useTabStops: boolean; readonly tabFocusMode: boolean; readonly dragAndDrop: boolean; + readonly emptySelectionClipboard: boolean; readonly layoutInfo: EditorLayoutInfo; readonly fontInfo: FontInfo; readonly viewInfo: InternalEditorViewOptions; @@ -3388,6 +3388,7 @@ declare module monaco.editor { readonly useTabStops: boolean; readonly tabFocusMode: boolean; readonly dragAndDrop: boolean; + readonly emptySelectionClipboard: boolean; readonly layoutInfo: boolean; readonly fontInfo: boolean; readonly viewInfo: boolean; From 7a15a509d07d50a5f6952f3b6337a4521676bc7f Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 18 May 2017 11:21:01 +0200 Subject: [PATCH 0574/1164] Remove browser.enableEmptySelectionClipboard --- src/vs/base/browser/browser.ts | 2 -- src/vs/editor/browser/config/configuration.ts | 1 + .../browser/controller/textAreaHandler.ts | 13 +++++++++---- .../editor/browser/widget/codeEditorWidget.ts | 5 ----- src/vs/editor/common/commonCodeEditor.ts | 5 +---- .../editor/common/config/commonEditorConfig.ts | 2 ++ src/vs/editor/common/config/editorOptions.ts | 3 ++- src/vs/editor/common/controller/cursor.ts | 7 ++----- .../editor/common/controller/cursorCommon.ts | 3 +++ .../controller/cursorDeleteOperations.ts | 4 ++-- src/vs/editor/common/view/viewEvents.ts | 2 ++ src/vs/editor/common/viewModel/viewModel.ts | 4 ++-- .../editor/common/viewModel/viewModelImpl.ts | 8 ++++---- .../contrib/clipboard/browser/clipboard.ts | 12 ++++++------ .../test/common/commands/commandTestUtils.ts | 2 +- .../test/common/commands/sideEditing.test.ts | 2 +- .../common/config/commonEditorConfig.test.ts | 1 + .../test/common/controller/cursor.test.ts | 18 +++++++++--------- .../controller/cursorMoveCommand.test.ts | 2 +- .../test/common/mocks/testConfiguration.ts | 1 + 20 files changed, 50 insertions(+), 47 deletions(-) diff --git a/src/vs/base/browser/browser.ts b/src/vs/base/browser/browser.ts index ed183b57cb9..39e20a28dd9 100644 --- a/src/vs/base/browser/browser.ts +++ b/src/vs/base/browser/browser.ts @@ -153,8 +153,6 @@ export function canUseTranslate3d(): boolean { return true; } -export const enableEmptySelectionClipboard = isWebKit; - export function supportsExecCommand(command: string): boolean { return ( (isIE || Platform.isNative) diff --git a/src/vs/editor/browser/config/configuration.ts b/src/vs/editor/browser/config/configuration.ts index 73a05a745c1..86fe73ad6de 100644 --- a/src/vs/editor/browser/config/configuration.ts +++ b/src/vs/editor/browser/config/configuration.ts @@ -351,6 +351,7 @@ export class Configuration extends CommonEditorConfiguration { outerWidth: this._elementSizeObserver.getWidth(), outerHeight: this._elementSizeObserver.getHeight(), canUseTranslate3d: browser.canUseTranslate3d(), + emptySelectionClipboard: browser.isWebKit, pixelRatio: browser.getPixelRatio(), zoomLevel: browser.getZoomLevel() }; diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index f56d75f5b8e..247fddd15e0 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -63,6 +63,7 @@ export class TextAreaHandler extends ViewPart { private _experimentalScreenReader: boolean; private _fontInfo: BareFontInfo; private _lineHeight: number; + private _emptySelectionClipboard: boolean; /** * Defined only when the text area is visible (composition case). @@ -93,6 +94,7 @@ export class TextAreaHandler extends ViewPart { this._experimentalScreenReader = conf.viewInfo.experimentalScreenReader; this._fontInfo = conf.fontInfo; this._lineHeight = conf.lineHeight; + this._emptySelectionClipboard = conf.emptySelectionClipboard; this._visibleTextArea = null; this._selections = [new Selection(1, 1, 1, 1)]; @@ -130,9 +132,9 @@ export class TextAreaHandler extends ViewPart { const textAreaInputHost: ITextAreaInputHost = { getPlainTextToCopy: (): string => { - const whatToCopy = this._context.model.getPlainTextToCopy(this._selections, browser.enableEmptySelectionClipboard); + const whatToCopy = this._context.model.getPlainTextToCopy(this._selections, this._emptySelectionClipboard); - if (browser.enableEmptySelectionClipboard) { + if (this._emptySelectionClipboard) { if (browser.isFirefox) { // When writing "LINE\r\n" to the clipboard and then pasting, // Firefox pastes "LINE\n", so let's work around this quirk @@ -149,7 +151,7 @@ export class TextAreaHandler extends ViewPart { }, getHTMLToCopy: (): string => { - return this._context.model.getHTMLToCopy(this._selections, browser.enableEmptySelectionClipboard); + return this._context.model.getHTMLToCopy(this._selections, this._emptySelectionClipboard); }, getScreenReaderContent: (currentState: TextAreaState): TextAreaState => { @@ -181,7 +183,7 @@ export class TextAreaHandler extends ViewPart { this._register(this._textAreaInput.onPaste((e: IPasteData) => { let pasteOnNewLine = false; - if (browser.enableEmptySelectionClipboard) { + if (this._emptySelectionClipboard) { pasteOnNewLine = (e.text === this._lastCopiedValue && this._lastCopiedValueIsFromEmptySelection); } this._viewController.paste('keyboard', e.text, pasteOnNewLine); @@ -285,6 +287,9 @@ export class TextAreaHandler extends ViewPart { if (e.pixelRatio) { this._pixelRatio = conf.pixelRatio; } + if (e.emptySelectionClipboard) { + this._emptySelectionClipboard = conf.emptySelectionClipboard; + } return true; } diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index 29d8baf1cad..a7de1e2bac1 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -9,7 +9,6 @@ import 'vs/editor/common/view/editorColorRegistry'; // initialze editor theming import 'vs/css!./media/tokens'; import { onUnexpectedError } from 'vs/base/common/errors'; import { TPromise } from 'vs/base/common/winjs.base'; -import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ICommandService } from 'vs/platform/commands/common/commands'; @@ -415,10 +414,6 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito } } - protected _enableEmptySelectionClipboard(): boolean { - return browser.enableEmptySelectionClipboard; - } - protected _createView(): void { this._view = new View( this._commandService, diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index 2b9facec788..d698e6a2f0c 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -902,8 +902,7 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo this.cursor = new Cursor( this._configuration, this.model, - viewModelHelper, - this._enableEmptySelectionClipboard() + viewModelHelper ); this.viewCursor = new ViewModelCursors( @@ -938,8 +937,6 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo } } - protected abstract _enableEmptySelectionClipboard(): boolean; - protected abstract _createView(): void; protected _postDetachModelCleanup(detachedModel: editorCommon.IModel): void { diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 2c7aacd044a..f1830ec4f78 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -56,6 +56,7 @@ export interface IEnvConfiguration { outerWidth: number; outerHeight: number; canUseTranslate3d: boolean; + emptySelectionClipboard: boolean; pixelRatio: number; zoomLevel: number; } @@ -119,6 +120,7 @@ export abstract class CommonEditorConfiguration extends Disposable implements ed isDominatedByLongLines: this._isDominatedByLongLines, lineNumbersDigitCount: this._lineNumbersDigitCount, canUseTranslate3d: partialEnv.canUseTranslate3d, + emptySelectionClipboard: partialEnv.emptySelectionClipboard, pixelRatio: partialEnv.pixelRatio, tabFocusMode: TabFocus.getTabFocusMode() }; diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 529555dbab5..5c43033f67a 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -1219,6 +1219,7 @@ export interface IEnvironmentalOptions { readonly isDominatedByLongLines: boolean; readonly lineNumbersDigitCount: number; readonly canUseTranslate3d: boolean; + readonly emptySelectionClipboard: boolean; readonly pixelRatio: number; readonly tabFocusMode: boolean; } @@ -1665,7 +1666,7 @@ export class InternalEditorOptionsFactory { useTabStops: opts.useTabStops, tabFocusMode: opts.readOnly ? true : env.tabFocusMode, dragAndDrop: opts.dragAndDrop, - emptySelectionClipboard: opts.emptySelectionClipboard, + emptySelectionClipboard: opts.emptySelectionClipboard && env.emptySelectionClipboard, layoutInfo: layoutInfo, fontInfo: env.fontInfo, viewInfo: opts.viewInfo, diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index b8a95cf04ae..bc49cef51d3 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -77,19 +77,16 @@ export class Cursor extends Disposable implements ICursors { private _isDoingComposition: boolean; private _columnSelectData: IColumnSelectData; - private enableEmptySelectionClipboard: boolean; - private _handlers: { [key: string]: (ctx: IMultipleCursorOperationContext) => void; }; - constructor(configuration: editorCommon.IConfiguration, model: editorCommon.IModel, viewModelHelper: IViewModelHelper, enableEmptySelectionClipboard: boolean) { + constructor(configuration: editorCommon.IConfiguration, model: editorCommon.IModel, viewModelHelper: IViewModelHelper) { super(); this._eventEmitter = this._register(new EventEmitter()); this.configuration = configuration; this.model = model; this.viewModelHelper = viewModelHelper; - this.enableEmptySelectionClipboard = enableEmptySelectionClipboard; const createCursorContext = () => { const config = new CursorConfiguration( @@ -1062,7 +1059,7 @@ export class Cursor extends Disposable implements ICursors { } private _cut(ctx: IMultipleCursorOperationContext): void { - this._applyEdits(ctx, DeleteOperations.cut(this.context.config, this.context.model, this._getAllCursorsModelState(), this.enableEmptySelectionClipboard)); + this._applyEdits(ctx, DeleteOperations.cut(this.context.config, this.context.model, this._getAllCursorsModelState())); } // -------------------- END editing operations diff --git a/src/vs/editor/common/controller/cursorCommon.ts b/src/vs/editor/common/controller/cursorCommon.ts index dd98c3479d4..55e1413e192 100644 --- a/src/vs/editor/common/controller/cursorCommon.ts +++ b/src/vs/editor/common/controller/cursorCommon.ts @@ -61,6 +61,7 @@ export class CursorConfiguration { public readonly lineHeight: number; public readonly useTabStops: boolean; public readonly wordSeparators: string; + public readonly emptySelectionClipboard: boolean; public readonly autoClosingBrackets: boolean; public readonly autoClosingPairsOpen: CharacterMap; public readonly autoClosingPairsClose: CharacterMap; @@ -71,6 +72,7 @@ export class CursorConfiguration { return ( e.layoutInfo || e.wordSeparators + || e.emptySelectionClipboard || e.autoClosingBrackets || e.useTabStops || e.lineHeight @@ -94,6 +96,7 @@ export class CursorConfiguration { this.lineHeight = c.lineHeight; this.useTabStops = c.useTabStops; this.wordSeparators = c.wordSeparators; + this.emptySelectionClipboard = c.emptySelectionClipboard; this.autoClosingBrackets = c.autoClosingBrackets; this.autoClosingPairsOpen = {}; diff --git a/src/vs/editor/common/controller/cursorDeleteOperations.ts b/src/vs/editor/common/controller/cursorDeleteOperations.ts index ffcfaf8530d..6996f1af6e6 100644 --- a/src/vs/editor/common/controller/cursorDeleteOperations.ts +++ b/src/vs/editor/common/controller/cursorDeleteOperations.ts @@ -163,14 +163,14 @@ export class DeleteOperations { }); } - public static cut(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[], enableEmptySelectionClipboard: boolean): EditOperationResult { + public static cut(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[]): EditOperationResult { let commands: CommandResult[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; let selection = cursor.selection; if (selection.isEmpty()) { - if (enableEmptySelectionClipboard) { + if (config.emptySelectionClipboard) { // This is a full line cut let position = cursor.position; diff --git a/src/vs/editor/common/view/viewEvents.ts b/src/vs/editor/common/view/viewEvents.ts index 0f5ee787b72..31c994adea8 100644 --- a/src/vs/editor/common/view/viewEvents.ts +++ b/src/vs/editor/common/view/viewEvents.ts @@ -39,6 +39,7 @@ export class ViewConfigurationChangedEvent { public readonly editorClassName: boolean; public readonly lineHeight: boolean; public readonly readOnly: boolean; + public readonly emptySelectionClipboard: boolean; public readonly layoutInfo: boolean; public readonly fontInfo: boolean; public readonly viewInfo: boolean; @@ -50,6 +51,7 @@ export class ViewConfigurationChangedEvent { this.editorClassName = source.editorClassName; this.lineHeight = source.lineHeight; this.readOnly = source.readOnly; + this.emptySelectionClipboard = source.emptySelectionClipboard; this.layoutInfo = source.layoutInfo; this.fontInfo = source.fontInfo; this.viewInfo = source.viewInfo; diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index 7ee4226bfc9..f04c2936c74 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -137,8 +137,8 @@ export interface IViewModel { getModelLineMaxColumn(modelLineNumber: number): number; validateModelPosition(modelPosition: IPosition): Position; - getPlainTextToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string; - getHTMLToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string; + getPlainTextToCopy(ranges: Range[], emptySelectionClipboard: boolean): string; + getHTMLToCopy(ranges: Range[], emptySelectionClipboard: boolean): string; } export class MinimapLinesRenderingData { diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index c0d92a40102..193e852523c 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -520,13 +520,13 @@ export class ViewModel extends ViewEventEmitter implements IViewModel { return this.model.validatePosition(position); } - public getPlainTextToCopy(ranges: Range[], enableEmptySelectionClipboard: boolean): string { + public getPlainTextToCopy(ranges: Range[], emptySelectionClipboard: boolean): string { let newLineCharacter = this.model.getEOL(); if (ranges.length === 1) { let range: Range = ranges[0]; if (range.isEmpty()) { - if (enableEmptySelectionClipboard) { + if (emptySelectionClipboard) { let modelLineNumber = this.coordinatesConverter.convertViewPositionToModelPosition(new Position(range.startLineNumber, 1)).lineNumber; return this.model.getLineContent(modelLineNumber) + newLineCharacter; } else { @@ -546,7 +546,7 @@ export class ViewModel extends ViewEventEmitter implements IViewModel { } } - public getHTMLToCopy(viewRanges: Range[], enableEmptySelectionClipboard: boolean): string { + public getHTMLToCopy(viewRanges: Range[], emptySelectionClipboard: boolean): string { if (this.model.getLanguageIdentifier().id === LanguageId.PlainText) { return null; } @@ -558,7 +558,7 @@ export class ViewModel extends ViewEventEmitter implements IViewModel { let range = this.coordinatesConverter.convertViewRangeToModelRange(viewRanges[0]); if (range.isEmpty()) { - if (!enableEmptySelectionClipboard) { + if (!emptySelectionClipboard) { // nothing to copy return null; } diff --git a/src/vs/editor/contrib/clipboard/browser/clipboard.ts b/src/vs/editor/contrib/clipboard/browser/clipboard.ts index 5dc8118dfe3..9ef4294f728 100644 --- a/src/vs/editor/contrib/clipboard/browser/clipboard.ts +++ b/src/vs/editor/contrib/clipboard/browser/clipboard.ts @@ -81,9 +81,9 @@ class ExecCommandCutAction extends ExecCommandAction { } public run(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor): void { - var enableEmptySelectionClipboard = editor.getConfiguration().emptySelectionClipboard && browser.enableEmptySelectionClipboard; + const emptySelectionClipboard = editor.getConfiguration().emptySelectionClipboard; - if (!enableEmptySelectionClipboard && editor.getSelection().isEmpty()) { + if (!emptySelectionClipboard && editor.getSelection().isEmpty()) { return; } @@ -113,9 +113,9 @@ class ExecCommandCopyAction extends ExecCommandAction { } public run(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor): void { - var enableEmptySelectionClipboard = editor.getConfiguration().emptySelectionClipboard && browser.enableEmptySelectionClipboard; + const emptySelectionClipboard = editor.getConfiguration().emptySelectionClipboard; - if (!enableEmptySelectionClipboard && editor.getSelection().isEmpty()) { + if (!emptySelectionClipboard && editor.getSelection().isEmpty()) { return; } @@ -162,9 +162,9 @@ class ExecCommandCopyWithSyntaxHighlightingAction extends ExecCommandAction { } public run(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor): void { - var enableEmptySelectionClipboard = editor.getConfiguration().emptySelectionClipboard && browser.enableEmptySelectionClipboard; + const emptySelectionClipboard = editor.getConfiguration().emptySelectionClipboard; - if (!enableEmptySelectionClipboard && editor.getSelection().isEmpty()) { + if (!emptySelectionClipboard && editor.getSelection().isEmpty()) { return; } diff --git a/src/vs/editor/test/common/commands/commandTestUtils.ts b/src/vs/editor/test/common/commands/commandTestUtils.ts index 1e9c6202c59..3db5dc1fd3c 100644 --- a/src/vs/editor/test/common/commands/commandTestUtils.ts +++ b/src/vs/editor/test/common/commands/commandTestUtils.ts @@ -25,7 +25,7 @@ export function testCommand( let model = Model.createFromString(lines.join('\n'), undefined, languageIdentifier); let config = new TestConfiguration(null); - let cursor = new Cursor(config, model, viewModelHelper(model), false); + let cursor = new Cursor(config, model, viewModelHelper(model)); cursor.setSelections('tests', [selection]); diff --git a/src/vs/editor/test/common/commands/sideEditing.test.ts b/src/vs/editor/test/common/commands/sideEditing.test.ts index 7ddf9c91729..6ccc560d22c 100644 --- a/src/vs/editor/test/common/commands/sideEditing.test.ts +++ b/src/vs/editor/test/common/commands/sideEditing.test.ts @@ -21,7 +21,7 @@ const NO_TAB_SIZE = 0; function testCommand(lines: string[], selections: Selection[], edits: IIdentifiedSingleEditOperation[], expectedLines: string[], expectedSelections: Selection[]): void { let model = Model.createFromString(lines.join('\n')); let config = new TestConfiguration(null); - let cursor = new Cursor(config, model, viewModelHelper(model), false); + let cursor = new Cursor(config, model, viewModelHelper(model)); cursor.setSelections('tests', selections); diff --git a/src/vs/editor/test/common/config/commonEditorConfig.test.ts b/src/vs/editor/test/common/config/commonEditorConfig.test.ts index e98f7cc203c..5e6e1dd062a 100644 --- a/src/vs/editor/test/common/config/commonEditorConfig.test.ts +++ b/src/vs/editor/test/common/config/commonEditorConfig.test.ts @@ -59,6 +59,7 @@ suite('Common Editor Config', () => { outerWidth: 1000, outerHeight: 100, canUseTranslate3d: true, + emptySelectionClipboard: true, pixelRatio: 1, zoomLevel: 0 }; diff --git a/src/vs/editor/test/common/controller/cursor.test.ts b/src/vs/editor/test/common/controller/cursor.test.ts index eb7e5df87c7..37e3426c3c7 100644 --- a/src/vs/editor/test/common/controller/cursor.test.ts +++ b/src/vs/editor/test/common/controller/cursor.test.ts @@ -146,7 +146,7 @@ suite('Editor Controller - Cursor', () => { thisModel = Model.createFromString(text); thisConfiguration = new TestConfiguration(null); - thisCursor = new Cursor(thisConfiguration, thisModel, viewModelHelper(thisModel), false); + thisCursor = new Cursor(thisConfiguration, thisModel, viewModelHelper(thisModel)); }); teardown(() => { @@ -705,7 +705,7 @@ suite('Editor Controller - Cursor', () => { '\t\t}', '\t}' ].join('\n')); - let cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model), true); + let cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model)); moveTo(cursor, 1, 7, false); assertCursor(cursor, new Position(1, 7)); @@ -739,7 +739,7 @@ suite('Editor Controller - Cursor', () => { 'var concat = require("gulp-concat");', 'var newer = require("gulp-newer");', ].join('\n')); - let cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model), true); + let cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model)); moveTo(cursor, 1, 4, false); assertCursor(cursor, new Position(1, 4)); @@ -774,7 +774,7 @@ suite('Editor Controller - Cursor', () => { '', '', ].join('\n')); - let cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model), true); + let cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model)); moveTo(cursor, 10, 10, false); assertCursor(cursor, new Position(10, 10)); @@ -832,7 +832,7 @@ suite('Editor Controller - Cursor', () => { '', '', ].join('\n')); - let cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model), true); + let cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model)); moveTo(cursor, 10, 10, false); assertCursor(cursor, new Position(10, 10)); @@ -877,7 +877,7 @@ suite('Editor Controller - Cursor', () => { 'var concat = require("gulp-concat");', 'var newer = require("gulp-newer");', ].join('\n')); - let cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model), true); + let cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model)); moveTo(cursor, 1, 4, false); assertCursor(cursor, new Position(1, 4)); @@ -1421,7 +1421,7 @@ suite('Editor Controller - Regression tests', () => { 'qwerty' ]; let model = Model.createFromString(text.join('\n')); - let cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model), true); + let cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model)); moveTo(cursor, 2, 1, false); assertCursor(cursor, new Selection(2, 1, 2, 1)); @@ -1439,7 +1439,7 @@ suite('Editor Controller - Regression tests', () => { '' ]; model = Model.createFromString(text.join('\n')); - cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model), true); + cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model)); moveTo(cursor, 2, 1, false); assertCursor(cursor, new Selection(2, 1, 2, 1)); @@ -2719,7 +2719,7 @@ interface ICursorOpts { function usingCursor(opts: ICursorOpts, callback: (model: Model, cursor: Cursor) => void): void { let model = Model.createFromString(opts.text.join('\n'), opts.modelOpts, opts.languageIdentifier); let config = new TestConfiguration(opts.editorOpts); - let cursor = new Cursor(config, model, viewModelHelper(model), false); + let cursor = new Cursor(config, model, viewModelHelper(model)); callback(model, cursor); diff --git a/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts b/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts index c1388ba58e8..5528a35ac24 100644 --- a/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts +++ b/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts @@ -454,7 +454,7 @@ suite('Cursor move command test', () => { }); function aCursor(viewModelHelper?: IViewModelHelper): Cursor { - return new Cursor(thisConfiguration, thisModel, viewModelHelper || aViewModelHelper(thisModel), false); + return new Cursor(thisConfiguration, thisModel, viewModelHelper || aViewModelHelper(thisModel)); } }); diff --git a/src/vs/editor/test/common/mocks/testConfiguration.ts b/src/vs/editor/test/common/mocks/testConfiguration.ts index 2ace40b73d4..9c3fdd69c06 100644 --- a/src/vs/editor/test/common/mocks/testConfiguration.ts +++ b/src/vs/editor/test/common/mocks/testConfiguration.ts @@ -21,6 +21,7 @@ export class TestConfiguration extends CommonEditorConfiguration { outerWidth: 100, outerHeight: 100, canUseTranslate3d: true, + emptySelectionClipboard: true, pixelRatio: 1, zoomLevel: 0 }; From 1081ef16c6aebc5666cfa410f6c0b07322f7720e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 11:32:59 +0200 Subject: [PATCH 0575/1164] clean crash reporter --- build/gulpfile.mixin.js | 38 ++-------------------- package.json | 2 +- src/vs/platform/node/product.ts | 11 ++++++- src/vs/workbench/electron-browser/shell.ts | 22 +++++++++++-- 4 files changed, 33 insertions(+), 40 deletions(-) diff --git a/build/gulpfile.mixin.js b/build/gulpfile.mixin.js index 71c45d4bcf9..abf3ce4a90c 100644 --- a/build/gulpfile.mixin.js +++ b/build/gulpfile.mixin.js @@ -49,46 +49,12 @@ gulp.task('mixin', function () { if (quality) { const productJsonFilter = filter('product.json', { restore: true }); - const arch = process.env.VSCODE_ELECTRON_PLATFORM || process.arch; - - const vsdaFilter = (function () { - const filter = []; - if (process.platform !== 'win32') { filter.push('!**/vsda_win32.node'); } - if (process.platform !== 'darwin') { filter.push('!**/vsda_darwin.node'); } - if (process.platform !== 'linux' || arch !== 'x64') { filter.push('!**/vsda_linux64.node'); } - if (process.platform !== 'linux' || arch === 'x64') { filter.push('!**/vsda_linux32.node'); } - - return filter; - })(); - const mixin = all - .pipe(filter(['quality/' + quality + '/**'].concat(vsdaFilter))) + .pipe(filter(['quality/' + quality + '/**'])) .pipe(util.rebase(2)) .pipe(productJsonFilter) .pipe(buffer()) - .pipe(json(function (patch) { - const original = require('../product.json'); - const result = assign(original, patch); - - // HockeyApp Support - if (patch.crashReporterHockeyAppSubmitURL && result.crashReporter) { - - // Receive submitURL for the platform we are building for - result.crashReporter.submitURL = (function () { - if (process.platform === 'win32') { return patch.crashReporterHockeyAppSubmitURL.win32; } - if (process.platform === 'darwin') { return patch.crashReporterHockeyAppSubmitURL.darwin; } - if (process.platform === 'linux' && arch === 'x64') { return patch.crashReporterHockeyAppSubmitURL.linux64; } - if (process.platform === 'linux' && arch !== 'x64') { return patch.crashReporterHockeyAppSubmitURL.linux32; } - - return void 0; - })(); - - // No longer need crashReporterHockeyAppSubmitURL after this - result.crashReporterHockeyAppSubmitURL = void 0; - } - - return result; - })) + .pipe(json(o => assign({}, require('../product.json'), o))) .pipe(productJsonFilter.restore); all = es.merge(mixin); diff --git a/package.json b/package.json index d7036074be8..f94b92357ae 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "code-oss-dev", "version": "1.13.0", "electronVersion": "1.6.6", - "distro": "75907509ec4038a8ebcce47fa85eab15bfe33aac", + "distro": "1dc6b8ea29727a80a9cf0a8832e6d1c16623fe40", "author": { "name": "Microsoft Corporation" }, diff --git a/src/vs/platform/node/product.ts b/src/vs/platform/node/product.ts index 4937ade6d77..f92b896b62d 100644 --- a/src/vs/platform/node/product.ts +++ b/src/vs/platform/node/product.ts @@ -28,7 +28,10 @@ export interface IProductConfiguration { extensionImportantTips: { [id: string]: { name: string; pattern: string; }; }; extensionKeywords: { [extension: string]: string[]; }; keymapExtensionTips: string[]; - crashReporter: Electron.CrashReporterStartOptions; + crashReporter: { + companyName: string; + productName: string; + }; welcomePage: string; enableTelemetry: boolean; aiConfig: { @@ -52,6 +55,12 @@ export interface IProductConfiguration { npsSurveyUrl: string; checksums: { [path: string]: string; }; checksumFailMoreInfoUrl: string; + hockeyApp: { + 'win32': string; + 'linux-ia32': string; + 'linux-x64': string; + 'darwin': string; + }; } const rootPath = path.dirname(uri.parse(require.toUrl('')).fsPath); diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index f5e39ca7bd4..ef12343f326 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -172,8 +172,26 @@ export class WorkbenchShell { const [instantiationService, serviceCollection] = this.initServiceCollection(parent.getHTMLElement()); //crash reporting - if (!!product.crashReporter) { - instantiationService.createInstance(CrashReporter, product.crashReporter); + if (product.crashReporter && product.hockeyApp) { + let submitURL: string; + + if (platform.isWindows) { + submitURL = product.hockeyApp.win32; + } else if (platform.isMacintosh) { + submitURL = product.hockeyApp.darwin; + } else if (platform.isLinux) { + submitURL = product.hockeyApp[`linux-${process.arch}`]; + } + + if (submitURL) { + const opts: Electron.CrashReporterStartOptions = { + companyName: product.crashReporter.companyName, + productName: product.crashReporter.productName, + submitURL + }; + + instantiationService.createInstance(CrashReporter, opts); + } } // Workbench From 157fbda81e06f907c32b7406af9584fec77c63da Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 18 May 2017 10:34:50 +0200 Subject: [PATCH 0576/1164] prompt some users to profile after slowish startup --- src/vs/base/common/platform.ts | 2 +- .../performance.contribution.ts | 112 ++++++++++++++---- 2 files changed, 88 insertions(+), 26 deletions(-) diff --git a/src/vs/base/common/platform.ts b/src/vs/base/common/platform.ts index 4e5c5266d0f..c69370665fd 100644 --- a/src/vs/base/common/platform.ts +++ b/src/vs/base/common/platform.ts @@ -76,7 +76,7 @@ export enum Platform { Windows } -export let _platform: Platform = Platform.Web; +let _platform: Platform = Platform.Web; if (_isNative) { if (_isMacintosh) { _platform = Platform.Mac; diff --git a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts index 9351de679df..51ff51c8350 100644 --- a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts +++ b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts @@ -21,6 +21,48 @@ import { IMessageService } from 'vs/platform/message/common/message'; import { ITimerService } from 'vs/workbench/services/timer/common/timerService'; import { IWorkbenchContributionsRegistry, IWorkbenchContribution, Extensions } from 'vs/workbench/common/contributions'; import product from 'vs/platform/node/product'; +import { platform, Platform } from 'vs/base/common/platform'; +import { release } from 'os'; + +const percentiles: { [key: string]: [number, number] } = { + // 80th - 90th percentiles + ['Linux_4.10.0-20-generic']: [3474, 6300], + ['Linux_4.10.0-21-generic']: [5342, 12022], + ['Linux_4.10.13-1-ARCH']: [3047, 4248], + ['Linux_4.10.13-200.fc25.x86_64']: [2380, 2895], + ['Linux_4.10.14-200.fc25.x86_64']: [5164, 14042], + ['Linux_4.4.0-21-generic']: [3777, 8160], + ['Linux_4.4.0-72-generic']: [6173, 10730], + ['Linux_4.4.0-75-generic']: [4769, 8560], + ['Linux_4.4.0-77-generic']: [3834, 7343], + ['Linux_4.4.0-78-generic']: [3115, 7078], + ['Linux_4.8.0-49-generic']: [7174, 10362], + ['Linux_4.8.0-51-generic']: [3906, 7385], + ['Linux_4.8.0-52-generic']: [6757, 13741], + ['Linux_4.9.0-2-amd64']: [4348, 8754], + ['Mac_14.5.0']: [4403, 7216], + ['Mac_15.4.0']: [3831, 4946], + ['Mac_15.5.0']: [5080, 8296], + ['Mac_15.6.0']: [4621, 7160], + ['Mac_16.0.0']: [4748, 11248], + ['Mac_16.1.0']: [4309, 6106], + ['Mac_16.3.0']: [2756, 3674], + ['Mac_16.4.0']: [3625, 5463], + ['Mac_16.5.0']: [3617, 5288], + ['Mac_16.6.0']: [3655, 5279], + ['Mac_16.7.0']: [4415, 6624], + ['Windows_10.0.10240']: [8284, 14438], + ['Windows_10.0.10586']: [5903, 9224], + ['Windows_10.0.14393']: [6065, 10567], + ['Windows_10.0.15063']: [5521, 8696], + ['Windows_10.0.16184']: [5604, 10671], + ['Windows_10.0.16188']: [7028, 12852], + ['Windows_10.0.16193']: [6431, 9628], + ['Windows_6.1.7601']: [7794, 15194], + ['Windows_6.3.9600']: [6129, 10188], +}; + +const myPercentiles = percentiles[`${Platform[platform]}_${release()}`]; class PerformanceContribution implements IWorkbenchContribution { @@ -32,7 +74,6 @@ class PerformanceContribution implements IWorkbenchContribution { @IStorageService private _storageService: IStorageService, @IExtensionService extensionService: IExtensionService, ) { - const dumpFile = _envService.args['prof-startup-timers']; if (dumpFile) { // wait for extensions being loaded @@ -63,37 +104,58 @@ class PerformanceContribution implements IWorkbenchContribution { private _checkTimersAndSuggestToProfile() { - const disabled = true; - if (disabled) { - return; - } - //TODO(joh) use better heuristics (70th percentile, not vm, etc) - - const value = this._storageService.get(this.getId(), StorageScope.GLOBAL, undefined); - if (value !== undefined) { + if (!this._timerService.isInitialStartup) { return; } - if (virtualMachineHint.value() >= .5) { - // + // 1: Check that we have some data about this + // OS version to which we can compare this startup. + // Then only go for startups between the 80th and + // 90th percentile. + if (!Array.isArray(myPercentiles)) { return; } - + const [from, to] = myPercentiles; const { ellapsed } = this._timerService.startupMetrics; - if (ellapsed > 5000 && Math.ceil(Math.random() * 10) % 3 === 0) { - const profile = this._messageService.confirm({ - type: 'info', - message: localize('slow', "Slow startup detected"), - detail: localize('slow.detail', "Sorry that you just had a slow startup. Please restart '{0}' with profiling enabled, share the profiles with us, and we will work hard to make startup great again.", this._envService.appNameLong), - primaryButton: 'Restart and profile' - }); + if (ellapsed < from || ellapsed > to) { + return; + } - if (profile) { - this._storageService.store(this.getId(), 'didProfile', StorageScope.GLOBAL); - this._windowsService.relaunch({ addArgs: ['--prof-startup'] }); - } else { - this._storageService.store(this.getId(), 'didReject', StorageScope.GLOBAL); - } + // 2: Ignore virtual machines and only ask users + // to profile with a certain propability + if (virtualMachineHint.value() >= .5) { + return; + } + if (Math.ceil(Math.random() * 50) !== 1) { + return; + } + + // 3: Don't ask for the stable version, only + // ask once per version/build + if (this._envService.appQuality === 'stable') { + // don't ask in stable + return; + } + const mementoKey = `performance.didPromptToProfile.${product.commit}`; + const value = this._storageService.get(mementoKey, StorageScope.GLOBAL, undefined); + if (value !== undefined) { + // only ask once per version + return; + } + + + const profile = this._messageService.confirm({ + type: 'info', + message: localize('slow', "Slow startup detected"), + detail: localize('slow.detail', "Sorry that you just had a slow startup. Please restart '{0}' with profiling enabled, share the profiles with us, and we will work hard to make startup great again.", this._envService.appNameLong), + primaryButton: 'Restart and profile' + }); + + if (profile) { + this._storageService.store(mementoKey, 'didProfile', StorageScope.GLOBAL); + this._windowsService.relaunch({ addArgs: ['--prof-startup'] }); + } else { + this._storageService.store(mementoKey, 'didReject', StorageScope.GLOBAL); } } } From 147fee87b872801551482c0a1f8b8d85dbd45b22 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 18 May 2017 10:38:51 +0200 Subject: [PATCH 0577/1164] enable tslint for our workspace --- .vscode/settings.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 19cb4832e99..ed5e39baa7f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,7 +6,9 @@ ".git": true, ".build": true, "**/.DS_Store": true, - "build/**/*.js": { "when": "$(basename).ts" } + "build/**/*.js": { + "when": "$(basename).ts" + } }, "search.exclude": { "**/node_modules": true, @@ -16,6 +18,7 @@ "i18n/**": true, "extensions/**/out/**": true }, + "tslint.enable": true, "lcov.path": [ "./.build/coverage/lcov.info", "./.build/coverage-single/lcov.info" @@ -29,4 +32,4 @@ } } ] -} \ No newline at end of file +} From c6ad876e11ac9c687cf3d5a1f7b0bc33e8861695 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 18 May 2017 11:19:28 +0200 Subject: [PATCH 0578/1164] remove `prof-startup-timers` option --- .../environment/common/environment.ts | 1 - src/vs/platform/environment/node/argv.ts | 1 - .../performance.contribution.ts | 23 +------------------ 3 files changed, 1 insertion(+), 24 deletions(-) diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index a1c53201b34..b7aee17d584 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -37,7 +37,6 @@ export interface ParsedArgs { 'uninstall-extension'?: string | string[]; 'enable-proposed-api'?: string | string[]; 'open-url'?: string | string[]; - 'prof-startup-timers': string; 'skip-getting-started'?: boolean; } diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index 9b90b9161bd..52b2183bb92 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -22,7 +22,6 @@ const options: minimist.Opts = { 'debugBrkPluginHost', 'debugPluginHost', 'open-url', - 'prof-startup-timers', 'enable-proposed-api' ], boolean: [ diff --git a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts index 51ff51c8350..9021c0879b5 100644 --- a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts +++ b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts @@ -6,13 +6,8 @@ 'use strict'; import { localize } from 'vs/nls'; -import { assign } from 'vs/base/common/objects'; -import { join } from 'path'; -import { generateUuid } from 'vs/base/common/uuid'; import { virtualMachineHint } from 'vs/base/node/id'; -import { TPromise } from 'vs/base/common/winjs.base'; import { Registry } from 'vs/platform/platform'; -import { writeFile } from 'vs/base/node/pfs'; import { IWindowsService } from 'vs/platform/windows/common/windows'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; @@ -74,15 +69,8 @@ class PerformanceContribution implements IWorkbenchContribution { @IStorageService private _storageService: IStorageService, @IExtensionService extensionService: IExtensionService, ) { - const dumpFile = _envService.args['prof-startup-timers']; - if (dumpFile) { - // wait for extensions being loaded - extensionService.onReady() - .then(() => TPromise.timeout(15000)) // time service isn't ready yet because it listens on the same event... - .then(() => this._dumpTimersAndQuit(dumpFile)) - .done(undefined, err => console.error(err)); - } else if (!_envService.args['prof-startup']) { + if (!_envService.args['prof-startup']) { // notify user of slow start setTimeout(() => { this._checkTimersAndSuggestToProfile(); @@ -94,14 +82,6 @@ class PerformanceContribution implements IWorkbenchContribution { return 'performance'; } - private _dumpTimersAndQuit(folder: string) { - const metrics = this._timerService.startupMetrics; - const id = generateUuid(); - const all = assign({ id, commit: product.commit }, metrics); - const raw = JSON.stringify(all); - return writeFile(join(folder, `timers-${id}.json`), raw).then(() => this._windowsService.quit()); - } - private _checkTimersAndSuggestToProfile() { if (!this._timerService.isInitialStartup) { @@ -143,7 +123,6 @@ class PerformanceContribution implements IWorkbenchContribution { return; } - const profile = this._messageService.confirm({ type: 'info', message: localize('slow', "Slow startup detected"), From 051ba11238f0a58ff2773b30d7968a49af2c45de Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 18 May 2017 11:33:52 +0200 Subject: [PATCH 0579/1164] :lipstick: --- .../performance.contribution.ts | 112 ++++++++---------- 1 file changed, 52 insertions(+), 60 deletions(-) diff --git a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts index 9021c0879b5..f7b481f4c50 100644 --- a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts +++ b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts @@ -11,7 +11,6 @@ import { Registry } from 'vs/platform/platform'; import { IWindowsService } from 'vs/platform/windows/common/windows'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { IExtensionService } from 'vs/platform/extensions/common/extensions'; import { IMessageService } from 'vs/platform/message/common/message'; import { ITimerService } from 'vs/workbench/services/timer/common/timerService'; import { IWorkbenchContributionsRegistry, IWorkbenchContribution, Extensions } from 'vs/workbench/common/contributions'; @@ -19,63 +18,58 @@ import product from 'vs/platform/node/product'; import { platform, Platform } from 'vs/base/common/platform'; import { release } from 'os'; -const percentiles: { [key: string]: [number, number] } = { - // 80th - 90th percentiles - ['Linux_4.10.0-20-generic']: [3474, 6300], - ['Linux_4.10.0-21-generic']: [5342, 12022], - ['Linux_4.10.13-1-ARCH']: [3047, 4248], - ['Linux_4.10.13-200.fc25.x86_64']: [2380, 2895], - ['Linux_4.10.14-200.fc25.x86_64']: [5164, 14042], - ['Linux_4.4.0-21-generic']: [3777, 8160], - ['Linux_4.4.0-72-generic']: [6173, 10730], - ['Linux_4.4.0-75-generic']: [4769, 8560], - ['Linux_4.4.0-77-generic']: [3834, 7343], - ['Linux_4.4.0-78-generic']: [3115, 7078], - ['Linux_4.8.0-49-generic']: [7174, 10362], - ['Linux_4.8.0-51-generic']: [3906, 7385], - ['Linux_4.8.0-52-generic']: [6757, 13741], - ['Linux_4.9.0-2-amd64']: [4348, 8754], - ['Mac_14.5.0']: [4403, 7216], - ['Mac_15.4.0']: [3831, 4946], - ['Mac_15.5.0']: [5080, 8296], - ['Mac_15.6.0']: [4621, 7160], - ['Mac_16.0.0']: [4748, 11248], - ['Mac_16.1.0']: [4309, 6106], - ['Mac_16.3.0']: [2756, 3674], - ['Mac_16.4.0']: [3625, 5463], - ['Mac_16.5.0']: [3617, 5288], - ['Mac_16.6.0']: [3655, 5279], - ['Mac_16.7.0']: [4415, 6624], - ['Windows_10.0.10240']: [8284, 14438], - ['Windows_10.0.10586']: [5903, 9224], - ['Windows_10.0.14393']: [6065, 10567], - ['Windows_10.0.15063']: [5521, 8696], - ['Windows_10.0.16184']: [5604, 10671], - ['Windows_10.0.16188']: [7028, 12852], - ['Windows_10.0.16193']: [6431, 9628], - ['Windows_6.1.7601']: [7794, 15194], - ['Windows_6.3.9600']: [6129, 10188], -}; -const myPercentiles = percentiles[`${Platform[platform]}_${release()}`]; +class ProfilingHint implements IWorkbenchContribution { -class PerformanceContribution implements IWorkbenchContribution { + // p80 to p90 by os&release + static readonly _percentiles: { [key: string]: [number, number] } = { + ['Linux_4.10.0-20-generic']: [3474, 6300], + ['Linux_4.10.0-21-generic']: [5342, 12022], + ['Linux_4.10.13-1-ARCH']: [3047, 4248], + ['Linux_4.10.13-200.fc25.x86_64']: [2380, 2895], + ['Linux_4.10.14-200.fc25.x86_64']: [5164, 14042], + ['Linux_4.4.0-21-generic']: [3777, 8160], + ['Linux_4.4.0-72-generic']: [6173, 10730], + ['Linux_4.4.0-75-generic']: [4769, 8560], + ['Linux_4.4.0-77-generic']: [3834, 7343], + ['Linux_4.4.0-78-generic']: [3115, 7078], + ['Linux_4.8.0-49-generic']: [7174, 10362], + ['Linux_4.8.0-51-generic']: [3906, 7385], + ['Linux_4.8.0-52-generic']: [6757, 13741], + ['Linux_4.9.0-2-amd64']: [4348, 8754], + ['Mac_14.5.0']: [4403, 7216], + ['Mac_15.4.0']: [3831, 4946], + ['Mac_15.5.0']: [5080, 8296], + ['Mac_15.6.0']: [4621, 7160], + ['Mac_16.0.0']: [4748, 11248], + ['Mac_16.1.0']: [4309, 6106], + ['Mac_16.3.0']: [2756, 3674], + ['Mac_16.4.0']: [3625, 5463], + ['Mac_16.5.0']: [3617, 5288], + ['Mac_16.6.0']: [3655, 5279], + ['Mac_16.7.0']: [4415, 6624], + ['Windows_10.0.10240']: [8284, 14438], + ['Windows_10.0.10586']: [5903, 9224], + ['Windows_10.0.14393']: [6065, 10567], + ['Windows_10.0.15063']: [5521, 8696], + ['Windows_10.0.16184']: [5604, 10671], + ['Windows_10.0.16188']: [7028, 12852], + ['Windows_10.0.16193']: [6431, 9628], + ['Windows_6.1.7601']: [7794, 15194], + ['Windows_6.3.9600']: [6129, 10188], + }; + + private static readonly _myPercentiles = ProfilingHint._percentiles[`${Platform[platform]}_${release()}`]; constructor( @IWindowsService private _windowsService: IWindowsService, @ITimerService private _timerService: ITimerService, @IMessageService private _messageService: IMessageService, @IEnvironmentService private _envService: IEnvironmentService, - @IStorageService private _storageService: IStorageService, - @IExtensionService extensionService: IExtensionService, + @IStorageService private _storageService: IStorageService ) { - if (!_envService.args['prof-startup']) { - // notify user of slow start - setTimeout(() => { - this._checkTimersAndSuggestToProfile(); - }, 5000); - } + setTimeout(() => this._checkTimersAndSuggestToProfile(), 5000); } getId(): string { @@ -84,33 +78,31 @@ class PerformanceContribution implements IWorkbenchContribution { private _checkTimersAndSuggestToProfile() { - if (!this._timerService.isInitialStartup) { + // Only initial startups, not when already profiling + if (!this._timerService.isInitialStartup || this._envService.args['prof-startup']) { return; } - // 1: Check that we have some data about this + // Check that we have some data about this // OS version to which we can compare this startup. // Then only go for startups between the 80th and // 90th percentile. - if (!Array.isArray(myPercentiles)) { + if (!Array.isArray(ProfilingHint._myPercentiles)) { return; } - const [from, to] = myPercentiles; + const [p80, p90] = ProfilingHint._myPercentiles; const { ellapsed } = this._timerService.startupMetrics; - if (ellapsed < from || ellapsed > to) { + if (ellapsed < p80 || ellapsed > p90) { return; } - // 2: Ignore virtual machines and only ask users + // Ignore virtual machines and only ask users // to profile with a certain propability - if (virtualMachineHint.value() >= .5) { - return; - } - if (Math.ceil(Math.random() * 50) !== 1) { + if (virtualMachineHint.value() >= .5 || Math.ceil(Math.random() * 50) !== 1) { return; } - // 3: Don't ask for the stable version, only + // Don't ask for the stable version, only // ask once per version/build if (this._envService.appQuality === 'stable') { // don't ask in stable @@ -140,4 +132,4 @@ class PerformanceContribution implements IWorkbenchContribution { } const registry = Registry.as(Extensions.Workbench); -registry.registerWorkbenchContribution(PerformanceContribution); +registry.registerWorkbenchContribution(ProfilingHint); From 694a0c3c63a1205b827ed3c5edec28fe0f7a1044 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 11:55:42 +0200 Subject: [PATCH 0580/1164] fix install distro step --- build/tfs/darwin/build.sh | 2 +- build/tfs/win32/1_build.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh index 88e4e11648c..0a17036d857 100755 --- a/build/tfs/darwin/build.sh +++ b/build/tfs/darwin/build.sh @@ -19,7 +19,7 @@ step "Mix in repository from vscode-distro" \ npm run gulp -- mixin step "Install distro dependencies" \ - npm run install-distro + node build/tfs/common/installDistro.js step "Build minified & upload source maps" \ npm run gulp -- --max_old_space_size=4096 vscode-darwin-min upload-vscode-sourcemaps diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index 926aa3ebfed..a177c4b82e0 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -21,7 +21,7 @@ step "Mix in repository from vscode-distro" { } step "Install distro dependencies" { - exec { & npm run install-distro } + exec { & node build\tfs\common\installDistro.js } } step "Build minified" { From dc8e7e046903eea857192ba21ac6b00995769bda Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 18 May 2017 12:01:16 +0200 Subject: [PATCH 0581/1164] Fixes #23983: Calling model.setEOL does not reset cursor position --- src/vs/editor/common/model/textModel.ts | 2 +- src/vs/editor/common/model/textModelEvents.ts | 13 ++++++- .../editor/common/viewModel/viewModelImpl.ts | 4 ++ .../test/common/controller/cursor.test.ts | 38 ++++++++++++++++++- 4 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index a84d56ad65b..7654eec1586 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -588,7 +588,7 @@ export class TextModel implements editorCommon.ITextModel { this._emitModelRawContentChangedEvent( new textModelEvents.ModelRawContentChangedEvent( [ - new textModelEvents.ModelRawFlush() + new textModelEvents.ModelRawEOLChanged() ], this._versionId, false, diff --git a/src/vs/editor/common/model/textModelEvents.ts b/src/vs/editor/common/model/textModelEvents.ts index 05e0d478f06..53103be6e27 100644 --- a/src/vs/editor/common/model/textModelEvents.ts +++ b/src/vs/editor/common/model/textModelEvents.ts @@ -124,7 +124,8 @@ export const enum RawContentChangedType { Flush = 1, LineChanged = 2, LinesDeleted = 3, - LinesInserted = 4 + LinesInserted = 4, + EOLChanged = 5 } /** @@ -204,9 +205,17 @@ export class ModelRawLinesInserted { } /** + * An event describing that a model has had its EOL changed. * @internal */ -export type ModelRawChange = ModelRawFlush | ModelRawLineChanged | ModelRawLinesDeleted | ModelRawLinesInserted; +export class ModelRawEOLChanged { + public readonly changeType = RawContentChangedType.EOLChanged; +} + +/** + * @internal + */ +export type ModelRawChange = ModelRawFlush | ModelRawLineChanged | ModelRawLinesDeleted | ModelRawLinesInserted | ModelRawEOLChanged; /** * An event describing a change in the text of a model. diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 193e852523c..34e254267dd 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -317,6 +317,10 @@ export class ViewModel extends ViewEventEmitter implements IViewModel { } break; } + case textModelEvents.RawContentChangedType.EOLChanged: { + // Nothing to do. The new version will be accepted below + break; + } } } this.lines.acceptVersionId(versionId); diff --git a/src/vs/editor/test/common/controller/cursor.test.ts b/src/vs/editor/test/common/controller/cursor.test.ts index 37e3426c3c7..e528da7f733 100644 --- a/src/vs/editor/test/common/controller/cursor.test.ts +++ b/src/vs/editor/test/common/controller/cursor.test.ts @@ -13,7 +13,7 @@ import { Selection } from 'vs/editor/common/core/selection'; import { EndOfLinePreference, Handler, DefaultEndOfLine, ITextModelCreationOptions, ICommand, - ITokenizedModel, IEditOperationBuilder, ICursorStateComputerData + ITokenizedModel, IEditOperationBuilder, ICursorStateComputerData, EndOfLineSequence } from 'vs/editor/common/editorCommon'; import { Model } from 'vs/editor/common/model/model'; import { IndentAction, IndentationRule } from 'vs/editor/common/modes/languageConfiguration'; @@ -1751,6 +1751,42 @@ suite('Editor Controller - Regression tests', () => { assert.equal(cursor.getSelections()[LINE_CNT - 1].startLineNumber, LINE_CNT); }); }); + + test('issue #23983: Calling model.setEOL does not reset cursor position', () => { + usingCursor({ + text: [ + 'first line', + 'second line' + ] + }, (model, cursor) => { + model.setEOL(EndOfLineSequence.CRLF); + + cursor.setSelections('test', [new Selection(2, 2, 2, 2)]); + model.setEOL(EndOfLineSequence.LF); + + assertCursor(cursor, new Selection(2, 2, 2, 2)); + }); + }); + + test('issue #23983: Calling model.setValue() resets cursor position', () => { + usingCursor({ + text: [ + 'first line', + 'second line' + ] + }, (model, cursor) => { + model.setEOL(EndOfLineSequence.CRLF); + + cursor.setSelections('test', [new Selection(2, 2, 2, 2)]); + model.setValue([ + 'different first line', + 'different second line', + 'new third line' + ].join('\n')); + + assertCursor(cursor, new Selection(1, 1, 1, 1)); + }); + }); }); suite('Editor Controller - Cursor Configuration', () => { From 795edc34d2c42ce81b80fec36e6413aba08a583e Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 18 May 2017 11:14:08 +0200 Subject: [PATCH 0582/1164] [coffee] update grammar --- .../coffeescript/syntaxes/coffeescript.tmLanguage.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/coffeescript/syntaxes/coffeescript.tmLanguage.json b/extensions/coffeescript/syntaxes/coffeescript.tmLanguage.json index 10fcd7023b1..d7c22867d76 100644 --- a/extensions/coffeescript/syntaxes/coffeescript.tmLanguage.json +++ b/extensions/coffeescript/syntaxes/coffeescript.tmLanguage.json @@ -183,7 +183,7 @@ "name": "string.regexp.coffee" }, { - "match": "\\b(? Date: Thu, 18 May 2017 12:04:18 +0200 Subject: [PATCH 0583/1164] [java] switch to atom/language-java grammar --- extensions/java/OSSREADME.json | 43 +- extensions/java/package.json | 5 +- extensions/java/syntaxes/java.tmLanguage.json | 1089 +++++++++++------ .../java/syntaxes/javadoc.tmLanguage.json | 432 ------- .../test/colorize-results/basic_java.json | 737 ++++++----- extensions/theme-defaults/themes/dark_vs.json | 1 + .../themes/hc_black_defaults.json | 6 +- .../theme-defaults/themes/light_vs.json | 1 + 8 files changed, 1143 insertions(+), 1171 deletions(-) delete mode 100644 extensions/java/syntaxes/javadoc.tmLanguage.json diff --git a/extensions/java/OSSREADME.json b/extensions/java/OSSREADME.json index 6a2da0d287b..c87e957510b 100644 --- a/extensions/java/OSSREADME.json +++ b/extensions/java/OSSREADME.json @@ -1,42 +1,9 @@ // ATTENTION - THIS DIRECTORY CONTAINS THIRD PARTY OPEN SOURCE MATERIALS: [{ - "name": "textmate/java.tmbundle", + "name": "atom/language-java", "version": "0.0.0", - "license": "TextMate Bundle License", - "repositoryURL": "https://github.com/textmate/java.tmbundle", - "licenseDetail": [ - "Copyright (c) textmate-java.tmbundle project authors", - "", - "If not otherwise specified (see below), files in this repository fall under the following license:", - "", - "Permission to copy, use, modify, sell and distribute this", - "software is granted. This software is provided \"as is\" without", - "express or implied warranty, and with no claim as to its", - "suitability for any purpose.", - "", - "An exception is made for files in readable text which contain their own license information,", - "or files where an accompanying file exists (in the same directory) with a \"-license\" suffix added", - "to the base-name name of the original file, and an extension of txt, html, or similar. For example", - "\"tidy\" is accompanied by \"tidy-license.txt\"." - ] -},{ - "name": "textmate/javadoc.tmbundle", - "version": "0.0.0", - "license": "TextMate Bundle License", - "repositoryURL": "https://github.com/textmate/javadoc.tmbundle", - "licenseDetail": [ - "Copyright (c) textmate-javadoc.tmbundle project authors", - "", - "If not otherwise specified (see below), files in this repository fall under the following license:", - "", - "Permission to copy, use, modify, sell and distribute this", - "software is granted. This software is provided \"as is\" without", - "express or implied warranty, and with no claim as to its", - "suitability for any purpose.", - "", - "An exception is made for files in readable text which contain their own license information,", - "or files where an accompanying file exists (in the same directory) with a \"-license\" suffix added", - "to the base-name name of the original file, and an extension of txt, html, or similar. For example", - "\"tidy\" is accompanied by \"tidy-license.txt\"." - ] + "license": "MIT", + "repositoryURL": "https://github.com/atom/language-java", + "description": "The file syntaxes/java.tmLanguage.json was derived from the Atom package https://github.com/atom/language-java which was originally converted from the TextMate bundle https://github.com/textmate/java.tmbundle." + }] diff --git a/extensions/java/package.json b/extensions/java/package.json index ee0e7e616ab..d8c9375f0c3 100644 --- a/extensions/java/package.json +++ b/extensions/java/package.json @@ -4,7 +4,7 @@ "publisher": "vscode", "engines": { "vscode": "*" }, "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js textmate/java.tmbundle Syntaxes/Java.plist ./syntaxes/java.tmLanguage.json && node ../../build/npm/update-grammar.js textmate/javadoc.tmbundle Syntaxes/JavaDoc.tmLanguage ./syntaxes/javadoc.tmLanguage.json" + "update-grammar": "node ../../build/npm/update-grammar.js atom/language-java grammars/java.cson ./syntaxes/java.tmLanguage.json" }, "contributes": { "languages": [{ @@ -17,9 +17,6 @@ "language": "java", "scopeName": "source.java", "path": "./syntaxes/java.tmLanguage.json" - },{ - "scopeName": "text.html.javadoc", - "path": "./syntaxes/javadoc.tmLanguage.json" }] } } \ No newline at end of file diff --git a/extensions/java/syntaxes/java.tmLanguage.json b/extensions/java/syntaxes/java.tmLanguage.json index f0fcef2d065..5d0513d49b0 100644 --- a/extensions/java/syntaxes/java.tmLanguage.json +++ b/extensions/java/syntaxes/java.tmLanguage.json @@ -1,99 +1,98 @@ { + "scopeName": "source.java", + "name": "Java", "fileTypes": [ "java", "bsh" ], - "keyEquivalent": "^~J", - "name": "Java", "patterns": [ { - "captures": { + "begin": "\\b(package)\\b\\s*", + "beginCaptures": { "1": { "name": "keyword.other.package.java" - }, - "2": { - "name": "storage.modifier.package.java" - }, - "3": { + } + }, + "end": "\\s*(;)", + "endCaptures": { + "1": { "name": "punctuation.terminator.java" } }, - "match": "^\\s*(package)\\b(?:\\s*([^ ;$]+)\\s*(;)?)?", - "name": "meta.package.java" + "name": "meta.package.java", + "contentName": "storage.modifier.package.java", + "patterns": [ + { + "include": "#comments" + }, + { + "match": "(?<=\\.)\\s*\\.|\\.(?=\\s*;)", + "name": "invalid.illegal.character_not_allowed_here.java" + }, + { + "match": "(?", + "endCaptures": { + "0": { + "name": "punctuation.bracket.angle.java" + } + }, + "patterns": [ + { + "match": "\\b(extends|super)\\b", + "name": "storage.modifier.$1.java" }, { - "match": "\\b0[xX]\\h([\\h_]*\\h)?[lL]?(?!\\w|\\.)", - "name": "constant.numeric.hex.java" - }, - { - "match": "\\b0[0-7_]*[0-7][lL]?\\b", - "name": "constant.numeric.octal.java" - }, - { - "match": "\\b0[bB][01]([01_]*[01])?[lL]?\\b", - "name": "constant.numeric.binary.java" - }, - { - "match": "\\b(0|[1-9]([0-9_]*[0-9])?)[lL]?(?!\\w|\\.)", - "name": "constant.numeric.integer.java" - }, - { - "match": "(?x)\n\t\t\t\t\t\t(?\n\t\t\t\t\t\t\t0[xX]\t\t\t\t\t\t\t\t\t# Start literal\n\t\t\t\t\t\t\t(\\h([\\h_]*\\h)?)?\t\t\t\t\t\t# Optional Number\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t(?<=\\h)\\.\t\t\t\t\t\t\t# A number must exist on\n\t\t\t\t\t\t | \\.(?=\\h)\t\t\t\t\t\t\t# one side of the decimal\n\t\t\t\t\t\t | (?<=\\h)\t\t\t\t\t\t\t\t# Decimal not required\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t(\\h([\\h_]*\\h)?)?\t\t\t\t\t\t# Optional Number\n\t\t\t\t\t\t\t[pP]\t\t\t\t\t\t\t\t\t# Exponent Indicator\n\t\t\t\t\t\t\t[+-]?(0|[1-9]([0-9_]*[0-9])?)\t\t\t# Signed Integer\n\t\t\t\t\t\t\t[fFdD]?\t\t\t\t\t\t\t\t\t# Float Type Suffix\n\t\t\t\t\t\t)\n\t\t\t\t\t\t(?!\\w)\t\t\t\t\t\t\t\t\t\t# Ensure word boundry\n\t\t\t\t\t", - "name": "constant.numeric.hex-float.java" - }, - { - "match": "(?x)\n\t\t\t\t\t\t(?\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t(0|[1-9]([0-9_]*[0-9])?)\t\t\t\t# Leading digits\n\t\t\t\t\t\t\t\t(?=[eEfFdD.])\t\t\t\t\t\t\t# Allow for numbers without .\n\t\t\t\t\t\t\t)?\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t(?<=[0-9])(?=[eEfFdD])\t\t\t\t\t# Allow for numbers without .\n\t\t\t\t\t\t\t | \\.\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t[0-9]([0-9_]*[0-9])?\t\t\t\t\t# Numbers after .\n\t\t\t\t\t\t\t)?\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t[eE][+-]?(0|[1-9]([0-9_]*[0-9])?)\t\t# Exponent\n\t\t\t\t\t\t\t)?\n\t\t\t\t\t\t\t[fFdD]?\t\t\t\t\t\t\t\t\t\t# Float Type Suffix\n\t\t\t\t\t\t)\n\t\t\t\t\t\t(?!\\w)\t\t\t\t\t\t\t\t\t\t\t# Ensure word boundry\n\t\t\t\t\t", - "name": "constant.numeric.float.java" - }, - { + "match": "([a-zA-Z$_][a-zA-Z0-9$_]*)(?=\\s*<)", "captures": { "1": { - "name": "keyword.operator.dereference.java" + "name": "storage.type.java" } - }, - "match": "(\\.)?\\b([A-Z][A-Z0-9_]+)(?!<|\\.class|\\s*\\w+\\s*=)\\b", - "name": "constant.other.java" + } + }, + { + "match": "[a-zA-Z$_][a-zA-Z0-9$_]*", + "name": "storage.type.generic.java" + }, + { + "match": "\\?", + "name": "storage.type.generic.wildcard.java" + }, + { + "match": "&", + "name": "punctuation.separator.types.java" + }, + { + "match": ",", + "name": "punctuation.separator.delimiter.java" + }, + { + "include": "#parens" + }, + { + "include": "#generics" + }, + { + "include": "#comments" } ] }, "enums": { - "begin": "^(?=\\s*[A-Z0-9_]+\\s*({|\\(|,))", - "end": "(?=;|})", + "begin": "^\\s*(enum)\\s+(\\w+)", + "beginCaptures": { + "1": { + "name": "storage.modifier.java" + }, + "2": { + "name": "entity.name.type.enum.java" + } + }, + "end": "}", + "endCaptures": { + "0": { + "name": "punctuation.section.enum.end.bracket.curly.java" + } + }, + "name": "meta.enum.java", "patterns": [ { - "begin": "\\w+", + "begin": "{", "beginCaptures": { "0": { - "name": "constant.other.enum.java" + "name": "punctuation.section.enum.begin.bracket.curly.java" } }, - "end": "(?=,|;|})", - "name": "meta.enum.java", + "end": "(?=})", "patterns": [ { - "include": "#parens" + "match": "\\w+", + "name": "constant.other.enum.java" }, { - "begin": "{", - "beginCaptures": { - "0": { - "name": "punctuation.section.enum.begin.java" - } - }, - "end": "}", - "endCaptures": { - "0": { - "name": "punctuation.section.enum.end.java" - } - }, - "patterns": [ - { - "include": "#class-body" - } - ] + "include": "#class-body" } ] }, { "include": "#comments" + } + ] + }, + "function-call": { + "begin": "([A-Za-z_$][\\w$]*)\\s*(\\()", + "beginCaptures": { + "1": { + "name": "entity.name.function.java" }, + "2": { + "name": "punctuation.definition.parameters.begin.bracket.round.java" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.parameters.end.bracket.round.java" + } + }, + "name": "meta.function-call.java", + "patterns": [ { - "include": "#annotations" + "include": "#code" } ] }, "keywords": { "patterns": [ { - "match": "\\b(try|catch|finally|throw)\\b", - "name": "keyword.control.catch-exception.java" + "match": "\\bthrow\\b", + "name": "keyword.control.throw.java" }, { "match": "\\?|:", @@ -604,7 +851,7 @@ }, { "match": "\\b(instanceof)\\b", - "name": "keyword.operator.java" + "name": "keyword.operator.instanceof.java" }, { "match": "(<<|>>>?|~|\\^)", @@ -641,39 +888,38 @@ { "match": "(\\||&)", "name": "keyword.operator.bitwise.java" - }, + } + ] + }, + "lambda-expression": { + "patterns": [ { - "match": "(?<=\\S)\\.(?=\\S)", - "name": "keyword.operator.dereference.java" - }, - { - "match": ";", - "name": "punctuation.terminator.java" + "match": "->", + "name": "storage.type.function.arrow.java" } ] }, "method-call": { - "begin": "([\\w$]+)(\\()", + "begin": "(\\.)\\s*([A-Za-z_$][\\w$]*)\\s*(\\()", "beginCaptures": { "1": { - "name": "meta.method.java" + "name": "punctuation.separator.period.java" }, "2": { - "name": "punctuation.definition.method-parameters.begin.java" + "name": "entity.name.function.java" + }, + "3": { + "name": "punctuation.definition.parameters.begin.bracket.round.java" } }, "end": "\\)", "endCaptures": { "0": { - "name": "punctuation.definition.method-parameters.end.java" + "name": "punctuation.definition.parameters.end.bracket.round.java" } }, "name": "meta.method-call.java", "patterns": [ - { - "match": ",", - "name": "punctuation.definition.seperator.parameter.java" - }, { "include": "#code" } @@ -684,7 +930,7 @@ "end": "(})|(?=;)", "endCaptures": { "1": { - "name": "punctuation.section.method.end.java" + "name": "punctuation.section.method.end.bracket.curly.java" } }, "name": "meta.method.java", @@ -693,49 +939,47 @@ "include": "#storage-modifiers" }, { - "begin": "(\\w+)\\s*\\(", + "begin": "(\\w+)\\s*(\\()", "beginCaptures": { "1": { "name": "entity.name.function.java" + }, + "2": { + "name": "punctuation.definition.parameters.begin.bracket.round.java" } }, "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.parameters.end.bracket.round.java" + } + }, "name": "meta.method.identifier.java", "patterns": [ { "include": "#parameters" }, { - "include": "#comments" + "include": "#parens" + }, + { + "include": "#comments-inline" } ] }, { - "begin": "<", - "end": ">", - "name": "storage.type.token.java", - "patterns": [ - { - "include": "#object-types" - }, - { - "begin": "<", - "comment": "This is just to support <>'s with no actual type prefix", - "end": ">|[^\\w\\s,\\[\\]<]", - "name": "storage.type.generic.java" - } - ] + "include": "#generics" }, { "begin": "(?=\\w.*\\s+\\w+\\s*\\()", - "end": "(?=\\w+\\s*\\()", + "end": "(?=\\s+\\w+\\s*\\()", "name": "meta.method.return-type.java", "patterns": [ { "include": "#all-types" }, { - "include": "#comments" + "include": "#parens" } ] }, @@ -746,11 +990,11 @@ "begin": "{", "beginCaptures": { "0": { - "name": "punctuation.section.method.begin.java" + "name": "punctuation.section.method.begin.bracket.curly.java" } }, "end": "(?=})", - "name": "meta.method.body.java", + "contentName": "meta.method.body.java", "patterns": [ { "include": "#code" @@ -762,136 +1006,251 @@ } ] }, + "numbers": { + "patterns": [ + { + "match": "(?x)\n\\b(?|[^\\w\\s,\\?<\\[\\]]", - "name": "storage.type.generic.java", - "patterns": [ - { - "include": "#object-types" - }, - { - "begin": "<", - "comment": "This is just to support <>'s with no actual type prefix", - "end": ">|[^\\w\\s,\\[\\]<]", - "name": "storage.type.generic.java" - } - ] + "include": "#generics" }, { - "begin": "\\b((?:[a-z]\\w*\\.)*[A-Z]+\\w*)(?=\\[)", - "end": "(?=[^\\]\\s])", - "name": "storage.type.object.array.java", - "patterns": [ - { - "begin": "\\[", - "end": "\\]", - "patterns": [ - { - "include": "#code" - } - ] - } - ] - }, - { - "captures": { + "begin": "\\b(?:[A-Z]\\w*\\s*(\\.)\\s*)*([A-Z]\\w*)\\s*(?=\\[)", + "beginCaptures": { "1": { - "name": "keyword.operator.dereference.java" + "name": "punctuation.separator.period.java" + }, + "2": { + "name": "storage.type.object.array.java" } }, - "match": "\\b(?:[a-z]\\w*(\\.))*[A-Z]+\\w*\\b", - "name": "storage.type.java" + "end": "(?!\\s*\\[)", + "patterns": [ + { + "include": "#comments" + }, + { + "include": "#parens" + } + ] + }, + { + "begin": "\\b(?:[A-Z]\\w*\\s*(\\.)\\s*)*[A-Z]\\w*\\s*(?=<)", + "beginCaptures": { + "0": { + "name": "storage.type.java" + }, + "1": { + "name": "punctuation.separator.period.java" + } + }, + "end": "(?<=>)", + "patterns": [ + { + "include": "#generics" + } + ] + }, + { + "match": "\\b(?:[A-Z]\\w*\\s*(\\.)\\s*)*[A-Z]\\w*\\b", + "name": "storage.type.java", + "captures": { + "1": { + "name": "punctuation.separator.period.java" + } + } } ] }, "object-types-inherited": { "patterns": [ { - "begin": "\\b((?:[a-z]\\w*\\.)*[A-Z]+\\w*)<", - "end": ">|[^\\w\\s,<]", - "name": "entity.other.inherited-class.java", - "patterns": [ - { - "include": "#object-types" - }, - { - "begin": "<", - "comment": "This is just to support <>'s with no actual type prefix", - "end": ">|[^\\w\\s,<]", - "name": "storage.type.generic.java" - } - ] + "include": "#generics" }, { + "match": "\\b(?:[A-Z]\\w*\\s*(\\.)\\s*)*[A-Z]\\w*\\b", + "name": "entity.other.inherited-class.java", "captures": { "1": { - "name": "keyword.operator.dereference.java" + "name": "punctuation.separator.period.java" } - }, - "match": "\\b(?:[a-z]\\w*(\\.))*[A-Z]+\\w*", - "name": "entity.other.inherited-class.java" + } + }, + { + "match": ",", + "name": "punctuation.separator.delimiter.java" } ] }, + "objects": { + "match": "(?\\[\\],][\\w<>\\[\\],?\\s]*)?\n \\s+\n [A-Za-z_$][\\w$]* # At least one identifier after space\n ([\\w\\[\\],$][\\w\\[\\],\\s]*)? # possibly primitive array or additional identifiers\n \\s*(=|;)\n))", + "end": "(?=;)", + "name": "meta.definition.variable.java", "patterns": [ { - "begin": "(?x:(?=\n (?:\n (?:private|protected|public|native|synchronized|volatile|abstract|threadsafe|transient|static|final) # visibility/modifier\n |\n (?:def)\n |\n (?:void|boolean|byte|char|short|int|float|long|double)\n |\n (?:(?:[a-z]\\w*\\.)*[A-Z]+\\w*) # object type\n )\n \\s+\n (?!private|protected|public|native|synchronized|volatile|abstract|threadsafe|transient|static|final|def|void|boolean|byte|char|short|int|float|long|double)\n [\\w\\d_<>\\[\\],\\?][\\w\\d_<>\\[\\],\\? \\t]*\n (?:=|$)\n \n\t\t\t\t\t))", + "match": "([A-Za-z$_][\\w$]*)(?=\\s*(\\[\\])*\\s*(;|=|,))", + "captures": { + "1": { + "name": "variable.other.definition.java" + } + } + }, + { + "include": "#all-types" + }, + { + "begin": "=", + "beginCaptures": { + "0": { + "name": "keyword.operator.assignment.java" + } + }, "end": "(?=;)", - "name": "meta.definition.variable.java", "patterns": [ - { - "match": "\\s" - }, - { - "captures": { - "1": { - "name": "constant.other.variable.java" - } - }, - "match": "([A-Z_0-9]+)\\s+(?=\\=)" - }, - { - "captures": { - "1": { - "name": "meta.definition.variable.name.java" - } - }, - "match": "(\\w[^\\s,]*)\\s+(?=\\=)" - }, - { - "begin": "=", - "beginCaptures": { - "0": { - "name": "keyword.operator.assignment.java" - } - }, - "end": "(?=;)", - "patterns": [ - { - "include": "#code" - } - ] - }, - { - "captures": { - "1": { - "name": "meta.definition.variable.name.java" - } - }, - "match": "(\\w[^\\s=]*)(?=\\s*;)" - }, { "include": "#code" } ] + }, + { + "include": "#code" + } + ] + }, + "member-variables": { + "begin": "(?=private|protected|public|native|synchronized|abstract|threadsafe|transient|static|final)", + "end": "(?=;)", + "patterns": [ + { + "include": "#storage-modifiers" + }, + { + "include": "#variables" } ] } }, - "scopeName": "source.java", - "uuid": "2B449DF6-6B1D-11D9-94EC-000D93589AF6", - "version": "https://github.com/textmate/java.tmbundle/commit/faffa518d0b22b68b4e5e6b4c939722522b97d40" + "version": "https://github.com/atom/language-java/commit/0e0ec7966059e3e363868311b3d855014bca95dd" } \ No newline at end of file diff --git a/extensions/java/syntaxes/javadoc.tmLanguage.json b/extensions/java/syntaxes/javadoc.tmLanguage.json deleted file mode 100644 index a47e5c98d04..00000000000 --- a/extensions/java/syntaxes/javadoc.tmLanguage.json +++ /dev/null @@ -1,432 +0,0 @@ -{ - "fileTypes": [], - "name": "JavaDoc", - "patterns": [ - { - "begin": "(/\\*\\*)\\s*$", - "beginCaptures": { - "1": { - "name": "punctuation.definition.comment.begin.javadoc" - } - }, - "contentName": "text.html", - "end": "\\*/", - "endCaptures": { - "0": { - "name": "punctuation.definition.comment.end.javadoc" - } - }, - "name": "comment.block.documentation.javadoc", - "patterns": [ - { - "include": "#inline" - }, - { - "begin": "((\\@)param)", - "beginCaptures": { - "1": { - "name": "keyword.other.documentation.param.javadoc" - }, - "2": { - "name": "punctuation.definition.keyword.javadoc" - } - }, - "end": "(?=^\\s*\\*?\\s*@|\\*/)", - "name": "meta.documentation.tag.param.javadoc", - "patterns": [ - { - "include": "#inline" - } - ] - }, - { - "begin": "((\\@)return)", - "beginCaptures": { - "1": { - "name": "keyword.other.documentation.return.javadoc" - }, - "2": { - "name": "punctuation.definition.keyword.javadoc" - } - }, - "end": "(?=^\\s*\\*?\\s*@|\\*/)", - "name": "meta.documentation.tag.return.javadoc", - "patterns": [ - { - "include": "#inline" - } - ] - }, - { - "begin": "((\\@)throws)", - "beginCaptures": { - "1": { - "name": "keyword.other.documentation.throws.javadoc" - }, - "2": { - "name": "punctuation.definition.keyword.javadoc" - } - }, - "end": "(?=^\\s*\\*?\\s*@|\\*/)", - "name": "meta.documentation.tag.throws.javadoc", - "patterns": [ - { - "include": "#inline" - } - ] - }, - { - "begin": "((\\@)exception)", - "beginCaptures": { - "1": { - "name": "keyword.other.documentation.exception.javadoc" - }, - "2": { - "name": "punctuation.definition.keyword.javadoc" - } - }, - "end": "(?=^\\s*\\*?\\s*@|\\*/)", - "name": "meta.documentation.tag.exception.javadoc", - "patterns": [ - { - "include": "#inline" - } - ] - }, - { - "begin": "((\\@)author)", - "beginCaptures": { - "1": { - "name": "keyword.other.documentation.author.javadoc" - }, - "2": { - "name": "punctuation.definition.keyword.javadoc" - } - }, - "end": "(?=^\\s*\\*?\\s*@|\\*/)", - "name": "meta.documentation.tag.author.javadoc", - "patterns": [ - { - "include": "#inline" - } - ] - }, - { - "begin": "((\\@)version)", - "beginCaptures": { - "1": { - "name": "keyword.other.documentation.version.javadoc" - }, - "2": { - "name": "punctuation.definition.keyword.javadoc" - } - }, - "end": "(?=^\\s*\\*?\\s*@|\\*/)", - "name": "meta.documentation.tag.version.javadoc", - "patterns": [ - { - "include": "#inline" - } - ] - }, - { - "begin": "((\\@)see)", - "beginCaptures": { - "1": { - "name": "keyword.other.documentation.see.javadoc" - }, - "2": { - "name": "punctuation.definition.keyword.javadoc" - } - }, - "end": "(?=^\\s*\\*?\\s*@|\\*/)", - "name": "meta.documentation.tag.see.javadoc", - "patterns": [ - { - "include": "#inline" - } - ] - }, - { - "begin": "((\\@)since)", - "beginCaptures": { - "1": { - "name": "keyword.other.documentation.since.javadoc" - }, - "2": { - "name": "punctuation.definition.keyword.javadoc" - } - }, - "end": "(?=^\\s*\\*?\\s*@|\\*/)", - "name": "meta.documentation.tag.since.javadoc", - "patterns": [ - { - "include": "#inline" - } - ] - }, - { - "begin": "((\\@)serial)", - "beginCaptures": { - "1": { - "name": "keyword.other.documentation.serial.javadoc" - }, - "2": { - "name": "punctuation.definition.keyword.javadoc" - } - }, - "end": "(?=^\\s*\\*?\\s*@|\\*/)", - "name": "meta.documentation.tag.serial.javadoc", - "patterns": [ - { - "include": "#inline" - } - ] - }, - { - "begin": "((\\@)serialField)", - "beginCaptures": { - "1": { - "name": "keyword.other.documentation.serialField.javadoc" - }, - "2": { - "name": "punctuation.definition.keyword.javadoc" - } - }, - "end": "(?=^\\s*\\*?\\s*@|\\*/)", - "name": "meta.documentation.tag.serialField.javadoc", - "patterns": [ - { - "include": "#inline" - } - ] - }, - { - "begin": "((\\@)serialData)", - "beginCaptures": { - "1": { - "name": "keyword.other.documentation.serialData.javadoc" - }, - "2": { - "name": "punctuation.definition.keyword.javadoc" - } - }, - "end": "(?=^\\s*\\*?\\s*@|\\*/)", - "name": "meta.documentation.tag.serialData.javadoc", - "patterns": [ - { - "include": "#inline" - } - ] - }, - { - "begin": "((\\@)deprecated)", - "beginCaptures": { - "1": { - "name": "keyword.other.documentation.deprecated.javadoc" - }, - "2": { - "name": "punctuation.definition.keyword.javadoc" - } - }, - "end": "(?=^\\s*\\*?\\s*@|\\*/)", - "name": "meta.documentation.tag.deprecated.javadoc", - "patterns": [ - { - "include": "#inline" - } - ] - }, - { - "captures": { - "1": { - "name": "keyword.other.documentation.custom.javadoc" - }, - "2": { - "name": "punctuation.definition.keyword.javadoc" - } - }, - "match": "((\\@)\\S+)\\s" - } - ] - } - ], - "repository": { - "inline": { - "patterns": [ - { - "include": "#inline-formatting" - }, - { - "comment": "This prevents < characters in commented source from starting\n\t\t\t\t\t\t\t\ta tag that will not end. List of allowed tags taken from\n\t\t\t\t\t\t\t\tjava checkstyle.", - "match": "<(?!/?(a|abbr|acronym|address|area|b|bdo|big|blockquote|br|caption|cite|code|colgroup|dd|del|div|dfn|dl|dt|em|fieldset|font|h1toh6|hr|i|img|ins|kbd|li|ol|p|pre|q|samp|small|span|strong|sub|sup|table|tbody|td|tfoot|th|thread|tr|tt|u|ul)\\b[^>]*>)" - }, - { - "include": "text.html.basic" - }, - { - "match": "((https?|s?ftp|ftps|file|smb|afp|nfs|(x-)?man|gopher|txmt)://|mailto:)[-:@a-zA-Z0-9_.,~%+/?=&#;]+(?Note:

    Hello", + "t": "source.java meta.class.java meta.class.body.java comment.block.javadoc.java", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -452,7 +463,7 @@ }, { "c": "\t * ", - "t": "source.java meta.class.java meta.class.body.java comment.block.documentation.javadoc text.html", + "t": "source.java meta.class.java meta.class.body.java comment.block.javadoc.java", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -462,107 +473,8 @@ } }, { - "c": "<", - "t": "source.java meta.class.java meta.class.body.java comment.block.documentation.javadoc text.html meta.tag.block.any.html punctuation.definition.tag.begin.html", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": "p", - "t": "source.java meta.class.java meta.class.body.java comment.block.documentation.javadoc text.html meta.tag.block.any.html entity.name.tag.block.any.html", - "r": { - "dark_plus": "entity.name.tag: #569CD6", - "light_plus": "entity.name.tag: #800000", - "dark_vs": "entity.name.tag: #569CD6", - "light_vs": "entity.name.tag: #800000", - "hc_black": "entity.name.tag: #569CD6" - } - }, - { - "c": ">", - "t": "source.java meta.class.java meta.class.body.java comment.block.documentation.javadoc text.html meta.tag.block.any.html punctuation.definition.tag.end.html", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": "Note:", - "t": "source.java meta.class.java meta.class.body.java comment.block.documentation.javadoc text.html", - "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", - "hc_black": "comment: #7CA668" - } - }, - { - "c": "", - "t": "source.java meta.class.java meta.class.body.java comment.block.documentation.javadoc text.html meta.tag.block.any.html punctuation.definition.tag.end.html", - "r": { - "dark_plus": "punctuation.definition.tag: #808080", - "light_plus": "punctuation.definition.tag: #800000", - "dark_vs": "punctuation.definition.tag: #808080", - "light_vs": "punctuation.definition.tag: #800000", - "hc_black": "punctuation.definition.tag: #808080" - } - }, - { - "c": " Hello", - "t": "source.java meta.class.java meta.class.body.java comment.block.documentation.javadoc text.html", - "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", - "hc_black": "comment: #7CA668" - } - }, - { - "c": "\t * ", - "t": "source.java meta.class.java meta.class.body.java comment.block.documentation.javadoc text.html", - "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", - "hc_black": "comment: #7CA668" - } - }, - { - "c": "@", - "t": "source.java meta.class.java meta.class.body.java comment.block.documentation.javadoc text.html meta.documentation.tag.param.javadoc keyword.other.documentation.param.javadoc punctuation.definition.keyword.javadoc", + "c": "@param", + "t": "source.java meta.class.java meta.class.body.java comment.block.javadoc.java keyword.other.documentation.javadoc.java", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", @@ -572,19 +484,8 @@ } }, { - "c": "param", - "t": "source.java meta.class.java meta.class.body.java comment.block.documentation.javadoc text.html meta.documentation.tag.param.javadoc keyword.other.documentation.param.javadoc", - "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" - } - }, - { - "c": " args", - "t": "source.java meta.class.java meta.class.body.java comment.block.documentation.javadoc text.html meta.documentation.tag.param.javadoc", + "c": " ", + "t": "source.java meta.class.java meta.class.body.java comment.block.javadoc.java", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -593,9 +494,20 @@ "hc_black": "comment: #7CA668" } }, + { + "c": "args", + "t": "source.java meta.class.java meta.class.body.java comment.block.javadoc.java variable.parameter.java", + "r": { + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", + "dark_vs": "comment: #608B4E", + "light_vs": "comment: #008000", + "hc_black": "variable: #9CDCFE" + } + }, { "c": "\t ", - "t": "source.java meta.class.java meta.class.body.java comment.block.documentation.javadoc text.html meta.documentation.tag.param.javadoc", + "t": "source.java meta.class.java meta.class.body.java comment.block.javadoc.java", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -606,7 +518,7 @@ }, { "c": "*/", - "t": "source.java meta.class.java meta.class.body.java comment.block.documentation.javadoc punctuation.definition.comment.end.javadoc", + "t": "source.java meta.class.java meta.class.body.java comment.block.javadoc.java punctuation.definition.comment.java", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -650,18 +562,18 @@ }, { "c": "void", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.return-type.java storage.type.primitive.array.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.return-type.java storage.type.primitive.java", "r": { - "dark_plus": "storage.type.primitive.array.java: #4EC9B0", - "light_plus": "storage.type.primitive.array.java: #267F99", + "dark_plus": "storage.type.primitive.java: #4EC9B0", + "light_plus": "storage.type.primitive.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type.primitive.array.java: #4EC9B0" + "hc_black": "storage.type.primitive.java: #4EC9B0" } }, { "c": " ", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.return-type.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -683,7 +595,7 @@ }, { "c": "(", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.identifier.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.identifier.java punctuation.definition.parameters.begin.bracket.round.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -694,13 +606,13 @@ }, { "c": "int", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.identifier.java storage.type.primitive.array.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.identifier.java storage.type.primitive.java", "r": { - "dark_plus": "storage.type.primitive.array.java: #4EC9B0", - "light_plus": "storage.type.primitive.array.java: #267F99", + "dark_plus": "storage.type.primitive.java: #4EC9B0", + "light_plus": "storage.type.primitive.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type.primitive.array.java: #4EC9B0" + "hc_black": "storage.type.primitive.java: #4EC9B0" } }, { @@ -727,7 +639,7 @@ }, { "c": ")", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.identifier.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.identifier.java punctuation.definition.parameters.end.bracket.round.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -749,7 +661,7 @@ }, { "c": "{", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java punctuation.section.method.begin.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java punctuation.section.method.begin.bracket.curly.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -771,18 +683,40 @@ }, { "c": "double", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java storage.type.primitive.array.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java storage.type.primitive.java", "r": { - "dark_plus": "storage.type.primitive.array.java: #4EC9B0", - "light_plus": "storage.type.primitive.array.java: #267F99", + "dark_plus": "storage.type.primitive.java: #4EC9B0", + "light_plus": "storage.type.primitive.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type.primitive.array.java: #4EC9B0" + "hc_black": "storage.type.primitive.java: #4EC9B0" } }, { - "c": " b ", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java", + "c": " ", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "b", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java variable.other.definition.java", + "r": { + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "variable: #9CDCFE" + } + }, + { + "c": " ", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -793,7 +727,7 @@ }, { "c": "=", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java keyword.operator.assignment.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java keyword.operator.assignment.java", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -804,7 +738,7 @@ }, { "c": " ", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -815,7 +749,7 @@ }, { "c": "0.0", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java constant.numeric.float.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java constant.numeric.decimal.java", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -848,18 +782,40 @@ }, { "c": "double", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java storage.type.primitive.array.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java storage.type.primitive.java", "r": { - "dark_plus": "storage.type.primitive.array.java: #4EC9B0", - "light_plus": "storage.type.primitive.array.java: #267F99", + "dark_plus": "storage.type.primitive.java: #4EC9B0", + "light_plus": "storage.type.primitive.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type.primitive.array.java: #4EC9B0" + "hc_black": "storage.type.primitive.java: #4EC9B0" } }, { - "c": " c ", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java", + "c": " ", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "c", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java variable.other.definition.java", + "r": { + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "variable: #9CDCFE" + } + }, + { + "c": " ", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -870,7 +826,7 @@ }, { "c": "=", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java keyword.operator.assignment.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java keyword.operator.assignment.java", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -881,7 +837,7 @@ }, { "c": " ", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -892,7 +848,7 @@ }, { "c": "10e3", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java constant.numeric.float.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java constant.numeric.decimal.java", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -925,18 +881,40 @@ }, { "c": "long", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java storage.type.primitive.array.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java storage.type.primitive.java", "r": { - "dark_plus": "storage.type.primitive.array.java: #4EC9B0", - "light_plus": "storage.type.primitive.array.java: #267F99", + "dark_plus": "storage.type.primitive.java: #4EC9B0", + "light_plus": "storage.type.primitive.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type.primitive.array.java: #4EC9B0" + "hc_black": "storage.type.primitive.java: #4EC9B0" } }, { - "c": " l ", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java", + "c": " ", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "l", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java variable.other.definition.java", + "r": { + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "variable: #9CDCFE" + } + }, + { + "c": " ", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -947,7 +925,7 @@ }, { "c": "=", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java keyword.operator.assignment.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java keyword.operator.assignment.java", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -958,7 +936,7 @@ }, { "c": " ", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -969,7 +947,7 @@ }, { "c": "134l", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java constant.numeric.integer.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java constant.numeric.decimal.java", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1002,7 +980,7 @@ }, { "c": "}", - "t": "source.java meta.class.java meta.class.body.java meta.method.java punctuation.section.method.end.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java punctuation.section.method.end.bracket.curly.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1090,7 +1068,7 @@ }, { "c": "(", - "t": "source.java meta.class.java meta.class.body.java meta.declaration.annotation.java punctuation.definition.annotation-arguments.begin.java", + "t": "source.java meta.class.java meta.class.body.java meta.declaration.annotation.java punctuation.definition.annotation-arguments.begin.bracket.round.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1178,7 +1156,7 @@ }, { "c": ")", - "t": "source.java meta.class.java meta.class.body.java meta.declaration.annotation.java punctuation.definition.annotation-arguments.end.java", + "t": "source.java meta.class.java meta.class.body.java meta.declaration.annotation.java punctuation.definition.annotation-arguments.end.bracket.round.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1222,18 +1200,18 @@ }, { "c": "long", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.return-type.java storage.type.primitive.array.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.return-type.java storage.type.primitive.java", "r": { - "dark_plus": "storage.type.primitive.array.java: #4EC9B0", - "light_plus": "storage.type.primitive.array.java: #267F99", + "dark_plus": "storage.type.primitive.java: #4EC9B0", + "light_plus": "storage.type.primitive.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type.primitive.array.java: #4EC9B0" + "hc_black": "storage.type.primitive.java: #4EC9B0" } }, { "c": " ", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.return-type.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1255,7 +1233,7 @@ }, { "c": "(", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.identifier.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.identifier.java punctuation.definition.parameters.begin.bracket.round.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1266,13 +1244,13 @@ }, { "c": "long", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.identifier.java storage.type.primitive.array.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.identifier.java storage.type.primitive.java", "r": { - "dark_plus": "storage.type.primitive.array.java: #4EC9B0", - "light_plus": "storage.type.primitive.array.java: #267F99", + "dark_plus": "storage.type.primitive.java: #4EC9B0", + "light_plus": "storage.type.primitive.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type.primitive.array.java: #4EC9B0" + "hc_black": "storage.type.primitive.java: #4EC9B0" } }, { @@ -1299,7 +1277,7 @@ }, { "c": ")", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.identifier.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.identifier.java punctuation.definition.parameters.end.bracket.round.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1310,7 +1288,7 @@ }, { "c": "{", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java punctuation.section.method.begin.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java punctuation.section.method.begin.bracket.curly.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1341,50 +1319,6 @@ "hc_black": "keyword.control: #C586C0" } }, - { - "c": " (", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "int", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java storage.type.primitive.array.java", - "r": { - "dark_plus": "storage.type.primitive.array.java: #4EC9B0", - "light_plus": "storage.type.primitive.array.java: #267F99", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type.primitive.array.java: #4EC9B0" - } - }, - { - "c": " i ", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "=", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java keyword.operator.assignment.java", - "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", - "hc_black": "keyword.operator: #D4D4D4" - } - }, { "c": " ", "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java", @@ -1396,9 +1330,86 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "(", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java punctuation.bracket.round.java", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "int", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java storage.type.primitive.java", + "r": { + "dark_plus": "storage.type.primitive.java: #4EC9B0", + "light_plus": "storage.type.primitive.java: #267F99", + "dark_vs": "storage.type: #569CD6", + "light_vs": "storage.type: #0000FF", + "hc_black": "storage.type.primitive.java: #4EC9B0" + } + }, + { + "c": " ", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "i", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java variable.other.definition.java", + "r": { + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "variable: #9CDCFE" + } + }, + { + "c": " ", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "=", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java keyword.operator.assignment.java", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, { "c": "0", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java constant.numeric.integer.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java constant.numeric.decimal.java", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1453,7 +1464,7 @@ }, { "c": "9", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java constant.numeric.integer.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java constant.numeric.decimal.java", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1496,7 +1507,18 @@ } }, { - "c": ") ", + "c": ")", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java punctuation.bracket.round.java", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java", "r": { "dark_plus": "default: #D4D4D4", @@ -1508,7 +1530,7 @@ }, { "c": "{", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java punctuation.section.block.begin.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java punctuation.section.block.begin.bracket.curly.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1530,51 +1552,40 @@ }, { "c": "System", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java storage.type.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java variable.other.object.java", "r": { - "dark_plus": "storage.type.java: #4EC9B0", - "light_plus": "storage.type.java: #267F99", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type.java: #4EC9B0" + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "variable: #9CDCFE" } }, { "c": ".", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java keyword.operator.dereference.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java punctuation.separator.period.java", "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", - "hc_black": "keyword.operator: #D4D4D4" + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" } }, { "c": "out", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java variable.other.object.property.java", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { "c": ".", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java keyword.operator.dereference.java", - "r": { - "dark_plus": "keyword.operator: #D4D4D4", - "light_plus": "keyword.operator: #000000", - "dark_vs": "keyword.operator: #D4D4D4", - "light_vs": "keyword.operator: #000000", - "hc_black": "keyword.operator: #D4D4D4" - } - }, - { - "c": "println", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.method-call.java meta.method.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.method-call.java punctuation.separator.period.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1583,9 +1594,20 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "println", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.method-call.java entity.name.function.java", + "r": { + "dark_plus": "entity.name.function: #DCDCAA", + "light_plus": "entity.name.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.function: #DCDCAA" + } + }, { "c": "(", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.method-call.java punctuation.definition.method-parameters.begin.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.method-call.java punctuation.definition.parameters.begin.bracket.round.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1662,7 +1684,7 @@ }, { "c": ")", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.method-call.java punctuation.definition.method-parameters.end.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.method-call.java punctuation.definition.parameters.end.bracket.round.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1695,7 +1717,7 @@ }, { "c": "}", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java punctuation.section.block.end.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java punctuation.section.block.end.bracket.curly.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1739,7 +1761,7 @@ }, { "c": "10", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java constant.numeric.integer.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java constant.numeric.decimal.java", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1772,7 +1794,7 @@ }, { "c": "}", - "t": "source.java meta.class.java meta.class.body.java meta.method.java punctuation.section.method.end.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java punctuation.section.method.end.bracket.curly.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1871,18 +1893,18 @@ }, { "c": "void", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.return-type.java storage.type.primitive.array.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.return-type.java storage.type.primitive.java", "r": { - "dark_plus": "storage.type.primitive.array.java: #4EC9B0", - "light_plus": "storage.type.primitive.array.java: #267F99", + "dark_plus": "storage.type.primitive.java: #4EC9B0", + "light_plus": "storage.type.primitive.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type.primitive.array.java: #4EC9B0" + "hc_black": "storage.type.primitive.java: #4EC9B0" } }, { "c": " ", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.return-type.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1903,8 +1925,19 @@ } }, { - "c": "()", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.identifier.java", + "c": "(", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.identifier.java punctuation.definition.parameters.begin.bracket.round.java", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.identifier.java punctuation.definition.parameters.end.bracket.round.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1926,7 +1959,7 @@ }, { "c": "{", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java punctuation.section.method.begin.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java punctuation.section.method.begin.bracket.curly.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1948,18 +1981,40 @@ }, { "c": "int", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java storage.type.primitive.array.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java storage.type.primitive.java", "r": { - "dark_plus": "storage.type.primitive.array.java: #4EC9B0", - "light_plus": "storage.type.primitive.array.java: #267F99", + "dark_plus": "storage.type.primitive.java: #4EC9B0", + "light_plus": "storage.type.primitive.java: #267F99", "dark_vs": "storage.type: #569CD6", "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type.primitive.array.java: #4EC9B0" + "hc_black": "storage.type.primitive.java: #4EC9B0" } }, { - "c": " hex ", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java", + "c": " ", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "hex", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java variable.other.definition.java", + "r": { + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "variable: #9CDCFE" + } + }, + { + "c": " ", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1970,7 +2025,7 @@ }, { "c": "=", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java keyword.operator.assignment.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java keyword.operator.assignment.java", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -1981,7 +2036,7 @@ }, { "c": " ", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1992,7 +2047,7 @@ }, { "c": "0x5", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java constant.numeric.hex.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java constant.numeric.hex.java", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -2024,19 +2079,8 @@ } }, { - "c": "Vector<", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java storage.type.generic.java", - "r": { - "dark_plus": "storage.type.generic.java: #4EC9B0", - "light_plus": "storage.type.generic.java: #267F99", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type.generic.java: #4EC9B0" - } - }, - { - "c": "Number", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java storage.type.generic.java storage.type.java", + "c": "Vector", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java storage.type.java", "r": { "dark_plus": "storage.type.java: #4EC9B0", "light_plus": "storage.type.java: #267F99", @@ -2046,8 +2090,19 @@ } }, { - "c": ">", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java storage.type.generic.java", + "c": "<", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java punctuation.bracket.angle.java", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "Number", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java storage.type.generic.java", "r": { "dark_plus": "storage.type.generic.java: #4EC9B0", "light_plus": "storage.type.generic.java: #267F99", @@ -2057,8 +2112,41 @@ } }, { - "c": " v ", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java", + "c": ">", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java punctuation.bracket.angle.java", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": " ", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "v", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java variable.other.definition.java", + "r": { + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "variable: #9CDCFE" + } + }, + { + "c": " ", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2069,7 +2157,7 @@ }, { "c": "=", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java keyword.operator.assignment.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java keyword.operator.assignment.java", "r": { "dark_plus": "keyword.operator: #D4D4D4", "light_plus": "keyword.operator: #000000", @@ -2080,7 +2168,7 @@ }, { "c": " ", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2091,7 +2179,7 @@ }, { "c": "new", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java keyword.control.new.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java keyword.control.new.java", "r": { "dark_plus": "keyword.control: #C586C0", "light_plus": "keyword.control: #AF00DB", @@ -2102,7 +2190,7 @@ }, { "c": " ", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2113,18 +2201,29 @@ }, { "c": "Vector", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java storage.type.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java meta.function-call.java entity.name.function.java", "r": { - "dark_plus": "storage.type.java: #4EC9B0", - "light_plus": "storage.type.java: #267F99", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type.java: #4EC9B0" + "dark_plus": "entity.name.function: #DCDCAA", + "light_plus": "entity.name.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.function: #DCDCAA" } }, { - "c": "()", - "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java", + "c": "(", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java meta.function-call.java punctuation.definition.parameters.begin.bracket.round.java", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "source.java meta.class.java meta.class.body.java meta.method.java meta.method.body.java meta.definition.variable.java meta.function-call.java punctuation.definition.parameters.end.bracket.round.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2157,7 +2256,7 @@ }, { "c": "}", - "t": "source.java meta.class.java meta.class.body.java meta.method.java punctuation.section.method.end.java", + "t": "source.java meta.class.java meta.class.body.java meta.method.java punctuation.section.method.end.bracket.curly.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -2168,7 +2267,7 @@ }, { "c": "}", - "t": "source.java meta.class.java punctuation.section.class.end.java", + "t": "source.java meta.class.java punctuation.section.class.end.bracket.curly.java", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", diff --git a/extensions/theme-defaults/themes/dark_vs.json b/extensions/theme-defaults/themes/dark_vs.json index 40bcc308f28..827f59892d8 100644 --- a/extensions/theme-defaults/themes/dark_vs.json +++ b/extensions/theme-defaults/themes/dark_vs.json @@ -325,6 +325,7 @@ "name": "coloring of the Java import and package identifiers", "scope": [ "storage.modifier.import.java", + "variable.language.wildcard.java", "storage.modifier.package.java" ], "settings": { diff --git a/extensions/theme-defaults/themes/hc_black_defaults.json b/extensions/theme-defaults/themes/hc_black_defaults.json index b98e3e17b26..6537cac26f2 100644 --- a/extensions/theme-defaults/themes/hc_black_defaults.json +++ b/extensions/theme-defaults/themes/hc_black_defaults.json @@ -300,7 +300,11 @@ }, { "name": "coloring of the Java import and package identifiers", - "scope": ["storage.modifier.import.java", "storage.modifier.package.java"], + "scope": [ + "storage.modifier.import.java", + "variable.language.wildcard.java", + "storage.modifier.package.java" + ], "settings": { "foreground": "#d4d4d4" } diff --git a/extensions/theme-defaults/themes/light_vs.json b/extensions/theme-defaults/themes/light_vs.json index 8d5fabb13a3..1c294607f60 100644 --- a/extensions/theme-defaults/themes/light_vs.json +++ b/extensions/theme-defaults/themes/light_vs.json @@ -341,6 +341,7 @@ "name": "coloring of the Java import and package identifiers", "scope": [ "storage.modifier.import.java", + "variable.language.wildcard.java", "storage.modifier.package.java" ], "settings": { From 99f9b13c4e85672cc3cb79a98a8d9ff017cb6af8 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 12:07:48 +0200 Subject: [PATCH 0584/1164] win32-ia32 --- build/gulpfile.vscode.js | 46 ++++++++++++++++++++-------------- build/gulpfile.vscode.win32.js | 12 ++++----- build/tfs/linux/build.sh | 3 +++ build/tfs/win32/1_build.ps1 | 6 ++++- build/tfs/win32/2_package.ps1 | 2 +- build/tfs/win32/3_upload.ps1 | 10 ++++---- build/win32/code.iss | 2 +- 7 files changed, 48 insertions(+), 33 deletions(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 042e45d4cd4..309c64326ba 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -136,20 +136,27 @@ const config = { repo: product.electronRepository || void 0 }; +function getElectron(arch = process.arch) { + return () => { + const electronOpts = _.extend({}, config, { + platform: process.platform, + arch, + ffmpegChromium: true, + keepDefaultApp: true + }); + + return gulp.src('package.json') + .pipe(json({ name: product.nameShort })) + .pipe(electron(electronOpts)) + .pipe(filter(['**', '!**/app/package.json'])) + .pipe(vfs.dest('.build/electron')); + }; +} + gulp.task('clean-electron', util.rimraf('.build/electron')); - -gulp.task('electron', ['clean-electron'], () => { - const platform = process.platform; - const arch = process.env.VSCODE_ELECTRON_PLATFORM || (platform === 'win32' ? 'ia32' : process.arch); - const opts = _.extend({}, config, { platform, arch, ffmpegChromium: true, keepDefaultApp: true }); - const name = product.nameShort; - - return gulp.src('package.json') - .pipe(json({ name })) - .pipe(electron(opts)) - .pipe(filter(['**', '!**/app/package.json'])) - .pipe(vfs.dest('.build/electron')); -}); +gulp.task('electron', ['clean-electron'], getElectron()); +gulp.task('electron-ia32', ['clean-electron'], getElectron('ia32')); +gulp.task('electron-x64', ['clean-electron'], getElectron('x64')); const languages = ['chs', 'cht', 'jpn', 'kor', 'deu', 'fra', 'esn', 'rus', 'ita']; @@ -187,9 +194,7 @@ function computeChecksum(filename) { return hash; } -function packageTask(platform, arch, opts) { - opts = opts || {}; - +function packageTask(platform, arch, opts = {}) { const destination = path.join(path.dirname(root), 'VSCode') + (platform ? '-' + platform : '') + (arch ? '-' + arch : ''); platform = platform || process.platform; arch = platform === 'win32' ? 'ia32' : arch; @@ -326,19 +331,22 @@ function packageTask(platform, arch, opts) { const buildRoot = path.dirname(root); -gulp.task('clean-vscode-win32', util.rimraf(path.join(buildRoot, 'VSCode-win32'))); +gulp.task('clean-vscode-win32-ia32', util.rimraf(path.join(buildRoot, 'VSCode-win32-ia32'))); +gulp.task('clean-vscode-win32-x64', util.rimraf(path.join(buildRoot, 'VSCode-win32-x64'))); gulp.task('clean-vscode-darwin', util.rimraf(path.join(buildRoot, 'VSCode-darwin'))); gulp.task('clean-vscode-linux-ia32', util.rimraf(path.join(buildRoot, 'VSCode-linux-ia32'))); gulp.task('clean-vscode-linux-x64', util.rimraf(path.join(buildRoot, 'VSCode-linux-x64'))); gulp.task('clean-vscode-linux-arm', util.rimraf(path.join(buildRoot, 'VSCode-linux-arm'))); -gulp.task('vscode-win32', ['optimize-vscode', 'clean-vscode-win32'], packageTask('win32')); +gulp.task('vscode-win32-ia32', ['optimize-vscode', 'clean-vscode-win32-ia32'], packageTask('win32', 'ia32')); +gulp.task('vscode-win32-x64', ['optimize-vscode', 'clean-vscode-win32-x64'], packageTask('win32', 'x64')); gulp.task('vscode-darwin', ['optimize-vscode', 'clean-vscode-darwin'], packageTask('darwin')); gulp.task('vscode-linux-ia32', ['optimize-vscode', 'clean-vscode-linux-ia32'], packageTask('linux', 'ia32')); gulp.task('vscode-linux-x64', ['optimize-vscode', 'clean-vscode-linux-x64'], packageTask('linux', 'x64')); gulp.task('vscode-linux-arm', ['optimize-vscode', 'clean-vscode-linux-arm'], packageTask('linux', 'arm')); -gulp.task('vscode-win32-min', ['minify-vscode', 'clean-vscode-win32'], packageTask('win32', null, { minified: true })); +gulp.task('vscode-win32-ia32-min', ['minify-vscode', 'clean-vscode-win32-ia32'], packageTask('win32', 'ia32', { minified: true })); +gulp.task('vscode-win32-x64-min', ['minify-vscode', 'clean-vscode-win32-x64'], packageTask('win32', 'x64', { minified: true })); gulp.task('vscode-darwin-min', ['minify-vscode', 'clean-vscode-darwin'], packageTask('darwin', null, { minified: true })); gulp.task('vscode-linux-ia32-min', ['minify-vscode', 'clean-vscode-linux-ia32'], packageTask('linux', 'ia32', { minified: true })); gulp.task('vscode-linux-x64-min', ['minify-vscode', 'clean-vscode-linux-x64'], packageTask('linux', 'x64', { minified: true })); diff --git a/build/gulpfile.vscode.win32.js b/build/gulpfile.vscode.win32.js index a398076db3d..42f7e3363a6 100644 --- a/build/gulpfile.vscode.win32.js +++ b/build/gulpfile.vscode.win32.js @@ -15,8 +15,8 @@ const pkg = require('../package.json'); const product = require('../product.json'); const repoPath = path.dirname(__dirname); -const buildPath = path.join(path.dirname(repoPath), 'VSCode-win32'); -const zipPath = path.join(repoPath, '.build', 'win32', 'archive', 'VSCode-win32.zip'); +const buildPath = path.join(path.dirname(repoPath), 'VSCode-win32-ia32'); +const zipPath = path.join(repoPath, '.build', 'win32-ia32', 'archive', 'VSCode-win32-ia32.zip'); const issPath = path.join(__dirname, 'win32', 'code.iss'); const innoSetupPath = path.join(path.dirname(path.dirname(require.resolve('innosetup-compiler'))), 'bin', 'ISCC.exe'); @@ -57,8 +57,8 @@ function buildWin32Setup(cb) { packageInnoSetup(issPath, { definitions }, cb); } -gulp.task('clean-vscode-win32-setup', util.rimraf('.build/win32/setup')); -gulp.task('vscode-win32-setup', ['clean-vscode-win32-setup'], buildWin32Setup); +gulp.task('clean-vscode-win32-ia32-setup', util.rimraf('.build/win32-ia32/setup')); +gulp.task('vscode-win32-ia32-setup', ['clean-vscode-win32-ia32-setup'], buildWin32Setup); function archiveWin32Setup(cb) { const args = ['a', '-tzip', zipPath, buildPath, '-r']; @@ -68,5 +68,5 @@ function archiveWin32Setup(cb) { .on('exit', () => cb(null)); } -gulp.task('clean-vscode-win32-archive', util.rimraf('.build/win32/archive')); -gulp.task('vscode-win32-archive', ['clean-vscode-win32-archive'], archiveWin32Setup); +gulp.task('clean-vscode-win32-ia32-archive', util.rimraf('.build/win32-ia32/archive')); +gulp.task('vscode-win32-ia32-archive', ['clean-vscode-win32-ia32-archive'], archiveWin32Setup); diff --git a/build/tfs/linux/build.sh b/build/tfs/linux/build.sh index 52edf7ba62d..2b876b693c5 100755 --- a/build/tfs/linux/build.sh +++ b/build/tfs/linux/build.sh @@ -20,6 +20,9 @@ step "Install dependencies" \ step "Mix in repository from vscode-distro" \ npm run gulp -- mixin +step "Get Electron" \ + npm run gulp -- "electron-$ARCH" + step "Install distro dependencies" \ node build/tfs/common/installDistro.js --arch=$ARCH diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index a177c4b82e0..27ff376a851 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -20,12 +20,16 @@ step "Mix in repository from vscode-distro" { exec { & npm run gulp -- mixin } } +step "Get Electron" { + exec { & npm run gulp -- electron-ia32 } +} + step "Install distro dependencies" { exec { & node build\tfs\common\installDistro.js } } step "Build minified" { - exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-min } + exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-ia32-min } } step "Run unit tests" { diff --git a/build/tfs/win32/2_package.ps1 b/build/tfs/win32/2_package.ps1 index 7d29cca6c3a..bec7ba9b167 100644 --- a/build/tfs/win32/2_package.ps1 +++ b/build/tfs/win32/2_package.ps1 @@ -1,7 +1,7 @@ . .\build\tfs\win32\lib.ps1 step "Create archive and setup package" { - exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-archive vscode-win32-setup } + exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-ia32-archive vscode-win32-ia32-setup } } done \ No newline at end of file diff --git a/build/tfs/win32/3_upload.ps1 b/build/tfs/win32/3_upload.ps1 index 5b7e4a0f482..13581050618 100644 --- a/build/tfs/win32/3_upload.ps1 +++ b/build/tfs/win32/3_upload.ps1 @@ -8,9 +8,9 @@ Param( $Repo = "$(pwd)" $Root = "$Repo\.." -$Exe = "$Repo\.build\win32\setup\VSCodeSetup.exe" -$Zip = "$Repo\.build\win32\archive\VSCode-win32.zip" -$Build = "$Root\VSCode-win32" +$Exe = "$Repo\.build\win32-ia32\setup\VSCodeSetup.exe" +$Zip = "$Repo\.build\win32-ia32\archive\VSCode-win32-ia32.zip" +$Build = "$Root\VSCode-win32-ia32" # get version $PackageJson = Get-Content -Raw -Path "$Build\resources\app\package.json" | ConvertFrom-Json @@ -21,11 +21,11 @@ $env:MOONCAKE_STORAGE_ACCESS_KEY = $mooncakeStorageKey $env:AZURE_DOCUMENTDB_MASTERKEY = $documentDbKey step "Publish archive" { - exec { & node build/tfs/common/publish.js $Quality win32-archive archive "VSCode-win32-$Version.zip" $Version true $Zip } + exec { & node build/tfs/common/publish.js $Quality win32-archive archive "VSCode-win32-ia32-$Version.zip" $Version true $Zip } } step "Publish setup package" { - exec { & node build/tfs/common/publish.js $Quality win32 setup "VSCodeSetup-$Version.exe" $Version true $Exe } + exec { & node build/tfs/common/publish.js $Quality win32 setup "VSCodeSetup-ia32-$Version.exe" $Version true $Exe } } done \ No newline at end of file diff --git a/build/win32/code.iss b/build/win32/code.iss index 2fcc70db554..ce61c44b8cf 100644 --- a/build/win32/code.iss +++ b/build/win32/code.iss @@ -14,7 +14,7 @@ AppUpdatesURL=https://code.visualstudio.com/ DefaultDirName={pf}\{#DirName} DefaultGroupName={#NameLong} AllowNoIcons=yes -OutputDir={#RepoDir}\.build\win32\setup +OutputDir={#RepoDir}\.build\win32-ia32\setup OutputBaseFilename=VSCodeSetup Compression=lzma SolidCompression=yes From 3b6d8a3185fc9291c348f2472f56d99dfd91edc5 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 18 May 2017 12:04:38 +0200 Subject: [PATCH 0585/1164] move startup profiler into perf.contrib --- src/vs/workbench/electron-browser/shell.ts | 34 -------- .../performance.contribution.ts | 81 ++++++++++++++++--- 2 files changed, 70 insertions(+), 45 deletions(-) diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index ef12343f326..59955d70049 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -16,7 +16,6 @@ import aria = require('vs/base/browser/ui/aria/aria'); import { dispose, IDisposable, Disposables } from 'vs/base/common/lifecycle'; import errors = require('vs/base/common/errors'); import { toErrorMessage } from 'vs/base/common/errorMessage'; -import { stopProfiling } from 'vs/base/node/profiler'; import product from 'vs/platform/node/product'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import pkg from 'vs/platform/node/package'; @@ -97,8 +96,6 @@ import { MainProcessTextMateSyntax } from 'vs/editor/electron-browser/textMate/T import { BareFontInfo } from 'vs/editor/common/config/fontInfo'; import { restoreFontInfo, readFontInfo, saveFontInfo } from 'vs/editor/browser/config/configuration'; import * as browser from 'vs/base/browser/browser'; -import { readdir } from 'vs/base/node/pfs'; -import { join } from 'path'; import 'vs/platform/opener/browser/opener.contribution'; import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { WorkbenchThemeService } from 'vs/workbench/services/themes/electron-browser/workbenchThemeService'; @@ -263,37 +260,6 @@ export class WorkbenchShell { if ((platform.isLinux || platform.isMacintosh) && process.getuid() === 0) { this.messageService.show(Severity.Warning, nls.localize('runningAsRoot', "It is recommended not to run Code as 'root'.")); } - - // Profiler: startup cpu profile - const { profileStartup } = this.environmentService; - if (profileStartup) { - this.extensionService.onReady().then(() => stopProfiling(profileStartup.dir, profileStartup.prefix)).then(() => { - readdir(profileStartup.dir).then(files => { - return files.filter(value => value.indexOf(profileStartup.prefix) === 0); - }).then(files => { - const profileFiles = files.reduce((prev, cur) => `${prev}${join(profileStartup.dir, cur)}\n`, '\n'); - - const primaryButton = this.messageService.confirm({ - type: 'info', - message: nls.localize('prof.message', "Successfully created profiles."), - detail: nls.localize('prof.detail', "Please create an issue and manually attach the following files:\n{0}", profileFiles), - primaryButton: nls.localize('prof.restartAndFileIssue', "Create Issue and Restart"), - secondaryButton: nls.localize('prof.restart', "Restart") - }); - - let createIssue = TPromise.as(void 0); - if (primaryButton) { - const action = this.workbench.getInstantiationService().createInstance(ReportPerformanceIssueAction, ReportPerformanceIssueAction.ID, ReportPerformanceIssueAction.LABEL); - - createIssue = action.run(`:warning: Make sure to **attach** these files: :warning:\n${files.map(file => `-\`${join(profileStartup.dir, file)}\``).join('\n')}`).then(() => { - return this.windowsService.showItemInFolder(join(profileStartup.dir, files[0])); - }); - } - createIssue.then(() => this.windowsService.relaunch({ removeArgs: ['--prof-startup'] })); - }); - - }, err => console.error(err)); - } } private handleNegativePerformanceNumbers(i: IInstantiationService, time: number): void { diff --git a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts index f7b481f4c50..393dc2a5dc9 100644 --- a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts +++ b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts @@ -5,19 +5,25 @@ 'use strict'; -import { localize } from 'vs/nls'; -import { virtualMachineHint } from 'vs/base/node/id'; -import { Registry } from 'vs/platform/platform'; -import { IWindowsService } from 'vs/platform/windows/common/windows'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { IMessageService } from 'vs/platform/message/common/message'; -import { ITimerService } from 'vs/workbench/services/timer/common/timerService'; -import { IWorkbenchContributionsRegistry, IWorkbenchContribution, Extensions } from 'vs/workbench/common/contributions'; import product from 'vs/platform/node/product'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IExtensionService } from 'vs/platform/extensions/common/extensions'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IMessageService } from 'vs/platform/message/common/message'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import { ITimerService } from 'vs/workbench/services/timer/common/timerService'; +import { IWindowsService } from 'vs/platform/windows/common/windows'; +import { IWorkbenchContributionsRegistry, IWorkbenchContribution, Extensions } from 'vs/workbench/common/contributions'; +import { Registry } from 'vs/platform/platform'; +import { ReportPerformanceIssueAction } from 'vs/workbench/electron-browser/actions'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { join } from 'path'; +import { localize } from 'vs/nls'; import { platform, Platform } from 'vs/base/common/platform'; +import { readdir } from 'vs/base/node/pfs'; import { release } from 'os'; - +import { stopProfiling } from 'vs/base/node/profiler'; +import { virtualMachineHint } from 'vs/base/node/id'; class ProfilingHint implements IWorkbenchContribution { @@ -73,7 +79,7 @@ class ProfilingHint implements IWorkbenchContribution { } getId(): string { - return 'performance'; + return 'performance.ProfilingHint'; } private _checkTimersAndSuggestToProfile() { @@ -131,5 +137,58 @@ class ProfilingHint implements IWorkbenchContribution { } } +class StartupProfiler implements IWorkbenchContribution { + + constructor( + @IWindowsService private readonly _windowsService: IWindowsService, + @IMessageService private readonly _messageService: IMessageService, + @IEnvironmentService private readonly _environmentService: IEnvironmentService, + @IInstantiationService private readonly _instantiationService: IInstantiationService, + @IExtensionService extensionService: IExtensionService, + ) { + + extensionService.onReady().then(() => this._stopProfiling()); + } + + getId(): string { + return 'performance.StartupProfiler'; + } + + private _stopProfiling(): void { + + const { profileStartup } = this._environmentService; + if (!profileStartup) { + return; + } + + stopProfiling(profileStartup.dir, profileStartup.prefix).then(() => { + readdir(profileStartup.dir).then(files => { + return files.filter(value => value.indexOf(profileStartup.prefix) === 0); + }).then(files => { + const profileFiles = files.reduce((prev, cur) => `${prev}${join(profileStartup.dir, cur)}\n`, '\n'); + + const primaryButton = this._messageService.confirm({ + type: 'info', + message: localize('prof.message', "Successfully created profiles."), + detail: localize('prof.detail', "Please create an issue and manually attach the following files:\n{0}", profileFiles), + primaryButton: localize('prof.restartAndFileIssue', "Create Issue and Restart"), + secondaryButton: localize('prof.restart', "Restart") + }); + + let createIssue = TPromise.as(void 0); + if (primaryButton) { + const action = this._instantiationService.createInstance(ReportPerformanceIssueAction, ReportPerformanceIssueAction.ID, ReportPerformanceIssueAction.LABEL); + + createIssue = action.run(`:warning: Make sure to **attach** these files: :warning:\n${files.map(file => `-\`${join(profileStartup.dir, file)}\``).join('\n')}`).then(() => { + return this._windowsService.showItemInFolder(join(profileStartup.dir, files[0])); + }); + } + createIssue.then(() => this._windowsService.relaunch({ removeArgs: ['--prof-startup'] })); + }); + }); + } +} + const registry = Registry.as(Extensions.Workbench); registry.registerWorkbenchContribution(ProfilingHint); +registry.registerWorkbenchContribution(StartupProfiler); From c6d715e4e53f368ef3f0244e2966eff93950592c Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 18 May 2017 12:16:27 +0200 Subject: [PATCH 0586/1164] add telemetry about profiling invite acceptance --- .../electron-browser/performance.contribution.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts index 393dc2a5dc9..1df63eac28d 100644 --- a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts +++ b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts @@ -13,6 +13,7 @@ import { IMessageService } from 'vs/platform/message/common/message'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { ITimerService } from 'vs/workbench/services/timer/common/timerService'; import { IWindowsService } from 'vs/platform/windows/common/windows'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWorkbenchContributionsRegistry, IWorkbenchContribution, Extensions } from 'vs/workbench/common/contributions'; import { Registry } from 'vs/platform/platform'; import { ReportPerformanceIssueAction } from 'vs/workbench/electron-browser/actions'; @@ -68,11 +69,12 @@ class ProfilingHint implements IWorkbenchContribution { private static readonly _myPercentiles = ProfilingHint._percentiles[`${Platform[platform]}_${release()}`]; constructor( - @IWindowsService private _windowsService: IWindowsService, - @ITimerService private _timerService: ITimerService, - @IMessageService private _messageService: IMessageService, - @IEnvironmentService private _envService: IEnvironmentService, - @IStorageService private _storageService: IStorageService + @IWindowsService private readonly _windowsService: IWindowsService, + @ITimerService private readonly _timerService: ITimerService, + @IMessageService private readonly _messageService: IMessageService, + @IEnvironmentService private readonly _envService: IEnvironmentService, + @IStorageService private readonly _storageService: IStorageService, + @ITelemetryService private readonly _telemetryService: ITelemetryService, ) { setTimeout(() => this._checkTimersAndSuggestToProfile(), 5000); @@ -128,6 +130,10 @@ class ProfilingHint implements IWorkbenchContribution { primaryButton: 'Restart and profile' }); + this._telemetryService.publicLog('profileStartupInvite', { + acceptedInvite: profile + }); + if (profile) { this._storageService.store(mementoKey, 'didProfile', StorageScope.GLOBAL); this._windowsService.relaunch({ addArgs: ['--prof-startup'] }); From 9b4c2b5acd0d9dd47635aba51a418c51767255b1 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 18 May 2017 12:47:43 +0200 Subject: [PATCH 0587/1164] perf - polish profile, create issue, restart flow --- .../performance.contribution.ts | 23 +++++++++++++++---- .../electron-browser/messageService.ts | 19 ++++++++++----- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts index 1df63eac28d..0cc4a86b200 100644 --- a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts +++ b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts @@ -181,15 +181,28 @@ class StartupProfiler implements IWorkbenchContribution { secondaryButton: localize('prof.restart', "Restart") }); - let createIssue = TPromise.as(void 0); if (primaryButton) { const action = this._instantiationService.createInstance(ReportPerformanceIssueAction, ReportPerformanceIssueAction.ID, ReportPerformanceIssueAction.LABEL); - - createIssue = action.run(`:warning: Make sure to **attach** these files: :warning:\n${files.map(file => `-\`${join(profileStartup.dir, file)}\``).join('\n')}`).then(() => { - return this._windowsService.showItemInFolder(join(profileStartup.dir, files[0])); + TPromise.join([ + this._windowsService.showItemInFolder(join(profileStartup.dir, files[0])), + action.run(`:warning: Make sure to **attach** these files: :warning:\n${files.map(file => `-\`${join(profileStartup.dir, file)}\``).join('\n')}`) + ]).then(() => { + // keep window stable until restart is selected + this._messageService.confirm({ + type: 'info', + message: localize('prof.thanks', "Thanks for helping us."), + detail: localize('prof.detail.restart', "A final restart is required to continue to use '{0}'. Again, thank you for your contribution.", this._environmentService.appNameLong), + primaryButton: localize('prof.restart', "Restart"), + secondaryButton: null + }); + // now we are ready to restart + this._windowsService.relaunch({ removeArgs: ['--prof-startup'] }); }); + + } else { + // simply restart + this._windowsService.relaunch({ removeArgs: ['--prof-startup'] }); } - createIssue.then(() => this._windowsService.relaunch({ removeArgs: ['--prof-startup'] })); }); }); } diff --git a/src/vs/workbench/services/message/electron-browser/messageService.ts b/src/vs/workbench/services/message/electron-browser/messageService.ts index 607db7a5253..811ba46eb10 100644 --- a/src/vs/workbench/services/message/electron-browser/messageService.ts +++ b/src/vs/workbench/services/message/electron-browser/messageService.ts @@ -26,17 +26,24 @@ export class MessageService extends WorkbenchMessageService implements IChoiceSe } public confirm(confirmation: IConfirmation): boolean { - if (!confirmation.primaryButton) { - confirmation.primaryButton = nls.localize({ key: 'yesButton', comment: ['&& denotes a mnemonic'] }, "&&Yes"); + + const buttons: string[] = []; + if (confirmation.primaryButton) { + buttons.push(confirmation.primaryButton); + } else { + buttons.push(nls.localize({ key: 'yesButton', comment: ['&& denotes a mnemonic'] }, "&&Yes")); } - if (!confirmation.secondaryButton) { - confirmation.secondaryButton = nls.localize('cancelButton', "Cancel"); + + if (confirmation.secondaryButton) { + buttons.push(confirmation.secondaryButton); + } else if (typeof confirmation.secondaryButton === 'undefined') { + buttons.push(nls.localize('cancelButton', "Cancel")); } let opts: Electron.ShowMessageBoxOptions = { title: confirmation.title, message: confirmation.message, - buttons: [confirmation.primaryButton, confirmation.secondaryButton], + buttons, defaultId: 0, cancelId: 1 }; @@ -102,4 +109,4 @@ export class MessageService extends WorkbenchMessageService implements IChoiceSe return label.replace(/&&/g, '&'); } -} \ No newline at end of file +} From c541d8864d2b1e3a454f1c6313cc51b6b9bf66c9 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 13:18:05 +0200 Subject: [PATCH 0588/1164] make linux 32 bits build run unit tests --- build/tfs/linux/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/build/tfs/linux/Dockerfile b/build/tfs/linux/Dockerfile index 59994333b80..581ea75a950 100644 --- a/build/tfs/linux/Dockerfile +++ b/build/tfs/linux/Dockerfile @@ -24,5 +24,6 @@ RUN apt-get install -y libx11-dev libx11-dev:i386 RUN apt-get install -y libxkbfile-dev:i386 RUN apt-get install -y libxss1 libxss1:i386 RUN apt-get install -y libx11-xcb-dev libx11-xcb-dev:i386 +RUN apt-get install -y libgl1-mesa-glx:i386 libgl1-mesa-dri:i386 RUN apt-get install -y libxkbfile-dev RUN apt-get install -y bc bsdmainutils From 4f0a7486ff64b9b52b9017c494326e4dba634bd3 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 13:18:21 +0200 Subject: [PATCH 0589/1164] tfs: enable linux unit tests --- build/tfs/linux/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tfs/linux/build.sh b/build/tfs/linux/build.sh index 2b876b693c5..227d0896545 100755 --- a/build/tfs/linux/build.sh +++ b/build/tfs/linux/build.sh @@ -30,7 +30,7 @@ step "Build minified" \ npm run gulp -- --max_old_space_size=4096 "vscode-linux-$ARCH-min" # step "Run unit tests" \ -# [[ "$ARCH" == "x64" ]] && ./scripts/test.sh --xvfb --build --reporter dot + ./scripts/test.sh --xvfb --build --reporter dot step "Build Debian package" \ npm run gulp -- --max_old_space_size=4096 "vscode-linux-$ARCH-build-deb" From 9056bd666ab91500ddda8ebdff346657086912cc Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 13:32:13 +0200 Subject: [PATCH 0590/1164] tfs: fix windows distro deps --- build/tfs/win32/1_build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index 27ff376a851..ab133b6b81c 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -25,7 +25,7 @@ step "Get Electron" { } step "Install distro dependencies" { - exec { & node build\tfs\common\installDistro.js } + exec { & node build\tfs\common\installDistro.js --arch=ia32 } } step "Build minified" { From 7da213f840a2f7dc46f55018adce3f1a1af3b310 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Thu, 18 May 2017 13:34:52 +0200 Subject: [PATCH 0591/1164] node-debug@1.13.5 (translations) --- build/gulpfile.vscode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 309c64326ba..cc301600b2c 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -42,7 +42,7 @@ const nodeModules = ['electron', 'original-fs'] // Build const builtInExtensions = [ - { name: 'ms-vscode.node-debug', version: '1.13.4' }, + { name: 'ms-vscode.node-debug', version: '1.13.5' }, { name: 'ms-vscode.node-debug2', version: '1.12.4' } ]; From a226da41de597da82e7a55179cefbb3a30793ff6 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 13:47:55 +0200 Subject: [PATCH 0592/1164] tfs: try to get a free xvfb server number --- scripts/test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/test.sh b/scripts/test.sh index 19b79bf5843..d39b1e76f18 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -29,7 +29,7 @@ test -d node_modules || ./scripts/npm.sh install # Unit Tests if [[ "$1" == "--xvfb" ]]; then cd $ROOT ; \ - xvfb-run "$CODE" test/electron/index.js "$@" + xvfb-run -a "$CODE" test/electron/index.js "$@" elif [[ "$OSTYPE" == "darwin"* ]]; then cd $ROOT ; ulimit -n 4096 ; \ "$CODE" \ From 000905e28495996b34b51af9ff7707e91a5b26d5 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 13:48:37 +0200 Subject: [PATCH 0593/1164] tfs: linux builds --- build/tfs/linux/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tfs/linux/build.sh b/build/tfs/linux/build.sh index 227d0896545..7e50e47c05d 100755 --- a/build/tfs/linux/build.sh +++ b/build/tfs/linux/build.sh @@ -29,7 +29,7 @@ step "Install distro dependencies" \ step "Build minified" \ npm run gulp -- --max_old_space_size=4096 "vscode-linux-$ARCH-min" -# step "Run unit tests" \ +step "Run unit tests" \ ./scripts/test.sh --xvfb --build --reporter dot step "Build Debian package" \ From b244b1483c7ece15d18ec5ff8b42b24eab108bf1 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 14:55:12 +0200 Subject: [PATCH 0594/1164] develop in win-x64 --- scripts/npm.bat | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/scripts/npm.bat b/scripts/npm.bat index aeb8e93c90c..3fc75df7b0e 100644 --- a/scripts/npm.bat +++ b/scripts/npm.bat @@ -1,12 +1,8 @@ @echo off setlocal - set npm_config_disturl="https://atom.io/download/electron" for /f "tokens=2 delims=:, " %%a in ('findstr /R /C:"\"electronVersion\":.*" "%~dp0..\package.json"') do set npm_config_target=%%~a -set npm_config_arch="ia32" set npm_config_runtime="electron" -set HOME=~\.electron-gyp - +set npm_config_cache=~\.npm-electron npm %* - endlocal From cd8a0c43a7aded315d3f861b2ed7600c6a49e1a0 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 15:02:42 +0200 Subject: [PATCH 0595/1164] tfs: win build scripts arch dependent --- build/tfs/win32/1_build.ps1 | 13 +++++++------ build/tfs/win32/2_package.ps1 | 6 +++++- build/tfs/win32/3_upload.ps1 | 11 ++++++----- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index ab133b6b81c..6d8cba16af4 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -1,6 +1,7 @@ Param( - [string]$mixinPassword, - [string]$vsoPAT + [string]$arch, + [string]$mixinPassword, + [string]$vsoPAT ) . .\scripts\env.ps1 @@ -12,7 +13,7 @@ $env:HOME=$env:USERPROFILE "machine monacotools.visualstudio.com password ${vsoPAT}" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII step "Install dependencies" { - exec { & npm install --arch=ia32 } + exec { & npm install --arch=$arch } } $env:VSCODE_MIXIN_PASSWORD = $mixinPassword @@ -21,15 +22,15 @@ step "Mix in repository from vscode-distro" { } step "Get Electron" { - exec { & npm run gulp -- electron-ia32 } + exec { & npm run gulp -- "electron-$arch" } } step "Install distro dependencies" { - exec { & node build\tfs\common\installDistro.js --arch=ia32 } + exec { & node build\tfs\common\installDistro.js --arch=$arch } } step "Build minified" { - exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-ia32-min } + exec { & npm run gulp -- --max_old_space_size=4096 "vscode-win32-$arch-min" } } step "Run unit tests" { diff --git a/build/tfs/win32/2_package.ps1 b/build/tfs/win32/2_package.ps1 index bec7ba9b167..beaa816e0e4 100644 --- a/build/tfs/win32/2_package.ps1 +++ b/build/tfs/win32/2_package.ps1 @@ -1,7 +1,11 @@ +Param( + [string]$arch +) + . .\build\tfs\win32\lib.ps1 step "Create archive and setup package" { - exec { & npm run gulp -- --max_old_space_size=4096 vscode-win32-ia32-archive vscode-win32-ia32-setup } + exec { & npm run gulp -- --max_old_space_size=4096 "vscode-win32-$arch-archive" "vscode-win32-$arch-setup" } } done \ No newline at end of file diff --git a/build/tfs/win32/3_upload.ps1 b/build/tfs/win32/3_upload.ps1 index 13581050618..7eb99c4a541 100644 --- a/build/tfs/win32/3_upload.ps1 +++ b/build/tfs/win32/3_upload.ps1 @@ -1,4 +1,5 @@ Param( + [string]$arch, [string]$storageKey, [string]$mooncakeStorageKey, [string]$documentDbKey @@ -8,9 +9,9 @@ Param( $Repo = "$(pwd)" $Root = "$Repo\.." -$Exe = "$Repo\.build\win32-ia32\setup\VSCodeSetup.exe" -$Zip = "$Repo\.build\win32-ia32\archive\VSCode-win32-ia32.zip" -$Build = "$Root\VSCode-win32-ia32" +$Exe = "$Repo\.build\win32-$arch\setup\VSCodeSetup.exe" +$Zip = "$Repo\.build\win32-$arch\archive\VSCode-win32-$arch.zip" +$Build = "$Root\VSCode-win32-$arch" # get version $PackageJson = Get-Content -Raw -Path "$Build\resources\app\package.json" | ConvertFrom-Json @@ -21,11 +22,11 @@ $env:MOONCAKE_STORAGE_ACCESS_KEY = $mooncakeStorageKey $env:AZURE_DOCUMENTDB_MASTERKEY = $documentDbKey step "Publish archive" { - exec { & node build/tfs/common/publish.js $Quality win32-archive archive "VSCode-win32-ia32-$Version.zip" $Version true $Zip } + exec { & node build/tfs/common/publish.js $Quality win32-archive archive "VSCode-win32-$arch-$Version.zip" $Version true $Zip } } step "Publish setup package" { - exec { & node build/tfs/common/publish.js $Quality win32 setup "VSCodeSetup-ia32-$Version.exe" $Version true $Exe } + exec { & node build/tfs/common/publish.js $Quality win32 setup "VSCodeSetup-$arch-$Version.exe" $Version true $Exe } } done \ No newline at end of file From ba7c0d324b6f25c28f4438ee233ae0f0a938b57a Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 15:09:21 +0200 Subject: [PATCH 0596/1164] tfs: fix win64 build --- build/tfs/win32/1_build.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index 6d8cba16af4..2eb99701748 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -13,7 +13,7 @@ $env:HOME=$env:USERPROFILE "machine monacotools.visualstudio.com password ${vsoPAT}" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII step "Install dependencies" { - exec { & npm install --arch=$arch } + exec { & npm install "--arch=$arch" } } $env:VSCODE_MIXIN_PASSWORD = $mixinPassword @@ -26,7 +26,7 @@ step "Get Electron" { } step "Install distro dependencies" { - exec { & node build\tfs\common\installDistro.js --arch=$arch } + exec { & node build\tfs\common\installDistro.js "--arch=$arch" } } step "Build minified" { From ad22530b14d2bbc331e671013c9d8238f056414b Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 15:40:58 +0200 Subject: [PATCH 0597/1164] tfs: win64 package and setup --- build/gulpfile.vscode.win32.js | 71 ++++++++++++++++++++-------------- build/win32/code.iss | 2 +- 2 files changed, 43 insertions(+), 30 deletions(-) diff --git a/build/gulpfile.vscode.win32.js b/build/gulpfile.vscode.win32.js index 42f7e3363a6..a4ebd283ee0 100644 --- a/build/gulpfile.vscode.win32.js +++ b/build/gulpfile.vscode.win32.js @@ -15,8 +15,10 @@ const pkg = require('../package.json'); const product = require('../product.json'); const repoPath = path.dirname(__dirname); -const buildPath = path.join(path.dirname(repoPath), 'VSCode-win32-ia32'); -const zipPath = path.join(repoPath, '.build', 'win32-ia32', 'archive', 'VSCode-win32-ia32.zip'); +const buildPath = arch => path.join(path.dirname(repoPath), `VSCode-win32-${arch}`); +const zipDir = arch => path.join(repoPath, '.build', `win32-${arch}`, 'archive'); +const zipPath = arch => path.join(zipDir(arch), `VSCode-win32-${arch}.zip`); +const setupDir = arch => path.join(repoPath, '.build', `win32-${arch}`, 'setup'); const issPath = path.join(__dirname, 'win32', 'code.iss'); const innoSetupPath = path.join(path.dirname(path.dirname(require.resolve('innosetup-compiler'))), 'bin', 'ISCC.exe'); @@ -36,37 +38,48 @@ function packageInnoSetup(iss, options, cb) { .on('exit', () => cb(null)); } -function buildWin32Setup(cb) { - const definitions = { - NameLong: product.nameLong, - NameShort: product.nameShort, - DirName: product.win32DirName, - Version: pkg.version, - RawVersion: pkg.version.replace(/-\w+$/, ''), - NameVersion: product.win32NameVersion, - ExeBasename: product.nameShort, - RegValueName: product.win32RegValueName, - ShellNameShort: product.win32ShellNameShort, - AppMutex: product.win32MutexName, - AppId: product.win32AppId, - AppUserId: product.win32AppUserModelId, - SourceDir: buildPath, - RepoDir: repoPath +function buildWin32Setup(arch) { + return cb => { + const definitions = { + NameLong: product.nameLong, + NameShort: product.nameShort, + DirName: product.win32DirName, + Version: pkg.version, + RawVersion: pkg.version.replace(/-\w+$/, ''), + NameVersion: product.win32NameVersion, + ExeBasename: product.nameShort, + RegValueName: product.win32RegValueName, + ShellNameShort: product.win32ShellNameShort, + AppMutex: product.win32MutexName, + AppId: product.win32AppId, + AppUserId: product.win32AppUserModelId, + SourceDir: buildPath(arch), + RepoDir: repoPath, + OutputDir: setupDir(arch) + }; + + packageInnoSetup(issPath, { definitions }, cb); }; - - packageInnoSetup(issPath, { definitions }, cb); } -gulp.task('clean-vscode-win32-ia32-setup', util.rimraf('.build/win32-ia32/setup')); -gulp.task('vscode-win32-ia32-setup', ['clean-vscode-win32-ia32-setup'], buildWin32Setup); +gulp.task('clean-vscode-win32-ia32-setup', util.rimraf(setupDir('ia32'))); +gulp.task('vscode-win32-ia32-setup', ['clean-vscode-win32-ia32-setup'], buildWin32Setup('ia32')); -function archiveWin32Setup(cb) { - const args = ['a', '-tzip', zipPath, buildPath, '-r']; +gulp.task('clean-vscode-win32-x64-setup', util.rimraf(setupDir('x64'))); +gulp.task('vscode-win32-x64-setup', ['clean-vscode-win32-x64-setup'], buildWin32Setup('x64')); - cp.spawn(_7z, args, { stdio: 'inherit' }) - .on('error', cb) - .on('exit', () => cb(null)); +function archiveWin32Setup(arch) { + return cb => { + const args = ['a', '-tzip', zipPath(arch), buildPath(arch), '-r']; + + cp.spawn(_7z, args, { stdio: 'inherit' }) + .on('error', cb) + .on('exit', () => cb(null)); + }; } -gulp.task('clean-vscode-win32-ia32-archive', util.rimraf('.build/win32-ia32/archive')); -gulp.task('vscode-win32-ia32-archive', ['clean-vscode-win32-ia32-archive'], archiveWin32Setup); +gulp.task('clean-vscode-win32-ia32-archive', util.rimraf(zipDir('ia32'))); +gulp.task('vscode-win32-ia32-archive', ['clean-vscode-win32-ia32-archive'], archiveWin32Setup('ia32')); + +gulp.task('clean-vscode-win32-x64-archive', util.rimraf(zipDir('x64'))); +gulp.task('vscode-win32-x64-archive', ['clean-vscode-win32-x64-archive'], archiveWin32Setup('x64')); diff --git a/build/win32/code.iss b/build/win32/code.iss index ce61c44b8cf..b7988b383cc 100644 --- a/build/win32/code.iss +++ b/build/win32/code.iss @@ -14,7 +14,7 @@ AppUpdatesURL=https://code.visualstudio.com/ DefaultDirName={pf}\{#DirName} DefaultGroupName={#NameLong} AllowNoIcons=yes -OutputDir={#RepoDir}\.build\win32-ia32\setup +OutputDir={#OutputDir} OutputBaseFilename=VSCodeSetup Compression=lzma SolidCompression=yes From 7efdde8060945822834557f53984850754fd96e5 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 18 May 2017 12:11:06 +0200 Subject: [PATCH 0598/1164] [diff] update grammar --- extensions/diff/package.json | 5 +- extensions/diff/syntaxes/diff.tmLanguage.json | 163 ++++++++++++++++++ .../diff/test/colorize-results/test_diff.json | 6 +- 3 files changed, 170 insertions(+), 4 deletions(-) create mode 100644 extensions/diff/syntaxes/diff.tmLanguage.json diff --git a/extensions/diff/package.json b/extensions/diff/package.json index 51376f26979..a62e57243c3 100644 --- a/extensions/diff/package.json +++ b/extensions/diff/package.json @@ -3,6 +3,9 @@ "version": "0.1.0", "publisher": "vscode", "engines": { "vscode": "*" }, + "scripts": { + "update-grammar": "node ../../build/npm/update-grammar.js textmate/diff.tmbundle Syntaxes/Diff.plist ./syntaxes/diff.tmLanguage.json" + }, "contributes": { "languages": [ { @@ -16,7 +19,7 @@ { "language": "diff", "scopeName": "source.diff", - "path": "./syntaxes/diff.tmLanguage" + "path": "./syntaxes/diff.tmLanguage.json" } ] } diff --git a/extensions/diff/syntaxes/diff.tmLanguage.json b/extensions/diff/syntaxes/diff.tmLanguage.json new file mode 100644 index 00000000000..ac16f416a64 --- /dev/null +++ b/extensions/diff/syntaxes/diff.tmLanguage.json @@ -0,0 +1,163 @@ +{ + "fileTypes": [ + "patch", + "diff", + "rej" + ], + "firstLineMatch": "(?x)^\n\t\t(===\\ modified\\ file\n\t\t|==== \\s* // .+ \\s - \\s .+ \\s+ ====\n\t\t|Index:\\ \n\t\t|---\\ [^%\\n]\n\t\t|\\*\\*\\*.*\\d{4}\\s*$\n\t\t|\\d+(,\\d+)* (a|d|c) \\d+(,\\d+)* $\n\t\t|diff\\ --git\\ \n\t\t|commit\\ [0-9a-f]{40}$\n\t\t)", + "keyEquivalent": "^~D", + "name": "Diff", + "patterns": [ + { + "captures": { + "1": { + "name": "punctuation.definition.separator.diff" + } + }, + "match": "^((\\*{15})|(={67})|(-{3}))$\\n?", + "name": "meta.separator.diff" + }, + { + "match": "^\\d+(,\\d+)*(a|d|c)\\d+(,\\d+)*$\\n?", + "name": "meta.diff.range.normal" + }, + { + "captures": { + "1": { + "name": "punctuation.definition.range.diff" + }, + "2": { + "name": "meta.toc-list.line-number.diff" + }, + "3": { + "name": "punctuation.definition.range.diff" + } + }, + "match": "^(@@)\\s*(.+?)\\s*(@@)($\\n?)?", + "name": "meta.diff.range.unified" + }, + { + "captures": { + "3": { + "name": "punctuation.definition.range.diff" + }, + "4": { + "name": "punctuation.definition.range.diff" + }, + "6": { + "name": "punctuation.definition.range.diff" + }, + "7": { + "name": "punctuation.definition.range.diff" + } + }, + "match": "^(((\\-{3}) .+ (\\-{4}))|((\\*{3}) .+ (\\*{4})))$\\n?", + "name": "meta.diff.range.context" + }, + { + "match": "^diff --git a/.*$\\n?", + "name": "meta.diff.header.git" + }, + { + "match": "^diff (-|\\S+\\s+\\S+).*$\\n?", + "name": "meta.diff.header.command" + }, + { + "captures": { + "4": { + "name": "punctuation.definition.from-file.diff" + }, + "6": { + "name": "punctuation.definition.from-file.diff" + }, + "7": { + "name": "punctuation.definition.from-file.diff" + } + }, + "match": "(^(((-{3}) .+)|((\\*{3}) .+))$\\n?|^(={4}) .+(?= - ))", + "name": "meta.diff.header.from-file" + }, + { + "captures": { + "2": { + "name": "punctuation.definition.to-file.diff" + }, + "3": { + "name": "punctuation.definition.to-file.diff" + }, + "4": { + "name": "punctuation.definition.to-file.diff" + } + }, + "match": "(^(\\+{3}) .+$\\n?| (-) .* (={4})$\\n?)", + "name": "meta.diff.header.to-file" + }, + { + "captures": { + "3": { + "name": "punctuation.definition.inserted.diff" + }, + "6": { + "name": "punctuation.definition.inserted.diff" + } + }, + "match": "^(((>)( .*)?)|((\\+).*))$\\n?", + "name": "markup.inserted.diff" + }, + { + "captures": { + "1": { + "name": "punctuation.definition.changed.diff" + } + }, + "match": "^(!).*$\\n?", + "name": "markup.changed.diff" + }, + { + "captures": { + "3": { + "name": "punctuation.definition.deleted.diff" + }, + "6": { + "name": "punctuation.definition.deleted.diff" + } + }, + "match": "^(((<)( .*)?)|((-).*))$\\n?", + "name": "markup.deleted.diff" + }, + { + "begin": "^(#)", + "captures": { + "1": { + "name": "punctuation.definition.comment.diff" + } + }, + "comment": "Git produces unified diffs with embedded comments\"", + "end": "\\n", + "name": "comment.line.number-sign.diff" + }, + { + "match": "^index [0-9a-f]{7,40}\\.\\.[0-9a-f]{7,40}.*$\\n?", + "name": "meta.diff.index.git" + }, + { + "captures": { + "1": { + "name": "punctuation.separator.key-value.diff" + }, + "2": { + "name": "meta.toc-list.file-name.diff" + } + }, + "match": "^Index(:) (.+)$\\n?", + "name": "meta.diff.index" + }, + { + "match": "^Only in .*: .*$\\n?", + "name": "meta.diff.only-in" + } + ], + "scopeName": "source.diff", + "uuid": "7E848FF4-708E-11D9-97B4-0011242E4184", + "version": "https://github.com/textmate/diff.tmbundle/commit/0593bb775eab1824af97ef2172fd38822abd97d7" +} \ No newline at end of file diff --git a/extensions/diff/test/colorize-results/test_diff.json b/extensions/diff/test/colorize-results/test_diff.json index 5329bcae5c0..26ab2f4fb03 100644 --- a/extensions/diff/test/colorize-results/test_diff.json +++ b/extensions/diff/test/colorize-results/test_diff.json @@ -100,7 +100,7 @@ }, { "c": "-", - "t": "source.diff markup.deleted.diff punctuation.definition.inserted.diff", + "t": "source.diff markup.deleted.diff punctuation.definition.deleted.diff", "r": { "dark_plus": "markup.deleted: #CE9178", "light_plus": "markup.deleted: #A31515", @@ -122,7 +122,7 @@ }, { "c": "-", - "t": "source.diff markup.deleted.diff punctuation.definition.inserted.diff", + "t": "source.diff markup.deleted.diff punctuation.definition.deleted.diff", "r": { "dark_plus": "markup.deleted: #CE9178", "light_plus": "markup.deleted: #A31515", @@ -155,7 +155,7 @@ }, { "c": "-", - "t": "source.diff markup.deleted.diff punctuation.definition.inserted.diff", + "t": "source.diff markup.deleted.diff punctuation.definition.deleted.diff", "r": { "dark_plus": "markup.deleted: #CE9178", "light_plus": "markup.deleted: #A31515", From f1abf5ad11db3da8d0b81bf4899066720635a784 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 18 May 2017 12:14:24 +0200 Subject: [PATCH 0599/1164] [f#] update grammar --- extensions/fsharp/syntaxes/fsharp.json | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/extensions/fsharp/syntaxes/fsharp.json b/extensions/fsharp/syntaxes/fsharp.json index 4fe9eeffc16..7ef61094dd1 100644 --- a/extensions/fsharp/syntaxes/fsharp.json +++ b/extensions/fsharp/syntaxes/fsharp.json @@ -16,9 +16,6 @@ { "include": "#structure" }, - { - "include": "#attributes" - }, { "include": "#strings" }, @@ -31,6 +28,9 @@ { "include": "#definition" }, + { + "include": "#attributes" + }, { "include": "#method_calls" }, @@ -59,7 +59,7 @@ { "name": "function.anonymous", "begin": "\\b(fun)\\b", - "end": "[(->)\\n]", + "end": "(->)", "beginCaptures": { "1": { "name": "keyword.other.function-definition.fsharp" @@ -139,7 +139,7 @@ "patterns": [ { "name": "binding.fsharp", - "begin": "\\b(val mutable|val|let mutable|let inline|let|member|static member|override|let!)(\\s+rec|mutable)?(\\s+private|internal|public)?\\s+(\\([^\\s-]*\\)|[_[:alpha:]]([_[:alpha:]0-9,\\.]|(?<=,)\\s)*)", + "begin": "\\b(val mutable|val|let mutable|let inline|let|member|static member|override|let!)(\\s+rec|mutable)?(\\s+\\[\\<.*\\>\\])?\\s*(private|internal|public)?\\s+(\\([^\\s-]*\\)|[_[:alpha:]]([_[:alpha:]0-9,\\._]|(?<=,)\\s)*)", "end": "((``.*``)|(with)|=|$)", "beginCaptures": { "1": { @@ -149,9 +149,12 @@ "name": "keyword.other.function-recursive.fsharp" }, "3": { - "name": "keyword.other.access.fsharp" + "name": "support.function.attribute.fsharp" }, "4": { + "name": "keyword.other.access.fsharp" + }, + "5": { "name": "variable.other.binding.fsharp" } }, @@ -178,7 +181,7 @@ "patterns": [ { "name": "keyword.other.fsharp", - "match": "\\b(function|yield!|yield|class|match|delegate|of|new|in|as|if|then|else|elif|for|begin|end|inherit|do|let\\!|return\\!|return|interface|with|abstract|member|try|finally|and|when|use|use\\!|struct|while)\\b" + "match": "\\b(function|yield!|yield|class|match|delegate|of|new|in|as|if|then|else|elif|for|begin|end|inherit|do|let\\!|return\\!|return|interface|with|abstract|member|try|finally|and|when|use|use\\!|struct|while|mutable)\\b" }, { "name": "meta.preprocessor.fsharp", @@ -195,7 +198,7 @@ "patterns": [ { "name": "entity.name.section.fsharp", - "begin": "\\b(namespace|module)(\\s+public|internal|private)?\\s+([[:alpha:]][[:alpha:]0-9'_. ]*)", + "begin": "\\b(namespace|module)\\s*(public|internal|private)?\\s+([[:alpha:]][[:alpha:]0-9'_. ]*)", "end": "(\\s|$)", "beginCaptures": { "1": { @@ -389,7 +392,7 @@ "patterns": [ { "name": "record.fsharp", - "match": "(type)[\\s]+(private|internal|public)?[\\s]*([[:alpha:]0-9'<>^:,. ]+)[\\s]*(\\([[:alpha:]0-9'<>^:,. ]+\\))?[\\s]*((with)|(as [[:alpha:]0-9']+)|(=)|(\\(\\)))", + "match": "(type)[\\s]+(private|internal|public)?[\\s]*([[:alpha:]0-9'<>^:,._ ]+)[\\s]*(\\([[:alpha:]0-9'<>^:,._ ]+\\))?[\\s]*((with)|(as [[:alpha:]0-9']+)|(=)|(\\(\\)))", "captures": { "1": { "name": "keyword.other.fsharp" @@ -454,5 +457,5 @@ ] } }, - "version": "https://github.com/ionide/ionide-fsgrammar/commit/edb05603ec3f2eb3c633f92df1649e82fe870545" + "version": "https://github.com/ionide/ionide-fsgrammar/commit/f2e3c30f0ebfcc89fb78ad908701159f20516812" } \ No newline at end of file From fb84773f76462cc0e304a3619f0d92da2e2a357a Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 18 May 2017 12:26:30 +0200 Subject: [PATCH 0600/1164] [git] add grammar update script --- extensions/gitsyntax/package.json | 7 +- .../gitsyntax/syntaxes/git-commit.tmLanguage | 221 ------------------ .../syntaxes/git-commit.tmLanguage.json | 143 ++++++++++++ .../gitsyntax/syntaxes/git-rebase.tmLanguage | 57 ----- .../syntaxes/git-rebase.tmLanguage.json | 35 +++ 5 files changed, 183 insertions(+), 280 deletions(-) delete mode 100644 extensions/gitsyntax/syntaxes/git-commit.tmLanguage create mode 100644 extensions/gitsyntax/syntaxes/git-commit.tmLanguage.json delete mode 100644 extensions/gitsyntax/syntaxes/git-rebase.tmLanguage create mode 100644 extensions/gitsyntax/syntaxes/git-rebase.tmLanguage.json diff --git a/extensions/gitsyntax/package.json b/extensions/gitsyntax/package.json index 8ce5bd1ba32..bc1a1810f91 100644 --- a/extensions/gitsyntax/package.json +++ b/extensions/gitsyntax/package.json @@ -10,6 +10,9 @@ "categories": [ "Other" ], + "scripts": { + "update-grammar": "node ../../build/npm/update-grammar.js textmate/git.tmbundle Syntaxes/Git%20Commit%20Message.tmLanguage ./syntaxes/git-commit.tmLanguage.json Syntaxes/Git%20Rebase%20Message.tmLanguage ./syntaxes/git-rebase.tmLanguage.json" + }, "contributes": { "languages": [ { @@ -40,12 +43,12 @@ { "language": "git-commit", "scopeName": "text.git-commit", - "path": "./syntaxes/git-commit.tmLanguage" + "path": "./syntaxes/git-commit.tmLanguage.json" }, { "language": "git-rebase", "scopeName": "text.git-rebase", - "path": "./syntaxes/git-rebase.tmLanguage" + "path": "./syntaxes/git-rebase.tmLanguage.json" } ] } diff --git a/extensions/gitsyntax/syntaxes/git-commit.tmLanguage b/extensions/gitsyntax/syntaxes/git-commit.tmLanguage deleted file mode 100644 index 705fc0a36f9..00000000000 --- a/extensions/gitsyntax/syntaxes/git-commit.tmLanguage +++ /dev/null @@ -1,221 +0,0 @@ - - - - - fileTypes - - COMMIT_EDITMSG - MERGE_MSG - - foldingStartMarker - ^\+\+\+ - foldingStopMarker - ^--- - name - Git Commit Message - patterns - - - begin - \A(?!# Please enter the commit message) - end - ^(?=# Please enter the commit message) - name - meta.scope.message.git-commit - patterns - - - begin - \A(?=#) - end - ^(?!#) - patterns - - - include - #comment - - - - - begin - ^(?!# Please enter the commit message) - end - ^(?=# Please enter the commit message) - patterns - - - begin - \G - end - ^(?!\G) - name - meta.scope.subject.git-commit - patterns - - - captures - - 1 - - name - keyword.other.$2.git-commit - - - match - \G((fixup|squash)!)\s* - - - match - .{66,}$ - name - invalid.illegal.line-too-long.git-commit - - - match - .{51,}$ - name - invalid.deprecated.line-too-long.git-commit - - - - - begin - ^(?!# Please enter the commit message) - end - ^(?=# Please enter the commit message) - patterns - - - include - #comment - - - - - - - - - begin - ^(?=# Please enter the commit message) - end - \z - name - meta.scope.metadata.git-commit - patterns - - - include - #metadata - - - - - repository - - comment - - begin - ^(#) - captures - - 1 - - name - punctuation.definition.comment.git-commit - - - end - \n - name - comment.line.number-sign.git-commit - - metadata - - patterns - - - begin - (?=^# Changes to be committed:) - end - (?!\G)((?=^# \w)|(?!^#)) - patterns - - - begin - (^[ \t]+)?(?=#) - beginCaptures - - 1 - - name - punctuation.whitespace.comment.leading.git-commit - - - contentName - comment.line.number-sign.git-commit - end - (?!\G)^ - patterns - - - match - \G# - name - punctuation.definition.comment.git-commit - - - match - ((modified|renamed):.*)$\n? - name - markup.changed.git-commit - - - match - (new file:.*)$\n? - name - markup.inserted.git-commit - - - match - (deleted:.*)$\n? - name - markup.deleted.git-commit - - - - - - - include - #comment - - - begin - (?=diff\ \-\-git) - comment - diff presented at the end of the commit message when using commit -v. - contentName - source.diff - end - \z - name - meta.embedded.diff.git-commit - patterns - - - include - source.diff - - - - - - - scopeName - text.git-commit - uuid - BFE83C06-8508-44BE-A975-95A57BF619A7 - - diff --git a/extensions/gitsyntax/syntaxes/git-commit.tmLanguage.json b/extensions/gitsyntax/syntaxes/git-commit.tmLanguage.json new file mode 100644 index 00000000000..5f5db8762fa --- /dev/null +++ b/extensions/gitsyntax/syntaxes/git-commit.tmLanguage.json @@ -0,0 +1,143 @@ +{ + "fileTypes": [ + "COMMIT_EDITMSG", + "MERGE_MSG" + ], + "foldingStartMarker": "^\\+\\+\\+", + "foldingStopMarker": "^---", + "name": "Git Commit Message", + "patterns": [ + { + "begin": "\\A(?!# Please enter the commit message)", + "end": "^(?=# Please enter the commit message)", + "name": "meta.scope.message.git-commit", + "patterns": [ + { + "begin": "\\A(?=#)", + "end": "^(?!#)", + "patterns": [ + { + "include": "#comment" + } + ] + }, + { + "begin": "^(?!# Please enter the commit message)", + "end": "^(?=# Please enter the commit message)", + "patterns": [ + { + "begin": "\\G", + "end": "^(?!\\G)", + "name": "meta.scope.subject.git-commit", + "patterns": [ + { + "captures": { + "1": { + "name": "keyword.other.$2.git-commit" + } + }, + "match": "\\G((fixup|squash)!)\\s*" + }, + { + "match": ".{73,}$", + "name": "invalid.illegal.line-too-long.git-commit" + }, + { + "match": ".{51,}$", + "name": "invalid.deprecated.line-too-long.git-commit" + } + ] + }, + { + "begin": "^(?!# Please enter the commit message)", + "end": "^(?=# Please enter the commit message)", + "patterns": [ + { + "include": "#comment" + } + ] + } + ] + } + ] + }, + { + "begin": "^(?=# Please enter the commit message)", + "end": "\\z", + "name": "meta.scope.metadata.git-commit", + "patterns": [ + { + "include": "#metadata" + } + ] + } + ], + "repository": { + "comment": { + "begin": "^(#)", + "captures": { + "1": { + "name": "punctuation.definition.comment.git-commit" + } + }, + "end": "\\n", + "name": "comment.line.number-sign.git-commit" + }, + "metadata": { + "patterns": [ + { + "begin": "(?=^# Changes to be committed:)", + "end": "(?!\\G)((?=^# \\w)|(?!^#))", + "patterns": [ + { + "begin": "(^[ \\t]+)?(?=#)", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.comment.leading.git-commit" + } + }, + "contentName": "comment.line.number-sign.git-commit", + "end": "(?!\\G)^", + "patterns": [ + { + "match": "\\G#", + "name": "punctuation.definition.comment.git-commit" + }, + { + "match": "((modified|renamed):.*)$\\n?", + "name": "markup.changed.git-commit" + }, + { + "match": "(new file:.*)$\\n?", + "name": "markup.inserted.git-commit" + }, + { + "match": "(deleted:.*)$\\n?", + "name": "markup.deleted.git-commit" + } + ] + } + ] + }, + { + "include": "#comment" + }, + { + "begin": "(?=diff\\ \\-\\-git)", + "comment": "diff presented at the end of the commit message when using commit -v.", + "contentName": "source.diff", + "end": "\\z", + "name": "meta.embedded.diff.git-commit", + "patterns": [ + { + "include": "source.diff" + } + ] + } + ] + } + }, + "scopeName": "text.git-commit", + "uuid": "BFE83C06-8508-44BE-A975-95A57BF619A7", + "version": "https://github.com/textmate/git.tmbundle/commit/93897a78c6e52bef13dadc0d4091d203c5facb40" +} \ No newline at end of file diff --git a/extensions/gitsyntax/syntaxes/git-rebase.tmLanguage b/extensions/gitsyntax/syntaxes/git-rebase.tmLanguage deleted file mode 100644 index a53ee1533fd..00000000000 --- a/extensions/gitsyntax/syntaxes/git-rebase.tmLanguage +++ /dev/null @@ -1,57 +0,0 @@ - - - - - fileTypes - - git-rebase-todo - - name - Git Rebase Message - patterns - - - captures - - 1 - - name - punctuation.definition.comment.git-rebase - - - match - ^\s*(#).*$\n? - name - comment.line.number-sign.git-rebase - - - captures - - 1 - - name - support.function.git-rebase - - 2 - - name - constant.sha.git-rebase - - 3 - - name - meta.commit-message.git-rebase - - - match - ^\s*(pick|p|reword|r|edit|e|squash|s|fixup|f|d|drop|x|exec)\s+([0-9a-f]+)\s+(.*)$ - name - meta.commit-command.git-rebase - - - scopeName - text.git-rebase - uuid - 7F1CC209-5F6D-486A-8180-09FA282381A1 - - diff --git a/extensions/gitsyntax/syntaxes/git-rebase.tmLanguage.json b/extensions/gitsyntax/syntaxes/git-rebase.tmLanguage.json new file mode 100644 index 00000000000..c8bf731d9cb --- /dev/null +++ b/extensions/gitsyntax/syntaxes/git-rebase.tmLanguage.json @@ -0,0 +1,35 @@ +{ + "fileTypes": [ + "git-rebase-todo" + ], + "name": "Git Rebase Message", + "patterns": [ + { + "captures": { + "1": { + "name": "punctuation.definition.comment.git-rebase" + } + }, + "match": "^\\s*(#).*$\\n?", + "name": "comment.line.number-sign.git-rebase" + }, + { + "captures": { + "1": { + "name": "support.function.git-rebase" + }, + "2": { + "name": "constant.sha.git-rebase" + }, + "3": { + "name": "meta.commit-message.git-rebase" + } + }, + "match": "^\\s*(pick|p|reword|r|edit|e|squash|s|fixup|f|exec|x|drop|d)\\s+([0-9a-f]+)\\s+(.*)$", + "name": "meta.commit-command.git-rebase" + } + ], + "scopeName": "text.git-rebase", + "uuid": "7F1CC209-5F6D-486A-8180-09FA282381A1", + "version": "https://github.com/textmate/git.tmbundle/commit/d1db42c2d71948662098183a6df519fb53a7a15b" +} \ No newline at end of file From 7728b701bdc8fb0685c2fc3e9eb9df48166e0841 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 18 May 2017 12:28:55 +0200 Subject: [PATCH 0601/1164] [go] update grammar --- extensions/go/syntaxes/go.json | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/extensions/go/syntaxes/go.json b/extensions/go/syntaxes/go.json index 0cfcf1940ad..a6799e3b319 100644 --- a/extensions/go/syntaxes/go.json +++ b/extensions/go/syntaxes/go.json @@ -227,7 +227,7 @@ ] }, { - "match": "(? Date: Thu, 18 May 2017 12:33:46 +0200 Subject: [PATCH 0602/1164] [groovy] add grammar update script --- extensions/groovy/package.json | 5 +- extensions/groovy/syntaxes/Groovy.tmLanguage | 2145 ----------------- .../groovy/syntaxes/groovy.tmLanguage.json | 1386 +++++++++++ 3 files changed, 1390 insertions(+), 2146 deletions(-) delete mode 100644 extensions/groovy/syntaxes/Groovy.tmLanguage create mode 100644 extensions/groovy/syntaxes/groovy.tmLanguage.json diff --git a/extensions/groovy/package.json b/extensions/groovy/package.json index 5c8e10e120b..56f91c9dda4 100644 --- a/extensions/groovy/package.json +++ b/extensions/groovy/package.json @@ -3,6 +3,9 @@ "version": "0.1.0", "publisher": "vscode", "engines": { "vscode": "*" }, + "scripts": { + "update-grammar": "node ../../build/npm/update-grammar.js textmate/groovy.tmbundle Syntaxes/Groovy.tmLanguage ./syntaxes/groovy.tmLanguage.json" + }, "contributes": { "languages": [{ "id": "groovy", @@ -15,7 +18,7 @@ "grammars": [{ "language": "groovy", "scopeName": "source.groovy", - "path": "./syntaxes/Groovy.tmLanguage" + "path": "./syntaxes/groovy.tmLanguage.json" }], "snippets": [{ "language": "groovy", diff --git a/extensions/groovy/syntaxes/Groovy.tmLanguage b/extensions/groovy/syntaxes/Groovy.tmLanguage deleted file mode 100644 index e8973140a57..00000000000 --- a/extensions/groovy/syntaxes/Groovy.tmLanguage +++ /dev/null @@ -1,2145 +0,0 @@ - - - - - fileTypes - - groovy - gvy - - foldingStartMarker - (\{\s*$|^\s*// \{\{\{) - foldingStopMarker - ^\s*(\}|// \}\}\}$) - keyEquivalent - ^~G - name - Groovy - patterns - - - captures - - 1 - - name - punctuation.definition.comment.groovy - - - match - ^(#!).+$\n - name - comment.line.hashbang.groovy - - - captures - - 1 - - name - keyword.other.package.groovy - - 2 - - name - storage.modifier.package.groovy - - 3 - - name - punctuation.terminator.groovy - - - match - ^\s*(package)\b(?:\s*([^ ;$]+)\s*(;)?)? - name - meta.package.groovy - - - begin - (import static)\b\s* - beginCaptures - - 1 - - name - keyword.other.import.static.groovy - - - captures - - 1 - - name - keyword.other.import.groovy - - 2 - - name - storage.modifier.import.groovy - - 3 - - name - punctuation.terminator.groovy - - - contentName - storage.modifier.import.groovy - end - \s*(?:$|(?=%>)(;)) - endCaptures - - 1 - - name - punctuation.terminator.groovy - - - name - meta.import.groovy - patterns - - - match - \. - name - punctuation.separator.groovy - - - match - \s - name - invalid.illegal.character_not_allowed_here.groovy - - - - - begin - (import)\b\s* - beginCaptures - - 1 - - name - keyword.other.import.groovy - - - captures - - 1 - - name - keyword.other.import.groovy - - 2 - - name - storage.modifier.import.groovy - - 3 - - name - punctuation.terminator.groovy - - - contentName - storage.modifier.import.groovy - end - \s*(?:$|(?=%>)|(;)) - endCaptures - - 1 - - name - punctuation.terminator.groovy - - - name - meta.import.groovy - patterns - - - match - \. - name - punctuation.separator.groovy - - - match - \s - name - invalid.illegal.character_not_allowed_here.groovy - - - - - captures - - 1 - - name - keyword.other.import.groovy - - 2 - - name - keyword.other.import.static.groovy - - 3 - - name - storage.modifier.import.groovy - - 4 - - name - punctuation.terminator.groovy - - - match - ^\s*(import)(?:\s+(static)\s+)\b(?:\s*([^ ;$]+)\s*(;)?)? - name - meta.import.groovy - - - include - #groovy - - - repository - - annotations - - patterns - - - begin - (?<!\.)(@[^ (]+)(\() - beginCaptures - - 1 - - name - storage.type.annotation.groovy - - 2 - - name - punctuation.definition.annotation-arguments.begin.groovy - - - end - (\)) - endCaptures - - 1 - - name - punctuation.definition.annotation-arguments.end.groovy - - - name - meta.declaration.annotation.groovy - patterns - - - captures - - 1 - - name - constant.other.key.groovy - - 2 - - name - keyword.operator.assignment.groovy - - - match - (\w*)\s*(=) - - - include - #values - - - match - , - name - punctuation.definition.seperator.groovy - - - - - match - (?<!\.)@\S+ - name - storage.type.annotation.groovy - - - - anonymous-classes-and-new - - begin - \bnew\b - beginCaptures - - 0 - - name - keyword.control.new.groovy - - - end - (?<=\)|\])(?!\s*{)|(?<=})|(?=[;])|$ - patterns - - - begin - (\w+)\s*(?=\[) - beginCaptures - - 1 - - name - storage.type.groovy - - - end - }|(?=\s*(?:,|;|\)))|$ - patterns - - - begin - \[ - end - \] - patterns - - - include - #groovy - - - - - begin - { - end - (?=}) - patterns - - - include - #groovy - - - - - - - begin - (?=\w.*\(?) - end - (?<=\))|$ - patterns - - - include - #object-types - - - begin - \( - beginCaptures - - 1 - - name - storage.type.groovy - - - end - \) - patterns - - - include - #groovy - - - - - - - begin - { - end - } - name - meta.inner-class.groovy - patterns - - - include - #class-body - - - - - - braces - - begin - \{ - end - \} - patterns - - - include - #groovy-code - - - - class - - begin - (?=\w?[\w\s]*(?:class|(?:@)?interface|enum)\s+\w+) - end - } - endCaptures - - 0 - - name - punctuation.section.class.end.groovy - - - name - meta.definition.class.groovy - patterns - - - include - #storage-modifiers - - - include - #comments - - - captures - - 1 - - name - storage.modifier.groovy - - 2 - - name - entity.name.type.class.groovy - - - match - (class|(?:@)?interface|enum)\s+(\w+) - name - meta.class.identifier.groovy - - - begin - extends - beginCaptures - - 0 - - name - storage.modifier.extends.groovy - - - end - (?={|implements) - name - meta.definition.class.inherited.classes.groovy - patterns - - - include - #object-types-inherited - - - include - #comments - - - - - begin - (implements)\s - beginCaptures - - 1 - - name - storage.modifier.implements.groovy - - - end - (?=\s*extends|\{) - name - meta.definition.class.implemented.interfaces.groovy - patterns - - - include - #object-types-inherited - - - include - #comments - - - - - begin - { - end - (?=}) - name - meta.class.body.groovy - patterns - - - include - #class-body - - - - - - class-body - - patterns - - - include - #enum-values - - - include - #constructors - - - include - #groovy - - - - closures - - begin - \{(?=.*?->) - end - \} - patterns - - - begin - (?<=\{)(?=[^\}]*?->) - end - -> - endCaptures - - 0 - - name - keyword.operator.groovy - - - patterns - - - begin - (?!->) - end - (?=->) - name - meta.closure.parameters.groovy - patterns - - - begin - (?!,|->) - end - (?=,|->) - name - meta.closure.parameter.groovy - patterns - - - begin - = - beginCaptures - - 0 - - name - keyword.operator.assignment.groovy - - - end - (?=,|->) - name - meta.parameter.default.groovy - patterns - - - include - #groovy-code - - - - - include - #parameters - - - - - - - - - begin - (?=[^}]) - end - (?=\}) - patterns - - - include - #groovy-code - - - - - - comment-block - - begin - /\* - captures - - 0 - - name - punctuation.definition.comment.groovy - - - end - \*/ - name - comment.block.groovy - - comments - - patterns - - - captures - - 0 - - name - punctuation.definition.comment.groovy - - - match - /\*\*/ - name - comment.block.empty.groovy - - - include - text.html.javadoc - - - include - #comment-block - - - captures - - 1 - - name - punctuation.definition.comment.groovy - - - match - (//).*$\n? - name - comment.line.double-slash.groovy - - - - constants - - patterns - - - match - \b([A-Z][A-Z0-9_]+)\b - name - constant.other.groovy - - - match - \b(true|false|null)\b - name - constant.language.groovy - - - - constructors - - applyEndPatternLast - 1 - begin - (?<=;|^)(?=\s*(?:(?:private|protected|public|native|synchronized|abstract|threadsafe|transient|static|final)\s+)*[A-Z]\w*\() - end - } - patterns - - - include - #method-content - - - - enum-values - - patterns - - - begin - (?<=;|^)\s*\b([A-Z0-9_]+)(?=\s*(?:,|;|}|\(|$)) - beginCaptures - - 1 - - name - constant.enum.name.groovy - - - end - ,|;|(?=})|^(?!\s*\w+\s*(?:,|$)) - patterns - - - begin - \( - end - \) - name - meta.enum.value.groovy - patterns - - - match - , - name - punctuation.definition.seperator.parameter.groovy - - - include - #groovy-code - - - - - - - - groovy - - patterns - - - include - #comments - - - include - #class - - - include - #variables - - - include - #methods - - - include - #annotations - - - include - #groovy-code - - - - groovy-code - - patterns - - - include - #groovy-code-minus-map-keys - - - include - #map-keys - - - - groovy-code-minus-map-keys - - comment - In some situations, maps can't be declared without enclosing []'s, - therefore we create a collection of everything but that - patterns - - - include - #comments - - - include - #annotations - - - include - #support-functions - - - include - #keyword-language - - - include - #values - - - include - #anonymous-classes-and-new - - - include - #keyword-operator - - - include - #types - - - include - #storage-modifiers - - - include - #parens - - - include - #closures - - - include - #braces - - - - keyword - - patterns - - - include - #keyword-operator - - - include - #keyword-language - - - - keyword-language - - patterns - - - match - \b(try|catch|finally|throw)\b - name - keyword.control.exception.groovy - - - match - \b((?<!\.)(?:return|break|continue|default|do|while|for|switch|if|else))\b - name - keyword.control.groovy - - - begin - \bcase\b - beginCaptures - - 0 - - name - keyword.control.groovy - - - end - : - endCaptures - - 0 - - name - punctuation.definition.case-terminator.groovy - - - name - meta.case.groovy - patterns - - - include - #groovy-code-minus-map-keys - - - - - begin - \b(assert)\s - beginCaptures - - 1 - - name - keyword.control.assert.groovy - - - end - $|;|} - name - meta.declaration.assertion.groovy - patterns - - - match - : - name - keyword.operator.assert.expression-seperator.groovy - - - include - #groovy-code-minus-map-keys - - - - - match - \b(throws)\b - name - keyword.other.throws.groovy - - - - keyword-operator - - patterns - - - match - \b(as)\b - name - keyword.operator.as.groovy - - - match - \b(in)\b - name - keyword.operator.in.groovy - - - match - \?\: - name - keyword.operator.elvis.groovy - - - match - \*\: - name - keyword.operator.spreadmap.groovy - - - match - \.\. - name - keyword.operator.range.groovy - - - match - \-> - name - keyword.operator.arrow.groovy - - - match - << - name - keyword.operator.leftshift.groovy - - - match - (?<=\S)\.(?=\S) - name - keyword.operator.navigation.groovy - - - match - (?<=\S)\?\.(?=\S) - name - keyword.operator.safe-navigation.groovy - - - begin - \? - beginCaptures - - 0 - - name - keyword.operator.ternary.groovy - - - end - (?=$|\)|}|]) - name - meta.evaluation.ternary.groovy - patterns - - - match - : - name - keyword.operator.ternary.expression-seperator.groovy - - - include - #groovy-code-minus-map-keys - - - - - match - ==~ - name - keyword.operator.match.groovy - - - match - =~ - name - keyword.operator.find.groovy - - - match - \b(instanceof)\b - name - keyword.operator.instanceof.groovy - - - match - (===|==|!=|<=|>=|<=>|<>|<|>|<<) - name - keyword.operator.comparison.groovy - - - match - = - name - keyword.operator.assignment.groovy - - - match - (\-\-|\+\+) - name - keyword.operator.increment-decrement.groovy - - - match - (\-|\+|\*|\/|%) - name - keyword.operator.arithmetic.groovy - - - match - (!|&&|\|\|) - name - keyword.operator.logical.groovy - - - - language-variables - - patterns - - - match - \b(this|super)\b - name - variable.language.groovy - - - - map-keys - - patterns - - - captures - - 1 - - name - constant.other.key.groovy - - 2 - - name - punctuation.definition.seperator.key-value.groovy - - - match - (\w+)\s*(:) - - - - method-call - - begin - ([\w$]+)(\() - beginCaptures - - 1 - - name - meta.method.groovy - - 2 - - name - punctuation.definition.method-parameters.begin.groovy - - - end - \) - endCaptures - - 0 - - name - punctuation.definition.method-parameters.end.groovy - - - name - meta.method-call.groovy - patterns - - - match - , - name - punctuation.definition.seperator.parameter.groovy - - - include - #groovy-code - - - - method-content - - patterns - - - match - \s - - - include - #annotations - - - begin - (?=(?:\w|<)[^\(]*\s+(?:[\w$]|<)+\s*\() - end - (?=[\w$]+\s*\() - name - meta.method.return-type.java - patterns - - - include - #storage-modifiers - - - include - #types - - - - - begin - ([\w$]+)\s*\( - beginCaptures - - 1 - - name - entity.name.function.java - - - end - \) - name - meta.definition.method.signature.java - patterns - - - begin - (?=[^)]) - end - (?=\)) - name - meta.method.parameters.groovy - patterns - - - begin - (?=[^,)]) - end - (?=,|\)) - name - meta.method.parameter.groovy - patterns - - - match - , - name - punctuation.definition.separator.groovy - - - begin - = - beginCaptures - - 0 - - name - keyword.operator.assignment.groovy - - - end - (?=,|\)) - name - meta.parameter.default.groovy - patterns - - - include - #groovy-code - - - - - include - #parameters - - - - - - - - - begin - (?=<) - end - (?=\s) - name - meta.method.paramerised-type.groovy - patterns - - - begin - < - end - > - name - storage.type.parameters.groovy - patterns - - - include - #types - - - match - , - name - punctuation.definition.seperator.groovy - - - - - - - begin - throws - beginCaptures - - 0 - - name - storage.modifier.groovy - - - end - (?={|;)|^(?=\s*(?:[^{\s]|$)) - name - meta.throwables.groovy - patterns - - - include - #object-types - - - - - begin - { - end - (?=}) - name - meta.method.body.java - patterns - - - include - #groovy-code - - - - - - methods - - applyEndPatternLast - 1 - begin - (?x:(?<=;|^|{)(?=\s* - (?: - (?:private|protected|public|native|synchronized|abstract|threadsafe|transient|static|final) # visibility/modifier - | - (?:def) - | - (?: - (?: - (?:void|boolean|byte|char|short|int|float|long|double) - | - (?:@?(?:[a-zA-Z]\w*\.)*[A-Z]+\w*) # object type - ) - [\[\]]* - (?:<.*>)? - ) - - ) - \s+ - ([^=]+\s+)?\w+\s*\( - )) - end - }|(?=[^{]) - name - meta.definition.method.groovy - patterns - - - include - #method-content - - - - nest_curly - - begin - \{ - captures - - 0 - - name - punctuation.section.scope.groovy - - - end - \} - patterns - - - include - #nest_curly - - - - numbers - - patterns - - - match - ((0(x|X)[0-9a-fA-F]*)|(\+|-)?\b(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)([LlFfUuDdg]|UL|ul)?\b - name - constant.numeric.groovy - - - - object-types - - patterns - - - begin - \b((?:[a-z]\w*\.)*(?:[A-Z]+\w*[a-z]+\w*|UR[LI]))< - end - >|[^\w\s,\?<\[\]] - name - storage.type.generic.groovy - patterns - - - include - #object-types - - - begin - < - comment - This is just to support <>'s with no actual type prefix - end - >|[^\w\s,\[\]<] - name - storage.type.generic.groovy - - - - - begin - \b((?:[a-z]\w*\.)*[A-Z]+\w*[a-z]+\w*)(?=\[) - end - (?=[^\]\s]) - name - storage.type.object.array.groovy - patterns - - - begin - \[ - end - \] - patterns - - - include - #groovy - - - - - - - match - \b(?:[a-zA-Z]\w*\.)*(?:[A-Z]+\w*[a-z]+\w*|UR[LI])\b - name - storage.type.groovy - - - - object-types-inherited - - patterns - - - begin - \b((?:[a-zA-Z]\w*\.)*[A-Z]+\w*[a-z]+\w*)< - end - >|[^\w\s,\?<\[\]] - name - entity.other.inherited-class.groovy - patterns - - - include - #object-types-inherited - - - begin - < - comment - This is just to support <>'s with no actual type prefix - end - >|[^\w\s,\[\]<] - name - storage.type.generic.groovy - - - - - captures - - 1 - - name - keyword.operator.dereference.groovy - - - match - \b(?:[a-zA-Z]\w*(\.))*[A-Z]+\w*[a-z]+\w*\b - name - entity.other.inherited-class.groovy - - - - parameters - - patterns - - - include - #annotations - - - include - #storage-modifiers - - - include - #types - - - match - \w+ - name - variable.parameter.method.groovy - - - - parens - - begin - \( - end - \) - patterns - - - include - #groovy-code - - - - primitive-arrays - - patterns - - - match - \b(?:void|boolean|byte|char|short|int|float|long|double)(\[\])*\b - name - storage.type.primitive.array.groovy - - - - primitive-types - - patterns - - - match - \b(?:void|boolean|byte|char|short|int|float|long|double)\b - name - storage.type.primitive.groovy - - - - regexp - - patterns - - - begin - /(?=[^/]+/([^>]|$)) - beginCaptures - - 0 - - name - punctuation.definition.string.regexp.begin.groovy - - - end - / - endCaptures - - 0 - - name - punctuation.definition.string.regexp.end.groovy - - - name - string.regexp.groovy - patterns - - - match - \\. - name - constant.character.escape.groovy - - - - - begin - ~" - beginCaptures - - 0 - - name - punctuation.definition.string.regexp.begin.groovy - - - end - " - endCaptures - - 0 - - name - punctuation.definition.string.regexp.end.groovy - - - name - string.regexp.compiled.groovy - patterns - - - match - \\. - name - constant.character.escape.groovy - - - - - - storage-modifiers - - patterns - - - match - \b(private|protected|public)\b - name - storage.modifier.access-control.groovy - - - match - \b(static)\b - name - storage.modifier.static.groovy - - - match - \b(final)\b - name - storage.modifier.final.groovy - - - match - \b(native|synchronized|abstract|threadsafe|transient)\b - name - storage.modifier.other.groovy - - - - string-quoted-double - - begin - " - beginCaptures - - 0 - - name - punctuation.definition.string.begin.groovy - - - end - " - endCaptures - - 0 - - name - punctuation.definition.string.end.groovy - - - name - string.quoted.double.groovy - patterns - - - include - #string-quoted-double-contents - - - - string-quoted-double-contents - - patterns - - - match - \\. - name - constant.character.escape.groovy - - - applyEndPatternLast - 1 - begin - \$\w - end - (?=\W) - name - variable.other.interpolated.groovy - patterns - - - match - \w - name - variable.other.interpolated.groovy - - - match - \. - name - keyword.other.dereference.groovy - - - - - begin - \$\{ - captures - - 0 - - name - punctuation.section.embedded.groovy - - - end - \} - name - source.groovy.embedded.source - patterns - - - include - #nest_curly - - - - - - string-quoted-double-multiline - - begin - """ - beginCaptures - - 0 - - name - punctuation.definition.string.begin.groovy - - - end - """ - endCaptures - - 0 - - name - punctuation.definition.string.end.groovy - - - name - string.quoted.double.multiline.groovy - patterns - - - include - #string-quoted-double-contents - - - - string-quoted-single - - begin - ' - beginCaptures - - 0 - - name - punctuation.definition.string.begin.groovy - - - end - ' - endCaptures - - 0 - - name - punctuation.definition.string.end.groovy - - - name - string.quoted.single.groovy - patterns - - - include - #string-quoted-single-contents - - - - string-quoted-single-contents - - patterns - - - match - \\. - name - constant.character.escape.groovy - - - - string-quoted-single-multiline - - begin - ''' - beginCaptures - - 0 - - name - punctuation.definition.string.begin.groovy - - - end - ''' - endCaptures - - 0 - - name - punctuation.definition.string.end.groovy - - - name - string.quoted.single.multiline.groovy - patterns - - - include - #string-quoted-single-contents - - - - strings - - patterns - - - include - #string-quoted-double-multiline - - - include - #string-quoted-single-multiline - - - include - #string-quoted-double - - - include - #string-quoted-single - - - include - #regexp - - - - structures - - begin - \[ - beginCaptures - - 0 - - name - punctuation.definition.structure.begin.groovy - - - end - \] - endCaptures - - 0 - - name - punctuation.definition.structure.end.groovy - - - name - meta.structure.groovy - patterns - - - include - #groovy-code - - - match - , - name - punctuation.definition.separator.groovy - - - - support-functions - - patterns - - - match - (?x)\b(?:sprintf|print(?:f|ln)?)\b - name - support.function.print.groovy - - - match - (?x)\b(?:shouldFail|fail(?:NotEquals)?|ass(?:ume|ert(?:S(?:cript|ame)|N(?:ot(?:Same| - Null)|ull)|Contains|T(?:hat|oString|rue)|Inspect|Equals|False|Length| - ArrayEquals)))\b - name - support.function.testing.groovy - - - - types - - patterns - - - match - \b(def)\b - name - storage.type.def.groovy - - - include - #primitive-types - - - include - #primitive-arrays - - - include - #object-types - - - - values - - patterns - - - include - #language-variables - - - include - #strings - - - include - #numbers - - - include - #constants - - - include - #types - - - include - #structures - - - include - #method-call - - - - variables - - applyEndPatternLast - 1 - patterns - - - begin - (?x:(?= - (?: - (?:private|protected|public|native|synchronized|abstract|threadsafe|transient|static|final) # visibility/modifier - | - (?:def) - | - (?:void|boolean|byte|char|short|int|float|long|double) - | - (?:(?:[a-z]\w*\.)*[A-Z]+\w*) # object type - ) - \s+ - [\w\d_<>\[\],\s]+ - (?:=|$) - - )) - end - ;|$ - name - meta.definition.variable.groovy - patterns - - - match - \s - - - captures - - 1 - - name - constant.variable.groovy - - - match - ([A-Z_0-9]+)\s+(?=\=) - - - captures - - 1 - - name - meta.definition.variable.name.groovy - - - match - (\w[^\s,]*)\s+(?=\=) - - - begin - = - beginCaptures - - 0 - - name - keyword.operator.assignment.groovy - - - end - $ - patterns - - - include - #groovy-code - - - - - captures - - 1 - - name - meta.definition.variable.name.groovy - - - match - (\w[^\s=]*)(?=\s*($|;)) - - - include - #groovy-code - - - - - - - scopeName - source.groovy - uuid - B3A64888-EBBB-4436-8D9E-F1169C5D7613 - - \ No newline at end of file diff --git a/extensions/groovy/syntaxes/groovy.tmLanguage.json b/extensions/groovy/syntaxes/groovy.tmLanguage.json new file mode 100644 index 00000000000..8850454840e --- /dev/null +++ b/extensions/groovy/syntaxes/groovy.tmLanguage.json @@ -0,0 +1,1386 @@ +{ + "fileTypes": [ + "groovy", + "gvy" + ], + "foldingStartMarker": "(\\{\\s*$|^\\s*// \\{\\{\\{)", + "foldingStopMarker": "^\\s*(\\}|// \\}\\}\\}$)", + "keyEquivalent": "^~G", + "name": "Groovy", + "patterns": [ + { + "captures": { + "1": { + "name": "punctuation.definition.comment.groovy" + } + }, + "match": "^(#!).+$\\n", + "name": "comment.line.hashbang.groovy" + }, + { + "captures": { + "1": { + "name": "keyword.other.package.groovy" + }, + "2": { + "name": "storage.modifier.package.groovy" + }, + "3": { + "name": "punctuation.terminator.groovy" + } + }, + "match": "^\\s*(package)\\b(?:\\s*([^ ;$]+)\\s*(;)?)?", + "name": "meta.package.groovy" + }, + { + "begin": "(import static)\\b\\s*", + "beginCaptures": { + "1": { + "name": "keyword.other.import.static.groovy" + } + }, + "captures": { + "1": { + "name": "keyword.other.import.groovy" + }, + "2": { + "name": "storage.modifier.import.groovy" + }, + "3": { + "name": "punctuation.terminator.groovy" + } + }, + "contentName": "storage.modifier.import.groovy", + "end": "\\s*(?:$|(?=%>)(;))", + "endCaptures": { + "1": { + "name": "punctuation.terminator.groovy" + } + }, + "name": "meta.import.groovy", + "patterns": [ + { + "match": "\\.", + "name": "punctuation.separator.groovy" + }, + { + "match": "\\s", + "name": "invalid.illegal.character_not_allowed_here.groovy" + } + ] + }, + { + "begin": "(import)\\b\\s*", + "beginCaptures": { + "1": { + "name": "keyword.other.import.groovy" + } + }, + "captures": { + "1": { + "name": "keyword.other.import.groovy" + }, + "2": { + "name": "storage.modifier.import.groovy" + }, + "3": { + "name": "punctuation.terminator.groovy" + } + }, + "contentName": "storage.modifier.import.groovy", + "end": "\\s*(?:$|(?=%>)|(;))", + "endCaptures": { + "1": { + "name": "punctuation.terminator.groovy" + } + }, + "name": "meta.import.groovy", + "patterns": [ + { + "match": "\\.", + "name": "punctuation.separator.groovy" + }, + { + "match": "\\s", + "name": "invalid.illegal.character_not_allowed_here.groovy" + } + ] + }, + { + "captures": { + "1": { + "name": "keyword.other.import.groovy" + }, + "2": { + "name": "keyword.other.import.static.groovy" + }, + "3": { + "name": "storage.modifier.import.groovy" + }, + "4": { + "name": "punctuation.terminator.groovy" + } + }, + "match": "^\\s*(import)(?:\\s+(static)\\s+)\\b(?:\\s*([^ ;$]+)\\s*(;)?)?", + "name": "meta.import.groovy" + }, + { + "include": "#groovy" + } + ], + "repository": { + "annotations": { + "patterns": [ + { + "begin": "(?)", + "end": "\\}", + "patterns": [ + { + "begin": "(?<=\\{)(?=[^\\}]*?->)", + "end": "->", + "endCaptures": { + "0": { + "name": "keyword.operator.groovy" + } + }, + "patterns": [ + { + "begin": "(?!->)", + "end": "(?=->)", + "name": "meta.closure.parameters.groovy", + "patterns": [ + { + "begin": "(?!,|->)", + "end": "(?=,|->)", + "name": "meta.closure.parameter.groovy", + "patterns": [ + { + "begin": "=", + "beginCaptures": { + "0": { + "name": "keyword.operator.assignment.groovy" + } + }, + "end": "(?=,|->)", + "name": "meta.parameter.default.groovy", + "patterns": [ + { + "include": "#groovy-code" + } + ] + }, + { + "include": "#parameters" + } + ] + } + ] + } + ] + }, + { + "begin": "(?=[^}])", + "end": "(?=\\})", + "patterns": [ + { + "include": "#groovy-code" + } + ] + } + ] + }, + "comment-block": { + "begin": "/\\*", + "captures": { + "0": { + "name": "punctuation.definition.comment.groovy" + } + }, + "end": "\\*/", + "name": "comment.block.groovy" + }, + "comments": { + "patterns": [ + { + "captures": { + "0": { + "name": "punctuation.definition.comment.groovy" + } + }, + "match": "/\\*\\*/", + "name": "comment.block.empty.groovy" + }, + { + "include": "text.html.javadoc" + }, + { + "include": "#comment-block" + }, + { + "captures": { + "1": { + "name": "punctuation.definition.comment.groovy" + } + }, + "match": "(//).*$\\n?", + "name": "comment.line.double-slash.groovy" + } + ] + }, + "constants": { + "patterns": [ + { + "match": "\\b([A-Z][A-Z0-9_]+)\\b", + "name": "constant.other.groovy" + }, + { + "match": "\\b(true|false|null)\\b", + "name": "constant.language.groovy" + } + ] + }, + "constructors": { + "applyEndPatternLast": 1, + "begin": "(?<=;|^)(?=\\s*(?:(?:private|protected|public|native|synchronized|abstract|threadsafe|transient|static|final)\\s+)*[A-Z]\\w*\\()", + "end": "}", + "patterns": [ + { + "include": "#method-content" + } + ] + }, + "enum-values": { + "patterns": [ + { + "begin": "(?<=;|^)\\s*\\b([A-Z0-9_]+)(?=\\s*(?:,|;|}|\\(|$))", + "beginCaptures": { + "1": { + "name": "constant.enum.name.groovy" + } + }, + "end": ",|;|(?=})|^(?!\\s*\\w+\\s*(?:,|$))", + "patterns": [ + { + "begin": "\\(", + "end": "\\)", + "name": "meta.enum.value.groovy", + "patterns": [ + { + "match": ",", + "name": "punctuation.definition.seperator.parameter.groovy" + }, + { + "include": "#groovy-code" + } + ] + } + ] + } + ] + }, + "groovy": { + "patterns": [ + { + "include": "#comments" + }, + { + "include": "#class" + }, + { + "include": "#variables" + }, + { + "include": "#methods" + }, + { + "include": "#annotations" + }, + { + "include": "#groovy-code" + } + ] + }, + "groovy-code": { + "patterns": [ + { + "include": "#groovy-code-minus-map-keys" + }, + { + "include": "#map-keys" + } + ] + }, + "groovy-code-minus-map-keys": { + "comment": "In some situations, maps can't be declared without enclosing []'s, \n\t\t\t\ttherefore we create a collection of everything but that", + "patterns": [ + { + "include": "#comments" + }, + { + "include": "#annotations" + }, + { + "include": "#support-functions" + }, + { + "include": "#keyword-language" + }, + { + "include": "#values" + }, + { + "include": "#anonymous-classes-and-new" + }, + { + "include": "#keyword-operator" + }, + { + "include": "#types" + }, + { + "include": "#storage-modifiers" + }, + { + "include": "#parens" + }, + { + "include": "#closures" + }, + { + "include": "#braces" + } + ] + }, + "keyword": { + "patterns": [ + { + "include": "#keyword-operator" + }, + { + "include": "#keyword-language" + } + ] + }, + "keyword-language": { + "patterns": [ + { + "match": "\\b(try|catch|finally|throw)\\b", + "name": "keyword.control.exception.groovy" + }, + { + "match": "\\b((?", + "name": "keyword.operator.arrow.groovy" + }, + { + "match": "<<", + "name": "keyword.operator.leftshift.groovy" + }, + { + "match": "(?<=\\S)\\.(?=\\S)", + "name": "keyword.operator.navigation.groovy" + }, + { + "match": "(?<=\\S)\\?\\.(?=\\S)", + "name": "keyword.operator.safe-navigation.groovy" + }, + { + "begin": "\\?", + "beginCaptures": { + "0": { + "name": "keyword.operator.ternary.groovy" + } + }, + "end": "(?=$|\\)|}|])", + "name": "meta.evaluation.ternary.groovy", + "patterns": [ + { + "match": ":", + "name": "keyword.operator.ternary.expression-seperator.groovy" + }, + { + "include": "#groovy-code-minus-map-keys" + } + ] + }, + { + "match": "==~", + "name": "keyword.operator.match.groovy" + }, + { + "match": "=~", + "name": "keyword.operator.find.groovy" + }, + { + "match": "\\b(instanceof)\\b", + "name": "keyword.operator.instanceof.groovy" + }, + { + "match": "(===|==|!=|<=|>=|<=>|<>|<|>|<<)", + "name": "keyword.operator.comparison.groovy" + }, + { + "match": "=", + "name": "keyword.operator.assignment.groovy" + }, + { + "match": "(\\-\\-|\\+\\+)", + "name": "keyword.operator.increment-decrement.groovy" + }, + { + "match": "(\\-|\\+|\\*|\\/|%)", + "name": "keyword.operator.arithmetic.groovy" + }, + { + "match": "(!|&&|\\|\\|)", + "name": "keyword.operator.logical.groovy" + } + ] + }, + "language-variables": { + "patterns": [ + { + "match": "\\b(this|super)\\b", + "name": "variable.language.groovy" + } + ] + }, + "map-keys": { + "patterns": [ + { + "captures": { + "1": { + "name": "constant.other.key.groovy" + }, + "2": { + "name": "punctuation.definition.seperator.key-value.groovy" + } + }, + "match": "(\\w+)\\s*(:)" + } + ] + }, + "method-call": { + "begin": "([\\w$]+)(\\()", + "beginCaptures": { + "1": { + "name": "meta.method.groovy" + }, + "2": { + "name": "punctuation.definition.method-parameters.begin.groovy" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.method-parameters.end.groovy" + } + }, + "name": "meta.method-call.groovy", + "patterns": [ + { + "match": ",", + "name": "punctuation.definition.seperator.parameter.groovy" + }, + { + "include": "#groovy-code" + } + ] + }, + "method-content": { + "patterns": [ + { + "match": "\\s" + }, + { + "include": "#annotations" + }, + { + "begin": "(?=(?:\\w|<)[^\\(]*\\s+(?:[\\w$]|<)+\\s*\\()", + "end": "(?=[\\w$]+\\s*\\()", + "name": "meta.method.return-type.java", + "patterns": [ + { + "include": "#storage-modifiers" + }, + { + "include": "#types" + } + ] + }, + { + "begin": "([\\w$]+)\\s*\\(", + "beginCaptures": { + "1": { + "name": "entity.name.function.java" + } + }, + "end": "\\)", + "name": "meta.definition.method.signature.java", + "patterns": [ + { + "begin": "(?=[^)])", + "end": "(?=\\))", + "name": "meta.method.parameters.groovy", + "patterns": [ + { + "begin": "(?=[^,)])", + "end": "(?=,|\\))", + "name": "meta.method.parameter.groovy", + "patterns": [ + { + "match": ",", + "name": "punctuation.definition.separator.groovy" + }, + { + "begin": "=", + "beginCaptures": { + "0": { + "name": "keyword.operator.assignment.groovy" + } + }, + "end": "(?=,|\\))", + "name": "meta.parameter.default.groovy", + "patterns": [ + { + "include": "#groovy-code" + } + ] + }, + { + "include": "#parameters" + } + ] + } + ] + } + ] + }, + { + "begin": "(?=<)", + "end": "(?=\\s)", + "name": "meta.method.paramerised-type.groovy", + "patterns": [ + { + "begin": "<", + "end": ">", + "name": "storage.type.parameters.groovy", + "patterns": [ + { + "include": "#types" + }, + { + "match": ",", + "name": "punctuation.definition.seperator.groovy" + } + ] + } + ] + }, + { + "begin": "throws", + "beginCaptures": { + "0": { + "name": "storage.modifier.groovy" + } + }, + "end": "(?={|;)|^(?=\\s*(?:[^{\\s]|$))", + "name": "meta.throwables.groovy", + "patterns": [ + { + "include": "#object-types" + } + ] + }, + { + "begin": "{", + "end": "(?=})", + "name": "meta.method.body.java", + "patterns": [ + { + "include": "#groovy-code" + } + ] + } + ] + }, + "methods": { + "applyEndPatternLast": 1, + "begin": "(?x:(?<=;|^|{)(?=\\s*\n (?:\n (?:private|protected|public|native|synchronized|abstract|threadsafe|transient|static|final) # visibility/modifier\n |\n (?:def)\n |\n (?:\n (?:\n (?:void|boolean|byte|char|short|int|float|long|double)\n |\n (?:@?(?:[a-zA-Z]\\w*\\.)*[A-Z]+\\w*) # object type\n )\n [\\[\\]]*\n (?:<.*>)?\n ) \n \n )\n \\s+\n ([^=]+\\s+)?\\w+\\s*\\(\n\t\t\t))", + "end": "}|(?=[^{])", + "name": "meta.definition.method.groovy", + "patterns": [ + { + "include": "#method-content" + } + ] + }, + "nest_curly": { + "begin": "\\{", + "captures": { + "0": { + "name": "punctuation.section.scope.groovy" + } + }, + "end": "\\}", + "patterns": [ + { + "include": "#nest_curly" + } + ] + }, + "numbers": { + "patterns": [ + { + "match": "((0(x|X)[0-9a-fA-F]*)|(\\+|-)?\\b(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)([LlFfUuDdg]|UL|ul)?\\b", + "name": "constant.numeric.groovy" + } + ] + }, + "object-types": { + "patterns": [ + { + "begin": "\\b((?:[a-z]\\w*\\.)*(?:[A-Z]+\\w*[a-z]+\\w*|UR[LI]))<", + "end": ">|[^\\w\\s,\\?<\\[\\]]", + "name": "storage.type.generic.groovy", + "patterns": [ + { + "include": "#object-types" + }, + { + "begin": "<", + "comment": "This is just to support <>'s with no actual type prefix", + "end": ">|[^\\w\\s,\\[\\]<]", + "name": "storage.type.generic.groovy" + } + ] + }, + { + "begin": "\\b((?:[a-z]\\w*\\.)*[A-Z]+\\w*[a-z]+\\w*)(?=\\[)", + "end": "(?=[^\\]\\s])", + "name": "storage.type.object.array.groovy", + "patterns": [ + { + "begin": "\\[", + "end": "\\]", + "patterns": [ + { + "include": "#groovy" + } + ] + } + ] + }, + { + "match": "\\b(?:[a-zA-Z]\\w*\\.)*(?:[A-Z]+\\w*[a-z]+\\w*|UR[LI])\\b", + "name": "storage.type.groovy" + } + ] + }, + "object-types-inherited": { + "patterns": [ + { + "begin": "\\b((?:[a-zA-Z]\\w*\\.)*[A-Z]+\\w*[a-z]+\\w*)<", + "end": ">|[^\\w\\s,\\?<\\[\\]]", + "name": "entity.other.inherited-class.groovy", + "patterns": [ + { + "include": "#object-types-inherited" + }, + { + "begin": "<", + "comment": "This is just to support <>'s with no actual type prefix", + "end": ">|[^\\w\\s,\\[\\]<]", + "name": "storage.type.generic.groovy" + } + ] + }, + { + "captures": { + "1": { + "name": "keyword.operator.dereference.groovy" + } + }, + "match": "\\b(?:[a-zA-Z]\\w*(\\.))*[A-Z]+\\w*[a-z]+\\w*\\b", + "name": "entity.other.inherited-class.groovy" + } + ] + }, + "parameters": { + "patterns": [ + { + "include": "#annotations" + }, + { + "include": "#storage-modifiers" + }, + { + "include": "#types" + }, + { + "match": "\\w+", + "name": "variable.parameter.method.groovy" + } + ] + }, + "parens": { + "begin": "\\(", + "end": "\\)", + "patterns": [ + { + "include": "#groovy-code" + } + ] + }, + "primitive-arrays": { + "patterns": [ + { + "match": "\\b(?:void|boolean|byte|char|short|int|float|long|double)(\\[\\])*\\b", + "name": "storage.type.primitive.array.groovy" + } + ] + }, + "primitive-types": { + "patterns": [ + { + "match": "\\b(?:void|boolean|byte|char|short|int|float|long|double)\\b", + "name": "storage.type.primitive.groovy" + } + ] + }, + "regexp": { + "patterns": [ + { + "begin": "/(?=[^/]+/([^>]|$))", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.regexp.begin.groovy" + } + }, + "end": "/", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.regexp.end.groovy" + } + }, + "name": "string.regexp.groovy", + "patterns": [ + { + "match": "\\\\.", + "name": "constant.character.escape.groovy" + } + ] + }, + { + "begin": "~\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.regexp.begin.groovy" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.regexp.end.groovy" + } + }, + "name": "string.regexp.compiled.groovy", + "patterns": [ + { + "match": "\\\\.", + "name": "constant.character.escape.groovy" + } + ] + } + ] + }, + "storage-modifiers": { + "patterns": [ + { + "match": "\\b(private|protected|public)\\b", + "name": "storage.modifier.access-control.groovy" + }, + { + "match": "\\b(static)\\b", + "name": "storage.modifier.static.groovy" + }, + { + "match": "\\b(final)\\b", + "name": "storage.modifier.final.groovy" + }, + { + "match": "\\b(native|synchronized|abstract|threadsafe|transient)\\b", + "name": "storage.modifier.other.groovy" + } + ] + }, + "string-quoted-double": { + "begin": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.groovy" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.groovy" + } + }, + "name": "string.quoted.double.groovy", + "patterns": [ + { + "include": "#string-quoted-double-contents" + } + ] + }, + "string-quoted-double-contents": { + "patterns": [ + { + "match": "\\\\.", + "name": "constant.character.escape.groovy" + }, + { + "applyEndPatternLast": 1, + "begin": "\\$\\w", + "end": "(?=\\W)", + "name": "variable.other.interpolated.groovy", + "patterns": [ + { + "match": "\\w", + "name": "variable.other.interpolated.groovy" + }, + { + "match": "\\.", + "name": "keyword.other.dereference.groovy" + } + ] + }, + { + "begin": "\\$\\{", + "captures": { + "0": { + "name": "punctuation.section.embedded.groovy" + } + }, + "end": "\\}", + "name": "source.groovy.embedded.source", + "patterns": [ + { + "include": "#nest_curly" + } + ] + } + ] + }, + "string-quoted-double-multiline": { + "begin": "\"\"\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.groovy" + } + }, + "end": "\"\"\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.groovy" + } + }, + "name": "string.quoted.double.multiline.groovy", + "patterns": [ + { + "include": "#string-quoted-double-contents" + } + ] + }, + "string-quoted-single": { + "begin": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.groovy" + } + }, + "end": "'", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.groovy" + } + }, + "name": "string.quoted.single.groovy", + "patterns": [ + { + "include": "#string-quoted-single-contents" + } + ] + }, + "string-quoted-single-contents": { + "patterns": [ + { + "match": "\\\\.", + "name": "constant.character.escape.groovy" + } + ] + }, + "string-quoted-single-multiline": { + "begin": "'''", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.groovy" + } + }, + "end": "'''", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.groovy" + } + }, + "name": "string.quoted.single.multiline.groovy", + "patterns": [ + { + "include": "#string-quoted-single-contents" + } + ] + }, + "strings": { + "patterns": [ + { + "include": "#string-quoted-double-multiline" + }, + { + "include": "#string-quoted-single-multiline" + }, + { + "include": "#string-quoted-double" + }, + { + "include": "#string-quoted-single" + }, + { + "include": "#regexp" + } + ] + }, + "structures": { + "begin": "\\[", + "beginCaptures": { + "0": { + "name": "punctuation.definition.structure.begin.groovy" + } + }, + "end": "\\]", + "endCaptures": { + "0": { + "name": "punctuation.definition.structure.end.groovy" + } + }, + "name": "meta.structure.groovy", + "patterns": [ + { + "include": "#groovy-code" + }, + { + "match": ",", + "name": "punctuation.definition.separator.groovy" + } + ] + }, + "support-functions": { + "patterns": [ + { + "match": "(?x)\\b(?:sprintf|print(?:f|ln)?)\\b", + "name": "support.function.print.groovy" + }, + { + "match": "(?x)\\b(?:shouldFail|fail(?:NotEquals)?|ass(?:ume|ert(?:S(?:cript|ame)|N(?:ot(?:Same|\n\t\t\t\t\tNull)|ull)|Contains|T(?:hat|oString|rue)|Inspect|Equals|False|Length|\n\t\t\t\t\tArrayEquals)))\\b", + "name": "support.function.testing.groovy" + } + ] + }, + "types": { + "patterns": [ + { + "match": "\\b(def)\\b", + "name": "storage.type.def.groovy" + }, + { + "include": "#primitive-types" + }, + { + "include": "#primitive-arrays" + }, + { + "include": "#object-types" + } + ] + }, + "values": { + "patterns": [ + { + "include": "#language-variables" + }, + { + "include": "#strings" + }, + { + "include": "#numbers" + }, + { + "include": "#constants" + }, + { + "include": "#types" + }, + { + "include": "#structures" + }, + { + "include": "#method-call" + } + ] + }, + "variables": { + "applyEndPatternLast": 1, + "patterns": [ + { + "begin": "(?x:(?=\n (?:\n (?:private|protected|public|native|synchronized|abstract|threadsafe|transient|static|final) # visibility/modifier\n |\n (?:def)\n |\n (?:void|boolean|byte|char|short|int|float|long|double)\n |\n (?:(?:[a-z]\\w*\\.)*[A-Z]+\\w*) # object type\n )\n \\s+\n [\\w\\d_<>\\[\\],\\s]+\n (?:=|$)\n \n \t\t\t))", + "end": ";|$", + "name": "meta.definition.variable.groovy", + "patterns": [ + { + "match": "\\s" + }, + { + "captures": { + "1": { + "name": "constant.variable.groovy" + } + }, + "match": "([A-Z_0-9]+)\\s+(?=\\=)" + }, + { + "captures": { + "1": { + "name": "meta.definition.variable.name.groovy" + } + }, + "match": "(\\w[^\\s,]*)\\s+(?=\\=)" + }, + { + "begin": "=", + "beginCaptures": { + "0": { + "name": "keyword.operator.assignment.groovy" + } + }, + "end": "$", + "patterns": [ + { + "include": "#groovy-code" + } + ] + }, + { + "captures": { + "1": { + "name": "meta.definition.variable.name.groovy" + } + }, + "match": "(\\w[^\\s=]*)(?=\\s*($|;))" + }, + { + "include": "#groovy-code" + } + ] + } + ] + } + }, + "scopeName": "source.groovy", + "uuid": "B3A64888-EBBB-4436-8D9E-F1169C5D7613", + "version": "https://github.com/textmate/groovy.tmbundle/commit/85d8f7c97ae473ccb9473f6c8d27e4ec957f4be1" +} \ No newline at end of file From 72cb93c60ee6b4ac1d31e7ec8ad585aa03e7e76b Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 18 May 2017 12:37:24 +0200 Subject: [PATCH 0603/1164] [html] update grammar --- extensions/html/syntaxes/html.json | 12 ++- .../test/colorize-results/25920_html.json | 82 ++++++++++++------- 2 files changed, 60 insertions(+), 34 deletions(-) diff --git a/extensions/html/syntaxes/html.json b/extensions/html/syntaxes/html.json index be1113e583a..cc2d9fd17ea 100644 --- a/extensions/html/syntaxes/html.json +++ b/extensions/html/syntaxes/html.json @@ -339,7 +339,7 @@ }, { "begin": "\\G", - "end": "(?i:(?=/?>|type\\s*=\\s*('|\"|)(?!text/(javascript|ecmascript)|application/((x-)?javascript|ecmascript)|module)\\b))", + "end": "(?i:(?=/?>|type(?=[\\s=])(?!\\s*=\\s*('|\"|)(text/(javascript|ecmascript|babel)|application/((x-)?javascript|ecmascript|babel)|module)[\\s\"'>])))", "name": "meta.tag.metadata.script.html", "patterns": [ { @@ -348,14 +348,17 @@ ] }, { - "begin": "(?=(?i:type\\s*=\\s*('|\"|)(?=text/(x-handlebars|(x-(handlebars-)?|ng-)?template|html))\\b))", - "end": "(<)(?=/(?i:script))", + "begin": "(?=(?i:type\\s*=\\s*('|\"|)(text/(x-handlebars|(x-(handlebars-)?|ng-)?template|html)[\\s\"'>])))", + "end": "((<))(?=/(?i:script))", "endCaptures": { "0": { "name": "meta.tag.metadata.script.html" }, "1": { "name": "punctuation.definition.tag.begin.html" + }, + "2": { + "name": "text.html.basic" } }, "patterns": [ @@ -377,6 +380,7 @@ { "begin": "(?!\\G)", "end": "(?=", - "t": "text.html.basic meta.embedded.block.html meta.tag.any.html punctuation.definition.tag.html", + "t": "text.html.basic meta.embedded.block.html text.html.basic meta.tag.any.html punctuation.definition.tag.html", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -243,7 +243,7 @@ }, { "c": "<", - "t": "text.html.basic meta.embedded.block.html meta.tag.any.html punctuation.definition.tag.html meta.scope.between-tag-pair.html", + "t": "text.html.basic meta.embedded.block.html text.html.basic meta.tag.any.html punctuation.definition.tag.html meta.scope.between-tag-pair.html", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -254,7 +254,7 @@ }, { "c": "/", - "t": "text.html.basic meta.embedded.block.html meta.tag.any.html punctuation.definition.tag.html", + "t": "text.html.basic meta.embedded.block.html text.html.basic meta.tag.any.html punctuation.definition.tag.html", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -265,7 +265,7 @@ }, { "c": "div", - "t": "text.html.basic meta.embedded.block.html meta.tag.any.html entity.name.tag.html", + "t": "text.html.basic meta.embedded.block.html text.html.basic meta.tag.any.html entity.name.tag.html", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -276,7 +276,7 @@ }, { "c": ">", - "t": "text.html.basic meta.embedded.block.html meta.tag.any.html punctuation.definition.tag.html", + "t": "text.html.basic meta.embedded.block.html text.html.basic meta.tag.any.html punctuation.definition.tag.html", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -286,7 +286,18 @@ } }, { - "c": "", - "t": "text.html.basic meta.embedded.block.html meta.tag.any.html punctuation.definition.tag.html", + "t": "text.html.basic meta.embedded.block.html text.html.basic meta.tag.any.html punctuation.definition.tag.html", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -771,7 +782,7 @@ }, { "c": "<", - "t": "text.html.basic meta.embedded.block.html meta.tag.any.html punctuation.definition.tag.html meta.scope.between-tag-pair.html", + "t": "text.html.basic meta.embedded.block.html text.html.basic meta.tag.any.html punctuation.definition.tag.html meta.scope.between-tag-pair.html", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -782,7 +793,7 @@ }, { "c": "/", - "t": "text.html.basic meta.embedded.block.html meta.tag.any.html punctuation.definition.tag.html", + "t": "text.html.basic meta.embedded.block.html text.html.basic meta.tag.any.html punctuation.definition.tag.html", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -793,7 +804,7 @@ }, { "c": "div", - "t": "text.html.basic meta.embedded.block.html meta.tag.any.html entity.name.tag.html", + "t": "text.html.basic meta.embedded.block.html text.html.basic meta.tag.any.html entity.name.tag.html", "r": { "dark_plus": "entity.name.tag: #569CD6", "light_plus": "entity.name.tag: #800000", @@ -804,7 +815,7 @@ }, { "c": ">", - "t": "text.html.basic meta.embedded.block.html meta.tag.any.html punctuation.definition.tag.html", + "t": "text.html.basic meta.embedded.block.html text.html.basic meta.tag.any.html punctuation.definition.tag.html", "r": { "dark_plus": "punctuation.definition.tag: #808080", "light_plus": "punctuation.definition.tag: #800000", @@ -814,7 +825,18 @@ } }, { - "c": " Date: Thu, 18 May 2017 13:03:14 +0200 Subject: [PATCH 0604/1164] [r] add update grammar script --- extensions/r/package.json | 5 +- extensions/r/syntaxes/R.plist | 316 ------------------------ extensions/r/syntaxes/r.tmLanguage.json | 204 +++++++++++++++ 3 files changed, 208 insertions(+), 317 deletions(-) delete mode 100644 extensions/r/syntaxes/R.plist create mode 100644 extensions/r/syntaxes/r.tmLanguage.json diff --git a/extensions/r/package.json b/extensions/r/package.json index a41d8ef1488..e1104e23440 100644 --- a/extensions/r/package.json +++ b/extensions/r/package.json @@ -3,6 +3,9 @@ "version": "0.1.0", "publisher": "vscode", "engines": { "vscode": "*" }, + "scripts": { + "update-grammar": "node ../../build/npm/update-grammar.js textmate/r.tmbundle Syntaxes/R.plist ./syntaxes/r.tmLanguage.json" + }, "contributes": { "languages": [{ "id": "r", @@ -13,7 +16,7 @@ "grammars": [{ "language": "r", "scopeName": "source.r", - "path": "./syntaxes/R.plist" + "path": "./syntaxes/r.tmLanguage.json" }] } } diff --git a/extensions/r/syntaxes/R.plist b/extensions/r/syntaxes/R.plist deleted file mode 100644 index 58022aa142d..00000000000 --- a/extensions/r/syntaxes/R.plist +++ /dev/null @@ -1,316 +0,0 @@ - - - - - fileTypes - - R - r - s - S - Rprofile - - keyEquivalent - ^~R - name - R - patterns - - - captures - - 1 - - name - comment.line.pragma.r - - 2 - - name - entity.name.pragma.name.r - - - match - ^(#pragma[ \t]+mark)[ \t](.*) - name - comment.line.pragma-mark.r - - - begin - (^[ \t]+)?(?=#) - beginCaptures - - 1 - - name - punctuation.whitespace.comment.leading.r - - - end - (?!\G) - patterns - - - begin - # - beginCaptures - - 0 - - name - punctuation.definition.comment.r - - - end - \n - name - comment.line.number-sign.r - - - - - match - \b(logical|numeric|character|complex|matrix|array|data\.frame|list|factor)(?=\s*\() - name - storage.type.r - - - match - \b(function|if|break|next|repeat|else|for|return|switch|while|in|invisible)\b - name - keyword.control.r - - - match - \b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)(i|L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\b - name - constant.numeric.r - - - match - \b(T|F|TRUE|FALSE|NULL|NA|Inf|NaN)\b - name - constant.language.r - - - match - \b(pi|letters|LETTERS|month\.abb|month\.name)\b - name - support.constant.misc.r - - - match - (\-|\+|\*|\/|%\/%|%%|%\*%|%in%|%o%|%x%|\^) - name - keyword.operator.arithmetic.r - - - match - (=|<-|<<-|->|->>) - name - keyword.operator.assignment.r - - - match - (==|!=|<>|<|>|<=|>=) - name - keyword.operator.comparison.r - - - match - (!|&{1,2}|[|]{1,2}) - name - keyword.operator.logical.r - - - match - (\.\.\.|\$|@|:|\~) - name - keyword.other.r - - - begin - " - beginCaptures - - 0 - - name - punctuation.definition.string.begin.r - - - end - " - endCaptures - - 0 - - name - punctuation.definition.string.end.r - - - name - string.quoted.double.r - patterns - - - match - \\. - name - constant.character.escape.r - - - - - begin - ' - beginCaptures - - 0 - - name - punctuation.definition.string.begin.r - - - end - ' - endCaptures - - 0 - - name - punctuation.definition.string.end.r - - - name - string.quoted.single.r - patterns - - - match - \\. - name - constant.character.escape.r - - - - - captures - - 1 - - name - entity.name.function.r - - 2 - - name - keyword.operator.assignment.r - - 3 - - name - keyword.control.r - - - match - ([[:alpha:].][[:alnum:]._]*)\s*(<-)\s*(function) - name - meta.function.r - - - captures - - 1 - - name - entity.name.tag.r - - 4 - - name - entity.name.type.r - - - match - (setMethod|setReplaceMethod|setGeneric|setGroupGeneric|setClass)\s*\(\s*([[:alpha:]\d]+\s*=\s*)?("|\x{27})([a-zA-Z._\[\$@][a-zA-Z0-9._\[]*?)\3.* - name - meta.method.declaration.r - - - match - ([[:alpha:].][[:alnum:]._]*)\s*\( - - - captures - - 1 - - name - variable.parameter.r - - 2 - - name - keyword.operator.assignment.r - - - match - ([[:alpha:].][[:alnum:]._]*)\s*(=)(?=[^=]) - - - match - \b([\d_][[:alnum:]._]+)\b - name - invalid.illegal.variable.other.r - - - match - \b([[:alnum:]_]+)(?=::) - name - entity.namespace.r - - - match - \b([[:alnum:]._]+)\b - name - variable.other.r - - - begin - \{ - beginCaptures - - 0 - - name - punctuation.section.block.begin.r - - - end - \} - endCaptures - - 0 - - name - punctuation.section.block.end.r - - - name - meta.block.r - patterns - - - include - source.r - - - - - scopeName - source.r - uuid - B2E6B78D-6E70-11D9-A369-000D93B3A10E - - \ No newline at end of file diff --git a/extensions/r/syntaxes/r.tmLanguage.json b/extensions/r/syntaxes/r.tmLanguage.json new file mode 100644 index 00000000000..829be8d0d2b --- /dev/null +++ b/extensions/r/syntaxes/r.tmLanguage.json @@ -0,0 +1,204 @@ +{ + "fileTypes": [ + "R", + "r", + "s", + "S", + "Rprofile" + ], + "keyEquivalent": "^~R", + "name": "R", + "patterns": [ + { + "captures": { + "1": { + "name": "comment.line.pragma.r" + }, + "2": { + "name": "entity.name.pragma.name.r" + } + }, + "match": "^(#pragma[ \\t]+mark)[ \\t](.*)", + "name": "comment.line.pragma-mark.r" + }, + { + "begin": "(^[ \\t]+)?(?=#)", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.comment.leading.r" + } + }, + "end": "(?!\\G)", + "patterns": [ + { + "begin": "#", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.r" + } + }, + "end": "\\n", + "name": "comment.line.number-sign.r" + } + ] + }, + { + "match": "\\b(logical|numeric|character|complex|matrix|array|data\\.frame|list|factor)(?=\\s*\\()", + "name": "storage.type.r" + }, + { + "match": "\\b(function|if|break|next|repeat|else|for|return|switch|while|in|invisible)\\b", + "name": "keyword.control.r" + }, + { + "match": "\\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)(i|L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b", + "name": "constant.numeric.r" + }, + { + "match": "\\b(T|F|TRUE|FALSE|NULL|NA|Inf|NaN)\\b", + "name": "constant.language.r" + }, + { + "match": "\\b(pi|letters|LETTERS|month\\.abb|month\\.name)\\b", + "name": "support.constant.misc.r" + }, + { + "match": "(\\-|\\+|\\*|\\/|%\\/%|%%|%\\*%|%in%|%o%|%x%|\\^)", + "name": "keyword.operator.arithmetic.r" + }, + { + "match": "(=|<-|<<-|->|->>)", + "name": "keyword.operator.assignment.r" + }, + { + "match": "(==|!=|<>|<|>|<=|>=)", + "name": "keyword.operator.comparison.r" + }, + { + "match": "(!|&{1,2}|[|]{1,2})", + "name": "keyword.operator.logical.r" + }, + { + "match": "(\\.\\.\\.|\\$|@|:|\\~)", + "name": "keyword.other.r" + }, + { + "begin": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.r" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.r" + } + }, + "name": "string.quoted.double.r", + "patterns": [ + { + "match": "\\\\.", + "name": "constant.character.escape.r" + } + ] + }, + { + "begin": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.r" + } + }, + "end": "'", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.r" + } + }, + "name": "string.quoted.single.r", + "patterns": [ + { + "match": "\\\\.", + "name": "constant.character.escape.r" + } + ] + }, + { + "captures": { + "1": { + "name": "entity.name.function.r" + }, + "2": { + "name": "keyword.operator.assignment.r" + }, + "3": { + "name": "keyword.control.r" + } + }, + "match": "([[:alpha:].][[:alnum:]._]*)\\s*(<-)\\s*(function)", + "name": "meta.function.r" + }, + { + "captures": { + "1": { + "name": "entity.name.tag.r" + }, + "4": { + "name": "entity.name.type.r" + } + }, + "match": "(setMethod|setReplaceMethod|setGeneric|setGroupGeneric|setClass)\\s*\\(\\s*([[:alpha:]\\d]+\\s*=\\s*)?(\"|\\x{27})([a-zA-Z._\\[\\$@][a-zA-Z0-9._\\[]*?)\\3.*", + "name": "meta.method.declaration.r" + }, + { + "match": "([[:alpha:].][[:alnum:]._]*)\\s*\\(" + }, + { + "captures": { + "1": { + "name": "variable.parameter.r" + }, + "2": { + "name": "keyword.operator.assignment.r" + } + }, + "match": "([[:alpha:].][[:alnum:]._]*)\\s*(=)(?=[^=])" + }, + { + "match": "\\b([\\d_][[:alnum:]._]+)\\b", + "name": "invalid.illegal.variable.other.r" + }, + { + "match": "\\b([[:alnum:]_]+)(?=::)", + "name": "entity.namespace.r" + }, + { + "match": "\\b([[:alnum:]._]+)\\b", + "name": "variable.other.r" + }, + { + "begin": "\\{", + "beginCaptures": { + "0": { + "name": "punctuation.section.block.begin.r" + } + }, + "end": "\\}", + "endCaptures": { + "0": { + "name": "punctuation.section.block.end.r" + } + }, + "name": "meta.block.r", + "patterns": [ + { + "include": "source.r" + } + ] + } + ], + "scopeName": "source.r", + "uuid": "B2E6B78D-6E70-11D9-A369-000D93B3A10E", + "version": "https://github.com/textmate/r.tmbundle/commit/6b04ff3424f3f1cdfe64a9cfb71d8765959be250" +} \ No newline at end of file From b2c10e50c8fddea6aff4b7404de7570886f9e50c Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 18 May 2017 13:06:54 +0200 Subject: [PATCH 0605/1164] [ruby] update grammar --- extensions/ruby/package.json | 5 +- extensions/ruby/syntaxes/Ruby.plist | 4092 ----------------- extensions/ruby/syntaxes/ruby.tmLanguage.json | 2728 +++++++++++ .../ruby/test/colorize-results/test_rb.json | 12 +- 4 files changed, 2737 insertions(+), 4100 deletions(-) delete mode 100644 extensions/ruby/syntaxes/Ruby.plist create mode 100644 extensions/ruby/syntaxes/ruby.tmLanguage.json diff --git a/extensions/ruby/package.json b/extensions/ruby/package.json index d5933231e77..0599300ca04 100644 --- a/extensions/ruby/package.json +++ b/extensions/ruby/package.json @@ -17,11 +17,12 @@ "grammars": [{ "language": "ruby", "scopeName": "source.ruby", - "path": "./syntaxes/Ruby.plist" + "path": "./syntaxes/ruby.tmLanguage.json" }] }, "scripts": { "compile": "gulp compile-extension:ruby", - "watch": "gulp watch-extension:ruby" + "watch": "gulp watch-extension:ruby", + "update-grammar": "node ../../build/npm/update-grammar.js textmate/ruby.tmbundle Syntaxes/Ruby.plist ./syntaxes/ruby.tmLanguage.json" } } diff --git a/extensions/ruby/syntaxes/Ruby.plist b/extensions/ruby/syntaxes/Ruby.plist deleted file mode 100644 index 04e41fabbf5..00000000000 --- a/extensions/ruby/syntaxes/Ruby.plist +++ /dev/null @@ -1,4092 +0,0 @@ - - - - - comment - - TODO: unresolved issues - - text: - "p <<end - print me! - end" - symptoms: - not recognized as a heredoc - solution: - there is no way to distinguish perfectly between the << operator and the start - of a heredoc. Currently, we require assignment to recognize a heredoc. More - refinement is possible. - • Heredocs with indented terminators (<<-) are always distinguishable, however. - • Nested heredocs are not really supportable at present - - text: - print <<-'THERE' - This is single quoted. - The above used #{Time.now} - THERE - symtoms: - From Programming Ruby p306; should be a non-interpolated heredoc. - - text: - val?(a):p(b) - val?'a':'b' - symptoms: - ':p' is recognized as a symbol.. its 2 things ':' and 'p'. - :'b' has same problem. - solution: - ternary operator rule, precedence stuff, symbol rule. - but also consider 'a.b?(:c)' ?? - - fileTypes - - rb - rbx - rjs - Rakefile - rake - cgi - fcgi - gemspec - irbrc - Capfile - ru - prawn - Cheffile - Gemfile - Guardfile - Hobofile - Vagrantfile - Appraisals - Rantfile - Berksfile - Berksfile.lock - Thorfile - Puppetfile - - firstLineMatch - ^#!/.*\bruby - keyEquivalent - ^~R - name - Ruby - patterns - - - captures - - 1 - - name - keyword.control.class.ruby - - 2 - - name - entity.name.type.class.ruby - - 3 - - name - keyword.operator.other.ruby - - 4 - - name - entity.other.inherited-class.ruby - - 5 - - name - keyword.operator.other.ruby - - 6 - - name - variable.other.object.ruby - - - match - ^\s*(class)\s+(?:([.a-zA-Z0-9_:]+)(?:\s*(<)\s*([.a-zA-Z0-9_:]+))?|(<<)\s*([.a-zA-Z0-9_:]+)) - name - meta.class.ruby - - - captures - - 1 - - name - keyword.control.module.ruby - - 2 - - name - entity.name.type.module.ruby - - 3 - - name - entity.other.inherited-class.module.first.ruby - - 4 - - name - punctuation.separator.inheritance.ruby - - 5 - - name - entity.other.inherited-class.module.second.ruby - - 6 - - name - punctuation.separator.inheritance.ruby - - 7 - - name - entity.other.inherited-class.module.third.ruby - - 8 - - name - punctuation.separator.inheritance.ruby - - - match - ^\s*(module)\s+(([A-Z]\w*(::))?([A-Z]\w*(::))?([A-Z]\w*(::))*[A-Z]\w*) - name - meta.module.ruby - - - comment - else if is a common mistake carried over from other languages. it works if you put in a second end, but it’s never what you want. - match - (?<!\.)\belse(\s)+if\b - name - invalid.deprecated.ruby - - - captures - - 1 - - name - punctuation.definition.constant.ruby - - - comment - symbols as hash key (1.9 syntax) - match - (?>[a-zA-Z_]\w*(?>[?!])?)(:)(?!:) - name - constant.other.symbol.hashkey.ruby - - - captures - - 1 - - name - punctuation.definition.constant.ruby - - - comment - symbols as hash key (1.8 syntax) - match - (?<!:)(:)(?>[a-zA-Z_]\w*(?>[?!])?)(?=\s*=>) - name - constant.other.symbol.hashkey.ruby - - - comment - everything being a reserved word, not a value and needing a 'end' is a.. - match - (?<!\.)\b(BEGIN|begin|case|class|else|elsif|END|end|ensure|for|if|in|module|rescue|then|unless|until|when|while)\b(?![?!]) - name - keyword.control.ruby - - - comment - contextual smart pair support for block parameters - match - (?<!\.)\bdo\b\s* - name - keyword.control.start-block.ruby - - - comment - contextual smart pair support - match - (?<=\{)(\s+) - name - meta.syntax.ruby.start-block - - - comment - as above, just doesn't need a 'end' and does a logic operation - match - (?<!\.)\b(and|not|or)\b - name - keyword.operator.logical.ruby - - - comment - just as above but being not a logical operation - match - (?<!\.)\b(alias|alias_method|break|next|redo|retry|return|super|undef|yield)\b(?![?!])|\bdefined\?|\bblock_given\? - name - keyword.control.pseudo-method.ruby - - - match - \b(nil|true|false)\b(?![?!]) - name - constant.language.ruby - - - match - \b(__(FILE|LINE)__|self)\b(?![?!]) - name - variable.language.ruby - - - comment - everything being a method but having a special function is a.. - match - \b(initialize|new|loop|include|extend|prepend|fail|raise|attr_reader|attr_writer|attr_accessor|attr|catch|throw|private|module_function|public|protected)\b(?![?!]) - name - keyword.other.special-method.ruby - - - begin - \b(require|require_relative|gem)\b - captures - - 1 - - name - keyword.other.special-method.ruby - - - end - $|(?=#|\}) - name - meta.require.ruby - patterns - - - include - $self - - - - - captures - - 1 - - name - punctuation.definition.variable.ruby - - - match - (@)[a-zA-Z_]\w* - name - variable.other.readwrite.instance.ruby - - - captures - - 1 - - name - punctuation.definition.variable.ruby - - - match - (@@)[a-zA-Z_]\w* - name - variable.other.readwrite.class.ruby - - - captures - - 1 - - name - punctuation.definition.variable.ruby - - - match - (\$)[a-zA-Z_]\w* - name - variable.other.readwrite.global.ruby - - - captures - - 1 - - name - punctuation.definition.variable.ruby - - - match - (\$)(!|@|&|`|'|\+|\d+|~|=|/|\\|,|;|\.|<|>|_|\*|\$|\?|:|"|-[0adFiIlpv]) - name - variable.other.readwrite.global.pre-defined.ruby - - - begin - \b(ENV)\[ - beginCaptures - - 1 - - name - variable.other.constant.ruby - - - end - \] - name - meta.environment-variable.ruby - patterns - - - include - $self - - - - - match - \b[A-Z]\w*(?=((\.|::)[A-Za-z]|\[)) - name - support.class.ruby - - - match - \b[A-Z]\w*\b - name - variable.other.constant.ruby - - - begin - (?x) - (?=def\b) # an optimization to help Oniguruma fail fast - (?<=^|\s)(def)\s+ # the def keyword - ( (?>[a-zA-Z_]\w*(?>\.|::))? # a method name prefix - (?>[a-zA-Z_]\w*(?>[?!]|=(?!>))? # the method name - |===?|>[>=]?|<=>|<[<=]?|[%&`/\|]|\*\*?|=?~|[-+]@?|\[\]=?) ) # …or an operator method - \s*(\() # the openning parenthesis for arguments - - beginCaptures - - 1 - - name - keyword.control.def.ruby - - 2 - - name - entity.name.function.ruby - - 3 - - name - punctuation.definition.parameters.ruby - - - comment - the method pattern comes from the symbol pattern, see there for a explaination - end - \) - endCaptures - - 0 - - name - punctuation.definition.parameters.ruby - - - name - meta.function.method.with-arguments.ruby - patterns - - - begin - (?=[&*_a-zA-Z]) - end - (?=[,)]) - patterns - - - captures - - 1 - - name - storage.type.variable.ruby - - 2 - - name - variable.parameter.function.ruby - - - match - \G([&*]?)([_a-zA-Z][_a-zA-Z0-9]*) - - - include - $self - - - - - - - begin - (?x) - (?=def\b) # an optimization to help Oniguruma fail fast - (?<=^|\s)(def)\s+ # the def keyword - ( (?>[a-zA-Z_]\w*(?>\.|::))? # a method name prefix - (?>[a-zA-Z_]\w*(?>[?!]|=(?!>))? # the method name - |===?|>[>=]?|<=>|<[<=]?|[%&`/\|]|\*\*?|=?~|[-+]@?|\[\]=?) ) # …or an operator method - [ \t] # the space separating the arguments - (?=[ \t]*[^\s#;]) # make sure arguments and not a comment follow - - beginCaptures - - 1 - - name - keyword.control.def.ruby - - 2 - - name - entity.name.function.ruby - - - comment - same as the previous rule, but without parentheses around the arguments - end - $ - name - meta.function.method.with-arguments.ruby - patterns - - - begin - (?![\s,]) - end - (?=,|$) - patterns - - - captures - - 1 - - name - punctuation.definition.variable.ruby - - - match - \G([&*]?)[_a-zA-Z][_a-zA-Z0-9]* - name - variable.parameter.function.ruby - - - include - $self - - - - - - - captures - - 1 - - name - keyword.control.def.ruby - - 3 - - name - entity.name.function.ruby - - - comment - the optional name is just to catch the def also without a method-name - match - (?x) - (?=def\b) # an optimization to help Oniguruma fail fast - (?<=^|\s)(def)\b # the def keyword - ( \s+ # an optional group of whitespace followed by… - ( (?>[a-zA-Z_]\w*(?>\.|::))? # a method name prefix - (?>[a-zA-Z_]\w*(?>[?!]|=(?!>))? # the method name - |===?|>[>=]?|<=>|<[<=]?|[%&`/\|]|\*\*?|=?~|[-+]@?|\[\]=?) ) )? # …or an operator method - - name - meta.function.method.without-arguments.ruby - - - match - \b\d(?>_?\d)*(?=\.\d|[eE])(\.\d(?>_?\d)*)?([eE][-+]?\d(?>_?\d)*)?r?i?\b - name - constant.numeric.float.ruby - - - match - \b(0[dD]\d|[1-9])(?>_?\d)*r?i?\b - name - constant.numeric.integer.ruby - - - match - \b0[xX]\h(?>_?\h)*r?i?\b - name - constant.numeric.hex.ruby - - - match - \b0[bB][01](?>_?[01])*r?i?\b - name - constant.numeric.binary.ruby - - - match - \b0([oO]?[0-7](?>_?[0-7])*)?r?i?\b - name - constant.numeric.octal.ruby - - - begin - :' - captures - - 0 - - name - punctuation.definition.constant.ruby - - - end - ' - name - constant.other.symbol.single-quoted.ruby - patterns - - - match - \\['\\] - name - constant.character.escape.ruby - - - - - begin - :" - captures - - 0 - - name - punctuation.definition.constant.ruby - - - end - " - name - constant.other.symbol.double-quoted.ruby - patterns - - - include - #interpolated_ruby - - - include - #escaped_char - - - - - comment - Needs higher precidence than regular expressions. - match - (?<!\()/= - name - keyword.operator.assignment.augmented.ruby - - - begin - ' - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - comment - single quoted string (does not allow interpolation) - end - ' - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.quoted.single.ruby - patterns - - - match - \\'|\\\\ - name - constant.character.escape.ruby - - - - - begin - " - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - comment - double quoted string (allows for interpolation) - end - " - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.quoted.double.ruby - patterns - - - include - #interpolated_ruby - - - include - #escaped_char - - - - - begin - ` - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - comment - execute string (allows for interpolation) - end - ` - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.interpolated.ruby - patterns - - - include - #interpolated_ruby - - - include - #escaped_char - - - - - include - #percent_literals - - - begin - (?x) - (?: - ^ # beginning of line - | (?<= # or look-behind on: - [=>~(?:\[,|&;] - | [\s;]if\s # keywords - | [\s;]elsif\s - | [\s;]while\s - | [\s;]unless\s - | [\s;]when\s - | [\s;]assert_match\s - | [\s;]or\s # boolean opperators - | [\s;]and\s - | [\s;]not\s - | [\s.]index\s # methods - | [\s.]scan\s - | [\s.]sub\s - | [\s.]sub!\s - | [\s.]gsub\s - | [\s.]gsub!\s - | [\s.]match\s - ) - | (?<= # or a look-behind with line anchor: - ^when\s # duplication necessary due to limits of regex - | ^if\s - | ^elsif\s - | ^while\s - | ^unless\s - ) - ) - \s*((/))(?![*+{}?]) - - captures - - 1 - - name - string.regexp.classic.ruby - - 2 - - name - punctuation.definition.string.ruby - - - comment - regular expressions (normal) - we only start a regexp if the character before it (excluding whitespace) - is what we think is before a regexp - - contentName - string.regexp.classic.ruby - end - ((/[eimnosux]*)) - patterns - - - include - #regex_sub - - - - - captures - - 1 - - name - punctuation.definition.constant.ruby - - - comment - symbols - match - (?<!:)(:)(?>[a-zA-Z_]\w*(?>[?!]|=(?![>=]))?|===?|>[>=]?|<[<=]?|<=>|[%&`/\|]|\*\*?|=?~|[-+]@?|\[\]=?|@@?[a-zA-Z_]\w*) - name - constant.other.symbol.ruby - - - begin - ^=begin - captures - - 0 - - name - punctuation.definition.comment.ruby - - - comment - multiline comments - end - ^=end - name - comment.block.documentation.ruby - - - begin - (^[ \t]+)?(?=#) - beginCaptures - - 1 - - name - punctuation.whitespace.comment.leading.ruby - - - end - (?!\G) - patterns - - - begin - # - beginCaptures - - 0 - - name - punctuation.definition.comment.ruby - - - end - \n - name - comment.line.number-sign.ruby - - - - - comment - - matches questionmark-letters. - - examples (1st alternation = hex): - ?\x1 ?\x61 - - examples (2nd alternation = octal): - ?\0 ?\07 ?\017 - - examples (3rd alternation = escaped): - ?\n ?\b - - examples (4th alternation = meta-ctrl): - ?\C-a ?\M-a ?\C-\M-\C-\M-a - - examples (4th alternation = normal): - ?a ?A ?0 - ?* ?" ?( - ?. ?# - - - the negative lookbehind prevents against matching - p(42.tainted?) - - match - (?<!\w)\?(\\(x\h{1,2}(?!\h)\b|0[0-7]{0,2}(?![0-7])\b|[^x0MC])|(\\[MC]-)+\w|[^\s\\]) - name - constant.numeric.ruby - - - begin - ^__END__\n - captures - - 0 - - name - string.unquoted.program-block.ruby - - - comment - __END__ marker - contentName - text.plain - end - (?=not)impossible - patterns - - - begin - (?=<?xml|<(?i:html\b)|!DOCTYPE (?i:html\b)) - end - (?=not)impossible - name - text.html.embedded.ruby - patterns - - - include - text.html.basic - - - - - - - begin - (?=(?><<[-~]("?)((?:[_\w]+_|)HTML)\b\1)) - comment - Heredoc with embedded html - end - (?!\G) - name - meta.embedded.block.html - patterns - - - begin - (?><<[-~]("?)((?:[_\w]+_|)HTML)\b\1) - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - contentName - text.html - end - \s*\2$\n? - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.unquoted.heredoc.ruby - patterns - - - include - #heredoc - - - include - #interpolated_ruby - - - include - text.html.basic - - - include - #escaped_char - - - - - - - begin - (?=(?><<[-~]("?)((?:[_\w]+_|)SQL)\b\1)) - comment - Heredoc with embedded sql - end - (?!\G) - name - meta.embedded.block.sql - patterns - - - begin - (?><<[-~]("?)((?:[_\w]+_|)SQL)\b\1) - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - contentName - source.sql - end - \s*\2$\n? - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.unquoted.heredoc.ruby - patterns - - - include - #heredoc - - - include - #interpolated_ruby - - - include - source.sql - - - include - #escaped_char - - - - - - - begin - (?=(?><<[-~]("?)((?:[_\w]+_|)CSS)\b\1)) - comment - Heredoc with embedded css - end - (?!\G) - name - meta.embedded.block.css - patterns - - - begin - (?><<[-~]("?)((?:[_\w]+_|)CSS)\b\1) - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - contentName - source.css - end - \s*\2$\n? - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.unquoted.heredoc.ruby - patterns - - - include - #heredoc - - - include - #interpolated_ruby - - - include - source.css - - - include - #escaped_char - - - - - - - begin - (?=(?><<[-~]("?)((?:[_\w]+_|)CPP)\b\1)) - comment - Heredoc with embedded c++ - end - (?!\G) - name - meta.embedded.block.cpp - patterns - - - begin - (?><<[-~]("?)((?:[_\w]+_|)CPP)\b\1) - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - contentName - source.cpp - end - \s*\2$\n? - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.unquoted.heredoc.ruby - patterns - - - include - #heredoc - - - include - #interpolated_ruby - - - include - source.cpp - - - include - #escaped_char - - - - - - - begin - (?=(?><<[-~]("?)((?:[_\w]+_|)C)\b\1)) - comment - Heredoc with embedded c - end - (?!\G) - name - meta.embedded.block.c - patterns - - - begin - (?><<[-~]("?)((?:[_\w]+_|)C)\b\1) - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - contentName - source.c - end - \s*\2$\n? - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.unquoted.heredoc.ruby - patterns - - - include - #heredoc - - - include - #interpolated_ruby - - - include - source.c - - - include - #escaped_char - - - - - - - begin - (?=(?><<[-~]("?)((?:[_\w]+_|)(?:JS|JAVASCRIPT))\b\1)) - comment - Heredoc with embedded javascript - end - (?!\G) - name - meta.embedded.block.js - patterns - - - begin - (?><<[-~]("?)((?:[_\w]+_|)(?:JS|JAVASCRIPT))\b\1) - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - contentName - source.js - end - \s*\2$\n? - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.unquoted.heredoc.ruby - patterns - - - include - #heredoc - - - include - #interpolated_ruby - - - include - source.js - - - include - #escaped_char - - - - - - - begin - (?=(?><<[-~]("?)((?:[_\w]+_|)JQUERY)\b\1)) - comment - Heredoc with embedded jQuery javascript - end - (?!\G) - name - meta.embedded.block.js.jquery - patterns - - - begin - (?><<[-~]("?)((?:[_\w]+_|)JQUERY)\b\1) - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - contentName - source.js.jquery - end - \s*\2$\n? - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.unquoted.heredoc.ruby - patterns - - - include - #heredoc - - - include - #interpolated_ruby - - - include - source.js.jquery - - - include - #escaped_char - - - - - - - begin - (?=(?><<[-~]("?)((?:[_\w]+_|)(?:SH|SHELL))\b\1)) - comment - Heredoc with embedded shell - end - (?!\G) - name - meta.embedded.block.shell - patterns - - - begin - (?><<[-~]("?)((?:[_\w]+_|)(?:SH|SHELL))\b\1) - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - contentName - source.shell - end - \s*\2$\n? - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.unquoted.heredoc.ruby - patterns - - - include - #heredoc - - - include - #interpolated_ruby - - - include - source.shell - - - include - #escaped_char - - - - - - - begin - (?=(?><<[-~]("?)((?:[_\w]+_|)LUA)\b\1)) - comment - Heredoc with embedded lua - end - (?!\G) - name - meta.embedded.block.lua - patterns - - - begin - (?><<[-~]("?)((?:[_\w]+_|)LUA)\b\1) - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - contentName - source.lua - end - \s*\2$\n? - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.unquoted.heredoc.ruby - patterns - - - include - #heredoc - - - include - #interpolated_ruby - - - include - source.lua - - - include - #escaped_char - - - - - - - begin - (?=(?><<[-~]("?)((?:[_\w]+_|)RUBY)\b\1)) - comment - Heredoc with embedded ruby - end - (?!\G) - name - meta.embedded.block.ruby - patterns - - - begin - (?><<[-~]("?)((?:[_\w]+_|)RUBY)\b\1) - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - contentName - source.ruby - end - \s*\2$\n? - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.unquoted.heredoc.ruby - patterns - - - include - #heredoc - - - include - #interpolated_ruby - - - include - source.ruby - - - include - #escaped_char - - - - - - - begin - (?>\=\s*<<(\w+)) - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - end - ^\1$ - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.unquoted.heredoc.ruby - patterns - - - include - #heredoc - - - include - #interpolated_ruby - - - include - #escaped_char - - - - - begin - (?><<[-~](\w+)) - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - comment - heredoc with indented terminator - end - \s*\1$ - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.unquoted.heredoc.ruby - patterns - - - include - #heredoc - - - include - #interpolated_ruby - - - include - #escaped_char - - - - - begin - (?<=\{|do|\{\s|do\s)(\|) - captures - - 1 - - name - punctuation.separator.variable.ruby - - - end - (\|) - patterns - - - match - [_a-zA-Z][_a-zA-Z0-9]* - name - variable.other.block.ruby - - - match - , - name - punctuation.separator.variable.ruby - - - - - match - => - name - punctuation.separator.key-value - - - match - <<=|%=|&=|\*=|\*\*=|\+=|\-=|\^=|\|{1,2}=|<< - name - keyword.operator.assignment.augmented.ruby - - - match - <=>|<(?!<|=)|>(?!<|=|>)|<=|>=|===|==|=~|!=|!~|(?<=[ \t])\? - name - keyword.operator.comparison.ruby - - - match - (?<=[ \t])!+|\bnot\b|&&|\band\b|\|\||\bor\b|\^ - name - keyword.operator.logical.ruby - - - match - (%|&|\*\*|\*|\+|\-|/) - name - keyword.operator.arithmetic.ruby - - - match - = - name - keyword.operator.assignment.ruby - - - match - \||~|>> - name - keyword.operator.other.ruby - - - match - : - name - punctuation.separator.other.ruby - - - match - \; - name - punctuation.separator.statement.ruby - - - match - , - name - punctuation.separator.object.ruby - - - match - \.|:: - name - punctuation.separator.method.ruby - - - match - \{ - name - punctuation.section.scope.begin.ruby - - - match - \} - name - punctuation.section.scope.end.ruby - - - match - \[ - name - punctuation.section.array.begin.ruby - - - match - \] - name - punctuation.section.array.end.ruby - - - match - \(|\) - name - punctuation.section.function.ruby - - - repository - - escaped_char - - match - \\(?:[0-7]{1,3}|x[\da-fA-F]{1,2}|.) - name - constant.character.escape.ruby - - heredoc - - begin - ^<<[-~]?\w+ - end - $ - patterns - - - include - $self - - - - interpolated_ruby - - patterns - - - begin - #\{ - beginCaptures - - 0 - - name - punctuation.section.embedded.begin.ruby - - - contentName - source.ruby - end - (\}) - endCaptures - - 0 - - name - punctuation.section.embedded.end.ruby - - 1 - - name - source.ruby - - - name - meta.embedded.line.ruby - patterns - - - include - #nest_curly_and_self - - - include - $self - - - repository - - nest_curly_and_self - - patterns - - - begin - \{ - captures - - 0 - - name - punctuation.section.scope.ruby - - - end - \} - patterns - - - include - #nest_curly_and_self - - - - - include - $self - - - - - - - captures - - 1 - - name - punctuation.definition.variable.ruby - - - match - (#@)[a-zA-Z_]\w* - name - variable.other.readwrite.instance.ruby - - - captures - - 1 - - name - punctuation.definition.variable.ruby - - - match - (#@@)[a-zA-Z_]\w* - name - variable.other.readwrite.class.ruby - - - captures - - 1 - - name - punctuation.definition.variable.ruby - - - match - (#\$)[a-zA-Z_]\w* - name - variable.other.readwrite.global.ruby - - - - percent_literals - - patterns - - - begin - %i(?:([(\[{<])|([^\w\s]|_)) - beginCaptures - - 0 - - name - punctuation.section.array.begin.ruby - - - end - [)\]}>]|\1\2 - endCaptures - - 0 - - name - punctuation.section.array.end.ruby - - - name - meta.array.symbol.ruby - patterns - - - begin - \G(?<=\()(?!\)) - end - (?=\)) - patterns - - - include - #parens - - - include - #symbol - - - - - begin - \G(?<=\[)(?!\]) - end - (?=\]) - patterns - - - include - #brackets - - - include - #symbol - - - - - begin - \G(?<=\{)(?!\}) - end - (?=\}) - patterns - - - include - #braces - - - include - #symbol - - - - - begin - \G(?<=<)(?!>) - end - (?=>) - patterns - - - include - #angles - - - include - #symbol - - - - - include - #symbol - - - repository - - angles - - patterns - - - captures - - 0 - - name - constant.character.escape.ruby - - - match - \\<|\\> - name - constant.other.symbol.ruby - - - begin - < - captures - - 0 - - name - constant.other.symbol.ruby - - - end - > - patterns - - - include - #angles - - - include - #symbol - - - - - - braces - - patterns - - - captures - - 0 - - name - constant.character.escape.ruby - - - match - \\\{|\\\} - name - constant.other.symbol.ruby - - - begin - \{ - captures - - 0 - - name - constant.other.symbol.ruby - - - end - \} - patterns - - - include - #braces - - - include - #symbol - - - - - - brackets - - patterns - - - captures - - 0 - - name - constant.character.escape.ruby - - - match - \\\[|\\\] - name - constant.other.symbol.ruby - - - begin - \[ - captures - - 0 - - name - constant.other.symbol.ruby - - - end - \] - patterns - - - include - #brackets - - - include - #symbol - - - - - - parens - - patterns - - - captures - - 0 - - name - constant.character.escape.ruby - - - match - \\\(|\\\) - name - constant.other.symbol.ruby - - - begin - \( - captures - - 0 - - name - constant.other.symbol.ruby - - - end - \) - patterns - - - include - #parens - - - include - #symbol - - - - - - symbol - - patterns - - - captures - - 0 - - name - constant.character.escape.ruby - - - match - \\\\|\\[ ] - name - constant.other.symbol.ruby - - - match - \S\w* - name - constant.other.symbol.ruby - - - - - - - begin - %I(?:([(\[{<])|([^\w\s]|_)) - beginCaptures - - 0 - - name - punctuation.section.array.begin.ruby - - - end - [)\]}>]|\1\2 - endCaptures - - 0 - - name - punctuation.section.array.end.ruby - - - name - meta.array.symbol.interpolated.ruby - patterns - - - begin - \G(?<=\()(?!\)) - end - (?=\)) - patterns - - - include - #parens - - - include - #symbol - - - - - begin - \G(?<=\[)(?!\]) - end - (?=\]) - patterns - - - include - #brackets - - - include - #symbol - - - - - begin - \G(?<=\{)(?!\}) - end - (?=\}) - patterns - - - include - #braces - - - include - #symbol - - - - - begin - \G(?<=<)(?!>) - end - (?=>) - patterns - - - include - #angles - - - include - #symbol - - - - - include - #symbol - - - repository - - angles - - patterns - - - begin - < - captures - - 0 - - name - constant.other.symbol.ruby - - - end - > - patterns - - - include - #angles - - - include - #symbol - - - - - - braces - - patterns - - - begin - \{ - captures - - 0 - - name - constant.other.symbol.ruby - - - end - \} - patterns - - - include - #braces - - - include - #symbol - - - - - - brackets - - patterns - - - begin - \[ - captures - - 0 - - name - constant.other.symbol.ruby - - - end - \] - patterns - - - include - #brackets - - - include - #symbol - - - - - - parens - - patterns - - - begin - \( - captures - - 0 - - name - constant.other.symbol.ruby - - - end - \) - patterns - - - include - #parens - - - include - #symbol - - - - - - symbol - - patterns - - - begin - (?=\\|#\{) - end - (?!\G) - name - constant.other.symbol.ruby - patterns - - - include - #escaped_char - - - include - #interpolated_ruby - - - - - match - \S\w* - name - constant.other.symbol.ruby - - - - - - - begin - %q(?:([(\[{<])|([^\w\s]|_)) - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - end - [)\]}>]|\1\2 - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.quoted.other.ruby - patterns - - - begin - \G(?<=\()(?!\)) - end - (?=\)) - patterns - - - include - #parens - - - - - begin - \G(?<=\[)(?!\]) - end - (?=\]) - patterns - - - include - #brackets - - - - - begin - \G(?<=\{)(?!\}) - end - (?=\}) - patterns - - - include - #braces - - - - - begin - \G(?<=<)(?!>) - end - (?=>) - patterns - - - include - #angles - - - - - repository - - angles - - patterns - - - match - \\<|\\>|\\\\ - name - constant.character.escape.ruby - - - begin - < - end - > - patterns - - - include - #angles - - - - - - braces - - patterns - - - match - \\\{|\\\}|\\\\ - name - constant.character.escape.ruby - - - begin - \{ - end - \} - patterns - - - include - #braces - - - - - - brackets - - patterns - - - match - \\\[|\\\]|\\\\ - name - constant.character.escape.ruby - - - begin - \[ - end - \] - patterns - - - include - #brackets - - - - - - parens - - patterns - - - match - \\\(|\\\)|\\\\ - name - constant.character.escape.ruby - - - begin - \( - end - \) - patterns - - - include - #parens - - - - - - - - - begin - %Q?(?:([(\[{<])|([^\w\s]|_)) - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - end - [)\]}>]|\1\2 - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.quoted.other.interpolated.ruby - patterns - - - begin - \G(?<=\()(?!\)) - end - (?=\)) - patterns - - - include - #parens - - - - - begin - \G(?<=\[)(?!\]) - end - (?=\]) - patterns - - - include - #brackets - - - - - begin - \G(?<=\{)(?!\}) - end - (?=\}) - patterns - - - include - #braces - - - - - begin - \G(?<=<)(?!>) - end - (?=>) - patterns - - - include - #angles - - - - - include - #escaped_char - - - include - #interpolated_ruby - - - repository - - angles - - patterns - - - include - #escaped_char - - - include - #interpolated_ruby - - - begin - < - end - > - patterns - - - include - #angles - - - - - - braces - - patterns - - - include - #escaped_char - - - include - #interpolated_ruby - - - begin - \{ - end - \} - patterns - - - include - #braces - - - - - - brackets - - patterns - - - include - #escaped_char - - - include - #interpolated_ruby - - - begin - \[ - end - \] - patterns - - - include - #brackets - - - - - - parens - - patterns - - - include - #escaped_char - - - include - #interpolated_ruby - - - begin - \( - end - \) - patterns - - - include - #parens - - - - - - - - - begin - %r(?:([(\[{<])|([^\w\s]|_)) - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - end - ([)\]}>]|\1\2)[eimnosux]* - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.regexp.percent.ruby - patterns - - - begin - \G(?<=\()(?!\)) - end - (?=\)) - patterns - - - include - #parens - - - - - begin - \G(?<=\[)(?!\]) - end - (?=\]) - patterns - - - include - #brackets - - - - - begin - \G(?<=\{)(?!\}) - end - (?=\}) - patterns - - - include - #braces - - - - - begin - \G(?<=<)(?!>) - end - (?=>) - patterns - - - include - #angles - - - - - include - #regex_sub - - - repository - - angles - - patterns - - - include - #regex_sub - - - begin - < - end - > - patterns - - - include - #angles - - - - - - braces - - patterns - - - include - #regex_sub - - - begin - \{ - end - \} - patterns - - - include - #braces - - - - - - brackets - - patterns - - - include - #regex_sub - - - begin - \[ - end - \] - patterns - - - include - #brackets - - - - - - parens - - patterns - - - include - #regex_sub - - - begin - \( - end - \) - patterns - - - include - #parens - - - - - - - - - begin - %s(?:([(\[{<])|([^\w\s]|_)) - beginCaptures - - 0 - - name - punctuation.definition.constant.begin.ruby - - - end - [)\]}>]|\1\2 - endCaptures - - 0 - - name - punctuation.definition.constant.end.ruby - - - name - constant.other.symbol.percent.ruby - patterns - - - begin - \G(?<=\()(?!\)) - end - (?=\)) - patterns - - - include - #parens - - - - - begin - \G(?<=\[)(?!\]) - end - (?=\]) - patterns - - - include - #brackets - - - - - begin - \G(?<=\{)(?!\}) - end - (?=\}) - patterns - - - include - #braces - - - - - begin - \G(?<=<)(?!>) - end - (?=>) - patterns - - - include - #angles - - - - - repository - - angles - - patterns - - - match - \\<|\\>|\\\\ - name - constant.character.escape.ruby - - - begin - < - end - > - patterns - - - include - #angles - - - - - - braces - - patterns - - - match - \\\{|\\\}|\\\\ - name - constant.character.escape.ruby - - - begin - \{ - end - \} - patterns - - - include - #braces - - - - - - brackets - - patterns - - - match - \\\[|\\\]|\\\\ - name - constant.character.escape.ruby - - - begin - \[ - end - \] - patterns - - - include - #brackets - - - - - - parens - - patterns - - - match - \\\(|\\\)|\\\\ - name - constant.character.escape.ruby - - - begin - \( - end - \) - patterns - - - include - #parens - - - - - - - - - begin - %w(?:([(\[{<])|([^\w\s]|_)) - beginCaptures - - 0 - - name - punctuation.section.array.begin.ruby - - - end - [)\]}>]|\1\2 - endCaptures - - 0 - - name - punctuation.section.array.end.ruby - - - name - meta.array.string.ruby - patterns - - - begin - \G(?<=\()(?!\)) - end - (?=\)) - patterns - - - include - #parens - - - include - #string - - - - - begin - \G(?<=\[)(?!\]) - end - (?=\]) - patterns - - - include - #brackets - - - include - #string - - - - - begin - \G(?<=\{)(?!\}) - end - (?=\}) - patterns - - - include - #braces - - - include - #string - - - - - begin - \G(?<=<)(?!>) - end - (?=>) - patterns - - - include - #angles - - - include - #string - - - - - include - #string - - - repository - - angles - - patterns - - - captures - - 0 - - name - constant.character.escape.ruby - - - match - \\<|\\> - name - string.other.ruby - - - begin - < - captures - - 0 - - name - string.other.ruby - - - end - > - patterns - - - include - #angles - - - include - #string - - - - - - braces - - patterns - - - captures - - 0 - - name - constant.character.escape.ruby - - - match - \\\{|\\\} - name - string.other.ruby - - - begin - \{ - captures - - 0 - - name - string.other.ruby - - - end - \} - patterns - - - include - #braces - - - include - #string - - - - - - brackets - - patterns - - - captures - - 0 - - name - constant.character.escape.ruby - - - match - \\\[|\\\] - name - string.other.ruby - - - begin - \[ - captures - - 0 - - name - string.other.ruby - - - end - \] - patterns - - - include - #brackets - - - include - #string - - - - - - parens - - patterns - - - captures - - 0 - - name - constant.character.escape.ruby - - - match - \\\(|\\\) - name - string.other.ruby - - - begin - \( - captures - - 0 - - name - string.other.ruby - - - end - \) - patterns - - - include - #parens - - - include - #string - - - - - - string - - patterns - - - captures - - 0 - - name - constant.character.escape.ruby - - - match - \\\\|\\[ ] - name - string.other.ruby - - - match - \S\w* - name - string.other.ruby - - - - - - - begin - %W(?:([(\[{<])|([^\w\s]|_)) - beginCaptures - - 0 - - name - punctuation.section.array.begin.ruby - - - end - [)\]}>]|\1\2 - endCaptures - - 0 - - name - punctuation.section.array.end.ruby - - - name - meta.array.string.interpolated.ruby - patterns - - - begin - \G(?<=\()(?!\)) - end - (?=\)) - patterns - - - include - #parens - - - include - #string - - - - - begin - \G(?<=\[)(?!\]) - end - (?=\]) - patterns - - - include - #brackets - - - include - #string - - - - - begin - \G(?<=\{)(?!\}) - end - (?=\}) - patterns - - - include - #braces - - - include - #string - - - - - begin - \G(?<=<)(?!>) - end - (?=>) - patterns - - - include - #angles - - - include - #string - - - - - include - #string - - - repository - - angles - - patterns - - - begin - < - captures - - 0 - - name - string.other.ruby - - - end - > - patterns - - - include - #angles - - - include - #string - - - - - - braces - - patterns - - - begin - \{ - captures - - 0 - - name - string.other.ruby - - - end - \} - patterns - - - include - #braces - - - include - #string - - - - - - brackets - - patterns - - - begin - \[ - captures - - 0 - - name - string.other.ruby - - - end - \] - patterns - - - include - #brackets - - - include - #string - - - - - - parens - - patterns - - - begin - \( - captures - - 0 - - name - string.other.ruby - - - end - \) - patterns - - - include - #parens - - - include - #string - - - - - - string - - patterns - - - begin - (?=\\|#\{) - end - (?!\G) - name - string.other.ruby - patterns - - - include - #escaped_char - - - include - #interpolated_ruby - - - - - match - \S\w* - name - string.other.ruby - - - - - - - begin - %x(?:([(\[{<])|([^\w\s]|_)) - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ruby - - - end - [)\]}>]|\1\2 - endCaptures - - 0 - - name - punctuation.definition.string.end.ruby - - - name - string.interpolated.percent.ruby - patterns - - - begin - \G(?<=\()(?!\)) - end - (?=\)) - patterns - - - include - #parens - - - - - begin - \G(?<=\[)(?!\]) - end - (?=\]) - patterns - - - include - #brackets - - - - - begin - \G(?<=\{)(?!\}) - end - (?=\}) - patterns - - - include - #braces - - - - - begin - \G(?<=<)(?!>) - end - (?=>) - patterns - - - include - #angles - - - - - include - #escaped_char - - - include - #interpolated_ruby - - - repository - - angles - - patterns - - - include - #escaped_char - - - include - #interpolated_ruby - - - begin - < - end - > - patterns - - - include - #angles - - - - - - braces - - patterns - - - include - #escaped_char - - - include - #interpolated_ruby - - - begin - \{ - end - \} - patterns - - - include - #braces - - - - - - brackets - - patterns - - - include - #escaped_char - - - include - #interpolated_ruby - - - begin - \[ - end - \] - patterns - - - include - #brackets - - - - - - parens - - patterns - - - include - #escaped_char - - - include - #interpolated_ruby - - - begin - \( - end - \) - patterns - - - include - #parens - - - - - - - - - - regex_sub - - patterns - - - include - #interpolated_ruby - - - include - #escaped_char - - - captures - - 1 - - name - punctuation.definition.quantifier.begin.ruby - - 3 - - name - punctuation.definition.quantifier.end.ruby - - - match - (\{)\d+(,\d+)?(\}) - name - keyword.operator.quantifier.ruby - - - begin - \[(?:\^?\])? - beginCaptures - - 0 - - name - punctuation.definition.character-class.begin.ruby - - - end - \] - endCaptures - - 0 - - name - punctuation.definition.character-class.end.ruby - - - name - constant.other.character-class.set.ruby - patterns - - - include - #escaped_char - - - - - begin - \(\?# - beginCaptures - - 0 - - name - punctuation.definition.comment.begin.ruby - - - end - \) - endCaptures - - 0 - - name - punctuation.definition.comment.end.ruby - - - name - comment.line.number-sign.ruby - patterns - - - include - #escaped_char - - - - - begin - \( - captures - - 0 - - name - punctuation.definition.group.ruby - - - end - \) - name - meta.group.regexp.ruby - patterns - - - include - #regex_sub - - - - - begin - (?<=^|\s)(#)\s(?=[[a-zA-Z0-9,. \t?!-][^\x{00}-\x{7F}]]*$) - beginCaptures - - 1 - - name - punctuation.definition.comment.ruby - - - comment - We are restrictive in what we allow to go after the comment character to avoid false positives, since the availability of comments depend on regexp flags. - end - $\n? - name - comment.line.number-sign.ruby - - - - - scopeName - source.ruby - uuid - E00B62AC-6B1C-11D9-9B1F-000D93589AF6 - - - diff --git a/extensions/ruby/syntaxes/ruby.tmLanguage.json b/extensions/ruby/syntaxes/ruby.tmLanguage.json new file mode 100644 index 00000000000..dce58f758b1 --- /dev/null +++ b/extensions/ruby/syntaxes/ruby.tmLanguage.json @@ -0,0 +1,2728 @@ +{ + "comment": "\n\tTODO: unresolved issues\n\n\ttext:\n\t\"p <[a-zA-Z_]\\w*(?>[?!])?)(:)(?!:)", + "name": "constant.other.symbol.hashkey.ruby" + }, + { + "captures": { + "1": { + "name": "punctuation.definition.constant.ruby" + } + }, + "comment": "symbols as hash key (1.8 syntax)", + "match": "(?[a-zA-Z_]\\w*(?>[?!])?)(?=\\s*=>)", + "name": "constant.other.symbol.hashkey.ruby" + }, + { + "comment": "everything being a reserved word, not a value and needing a 'end' is a..", + "match": "(?|_|\\*|\\$|\\?|:|\"|-[0adFiIlpvw])", + "name": "variable.other.readwrite.global.pre-defined.ruby" + }, + { + "begin": "\\b(ENV)\\[", + "beginCaptures": { + "1": { + "name": "variable.other.constant.ruby" + } + }, + "end": "\\]", + "name": "meta.environment-variable.ruby", + "patterns": [ + { + "include": "$self" + } + ] + }, + { + "match": "\\b[A-Z]\\w*(?=((\\.|::)[A-Za-z]|\\[))", + "name": "support.class.ruby" + }, + { + "match": "\\b(abort|at_exit|autoload[?]?|binding|callcc|caller|caller_locations|chomp|chop|eval|exec|exit|exit!|fork|format|gets|global_variables|gsub|lambda|load|local_variables|open|p|print|printf|proc|putc|puts|rand|readline|readlines|select|set_trace_func|sleep|spawn|sprintf|srand|sub|syscall|system|test|trace_var|trap|untrace_var|warn)(\\b|(?<=[?!]))(?![?!])", + "name": "support.function.kernel.ruby" + }, + { + "match": "\\b[A-Z]\\w*\\b", + "name": "variable.other.constant.ruby" + }, + { + "begin": "(?x)\n\t\t\t (?=def\\b) # an optimization to help Oniguruma fail fast\n\t\t\t (?<=^|\\s)(def)\\s+ # the def keyword\n\t\t\t ( (?>[a-zA-Z_]\\w*(?>\\.|::))? # a method name prefix\n\t\t\t (?>[a-zA-Z_]\\w*(?>[?!]|=(?!>))? # the method name\n\t\t\t |===?|!=|!~|>[>=]?|<=>|<[<=]?|[%&`/\\|^]|\\*\\*?|=?~|[-+]@?|\\[\\]=?) ) # …or an operator method\n\t\t\t \\s*(\\() # the openning parenthesis for arguments\n\t\t\t ", + "beginCaptures": { + "1": { + "name": "keyword.control.def.ruby" + }, + "2": { + "name": "entity.name.function.ruby" + }, + "3": { + "name": "punctuation.definition.parameters.ruby" + } + }, + "comment": "the method pattern comes from the symbol pattern, see there for a explaination", + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.parameters.ruby" + } + }, + "name": "meta.function.method.with-arguments.ruby", + "patterns": [ + { + "begin": "(?=[&*_a-zA-Z])", + "end": "(?=[,)])", + "patterns": [ + { + "captures": { + "1": { + "name": "storage.type.variable.ruby" + }, + "2": { + "name": "constant.other.symbol.hashkey.parameter.function.ruby" + }, + "3": { + "name": "punctuation.definition.constant.ruby" + }, + "4": { + "name": "variable.parameter.function.ruby" + } + }, + "match": "\\G([&*]?)(?:([_a-zA-Z]\\w*(:))|([_a-zA-Z]\\w*))" + }, + { + "begin": "\\(", + "captures": { + "0": { + "name": "punctuation.section.function.ruby" + } + }, + "comment": "Prevent end pattern of parent rule from ending prematurely.", + "end": "\\)", + "patterns": [ + { + "include": "$self" + } + ] + }, + { + "include": "$self" + } + ] + } + ] + }, + { + "begin": "(?x)\n\t\t\t (?=def\\b) # an optimization to help Oniguruma fail fast\n\t\t\t (?<=^|\\s)(def)\\s+ # the def keyword\n\t\t\t ( (?>[a-zA-Z_]\\w*(?>\\.|::))? # a method name prefix\n\t\t\t (?>[a-zA-Z_]\\w*(?>[?!]|=(?!>))? # the method name\n\t\t\t |===?|!=|!~|>[>=]?|<=>|<[<=]?|[%&`/\\|^]|\\*\\*?|=?~|[-+]@?|\\[\\]=?) ) # …or an operator method\n\t\t\t [ \\t] # the space separating the arguments\n\t\t\t (?=[ \\t]*[^\\s#;]) # make sure arguments and not a comment follow\n\t\t\t ", + "beginCaptures": { + "1": { + "name": "keyword.control.def.ruby" + }, + "2": { + "name": "entity.name.function.ruby" + } + }, + "comment": "same as the previous rule, but without parentheses around the arguments", + "end": "$", + "name": "meta.function.method.with-arguments.ruby", + "patterns": [ + { + "begin": "(?![\\s,])", + "end": "(?=,|$)", + "patterns": [ + { + "captures": { + "1": { + "name": "storage.type.variable.ruby" + }, + "2": { + "name": "constant.other.symbol.hashkey.parameter.function.ruby" + }, + "3": { + "name": "punctuation.definition.constant.ruby" + }, + "4": { + "name": "variable.parameter.function.ruby" + } + }, + "match": "\\G([&*]?)(?:([_a-zA-Z]\\w*(:))|([_a-zA-Z]\\w*))", + "name": "variable.parameter.function.ruby" + }, + { + "include": "$self" + } + ] + } + ] + }, + { + "captures": { + "1": { + "name": "keyword.control.def.ruby" + }, + "3": { + "name": "entity.name.function.ruby" + } + }, + "comment": " the optional name is just to catch the def also without a method-name", + "match": "(?x)\n\t\t\t (?=def\\b) # an optimization to help Oniguruma fail fast\n\t\t\t (?<=^|\\s)(def)\\b # the def keyword\n\t\t\t ( \\s+ # an optional group of whitespace followed by…\n\t\t\t ( (?>[a-zA-Z_]\\w*(?>\\.|::))? # a method name prefix\n\t\t\t (?>[a-zA-Z_]\\w*(?>[?!]|=(?!>))? # the method name\n\t\t\t |===?|!=|!~|>[>=]?|<=>|<[<=]?|[%&`/\\|^]|\\*\\*?|=?~|[-+]@?|\\[\\]=?) ) )? # …or an operator method\n\t\t\t ", + "name": "meta.function.method.without-arguments.ruby" + }, + { + "match": "\\b\\d(?>_?\\d)*(?=\\.\\d|[eE])(\\.\\d(?>_?\\d)*)?([eE][-+]?\\d(?>_?\\d)*)?r?i?\\b", + "name": "constant.numeric.float.ruby" + }, + { + "match": "\\b(0[dD]\\d|[1-9])(?>_?\\d)*r?i?\\b", + "name": "constant.numeric.integer.ruby" + }, + { + "match": "\\b0[xX]\\h(?>_?\\h)*r?i?\\b", + "name": "constant.numeric.hex.ruby" + }, + { + "match": "\\b0[bB][01](?>_?[01])*r?i?\\b", + "name": "constant.numeric.binary.ruby" + }, + { + "match": "\\b0([oO]?[0-7](?>_?[0-7])*)?r?i?\\b", + "name": "constant.numeric.octal.ruby" + }, + { + "begin": ":'", + "captures": { + "0": { + "name": "punctuation.definition.constant.ruby" + } + }, + "end": "'", + "name": "constant.other.symbol.single-quoted.ruby", + "patterns": [ + { + "match": "\\\\['\\\\]", + "name": "constant.character.escape.ruby" + } + ] + }, + { + "begin": ":\"", + "captures": { + "0": { + "name": "punctuation.definition.constant.ruby" + } + }, + "end": "\"", + "name": "constant.other.symbol.double-quoted.ruby", + "patterns": [ + { + "include": "#interpolated_ruby" + }, + { + "include": "#escaped_char" + } + ] + }, + { + "comment": "Needs higher precidence than regular expressions.", + "match": "(?~(?:\\[,|&;]\n\t\t\t | [\\s;]if\\s\t\t\t# keywords\n\t\t\t | [\\s;]elsif\\s\n\t\t\t | [\\s;]while\\s\n\t\t\t | [\\s;]unless\\s\n\t\t\t | [\\s;]when\\s\n\t\t\t | [\\s;]assert_match\\s\n\t\t\t | [\\s;]or\\s\t\t\t# boolean opperators\n\t\t\t | [\\s;]and\\s\n\t\t\t | [\\s;]not\\s\n\t\t\t | [\\s.]index\\s\t\t\t# methods\n\t\t\t | [\\s.]scan\\s\n\t\t\t | [\\s.]sub\\s\n\t\t\t | [\\s.]sub!\\s\n\t\t\t | [\\s.]gsub\\s\n\t\t\t | [\\s.]gsub!\\s\n\t\t\t | [\\s.]match\\s\n\t\t\t )\n\t\t\t | (?<= # or a look-behind with line anchor:\n\t\t\t ^when\\s # duplication necessary due to limits of regex\n\t\t\t | ^if\\s\n\t\t\t | ^elsif\\s\n\t\t\t | ^while\\s\n\t\t\t | ^unless\\s\n\t\t\t )\n\t\t\t )\n\t\t\t \\s*((/))(?![*+{}?])\n\t\t\t", + "captures": { + "1": { + "name": "string.regexp.classic.ruby" + }, + "2": { + "name": "punctuation.definition.string.ruby" + } + }, + "comment": "regular expressions (normal)\n\t\t\twe only start a regexp if the character before it (excluding whitespace)\n\t\t\tis what we think is before a regexp\n\t\t\t", + "contentName": "string.regexp.classic.ruby", + "end": "((/[eimnosux]*))", + "patterns": [ + { + "include": "#regex_sub" + } + ] + }, + { + "captures": { + "1": { + "name": "punctuation.definition.constant.ruby" + } + }, + "comment": "symbols", + "match": "(?[a-zA-Z_]\\w*(?>[?!]|=(?![>=]))?|===?|>[>=]?|<=>|<[<=]?|[%&`/\\|]|\\*\\*?|=?~|[-+]@?|\\[\\]=?|(@@?|\\$)[a-zA-Z_]\\w*)", + "name": "constant.other.symbol.ruby" + }, + { + "begin": "^=begin", + "captures": { + "0": { + "name": "punctuation.definition.comment.ruby" + } + }, + "comment": "multiline comments", + "end": "^=end", + "name": "comment.block.documentation.ruby" + }, + { + "begin": "(^[ \\t]+)?(?=#)", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.comment.leading.ruby" + } + }, + "end": "(?!\\G)", + "patterns": [ + { + "begin": "#", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.ruby" + } + }, + "end": "\\n", + "name": "comment.line.number-sign.ruby" + } + ] + }, + { + "comment": "\n\t\t\tmatches questionmark-letters.\n\n\t\t\texamples (1st alternation = hex):\n\t\t\t?\\x1 ?\\x61\n\n\t\t\texamples (2nd alternation = octal):\n\t\t\t?\\0 ?\\07 ?\\017\n\n\t\t\texamples (3rd alternation = escaped):\n\t\t\t?\\n ?\\b\n\n\t\t\texamples (4th alternation = meta-ctrl):\n\t\t\t?\\C-a ?\\M-a ?\\C-\\M-\\C-\\M-a\n\n\t\t\texamples (4th alternation = normal):\n\t\t\t?a ?A ?0 \n\t\t\t?* ?\" ?( \n\t\t\t?. ?#\n\t\t\t\n\t\t\t\n\t\t\tthe negative lookbehind prevents against matching\n\t\t\tp(42.tainted?)\n\t\t\t", + "match": "(?<<[-~](\"?)((?:[_\\w]+_|)HTML)\\b\\1))", + "comment": "Heredoc with embedded html", + "end": "(?!\\G)", + "name": "meta.embedded.block.html", + "patterns": [ + { + "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)HTML)\\b\\1)", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ruby" + } + }, + "contentName": "text.html", + "end": "\\s*\\2$\\n?", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ruby" + } + }, + "name": "string.unquoted.heredoc.ruby", + "patterns": [ + { + "include": "#heredoc" + }, + { + "include": "#interpolated_ruby" + }, + { + "include": "text.html.basic" + }, + { + "include": "#escaped_char" + } + ] + } + ] + }, + { + "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)SQL)\\b\\1))", + "comment": "Heredoc with embedded sql", + "end": "(?!\\G)", + "name": "meta.embedded.block.sql", + "patterns": [ + { + "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)SQL)\\b\\1)", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ruby" + } + }, + "contentName": "source.sql", + "end": "\\s*\\2$\\n?", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ruby" + } + }, + "name": "string.unquoted.heredoc.ruby", + "patterns": [ + { + "include": "#heredoc" + }, + { + "include": "#interpolated_ruby" + }, + { + "include": "source.sql" + }, + { + "include": "#escaped_char" + } + ] + } + ] + }, + { + "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)CSS)\\b\\1))", + "comment": "Heredoc with embedded css", + "end": "(?!\\G)", + "name": "meta.embedded.block.css", + "patterns": [ + { + "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)CSS)\\b\\1)", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ruby" + } + }, + "contentName": "source.css", + "end": "\\s*\\2$\\n?", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ruby" + } + }, + "name": "string.unquoted.heredoc.ruby", + "patterns": [ + { + "include": "#heredoc" + }, + { + "include": "#interpolated_ruby" + }, + { + "include": "source.css" + }, + { + "include": "#escaped_char" + } + ] + } + ] + }, + { + "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)CPP)\\b\\1))", + "comment": "Heredoc with embedded c++", + "end": "(?!\\G)", + "name": "meta.embedded.block.c++", + "patterns": [ + { + "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)CPP)\\b\\1)", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ruby" + } + }, + "contentName": "source.c++", + "end": "\\s*\\2$\\n?", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ruby" + } + }, + "name": "string.unquoted.heredoc.ruby", + "patterns": [ + { + "include": "#heredoc" + }, + { + "include": "#interpolated_ruby" + }, + { + "include": "source.c++" + }, + { + "include": "#escaped_char" + } + ] + } + ] + }, + { + "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)C)\\b\\1))", + "comment": "Heredoc with embedded c", + "end": "(?!\\G)", + "name": "meta.embedded.block.c", + "patterns": [ + { + "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)C)\\b\\1)", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ruby" + } + }, + "contentName": "source.c", + "end": "\\s*\\2$\\n?", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ruby" + } + }, + "name": "string.unquoted.heredoc.ruby", + "patterns": [ + { + "include": "#heredoc" + }, + { + "include": "#interpolated_ruby" + }, + { + "include": "source.c" + }, + { + "include": "#escaped_char" + } + ] + } + ] + }, + { + "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)(?:JS|JAVASCRIPT))\\b\\1))", + "comment": "Heredoc with embedded javascript", + "end": "(?!\\G)", + "name": "meta.embedded.block.js", + "patterns": [ + { + "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)(?:JS|JAVASCRIPT))\\b\\1)", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ruby" + } + }, + "contentName": "source.js", + "end": "\\s*\\2$\\n?", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ruby" + } + }, + "name": "string.unquoted.heredoc.ruby", + "patterns": [ + { + "include": "#heredoc" + }, + { + "include": "#interpolated_ruby" + }, + { + "include": "source.js" + }, + { + "include": "#escaped_char" + } + ] + } + ] + }, + { + "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)JQUERY)\\b\\1))", + "comment": "Heredoc with embedded jQuery javascript", + "end": "(?!\\G)", + "name": "meta.embedded.block.js.jquery", + "patterns": [ + { + "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)JQUERY)\\b\\1)", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ruby" + } + }, + "contentName": "source.js.jquery", + "end": "\\s*\\2$\\n?", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ruby" + } + }, + "name": "string.unquoted.heredoc.ruby", + "patterns": [ + { + "include": "#heredoc" + }, + { + "include": "#interpolated_ruby" + }, + { + "include": "source.js.jquery" + }, + { + "include": "#escaped_char" + } + ] + } + ] + }, + { + "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)(?:SH|SHELL))\\b\\1))", + "comment": "Heredoc with embedded shell", + "end": "(?!\\G)", + "name": "meta.embedded.block.shell", + "patterns": [ + { + "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)(?:SH|SHELL))\\b\\1)", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ruby" + } + }, + "contentName": "source.shell", + "end": "\\s*\\2$\\n?", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ruby" + } + }, + "name": "string.unquoted.heredoc.ruby", + "patterns": [ + { + "include": "#heredoc" + }, + { + "include": "#interpolated_ruby" + }, + { + "include": "source.shell" + }, + { + "include": "#escaped_char" + } + ] + } + ] + }, + { + "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)LUA)\\b\\1))", + "comment": "Heredoc with embedded lua", + "end": "(?!\\G)", + "name": "meta.embedded.block.lua", + "patterns": [ + { + "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)LUA)\\b\\1)", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ruby" + } + }, + "contentName": "source.lua", + "end": "\\s*\\2$\\n?", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ruby" + } + }, + "name": "string.unquoted.heredoc.ruby", + "patterns": [ + { + "include": "#heredoc" + }, + { + "include": "#interpolated_ruby" + }, + { + "include": "source.lua" + }, + { + "include": "#escaped_char" + } + ] + } + ] + }, + { + "begin": "(?=(?><<[-~](\"?)((?:[_\\w]+_|)RUBY)\\b\\1))", + "comment": "Heredoc with embedded ruby", + "end": "(?!\\G)", + "name": "meta.embedded.block.ruby", + "patterns": [ + { + "begin": "(?><<[-~](\"?)((?:[_\\w]+_|)RUBY)\\b\\1)", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ruby" + } + }, + "contentName": "source.ruby", + "end": "\\s*\\2$\\n?", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ruby" + } + }, + "name": "string.unquoted.heredoc.ruby", + "patterns": [ + { + "include": "#heredoc" + }, + { + "include": "#interpolated_ruby" + }, + { + "include": "source.ruby" + }, + { + "include": "#escaped_char" + } + ] + } + ] + }, + { + "begin": "(?>=\\s*<<(\\w+))", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ruby" + } + }, + "end": "^\\1$", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ruby" + } + }, + "name": "string.unquoted.heredoc.ruby", + "patterns": [ + { + "include": "#heredoc" + }, + { + "include": "#interpolated_ruby" + }, + { + "include": "#escaped_char" + } + ] + }, + { + "begin": "(?><<[-~](\\w+))", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ruby" + } + }, + "comment": "heredoc with indented terminator", + "end": "\\s*\\1$", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ruby" + } + }, + "name": "string.unquoted.heredoc.ruby", + "patterns": [ + { + "include": "#heredoc" + }, + { + "include": "#interpolated_ruby" + }, + { + "include": "#escaped_char" + } + ] + }, + { + "begin": "(?<=\\{|do|\\{\\s|do\\s)(\\|)", + "captures": { + "1": { + "name": "punctuation.separator.arguments.ruby" + } + }, + "end": "(?", + "name": "punctuation.separator.key-value" + }, + { + "match": "->", + "name": "support.function.kernel.lambda.ruby" + }, + { + "match": "<<=|%=|&{1,2}=|\\*=|\\*\\*=|\\+=|-=|\\^=|\\|{1,2}=|<<", + "name": "keyword.operator.assignment.augmented.ruby" + }, + { + "match": "<=>|<(?!<|=)|>(?!<|=|>)|<=|>=|===|==|=~|!=|!~|(?<=[ \\t])\\?", + "name": "keyword.operator.comparison.ruby" + }, + { + "match": "(?>", + "name": "keyword.operator.other.ruby" + }, + { + "match": ";", + "name": "punctuation.separator.statement.ruby" + }, + { + "match": ",", + "name": "punctuation.separator.object.ruby" + }, + { + "captures": { + "1": { + "name": "punctuation.separator.namespace.ruby" + } + }, + "comment": "Mark as namespace separator if double colons followed by capital letter", + "match": "(::)\\s*(?=[A-Z])" + }, + { + "captures": { + "1": { + "name": "punctuation.separator.method.ruby" + } + }, + "comment": "Mark as method separator if double colons not followed by capital letter", + "match": "(\\.|::)\\s*(?![A-Z])" + }, + { + "comment": "Must come after method and constant separators to prefer double colons", + "match": ":", + "name": "punctuation.separator.other.ruby" + }, + { + "match": "\\{", + "name": "punctuation.section.scope.begin.ruby" + }, + { + "match": "\\}", + "name": "punctuation.section.scope.end.ruby" + }, + { + "match": "\\[", + "name": "punctuation.section.array.begin.ruby" + }, + { + "match": "\\]", + "name": "punctuation.section.array.end.ruby" + }, + { + "match": "\\(|\\)", + "name": "punctuation.section.function.ruby" + } + ], + "repository": { + "escaped_char": { + "match": "\\\\(?:[0-7]{1,3}|x[\\da-fA-F]{1,2}|.)", + "name": "constant.character.escape.ruby" + }, + "heredoc": { + "begin": "^<<[-~]?\\w+", + "end": "$", + "patterns": [ + { + "include": "$self" + } + ] + }, + "interpolated_ruby": { + "patterns": [ + { + "begin": "#\\{", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.ruby" + } + }, + "contentName": "source.ruby", + "end": "(\\})", + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.ruby" + }, + "1": { + "name": "source.ruby" + } + }, + "name": "meta.embedded.line.ruby", + "patterns": [ + { + "include": "#nest_curly_and_self" + }, + { + "include": "$self" + } + ], + "repository": { + "nest_curly_and_self": { + "patterns": [ + { + "begin": "\\{", + "captures": { + "0": { + "name": "punctuation.section.scope.ruby" + } + }, + "end": "\\}", + "patterns": [ + { + "include": "#nest_curly_and_self" + } + ] + }, + { + "include": "$self" + } + ] + } + } + }, + { + "captures": { + "1": { + "name": "punctuation.definition.variable.ruby" + } + }, + "match": "(#@)[a-zA-Z_]\\w*", + "name": "variable.other.readwrite.instance.ruby" + }, + { + "captures": { + "1": { + "name": "punctuation.definition.variable.ruby" + } + }, + "match": "(#@@)[a-zA-Z_]\\w*", + "name": "variable.other.readwrite.class.ruby" + }, + { + "captures": { + "1": { + "name": "punctuation.definition.variable.ruby" + } + }, + "match": "(#\\$)[a-zA-Z_]\\w*", + "name": "variable.other.readwrite.global.ruby" + } + ] + }, + "percent_literals": { + "patterns": [ + { + "begin": "%i(?:([(\\[{<])|([^\\w\\s]|_))", + "beginCaptures": { + "0": { + "name": "punctuation.section.array.begin.ruby" + } + }, + "end": "[)\\]}>]\\2|\\1\\2", + "endCaptures": { + "0": { + "name": "punctuation.section.array.end.ruby" + } + }, + "name": "meta.array.symbol.ruby", + "patterns": [ + { + "begin": "\\G(?<=\\()(?!\\))", + "end": "(?=\\))", + "patterns": [ + { + "include": "#parens" + }, + { + "include": "#symbol" + } + ] + }, + { + "begin": "\\G(?<=\\[)(?!\\])", + "end": "(?=\\])", + "patterns": [ + { + "include": "#brackets" + }, + { + "include": "#symbol" + } + ] + }, + { + "begin": "\\G(?<=\\{)(?!\\})", + "end": "(?=\\})", + "patterns": [ + { + "include": "#braces" + }, + { + "include": "#symbol" + } + ] + }, + { + "begin": "\\G(?<=<)(?!>)", + "end": "(?=>)", + "patterns": [ + { + "include": "#angles" + }, + { + "include": "#symbol" + } + ] + }, + { + "include": "#symbol" + } + ], + "repository": { + "angles": { + "patterns": [ + { + "captures": { + "0": { + "name": "constant.character.escape.ruby" + } + }, + "match": "\\\\<|\\\\>", + "name": "constant.other.symbol.ruby" + }, + { + "begin": "<", + "captures": { + "0": { + "name": "constant.other.symbol.ruby" + } + }, + "end": ">", + "patterns": [ + { + "include": "#angles" + }, + { + "include": "#symbol" + } + ] + } + ] + }, + "braces": { + "patterns": [ + { + "captures": { + "0": { + "name": "constant.character.escape.ruby" + } + }, + "match": "\\\\\\{|\\\\\\}", + "name": "constant.other.symbol.ruby" + }, + { + "begin": "\\{", + "captures": { + "0": { + "name": "constant.other.symbol.ruby" + } + }, + "end": "\\}", + "patterns": [ + { + "include": "#braces" + }, + { + "include": "#symbol" + } + ] + } + ] + }, + "brackets": { + "patterns": [ + { + "captures": { + "0": { + "name": "constant.character.escape.ruby" + } + }, + "match": "\\\\\\[|\\\\\\]", + "name": "constant.other.symbol.ruby" + }, + { + "begin": "\\[", + "captures": { + "0": { + "name": "constant.other.symbol.ruby" + } + }, + "end": "\\]", + "patterns": [ + { + "include": "#brackets" + }, + { + "include": "#symbol" + } + ] + } + ] + }, + "parens": { + "patterns": [ + { + "captures": { + "0": { + "name": "constant.character.escape.ruby" + } + }, + "match": "\\\\\\(|\\\\\\)", + "name": "constant.other.symbol.ruby" + }, + { + "begin": "\\(", + "captures": { + "0": { + "name": "constant.other.symbol.ruby" + } + }, + "end": "\\)", + "patterns": [ + { + "include": "#parens" + }, + { + "include": "#symbol" + } + ] + } + ] + }, + "symbol": { + "patterns": [ + { + "captures": { + "0": { + "name": "constant.character.escape.ruby" + } + }, + "match": "\\\\\\\\|\\\\[ ]", + "name": "constant.other.symbol.ruby" + }, + { + "match": "\\S\\w*", + "name": "constant.other.symbol.ruby" + } + ] + } + } + }, + { + "begin": "%I(?:([(\\[{<])|([^\\w\\s]|_))", + "beginCaptures": { + "0": { + "name": "punctuation.section.array.begin.ruby" + } + }, + "end": "[)\\]}>]\\2|\\1\\2", + "endCaptures": { + "0": { + "name": "punctuation.section.array.end.ruby" + } + }, + "name": "meta.array.symbol.interpolated.ruby", + "patterns": [ + { + "begin": "\\G(?<=\\()(?!\\))", + "end": "(?=\\))", + "patterns": [ + { + "include": "#parens" + }, + { + "include": "#symbol" + } + ] + }, + { + "begin": "\\G(?<=\\[)(?!\\])", + "end": "(?=\\])", + "patterns": [ + { + "include": "#brackets" + }, + { + "include": "#symbol" + } + ] + }, + { + "begin": "\\G(?<=\\{)(?!\\})", + "end": "(?=\\})", + "patterns": [ + { + "include": "#braces" + }, + { + "include": "#symbol" + } + ] + }, + { + "begin": "\\G(?<=<)(?!>)", + "end": "(?=>)", + "patterns": [ + { + "include": "#angles" + }, + { + "include": "#symbol" + } + ] + }, + { + "include": "#symbol" + } + ], + "repository": { + "angles": { + "patterns": [ + { + "begin": "<", + "captures": { + "0": { + "name": "constant.other.symbol.ruby" + } + }, + "end": ">", + "patterns": [ + { + "include": "#angles" + }, + { + "include": "#symbol" + } + ] + } + ] + }, + "braces": { + "patterns": [ + { + "begin": "\\{", + "captures": { + "0": { + "name": "constant.other.symbol.ruby" + } + }, + "end": "\\}", + "patterns": [ + { + "include": "#braces" + }, + { + "include": "#symbol" + } + ] + } + ] + }, + "brackets": { + "patterns": [ + { + "begin": "\\[", + "captures": { + "0": { + "name": "constant.other.symbol.ruby" + } + }, + "end": "\\]", + "patterns": [ + { + "include": "#brackets" + }, + { + "include": "#symbol" + } + ] + } + ] + }, + "parens": { + "patterns": [ + { + "begin": "\\(", + "captures": { + "0": { + "name": "constant.other.symbol.ruby" + } + }, + "end": "\\)", + "patterns": [ + { + "include": "#parens" + }, + { + "include": "#symbol" + } + ] + } + ] + }, + "symbol": { + "patterns": [ + { + "begin": "(?=\\\\|#\\{)", + "end": "(?!\\G)", + "name": "constant.other.symbol.ruby", + "patterns": [ + { + "include": "#escaped_char" + }, + { + "include": "#interpolated_ruby" + } + ] + }, + { + "match": "\\S\\w*", + "name": "constant.other.symbol.ruby" + } + ] + } + } + }, + { + "begin": "%q(?:([(\\[{<])|([^\\w\\s]|_))", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ruby" + } + }, + "end": "[)\\]}>]\\2|\\1\\2", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ruby" + } + }, + "name": "string.quoted.other.ruby", + "patterns": [ + { + "begin": "\\G(?<=\\()(?!\\))", + "end": "(?=\\))", + "patterns": [ + { + "include": "#parens" + } + ] + }, + { + "begin": "\\G(?<=\\[)(?!\\])", + "end": "(?=\\])", + "patterns": [ + { + "include": "#brackets" + } + ] + }, + { + "begin": "\\G(?<=\\{)(?!\\})", + "end": "(?=\\})", + "patterns": [ + { + "include": "#braces" + } + ] + }, + { + "begin": "\\G(?<=<)(?!>)", + "end": "(?=>)", + "patterns": [ + { + "include": "#angles" + } + ] + } + ], + "repository": { + "angles": { + "patterns": [ + { + "match": "\\\\<|\\\\>|\\\\\\\\", + "name": "constant.character.escape.ruby" + }, + { + "begin": "<", + "end": ">", + "patterns": [ + { + "include": "#angles" + } + ] + } + ] + }, + "braces": { + "patterns": [ + { + "match": "\\\\\\{|\\\\\\}|\\\\\\\\", + "name": "constant.character.escape.ruby" + }, + { + "begin": "\\{", + "end": "\\}", + "patterns": [ + { + "include": "#braces" + } + ] + } + ] + }, + "brackets": { + "patterns": [ + { + "match": "\\\\\\[|\\\\\\]|\\\\\\\\", + "name": "constant.character.escape.ruby" + }, + { + "begin": "\\[", + "end": "\\]", + "patterns": [ + { + "include": "#brackets" + } + ] + } + ] + }, + "parens": { + "patterns": [ + { + "match": "\\\\\\(|\\\\\\)|\\\\\\\\", + "name": "constant.character.escape.ruby" + }, + { + "begin": "\\(", + "end": "\\)", + "patterns": [ + { + "include": "#parens" + } + ] + } + ] + } + } + }, + { + "begin": "%Q?(?:([(\\[{<])|([^\\w\\s=]|_))", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ruby" + } + }, + "end": "[)\\]}>]\\2|\\1\\2", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ruby" + } + }, + "name": "string.quoted.other.interpolated.ruby", + "patterns": [ + { + "begin": "\\G(?<=\\()(?!\\))", + "end": "(?=\\))", + "patterns": [ + { + "include": "#parens" + } + ] + }, + { + "begin": "\\G(?<=\\[)(?!\\])", + "end": "(?=\\])", + "patterns": [ + { + "include": "#brackets" + } + ] + }, + { + "begin": "\\G(?<=\\{)(?!\\})", + "end": "(?=\\})", + "patterns": [ + { + "include": "#braces" + } + ] + }, + { + "begin": "\\G(?<=<)(?!>)", + "end": "(?=>)", + "patterns": [ + { + "include": "#angles" + } + ] + }, + { + "include": "#escaped_char" + }, + { + "include": "#interpolated_ruby" + } + ], + "repository": { + "angles": { + "patterns": [ + { + "include": "#escaped_char" + }, + { + "include": "#interpolated_ruby" + }, + { + "begin": "<", + "end": ">", + "patterns": [ + { + "include": "#angles" + } + ] + } + ] + }, + "braces": { + "patterns": [ + { + "include": "#escaped_char" + }, + { + "include": "#interpolated_ruby" + }, + { + "begin": "\\{", + "end": "\\}", + "patterns": [ + { + "include": "#braces" + } + ] + } + ] + }, + "brackets": { + "patterns": [ + { + "include": "#escaped_char" + }, + { + "include": "#interpolated_ruby" + }, + { + "begin": "\\[", + "end": "\\]", + "patterns": [ + { + "include": "#brackets" + } + ] + } + ] + }, + "parens": { + "patterns": [ + { + "include": "#escaped_char" + }, + { + "include": "#interpolated_ruby" + }, + { + "begin": "\\(", + "end": "\\)", + "patterns": [ + { + "include": "#parens" + } + ] + } + ] + } + } + }, + { + "begin": "%r(?:([(\\[{<])|([^\\w\\s]|_))", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ruby" + } + }, + "end": "([)\\]}>]\\2|\\1\\2)[eimnosux]*", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ruby" + } + }, + "name": "string.regexp.percent.ruby", + "patterns": [ + { + "begin": "\\G(?<=\\()(?!\\))", + "end": "(?=\\))", + "patterns": [ + { + "include": "#parens" + } + ] + }, + { + "begin": "\\G(?<=\\[)(?!\\])", + "end": "(?=\\])", + "patterns": [ + { + "include": "#brackets" + } + ] + }, + { + "begin": "\\G(?<=\\{)(?!\\})", + "end": "(?=\\})", + "patterns": [ + { + "include": "#braces" + } + ] + }, + { + "begin": "\\G(?<=<)(?!>)", + "end": "(?=>)", + "patterns": [ + { + "include": "#angles" + } + ] + }, + { + "include": "#regex_sub" + } + ], + "repository": { + "angles": { + "patterns": [ + { + "include": "#regex_sub" + }, + { + "begin": "<", + "end": ">", + "patterns": [ + { + "include": "#angles" + } + ] + } + ] + }, + "braces": { + "patterns": [ + { + "include": "#regex_sub" + }, + { + "begin": "\\{", + "end": "\\}", + "patterns": [ + { + "include": "#braces" + } + ] + } + ] + }, + "brackets": { + "patterns": [ + { + "include": "#regex_sub" + }, + { + "begin": "\\[", + "end": "\\]", + "patterns": [ + { + "include": "#brackets" + } + ] + } + ] + }, + "parens": { + "patterns": [ + { + "include": "#regex_sub" + }, + { + "begin": "\\(", + "end": "\\)", + "patterns": [ + { + "include": "#parens" + } + ] + } + ] + } + } + }, + { + "begin": "%s(?:([(\\[{<])|([^\\w\\s]|_))", + "beginCaptures": { + "0": { + "name": "punctuation.definition.constant.begin.ruby" + } + }, + "end": "[)\\]}>]\\2|\\1\\2", + "endCaptures": { + "0": { + "name": "punctuation.definition.constant.end.ruby" + } + }, + "name": "constant.other.symbol.percent.ruby", + "patterns": [ + { + "begin": "\\G(?<=\\()(?!\\))", + "end": "(?=\\))", + "patterns": [ + { + "include": "#parens" + } + ] + }, + { + "begin": "\\G(?<=\\[)(?!\\])", + "end": "(?=\\])", + "patterns": [ + { + "include": "#brackets" + } + ] + }, + { + "begin": "\\G(?<=\\{)(?!\\})", + "end": "(?=\\})", + "patterns": [ + { + "include": "#braces" + } + ] + }, + { + "begin": "\\G(?<=<)(?!>)", + "end": "(?=>)", + "patterns": [ + { + "include": "#angles" + } + ] + } + ], + "repository": { + "angles": { + "patterns": [ + { + "match": "\\\\<|\\\\>|\\\\\\\\", + "name": "constant.character.escape.ruby" + }, + { + "begin": "<", + "end": ">", + "patterns": [ + { + "include": "#angles" + } + ] + } + ] + }, + "braces": { + "patterns": [ + { + "match": "\\\\\\{|\\\\\\}|\\\\\\\\", + "name": "constant.character.escape.ruby" + }, + { + "begin": "\\{", + "end": "\\}", + "patterns": [ + { + "include": "#braces" + } + ] + } + ] + }, + "brackets": { + "patterns": [ + { + "match": "\\\\\\[|\\\\\\]|\\\\\\\\", + "name": "constant.character.escape.ruby" + }, + { + "begin": "\\[", + "end": "\\]", + "patterns": [ + { + "include": "#brackets" + } + ] + } + ] + }, + "parens": { + "patterns": [ + { + "match": "\\\\\\(|\\\\\\)|\\\\\\\\", + "name": "constant.character.escape.ruby" + }, + { + "begin": "\\(", + "end": "\\)", + "patterns": [ + { + "include": "#parens" + } + ] + } + ] + } + } + }, + { + "begin": "%w(?:([(\\[{<])|([^\\w\\s]|_))", + "beginCaptures": { + "0": { + "name": "punctuation.section.array.begin.ruby" + } + }, + "end": "[)\\]}>]\\2|\\1\\2", + "endCaptures": { + "0": { + "name": "punctuation.section.array.end.ruby" + } + }, + "name": "meta.array.string.ruby", + "patterns": [ + { + "begin": "\\G(?<=\\()(?!\\))", + "end": "(?=\\))", + "patterns": [ + { + "include": "#parens" + }, + { + "include": "#string" + } + ] + }, + { + "begin": "\\G(?<=\\[)(?!\\])", + "end": "(?=\\])", + "patterns": [ + { + "include": "#brackets" + }, + { + "include": "#string" + } + ] + }, + { + "begin": "\\G(?<=\\{)(?!\\})", + "end": "(?=\\})", + "patterns": [ + { + "include": "#braces" + }, + { + "include": "#string" + } + ] + }, + { + "begin": "\\G(?<=<)(?!>)", + "end": "(?=>)", + "patterns": [ + { + "include": "#angles" + }, + { + "include": "#string" + } + ] + }, + { + "include": "#string" + } + ], + "repository": { + "angles": { + "patterns": [ + { + "captures": { + "0": { + "name": "constant.character.escape.ruby" + } + }, + "match": "\\\\<|\\\\>", + "name": "string.other.ruby" + }, + { + "begin": "<", + "captures": { + "0": { + "name": "string.other.ruby" + } + }, + "end": ">", + "patterns": [ + { + "include": "#angles" + }, + { + "include": "#string" + } + ] + } + ] + }, + "braces": { + "patterns": [ + { + "captures": { + "0": { + "name": "constant.character.escape.ruby" + } + }, + "match": "\\\\\\{|\\\\\\}", + "name": "string.other.ruby" + }, + { + "begin": "\\{", + "captures": { + "0": { + "name": "string.other.ruby" + } + }, + "end": "\\}", + "patterns": [ + { + "include": "#braces" + }, + { + "include": "#string" + } + ] + } + ] + }, + "brackets": { + "patterns": [ + { + "captures": { + "0": { + "name": "constant.character.escape.ruby" + } + }, + "match": "\\\\\\[|\\\\\\]", + "name": "string.other.ruby" + }, + { + "begin": "\\[", + "captures": { + "0": { + "name": "string.other.ruby" + } + }, + "end": "\\]", + "patterns": [ + { + "include": "#brackets" + }, + { + "include": "#string" + } + ] + } + ] + }, + "parens": { + "patterns": [ + { + "captures": { + "0": { + "name": "constant.character.escape.ruby" + } + }, + "match": "\\\\\\(|\\\\\\)", + "name": "string.other.ruby" + }, + { + "begin": "\\(", + "captures": { + "0": { + "name": "string.other.ruby" + } + }, + "end": "\\)", + "patterns": [ + { + "include": "#parens" + }, + { + "include": "#string" + } + ] + } + ] + }, + "string": { + "patterns": [ + { + "captures": { + "0": { + "name": "constant.character.escape.ruby" + } + }, + "match": "\\\\\\\\|\\\\[ ]", + "name": "string.other.ruby" + }, + { + "match": "\\S\\w*", + "name": "string.other.ruby" + } + ] + } + } + }, + { + "begin": "%W(?:([(\\[{<])|([^\\w\\s]|_))", + "beginCaptures": { + "0": { + "name": "punctuation.section.array.begin.ruby" + } + }, + "end": "[)\\]}>]\\2|\\1\\2", + "endCaptures": { + "0": { + "name": "punctuation.section.array.end.ruby" + } + }, + "name": "meta.array.string.interpolated.ruby", + "patterns": [ + { + "begin": "\\G(?<=\\()(?!\\))", + "end": "(?=\\))", + "patterns": [ + { + "include": "#parens" + }, + { + "include": "#string" + } + ] + }, + { + "begin": "\\G(?<=\\[)(?!\\])", + "end": "(?=\\])", + "patterns": [ + { + "include": "#brackets" + }, + { + "include": "#string" + } + ] + }, + { + "begin": "\\G(?<=\\{)(?!\\})", + "end": "(?=\\})", + "patterns": [ + { + "include": "#braces" + }, + { + "include": "#string" + } + ] + }, + { + "begin": "\\G(?<=<)(?!>)", + "end": "(?=>)", + "patterns": [ + { + "include": "#angles" + }, + { + "include": "#string" + } + ] + }, + { + "include": "#string" + } + ], + "repository": { + "angles": { + "patterns": [ + { + "begin": "<", + "captures": { + "0": { + "name": "string.other.ruby" + } + }, + "end": ">", + "patterns": [ + { + "include": "#angles" + }, + { + "include": "#string" + } + ] + } + ] + }, + "braces": { + "patterns": [ + { + "begin": "\\{", + "captures": { + "0": { + "name": "string.other.ruby" + } + }, + "end": "\\}", + "patterns": [ + { + "include": "#braces" + }, + { + "include": "#string" + } + ] + } + ] + }, + "brackets": { + "patterns": [ + { + "begin": "\\[", + "captures": { + "0": { + "name": "string.other.ruby" + } + }, + "end": "\\]", + "patterns": [ + { + "include": "#brackets" + }, + { + "include": "#string" + } + ] + } + ] + }, + "parens": { + "patterns": [ + { + "begin": "\\(", + "captures": { + "0": { + "name": "string.other.ruby" + } + }, + "end": "\\)", + "patterns": [ + { + "include": "#parens" + }, + { + "include": "#string" + } + ] + } + ] + }, + "string": { + "patterns": [ + { + "begin": "(?=\\\\|#\\{)", + "end": "(?!\\G)", + "name": "string.other.ruby", + "patterns": [ + { + "include": "#escaped_char" + }, + { + "include": "#interpolated_ruby" + } + ] + }, + { + "match": "\\S\\w*", + "name": "string.other.ruby" + } + ] + } + } + }, + { + "begin": "%x(?:([(\\[{<])|([^\\w\\s]|_))", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ruby" + } + }, + "end": "[)\\]}>]\\2|\\1\\2", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ruby" + } + }, + "name": "string.interpolated.percent.ruby", + "patterns": [ + { + "begin": "\\G(?<=\\()(?!\\))", + "end": "(?=\\))", + "patterns": [ + { + "include": "#parens" + } + ] + }, + { + "begin": "\\G(?<=\\[)(?!\\])", + "end": "(?=\\])", + "patterns": [ + { + "include": "#brackets" + } + ] + }, + { + "begin": "\\G(?<=\\{)(?!\\})", + "end": "(?=\\})", + "patterns": [ + { + "include": "#braces" + } + ] + }, + { + "begin": "\\G(?<=<)(?!>)", + "end": "(?=>)", + "patterns": [ + { + "include": "#angles" + } + ] + }, + { + "include": "#escaped_char" + }, + { + "include": "#interpolated_ruby" + } + ], + "repository": { + "angles": { + "patterns": [ + { + "include": "#escaped_char" + }, + { + "include": "#interpolated_ruby" + }, + { + "begin": "<", + "end": ">", + "patterns": [ + { + "include": "#angles" + } + ] + } + ] + }, + "braces": { + "patterns": [ + { + "include": "#escaped_char" + }, + { + "include": "#interpolated_ruby" + }, + { + "begin": "\\{", + "end": "\\}", + "patterns": [ + { + "include": "#braces" + } + ] + } + ] + }, + "brackets": { + "patterns": [ + { + "include": "#escaped_char" + }, + { + "include": "#interpolated_ruby" + }, + { + "begin": "\\[", + "end": "\\]", + "patterns": [ + { + "include": "#brackets" + } + ] + } + ] + }, + "parens": { + "patterns": [ + { + "include": "#escaped_char" + }, + { + "include": "#interpolated_ruby" + }, + { + "begin": "\\(", + "end": "\\)", + "patterns": [ + { + "include": "#parens" + } + ] + } + ] + } + } + } + ] + }, + "regex_sub": { + "patterns": [ + { + "include": "#interpolated_ruby" + }, + { + "include": "#escaped_char" + }, + { + "captures": { + "1": { + "name": "punctuation.definition.quantifier.begin.ruby" + }, + "3": { + "name": "punctuation.definition.quantifier.end.ruby" + } + }, + "match": "(\\{)\\d+(,\\d+)?(\\})", + "name": "keyword.operator.quantifier.ruby" + }, + { + "begin": "\\[\\^?", + "beginCaptures": { + "0": { + "name": "punctuation.definition.character-class.begin.ruby" + } + }, + "end": "\\]", + "endCaptures": { + "0": { + "name": "punctuation.definition.character-class.end.ruby" + } + }, + "name": "constant.other.character-class.set.ruby", + "patterns": [ + { + "include": "#escaped_char" + } + ] + }, + { + "begin": "\\(\\?#", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.begin.ruby" + } + }, + "end": "\\)", + "endCaptures": { + "0": { + "name": "punctuation.definition.comment.end.ruby" + } + }, + "name": "comment.line.number-sign.ruby", + "patterns": [ + { + "include": "#escaped_char" + } + ] + }, + { + "begin": "\\(", + "captures": { + "0": { + "name": "punctuation.definition.group.ruby" + } + }, + "end": "\\)", + "name": "meta.group.regexp.ruby", + "patterns": [ + { + "include": "#regex_sub" + } + ] + }, + { + "begin": "(?<=^|\\s)(#)\\s(?=[[a-zA-Z0-9,. \\t?!-][^\\x{00}-\\x{7F}]]*$)", + "beginCaptures": { + "1": { + "name": "punctuation.definition.comment.ruby" + } + }, + "comment": "We are restrictive in what we allow to go after the comment character to avoid false positives, since the availability of comments depend on regexp flags.", + "end": "$\\n?", + "name": "comment.line.number-sign.ruby" + } + ] + } + }, + "scopeName": "source.ruby", + "uuid": "E00B62AC-6B1C-11D9-9B1F-000D93589AF6", + "version": "https://github.com/textmate/ruby.tmbundle/commit/f0ab9fb24f32372d3e4054f33e8c243d810c7260" +} \ No newline at end of file diff --git a/extensions/ruby/test/colorize-results/test_rb.json b/extensions/ruby/test/colorize-results/test_rb.json index 5b3da189b47..4c6e89c33f0 100644 --- a/extensions/ruby/test/colorize-results/test_rb.json +++ b/extensions/ruby/test/colorize-results/test_rb.json @@ -375,7 +375,7 @@ }, { "c": "::", - "t": "source.ruby punctuation.separator.other.ruby", + "t": "source.ruby punctuation.separator.namespace.ruby", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -397,7 +397,7 @@ }, { "c": "::", - "t": "source.ruby punctuation.separator.other.ruby", + "t": "source.ruby punctuation.separator.namespace.ruby", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -419,7 +419,7 @@ }, { "c": "::", - "t": "source.ruby punctuation.separator.other.ruby", + "t": "source.ruby punctuation.separator.namespace.ruby", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1486,7 +1486,7 @@ }, { "c": "::", - "t": "source.ruby punctuation.separator.other.ruby", + "t": "source.ruby punctuation.separator.namespace.ruby", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -1695,7 +1695,7 @@ }, { "c": "self", - "t": "source.ruby variable.language.ruby", + "t": "source.ruby variable.language.self.ruby", "r": { "dark_plus": "variable.language: #569CD6", "light_plus": "variable.language: #0000FF", @@ -1827,7 +1827,7 @@ }, { "c": "self", - "t": "source.ruby variable.language.ruby", + "t": "source.ruby variable.language.self.ruby", "r": { "dark_plus": "variable.language: #569CD6", "light_plus": "variable.language: #0000FF", From 6b48d58387fe363c7bb75f308e6a63bf8958e605 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 18 May 2017 13:58:21 +0200 Subject: [PATCH 0606/1164] [rust] update grammar --- extensions/rust/syntaxes/rust.tmLanguage.json | 138 +++++++++++------- .../test/colorize-results/test-6611_rs.json | 135 ++++++++++++++++- 2 files changed, 210 insertions(+), 63 deletions(-) diff --git a/extensions/rust/syntaxes/rust.tmLanguage.json b/extensions/rust/syntaxes/rust.tmLanguage.json index 3b952b7f868..3af597f3cb7 100644 --- a/extensions/rust/syntaxes/rust.tmLanguage.json +++ b/extensions/rust/syntaxes/rust.tmLanguage.json @@ -158,6 +158,11 @@ "name": "support.type.std.rust", "match": "\\b(ToOwned|ToString)\\b" }, + "type": { + "comment": "A type", + "name": "entity.name.type.rust", + "match": "\\b([A-Za-z][_A-Za-z0-9]*|_[_A-Za-z0-9]+)\\b" + }, "type_params": { "comment": "Type parameters", "name": "meta.type_params.rust", @@ -201,6 +206,61 @@ } }, "patterns": [ + { + "comment": "Implementation", + "begin": "\\b(impl)\\b", + "end": "\\{", + "beginCaptures": { + "1": { + "name": "storage.type.rust" + } + }, + "patterns": [ + { + "include": "#block_comment" + }, + { + "include": "#line_comment" + }, + { + "include": "#sigils" + }, + { + "include": "#mut" + }, + { + "include": "#ref_lifetime" + }, + { + "include": "#core_types" + }, + { + "include": "#core_marker" + }, + { + "include": "#core_traits" + }, + { + "include": "#std_types" + }, + { + "include": "#std_traits" + }, + { + "include": "#type_params" + }, + { + "include": "#where" + }, + { + "name": "storage.type.rust", + "match": "\\bfor\\b" + }, + { + "include": "#type" + } + ] + }, { "include": "#block_doc_comment" }, @@ -403,16 +463,34 @@ }, { "comment": "Function call", - "match": "\\b([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\(", + "match": "\\b([A-Za-z][A-Za-z0-9_]*|_[A-Za-z0-9_]+)\\s*\\(", "captures": { "1": { "name": "entity.name.function.rust" } } }, + { + "comment": "Function call with type parameters", + "begin": "\\b([A-Za-z][A-Za-z0-9_]*|_[A-Za-z0-9_]+)\\s*(::)(?=\\s*<.*>\\s*\\()", + "end": "\\(", + "captures": { + "1": { + "name": "entity.name.function.rust" + }, + "2": { + "name": "keyword.operator.misc.rust" + } + }, + "patterns": [ + { + "include": "#type_params" + } + ] + }, { "comment": "Function definition", - "begin": "\\b(fn)\\s+([a-zA-Z_][a-zA-Z0-9_]*)", + "begin": "\\b(fn)\\s+([A-Za-z][A-Za-z0-9_]*|_[A-Za-z0-9_]+)", "end": "[\\{;]", "beginCaptures": { "1": { @@ -470,7 +548,7 @@ }, { "comment": "Function arguments", - "match": "fn", + "match": "\bfn\b", "name": "keyword.other.fn.rust" } ] @@ -564,59 +642,7 @@ "include": "#type_params" } ] - }, - { - "comment": "Implementation", - "begin": "\\b(impl)\\b", - "end": "\\{", - "beginCaptures": { - "1": { - "name": "storage.type.rust" - } - }, - "patterns": [ - { - "include": "#block_comment" - }, - { - "include": "#line_comment" - }, - { - "include": "#sigils" - }, - { - "include": "#mut" - }, - { - "include": "#ref_lifetime" - }, - { - "include": "#core_types" - }, - { - "include": "#core_marker" - }, - { - "include": "#core_traits" - }, - { - "include": "#std_types" - }, - { - "include": "#std_traits" - }, - { - "include": "#type_params" - }, - { - "include": "#where" - }, - { - "name": "storage.type.rust", - "match": "\\bfor\\b" - } - ] } ], - "version": "https://github.com/zargony/atom-language-rust/commit/5e32388ed873683f3ccdea618c25d1ace8759608" + "version": "https://github.com/zargony/atom-language-rust/commit/c24ef01b9f989f1262c9e70fe13b314b8e646ed0" } \ No newline at end of file diff --git a/extensions/rust/test/colorize-results/test-6611_rs.json b/extensions/rust/test/colorize-results/test-6611_rs.json index d397562ce5c..6667e4fd311 100644 --- a/extensions/rust/test/colorize-results/test-6611_rs.json +++ b/extensions/rust/test/colorize-results/test-6611_rs.json @@ -11,7 +11,7 @@ } }, { - "c": " Foo", + "c": " ", "t": "source.rust", "r": { "dark_plus": "default: #D4D4D4", @@ -21,6 +21,17 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "Foo", + "t": "source.rust entity.name.type.rust", + "r": { + "dark_plus": "entity.name.type: #4EC9B0", + "light_plus": "entity.name.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.type: #4EC9B0" + } + }, { "c": "", "t": "source.rust meta.type_params.rust", @@ -55,7 +66,7 @@ } }, { - "c": " A: B", + "c": " ", "t": "source.rust", "r": { "dark_plus": "default: #D4D4D4", @@ -65,6 +76,39 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "A", + "t": "source.rust entity.name.type.rust", + "r": { + "dark_plus": "entity.name.type: #4EC9B0", + "light_plus": "entity.name.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.type: #4EC9B0" + } + }, + { + "c": ": ", + "t": "source.rust", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "B", + "t": "source.rust entity.name.type.rust", + "r": { + "dark_plus": "entity.name.type: #4EC9B0", + "light_plus": "entity.name.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.type: #4EC9B0" + } + }, { "c": "{ }", "t": "source.rust", @@ -88,7 +132,7 @@ } }, { - "c": " Foo", + "c": " ", "t": "source.rust", "r": { "dark_plus": "default: #D4D4D4", @@ -98,6 +142,17 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "Foo", + "t": "source.rust entity.name.type.rust", + "r": { + "dark_plus": "entity.name.type: #4EC9B0", + "light_plus": "entity.name.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.type: #4EC9B0" + } + }, { "c": "", "t": "source.rust meta.type_params.rust", @@ -132,7 +187,7 @@ } }, { - "c": " C", + "c": " ", "t": "source.rust", "r": { "dark_plus": "default: #D4D4D4", @@ -142,6 +197,17 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "C", + "t": "source.rust entity.name.type.rust", + "r": { + "dark_plus": "entity.name.type: #4EC9B0", + "light_plus": "entity.name.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.type: #4EC9B0" + } + }, { "c": " ", "t": "source.rust", @@ -165,7 +231,7 @@ } }, { - "c": " A: B", + "c": " ", "t": "source.rust", "r": { "dark_plus": "default: #D4D4D4", @@ -175,6 +241,39 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "A", + "t": "source.rust entity.name.type.rust", + "r": { + "dark_plus": "entity.name.type: #4EC9B0", + "light_plus": "entity.name.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.type: #4EC9B0" + } + }, + { + "c": ": ", + "t": "source.rust", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "B", + "t": "source.rust entity.name.type.rust", + "r": { + "dark_plus": "entity.name.type: #4EC9B0", + "light_plus": "entity.name.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.type: #4EC9B0" + } + }, { "c": "{ }", "t": "source.rust", @@ -198,7 +297,7 @@ } }, { - "c": " Foo", + "c": " ", "t": "source.rust", "r": { "dark_plus": "default: #D4D4D4", @@ -208,6 +307,17 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "Foo", + "t": "source.rust entity.name.type.rust", + "r": { + "dark_plus": "entity.name.type: #4EC9B0", + "light_plus": "entity.name.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.type: #4EC9B0" + } + }, { "c": "", "t": "source.rust meta.type_params.rust", @@ -242,7 +352,7 @@ } }, { - "c": " C", + "c": " ", "t": "source.rust", "r": { "dark_plus": "default: #D4D4D4", @@ -252,6 +362,17 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "C", + "t": "source.rust entity.name.type.rust", + "r": { + "dark_plus": "entity.name.type: #4EC9B0", + "light_plus": "entity.name.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "entity.name.type: #4EC9B0" + } + }, { "c": "{", "t": "source.rust", From 486d6e1f006a7702bddb070c92772b42f3f3d379 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 18 May 2017 15:29:01 +0200 Subject: [PATCH 0607/1164] [shaderlab] update grammar --- extensions/shaderlab/syntaxes/shaderlab.json | 59 ++++++++++++++------ 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/extensions/shaderlab/syntaxes/shaderlab.json b/extensions/shaderlab/syntaxes/shaderlab.json index aad10f3b35a..dd4ba7f8bb3 100644 --- a/extensions/shaderlab/syntaxes/shaderlab.json +++ b/extensions/shaderlab/syntaxes/shaderlab.json @@ -93,6 +93,48 @@ "name": "keyword.other" } }, + "patterns": [ + { + "include": "#hlsl-embedded" + } + ] + }, + { + "name": "meta.hlslblock", + "begin": "\\b(HLSLPROGRAM|HLSLINCLUDE)\\b", + "beginCaptures": { + "1": { + "name": "keyword.other" + } + }, + "end": "\\b(ENDHLSL)\\b", + "endCaptures": { + "1": { + "name": "keyword.other" + } + }, + "patterns": [ + { + "include": "#hlsl-embedded" + } + ] + }, + { + "name": "string.quoted.double.shaderlab", + "begin": "\"", + "end": "\"" + } + ], + "repository": { + "numbers": { + "patterns": [ + { + "name": "constant.numeric.shaderlab", + "match": "\\b([0-9]+\\.?[0-9]*)\\b" + } + ] + }, + "hlsl-embedded": { "patterns": [ { "include": "source.hlsl" @@ -154,22 +196,7 @@ "match": "\\b(SurfaceOutputStandardSpecular|SurfaceOutputStandard|SurfaceOutput|Input)\\b" } ] - }, - { - "name": "string.quoted.double.shaderlab", - "begin": "\"", - "end": "\"" - } - ], - "repository": { - "numbers": { - "patterns": [ - { - "name": "constant.numeric.shaderlab", - "match": "\\b([0-9]+\\.?[0-9]*)\\b" - } - ] } }, - "version": "https://github.com/tgjones/shaders-tmLanguage/commit/cd1ef40f549f9ce2b9e6b73498688de114a85382" + "version": "https://github.com/tgjones/shaders-tmLanguage/commit/a6ee9f41e4b99812c6698462cae4868c80f82a3b" } \ No newline at end of file From 767b146e267603f65065373fe047a9282ccbcca7 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 18 May 2017 15:37:08 +0200 Subject: [PATCH 0608/1164] [swift] update grammar --- extensions/swift/package.json | 5 +- extensions/swift/syntaxes/swift.json | 257 ----------------- .../swift/syntaxes/swift.tmLanguage.json | 217 ++++++++++++++ .../test/colorize-results/test_swift.json | 269 ++++++++++++------ 4 files changed, 405 insertions(+), 343 deletions(-) delete mode 100644 extensions/swift/syntaxes/swift.json create mode 100644 extensions/swift/syntaxes/swift.tmLanguage.json diff --git a/extensions/swift/package.json b/extensions/swift/package.json index b8f262b4cff..a9139a22a6d 100644 --- a/extensions/swift/package.json +++ b/extensions/swift/package.json @@ -3,6 +3,9 @@ "version": "0.1.0", "publisher": "vscode", "engines": { "vscode": "*" }, + "scripts": { + "update-grammar": "node ../../build/npm/update-grammar.js freebroccolo/atom-language-swift grammars/swift.cson ./syntaxes/swift.tmLanguage.json" + }, "contributes": { "languages": [{ "id": "swift", @@ -13,7 +16,7 @@ "grammars": [{ "language": "swift", "scopeName": "source.swift", - "path": "./syntaxes/swift.json" + "path": "./syntaxes/swift.tmLanguage.json" }], "snippets": [{ "language": "swift", diff --git a/extensions/swift/syntaxes/swift.json b/extensions/swift/syntaxes/swift.json deleted file mode 100644 index ffd875717c6..00000000000 --- a/extensions/swift/syntaxes/swift.json +++ /dev/null @@ -1,257 +0,0 @@ -{ - "scopeName": "source.swift", - "fileTypes": [ - "swift" - ], - "name": "Swift", - "firstLineMatch": "^#!\\s*/.*\\bswift", - "patterns": [ - { - "name": "keyword.declaration.swift", - "match": "\\b(class|deinit|enum|extension|import|init|inout|internal|let|operator|private|protocol|public|static|struct|subscript|typealias|var)\\b" - }, - { - "name": "keyword.statement.swift", - "match": "\\b(break|case|continue|default|defer|do|else|fallthrough|for|guard|if|in|repeat|return|switch|where|while)\\b" - }, - { - "name": "keyword.expressions-and-types.swift", - "match": "\\b(as|catch|dynamicType|false|is|nil|rethrows|super|self|Self|throw|throws|true|try|__COLUMN__|__FILE__|__FUNCTION__|__LINE__)\\b" - }, - { - "name": "keyword.patterns.swift", - "match": "\\b(_)\\b" - }, - { - "name": "keyword.primitive-datatypes.swift", - "match": "\\b(Int|UInt|String|Bool|Character|Optional|Float|Double)\\b" - }, - { - "name": "keyword.reserved.swift", - "match": "\\b(associativity|convenience|dynamic|didSet|final|get|infix|lazy|left|mutating|none|nonmutating|optional|override|postfix|precedence|prefix|Protocol|required|right|set|Type|unowned|weak|willSet)\\b" - }, - { - "include": "#comment" - }, - { - "include": "#literal" - }, - { - "include": "#function" - }, - { - "include": "#operator" - }, - { - "include": "#attribute" - } - ], - "repository": { - "comment": { - "patterns": [ - { - "name": "comment.block.swift", - "begin": "/\\*", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.begin.swift" - } - }, - "end": "\\*/", - "endCaptures": { - "0": { - "name": "punctuation.definition.comment.end.swift" - } - }, - "patterns": [ - { - "include": "#comment" - } - ] - }, - { - "begin": "(^[ \\t]+)?(?=//)", - "beginCaptures": { - "1": { - "name": "punctuation.whitespace.comment.leading.swift" - } - }, - "end": "(?!\\G)", - "patterns": [ - { - "name": "comment.line.double-slash.swift", - "begin": "//", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.swift" - } - }, - "end": "\\n", - "patterns": [ - { - "name": "punctuation.separator.continuation.swift", - "match": "(?>\\\\\\s*\\n)" - } - ] - } - ] - } - ] - }, - "escaped-char": { - "patterns": [ - { - "name": "constant.character.escape.swift", - "match": "\\\\[0\\\\tnr\"']" - }, - { - "name": "constant.character.escape.swift", - "match": "\\\\(x\\h{2}|u\\h{4}|U\\h{8})" - }, - { - "name": "invalid.illegal.constant.character.escape.swift", - "match": "\\\\[^uxU]" - } - ] - }, - "identifier": { - "match": "(?x) (? \\g \\g? | ` \\g \\g? ` ){0} (? [ a-z A-Z ] | [ \\u00A8 \\u00AA \\u00AD \\u00AF \\u00B2-\\u00B5 \\u00B7-\\u00BA ] | [ \\u00BC-\\u00BE \\u00C0-\\u00D6 \\u00D8-\\u00F6 \\u00F8-\\u00FF ] | [ \\u0100-\\u02FF \\u0370-\\u167F \\u1681-\\u180D \\u180F-\\u1DBF ] | [ \\u1E00-\\u1FFF ] | [ \\u200B-\\u200D \\u202A-\\u202E \\u203F-\\u2040 \\u2054 \\u2060-\\u206F ] | [ \\u2070-\\u20CF \\u2100-\\u218F \\u2460-\\u24FF \\u2776-\\u2793 ] | [ \\u2C00-\\u2DFF \\u2E80-\\u2FFF ] | [ \\u3004-\\u3007 \\u3021-\\u302F \\u3031-\\u303F \\u3040-\\uD7FF ] | [ \\uF900-\\uFD3D \\uFD40-\\uFDCF \\uFDF0-\\uFE1F \\uFE30-\\uFE44 ] | [ \\uFE47-\\uFFFD ] | [ \\u10000-\\u1FFFD \\u20000-\\u2FFFD \\u30000-\\u3FFFD \\u40000-\\u4FFFD ] | [ \\u50000-\\u5FFFD \\u60000-\\u6FFFD \\u70000-\\u7FFFD \\u80000-\\u8FFFD ] | [ \\u90000-\\u9FFFD \\uA0000-\\uAFFFD \\uB0000-\\uBFFFD \\uC0000-\\uCFFFD ] | [ \\uD0000-\\uDFFFD \\uE0000-\\uEFFFD ] ){0} (? \\d | [ \\u0300-\\u036F \\u1DC0-\\u1DFF \\u20D0-\\u20FF \\uFE20-\\uFE2F ] | \\g ){0} (? \\g \\g? ){0} (? (?) \\$ \\d+ (?!\\g) (?# FIXME) ){0} \\g | \\g", - "captures": { - "5": { - "name": "variable.other.positional.swift" - } - } - }, - "literal": { - "patterns": [ - { - "include": "#literal-number" - }, - { - "include": "#literal-string" - }, - { - "include": "#literal-boolean" - } - ] - }, - "literal-number": { - "name": "constant.numeric.swift", - "match": "(?x) (?### INTEGER ###) (? \\g | \\g | \\g | \\g ){0} (?### BINARY ###) (? 0b \\g \\g? ){0} (? [0-1] ){0} (? \\g | _ ){0} (? \\g \\g? ){0} (?### OCTAL ###) (? 0o \\g \\g? ){0} (? [0-7] ){0} (? \\g | _ ){0} (? \\g \\g? ){0} (?### DECIMAL ###) (? \\g \\g? ){0} (? \\d ){0} (? \\g | _ ){0} (? \\g \\g? ){0} (?### HEXADECIMAL ###) (? 0x \\g \\g? ){0} (? \\h ){0} (? \\g | _ ){0} (? \\g \\g? ){0} (?### FLOATING POINT ###) (? \\g \\g? \\g? | \\g \\g? \\g ){0} (? \\. \\g ){0} (? \\g \\g? \\g ){0} (? \\. \\g? ){0} (? \\g \\g? \\g ){0} (? [eE] ){0} (? [pP] ){0} (? [+-] ){0} (?!0[box]) \\g | \\g" - }, - "literal-string": { - "name": "string.quoted.double.swift", - "begin": "\"", - "end": "\"", - "beginCaptures": { - "0": { - "name": "punctuation.definition.string.begin.swift" - } - }, - "endCaptures": { - "0": { - "name": "punctuation.definition.string.end.swift" - } - }, - "patterns": [ - { - "include": "#quoted-text" - } - ] - }, - "literal-boolean": { - "match": "\\b(true|false)\\b(?![?!])", - "name": "constant.language.boolean.swift" - }, - "operator": { - "patterns": [ - { - "include": "#operator-character" - } - ] - }, - "operator-character": { - "name": "keyword.operator.swift", - "match": "[\\/=\\-+!*%<>&|^~.]" - }, - "quoted-text": { - "patterns": [ - { - "name": "meta.embedded.line.swift", - "contentName": "source.swift", - "begin": "\\\\\\(", - "end": "\\)", - "beginCaptures": { - "0": { - "name": "punctuation.section.embedded.begin.swift" - } - }, - "endCaptures": { - "0": { - "name": "punctuation.section.embedded.end.swift" - } - }, - "patterns": [ - { - "include": "$self" - } - ] - }, - { - "include": "#escaped-char" - } - ] - }, - "function": { - "name": "meta.function.swift", - "begin": "(func) \\s*", - "end": "(?=\\{|#)|;|$", - "beginCaptures": { - "1": { - "name": "storage.type.function.swift" - } - }, - "comment": "match regular function like: func myFunc(...)", - "patterns": [ - { - "begin": "([a-zA-Z_0-9]+)\\s*(\\()", - "beginCaptures": { - "1": { - "name": "entity.name.function.swift" - }, - "2": { - "name": "punctuation.definition.parameters.begin.swift" - } - }, - "comment": "match regular function like: func myFunc(...)", - "end": "(\\))", - "endCaptures": { - "1": { - "name": "punctuation.definition.parameters.end.swift" - } - } - }, - { - "name": "meta.return-type.swift", - "match": "((->)\\s*([^\\{]+))", - "captures": { - "2": { - "name": "punctuation.function.swift" - }, - "3": { - "name": "entity.name.type.class.swift" - } - } - } - ] - }, - "whitespace": { - "match": "(?x) [ \\u0020 (?# space) \\u000A (?# line-feed) \\u000D (?# carriage-return) \\u0009 (?# horizontal-tab) \\u000B (?# vertical-tab) \\u000C (?# form-feed) \\u0000 (?# null) ]" - }, - "attribute": { - "name": "storage.type.attribute.swift", - "begin": "@", - "end": " " - } - } -} \ No newline at end of file diff --git a/extensions/swift/syntaxes/swift.tmLanguage.json b/extensions/swift/syntaxes/swift.tmLanguage.json new file mode 100644 index 00000000000..87fa5be1e75 --- /dev/null +++ b/extensions/swift/syntaxes/swift.tmLanguage.json @@ -0,0 +1,217 @@ +{ + "scopeName": "source.swift", + "fileTypes": [ + "swift" + ], + "name": "Swift", + "firstLineMatch": "^#!\\s*/.*\\bswift", + "patterns": [ + { + "name": "keyword.others.swift", + "match": "^\\s*(#if|#else|#endif|#elseif|@warn_unused_result|@discardableResult|@IBAction|@IBOutlet|@IBDesignable|@IBInspectable)\\b" + }, + { + "name": "keyword.declaration.swift", + "match": "\\b(deinit|import|init|subscript)\\b" + }, + { + "name": "storage.type.swift", + "match": "\\b(precedencegroup|class|struct|enum|extension|protocol|let|var|typealias)\\b" + }, + { + "name": "storage.modifier.swift", + "match": "\\b(final|internal|private|fileprivate|public|open|static|required|convenience)\\b" + }, + { + "name": "keyword.statement.swift", + "match": "\\b(try|catch|repeat|break|case|continue|default|do|else|fallthrough|if|in|for|return|switch|where|while|guard|defer)\\b" + }, + { + "name": "support.type.swift", + "match": "(?x) \\b(Character|U?Int|U?Int(8|16|32|64) |Float|Double|Float(32|64)|Bool|String|Date|Data|URL |(double|float)[234]|(double|float)[234]x[234] |Any |AnyObject |Error |Equatable |Hashable |Comparable |CustomDebugStringConvertible |CustomStringConvertible |OptionSet |ManagedBuffer |ManagedBufferPointer |BitwiseOperations |CountedSet |Counter |Directions |ExpressibleByArrayLiteral |ExpressibleByBooleanLiteral |ExpressibleByDictionaryLiteral |ExpressibleByExtendedGraphemeClusterLiteral |ExpressibleByFloatLitera |ExpressibleByIntegerLiteral |ExpressibleByNilLiteral |ExpressibleByStringInterpolation |ExpressibleByStringLiteral |ExpressibleByUnicodeScalarLiteral |OrderedSet |PaperSize |RawRepresentable |(UI|NS|CF|CG)[A-Z][a-zA-Z0-9]+ |Stream |(In|Out)putStream |FileManager |Array |Unsafe[a-zA-Z]*Pointer |Bundle |Jex)\\b" + }, + { + "name": "support.function.swift", + "match": "\\b(assert|assertionFailure|print)\\b" + }, + { + "name": "keyword.expressions-and-types.swift", + "match": "\\b(as|dynamicType|is|new|super|self|Self|Type|#column|#file|#function|#line)\\b" + }, + { + "name": "keyword.reserved.swift", + "match": "\\b(associativity|didSet|get|infix|inout|left|mutating|nonmutating|operator|override|postfix|precedence|prefix|right|set|unowned|unowned(safe)|unowned(unsafe)|weak|willSet)\\b" + }, + { + "name": "constant.language.swift", + "match": "\\b(true|false|nil|none)\\b" + }, + { + "name": "entity.name.function.swift", + "match": "\\bfunc\\s+([^\\t\\n\\x20\\x28]+)" + }, + { + "include": "#comment" + }, + { + "include": "#literal" + }, + { + "include": "#operator" + } + ], + "repository": { + "comment": { + "patterns": [ + { + "name": "comment.block.swift", + "begin": "/\\*", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.begin.swift" + } + }, + "end": "\\*/", + "endCaptures": { + "0": { + "name": "punctuation.definition.comment.end.swift" + } + }, + "patterns": [ + { + "include": "#comment" + } + ] + }, + { + "begin": "(^[ \\t]+)?(?=//)", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.comment.leading.swift" + } + }, + "end": "(?!\\G)", + "patterns": [ + { + "name": "comment.line.double-slash.swift", + "begin": "//", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.swift" + } + }, + "end": "\\n", + "patterns": [ + { + "name": "punctuation.separator.continuation.swift", + "match": "(?>\\\\\\s*\\n)" + } + ] + } + ] + } + ] + }, + "escaped-char": { + "patterns": [ + { + "name": "constant.character.escape.swift", + "match": "\\\\[0\\\\tnr\"']" + }, + { + "name": "constant.character.escape.swift", + "match": "\\\\(x\\h{2}|u\\h{4}|U\\h{8})" + }, + { + "name": "invalid.illegal.constant.character.escape.swift", + "match": "\\\\[^uxU]" + } + ] + }, + "identifier": { + "match": "(?x) (? \\g \\g? | ` \\g \\g? ` ){0} (? [ a-z A-Z ] | [ \\u00A8 \\u00AA \\u00AD \\u00AF \\u00B2-\\u00B5 \\u00B7-\\u00BA ] | [ \\u00BC-\\u00BE \\u00C0-\\u00D6 \\u00D8-\\u00F6 \\u00F8-\\u00FF ] | [ \\u0100-\\u02FF \\u0370-\\u167F \\u1681-\\u180D \\u180F-\\u1DBF ] | [ \\u1E00-\\u1FFF ] | [ \\u200B-\\u200D \\u202A-\\u202E \\u203F-\\u2040 \\u2054 \\u2060-\\u206F ] | [ \\u2070-\\u20CF \\u2100-\\u218F \\u2460-\\u24FF \\u2776-\\u2793 ] | [ \\u2C00-\\u2DFF \\u2E80-\\u2FFF ] | [ \\u3004-\\u3007 \\u3021-\\u302F \\u3031-\\u303F \\u3040-\\uD7FF ] | [ \\uF900-\\uFD3D \\uFD40-\\uFDCF \\uFDF0-\\uFE1F \\uFE30-\\uFE44 ] | [ \\uFE47-\\uFFFD ] | [ \\u10000-\\u1FFFD \\u20000-\\u2FFFD \\u30000-\\u3FFFD \\u40000-\\u4FFFD ] | [ \\u50000-\\u5FFFD \\u60000-\\u6FFFD \\u70000-\\u7FFFD \\u80000-\\u8FFFD ] | [ \\u90000-\\u9FFFD \\uA0000-\\uAFFFD \\uB0000-\\uBFFFD \\uC0000-\\uCFFFD ] | [ \\uD0000-\\uDFFFD \\uE0000-\\uEFFFD ] ){0} (? \\d | [ \\u0300-\\u036F \\u1DC0-\\u1DFF \\u20D0-\\u20FF \\uFE20-\\uFE2F ] | \\g ){0} (? \\g \\g? ){0} (? (?) \\$ \\d+ (?!\\g) (?# FIXME) ){0} \\g | \\g", + "captures": { + "5": { + "name": "variable.other.positional.swift" + } + } + }, + "literal": { + "patterns": [ + { + "include": "#literal-number" + }, + { + "include": "#literal-string" + } + ] + }, + "literal-number": { + "name": "constant.numeric.swift", + "match": "(?x) (?### INTEGER ###) (? \\g | \\g | \\g | \\g ){0} (?### BINARY ###) (? \\b 0b \\g \\g? \\b ){0} (? [0-1] ){0} (? \\g | _ ){0} (? \\g \\g? ){0} (?### OCTAL ###) (? \\b 0o \\g \\g? \\b ){0} (? [0-7] ){0} (? \\g | _ ){0} (? \\g \\g? ){0} (?### DECIMAL ###) (? \\b \\g \\g? \\b ){0} (? \\d ){0} (? \\g | _ ){0} (? \\g \\g? ){0} (?### HEXADECIMAL ###) (? \\b 0x \\g \\g? \\b ){0} (? \\h ){0} (? \\g | _ ){0} (? \\g \\g? ){0} (?### FLOATING POINT ###) (? \\b \\g \\g? \\g? \\b | \\b \\g \\g? \\g \\b ){0} (? \\. \\g ){0} (? \\g \\g? \\g ){0} (? \\. \\g? ){0} (? \\g \\g? \\g ){0} (? [eE] ){0} (? [pP] ){0} (? [+-] ){0} (?!0[box]) \\g | \\g" + }, + "literal-string": { + "name": "string.quoted.double.swift", + "begin": "\"", + "end": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.swift" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.swift" + } + }, + "patterns": [ + { + "include": "#quoted-text" + } + ] + }, + "operator": { + "patterns": [ + { + "include": "#operator-character" + } + ] + }, + "operator-character": { + "name": "keyword.operator.swift", + "match": "[\\/=\\-+!*%<>&|^~,\\?:\\[\\]]" + }, + "quoted-text": { + "patterns": [ + { + "name": "meta.embedded.line.swift", + "contentName": "source.swift", + "begin": "\\\\\\(", + "end": "\\)", + "beginCaptures": { + "0": { + "name": "punctuation.section.embedded.begin.swift" + } + }, + "endCaptures": { + "0": { + "name": "punctuation.section.embedded.end.swift" + } + }, + "patterns": [ + { + "include": "$self" + } + ] + }, + { + "include": "#escaped-char" + } + ] + }, + "whitespace": { + "match": "(?x) [ \\u0020 (?# space) \\u000A (?# line-feed) \\u000D (?# carriage-return) \\u0009 (?# horizontal-tab) \\u000B (?# vertical-tab) \\u000C (?# form-feed) \\u0000 (?# null) ]" + } + }, + "version": "https://github.com/freebroccolo/atom-language-swift/commit/fb7c93e0174dea69c8685c00deeb53d480d1d202" +} \ No newline at end of file diff --git a/extensions/swift/test/colorize-results/test_swift.json b/extensions/swift/test/colorize-results/test_swift.json index f421ae1fba8..cf3e2493522 100644 --- a/extensions/swift/test/colorize-results/test_swift.json +++ b/extensions/swift/test/colorize-results/test_swift.json @@ -1,13 +1,13 @@ [ { "c": "var", - "t": "source.swift keyword.declaration.swift", + "t": "source.swift storage.type.swift", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" + "dark_plus": "storage.type: #569CD6", + "light_plus": "storage.type: #0000FF", + "dark_vs": "storage.type: #569CD6", + "light_vs": "storage.type: #0000FF", + "hc_black": "storage.type: #569CD6" } }, { @@ -56,13 +56,13 @@ }, { "c": "var", - "t": "source.swift keyword.declaration.swift", + "t": "source.swift storage.type.swift", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" + "dark_plus": "storage.type: #569CD6", + "light_plus": "storage.type: #0000FF", + "dark_vs": "storage.type: #569CD6", + "light_vs": "storage.type: #0000FF", + "hc_black": "storage.type: #569CD6" } }, { @@ -132,30 +132,8 @@ } }, { - "c": "func", - "t": "source.swift meta.function.swift storage.type.function.swift", - "r": { - "dark_plus": "storage.type: #569CD6", - "light_plus": "storage.type: #0000FF", - "dark_vs": "storage.type: #569CD6", - "light_vs": "storage.type: #0000FF", - "hc_black": "storage.type: #569CD6" - } - }, - { - "c": " ", - "t": "source.swift meta.function.swift", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "hasAnyMatches", - "t": "source.swift meta.function.swift entity.name.function.swift", + "c": "func hasAnyMatches", + "t": "source.swift entity.name.function.swift", "r": { "dark_plus": "entity.name.function: #DCDCAA", "light_plus": "entity.name.function: #795E26", @@ -165,8 +143,8 @@ } }, { - "c": "(", - "t": "source.swift meta.function.swift punctuation.definition.parameters.begin.swift", + "c": "(list", + "t": "source.swift", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -176,30 +154,107 @@ } }, { - "c": "list: [Int], condition: (Int", - "t": "source.swift meta.function.swift", + "c": ":", + "t": "source.swift keyword.operator.swift", "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": ")", - "t": "source.swift meta.function.swift punctuation.definition.parameters.end.swift", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" } }, { "c": " ", - "t": "source.swift meta.function.swift", + "t": "source.swift", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "[", + "t": "source.swift keyword.operator.swift", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": "Int", + "t": "source.swift support.type.swift", + "r": { + "dark_plus": "support.type: #4EC9B0", + "light_plus": "support.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "support.type: #4EC9B0" + } + }, + { + "c": "],", + "t": "source.swift keyword.operator.swift", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " condition", + "t": "source.swift", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ":", + "t": "source.swift keyword.operator.swift", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " (", + "t": "source.swift", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "Int", + "t": "source.swift support.type.swift", + "r": { + "dark_plus": "support.type: #4EC9B0", + "light_plus": "support.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "support.type: #4EC9B0" + } + }, + { + "c": ") ", + "t": "source.swift", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -210,39 +265,83 @@ }, { "c": "->", - "t": "source.swift meta.function.swift meta.return-type.swift punctuation.function.swift", + "t": "source.swift keyword.operator.swift", "r": { - "dark_plus": "meta.return-type: #4EC9B0", - "light_plus": "meta.return-type: #267F99", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "meta.return-type: #4EC9B0" + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" } }, { "c": " ", - "t": "source.swift meta.function.swift meta.return-type.swift", + "t": "source.swift", "r": { - "dark_plus": "meta.return-type: #4EC9B0", - "light_plus": "meta.return-type: #267F99", + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "meta.return-type: #4EC9B0" + "hc_black": "default: #FFFFFF" } }, { - "c": "Bool) -> Bool ", - "t": "source.swift meta.function.swift meta.return-type.swift entity.name.type.class.swift", + "c": "Bool", + "t": "source.swift support.type.swift", "r": { - "dark_plus": "entity.name.type: #4EC9B0", - "light_plus": "entity.name.type: #267F99", + "dark_plus": "support.type: #4EC9B0", + "light_plus": "support.type: #267F99", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "entity.name.type: #4EC9B0" + "hc_black": "support.type: #4EC9B0" } }, { - "c": "{", + "c": ") ", + "t": "source.swift", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "->", + "t": "source.swift keyword.operator.swift", + "r": { + "dark_plus": "keyword.operator: #D4D4D4", + "light_plus": "keyword.operator: #000000", + "dark_vs": "keyword.operator: #D4D4D4", + "light_vs": "keyword.operator: #000000", + "hc_black": "keyword.operator: #D4D4D4" + } + }, + { + "c": " ", + "t": "source.swift", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "Bool", + "t": "source.swift support.type.swift", + "r": { + "dark_plus": "support.type: #4EC9B0", + "light_plus": "support.type: #267F99", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "support.type: #4EC9B0" + } + }, + { + "c": " {", "t": "source.swift", "r": { "dark_plus": "default: #D4D4D4", @@ -375,13 +474,13 @@ }, { "c": "true", - "t": "source.swift keyword.expressions-and-types.swift", + "t": "source.swift constant.language.swift", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" + "dark_plus": "constant.language: #569CD6", + "light_plus": "constant.language: #0000FF", + "dark_vs": "constant.language: #569CD6", + "light_vs": "constant.language: #0000FF", + "hc_black": "constant.language: #569CD6" } }, { @@ -441,13 +540,13 @@ }, { "c": "false", - "t": "source.swift keyword.expressions-and-types.swift", + "t": "source.swift constant.language.swift", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" + "dark_plus": "constant.language: #569CD6", + "light_plus": "constant.language: #0000FF", + "dark_vs": "constant.language: #569CD6", + "light_vs": "constant.language: #0000FF", + "hc_black": "constant.language: #569CD6" } }, { From 3d581324cbea1717475a0ac64d3c5e7c69599f98 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 18 May 2017 15:39:29 +0200 Subject: [PATCH 0609/1164] [xml] update grammar --- extensions/xml/syntaxes/xml.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/extensions/xml/syntaxes/xml.json b/extensions/xml/syntaxes/xml.json index 8237ae9f315..fb780f0f611 100644 --- a/extensions/xml/syntaxes/xml.json +++ b/extensions/xml/syntaxes/xml.json @@ -2,6 +2,7 @@ "scopeName": "text.xml", "name": "XML", "fileTypes": [ + "aiml", "atom", "axml", "bpmn", @@ -21,6 +22,7 @@ "fodt", "fsproj", "fxml", + "gir", "glade", "gpx", "graphml", @@ -29,6 +31,7 @@ "isml", "jmx", "jsp", + "kst", "launch", "menu", "mxml", @@ -44,7 +47,10 @@ "rdf", "rng", "rss", + "sdf", "shproj", + "siml", + "sld", "storyboard", "svg", "targets", @@ -57,7 +63,12 @@ "vcproj.filters", "vcxproj", "vcxproj.filters", + "wixmsp", + "wixmst", + "wixobj", + "wixout", "wsdl", + "wxs", "xaml", "xbl", "xib", @@ -69,6 +80,7 @@ "xul", "ui" ], + "firstLineMatch": "(?x)\n# XML declaration\n(?:\n ^ <\\? xml\n\n # VersionInfo\n \\s+ version\n \\s* = \\s*\n (['\"])\n 1 \\. [0-9]+\n \\1\n\n # EncodingDecl\n (?:\n \\s+ encoding\n \\s* = \\s*\n\n # EncName\n (['\"])\n [A-Za-z]\n [-A-Za-z0-9._]*\n \\2\n )?\n\n # SDDecl\n (?:\n \\s+ standalone\n \\s* = \\s*\n (['\"])\n (?:yes|no)\n \\3\n )?\n\n \\s* \\?>\n)\n|\n# Modeline\n(?i:\n # Emacs\n -\\*-(?:\\s*(?=[^:;\\s]+\\s*-\\*-)|(?:.*?[;\\s]|(?<=-\\*-))mode\\s*:\\s*)\n xml\n (?=[\\s;]|(?]?\\d+|m)?|\\sex)(?=:(?=\\s*set?\\s[^\\n:]+:)|:(?!\\s*set?\\s))(?:(?:\\s|\\s*:\\s*)\\w*(?:\\s*=(?:[^\\n\\\\\\s]|\\\\.)*)?)*[\\s:](?:filetype|ft|syntax)\\s*=\n xml\n (?=\\s|:|$)\n)", "patterns": [ { "begin": "(<\\?)\\s*([-_a-zA-Z0-9]+)", @@ -422,5 +434,5 @@ "name": "comment.block.xml" } }, - "version": "https://github.com/atom/language-xml/commit/f461d428fb87040cb8a52d87d0b95151b9d3c0cc" + "version": "https://github.com/atom/language-xml/commit/ac6bc8ef6a9c79ac3c7e31615bc18436b0c815ab" } \ No newline at end of file From 6ea2875834bbcd9a9a5f41b42fd0ba93f82da962 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 15:47:21 +0200 Subject: [PATCH 0610/1164] tfs: fix global variable access --- build/tfs/win32/1_build.ps1 | 8 ++++---- build/tfs/win32/2_package.ps1 | 2 +- build/tfs/win32/3_upload.ps1 | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index 2eb99701748..85143023e72 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -13,7 +13,7 @@ $env:HOME=$env:USERPROFILE "machine monacotools.visualstudio.com password ${vsoPAT}" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII step "Install dependencies" { - exec { & npm install "--arch=$arch" } + exec { & npm install "--arch=$global:arch" } } $env:VSCODE_MIXIN_PASSWORD = $mixinPassword @@ -22,15 +22,15 @@ step "Mix in repository from vscode-distro" { } step "Get Electron" { - exec { & npm run gulp -- "electron-$arch" } + exec { & npm run gulp -- "electron-$global:arch" } } step "Install distro dependencies" { - exec { & node build\tfs\common\installDistro.js "--arch=$arch" } + exec { & node build\tfs\common\installDistro.js "--arch=$global:arch" } } step "Build minified" { - exec { & npm run gulp -- --max_old_space_size=4096 "vscode-win32-$arch-min" } + exec { & npm run gulp -- --max_old_space_size=4096 "vscode-win32-$global:arch-min" } } step "Run unit tests" { diff --git a/build/tfs/win32/2_package.ps1 b/build/tfs/win32/2_package.ps1 index beaa816e0e4..63d7c9cc412 100644 --- a/build/tfs/win32/2_package.ps1 +++ b/build/tfs/win32/2_package.ps1 @@ -5,7 +5,7 @@ Param( . .\build\tfs\win32\lib.ps1 step "Create archive and setup package" { - exec { & npm run gulp -- --max_old_space_size=4096 "vscode-win32-$arch-archive" "vscode-win32-$arch-setup" } + exec { & npm run gulp -- --max_old_space_size=4096 "vscode-win32-$global:arch-archive" "vscode-win32-$global:arch-setup" } } done \ No newline at end of file diff --git a/build/tfs/win32/3_upload.ps1 b/build/tfs/win32/3_upload.ps1 index 7eb99c4a541..12086545597 100644 --- a/build/tfs/win32/3_upload.ps1 +++ b/build/tfs/win32/3_upload.ps1 @@ -22,11 +22,11 @@ $env:MOONCAKE_STORAGE_ACCESS_KEY = $mooncakeStorageKey $env:AZURE_DOCUMENTDB_MASTERKEY = $documentDbKey step "Publish archive" { - exec { & node build/tfs/common/publish.js $Quality win32-archive archive "VSCode-win32-$arch-$Version.zip" $Version true $Zip } + exec { & node build/tfs/common/publish.js $Quality win32-archive archive "VSCode-win32-$global:arch-$Version.zip" $Version true $Zip } } step "Publish setup package" { - exec { & node build/tfs/common/publish.js $Quality win32 setup "VSCodeSetup-$arch-$Version.exe" $Version true $Exe } + exec { & node build/tfs/common/publish.js $Quality win32 setup "VSCodeSetup-$global:arch-$Version.exe" $Version true $Exe } } done \ No newline at end of file From a6afd646f6cd3fad3f435dc80cb332c2d1294fc4 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 18 May 2017 15:50:47 +0200 Subject: [PATCH 0611/1164] send more data about cached data rejection --- .../electron-browser/nodeCachedDataManager.ts | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/electron-browser/nodeCachedDataManager.ts b/src/vs/workbench/electron-browser/nodeCachedDataManager.ts index 0d35516eb40..6867f109c80 100644 --- a/src/vs/workbench/electron-browser/nodeCachedDataManager.ts +++ b/src/vs/workbench/electron-browser/nodeCachedDataManager.ts @@ -12,6 +12,8 @@ import { readdir, rimraf, stat } from 'vs/base/node/pfs'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +declare type OnNodeCachedDataArgs = [{ errorCode: string, path: string, detail?: string }, { path: string, length: number }]; +declare const MonacoEnvironment: { onNodeCachedData: OnNodeCachedDataArgs[] }; export class NodeCachedDataManager { @@ -35,25 +37,32 @@ export class NodeCachedDataManager { } private _handleCachedDataInfo(): void { - const onNodeCachedData = (err, data) => { + + let didRejectCachedData = false; + let didProduceCachedData = false; + for (const [err, data] of MonacoEnvironment.onNodeCachedData) { + // build summary + didRejectCachedData = didRejectCachedData || Boolean(err); + didProduceCachedData = didProduceCachedData || Boolean(data); + + // log each failure separately if (err) { - this._telemetryService.publicLog('nodeCachedData', { errorCode: err.errorCode, path: basename(err.path) }); - } else if (data) { - this._telemetryService.publicLog('nodeCachedDataProduced', { path: basename(data.path) }); + this._telemetryService.publicLog('cachedDataError', { + errorCode: err.errorCode, + path: basename(err.path) + }); } - }; + } - // handle future and past errors - (self).require.config({ onNodeCachedData }); - ((window).MonacoEnvironment.onNodeCachedData).forEach(args => onNodeCachedData.apply(undefined, args)); - delete (window).MonacoEnvironment.onNodeCachedData; - - // stop when being disposed - this._disposables.push({ - dispose() { - (self).require.config({ onNodeCachedData: undefined }, true); - } + // log summary + this._telemetryService.publicLog('cachedDataInfo', { + didRequestCachedData: Boolean(global.require.getConfig().nodeCachedDataDir), + didRejectCachedData, + didProduceCachedData }); + + global.require.config({ onNodeCachedData: undefined }); + delete MonacoEnvironment.onNodeCachedData; } private _manageCachedDataSoon(): void { From 77d9f925d4b01c0fd5db7dfc2cef383d4d8fc7e5 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 15:52:32 +0200 Subject: [PATCH 0612/1164] tfs: publish x64 correctly --- build/tfs/win32/3_upload.ps1 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/build/tfs/win32/3_upload.ps1 b/build/tfs/win32/3_upload.ps1 index 12086545597..3f23b6d1831 100644 --- a/build/tfs/win32/3_upload.ps1 +++ b/build/tfs/win32/3_upload.ps1 @@ -21,12 +21,14 @@ $env:AZURE_STORAGE_ACCESS_KEY_2 = $storageKey $env:MOONCAKE_STORAGE_ACCESS_KEY = $mooncakeStorageKey $env:AZURE_DOCUMENTDB_MASTERKEY = $documentDbKey +$assetPlatform = if ($arch -eq "ia32") { "win32" } else { "win32-x64" } + step "Publish archive" { - exec { & node build/tfs/common/publish.js $Quality win32-archive archive "VSCode-win32-$global:arch-$Version.zip" $Version true $Zip } + exec { & node build/tfs/common/publish.js $Quality "$global:assetPlatform-archive" archive "VSCode-win32-$global:arch-$Version.zip" $Version true $Zip } } step "Publish setup package" { - exec { & node build/tfs/common/publish.js $Quality win32 setup "VSCodeSetup-$global:arch-$Version.exe" $Version true $Exe } + exec { & node build/tfs/common/publish.js $Quality "$global:assetPlatform" setup "VSCodeSetup-$global:arch-$Version.exe" $Version true $Exe } } done \ No newline at end of file From 258bde4ce449c91686938ad6c88194cef74e53cd Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 16:02:40 +0200 Subject: [PATCH 0613/1164] fix es6 --- build/gulpfile.vscode.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index cc301600b2c..d4effb3d819 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -136,7 +136,7 @@ const config = { repo: product.electronRepository || void 0 }; -function getElectron(arch = process.arch) { +function getElectron(arch) { return () => { const electronOpts = _.extend({}, config, { platform: process.platform, @@ -154,7 +154,7 @@ function getElectron(arch = process.arch) { } gulp.task('clean-electron', util.rimraf('.build/electron')); -gulp.task('electron', ['clean-electron'], getElectron()); +gulp.task('electron', ['clean-electron'], getElectron(process.arch)); gulp.task('electron-ia32', ['clean-electron'], getElectron('ia32')); gulp.task('electron-x64', ['clean-electron'], getElectron('x64')); @@ -194,7 +194,9 @@ function computeChecksum(filename) { return hash; } -function packageTask(platform, arch, opts = {}) { +function packageTask(platform, arch, opts) { + opts = opts || {}; + const destination = path.join(path.dirname(root), 'VSCode') + (platform ? '-' + platform : '') + (arch ? '-' + arch : ''); platform = platform || process.platform; arch = platform === 'win32' ? 'ia32' : arch; From d38e24558edfc7237796413d53e3c9c45c2cb0b4 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 18 May 2017 16:12:41 +0200 Subject: [PATCH 0614/1164] scm: install additional scm providers fixes #25696 --- .../scm/electron-browser/scm.contribution.ts | 14 +++++++- .../parts/scm/electron-browser/scmMenus.ts | 32 +++++++++++++++---- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts b/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts index 2646a7185f3..68cf1af5775 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts @@ -17,6 +17,7 @@ import { VIEWLET_ID } from 'vs/workbench/parts/scm/common/scm'; import { IWorkbenchActionRegistry, Extensions as WorkbenchActionExtensions } from 'vs/workbench/common/actionRegistry'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; +import { IExtensionsViewlet, VIEWLET_ID as EXTENSIONS_VIEWLET_ID } from 'vs/workbench/parts/extensions/common/extensions'; import { ISCMService } from 'vs/workbench/services/scm/common/scm'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -41,7 +42,8 @@ export class SwitchProvider extends Action { id = SwitchProvider.ID, label = SwitchProvider.LABEL, @ISCMService private scmService: ISCMService, - @IQuickOpenService private quickOpenService: IQuickOpenService + @IQuickOpenService private quickOpenService: IQuickOpenService, + @IViewletService private viewletService: IViewletService ) { super('scm.switchprovider', 'Switch SCM Provider', '', true); } @@ -51,6 +53,16 @@ export class SwitchProvider extends Action { label: provider.label, run: () => this.scmService.activeProvider = provider })); + picks.push({ + label: localize('installAdditionalSCMProviders', "Install Additional SCM Providers..."), run: () => { + this.viewletService.openViewlet(EXTENSIONS_VIEWLET_ID, true).then(viewlet => viewlet as IExtensionsViewlet) + .then(viewlet => { + viewlet.search('category:"SCM Providers" @sort:installs'); + viewlet.focus(); + }); + return this.scmService.activeProvider; + } + }); return this.quickOpenService.pick(picks); } diff --git a/src/vs/workbench/parts/scm/electron-browser/scmMenus.ts b/src/vs/workbench/parts/scm/electron-browser/scmMenus.ts index f5cb2241de7..bfea5b8df9b 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmMenus.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmMenus.ts @@ -16,6 +16,8 @@ import { IAction, Action } from 'vs/base/common/actions'; import { fillInActions } from 'vs/platform/actions/browser/menuItemActionItem'; import { ContextSubMenu } from 'vs/platform/contextview/browser/contextView'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; +import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; +import { IExtensionsViewlet, VIEWLET_ID as EXTENSIONS_VIEWLET_ID } from 'vs/workbench/parts/extensions/common/extensions'; import { ISCMService, ISCMProvider, ISCMResource, ISCMResourceGroup } from 'vs/workbench/services/scm/common/scm'; import { getSCMResourceContextKey } from './scmUtil'; @@ -38,6 +40,21 @@ class SwitchProviderAction extends Action { } } +class InstallAdditionalSCMProviders extends Action { + + constructor(private viewletService: IViewletService) { + super('scm.installAdditionalSCMProviders', localize('installAdditionalSCMProviders', "Install Additional SCM Providers..."), '', true); + } + + run(): TPromise { + return this.viewletService.openViewlet(EXTENSIONS_VIEWLET_ID, true).then(viewlet => viewlet as IExtensionsViewlet) + .then(viewlet => { + viewlet.search('category:"SCM Providers" @sort:installs'); + viewlet.focus(); + }); + } +} + export class SCMMenus implements IDisposable { private disposables: IDisposable[] = []; @@ -52,7 +69,8 @@ export class SCMMenus implements IDisposable { constructor( @IContextKeyService private contextKeyService: IContextKeyService, @ISCMService private scmService: ISCMService, - @IMenuService private menuService: IMenuService + @IMenuService private menuService: IMenuService, + @IViewletService private viewletService: IViewletService ) { this.setActiveProvider(this.scmService.activeProvider); this.scmService.onDidChangeProvider(this.setActiveProvider, this, this.disposables); @@ -92,7 +110,7 @@ export class SCMMenus implements IDisposable { } getTitleSecondaryActions(): IAction[] { - const providerSwitchActions = this.scmService.providers + const providerSwitchActions: IAction[] = this.scmService.providers .map(p => new SwitchProviderAction(p, this.scmService)); let result = []; @@ -100,14 +118,16 @@ export class SCMMenus implements IDisposable { if (this.titleSecondaryActions.length > 0) { result = result.concat(this.titleSecondaryActions); } + if (providerSwitchActions.length > 0) { + providerSwitchActions.push(new Separator()); + } + providerSwitchActions.push(new InstallAdditionalSCMProviders(this.viewletService)); - if (result.length > 0 && providerSwitchActions.length > 0) { + if (result.length > 0) { result.push(new Separator()); } - if (providerSwitchActions.length > 0) { - result.push(new ContextSubMenu(localize('switch provider', "Switch SCM Provider..."), providerSwitchActions)); - } + result.push(new ContextSubMenu(localize('switch provider', "Switch SCM Provider..."), providerSwitchActions)); return result; } From 54b983873d2d7224a976007f98bf6c9f0809996a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 18 May 2017 16:12:48 +0200 Subject: [PATCH 0615/1164] add restored viewlet and count of restored editors to workspaceLoad-event --- src/vs/workbench/electron-browser/shell.ts | 4 +++- src/vs/workbench/electron-browser/workbench.ts | 16 ++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 59955d70049..5753c9c97b9 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -235,7 +235,9 @@ export class WorkbenchShell { theme: this.themeService.getColorTheme().id, language: platform.language, experiments: this.telemetryService.getExperiments(), - pinnedViewlets: info.pinnedViewlets + pinnedViewlets: info.pinnedViewlets, + restoredViewlet: info.restoredViewlet, + restoredEditors: info.restoredEditors.length }); // Telemetry: startup metrics diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 35a31823fd0..56f626450b7 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -120,6 +120,8 @@ export interface IWorkbenchStartedInfo { restoreViewletDuration: number; restoreEditorsDuration: number; pinnedViewlets: string[]; + restoredViewlet: string; + restoredEditors: string[]; } export interface IWorkbenchCallbacks { @@ -294,8 +296,8 @@ export class Workbench implements IPartService { // Restore last opened viewlet let viewletRestoreStopWatch: StopWatch; + let viewletIdToRestore: string; if (!this.sideBarHidden) { - let viewletIdToRestore: string; if (this.shouldRestoreLastOpenedViewlet()) { viewletIdToRestore = this.storageService.get(SidebarPart.activeViewletSettingsKey, StorageScope.WORKSPACE); @@ -321,6 +323,7 @@ export class Workbench implements IPartService { // Load Editors const editorRestoreStopWatch = StopWatch.create(); + const restoredEditors: string[] = []; compositeAndEditorPromises.push(this.resolveEditorsToOpen().then(inputs => { let editorOpenPromise: TPromise; if (inputs.length) { @@ -329,9 +332,16 @@ export class Workbench implements IPartService { editorOpenPromise = this.editorPart.restoreEditors(); } - return editorOpenPromise.then(() => { + return editorOpenPromise.then(editors => { this.onEditorsChanged(); // make sure we show the proper background in the editor area editorRestoreStopWatch.stop(); + for (const editor of editors) { + if (editor.input) { + restoredEditors.push(editor.input.getName()); + } else { + restoredEditors.push(`other:${editor.getId()}`); + } + } }); })); @@ -350,6 +360,8 @@ export class Workbench implements IPartService { restoreViewletDuration: viewletRestoreStopWatch ? Math.round(viewletRestoreStopWatch.elapsed()) : 0, restoreEditorsDuration: Math.round(editorRestoreStopWatch.elapsed()), pinnedViewlets: this.activitybarPart.getPinned(), + restoredViewlet: viewletIdToRestore, + restoredEditors }); } From 75650c1790a4d58b9f4d0c2deb746416a0dca989 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 18 May 2017 16:38:10 +0200 Subject: [PATCH 0616/1164] don't cancel snippet mode when inserting a nested snippet, fixes #26869 --- .../snippet/browser/snippetController2.ts | 21 +++++++++++-------- .../contrib/snippet/browser/snippetSession.ts | 12 +++++++++++ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 329caa67f7b..1b31742753b 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -57,21 +57,24 @@ export class SnippetController2 { overwriteBefore: number = 0, overwriteAfter: number = 0, undoStopBefore: boolean = true, undoStopAfter: boolean = true ): void { - if (this._snippet) { - this.cancel(); - } - this._snippet = new SnippetSession(this._editor, template, overwriteBefore, overwriteAfter); if (undoStopBefore) { this._editor.getModel().pushStackElement(); } - this._snippet.insert(); + if (!this._snippet) { + // insert with new session + this._snippet = new SnippetSession(this._editor, template, overwriteBefore, overwriteAfter); + this._snippet.insert(); + this._snippetListener = [ + this._editor.onDidChangeModel(() => this.cancel()), + this._editor.onDidChangeCursorSelection(() => this._updateState()) + ]; + } else { + // insert nested + this._snippet.insertNested(template, overwriteBefore, overwriteAfter); + } if (undoStopAfter) { this._editor.getModel().pushStackElement(); } - this._snippetListener = [ - this._editor.onDidChangeModel(() => this.cancel()), - this._editor.onDidChangeCursorSelection(() => this._updateState()) - ]; this._updateState(); } diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts index 5a5b590f93c..2b2c9ca44f2 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -291,6 +291,18 @@ export class SnippetSession { this._editor.setSelections(newSelections); } + insertNested(template: string, overwriteBefore: number = 0, overwriteAfter: number = 0): void { + const { edits } = SnippetSession.makeInsertEditsAndSnippets( + this._editor, template, overwriteBefore, overwriteAfter + ); + const model = this._editor.getModel(); + const selections = this._editor.getSelections(); + const newSelections = model.pushEditOperations(selections, edits, () => { + return this._move(true); + }); + this._editor.setSelections(newSelections); + } + next(): void { const newSelections = this._move(true); this._editor.setSelections(newSelections); From 1a285f35608b6391fa46aa131708196730bab238 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 16:44:02 +0200 Subject: [PATCH 0617/1164] tfs: publish setup only ia32 --- build/tfs/win32/3_upload.ps1 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/build/tfs/win32/3_upload.ps1 b/build/tfs/win32/3_upload.ps1 index 3f23b6d1831..f430e0d8c94 100644 --- a/build/tfs/win32/3_upload.ps1 +++ b/build/tfs/win32/3_upload.ps1 @@ -27,8 +27,10 @@ step "Publish archive" { exec { & node build/tfs/common/publish.js $Quality "$global:assetPlatform-archive" archive "VSCode-win32-$global:arch-$Version.zip" $Version true $Zip } } -step "Publish setup package" { - exec { & node build/tfs/common/publish.js $Quality "$global:assetPlatform" setup "VSCodeSetup-$global:arch-$Version.exe" $Version true $Exe } +if ($arch -eq "ia32") { + step "Publish setup package" { + exec { & node build/tfs/common/publish.js $Quality "$global:assetPlatform" setup "VSCodeSetup-$global:arch-$Version.exe" $Version true $Exe } + } } done \ No newline at end of file From 735d63c5d8ffd2d4449d4317fdfbee819fc71795 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 16:49:45 +0200 Subject: [PATCH 0618/1164] tfs: remove bad arch --- build/gulpfile.vscode.js | 1 - 1 file changed, 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index d4effb3d819..f91e140fd96 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -199,7 +199,6 @@ function packageTask(platform, arch, opts) { const destination = path.join(path.dirname(root), 'VSCode') + (platform ? '-' + platform : '') + (arch ? '-' + arch : ''); platform = platform || process.platform; - arch = platform === 'win32' ? 'ia32' : arch; return () => { const out = opts.minified ? 'out-vscode-min' : 'out-vscode'; From e637dd32284b3a49f74df5854dbd748d09b27d5c Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 18 May 2017 16:49:48 +0200 Subject: [PATCH 0619/1164] send telemetry when an update is available --- src/vs/platform/update/electron-main/updateService.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/platform/update/electron-main/updateService.ts b/src/vs/platform/update/electron-main/updateService.ts index 77ef33d20fe..aa3f75c6d51 100644 --- a/src/vs/platform/update/electron-main/updateService.ts +++ b/src/vs/platform/update/electron-main/updateService.ts @@ -177,6 +177,7 @@ export class UpdateService implements IUpdateService { this._availableUpdate = data; this._onUpdateAvailable.fire({ url: update.url, version: update.version }); this.state = State.UpdateAvailable; + this.telemetryService.publicLog('update:available', { explicit, version: update.version, currentVersion: product.commit }); } else { const data: IUpdate = { From 1429328d16c56068a6471ca56feb3806864291f2 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 18 May 2017 17:06:30 +0200 Subject: [PATCH 0620/1164] tfs: fix 32 bit --- build/tfs/win32/1_build.ps1 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/build/tfs/win32/1_build.ps1 b/build/tfs/win32/1_build.ps1 index 85143023e72..0f473ddeff5 100644 --- a/build/tfs/win32/1_build.ps1 +++ b/build/tfs/win32/1_build.ps1 @@ -12,8 +12,11 @@ Param( $env:HOME=$env:USERPROFILE "machine monacotools.visualstudio.com password ${vsoPAT}" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII +# Set the right architecture +$env:npm_config_arch="$arch" + step "Install dependencies" { - exec { & npm install "--arch=$global:arch" } + exec { & npm install } } $env:VSCODE_MIXIN_PASSWORD = $mixinPassword @@ -26,7 +29,7 @@ step "Get Electron" { } step "Install distro dependencies" { - exec { & node build\tfs\common\installDistro.js "--arch=$global:arch" } + exec { & node build\tfs\common\installDistro.js } } step "Build minified" { From 3d1a0cc23ca943fd7a48c5300665e39a83665246 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 18 May 2017 17:12:45 +0200 Subject: [PATCH 0621/1164] Name polish for editor.showFoldingControls (#4812) --- src/vs/editor/common/config/commonEditorConfig.ts | 9 +++++---- src/vs/editor/common/config/editorOptions.ts | 14 +++++++------- src/vs/editor/contrib/folding/browser/folding.ts | 12 ++++++------ src/vs/monaco.d.ts | 8 ++++---- 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index f1830ec4f78..f541796f5c5 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -486,10 +486,11 @@ const editorConfiguration: IConfigurationNode = { 'default': EDITOR_DEFAULTS.contribInfo.folding, 'description': nls.localize('folding', "Controls whether the editor has code folding enabled") }, - 'editor.hideFoldIcons': { - 'type': 'boolean', - 'default': EDITOR_DEFAULTS.contribInfo.hideFoldIcons, - 'description': nls.localize('hideFoldIcons', "Controls whether the fold icons on the gutter are automatically hidden.") + 'editor.showFoldingControls': { + 'type': 'string', + 'enum': ['always', 'mouseover'], + 'default': EDITOR_DEFAULTS.contribInfo.showFoldingControls, + 'description': nls.localize('showFoldingControls', "Controls whether the fold controls on the gutter are automatically hidden.") }, 'editor.matchBrackets': { 'type': 'boolean', diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 5c43033f67a..ce5208a0523 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -420,10 +420,10 @@ export interface IEditorOptions { */ folding?: boolean; /** - * Enable automatic hiding of non-collapsed fold icons in the gutter. - * Defaults to true. + * Controls whether the fold actions in the gutter stay always visible or hide unless the mouse is over the gutter. + * Defaults to 'mouseover'. */ - hideFoldIcons?: boolean; + showFoldingControls?: 'always' | 'mouseover'; /** * Enable highlighting of matching brackets. * Defaults to true. @@ -736,7 +736,7 @@ export interface EditorContribOptions { readonly occurrencesHighlight: boolean; readonly codeLens: boolean; readonly folding: boolean; - readonly hideFoldIcons: boolean; + readonly showFoldingControls: 'always' | 'mouseover'; readonly matchBrackets: boolean; } @@ -1045,7 +1045,7 @@ export class InternalEditorOptions { && a.occurrencesHighlight === b.occurrencesHighlight && a.codeLens === b.codeLens && a.folding === b.folding - && a.hideFoldIcons === b.hideFoldIcons + && a.showFoldingControls === b.showFoldingControls && a.matchBrackets === b.matchBrackets ); } @@ -1542,7 +1542,7 @@ export class EditorOptionsValidator { occurrencesHighlight: _boolean(opts.occurrencesHighlight, defaults.occurrencesHighlight), codeLens: _boolean(opts.codeLens, defaults.codeLens) && _boolean(opts.referenceInfos, true), folding: _boolean(opts.folding, defaults.folding), - hideFoldIcons: _boolean(opts.hideFoldIcons, defaults.hideFoldIcons), + showFoldingControls: _stringSet<'always' | 'mouseover'>(opts.showFoldingControls, defaults.showFoldingControls, ['always', 'mouseover']), matchBrackets: _boolean(opts.matchBrackets, defaults.matchBrackets), }; } @@ -1949,7 +1949,7 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { occurrencesHighlight: true, codeLens: true, folding: true, - hideFoldIcons: true, + showFoldingControls: 'mouseover', matchBrackets: true, }, }; diff --git a/src/vs/editor/contrib/folding/browser/folding.ts b/src/vs/editor/contrib/folding/browser/folding.ts index 24fe018b8de..f89d26c6536 100644 --- a/src/vs/editor/contrib/folding/browser/folding.ts +++ b/src/vs/editor/contrib/folding/browser/folding.ts @@ -36,7 +36,7 @@ export class FoldingController implements IFoldingController { private editor: ICodeEditor; private _isEnabled: boolean; - private _hideFoldIcons: boolean; + private _showFoldingControls: 'always' | 'mouseover'; private globalToDispose: IDisposable[]; private computeToken: number; @@ -49,7 +49,7 @@ export class FoldingController implements IFoldingController { constructor(editor: ICodeEditor) { this.editor = editor; this._isEnabled = this.editor.getConfiguration().contribInfo.folding; - this._hideFoldIcons = this.editor.getConfiguration().contribInfo.hideFoldIcons; + this._showFoldingControls = this.editor.getConfiguration().contribInfo.showFoldingControls; this.globalToDispose = []; this.localToDispose = []; @@ -63,9 +63,9 @@ export class FoldingController implements IFoldingController { if (oldIsEnabled !== this._isEnabled) { this.onModelChanged(); } - let oldHideFoldIcons = this._hideFoldIcons; - this._hideFoldIcons = this.editor.getConfiguration().contribInfo.hideFoldIcons; - if (oldHideFoldIcons !== this._hideFoldIcons) { + let oldShowFoldingControls = this._showFoldingControls; + this._showFoldingControls = this.editor.getConfiguration().contribInfo.showFoldingControls; + if (oldShowFoldingControls !== this._showFoldingControls) { this.updateHideFoldIconClass(); } })); @@ -85,7 +85,7 @@ export class FoldingController implements IFoldingController { private updateHideFoldIconClass(): void { let domNode = this.editor.getDomNode(); if (domNode) { - dom.toggleClass(domNode, 'alwaysShowFoldIcons', this._hideFoldIcons === false); + dom.toggleClass(domNode, 'alwaysShowFoldIcons', this._showFoldingControls === 'always'); } } diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index a06eec92796..140e5d7e7ae 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -2978,10 +2978,10 @@ declare module monaco.editor { */ folding?: boolean; /** - * Enable automatic hiding of non-collapsed fold icons in the gutter. - * Defaults to true. + * Controls whether the fold actions in the gutter stay always visible or hide unless the mouse is over the gutter. + * Defaults to 'mouseover'. */ - hideFoldIcons?: boolean; + showFoldingControls?: 'always' | 'mouseover'; /** * Enable highlighting of matching brackets. * Defaults to true. @@ -3239,7 +3239,7 @@ declare module monaco.editor { readonly occurrencesHighlight: boolean; readonly codeLens: boolean; readonly folding: boolean; - readonly hideFoldIcons: boolean; + readonly showFoldingControls: 'always' | 'mouseover'; readonly matchBrackets: boolean; } From 7371cfd703f041a1c3ab25450d5afd21ca386504 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 18 May 2017 17:33:36 +0200 Subject: [PATCH 0622/1164] add ILifecycleService#startupKind --- src/vs/code/electron-main/lifecycle.ts | 10 ++--- src/vs/platform/lifecycle/common/lifecycle.ts | 28 +++++++++---- src/vs/workbench/electron-browser/shell.ts | 5 ++- .../electron-browser/lifecycleService.ts | 42 ++++++++++++++----- .../workbench/test/workbenchTestServices.ts | 5 ++- 5 files changed, 64 insertions(+), 26 deletions(-) diff --git a/src/vs/code/electron-main/lifecycle.ts b/src/vs/code/electron-main/lifecycle.ts index 7623a917086..895f8b05684 100644 --- a/src/vs/code/electron-main/lifecycle.ts +++ b/src/vs/code/electron-main/lifecycle.ts @@ -17,10 +17,10 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' export const ILifecycleService = createDecorator('lifecycleService'); export enum UnloadReason { - CLOSE, - QUIT, - RELOAD, - LOAD + CLOSE = 1, + QUIT = 2, + RELOAD = 3, + LOAD = 4 } export interface ILifecycleService { @@ -264,4 +264,4 @@ export class LifecycleService implements ILifecycleService { public isQuitRequested(): boolean { return !!this.quitRequested; } -} \ No newline at end of file +} diff --git a/src/vs/platform/lifecycle/common/lifecycle.ts b/src/vs/platform/lifecycle/common/lifecycle.ts index d6fdf34ddb5..1cd1ab93cea 100644 --- a/src/vs/platform/lifecycle/common/lifecycle.ts +++ b/src/vs/platform/lifecycle/common/lifecycle.ts @@ -26,16 +26,22 @@ export interface ShutdownEvent { export enum ShutdownReason { /** Window is closed */ - CLOSE, + CLOSE = 1, /** Application is quit */ - QUIT, + QUIT = 2, /** Window is reloaded */ - RELOAD, + RELOAD = 3, /** Other configuration loaded into window */ - LOAD + LOAD = 4 +} + +export enum StartupKind { + NewWindow = 1, + ReloadedWindow = 3, + ReopenedWindow = 4, } /** @@ -46,17 +52,22 @@ export interface ILifecycleService { _serviceBrand: any; + /** + * Value indicates how this window got loaded. + */ + readonly startupKind: StartupKind; + /** * A flag indicating if the application is in the process of shutting down. This will be true * before the onWillShutdown event is fired and false if the shutdown is being vetoed. */ - willShutdown: boolean; + readonly willShutdown: boolean; /** * Fired before shutdown happens. Allows listeners to veto against the * shutdown. */ - onWillShutdown: Event; + readonly onWillShutdown: Event; /** * Fired when no client is preventing the shutdown from happening. Can be used to dispose heavy resources @@ -64,12 +75,13 @@ export interface ILifecycleService { * * The event carries a shutdown reason that indicates how the shutdown was triggered. */ - onShutdown: Event; + readonly onShutdown: Event; } export const NullLifecycleService: ILifecycleService = { _serviceBrand: null, + startupKind: StartupKind.NewWindow, willShutdown: false, onWillShutdown: () => ({ dispose() { } }), onShutdown: (reason) => ({ dispose() { } }) -}; \ No newline at end of file +}; diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 5753c9c97b9..1f25faacf43 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -132,6 +132,7 @@ export class WorkbenchShell { private windowIPCService: IWindowIPCService; private timerService: ITimerService; private themeService: WorkbenchThemeService; + private lifecycleService: ILifecycleService; private container: HTMLElement; private toUnbind: IDisposable[]; @@ -237,7 +238,8 @@ export class WorkbenchShell { experiments: this.telemetryService.getExperiments(), pinnedViewlets: info.pinnedViewlets, restoredViewlet: info.restoredViewlet, - restoredEditors: info.restoredEditors.length + restoredEditors: info.restoredEditors.length, + startupKind: this.lifecycleService.startupKind }); // Telemetry: startup metrics @@ -357,6 +359,7 @@ export class WorkbenchShell { this.toUnbind.push(lifecycleService.onShutdown(reason => saveFontInfo(this.storageService))); serviceCollection.set(ILifecycleService, lifecycleService); disposables.add(lifecycleTelemetry(this.telemetryService, lifecycleService)); + this.lifecycleService = lifecycleService; const extensionManagementChannel = getDelayedChannel(sharedProcess.then(c => c.getChannel('extensions'))); serviceCollection.set(IExtensionManagementService, new SyncDescriptor(ExtensionManagementChannelClient, extensionManagementChannel)); diff --git a/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts b/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts index 105a9d202af..e3c3f8e63ea 100644 --- a/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts +++ b/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts @@ -7,26 +7,46 @@ import { TPromise } from 'vs/base/common/winjs.base'; import Severity from 'vs/base/common/severity'; import { toErrorMessage } from 'vs/base/common/errorMessage'; -import { ILifecycleService, ShutdownEvent, ShutdownReason } from 'vs/platform/lifecycle/common/lifecycle'; +import { ILifecycleService, ShutdownEvent, ShutdownReason, StartupKind } from 'vs/platform/lifecycle/common/lifecycle'; import { IMessageService } from 'vs/platform/message/common/message'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IWindowIPCService } from 'vs/workbench/services/window/electron-browser/windowService'; import { ipcRenderer as ipc } from 'electron'; import Event, { Emitter } from 'vs/base/common/event'; export class LifecycleService implements ILifecycleService { + private static readonly _lastShutdownReasonKey = 'lifecyle.lastShutdownReason'; + public _serviceBrand: any; - private _onWillShutdown = new Emitter(); - private _onShutdown = new Emitter(); + private readonly _onWillShutdown = new Emitter(); + private readonly _onShutdown = new Emitter(); + private readonly _startupKind: StartupKind; private _willShutdown: boolean; constructor( - @IMessageService private messageService: IMessageService, - @IWindowIPCService private windowService: IWindowIPCService + @IMessageService private _messageService: IMessageService, + @IWindowIPCService private _windowService: IWindowIPCService, + @IStorageService private _storageService: IStorageService ) { - this.registerListeners(); + this._registerListeners(); + + const lastShutdownReason = this._storageService.getInteger(LifecycleService._lastShutdownReasonKey, StorageScope.WORKSPACE); + this._storageService.remove(LifecycleService._lastShutdownReasonKey, StorageScope.WORKSPACE); + if (lastShutdownReason === ShutdownReason.RELOAD) { + this._startupKind = StartupKind.ReloadedWindow; + } else if (lastShutdownReason === ShutdownReason.LOAD) { + this._startupKind = StartupKind.ReopenedWindow; + } else { + this._startupKind = StartupKind.NewWindow; + } + console.log(this.startupKind); + } + + public get startupKind(): StartupKind { + return this._startupKind; } public get willShutdown(): boolean { @@ -41,16 +61,18 @@ export class LifecycleService implements ILifecycleService { return this._onShutdown.event; } - private registerListeners(): void { - const windowId = this.windowService.getWindowId(); + private _registerListeners(): void { + const windowId = this._windowService.getWindowId(); // Main side indicates that window is about to unload, check for vetos ipc.on('vscode:beforeUnload', (event, reply: { okChannel: string, cancelChannel: string, reason: ShutdownReason }) => { this._willShutdown = true; + this._storageService.store(LifecycleService._lastShutdownReasonKey, JSON.stringify(reply.reason), StorageScope.WORKSPACE); // trigger onWillShutdown events and veto collecting this.onBeforeUnload(reply.reason).done(veto => { if (veto) { + this._storageService.remove(LifecycleService._lastShutdownReasonKey, StorageScope.WORKSPACE); this._willShutdown = false; // reset this flag since the shutdown has been vetoed! ipc.send(reply.cancelChannel, windowId); } else { @@ -92,11 +114,11 @@ export class LifecycleService implements ILifecycleService { } }, err => { // error, treated like a veto, done - this.messageService.show(Severity.Error, toErrorMessage(err)); + this._messageService.show(Severity.Error, toErrorMessage(err)); lazyValue = true; })); } } return TPromise.join(promises).then(() => lazyValue); } -} \ No newline at end of file +} diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index bc6068ce24e..bc6e0f5e11d 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -28,7 +28,7 @@ import { IEditorInput, IEditorOptions, Position, Direction, IEditor, IResourceIn import { IUntitledEditorService, UntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { IMessageService, IConfirmation } from 'vs/platform/message/common/message'; import { IWorkspace, IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { ILifecycleService, ShutdownEvent, ShutdownReason } from 'vs/platform/lifecycle/common/lifecycle'; +import { ILifecycleService, ShutdownEvent, ShutdownReason, StartupKind } from 'vs/platform/lifecycle/common/lifecycle'; import { EditorStacksModel } from 'vs/workbench/common/editor/editorStacksModel'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; @@ -855,6 +855,7 @@ export class TestLifecycleService implements ILifecycleService { public _serviceBrand: any; public willShutdown: boolean; + public startupKind: StartupKind; private _onWillShutdown = new Emitter(); private _onShutdown = new Emitter(); @@ -1023,4 +1024,4 @@ export class TestThemeService implements IThemeService { onThemeChange(participant: IThemingParticipant): IDisposable { return { dispose: () => { } }; } -} \ No newline at end of file +} From fade7d4687d2bab930e7f6345d6df84b5fb6b5ce Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Wed, 17 May 2017 16:13:37 -0700 Subject: [PATCH 0623/1164] Reorder / relabel help links --- .../welcome/page/electron-browser/vs_code_welcome_page.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts b/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts index dbc50a757c3..6f52d129c86 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts +++ b/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts @@ -39,9 +39,9 @@ export default () => `

    ${escape(localize('welcomePage.help', "Help"))}

    From b00945fc8c79f6db74b280ef53eba060ed9a1388 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 18 May 2017 12:33:48 -0700 Subject: [PATCH 0624/1164] Quick link for tools and languages (fixes #22098) --- product.json | 5 + .../extensions/browser/extensionsActions.ts | 28 +++ .../extensions.contribution.ts | 7 +- ...keymapExtensions.ts => extensionsUtils.ts} | 24 +-- .../electron-browser/vs_code_welcome_page.ts | 14 +- .../page/electron-browser/welcomePage.css | 6 +- .../page/electron-browser/welcomePage.ts | 190 ++++++++++++------ 7 files changed, 191 insertions(+), 83 deletions(-) rename src/vs/workbench/parts/extensions/electron-browser/{keymapExtensions.ts => extensionsUtils.ts} (81%) diff --git a/product.json b/product.json index 49f852e2928..b4c35813f4e 100644 --- a/product.json +++ b/product.json @@ -14,5 +14,10 @@ "win32ShellNameShort": "C&ode - OSS", "darwinBundleIdentifier": "com.visualstudio.code.oss", "reportIssueUrl": "https://github.com/Microsoft/vscode/issues/new", + "extensionsGallery": { + "serviceUrl": "https://marketplace.visualstudio.com/_apis/public/gallery", + "cacheUrl": "https://vscode.blob.core.windows.net/gallery/index", + "itemUrl": "https://marketplace.visualstudio.com/items" + }, "urlProtocol": "code-oss" } \ No newline at end of file diff --git a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts index 748b574f248..6b29b621d0f 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts @@ -1048,6 +1048,34 @@ export class ShowRecommendedKeymapExtensionsAction extends Action { } } +export class ShowExtensionPacksAction extends Action { + + static ID = 'workbench.extensions.action.showExtensionPacks'; + static LABEL = localize('showExtensionPacks', "Show Extension Packs"); + static SHORT_LABEL = localize('showExtensionPacksShort', "Extension Packs"); + + constructor( + id: string, + label: string, + @IViewletService private viewletService: IViewletService + ) { + super(id, label, null, true); + } + + run(): TPromise { + return this.viewletService.openViewlet(VIEWLET_ID, true) + .then(viewlet => viewlet as IExtensionsViewlet) + .then(viewlet => { + viewlet.search('@sort:installs @category:"extension packs" '); + viewlet.focus(); + }); + } + + protected isEnabled(): boolean { + return true; + } +} + export class ChangeSortAction extends Action { private query: Query; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts index 827ae6984e1..c46c015065d 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts @@ -24,7 +24,7 @@ import { ExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/node/e import { OpenExtensionsViewletAction, InstallExtensionsAction, ShowOutdatedExtensionsAction, ShowRecommendedExtensionsAction, ShowRecommendedKeymapExtensionsAction, ShowWorkspaceRecommendedExtensionsAction, ShowPopularExtensionsAction, ShowInstalledExtensionsAction, ShowDisabledExtensionsAction, UpdateAllAction, ConfigureWorkspaceRecommendedExtensionsAction, - EnableAllAction, EnableAllWorkpsaceAction, DisableAllAction, DisableAllWorkpsaceAction, CheckForUpdatesAction + EnableAllAction, EnableAllWorkpsaceAction, DisableAllAction, DisableAllWorkpsaceAction, CheckForUpdatesAction, ShowExtensionPacksAction } from 'vs/workbench/parts/extensions/browser/extensionsActions'; import { OpenExtensionsFolderAction, InstallVSIXAction } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions'; import { ExtensionsInput } from 'vs/workbench/parts/extensions/common/extensionsInput'; @@ -37,7 +37,7 @@ import jsonContributionRegistry = require('vs/platform/jsonschemas/common/jsonCo import { ExtensionsConfigurationSchema, ExtensionsConfigurationSchemaId } from 'vs/workbench/parts/extensions/common/extensionsFileTemplate'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { KeymapExtensions } from 'vs/workbench/parts/extensions/electron-browser/keymapExtensions'; +import { KeymapExtensions } from 'vs/workbench/parts/extensions/electron-browser/extensionsUtils'; import { adoptToGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; // Singletons @@ -115,6 +115,9 @@ actionRegistry.registerWorkbenchAction(recommendationsActionDescriptor, 'Extensi const keymapRecommendationsActionDescriptor = new SyncActionDescriptor(ShowRecommendedKeymapExtensionsAction, ShowRecommendedKeymapExtensionsAction.ID, ShowRecommendedKeymapExtensionsAction.SHORT_LABEL, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_M) }); actionRegistry.registerWorkbenchAction(keymapRecommendationsActionDescriptor, 'Preferences: Keymaps', PreferencesLabel); +const extensionPacksActionDescriptor = new SyncActionDescriptor(ShowExtensionPacksAction, ShowExtensionPacksAction.ID, ShowExtensionPacksAction.SHORT_LABEL); +actionRegistry.registerWorkbenchAction(extensionPacksActionDescriptor, 'Extensions: Extension Packs', PreferencesLabel); + const workspaceRecommendationsActionDescriptor = new SyncActionDescriptor(ShowWorkspaceRecommendedExtensionsAction, ShowWorkspaceRecommendedExtensionsAction.ID, ShowWorkspaceRecommendedExtensionsAction.LABEL); actionRegistry.registerWorkbenchAction(workspaceRecommendationsActionDescriptor, 'Extensions: Show Workspace Recommended Extensions', ExtensionsLabel); diff --git a/src/vs/workbench/parts/extensions/electron-browser/keymapExtensions.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts similarity index 81% rename from src/vs/workbench/parts/extensions/electron-browser/keymapExtensions.ts rename to src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts index 5c30ad7c0be..e8802bef6f1 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/keymapExtensions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts @@ -19,7 +19,7 @@ import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -export interface IKeymapExtension { +export interface IExtensionStatus { identifier: string; local: ILocalExtension; globallyEnabled: boolean; @@ -32,13 +32,14 @@ export class KeymapExtensions implements IWorkbenchContribution { constructor( @IInstantiationService private instantiationService: IInstantiationService, @IExtensionEnablementService private extensionEnablementService: IExtensionEnablementService, + @IExtensionTipsService private tipsService: IExtensionTipsService, @IChoiceService private choiceService: IChoiceService, @ILifecycleService lifecycleService: ILifecycleService, @ITelemetryService private telemetryService: ITelemetryService, ) { this.disposables.push( lifecycleService.onShutdown(() => this.dispose()), - instantiationService.invokeFunction(onKeymapExtensionChanged)((ids => { + instantiationService.invokeFunction(onExtensionChanged)((ids => { TPromise.join(ids.map(id => this.checkForOtherKeymaps(id))) .then(null, onUnexpectedError); })) @@ -50,10 +51,11 @@ export class KeymapExtensions implements IWorkbenchContribution { } private checkForOtherKeymaps(extensionId: string): TPromise { - return this.instantiationService.invokeFunction(getInstalledKeymaps).then(extensions => { - const extension = arrays.first(extensions, extension => extension.identifier === extensionId); + return this.instantiationService.invokeFunction(getInstalledExtensions).then(extensions => { + const keymaps = extensions.filter(extension => isKeymapExtension(this.tipsService, extension)); + const extension = arrays.first(keymaps, extension => extension.identifier === extensionId); if (extension && extension.globallyEnabled) { - const otherKeymaps = extensions.filter(extension => extension.identifier !== extensionId && extension.globallyEnabled); + const otherKeymaps = keymaps.filter(extension => extension.identifier !== extensionId && extension.globallyEnabled); if (otherKeymaps.length) { return this.promptForDisablingOtherKeymaps(extension, otherKeymaps); } @@ -62,7 +64,7 @@ export class KeymapExtensions implements IWorkbenchContribution { }); } - private promptForDisablingOtherKeymaps(newKeymap: IKeymapExtension, oldKeymaps: IKeymapExtension[]): TPromise { + private promptForDisablingOtherKeymaps(newKeymap: IExtensionStatus, oldKeymaps: IExtensionStatus[]): TPromise { const telemetryData: { [key: string]: any; } = { newKeymap: newKeymap.identifier, oldKeymaps: oldKeymaps.map(k => k.identifier) @@ -92,7 +94,7 @@ export class KeymapExtensions implements IWorkbenchContribution { } } -export function onKeymapExtensionChanged(accessor: ServicesAccessor): Event { +export function onExtensionChanged(accessor: ServicesAccessor): Event { const extensionService = accessor.get(IExtensionManagementService); const extensionEnablementService = accessor.get(IExtensionEnablementService); return debounceEvent(any( @@ -110,13 +112,12 @@ export function onKeymapExtensionChanged(accessor: ServicesAccessor): Event { +export function getInstalledExtensions(accessor: ServicesAccessor): TPromise { const extensionService = accessor.get(IExtensionManagementService); const extensionEnablementService = accessor.get(IExtensionEnablementService); - const tipsService = accessor.get(IExtensionTipsService); return extensionService.getInstalled().then(extensions => { const globallyDisabled = extensionEnablementService.getGloballyDisabledExtensions(); - const installedExtensions = extensions.map(extension => { + return extensions.map(extension => { const identifier = stripVersion(extension.id); return { identifier, @@ -124,11 +125,10 @@ export function getInstalledKeymaps(accessor: ServicesAccessor): TPromise isKeymapExtension(tipsService, extension)); }); } -function isKeymapExtension(tipsService: IExtensionTipsService, extension: IKeymapExtension): boolean { +export function isKeymapExtension(tipsService: IExtensionTipsService, extension: IExtensionStatus): boolean { const cats = extension.local.manifest.categories; return cats && cats.indexOf('Keymaps') !== -1 || tipsService.getKeymapRecommendations().indexOf(extension.identifier) !== -1; } diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts b/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts index 6f52d129c86..041c4026aa7 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts +++ b/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts @@ -52,14 +52,15 @@ export default () => `

    ${escape(localize('welcomePage.customize', "Customize"))}

      -
    • +
    • -
    @@ -74,6 +75,7 @@ export default () => `

    ${escape(localize('welcomePage.quickLinks', "Quick links"))}

    • +
    diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css index 78cee53838d..982a72d9d1b 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css +++ b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css @@ -245,13 +245,13 @@ outline-offset: -5px; } -.monaco-workbench > .part.editor > .content .welcomePage .commands li button .currentKeymap { +.monaco-workbench > .part.editor > .content .welcomePage .commands li button .enabledExtension { display: none; } -.monaco-workbench > .part.editor > .content .welcomePage .commands li button .installKeymap.installed { +.monaco-workbench > .part.editor > .content .welcomePage .commands li button .installExtension.installed { display: none; } -.monaco-workbench > .part.editor > .content .welcomePage .commands li button .currentKeymap.installed { +.monaco-workbench > .part.editor > .content .welcomePage .commands li button .enabledExtension.installed { display: inline; } diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts index cb7607b1648..874bc17d8dd 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts +++ b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts @@ -27,8 +27,8 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { Schemas } from 'vs/base/common/network'; import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; import { IMessageService, Severity, CloseAction } from 'vs/platform/message/common/message'; -import { getInstalledKeymaps, IKeymapExtension, onKeymapExtensionChanged } from 'vs/workbench/parts/extensions/electron-browser/keymapExtensions'; -import { IExtensionEnablementService, IExtensionManagementService, IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { getInstalledExtensions, IExtensionStatus, onExtensionChanged, isKeymapExtension } from 'vs/workbench/parts/extensions/electron-browser/extensionsUtils'; +import { IExtensionEnablementService, IExtensionManagementService, IExtensionGalleryService, IExtensionTipsService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { used } from 'vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; @@ -101,6 +101,57 @@ const reorderedQuickLinks = [ 'showInteractivePlayground', ]; +interface ExtensionSuggestion { + name: string; + id: string; + isKeymap?: boolean; +} + +const extensionPacks: ExtensionSuggestion[] = [ + { name: localize('welcomePage.javaScript', "JavaScript"), id: 'dbaeumer.vscode-eslint' }, + { name: localize('welcomePage.typeScript', "TypeScript"), id: 'eg2.tslint' }, + { name: localize('welcomePage.python', "Python"), id: 'donjayamanne.python' }, + // { name: localize('welcomePage.go', "Go"), id: 'lukehoban.go' }, + { name: localize('welcomePage.php', "PHP"), id: 'felixfbecker.php-pack' }, + { name: localize('welcomePage.docker', "Docker"), id: 'PeterJausovec.vscode-docker' }, +]; + +const keymapExtensions: ExtensionSuggestion[] = [ + { name: localize('welcomePage.vim', "Vim"), id: 'vscodevim.vim', isKeymap: true }, + { name: localize('welcomePage.sublime', "Sublime"), id: 'ms-vscode.sublime-keybindings', isKeymap: true }, + { name: localize('welcomePage.atom', "Atom"), id: 'ms-vscode.atom-keybindings', isKeymap: true }, +]; + +interface Strings { + installEvent: string; + installedEvent: string; + + alreadyInstalled: string; + reloadAfterInstall: string; + installing: string; + extensionNotFound: string; +} + +const extensionPackStrings: Strings = { + installEvent: 'installExtension', + installedEvent: 'installedExtension', + + alreadyInstalled: localize('welcomePage.extensionPackAlreadyInstalled', "Support for {0} is already installed."), + reloadAfterInstall: localize('welcomePage.willReloadAfterInstallingExtensionPack', "The window will reload after installing support for {0}."), + installing: localize('welcomePage.installingExtensionPack', "Installing support for {0}..."), + extensionNotFound: localize('welcomePage.extensionPackNotFound', "Support for {0} with id {1} could not be found."), +}; + +const keymapStrings: Strings = { + installEvent: 'installKeymap', + installedEvent: 'installedKeymap', + + alreadyInstalled: localize('welcomePage.keymapAlreadyInstalled', "The {0} keyboard shortcuts are already installed."), + reloadAfterInstall: localize('welcomePage.willReloadAfterInstallingKeymap', "The window will reload after installing the {0} keyboard shortcuts."), + installing: localize('welcomePage.installingKeymap', "Installing the {0} keyboard shortcuts..."), + extensionNotFound: localize('welcomePage.keymapNotFound', "The {0} keyboard shortcuts with id {1} could not be found."), +}; + class WelcomePage { private disposables: IDisposable[] = []; @@ -118,6 +169,7 @@ class WelcomePage { @IExtensionEnablementService private extensionEnablementService: IExtensionEnablementService, @IExtensionGalleryService private extensionGalleryService: IExtensionGalleryService, @IExtensionManagementService private extensionManagementService: IExtensionManagementService, + @IExtensionTipsService private tipsService: IExtensionTipsService, @ILifecycleService lifecycleService: ILifecycleService, @IThemeService private themeService: IThemeService, @ITelemetryService private telemetryService: ITelemetryService @@ -128,18 +180,18 @@ class WelcomePage { private create() { const recentlyOpened = this.windowService.getRecentlyOpen(); - const installedKeymaps = this.instantiationService.invokeFunction(getInstalledKeymaps); + const installedExtensions = this.instantiationService.invokeFunction(getInstalledExtensions); const uri = URI.parse(require.toUrl('./vs_code_welcome_page')) .with({ scheme: Schemas.walkThrough, query: JSON.stringify({ moduleId: 'vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page' }) }); - const input = this.instantiationService.createInstance(WalkThroughInput, localize('welcome.title', "Welcome"), '', uri, telemetryFrom, container => this.onReady(container, recentlyOpened, installedKeymaps)); + const input = this.instantiationService.createInstance(WalkThroughInput, localize('welcome.title', "Welcome"), '', uri, telemetryFrom, container => this.onReady(container, recentlyOpened, installedExtensions)); this.editorService.openEditor(input, { pinned: true }, Position.ONE) .then(null, onUnexpectedError); } - private onReady(container: HTMLElement, recentlyOpened: TPromise<{ files: string[]; folders: string[]; }>, installedKeymaps: TPromise): void { + private onReady(container: HTMLElement, recentlyOpened: TPromise<{ files: string[]; folders: string[]; }>, installedExtensions: TPromise): void { const enabled = this.configurationService.lookup(enabledKey).value; const showOnStartup = container.querySelector('#showOnStartup'); if (enabled) { @@ -214,32 +266,50 @@ class WelcomePage { quickLinks.remove(); } - container.addEventListener('click', event => { - for (let node = event.target as HTMLElement; node; node = node.parentNode as HTMLElement) { - if (node instanceof HTMLAnchorElement && node.classList.contains('installKeymap')) { - const keymapName = node.getAttribute('data-keymap-name'); - const keymapIdentifier = node.getAttribute('data-keymap'); - if (keymapName && keymapIdentifier) { - this.installKeymap(keymapName, keymapIdentifier); - event.preventDefault(); - event.stopPropagation(); - } - } - } - }); + this.addExtensionList(container, '.extensionPackList', extensionPacks, extensionPackStrings); + this.addExtensionList(container, '.keymapList', keymapExtensions, keymapStrings); - this.updateInstalledKeymaps(container, installedKeymaps); - this.disposables.push(this.instantiationService.invokeFunction(onKeymapExtensionChanged)(ids => { + this.updateInstalledExtensions(container, installedExtensions); + this.disposables.push(this.instantiationService.invokeFunction(onExtensionChanged)(ids => { for (const id of ids) { - if (container.querySelector(`.installKeymap[data-keymap="${id}"], .currentKeymap[data-keymap="${id}"]`)) { - const installedKeymaps = this.instantiationService.invokeFunction(getInstalledKeymaps); - this.updateInstalledKeymaps(container, installedKeymaps); + if (container.querySelector(`.installExtension[data-extension="${id}"], .enabledExtension[data-extension="${id}"]`)) { + const installedExtensions = this.instantiationService.invokeFunction(getInstalledExtensions); + this.updateInstalledExtensions(container, installedExtensions); break; } }; })); } + private addExtensionList(container: HTMLElement, listSelector: string, suggestions: ExtensionSuggestion[], strings: Strings) { + const list = container.querySelector(listSelector); + if (list) { + suggestions.forEach((extension, i) => { + if (i) { + list.appendChild(document.createTextNode(localize('welcomePage.extensionListSeparator', ", "))); + } + + const a = document.createElement('a'); + a.innerText = extension.name; + a.classList.add('installExtension'); + a.setAttribute('data-extension', extension.id); + a.href = 'javascript:void(0)'; + a.addEventListener('click', e => { + this.installExtension(extension, strings); + e.preventDefault(); + e.stopPropagation(); + }); + list.appendChild(a); + + const span = document.createElement('span'); + span.innerText = localize('welcomePage.installedExtension', "{0} (installed)", extension.name); + span.classList.add('enabledExtension'); + span.setAttribute('data-extension', extension.id); + list.appendChild(span); + }); + } + } + private pathEquals(path1: string, path2: string): boolean { if (!isLinux) { path1 = path1.toLowerCase(); @@ -249,23 +319,23 @@ class WelcomePage { return path1 === path2; } - private installKeymap(keymapName: string, keymapIdentifier: string): void { - this.telemetryService.publicLog('installKeymap', { + private installExtension(extensionSuggestion: ExtensionSuggestion, strings: Strings): void { + this.telemetryService.publicLog(strings.installEvent, { from: telemetryFrom, - extensionId: keymapIdentifier, + extensionId: extensionSuggestion.id, }); - this.instantiationService.invokeFunction(getInstalledKeymaps).then(extensions => { - const keymap = arrays.first(extensions, extension => extension.identifier === keymapIdentifier); - if (keymap && keymap.globallyEnabled) { - this.telemetryService.publicLog('installedKeymap', { + this.instantiationService.invokeFunction(getInstalledExtensions).then(extensions => { + const installedExtension = arrays.first(extensions, extension => extension.identifier === extensionSuggestion.id); + if (installedExtension && installedExtension.globallyEnabled) { + this.telemetryService.publicLog(strings.installedEvent, { from: telemetryFrom, - extensionId: keymapIdentifier, + extensionId: extensionSuggestion.id, outcome: 'already_enabled', }); - this.messageService.show(Severity.Info, localize('welcomePage.keymapAlreadyInstalled', "The {0} keyboard shortcuts are already installed.", keymapName)); + this.messageService.show(Severity.Info, strings.alreadyInstalled.replace('{0}', extensionSuggestion.name)); return; } - const foundAndInstalled = keymap ? TPromise.as(true) : this.extensionGalleryService.query({ names: [keymapIdentifier] }) + const foundAndInstalled = installedExtension ? TPromise.as(true) : this.extensionGalleryService.query({ names: [extensionSuggestion.id] }) .then(result => { const [extension] = result.firstPage; if (!extension) { @@ -274,52 +344,52 @@ class WelcomePage { return this.extensionManagementService.installFromGallery(extension) .then(() => { // TODO: Do this as part of the install to avoid multiple events. - return this.extensionEnablementService.setEnablement(keymapIdentifier, false); + return this.extensionEnablementService.setEnablement(extensionSuggestion.id, false); }).then(() => { return true; }); }); this.messageService.show(Severity.Info, { - message: localize('welcomePage.willReloadAfterInstallingKeymap', "The window will reload after installing the {0} keyboard shortcuts.", keymapName), + message: strings.reloadAfterInstall.replace('{0}', extensionSuggestion.name), actions: [ new Action('ok', localize('ok', "OK"), null, true, () => { const messageDelay = TPromise.timeout(300); messageDelay.then(() => { this.messageService.show(Severity.Info, { - message: localize('welcomePage.installingKeymap', "Installing the {0} keyboard shortcuts...", keymapName), + message: strings.installing.replace('{0}', extensionSuggestion.name), actions: [CloseAction] }); }); - TPromise.join(extensions.filter(extension => extension.globallyEnabled) + TPromise.join(extensionSuggestion.isKeymap ? extensions.filter(extension => isKeymapExtension(this.tipsService, extension) && extension.globallyEnabled) .map(extension => { return this.extensionEnablementService.setEnablement(extension.identifier, false); - })).then(() => { + }) : []).then(() => { return foundAndInstalled.then(found => { messageDelay.cancel(); if (found) { - return this.extensionEnablementService.setEnablement(keymapIdentifier, true) + return this.extensionEnablementService.setEnablement(extensionSuggestion.id, true) .then(() => { - this.telemetryService.publicLog('installedKeymap', { + this.telemetryService.publicLog(strings.installedEvent, { from: telemetryFrom, - extensionId: keymapIdentifier, - outcome: keymap ? 'enabled' : 'installed', + extensionId: extensionSuggestion.id, + outcome: installedExtension ? 'enabled' : 'installed', }); return this.windowService.reloadWindow(); }); } else { - this.telemetryService.publicLog('installedKeymap', { + this.telemetryService.publicLog(strings.installedEvent, { from: telemetryFrom, - extensionId: keymapIdentifier, + extensionId: extensionSuggestion.id, outcome: 'not_found', }); - this.messageService.show(Severity.Error, localize('welcomePage.keymapNotFound', "The {0} keyboard shortcuts with id {1} could not be found.", keymapName, keymapIdentifier)); + this.messageService.show(Severity.Error, strings.extensionNotFound.replace('{0}', extensionSuggestion.name).replace('{1}', extensionSuggestion.id)); return undefined; } }); }).then(null, err => { - this.telemetryService.publicLog('installedKeymap', { + this.telemetryService.publicLog(strings.installedEvent, { from: telemetryFrom, - extensionId: keymapIdentifier, + extensionId: extensionSuggestion.id, outcome: isPromiseCanceledError(err) ? 'canceled' : 'error', error: String(err), }); @@ -328,9 +398,9 @@ class WelcomePage { return TPromise.as(true); }), new Action('cancel', localize('cancel', "Cancel"), null, true, () => { - this.telemetryService.publicLog('installedKeymap', { + this.telemetryService.publicLog(strings.installedEvent, { from: telemetryFrom, - extensionId: keymapIdentifier, + extensionId: extensionSuggestion.id, outcome: 'user_canceled', }); return TPromise.as(true); @@ -338,9 +408,9 @@ class WelcomePage { ] }); }).then(null, err => { - this.telemetryService.publicLog('installedKeymap', { + this.telemetryService.publicLog(strings.installedEvent, { from: telemetryFrom, - extensionId: keymapIdentifier, + extensionId: extensionSuggestion.id, outcome: isPromiseCanceledError(err) ? 'canceled' : 'error', error: String(err), }); @@ -348,22 +418,22 @@ class WelcomePage { }); } - private updateInstalledKeymaps(container: HTMLElement, installedKeymaps: TPromise) { - installedKeymaps.then(extensions => { - const elements = container.querySelectorAll('.installKeymap, .currentKeymap'); + private updateInstalledExtensions(container: HTMLElement, installedExtensions: TPromise) { + installedExtensions.then(extensions => { + const elements = container.querySelectorAll('.installExtension, .enabledExtension'); for (let i = 0; i < elements.length; i++) { elements[i].classList.remove('installed'); } extensions.filter(ext => ext.globallyEnabled) .map(ext => ext.identifier) .forEach(id => { - const install = container.querySelector(`.installKeymap[data-keymap="${id}"]`); - if (install) { - install.classList.add('installed'); + const install = container.querySelectorAll(`.installExtension[data-extension="${id}"]`); + for (let i = 0; i < install.length; i++) { + install[i].classList.add('installed'); } - const current = container.querySelector(`.currentKeymap[data-keymap="${id}"]`); - if (current) { - current.classList.add('installed'); + const enabled = container.querySelectorAll(`.enabledExtension[data-extension="${id}"]`); + for (let i = 0; i < enabled.length; i++) { + enabled[i].classList.add('installed'); } }); }).then(null, onUnexpectedError); From f1d0c1d88417f85ec66fa5629beca64ef71ac8b8 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 18 May 2017 12:35:32 -0700 Subject: [PATCH 0625/1164] Revert inadvertant change to product.json --- product.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/product.json b/product.json index b4c35813f4e..49f852e2928 100644 --- a/product.json +++ b/product.json @@ -14,10 +14,5 @@ "win32ShellNameShort": "C&ode - OSS", "darwinBundleIdentifier": "com.visualstudio.code.oss", "reportIssueUrl": "https://github.com/Microsoft/vscode/issues/new", - "extensionsGallery": { - "serviceUrl": "https://marketplace.visualstudio.com/_apis/public/gallery", - "cacheUrl": "https://vscode.blob.core.windows.net/gallery/index", - "itemUrl": "https://marketplace.visualstudio.com/items" - }, "urlProtocol": "code-oss" } \ No newline at end of file From f084c2a1e4e764a5a153fda89452f528e50d8b2e Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Thu, 18 May 2017 21:52:00 +0200 Subject: [PATCH 0626/1164] Fixes #23435: Proposed Task Api Feedback --- .../platform/markers/common/problemMatcher.ts | 54 +- src/vs/vscode.d.ts | 520 ++++++++++++++++++ src/vs/vscode.proposed.d.ts | 515 ----------------- src/vs/workbench/api/node/extHostTask.ts | 7 +- src/vs/workbench/api/node/extHostTypes.ts | 114 ++-- src/vs/workbench/parts/tasks/common/tasks.ts | 2 +- .../electron-browser/task.contribution.ts | 22 +- .../electron-browser/terminalTaskSystem.ts | 24 +- .../parts/tasks/node/processTaskSystem.ts | 22 +- .../tasks/test/node/configuration.test.ts | 37 +- 10 files changed, 688 insertions(+), 629 deletions(-) diff --git a/src/vs/platform/markers/common/problemMatcher.ts b/src/vs/platform/markers/common/problemMatcher.ts index b3120929f9c..b42f0f2a906 100644 --- a/src/vs/platform/markers/common/problemMatcher.ts +++ b/src/vs/platform/markers/common/problemMatcher.ts @@ -552,7 +552,7 @@ export namespace Config { /** * A description to track the start and end of a watching task. */ - export interface WatchingMatcher { + export interface BackgroundMonitor { /** * If set to true the watcher is in active mode when the task @@ -648,7 +648,11 @@ export namespace Config { */ watchedTaskEndsRegExp?: string; - watching?: WatchingMatcher; + /** + * @deprecated Use background instead. + */ + watching?: BackgroundMonitor; + background?: BackgroundMonitor; } export type ProblemMatcherType = string | ProblemMatcher | (string | ProblemMatcher)[]; @@ -1264,15 +1268,15 @@ export class ProblemMatcherParser extends Parser { }; return; } - if (Types.isUndefinedOrNull(external.watching)) { + let backgroundMonitor = external.background || external.watching; + if (Types.isUndefinedOrNull(backgroundMonitor)) { return; } - let watching = external.watching; - let begins: WatchingPattern = this.createWatchingPattern(watching.beginsPattern); - let ends: WatchingPattern = this.createWatchingPattern(watching.endsPattern); + let begins: WatchingPattern = this.createWatchingPattern(backgroundMonitor.beginsPattern); + let ends: WatchingPattern = this.createWatchingPattern(backgroundMonitor.endsPattern); if (begins && ends) { internal.watching = { - activeOnStart: Types.isBoolean(watching.activeOnStart) ? watching.activeOnStart : false, + activeOnStart: Types.isBoolean(backgroundMonitor.activeOnStart) ? backgroundMonitor.activeOnStart : false, beginsPattern: begins, endsPattern: ends }; @@ -1325,7 +1329,7 @@ export namespace Schemas { properties: { regexp: { type: 'string', - description: localize('WatchingPatternSchema.regexp', 'The regular expression to detect the begin or end of a watching task.') + description: localize('WatchingPatternSchema.regexp', 'The regular expression to detect the begin or end of a background task.') }, file: { type: 'integer', @@ -1385,9 +1389,40 @@ export namespace Schemas { ], description: localize('ProblemMatcherSchema.fileLocation', 'Defines how file names reported in a problem pattern should be interpreted.') }, + background: { + type: 'object', + additionalProperties: false, + description: localize('ProblemMatcherSchema.background', 'Patterns to track the begin and end of a matcher active on a background task.'), + properties: { + activeOnStart: { + type: 'boolean', + description: localize('ProblemMatcherSchema.background.activeOnStart', 'If set to true the background monitor is in active mode when the task starts. This is equals of issuing a line that matches the beginPattern') + }, + beginsPattern: { + oneOf: [ + { + type: 'string' + }, + Schemas.WatchingPattern + ], + description: localize('ProblemMatcherSchema.background.beginsPattern', 'If matched in the output the start of a background task is signaled.') + }, + endsPattern: { + oneOf: [ + { + type: 'string' + }, + Schemas.WatchingPattern + ], + description: localize('ProblemMatcherSchema.background.endsPattern', 'If matched in the output the end of a background task is signaled.') + } + } + }, watching: { type: 'object', additionalProperties: false, + deprecationMessage: localize('ProblemMatcherSchema.watching.deprecated', 'The watching property is deprecated. Use background instead.'), + description: localize('ProblemMatcherSchema.watching', 'Patterns to track the begin and end of a watching matcher.'), properties: { activeOnStart: { type: 'boolean', @@ -1411,8 +1446,7 @@ export namespace Schemas { ], description: localize('ProblemMatcherSchema.watching.endsPattern', 'If matched in the output the end of a watching task is signaled.') } - }, - description: localize('ProblemMatcherSchema.watching', 'Patterns to track the begin and end of a watching pattern.') + } } } }; diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 3faf70275df..190042afeea 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3489,6 +3489,526 @@ declare module 'vscode' { update(key: string, value: any): Thenable; } + /** + * Defines a problem pattern + */ + export interface ProblemPattern { + + /** + * The regular expression to find a problem in the console output of an + * executed task. + */ + regexp: RegExp; + + /** + * The match group index of the filename. + * + * Defaults to 1 if omitted. + */ + file?: number; + + /** + * The match group index of the problems's location. Valid location + * patterns are: (line), (line,column) and (startLine,startColumn,endLine,endColumn). + * If omitted the line and colum properties are used. + */ + location?: number; + + /** + * The match group index of the problem's line in the source file. + * + * Defaults to 2 if omitted. + */ + line?: number; + + /** + * The match group index of the problem's character in the source file. + * + * Defaults to 3 if omitted. + */ + character?: number; + + /** + * The match group index of the problem's end line in the source file. + * + * Defaults to undefined. No end line is captured. + */ + endLine?: number; + + /** + * The match group index of the problem's end character in the source file. + * + * Defaults to undefined. No end column is captured. + */ + endCharacter?: number; + + /** + * The match group index of the problem's severity. + * + * Defaults to undefined. In this case the problem matcher's severity + * is used. + */ + severity?: number; + + /** + * The match group index of the problems's code. + * + * Defaults to undefined. No code is captured. + */ + code?: number; + + /** + * The match group index of the message. If omitted it defaults + * to 4 if location is specified. Otherwise it defaults to 5. + */ + message?: number; + + /** + * Specifies if the last pattern in a multi line problem matcher should + * loop as long as it does match a line consequently. Only valid on the + * last problem pattern in a multi line problem matcher. + */ + loop?: boolean; + } + + /** + * A multi line problem pattern. + */ + export type MultiLineProblemPattern = ProblemPattern[]; + + /** + * The way how the file location is interpreted + */ + export enum FileLocationKind { + /** + * VS Code should decide based on whether the file path found in the + * output is absolute or relative. A relative file path will be treated + * relative to the workspace root. + */ + Auto = 1, + + /** + * Always treat the file path relative. + */ + Relative = 2, + + /** + * Always treat the file path absolute. + */ + Absolute = 3 + } + + /** + * Controls to which kind of documents problems are applied. + */ + export enum ApplyToKind { + /** + * Problems are applied to all documents. + */ + AllDocuments = 1, + + /** + * Problems are applied to open documents only. + */ + OpenDocuments = 2, + + + /** + * Problems are applied to closed documents only. + */ + ClosedDocuments = 3 + } + + + /** + * A background monitor pattern + */ + export interface BackgroundPattern { + /** + * The actual regular expression + */ + regexp: RegExp; + + /** + * The match group index of the filename. If provided the expression + * is matched for that file only. + */ + file?: number; + } + + /** + * A description to control the activity of a problem matcher + * watching a background task. + */ + export interface BackgroundMonitor { + /** + * If set to true the monitor is in active mode when the task + * starts. This is equals of issuing a line that matches the + * beginPattern. + */ + activeOnStart?: boolean; + + /** + * If matched in the output the start of a background activity is signaled. + */ + beginsPattern: RegExp | BackgroundPattern; + + /** + * If matched in the output the end of a background activity is signaled. + */ + endsPattern: RegExp | BackgroundPattern; + } + + /** + * Defines a problem matcher + */ + export interface ProblemMatcher { + /** + * The owner of a problem. Defaults to a generated id + * if omitted. + */ + owner?: string; + + /** + * The type of documents problems detected by this matcher + * apply to. Default to `ApplyToKind.AllDocuments` if omitted. + */ + applyTo?: ApplyToKind; + + /** + * How a file location recognized by a matcher should be interpreted. If omitted the file location + * if `FileLocationKind.Auto`. + */ + fileLocation?: FileLocationKind | string; + + /** + * The actual pattern used by the problem matcher. + */ + pattern: ProblemPattern | MultiLineProblemPattern; + + /** + * The default severity of a detected problem in the output. Used + * if the `ProblemPattern` doesn't define a severity match group. + */ + severity?: DiagnosticSeverity; + + /** + * A background monitor for tasks that are running in the background. + */ + backgound?: BackgroundMonitor; + } + + /** + * Controls the behaviour of the terminal's visibility. + */ + export enum RevealKind { + /** + * Always brings the terminal to front if the task is executed. + */ + Always = 1, + + /** + * Only brings the terminal to front if a problem is detected executing the task + * (e.g. the task couldn't be started because). + */ + Silent = 2, + + /** + * The terminal never comes to front when the task is executed. + */ + Never = 3 + } + + /** + * Controls terminal specific behaviour. + */ + export interface TerminalBehaviour { + /** + * Controls whether the terminal executing a task is brought to front or not. + * Defaults to `RevealKind.Always`. + */ + reveal?: RevealKind; + + /** + * Controls whether the command is echoed in the terminal or not. + */ + echo?: boolean; + } + + export interface ProcessOptions { + /** + * The current working directory of the executed program or shell. + * If omitted VSCode's current workspace root is used. + */ + cwd?: string; + + /** + * The additional environment of the executed program or shell. If omitted + * the parent process' environment is used. If provided it is merged with + * the parent process' environment. + */ + env?: { [key: string]: string }; + } + + export namespace TaskGroup { + /** + * The clean task group + */ + export const Clean: 'clean'; + /** + * The build task group + */ + export const Build: 'build'; + /** + * The rebuild all task group + */ + export const RebuildAll: 'rebuildAll'; + /** + * The test task group + */ + export const Test: 'test'; + } + + /** + * The supported task groups. + */ + export type TaskGroup = 'clean' | 'build' | 'rebuildAll' | 'test'; + + /** + * The ProblemMatchers type definition. + */ + export type ProblemMatchers = string | ProblemMatcher | (string | ProblemMatcher)[]; + + /** + * A task that starts an external process. + */ + export class ProcessTask { + + /** + * Creates a process task. + * + * @param name the task's name. Is presented in the user interface. + * @param process the process to start. + * @param problemMatchers the problem matchers to use. + */ + constructor(name: string, process: string, problemMatchers?: ProblemMatchers); + + /** + * Creates a process task. + * + * @param name the task's name. Is presented in the user interface. + * @param process the process to start. + * @param args arguments to be passed to the process. + * @param problemMatchers the problem matchers to use. + */ + constructor(name: string, process: string, args: string[], problemMatchers?: ProblemMatchers); + + /** + * Creates a process task. + * + * @param name the task's name. Is presented in the user interface. + * @param process the process to start. + * @param args arguments to be passed to the process. + * @param options additional options for the started process. + * @param problemMatchers the problem matchers to use. + */ + constructor(name: string, process: string, args: string[], options: ProcessOptions, problemMatchers?: ProblemMatchers); + + /** + * The task's name + */ + readonly name: string; + + /** + * The task's identifier. If omitted the name is + * used as an identifier. + */ + identifier: string; + + /** + * Whether the task is a background task or not. + */ + isBackground: boolean; + + /** + * The process to be executed. + */ + readonly process: string; + + /** + * The arguments passed to the process. Defaults to an empty array. + */ + args: string[]; + + /** + * The task group this tasks belongs to. Defaults to undefined meaning + * that the task doesn't belong to any special group. + */ + group?: TaskGroup; + + /** + * The process options used when the process is executed. + * Defaults to an empty object literal. + */ + options: ProcessOptions; + + /** + * The terminal options. Defaults to an empty object literal. + */ + terminal: TerminalBehaviour; + + /** + * The problem matchers attached to the task. Defaults to an empty + * array. + */ + problemMatchers: (string | ProblemMatcher)[]; + } + + export type ShellOptions = { + /** + * The shell executable. + */ + executable: string; + + /** + * The arguments to be passed to the shell executable used to run the task. + */ + shellArgs?: string[]; + + /** + * The current working directory of the executed shell. + * If omitted VSCode's current workspace root is used. + */ + cwd?: string; + + /** + * The additional environment of the executed shell. If omitted + * the parent process' environment is used. If provided it is merged with + * the parent process' environment. + */ + env?: { [key: string]: string }; + } | { + /** + * The current working directory of the executed shell. + * If omitted VSCode's current workspace root is used. + */ + cwd: string; + + /** + * The additional environment of the executed shell. If omitted + * the parent process' environment is used. If provided it is merged with + * the parent process' environment. + */ + env?: { [key: string]: string }; + } | { + /** + * The current working directory of the executed shell. + * If omitted VSCode's current workspace root is used. + */ + cwd?: string; + + /** + * The additional environment of the executed shell. If omitted + * the parent process' environment is used. If provided it is merged with + * the parent process' environment. + */ + env: { [key: string]: string }; + }; + + /** + * A task that executes a shell command. + */ + export class ShellTask { + + /** + * Creates a shell task. + * + * @param name the task's name. Is presented in the user interface. + * @param commandLine the command line to execute. + * @param problemMatchers the problem matchers to use. + */ + constructor(name: string, commandLine: string, problemMatchers?: ProblemMatchers); + + /** + * Creates a shell task. + * + * @param name the task's name. Is presented in the user interface. + * @param commandLine the command line to execute. + * @param options additional options used when creating the shell. + * @param problemMatchers the problem matchers to use. + */ + constructor(name: string, commandLine: string, options: ShellOptions, problemMatchers?: ProblemMatchers); + + /** + * The task's name + */ + readonly name: string; + + /** + * The task's identifier. If omitted the name is + * used as an identifier. + */ + identifier: string; + + /** + * Whether the task is a background task or not. + */ + isBackground: boolean; + + /** + * The command line to execute. + */ + readonly commandLine: string; + + /** + * The task group this tasks belongs to. Defaults to undefined meaning + * that the task doesn't belong to any special group. + */ + group?: TaskGroup; + + /** + * The shell options used when the shell is executed. Defaults to an + * empty object literal. + */ + options: ShellOptions; + + /** + * The terminal options. Defaults to an empty object literal. + */ + terminal: TerminalBehaviour; + + /** + * The problem matchers attached to the task. Defaults to an empty + * array. + */ + problemMatchers: (string | ProblemMatcher)[]; + } + + export type Task = ProcessTask | ShellTask; + + /** + * A task provider allows to add tasks to the task service. + * A task provider is registerd via #workspace.registerTaskProvider. + */ + export interface TaskProvider { + /** + * Provides additional tasks. + * @param token A cancellation token. + * @return a #TaskSet + */ + provideTasks(token: CancellationToken): ProviderResult; + } + + export namespace workspace { + /** + * Register a task provider. + * + * @param provider A task provider. + * @return A [disposable](#Disposable) that unregisters this provider when being disposed. + */ + export function registerTaskProvider(provider: TaskProvider): Disposable; + } + /** * Namespace describing the environment the editor runs in. */ diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 60d118eefc6..5e6265c2d20 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -7,521 +7,6 @@ declare module 'vscode' { - /** - * Defines a problem pattern - */ - export interface ProblemPattern { - - /** - * The regular expression to find a problem in the console output of an - * executed task. - */ - regexp: RegExp; - - /** - * The match group index of the filename. - * - * Defaults to 1 if omitted. - */ - file?: number; - - /** - * The match group index of the problems's location. Valid location - * patterns are: (line), (line,column) and (startLine,startColumn,endLine,endColumn). - * If omitted the line and colum properties are used. - */ - location?: number; - - /** - * The match group index of the problem's line in the source file. - * - * Defaults to 2 if omitted. - */ - line?: number; - - /** - * The match group index of the problem's character in the source file. - * - * Defaults to 3 if omitted. - */ - character?: number; - - /** - * The match group index of the problem's end line in the source file. - * - * Defaults to undefined. No end line is captured. - */ - endLine?: number; - - /** - * The match group index of the problem's end character in the source file. - * - * Defaults to undefined. No end column is captured. - */ - endCharacter?: number; - - /** - * The match group index of the problem's severity. - * - * Defaults to undefined. In this case the problem matcher's severity - * is used. - */ - severity?: number; - - /** - * The match group index of the problems's code. - * - * Defaults to undefined. No code is captured. - */ - code?: number; - - /** - * The match group index of the message. If omitted it defaults - * to 4 if location is specified. Otherwise it defaults to 5. - */ - message?: number; - - /** - * Specifies if the last pattern in a multi line problem matcher should - * loop as long as it does match a line consequently. Only valid on the - * last problem pattern in a multi line problem matcher. - */ - loop?: boolean; - } - - /** - * A multi line problem pattern. - */ - export type MultiLineProblemPattern = ProblemPattern[]; - - /** - * The way how the file location is interpreted - */ - export enum FileLocationKind { - /** - * VS Code should decide based on whether the file path found in the - * output is absolute or relative. A relative file path will be treated - * relative to the workspace root. - */ - Auto = 1, - - /** - * Always treat the file path relative. - */ - Relative = 2, - - /** - * Always treat the file path absolute. - */ - Absolute = 3 - } - - /** - * Controls to which kind of documents problems are applied. - */ - export enum ApplyToKind { - /** - * Problems are applied to all documents. - */ - AllDocuments = 1, - /** - * Problems are applied to open documents only. - */ - OpenDocuments = 2, - - /** - * Problems are applied to closed documents only. - */ - ClosedDocuments = 3 - } - - - /** - * A background monitor pattern - */ - export interface BackgroundPattern { - /** - * The actual regular expression - */ - regexp: RegExp; - - /** - * The match group index of the filename. If provided the expression - * is matched for that file only. - */ - file?: number; - } - - /** - * A description to control the activity of a problem matcher - * watching a background task. - */ - export interface BackgroundMonitor { - /** - * If set to true the monitor is in active mode when the task - * starts. This is equals of issuing a line that matches the - * beginPattern. - */ - activeOnStart?: boolean; - - /** - * If matched in the output the start of a background activity is signaled. - */ - beginsPattern: RegExp | BackgroundPattern; - - /** - * If matched in the output the end of a background activity is signaled. - */ - endsPattern: RegExp | BackgroundPattern; - } - - /** - * Defines a problem matcher - */ - export interface ProblemMatcher { - /** - * The owner of a problem. Defaults to a generated id - * if omitted. - */ - owner?: string; - - /** - * The type of documents problems detected by this matcher - * apply to. Default to `ApplyToKind.AllDocuments` if omitted. - */ - applyTo?: ApplyToKind; - - /** - * How a file location recognize by a matcher should be interpreted. If omitted the file location - * if `FileLocationKind.Auto`. - */ - fileLocation?: FileLocationKind | string; - - /** - * The actual pattern used by the problem matcher. - */ - pattern: ProblemPattern | MultiLineProblemPattern; - - /** - * The default severity of a detected problem in the output. Used - * if the `ProblemPattern` doesn't define a severity match group. - */ - severity?: DiagnosticSeverity; - - /** - * A background monitor for tasks that are running in the background. - */ - backgound?: BackgroundMonitor; - } - - /** - * Controls the behaviour of the terminal's visibility. - */ - export enum RevealKind { - /** - * Always brings the terminal to front if the task is executed. - */ - Always = 1, - - /** - * Only brings the terminal to front if a problem is detected executing the task - * (e.g. the task couldn't be started because). - */ - Silent = 2, - - /** - * The terminal never comes to front when the task is executed. - */ - Never = 3 - } - - /** - * Controls terminal specific behaviour. - */ - export interface TerminalBehaviour { - /** - * Controls whether the terminal executing a task is brought to front or not. - * Defaults to `RevealKind.Always`. - */ - reveal?: RevealKind; - - /** - * Controls whether the command is echoed in the terminal or not. - */ - echo?: boolean; - } - - - export interface ProcessOptions { - /** - * The current working directory of the executed program or shell. - * If omitted VSCode's current workspace root is used. - */ - cwd?: string; - - /** - * The additional environment of the executed program or shell. If omitted - * the parent process' environment is used. If provided it is merged with - * the parent process' environment. - */ - env?: { [key: string]: string }; - } - - export namespace TaskGroup { - /** - * The clean task group - */ - export const Clean: 'clean'; - /** - * The build task group - */ - export const Build: 'build'; - /** - * The rebuild all task group - */ - export const RebuildAll: 'rebuildAll'; - /** - * The test task group - */ - export const Test: 'test'; - } - - /** - * The supported task groups. - */ - export type TaskGroup = 'clean' | 'build' | 'rebuildAll' | 'test'; - - /** - * A task that starts an external process. - */ - export class ProcessTask { - - /** - * Creates a process task. - * - * @param name the task's name. Is presented in the user interface. - * @param process the process to start. - * @param problemMatchers the problem matchers to use. - */ - constructor(name: string, process: string, ...problemMatchers: ProblemMatcher[]); - - /** - * Creates a process task. - * - * @param name the task's name. Is presented in the user interface. - * @param process the process to start. - * @param args arguments to be passed to the process. - * @param problemMatchers the problem matchers to use. - */ - constructor(name: string, process: string, args: string[], ...problemMatchers: ProblemMatcher[]); - - /** - * Creates a process task. - * - * @param name the task's name. Is presented in the user interface. - * @param process the process to start. - * @param args arguments to be passed to the process. - * @param options additional options for the started process. - * @param problemMatchers the problem matchers to use. - */ - constructor(name: string, process: string, args: string[], options: ProcessOptions, ...problemMatchers: ProblemMatcher[]); - - /** - * The task's name - */ - readonly name: string; - - /** - * The task's identifier. If omitted the name is - * used as an identifier. - */ - identifier: string; - - /** - * Whether the task is a background task or not. - */ - isBackground: boolean; - - /** - * The process to be executed. - */ - readonly process: string; - - /** - * The arguments passed to the process. Defaults to an empty array. - */ - args: string[]; - - /** - * The task group this tasks belongs to. Defaults to undefined meaning - * that the task doesn't belong to any special group. - */ - group?: TaskGroup; - - /** - * The process options used when the process is executed. - * Defaults to an empty object literal. - */ - options: ProcessOptions; - - /** - * The terminal options. Defaults to an empty object literal. - */ - terminal: TerminalBehaviour; - - /** - * The problem matchers attached to the task. Defaults to an empty - * array. - */ - problemMatchers: ProblemMatcher[]; - } - - export type ShellOptions = { - /** - * The shell executable. - */ - executable: string; - - /** - * The arguments to be passed to the shell executable used to run the task. - */ - shellArgs?: string[]; - - /** - * The current working directory of the executed shell. - * If omitted VSCode's current workspace root is used. - */ - cwd?: string; - - /** - * The additional environment of the executed shell. If omitted - * the parent process' environment is used. If provided it is merged with - * the parent process' environment. - */ - env?: { [key: string]: string }; - } | { - /** - * The current working directory of the executed shell. - * If omitted VSCode's current workspace root is used. - */ - cwd: string; - - /** - * The additional environment of the executed shell. If omitted - * the parent process' environment is used. If provided it is merged with - * the parent process' environment. - */ - env?: { [key: string]: string }; - } | { - /** - * The current working directory of the executed shell. - * If omitted VSCode's current workspace root is used. - */ - cwd?: string; - - /** - * The additional environment of the executed shell. If omitted - * the parent process' environment is used. If provided it is merged with - * the parent process' environment. - */ - env: { [key: string]: string }; - }; - - /** - * A task that executes a shell command. - */ - export class ShellTask { - - /** - * Creates a shell task. - * - * @param name the task's name. Is presented in the user interface. - * @param commandLine the command line to execute. - * @param problemMatchers the problem matchers to use. - */ - constructor(name: string, commandLine: string, ...problemMatchers: ProblemMatcher[]); - - /** - * Creates a shell task. - * - * @param name the task's name. Is presented in the user interface. - * @param commandLine the command line to execute. - * @param options additional options used when creating the shell. - * @param problemMatchers the problem matchers to use. - */ - constructor(name: string, commandLine: string, options: ShellOptions, ...problemMatchers: ProblemMatcher[]); - - /** - * The task's name - */ - readonly name: string; - - /** - * The task's identifier. If omitted the name is - * used as an identifier. - */ - identifier: string; - - /** - * Whether the task is a background task or not. - */ - isBackground: boolean; - - /** - * The command line to execute. - */ - readonly commandLine: string; - - /** - * The task group this tasks belongs to. Defaults to undefined meaning - * that the task doesn't belong to any special group. - */ - group?: TaskGroup; - - /** - * The shell options used when the shell is executed. Defaults to an - * empty object literal. - */ - options: ShellOptions; - - /** - * The terminal options. Defaults to an empty object literal. - */ - terminal: TerminalBehaviour; - - /** - * The problem matchers attached to the task. Defaults to an empty - * array. - */ - problemMatchers: ProblemMatcher[]; - } - - export type Task = ProcessTask | ShellTask; - - /** - * A task provider allows to add tasks to the task service. - * A task provider is registerd via #workspace.registerTaskProvider. - */ - export interface TaskProvider { - /** - * Provides additional tasks. - * @param token A cancellation token. - * @return a #TaskSet - */ - provideTasks(token: CancellationToken): ProviderResult; - } - - export namespace workspace { - /** - * Register a task provider. - * - * @param provider A task provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - export function registerTaskProvider(provider: TaskProvider): Disposable; - - } - export namespace window { export function sampleFunction(): Thenable; diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index 67bcbec00c9..c6bdc5a4d96 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -159,13 +159,13 @@ namespace WathingMatcher { } namespace ProblemMatcher { - export function from(values: vscode.ProblemMatcher[]): Problems.ProblemMatcher[] { + export function from(values: (string | vscode.ProblemMatcher)[]): (string | Problems.ProblemMatcher)[] { if (values === void 0 || values === null) { return undefined; } - let result: Problems.ProblemMatcher[]; + let result: (string | Problems.ProblemMatcher)[]; for (let value of values) { - let converted = fromSingle(value); + let converted = typeof value === 'string' ? value : fromSingle(value); if (converted) { result.push(converted); } @@ -186,7 +186,6 @@ namespace ProblemMatcher { filePrefix: location.prefix, pattern: ProblemPattern.from(problemMatcher.pattern), severity: fromDiagnosticSeverity(problemMatcher.severity), - }; return result; } diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index d8279811f68..e52b04efaa4 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1018,12 +1018,12 @@ export enum RevealKind { export class BaseTask { private _name: string; - private _problemMatchers: vscode.ProblemMatcher[]; + private _problemMatchers: (string | vscode.ProblemMatcher)[]; private _identifier: string; private _isBackground: boolean; private _terminal: vscode.TerminalBehaviour; - constructor(name: string, problemMatchers: vscode.ProblemMatcher[]) { + constructor(name: string, problemMatchers: (string | vscode.ProblemMatcher)[]) { if (typeof name !== 'string') { throw illegalArgument('name'); } @@ -1074,11 +1074,11 @@ export class BaseTask { this._terminal = value; } - get problemMatchers(): vscode.ProblemMatcher[] { + get problemMatchers(): (string | vscode.ProblemMatcher)[] { return this._problemMatchers; } - set problemMatchers(value: vscode.ProblemMatcher[]) { + set problemMatchers(value: (string | vscode.ProblemMatcher)[]) { if (!Array.isArray(value)) { value = []; } @@ -1093,6 +1093,12 @@ namespace ProblemMatcher { } } +namespace ShellOptions { + export function is(value: any): value is vscode.ShellOptions { + return value && ((typeof value.executable === 'string') || (typeof value.cwd === 'string') || !!value.env); + } +} + export namespace TaskGroup { /** * The clean task group @@ -1126,40 +1132,35 @@ export class ProcessTask extends BaseTask { private _group: vscode.TaskGroup; private _options: vscode.ProcessOptions; - private static parseArguments(restArgs: any[]): { args: string[]; options: vscode.ProcessOptions; problemMatchers: vscode.ProblemMatcher[] } { - let args: string[] = []; - let options: vscode.ProcessOptions = undefined; - let problemMatchers: vscode.ProblemMatcher[] = []; - if (!restArgs || restArgs.length === 0) { - return { args, options, problemMatchers }; - } - let current: any = restArgs[0]; - if (Array.isArray(current)) { - args = current; - restArgs.shift(); - current = restArgs[0]; - } - if (ProblemMatcher.is(current)) { - problemMatchers = restArgs; - } else if (current) { - options = current; - restArgs.shift(); - if (restArgs.length > 0) { - problemMatchers = restArgs; - } - } - return { args, options, problemMatchers }; - } - - constructor(name: string, process: string, ...problemMatchers: vscode.ProblemMatcher[]); - constructor(name: string, process: string, args: string[], ...problemMatchers: vscode.ProblemMatcher[]); - constructor(name: string, process: string, args: string[], options: vscode.ProcessOptions, ...problemMatchers: vscode.ProblemMatcher[]); - constructor(name: string, process: string, ...rest: any[]) { + constructor(name: string, process: string, args?: string[], problemMatchers?: vscode.ProblemMatchers); + constructor(name: string, process: string, args: string[] | undefined, options: vscode.ProcessOptions, problemMatchers?: vscode.ProblemMatchers); + constructor(name: string, process: string, arg3?: string[], arg4?: vscode.ProcessOptions | vscode.ProblemMatchers, arg5?: vscode.ProblemMatchers) { if (typeof process !== 'string') { throw illegalArgument('process'); } - let { args, options, problemMatchers } = ProcessTask.parseArguments(rest); - super(name, problemMatchers); + let args: string[]; + let options: vscode.ProcessOptions; + let problemMatchers: vscode.ProblemMatchers; + + args = arg3 || []; + if (arg4) { + if (Array.isArray(arg4) || typeof arg4 === 'string' || ProblemMatcher.is(arg4)) { + problemMatchers = arg4; + } else { + options = arg4; + } + } + if (arg5 && !problemMatchers) { + problemMatchers = arg5; + } + let pm: (string | vscode.ProblemMatcher)[]; + if (problemMatchers && (typeof problemMatchers === 'string' || ProblemMatcher.is(problemMatchers))) { + pm = [problemMatchers]; + } else if (Array.isArray(problemMatchers)) { + pm = problemMatchers; + } + pm = pm || []; + super(name, pm); this._process = process; this._args = args; this._options = options || Object.create(null); @@ -1203,39 +1204,32 @@ export class ProcessTask extends BaseTask { } } -export class ShellTask extends BaseTask { +export class ShellTask extends BaseTask implements vscode.ShellTask { private _commandLine: string; private _group: vscode.TaskGroup; private _options: vscode.ShellOptions; - private static parseArguments(restArgs: any[]): { options: vscode.ShellOptions; problemMatchers: vscode.ProblemMatcher[] } { - let options: vscode.ShellOptions = undefined; - let problemMatchers: vscode.ProblemMatcher[] = []; - if (!restArgs || restArgs.length === 0) { - return { options, problemMatchers }; - } - let current: any = restArgs[0]; - if (current && !ProblemMatcher.is(current)) { - options = current; - restArgs.shift(); - current = restArgs[0]; - } - if (ProblemMatcher.is(current)) { - problemMatchers = restArgs; - } - return { options, problemMatchers }; - } - - constructor(name: string, commandLine: string, ...problemMatchers: vscode.ProblemMatcher[]); - constructor(name: string, commandLine: string, options: vscode.ShellOptions, ...problemMatchers: vscode.ProblemMatcher[]); - constructor(name: string, commandLine: string, ...rest: any[]) { + constructor(name: string, commandLine: string, problemMatchers?: vscode.ProblemMatchers); + constructor(name: string, commandLine: string, options: vscode.ShellOptions, problemMatchers?: vscode.ProblemMatchers); + constructor(name: string, commandLine: string, optionsOrProblemMatchers?: vscode.ShellOptions | vscode.ProblemMatchers, problemMatchers?: vscode.ProblemMatchers) { if (typeof commandLine !== 'string') { throw illegalArgument('commandLine'); } - let { options, problemMatchers } = ShellTask.parseArguments(rest); - - super(name, problemMatchers); + let options: vscode.ShellOptions = undefined; + let pm: (string | vscode.ProblemMatcher)[]; + if (ShellOptions.is(optionsOrProblemMatchers)) { + options = optionsOrProblemMatchers; + } else { + problemMatchers = optionsOrProblemMatchers; + } + if (problemMatchers && (typeof problemMatchers === 'string' || ProblemMatcher.is(problemMatchers))) { + pm = [problemMatchers]; + } else if (Array.isArray(problemMatchers)) { + pm = problemMatchers; + } + pm = pm || []; + super(name, pm); this._commandLine = commandLine; this._options = options || Object.create(null); } diff --git a/src/vs/workbench/parts/tasks/common/tasks.ts b/src/vs/workbench/parts/tasks/common/tasks.ts index 446ae9ca08c..78ba0fc9fa6 100644 --- a/src/vs/workbench/parts/tasks/common/tasks.ts +++ b/src/vs/workbench/parts/tasks/common/tasks.ts @@ -175,7 +175,7 @@ export interface Task { /** * The problem watchers to use for this task */ - problemMatchers?: ProblemMatcher[]; + problemMatchers?: (string | ProblemMatcher)[]; } export enum ExecutionEngine { diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index a779eaf04c5..6dd5972868d 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -791,17 +791,19 @@ class TaskService extends EventEmitter implements ITaskService { } private executeTask(task: Task, resolver: ITaskResolver): TPromise { - return this.textFileService.saveAll().then((value) => { // make sure all dirty files are saved - let executeResult = this.getTaskSystem().run(task, resolver); - if (executeResult.kind === TaskExecuteKind.Active) { - let active = executeResult.active; - if (active.same && active.background) { - this.messageService.show(Severity.Info, nls.localize('TaskSystem.activeSame', 'The task is already active and in watch mode. To terminate the task use `F1 > terminate task`')); - } else { - throw new TaskError(Severity.Warning, nls.localize('TaskSystem.active', 'There is already a task running. Terminate it first before executing another task.'), TaskErrors.RunningTask); + return ProblemMatcherRegistry.onReady().then(() => { + return this.textFileService.saveAll().then((value) => { // make sure all dirty files are saved + let executeResult = this.getTaskSystem().run(task, resolver); + if (executeResult.kind === TaskExecuteKind.Active) { + let active = executeResult.active; + if (active.same && active.background) { + this.messageService.show(Severity.Info, nls.localize('TaskSystem.activeSame', 'The task is already active and in watch mode. To terminate the task use `F1 > terminate task`')); + } else { + throw new TaskError(Severity.Warning, nls.localize('TaskSystem.active', 'There is already a task running. Terminate it first before executing another task.'), TaskErrors.RunningTask); + } } - } - return executeResult.promise; + return executeResult.promise; + }); }); } diff --git a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts b/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts index 4e0d42260d1..00b2950731f 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts @@ -24,7 +24,8 @@ import * as TPath from 'vs/base/common/paths'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { IModelService } from 'vs/editor/common/services/modelService'; -import { ProblemMatcher /*, ProblemPattern, getResource */ } from 'vs/platform/markers/common/problemMatcher'; +import { ProblemMatcher, ProblemMatcherRegistry /*, ProblemPattern, getResource */ } from 'vs/platform/markers/common/problemMatcher'; + import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -553,15 +554,22 @@ export class TerminalTaskSystem extends EventEmitter implements ITaskSystem { return value.map(s => this.resolveVariable(s)); } - private resolveMatchers(values: T[]): T[] { - if (values === void 0 || values === null) { + private resolveMatchers(values: (string | ProblemMatcher)[]): ProblemMatcher[] { + if (values === void 0 || values === null || values.length === 0) { return []; } - if (values.length === 0) { - return values; - } - let result: T[] = []; - values.forEach((matcher) => { + let result: ProblemMatcher[] = []; + values.forEach((value) => { + let matcher: ProblemMatcher; + if (Types.isString(value)) { + matcher = ProblemMatcherRegistry.get(value); + } else { + matcher = value; + } + if (!matcher) { + this.outputChannel.append(nls.localize('unkownProblemMatcher', 'Problem matcher {0} can\'t be resolved. The matcher will be ignored')); + return; + } if (!matcher.filePrefix) { result.push(matcher); } else { diff --git a/src/vs/workbench/parts/tasks/node/processTaskSystem.ts b/src/vs/workbench/parts/tasks/node/processTaskSystem.ts index 513a82606f9..9cc26f22205 100644 --- a/src/vs/workbench/parts/tasks/node/processTaskSystem.ts +++ b/src/vs/workbench/parts/tasks/node/processTaskSystem.ts @@ -22,7 +22,7 @@ import { IConfigurationResolverService } from 'vs/workbench/services/configurati import { IMarkerService } from 'vs/platform/markers/common/markers'; import { IModelService } from 'vs/editor/common/services/modelService'; -import { ProblemMatcher } from 'vs/platform/markers/common/problemMatcher'; +import { ProblemMatcher, ProblemMatcherRegistry } from 'vs/platform/markers/common/problemMatcher'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { StartStopProblemCollector, WatchingProblemCollector, ProblemCollectorEvents } from 'vs/workbench/parts/tasks/common/problemCollectors'; @@ -335,12 +335,22 @@ export class ProcessTaskSystem extends EventEmitter implements ITaskSystem { return value.map(s => this.resolveVariable(s)); } - private resolveMatchers(values: T[]): T[] { - if (values.length === 0) { - return values; + private resolveMatchers(values: (string | ProblemMatcher)[]): ProblemMatcher[] { + if (values === void 0 || values === null || values.length === 0) { + return []; } - let result: T[] = []; - values.forEach((matcher) => { + let result: ProblemMatcher[] = []; + values.forEach((value) => { + let matcher: ProblemMatcher; + if (Types.isString(value)) { + matcher = ProblemMatcherRegistry.get(value); + } else { + matcher = value; + } + if (!matcher) { + this.outputChannel.append(nls.localize('unkownProblemMatcher', 'Problem matcher {0} can\'t be resolved. The matcher will be ignored')); + return; + } if (!matcher.filePrefix) { result.push(matcher); } else { diff --git a/src/vs/workbench/parts/tasks/test/node/configuration.test.ts b/src/vs/workbench/parts/tasks/test/node/configuration.test.ts index fd07989830b..fb53a216bd3 100644 --- a/src/vs/workbench/parts/tasks/test/node/configuration.test.ts +++ b/src/vs/workbench/parts/tasks/test/node/configuration.test.ts @@ -432,22 +432,29 @@ function assertCommandConfiguration(actual: Tasks.CommandConfiguration, expected } } -function assertProblemMatcher(actual: ProblemMatcher, expected: ProblemMatcher) { - if (expected.owner === ProblemMatcherBuilder.DEFAULT_UUID) { - try { - UUID.parse(actual.owner); - } catch (err) { - assert.fail(actual.owner, 'Owner must be a UUID'); - } - } else { - assert.strictEqual(actual.owner, expected.owner); +function assertProblemMatcher(actual: string | ProblemMatcher, expected: string | ProblemMatcher) { + assert.strictEqual(typeof actual, typeof expected); + if (typeof actual === 'string' && typeof expected === 'string') { + assert.strictEqual(actual, expected, 'Problem matcher references are different'); + return; } - assert.strictEqual(actual.applyTo, expected.applyTo); - assert.strictEqual(actual.severity, expected.severity); - assert.strictEqual(actual.fileLocation, expected.fileLocation); - assert.strictEqual(actual.filePrefix, expected.filePrefix); - if (actual.pattern && expected.pattern) { - assertProblemPatterns(actual.pattern, expected.pattern); + if (typeof actual !== 'string' && typeof expected !== 'string') { + if (expected.owner === ProblemMatcherBuilder.DEFAULT_UUID) { + try { + UUID.parse(actual.owner); + } catch (err) { + assert.fail(actual.owner, 'Owner must be a UUID'); + } + } else { + assert.strictEqual(actual.owner, expected.owner); + } + assert.strictEqual(actual.applyTo, expected.applyTo); + assert.strictEqual(actual.severity, expected.severity); + assert.strictEqual(actual.fileLocation, expected.fileLocation); + assert.strictEqual(actual.filePrefix, expected.filePrefix); + if (actual.pattern && expected.pattern) { + assertProblemPatterns(actual.pattern, expected.pattern); + } } } From 544de31692125faa555ae5f0c80d4170180cbe90 Mon Sep 17 00:00:00 2001 From: Amy Qiu Date: Thu, 18 May 2017 13:00:04 -0700 Subject: [PATCH 0627/1164] Fix #26821 Memento - Search now remembers if you cleared your input before shutdown --- src/vs/workbench/parts/search/browser/searchViewlet.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index ebb3c5d3217..2983e323396 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -1349,6 +1349,13 @@ export class SearchViewlet extends Viewlet { ]; } + public shutdown(): void { + this.viewletSettings['query.contentPattern'] = this.searchWidget.searchInput.getValue(); + this.saveMemento(); + + super.shutdown(); + } + public dispose(): void { this.isDisposed = true; From 55e5f69dd3ac26e761c746470f0cb9de54ecaa42 Mon Sep 17 00:00:00 2001 From: Amy Qiu Date: Thu, 18 May 2017 14:09:32 -0700 Subject: [PATCH 0628/1164] Fix saveMemento --- src/vs/workbench/parts/search/browser/searchViewlet.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index 2983e323396..e99d35d1ad4 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -1351,7 +1351,6 @@ export class SearchViewlet extends Viewlet { public shutdown(): void { this.viewletSettings['query.contentPattern'] = this.searchWidget.searchInput.getValue(); - this.saveMemento(); super.shutdown(); } From 8dd07034c0b24df40657f8fecc8a96983d456db0 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 18 May 2017 15:17:31 -0700 Subject: [PATCH 0629/1164] Split reporter out into own file --- .../typescript/src/typescriptServiceClient.ts | 40 +--------- extensions/typescript/src/utils/telemetry.ts | 76 +++++++++++++++++++ 2 files changed, 80 insertions(+), 36 deletions(-) create mode 100644 extensions/typescript/src/utils/telemetry.ts diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index 300e0fb842e..f10338b0cd7 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -22,9 +22,8 @@ import Logger from './utils/logger'; import * as VersionStatus from './utils/versionStatus'; import * as is from './utils/is'; -import TelemetryReporter from 'vscode-extension-telemetry'; - import * as nls from 'vscode-nls'; +import TelemetryReporter from "./utils/telemetry"; const localize = nls.loadMessageBundle(); interface CallbackItem { @@ -43,12 +42,6 @@ interface RequestItem { callbacks: CallbackItem | null; } -interface IPackageInfo { - name: string; - version: string; - aiKey: string; -} - enum Trace { Off, Messages, @@ -162,7 +155,6 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient private _onDidEndInstallTypings = new EventEmitter(); private _onTypesInstallerInitializationFailed = new EventEmitter(); - private _packageInfo: IPackageInfo | null; private _apiVersion: API; private telemetryReporter: TelemetryReporter; private checkJs: boolean; @@ -230,10 +222,8 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient this.restartTsServer(); } })); - if (this.packageInfo && this.packageInfo.aiKey) { - this.telemetryReporter = new TelemetryReporter(this.packageInfo.name, this.packageInfo.version, this.packageInfo.aiKey); - disposables.push(this.telemetryReporter); - } + this.telemetryReporter = new TelemetryReporter(); + disposables.push(this.telemetryReporter); this.startService(); } @@ -341,30 +331,8 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient this.logger.logLevel('Trace', message, data); } - private get packageInfo(): IPackageInfo | null { - - if (this._packageInfo !== undefined) { - return this._packageInfo; - } - let packagePath = path.join(__dirname, './../package.json'); - let extensionPackage = require(packagePath); - if (extensionPackage) { - this._packageInfo = { - name: extensionPackage.name, - version: extensionPackage.version, - aiKey: extensionPackage.aiKey - }; - } else { - this._packageInfo = null; - } - - return this._packageInfo; - } - public logTelemetry(eventName: string, properties?: { [prop: string]: string }) { - if (this.telemetryReporter) { - this.telemetryReporter.sendTelemetryEvent(eventName, properties); - } + this.telemetryReporter.logTelemetry(eventName, properties); } private service(): Thenable { diff --git a/extensions/typescript/src/utils/telemetry.ts b/extensions/typescript/src/utils/telemetry.ts new file mode 100644 index 00000000000..8092b4fb4a4 --- /dev/null +++ b/extensions/typescript/src/utils/telemetry.ts @@ -0,0 +1,76 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as path from 'path'; +import VsCodeTelemetryReporter from 'vscode-extension-telemetry'; +import { Disposable } from "vscode"; + + +interface IPackageInfo { + name: string; + version: string; + aiKey: string; +} + + +export default class TelemetryReporter extends Disposable { + private _packageInfo: IPackageInfo | null; + + private _reporter: VsCodeTelemetryReporter | null; + + constructor() { + super(() => this.dispose()); + } + + dispose() { + if (this._reporter) { + this._reporter.dispose(); + this._reporter = null; + } + } + + public logTelemetry(eventName: string, properties?: { [prop: string]: string }) { + if (this._reporter) { + this._reporter.sendTelemetryEvent(eventName, properties); + } + } + + private get reporter(): VsCodeTelemetryReporter | null { + if (typeof this._reporter !== 'undefined') { + return this._reporter; + } + + if (this.packageInfo && this.packageInfo.aiKey) { + this._reporter = new VsCodeTelemetryReporter( + this.packageInfo.name, + this.packageInfo.version, + this.packageInfo.aiKey); + } else { + this._reporter = null; + } + return this._reporter; + } + + private get packageInfo(): IPackageInfo | null { + if (this._packageInfo !== undefined) { + return this._packageInfo; + } + let packagePath = path.join(__dirname, './../package.json'); + let extensionPackage = require(packagePath); + if (extensionPackage) { + this._packageInfo = { + name: extensionPackage.name, + version: extensionPackage.version, + aiKey: extensionPackage.aiKey + }; + } else { + this._packageInfo = null; + } + + return this._packageInfo; + } +} \ No newline at end of file From 89f1f0228635daf1ec64f50e32c3981aa44589bc Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 18 May 2017 15:20:13 -0700 Subject: [PATCH 0630/1164] Use correct reporter instance --- extensions/typescript/src/utils/telemetry.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/typescript/src/utils/telemetry.ts b/extensions/typescript/src/utils/telemetry.ts index 8092b4fb4a4..1f5bebb2401 100644 --- a/extensions/typescript/src/utils/telemetry.ts +++ b/extensions/typescript/src/utils/telemetry.ts @@ -34,8 +34,8 @@ export default class TelemetryReporter extends Disposable { } public logTelemetry(eventName: string, properties?: { [prop: string]: string }) { - if (this._reporter) { - this._reporter.sendTelemetryEvent(eventName, properties); + if (this.reporter) { + this.reporter.sendTelemetryEvent(eventName, properties); } } From a7c862281adf9824a048e28fea8113c85dca517f Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 18 May 2017 12:47:55 +0200 Subject: [PATCH 0631/1164] Stylistic changes --- src/vs/editor/common/controller/cursor.ts | 342 ++++++++++------------ 1 file changed, 158 insertions(+), 184 deletions(-) diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index bc49cef51d3..0388e5bc489 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -41,14 +41,11 @@ interface IExecContext { interface ICommandData { operations: editorCommon.IIdentifiedSingleEditOperation[]; - hadTrackedRange: boolean; hadTrackedEditOperation: boolean; } interface ICommandsData { operations: editorCommon.IIdentifiedSingleEditOperation[]; - hadTrackedRanges: boolean[]; - anyoneHadTrackedRange: boolean; anyoneHadTrackedEditOperation: boolean; } @@ -60,19 +57,18 @@ export class Cursor extends Disposable implements ICursors { public onDidChangeSelection(listener: (e: ICursorSelectionChangedEvent) => void): IDisposable { return this._eventEmitter.addListener(CursorEventType.CursorSelectionChanged, listener); } - - private configuration: editorCommon.IConfiguration; - public context: CursorContext; - private model: editorCommon.IModel; - private _eventEmitter: EventEmitter; - public addBulkListener(listener: BulkListenerCallback): IDisposable { return this._eventEmitter.addBulkListener(listener); } - private cursors: CursorCollection; - private viewModelHelper: IViewModelHelper; + private readonly _eventEmitter: EventEmitter; + private readonly _configuration: editorCommon.IConfiguration; + private readonly _model: editorCommon.IModel; + private readonly _viewModelHelper: IViewModelHelper; + public context: CursorContext; + + private _cursors: CursorCollection; private _isHandling: boolean; private _isDoingComposition: boolean; private _columnSelectData: IColumnSelectData; @@ -84,35 +80,35 @@ export class Cursor extends Disposable implements ICursors { constructor(configuration: editorCommon.IConfiguration, model: editorCommon.IModel, viewModelHelper: IViewModelHelper) { super(); this._eventEmitter = this._register(new EventEmitter()); - this.configuration = configuration; - this.model = model; - this.viewModelHelper = viewModelHelper; + this._configuration = configuration; + this._model = model; + this._viewModelHelper = viewModelHelper; const createCursorContext = () => { const config = new CursorConfiguration( - this.model.getLanguageIdentifier(), - this.model.getOneIndent(), - this.model.getOptions(), - this.configuration + this._model.getLanguageIdentifier(), + this._model.getOneIndent(), + this._model.getOptions(), + this._configuration ); this.context = new CursorContext( - this.model, - this.viewModelHelper, + this._model, + this._viewModelHelper, config ); - if (this.cursors) { - this.cursors.updateContext(this.context); + if (this._cursors) { + this._cursors.updateContext(this.context); } }; createCursorContext(); - this.cursors = new CursorCollection(this.context); + this._cursors = new CursorCollection(this.context); this._isHandling = false; this._isDoingComposition = false; this._columnSelectData = null; - this._register(this.model.addBulkListener((events) => { + this._register(this._model.addBulkListener((events) => { if (this._isHandling) { return; } @@ -143,7 +139,7 @@ export class Cursor extends Disposable implements ICursors { this._onModelContentChanged(hadFlushEvent); })); - this._register(this.model.onDidChangeLanguage((e) => { + this._register(this._model.onDidChangeLanguage((e) => { createCursorContext(); })); this._register(LanguageConfigurationRegistry.onDidChange(() => { @@ -153,7 +149,7 @@ export class Cursor extends Disposable implements ICursors { this._register(model.onDidChangeOptions(() => { createCursorContext(); })); - this._register(this.configuration.onDidChange((e) => { + this._register(this._configuration.onDidChange((e) => { if (CursorConfiguration.shouldRecreate(e)) { createCursorContext(); } @@ -164,40 +160,37 @@ export class Cursor extends Disposable implements ICursors { } public dispose(): void { - this.model = null; - this.cursors.dispose(); - this.cursors = null; - this.configuration = null; - this.viewModelHelper = null; + this._cursors.dispose(); + this._cursors = null; super.dispose(); } public getPrimaryCursor(): CursorState { - return this.cursors.getPrimaryCursor(); + return this._cursors.getPrimaryCursor(); } public getLastAddedCursorIndex(): number { - return this.cursors.getLastAddedCursorIndex(); + return this._cursors.getLastAddedCursorIndex(); } public getAll(): CursorState[] { - return this.cursors.getAll(); + return this._cursors.getAll(); } public setStates(source: string, reason: CursorChangeReason, states: CursorState[]): void { - const oldSelections = this.cursors.getSelections(); - const oldViewSelections = this.cursors.getViewSelections(); + const oldSelections = this._cursors.getSelections(); + const oldViewSelections = this._cursors.getViewSelections(); // TODO@Alex // ensure valid state on all cursors // this.cursors.ensureValidState(); - this.cursors.setStates(states); - this.cursors.normalize(); + this._cursors.setStates(states); + this._cursors.normalize(); this._columnSelectData = null; - const newSelections = this.cursors.getSelections(); - const newViewSelections = this.cursors.getViewSelections(); + const newSelections = this._cursors.getSelections(); + const newViewSelections = this._cursors.getViewSelections(); let somethingChanged = false; if (oldSelections.length !== newSelections.length) { @@ -241,12 +234,11 @@ export class Cursor extends Disposable implements ICursors { public saveState(): editorCommon.ICursorState[] { - var selections = this.cursors.getSelections(), - result: editorCommon.ICursorState[] = [], - selection: Selection; + let result: editorCommon.ICursorState[] = []; - for (var i = 0; i < selections.length; i++) { - selection = selections[i]; + const selections = this._cursors.getSelections(); + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; result.push({ inSelectionMode: !selection.isEmpty(), @@ -266,13 +258,13 @@ export class Cursor extends Disposable implements ICursors { public restoreState(states: editorCommon.ICursorState[]): void { - var desiredSelections: ISelection[] = [], - state: editorCommon.ICursorState; + let desiredSelections: ISelection[] = []; - for (var i = 0; i < states.length; i++) { - state = states[i]; + for (let i = 0, len = states.length; i < len; i++) { + const state = states[i]; - var positionLineNumber = 1, positionColumn = 1; + let positionLineNumber = 1; + let positionColumn = 1; // Avoid missing properties on the literal if (state.position && state.position.lineNumber) { @@ -282,7 +274,8 @@ export class Cursor extends Disposable implements ICursors { positionColumn = state.position.column; } - var selectionStartLineNumber = positionLineNumber, selectionStartColumn = positionColumn; + let selectionStartLineNumber = positionLineNumber; + let selectionStartColumn = positionColumn; // Avoid missing properties on the literal if (state.selectionStart && state.selectionStart.lineNumber) { @@ -301,7 +294,7 @@ export class Cursor extends Disposable implements ICursors { } this._onHandler('restoreState', (ctx: IMultipleCursorOperationContext) => { - this.cursors.setSelections(desiredSelections); + this._cursors.setSelections(desiredSelections); return false; }, 'restoreState', null); } @@ -309,9 +302,9 @@ export class Cursor extends Disposable implements ICursors { private _onModelContentChanged(hadFlushEvent: boolean): void { if (hadFlushEvent) { // a model.setValue() was called - this.cursors.dispose(); + this._cursors.dispose(); - this.cursors = new CursorCollection(this.context); + this._cursors = new CursorCollection(this.context); this.emitCursorPositionChanged('model', CursorChangeReason.ContentFlush); this.emitCursorSelectionChanged('model', CursorChangeReason.ContentFlush); @@ -319,13 +312,13 @@ export class Cursor extends Disposable implements ICursors { if (!this._isHandling) { // Read the markers before entering `_onHandler`, since that would validate // the position and ruin the markers - const selectionsFromMarkers = this.cursors.readSelectionFromMarkers(); + const selectionsFromMarkers = this._cursors.readSelectionFromMarkers(); this._onHandler('recoverSelectionFromMarkers', (ctx: IMultipleCursorOperationContext) => { ctx.cursorPositionChangeReason = CursorChangeReason.RecoverFromMarkers; ctx.shouldReveal = false; ctx.shouldPushStackElementBefore = false; ctx.shouldPushStackElementAfter = false; - this.cursors.setSelections(selectionsFromMarkers); + this._cursors.setSelections(selectionsFromMarkers); }, 'modelChange', null); } } @@ -334,21 +327,21 @@ export class Cursor extends Disposable implements ICursors { // ------ some getters/setters public getSelection(): Selection { - return this.cursors.getPrimaryCursor().modelState.selection; + return this._cursors.getPrimaryCursor().modelState.selection; } public getSelections(): Selection[] { - return this.cursors.getSelections(); + return this._cursors.getSelections(); } public getPosition(): Position { - return this.cursors.getPrimaryCursor().modelState.position; + return this._cursors.getPrimaryCursor().modelState.position; } public setSelections(source: string, selections: ISelection[]): void { this._onHandler('setSelections', (ctx: IMultipleCursorOperationContext) => { ctx.shouldReveal = false; - this.cursors.setSelections(selections); + this._cursors.setSelections(selections); return false; }, source, null); } @@ -357,7 +350,7 @@ export class Cursor extends Disposable implements ICursors { private _createAndInterpretHandlerCtx(eventSource: string, eventData: any, callback: (currentHandlerCtx: IMultipleCursorOperationContext) => void): void { - var ctx: IMultipleCursorOperationContext = { + const ctx: IMultipleCursorOperationContext = { cursorPositionChangeReason: CursorChangeReason.NotSet, shouldReveal: true, eventSource: eventSource, @@ -371,7 +364,7 @@ export class Cursor extends Disposable implements ICursors { callback(ctx); this._interpretHandlerContext(ctx); - this.cursors.normalize(); + this._cursors.normalize(); } private _onHandler(command: string, handler: (ctx: IMultipleCursorOperationContext) => void, source: string, data: any): void { @@ -379,11 +372,11 @@ export class Cursor extends Disposable implements ICursors { this._isHandling = true; try { - const oldSelections = this.cursors.getSelections(); - const oldViewSelections = this.cursors.getViewSelections(); + const oldSelections = this._cursors.getSelections(); + const oldViewSelections = this._cursors.getViewSelections(); // ensure valid state on all cursors - this.cursors.ensureValidState(); + this._cursors.ensureValidState(); let cursorPositionChangeReason: CursorChangeReason; let shouldReveal: boolean; @@ -395,8 +388,8 @@ export class Cursor extends Disposable implements ICursors { shouldReveal = currentHandlerCtx.shouldReveal; }); - const newSelections = this.cursors.getSelections(); - const newViewSelections = this.cursors.getViewSelections(); + const newSelections = this._cursors.getSelections(); + const newViewSelections = this._cursors.getViewSelections(); let somethingChanged = false; if (oldSelections.length !== newSelections.length) { @@ -432,7 +425,7 @@ export class Cursor extends Disposable implements ICursors { private _interpretHandlerContext(ctx: IMultipleCursorOperationContext): void { if (ctx.shouldPushStackElementBefore) { - this.model.pushStackElement(); + this._model.pushStackElement(); ctx.shouldPushStackElementBefore = false; } @@ -442,7 +435,7 @@ export class Cursor extends Disposable implements ICursors { ctx.executeCommands = []; if (ctx.shouldPushStackElementAfter) { - this.model.pushStackElement(); + this._model.pushStackElement(); ctx.shouldPushStackElementAfter = false; } } @@ -452,16 +445,16 @@ export class Cursor extends Disposable implements ICursors { return; } - this.cursors.setSelections(cursorState); + this._cursors.setSelections(cursorState); } private _getEditOperationsFromCommand(ctx: IExecContext, majorIdentifier: number, command: editorCommon.ICommand, isAutoWhitespaceCommand: boolean): ICommandData { // This method acts as a transaction, if the command fails // everything it has done is ignored - var operations: editorCommon.IIdentifiedSingleEditOperation[] = [], - operationMinor = 0; + let operations: editorCommon.IIdentifiedSingleEditOperation[] = []; + let operationMinor = 0; - var addEditOperation = (selection: Range, text: string) => { + const addEditOperation = (selection: Range, text: string) => { if (selection.isEmpty() && text === '') { // This command wants to add a no-op => no thank you return; @@ -478,16 +471,15 @@ export class Cursor extends Disposable implements ICursors { }); }; - var hadTrackedEditOperation = false; - var addTrackedEditOperation = (selection: Range, text: string) => { + let hadTrackedEditOperation = false; + const addTrackedEditOperation = (selection: Range, text: string) => { hadTrackedEditOperation = true; addEditOperation(selection, text); }; - var hadTrackedRange = false; - var trackSelection = (selection: Selection, trackPreviousOnEmpty?: boolean) => { - var selectionMarkerStickToPreviousCharacter: boolean, - positionMarkerStickToPreviousCharacter: boolean; + const trackSelection = (selection: Selection, trackPreviousOnEmpty?: boolean) => { + let selectionMarkerStickToPreviousCharacter: boolean; + let positionMarkerStickToPreviousCharacter: boolean; if (selection.isEmpty()) { // Try to lock it with surrounding text @@ -495,7 +487,7 @@ export class Cursor extends Disposable implements ICursors { selectionMarkerStickToPreviousCharacter = trackPreviousOnEmpty; positionMarkerStickToPreviousCharacter = trackPreviousOnEmpty; } else { - var maxLineColumn = this.model.getLineMaxColumn(selection.startLineNumber); + const maxLineColumn = this._model.getLineMaxColumn(selection.startLineNumber); if (selection.startColumn === maxLineColumn) { selectionMarkerStickToPreviousCharacter = true; positionMarkerStickToPreviousCharacter = true; @@ -514,59 +506,48 @@ export class Cursor extends Disposable implements ICursors { } } - var l = ctx.selectionStartMarkers.length; - ctx.selectionStartMarkers[l] = this.model._addMarker(0, selection.selectionStartLineNumber, selection.selectionStartColumn, selectionMarkerStickToPreviousCharacter); - ctx.positionMarkers[l] = this.model._addMarker(0, selection.positionLineNumber, selection.positionColumn, positionMarkerStickToPreviousCharacter); + const l = ctx.selectionStartMarkers.length; + ctx.selectionStartMarkers[l] = this._model._addMarker(0, selection.selectionStartLineNumber, selection.selectionStartColumn, selectionMarkerStickToPreviousCharacter); + ctx.positionMarkers[l] = this._model._addMarker(0, selection.positionLineNumber, selection.positionColumn, positionMarkerStickToPreviousCharacter); return l.toString(); }; - var editOperationBuilder: editorCommon.IEditOperationBuilder = { + const editOperationBuilder: editorCommon.IEditOperationBuilder = { addEditOperation: addEditOperation, addTrackedEditOperation: addTrackedEditOperation, trackSelection: trackSelection }; try { - command.getEditOperations(this.model, editOperationBuilder); + command.getEditOperations(this._model, editOperationBuilder); } catch (e) { e.friendlyMessage = nls.localize('corrupt.commands', "Unexpected exception while executing command."); onUnexpectedError(e); return { operations: [], - hadTrackedRange: false, hadTrackedEditOperation: false }; } return { operations: operations, - hadTrackedRange: hadTrackedRange, hadTrackedEditOperation: hadTrackedEditOperation }; } private _getEditOperations(ctx: IExecContext, commands: editorCommon.ICommand[], isAutoWhitespaceCommand: boolean[]): ICommandsData { - var oneResult: ICommandData; - var operations: editorCommon.IIdentifiedSingleEditOperation[] = []; - var hadTrackedRanges: boolean[] = []; - var anyoneHadTrackedEditOperation: boolean = false; - var anyoneHadTrackedRange: boolean; + let operations: editorCommon.IIdentifiedSingleEditOperation[] = []; + let anyoneHadTrackedEditOperation: boolean = false; - for (var i = 0; i < commands.length; i++) { + for (let i = 0, len = commands.length; i < len; i++) { if (commands[i]) { - oneResult = this._getEditOperationsFromCommand(ctx, i, commands[i], isAutoWhitespaceCommand[i]); + const oneResult = this._getEditOperationsFromCommand(ctx, i, commands[i], isAutoWhitespaceCommand[i]); operations = operations.concat(oneResult.operations); - hadTrackedRanges[i] = oneResult.hadTrackedRange; - anyoneHadTrackedRange = anyoneHadTrackedRange || hadTrackedRanges[i]; anyoneHadTrackedEditOperation = anyoneHadTrackedEditOperation || oneResult.hadTrackedEditOperation; - } else { - hadTrackedRanges[i] = false; } } return { operations: operations, - hadTrackedRanges: hadTrackedRanges, - anyoneHadTrackedRange: anyoneHadTrackedRange, anyoneHadTrackedEditOperation: anyoneHadTrackedEditOperation }; } @@ -582,18 +563,16 @@ export class Cursor extends Disposable implements ICursors { }); // Operations can not overlap! - var loserCursorsMap: { [index: string]: boolean; } = {}; + let loserCursorsMap: { [index: string]: boolean; } = {}; - var previousOp: editorCommon.IIdentifiedSingleEditOperation; - var currentOp: editorCommon.IIdentifiedSingleEditOperation; - var loserMajor: number; - - for (var i = 1; i < operations.length; i++) { - previousOp = operations[i - 1]; - currentOp = operations[i]; + for (let i = 1; i < operations.length; i++) { + const previousOp = operations[i - 1]; + const currentOp = operations[i]; if (previousOp.range.getStartPosition().isBefore(currentOp.range.getEndPosition())) { + let loserMajor: number; + if (previousOp.identifier.major > currentOp.identifier.major) { // previousOp loses the battle loserMajor = previousOp.identifier.major; @@ -603,7 +582,7 @@ export class Cursor extends Disposable implements ICursors { loserCursorsMap[loserMajor.toString()] = true; - for (var j = 0; j < operations.length; j++) { + for (let j = 0; j < operations.length; j++) { if (operations[j].identifier.major === loserMajor) { operations.splice(j, 1); if (j < i) { @@ -623,34 +602,30 @@ export class Cursor extends Disposable implements ICursors { } private _internalExecuteCommands(commands: editorCommon.ICommand[], isAutoWhitespaceCommand: boolean[]): void { - var ctx: IExecContext = { + const ctx: IExecContext = { selectionStartMarkers: [], positionMarkers: [] }; this._innerExecuteCommands(ctx, commands, isAutoWhitespaceCommand); - for (var i = 0; i < ctx.selectionStartMarkers.length; i++) { - this.model._removeMarker(ctx.selectionStartMarkers[i]); - this.model._removeMarker(ctx.positionMarkers[i]); + for (let i = 0; i < ctx.selectionStartMarkers.length; i++) { + this._model._removeMarker(ctx.selectionStartMarkers[i]); + this._model._removeMarker(ctx.positionMarkers[i]); } } private _arrayIsEmpty(commands: editorCommon.ICommand[]): boolean { - var i: number, - len: number; - - for (i = 0, len = commands.length; i < len; i++) { + for (let i = 0, len = commands.length; i < len; i++) { if (commands[i]) { return false; } } - return true; } private _innerExecuteCommands(ctx: IExecContext, commands: editorCommon.ICommand[], isAutoWhitespaceCommand: boolean[]): void { - if (this.configuration.editor.readOnly) { + if (this._configuration.editor.readOnly) { return; } @@ -658,27 +633,27 @@ export class Cursor extends Disposable implements ICursors { return; } - var selectionsBefore = this.cursors.getSelections(); + const selectionsBefore = this._cursors.getSelections(); - var commandsData = this._getEditOperations(ctx, commands, isAutoWhitespaceCommand); - if (commandsData.operations.length === 0 && !commandsData.anyoneHadTrackedRange) { + const commandsData = this._getEditOperations(ctx, commands, isAutoWhitespaceCommand); + if (commandsData.operations.length === 0) { return; } - var rawOperations = commandsData.operations; + const rawOperations = commandsData.operations; - var editableRange = this.model.getEditableRange(); - var editableRangeStart = editableRange.getStartPosition(); - var editableRangeEnd = editableRange.getEndPosition(); - for (var i = 0; i < rawOperations.length; i++) { - var operationRange = rawOperations[i].range; + const editableRange = this._model.getEditableRange(); + const editableRangeStart = editableRange.getStartPosition(); + const editableRangeEnd = editableRange.getEndPosition(); + for (let i = 0, len = rawOperations.length; i < len; i++) { + const operationRange = rawOperations[i].range; if (!editableRangeStart.isBeforeOrEqual(operationRange.getStartPosition()) || !operationRange.getEndPosition().isBeforeOrEqual(editableRangeEnd)) { // These commands are outside of the editable range return; } } - var loserCursorsMap = this._getLoserCursorMap(rawOperations); + const loserCursorsMap = this._getLoserCursorMap(rawOperations); if (loserCursorsMap.hasOwnProperty('0')) { // These commands are very messed up console.warn('Ignoring commands'); @@ -686,8 +661,8 @@ export class Cursor extends Disposable implements ICursors { } // Remove operations belonging to losing cursors - var filteredOperations: editorCommon.IIdentifiedSingleEditOperation[] = []; - for (var i = 0; i < rawOperations.length; i++) { + let filteredOperations: editorCommon.IIdentifiedSingleEditOperation[] = []; + for (let i = 0, len = rawOperations.length; i < len; i++) { if (!loserCursorsMap.hasOwnProperty(rawOperations[i].identifier.major.toString())) { filteredOperations.push(rawOperations[i]); } @@ -698,35 +673,35 @@ export class Cursor extends Disposable implements ICursors { if (commandsData.anyoneHadTrackedEditOperation && filteredOperations.length > 0) { filteredOperations[0]._isTracked = true; } - var selectionsAfter = this.model.pushEditOperations(selectionsBefore, filteredOperations, (inverseEditOperations: editorCommon.IIdentifiedSingleEditOperation[]): Selection[] => { - var groupedInverseEditOperations: editorCommon.IIdentifiedSingleEditOperation[][] = []; - for (var i = 0; i < selectionsBefore.length; i++) { + const selectionsAfter = this._model.pushEditOperations(selectionsBefore, filteredOperations, (inverseEditOperations: editorCommon.IIdentifiedSingleEditOperation[]): Selection[] => { + let groupedInverseEditOperations: editorCommon.IIdentifiedSingleEditOperation[][] = []; + for (let i = 0; i < selectionsBefore.length; i++) { groupedInverseEditOperations[i] = []; } - for (var i = 0; i < inverseEditOperations.length; i++) { - var op = inverseEditOperations[i]; + for (let i = 0; i < inverseEditOperations.length; i++) { + const op = inverseEditOperations[i]; if (!op.identifier) { // perhaps auto whitespace trim edits continue; } groupedInverseEditOperations[op.identifier.major].push(op); } - var minorBasedSorter = (a: editorCommon.IIdentifiedSingleEditOperation, b: editorCommon.IIdentifiedSingleEditOperation) => { + const minorBasedSorter = (a: editorCommon.IIdentifiedSingleEditOperation, b: editorCommon.IIdentifiedSingleEditOperation) => { return a.identifier.minor - b.identifier.minor; }; - var cursorSelections: Selection[] = []; - for (var i = 0; i < selectionsBefore.length; i++) { - if (groupedInverseEditOperations[i].length > 0 || commandsData.hadTrackedRanges[i]) { + let cursorSelections: Selection[] = []; + for (let i = 0; i < selectionsBefore.length; i++) { + if (groupedInverseEditOperations[i].length > 0) { groupedInverseEditOperations[i].sort(minorBasedSorter); - cursorSelections[i] = commands[i].computeCursorState(this.model, { + cursorSelections[i] = commands[i].computeCursorState(this._model, { getInverseEditOperations: () => { return groupedInverseEditOperations[i]; }, getTrackedSelection: (id: string) => { - var idx = parseInt(id, 10); - var selectionStartMarker = this.model._getMarker(ctx.selectionStartMarkers[idx]); - var positionMarker = this.model._getMarker(ctx.positionMarkers[idx]); + const idx = parseInt(id, 10); + const selectionStartMarker = this._model._getMarker(ctx.selectionStartMarkers[idx]); + const positionMarker = this._model._getMarker(ctx.positionMarkers[idx]); return new Selection(selectionStartMarker.lineNumber, selectionStartMarker.column, positionMarker.lineNumber, positionMarker.column); } }); @@ -738,9 +713,8 @@ export class Cursor extends Disposable implements ICursors { }); // Extract losing cursors - var losingCursorIndex: string; - var losingCursors: number[] = []; - for (losingCursorIndex in loserCursorsMap) { + let losingCursors: number[] = []; + for (let losingCursorIndex in loserCursorsMap) { if (loserCursorsMap.hasOwnProperty(losingCursorIndex)) { losingCursors.push(parseInt(losingCursorIndex, 10)); } @@ -752,7 +726,7 @@ export class Cursor extends Disposable implements ICursors { }); // Remove losing cursors - for (var i = 0; i < losingCursors.length; i++) { + for (let i = 0; i < losingCursors.length; i++) { selectionsAfter.splice(losingCursors[i], 1); } @@ -764,22 +738,22 @@ export class Cursor extends Disposable implements ICursors { // ----- emitting events private emitCursorPositionChanged(source: string, reason: CursorChangeReason): void { - var positions = this.cursors.getPositions(); - var primaryPosition = positions[0]; - var secondaryPositions = positions.slice(1); + const positions = this._cursors.getPositions(); + const primaryPosition = positions[0]; + const secondaryPositions = positions.slice(1); - var viewPositions = this.cursors.getViewPositions(); - var primaryViewPosition = viewPositions[0]; - var secondaryViewPositions = viewPositions.slice(1); + const viewPositions = this._cursors.getViewPositions(); + const primaryViewPosition = viewPositions[0]; + const secondaryViewPositions = viewPositions.slice(1); - var isInEditableRange: boolean = true; - if (this.model.hasEditableRange()) { - var editableRange = this.model.getEditableRange(); + let isInEditableRange: boolean = true; + if (this._model.hasEditableRange()) { + const editableRange = this._model.getEditableRange(); if (!editableRange.containsPosition(primaryPosition)) { isInEditableRange = false; } } - var e: ICursorPositionChangedEvent = { + const e: ICursorPositionChangedEvent = { position: primaryPosition, viewPosition: primaryViewPosition, secondaryPositions: secondaryPositions, @@ -792,15 +766,15 @@ export class Cursor extends Disposable implements ICursors { } private emitCursorSelectionChanged(source: string, reason: CursorChangeReason): void { - let selections = this.cursors.getSelections(); - let primarySelection = selections[0]; - let secondarySelections = selections.slice(1); + const selections = this._cursors.getSelections(); + const primarySelection = selections[0]; + const secondarySelections = selections.slice(1); - let viewSelections = this.cursors.getViewSelections(); - let primaryViewSelection = viewSelections[0]; - let secondaryViewSelections = viewSelections.slice(1); + const viewSelections = this._cursors.getViewSelections(); + const primaryViewSelection = viewSelections[0]; + const secondaryViewSelections = viewSelections.slice(1); - let e: ICursorSelectionChangedEvent = { + const e: ICursorSelectionChangedEvent = { selection: primarySelection, viewSelection: primaryViewSelection, secondarySelections: secondarySelections, @@ -812,21 +786,21 @@ export class Cursor extends Disposable implements ICursors { } private _revealRange(revealTarget: RevealTarget, verticalType: VerticalRevealType, revealHorizontal: boolean): void { - var positions = this.cursors.getPositions(); - var viewPositions = this.cursors.getViewPositions(); + const positions = this._cursors.getPositions(); + const viewPositions = this._cursors.getViewPositions(); - var position = positions[0]; - var viewPosition = viewPositions[0]; + let position = positions[0]; + let viewPosition = viewPositions[0]; if (revealTarget === RevealTarget.TopMost) { - for (var i = 1; i < positions.length; i++) { + for (let i = 1; i < positions.length; i++) { if (positions[i].isBefore(position)) { position = positions[i]; viewPosition = viewPositions[i]; } } } else if (revealTarget === RevealTarget.BottomMost) { - for (var i = 1; i < positions.length; i++) { + for (let i = 1; i < positions.length; i++) { if (position.isBeforeOrEqual(positions[i])) { position = positions[i]; viewPosition = viewPositions[i]; @@ -839,13 +813,13 @@ export class Cursor extends Disposable implements ICursors { } } - var range = new Range(position.lineNumber, position.column, position.lineNumber, position.column); - var viewRange = new Range(viewPosition.lineNumber, viewPosition.column, viewPosition.lineNumber, viewPosition.column); + const range = new Range(position.lineNumber, position.column, position.lineNumber, position.column); + const viewRange = new Range(viewPosition.lineNumber, viewPosition.column, viewPosition.lineNumber, viewPosition.column); this.emitCursorRevealRange(range, viewRange, verticalType, revealHorizontal); } public emitCursorRevealRange(range: Range, viewRange: Range, verticalType: VerticalRevealType, revealHorizontal: boolean) { - var e: ICursorRevealRangeEvent = { + const e: ICursorRevealRangeEvent = { range: range, viewRange: viewRange, verticalType: verticalType, @@ -905,7 +879,7 @@ export class Cursor extends Disposable implements ICursors { if (this._columnSelectData) { return this._columnSelectData; } - const primaryCursor = this.cursors.getPrimaryCursor(); + const primaryCursor = this._cursors.getPrimaryCursor(); const primaryPos = primaryCursor.viewState.position; return { toViewLineNumber: primaryPos.lineNumber, @@ -929,7 +903,7 @@ export class Cursor extends Disposable implements ICursors { } private _getAllCursorsModelState(sorted: boolean = false): SingleCursorState[] { - let cursors = this.cursors.getAll(); + let cursors = this._cursors.getAll(); if (sorted) { cursors = cursors.sort((a, b) => { @@ -957,7 +931,7 @@ export class Cursor extends Disposable implements ICursors { } private _type(ctx: IMultipleCursorOperationContext): void { - var text = ctx.eventData.text; + const text = ctx.eventData.text; if (!this._isDoingComposition && ctx.eventSource === 'keyboard') { // If this event is coming straight from the keyboard, look for electric characters and enter @@ -1020,18 +994,18 @@ export class Cursor extends Disposable implements ICursors { return null; } - var selections = this.cursors.getSelections(); + const selections = this._cursors.getSelections(); if (selections.length === 1) { return null; } - for (var i = 0; i < selections.length; i++) { + for (let i = 0; i < selections.length; i++) { if (selections[i].startLineNumber !== selections[i].endLineNumber) { return null; } } - var pastePieces = ctx.eventData.text.split(/\r\n|\r|\n/); + let pastePieces = ctx.eventData.text.split(/\r\n|\r|\n/); if (pastePieces.length !== selections.length) { return null; } @@ -1040,7 +1014,7 @@ export class Cursor extends Disposable implements ICursors { } private _paste(ctx: IMultipleCursorOperationContext): void { - var distributedPaste = this._distributePasteToCursors(ctx); + const distributedPaste = this._distributePasteToCursors(ctx); ctx.cursorPositionChangeReason = CursorChangeReason.Paste; if (distributedPaste) { @@ -1066,18 +1040,18 @@ export class Cursor extends Disposable implements ICursors { private _undo(ctx: IMultipleCursorOperationContext): void { ctx.cursorPositionChangeReason = CursorChangeReason.Undo; - this._interpretCommandResult(this.model.undo()); + this._interpretCommandResult(this._model.undo()); } private _redo(ctx: IMultipleCursorOperationContext): void { ctx.cursorPositionChangeReason = CursorChangeReason.Redo; - this._interpretCommandResult(this.model.redo()); + this._interpretCommandResult(this._model.redo()); } private _externalExecuteCommand(ctx: IMultipleCursorOperationContext): void { const command = ctx.eventData; - this.cursors.killSecondaryCursors(); + this._cursors.killSecondaryCursors(); ctx.shouldReveal = true; From 121a4bca1d00a82305abc4435cec4d12be02c504 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 18 May 2017 14:26:03 +0200 Subject: [PATCH 0632/1164] Simplify cursor handlers --- src/vs/editor/common/controller/cursor.ts | 91 ++++++++----------- .../common/controller/cursorCollection.ts | 50 ++-------- .../editor/common/controller/cursorCommon.ts | 22 ++++- src/vs/editor/common/controller/oneCursor.ts | 18 +--- 4 files changed, 66 insertions(+), 115 deletions(-) diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 0388e5bc489..1f4e91e86e3 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -46,7 +46,7 @@ interface ICommandData { interface ICommandsData { operations: editorCommon.IIdentifiedSingleEditOperation[]; - anyoneHadTrackedEditOperation: boolean; + hadTrackedEditOperation: boolean; } export class Cursor extends Disposable implements ICursors { @@ -293,10 +293,8 @@ export class Cursor extends Disposable implements ICursors { }); } - this._onHandler('restoreState', (ctx: IMultipleCursorOperationContext) => { - this._cursors.setSelections(desiredSelections); - return false; - }, 'restoreState', null); + this.setStates('restoreState', CursorChangeReason.NotSet, CursorState.fromModelSelections(desiredSelections)); + this.reveal(true, RevealTarget.Primary); } private _onModelContentChanged(hadFlushEvent: boolean): void { @@ -313,13 +311,7 @@ export class Cursor extends Disposable implements ICursors { // Read the markers before entering `_onHandler`, since that would validate // the position and ruin the markers const selectionsFromMarkers = this._cursors.readSelectionFromMarkers(); - this._onHandler('recoverSelectionFromMarkers', (ctx: IMultipleCursorOperationContext) => { - ctx.cursorPositionChangeReason = CursorChangeReason.RecoverFromMarkers; - ctx.shouldReveal = false; - ctx.shouldPushStackElementBefore = false; - ctx.shouldPushStackElementAfter = false; - this._cursors.setSelections(selectionsFromMarkers); - }, 'modelChange', null); + this.setStates('modelChange', CursorChangeReason.RecoverFromMarkers, CursorState.fromModelSelections(selectionsFromMarkers)); } } } @@ -339,11 +331,7 @@ export class Cursor extends Disposable implements ICursors { } public setSelections(source: string, selections: ISelection[]): void { - this._onHandler('setSelections', (ctx: IMultipleCursorOperationContext) => { - ctx.shouldReveal = false; - this._cursors.setSelections(selections); - return false; - }, source, null); + this.setStates(source, CursorChangeReason.NotSet, CursorState.fromModelSelections(selections)); } // ------ auxiliary handling logic @@ -363,7 +351,32 @@ export class Cursor extends Disposable implements ICursors { callback(ctx); - this._interpretHandlerContext(ctx); + if (ctx.shouldPushStackElementBefore) { + this._model.pushStackElement(); + ctx.shouldPushStackElementBefore = false; + } + + this._columnSelectData = null; + + const execCtx: IExecContext = { + selectionStartMarkers: [], + positionMarkers: [] + }; + + this._innerExecuteCommands(execCtx, ctx.executeCommands, ctx.isAutoWhitespaceCommand); + + for (let i = 0; i < execCtx.selectionStartMarkers.length; i++) { + this._model._removeMarker(execCtx.selectionStartMarkers[i]); + this._model._removeMarker(execCtx.positionMarkers[i]); + } + + ctx.executeCommands = []; + + if (ctx.shouldPushStackElementAfter) { + this._model.pushStackElement(); + ctx.shouldPushStackElementAfter = false; + } + this._cursors.normalize(); } @@ -423,23 +436,6 @@ export class Cursor extends Disposable implements ICursors { this._isHandling = false; } - private _interpretHandlerContext(ctx: IMultipleCursorOperationContext): void { - if (ctx.shouldPushStackElementBefore) { - this._model.pushStackElement(); - ctx.shouldPushStackElementBefore = false; - } - - this._columnSelectData = null; - - this._internalExecuteCommands(ctx.executeCommands, ctx.isAutoWhitespaceCommand); - ctx.executeCommands = []; - - if (ctx.shouldPushStackElementAfter) { - this._model.pushStackElement(); - ctx.shouldPushStackElementAfter = false; - } - } - private _interpretCommandResult(cursorState: Selection[]): void { if (!cursorState || cursorState.length === 0) { return; @@ -537,18 +533,18 @@ export class Cursor extends Disposable implements ICursors { private _getEditOperations(ctx: IExecContext, commands: editorCommon.ICommand[], isAutoWhitespaceCommand: boolean[]): ICommandsData { let operations: editorCommon.IIdentifiedSingleEditOperation[] = []; - let anyoneHadTrackedEditOperation: boolean = false; + let hadTrackedEditOperation: boolean = false; for (let i = 0, len = commands.length; i < len; i++) { if (commands[i]) { - const oneResult = this._getEditOperationsFromCommand(ctx, i, commands[i], isAutoWhitespaceCommand[i]); - operations = operations.concat(oneResult.operations); - anyoneHadTrackedEditOperation = anyoneHadTrackedEditOperation || oneResult.hadTrackedEditOperation; + const r = this._getEditOperationsFromCommand(ctx, i, commands[i], isAutoWhitespaceCommand[i]); + operations = operations.concat(r.operations); + hadTrackedEditOperation = hadTrackedEditOperation || r.hadTrackedEditOperation; } } return { operations: operations, - anyoneHadTrackedEditOperation: anyoneHadTrackedEditOperation + hadTrackedEditOperation: hadTrackedEditOperation }; } @@ -601,19 +597,6 @@ export class Cursor extends Disposable implements ICursors { return loserCursorsMap; } - private _internalExecuteCommands(commands: editorCommon.ICommand[], isAutoWhitespaceCommand: boolean[]): void { - const ctx: IExecContext = { - selectionStartMarkers: [], - positionMarkers: [] - }; - - this._innerExecuteCommands(ctx, commands, isAutoWhitespaceCommand); - for (let i = 0; i < ctx.selectionStartMarkers.length; i++) { - this._model._removeMarker(ctx.selectionStartMarkers[i]); - this._model._removeMarker(ctx.positionMarkers[i]); - } - } - private _arrayIsEmpty(commands: editorCommon.ICommand[]): boolean { for (let i = 0, len = commands.length; i < len; i++) { if (commands[i]) { @@ -670,7 +653,7 @@ export class Cursor extends Disposable implements ICursors { // TODO@Alex: find a better way to do this. // give the hint that edit operations are tracked to the model - if (commandsData.anyoneHadTrackedEditOperation && filteredOperations.length > 0) { + if (commandsData.hadTrackedEditOperation && filteredOperations.length > 0) { filteredOperations[0]._isTracked = true; } const selectionsAfter = this._model.pushEditOperations(selectionsBefore, filteredOperations, (inverseEditOperations: editorCommon.IIdentifiedSingleEditOperation[]): Selection[] => { diff --git a/src/vs/editor/common/controller/cursorCollection.ts b/src/vs/editor/common/controller/cursorCollection.ts index 49633b4b90f..0aa97317662 100644 --- a/src/vs/editor/common/controller/cursorCollection.ts +++ b/src/vs/editor/common/controller/cursorCollection.ts @@ -104,8 +104,7 @@ export class CursorCollection { } public setSelections(selections: ISelection[]): void { - this.primaryCursor.setSelection(this.context, selections[0]); - this._setSecondarySelections(selections.slice(1)); + this.setStates(CursorState.fromModelSelections(selections)); } public getPrimaryCursor(): CursorState { @@ -130,7 +129,7 @@ export class CursorCollection { if (secondaryCursorsLength < secondaryStatesLength) { let createCnt = secondaryStatesLength - secondaryCursorsLength; for (let i = 0; i < createCnt; i++) { - this._addSecondaryCursor(null); + this._addSecondaryCursor(); } } else if (secondaryCursorsLength > secondaryStatesLength) { let removeCnt = secondaryCursorsLength - secondaryStatesLength; @@ -144,19 +143,16 @@ export class CursorCollection { } } - public killSecondaryCursors(): boolean { - return (this._setSecondarySelections([]) > 0); + public killSecondaryCursors(): void { + this._setSecondaryStates([]); } public normalize(): void { this._mergeCursorsIfNecessary(); } - private _addSecondaryCursor(selection: ISelection): void { + private _addSecondaryCursor(): void { var newCursor = new OneCursor(this.context); - if (selection) { - newCursor.setSelection(this.context, selection); - } this.secondaryCursors.push(newCursor); this.lastAddedCursorIndex = this.secondaryCursors.length; } @@ -168,39 +164,6 @@ export class CursorCollection { return this.lastAddedCursorIndex; } - /** - * Creates or disposes secondary cursors as necessary to match the number of `secondarySelections`. - * Return value: - * - a positive number indicates the number of secondary cursors added - * - a negative number indicates the number of secondary cursors removed - * - 0 indicates that no changes have been done to the secondary cursors list - */ - private _setSecondarySelections(secondarySelections: ISelection[]): number { - var secondaryCursorsLength = this.secondaryCursors.length; - var secondarySelectionsLength = secondarySelections.length; - var returnValue = secondarySelectionsLength - secondaryCursorsLength; - - if (secondaryCursorsLength < secondarySelectionsLength) { - var createCnt = secondarySelectionsLength - secondaryCursorsLength; - for (var i = 0; i < createCnt; i++) { - this._addSecondaryCursor(null); - } - } else if (secondaryCursorsLength > secondarySelectionsLength) { - var removeCnt = secondaryCursorsLength - secondarySelectionsLength; - for (var i = 0; i < removeCnt; i++) { - this._removeSecondaryCursor(this.secondaryCursors.length - 1); - } - } - - for (var i = 0; i < secondarySelectionsLength; i++) { - if (secondarySelections[i]) { - this.secondaryCursors[i].setSelection(this.context, secondarySelections[i]); - } - } - - return returnValue; - } - private _removeSecondaryCursor(removeIndex: number): void { if (this.lastAddedCursorIndex >= removeIndex + 1) { this.lastAddedCursorIndex--; @@ -274,7 +237,8 @@ export class CursorCollection { } sortedCursors[winnerSortedCursorIndex].selection = resultingSelection; - cursors[winnerIndex].setSelection(this.context, resultingSelection); + const resultingState = CursorState.fromModelSelection(resultingSelection); + cursors[winnerIndex].setState(this.context, resultingState.modelState, resultingState.viewState); } for (var j = 0; j < sortedCursors.length; j++) { diff --git a/src/vs/editor/common/controller/cursorCommon.ts b/src/vs/editor/common/controller/cursorCommon.ts index 55e1413e192..81bd4c7a186 100644 --- a/src/vs/editor/common/controller/cursorCommon.ts +++ b/src/vs/editor/common/controller/cursorCommon.ts @@ -9,7 +9,7 @@ import { CharCode } from 'vs/base/common/charCode'; import * as strings from 'vs/base/common/strings'; import { ICommand, TextModelResolvedOptions, IConfiguration, IModel } from 'vs/editor/common/editorCommon'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { Selection } from 'vs/editor/common/core/selection'; +import { Selection, ISelection } from 'vs/editor/common/core/selection'; import { Range } from 'vs/editor/common/core/range'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { onUnexpectedError } from 'vs/base/common/errors'; @@ -354,6 +354,26 @@ export class CursorState { return new CursorState(null, viewState); } + public static fromModelSelection(modelSelection: ISelection): CursorState { + const selectionStartLineNumber = modelSelection.selectionStartLineNumber; + const selectionStartColumn = modelSelection.selectionStartColumn; + const positionLineNumber = modelSelection.positionLineNumber; + const positionColumn = modelSelection.positionColumn; + const modelState = new SingleCursorState( + new Range(selectionStartLineNumber, selectionStartColumn, selectionStartLineNumber, selectionStartColumn), 0, + new Position(positionLineNumber, positionColumn), 0 + ); + return CursorState.fromModelState(modelState); + } + + public static fromModelSelections(modelSelections: ISelection[]): CursorState[] { + let states: CursorState[] = []; + for (let i = 0, len = modelSelections.length; i < len; i++) { + states[i] = this.fromModelSelection(modelSelections[i]); + } + return states; + } + public static ensureInEditableRange(context: CursorContext, states: CursorState[]): CursorState[] { const model = context.model; if (!model.hasEditableRange()) { diff --git a/src/vs/editor/common/controller/oneCursor.ts b/src/vs/editor/common/controller/oneCursor.ts index 6fde100b0b8..ae9c990ec4a 100644 --- a/src/vs/editor/common/controller/oneCursor.ts +++ b/src/vs/editor/common/controller/oneCursor.ts @@ -7,7 +7,7 @@ import { SingleCursorState, CursorContext, CursorState } from 'vs/editor/common/controller/cursorCommon'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { Selection, SelectionDirection, ISelection } from 'vs/editor/common/core/selection'; +import { Selection, SelectionDirection } from 'vs/editor/common/core/selection'; export class OneCursor { @@ -49,22 +49,6 @@ export class OneCursor { this._setState(context, this.modelState, this.viewState); } - public setSelection(context: CursorContext, selection: ISelection): void { - const selectionStartLineNumber = selection.selectionStartLineNumber; - const selectionStartColumn = selection.selectionStartColumn; - const positionLineNumber = selection.positionLineNumber; - const positionColumn = selection.positionColumn; - const modelState = new SingleCursorState( - new Range(selectionStartLineNumber, selectionStartColumn, selectionStartLineNumber, selectionStartColumn), 0, - new Position(positionLineNumber, positionColumn), 0 - ); - this._setState( - context, - modelState, - null - ); - } - public setState(context: CursorContext, modelState: SingleCursorState, viewState: SingleCursorState): void { this._setState(context, modelState, viewState); } From e91736680a94ae717d7331c8b569864baa147ef9 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 18 May 2017 15:26:36 +0200 Subject: [PATCH 0633/1164] Cursor handlers take an input argument --- src/vs/editor/common/controller/cursor.ts | 146 ++++++++++------------ 1 file changed, 69 insertions(+), 77 deletions(-) diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 1f4e91e86e3..8a49775c5ed 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -25,15 +25,22 @@ import { CoreEditorCommand } from 'vs/editor/common/controller/coreCommands'; interface IMultipleCursorOperationContext { cursorPositionChangeReason: CursorChangeReason; - shouldReveal: boolean; shouldPushStackElementBefore: boolean; shouldPushStackElementAfter: boolean; - eventSource: string; - eventData: any; executeCommands: editorCommon.ICommand[]; isAutoWhitespaceCommand: boolean[]; } +class CursorOperationArgs { + public readonly eventSource: string; + public readonly eventData: T; + + constructor(eventSource: string, eventData: T) { + this.eventSource = eventSource; + this.eventData = eventData; + } +} + interface IExecContext { selectionStartMarkers: string[]; positionMarkers: string[]; @@ -74,7 +81,7 @@ export class Cursor extends Disposable implements ICursors { private _columnSelectData: IColumnSelectData; private _handlers: { - [key: string]: (ctx: IMultipleCursorOperationContext) => void; + [key: string]: (args: CursorOperationArgs, ctx: IMultipleCursorOperationContext) => void; }; constructor(configuration: editorCommon.IConfiguration, model: editorCommon.IModel, viewModelHelper: IViewModelHelper) { @@ -308,8 +315,6 @@ export class Cursor extends Disposable implements ICursors { this.emitCursorSelectionChanged('model', CursorChangeReason.ContentFlush); } else { if (!this._isHandling) { - // Read the markers before entering `_onHandler`, since that would validate - // the position and ruin the markers const selectionsFromMarkers = this._cursors.readSelectionFromMarkers(); this.setStates('modelChange', CursorChangeReason.RecoverFromMarkers, CursorState.fromModelSelections(selectionsFromMarkers)); } @@ -336,13 +341,10 @@ export class Cursor extends Disposable implements ICursors { // ------ auxiliary handling logic - private _createAndInterpretHandlerCtx(eventSource: string, eventData: any, callback: (currentHandlerCtx: IMultipleCursorOperationContext) => void): void { + private _createAndInterpretHandlerCtx(callback: (currentHandlerCtx: IMultipleCursorOperationContext) => void): void { const ctx: IMultipleCursorOperationContext = { cursorPositionChangeReason: CursorChangeReason.NotSet, - shouldReveal: true, - eventSource: eventSource, - eventData: eventData, executeCommands: [], isAutoWhitespaceCommand: [], shouldPushStackElementBefore: false, @@ -380,7 +382,7 @@ export class Cursor extends Disposable implements ICursors { this._cursors.normalize(); } - private _onHandler(command: string, handler: (ctx: IMultipleCursorOperationContext) => void, source: string, data: any): void { + private _onHandler(command: string, handler: (args: CursorOperationArgs, ctx: IMultipleCursorOperationContext) => void, args: CursorOperationArgs): void { this._isHandling = true; @@ -392,13 +394,11 @@ export class Cursor extends Disposable implements ICursors { this._cursors.ensureValidState(); let cursorPositionChangeReason: CursorChangeReason; - let shouldReveal: boolean; - this._createAndInterpretHandlerCtx(source, data, (currentHandlerCtx: IMultipleCursorOperationContext) => { - handler(currentHandlerCtx); + this._createAndInterpretHandlerCtx((currentHandlerCtx: IMultipleCursorOperationContext) => { + handler(args, currentHandlerCtx); cursorPositionChangeReason = currentHandlerCtx.cursorPositionChangeReason; - shouldReveal = currentHandlerCtx.shouldReveal; }); const newSelections = this._cursors.getSelections(); @@ -421,12 +421,9 @@ export class Cursor extends Disposable implements ICursors { } if (somethingChanged) { - this.emitCursorPositionChanged(source, cursorPositionChangeReason); - - if (shouldReveal) { - this._revealRange(RevealTarget.Primary, VerticalRevealType.Simple, true); - } - this.emitCursorSelectionChanged(source, cursorPositionChangeReason); + this.emitCursorPositionChanged(args.eventSource, cursorPositionChangeReason); + this._revealRange(RevealTarget.Primary, VerticalRevealType.Simple, true); + this.emitCursorSelectionChanged(args.eventSource, cursorPositionChangeReason); } } catch (err) { @@ -826,36 +823,37 @@ export class Cursor extends Disposable implements ICursors { command.runCoreEditorCommand(this, payload); return; } - let handler = this._handlers[handlerId]; - this._onHandler(handlerId, handler, source, payload); + const handler = this._handlers[handlerId]; + const args = new CursorOperationArgs(source, payload); + this._onHandler(handlerId, handler, args); } private _registerHandlers(): void { let H = editorCommon.Handler; - this._handlers[H.LineInsertBefore] = (ctx) => this._lineInsertBefore(ctx); - this._handlers[H.LineInsertAfter] = (ctx) => this._lineInsertAfter(ctx); - this._handlers[H.LineBreakInsert] = (ctx) => this._lineBreakInsert(ctx); + this._handlers[H.LineInsertBefore] = (args, ctx) => this._lineInsertBefore(args, ctx); + this._handlers[H.LineInsertAfter] = (args, ctx) => this._lineInsertAfter(args, ctx); + this._handlers[H.LineBreakInsert] = (args, ctx) => this._lineBreakInsert(args, ctx); - this._handlers[H.Type] = (ctx) => this._type(ctx); - this._handlers[H.ReplacePreviousChar] = (ctx) => this._replacePreviousChar(ctx); - this._handlers[H.CompositionStart] = (ctx) => this._compositionStart(ctx); - this._handlers[H.CompositionEnd] = (ctx) => this._compositionEnd(ctx); - this._handlers[H.Tab] = (ctx) => this._tab(ctx); - this._handlers[H.Indent] = (ctx) => this._indent(ctx); - this._handlers[H.Outdent] = (ctx) => this._outdent(ctx); - this._handlers[H.Paste] = (ctx) => this._paste(ctx); + this._handlers[H.Type] = (args, ctx) => this._type(args, ctx); + this._handlers[H.ReplacePreviousChar] = (args, ctx) => this._replacePreviousChar(args, ctx); + this._handlers[H.CompositionStart] = (args, ctx) => this._compositionStart(args, ctx); + this._handlers[H.CompositionEnd] = (args, ctx) => this._compositionEnd(args, ctx); + this._handlers[H.Tab] = (args, ctx) => this._tab(args, ctx); + this._handlers[H.Indent] = (args, ctx) => this._indent(args, ctx); + this._handlers[H.Outdent] = (args, ctx) => this._outdent(args, ctx); + this._handlers[H.Paste] = (args, ctx) => this._paste(args, ctx); - this._handlers[H.DeleteLeft] = (ctx) => this._deleteLeft(ctx); - this._handlers[H.DeleteRight] = (ctx) => this._deleteRight(ctx); + this._handlers[H.DeleteLeft] = (args, ctx) => this._deleteLeft(args, ctx); + this._handlers[H.DeleteRight] = (args, ctx) => this._deleteRight(args, ctx); - this._handlers[H.Cut] = (ctx) => this._cut(ctx); + this._handlers[H.Cut] = (args, ctx) => this._cut(args, ctx); - this._handlers[H.Undo] = (ctx) => this._undo(ctx); - this._handlers[H.Redo] = (ctx) => this._redo(ctx); + this._handlers[H.Undo] = (args, ctx) => this._undo(args, ctx); + this._handlers[H.Redo] = (args, ctx) => this._redo(args, ctx); - this._handlers[H.ExecuteCommand] = (ctx) => this._externalExecuteCommand(ctx); - this._handlers[H.ExecuteCommands] = (ctx) => this._externalExecuteCommands(ctx); + this._handlers[H.ExecuteCommand] = (args, ctx) => this._externalExecuteCommand(args, ctx); + this._handlers[H.ExecuteCommands] = (args, ctx) => this._externalExecuteCommands(args, ctx); } public getColumnSelectData(): IColumnSelectData { @@ -873,7 +871,6 @@ export class Cursor extends Disposable implements ICursors { // -------------------- START editing operations private _applyEdits(ctx: IMultipleCursorOperationContext, edits: EditOperationResult): void { - ctx.shouldReveal = true; ctx.shouldPushStackElementBefore = edits.shouldPushStackElementBefore; ctx.shouldPushStackElementAfter = edits.shouldPushStackElementAfter; @@ -901,22 +898,22 @@ export class Cursor extends Disposable implements ICursors { return r; } - private _lineInsertBefore(ctx: IMultipleCursorOperationContext): void { + private _lineInsertBefore(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { this._applyEdits(ctx, TypeOperations.lineInsertBefore(this.context.config, this.context.model, this._getAllCursorsModelState())); } - private _lineInsertAfter(ctx: IMultipleCursorOperationContext): void { + private _lineInsertAfter(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { this._applyEdits(ctx, TypeOperations.lineInsertAfter(this.context.config, this.context.model, this._getAllCursorsModelState())); } - private _lineBreakInsert(ctx: IMultipleCursorOperationContext): void { + private _lineBreakInsert(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { this._applyEdits(ctx, TypeOperations.lineBreakInsert(this.context.config, this.context.model, this._getAllCursorsModelState())); } - private _type(ctx: IMultipleCursorOperationContext): void { - const text = ctx.eventData.text; + private _type(args: CursorOperationArgs<{ text: string; }>, ctx: IMultipleCursorOperationContext): void { + const text = args.eventData.text; - if (!this._isDoingComposition && ctx.eventSource === 'keyboard') { + if (!this._isDoingComposition && args.eventSource === 'keyboard') { // If this event is coming straight from the keyboard, look for electric characters and enter for (let i = 0, len = text.length; i < len; i++) { @@ -930,14 +927,13 @@ export class Cursor extends Disposable implements ICursors { } // Here we must interpret each typed character individually, that's why we create a new context - this._createAndInterpretHandlerCtx(ctx.eventSource, ctx.eventData, (charHandlerCtx: IMultipleCursorOperationContext) => { + this._createAndInterpretHandlerCtx((charHandlerCtx: IMultipleCursorOperationContext) => { // Decide what all cursors will do up-front this._applyEdits(charHandlerCtx, TypeOperations.typeWithInterceptors(this.context.config, this.context.model, this._getAllCursorsModelState(), chr)); // The last typed character gets to win ctx.cursorPositionChangeReason = charHandlerCtx.cursorPositionChangeReason; - ctx.shouldReveal = charHandlerCtx.shouldReveal; }); } @@ -946,34 +942,34 @@ export class Cursor extends Disposable implements ICursors { } } - private _replacePreviousChar(ctx: IMultipleCursorOperationContext): void { - let text = ctx.eventData.text; - let replaceCharCnt = ctx.eventData.replaceCharCnt; + private _replacePreviousChar(args: CursorOperationArgs<{ text: string; replaceCharCnt: number; }>, ctx: IMultipleCursorOperationContext): void { + let text = args.eventData.text; + let replaceCharCnt = args.eventData.replaceCharCnt; this._applyEdits(ctx, TypeOperations.replacePreviousChar(this.context.config, this.context.model, this._getAllCursorsModelState(), text, replaceCharCnt)); } - private _compositionStart(ctx: IMultipleCursorOperationContext): void { + private _compositionStart(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { this._isDoingComposition = true; } - private _compositionEnd(ctx: IMultipleCursorOperationContext): void { + private _compositionEnd(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { this._isDoingComposition = false; } - private _tab(ctx: IMultipleCursorOperationContext): void { + private _tab(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { this._applyEdits(ctx, TypeOperations.tab(this.context.config, this.context.model, this._getAllCursorsModelState())); } - private _indent(ctx: IMultipleCursorOperationContext): void { + private _indent(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { this._applyEdits(ctx, TypeOperations.indent(this.context.config, this.context.model, this._getAllCursorsModelState())); } - private _outdent(ctx: IMultipleCursorOperationContext): void { + private _outdent(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { this._applyEdits(ctx, TypeOperations.outdent(this.context.config, this.context.model, this._getAllCursorsModelState())); } - private _distributePasteToCursors(ctx: IMultipleCursorOperationContext): string[] { - if (ctx.eventData.pasteOnNewLine) { + private _distributePasteToCursors(args: CursorOperationArgs<{ pasteOnNewLine: boolean; text: string; }>, ctx: IMultipleCursorOperationContext): string[] { + if (args.eventData.pasteOnNewLine) { return null; } @@ -988,7 +984,7 @@ export class Cursor extends Disposable implements ICursors { } } - let pastePieces = ctx.eventData.text.split(/\r\n|\r|\n/); + let pastePieces = args.eventData.text.split(/\r\n|\r|\n/); if (pastePieces.length !== selections.length) { return null; } @@ -996,48 +992,46 @@ export class Cursor extends Disposable implements ICursors { return pastePieces; } - private _paste(ctx: IMultipleCursorOperationContext): void { - const distributedPaste = this._distributePasteToCursors(ctx); + private _paste(args: CursorOperationArgs<{ pasteOnNewLine: boolean; text: string; }>, ctx: IMultipleCursorOperationContext): void { + const distributedPaste = this._distributePasteToCursors(args, ctx); ctx.cursorPositionChangeReason = CursorChangeReason.Paste; if (distributedPaste) { this._applyEdits(ctx, TypeOperations.distributedPaste(this.context.config, this.context.model, this._getAllCursorsModelState(true), distributedPaste)); } else { - this._applyEdits(ctx, TypeOperations.paste(this.context.config, this.context.model, this._getAllCursorsModelState(), ctx.eventData.text, ctx.eventData.pasteOnNewLine)); + this._applyEdits(ctx, TypeOperations.paste(this.context.config, this.context.model, this._getAllCursorsModelState(), args.eventData.text, args.eventData.pasteOnNewLine)); } } - private _deleteLeft(ctx: IMultipleCursorOperationContext): void { + private _deleteLeft(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { this._applyEdits(ctx, DeleteOperations.deleteLeft(this.context.config, this.context.model, this._getAllCursorsModelState())); } - private _deleteRight(ctx: IMultipleCursorOperationContext): void { + private _deleteRight(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { this._applyEdits(ctx, DeleteOperations.deleteRight(this.context.config, this.context.model, this._getAllCursorsModelState())); } - private _cut(ctx: IMultipleCursorOperationContext): void { + private _cut(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { this._applyEdits(ctx, DeleteOperations.cut(this.context.config, this.context.model, this._getAllCursorsModelState())); } // -------------------- END editing operations - private _undo(ctx: IMultipleCursorOperationContext): void { + private _undo(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { ctx.cursorPositionChangeReason = CursorChangeReason.Undo; this._interpretCommandResult(this._model.undo()); } - private _redo(ctx: IMultipleCursorOperationContext): void { + private _redo(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { ctx.cursorPositionChangeReason = CursorChangeReason.Redo; this._interpretCommandResult(this._model.redo()); } - private _externalExecuteCommand(ctx: IMultipleCursorOperationContext): void { - const command = ctx.eventData; + private _externalExecuteCommand(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { + const command = args.eventData; this._cursors.killSecondaryCursors(); - ctx.shouldReveal = true; - ctx.shouldPushStackElementBefore = true; ctx.shouldPushStackElementAfter = true; @@ -1045,10 +1039,8 @@ export class Cursor extends Disposable implements ICursors { ctx.isAutoWhitespaceCommand[0] = false; } - private _externalExecuteCommands(ctx: IMultipleCursorOperationContext): void { - const commands = ctx.eventData; - - ctx.shouldReveal = true; + private _externalExecuteCommands(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { + const commands = args.eventData; ctx.shouldPushStackElementBefore = true; ctx.shouldPushStackElementAfter = true; From f55399c57708a7c6ed521f5e83d6b43141cab61a Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 18 May 2017 16:19:30 +0200 Subject: [PATCH 0634/1164] Eliminate IMultipleCursorOperationContext --- src/vs/editor/common/controller/cursor.ts | 246 +++++++++--------- .../editor/common/controller/cursorCommon.ts | 7 + .../common/controller/cursorTypeOperations.ts | 7 +- 3 files changed, 128 insertions(+), 132 deletions(-) diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 8a49775c5ed..2098d553134 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -14,7 +14,7 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection, SelectionDirection, ISelection } from 'vs/editor/common/core/selection'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import { CursorColumns, CursorConfiguration, EditOperationResult, SingleCursorState, IViewModelHelper, CursorContext, CursorState, RevealTarget, IColumnSelectData, ICursors } from 'vs/editor/common/controller/cursorCommon'; +import { CursorColumns, CursorConfiguration, EditOperationResult, SingleCursorState, IViewModelHelper, CursorContext, CursorState, RevealTarget, IColumnSelectData, ICursors, CommandResult } from 'vs/editor/common/controller/cursorCommon'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { DeleteOperations } from 'vs/editor/common/controller/cursorDeleteOperations'; import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations'; @@ -23,14 +23,6 @@ import { CursorEventType, CursorChangeReason, ICursorPositionChangedEvent, Verti import { CommonEditorRegistry } from 'vs/editor/common/editorCommonExtensions'; import { CoreEditorCommand } from 'vs/editor/common/controller/coreCommands'; -interface IMultipleCursorOperationContext { - cursorPositionChangeReason: CursorChangeReason; - shouldPushStackElementBefore: boolean; - shouldPushStackElementAfter: boolean; - executeCommands: editorCommon.ICommand[]; - isAutoWhitespaceCommand: boolean[]; -} - class CursorOperationArgs { public readonly eventSource: string; public readonly eventData: T; @@ -81,7 +73,7 @@ export class Cursor extends Disposable implements ICursors { private _columnSelectData: IColumnSelectData; private _handlers: { - [key: string]: (args: CursorOperationArgs, ctx: IMultipleCursorOperationContext) => void; + [key: string]: (args: CursorOperationArgs) => EditOperationResult; }; constructor(configuration: editorCommon.IConfiguration, model: editorCommon.IModel, viewModelHelper: IViewModelHelper) { @@ -341,48 +333,38 @@ export class Cursor extends Disposable implements ICursors { // ------ auxiliary handling logic - private _createAndInterpretHandlerCtx(callback: (currentHandlerCtx: IMultipleCursorOperationContext) => void): void { + private _createAndInterpretHandlerCtx(callback: () => EditOperationResult): void { - const ctx: IMultipleCursorOperationContext = { - cursorPositionChangeReason: CursorChangeReason.NotSet, - executeCommands: [], - isAutoWhitespaceCommand: [], - shouldPushStackElementBefore: false, - shouldPushStackElementAfter: false - }; + const opResult = callback(); - callback(ctx); - - if (ctx.shouldPushStackElementBefore) { + if (opResult && opResult.shouldPushStackElementBefore) { this._model.pushStackElement(); - ctx.shouldPushStackElementBefore = false; } this._columnSelectData = null; - const execCtx: IExecContext = { - selectionStartMarkers: [], - positionMarkers: [] - }; + if (opResult) { + const execCtx: IExecContext = { + selectionStartMarkers: [], + positionMarkers: [] + }; - this._innerExecuteCommands(execCtx, ctx.executeCommands, ctx.isAutoWhitespaceCommand); + this._innerExecuteCommands(execCtx, opResult.commands); - for (let i = 0; i < execCtx.selectionStartMarkers.length; i++) { - this._model._removeMarker(execCtx.selectionStartMarkers[i]); - this._model._removeMarker(execCtx.positionMarkers[i]); + for (let i = 0; i < execCtx.selectionStartMarkers.length; i++) { + this._model._removeMarker(execCtx.selectionStartMarkers[i]); + this._model._removeMarker(execCtx.positionMarkers[i]); + } } - ctx.executeCommands = []; - - if (ctx.shouldPushStackElementAfter) { + if (opResult && opResult.shouldPushStackElementAfter) { this._model.pushStackElement(); - ctx.shouldPushStackElementAfter = false; } this._cursors.normalize(); } - private _onHandler(command: string, handler: (args: CursorOperationArgs, ctx: IMultipleCursorOperationContext) => void, args: CursorOperationArgs): void { + private _onHandler(command: string, handler: (args: CursorOperationArgs) => EditOperationResult, args: CursorOperationArgs): void { this._isHandling = true; @@ -395,10 +377,10 @@ export class Cursor extends Disposable implements ICursors { let cursorPositionChangeReason: CursorChangeReason; - this._createAndInterpretHandlerCtx((currentHandlerCtx: IMultipleCursorOperationContext) => { - handler(args, currentHandlerCtx); - - cursorPositionChangeReason = currentHandlerCtx.cursorPositionChangeReason; + this._createAndInterpretHandlerCtx(() => { + let r = handler(args); + cursorPositionChangeReason = r ? r.reason : CursorChangeReason.NotSet; + return r; }); const newSelections = this._cursors.getSelections(); @@ -441,7 +423,7 @@ export class Cursor extends Disposable implements ICursors { this._cursors.setSelections(cursorState); } - private _getEditOperationsFromCommand(ctx: IExecContext, majorIdentifier: number, command: editorCommon.ICommand, isAutoWhitespaceCommand: boolean): ICommandData { + private _getEditOperationsFromCommand(ctx: IExecContext, majorIdentifier: number, command: CommandResult): ICommandData { // This method acts as a transaction, if the command fails // everything it has done is ignored let operations: editorCommon.IIdentifiedSingleEditOperation[] = []; @@ -460,7 +442,7 @@ export class Cursor extends Disposable implements ICursors { range: selection, text: text, forceMoveMarkers: false, - isAutoWhitespaceEdit: isAutoWhitespaceCommand + isAutoWhitespaceEdit: command.isAutoWhitespaceCommand }); }; @@ -512,7 +494,7 @@ export class Cursor extends Disposable implements ICursors { }; try { - command.getEditOperations(this._model, editOperationBuilder); + command.command.getEditOperations(this._model, editOperationBuilder); } catch (e) { e.friendlyMessage = nls.localize('corrupt.commands', "Unexpected exception while executing command."); onUnexpectedError(e); @@ -528,13 +510,13 @@ export class Cursor extends Disposable implements ICursors { }; } - private _getEditOperations(ctx: IExecContext, commands: editorCommon.ICommand[], isAutoWhitespaceCommand: boolean[]): ICommandsData { + private _getEditOperations(ctx: IExecContext, commands: CommandResult[]): ICommandsData { let operations: editorCommon.IIdentifiedSingleEditOperation[] = []; let hadTrackedEditOperation: boolean = false; for (let i = 0, len = commands.length; i < len; i++) { if (commands[i]) { - const r = this._getEditOperationsFromCommand(ctx, i, commands[i], isAutoWhitespaceCommand[i]); + const r = this._getEditOperationsFromCommand(ctx, i, commands[i]); operations = operations.concat(r.operations); hadTrackedEditOperation = hadTrackedEditOperation || r.hadTrackedEditOperation; } @@ -594,7 +576,7 @@ export class Cursor extends Disposable implements ICursors { return loserCursorsMap; } - private _arrayIsEmpty(commands: editorCommon.ICommand[]): boolean { + private _arrayIsEmpty(commands: CommandResult[]): boolean { for (let i = 0, len = commands.length; i < len; i++) { if (commands[i]) { return false; @@ -603,7 +585,7 @@ export class Cursor extends Disposable implements ICursors { return true; } - private _innerExecuteCommands(ctx: IExecContext, commands: editorCommon.ICommand[], isAutoWhitespaceCommand: boolean[]): void { + private _innerExecuteCommands(ctx: IExecContext, commands: CommandResult[]): void { if (this._configuration.editor.readOnly) { return; @@ -615,7 +597,7 @@ export class Cursor extends Disposable implements ICursors { const selectionsBefore = this._cursors.getSelections(); - const commandsData = this._getEditOperations(ctx, commands, isAutoWhitespaceCommand); + const commandsData = this._getEditOperations(ctx, commands); if (commandsData.operations.length === 0) { return; } @@ -673,7 +655,7 @@ export class Cursor extends Disposable implements ICursors { for (let i = 0; i < selectionsBefore.length; i++) { if (groupedInverseEditOperations[i].length > 0) { groupedInverseEditOperations[i].sort(minorBasedSorter); - cursorSelections[i] = commands[i].computeCursorState(this._model, { + cursorSelections[i] = commands[i].command.computeCursorState(this._model, { getInverseEditOperations: () => { return groupedInverseEditOperations[i]; }, @@ -831,29 +813,29 @@ export class Cursor extends Disposable implements ICursors { private _registerHandlers(): void { let H = editorCommon.Handler; - this._handlers[H.LineInsertBefore] = (args, ctx) => this._lineInsertBefore(args, ctx); - this._handlers[H.LineInsertAfter] = (args, ctx) => this._lineInsertAfter(args, ctx); - this._handlers[H.LineBreakInsert] = (args, ctx) => this._lineBreakInsert(args, ctx); + this._handlers[H.LineInsertBefore] = (args) => this._lineInsertBefore(args); + this._handlers[H.LineInsertAfter] = (args) => this._lineInsertAfter(args); + this._handlers[H.LineBreakInsert] = (args) => this._lineBreakInsert(args); - this._handlers[H.Type] = (args, ctx) => this._type(args, ctx); - this._handlers[H.ReplacePreviousChar] = (args, ctx) => this._replacePreviousChar(args, ctx); - this._handlers[H.CompositionStart] = (args, ctx) => this._compositionStart(args, ctx); - this._handlers[H.CompositionEnd] = (args, ctx) => this._compositionEnd(args, ctx); - this._handlers[H.Tab] = (args, ctx) => this._tab(args, ctx); - this._handlers[H.Indent] = (args, ctx) => this._indent(args, ctx); - this._handlers[H.Outdent] = (args, ctx) => this._outdent(args, ctx); - this._handlers[H.Paste] = (args, ctx) => this._paste(args, ctx); + this._handlers[H.Type] = (args) => this._type(args); + this._handlers[H.ReplacePreviousChar] = (args) => this._replacePreviousChar(args); + this._handlers[H.CompositionStart] = (args) => this._compositionStart(args); + this._handlers[H.CompositionEnd] = (args) => this._compositionEnd(args); + this._handlers[H.Tab] = (args) => this._tab(args); + this._handlers[H.Indent] = (args) => this._indent(args); + this._handlers[H.Outdent] = (args) => this._outdent(args); + this._handlers[H.Paste] = (args) => this._paste(args); - this._handlers[H.DeleteLeft] = (args, ctx) => this._deleteLeft(args, ctx); - this._handlers[H.DeleteRight] = (args, ctx) => this._deleteRight(args, ctx); + this._handlers[H.DeleteLeft] = (args) => this._deleteLeft(args); + this._handlers[H.DeleteRight] = (args) => this._deleteRight(args); - this._handlers[H.Cut] = (args, ctx) => this._cut(args, ctx); + this._handlers[H.Cut] = (args) => this._cut(args); - this._handlers[H.Undo] = (args, ctx) => this._undo(args, ctx); - this._handlers[H.Redo] = (args, ctx) => this._redo(args, ctx); + this._handlers[H.Undo] = (args) => this._undo(args); + this._handlers[H.Redo] = (args) => this._redo(args); - this._handlers[H.ExecuteCommand] = (args, ctx) => this._externalExecuteCommand(args, ctx); - this._handlers[H.ExecuteCommands] = (args, ctx) => this._externalExecuteCommands(args, ctx); + this._handlers[H.ExecuteCommand] = (args) => this._externalExecuteCommand(args); + this._handlers[H.ExecuteCommands] = (args) => this._externalExecuteCommands(args); } public getColumnSelectData(): IColumnSelectData { @@ -870,18 +852,6 @@ export class Cursor extends Disposable implements ICursors { // -------------------- START editing operations - private _applyEdits(ctx: IMultipleCursorOperationContext, edits: EditOperationResult): void { - ctx.shouldPushStackElementBefore = edits.shouldPushStackElementBefore; - ctx.shouldPushStackElementAfter = edits.shouldPushStackElementAfter; - - const commands = edits.commands; - for (let i = 0, len = commands.length; i < len; i++) { - const command = commands[i]; - ctx.executeCommands[i] = command ? command.command : null; - ctx.isAutoWhitespaceCommand[i] = command ? command.isAutoWhitespaceCommand : false; - } - } - private _getAllCursorsModelState(sorted: boolean = false): SingleCursorState[] { let cursors = this._cursors.getAll(); @@ -898,19 +868,19 @@ export class Cursor extends Disposable implements ICursors { return r; } - private _lineInsertBefore(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { - this._applyEdits(ctx, TypeOperations.lineInsertBefore(this.context.config, this.context.model, this._getAllCursorsModelState())); + private _lineInsertBefore(args: CursorOperationArgs): EditOperationResult { + return TypeOperations.lineInsertBefore(this.context.config, this.context.model, this._getAllCursorsModelState()); } - private _lineInsertAfter(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { - this._applyEdits(ctx, TypeOperations.lineInsertAfter(this.context.config, this.context.model, this._getAllCursorsModelState())); + private _lineInsertAfter(args: CursorOperationArgs): EditOperationResult { + return TypeOperations.lineInsertAfter(this.context.config, this.context.model, this._getAllCursorsModelState()); } - private _lineBreakInsert(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { - this._applyEdits(ctx, TypeOperations.lineBreakInsert(this.context.config, this.context.model, this._getAllCursorsModelState())); + private _lineBreakInsert(args: CursorOperationArgs): EditOperationResult { + return TypeOperations.lineBreakInsert(this.context.config, this.context.model, this._getAllCursorsModelState()); } - private _type(args: CursorOperationArgs<{ text: string; }>, ctx: IMultipleCursorOperationContext): void { + private _type(args: CursorOperationArgs<{ text: string; }>): EditOperationResult { const text = args.eventData.text; if (!this._isDoingComposition && args.eventSource === 'keyboard') { @@ -927,48 +897,49 @@ export class Cursor extends Disposable implements ICursors { } // Here we must interpret each typed character individually, that's why we create a new context - this._createAndInterpretHandlerCtx((charHandlerCtx: IMultipleCursorOperationContext) => { + this._createAndInterpretHandlerCtx(() => { // Decide what all cursors will do up-front - this._applyEdits(charHandlerCtx, TypeOperations.typeWithInterceptors(this.context.config, this.context.model, this._getAllCursorsModelState(), chr)); - - // The last typed character gets to win - ctx.cursorPositionChangeReason = charHandlerCtx.cursorPositionChangeReason; + return TypeOperations.typeWithInterceptors(this.context.config, this.context.model, this._getAllCursorsModelState(), chr); }); } + + return null; } else { - this._applyEdits(ctx, TypeOperations.typeWithoutInterceptors(this.context.config, this.context.model, this._getAllCursorsModelState(), text)); + return TypeOperations.typeWithoutInterceptors(this.context.config, this.context.model, this._getAllCursorsModelState(), text); } } - private _replacePreviousChar(args: CursorOperationArgs<{ text: string; replaceCharCnt: number; }>, ctx: IMultipleCursorOperationContext): void { + private _replacePreviousChar(args: CursorOperationArgs<{ text: string; replaceCharCnt: number; }>): EditOperationResult { let text = args.eventData.text; let replaceCharCnt = args.eventData.replaceCharCnt; - this._applyEdits(ctx, TypeOperations.replacePreviousChar(this.context.config, this.context.model, this._getAllCursorsModelState(), text, replaceCharCnt)); + return TypeOperations.replacePreviousChar(this.context.config, this.context.model, this._getAllCursorsModelState(), text, replaceCharCnt); } - private _compositionStart(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { + private _compositionStart(args: CursorOperationArgs): EditOperationResult { this._isDoingComposition = true; + return null; } - private _compositionEnd(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { + private _compositionEnd(args: CursorOperationArgs): EditOperationResult { this._isDoingComposition = false; + return null; } - private _tab(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { - this._applyEdits(ctx, TypeOperations.tab(this.context.config, this.context.model, this._getAllCursorsModelState())); + private _tab(args: CursorOperationArgs): EditOperationResult { + return TypeOperations.tab(this.context.config, this.context.model, this._getAllCursorsModelState()); } - private _indent(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { - this._applyEdits(ctx, TypeOperations.indent(this.context.config, this.context.model, this._getAllCursorsModelState())); + private _indent(args: CursorOperationArgs): EditOperationResult { + return TypeOperations.indent(this.context.config, this.context.model, this._getAllCursorsModelState()); } - private _outdent(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { - this._applyEdits(ctx, TypeOperations.outdent(this.context.config, this.context.model, this._getAllCursorsModelState())); + private _outdent(args: CursorOperationArgs): EditOperationResult { + return TypeOperations.outdent(this.context.config, this.context.model, this._getAllCursorsModelState()); } - private _distributePasteToCursors(args: CursorOperationArgs<{ pasteOnNewLine: boolean; text: string; }>, ctx: IMultipleCursorOperationContext): string[] { + private _distributePasteToCursors(args: CursorOperationArgs<{ pasteOnNewLine: boolean; text: string; }>): string[] { if (args.eventData.pasteOnNewLine) { return null; } @@ -992,62 +963,77 @@ export class Cursor extends Disposable implements ICursors { return pastePieces; } - private _paste(args: CursorOperationArgs<{ pasteOnNewLine: boolean; text: string; }>, ctx: IMultipleCursorOperationContext): void { - const distributedPaste = this._distributePasteToCursors(args, ctx); + private _paste(args: CursorOperationArgs<{ pasteOnNewLine: boolean; text: string; }>): EditOperationResult { + const distributedPaste = this._distributePasteToCursors(args); - ctx.cursorPositionChangeReason = CursorChangeReason.Paste; if (distributedPaste) { - this._applyEdits(ctx, TypeOperations.distributedPaste(this.context.config, this.context.model, this._getAllCursorsModelState(true), distributedPaste)); + return TypeOperations.distributedPaste(this.context.config, this.context.model, this._getAllCursorsModelState(true), distributedPaste); } else { - this._applyEdits(ctx, TypeOperations.paste(this.context.config, this.context.model, this._getAllCursorsModelState(), args.eventData.text, args.eventData.pasteOnNewLine)); + return TypeOperations.paste(this.context.config, this.context.model, this._getAllCursorsModelState(), args.eventData.text, args.eventData.pasteOnNewLine); } } - private _deleteLeft(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { - this._applyEdits(ctx, DeleteOperations.deleteLeft(this.context.config, this.context.model, this._getAllCursorsModelState())); + private _deleteLeft(args: CursorOperationArgs): EditOperationResult { + return DeleteOperations.deleteLeft(this.context.config, this.context.model, this._getAllCursorsModelState()); } - private _deleteRight(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { - this._applyEdits(ctx, DeleteOperations.deleteRight(this.context.config, this.context.model, this._getAllCursorsModelState())); + private _deleteRight(args: CursorOperationArgs): EditOperationResult { + return DeleteOperations.deleteRight(this.context.config, this.context.model, this._getAllCursorsModelState()); } - private _cut(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { - this._applyEdits(ctx, DeleteOperations.cut(this.context.config, this.context.model, this._getAllCursorsModelState())); + private _cut(args: CursorOperationArgs): EditOperationResult { + return DeleteOperations.cut(this.context.config, this.context.model, this._getAllCursorsModelState()); } // -------------------- END editing operations - private _undo(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { - ctx.cursorPositionChangeReason = CursorChangeReason.Undo; + private _undo(args: CursorOperationArgs): EditOperationResult { this._interpretCommandResult(this._model.undo()); + + return new EditOperationResult([], { + shouldPushStackElementBefore: false, + shouldPushStackElementAfter: false, + reason: CursorChangeReason.Undo + }); } - private _redo(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { - ctx.cursorPositionChangeReason = CursorChangeReason.Redo; + private _redo(args: CursorOperationArgs): EditOperationResult { this._interpretCommandResult(this._model.redo()); + + return new EditOperationResult([], { + shouldPushStackElementBefore: false, + shouldPushStackElementAfter: false, + reason: CursorChangeReason.Redo + }); } - private _externalExecuteCommand(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { + private _externalExecuteCommand(args: CursorOperationArgs): EditOperationResult { const command = args.eventData; this._cursors.killSecondaryCursors(); - ctx.shouldPushStackElementBefore = true; - ctx.shouldPushStackElementAfter = true; - - ctx.executeCommands[0] = command; - ctx.isAutoWhitespaceCommand[0] = false; + return new EditOperationResult( + [ + new CommandResult(command, false) + ], + { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: true + } + ); } - private _externalExecuteCommands(args: CursorOperationArgs, ctx: IMultipleCursorOperationContext): void { + private _externalExecuteCommands(args: CursorOperationArgs): EditOperationResult { const commands = args.eventData; - ctx.shouldPushStackElementBefore = true; - ctx.shouldPushStackElementAfter = true; - - for (let i = 0; i < commands.length; i++) { - ctx.executeCommands[i] = commands[i]; - ctx.isAutoWhitespaceCommand[i] = false; + let _commands: CommandResult[] = []; + for (let i = 0, len = commands.length; i < len; i++) { + _commands[i] = new CommandResult(commands[i], false); } + + return new EditOperationResult(_commands, { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: true + }); } } diff --git a/src/vs/editor/common/controller/cursorCommon.ts b/src/vs/editor/common/controller/cursorCommon.ts index 81bd4c7a186..69ff558302f 100644 --- a/src/vs/editor/common/controller/cursorCommon.ts +++ b/src/vs/editor/common/controller/cursorCommon.ts @@ -445,17 +445,24 @@ export class EditOperationResult { readonly commands: CommandResult[]; readonly shouldPushStackElementBefore: boolean; readonly shouldPushStackElementAfter: boolean; + readonly reason: CursorChangeReason; constructor( commands: CommandResult[], opts: { shouldPushStackElementBefore: boolean; shouldPushStackElementAfter: boolean; + reason?: CursorChangeReason; } ) { this.commands = commands; this.shouldPushStackElementBefore = opts.shouldPushStackElementBefore; this.shouldPushStackElementAfter = opts.shouldPushStackElementAfter; + if (typeof opts.reason === 'undefined') { + this.reason = CursorChangeReason.NotSet; + } else { + this.reason = opts.reason; + } } } diff --git a/src/vs/editor/common/controller/cursorTypeOperations.ts b/src/vs/editor/common/controller/cursorTypeOperations.ts index cc4c9327bc9..2f88bb956b4 100644 --- a/src/vs/editor/common/controller/cursorTypeOperations.ts +++ b/src/vs/editor/common/controller/cursorTypeOperations.ts @@ -17,6 +17,7 @@ import { IndentAction } from 'vs/editor/common/modes/languageConfiguration'; import { SurroundSelectionCommand } from 'vs/editor/common/commands/surroundSelectionCommand'; import { IElectricAction } from 'vs/editor/common/modes/supports/electricCharacter'; import { getMapForWordSeparators, WordCharacterClass } from "vs/editor/common/controller/cursorWordOperations"; +import { CursorChangeReason } from "vs/editor/common/controller/cursorEvents"; export class TypeOperations { @@ -91,7 +92,8 @@ export class TypeOperations { } return new EditOperationResult(commands, { shouldPushStackElementBefore: true, - shouldPushStackElementAfter: true + shouldPushStackElementAfter: true, + reason: CursorChangeReason.Paste }); } @@ -122,7 +124,8 @@ export class TypeOperations { } return new EditOperationResult(commands, { shouldPushStackElementBefore: true, - shouldPushStackElementAfter: true + shouldPushStackElementAfter: true, + reason: CursorChangeReason.Paste }); } From 0ac00eaa1a0c41a4b992561b965363349a2aeda5 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 18 May 2017 16:40:41 +0200 Subject: [PATCH 0635/1164] Simple rename --- src/vs/editor/browser/view/viewController.ts | 28 +-- .../editor/common/controller/coreCommands.ts | 4 +- .../find/test/common/findModel.test.ts | 12 +- .../test/common/controller/cursor.test.ts | 198 +++++++++--------- .../controller/cursorMoveCommand.test.ts | 12 +- .../common/editor/rangeDecorations.test.ts | 4 +- 6 files changed, 129 insertions(+), 129 deletions(-) diff --git a/src/vs/editor/browser/view/viewController.ts b/src/vs/editor/browser/view/viewController.ts index 34828bc9f92..f37a97d9344 100644 --- a/src/vs/editor/browser/view/viewController.ts +++ b/src/vs/editor/browser/view/viewController.ts @@ -11,7 +11,7 @@ import { IEditorMouseEvent } from 'vs/editor/browser/editorBrowser'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; import { ViewOutgoingEvents } from 'vs/editor/browser/view/viewOutgoingEvents'; -import { CoreCommands, CoreEditorCommand } from 'vs/editor/common/controller/coreCommands'; +import { CoreNavigationCommands, CoreEditorCommand } from 'vs/editor/common/controller/coreCommands'; export interface ExecCoreEditorCommandFunc { (editorCommand: CoreEditorCommand, args: any): void; @@ -165,7 +165,7 @@ export class ViewController { public moveTo(viewPosition: Position): void { viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreCommands.MoveTo, { + this._execMouseCommand(CoreNavigationCommands.MoveTo, { position: this.convertViewToModelPosition(viewPosition), viewPosition: viewPosition }); @@ -173,7 +173,7 @@ export class ViewController { private moveToSelect(viewPosition: Position): void { viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreCommands.MoveToSelect, { + this._execMouseCommand(CoreNavigationCommands.MoveToSelect, { position: this.convertViewToModelPosition(viewPosition), viewPosition: viewPosition }); @@ -181,7 +181,7 @@ export class ViewController { private columnSelect(viewPosition: Position, mouseColumn: number): void { viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreCommands.ColumnSelect, { + this._execMouseCommand(CoreNavigationCommands.ColumnSelect, { position: this.convertViewToModelPosition(viewPosition), viewPosition: viewPosition, mouseColumn: mouseColumn @@ -190,7 +190,7 @@ export class ViewController { private createCursor(viewPosition: Position, wholeLine: boolean): void { viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreCommands.CreateCursor, { + this._execMouseCommand(CoreNavigationCommands.CreateCursor, { position: this.convertViewToModelPosition(viewPosition), viewPosition: viewPosition, wholeLine: wholeLine @@ -199,7 +199,7 @@ export class ViewController { private lastCursorMoveToSelect(viewPosition: Position): void { viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreCommands.LastCursorMoveToSelect, { + this._execMouseCommand(CoreNavigationCommands.LastCursorMoveToSelect, { position: this.convertViewToModelPosition(viewPosition), viewPosition: viewPosition }); @@ -207,28 +207,28 @@ export class ViewController { private wordSelect(viewPosition: Position): void { viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreCommands.WordSelect, { + this._execMouseCommand(CoreNavigationCommands.WordSelect, { position: this.convertViewToModelPosition(viewPosition) }); } private wordSelectDrag(viewPosition: Position): void { viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreCommands.WordSelectDrag, { + this._execMouseCommand(CoreNavigationCommands.WordSelectDrag, { position: this.convertViewToModelPosition(viewPosition) }); } private lastCursorWordSelect(viewPosition: Position): void { viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreCommands.LastCursorWordSelect, { + this._execMouseCommand(CoreNavigationCommands.LastCursorWordSelect, { position: this.convertViewToModelPosition(viewPosition) }); } private lineSelect(viewPosition: Position): void { viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreCommands.LineSelect, { + this._execMouseCommand(CoreNavigationCommands.LineSelect, { position: this.convertViewToModelPosition(viewPosition), viewPosition: viewPosition }); @@ -236,7 +236,7 @@ export class ViewController { private lineSelectDrag(viewPosition: Position): void { viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreCommands.LineSelectDrag, { + this._execMouseCommand(CoreNavigationCommands.LineSelectDrag, { position: this.convertViewToModelPosition(viewPosition), viewPosition: viewPosition }); @@ -244,7 +244,7 @@ export class ViewController { private lastCursorLineSelect(viewPosition: Position): void { viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreCommands.LastCursorLineSelect, { + this._execMouseCommand(CoreNavigationCommands.LastCursorLineSelect, { position: this.convertViewToModelPosition(viewPosition), viewPosition: viewPosition }); @@ -252,14 +252,14 @@ export class ViewController { private lastCursorLineSelectDrag(viewPosition: Position): void { viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreCommands.LastCursorLineSelectDrag, { + this._execMouseCommand(CoreNavigationCommands.LastCursorLineSelectDrag, { position: this.convertViewToModelPosition(viewPosition), viewPosition: viewPosition }); } private selectAll(): void { - this._execMouseCommand(CoreCommands.SelectAll, {}); + this._execMouseCommand(CoreNavigationCommands.SelectAll, {}); } // ---------------------- diff --git a/src/vs/editor/common/controller/coreCommands.ts b/src/vs/editor/common/controller/coreCommands.ts index 004c19921ec..6ad405c37a1 100644 --- a/src/vs/editor/common/controller/coreCommands.ts +++ b/src/vs/editor/common/controller/coreCommands.ts @@ -234,7 +234,7 @@ export namespace RevealLine_ { }; } -export namespace CoreCommands { +export namespace CoreNavigationCommands { class BaseMoveToCommand extends CoreEditorCommand { @@ -1538,7 +1538,7 @@ namespace Config { } registerCommand(new BaseTextInputAwareCommand({ - editorHandler: CoreCommands.SelectAll, + editorHandler: CoreNavigationCommands.SelectAll, inputHandler: 'selectAll', id: 'editor.action.selectAll', precondition: null, diff --git a/src/vs/editor/contrib/find/test/common/findModel.test.ts b/src/vs/editor/contrib/find/test/common/findModel.test.ts index a4dca9c06a9..b1b48e25499 100644 --- a/src/vs/editor/contrib/find/test/common/findModel.test.ts +++ b/src/vs/editor/contrib/find/test/common/findModel.test.ts @@ -13,7 +13,7 @@ import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { FindModelBoundToEditorModel } from 'vs/editor/contrib/find/common/findModel'; import { FindReplaceState } from 'vs/editor/contrib/find/common/findState'; import { withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; -import { CoreCommands } from 'vs/editor/common/controller/coreCommands'; +import { CoreNavigationCommands } from 'vs/editor/common/controller/coreCommands'; suite('FindModel', () => { @@ -303,7 +303,7 @@ suite('FindModel', () => { ] ); - cursor.trigger('mouse', CoreCommands.MoveTo.id, { + cursor.trigger('mouse', CoreNavigationCommands.MoveTo.id, { position: new Position(6, 20) }); @@ -663,7 +663,7 @@ suite('FindModel', () => { ] ); - cursor.trigger('mouse', CoreCommands.MoveTo.id, { + cursor.trigger('mouse', CoreNavigationCommands.MoveTo.id, { position: new Position(6, 20) }); assertFindState( @@ -1150,7 +1150,7 @@ suite('FindModel', () => { ] ); - cursor.trigger('mouse', CoreCommands.MoveTo.id, { + cursor.trigger('mouse', CoreNavigationCommands.MoveTo.id, { position: new Position(6, 20) }); assertFindState( @@ -1311,7 +1311,7 @@ suite('FindModel', () => { ] ); - cursor.trigger('mouse', CoreCommands.MoveTo.id, { + cursor.trigger('mouse', CoreNavigationCommands.MoveTo.id, { position: new Position(6, 20) }); assertFindState( @@ -1741,7 +1741,7 @@ suite('FindModel', () => { findState.change({ searchString: 'hello(?=\\sworld)', replaceString: 'hi', isRegex: true }, false); let findModel = new FindModelBoundToEditorModel(editor, findState); - cursor.trigger('mouse', CoreCommands.MoveTo.id, { + cursor.trigger('mouse', CoreNavigationCommands.MoveTo.id, { position: new Position(8, 14) }); diff --git a/src/vs/editor/test/common/controller/cursor.test.ts b/src/vs/editor/test/common/controller/cursor.test.ts index e528da7f733..134f327f9bf 100644 --- a/src/vs/editor/test/common/controller/cursor.test.ts +++ b/src/vs/editor/test/common/controller/cursor.test.ts @@ -24,7 +24,7 @@ import { LanguageIdentifier } from 'vs/editor/common/modes'; import { viewModelHelper } from 'vs/editor/test/common/editorTestUtils'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; -import { CoreCommands } from 'vs/editor/common/controller/coreCommands'; +import { CoreNavigationCommands } from 'vs/editor/common/controller/coreCommands'; let H = Handler; @@ -36,11 +36,11 @@ function cursorCommand(cursor: Cursor, command: string, extraData?: any, overwri function moveTo(cursor: Cursor, lineNumber: number, column: number, inSelectionMode: boolean = false) { if (inSelectionMode) { - CoreCommands.MoveToSelect.runCoreEditorCommand(cursor, { + CoreNavigationCommands.MoveToSelect.runCoreEditorCommand(cursor, { position: new Position(lineNumber, column) }); } else { - CoreCommands.MoveTo.runCoreEditorCommand(cursor, { + CoreNavigationCommands.MoveTo.runCoreEditorCommand(cursor, { position: new Position(lineNumber, column) }); } @@ -48,65 +48,65 @@ function moveTo(cursor: Cursor, lineNumber: number, column: number, inSelectionM function moveLeft(cursor: Cursor, inSelectionMode: boolean = false) { if (inSelectionMode) { - CoreCommands.CursorLeftSelect.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorLeftSelect.runCoreEditorCommand(cursor, {}); } else { - CoreCommands.CursorLeft.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorLeft.runCoreEditorCommand(cursor, {}); } } function moveRight(cursor: Cursor, inSelectionMode: boolean = false) { if (inSelectionMode) { - CoreCommands.CursorRightSelect.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorRightSelect.runCoreEditorCommand(cursor, {}); } else { - CoreCommands.CursorRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorRight.runCoreEditorCommand(cursor, {}); } } function moveDown(cursor: Cursor, inSelectionMode: boolean = false) { if (inSelectionMode) { - CoreCommands.CursorDownSelect.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorDownSelect.runCoreEditorCommand(cursor, {}); } else { - CoreCommands.CursorDown.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorDown.runCoreEditorCommand(cursor, {}); } } function moveUp(cursor: Cursor, inSelectionMode: boolean = false) { if (inSelectionMode) { - CoreCommands.CursorUpSelect.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorUpSelect.runCoreEditorCommand(cursor, {}); } else { - CoreCommands.CursorUp.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorUp.runCoreEditorCommand(cursor, {}); } } function moveToBeginningOfLine(cursor: Cursor, inSelectionMode: boolean = false) { if (inSelectionMode) { - CoreCommands.CursorHomeSelect.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorHomeSelect.runCoreEditorCommand(cursor, {}); } else { - CoreCommands.CursorHome.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorHome.runCoreEditorCommand(cursor, {}); } } function moveToEndOfLine(cursor: Cursor, inSelectionMode: boolean = false) { if (inSelectionMode) { - CoreCommands.CursorEndSelect.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorEndSelect.runCoreEditorCommand(cursor, {}); } else { - CoreCommands.CursorEnd.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorEnd.runCoreEditorCommand(cursor, {}); } } function moveToBeginningOfBuffer(cursor: Cursor, inSelectionMode: boolean = false) { if (inSelectionMode) { - CoreCommands.CursorTopSelect.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorTopSelect.runCoreEditorCommand(cursor, {}); } else { - CoreCommands.CursorTop.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorTop.runCoreEditorCommand(cursor, {}); } } function moveToEndOfBuffer(cursor: Cursor, inSelectionMode: boolean = false) { if (inSelectionMode) { - CoreCommands.CursorBottomSelect.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorBottomSelect.runCoreEditorCommand(cursor, {}); } else { - CoreCommands.CursorBottom.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorBottom.runCoreEditorCommand(cursor, {}); } } @@ -590,7 +590,7 @@ suite('Editor Controller - Cursor', () => { // --------- misc test('select all', () => { - CoreCommands.SelectAll.runCoreEditorCommand(thisCursor, {}); + CoreNavigationCommands.SelectAll.runCoreEditorCommand(thisCursor, {}); assertCursor(thisCursor, new Selection(1, 1, 5, LINE5.length + 1)); }); @@ -599,37 +599,37 @@ suite('Editor Controller - Cursor', () => { // 01234 56789012345678 0 // let LINE1 = ' \tMy First Line\t '; moveTo(thisCursor, 1, 1); - CoreCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); + CoreNavigationCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); assertCursor(thisCursor, new Selection(1, 1, 2, 1)); moveTo(thisCursor, 1, 2); - CoreCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); + CoreNavigationCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); assertCursor(thisCursor, new Selection(1, 1, 2, 1)); moveTo(thisCursor, 1, 5); - CoreCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); + CoreNavigationCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); assertCursor(thisCursor, new Selection(1, 1, 2, 1)); moveTo(thisCursor, 1, 19); - CoreCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); + CoreNavigationCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); assertCursor(thisCursor, new Selection(1, 1, 2, 1)); moveTo(thisCursor, 1, 20); - CoreCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); + CoreNavigationCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); assertCursor(thisCursor, new Selection(1, 1, 2, 1)); moveTo(thisCursor, 1, 21); - CoreCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); + CoreNavigationCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); assertCursor(thisCursor, new Selection(1, 1, 2, 1)); - CoreCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); + CoreNavigationCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); assertCursor(thisCursor, new Selection(1, 1, 3, 1)); - CoreCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); + CoreNavigationCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); assertCursor(thisCursor, new Selection(1, 1, 4, 1)); - CoreCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); + CoreNavigationCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); assertCursor(thisCursor, new Selection(1, 1, 5, 1)); - CoreCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); + CoreNavigationCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); assertCursor(thisCursor, new Selection(1, 1, 5, LINE5.length + 1)); - CoreCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); + CoreNavigationCommands.ExpandLineSelection.runCoreEditorCommand(thisCursor, {}); assertCursor(thisCursor, new Selection(1, 1, 5, LINE5.length + 1)); }); @@ -710,7 +710,7 @@ suite('Editor Controller - Cursor', () => { moveTo(cursor, 1, 7, false); assertCursor(cursor, new Position(1, 7)); - CoreCommands.ColumnSelect.runCoreEditorCommand(cursor, { + CoreNavigationCommands.ColumnSelect.runCoreEditorCommand(cursor, { position: new Position(4, 4), viewPosition: new Position(4, 4), mouseColumn: 15 @@ -744,7 +744,7 @@ suite('Editor Controller - Cursor', () => { moveTo(cursor, 1, 4, false); assertCursor(cursor, new Position(1, 4)); - CoreCommands.ColumnSelect.runCoreEditorCommand(cursor, { + CoreNavigationCommands.ColumnSelect.runCoreEditorCommand(cursor, { position: new Position(4, 1), viewPosition: new Position(4, 1), mouseColumn: 1 @@ -779,7 +779,7 @@ suite('Editor Controller - Cursor', () => { moveTo(cursor, 10, 10, false); assertCursor(cursor, new Position(10, 10)); - CoreCommands.ColumnSelect.runCoreEditorCommand(cursor, { + CoreNavigationCommands.ColumnSelect.runCoreEditorCommand(cursor, { position: new Position(1, 1), viewPosition: new Position(1, 1), mouseColumn: 1 @@ -797,7 +797,7 @@ suite('Editor Controller - Cursor', () => { new Selection(1, 10, 1, 1), ]); - CoreCommands.ColumnSelect.runCoreEditorCommand(cursor, { + CoreNavigationCommands.ColumnSelect.runCoreEditorCommand(cursor, { position: new Position(1, 1), viewPosition: new Position(1, 1), mouseColumn: 1 @@ -837,28 +837,28 @@ suite('Editor Controller - Cursor', () => { moveTo(cursor, 10, 10, false); assertCursor(cursor, new Position(10, 10)); - CoreCommands.CursorColumnSelectLeft.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectLeft.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(10, 10, 10, 9) ]); - CoreCommands.CursorColumnSelectLeft.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectLeft.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(10, 10, 10, 8) ]); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(10, 10, 10, 9) ]); - CoreCommands.CursorColumnSelectUp.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectUp.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(10, 10, 10, 9), new Selection(9, 10, 9, 9), ]); - CoreCommands.CursorColumnSelectDown.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectDown.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(10, 10, 10, 9) ]); @@ -882,28 +882,28 @@ suite('Editor Controller - Cursor', () => { moveTo(cursor, 1, 4, false); assertCursor(cursor, new Position(1, 4)); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(1, 4, 1, 5) ]); - CoreCommands.CursorColumnSelectDown.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectDown.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(1, 4, 1, 5), new Selection(2, 4, 2, 5) ]); - CoreCommands.CursorColumnSelectDown.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectDown.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(1, 4, 1, 5), new Selection(2, 4, 2, 5), new Selection(3, 4, 3, 5), ]); - CoreCommands.CursorColumnSelectDown.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectDown.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectDown.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectDown.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectDown.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectDown.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectDown.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectDown.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(1, 4, 1, 5), new Selection(2, 4, 2, 5), @@ -914,7 +914,7 @@ suite('Editor Controller - Cursor', () => { new Selection(7, 4, 7, 5), ]); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(1, 4, 1, 6), new Selection(2, 4, 2, 6), @@ -926,16 +926,16 @@ suite('Editor Controller - Cursor', () => { ]); // 10 times - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(1, 4, 1, 16), new Selection(2, 4, 2, 16), @@ -947,16 +947,16 @@ suite('Editor Controller - Cursor', () => { ]); // 10 times - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(1, 4, 1, 26), new Selection(2, 4, 2, 26), @@ -968,8 +968,8 @@ suite('Editor Controller - Cursor', () => { ]); // 2 times => reaching the ending of lines 1 and 2 - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(1, 4, 1, 28), new Selection(2, 4, 2, 28), @@ -981,10 +981,10 @@ suite('Editor Controller - Cursor', () => { ]); // 4 times => reaching the ending of line 3 - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(1, 4, 1, 28), new Selection(2, 4, 2, 28), @@ -996,8 +996,8 @@ suite('Editor Controller - Cursor', () => { ]); // 2 times => reaching the ending of line 4 - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(1, 4, 1, 28), new Selection(2, 4, 2, 28), @@ -1009,7 +1009,7 @@ suite('Editor Controller - Cursor', () => { ]); // 1 time => reaching the ending of line 7 - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(1, 4, 1, 28), new Selection(2, 4, 2, 28), @@ -1021,9 +1021,9 @@ suite('Editor Controller - Cursor', () => { ]); // 3 times => reaching the ending of lines 5 & 6 - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(1, 4, 1, 28), new Selection(2, 4, 2, 28), @@ -1035,7 +1035,7 @@ suite('Editor Controller - Cursor', () => { ]); // cannot go anywhere anymore - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(1, 4, 1, 28), new Selection(2, 4, 2, 28), @@ -1047,10 +1047,10 @@ suite('Editor Controller - Cursor', () => { ]); // cannot go anywhere anymore even if we insist - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); - CoreCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectRight.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(1, 4, 1, 28), new Selection(2, 4, 2, 28), @@ -1062,7 +1062,7 @@ suite('Editor Controller - Cursor', () => { ]); // can easily go back - CoreCommands.CursorColumnSelectLeft.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorColumnSelectLeft.runCoreEditorCommand(cursor, {}); assertCursor(cursor, [ new Selection(1, 4, 1, 28), new Selection(2, 4, 2, 28), @@ -1143,7 +1143,7 @@ suite('Editor Controller - Regression tests', () => { cursorCommand(cursor, H.Type, { text: 'x' }); assert.equal(model.getValue(EndOfLinePreference.LF), '\n\t\n\tx', 'assert4'); - CoreCommands.CursorLeft.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorLeft.runCoreEditorCommand(cursor, {}); assert.equal(model.getValue(EndOfLinePreference.LF), '\n\t\n\tx', 'assert5'); cursorCommand(cursor, H.DeleteLeft, {}); @@ -1632,9 +1632,9 @@ suite('Editor Controller - Regression tests', () => { } }; if (col === 1) { - CoreCommands.WordSelect.runCoreEditorCommand(cursor, args); + CoreNavigationCommands.WordSelect.runCoreEditorCommand(cursor, args); } else { - CoreCommands.WordSelectDrag.runCoreEditorCommand(cursor, args); + CoreNavigationCommands.WordSelectDrag.runCoreEditorCommand(cursor, args); } assert.equal(cursor.getSelection().startColumn, 1, 'TEST FOR ' + col); @@ -1802,7 +1802,7 @@ suite('Editor Controller - Cursor Configuration', () => { ], modelOpts: { insertSpaces: true, tabSize: 4, detectIndentation: false, defaultEOL: DefaultEndOfLine.LF, trimAutoWhitespace: true } }, (model, cursor) => { - cursorCommand(cursor, CoreCommands.MoveTo.id, { position: new Position(1, 21) }, 'keyboard'); + cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(1, 21) }, 'keyboard'); cursorCommand(cursor, H.Type, { text: '\n' }, 'keyboard'); assert.equal(model.getLineContent(1), ' \tMy First Line\t '); assert.equal(model.getLineContent(2), ' '); @@ -1821,56 +1821,56 @@ suite('Editor Controller - Cursor Configuration', () => { modelOpts: { insertSpaces: true, tabSize: 13, detectIndentation: false, defaultEOL: DefaultEndOfLine.LF, trimAutoWhitespace: true } }, (model, cursor) => { // Tab on column 1 - cursorCommand(cursor, CoreCommands.MoveTo.id, { position: new Position(2, 1) }, 'keyboard'); + cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 1) }, 'keyboard'); cursorCommand(cursor, H.Tab, null, 'keyboard'); assert.equal(model.getLineContent(2), ' My Second Line123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 2 assert.equal(model.getLineContent(2), 'My Second Line123'); - cursorCommand(cursor, CoreCommands.MoveTo.id, { position: new Position(2, 2) }, 'keyboard'); + cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 2) }, 'keyboard'); cursorCommand(cursor, H.Tab, null, 'keyboard'); assert.equal(model.getLineContent(2), 'M y Second Line123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 3 assert.equal(model.getLineContent(2), 'My Second Line123'); - cursorCommand(cursor, CoreCommands.MoveTo.id, { position: new Position(2, 3) }, 'keyboard'); + cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 3) }, 'keyboard'); cursorCommand(cursor, H.Tab, null, 'keyboard'); assert.equal(model.getLineContent(2), 'My Second Line123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 4 assert.equal(model.getLineContent(2), 'My Second Line123'); - cursorCommand(cursor, CoreCommands.MoveTo.id, { position: new Position(2, 4) }, 'keyboard'); + cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 4) }, 'keyboard'); cursorCommand(cursor, H.Tab, null, 'keyboard'); assert.equal(model.getLineContent(2), 'My Second Line123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 5 assert.equal(model.getLineContent(2), 'My Second Line123'); - cursorCommand(cursor, CoreCommands.MoveTo.id, { position: new Position(2, 5) }, 'keyboard'); + cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 5) }, 'keyboard'); cursorCommand(cursor, H.Tab, null, 'keyboard'); assert.equal(model.getLineContent(2), 'My S econd Line123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 5 assert.equal(model.getLineContent(2), 'My Second Line123'); - cursorCommand(cursor, CoreCommands.MoveTo.id, { position: new Position(2, 5) }, 'keyboard'); + cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 5) }, 'keyboard'); cursorCommand(cursor, H.Tab, null, 'keyboard'); assert.equal(model.getLineContent(2), 'My S econd Line123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 13 assert.equal(model.getLineContent(2), 'My Second Line123'); - cursorCommand(cursor, CoreCommands.MoveTo.id, { position: new Position(2, 13) }, 'keyboard'); + cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 13) }, 'keyboard'); cursorCommand(cursor, H.Tab, null, 'keyboard'); assert.equal(model.getLineContent(2), 'My Second Li ne123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 14 assert.equal(model.getLineContent(2), 'My Second Line123'); - cursorCommand(cursor, CoreCommands.MoveTo.id, { position: new Position(2, 14) }, 'keyboard'); + cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 14) }, 'keyboard'); cursorCommand(cursor, H.Tab, null, 'keyboard'); assert.equal(model.getLineContent(2), 'My Second Lin e123'); }); @@ -2341,7 +2341,7 @@ suite('Editor Controller - Cursor Configuration', () => { cursorCommand(cursor, H.Type, { text: 'x' }); assert.equal(model.getValue(EndOfLinePreference.LF), '\n\ty\n\tx', 'assert4'); - CoreCommands.CursorLeft.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorLeft.runCoreEditorCommand(cursor, {}); assert.equal(model.getValue(EndOfLinePreference.LF), '\n\ty\n\tx', 'assert5'); cursorCommand(cursor, H.DeleteLeft, {}); diff --git a/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts b/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts index 5528a35ac24..acab85b463e 100644 --- a/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts +++ b/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts @@ -17,7 +17,7 @@ import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IViewModelHelper } from 'vs/editor/common/controller/cursorCommon'; -import { CoreCommands } from 'vs/editor/common/controller/coreCommands'; +import { CoreNavigationCommands } from 'vs/editor/common/controller/coreCommands'; suite('Cursor move command test', () => { @@ -469,7 +469,7 @@ interface ICursorOpts { // Move command function move(cursor: Cursor, args: any) { - CoreCommands.CursorMove.runCoreEditorCommand(cursor, args); + CoreNavigationCommands.CursorMove.runCoreEditorCommand(cursor, args); } function moveToLineStart(cursor: Cursor) { @@ -553,11 +553,11 @@ function selectionEqual(selection: Selection, posLineNumber: number, posColumn: function moveTo(cursor: Cursor, lineNumber: number, column: number, inSelectionMode: boolean = false) { if (inSelectionMode) { - CoreCommands.MoveToSelect.runCoreEditorCommand(cursor, { + CoreNavigationCommands.MoveToSelect.runCoreEditorCommand(cursor, { position: new Position(lineNumber, column) }); } else { - CoreCommands.MoveTo.runCoreEditorCommand(cursor, { + CoreNavigationCommands.MoveTo.runCoreEditorCommand(cursor, { position: new Position(lineNumber, column) }); } @@ -565,8 +565,8 @@ function moveTo(cursor: Cursor, lineNumber: number, column: number, inSelectionM function moveToEndOfLine(cursor: Cursor, inSelectionMode: boolean = false) { if (inSelectionMode) { - CoreCommands.CursorEndSelect.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorEndSelect.runCoreEditorCommand(cursor, {}); } else { - CoreCommands.CursorEnd.runCoreEditorCommand(cursor, {}); + CoreNavigationCommands.CursorEnd.runCoreEditorCommand(cursor, {}); } } diff --git a/src/vs/workbench/test/common/editor/rangeDecorations.test.ts b/src/vs/workbench/test/common/editor/rangeDecorations.test.ts index f04f09a97e8..617ce785ac1 100644 --- a/src/vs/workbench/test/common/editor/rangeDecorations.test.ts +++ b/src/vs/workbench/test/common/editor/rangeDecorations.test.ts @@ -24,7 +24,7 @@ import { Cursor } from 'vs/editor/common/controller/cursor'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; -import { CoreCommands } from 'vs/editor/common/controller/coreCommands'; +import { CoreNavigationCommands } from 'vs/editor/common/controller/coreCommands'; suite('Editor - Range decorations', () => { @@ -111,7 +111,7 @@ suite('Editor - Range decorations', () => { test('highlight is removed on cursor position change', function () { testObject.highlightRange({ resource: model.uri, range: { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 1 } }); - cursor.trigger('mouse', CoreCommands.MoveTo.id, { + cursor.trigger('mouse', CoreNavigationCommands.MoveTo.id, { position: new Position(2, 1) }); From c466ad6092a3b55b0614a9ae5b6b94b448f4c795 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 18 May 2017 18:53:30 +0200 Subject: [PATCH 0636/1164] Add ICommand.insertsAutoWhitespace --- .../editor/common/commands/replaceCommand.ts | 28 ++-- src/vs/editor/common/controller/cursor.ts | 36 ++--- .../editor/common/controller/cursorCommon.ts | 16 +-- .../controller/cursorDeleteOperations.ts | 24 ++-- .../common/controller/cursorTypeOperations.ts | 132 ++++++++---------- src/vs/editor/common/editorCommon.ts | 8 ++ 6 files changed, 111 insertions(+), 133 deletions(-) diff --git a/src/vs/editor/common/commands/replaceCommand.ts b/src/vs/editor/common/commands/replaceCommand.ts index c3c2c765bc4..1083964b0ff 100644 --- a/src/vs/editor/common/commands/replaceCommand.ts +++ b/src/vs/editor/common/commands/replaceCommand.ts @@ -10,12 +10,14 @@ import { Range } from 'vs/editor/common/core/range'; export class ReplaceCommand implements editorCommon.ICommand { - private _range: Range; - private _text: string; + private readonly _range: Range; + private readonly _text: string; + public readonly insertsAutoWhitespace: boolean; - constructor(range: Range, text: string) { + constructor(range: Range, text: string, insertsAutoWhitespace: boolean = false) { this._range = range; this._text = text; + this.insertsAutoWhitespace = insertsAutoWhitespace; } public getEditOperations(model: editorCommon.ITokenizedModel, builder: editorCommon.IEditOperationBuilder): void { @@ -36,12 +38,14 @@ export class ReplaceCommand implements editorCommon.ICommand { export class ReplaceCommandWithoutChangingPosition implements editorCommon.ICommand { - private _range: Range; - private _text: string; + private readonly _range: Range; + private readonly _text: string; + public readonly insertsAutoWhitespace: boolean; - constructor(range: Range, text: string) { + constructor(range: Range, text: string, insertsAutoWhitespace: boolean = false) { this._range = range; this._text = text; + this.insertsAutoWhitespace = insertsAutoWhitespace; } public getEditOperations(model: editorCommon.ITokenizedModel, builder: editorCommon.IEditOperationBuilder): void { @@ -62,16 +66,18 @@ export class ReplaceCommandWithoutChangingPosition implements editorCommon.IComm export class ReplaceCommandWithOffsetCursorState implements editorCommon.ICommand { - private _range: Range; - private _text: string; - private _columnDeltaOffset: number; - private _lineNumberDeltaOffset: number; + private readonly _range: Range; + private readonly _text: string; + private readonly _columnDeltaOffset: number; + private readonly _lineNumberDeltaOffset: number; + public readonly insertsAutoWhitespace: boolean; - constructor(range: Range, text: string, lineNumberDeltaOffset: number, columnDeltaOffset: number) { + constructor(range: Range, text: string, lineNumberDeltaOffset: number, columnDeltaOffset: number, insertsAutoWhitespace: boolean = false) { this._range = range; this._text = text; this._columnDeltaOffset = columnDeltaOffset; this._lineNumberDeltaOffset = lineNumberDeltaOffset; + this.insertsAutoWhitespace = insertsAutoWhitespace; } public getEditOperations(model: editorCommon.ITokenizedModel, builder: editorCommon.IEditOperationBuilder): void { diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 2098d553134..f080795bf6d 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -14,7 +14,7 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection, SelectionDirection, ISelection } from 'vs/editor/common/core/selection'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import { CursorColumns, CursorConfiguration, EditOperationResult, SingleCursorState, IViewModelHelper, CursorContext, CursorState, RevealTarget, IColumnSelectData, ICursors, CommandResult } from 'vs/editor/common/controller/cursorCommon'; +import { CursorColumns, CursorConfiguration, EditOperationResult, SingleCursorState, IViewModelHelper, CursorContext, CursorState, RevealTarget, IColumnSelectData, ICursors } from 'vs/editor/common/controller/cursorCommon'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { DeleteOperations } from 'vs/editor/common/controller/cursorDeleteOperations'; import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations'; @@ -423,7 +423,7 @@ export class Cursor extends Disposable implements ICursors { this._cursors.setSelections(cursorState); } - private _getEditOperationsFromCommand(ctx: IExecContext, majorIdentifier: number, command: CommandResult): ICommandData { + private _getEditOperationsFromCommand(ctx: IExecContext, majorIdentifier: number, command: editorCommon.ICommand): ICommandData { // This method acts as a transaction, if the command fails // everything it has done is ignored let operations: editorCommon.IIdentifiedSingleEditOperation[] = []; @@ -442,7 +442,7 @@ export class Cursor extends Disposable implements ICursors { range: selection, text: text, forceMoveMarkers: false, - isAutoWhitespaceEdit: command.isAutoWhitespaceCommand + isAutoWhitespaceEdit: command.insertsAutoWhitespace }); }; @@ -494,7 +494,7 @@ export class Cursor extends Disposable implements ICursors { }; try { - command.command.getEditOperations(this._model, editOperationBuilder); + command.getEditOperations(this._model, editOperationBuilder); } catch (e) { e.friendlyMessage = nls.localize('corrupt.commands', "Unexpected exception while executing command."); onUnexpectedError(e); @@ -510,7 +510,7 @@ export class Cursor extends Disposable implements ICursors { }; } - private _getEditOperations(ctx: IExecContext, commands: CommandResult[]): ICommandsData { + private _getEditOperations(ctx: IExecContext, commands: editorCommon.ICommand[]): ICommandsData { let operations: editorCommon.IIdentifiedSingleEditOperation[] = []; let hadTrackedEditOperation: boolean = false; @@ -576,7 +576,7 @@ export class Cursor extends Disposable implements ICursors { return loserCursorsMap; } - private _arrayIsEmpty(commands: CommandResult[]): boolean { + private _arrayIsEmpty(commands: editorCommon.ICommand[]): boolean { for (let i = 0, len = commands.length; i < len; i++) { if (commands[i]) { return false; @@ -585,7 +585,7 @@ export class Cursor extends Disposable implements ICursors { return true; } - private _innerExecuteCommands(ctx: IExecContext, commands: CommandResult[]): void { + private _innerExecuteCommands(ctx: IExecContext, commands: editorCommon.ICommand[]): void { if (this._configuration.editor.readOnly) { return; @@ -655,7 +655,7 @@ export class Cursor extends Disposable implements ICursors { for (let i = 0; i < selectionsBefore.length; i++) { if (groupedInverseEditOperations[i].length > 0) { groupedInverseEditOperations[i].sort(minorBasedSorter); - cursorSelections[i] = commands[i].command.computeCursorState(this._model, { + cursorSelections[i] = commands[i].computeCursorState(this._model, { getInverseEditOperations: () => { return groupedInverseEditOperations[i]; }, @@ -1012,26 +1012,16 @@ export class Cursor extends Disposable implements ICursors { this._cursors.killSecondaryCursors(); - return new EditOperationResult( - [ - new CommandResult(command, false) - ], - { - shouldPushStackElementBefore: true, - shouldPushStackElementAfter: true - } - ); + return new EditOperationResult([command], { + shouldPushStackElementBefore: true, + shouldPushStackElementAfter: true + }); } private _externalExecuteCommands(args: CursorOperationArgs): EditOperationResult { const commands = args.eventData; - let _commands: CommandResult[] = []; - for (let i = 0, len = commands.length; i < len; i++) { - _commands[i] = new CommandResult(commands[i], false); - } - - return new EditOperationResult(_commands, { + return new EditOperationResult(commands, { shouldPushStackElementBefore: true, shouldPushStackElementAfter: true }); diff --git a/src/vs/editor/common/controller/cursorCommon.ts b/src/vs/editor/common/controller/cursorCommon.ts index 69ff558302f..8c37d25a581 100644 --- a/src/vs/editor/common/controller/cursorCommon.ts +++ b/src/vs/editor/common/controller/cursorCommon.ts @@ -427,28 +427,16 @@ export class CursorState { } } -export class CommandResult { - _commandResultBrand: void; - - readonly command: ICommand; - readonly isAutoWhitespaceCommand: boolean; - - constructor(command: ICommand, isAutoWhitespaceCommand: boolean) { - this.command = command; - this.isAutoWhitespaceCommand = isAutoWhitespaceCommand; - } -} - export class EditOperationResult { _editOperationResultBrand: void; - readonly commands: CommandResult[]; + readonly commands: ICommand[]; readonly shouldPushStackElementBefore: boolean; readonly shouldPushStackElementAfter: boolean; readonly reason: CursorChangeReason; constructor( - commands: CommandResult[], + commands: ICommand[], opts: { shouldPushStackElementBefore: boolean; shouldPushStackElementAfter: boolean; diff --git a/src/vs/editor/common/controller/cursorDeleteOperations.ts b/src/vs/editor/common/controller/cursorDeleteOperations.ts index 6996f1af6e6..68b006b107e 100644 --- a/src/vs/editor/common/controller/cursorDeleteOperations.ts +++ b/src/vs/editor/common/controller/cursorDeleteOperations.ts @@ -5,15 +5,16 @@ 'use strict'; import { ReplaceCommand } from 'vs/editor/common/commands/replaceCommand'; -import { SingleCursorState, CursorColumns, CursorConfiguration, ICursorSimpleModel, EditOperationResult, CommandResult } from 'vs/editor/common/controller/cursorCommon'; +import { SingleCursorState, CursorColumns, CursorConfiguration, ICursorSimpleModel, EditOperationResult } from 'vs/editor/common/controller/cursorCommon'; import { Range } from 'vs/editor/common/core/range'; import { MoveOperations } from 'vs/editor/common/controller/cursorMoveOperations'; import * as strings from 'vs/base/common/strings'; +import { ICommand } from "vs/editor/common/editorCommon"; export class DeleteOperations { public static deleteRight(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[]): EditOperationResult { - let commands: CommandResult[] = []; + let commands: ICommand[] = []; let shouldPushStackElementBefore = false; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; @@ -41,7 +42,7 @@ export class DeleteOperations { shouldPushStackElementBefore = true; } - commands[i] = new CommandResult(new ReplaceCommand(deleteSelection, ''), false); + commands[i] = new ReplaceCommand(deleteSelection, ''); } return new EditOperationResult(commands, { shouldPushStackElementBefore: shouldPushStackElementBefore, @@ -82,7 +83,7 @@ export class DeleteOperations { } private static _runAutoClosingPairDelete(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[]): EditOperationResult { - let commands: CommandResult[] = []; + let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; const position = cursor.position; @@ -92,7 +93,7 @@ export class DeleteOperations { position.lineNumber, position.column + 1 ); - commands[i] = new CommandResult(new ReplaceCommand(deleteSelection, ''), false); + commands[i] = new ReplaceCommand(deleteSelection, ''); } return new EditOperationResult(commands, { shouldPushStackElementBefore: true, @@ -106,7 +107,7 @@ export class DeleteOperations { return this._runAutoClosingPairDelete(config, model, cursors); } - let commands: CommandResult[] = []; + let commands: ICommand[] = []; let shouldPushStackElementBefore = false; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; @@ -155,7 +156,7 @@ export class DeleteOperations { shouldPushStackElementBefore = true; } - commands[i] = new CommandResult(new ReplaceCommand(deleteSelection, ''), false); + commands[i] = new ReplaceCommand(deleteSelection, ''); } return new EditOperationResult(commands, { shouldPushStackElementBefore: shouldPushStackElementBefore, @@ -164,7 +165,7 @@ export class DeleteOperations { } public static cut(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[]): EditOperationResult { - let commands: CommandResult[] = []; + let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; let selection = cursor.selection; @@ -208,7 +209,7 @@ export class DeleteOperations { ); if (!deleteSelection.isEmpty()) { - commands[i] = new CommandResult(new ReplaceCommand(deleteSelection, ''), false); + commands[i] = new ReplaceCommand(deleteSelection, ''); } else { commands[i] = null; } @@ -217,7 +218,7 @@ export class DeleteOperations { commands[i] = null; } } else { - commands[i] = new CommandResult(new ReplaceCommand(selection, ''), false); + commands[i] = new ReplaceCommand(selection, ''); } } return new EditOperationResult(commands, { @@ -225,5 +226,4 @@ export class DeleteOperations { shouldPushStackElementAfter: true }); } - -} \ No newline at end of file +} diff --git a/src/vs/editor/common/controller/cursorTypeOperations.ts b/src/vs/editor/common/controller/cursorTypeOperations.ts index 2f88bb956b4..b231d46d1e4 100644 --- a/src/vs/editor/common/controller/cursorTypeOperations.ts +++ b/src/vs/editor/common/controller/cursorTypeOperations.ts @@ -6,7 +6,7 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { ReplaceCommand, ReplaceCommandWithoutChangingPosition, ReplaceCommandWithOffsetCursorState } from 'vs/editor/common/commands/replaceCommand'; -import { SingleCursorState, CursorColumns, CursorConfiguration, ICursorSimpleModel, EditOperationResult, CommandResult } from 'vs/editor/common/controller/cursorCommon'; +import { SingleCursorState, CursorColumns, CursorConfiguration, ICursorSimpleModel, EditOperationResult } from 'vs/editor/common/controller/cursorCommon'; import { Range } from 'vs/editor/common/core/range'; import { ICommand, ITokenizedModel } from 'vs/editor/common/editorCommon'; import * as strings from 'vs/base/common/strings'; @@ -22,18 +22,15 @@ import { CursorChangeReason } from "vs/editor/common/controller/cursorEvents"; export class TypeOperations { public static indent(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[]): EditOperationResult { - let commands: CommandResult[] = []; + let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; - commands[i] = new CommandResult( - new ShiftCommand(cursor.selection, { - isUnshift: false, - tabSize: config.tabSize, - oneIndent: config.oneIndent, - useTabStops: config.useTabStops - }), - false - ); + commands[i] = new ShiftCommand(cursor.selection, { + isUnshift: false, + tabSize: config.tabSize, + oneIndent: config.oneIndent, + useTabStops: config.useTabStops + }); } return new EditOperationResult(commands, { shouldPushStackElementBefore: true, @@ -42,18 +39,15 @@ export class TypeOperations { } public static outdent(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[]): EditOperationResult { - let commands: CommandResult[] = []; + let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; - commands[i] = new CommandResult( - new ShiftCommand(cursor.selection, { - isUnshift: true, - tabSize: config.tabSize, - oneIndent: config.oneIndent, - useTabStops: config.useTabStops - }), - false - ); + commands[i] = new ShiftCommand(cursor.selection, { + isUnshift: true, + tabSize: config.tabSize, + oneIndent: config.oneIndent, + useTabStops: config.useTabStops + }); } return new EditOperationResult(commands, { shouldPushStackElementBefore: true, @@ -84,11 +78,11 @@ export class TypeOperations { } public static distributedPaste(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[], text: string[]): EditOperationResult { - let commands: CommandResult[] = []; + let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; let selection = cursor.selection; - commands[i] = new CommandResult(new ReplaceCommand(selection, text[i]), false); + commands[i] = new ReplaceCommand(selection, text[i]); } return new EditOperationResult(commands, { shouldPushStackElementBefore: true, @@ -98,7 +92,7 @@ export class TypeOperations { } public static paste(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[], text: string, pasteOnNewLine: boolean): EditOperationResult { - let commands: CommandResult[] = []; + let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; let position = cursor.position; @@ -117,9 +111,9 @@ export class TypeOperations { if (pasteOnNewLine) { // Paste entire line at the beginning of line let typeSelection = new Range(position.lineNumber, 1, position.lineNumber, 1); - commands[i] = new CommandResult(new ReplaceCommand(typeSelection, text), false); + commands[i] = new ReplaceCommand(typeSelection, text); } else { - commands[i] = new CommandResult(new ReplaceCommand(selection, text), false); + commands[i] = new ReplaceCommand(selection, text); } } return new EditOperationResult(commands, { @@ -160,7 +154,7 @@ export class TypeOperations { return null; } - private static _replaceJumpToNextIndent(config: CursorConfiguration, model: ICursorSimpleModel, selection: Selection): ReplaceCommand { + private static _replaceJumpToNextIndent(config: CursorConfiguration, model: ICursorSimpleModel, selection: Selection, insertsAutoWhitespace: boolean): ReplaceCommand { let typeText = ''; let position = selection.getStartPosition(); @@ -175,11 +169,11 @@ export class TypeOperations { typeText = '\t'; } - return new ReplaceCommand(selection, typeText); + return new ReplaceCommand(selection, typeText, insertsAutoWhitespace); } public static tab(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[]): EditOperationResult { - let commands: CommandResult[] = []; + let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; let selection = cursor.selection; @@ -193,32 +187,28 @@ export class TypeOperations { goodIndent = goodIndent || '\t'; let possibleTypeText = config.normalizeIndentation(goodIndent); if (!strings.startsWith(lineText, possibleTypeText)) { - let command = new ReplaceCommand(new Range(selection.startLineNumber, 1, selection.startLineNumber, lineText.length + 1), possibleTypeText); - commands[i] = new CommandResult(command, true); + commands[i] = new ReplaceCommand(new Range(selection.startLineNumber, 1, selection.startLineNumber, lineText.length + 1), possibleTypeText, true); continue; } } - commands[i] = new CommandResult(this._replaceJumpToNextIndent(config, model, selection), true); + commands[i] = this._replaceJumpToNextIndent(config, model, selection, true); } else { if (selection.startLineNumber === selection.endLineNumber) { let lineMaxColumn = model.getLineMaxColumn(selection.startLineNumber); if (selection.startColumn !== 1 || selection.endColumn !== lineMaxColumn) { // This is a single line selection that is not the entire line - commands[i] = new CommandResult(this._replaceJumpToNextIndent(config, model, selection), false); + commands[i] = this._replaceJumpToNextIndent(config, model, selection, false); continue; } } - commands[i] = new CommandResult( - new ShiftCommand(selection, { - isUnshift: false, - tabSize: config.tabSize, - oneIndent: config.oneIndent, - useTabStops: config.useTabStops - }), - false - ); + commands[i] = new ShiftCommand(selection, { + isUnshift: false, + tabSize: config.tabSize, + oneIndent: config.oneIndent, + useTabStops: config.useTabStops + }); } } return new EditOperationResult(commands, { @@ -228,7 +218,7 @@ export class TypeOperations { } public static replacePreviousChar(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[], txt: string, replaceCharCnt: number): EditOperationResult { - let commands: CommandResult[] = []; + let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; if (!cursor.selection.isEmpty()) { @@ -241,7 +231,7 @@ export class TypeOperations { let pos = cursor.position; let startColumn = Math.max(1, pos.column - replaceCharCnt); let range = new Range(pos.lineNumber, startColumn, pos.lineNumber, pos.column); - commands[i] = new CommandResult(new ReplaceCommand(range, txt), false); + commands[i] = new ReplaceCommand(range, txt); } return new EditOperationResult(commands, { shouldPushStackElementBefore: false, @@ -249,15 +239,15 @@ export class TypeOperations { }); } - public static typeCommand(range: Range, text: string, keepPosition: boolean): ICommand { + private static _typeCommand(range: Range, text: string, keepPosition: boolean): ICommand { if (keepPosition) { - return new ReplaceCommandWithoutChangingPosition(range, text); + return new ReplaceCommandWithoutChangingPosition(range, text, true); } else { - return new ReplaceCommand(range, text); + return new ReplaceCommand(range, text, true); } } - private static _enter(config: CursorConfiguration, model: ITokenizedModel, keepPosition: boolean, range: Range): CommandResult { + private static _enter(config: CursorConfiguration, model: ITokenizedModel, keepPosition: boolean, range: Range): ICommand { let r = LanguageConfigurationRegistry.getEnterAction(model, range); let enterAction = r.enterAction; let indentation = r.indentation; @@ -286,14 +276,13 @@ export class TypeOperations { indentation = indentation.substring(0, indentation.length - enterAction.removeText); } - let executeCommand: ICommand; if (enterAction.indentAction === IndentAction.None) { // Nothing special - executeCommand = TypeOperations.typeCommand(range, beforeText + '\n' + config.normalizeIndentation(indentation + enterAction.appendText), keepPosition); + return TypeOperations._typeCommand(range, beforeText + '\n' + config.normalizeIndentation(indentation + enterAction.appendText), keepPosition); } else if (enterAction.indentAction === IndentAction.Indent) { // Indent once - executeCommand = TypeOperations.typeCommand(range, beforeText + '\n' + config.normalizeIndentation(indentation + enterAction.appendText), keepPosition); + return TypeOperations._typeCommand(range, beforeText + '\n' + config.normalizeIndentation(indentation + enterAction.appendText), keepPosition); } else if (enterAction.indentAction === IndentAction.IndentOutdent) { // Ultra special @@ -303,16 +292,16 @@ export class TypeOperations { let typeText = beforeText + '\n' + increasedIndent + '\n' + normalIndent; if (keepPosition) { - executeCommand = new ReplaceCommandWithoutChangingPosition(range, typeText); + return new ReplaceCommandWithoutChangingPosition(range, typeText, true); } else { - executeCommand = new ReplaceCommandWithOffsetCursorState(range, typeText, -1, increasedIndent.length - normalIndent.length); + return new ReplaceCommandWithOffsetCursorState(range, typeText, -1, increasedIndent.length - normalIndent.length, true); } } else if (enterAction.indentAction === IndentAction.Outdent) { let actualIndentation = TypeOperations.unshiftIndent(config, indentation); - executeCommand = TypeOperations.typeCommand(range, beforeText + '\n' + config.normalizeIndentation(actualIndentation + enterAction.appendText), keepPosition); + return TypeOperations._typeCommand(range, beforeText + '\n' + config.normalizeIndentation(actualIndentation + enterAction.appendText), keepPosition); } - return new CommandResult(executeCommand, true); + return null; } private static _isAutoClosingCloseCharType(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[], ch: string): boolean { @@ -341,12 +330,12 @@ export class TypeOperations { } private static _runAutoClosingCloseCharType(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[], ch: string): EditOperationResult { - let commands: CommandResult[] = []; + let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; const position = cursor.position; const typeSelection = new Range(position.lineNumber, position.column, position.lineNumber, position.column + 1); - commands[i] = new CommandResult(new ReplaceCommand(typeSelection, ch), false); + commands[i] = new ReplaceCommand(typeSelection, ch); } return new EditOperationResult(commands, { shouldPushStackElementBefore: false, @@ -419,15 +408,12 @@ export class TypeOperations { } private static _runAutoClosingOpenCharType(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[], ch: string): EditOperationResult { - let commands: CommandResult[] = []; + let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; const selection = cursor.selection; const closeCharacter = config.autoClosingPairsOpen[ch]; - commands[i] = new CommandResult( - new ReplaceCommandWithOffsetCursorState(selection, ch + closeCharacter, 0, -closeCharacter.length), - false - ); + commands[i] = new ReplaceCommandWithOffsetCursorState(selection, ch + closeCharacter, 0, -closeCharacter.length); } return new EditOperationResult(commands, { shouldPushStackElementBefore: true, @@ -471,12 +457,12 @@ export class TypeOperations { } private static _runSurroundSelectionType(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[], ch: string): EditOperationResult { - let commands: CommandResult[] = []; + let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; const selection = cursor.selection; const closeCharacter = config.surroundingPairs[ch]; - commands[i] = new CommandResult(new SurroundSelectionCommand(selection, ch, closeCharacter), false); + commands[i] = new SurroundSelectionCommand(selection, ch, closeCharacter); } return new EditOperationResult(commands, { shouldPushStackElementBefore: true, @@ -505,7 +491,7 @@ export class TypeOperations { } if (electricAction.appendText) { - const command = new CommandResult(new ReplaceCommandWithOffsetCursorState(cursor.selection, ch + electricAction.appendText, 0, -electricAction.appendText.length), false); + const command = new ReplaceCommandWithOffsetCursorState(cursor.selection, ch + electricAction.appendText, 0, -electricAction.appendText.length); return new EditOperationResult([command], { shouldPushStackElementBefore: false, shouldPushStackElementAfter: true @@ -536,7 +522,7 @@ export class TypeOperations { let typeSelection = new Range(position.lineNumber, 1, position.lineNumber, position.column); - const command = new CommandResult(new ReplaceCommand(typeSelection, typeText), false); + const command = new ReplaceCommand(typeSelection, typeText); return new EditOperationResult([command], { shouldPushStackElementBefore: false, shouldPushStackElementAfter: true @@ -550,7 +536,7 @@ export class TypeOperations { public static typeWithInterceptors(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[], ch: string): EditOperationResult { if (ch === '\n') { - let commands: CommandResult[] = []; + let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { commands[i] = TypeOperations._enter(config, model, false, cursors[i].selection); } @@ -585,10 +571,10 @@ export class TypeOperations { } public static typeWithoutInterceptors(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[], str: string): EditOperationResult { - let commands: CommandResult[] = []; + let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; - commands[i] = new CommandResult(new ReplaceCommand(cursor.selection, str), false); + commands[i] = new ReplaceCommand(cursor.selection, str); } return new EditOperationResult(commands, { shouldPushStackElementBefore: false, @@ -597,13 +583,13 @@ export class TypeOperations { } public static lineInsertBefore(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[]): EditOperationResult { - let commands: CommandResult[] = []; + let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; let lineNumber = cursor.position.lineNumber; if (lineNumber === 1) { - commands[i] = new CommandResult(new ReplaceCommandWithoutChangingPosition(new Range(1, 1, 1, 1), '\n'), false); + commands[i] = new ReplaceCommandWithoutChangingPosition(new Range(1, 1, 1, 1), '\n'); } else { lineNumber--; let column = model.getLineMaxColumn(lineNumber); @@ -618,7 +604,7 @@ export class TypeOperations { } public static lineInsertAfter(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[]): EditOperationResult { - let commands: CommandResult[] = []; + let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; let position = cursor.position; @@ -632,7 +618,7 @@ export class TypeOperations { } public static lineBreakInsert(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[]): EditOperationResult { - let commands: CommandResult[] = []; + let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; commands[i] = this._enter(config, model, true, cursor.selection); diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index d0faa44be8e..b5c1bba3a0a 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -336,12 +336,20 @@ export interface ICursorStateComputerData { * A command that modifies text / cursor state on a model. */ export interface ICommand { + + /** + * Signal that this command is inserting automatic whitespace that should be trimmed if possible. + * @internal + */ + readonly insertsAutoWhitespace?: boolean; + /** * Get the edit operations needed to execute this command. * @param model The model the command will execute on. * @param builder A helper to collect the needed edit operations and to track selections. */ getEditOperations(model: ITokenizedModel, builder: IEditOperationBuilder): void; + /** * Compute the cursor state after the edit operations were applied. * @param model The model the commad has executed on. From 98465c0cd8b03e52e4e8210fae6608d6d00ba1b3 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 18 May 2017 19:34:35 +0200 Subject: [PATCH 0637/1164] Extract command execution out of Cursor --- src/vs/editor/common/controller/cursor.ts | 589 +++++++++++----------- 1 file changed, 300 insertions(+), 289 deletions(-) diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index f080795bf6d..3c35af418f3 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -33,11 +33,6 @@ class CursorOperationArgs { } } -interface IExecContext { - selectionStartMarkers: string[]; - positionMarkers: string[]; -} - interface ICommandData { operations: editorCommon.IIdentifiedSingleEditOperation[]; hadTrackedEditOperation: boolean; @@ -343,17 +338,11 @@ export class Cursor extends Disposable implements ICursors { this._columnSelectData = null; - if (opResult) { - const execCtx: IExecContext = { - selectionStartMarkers: [], - positionMarkers: [] - }; - - this._innerExecuteCommands(execCtx, opResult.commands); - - for (let i = 0; i < execCtx.selectionStartMarkers.length; i++) { - this._model._removeMarker(execCtx.selectionStartMarkers[i]); - this._model._removeMarker(execCtx.positionMarkers[i]); + if (opResult && !this._configuration.editor.readOnly) { + const result = CommandExecutor.executeCommands(this._model, this._cursors.getSelections(), opResult.commands); + if (result) { + // The commands were applied correctly + this._interpretCommandResult(result); } } @@ -423,279 +412,6 @@ export class Cursor extends Disposable implements ICursors { this._cursors.setSelections(cursorState); } - private _getEditOperationsFromCommand(ctx: IExecContext, majorIdentifier: number, command: editorCommon.ICommand): ICommandData { - // This method acts as a transaction, if the command fails - // everything it has done is ignored - let operations: editorCommon.IIdentifiedSingleEditOperation[] = []; - let operationMinor = 0; - - const addEditOperation = (selection: Range, text: string) => { - if (selection.isEmpty() && text === '') { - // This command wants to add a no-op => no thank you - return; - } - operations.push({ - identifier: { - major: majorIdentifier, - minor: operationMinor++ - }, - range: selection, - text: text, - forceMoveMarkers: false, - isAutoWhitespaceEdit: command.insertsAutoWhitespace - }); - }; - - let hadTrackedEditOperation = false; - const addTrackedEditOperation = (selection: Range, text: string) => { - hadTrackedEditOperation = true; - addEditOperation(selection, text); - }; - - const trackSelection = (selection: Selection, trackPreviousOnEmpty?: boolean) => { - let selectionMarkerStickToPreviousCharacter: boolean; - let positionMarkerStickToPreviousCharacter: boolean; - - if (selection.isEmpty()) { - // Try to lock it with surrounding text - if (typeof trackPreviousOnEmpty === 'boolean') { - selectionMarkerStickToPreviousCharacter = trackPreviousOnEmpty; - positionMarkerStickToPreviousCharacter = trackPreviousOnEmpty; - } else { - const maxLineColumn = this._model.getLineMaxColumn(selection.startLineNumber); - if (selection.startColumn === maxLineColumn) { - selectionMarkerStickToPreviousCharacter = true; - positionMarkerStickToPreviousCharacter = true; - } else { - selectionMarkerStickToPreviousCharacter = false; - positionMarkerStickToPreviousCharacter = false; - } - } - } else { - if (selection.getDirection() === SelectionDirection.LTR) { - selectionMarkerStickToPreviousCharacter = false; - positionMarkerStickToPreviousCharacter = true; - } else { - selectionMarkerStickToPreviousCharacter = true; - positionMarkerStickToPreviousCharacter = false; - } - } - - const l = ctx.selectionStartMarkers.length; - ctx.selectionStartMarkers[l] = this._model._addMarker(0, selection.selectionStartLineNumber, selection.selectionStartColumn, selectionMarkerStickToPreviousCharacter); - ctx.positionMarkers[l] = this._model._addMarker(0, selection.positionLineNumber, selection.positionColumn, positionMarkerStickToPreviousCharacter); - return l.toString(); - }; - - const editOperationBuilder: editorCommon.IEditOperationBuilder = { - addEditOperation: addEditOperation, - addTrackedEditOperation: addTrackedEditOperation, - trackSelection: trackSelection - }; - - try { - command.getEditOperations(this._model, editOperationBuilder); - } catch (e) { - e.friendlyMessage = nls.localize('corrupt.commands', "Unexpected exception while executing command."); - onUnexpectedError(e); - return { - operations: [], - hadTrackedEditOperation: false - }; - } - - return { - operations: operations, - hadTrackedEditOperation: hadTrackedEditOperation - }; - } - - private _getEditOperations(ctx: IExecContext, commands: editorCommon.ICommand[]): ICommandsData { - let operations: editorCommon.IIdentifiedSingleEditOperation[] = []; - let hadTrackedEditOperation: boolean = false; - - for (let i = 0, len = commands.length; i < len; i++) { - if (commands[i]) { - const r = this._getEditOperationsFromCommand(ctx, i, commands[i]); - operations = operations.concat(r.operations); - hadTrackedEditOperation = hadTrackedEditOperation || r.hadTrackedEditOperation; - } - } - return { - operations: operations, - hadTrackedEditOperation: hadTrackedEditOperation - }; - } - - private _getLoserCursorMap(operations: editorCommon.IIdentifiedSingleEditOperation[]): { [index: string]: boolean; } { - // This is destructive on the array - operations = operations.slice(0); - - // Sort operations with last one first - operations.sort((a: editorCommon.IIdentifiedSingleEditOperation, b: editorCommon.IIdentifiedSingleEditOperation): number => { - // Note the minus! - return -(Range.compareRangesUsingEnds(a.range, b.range)); - }); - - // Operations can not overlap! - let loserCursorsMap: { [index: string]: boolean; } = {}; - - for (let i = 1; i < operations.length; i++) { - const previousOp = operations[i - 1]; - const currentOp = operations[i]; - - if (previousOp.range.getStartPosition().isBefore(currentOp.range.getEndPosition())) { - - let loserMajor: number; - - if (previousOp.identifier.major > currentOp.identifier.major) { - // previousOp loses the battle - loserMajor = previousOp.identifier.major; - } else { - loserMajor = currentOp.identifier.major; - } - - loserCursorsMap[loserMajor.toString()] = true; - - for (let j = 0; j < operations.length; j++) { - if (operations[j].identifier.major === loserMajor) { - operations.splice(j, 1); - if (j < i) { - i--; - } - j--; - } - } - - if (i > 0) { - i--; - } - } - } - - return loserCursorsMap; - } - - private _arrayIsEmpty(commands: editorCommon.ICommand[]): boolean { - for (let i = 0, len = commands.length; i < len; i++) { - if (commands[i]) { - return false; - } - } - return true; - } - - private _innerExecuteCommands(ctx: IExecContext, commands: editorCommon.ICommand[]): void { - - if (this._configuration.editor.readOnly) { - return; - } - - if (this._arrayIsEmpty(commands)) { - return; - } - - const selectionsBefore = this._cursors.getSelections(); - - const commandsData = this._getEditOperations(ctx, commands); - if (commandsData.operations.length === 0) { - return; - } - - const rawOperations = commandsData.operations; - - const editableRange = this._model.getEditableRange(); - const editableRangeStart = editableRange.getStartPosition(); - const editableRangeEnd = editableRange.getEndPosition(); - for (let i = 0, len = rawOperations.length; i < len; i++) { - const operationRange = rawOperations[i].range; - if (!editableRangeStart.isBeforeOrEqual(operationRange.getStartPosition()) || !operationRange.getEndPosition().isBeforeOrEqual(editableRangeEnd)) { - // These commands are outside of the editable range - return; - } - } - - const loserCursorsMap = this._getLoserCursorMap(rawOperations); - if (loserCursorsMap.hasOwnProperty('0')) { - // These commands are very messed up - console.warn('Ignoring commands'); - return; - } - - // Remove operations belonging to losing cursors - let filteredOperations: editorCommon.IIdentifiedSingleEditOperation[] = []; - for (let i = 0, len = rawOperations.length; i < len; i++) { - if (!loserCursorsMap.hasOwnProperty(rawOperations[i].identifier.major.toString())) { - filteredOperations.push(rawOperations[i]); - } - } - - // TODO@Alex: find a better way to do this. - // give the hint that edit operations are tracked to the model - if (commandsData.hadTrackedEditOperation && filteredOperations.length > 0) { - filteredOperations[0]._isTracked = true; - } - const selectionsAfter = this._model.pushEditOperations(selectionsBefore, filteredOperations, (inverseEditOperations: editorCommon.IIdentifiedSingleEditOperation[]): Selection[] => { - let groupedInverseEditOperations: editorCommon.IIdentifiedSingleEditOperation[][] = []; - for (let i = 0; i < selectionsBefore.length; i++) { - groupedInverseEditOperations[i] = []; - } - for (let i = 0; i < inverseEditOperations.length; i++) { - const op = inverseEditOperations[i]; - if (!op.identifier) { - // perhaps auto whitespace trim edits - continue; - } - groupedInverseEditOperations[op.identifier.major].push(op); - } - const minorBasedSorter = (a: editorCommon.IIdentifiedSingleEditOperation, b: editorCommon.IIdentifiedSingleEditOperation) => { - return a.identifier.minor - b.identifier.minor; - }; - let cursorSelections: Selection[] = []; - for (let i = 0; i < selectionsBefore.length; i++) { - if (groupedInverseEditOperations[i].length > 0) { - groupedInverseEditOperations[i].sort(minorBasedSorter); - cursorSelections[i] = commands[i].computeCursorState(this._model, { - getInverseEditOperations: () => { - return groupedInverseEditOperations[i]; - }, - - getTrackedSelection: (id: string) => { - const idx = parseInt(id, 10); - const selectionStartMarker = this._model._getMarker(ctx.selectionStartMarkers[idx]); - const positionMarker = this._model._getMarker(ctx.positionMarkers[idx]); - return new Selection(selectionStartMarker.lineNumber, selectionStartMarker.column, positionMarker.lineNumber, positionMarker.column); - } - }); - } else { - cursorSelections[i] = selectionsBefore[i]; - } - } - return cursorSelections; - }); - - // Extract losing cursors - let losingCursors: number[] = []; - for (let losingCursorIndex in loserCursorsMap) { - if (loserCursorsMap.hasOwnProperty(losingCursorIndex)) { - losingCursors.push(parseInt(losingCursorIndex, 10)); - } - } - - // Sort losing cursors descending - losingCursors.sort((a: number, b: number): number => { - return b - a; - }); - - // Remove losing cursors - for (let i = 0; i < losingCursors.length; i++) { - selectionsAfter.splice(losingCursors[i], 1); - } - - this._interpretCommandResult(selectionsAfter); - } - - // ----------------------------------------------------------------------------------------------------------- // ----- emitting events @@ -1027,3 +743,298 @@ export class Cursor extends Disposable implements ICursors { }); } } + +interface IExecContext { + readonly model: editorCommon.IModel; + readonly selectionsBefore: Selection[]; + readonly selectionStartMarkers: string[]; + readonly positionMarkers: string[]; +} + +class CommandExecutor { + + public static executeCommands(model: editorCommon.IModel, selectionsBefore: Selection[], commands: editorCommon.ICommand[]): Selection[] { + + const ctx: IExecContext = { + model: model, + selectionsBefore: selectionsBefore, + selectionStartMarkers: [], + positionMarkers: [] + }; + + const result = this._innerExecuteCommands(ctx, commands); + + for (let i = 0; i < ctx.selectionStartMarkers.length; i++) { + ctx.model._removeMarker(ctx.selectionStartMarkers[i]); + ctx.model._removeMarker(ctx.positionMarkers[i]); + } + + return result; + } + + private static _innerExecuteCommands(ctx: IExecContext, commands: editorCommon.ICommand[]): Selection[] { + + if (this._arrayIsEmpty(commands)) { + return null; + } + + const commandsData = this._getEditOperations(ctx, commands); + if (commandsData.operations.length === 0) { + return null; + } + + const rawOperations = commandsData.operations; + + const editableRange = ctx.model.getEditableRange(); + const editableRangeStart = editableRange.getStartPosition(); + const editableRangeEnd = editableRange.getEndPosition(); + for (let i = 0, len = rawOperations.length; i < len; i++) { + const operationRange = rawOperations[i].range; + if (!editableRangeStart.isBeforeOrEqual(operationRange.getStartPosition()) || !operationRange.getEndPosition().isBeforeOrEqual(editableRangeEnd)) { + // These commands are outside of the editable range + return null; + } + } + + const loserCursorsMap = this._getLoserCursorMap(rawOperations); + if (loserCursorsMap.hasOwnProperty('0')) { + // These commands are very messed up + console.warn('Ignoring commands'); + return null; + } + + // Remove operations belonging to losing cursors + let filteredOperations: editorCommon.IIdentifiedSingleEditOperation[] = []; + for (let i = 0, len = rawOperations.length; i < len; i++) { + if (!loserCursorsMap.hasOwnProperty(rawOperations[i].identifier.major.toString())) { + filteredOperations.push(rawOperations[i]); + } + } + + // TODO@Alex: find a better way to do this. + // give the hint that edit operations are tracked to the model + if (commandsData.hadTrackedEditOperation && filteredOperations.length > 0) { + filteredOperations[0]._isTracked = true; + } + const selectionsAfter = ctx.model.pushEditOperations(ctx.selectionsBefore, filteredOperations, (inverseEditOperations: editorCommon.IIdentifiedSingleEditOperation[]): Selection[] => { + let groupedInverseEditOperations: editorCommon.IIdentifiedSingleEditOperation[][] = []; + for (let i = 0; i < ctx.selectionsBefore.length; i++) { + groupedInverseEditOperations[i] = []; + } + for (let i = 0; i < inverseEditOperations.length; i++) { + const op = inverseEditOperations[i]; + if (!op.identifier) { + // perhaps auto whitespace trim edits + continue; + } + groupedInverseEditOperations[op.identifier.major].push(op); + } + const minorBasedSorter = (a: editorCommon.IIdentifiedSingleEditOperation, b: editorCommon.IIdentifiedSingleEditOperation) => { + return a.identifier.minor - b.identifier.minor; + }; + let cursorSelections: Selection[] = []; + for (let i = 0; i < ctx.selectionsBefore.length; i++) { + if (groupedInverseEditOperations[i].length > 0) { + groupedInverseEditOperations[i].sort(minorBasedSorter); + cursorSelections[i] = commands[i].computeCursorState(ctx.model, { + getInverseEditOperations: () => { + return groupedInverseEditOperations[i]; + }, + + getTrackedSelection: (id: string) => { + const idx = parseInt(id, 10); + const selectionStartMarker = ctx.model._getMarker(ctx.selectionStartMarkers[idx]); + const positionMarker = ctx.model._getMarker(ctx.positionMarkers[idx]); + return new Selection(selectionStartMarker.lineNumber, selectionStartMarker.column, positionMarker.lineNumber, positionMarker.column); + } + }); + } else { + cursorSelections[i] = ctx.selectionsBefore[i]; + } + } + return cursorSelections; + }); + + // Extract losing cursors + let losingCursors: number[] = []; + for (let losingCursorIndex in loserCursorsMap) { + if (loserCursorsMap.hasOwnProperty(losingCursorIndex)) { + losingCursors.push(parseInt(losingCursorIndex, 10)); + } + } + + // Sort losing cursors descending + losingCursors.sort((a: number, b: number): number => { + return b - a; + }); + + // Remove losing cursors + for (let i = 0; i < losingCursors.length; i++) { + selectionsAfter.splice(losingCursors[i], 1); + } + + return selectionsAfter; + } + + private static _arrayIsEmpty(commands: editorCommon.ICommand[]): boolean { + for (let i = 0, len = commands.length; i < len; i++) { + if (commands[i]) { + return false; + } + } + return true; + } + + private static _getEditOperations(ctx: IExecContext, commands: editorCommon.ICommand[]): ICommandsData { + let operations: editorCommon.IIdentifiedSingleEditOperation[] = []; + let hadTrackedEditOperation: boolean = false; + + for (let i = 0, len = commands.length; i < len; i++) { + if (commands[i]) { + const r = this._getEditOperationsFromCommand(ctx, i, commands[i]); + operations = operations.concat(r.operations); + hadTrackedEditOperation = hadTrackedEditOperation || r.hadTrackedEditOperation; + } + } + return { + operations: operations, + hadTrackedEditOperation: hadTrackedEditOperation + }; + } + + private static _getEditOperationsFromCommand(ctx: IExecContext, majorIdentifier: number, command: editorCommon.ICommand): ICommandData { + // This method acts as a transaction, if the command fails + // everything it has done is ignored + let operations: editorCommon.IIdentifiedSingleEditOperation[] = []; + let operationMinor = 0; + + const addEditOperation = (selection: Range, text: string) => { + if (selection.isEmpty() && text === '') { + // This command wants to add a no-op => no thank you + return; + } + operations.push({ + identifier: { + major: majorIdentifier, + minor: operationMinor++ + }, + range: selection, + text: text, + forceMoveMarkers: false, + isAutoWhitespaceEdit: command.insertsAutoWhitespace + }); + }; + + let hadTrackedEditOperation = false; + const addTrackedEditOperation = (selection: Range, text: string) => { + hadTrackedEditOperation = true; + addEditOperation(selection, text); + }; + + const trackSelection = (selection: Selection, trackPreviousOnEmpty?: boolean) => { + let selectionMarkerStickToPreviousCharacter: boolean; + let positionMarkerStickToPreviousCharacter: boolean; + + if (selection.isEmpty()) { + // Try to lock it with surrounding text + if (typeof trackPreviousOnEmpty === 'boolean') { + selectionMarkerStickToPreviousCharacter = trackPreviousOnEmpty; + positionMarkerStickToPreviousCharacter = trackPreviousOnEmpty; + } else { + const maxLineColumn = ctx.model.getLineMaxColumn(selection.startLineNumber); + if (selection.startColumn === maxLineColumn) { + selectionMarkerStickToPreviousCharacter = true; + positionMarkerStickToPreviousCharacter = true; + } else { + selectionMarkerStickToPreviousCharacter = false; + positionMarkerStickToPreviousCharacter = false; + } + } + } else { + if (selection.getDirection() === SelectionDirection.LTR) { + selectionMarkerStickToPreviousCharacter = false; + positionMarkerStickToPreviousCharacter = true; + } else { + selectionMarkerStickToPreviousCharacter = true; + positionMarkerStickToPreviousCharacter = false; + } + } + + const l = ctx.selectionStartMarkers.length; + ctx.selectionStartMarkers[l] = ctx.model._addMarker(0, selection.selectionStartLineNumber, selection.selectionStartColumn, selectionMarkerStickToPreviousCharacter); + ctx.positionMarkers[l] = ctx.model._addMarker(0, selection.positionLineNumber, selection.positionColumn, positionMarkerStickToPreviousCharacter); + return l.toString(); + }; + + const editOperationBuilder: editorCommon.IEditOperationBuilder = { + addEditOperation: addEditOperation, + addTrackedEditOperation: addTrackedEditOperation, + trackSelection: trackSelection + }; + + try { + command.getEditOperations(ctx.model, editOperationBuilder); + } catch (e) { + e.friendlyMessage = nls.localize('corrupt.commands', "Unexpected exception while executing command."); + onUnexpectedError(e); + return { + operations: [], + hadTrackedEditOperation: false + }; + } + + return { + operations: operations, + hadTrackedEditOperation: hadTrackedEditOperation + }; + } + + private static _getLoserCursorMap(operations: editorCommon.IIdentifiedSingleEditOperation[]): { [index: string]: boolean; } { + // This is destructive on the array + operations = operations.slice(0); + + // Sort operations with last one first + operations.sort((a: editorCommon.IIdentifiedSingleEditOperation, b: editorCommon.IIdentifiedSingleEditOperation): number => { + // Note the minus! + return -(Range.compareRangesUsingEnds(a.range, b.range)); + }); + + // Operations can not overlap! + let loserCursorsMap: { [index: string]: boolean; } = {}; + + for (let i = 1; i < operations.length; i++) { + const previousOp = operations[i - 1]; + const currentOp = operations[i]; + + if (previousOp.range.getStartPosition().isBefore(currentOp.range.getEndPosition())) { + + let loserMajor: number; + + if (previousOp.identifier.major > currentOp.identifier.major) { + // previousOp loses the battle + loserMajor = previousOp.identifier.major; + } else { + loserMajor = currentOp.identifier.major; + } + + loserCursorsMap[loserMajor.toString()] = true; + + for (let j = 0; j < operations.length; j++) { + if (operations[j].identifier.major === loserMajor) { + operations.splice(j, 1); + if (j < i) { + i--; + } + j--; + } + } + + if (i > 0) { + i--; + } + } + } + + return loserCursorsMap; + } +} From 12738e3e0df09d79f5011a51a65cfc22af4fb74e Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 18 May 2017 21:09:38 +0200 Subject: [PATCH 0638/1164] Clarify editor API --- src/vs/editor/common/commonCodeEditor.ts | 17 ++-- src/vs/editor/common/controller/cursor.ts | 83 +++++++------------ .../editor/common/controller/cursorCommon.ts | 9 +- src/vs/editor/common/editorCommon.ts | 2 + src/vs/editor/common/model/textModelEvents.ts | 10 +++ .../caretOperations/common/caretOperations.ts | 2 + .../caretOperations/common/transpose.ts | 2 + .../editor/contrib/comment/common/comment.ts | 4 + src/vs/editor/contrib/dnd/browser/dnd.ts | 2 + .../editor/contrib/find/common/findModel.ts | 2 + .../contrib/format/common/formatCommand.ts | 2 + .../inPlaceReplace/common/inPlaceReplace.ts | 3 + .../contrib/indentation/common/indentation.ts | 8 ++ .../linesOperations/common/linesOperations.ts | 14 ++++ .../wordOperations/common/wordOperations.ts | 2 + src/vs/monaco.d.ts | 2 + 16 files changed, 99 insertions(+), 65 deletions(-) diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index d698e6a2f0c..2fef9136e64 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -698,16 +698,8 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo return this.cursor; } - public executeCommand(source: string, command: editorCommon.ICommand): void { - if (!this.cursor) { - return; - } - this.cursor.trigger(source, editorCommon.Handler.ExecuteCommand, command); - } - public pushUndoStop(): boolean { - if (!this.cursor) { - // no view, no cursor + if (!this.model) { return false; } if (this._configuration.editor.readOnly) { @@ -739,6 +731,13 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo return true; } + public executeCommand(source: string, command: editorCommon.ICommand): void { + if (!this.cursor) { + return; + } + this.cursor.trigger(source, editorCommon.Handler.ExecuteCommand, command); + } + public executeCommands(source: string, commands: editorCommon.ICommand[]): void { if (!this.cursor) { return; diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 3c35af418f3..aec77790274 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -59,10 +59,9 @@ export class Cursor extends Disposable implements ICursors { private readonly _configuration: editorCommon.IConfiguration; private readonly _model: editorCommon.IModel; private readonly _viewModelHelper: IViewModelHelper; - public context: CursorContext; - private _cursors: CursorCollection; + private _isHandling: boolean; private _isDoingComposition: boolean; private _columnSelectData: IColumnSelectData; @@ -77,31 +76,16 @@ export class Cursor extends Disposable implements ICursors { this._configuration = configuration; this._model = model; this._viewModelHelper = viewModelHelper; - - const createCursorContext = () => { - const config = new CursorConfiguration( - this._model.getLanguageIdentifier(), - this._model.getOneIndent(), - this._model.getOptions(), - this._configuration - ); - this.context = new CursorContext( - this._model, - this._viewModelHelper, - config - ); - if (this._cursors) { - this._cursors.updateContext(this.context); - } - }; - createCursorContext(); - + this.context = new CursorContext(this._configuration, this._model, this._viewModelHelper); this._cursors = new CursorCollection(this.context); this._isHandling = false; this._isDoingComposition = false; this._columnSelectData = null; + this._handlers = {}; + this._registerHandlers(); + this._register(this._model.addBulkListener((events) => { if (this._isHandling) { return; @@ -115,14 +99,8 @@ export class Cursor extends Disposable implements ICursors { if (eventType === TextModelEventType.ModelRawContentChanged2) { hadContentChange = true; - const changeEvent = event.data; - - for (let j = 0, lenJ = changeEvent.changes.length; j < lenJ; j++) { - const change = changeEvent.changes[j]; - if (change.changeType === RawContentChangedType.Flush) { - hadFlushEvent = true; - } - } + const rawChangeEvent = event.data; + hadFlushEvent = hadFlushEvent || rawChangeEvent.containsEvent(RawContentChangedType.Flush); } } @@ -133,29 +111,29 @@ export class Cursor extends Disposable implements ICursors { this._onModelContentChanged(hadFlushEvent); })); + const updateCursorContext = () => { + this.context = new CursorContext(this._configuration, this._model, this._viewModelHelper); + this._cursors.updateContext(this.context); + }; this._register(this._model.onDidChangeLanguage((e) => { - createCursorContext(); + updateCursorContext(); })); this._register(LanguageConfigurationRegistry.onDidChange(() => { // TODO@Alex: react only if certain supports changed? (and if my model's mode changed) - createCursorContext(); + updateCursorContext(); })); this._register(model.onDidChangeOptions(() => { - createCursorContext(); + updateCursorContext(); })); this._register(this._configuration.onDidChange((e) => { if (CursorConfiguration.shouldRecreate(e)) { - createCursorContext(); + updateCursorContext(); } })); - - this._handlers = {}; - this._registerHandlers(); } public dispose(): void { this._cursors.dispose(); - this._cursors = null; super.dispose(); } @@ -203,8 +181,8 @@ export class Cursor extends Disposable implements ICursors { } if (somethingChanged) { - this.emitCursorPositionChanged(source, reason); - this.emitCursorSelectionChanged(source, reason); + this._emitCursorPositionChanged(source, reason); + this._emitCursorSelectionChanged(source, reason); } } @@ -295,16 +273,13 @@ export class Cursor extends Disposable implements ICursors { if (hadFlushEvent) { // a model.setValue() was called this._cursors.dispose(); - this._cursors = new CursorCollection(this.context); - this.emitCursorPositionChanged('model', CursorChangeReason.ContentFlush); - this.emitCursorSelectionChanged('model', CursorChangeReason.ContentFlush); + this._emitCursorPositionChanged('model', CursorChangeReason.ContentFlush); + this._emitCursorSelectionChanged('model', CursorChangeReason.ContentFlush); } else { - if (!this._isHandling) { - const selectionsFromMarkers = this._cursors.readSelectionFromMarkers(); - this.setStates('modelChange', CursorChangeReason.RecoverFromMarkers, CursorState.fromModelSelections(selectionsFromMarkers)); - } + const selectionsFromMarkers = this._cursors.readSelectionFromMarkers(); + this.setStates('modelChange', CursorChangeReason.RecoverFromMarkers, CursorState.fromModelSelections(selectionsFromMarkers)); } } @@ -392,9 +367,9 @@ export class Cursor extends Disposable implements ICursors { } if (somethingChanged) { - this.emitCursorPositionChanged(args.eventSource, cursorPositionChangeReason); + this._emitCursorPositionChanged(args.eventSource, cursorPositionChangeReason); this._revealRange(RevealTarget.Primary, VerticalRevealType.Simple, true); - this.emitCursorSelectionChanged(args.eventSource, cursorPositionChangeReason); + this._emitCursorSelectionChanged(args.eventSource, cursorPositionChangeReason); } } catch (err) { @@ -415,7 +390,7 @@ export class Cursor extends Disposable implements ICursors { // ----------------------------------------------------------------------------------------------------------- // ----- emitting events - private emitCursorPositionChanged(source: string, reason: CursorChangeReason): void { + private _emitCursorPositionChanged(source: string, reason: CursorChangeReason): void { const positions = this._cursors.getPositions(); const primaryPosition = positions[0]; const secondaryPositions = positions.slice(1); @@ -443,7 +418,7 @@ export class Cursor extends Disposable implements ICursors { this._eventEmitter.emit(CursorEventType.CursorPositionChanged, e); } - private emitCursorSelectionChanged(source: string, reason: CursorChangeReason): void { + private _emitCursorSelectionChanged(source: string, reason: CursorChangeReason): void { const selections = this._cursors.getSelections(); const primarySelection = selections[0]; const secondarySelections = selections.slice(1); @@ -729,8 +704,8 @@ export class Cursor extends Disposable implements ICursors { this._cursors.killSecondaryCursors(); return new EditOperationResult([command], { - shouldPushStackElementBefore: true, - shouldPushStackElementAfter: true + shouldPushStackElementBefore: false, + shouldPushStackElementAfter: false }); } @@ -738,8 +713,8 @@ export class Cursor extends Disposable implements ICursors { const commands = args.eventData; return new EditOperationResult(commands, { - shouldPushStackElementBefore: true, - shouldPushStackElementAfter: true + shouldPushStackElementBefore: false, + shouldPushStackElementAfter: false }); } } diff --git a/src/vs/editor/common/controller/cursorCommon.ts b/src/vs/editor/common/controller/cursorCommon.ts index 8c37d25a581..8684392bd95 100644 --- a/src/vs/editor/common/controller/cursorCommon.ts +++ b/src/vs/editor/common/controller/cursorCommon.ts @@ -284,10 +284,15 @@ export class CursorContext { private readonly _viewModelHelper: IViewModelHelper; private readonly _coordinatesConverter: ICoordinatesConverter; - constructor(model: IModel, viewModelHelper: IViewModelHelper, config: CursorConfiguration) { + constructor(configuration: IConfiguration, model: IModel, viewModelHelper: IViewModelHelper) { this.model = model; this.viewModel = viewModelHelper.viewModel; - this.config = config; + this.config = new CursorConfiguration( + this.model.getLanguageIdentifier(), + this.model.getOneIndent(), + this.model.getOptions(), + configuration + );; this._viewModelHelper = viewModelHelper; this._coordinatesConverter = viewModelHelper.coordinatesConverter; } diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index b5c1bba3a0a..268c48f5d11 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -1886,6 +1886,7 @@ export interface ICommonCodeEditor extends IEditor { /** * Execute a command on the editor. + * The edits will land on the undo-redo stack, but no "undo stop" will be pushed. * @param source The source of the call. * @param command The command to execute */ @@ -1898,6 +1899,7 @@ export interface ICommonCodeEditor extends IEditor { /** * Execute edits on the editor. + * The edits will land on the undo-redo stack, but no "undo stop" will be pushed. * @param source The source of the call. * @param edits The edits to execute. * @param endCursoState Cursor state after the edits were applied. diff --git a/src/vs/editor/common/model/textModelEvents.ts b/src/vs/editor/common/model/textModelEvents.ts index 53103be6e27..890dd25df46 100644 --- a/src/vs/editor/common/model/textModelEvents.ts +++ b/src/vs/editor/common/model/textModelEvents.ts @@ -243,4 +243,14 @@ export class ModelRawContentChangedEvent { this.isUndoing = isUndoing; this.isRedoing = isRedoing; } + + public containsEvent(type: RawContentChangedType): boolean { + for (let i = 0, len = this.changes.length; i < len; i++) { + const change = this.changes[i]; + if (change.changeType === type) { + return true; + } + } + return false; + } } diff --git a/src/vs/editor/contrib/caretOperations/common/caretOperations.ts b/src/vs/editor/contrib/caretOperations/common/caretOperations.ts index aec00037cb5..96e935bd69d 100644 --- a/src/vs/editor/contrib/caretOperations/common/caretOperations.ts +++ b/src/vs/editor/contrib/caretOperations/common/caretOperations.ts @@ -29,7 +29,9 @@ class MoveCaretAction extends EditorAction { commands.push(new MoveCaretCommand(selections[i], this.left)); } + editor.pushUndoStop(); editor.executeCommands(this.id, commands); + editor.pushUndoStop(); } } diff --git a/src/vs/editor/contrib/caretOperations/common/transpose.ts b/src/vs/editor/contrib/caretOperations/common/transpose.ts index fbb87805856..5ca66ce287d 100644 --- a/src/vs/editor/contrib/caretOperations/common/transpose.ts +++ b/src/vs/editor/contrib/caretOperations/common/transpose.ts @@ -63,7 +63,9 @@ class TransposeLettersAction extends EditorAction { } if (commands.length > 0) { + editor.pushUndoStop(); editor.executeCommands(this.id, commands); + editor.pushUndoStop(); } } } diff --git a/src/vs/editor/contrib/comment/common/comment.ts b/src/vs/editor/contrib/comment/common/comment.ts index 570d96b7cbb..898e1aa89d0 100644 --- a/src/vs/editor/contrib/comment/common/comment.ts +++ b/src/vs/editor/contrib/comment/common/comment.ts @@ -35,7 +35,9 @@ abstract class CommentLineAction extends EditorAction { commands.push(new LineCommentCommand(selections[i], opts.tabSize, this._type)); } + editor.pushUndoStop(); editor.executeCommands(this.id, commands); + editor.pushUndoStop(); } } @@ -113,6 +115,8 @@ class BlockCommentAction extends EditorAction { commands.push(new BlockCommentCommand(selections[i])); } + editor.pushUndoStop(); editor.executeCommands(this.id, commands); + editor.pushUndoStop(); } } diff --git a/src/vs/editor/contrib/dnd/browser/dnd.ts b/src/vs/editor/contrib/dnd/browser/dnd.ts index cca6986ce33..49a944af722 100644 --- a/src/vs/editor/contrib/dnd/browser/dnd.ts +++ b/src/vs/editor/contrib/dnd/browser/dnd.ts @@ -146,7 +146,9 @@ export class DragAndDropController implements editorCommon.IEditorContribution { this._dragSelection.getEndPosition().equals(newCursorPosition) || this._dragSelection.getStartPosition().equals(newCursorPosition) ) // we allow users to paste content beside the selection )) { + this._editor.pushUndoStop(); this._editor.executeCommand(DragAndDropController.ID, new DragAndDropCommand(this._dragSelection, newCursorPosition, mouseEvent.event[DragAndDropController.TRIGGER_MODIFIER] || this._modiferPressed)); + this._editor.pushUndoStop(); } } diff --git a/src/vs/editor/contrib/find/common/findModel.ts b/src/vs/editor/contrib/find/common/findModel.ts index faa2f4ff924..02ccc8f4ea5 100644 --- a/src/vs/editor/contrib/find/common/findModel.ts +++ b/src/vs/editor/contrib/find/common/findModel.ts @@ -468,7 +468,9 @@ export class FindModelBoundToEditorModel { private _executeEditorCommand(source: string, command: editorCommon.ICommand): void { try { this._ignoreModelContentChanged = true; + this._editor.pushUndoStop(); this._editor.executeCommand(source, command); + this._editor.pushUndoStop(); } finally { this._ignoreModelContentChanged = false; } diff --git a/src/vs/editor/contrib/format/common/formatCommand.ts b/src/vs/editor/contrib/format/common/formatCommand.ts index dcf612c8d33..8a77bff13e3 100644 --- a/src/vs/editor/contrib/format/common/formatCommand.ts +++ b/src/vs/editor/contrib/format/common/formatCommand.ts @@ -17,7 +17,9 @@ export class EditOperationsCommand implements editorCommon.ICommand { if (typeof cmd._newEol === 'number') { editor.getModel().setEOL(cmd._newEol); } + editor.pushUndoStop(); editor.executeCommand('formatEditsCommand', cmd); + editor.pushUndoStop(); } private _edits: TextEdit[]; diff --git a/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.ts b/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.ts index 8f8548bbc00..773b69e156e 100644 --- a/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.ts +++ b/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.ts @@ -112,7 +112,10 @@ class InPlaceReplaceController implements IEditorContribution { // Insert new text var command = new InPlaceReplaceCommand(editRange, selection, result.value); + + this.editor.pushUndoStop(); this.editor.executeCommand(source, command); + this.editor.pushUndoStop(); // add decoration this.decorationIds = this.editor.deltaDecorations(this.decorationIds, [{ diff --git a/src/vs/editor/contrib/indentation/common/indentation.ts b/src/vs/editor/contrib/indentation/common/indentation.ts index 44d1a1bdac3..7fb494c770d 100644 --- a/src/vs/editor/contrib/indentation/common/indentation.ts +++ b/src/vs/editor/contrib/indentation/common/indentation.ts @@ -164,7 +164,11 @@ export class IndentationToSpacesAction extends EditorAction { } let modelOpts = model.getOptions(); const command = new IndentationToSpacesCommand(editor.getSelection(), modelOpts.tabSize); + + editor.pushUndoStop(); editor.executeCommands(this.id, [command]); + editor.pushUndoStop(); + model.updateOptions({ insertSpaces: true }); @@ -191,7 +195,11 @@ export class IndentationToTabsAction extends EditorAction { } let modelOpts = model.getOptions(); const command = new IndentationToTabsCommand(editor.getSelection(), modelOpts.tabSize); + + editor.pushUndoStop(); editor.executeCommands(this.id, [command]); + editor.pushUndoStop(); + model.updateOptions({ insertSpaces: false }); diff --git a/src/vs/editor/contrib/linesOperations/common/linesOperations.ts b/src/vs/editor/contrib/linesOperations/common/linesOperations.ts index 54255479f30..59acf7fcd23 100644 --- a/src/vs/editor/contrib/linesOperations/common/linesOperations.ts +++ b/src/vs/editor/contrib/linesOperations/common/linesOperations.ts @@ -39,7 +39,9 @@ abstract class AbstractCopyLinesAction extends EditorAction { commands.push(new CopyLinesCommand(selections[i], this.down)); } + editor.pushUndoStop(); editor.executeCommands(this.id, commands); + editor.pushUndoStop(); } } @@ -97,7 +99,9 @@ abstract class AbstractMoveLinesAction extends EditorAction { commands.push(new MoveLinesCommand(selections[i], this.down)); } + editor.pushUndoStop(); editor.executeCommands(this.id, commands); + editor.pushUndoStop(); } } @@ -151,7 +155,9 @@ abstract class AbstractSortLinesAction extends EditorAction { var command = new SortLinesCommand(editor.getSelection(), this.descending); + editor.pushUndoStop(); editor.executeCommands(this.id, [command]); + editor.pushUndoStop(); } } @@ -201,7 +207,9 @@ export class TrimTrailingWhitespaceAction extends EditorAction { var command = new TrimTrailingWhitespaceCommand(editor.getSelection()); + editor.pushUndoStop(); editor.executeCommands(this.id, [command]); + editor.pushUndoStop(); } } @@ -280,7 +288,9 @@ class DeleteLinesAction extends AbstractRemoveLinesAction { return new DeleteLinesCommand(op.startLineNumber, op.endLineNumber, op.positionColumn); }); + editor.pushUndoStop(); editor.executeCommands(this.id, commands); + editor.pushUndoStop(); } } @@ -694,7 +704,9 @@ export class TransposeAction extends EditorAction { } } + editor.pushUndoStop(); editor.executeCommands(this.id, commands); + editor.pushUndoStop(); } } @@ -725,7 +737,9 @@ export abstract class AbstractCaseAction extends EditorAction { } } + editor.pushUndoStop(); editor.executeCommands(this.id, commands); + editor.pushUndoStop(); } protected abstract _modifyText(text: string): string; diff --git a/src/vs/editor/contrib/wordOperations/common/wordOperations.ts b/src/vs/editor/contrib/wordOperations/common/wordOperations.ts index 0b1d96ee992..b4b6a410f9d 100644 --- a/src/vs/editor/contrib/wordOperations/common/wordOperations.ts +++ b/src/vs/editor/contrib/wordOperations/common/wordOperations.ts @@ -275,7 +275,9 @@ export abstract class DeleteWordCommand extends EditorCommand { return new ReplaceCommand(deleteRange, ''); }); + editor.pushUndoStop(); editor.executeCommands(this.id, commands); + editor.pushUndoStop(); } protected abstract _delete(wordSeparators: WordCharacterClassifier, model: IModel, selection: Selection, whitespaceHeuristics: boolean, wordNavigationType: WordNavigationType): Range; diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 140e5d7e7ae..334b54b64b1 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -2294,6 +2294,7 @@ declare module monaco.editor { getAction(id: string): IEditorAction; /** * Execute a command on the editor. + * The edits will land on the undo-redo stack, but no "undo stop" will be pushed. * @param source The source of the call. * @param command The command to execute */ @@ -2304,6 +2305,7 @@ declare module monaco.editor { pushUndoStop(): boolean; /** * Execute edits on the editor. + * The edits will land on the undo-redo stack, but no "undo stop" will be pushed. * @param source The source of the call. * @param edits The edits to execute. * @param endCursoState Cursor state after the edits were applied. From 5a40238c40874c2ab3711e0cf5bbb2d71574b015 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 18 May 2017 21:46:23 +0200 Subject: [PATCH 0639/1164] Move LineInsertBefore out of the cursor --- src/vs/editor/browser/editor.all.ts | 1 + src/vs/editor/common/commonCodeEditor.ts | 6 ++- .../editor/common/controller/coreCommands.ts | 5 +- src/vs/editor/common/controller/cursor.ts | 5 -- .../common/controller/cursorTypeOperations.ts | 9 ++-- src/vs/editor/common/core/selection.ts | 9 +++- src/vs/editor/common/editorCommon.ts | 8 +++- .../linesOperations/common/linesOperations.ts | 9 +++- .../test/common/linesOperations.test.ts | 47 ++++++++++++++++++- .../test/common/controller/cursor.test.ts | 42 ----------------- src/vs/monaco.d.ts | 4 ++ 11 files changed, 83 insertions(+), 62 deletions(-) diff --git a/src/vs/editor/browser/editor.all.ts b/src/vs/editor/browser/editor.all.ts index 19ead3cbcaf..cd56e43c2fa 100644 --- a/src/vs/editor/browser/editor.all.ts +++ b/src/vs/editor/browser/editor.all.ts @@ -5,6 +5,7 @@ 'use strict'; +import 'vs/editor/common/controller/coreCommands'; import 'vs/editor/browser/widget/codeEditorWidget'; import 'vs/editor/browser/widget/diffEditorWidget'; diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index 2fef9136e64..3c8ecce71b1 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -13,7 +13,7 @@ import { ServiceCollection } from 'vs/platform/instantiation/common/serviceColle import { IContextKey, IContextKeyServiceTarget, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { CommonEditorConfiguration } from 'vs/editor/common/config/commonEditorConfig'; import { Cursor } from 'vs/editor/common/controller/cursor'; -import { CursorColumns, IViewModelHelper, ICursors } from 'vs/editor/common/controller/cursorCommon'; +import { CursorColumns, IViewModelHelper, ICursors, CursorConfiguration } from 'vs/editor/common/controller/cursorCommon'; import { Position, IPosition } from 'vs/editor/common/core/position'; import { Range, IRange } from 'vs/editor/common/core/range'; import { Selection, ISelection } from 'vs/editor/common/core/selection'; @@ -698,6 +698,10 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo return this.cursor; } + public _getCursorConfiguration(): CursorConfiguration { + return this.cursor.context.config; + } + public pushUndoStop(): boolean { if (!this.model) { return false; diff --git a/src/vs/editor/common/controller/coreCommands.ts b/src/vs/editor/common/controller/coreCommands.ts index 6ad405c37a1..ae8a6e85e1a 100644 --- a/src/vs/editor/common/controller/coreCommands.ts +++ b/src/vs/editor/common/controller/coreCommands.ts @@ -1395,7 +1395,10 @@ export namespace CoreNavigationCommands { ); } }); -}; +} + +export namespace CoreEditingCommands { +} namespace Config { diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index aec77790274..42b712abd33 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -504,7 +504,6 @@ export class Cursor extends Disposable implements ICursors { private _registerHandlers(): void { let H = editorCommon.Handler; - this._handlers[H.LineInsertBefore] = (args) => this._lineInsertBefore(args); this._handlers[H.LineInsertAfter] = (args) => this._lineInsertAfter(args); this._handlers[H.LineBreakInsert] = (args) => this._lineBreakInsert(args); @@ -559,10 +558,6 @@ export class Cursor extends Disposable implements ICursors { return r; } - private _lineInsertBefore(args: CursorOperationArgs): EditOperationResult { - return TypeOperations.lineInsertBefore(this.context.config, this.context.model, this._getAllCursorsModelState()); - } - private _lineInsertAfter(args: CursorOperationArgs): EditOperationResult { return TypeOperations.lineInsertAfter(this.context.config, this.context.model, this._getAllCursorsModelState()); } diff --git a/src/vs/editor/common/controller/cursorTypeOperations.ts b/src/vs/editor/common/controller/cursorTypeOperations.ts index b231d46d1e4..7d9346cf06d 100644 --- a/src/vs/editor/common/controller/cursorTypeOperations.ts +++ b/src/vs/editor/common/controller/cursorTypeOperations.ts @@ -582,11 +582,11 @@ export class TypeOperations { }); } - public static lineInsertBefore(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[]): EditOperationResult { + public static lineInsertBefore(config: CursorConfiguration, model: ITokenizedModel, cursors: Selection[]): ICommand[] { let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; - let lineNumber = cursor.position.lineNumber; + let lineNumber = cursor.positionLineNumber; if (lineNumber === 1) { commands[i] = new ReplaceCommandWithoutChangingPosition(new Range(1, 1, 1, 1), '\n'); @@ -597,10 +597,7 @@ export class TypeOperations { commands[i] = this._enter(config, model, false, new Range(lineNumber, column, lineNumber, column)); } } - return new EditOperationResult(commands, { - shouldPushStackElementBefore: true, - shouldPushStackElementAfter: false, - }); + return commands; } public static lineInsertAfter(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[]): EditOperationResult { diff --git a/src/vs/editor/common/core/selection.ts b/src/vs/editor/common/core/selection.ts index 21f2066d982..10705ad4fe8 100644 --- a/src/vs/editor/common/core/selection.ts +++ b/src/vs/editor/common/core/selection.ts @@ -5,7 +5,7 @@ 'use strict'; import { Range } from 'vs/editor/common/core/range'; -import { IPosition } from 'vs/editor/common/core/position'; +import { Position, IPosition } from 'vs/editor/common/core/position'; /** * A selection in the editor. @@ -129,6 +129,13 @@ export class Selection extends Range { return new Selection(endLineNumber, endColumn, this.startLineNumber, this.startColumn); } + /** + * Get the position at `positionLineNumber` and `positionColumn`. + */ + public getPosition(): Position { + return new Position(this.positionLineNumber, this.positionColumn); + } + /** * Create a new selection with a different `selectionStartLineNumber` and `selectionStartColumn`. */ diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index 268c48f5d11..bca8965eafb 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -23,7 +23,7 @@ import { } from 'vs/editor/common/model/textModelEvents'; import * as editorOptions from 'vs/editor/common/config/editorOptions'; import { ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; -import { ICursors } from 'vs/editor/common/controller/cursorCommon'; +import { ICursors, CursorConfiguration } from 'vs/editor/common/controller/cursorCommon'; /** * Vertical Lane in the overview ruler of the editor. @@ -1918,6 +1918,11 @@ export interface ICommonCodeEditor extends IEditor { */ _getCursors(): ICursors; + /** + * @internal + */ + _getCursorConfiguration(): CursorConfiguration; + /** * Get all the decorations on a line (filtering out decorations from other editors). */ @@ -2078,7 +2083,6 @@ export var Handler = { Undo: 'undo', Redo: 'redo', - LineInsertBefore: 'lineInsertBefore', LineInsertAfter: 'lineInsertAfter', LineBreakInsert: 'lineBreakInsert', }; diff --git a/src/vs/editor/contrib/linesOperations/common/linesOperations.ts b/src/vs/editor/contrib/linesOperations/common/linesOperations.ts index 59acf7fcd23..0cb23b50393 100644 --- a/src/vs/editor/contrib/linesOperations/common/linesOperations.ts +++ b/src/vs/editor/contrib/linesOperations/common/linesOperations.ts @@ -18,6 +18,7 @@ import { editorAction, ServicesAccessor, IActionOptions, EditorAction, HandlerEd import { CopyLinesCommand } from './copyLinesCommand'; import { DeleteLinesCommand } from './deleteLinesCommand'; import { MoveLinesCommand } from './moveLinesCommand'; +import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations'; // copy lines @@ -329,20 +330,24 @@ class OutdentLinesAction extends HandlerEditorAction { } @editorAction -class InsertLineBeforeAction extends HandlerEditorAction { +export class InsertLineBeforeAction extends EditorAction { constructor() { super({ id: 'editor.action.insertLineBefore', label: nls.localize('lines.insertBefore', "Insert Line Above"), alias: 'Insert Line Above', precondition: EditorContextKeys.writable, - handlerId: Handler.LineInsertBefore, kbOpts: { kbExpr: EditorContextKeys.textFocus, primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.Enter } }); } + + public run(accessor: ServicesAccessor, editor: ICommonCodeEditor): void { + editor.pushUndoStop(); + editor.executeCommands(this.id, TypeOperations.lineInsertBefore(editor._getCursorConfiguration(), editor.getModel(), editor.getSelections())); + } } @editorAction diff --git a/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts b/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts index 0239d6ee087..f32dd7ee822 100644 --- a/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts +++ b/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts @@ -6,9 +6,11 @@ import * as assert from 'assert'; import { Selection } from 'vs/editor/common/core/selection'; -import { Handler } from 'vs/editor/common/editorCommon'; +import { Position } from 'vs/editor/common/core/position'; +import { Handler, IModel } from 'vs/editor/common/editorCommon'; import { withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; -import { DeleteAllLeftAction, JoinLinesAction, TransposeAction, UpperCaseAction, LowerCaseAction, DeleteAllRightAction } from 'vs/editor/contrib/linesOperations/common/linesOperations'; +import { DeleteAllLeftAction, JoinLinesAction, TransposeAction, UpperCaseAction, LowerCaseAction, DeleteAllRightAction, InsertLineBeforeAction } from 'vs/editor/contrib/linesOperations/common/linesOperations'; +import { Cursor } from "vs/editor/common/controller/cursor"; suite('Editor Contrib - Line Operations', () => { suite('DeleteAllLeftAction', () => { @@ -488,4 +490,45 @@ suite('Editor Contrib - Line Operations', () => { }); }); }); + + test('InsertLineBeforeAction', function () { + function testInsertLineBefore(lineNumber: number, column: number, callback: (model: IModel, cursor: Cursor) => void): void { + const TEXT = [ + 'First line', + 'Second line', + 'Third line' + ]; + withMockCodeEditor(TEXT, {}, (editor, cursor) => { + editor.setPosition(new Position(lineNumber, column)); + let insertLineBeforeAction = new InsertLineBeforeAction(); + + insertLineBeforeAction.run(null, editor); + callback(editor.getModel(), cursor); + }); + } + + testInsertLineBefore(1, 3, (model, cursor) => { + assert.deepEqual(cursor.getSelection(), new Selection(1, 1, 1, 1)); + assert.equal(model.getLineContent(1), ''); + assert.equal(model.getLineContent(2), 'First line'); + assert.equal(model.getLineContent(3), 'Second line'); + assert.equal(model.getLineContent(4), 'Third line'); + }); + + testInsertLineBefore(2, 3, (model, cursor) => { + assert.deepEqual(cursor.getSelection(), new Selection(2, 1, 2, 1)); + assert.equal(model.getLineContent(1), 'First line'); + assert.equal(model.getLineContent(2), ''); + assert.equal(model.getLineContent(3), 'Second line'); + assert.equal(model.getLineContent(4), 'Third line'); + }); + + testInsertLineBefore(3, 3, (model, cursor) => { + assert.deepEqual(cursor.getSelection(), new Selection(3, 1, 3, 1)); + assert.equal(model.getLineContent(1), 'First line'); + assert.equal(model.getLineContent(2), 'Second line'); + assert.equal(model.getLineContent(3), ''); + assert.equal(model.getLineContent(4), 'Third line'); + }); + }); }); \ No newline at end of file diff --git a/src/vs/editor/test/common/controller/cursor.test.ts b/src/vs/editor/test/common/controller/cursor.test.ts index 134f327f9bf..8a505460120 100644 --- a/src/vs/editor/test/common/controller/cursor.test.ts +++ b/src/vs/editor/test/common/controller/cursor.test.ts @@ -1930,48 +1930,6 @@ suite('Editor Controller - Cursor Configuration', () => { mode.dispose(); }); - test('Insert line before', () => { - let testInsertLineBefore = (lineNumber: number, column: number, callback: (model: Model, cursor: Cursor) => void) => { - usingCursor({ - text: [ - 'First line', - 'Second line', - 'Third line' - ], - }, (model, cursor) => { - moveTo(cursor, lineNumber, column, false); - assertCursor(cursor, new Position(lineNumber, column)); - - cursorCommand(cursor, H.LineInsertBefore, null, 'keyboard'); - callback(model, cursor); - }); - }; - - testInsertLineBefore(1, 3, (model, cursor) => { - assertCursor(cursor, new Selection(1, 1, 1, 1)); - assert.equal(model.getLineContent(1), ''); - assert.equal(model.getLineContent(2), 'First line'); - assert.equal(model.getLineContent(3), 'Second line'); - assert.equal(model.getLineContent(4), 'Third line'); - }); - - testInsertLineBefore(2, 3, (model, cursor) => { - assertCursor(cursor, new Selection(2, 1, 2, 1)); - assert.equal(model.getLineContent(1), 'First line'); - assert.equal(model.getLineContent(2), ''); - assert.equal(model.getLineContent(3), 'Second line'); - assert.equal(model.getLineContent(4), 'Third line'); - }); - - testInsertLineBefore(3, 3, (model, cursor) => { - assertCursor(cursor, new Selection(3, 1, 3, 1)); - assert.equal(model.getLineContent(1), 'First line'); - assert.equal(model.getLineContent(2), 'Second line'); - assert.equal(model.getLineContent(3), ''); - assert.equal(model.getLineContent(4), 'Third line'); - }); - }); - test('Insert line after', () => { let testInsertLineAfter = (lineNumber: number, column: number, callback: (model: Model, cursor: Cursor) => void) => { usingCursor({ diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 334b54b64b1..e12595a783f 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -724,6 +724,10 @@ declare module monaco { * Create a new selection with a different `positionLineNumber` and `positionColumn`. */ setEndPosition(endLineNumber: number, endColumn: number): Selection; + /** + * Get the position at `positionLineNumber` and `positionColumn`. + */ + getPosition(): Position; /** * Create a new selection with a different `selectionStartLineNumber` and `selectionStartColumn`. */ From cc38e4eabb6e0cdaf33e8ba56b84ca50902a8099 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 00:19:54 +0200 Subject: [PATCH 0640/1164] Move more editing operations out of cursor.ts --- src/vs/editor/common/commonCodeEditor.ts | 28 +- .../editor/common/controller/coreCommands.ts | 194 ++++--- src/vs/editor/common/controller/cursor.ts | 38 +- .../controller/cursorDeleteOperations.ts | 39 +- .../common/controller/cursorTypeOperations.ts | 50 +- src/vs/editor/common/editorCommon.ts | 10 - .../editor/common/editorCommonExtensions.ts | 16 - .../linesOperations/common/linesOperations.ts | 29 +- .../test/common/linesOperations.test.ts | 79 ++- .../test/common/controller/cursor.test.ts | 510 ++++++++++-------- .../debugEditorContribution.ts | 5 +- .../actions/expandAbbreviation.ts | 5 +- .../emmet/electron-browser/editorAccessor.ts | 5 +- 13 files changed, 553 insertions(+), 455 deletions(-) diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index 3c8ecce71b1..1f652adcaf2 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -29,6 +29,7 @@ import * as editorOptions from 'vs/editor/common/config/editorOptions'; import { CursorEventType, ICursorPositionChangedEvent, VerticalRevealType, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ViewModelCursors } from "vs/editor/common/viewModel/viewModelCursors"; +import { CommonEditorRegistry } from "vs/editor/common/editorCommonExtensions"; let EDITOR_ID = 0; @@ -667,6 +668,7 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo return; } + // Special case for pasting if (handlerId === editorCommon.Handler.Paste) { if (!this.cursor || typeof payload.text !== 'string' || payload.text.length === 0) { // nothing to do @@ -683,15 +685,25 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo return; } - let candidate = this.getAction(handlerId); - if (candidate !== null) { - TPromise.as(candidate.run()).done(null, onUnexpectedError); - } else { - if (!this.cursor) { - return; - } - this.cursor.trigger(source, handlerId, payload); + const action = this.getAction(handlerId); + if (action) { + TPromise.as(action.run()).done(null, onUnexpectedError); + return; } + + if (!this.cursor) { + return; + } + + const command = CommonEditorRegistry.getEditorCommand(handlerId); + if (command) { + payload = payload || {}; + payload.source = source; + TPromise.as(command.runEditorCommand(null, this, payload)).done(null, onUnexpectedError); + return; + } + + this.cursor.trigger(source, handlerId, payload); } public _getCursors(): ICursors { diff --git a/src/vs/editor/common/controller/coreCommands.ts b/src/vs/editor/common/controller/coreCommands.ts index ae8a6e85e1a..3ca21fe60b7 100644 --- a/src/vs/editor/common/controller/coreCommands.ts +++ b/src/vs/editor/common/controller/coreCommands.ts @@ -24,6 +24,8 @@ import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import * as types from 'vs/base/common/types'; import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; import { IEditorService } from 'vs/platform/editor/common/editor'; +import { TypeOperations } from "vs/editor/common/controller/cursorTypeOperations"; +import { DeleteOperations } from "vs/editor/common/controller/cursorDeleteOperations"; const CORE_WEIGHT = KeybindingsRegistry.WEIGHT.editorCore(); @@ -1398,6 +1400,120 @@ export namespace CoreNavigationCommands { } export namespace CoreEditingCommands { + + export const LineBreakInsert: EditorCommand = registerEditorCommand(new class extends EditorCommand { + constructor() { + super({ + id: 'lineBreakInsert', + precondition: EditorContextKeys.writable, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textFocus, + primary: null, + mac: { primary: KeyMod.WinCtrl | KeyCode.KEY_O } + } + }); + } + + public runEditorCommand(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor, args: any): void { + editor.pushUndoStop(); + editor.executeCommands(this.id, TypeOperations.lineBreakInsert(editor._getCursorConfiguration(), editor.getModel(), editor.getSelections())); + } + }); + + export const Outdent: EditorCommand = registerEditorCommand(new class extends EditorCommand { + constructor() { + super({ + id: 'outdent', + precondition: EditorContextKeys.writable, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: ContextKeyExpr.and( + EditorContextKeys.textFocus, + EditorContextKeys.tabDoesNotMoveFocus + ), + primary: KeyMod.Shift | KeyCode.Tab + } + }); + } + + public runEditorCommand(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor, args: any): void { + editor.pushUndoStop(); + editor.executeCommands(this.id, TypeOperations.outdent(editor._getCursorConfiguration(), editor.getModel(), editor.getSelections())); + editor.pushUndoStop(); + } + }); + + export const Tab: EditorCommand = registerEditorCommand(new class extends EditorCommand { + constructor() { + super({ + id: 'tab', + precondition: EditorContextKeys.writable, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: ContextKeyExpr.and( + EditorContextKeys.textFocus, + EditorContextKeys.tabDoesNotMoveFocus + ), + primary: KeyCode.Tab + } + }); + } + + public runEditorCommand(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor, args: any): void { + editor.pushUndoStop(); + editor.executeCommands(this.id, TypeOperations.tab(editor._getCursorConfiguration(), editor.getModel(), editor.getSelections())); + editor.pushUndoStop(); + } + }); + + export const DeleteLeft: EditorCommand = registerEditorCommand(new class extends EditorCommand { + constructor() { + super({ + id: 'deleteLeft', + precondition: EditorContextKeys.writable, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textFocus, + primary: KeyCode.Backspace, + secondary: [KeyMod.Shift | KeyCode.Backspace], + mac: { primary: KeyCode.Backspace, secondary: [KeyMod.Shift | KeyCode.Backspace, KeyMod.WinCtrl | KeyCode.KEY_H, KeyMod.WinCtrl | KeyCode.Backspace] } + } + }); + } + + public runEditorCommand(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor, args: any): void { + const [shouldPushStackElementBefore, commands] = DeleteOperations.deleteLeft(editor._getCursorConfiguration(), editor.getModel(), editor.getSelections()); + if (shouldPushStackElementBefore) { + editor.pushUndoStop(); + } + editor.executeCommands(this.id, commands); + } + }); + + export const DeleteRight: EditorCommand = registerEditorCommand(new class extends EditorCommand { + constructor() { + super({ + id: 'deleteRight', + precondition: EditorContextKeys.writable, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textFocus, + primary: KeyCode.Delete, + mac: { primary: KeyCode.Delete, secondary: [KeyMod.WinCtrl | KeyCode.KEY_D, KeyMod.WinCtrl | KeyCode.Delete] } + } + }); + } + + public runEditorCommand(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor, args: any): void { + const [shouldPushStackElementBefore, commands] = DeleteOperations.deleteRight(editor._getCursorConfiguration(), editor.getModel(), editor.getSelections()); + if (shouldPushStackElementBefore) { + editor.pushUndoStop(); + } + editor.executeCommands(this.id, commands); + } + }); + } namespace Config { @@ -1412,88 +1528,10 @@ namespace Config { return getCodeEditor(activeEditor); } - function withCodeEditorFromCommandHandler(accessor: ServicesAccessor, callback: (editor: editorCommon.ICommonCodeEditor) => void): void { - let editor = findFocusedEditor(accessor); - if (editor) { - callback(editor); - } - } - - function triggerEditorHandler(handlerId: string, accessor: ServicesAccessor, args: any): void { - withCodeEditorFromCommandHandler(accessor, (editor) => { - editor.trigger('keyboard', handlerId, args); - }); - } - - class CoreCommand extends Command { - public runCommand(accessor: ServicesAccessor, args: any): void { - triggerEditorHandler(this.id, accessor, args); - } - } - function registerCommand(command: Command) { KeybindingsRegistry.registerCommandAndKeybindingRule(command.toCommandAndKeybindingRule(CORE_WEIGHT)); } - registerCommand(new CoreCommand({ - id: H.Tab, - precondition: EditorContextKeys.writable, - kbOpts: { - weight: CORE_WEIGHT, - kbExpr: ContextKeyExpr.and( - EditorContextKeys.textFocus, - EditorContextKeys.tabDoesNotMoveFocus - ), - primary: KeyCode.Tab - } - })); - registerCommand(new CoreCommand({ - id: H.Outdent, - precondition: EditorContextKeys.writable, - kbOpts: { - weight: CORE_WEIGHT, - kbExpr: ContextKeyExpr.and( - EditorContextKeys.textFocus, - EditorContextKeys.tabDoesNotMoveFocus - ), - primary: KeyMod.Shift | KeyCode.Tab - } - })); - - registerCommand(new CoreCommand({ - id: H.DeleteLeft, - precondition: EditorContextKeys.writable, - kbOpts: { - weight: CORE_WEIGHT, - kbExpr: EditorContextKeys.textFocus, - primary: KeyCode.Backspace, - secondary: [KeyMod.Shift | KeyCode.Backspace], - mac: { primary: KeyCode.Backspace, secondary: [KeyMod.Shift | KeyCode.Backspace, KeyMod.WinCtrl | KeyCode.KEY_H, KeyMod.WinCtrl | KeyCode.Backspace] } - } - })); - registerCommand(new CoreCommand({ - id: H.DeleteRight, - precondition: EditorContextKeys.writable, - kbOpts: { - weight: CORE_WEIGHT, - kbExpr: EditorContextKeys.textFocus, - primary: KeyCode.Delete, - mac: { primary: KeyCode.Delete, secondary: [KeyMod.WinCtrl | KeyCode.KEY_D, KeyMod.WinCtrl | KeyCode.Delete] } - } - })); - - registerCommand(new CoreCommand({ - id: H.LineBreakInsert, - precondition: EditorContextKeys.writable, - kbOpts: { - weight: CORE_WEIGHT, - kbExpr: EditorContextKeys.textFocus, - primary: null, - mac: { primary: KeyMod.WinCtrl | KeyCode.KEY_O } - } - })); - - class BaseTextInputAwareCommand extends Command { private readonly _editorHandler: string | EditorCommand; diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 42b712abd33..5c05fddaa84 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -504,21 +504,12 @@ export class Cursor extends Disposable implements ICursors { private _registerHandlers(): void { let H = editorCommon.Handler; - this._handlers[H.LineInsertAfter] = (args) => this._lineInsertAfter(args); - this._handlers[H.LineBreakInsert] = (args) => this._lineBreakInsert(args); - this._handlers[H.Type] = (args) => this._type(args); this._handlers[H.ReplacePreviousChar] = (args) => this._replacePreviousChar(args); this._handlers[H.CompositionStart] = (args) => this._compositionStart(args); this._handlers[H.CompositionEnd] = (args) => this._compositionEnd(args); - this._handlers[H.Tab] = (args) => this._tab(args); - this._handlers[H.Indent] = (args) => this._indent(args); - this._handlers[H.Outdent] = (args) => this._outdent(args); this._handlers[H.Paste] = (args) => this._paste(args); - this._handlers[H.DeleteLeft] = (args) => this._deleteLeft(args); - this._handlers[H.DeleteRight] = (args) => this._deleteRight(args); - this._handlers[H.Cut] = (args) => this._cut(args); this._handlers[H.Undo] = (args) => this._undo(args); @@ -542,6 +533,7 @@ export class Cursor extends Disposable implements ICursors { // -------------------- START editing operations + // TODO@Alex: remove private _getAllCursorsModelState(sorted: boolean = false): SingleCursorState[] { let cursors = this._cursors.getAll(); @@ -558,14 +550,6 @@ export class Cursor extends Disposable implements ICursors { return r; } - private _lineInsertAfter(args: CursorOperationArgs): EditOperationResult { - return TypeOperations.lineInsertAfter(this.context.config, this.context.model, this._getAllCursorsModelState()); - } - - private _lineBreakInsert(args: CursorOperationArgs): EditOperationResult { - return TypeOperations.lineBreakInsert(this.context.config, this.context.model, this._getAllCursorsModelState()); - } - private _type(args: CursorOperationArgs<{ text: string; }>): EditOperationResult { const text = args.eventData.text; @@ -613,18 +597,6 @@ export class Cursor extends Disposable implements ICursors { return null; } - private _tab(args: CursorOperationArgs): EditOperationResult { - return TypeOperations.tab(this.context.config, this.context.model, this._getAllCursorsModelState()); - } - - private _indent(args: CursorOperationArgs): EditOperationResult { - return TypeOperations.indent(this.context.config, this.context.model, this._getAllCursorsModelState()); - } - - private _outdent(args: CursorOperationArgs): EditOperationResult { - return TypeOperations.outdent(this.context.config, this.context.model, this._getAllCursorsModelState()); - } - private _distributePasteToCursors(args: CursorOperationArgs<{ pasteOnNewLine: boolean; text: string; }>): string[] { if (args.eventData.pasteOnNewLine) { return null; @@ -659,14 +631,6 @@ export class Cursor extends Disposable implements ICursors { } } - private _deleteLeft(args: CursorOperationArgs): EditOperationResult { - return DeleteOperations.deleteLeft(this.context.config, this.context.model, this._getAllCursorsModelState()); - } - - private _deleteRight(args: CursorOperationArgs): EditOperationResult { - return DeleteOperations.deleteRight(this.context.config, this.context.model, this._getAllCursorsModelState()); - } - private _cut(args: CursorOperationArgs): EditOperationResult { return DeleteOperations.cut(this.context.config, this.context.model, this._getAllCursorsModelState()); } diff --git a/src/vs/editor/common/controller/cursorDeleteOperations.ts b/src/vs/editor/common/controller/cursorDeleteOperations.ts index 68b006b107e..b6552f40e5d 100644 --- a/src/vs/editor/common/controller/cursorDeleteOperations.ts +++ b/src/vs/editor/common/controller/cursorDeleteOperations.ts @@ -7,22 +7,23 @@ import { ReplaceCommand } from 'vs/editor/common/commands/replaceCommand'; import { SingleCursorState, CursorColumns, CursorConfiguration, ICursorSimpleModel, EditOperationResult } from 'vs/editor/common/controller/cursorCommon'; import { Range } from 'vs/editor/common/core/range'; +import { Selection } from 'vs/editor/common/core/selection'; import { MoveOperations } from 'vs/editor/common/controller/cursorMoveOperations'; import * as strings from 'vs/base/common/strings'; import { ICommand } from "vs/editor/common/editorCommon"; export class DeleteOperations { - public static deleteRight(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[]): EditOperationResult { + public static deleteRight(config: CursorConfiguration, model: ICursorSimpleModel, cursors: Selection[]): [boolean, ICommand[]] { let commands: ICommand[] = []; let shouldPushStackElementBefore = false; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; - let deleteSelection: Range = cursor.selection; + let deleteSelection: Range = cursor; if (deleteSelection.isEmpty()) { - let position = cursor.position; + let position = cursor.getPosition(); let rightOfPosition = MoveOperations.right(config, model, position.lineNumber, position.column); deleteSelection = new Range( rightOfPosition.lineNumber, @@ -44,21 +45,17 @@ export class DeleteOperations { commands[i] = new ReplaceCommand(deleteSelection, ''); } - return new EditOperationResult(commands, { - shouldPushStackElementBefore: shouldPushStackElementBefore, - shouldPushStackElementAfter: false - }); + return [shouldPushStackElementBefore, commands]; } - private static _isAutoClosingPairDelete(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[]): boolean { + private static _isAutoClosingPairDelete(config: CursorConfiguration, model: ICursorSimpleModel, cursors: Selection[]): boolean { if (!config.autoClosingBrackets) { return false; } for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - const selection = cursor.selection; - const position = cursor.position; + const selection = cursors[i]; + const position = selection.getPosition(); if (!selection.isEmpty()) { return false; @@ -82,11 +79,11 @@ export class DeleteOperations { return true; } - private static _runAutoClosingPairDelete(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[]): EditOperationResult { + private static _runAutoClosingPairDelete(config: CursorConfiguration, model: ICursorSimpleModel, cursors: Selection[]): [boolean, ICommand[]] { let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; - const position = cursor.position; + const position = cursor.getPosition(); const deleteSelection = new Range( position.lineNumber, position.column - 1, @@ -95,13 +92,10 @@ export class DeleteOperations { ); commands[i] = new ReplaceCommand(deleteSelection, ''); } - return new EditOperationResult(commands, { - shouldPushStackElementBefore: true, - shouldPushStackElementAfter: false - }); + return [true, commands]; } - public static deleteLeft(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[]): EditOperationResult { + public static deleteLeft(config: CursorConfiguration, model: ICursorSimpleModel, cursors: Selection[]): [boolean, ICommand[]] { if (this._isAutoClosingPairDelete(config, model, cursors)) { return this._runAutoClosingPairDelete(config, model, cursors); @@ -112,10 +106,10 @@ export class DeleteOperations { for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; - let deleteSelection: Range = cursor.selection; + let deleteSelection: Range = cursor; if (deleteSelection.isEmpty()) { - let position = cursor.position; + let position = cursor.getPosition(); if (config.useTabStops && position.column > 1) { let lineContent = model.getLineContent(position.lineNumber); @@ -158,10 +152,7 @@ export class DeleteOperations { commands[i] = new ReplaceCommand(deleteSelection, ''); } - return new EditOperationResult(commands, { - shouldPushStackElementBefore: shouldPushStackElementBefore, - shouldPushStackElementAfter: false - }); + return [shouldPushStackElementBefore, commands]; } public static cut(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[]): EditOperationResult { diff --git a/src/vs/editor/common/controller/cursorTypeOperations.ts b/src/vs/editor/common/controller/cursorTypeOperations.ts index 7d9346cf06d..4b8237f13eb 100644 --- a/src/vs/editor/common/controller/cursorTypeOperations.ts +++ b/src/vs/editor/common/controller/cursorTypeOperations.ts @@ -21,38 +21,32 @@ import { CursorChangeReason } from "vs/editor/common/controller/cursorEvents"; export class TypeOperations { - public static indent(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[]): EditOperationResult { + public static indent(config: CursorConfiguration, model: ICursorSimpleModel, cursors: Selection[]): ICommand[] { let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; - commands[i] = new ShiftCommand(cursor.selection, { + commands[i] = new ShiftCommand(cursor, { isUnshift: false, tabSize: config.tabSize, oneIndent: config.oneIndent, useTabStops: config.useTabStops }); } - return new EditOperationResult(commands, { - shouldPushStackElementBefore: true, - shouldPushStackElementAfter: true - }); + return commands; } - public static outdent(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[]): EditOperationResult { + public static outdent(config: CursorConfiguration, model: ICursorSimpleModel, cursors: Selection[]): ICommand[] { let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; - commands[i] = new ShiftCommand(cursor.selection, { + commands[i] = new ShiftCommand(cursor, { isUnshift: true, tabSize: config.tabSize, oneIndent: config.oneIndent, useTabStops: config.useTabStops }); } - return new EditOperationResult(commands, { - shouldPushStackElementBefore: true, - shouldPushStackElementAfter: true - }); + return commands; } public static shiftIndent(config: CursorConfiguration, indentation: string, count?: number): string { @@ -172,11 +166,10 @@ export class TypeOperations { return new ReplaceCommand(selection, typeText, insertsAutoWhitespace); } - public static tab(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[]): EditOperationResult { + public static tab(config: CursorConfiguration, model: ITokenizedModel, cursors: Selection[]): ICommand[] { let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - let selection = cursor.selection; + const selection = cursors[i]; if (selection.isEmpty()) { @@ -211,10 +204,7 @@ export class TypeOperations { }); } } - return new EditOperationResult(commands, { - shouldPushStackElementBefore: true, - shouldPushStackElementAfter: true - }); + return commands; } public static replacePreviousChar(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[], txt: string, replaceCharCnt: number): EditOperationResult { @@ -600,29 +590,23 @@ export class TypeOperations { return commands; } - public static lineInsertAfter(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[]): EditOperationResult { + public static lineInsertAfter(config: CursorConfiguration, model: ITokenizedModel, cursors: Selection[]): ICommand[] { let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; - let position = cursor.position; - let column = model.getLineMaxColumn(position.lineNumber); - commands[i] = this._enter(config, model, false, new Range(position.lineNumber, column, position.lineNumber, column)); + let lineNumber = cursor.positionLineNumber; + let column = model.getLineMaxColumn(lineNumber); + commands[i] = this._enter(config, model, false, new Range(lineNumber, column, lineNumber, column)); } - return new EditOperationResult(commands, { - shouldPushStackElementBefore: true, - shouldPushStackElementAfter: false, - }); + return commands; } - public static lineBreakInsert(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[]): EditOperationResult { + public static lineBreakInsert(config: CursorConfiguration, model: ITokenizedModel, cursors: Selection[]): ICommand[] { let commands: ICommand[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; - commands[i] = this._enter(config, model, true, cursor.selection); + commands[i] = this._enter(config, model, true, cursor); } - return new EditOperationResult(commands, { - shouldPushStackElementBefore: true, - shouldPushStackElementAfter: false, - }); + return commands; } } diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index bca8965eafb..bec905e6cf2 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -2071,18 +2071,8 @@ export var Handler = { CompositionEnd: 'compositionEnd', Paste: 'paste', - Tab: 'tab', - Indent: 'indent', - Outdent: 'outdent', - - DeleteLeft: 'deleteLeft', - DeleteRight: 'deleteRight', - Cut: 'cut', Undo: 'undo', Redo: 'redo', - - LineInsertAfter: 'lineInsertAfter', - LineBreakInsert: 'lineBreakInsert', }; diff --git a/src/vs/editor/common/editorCommonExtensions.ts b/src/vs/editor/common/editorCommonExtensions.ts index cc2cac81cef..c80f219223d 100644 --- a/src/vs/editor/common/editorCommonExtensions.ts +++ b/src/vs/editor/common/editorCommonExtensions.ts @@ -74,22 +74,6 @@ export abstract class EditorAction extends ConfigEditorCommand { public abstract run(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor, args: any): void | TPromise; } -export interface IHandlerActionOptions extends IActionOptions { - handlerId: string; -} -export abstract class HandlerEditorAction extends EditorAction { - private _handlerId: string; - - constructor(opts: IHandlerActionOptions) { - super(opts); - this._handlerId = opts.handlerId; - } - - public run(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor): void { - editor.trigger(this.id, this._handlerId, null); - } -} - // --- Editor Actions export function editorAction(ctor: { new (): EditorAction; }): void { diff --git a/src/vs/editor/contrib/linesOperations/common/linesOperations.ts b/src/vs/editor/contrib/linesOperations/common/linesOperations.ts index 0cb23b50393..54143b106ba 100644 --- a/src/vs/editor/contrib/linesOperations/common/linesOperations.ts +++ b/src/vs/editor/contrib/linesOperations/common/linesOperations.ts @@ -9,16 +9,17 @@ import { KeyCode, KeyMod, KeyChord } from 'vs/base/common/keyCodes'; import { SortLinesCommand } from 'vs/editor/contrib/linesOperations/common/sortLinesCommand'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { TrimTrailingWhitespaceCommand } from 'vs/editor/common/commands/trimTrailingWhitespaceCommand'; -import { Handler, ICommand, ICommonCodeEditor, IIdentifiedSingleEditOperation } from 'vs/editor/common/editorCommon'; +import { ICommand, ICommonCodeEditor, IIdentifiedSingleEditOperation } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ReplaceCommand, ReplaceCommandThatPreservesSelection } from 'vs/editor/common/commands/replaceCommand'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { editorAction, ServicesAccessor, IActionOptions, EditorAction, HandlerEditorAction } from 'vs/editor/common/editorCommonExtensions'; +import { editorAction, ServicesAccessor, IActionOptions, EditorAction } from 'vs/editor/common/editorCommonExtensions'; import { CopyLinesCommand } from './copyLinesCommand'; import { DeleteLinesCommand } from './deleteLinesCommand'; import { MoveLinesCommand } from './moveLinesCommand'; import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations'; +import { CoreEditingCommands } from "vs/editor/common/controller/coreCommands"; // copy lines @@ -296,37 +297,45 @@ class DeleteLinesAction extends AbstractRemoveLinesAction { } @editorAction -class IndentLinesAction extends HandlerEditorAction { +export class IndentLinesAction extends EditorAction { constructor() { super({ id: 'editor.action.indentLines', label: nls.localize('lines.indent', "Indent Line"), alias: 'Indent Line', precondition: EditorContextKeys.writable, - handlerId: Handler.Indent, kbOpts: { kbExpr: EditorContextKeys.textFocus, primary: KeyMod.CtrlCmd | KeyCode.US_CLOSE_SQUARE_BRACKET } }); } + + public run(accessor: ServicesAccessor, editor: ICommonCodeEditor): void { + editor.pushUndoStop(); + editor.executeCommands(this.id, TypeOperations.indent(editor._getCursorConfiguration(), editor.getModel(), editor.getSelections())); + editor.pushUndoStop(); + } } @editorAction -class OutdentLinesAction extends HandlerEditorAction { +class OutdentLinesAction extends EditorAction { constructor() { super({ id: 'editor.action.outdentLines', label: nls.localize('lines.outdent', "Outdent Line"), alias: 'Outdent Line', precondition: EditorContextKeys.writable, - handlerId: Handler.Outdent, kbOpts: { kbExpr: EditorContextKeys.textFocus, primary: KeyMod.CtrlCmd | KeyCode.US_OPEN_SQUARE_BRACKET } }); } + + public run(accessor: ServicesAccessor, editor: ICommonCodeEditor): void { + CoreEditingCommands.Outdent.runEditorCommand(null, editor, null); + } } @editorAction @@ -351,20 +360,24 @@ export class InsertLineBeforeAction extends EditorAction { } @editorAction -class InsertLineAfterAction extends HandlerEditorAction { +export class InsertLineAfterAction extends EditorAction { constructor() { super({ id: 'editor.action.insertLineAfter', label: nls.localize('lines.insertAfter', "Insert Line Below"), alias: 'Insert Line Below', precondition: EditorContextKeys.writable, - handlerId: Handler.LineInsertAfter, kbOpts: { kbExpr: EditorContextKeys.textFocus, primary: KeyMod.CtrlCmd | KeyCode.Enter } }); } + + public run(accessor: ServicesAccessor, editor: ICommonCodeEditor): void { + editor.pushUndoStop(); + editor.executeCommands(this.id, TypeOperations.lineInsertAfter(editor._getCursorConfiguration(), editor.getModel(), editor.getSelections())); + } } export abstract class AbstractDeleteAllToBoundaryAction extends EditorAction { diff --git a/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts b/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts index f32dd7ee822..87930f8457f 100644 --- a/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts +++ b/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts @@ -7,10 +7,12 @@ import * as assert from 'assert'; import { Selection } from 'vs/editor/common/core/selection'; import { Position } from 'vs/editor/common/core/position'; -import { Handler, IModel } from 'vs/editor/common/editorCommon'; +import { Handler, IModel, DefaultEndOfLine } from 'vs/editor/common/editorCommon'; import { withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; -import { DeleteAllLeftAction, JoinLinesAction, TransposeAction, UpperCaseAction, LowerCaseAction, DeleteAllRightAction, InsertLineBeforeAction } from 'vs/editor/contrib/linesOperations/common/linesOperations'; +import { DeleteAllLeftAction, JoinLinesAction, TransposeAction, UpperCaseAction, LowerCaseAction, DeleteAllRightAction, InsertLineBeforeAction, InsertLineAfterAction, IndentLinesAction } from 'vs/editor/contrib/linesOperations/common/linesOperations'; import { Cursor } from "vs/editor/common/controller/cursor"; +import { Model } from "vs/editor/common/model/model"; +import { CoreEditingCommands } from "vs/editor/common/controller/coreCommands"; suite('Editor Contrib - Line Operations', () => { suite('DeleteAllLeftAction', () => { @@ -531,4 +533,75 @@ suite('Editor Contrib - Line Operations', () => { assert.equal(model.getLineContent(4), 'Third line'); }); }); -}); \ No newline at end of file + + test('InsertLineAfterAction', () => { + function testInsertLineAfter(lineNumber: number, column: number, callback: (model: IModel, cursor: Cursor) => void): void { + const TEXT = [ + 'First line', + 'Second line', + 'Third line' + ]; + withMockCodeEditor(TEXT, {}, (editor, cursor) => { + editor.setPosition(new Position(lineNumber, column)); + let insertLineAfterAction = new InsertLineAfterAction(); + + insertLineAfterAction.run(null, editor); + callback(editor.getModel(), cursor); + }); + } + + testInsertLineAfter(1, 3, (model, cursor) => { + assert.deepEqual(cursor.getSelection(), new Selection(2, 1, 2, 1)); + assert.equal(model.getLineContent(1), 'First line'); + assert.equal(model.getLineContent(2), ''); + assert.equal(model.getLineContent(3), 'Second line'); + assert.equal(model.getLineContent(4), 'Third line'); + }); + + testInsertLineAfter(2, 3, (model, cursor) => { + assert.deepEqual(cursor.getSelection(), new Selection(3, 1, 3, 1)); + assert.equal(model.getLineContent(1), 'First line'); + assert.equal(model.getLineContent(2), 'Second line'); + assert.equal(model.getLineContent(3), ''); + assert.equal(model.getLineContent(4), 'Third line'); + }); + + testInsertLineAfter(3, 3, (model, cursor) => { + assert.deepEqual(cursor.getSelection(), new Selection(4, 1, 4, 1)); + assert.equal(model.getLineContent(1), 'First line'); + assert.equal(model.getLineContent(2), 'Second line'); + assert.equal(model.getLineContent(3), 'Third line'); + assert.equal(model.getLineContent(4), ''); + }); + }); + + test('Bug 18276:[editor] Indentation broken when selection is empty', () => { + + let model = Model.createFromString( + [ + 'function baz() {' + ].join('\n'), + { + defaultEOL: DefaultEndOfLine.LF, + detectIndentation: false, + insertSpaces: false, + tabSize: 4, + trimAutoWhitespace: true + } + ); + + withMockCodeEditor(null, { model: model }, (editor, cursor) => { + let indentLinesAction = new IndentLinesAction(); + editor.setPosition(new Position(1, 2)); + + indentLinesAction.run(null, editor); + assert.equal(model.getLineContent(1), '\tfunction baz() {'); + assert.deepEqual(editor.getSelection(), new Selection(1, 3, 1, 3)); + + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); + assert.equal(model.getLineContent(1), '\tf\tunction baz() {'); + }); + + model.dispose(); + }); +}); diff --git a/src/vs/editor/test/common/controller/cursor.test.ts b/src/vs/editor/test/common/controller/cursor.test.ts index 8a505460120..f11a0c6775e 100644 --- a/src/vs/editor/test/common/controller/cursor.test.ts +++ b/src/vs/editor/test/common/controller/cursor.test.ts @@ -24,7 +24,9 @@ import { LanguageIdentifier } from 'vs/editor/common/modes'; import { viewModelHelper } from 'vs/editor/test/common/editorTestUtils'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; -import { CoreNavigationCommands } from 'vs/editor/common/controller/coreCommands'; +import { CoreNavigationCommands, CoreEditingCommands } from 'vs/editor/common/controller/coreCommands'; +import { withMockCodeEditor } from "vs/editor/test/common/mocks/mockCodeEditor"; +import { TextModel } from "vs/editor/common/model/textModel"; let H = Handler; @@ -1119,22 +1121,24 @@ class IndentRulesMode extends MockMode { suite('Editor Controller - Regression tests', () => { test('Bug 9121: Auto indent + undo + redo is funky', () => { - usingCursor({ - text: [ + let model = Model.createFromString( + [ '' - ], - modelOpts: { + ].join('\n'), + { defaultEOL: DefaultEndOfLine.LF, detectIndentation: false, insertSpaces: false, tabSize: 4, trimAutoWhitespace: false - } - }, (model, cursor) => { + }, + ); + + withMockCodeEditor(null, { model: model }, (editor, cursor) => { cursorCommand(cursor, H.Type, { text: '\n' }, 'keyboard'); assert.equal(model.getValue(EndOfLinePreference.LF), '\n', 'assert1'); - cursorCommand(cursor, H.Tab, {}); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getValue(EndOfLinePreference.LF), '\n\t', 'assert2'); cursorCommand(cursor, H.Type, { text: '\n' }, 'keyboard'); @@ -1146,16 +1150,16 @@ suite('Editor Controller - Regression tests', () => { CoreNavigationCommands.CursorLeft.runCoreEditorCommand(cursor, {}); assert.equal(model.getValue(EndOfLinePreference.LF), '\n\t\n\tx', 'assert5'); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getValue(EndOfLinePreference.LF), '\n\t\nx', 'assert6'); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getValue(EndOfLinePreference.LF), '\n\tx', 'assert7'); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getValue(EndOfLinePreference.LF), '\nx', 'assert8'); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getValue(EndOfLinePreference.LF), 'x', 'assert9'); cursorCommand(cursor, H.Undo, {}); @@ -1176,219 +1180,234 @@ suite('Editor Controller - Regression tests', () => { cursorCommand(cursor, H.Redo, {}); assert.equal(model.getValue(EndOfLinePreference.LF), 'x', 'assert15'); }); + + model.dispose(); }); - - test('bug #16543: Tab should indent to correct indentation spot immediately', () => { let mode = new OnEnterMode(IndentAction.Indent); - usingCursor({ - text: [ + let model = Model.createFromString( + [ 'function baz() {', '\tfunction hello() { // something here', '\t', '', '\t}', '}' - ], - modelOpts: { + ].join('\n'), + { defaultEOL: DefaultEndOfLine.LF, detectIndentation: false, insertSpaces: false, tabSize: 4, trimAutoWhitespace: true }, - languageIdentifier: mode.getLanguageIdentifier(), - }, (model, cursor) => { + mode.getLanguageIdentifier() + ); + + withMockCodeEditor(null, { model: model }, (editor, cursor) => { moveTo(cursor, 4, 1, false); assertCursor(cursor, new Selection(4, 1, 4, 1)); - cursorCommand(cursor, H.Tab, null, 'keyboard'); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(4), '\t\t'); }); + + model.dispose(); mode.dispose(); }); test('bug #2938 (1): When pressing Tab on white-space only lines, indent straight to the right spot (similar to empty lines)', () => { let mode = new OnEnterMode(IndentAction.Indent); - usingCursor({ - text: [ + let model = Model.createFromString( + [ '\tfunction baz() {', '\t\tfunction hello() { // something here', '\t\t', '\t', '\t\t}', '\t}' - ], - modelOpts: { + ].join('\n'), + { defaultEOL: DefaultEndOfLine.LF, detectIndentation: false, insertSpaces: false, tabSize: 4, trimAutoWhitespace: true }, - languageIdentifier: mode.getLanguageIdentifier(), - }, (model, cursor) => { + mode.getLanguageIdentifier() + ); + + withMockCodeEditor(null, { model: model }, (editor, cursor) => { moveTo(cursor, 4, 2, false); assertCursor(cursor, new Selection(4, 2, 4, 2)); - cursorCommand(cursor, H.Tab, null, 'keyboard'); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(4), '\t\t\t'); }); + + model.dispose(); mode.dispose(); }); test('bug #2938 (2): When pressing Tab on white-space only lines, indent straight to the right spot (similar to empty lines)', () => { let mode = new OnEnterMode(IndentAction.Indent); - usingCursor({ - text: [ + let model = Model.createFromString( + [ '\tfunction baz() {', '\t\tfunction hello() { // something here', '\t\t', ' ', '\t\t}', '\t}' - ], - modelOpts: { + ].join('\n'), + { defaultEOL: DefaultEndOfLine.LF, detectIndentation: false, insertSpaces: false, tabSize: 4, trimAutoWhitespace: true }, - languageIdentifier: mode.getLanguageIdentifier(), - }, (model, cursor) => { + mode.getLanguageIdentifier() + ); + + withMockCodeEditor(null, { model: model }, (editor, cursor) => { moveTo(cursor, 4, 1, false); assertCursor(cursor, new Selection(4, 1, 4, 1)); - cursorCommand(cursor, H.Tab, null, 'keyboard'); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(4), '\t\t\t'); }); + + model.dispose(); mode.dispose(); }); test('bug #2938 (3): When pressing Tab on white-space only lines, indent straight to the right spot (similar to empty lines)', () => { let mode = new OnEnterMode(IndentAction.Indent); - usingCursor({ - text: [ + let model = Model.createFromString( + [ '\tfunction baz() {', '\t\tfunction hello() { // something here', '\t\t', '\t\t\t', '\t\t}', '\t}' - ], - modelOpts: { + ].join('\n'), + { defaultEOL: DefaultEndOfLine.LF, detectIndentation: false, insertSpaces: false, tabSize: 4, trimAutoWhitespace: true }, - languageIdentifier: mode.getLanguageIdentifier(), - }, (model, cursor) => { + mode.getLanguageIdentifier() + ); + + withMockCodeEditor(null, { model: model }, (editor, cursor) => { moveTo(cursor, 4, 3, false); assertCursor(cursor, new Selection(4, 3, 4, 3)); - cursorCommand(cursor, H.Tab, null, 'keyboard'); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(4), '\t\t\t\t'); }); + + model.dispose(); mode.dispose(); }); test('bug #2938 (4): When pressing Tab on white-space only lines, indent straight to the right spot (similar to empty lines)', () => { let mode = new OnEnterMode(IndentAction.Indent); - usingCursor({ - text: [ + let model = Model.createFromString( + [ '\tfunction baz() {', '\t\tfunction hello() { // something here', '\t\t', '\t\t\t\t', '\t\t}', '\t}' - ], - modelOpts: { + ].join('\n'), + { defaultEOL: DefaultEndOfLine.LF, detectIndentation: false, insertSpaces: false, tabSize: 4, trimAutoWhitespace: true }, - languageIdentifier: mode.getLanguageIdentifier(), - }, (model, cursor) => { + mode.getLanguageIdentifier() + ); + + withMockCodeEditor(null, { model: model }, (editor, cursor) => { moveTo(cursor, 4, 4, false); assertCursor(cursor, new Selection(4, 4, 4, 4)); - cursorCommand(cursor, H.Tab, null, 'keyboard'); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(4), '\t\t\t\t\t'); }); + + model.dispose(); mode.dispose(); }); - test('Bug 18276:[editor] Indentation broken when selection is empty', () => { - usingCursor({ - text: [ - 'function baz() {' - ], - modelOpts: { - defaultEOL: DefaultEndOfLine.LF, - detectIndentation: false, - insertSpaces: false, - tabSize: 4, - trimAutoWhitespace: true - }, - }, (model, cursor) => { - moveTo(cursor, 1, 2, false); - assertCursor(cursor, new Selection(1, 2, 1, 2)); - - cursorCommand(cursor, H.Indent, null, 'keyboard'); - assert.equal(model.getLineContent(1), '\tfunction baz() {'); - - assertCursor(cursor, new Selection(1, 3, 1, 3)); - cursorCommand(cursor, H.Tab, null, 'keyboard'); - assert.equal(model.getLineContent(1), '\tf\tunction baz() {'); - }); - }); - test('bug #16815:Shift+Tab doesn\'t go back to tabstop', () => { let mode = new OnEnterMode(IndentAction.IndentOutdent); - usingCursor({ - text: [ + let model = Model.createFromString( + [ ' function baz() {' - ], - languageIdentifier: mode.getLanguageIdentifier(), - modelOpts: { insertSpaces: true, tabSize: 4, detectIndentation: false, defaultEOL: DefaultEndOfLine.LF, trimAutoWhitespace: true } - }, (model, cursor) => { + ].join('\n'), + { + insertSpaces: true, + tabSize: 4, + detectIndentation: false, + defaultEOL: DefaultEndOfLine.LF, + trimAutoWhitespace: true + }, + mode.getLanguageIdentifier() + ); + + withMockCodeEditor(null, { model: model }, (editor, cursor) => { moveTo(cursor, 1, 6, false); assertCursor(cursor, new Selection(1, 6, 1, 6)); - cursorCommand(cursor, H.Outdent, null, 'keyboard'); + CoreEditingCommands.Outdent.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(1), ' function baz() {'); assertCursor(cursor, new Selection(1, 5, 1, 5)); }); + + model.dispose(); mode.dispose(); }); test('Bug #18293:[regression][editor] Can\'t outdent whitespace line', () => { - usingCursor({ - text: [ + let model = Model.createFromString( + [ ' ' - ], - modelOpts: { insertSpaces: true, tabSize: 4, detectIndentation: false, defaultEOL: DefaultEndOfLine.LF, trimAutoWhitespace: true } - }, (model, cursor) => { + ].join('\n'), + { + insertSpaces: true, + tabSize: 4, + detectIndentation: false, + defaultEOL: DefaultEndOfLine.LF, + trimAutoWhitespace: true + } + ); + + withMockCodeEditor(null, { model: model }, (editor, cursor) => { moveTo(cursor, 1, 7, false); assertCursor(cursor, new Selection(1, 7, 1, 7)); - cursorCommand(cursor, H.Outdent, null, 'keyboard'); + CoreEditingCommands.Outdent.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(1), ' '); assertCursor(cursor, new Selection(1, 5, 1, 5)); }); + + model.dispose(); }); test('Bug #16657: [editor] Tab on empty line of zero indentation moves cursor to position (1,1)', () => { - usingCursor({ - text: [ + let model = Model.createFromString( + [ 'function baz() {', '\tfunction hello() { // something here', '\t', @@ -1396,22 +1415,26 @@ suite('Editor Controller - Regression tests', () => { '\t}', '}', '' - ], - modelOpts: { + ].join('\n'), + { defaultEOL: DefaultEndOfLine.LF, detectIndentation: false, insertSpaces: false, tabSize: 4, trimAutoWhitespace: true }, - }, (model, cursor) => { + ); + + withMockCodeEditor(null, { model: model }, (editor, cursor) => { moveTo(cursor, 7, 1, false); assertCursor(cursor, new Selection(7, 1, 7, 1)); - cursorCommand(cursor, H.Tab, null, 'keyboard'); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(7), '\t'); assertCursor(cursor, new Selection(7, 2, 7, 2)); }); + + model.dispose(); }); test('bug #16740: [editor] Cut line doesn\'t quite cut the last line', () => { @@ -1480,24 +1503,33 @@ suite('Editor Controller - Regression tests', () => { test('issue #1140: Backspace stops prematurely', () => { let mode = new SurroundingMode(); - usingCursor({ - text: [ + let model = Model.createFromString( + [ 'function baz() {', ' return 1;', '};' - ], - languageIdentifier: mode.getLanguageIdentifier(), - modelOpts: { tabSize: 4, insertSpaces: true, detectIndentation: false, defaultEOL: DefaultEndOfLine.LF, trimAutoWhitespace: true } - }, (model, cursor) => { + ].join('\n'), + { + tabSize: 4, + insertSpaces: true, + detectIndentation: false, + defaultEOL: DefaultEndOfLine.LF, + trimAutoWhitespace: true + }, + ); + + withMockCodeEditor(null, { model: model }, (editor, cursor) => { moveTo(cursor, 3, 2, false); moveTo(cursor, 1, 14, true); assertCursor(cursor, new Selection(3, 2, 1, 14)); - cursorCommand(cursor, H.DeleteLeft); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assertCursor(cursor, new Selection(1, 14, 1, 14)); assert.equal(model.getLineCount(), 1); assert.equal(model.getLineContent(1), 'function baz(;'); }); + + model.dispose(); mode.dispose(); }); @@ -1520,15 +1552,22 @@ suite('Editor Controller - Regression tests', () => { }); test('issue #3071: Investigate why undo stack gets corrupted', () => { - usingCursor({ - text: [ + let model = Model.createFromString( + [ 'some lines', 'and more lines', 'just some text', - ], - languageIdentifier: null, - modelOpts: { insertSpaces: true, tabSize: 4, detectIndentation: false, defaultEOL: DefaultEndOfLine.LF, trimAutoWhitespace: true } - }, (model, cursor) => { + ].join('\n'), + { + insertSpaces: true, + tabSize: 4, + detectIndentation: false, + defaultEOL: DefaultEndOfLine.LF, + trimAutoWhitespace: true + } + ); + + withMockCodeEditor(null, { model: model }, (editor, cursor) => { moveTo(cursor, 1, 1, false); moveTo(cursor, 3, 4, true); @@ -1540,7 +1579,7 @@ suite('Editor Controller - Regression tests', () => { } }); - cursorCommand(cursor, H.Tab); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getValue(), [ '\t just some text' ].join('\n'), '001'); @@ -1559,6 +1598,8 @@ suite('Editor Controller - Regression tests', () => { 'just some text', ].join('\n'), '003'); }); + + model.dispose(); }); test('issue #12950: Cannot Double Click To Insert Emoji Using OSX Emoji Panel', () => { @@ -1584,35 +1625,55 @@ suite('Editor Controller - Regression tests', () => { }); test('issue #3463: pressing tab adds spaces, but not as many as for a tab', () => { - usingCursor({ - text: [ + let model = Model.createFromString( + [ 'function a() {', '\tvar a = {', '\t\tx: 3', '\t};', '}', - ], - modelOpts: { insertSpaces: true, tabSize: 4, detectIndentation: false, defaultEOL: DefaultEndOfLine.LF, trimAutoWhitespace: true } - }, (model, cursor) => { + ].join('\n'), + { + insertSpaces: true, + tabSize: 4, + detectIndentation: false, + defaultEOL: DefaultEndOfLine.LF, + trimAutoWhitespace: true + } + ); + + withMockCodeEditor(null, { model: model }, (editor, cursor) => { moveTo(cursor, 3, 2, false); - cursorCommand(cursor, H.Tab); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(3), '\t \tx: 3'); }); + + model.dispose(); }); test('issue #4312: trying to type a tab character over a sequence of spaces results in unexpected behaviour', () => { - usingCursor({ - text: [ + let model = Model.createFromString( + [ 'var foo = 123; // this is a comment', 'var bar = 4; // another comment' - ], - modelOpts: { insertSpaces: false, tabSize: 4, detectIndentation: false, defaultEOL: DefaultEndOfLine.LF, trimAutoWhitespace: true } - }, (model, cursor) => { + ].join('\n'), + { + insertSpaces: false, + tabSize: 4, + detectIndentation: false, + defaultEOL: DefaultEndOfLine.LF, + trimAutoWhitespace: true + } + ); + + withMockCodeEditor(null, { model: model }, (editor, cursor) => { moveTo(cursor, 1, 15, false); moveTo(cursor, 1, 22, true); - cursorCommand(cursor, H.Tab); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(1), 'var foo = 123;\t// this is a comment'); }); + + model.dispose(); }); test('issue #832: word right', () => { @@ -1810,70 +1871,80 @@ suite('Editor Controller - Cursor Configuration', () => { }); test('Cursor honors insertSpaces configuration on tab', () => { - usingCursor({ - text: [ + let model = Model.createFromString( + [ ' \tMy First Line\t ', 'My Second Line123', ' Third Line', '', '1' - ], - modelOpts: { insertSpaces: true, tabSize: 13, detectIndentation: false, defaultEOL: DefaultEndOfLine.LF, trimAutoWhitespace: true } - }, (model, cursor) => { + ].join('\n'), + { + insertSpaces: true, + tabSize: 13, + detectIndentation: false, + defaultEOL: DefaultEndOfLine.LF, + trimAutoWhitespace: true + } + ); + + withMockCodeEditor(null, { model: model }, (editor, cursor) => { // Tab on column 1 cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 1) }, 'keyboard'); - cursorCommand(cursor, H.Tab, null, 'keyboard'); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), ' My Second Line123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 2 assert.equal(model.getLineContent(2), 'My Second Line123'); cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 2) }, 'keyboard'); - cursorCommand(cursor, H.Tab, null, 'keyboard'); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), 'M y Second Line123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 3 assert.equal(model.getLineContent(2), 'My Second Line123'); cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 3) }, 'keyboard'); - cursorCommand(cursor, H.Tab, null, 'keyboard'); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), 'My Second Line123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 4 assert.equal(model.getLineContent(2), 'My Second Line123'); cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 4) }, 'keyboard'); - cursorCommand(cursor, H.Tab, null, 'keyboard'); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), 'My Second Line123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 5 assert.equal(model.getLineContent(2), 'My Second Line123'); cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 5) }, 'keyboard'); - cursorCommand(cursor, H.Tab, null, 'keyboard'); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), 'My S econd Line123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 5 assert.equal(model.getLineContent(2), 'My Second Line123'); cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 5) }, 'keyboard'); - cursorCommand(cursor, H.Tab, null, 'keyboard'); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), 'My S econd Line123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 13 assert.equal(model.getLineContent(2), 'My Second Line123'); cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 13) }, 'keyboard'); - cursorCommand(cursor, H.Tab, null, 'keyboard'); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), 'My Second Li ne123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 14 assert.equal(model.getLineContent(2), 'My Second Line123'); cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 14) }, 'keyboard'); - cursorCommand(cursor, H.Tab, null, 'keyboard'); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), 'My Second Lin e123'); }); + + model.dispose(); }); test('Enter auto-indents with insertSpaces setting 1', () => { @@ -1930,48 +2001,6 @@ suite('Editor Controller - Cursor Configuration', () => { mode.dispose(); }); - test('Insert line after', () => { - let testInsertLineAfter = (lineNumber: number, column: number, callback: (model: Model, cursor: Cursor) => void) => { - usingCursor({ - text: [ - 'First line', - 'Second line', - 'Third line' - ], - }, (model, cursor) => { - moveTo(cursor, lineNumber, column, false); - assertCursor(cursor, new Position(lineNumber, column)); - - cursorCommand(cursor, H.LineInsertAfter, null, 'keyboard'); - callback(model, cursor); - }); - }; - - testInsertLineAfter(1, 3, (model, cursor) => { - assertCursor(cursor, new Selection(2, 1, 2, 1)); - assert.equal(model.getLineContent(1), 'First line'); - assert.equal(model.getLineContent(2), ''); - assert.equal(model.getLineContent(3), 'Second line'); - assert.equal(model.getLineContent(4), 'Third line'); - }); - - testInsertLineAfter(2, 3, (model, cursor) => { - assertCursor(cursor, new Selection(3, 1, 3, 1)); - assert.equal(model.getLineContent(1), 'First line'); - assert.equal(model.getLineContent(2), 'Second line'); - assert.equal(model.getLineContent(3), ''); - assert.equal(model.getLineContent(4), 'Third line'); - }); - - testInsertLineAfter(3, 3, (model, cursor) => { - assertCursor(cursor, new Selection(4, 1, 4, 1)); - assert.equal(model.getLineContent(1), 'First line'); - assert.equal(model.getLineContent(2), 'Second line'); - assert.equal(model.getLineContent(3), 'Third line'); - assert.equal(model.getLineContent(4), ''); - }); - }); - test('removeAutoWhitespace off', () => { usingCursor({ text: [ @@ -2071,25 +2100,27 @@ suite('Editor Controller - Cursor Configuration', () => { }); test('removeAutoWhitespace on: removes only whitespace the cursor added 2', () => { - usingCursor({ - text: [ + let model = Model.createFromString( + [ ' if (a) {', ' ', '', '', ' }' - ], - modelOpts: { + ].join('\n'), + { insertSpaces: true, tabSize: 4, detectIndentation: false, defaultEOL: DefaultEndOfLine.LF, trimAutoWhitespace: true } - }, (model, cursor) => { + ); + + withMockCodeEditor(null, { model: model }, (editor, cursor) => { moveTo(cursor, 3, 1); - cursorCommand(cursor, H.Tab, null, 'keyboard'); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(1), ' if (a) {'); assert.equal(model.getLineContent(2), ' '); assert.equal(model.getLineContent(3), ' '); @@ -2097,7 +2128,7 @@ suite('Editor Controller - Cursor Configuration', () => { assert.equal(model.getLineContent(5), ' }'); moveTo(cursor, 4, 1); - cursorCommand(cursor, H.Tab, null, 'keyboard'); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(1), ' if (a) {'); assert.equal(model.getLineContent(2), ' '); assert.equal(model.getLineContent(3), ''); @@ -2112,21 +2143,25 @@ suite('Editor Controller - Cursor Configuration', () => { assert.equal(model.getLineContent(4), ''); assert.equal(model.getLineContent(5), ' }something'); }); + + model.dispose(); }); test('removeAutoWhitespace on: test 1', () => { - usingCursor({ - text: [ + let model = Model.createFromString( + [ ' some line abc ' - ], - modelOpts: { + ].join('\n'), + { insertSpaces: true, tabSize: 4, detectIndentation: false, defaultEOL: DefaultEndOfLine.LF, trimAutoWhitespace: true } - }, (model, cursor) => { + ); + + withMockCodeEditor(null, { model: model }, (editor, cursor) => { // Move cursor to the end, verify that we do not trim whitespaces if line has values moveTo(cursor, 1, model.getLineContent(1).length + 1); @@ -2141,7 +2176,7 @@ suite('Editor Controller - Cursor Configuration', () => { assert.equal(model.getLineContent(3), ' '); // More whitespaces - cursorCommand(cursor, H.Tab, null, 'keyboard'); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(1), ' some line abc '); assert.equal(model.getLineContent(2), ''); assert.equal(model.getLineContent(3), ' '); @@ -2172,63 +2207,65 @@ suite('Editor Controller - Cursor Configuration', () => { assert.equal(model.getLineContent(4), ''); assert.equal(model.getLineContent(5), ''); }); + + model.dispose(); }); test('UseTabStops is off', () => { - usingCursor({ - text: [ + let model = Model.createFromString( + [ ' x', ' a ', ' ' - ], - modelOpts: { + ].join('\n'), + { insertSpaces: true, tabSize: 4, detectIndentation: false, defaultEOL: DefaultEndOfLine.LF, trimAutoWhitespace: true - }, - editorOpts: { - useTabStops: false } - }, (model, cursor) => { + ); + + withMockCodeEditor(null, { model: model, useTabStops: false }, (editor, cursor) => { // DeleteLeft removes just one whitespace moveTo(cursor, 2, 9); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), ' a '); }); + + model.dispose(); }); test('Backspace removes whitespaces with tab size', () => { - usingCursor({ - text: [ + let model = Model.createFromString( + [ ' \t \t x', ' a ', ' ' - ], - modelOpts: { + ].join('\n'), + { insertSpaces: true, tabSize: 4, detectIndentation: false, defaultEOL: DefaultEndOfLine.LF, trimAutoWhitespace: true - }, - editorOpts: { - useTabStops: true } - }, (model, cursor) => { + ); + + withMockCodeEditor(null, { model: model, useTabStops: true }, (editor, cursor) => { // DeleteLeft does not remove tab size, because some text exists before moveTo(cursor, 2, model.getLineContent(2).length + 1); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), ' a '); // DeleteLeft removes tab size = 4 moveTo(cursor, 2, 9); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), ' a '); // DeleteLeft removes tab size = 4 - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), 'a '); // Undo DeleteLeft - get us back to original indentation @@ -2237,57 +2274,61 @@ suite('Editor Controller - Cursor Configuration', () => { // Nothing is broken when cursor is in (1,1) moveTo(cursor, 1, 1); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(1), ' \t \t x'); // DeleteLeft stops at tab stops even in mixed whitespace case moveTo(cursor, 1, 10); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(1), ' \t \t x'); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(1), ' \t \tx'); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(1), ' \tx'); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(1), 'x'); // DeleteLeft on last line moveTo(cursor, 3, model.getLineContent(3).length + 1); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(3), ''); // DeleteLeft with removing new line symbol - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getValue(EndOfLinePreference.LF), 'x\n a '); // In case of selection DeleteLeft only deletes selected text moveTo(cursor, 2, 3); moveTo(cursor, 2, 4, true); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), ' a '); }); + + model.dispose(); }); test('PR #5423: Auto indent + undo + redo is funky', () => { - usingCursor({ - text: [ + let model = Model.createFromString( + [ '' - ], - modelOpts: { + ].join('\n'), + { defaultEOL: DefaultEndOfLine.LF, detectIndentation: false, insertSpaces: false, tabSize: 4, trimAutoWhitespace: true } - }, (model, cursor) => { + ); + + withMockCodeEditor(null, { model: model }, (editor, cursor) => { cursorCommand(cursor, H.Type, { text: '\n' }, 'keyboard'); assert.equal(model.getValue(EndOfLinePreference.LF), '\n', 'assert1'); - cursorCommand(cursor, H.Tab, {}); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getValue(EndOfLinePreference.LF), '\n\t', 'assert2'); cursorCommand(cursor, H.Type, { text: 'y' }, 'keyboard'); @@ -2302,19 +2343,19 @@ suite('Editor Controller - Cursor Configuration', () => { CoreNavigationCommands.CursorLeft.runCoreEditorCommand(cursor, {}); assert.equal(model.getValue(EndOfLinePreference.LF), '\n\ty\n\tx', 'assert5'); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getValue(EndOfLinePreference.LF), '\n\ty\nx', 'assert6'); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getValue(EndOfLinePreference.LF), '\n\tyx', 'assert7'); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getValue(EndOfLinePreference.LF), '\n\tx', 'assert8'); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getValue(EndOfLinePreference.LF), '\nx', 'assert9'); - cursorCommand(cursor, H.DeleteLeft, {}); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getValue(EndOfLinePreference.LF), 'x', 'assert10'); cursorCommand(cursor, H.Undo, {}); @@ -2335,6 +2376,8 @@ suite('Editor Controller - Cursor Configuration', () => { cursorCommand(cursor, H.Redo, {}); assert.equal(model.getValue(EndOfLinePreference.LF), 'x', 'assert16'); }); + + model.dispose(); }); }); @@ -3247,23 +3290,26 @@ suite('autoClosingPairs', () => { test('All cursors should do the same thing when deleting left', () => { let mode = new AutoClosingMode(); - usingCursor({ - text: [ + let model = Model.createFromString( + [ 'var a = ()' - ], - languageIdentifier: mode.getLanguageIdentifier() - }, (model, cursor) => { + ].join('\n'), + TextModel.DEFAULT_CREATION_OPTIONS, + mode.getLanguageIdentifier() + ); + withMockCodeEditor(null, { model: model }, (editor, cursor) => { cursor.setSelections('test', [ new Selection(1, 4, 1, 4), new Selection(1, 10, 1, 10), ]); // delete left - cursorCommand(cursor, H.DeleteLeft, null, 'keyboard'); + CoreEditingCommands.DeleteLeft.runEditorCommand(null, editor, null); assert.equal(model.getValue(), 'va a = )'); }); + model.dispose(); mode.dispose(); }); }); diff --git a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts index 2b29b662fec..f0e0ed7a9bd 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts @@ -19,7 +19,7 @@ import { StandardTokenType } from 'vs/editor/common/modes'; import { DEFAULT_WORD_REGEXP } from 'vs/editor/common/model/wordHelper'; import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; -import { IDecorationOptions, IModelDecorationOptions, IModelDeltaDecoration, TrackedRangeStickiness, Handler } from 'vs/editor/common/editorCommon'; +import { IDecorationOptions, IModelDecorationOptions, IModelDeltaDecoration, TrackedRangeStickiness } from 'vs/editor/common/editorCommon'; import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService'; import { Range } from 'vs/editor/common/core/range'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -37,6 +37,7 @@ import { FloatingClickWidget } from 'vs/workbench/parts/preferences/browser/pref import { IListService } from 'vs/platform/list/browser/listService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Position } from 'vs/editor/common/core/position'; +import { CoreEditingCommands } from "vs/editor/common/controller/coreCommands"; const HOVER_DELAY = 300; const LAUNCH_JSON_REGEX = /launch\.json$/; @@ -434,7 +435,7 @@ export class DebugEditorContribution implements IDebugEditorContribution { // Check if there are more characters on a line after a "configurations": [, if yes enter a newline if (this.editor.getModel().getLineLastNonWhitespaceColumn(position.lineNumber) > position.column) { this.editor.setPosition(position); - this.editor.trigger(this.getId(), Handler.LineBreakInsert, undefined); + CoreEditingCommands.LineBreakInsert.runEditorCommand(null, this.editor, null); } // Check if there is already an empty line to insert suggest, if yes just place the cursor if (this.editor.getModel().getLineLastNonWhitespaceColumn(position.lineNumber + 1) === 0) { diff --git a/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts index 85f464b2865..f1db99bf647 100644 --- a/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts @@ -9,8 +9,9 @@ import nls = require('vs/nls'); import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; import { editorAction } from 'vs/editor/common/editorCommonExtensions'; -import { Handler, ICommonCodeEditor } from 'vs/editor/common/editorCommon'; +import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; +import { CoreEditingCommands } from "vs/editor/common/controller/coreCommands"; import { KeyCode } from 'vs/base/common/keyCodes'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -40,6 +41,6 @@ class ExpandAbbreviationAction extends BasicEmmetEditorAction { protected noExpansionOccurred(editor: ICommonCodeEditor): void { // forward the tab key back to the editor - editor.trigger('emmet', Handler.Tab, {}); + CoreEditingCommands.Tab.runEditorCommand(null, editor, null); } } diff --git a/src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts b/src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts index 15079c88a2c..a55193df515 100644 --- a/src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts @@ -5,13 +5,14 @@ 'use strict'; -import { ICommonCodeEditor, Handler } from 'vs/editor/common/editorCommon'; +import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import strings = require('vs/base/common/strings'); import snippets = require('vs/editor/contrib/snippet/common/snippet'); import { Range } from 'vs/editor/common/core/range'; import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { LanguageId, LanguageIdentifier } from 'vs/editor/common/modes'; import { Position } from 'vs/editor/common/core/position'; +import { CoreEditingCommands } from "vs/editor/common/controller/coreCommands"; import emmet = require('emmet'); @@ -140,7 +141,7 @@ export class EditorAccessor implements emmet.Editor { // During Expand Abbreviation action, if the expanded abbr is the same as the text it intends to replace, // then treat it as a no-op and return TAB to the editor if (this._emmetActionName === 'expand_abbreviation' && (value === textToReplace || value === textToReplace + '${0}')) { - this._editor.trigger('emmet', Handler.Tab, {}); + CoreEditingCommands.Tab.runEditorCommand(null, this._editor, null); return null; } From 8b94148a0456cb1267edc688534089d057f7ccd8 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 00:41:42 +0200 Subject: [PATCH 0641/1164] Renames --- src/vs/editor/common/controller/cursor.ts | 33 +--- .../controller/cursorDeleteOperations.ts | 48 +++--- .../common/controller/cursorTypeOperations.ts | 156 ++++++++---------- 3 files changed, 103 insertions(+), 134 deletions(-) diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 5c05fddaa84..5df9f478073 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -14,7 +14,7 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection, SelectionDirection, ISelection } from 'vs/editor/common/core/selection'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import { CursorColumns, CursorConfiguration, EditOperationResult, SingleCursorState, IViewModelHelper, CursorContext, CursorState, RevealTarget, IColumnSelectData, ICursors } from 'vs/editor/common/controller/cursorCommon'; +import { CursorColumns, CursorConfiguration, EditOperationResult, IViewModelHelper, CursorContext, CursorState, RevealTarget, IColumnSelectData, ICursors } from 'vs/editor/common/controller/cursorCommon'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { DeleteOperations } from 'vs/editor/common/controller/cursorDeleteOperations'; import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations'; @@ -533,23 +533,6 @@ export class Cursor extends Disposable implements ICursors { // -------------------- START editing operations - // TODO@Alex: remove - private _getAllCursorsModelState(sorted: boolean = false): SingleCursorState[] { - let cursors = this._cursors.getAll(); - - if (sorted) { - cursors = cursors.sort((a, b) => { - return Range.compareRangesUsingStarts(a.modelState.selection, b.modelState.selection); - }); - } - - let r: SingleCursorState[] = []; - for (let i = 0, len = cursors.length; i < len; i++) { - r[i] = cursors[i].modelState; - } - return r; - } - private _type(args: CursorOperationArgs<{ text: string; }>): EditOperationResult { const text = args.eventData.text; @@ -570,21 +553,21 @@ export class Cursor extends Disposable implements ICursors { this._createAndInterpretHandlerCtx(() => { // Decide what all cursors will do up-front - return TypeOperations.typeWithInterceptors(this.context.config, this.context.model, this._getAllCursorsModelState(), chr); + return TypeOperations.typeWithInterceptors(this.context.config, this.context.model, this.getSelections(), chr); }); } return null; } else { - return TypeOperations.typeWithoutInterceptors(this.context.config, this.context.model, this._getAllCursorsModelState(), text); + return TypeOperations.typeWithoutInterceptors(this.context.config, this.context.model, this.getSelections(), text); } } private _replacePreviousChar(args: CursorOperationArgs<{ text: string; replaceCharCnt: number; }>): EditOperationResult { let text = args.eventData.text; let replaceCharCnt = args.eventData.replaceCharCnt; - return TypeOperations.replacePreviousChar(this.context.config, this.context.model, this._getAllCursorsModelState(), text, replaceCharCnt); + return TypeOperations.replacePreviousChar(this.context.config, this.context.model, this.getSelections(), text, replaceCharCnt); } private _compositionStart(args: CursorOperationArgs): EditOperationResult { @@ -625,14 +608,16 @@ export class Cursor extends Disposable implements ICursors { const distributedPaste = this._distributePasteToCursors(args); if (distributedPaste) { - return TypeOperations.distributedPaste(this.context.config, this.context.model, this._getAllCursorsModelState(true), distributedPaste); + let selections = this.getSelections(); + selections = selections.sort(Range.compareRangesUsingStarts); + return TypeOperations.distributedPaste(this.context.config, this.context.model, selections, distributedPaste); } else { - return TypeOperations.paste(this.context.config, this.context.model, this._getAllCursorsModelState(), args.eventData.text, args.eventData.pasteOnNewLine); + return TypeOperations.paste(this.context.config, this.context.model, this.getSelections(), args.eventData.text, args.eventData.pasteOnNewLine); } } private _cut(args: CursorOperationArgs): EditOperationResult { - return DeleteOperations.cut(this.context.config, this.context.model, this._getAllCursorsModelState()); + return DeleteOperations.cut(this.context.config, this.context.model, this.getSelections()); } // -------------------- END editing operations diff --git a/src/vs/editor/common/controller/cursorDeleteOperations.ts b/src/vs/editor/common/controller/cursorDeleteOperations.ts index b6552f40e5d..c968bb49f76 100644 --- a/src/vs/editor/common/controller/cursorDeleteOperations.ts +++ b/src/vs/editor/common/controller/cursorDeleteOperations.ts @@ -5,7 +5,7 @@ 'use strict'; import { ReplaceCommand } from 'vs/editor/common/commands/replaceCommand'; -import { SingleCursorState, CursorColumns, CursorConfiguration, ICursorSimpleModel, EditOperationResult } from 'vs/editor/common/controller/cursorCommon'; +import { CursorColumns, CursorConfiguration, ICursorSimpleModel, EditOperationResult } from 'vs/editor/common/controller/cursorCommon'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { MoveOperations } from 'vs/editor/common/controller/cursorMoveOperations'; @@ -14,16 +14,16 @@ import { ICommand } from "vs/editor/common/editorCommon"; export class DeleteOperations { - public static deleteRight(config: CursorConfiguration, model: ICursorSimpleModel, cursors: Selection[]): [boolean, ICommand[]] { + public static deleteRight(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[]): [boolean, ICommand[]] { let commands: ICommand[] = []; let shouldPushStackElementBefore = false; - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; - let deleteSelection: Range = cursor; + let deleteSelection: Range = selection; if (deleteSelection.isEmpty()) { - let position = cursor.getPosition(); + let position = selection.getPosition(); let rightOfPosition = MoveOperations.right(config, model, position.lineNumber, position.column); deleteSelection = new Range( rightOfPosition.lineNumber, @@ -48,13 +48,13 @@ export class DeleteOperations { return [shouldPushStackElementBefore, commands]; } - private static _isAutoClosingPairDelete(config: CursorConfiguration, model: ICursorSimpleModel, cursors: Selection[]): boolean { + private static _isAutoClosingPairDelete(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[]): boolean { if (!config.autoClosingBrackets) { return false; } - for (let i = 0, len = cursors.length; i < len; i++) { - const selection = cursors[i]; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; const position = selection.getPosition(); if (!selection.isEmpty()) { @@ -79,11 +79,10 @@ export class DeleteOperations { return true; } - private static _runAutoClosingPairDelete(config: CursorConfiguration, model: ICursorSimpleModel, cursors: Selection[]): [boolean, ICommand[]] { + private static _runAutoClosingPairDelete(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[]): [boolean, ICommand[]] { let commands: ICommand[] = []; - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - const position = cursor.getPosition(); + for (let i = 0, len = selections.length; i < len; i++) { + const position = selections[i].getPosition(); const deleteSelection = new Range( position.lineNumber, position.column - 1, @@ -95,21 +94,21 @@ export class DeleteOperations { return [true, commands]; } - public static deleteLeft(config: CursorConfiguration, model: ICursorSimpleModel, cursors: Selection[]): [boolean, ICommand[]] { + public static deleteLeft(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[]): [boolean, ICommand[]] { - if (this._isAutoClosingPairDelete(config, model, cursors)) { - return this._runAutoClosingPairDelete(config, model, cursors); + if (this._isAutoClosingPairDelete(config, model, selections)) { + return this._runAutoClosingPairDelete(config, model, selections); } let commands: ICommand[] = []; let shouldPushStackElementBefore = false; - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; - let deleteSelection: Range = cursor; + let deleteSelection: Range = selection; if (deleteSelection.isEmpty()) { - let position = cursor.getPosition(); + let position = selection.getPosition(); if (config.useTabStops && position.column > 1) { let lineContent = model.getLineContent(position.lineNumber); @@ -155,17 +154,16 @@ export class DeleteOperations { return [shouldPushStackElementBefore, commands]; } - public static cut(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[]): EditOperationResult { + public static cut(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[]): EditOperationResult { let commands: ICommand[] = []; - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - let selection = cursor.selection; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; if (selection.isEmpty()) { if (config.emptySelectionClipboard) { // This is a full line cut - let position = cursor.position; + let position = selection.getPosition(); let startLineNumber: number, startColumn: number, diff --git a/src/vs/editor/common/controller/cursorTypeOperations.ts b/src/vs/editor/common/controller/cursorTypeOperations.ts index 4b8237f13eb..899ff598a82 100644 --- a/src/vs/editor/common/controller/cursorTypeOperations.ts +++ b/src/vs/editor/common/controller/cursorTypeOperations.ts @@ -6,7 +6,7 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { ReplaceCommand, ReplaceCommandWithoutChangingPosition, ReplaceCommandWithOffsetCursorState } from 'vs/editor/common/commands/replaceCommand'; -import { SingleCursorState, CursorColumns, CursorConfiguration, ICursorSimpleModel, EditOperationResult } from 'vs/editor/common/controller/cursorCommon'; +import { CursorColumns, CursorConfiguration, ICursorSimpleModel, EditOperationResult } from 'vs/editor/common/controller/cursorCommon'; import { Range } from 'vs/editor/common/core/range'; import { ICommand, ITokenizedModel } from 'vs/editor/common/editorCommon'; import * as strings from 'vs/base/common/strings'; @@ -21,11 +21,10 @@ import { CursorChangeReason } from "vs/editor/common/controller/cursorEvents"; export class TypeOperations { - public static indent(config: CursorConfiguration, model: ICursorSimpleModel, cursors: Selection[]): ICommand[] { + public static indent(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[]): ICommand[] { let commands: ICommand[] = []; - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - commands[i] = new ShiftCommand(cursor, { + for (let i = 0, len = selections.length; i < len; i++) { + commands[i] = new ShiftCommand(selections[i], { isUnshift: false, tabSize: config.tabSize, oneIndent: config.oneIndent, @@ -35,11 +34,10 @@ export class TypeOperations { return commands; } - public static outdent(config: CursorConfiguration, model: ICursorSimpleModel, cursors: Selection[]): ICommand[] { + public static outdent(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[]): ICommand[] { let commands: ICommand[] = []; - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - commands[i] = new ShiftCommand(cursor, { + for (let i = 0, len = selections.length; i < len; i++) { + commands[i] = new ShiftCommand(selections[i], { isUnshift: true, tabSize: config.tabSize, oneIndent: config.oneIndent, @@ -71,12 +69,10 @@ export class TypeOperations { return newIndentation; } - public static distributedPaste(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[], text: string[]): EditOperationResult { + public static distributedPaste(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[], text: string[]): EditOperationResult { let commands: ICommand[] = []; - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - let selection = cursor.selection; - commands[i] = new ReplaceCommand(selection, text[i]); + for (let i = 0, len = selections.length; i < len; i++) { + commands[i] = new ReplaceCommand(selections[i], text[i]); } return new EditOperationResult(commands, { shouldPushStackElementBefore: true, @@ -85,12 +81,11 @@ export class TypeOperations { }); } - public static paste(config: CursorConfiguration, model: ICursorSimpleModel, cursors: SingleCursorState[], text: string, pasteOnNewLine: boolean): EditOperationResult { + public static paste(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[], text: string, pasteOnNewLine: boolean): EditOperationResult { let commands: ICommand[] = []; - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - let position = cursor.position; - let selection = cursor.selection; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + let position = selection.getPosition(); if (pasteOnNewLine && text.indexOf('\n') !== text.length - 1) { pasteOnNewLine = false; @@ -166,10 +161,10 @@ export class TypeOperations { return new ReplaceCommand(selection, typeText, insertsAutoWhitespace); } - public static tab(config: CursorConfiguration, model: ITokenizedModel, cursors: Selection[]): ICommand[] { + public static tab(config: CursorConfiguration, model: ITokenizedModel, selections: Selection[]): ICommand[] { let commands: ICommand[] = []; - for (let i = 0, len = cursors.length; i < len; i++) { - const selection = cursors[i]; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; if (selection.isEmpty()) { @@ -207,18 +202,18 @@ export class TypeOperations { return commands; } - public static replacePreviousChar(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[], txt: string, replaceCharCnt: number): EditOperationResult { + public static replacePreviousChar(config: CursorConfiguration, model: ITokenizedModel, selections: Selection[], txt: string, replaceCharCnt: number): EditOperationResult { let commands: ICommand[] = []; - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - if (!cursor.selection.isEmpty()) { + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + if (!selection.isEmpty()) { // looks like https://github.com/Microsoft/vscode/issues/2773 // where a cursor operation occured before a canceled composition // => ignore composition commands[i] = null; continue; } - let pos = cursor.position; + let pos = selection.getPosition(); let startColumn = Math.max(1, pos.column - replaceCharCnt); let range = new Range(pos.lineNumber, startColumn, pos.lineNumber, pos.column); commands[i] = new ReplaceCommand(range, txt); @@ -294,20 +289,19 @@ export class TypeOperations { return null; } - private static _isAutoClosingCloseCharType(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[], ch: string): boolean { + private static _isAutoClosingCloseCharType(config: CursorConfiguration, model: ITokenizedModel, selections: Selection[], ch: string): boolean { if (!config.autoClosingBrackets || !config.autoClosingPairsClose.hasOwnProperty(ch)) { return false; } - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - const selection = cursor.selection; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; if (!selection.isEmpty()) { return false; } - const position = cursor.position; + const position = selection.getPosition(); const lineText = model.getLineContent(position.lineNumber); const afterCharacter = lineText.charAt(position.column - 1); @@ -319,11 +313,11 @@ export class TypeOperations { return true; } - private static _runAutoClosingCloseCharType(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[], ch: string): EditOperationResult { + private static _runAutoClosingCloseCharType(config: CursorConfiguration, model: ITokenizedModel, selections: Selection[], ch: string): EditOperationResult { let commands: ICommand[] = []; - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - const position = cursor.position; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; + const position = selection.getPosition(); const typeSelection = new Range(position.lineNumber, position.column, position.lineNumber, position.column + 1); commands[i] = new ReplaceCommand(typeSelection, ch); } @@ -333,19 +327,18 @@ export class TypeOperations { }); } - private static _isAutoClosingOpenCharType(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[], ch: string): boolean { + private static _isAutoClosingOpenCharType(config: CursorConfiguration, model: ITokenizedModel, selections: Selection[], ch: string): boolean { if (!config.autoClosingBrackets || !config.autoClosingPairsOpen.hasOwnProperty(ch)) { return false; } - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - const selection = cursor.selection; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; if (!selection.isEmpty()) { return false; } - const position = cursor.position; + const position = selection.getPosition(); const lineText = model.getLineContent(position.lineNumber); // Do not auto-close ' or " after a word character @@ -397,11 +390,10 @@ export class TypeOperations { return true; } - private static _runAutoClosingOpenCharType(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[], ch: string): EditOperationResult { + private static _runAutoClosingOpenCharType(config: CursorConfiguration, model: ITokenizedModel, selections: Selection[], ch: string): EditOperationResult { let commands: ICommand[] = []; - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - const selection = cursor.selection; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; const closeCharacter = config.autoClosingPairsOpen[ch]; commands[i] = new ReplaceCommandWithOffsetCursorState(selection, ch + closeCharacter, 0, -closeCharacter.length); } @@ -411,14 +403,13 @@ export class TypeOperations { }); } - private static _isSurroundSelectionType(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[], ch: string): boolean { + private static _isSurroundSelectionType(config: CursorConfiguration, model: ITokenizedModel, selections: Selection[], ch: string): boolean { if (!config.autoClosingBrackets || !config.surroundingPairs.hasOwnProperty(ch)) { return false; } - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - const selection = cursor.selection; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; if (selection.isEmpty()) { return false; @@ -446,11 +437,10 @@ export class TypeOperations { return true; } - private static _runSurroundSelectionType(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[], ch: string): EditOperationResult { + private static _runSurroundSelectionType(config: CursorConfiguration, model: ITokenizedModel, selections: Selection[], ch: string): EditOperationResult { let commands: ICommand[] = []; - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - const selection = cursor.selection; + for (let i = 0, len = selections.length; i < len; i++) { + const selection = selections[i]; const closeCharacter = config.surroundingPairs[ch]; commands[i] = new SurroundSelectionCommand(selection, ch, closeCharacter); } @@ -460,12 +450,12 @@ export class TypeOperations { }); } - private static _typeInterceptorElectricChar(config: CursorConfiguration, model: ITokenizedModel, cursor: SingleCursorState, ch: string): EditOperationResult { - if (!config.electricChars.hasOwnProperty(ch) || !cursor.selection.isEmpty()) { + private static _typeInterceptorElectricChar(config: CursorConfiguration, model: ITokenizedModel, selections: Selection, ch: string): EditOperationResult { + if (!config.electricChars.hasOwnProperty(ch) || !selections.isEmpty()) { return null; } - let position = cursor.position; + let position = selections.getPosition(); model.forceTokenization(position.lineNumber); let lineTokens = model.getLineTokens(position.lineNumber); @@ -481,7 +471,7 @@ export class TypeOperations { } if (electricAction.appendText) { - const command = new ReplaceCommandWithOffsetCursorState(cursor.selection, ch + electricAction.appendText, 0, -electricAction.appendText.length); + const command = new ReplaceCommandWithOffsetCursorState(selections, ch + electricAction.appendText, 0, -electricAction.appendText.length); return new EditOperationResult([command], { shouldPushStackElementBefore: false, shouldPushStackElementAfter: true @@ -523,12 +513,12 @@ export class TypeOperations { return null; } - public static typeWithInterceptors(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[], ch: string): EditOperationResult { + public static typeWithInterceptors(config: CursorConfiguration, model: ITokenizedModel, selections: Selection[], ch: string): EditOperationResult { if (ch === '\n') { let commands: ICommand[] = []; - for (let i = 0, len = cursors.length; i < len; i++) { - commands[i] = TypeOperations._enter(config, model, false, cursors[i].selection); + for (let i = 0, len = selections.length; i < len; i++) { + commands[i] = TypeOperations._enter(config, model, false, selections[i]); } return new EditOperationResult(commands, { shouldPushStackElementBefore: true, @@ -536,35 +526,34 @@ export class TypeOperations { }); } - if (this._isAutoClosingCloseCharType(config, model, cursors, ch)) { - return this._runAutoClosingCloseCharType(config, model, cursors, ch); + if (this._isAutoClosingCloseCharType(config, model, selections, ch)) { + return this._runAutoClosingCloseCharType(config, model, selections, ch); } - if (this._isAutoClosingOpenCharType(config, model, cursors, ch)) { - return this._runAutoClosingOpenCharType(config, model, cursors, ch); + if (this._isAutoClosingOpenCharType(config, model, selections, ch)) { + return this._runAutoClosingOpenCharType(config, model, selections, ch); } - if (this._isSurroundSelectionType(config, model, cursors, ch)) { - return this._runSurroundSelectionType(config, model, cursors, ch); + if (this._isSurroundSelectionType(config, model, selections, ch)) { + return this._runSurroundSelectionType(config, model, selections, ch); } // Electric characters make sense only when dealing with a single cursor, // as multiple cursors typing brackets for example would interfer with bracket matching - if (cursors.length === 1) { - const r = this._typeInterceptorElectricChar(config, model, cursors[0], ch); + if (selections.length === 1) { + const r = this._typeInterceptorElectricChar(config, model, selections[0], ch); if (r) { return r; } } - return this.typeWithoutInterceptors(config, model, cursors, ch); + return this.typeWithoutInterceptors(config, model, selections, ch); } - public static typeWithoutInterceptors(config: CursorConfiguration, model: ITokenizedModel, cursors: SingleCursorState[], str: string): EditOperationResult { + public static typeWithoutInterceptors(config: CursorConfiguration, model: ITokenizedModel, selections: Selection[], str: string): EditOperationResult { let commands: ICommand[] = []; - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - commands[i] = new ReplaceCommand(cursor.selection, str); + for (let i = 0, len = selections.length; i < len; i++) { + commands[i] = new ReplaceCommand(selections[i], str); } return new EditOperationResult(commands, { shouldPushStackElementBefore: false, @@ -572,11 +561,10 @@ export class TypeOperations { }); } - public static lineInsertBefore(config: CursorConfiguration, model: ITokenizedModel, cursors: Selection[]): ICommand[] { + public static lineInsertBefore(config: CursorConfiguration, model: ITokenizedModel, selections: Selection[]): ICommand[] { let commands: ICommand[] = []; - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - let lineNumber = cursor.positionLineNumber; + for (let i = 0, len = selections.length; i < len; i++) { + let lineNumber = selections[i].positionLineNumber; if (lineNumber === 1) { commands[i] = new ReplaceCommandWithoutChangingPosition(new Range(1, 1, 1, 1), '\n'); @@ -590,22 +578,20 @@ export class TypeOperations { return commands; } - public static lineInsertAfter(config: CursorConfiguration, model: ITokenizedModel, cursors: Selection[]): ICommand[] { + public static lineInsertAfter(config: CursorConfiguration, model: ITokenizedModel, selections: Selection[]): ICommand[] { let commands: ICommand[] = []; - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - let lineNumber = cursor.positionLineNumber; + for (let i = 0, len = selections.length; i < len; i++) { + const lineNumber = selections[i].positionLineNumber; let column = model.getLineMaxColumn(lineNumber); commands[i] = this._enter(config, model, false, new Range(lineNumber, column, lineNumber, column)); } return commands; } - public static lineBreakInsert(config: CursorConfiguration, model: ITokenizedModel, cursors: Selection[]): ICommand[] { + public static lineBreakInsert(config: CursorConfiguration, model: ITokenizedModel, selections: Selection[]): ICommand[] { let commands: ICommand[] = []; - for (let i = 0, len = cursors.length; i < len; i++) { - const cursor = cursors[i]; - commands[i] = this._enter(config, model, true, cursor); + for (let i = 0, len = selections.length; i < len; i++) { + commands[i] = this._enter(config, model, true, selections[i]); } return commands; } From f9a85226d6a0daac4cee9bca2e36986f9b41f063 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Thu, 18 May 2017 13:58:12 -0700 Subject: [PATCH 0642/1164] Refactoring css file for better readability, again --- .../contrib/suggest/browser/media/suggest.css | 95 ++++++++++--------- .../contrib/suggest/browser/suggestWidget.ts | 11 ++- 2 files changed, 54 insertions(+), 52 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index d5e20221956..f0d8e56e7d5 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -3,14 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -/* Suggest */ +/* Suggest widget*/ .monaco-editor .suggest-widget { z-index: 40; - width: 430px; -} - -.monaco-editor .suggest-widget.docs-expanded { - width: 660px; } .monaco-editor .suggest-widget.visible { @@ -20,38 +15,64 @@ transition: left .05s ease-in-out; } +/** Initial widths **/ + +.monaco-editor .suggest-widget { + width: 430px; +} + +.monaco-editor .suggest-widget > .tree, +.monaco-editor .suggest-widget > .details { + width: 428px; + border-style: solid; + border-width: 1px; +} + +.monaco-editor.hc-black .suggest-widget > .tree, +.monaco-editor.hc-black .suggest-widget > .details { + width: 426px; + border-width: 2px; +} + +/** Adjust width when docs are expanded to the side **/ +.monaco-editor .suggest-widget.docs-side { + width: 660px; +} + +.monaco-editor .suggest-widget.docs-side > .tree, +.monaco-editor .suggest-widget.docs-side > .details { + width: 328px; +} + +.monaco-editor.hc-black .suggest-widget.docs-side > .tree, +.monaco-editor.hc-black .suggest-widget.docs-side > .details { + width: 326px; +} + +/* Styles for Message element for when widget is loading or is empty */ .monaco-editor .suggest-widget > .message { padding-left: 22px; border-style: solid; border-width: 1px; } +.monaco-editor.hc-black .suggest-widget > .message { + border-width: 2px; +} + /** Styles for the list element **/ .monaco-editor .suggest-widget > .tree { height: 100%; - width: 430px; +} + +.monaco-editor .suggest-widget.docs-side > .tree { float: left; - box-sizing: border-box; - border-style: solid; - border-width: 1px; } -.monaco-editor .suggest-widget.list-right > .tree { +.monaco-editor .suggest-widget.docs-side.list-right > .tree { float: right } -.monaco-editor .suggest-widget.docs-below > .tree { - float: none; -} - -.monaco-editor .suggest-widget.docs-expanded > .tree { - width: 330px; -} - -.monaco-editor .suggest-widget.small.docs-expanded > .tree { - width: 430px; -} - /** Styles for each row in the list element **/ .monaco-editor .suggest-widget .monaco-list .monaco-list-row { @@ -123,14 +144,14 @@ .monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .readMore, .monaco-editor .suggest-widget .monaco-list .monaco-list-row > .contents > .main > .type-label, -.monaco-editor .suggest-widget.docs-expanded .monaco-list .monaco-list-row.focused > .contents > .main > .readMore, -.monaco-editor .suggest-widget.docs-expanded .monaco-list .monaco-list-row.focused > .contents > .main > .type-label { +.monaco-editor .suggest-widget.docs-side .monaco-list .monaco-list-row.focused > .contents > .main > .readMore, +.monaco-editor .suggest-widget.docs-side .monaco-list .monaco-list-row.focused > .contents > .main > .type-label, +.monaco-editor .suggest-widget.docs-below .monaco-list .monaco-list-row.focused > .contents > .main > .readMore { display: none; } .monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused > .contents > .main > .readMore, -.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused > .contents > .main > .type-label, -.monaco-editor .suggest-widget.docs-expanded.small .monaco-list .monaco-list-row.focused > .contents > .main > .type-label { +.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused > .contents > .main > .type-label { display: inline; } @@ -187,16 +208,6 @@ display: flex; flex-direction: column; cursor: default; - /* .details does not use border-box, so subtract the border height here (2px). This is the case - because the height of .details is set prorammatically based on .header and .docs, we don't want - our JS to care about the size of the border (which changes based on theme type). */ - width: 328px; - border-style: solid; - border-width: 1px; -} - -.monaco-editor .suggest-widget.small > .details { - width: 430px; } .monaco-editor .suggest-widget .details.no-docs { @@ -241,16 +252,6 @@ background-image: url('./close-dark.svg'); } -.monaco-editor.hc-black .suggest-widget > .tree, -.monaco-editor.hc-black .suggest-widget > .message { - border-width: 2px; -} - -.monaco-editor.hc-black .suggest-widget > .details { - border-width: 2px; - width: 326px; -} - .monaco-editor.vs-dark .suggest-widget .monaco-list .monaco-list-row .icon, .monaco-editor.hc-black .suggest-widget .monaco-list .monaco-list-row .icon { background-image: url('Misc_inverse_16x.svg'); } diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 2c11eb765de..4216f33f89d 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -565,7 +565,7 @@ export class SuggestWidget implements IContentWidget, IDelegate this.adjustDocsPosition(); this._ariaAlert(this.details.getAriaLabel()); } else { - removeClass(this.element, 'docs-expanded'); + removeClass(this.element, 'docs-side'); } }) .then(null, err => !isPromiseCanceledError(err) && onUnexpectedError(err)) @@ -808,7 +808,7 @@ export class SuggestWidget implements IContentWidget, IDelegate if (this.storageService.getBoolean('expandSuggestionDocs', StorageScope.GLOBAL, false)) { this.storageService.store('expandSuggestionDocs', false, StorageScope.GLOBAL); hide(this.details.element); - removeClass(this.element, 'docs-expanded'); + removeClass(this.element, 'docs-side'); this.editor.layoutContentWidget(this); } else { this.storageService.store('expandSuggestionDocs', true, StorageScope.GLOBAL); @@ -822,7 +822,7 @@ export class SuggestWidget implements IContentWidget, IDelegate } show(this.details.element); - addClass(this.element, 'docs-expanded'); + addClass(this.element, 'docs-side'); this.show(); this.editor.focus(); @@ -903,7 +903,7 @@ export class SuggestWidget implements IContentWidget, IDelegate if (this.messageElement.style.display !== 'none' && this.details.element.style.display === 'none' && this.listElement.style.display === 'none') { - addClass(this.element, 'small'); + return; } @@ -929,7 +929,8 @@ export class SuggestWidget implements IContentWidget, IDelegate if (this.element.clientWidth < this.maxWidgetWidth && this.listElement.clientWidth !== this.minWidgetWidth) { // Not enough space to show side by side, so show docs below the list - addClass(this.element, 'small'); + addClass(this.element, 'docs-below'); + removeClass(this.element, 'docs-side'); return; } From 2dfdd52a09b4dbf24366f816cd5f8768f8aef609 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Thu, 18 May 2017 15:53:55 -0700 Subject: [PATCH 0643/1164] Remove flicker when docs are expanded below --- .../contrib/suggest/browser/suggestWidget.ts | 39 ++++++++----------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 4216f33f89d..a572d9beb4b 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -611,6 +611,7 @@ export class SuggestWidget implements IContentWidget, IDelegate show(this.listElement); if (this.storageService.getBoolean('expandSuggestionDocs', StorageScope.GLOBAL, false)) { show(this.details.element); + this.expandSideOrBelow(); } else { hide(this.details.element); } @@ -809,9 +810,13 @@ export class SuggestWidget implements IContentWidget, IDelegate this.storageService.store('expandSuggestionDocs', false, StorageScope.GLOBAL); hide(this.details.element); removeClass(this.element, 'docs-side'); + removeClass(this.element, 'docs-below'); this.editor.layoutContentWidget(this); } else { this.storageService.store('expandSuggestionDocs', true, StorageScope.GLOBAL); + + this.expandSideOrBelow(); + this.showDetails(); } } @@ -822,7 +827,6 @@ export class SuggestWidget implements IContentWidget, IDelegate } show(this.details.element); - addClass(this.element, 'docs-side'); this.show(); this.editor.focus(); @@ -891,32 +895,12 @@ export class SuggestWidget implements IContentWidget, IDelegate this.listElement.style.height = `${height}px`; this.list.layout(height); - this.adjustWidgetWidth(); + this.listElement.style.marginTop = '0px'; this.editor.layoutContentWidget(this); return height; } - private adjustWidgetWidth() { - - // Message element is shown, list and docs are not - if (this.messageElement.style.display !== 'none' - && this.details.element.style.display === 'none' - && this.listElement.style.display === 'none') { - - return; - } - - let matches = this.element.style.maxWidth.match(/(\d+)px/); - if (!matches || Number(matches[1]) >= this.maxWidgetWidth) { - // Reset width - removeClass(this.element, 'small'); - } - - // Reset list margin - this.listElement.style.marginTop = '0px'; - } - private adjustDocsPosition() { const cursorCoords = this.editor.getScrolledVisiblePosition(this.editor.getPosition()); const editorCoords = getDomNodePagePosition(this.editor.getDomNode()); @@ -945,6 +929,17 @@ export class SuggestWidget implements IContentWidget, IDelegate } } + private expandSideOrBelow() { + let matches = this.element.style.maxWidth.match(/(\d+)px/); + if (!matches || Number(matches[1]) < this.maxWidgetWidth) { + addClass(this.element, 'docs-below'); + removeClass(this.element, 'docs-side'); + } else { + addClass(this.element, 'docs-side'); + removeClass(this.element, 'docs-below'); + } + } + private renderDetails(): void { if (this.state === State.Details || this.state === State.Open) { this.details.render(this.list.getFocusedElements()[0]); From 7d2739bfe4bda502a51acc718d305cf11da453b6 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 18 May 2017 15:37:50 -0700 Subject: [PATCH 0644/1164] Remove some unused functions in reader --- .../typescript/src/utils/wireProtocol.ts | 67 +++---------------- 1 file changed, 10 insertions(+), 57 deletions(-) diff --git a/extensions/typescript/src/utils/wireProtocol.ts b/extensions/typescript/src/utils/wireProtocol.ts index b1a4d8a0d89..d88a9256e32 100644 --- a/extensions/typescript/src/utils/wireProtocol.ts +++ b/extensions/typescript/src/utils/wireProtocol.ts @@ -7,12 +7,12 @@ import stream = require('stream'); -let DefaultSize: number = 8192; -let ContentLength: string = 'Content-Length: '; -let ContentLengthSize: number = Buffer.byteLength(ContentLength, 'utf8'); -let Blank: number = new Buffer(' ', 'utf8')[0]; -let BackslashR: number = new Buffer('\r', 'utf8')[0]; -let BackslashN: number = new Buffer('\n', 'utf8')[0]; +const DefaultSize: number = 8192; +const ContentLength: string = 'Content-Length: '; +const ContentLengthSize: number = Buffer.byteLength(ContentLength, 'utf8'); +const Blank: number = new Buffer(' ', 'utf8')[0]; +const BackslashR: number = new Buffer('\r', 'utf8')[0]; +const BackslashN: number = new Buffer('\n', 'utf8')[0]; class ProtocolBuffer { @@ -83,36 +83,6 @@ class ProtocolBuffer { this.index = this.index - sourceStart; return result; } - - public tryReadLine(): string | null { - let end: number = 0; - while (end < this.index && this.buffer[end] !== BackslashR && this.buffer[end] !== BackslashN) { - end++; - } - if (end >= this.index) { - return null; - } - let result = this.buffer.toString('utf8', 0, end); - while (end < this.index && (this.buffer[end] === BackslashR || this.buffer[end] === BackslashN)) { - end++; - } - if (this.index === end) { - this.index = 0; - } else { - this.buffer.copy(this.buffer, 0, end); - this.index = this.index - end; - } - return result; - } - - public get numberOfBytes(): number { - return this.index; - } -} - -export enum ReaderType { - Length = 0, - Line = 1 } export interface ICallback { @@ -126,20 +96,14 @@ export class Reader { private buffer: ProtocolBuffer; private nextMessageLength: number; - public constructor(readable: stream.Readable, callback: ICallback, type: ReaderType = ReaderType.Length) { + public constructor(readable: stream.Readable, callback: ICallback) { this.readable = readable; this.buffer = new ProtocolBuffer(); this.callback = callback; this.nextMessageLength = -1; - if (type === ReaderType.Length) { - this.readable.on('data', (data: Buffer) => { - this.onLengthData(data); - }); - } else if (type === ReaderType.Line) { - this.readable.on('data', (data: Buffer) => { - this.onLineData(data); - }); - } + this.readable.on('data', (data: Buffer) => { + this.onLengthData(data); + }); } private onLengthData(data: Buffer): void { @@ -160,15 +124,4 @@ export class Reader { this.callback(json); } } - - private onLineData(data: Buffer): void { - this.buffer.append(data); - while (true) { - let msg = this.buffer.tryReadLine(); - if (msg === null) { - return; - } - this.callback(JSON.parse(msg)); - } - } } From 7c2d2c37ebd5fc1d502ffe9145dbb732107dc59e Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 18 May 2017 15:42:49 -0700 Subject: [PATCH 0645/1164] Mark a few members readonly --- extensions/typescript/src/utils/wireProtocol.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/typescript/src/utils/wireProtocol.ts b/extensions/typescript/src/utils/wireProtocol.ts index d88a9256e32..3cb8e34348d 100644 --- a/extensions/typescript/src/utils/wireProtocol.ts +++ b/extensions/typescript/src/utils/wireProtocol.ts @@ -91,9 +91,9 @@ export interface ICallback { export class Reader { - private readable: stream.Readable; - private callback: ICallback; - private buffer: ProtocolBuffer; + private readonly readable: stream.Readable; + private readonly callback: ICallback; + private readonly buffer: ProtocolBuffer; private nextMessageLength: number; public constructor(readable: stream.Readable, callback: ICallback) { @@ -115,7 +115,7 @@ export class Reader { return; } } - let msg = this.buffer.tryReadContent(this.nextMessageLength); + const msg = this.buffer.tryReadContent(this.nextMessageLength); if (msg === null) { return; } From 288968f8036f6dc4bb003fcefb2d7649be33bf8d Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 18 May 2017 16:07:54 -0700 Subject: [PATCH 0646/1164] Fix duplicate code ids names being uploaded to ts --- .../typescript/src/features/codeActionProvider.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/extensions/typescript/src/features/codeActionProvider.ts b/extensions/typescript/src/features/codeActionProvider.ts index aea55cef7ed..0a9d297987c 100644 --- a/extensions/typescript/src/features/codeActionProvider.ts +++ b/extensions/typescript/src/features/codeActionProvider.ts @@ -58,7 +58,7 @@ export default class TypeScriptCodeActionProvider implements CodeActionProvider }; return this.getSupportedActionsForContext(context) .then(supportedActions => { - if (!supportedActions.length) { + if (!supportedActions.size) { return []; } return this.client.execute('getCodeFixes', { @@ -67,8 +67,8 @@ export default class TypeScriptCodeActionProvider implements CodeActionProvider endLine: range.end.line + 1, startOffset: range.start.character + 1, endOffset: range.end.character + 1, - errorCodes: supportedActions - }, token).then(response => response.body || []); + errorCodes: Array.from(supportedActions) + } as Proto.CodeFixRequestArgs, token).then(response => response.body || []); }) .then(codeActions => codeActions.map(action => this.actionToEdit(source, action))); } @@ -87,11 +87,11 @@ export default class TypeScriptCodeActionProvider implements CodeActionProvider return this._supportedCodeActions; } - private getSupportedActionsForContext(context: CodeActionContext) { + private getSupportedActionsForContext(context: CodeActionContext): Thenable> { return this.supportedCodeActions.then(supportedActions => - context.diagnostics + new Set(context.diagnostics .map(diagnostic => +diagnostic.code) - .filter(code => supportedActions[code])); + .filter(code => supportedActions[code]))); } private actionToEdit(source: Source, action: Proto.CodeAction): Command { From 6d8e64ee3f5f033a7f8dbc22f93fbef2b74fc4fc Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 18 May 2017 16:24:23 -0700 Subject: [PATCH 0647/1164] Add error handler for reader --- .../typescript/src/typescriptServiceClient.ts | 38 +++++++++---------- .../typescript/src/utils/wireProtocol.ts | 32 ++++++++++------ 2 files changed, 39 insertions(+), 31 deletions(-) diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index f10338b0cd7..db669ae5858 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -328,7 +328,9 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient } private logTrace(message: string, data?: any): void { - this.logger.logLevel('Trace', message, data); + if (this.trace !== Trace.Off) { + this.logger.logLevel('Trace', message, data); + } } public logTelemetry(eventName: string, properties?: { [prop: string]: string }) { @@ -464,13 +466,14 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient } let value = process.env.TSS_DEBUG; if (value) { - let port = parseInt(value); + const port = parseInt(value); if (!isNaN(port)) { this.info(`TSServer started in debug mode using port ${port}`); options.execArgv = [`--debug=${port}`]; } } - let args: string[] = []; + + const args: string[] = []; if (this.apiVersion.has206Features()) { args.push('--useSingleInferredProject'); if (workspace.getConfiguration().get('typescript.disableAutomaticTypeAcquisition', false)) { @@ -540,9 +543,12 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient } this.serviceExited(true); }); - this.reader = new Reader(childProcess.stdout, (msg) => { - this.dispatchMessage(msg); - }); + + this.reader = new Reader( + childProcess.stdout, + (msg) => { this.dispatchMessage(msg); }, + error => { this.error('ReaderError', error); }); + this._onReady.resolve(); resolve(childProcess); this.serviceStarted(resendModels); @@ -759,7 +765,7 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient }); this.callbacks = Object.create(null); if (restart) { - let diff = Date.now() - this.lastStart; + const diff = Date.now() - this.lastStart; this.numberRestarts++; let startService = true; if (this.numberRestarts > 5) { @@ -902,17 +908,13 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient for (let i = 0; i < this.requestQueue.length; i++) { if (this.requestQueue[i].request.seq === seq) { this.requestQueue.splice(i, 1); - if (this.trace !== Trace.Off) { - this.logTrace(`TypeScript Service: canceled request with sequence number ${seq}`); - } + this.logTrace(`TypeScript Service: canceled request with sequence number ${seq}`); return true; } } if (this.apiVersion.has222Features() && this.cancellationPipeName) { - if (this.trace !== Trace.Off) { - this.logTrace(`TypeScript Service: trying to cancel ongoing request with sequence number ${seq}`); - } + this.logTrace(`TypeScript Service: trying to cancel ongoing request with sequence number ${seq}`); try { fs.writeFileSync(this.cancellationPipeName + seq, ''); return true; @@ -921,17 +923,15 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient } } - if (this.trace !== Trace.Off) { - this.logTrace(`TypeScript Service: tried to cancel request with sequence number ${seq}. But request got already delivered.`); - } + this.logTrace(`TypeScript Service: tried to cancel request with sequence number ${seq}. But request got already delivered.`); return false; } private dispatchMessage(message: Proto.Message): void { try { if (message.type === 'response') { - let response: Proto.Response = message; - let p = this.callbacks[response.request_seq]; + const response: Proto.Response = message as Proto.Response; + const p = this.callbacks[response.request_seq]; if (p) { this.traceResponse(response, p.start); delete this.callbacks[response.request_seq]; @@ -943,7 +943,7 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient } } } else if (message.type === 'event') { - let event: Proto.Event = message; + const event: Proto.Event = message; this.traceEvent(event); if (event.event === 'syntaxDiag') { this.host.syntaxDiagnosticsReceived(event as Proto.DiagnosticEvent); diff --git a/extensions/typescript/src/utils/wireProtocol.ts b/extensions/typescript/src/utils/wireProtocol.ts index 3cb8e34348d..218d461f853 100644 --- a/extensions/typescript/src/utils/wireProtocol.ts +++ b/extensions/typescript/src/utils/wireProtocol.ts @@ -96,7 +96,11 @@ export class Reader { private readonly buffer: ProtocolBuffer; private nextMessageLength: number; - public constructor(readable: stream.Readable, callback: ICallback) { + public constructor( + readable: stream.Readable, + callback: ICallback, + private readonly onError: (error: any) => void = () => ({}) + ) { this.readable = readable; this.buffer = new ProtocolBuffer(); this.callback = callback; @@ -107,21 +111,25 @@ export class Reader { } private onLengthData(data: Buffer): void { - this.buffer.append(data); - while (true) { - if (this.nextMessageLength === -1) { - this.nextMessageLength = this.buffer.tryReadContentLength(); + try { + this.buffer.append(data); + while (true) { if (this.nextMessageLength === -1) { + this.nextMessageLength = this.buffer.tryReadContentLength(); + if (this.nextMessageLength === -1) { + return; + } + } + const msg = this.buffer.tryReadContent(this.nextMessageLength); + if (msg === null) { return; } + this.nextMessageLength = -1; + const json = JSON.parse(msg); + this.callback(json); } - const msg = this.buffer.tryReadContent(this.nextMessageLength); - if (msg === null) { - return; - } - this.nextMessageLength = -1; - let json = JSON.parse(msg); - this.callback(json); + } catch (e) { + this.onError(e); } } } From b8b81b73b4501982ba1fa8b65fd17fe62e2ffdc5 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 18 May 2017 17:33:54 -0700 Subject: [PATCH 0648/1164] add tsserver.debug option --- .vscode/launch.json | 11 +++++ .../typescript/src/typescriptServiceClient.ts | 40 +++++++++++++++---- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 7e923598730..45c4da71839 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -163,6 +163,17 @@ "outFiles": [ "${workspaceRoot}/extensions/git/out/**/*.js" ] + }, + { + "name": "Attach to TS Server", + "type": "node", + "request": "attach", + "port": 5859, + "sourceMaps": true, + "protocol": "legacy", + "outFiles": [ + "${workspaceRoot}/extensions/node_modules/typescript/lib/**/*.js" + ] } ], "compounds": [ diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index db669ae5858..525fd8e0eec 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -9,6 +9,7 @@ import * as cp from 'child_process'; import * as path from 'path'; import * as fs from 'fs'; import * as os from 'os'; +import * as net from 'net'; import * as electron from './utils/electron'; import { Reader } from './utils/wireProtocol'; @@ -415,6 +416,8 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient } return modulePath; }).then(modulePath => { + return this.getDebugPort().then(debugPort => ({ modulePath, debugPort })); + }).then(({ modulePath, debugPort }) => { return this.servicePromise = new Promise((resolve, reject) => { const tsConfig = workspace.getConfiguration('typescript'); @@ -458,19 +461,16 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient this.lastError = null; try { - let options: electron.IForkOptions = { + const options: electron.IForkOptions = { execArgv: [] // [`--debug-brk=5859`] }; if (workspace.rootPath) { options.cwd = workspace.rootPath; } - let value = process.env.TSS_DEBUG; - if (value) { - const port = parseInt(value); - if (!isNaN(port)) { - this.info(`TSServer started in debug mode using port ${port}`); - options.execArgv = [`--debug=${port}`]; - } + + if (debugPort && !isNaN(debugPort)) { + this.info(`TSServer started in debug mode using port ${debugPort}`); + options.execArgv = [`--debug=${debugPort}`]; } const args: string[] = []; @@ -560,6 +560,30 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient }); } + private getDebugPort(): Promise { + const value = process.env.TSS_DEBUG; + if (value) { + const port = parseInt(value); + if (!isNaN(port)) { + return Promise.resolve(port); + } + } + + if (workspace.getConfiguration('typescript').get('tsserver.debug', false)) { + return Promise.race([ + new Promise((resolve) => setTimeout(() => resolve(undefined), 1000)), + new Promise((resolve) => { + const server = net.createServer(sock => sock.end()); + server.listen(0, function () { + resolve(server.address().port); + }); + }) + ]); + } + + return Promise.resolve(undefined); + } + public onVersionStatusClicked(): Thenable { return this.showVersionPicker(false); } From cdaa5f28efd6d6fa012a34a92a6cf3fe57928b38 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 18 May 2017 21:35:15 -0700 Subject: [PATCH 0649/1164] Record when tsserver exits with code or errors --- extensions/typescript/src/typescriptServiceClient.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index 525fd8e0eec..18b0f81e5ee 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -529,6 +529,7 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient if (this.tsServerLogFile) { this.error(`TSServer log file: ${this.tsServerLogFile}`); } + this.logTelemetry('tsserver.error'); this.serviceExited(false); }); childProcess.on('exit', (code: any) => { @@ -536,6 +537,7 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient this.info(`TSServer exited`); } else { this.error(`TSServer exited with code: ${code}`); + this.logTelemetry('tsserver.exitWithCode', { code: code }); } if (this.tsServerLogFile) { From 452ddbf4b13d840a6768289c21d92b3882d33c7e Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Thu, 18 May 2017 22:03:50 -0700 Subject: [PATCH 0650/1164] Fix the flicker while toggling suggest docs on the right end of the screen --- src/vs/editor/contrib/suggest/browser/media/suggest.css | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index f0d8e56e7d5..fe64def759b 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -8,13 +8,6 @@ z-index: 40; } -.monaco-editor .suggest-widget.visible { - -webkit-transition: left .05s ease-in-out; - -moz-transition: left .05s ease-in-out; - -o-transition: left .05s ease-in-out; - transition: left .05s ease-in-out; -} - /** Initial widths **/ .monaco-editor .suggest-widget { From b73e961439290447a7c6423469fdc40cd5c9c77b Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 18 May 2017 22:03:10 -0700 Subject: [PATCH 0651/1164] Split tracer out into own file --- .../typescript/src/typescriptServiceClient.ts | 89 ++--------------- extensions/typescript/src/utils/tracer.ts | 95 +++++++++++++++++++ 2 files changed, 105 insertions(+), 79 deletions(-) create mode 100644 extensions/typescript/src/utils/tracer.ts diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index 18b0f81e5ee..4ea7ba42287 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -25,6 +25,7 @@ import * as is from './utils/is'; import * as nls from 'vscode-nls'; import TelemetryReporter from "./utils/telemetry"; +import Tracer from "./utils/tracer"; const localize = nls.loadMessageBundle(); interface CallbackItem { @@ -43,28 +44,6 @@ interface RequestItem { callbacks: CallbackItem | null; } -enum Trace { - Off, - Messages, - Verbose -} - -namespace Trace { - export function fromString(value: string): Trace { - value = value.toLowerCase(); - switch (value) { - case 'off': - return Trace.Off; - case 'messages': - return Trace.Messages; - case 'verbose': - return Trace.Verbose; - default: - return Trace.Off; - } - } -} - enum TsServerLogLevel { Off, Normal, @@ -135,7 +114,7 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient private localTsdk: string | null; private _checkGlobalTSCVersion: boolean; private _experimentalAutoBuild: boolean; - private trace: Trace; + private tracer: Tracer; private readonly logger: Logger = new Logger(); private tsServerLogFile: string | null = null; private tsServerLogLevel: TsServerLogLevel = TsServerLogLevel.Off; @@ -195,7 +174,7 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient this._experimentalAutoBuild = false; // configuration.get('typescript.tsserver.experimentalAutoBuild', false); this._apiVersion = new API('1.0.0'); this._checkGlobalTSCVersion = true; - this.trace = this.readTrace(); + this.tracer = new Tracer(this.logger); this.tsServerLogLevel = this.readTsServerLogLevel(); this.checkJs = this.readCheckJs(); @@ -205,7 +184,7 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient let oldLocalTsdk = this.localTsdk; let oldCheckJs = this.checkJs; - this.trace = this.readTrace(); + this.tracer.updateConfiguration(); this.tsServerLogLevel = this.readTsServerLogLevel(); const configuration = workspace.getConfiguration(); @@ -230,7 +209,6 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient public restartTsServer(): void { const start = () => { - this.trace = this.readTrace(); this.tsServerLogLevel = this.readTsServerLogLevel(); this.servicePromise = this.startService(); return this.servicePromise; @@ -283,14 +261,6 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient return this._onTypesInstallerInitializationFailed.event; } - private readTrace(): Trace { - let result: Trace = Trace.fromString(workspace.getConfiguration().get('typescript.tsserver.trace', 'off')); - if (result === Trace.Off && !!process.env.TSS_TRACE) { - result = Trace.Messages; - } - return result; - } - private readTsServerLogLevel(): TsServerLogLevel { const setting = workspace.getConfiguration().get('typescript.tsserver.log', 'off'); return TsServerLogLevel.fromString(setting); @@ -328,12 +298,6 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient this.logger.error(message, data); } - private logTrace(message: string, data?: any): void { - if (this.trace !== Trace.Off) { - this.logger.logLevel('Trace', message, data); - } - } - public logTelemetry(eventName: string, properties?: { [prop: string]: string }) { this.telemetryReporter.logTelemetry(eventName, properties); } @@ -912,7 +876,7 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient private sendRequest(requestItem: RequestItem): void { let serverRequest = requestItem.request; - this.traceRequest(serverRequest, !!requestItem.callbacks); + this.tracer.traceRequest(serverRequest, !!requestItem.callbacks, this.requestQueue.length); if (requestItem.callbacks) { this.callbacks[serverRequest.seq] = requestItem.callbacks; this.pendingResponses++; @@ -934,13 +898,13 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient for (let i = 0; i < this.requestQueue.length; i++) { if (this.requestQueue[i].request.seq === seq) { this.requestQueue.splice(i, 1); - this.logTrace(`TypeScript Service: canceled request with sequence number ${seq}`); + this.tracer.logTrace(`TypeScript Service: canceled request with sequence number ${seq}`); return true; } } if (this.apiVersion.has222Features() && this.cancellationPipeName) { - this.logTrace(`TypeScript Service: trying to cancel ongoing request with sequence number ${seq}`); + this.tracer.logTrace(`TypeScript Service: trying to cancel ongoing request with sequence number ${seq}`); try { fs.writeFileSync(this.cancellationPipeName + seq, ''); return true; @@ -949,7 +913,7 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient } } - this.logTrace(`TypeScript Service: tried to cancel request with sequence number ${seq}. But request got already delivered.`); + this.tracer.logTrace(`TypeScript Service: tried to cancel request with sequence number ${seq}. But request got already delivered.`); return false; } @@ -959,7 +923,7 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient const response: Proto.Response = message as Proto.Response; const p = this.callbacks[response.request_seq]; if (p) { - this.traceResponse(response, p.start); + this.tracer.traceResponse(response, p.start); delete this.callbacks[response.request_seq]; this.pendingResponses--; if (response.success) { @@ -970,7 +934,7 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient } } else if (message.type === 'event') { const event: Proto.Event = message; - this.traceEvent(event); + this.tracer.traceEvent(event); if (event.event === 'syntaxDiag') { this.host.syntaxDiagnosticsReceived(event as Proto.DiagnosticEvent); } else if (event.event === 'semanticDiag') { @@ -1032,37 +996,4 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient this.sendNextRequests(); } } - - private traceRequest(request: Proto.Request, responseExpected: boolean): void { - if (this.trace === Trace.Off) { - return; - } - let data: string | undefined = undefined; - if (this.trace === Trace.Verbose && request.arguments) { - data = `Arguments: ${JSON.stringify(request.arguments, null, 4)}`; - } - this.logTrace(`Sending request: ${request.command} (${request.seq}). Response expected: ${responseExpected ? 'yes' : 'no'}. Current queue length: ${this.requestQueue.length}`, data); - } - - private traceResponse(response: Proto.Response, startTime: number): void { - if (this.trace === Trace.Off) { - return; - } - let data: string | undefined = undefined; - if (this.trace === Trace.Verbose && response.body) { - data = `Result: ${JSON.stringify(response.body, null, 4)}`; - } - this.logTrace(`Response received: ${response.command} (${response.request_seq}). Request took ${Date.now() - startTime} ms. Success: ${response.success} ${!response.success ? '. Message: ' + response.message : ''}`, data); - } - - private traceEvent(event: Proto.Event): void { - if (this.trace === Trace.Off) { - return; - } - let data: string | undefined = undefined; - if (this.trace === Trace.Verbose && event.body) { - data = `Data: ${JSON.stringify(event.body, null, 4)}`; - } - this.logTrace(`Event received: ${event.event} (${event.seq}).`, data); - } } \ No newline at end of file diff --git a/extensions/typescript/src/utils/tracer.ts b/extensions/typescript/src/utils/tracer.ts new file mode 100644 index 00000000000..078d2e6f45a --- /dev/null +++ b/extensions/typescript/src/utils/tracer.ts @@ -0,0 +1,95 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { workspace } from 'vscode'; + +import * as Proto from '../protocol'; +import Logger from './logger'; + + +enum Trace { + Off, + Messages, + Verbose +} + +namespace Trace { + export function fromString(value: string): Trace { + value = value.toLowerCase(); + switch (value) { + case 'off': + return Trace.Off; + case 'messages': + return Trace.Messages; + case 'verbose': + return Trace.Verbose; + default: + return Trace.Off; + } + } +} + +export default class Tracer { + private trace: Trace; + + constructor( + private readonly logger: Logger + ) { + this.updateConfiguration(); + } + + public updateConfiguration() { + this.trace = Tracer.readTrace(); + } + + private static readTrace(): Trace { + let result: Trace = Trace.fromString(workspace.getConfiguration().get('typescript.tsserver.trace', 'off')); + if (result === Trace.Off && !!process.env.TSS_TRACE) { + result = Trace.Messages; + } + return result; + } + + public traceRequest(request: Proto.Request, responseExpected: boolean, queueLength: number): void { + if (this.trace === Trace.Off) { + return; + } + let data: string | undefined = undefined; + if (this.trace === Trace.Verbose && request.arguments) { + data = `Arguments: ${JSON.stringify(request.arguments, null, 4)}`; + } + this.logTrace(`Sending request: ${request.command} (${request.seq}). Response expected: ${responseExpected ? 'yes' : 'no'}. Current queue length: ${queueLength}`, data); + } + + public traceResponse(response: Proto.Response, startTime: number): void { + if (this.trace === Trace.Off) { + return; + } + let data: string | undefined = undefined; + if (this.trace === Trace.Verbose && response.body) { + data = `Result: ${JSON.stringify(response.body, null, 4)}`; + } + this.logTrace(`Response received: ${response.command} (${response.request_seq}). Request took ${Date.now() - startTime} ms. Success: ${response.success} ${!response.success ? '. Message: ' + response.message : ''}`, data); + } + + public traceEvent(event: Proto.Event): void { + if (this.trace === Trace.Off) { + return; + } + let data: string | undefined = undefined; + if (this.trace === Trace.Verbose && event.body) { + data = `Data: ${JSON.stringify(event.body, null, 4)}`; + } + this.logTrace(`Event received: ${event.event} (${event.seq}).`, data); + } + + public logTrace(message: string, data?: any): void { + if (this.trace !== Trace.Off) { + this.logger.logLevel('Trace', message, data); + } + } +} \ No newline at end of file From 09c97bca0f91ff93dcc2b13f67d9586ed861a9e8 Mon Sep 17 00:00:00 2001 From: Kaide Mu Date: Fri, 19 May 2017 07:06:27 +0200 Subject: [PATCH 0652/1164] Markdown: Capture right parenthesis as part of url (#26449) * Capture right parenthesis as part of url * Update markdown link pattern * Fix link highlighting when there is nested img and link href --- extensions/markdown/src/documentLinkProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/markdown/src/documentLinkProvider.ts b/extensions/markdown/src/documentLinkProvider.ts index 2b2bde5d535..4cf4055c940 100644 --- a/extensions/markdown/src/documentLinkProvider.ts +++ b/extensions/markdown/src/documentLinkProvider.ts @@ -10,7 +10,7 @@ import * as path from 'path'; export default class MarkdownDocumentLinkProvider implements vscode.DocumentLinkProvider { - private _linkPattern = /(\[[^\]]*\]\(\s*?)([^\s\)]+?)(\s+[^\)]+)?\)/g; + private _linkPattern = /(\[[^\]]*\]\(\s*?)(((((?=.*\)\)+)|(?=.*\)\]+))[^\s\)]+?)|([^\s]+)))\)/g; constructor() { } From 61205ceca3f9b5993f9fde3b73695d6be9ad23e9 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 19 May 2017 09:56:32 +0200 Subject: [PATCH 0653/1164] fix typo --- src/vs/workbench/parts/debug/node/debugAdapter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/node/debugAdapter.ts b/src/vs/workbench/parts/debug/node/debugAdapter.ts index 973340ea1d9..4deae35b1b0 100644 --- a/src/vs/workbench/parts/debug/node/debugAdapter.ts +++ b/src/vs/workbench/parts/debug/node/debugAdapter.ts @@ -183,7 +183,7 @@ export class Adapter { enum: [this.type], description: nls.localize('debugType', "Type of configuration."), pattern: '^(?!node2)', - errorMessage: nls.localize('debugTypeNotRecognised', "The debug type is not recoginzed. Make sure that you have a corresponding debug extension installed and that it is enabled."), + errorMessage: nls.localize('debugTypeNotRecognised', "The debug type is not recognized. Make sure that you have a corresponding debug extension installed and that it is enabled."), patternErrorMessage: nls.localize('node2NotSupported', "\"node2\" is no longer supported, use \"node\" instead and set the \"protocol\" attribute to \"inspector\".") }; properties['name'] = { From ec76a9fc5146b822cdb14b982ac3e5b470dd646a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 19 May 2017 10:00:18 +0200 Subject: [PATCH 0654/1164] fix #26914 --- src/vs/editor/contrib/snippet/browser/snippetController2.ts | 2 +- src/vs/editor/contrib/snippet/browser/snippetSession.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 1b31742753b..748e4d190cb 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -87,7 +87,7 @@ export class SnippetController2 { if (!this._snippet.hasPlaceholder) { // don't listen for selection changes and don't // update context keys when the snippet is plain text - return; + return this.cancel(); } if (this._snippet.isAtFinalPlaceholder || !this._snippet.isSelectionWithPlaceholders()) { diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts index 2b2c9ca44f2..d9691b82918 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -297,8 +297,8 @@ export class SnippetSession { ); const model = this._editor.getModel(); const selections = this._editor.getSelections(); - const newSelections = model.pushEditOperations(selections, edits, () => { - return this._move(true); + const newSelections = model.pushEditOperations(selections, edits, undoEdits => { + return undoEdits.map(edit => Selection.fromPositions(edit.range.getEndPosition())); }); this._editor.setSelections(newSelections); } From 7b6b4d0886b4012ea238bacadd2369b4e07468b7 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 19 May 2017 10:49:24 +0200 Subject: [PATCH 0655/1164] filterText must match when it is defined, fixes #26874 --- .../suggest/browser/completionModel.ts | 30 +++++++++++++------ .../test/browser/completionModel.test.ts | 20 +++++++++++++ 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/completionModel.ts b/src/vs/editor/contrib/suggest/browser/completionModel.ts index dd84990104e..e3bc875458f 100644 --- a/src/vs/editor/contrib/suggest/browser/completionModel.ts +++ b/src/vs/editor/contrib/suggest/browser/completionModel.ts @@ -124,20 +124,32 @@ export class CompletionModel { word = wordLen === 0 ? '' : leadingLineContent.slice(-wordLen); } - let match = fuzzyScore(word, suggestion.label); - if (match) { - item.score = match[0]; - item.matches = match[1]; - } else { - if (typeof suggestion.filterText === 'string') { - match = fuzzyScore(word, suggestion.filterText); - } + if (typeof suggestion.filterText === 'string') { + // when there is a `filterText` it must match the `word`. + // if it matches we check with the label to compute highlights + // and if that doesn't yield a result we have no highlights, + // despite having the match + let match = fuzzyScore(word, suggestion.filterText); if (!match) { continue; } item.score = match[0]; - item.matches = []; // don't use the filterText-matches + item.matches = []; + match = fuzzyScore(word, suggestion.label); + if (match) { + item.matches = match[1]; + } + } else { + // by default match `word` against the `label` + let match = fuzzyScore(word, suggestion.label); + if (match) { + item.score = match[0]; + item.matches = match[1]; + } else { + continue; + } } + item.idx = i; this._filteredItems.push(item); diff --git a/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts b/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts index c5f80a483cb..ba122d64d51 100644 --- a/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts +++ b/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts @@ -181,4 +181,24 @@ suite('CompletionModel', function () { assert.equal(b.suggestion.label, 'Semver'); assert.ok(a.score > b.score); // snippet really demoted }); + + test('filterText seems ignored in autocompletion, #26874', function () { + + const item1 = createSuggestItem('Map - java.util', 1, 'property'); + item1.suggestion.filterText = 'Map'; + const item2 = createSuggestItem('Map - java.util', 1, 'property'); + + model = new CompletionModel([item1, item2], 1, { + leadingLineContent: 'M', + characterCountDelta: 0 + }); + + assert.equal(model.items.length, 2); + + model.lineContext = { + leadingLineContent: 'Map ', + characterCountDelta: 3 + }; + assert.equal(model.items.length, 1); + }); }); From f15ff4e6eedb32bad226084e9bf2f5078c136b95 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 19 May 2017 10:58:04 +0200 Subject: [PATCH 0656/1164] update hockeyapp for win64 --- package.json | 2 +- src/vs/platform/node/product.ts | 3 ++- src/vs/workbench/electron-browser/shell.ts | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index f94b92357ae..fa2e5bddfa5 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "code-oss-dev", "version": "1.13.0", "electronVersion": "1.6.6", - "distro": "1dc6b8ea29727a80a9cf0a8832e6d1c16623fe40", + "distro": "a1870d5e65d959a5ee8a4c7fce08b136ca47dd79", "author": { "name": "Microsoft Corporation" }, diff --git a/src/vs/platform/node/product.ts b/src/vs/platform/node/product.ts index f92b896b62d..ece6de31f9b 100644 --- a/src/vs/platform/node/product.ts +++ b/src/vs/platform/node/product.ts @@ -56,7 +56,8 @@ export interface IProductConfiguration { checksums: { [path: string]: string; }; checksumFailMoreInfoUrl: string; hockeyApp: { - 'win32': string; + 'win32-ia32': string; + 'win32-x64': string; 'linux-ia32': string; 'linux-x64': string; 'darwin': string; diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 1f25faacf43..bec5d37606b 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -174,7 +174,7 @@ export class WorkbenchShell { let submitURL: string; if (platform.isWindows) { - submitURL = product.hockeyApp.win32; + submitURL = product.hockeyApp[`win32-${process.arch}`]; } else if (platform.isMacintosh) { submitURL = product.hockeyApp.darwin; } else if (platform.isLinux) { From 05fa3b90ffc4b2df71fd159febf65a06e78abf3c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 19 May 2017 11:03:57 +0200 Subject: [PATCH 0657/1164] remove unit test launch configuration --- .vscode/launch.json | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 45c4da71839..d56ca22e59d 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,34 +1,6 @@ { "version": "0.1.0", "configurations": [ - { - "type": "node", - "request": "launch", - "name": "Unit Tests", - "protocol": "legacy", - "program": "${workspaceRoot}/node_modules/mocha/bin/_mocha", - "runtimeExecutable": "${workspaceRoot}/.build/electron/Code - OSS.app/Contents/MacOS/Electron", - "windows": { - "runtimeExecutable": "${workspaceRoot}/.build/electron/Code - OSS.exe" - }, - "linux": { - "runtimeExecutable": "${workspaceRoot}/.build/electron/code-oss" - }, - "stopOnEntry": false, - "args": [ - "--timeout", - "2000" - ], - "cwd": "${workspaceRoot}", - "env": { - "ELECTRON_RUN_AS_NODE": "true" - }, - "sourceMaps": true, - "outFiles": [ - "${workspaceRoot}/out/**/*.js" - ], - "preLaunchTask": "electron" - }, { "type": "node", "request": "launch", From 8431be77399c24b0dbb7e5fc67bdeb703807f029 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 19 May 2017 12:07:43 +0200 Subject: [PATCH 0658/1164] Theme: Sidebar default color foreground (fixes #26720) --- .../browser/parts/quickopen/quickOpenController.ts | 6 +++--- src/vs/workbench/browser/parts/sidebar/sidebarPart.ts | 3 ++- src/vs/workbench/common/theme.ts | 6 ++++++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index 7e7aa6fed45..e86aa2e27e3 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -49,7 +49,7 @@ import { IContextKeyService, RawContextKey, IContextKey } from 'vs/platform/cont import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IListService } from 'vs/platform/list/browser/listService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; +import { SIDE_BAR_BACKGROUND, SIDE_BAR_FOREGROUND } from 'vs/workbench/common/theme'; import { attachQuickOpenStyler } from 'vs/platform/theme/common/styler'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -291,7 +291,7 @@ export class QuickOpenController extends Component implements IQuickOpenService }, this.telemetryService ); - this.toUnbind.push(attachQuickOpenStyler(this.pickOpenWidget, this.themeService, { background: SIDE_BAR_BACKGROUND })); + this.toUnbind.push(attachQuickOpenStyler(this.pickOpenWidget, this.themeService, { background: SIDE_BAR_BACKGROUND, foreground: SIDE_BAR_FOREGROUND })); const pickOpenContainer = this.pickOpenWidget.create(); this.toUnbind.push(this.listService.register(this.pickOpenWidget.getTree())); @@ -553,7 +553,7 @@ export class QuickOpenController extends Component implements IQuickOpenService }, this.telemetryService ); - this.toUnbind.push(attachQuickOpenStyler(this.quickOpenWidget, this.themeService, { background: SIDE_BAR_BACKGROUND })); + this.toUnbind.push(attachQuickOpenStyler(this.quickOpenWidget, this.themeService, { background: SIDE_BAR_BACKGROUND, foreground: SIDE_BAR_FOREGROUND })); const quickOpenContainer = this.quickOpenWidget.create(); this.toUnbind.push(this.listService.register(this.quickOpenWidget.getTree())); diff --git a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts index 7c0e4827a2d..f9087b6c6ce 100644 --- a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts +++ b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts @@ -26,7 +26,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import Event from 'vs/base/common/event'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { contrastBorder } from 'vs/platform/theme/common/colorRegistry'; -import { SIDE_BAR_TITLE_FOREGROUND, SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; +import { SIDE_BAR_TITLE_FOREGROUND, SIDE_BAR_BACKGROUND, SIDE_BAR_FOREGROUND } from 'vs/workbench/common/theme'; export class SidebarPart extends CompositePart { @@ -82,6 +82,7 @@ export class SidebarPart extends CompositePart { const container = this.getContainer(); container.style('background-color', this.getColor(SIDE_BAR_BACKGROUND)); + container.style('color', this.getColor(SIDE_BAR_FOREGROUND)); const contrastBorderColor = this.getColor(contrastBorder); const isPositionLeft = this.partService.getSideBarPosition() === SideBarPosition.LEFT; diff --git a/src/vs/workbench/common/theme.ts b/src/vs/workbench/common/theme.ts index 9a4426de311..6600353536c 100644 --- a/src/vs/workbench/common/theme.ts +++ b/src/vs/workbench/common/theme.ts @@ -198,6 +198,12 @@ export const SIDE_BAR_BACKGROUND = registerColor('sideBar.background', { hc: '#000000' }, nls.localize('sideBarBackground', "Side bar background color. The side bar is the container for views like explorer and search.")); +export const SIDE_BAR_FOREGROUND = registerColor('sideBar.foreground', { + dark: null, + light: null, + hc: null +}, nls.localize('sideBarForeground', "Side bar foreground color. The side bar is the container for views like explorer and search.")); + export const SIDE_BAR_TITLE_FOREGROUND = registerColor('sideBarTitle.foreground', { dark: '#BBBBBB', light: '#6f6f6f', From 3623fee7d7b20204e13058f4b6f8773ec7f281bf Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 19 May 2017 12:09:04 +0200 Subject: [PATCH 0659/1164] next try to fix #26524 --- src/vs/workbench/api/node/extHostLanguageFeatures.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index 38c1be8627e..2bf60e23f7a 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -554,7 +554,7 @@ class SuggestAdapter { } private _convertCompletionItem(item: vscode.CompletionItem, position: vscode.Position, defaultRange: vscode.Range): modes.ISuggestion { - if (!item.label) { + if (typeof item.label !== 'string' || item.label.length === 0) { console.warn('INVALID text edit -> must have at least a label'); return undefined; } From ea05102c9ec0fdcb0a6374476c1d5143eb17a1ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Fri, 19 May 2017 12:10:30 +0200 Subject: [PATCH 0660/1164] fixes #26602 --- .../node/extensionManagementService.ts | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index 9f6240ab3b6..43b0fb1ed0c 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -268,26 +268,28 @@ export class ExtensionManagementService implements IExtensionManagementService { private installExtension(zipPath: string, id: string, metadata: IGalleryMetadata = null): TPromise { const extensionPath = path.join(this.extensionsPath, id); - return extract(zipPath, extensionPath, { sourcePath: 'extension', overwrite: true }) - .then(() => readManifest(extensionPath)) - .then(({ manifest }) => { - return pfs.readdir(extensionPath).then(children => { - const readme = children.filter(child => /^readme(\.txt|\.md|)$/i.test(child))[0]; - const readmeUrl = readme ? URI.file(path.join(extensionPath, readme)).toString() : null; - const changelog = children.filter(child => /^changelog(\.txt|\.md|)$/i.test(child))[0]; - const changelogUrl = changelog ? URI.file(path.join(extensionPath, changelog)).toString() : null; - const type = LocalExtensionType.User; + return pfs.rimraf(extensionPath).then(() => { + return extract(zipPath, extensionPath, { sourcePath: 'extension', overwrite: true }) + .then(() => readManifest(extensionPath)) + .then(({ manifest }) => { + return pfs.readdir(extensionPath).then(children => { + const readme = children.filter(child => /^readme(\.txt|\.md|)$/i.test(child))[0]; + const readmeUrl = readme ? URI.file(path.join(extensionPath, readme)).toString() : null; + const changelog = children.filter(child => /^changelog(\.txt|\.md|)$/i.test(child))[0]; + const changelogUrl = changelog ? URI.file(path.join(extensionPath, changelog)).toString() : null; + const type = LocalExtensionType.User; - const local: ILocalExtension = { type, id, manifest, metadata, path: extensionPath, readmeUrl, changelogUrl }; - const manifestPath = path.join(extensionPath, 'package.json'); + const local: ILocalExtension = { type, id, manifest, metadata, path: extensionPath, readmeUrl, changelogUrl }; + const manifestPath = path.join(extensionPath, 'package.json'); - return pfs.readFile(manifestPath, 'utf8') - .then(raw => parseManifest(raw)) - .then(({ manifest }) => assign(manifest, { __metadata: metadata })) - .then(manifest => pfs.writeFile(manifestPath, JSON.stringify(manifest, null, '\t'))) - .then(() => local); + return pfs.readFile(manifestPath, 'utf8') + .then(raw => parseManifest(raw)) + .then(({ manifest }) => assign(manifest, { __metadata: metadata })) + .then(manifest => pfs.writeFile(manifestPath, JSON.stringify(manifest, null, '\t'))) + .then(() => local); + }); }); - }); + }); } uninstall(extension: ILocalExtension, force = false): TPromise { From 52212f2a2e44bb13c08de50bc50dcd7295644122 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 19 May 2017 12:21:36 +0200 Subject: [PATCH 0661/1164] :lipstick: --- extensions/theme-defaults/themes/dark_defaults.json | 7 ++++--- extensions/theme-defaults/themes/hc_black_defaults.json | 3 ++- extensions/theme-defaults/themes/light_defaults.json | 9 +++++---- src/vs/workbench/common/theme.ts | 6 +++--- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/extensions/theme-defaults/themes/dark_defaults.json b/extensions/theme-defaults/themes/dark_defaults.json index bb319ce5675..e15677c62c8 100644 --- a/extensions/theme-defaults/themes/dark_defaults.json +++ b/extensions/theme-defaults/themes/dark_defaults.json @@ -2,12 +2,13 @@ "$schema": "vscode://schemas/color-theme", "name": "Dark Default Colors", "colors": { - "editor.background": "#1e1e1e", + "editor.background": "#1E1E1E", "editor.foreground": "#D4D4D4", "editor.inactiveSelectionBackground": "#3A3D41", "editorIndentGuide.background": "#404040", - "editor.selectionHighlightBackground": "#add6ff26", + "editor.selectionHighlightBackground": "#ADD6FF26", "list.dropBackground": "#383B3D", - "activityBarBadge.background": "#007ACC" + "activityBarBadge.background": "#007ACC", + "sideBarTitle.foreground": "#BBBBBB" } } \ No newline at end of file diff --git a/extensions/theme-defaults/themes/hc_black_defaults.json b/extensions/theme-defaults/themes/hc_black_defaults.json index 6537cac26f2..e1326f20ea2 100644 --- a/extensions/theme-defaults/themes/hc_black_defaults.json +++ b/extensions/theme-defaults/themes/hc_black_defaults.json @@ -4,7 +4,8 @@ "colors": { "editor.background": "#000000", "editor.foreground": "#FFFFFF", - "editorIndentGuide.background": "#FFFFFF" + "editorIndentGuide.background": "#FFFFFF", + "sideBarTitle.foreground": "#FFFFFF" }, "settings": [ { diff --git a/extensions/theme-defaults/themes/light_defaults.json b/extensions/theme-defaults/themes/light_defaults.json index fb7571ba81a..ad85f382140 100644 --- a/extensions/theme-defaults/themes/light_defaults.json +++ b/extensions/theme-defaults/themes/light_defaults.json @@ -2,12 +2,13 @@ "$schema": "vscode://schemas/color-theme", "name": "Light Default Colors", "colors": { - "editor.background": "#ffffff", + "editor.background": "#FFFFFF", "editor.foreground": "#000000", "editor.inactiveSelectionBackground": "#E5EBF1", - "editorIndentGuide.background": "#d3d3d3", - "editor.selectionHighlightBackground": "#add6ff4d", + "editorIndentGuide.background": "#D3D3D3", + "editor.selectionHighlightBackground": "#ADD6FF4D", "editorSuggestWidget.background": "#F3F3F3", - "activityBarBadge.background": "#007ACC" + "activityBarBadge.background": "#007ACC", + "sideBarTitle.foreground": "#6F6F6F" } } \ No newline at end of file diff --git a/src/vs/workbench/common/theme.ts b/src/vs/workbench/common/theme.ts index 6600353536c..3ea47c3df77 100644 --- a/src/vs/workbench/common/theme.ts +++ b/src/vs/workbench/common/theme.ts @@ -205,9 +205,9 @@ export const SIDE_BAR_FOREGROUND = registerColor('sideBar.foreground', { }, nls.localize('sideBarForeground', "Side bar foreground color. The side bar is the container for views like explorer and search.")); export const SIDE_BAR_TITLE_FOREGROUND = registerColor('sideBarTitle.foreground', { - dark: '#BBBBBB', - light: '#6f6f6f', - hc: '#FFFFFF' + dark: SIDE_BAR_FOREGROUND, + light: SIDE_BAR_FOREGROUND, + hc: SIDE_BAR_FOREGROUND }, nls.localize('sideBarTitleForeground', "Side bar title foreground color. The side bar is the container for views like explorer and search.")); export const SIDE_BAR_SECTION_HEADER_BACKGROUND = registerColor('sideBarSectionHeader.background', { From 5ec18ba9a43496b061ee3368f111c8859254b646 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 19 May 2017 12:28:08 +0200 Subject: [PATCH 0662/1164] remove extra console.log --- .../services/lifecycle/electron-browser/lifecycleService.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts b/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts index e3c3f8e63ea..3cf631de01a 100644 --- a/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts +++ b/src/vs/workbench/services/lifecycle/electron-browser/lifecycleService.ts @@ -42,7 +42,6 @@ export class LifecycleService implements ILifecycleService { } else { this._startupKind = StartupKind.NewWindow; } - console.log(this.startupKind); } public get startupKind(): StartupKind { From 25e2eb9300ab2c67da84bd3592260fdaf6d136af Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 19 May 2017 12:30:49 +0200 Subject: [PATCH 0663/1164] simplify snippet session --- .../snippet/browser/snippetController2.ts | 4 +- .../contrib/snippet/browser/snippetSession.ts | 12 +-- .../test/browser/snippetSession.test.ts | 80 +++++++++---------- 3 files changed, 45 insertions(+), 51 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 748e4d190cb..8c5db726afa 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -62,8 +62,8 @@ export class SnippetController2 { } if (!this._snippet) { // insert with new session - this._snippet = new SnippetSession(this._editor, template, overwriteBefore, overwriteAfter); - this._snippet.insert(); + this._snippet = new SnippetSession(this._editor); + this._snippet.insert(template, overwriteBefore, overwriteAfter); this._snippetListener = [ this._editor.onDidChangeModel(() => this.cancel()), this._editor.onDidChangeCursorSelection(() => this._updateState()) diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts index d9691b82918..59822d13563 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -253,16 +253,10 @@ export class SnippetSession { } private readonly _editor: ICommonCodeEditor; - private readonly _template: string; - private readonly _overwriteBefore: number; - private readonly _overwriteAfter: number; private _snippets: OneSnippet[]; - constructor(editor: ICommonCodeEditor, template: string, overwriteBefore: number = 0, overwriteAfter: number = 0) { + constructor(editor: ICommonCodeEditor) { this._editor = editor; - this._template = template; - this._overwriteBefore = overwriteBefore; - this._overwriteAfter = overwriteAfter; this._snippets = []; } @@ -270,11 +264,11 @@ export class SnippetSession { dispose(this._snippets); } - insert(): void { + insert(template: string, overwriteBefore: number = 0, overwriteAfter: number = 0): void { const model = this._editor.getModel(); const { edits, snippets } = SnippetSession.makeInsertEditsAndSnippets( - this._editor, this._template, this._overwriteBefore, this._overwriteAfter + this._editor, template, overwriteBefore, overwriteAfter ); // keep snippets around diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts index 0fc20720ba7..e3b79fe0fa0 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts @@ -67,8 +67,8 @@ suite('SnippetSession', function () { }); test('text edits & selection', function () { - const session = new SnippetSession(editor, 'foo${1:bar}foo$0'); - session.insert(); + const session = new SnippetSession(editor); + session.insert('foo${1:bar}foo$0'); assert.equal(editor.getModel().getValue(), 'foobarfoofunction foo() {\n foobarfooconsole.log(a);\n}'); assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); @@ -78,17 +78,17 @@ suite('SnippetSession', function () { test('text edit with reversed selection', function () { - const session = new SnippetSession(editor, '${1:bar}$0'); + const session = new SnippetSession(editor); editor.setSelections([new Selection(2, 5, 2, 5), new Selection(1, 1, 1, 1)]); - session.insert(); + session.insert('${1:bar}$0'); assert.equal(model.getValue(), 'barfunction foo() {\n barconsole.log(a);\n}'); assertSelections(editor, new Selection(2, 5, 2, 8), new Selection(1, 1, 1, 4)); }); test('snippets, repeated tabstops', function () { - const session = new SnippetSession(editor, '${1:abc}foo${1:abc}$0'); - session.insert(); + const session = new SnippetSession(editor); + session.insert('${1:abc}foo${1:abc}$0'); assertSelections(editor, new Selection(1, 1, 1, 4), new Selection(1, 7, 1, 10), new Selection(2, 5, 2, 8), new Selection(2, 11, 2, 14), @@ -101,16 +101,16 @@ suite('SnippetSession', function () { }); test('snippets, just text', function () { - const session = new SnippetSession(editor, 'foobar'); - session.insert(); + const session = new SnippetSession(editor); + session.insert('foobar'); assert.equal(model.getValue(), 'foobarfunction foo() {\n foobarconsole.log(a);\n}'); assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); }); test('snippets, selections and new text with newlines', () => { - const session = new SnippetSession(editor, 'foo\n\t${1:bar}\n$0'); - session.insert(); + const session = new SnippetSession(editor); + session.insert('foo\n\t${1:bar}\n$0'); assert.equal(editor.getModel().getValue(), 'foo\n bar\nfunction foo() {\n foo\n bar\n console.log(a);\n}'); @@ -122,8 +122,8 @@ suite('SnippetSession', function () { test('snippets, selections -> next/prev', () => { - const session = new SnippetSession(editor, 'f$1oo${2:bar}foo$0'); - session.insert(); + const session = new SnippetSession(editor); + session.insert('f$1oo${2:bar}foo$0'); // @ $2 assertSelections(editor, new Selection(1, 2, 1, 2), new Selection(2, 6, 2, 6)); @@ -142,8 +142,8 @@ suite('SnippetSession', function () { }); test('snippets, selections & typing', function () { - const session = new SnippetSession(editor, 'f${1:oo}_$2_$0'); - session.insert(); + const session = new SnippetSession(editor); + session.insert('f${1:oo}_$2_$0'); editor.trigger('test', 'type', { text: 'X' }); session.next(); @@ -167,7 +167,7 @@ suite('SnippetSession', function () { model.setValue('foo_bar_foo'); editor.setSelections([new Selection(1, 1, 1, 4), new Selection(1, 9, 1, 12)]); - new SnippetSession(editor, 'x$0').insert(); + new SnippetSession(editor).insert('x$0'); assert.equal(model.getValue(), 'x_bar_x'); assertSelections(editor, new Selection(1, 2, 1, 2), new Selection(1, 8, 1, 8)); }); @@ -176,7 +176,7 @@ suite('SnippetSession', function () { model.setValue('foo_bar_foo'); editor.setSelections([new Selection(1, 1, 1, 4), new Selection(1, 9, 1, 12)]); - new SnippetSession(editor, 'LONGER$0').insert(); + new SnippetSession(editor).insert('LONGER$0'); assert.equal(model.getValue(), 'LONGER_bar_LONGER'); assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(1, 18, 1, 18)); }); @@ -184,8 +184,8 @@ suite('SnippetSession', function () { test('snippets, don\'t grow final tabstop', function () { model.setValue('foo_zzz_foo'); editor.setSelection(new Selection(1, 5, 1, 8)); - const session = new SnippetSession(editor, '$1bar$0'); - session.insert(); + const session = new SnippetSession(editor); + session.insert('$1bar$0'); assertSelections(editor, new Selection(1, 5, 1, 5)); editor.trigger('test', 'type', { text: 'foo-' }); @@ -204,8 +204,8 @@ suite('SnippetSession', function () { test('snippets, don\'t merge touching tabstops 1/2', function () { - const session = new SnippetSession(editor, '$1$2$3$0'); - session.insert(); + const session = new SnippetSession(editor); + session.insert('$1$2$3$0'); assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); session.next(); @@ -242,8 +242,8 @@ suite('SnippetSession', function () { }); test('snippets, don\'t merge touching tabstops 2/2', function () { - const session = new SnippetSession(editor, '$1$2$3$0'); - session.insert(); + const session = new SnippetSession(editor); + session.insert('$1$2$3$0'); assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); editor.trigger('test', 'type', { text: '111' }); @@ -261,8 +261,8 @@ suite('SnippetSession', function () { }); test('snippets, gracefully move over final tabstop', function () { - const session = new SnippetSession(editor, '${1}bar$0'); - session.insert(); + const session = new SnippetSession(editor); + session.insert('${1}bar$0'); assert.equal(session.isAtFinalPlaceholder, false); assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); @@ -277,8 +277,8 @@ suite('SnippetSession', function () { }); test('snippets, overwriting nested placeholder', function () { - const session = new SnippetSession(editor, 'log(${1:"$2"});$0'); - session.insert(); + const session = new SnippetSession(editor); + session.insert('log(${1:"$2"});$0'); assertSelections(editor, new Selection(1, 5, 1, 7), new Selection(2, 9, 2, 11)); editor.trigger('test', 'type', { text: 'XXX' }); @@ -294,8 +294,8 @@ suite('SnippetSession', function () { }); test('snippets, selections and snippet ranges', function () { - const session = new SnippetSession(editor, '${1:foo}farboo${2:bar}$0'); - session.insert(); + const session = new SnippetSession(editor); + session.insert('${1:foo}farboo${2:bar}$0'); assert.equal(model.getValue(), 'foofarboobarfunction foo() {\n foofarboobarconsole.log(a);\n}'); assertSelections(editor, new Selection(1, 1, 1, 4), new Selection(2, 5, 2, 8)); @@ -330,13 +330,13 @@ suite('SnippetSession', function () { model.setValue(''); editor.setSelection(new Selection(1, 1, 1, 1)); - const first = new SnippetSession(editor, 'foo${2:bar}foo$0'); - first.insert(); + const first = new SnippetSession(editor); + first.insert('foo${2:bar}foo$0'); assert.equal(model.getValue(), 'foobarfoo'); assertSelections(editor, new Selection(1, 4, 1, 7)); - const second = new SnippetSession(editor, 'ba${1:zzzz}$0'); - second.insert(); + const second = new SnippetSession(editor); + second.insert('ba${1:zzzz}$0'); assert.equal(model.getValue(), 'foobazzzzfoo'); assertSelections(editor, new Selection(1, 6, 1, 10)); @@ -351,8 +351,8 @@ suite('SnippetSession', function () { test('snippets, typing at final tabstop', function () { - const session = new SnippetSession(editor, 'farboo$0'); - session.insert(); + const session = new SnippetSession(editor); + session.insert('farboo$0'); assert.equal(session.isAtFinalPlaceholder, true); assert.equal(session.isSelectionWithPlaceholders(), false); @@ -363,8 +363,8 @@ suite('SnippetSession', function () { test('snippets, typing at beginning', function () { editor.setSelection(new Selection(1, 2, 1, 2)); - const session = new SnippetSession(editor, 'farboo$0'); - session.insert(); + const session = new SnippetSession(editor); + session.insert('farboo$0'); editor.setSelection(new Selection(1, 2, 1, 2)); assert.equal(session.isSelectionWithPlaceholders(), false); @@ -381,8 +381,8 @@ suite('SnippetSession', function () { test('snippets, typing with nested placeholder', function () { editor.setSelection(new Selection(1, 1, 1, 1)); - const session = new SnippetSession(editor, 'This ${1:is ${2:nested}}.$0'); - session.insert(); + const session = new SnippetSession(editor); + session.insert('This ${1:is ${2:nested}}.$0'); assertSelections(editor, new Selection(1, 6, 1, 15)); session.next(); @@ -397,8 +397,8 @@ suite('SnippetSession', function () { }); test('snippets, snippet with variables', function () { - const session = new SnippetSession(editor, '@line=$TM_LINE_NUMBER$0'); - session.insert(); + const session = new SnippetSession(editor); + session.insert('@line=$TM_LINE_NUMBER$0'); assert.equal(model.getValue(), '@line=1function foo() {\n @line=2console.log(a);\n}'); assertSelections(editor, new Selection(1, 8, 1, 8), new Selection(2, 12, 2, 12)); From c50a70142bde3bc1637b70bedd31652a9bcf5052 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 19 May 2017 12:42:15 +0200 Subject: [PATCH 0664/1164] have only one insert-call, towards nested snippets... --- .../snippet/browser/snippetController2.ts | 15 +++++------- .../contrib/snippet/browser/snippetSession.ts | 23 ++++++------------- .../test/browser/snippetController2.test.ts | 15 +++++++++++- .../test/browser/snippetSession.test.ts | 14 +++++++++++ 4 files changed, 41 insertions(+), 26 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 8c5db726afa..6f156fffe2d 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -61,17 +61,14 @@ export class SnippetController2 { this._editor.getModel().pushStackElement(); } if (!this._snippet) { - // insert with new session + // create a new session this._snippet = new SnippetSession(this._editor); - this._snippet.insert(template, overwriteBefore, overwriteAfter); - this._snippetListener = [ - this._editor.onDidChangeModel(() => this.cancel()), - this._editor.onDidChangeCursorSelection(() => this._updateState()) - ]; - } else { - // insert nested - this._snippet.insertNested(template, overwriteBefore, overwriteAfter); } + this._snippet.insert(template, overwriteBefore, overwriteAfter); + this._snippetListener = [ + this._editor.onDidChangeModel(() => this.cancel()), + this._editor.onDidChangeCursorSelection(() => this._updateState()) + ]; if (undoStopAfter) { this._editor.getModel().pushStackElement(); } diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts index 59822d13563..1496dda543d 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -257,7 +257,6 @@ export class SnippetSession { constructor(editor: ICommonCodeEditor) { this._editor = editor; - this._snippets = []; } dispose(): void { @@ -271,12 +270,16 @@ export class SnippetSession { this._editor, template, overwriteBefore, overwriteAfter ); - // keep snippets around - this._snippets = snippets; + let isNestedInsert = true; + if (!this._snippets) { + // keep snippets around + this._snippets = snippets; + isNestedInsert = false; + } // make insert edit and start with first selections const newSelections = model.pushEditOperations(this._editor.getSelections(), edits, undoEdits => { - if (this._snippets[0].hasPlaceholder) { + if (!isNestedInsert && this._snippets[0].hasPlaceholder) { return this._move(true); } else { return undoEdits.map(edit => Selection.fromPositions(edit.range.getEndPosition())); @@ -285,18 +288,6 @@ export class SnippetSession { this._editor.setSelections(newSelections); } - insertNested(template: string, overwriteBefore: number = 0, overwriteAfter: number = 0): void { - const { edits } = SnippetSession.makeInsertEditsAndSnippets( - this._editor, template, overwriteBefore, overwriteAfter - ); - const model = this._editor.getModel(); - const selections = this._editor.getSelections(); - const newSelections = model.pushEditOperations(selections, edits, undoEdits => { - return undoEdits.map(edit => Selection.fromPositions(edit.range.getEndPosition())); - }); - this._editor.setSelections(newSelections); - } - next(): void { const newSelections = this._move(true); this._editor.setSelections(newSelections); diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts index 7c9657a1ef6..04a866727d3 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts @@ -124,7 +124,6 @@ suite('SnippetController2', function () { assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); }); - test('insert, delete snippet text', function () { const ctrl = new SnippetController2(editor, contextKeys); @@ -148,4 +147,18 @@ suite('SnippetController2', function () { // editor.trigger('test', 'type', { text: 'abc' }); // assertContextKeys(contextKeys, false, false, false); }); + + test('insert, insert nested', function () { + const ctrl = new SnippetController2(editor, contextKeys); + ctrl.insert('${1:foobar}$0'); + assertContextKeys(contextKeys, true, false, true); + assertSelections(editor, new Selection(1, 1, 1, 7), new Selection(2, 5, 2, 11)); + + ctrl.insert('farboo'); + assertContextKeys(contextKeys, true, false, true); + assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); + + ctrl.next(); + assertContextKeys(contextKeys, false, false, false); + }); }); diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts index e3b79fe0fa0..5eb6c7cba93 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts @@ -404,5 +404,19 @@ suite('SnippetSession', function () { assertSelections(editor, new Selection(1, 8, 1, 8), new Selection(2, 12, 2, 12)); }); + test('snippet, insert-nested', function () { + const session = new SnippetSession(editor); + session.insert('foo$1foo$0'); + + assertSelections(editor, new Selection(1, 4, 1, 4), new Selection(2, 8, 2, 8)); + session.insert('bar'); + assert.ok(session.isSelectionWithPlaceholders()); + assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); + + session.next(); + assertSelections(editor, new Selection(1, 10, 1, 10), new Selection(2, 14, 2, 14)); + assert.ok(session.isAtFinalPlaceholder); + }); + }); From c3c248fead06503ab3aa53b320f130e53f4b42ea Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 19 May 2017 14:54:29 +0200 Subject: [PATCH 0665/1164] log telemetry event how many extensions have been discovered --- .../api/electron-browser/mainThreadExtensionService.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts b/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts index f5ba6b3cf3a..949657cb266 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts @@ -19,6 +19,7 @@ import { ExtensionScanner, MessagesCollector } from 'vs/workbench/node/extension import { IMessageService } from 'vs/platform/message/common/message'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; import { ExtHostContext, ExtHostExtensionServiceShape } from '../node/extHost.protocol'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; const SystemExtensionsRoot = path.normalize(path.join(URI.parse(require.toUrl('')).fsPath, '..', 'extensions')); @@ -62,8 +63,9 @@ export class MainProcessExtensionService extends AbstractExtensionService { + + telemetryService.publicLog('extensionsScanned', { + totalCount: extensionDescriptions.length, + disabledCount: disabledExtensions.length + }); + this._onExtensionDescriptions(disabledExtensions.length ? extensionDescriptions.filter(e => disabledExtensions.every(id => !areSameExtensions({ id }, e))) : extensionDescriptions); }); } From e1bb941c1793bafc51103eb38d2a904a77b5760e Mon Sep 17 00:00:00 2001 From: Michel Kaporin Date: Fri, 19 May 2017 15:31:56 +0200 Subject: [PATCH 0666/1164] Removed handling multiple '--user-data-dir' as no need for Spectron any more #25291. --- src/main.js | 9 +-------- src/vs/platform/environment/node/argv.ts | 11 +---------- .../environment/test/node/environmentService.test.ts | 7 ------- 3 files changed, 2 insertions(+), 25 deletions(-) diff --git a/src/main.js b/src/main.js index 67d76f57004..9576d766aaf 100644 --- a/src/main.js +++ b/src/main.js @@ -175,15 +175,8 @@ function mkdir(dir) { }); } -// Because Spectron doesn't allow us to pass a custom user-data-dir, -// Code receives two of them. Let's just take the first one. -var userDataDir = args['user-data-dir']; -if (userDataDir) { - userDataDir = typeof userDataDir === 'string' ? userDataDir : userDataDir[0]; -} - // Set userData path before app 'ready' event and call to process.chdir -var userData = path.resolve(userDataDir || paths.getDefaultUserDataPath(process.platform)); +var userData = path.resolve(args['user-data-dir'] || paths.getDefaultUserDataPath(process.platform)); app.setPath('userData', userData); // Update cwd based on environment and platform diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index 52b2183bb92..b022eb3ce6b 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -105,16 +105,7 @@ export function parseCLIProcessArgv(processArgv: string[]): ParsedArgs { * Use this to parse code arguments such as `--verbose --wait` */ export function parseArgs(args: string[]): ParsedArgs { - const result = minimist(args, options) as ParsedArgs; - - // Because Spectron doesn't allow us to pass a custom user-data-dir, - // Code receives two of them. Let's just take the first one. - const userDataDir: string | string[] = result['user-data-dir']; - if (userDataDir) { - result['user-data-dir'] = typeof userDataDir === 'string' ? userDataDir : userDataDir[0]; - } - - return result; + return minimist(args, options) as ParsedArgs; } export const optionsHelp: { [name: string]: string; } = { diff --git a/src/vs/platform/environment/test/node/environmentService.test.ts b/src/vs/platform/environment/test/node/environmentService.test.ts index 44617be5a87..1f3b16ab944 100644 --- a/src/vs/platform/environment/test/node/environmentService.test.ts +++ b/src/vs/platform/environment/test/node/environmentService.test.ts @@ -41,11 +41,4 @@ suite('EnvironmentService', () => { assert.equal(parse(['--user-data-dir', './dir'], { cwd: () => '/foo', env: { 'VSCODE_CWD': '/bar' } }), path.resolve('/bar/dir'), 'should use VSCODE_CWD as the cwd when --user-data-dir is specified'); }); - - test('userDataPath should always take the first one', () => { - const parse = (a, b: { cwd: () => string, env: { [key: string]: string } }) => parseUserDataDir(parseArgs(a), b); - - assert.equal(parse(['--user-data-dir', './dir1', '--user-data-dir', './dir2'], { cwd: () => '/foo', env: {} }), path.resolve('/foo/dir1'), - 'should pick first --user-data-dir (dir1)'); - }); }); \ No newline at end of file From fbe3177bed272ca853c8ba10a9e400a37c561a5e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 19 May 2017 15:08:15 +0200 Subject: [PATCH 0667/1164] get tick by name --- src/vs/base/node/startupTimers.d.ts | 4 +++- src/vs/base/node/startupTimers.js | 13 ++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/vs/base/node/startupTimers.d.ts b/src/vs/base/node/startupTimers.d.ts index bcc276e506d..c91175b0262 100644 --- a/src/vs/base/node/startupTimers.d.ts +++ b/src/vs/base/node/startupTimers.d.ts @@ -30,7 +30,9 @@ export function startTimer(name: string, started?: number): TickController; export function stopTimer(name: string, stopped?: number); -export function ticks(): ReadonlyArray; +export function ticks(): Tick[]; + +export function tick(name:string):Tick; export function setProfileList(names: string[]): void; diff --git a/src/vs/base/node/startupTimers.js b/src/vs/base/node/startupTimers.js index 8f0494fc0ac..61b3556b39b 100644 --- a/src/vs/base/node/startupTimers.js +++ b/src/vs/base/node/startupTimers.js @@ -48,7 +48,7 @@ define([], function () { // Because we want both instances to use the same tick-data // we store them globally global._perfStarts = global._perfStarts || new Map(); - global._perfTicks = global._perfTicks || []; + global._perfTicks = global._perfTicks || new Map(); global._perfToBeProfiled = global._perfToBeProfiled || new Set(); var _starts = global._perfStarts; @@ -83,12 +83,18 @@ define([], function () { var profile = _toBeProfiled.has(name) ? requireProfiler().stopProfiling(name) : undefined; var start = _starts.get(name); var tick = new Tick(start.name, start.started, stopped, profile); - _ticks.push(tick); + _ticks.set(name, tick); _starts.delete(name); } function ticks() { - return _ticks; + var ret = []; + _ticks.forEach(function (value) { ret.push(value); }); + return ret; + } + + function tick(name) { + return _ticks.get(name); } function setProfileList(names) { @@ -101,6 +107,7 @@ define([], function () { startTimer: startTimer, stopTimer: stopTimer, ticks: ticks, + tick: tick, setProfileList: setProfileList, disable: disable, }; From b6ec9f9eb90da1d31da24a41df28ced4b084da15 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 19 May 2017 15:46:10 +0200 Subject: [PATCH 0668/1164] add timers2 which is the startup timer ticks --- src/vs/base/node/startupTimers.js | 15 ++++++++---- .../electron-browser/bootstrap/index.js | 2 ++ src/vs/workbench/electron-browser/shell.ts | 7 +++++- .../workbench/electron-browser/workbench.ts | 9 ++++---- .../services/timer/common/timerService.ts | 1 + .../services/timer/node/timerService.ts | 23 +++++++++++++------ 6 files changed, 41 insertions(+), 16 deletions(-) diff --git a/src/vs/base/node/startupTimers.js b/src/vs/base/node/startupTimers.js index 61b3556b39b..45637a77b58 100644 --- a/src/vs/base/node/startupTimers.js +++ b/src/vs/base/node/startupTimers.js @@ -82,9 +82,11 @@ define([], function () { } var profile = _toBeProfiled.has(name) ? requireProfiler().stopProfiling(name) : undefined; var start = _starts.get(name); - var tick = new Tick(start.name, start.started, stopped, profile); - _ticks.set(name, tick); - _starts.delete(name); + if (start !== undefined) { + var tick = new Tick(start.name, start.started, stopped, profile); + _ticks.set(name, tick); + _starts.delete(name); + } } function ticks() { @@ -94,7 +96,12 @@ define([], function () { } function tick(name) { - return _ticks.get(name); + var ret = _ticks.get(name); + if (!ret) { + var now = Date.now(); + ret = new Tick(name, now, now); + } + return ret; } function setProfileList(names) { diff --git a/src/vs/workbench/electron-browser/bootstrap/index.js b/src/vs/workbench/electron-browser/bootstrap/index.js index c01da62847a..2b20efb7bbc 100644 --- a/src/vs/workbench/electron-browser/bootstrap/index.js +++ b/src/vs/workbench/electron-browser/bootstrap/index.js @@ -192,6 +192,8 @@ function main() { beforeLoadWorkbenchMain: Date.now() }; + startTimer('elapsed:overall', configuration.perfStartTime); + const workbenchMainTimer = startTimer('load:workbench.main') require([ 'vs/workbench/electron-browser/workbench.main', diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index bec5d37606b..ac4b1759dde 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -59,7 +59,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; -import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; +import { ILifecycleService, StartupKind } from 'vs/platform/lifecycle/common/lifecycle'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IMessageService, IChoiceService, Severity, CloseAction } from 'vs/platform/message/common/message'; @@ -101,6 +101,7 @@ import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/work import { WorkbenchThemeService } from 'vs/workbench/services/themes/electron-browser/workbenchThemeService'; import { registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; import { foreground, selectionBackground, focusBorder, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, listHighlightForeground, inputPlaceholderForeground } from 'vs/platform/theme/common/colorRegistry'; +import { stopTimer } from 'vs/base/node/startupTimers'; /** * Services that we require for the Shell @@ -242,6 +243,10 @@ export class WorkbenchShell { startupKind: this.lifecycleService.startupKind }); + if (this.lifecycleService.startupKind === StartupKind.NewWindow) { + stopTimer('elapsed:overall'); + } + // Telemetry: startup metrics this.timerService.workbenchStarted = Date.now(); this.timerService.restoreEditorsDuration = info.restoreEditorsDuration; diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 56f626450b7..f14318b949a 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -308,8 +308,8 @@ export class Workbench implements IPartService { } viewletRestoreStopWatch = StopWatch.create(); - const tick = startTimer(`restore:${viewletIdToRestore}`); - compositeAndEditorPromises.push(tick.while(this.viewletService.openViewlet(viewletIdToRestore)).then(() => { + const viewletTimer = startTimer('restore:viewlet'); + compositeAndEditorPromises.push(viewletTimer.while(this.viewletService.openViewlet(viewletIdToRestore)).then(() => { viewletRestoreStopWatch.stop(); })); } @@ -324,7 +324,8 @@ export class Workbench implements IPartService { // Load Editors const editorRestoreStopWatch = StopWatch.create(); const restoredEditors: string[] = []; - compositeAndEditorPromises.push(this.resolveEditorsToOpen().then(inputs => { + const editorsTimer = startTimer('restore:editors'); + compositeAndEditorPromises.push(editorsTimer.while(this.resolveEditorsToOpen().then(inputs => { let editorOpenPromise: TPromise; if (inputs.length) { editorOpenPromise = this.editorService.openEditors(inputs.map(input => { return { input, position: EditorPosition.ONE }; })); @@ -343,7 +344,7 @@ export class Workbench implements IPartService { } } }); - })); + }))); if (this.storageService.getBoolean(Workbench.zenModeActiveSettingKey, StorageScope.WORKSPACE, false)) { this.toggleZenMode(true); diff --git a/src/vs/workbench/services/timer/common/timerService.ts b/src/vs/workbench/services/timer/common/timerService.ts index 16d9af30565..a02d7249cf9 100644 --- a/src/vs/workbench/services/timer/common/timerService.ts +++ b/src/vs/workbench/services/timer/common/timerService.ts @@ -30,6 +30,7 @@ export interface IStartupMetrics { ellapsedWorkbench: number; ellapsedTimersToTimersComputed: number; }; + timers2: { [name: string]: number }; platform: string; release: string; totalmem: number; diff --git a/src/vs/workbench/services/timer/node/timerService.ts b/src/vs/workbench/services/timer/node/timerService.ts index 4998e257ee1..ac011f4ca08 100644 --- a/src/vs/workbench/services/timer/node/timerService.ts +++ b/src/vs/workbench/services/timer/node/timerService.ts @@ -6,6 +6,7 @@ import { ITimerService, IStartupMetrics, IInitData, IMemoryInfo } from 'vs/workbench/services/timer/common/timerService'; import { virtualMachineHint } from 'vs/base/node/id'; +import { ticks } from 'vs/base/node/startupTimers'; import * as os from 'os'; @@ -35,13 +36,7 @@ export class TimerService implements ITimerService { public restoreViewletDuration: number; public restoreEditorsDuration: number; - public get startupMetrics(): IStartupMetrics { - if (!this._startupMetrics) { - this.computeStartupMetrics(); - } - return this._startupMetrics; - }; private _startupMetrics: IStartupMetrics; constructor(initData: IInitData, private isEmptyWorkbench: boolean) { @@ -56,7 +51,14 @@ export class TimerService implements ITimerService { this.hasAccessibilitySupport = initData.hasAccessibilitySupport; } - public computeStartupMetrics(): void { + get startupMetrics(): IStartupMetrics { + if (!this._startupMetrics) { + this._computeStartupMetrics(); + } + return this._startupMetrics; + } + + public _computeStartupMetrics(): void { const now = Date.now(); const initialStartup = !!this.isInitialStartup; const start = initialStartup ? this.start : this.windowLoad; @@ -88,6 +90,12 @@ export class TimerService implements ITimerService { console.error(error); // be on the safe side with these hardware method calls } + // fill in startup timers we have until now + const timers2: { [name: string]: number } = Object.create(null); + for (const tick of ticks()) { + timers2[tick.name] = tick.duration; + } + this._startupMetrics = { version: 1, ellapsed: this.workbenchStarted - start, @@ -101,6 +109,7 @@ export class TimerService implements ITimerService { ellapsedWindowLoadToRequire: this.beforeLoadWorkbenchMain - this.windowLoad, ellapsedTimersToTimersComputed: Date.now() - now }, + timers2, platform, release, totalmem, From bf562ce501dd469a4b71e7c9973c52e4897b397e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 19 May 2017 15:36:17 +0200 Subject: [PATCH 0669/1164] remove build gulpfile.js --- build/gulpfile.js | 28 ---------------------------- 1 file changed, 28 deletions(-) delete mode 100644 build/gulpfile.js diff --git a/build/gulpfile.js b/build/gulpfile.js deleted file mode 100644 index c0a5700ec1f..00000000000 --- a/build/gulpfile.js +++ /dev/null @@ -1,28 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -var gulp = require('gulp'); -var tsb = require('gulp-tsb'); -var util = require('./lib/util'); -var watcher = require('./lib/watch'); -var assign = require('object-assign'); - -var compilation = tsb.create(assign({ verbose: true }, require('./tsconfig.json').compilerOptions)); - -gulp.task('compile', function() { - return gulp.src('**/*.ts', { base: '.' }) - .pipe(compilation()) - .pipe(gulp.dest('')); -}); - -gulp.task('watch', function() { - var src = gulp.src('**/*.ts', { base: '.' }); - - return watcher('**/*.ts', { base: '.' }) - .pipe(util.incremental(compilation, src)) - .pipe(gulp.dest('')); -}); - -gulp.task('default', ['compile']); From d2bac293343c9525e8c1468130c404dbe00aca17 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 11:08:30 +0200 Subject: [PATCH 0670/1164] Move editor command registration to coreCommands.ts --- src/vs/editor/common/config/config.ts | 98 +++++++------------ .../editor/common/controller/coreCommands.ts | 55 +++++++++-- 2 files changed, 82 insertions(+), 71 deletions(-) diff --git a/src/vs/editor/common/config/config.ts b/src/vs/editor/common/config/config.ts index 543f74bf91a..59cdce4151f 100644 --- a/src/vs/editor/common/config/config.ts +++ b/src/vs/editor/common/config/config.ts @@ -11,8 +11,7 @@ import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/commo import { ICommandAndKeybindingRule, IKeybindings } from 'vs/platform/keybinding/common/keybindingsRegistry'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { ICodeEditorService, getCodeEditor } from 'vs/editor/common/services/codeEditorService'; -import { CommandsRegistry, ICommandHandler, ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; -import H = editorCommon.Handler; +import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; export interface ICommandKeybindingsOptions extends IKeybindings { kbExpr?: ContextKeyExpr; @@ -27,22 +26,20 @@ export interface ICommandOptions { } export abstract class Command { - public id: string; - public precondition: ContextKeyExpr; - private kbOpts: ICommandKeybindingsOptions; - private description: ICommandHandlerDescription; + public readonly id: string; + public readonly precondition: ContextKeyExpr; + private readonly _kbOpts: ICommandKeybindingsOptions; + private readonly _description: ICommandHandlerDescription; constructor(opts: ICommandOptions) { this.id = opts.id; this.precondition = opts.precondition; - this.kbOpts = opts.kbOpts; - this.description = opts.description; + this._kbOpts = opts.kbOpts; + this._description = opts.description; } - public abstract runCommand(accessor: ServicesAccessor, args: any): void | TPromise; - public toCommandAndKeybindingRule(defaultWeight: number): ICommandAndKeybindingRule { - const kbOpts = this.kbOpts || { primary: 0 }; + const kbOpts = this._kbOpts || { primary: 0 }; let kbWhen = kbOpts.kbExpr; if (this.precondition) { @@ -65,23 +62,37 @@ export abstract class Command { win: kbOpts.win, linux: kbOpts.linux, mac: kbOpts.mac, - description: this.description + description: this._description }; } -} -export interface EditorControllerCommand { - new (opts: IContributionCommandOptions): EditorCommand; + public abstract runCommand(accessor: ServicesAccessor, args: any): void | TPromise; } export interface IContributionCommandOptions extends ICommandOptions { handler: (controller: T) => void; } +export interface EditorControllerCommand { + new (opts: IContributionCommandOptions): EditorCommand; +} + +function findFocusedEditor(accessor: ServicesAccessor): editorCommon.ICommonCodeEditor { + return accessor.get(ICodeEditorService).getFocusedCodeEditor(); +} + +function getWorkbenchActiveEditor(accessor: ServicesAccessor): editorCommon.ICommonCodeEditor { + const editorService = accessor.get(IEditorService); + let activeEditor = (editorService).getActiveEditor && (editorService).getActiveEditor(); + return getCodeEditor(activeEditor); +} + export abstract class EditorCommand extends Command { + /** + * Create a command class that is bound to a certain editor contribution. + */ public static bindToContribution(controllerGetter: (editor: editorCommon.ICommonCodeEditor) => T): EditorControllerCommand { - return class EditorControllerCommandImpl extends EditorCommand { private _callback: (controller: T) => void; @@ -100,19 +111,20 @@ export abstract class EditorCommand extends Command { }; } - constructor(opts: ICommandOptions) { - super(opts); - } - public runCommand(accessor: ServicesAccessor, args: any): void | TPromise { + // Find the editor with text focus let editor = findFocusedEditor(accessor); + if (!editor) { - editor = getActiveEditorWidget(accessor); + // Fallback to use what the workbench considers the active editor + editor = getWorkbenchActiveEditor(accessor); } + if (!editor) { // well, at least we tried... return; } + return editor.invokeWithinContext((editorAccessor) => { const kbService = editorAccessor.get(IContextKeyService); if (!kbService.contextMatchesRules(this.precondition)) { @@ -126,47 +138,3 @@ export abstract class EditorCommand extends Command { public abstract runEditorCommand(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor, args: any): void | TPromise; } - -function findFocusedEditor(accessor: ServicesAccessor): editorCommon.ICommonCodeEditor { - return accessor.get(ICodeEditorService).getFocusedCodeEditor(); -} - -function withCodeEditorFromCommandHandler(accessor: ServicesAccessor, callback: (editor: editorCommon.ICommonCodeEditor) => void): void { - let editor = findFocusedEditor(accessor); - if (editor) { - callback(editor); - } -} - -function getActiveEditorWidget(accessor: ServicesAccessor): editorCommon.ICommonCodeEditor { - const editorService = accessor.get(IEditorService); - let activeEditor = (editorService).getActiveEditor && (editorService).getActiveEditor(); - return getCodeEditor(activeEditor); -} - -function triggerEditorHandler(handlerId: string, accessor: ServicesAccessor, args: any): void { - withCodeEditorFromCommandHandler(accessor, (editor) => { - editor.trigger('keyboard', handlerId, args); - }); -} - -class CoreCommand extends Command { - public runCommand(accessor: ServicesAccessor, args: any): void { - triggerEditorHandler(this.id, accessor, args); - } -} - -function registerOverwritableCommand(handlerId: string, handler: ICommandHandler): void { - CommandsRegistry.registerCommand(handlerId, handler); - CommandsRegistry.registerCommand('default:' + handlerId, handler); -} - -function registerCoreDispatchCommand(handlerId: string): void { - registerOverwritableCommand(handlerId, triggerEditorHandler.bind(null, handlerId)); -} -registerCoreDispatchCommand(H.Type); -registerCoreDispatchCommand(H.ReplacePreviousChar); -registerCoreDispatchCommand(H.CompositionStart); -registerCoreDispatchCommand(H.CompositionEnd); -registerCoreDispatchCommand(H.Paste); -registerCoreDispatchCommand(H.Cut); diff --git a/src/vs/editor/common/controller/coreCommands.ts b/src/vs/editor/common/controller/coreCommands.ts index 3ca21fe60b7..8004f96f402 100644 --- a/src/vs/editor/common/controller/coreCommands.ts +++ b/src/vs/editor/common/controller/coreCommands.ts @@ -1522,7 +1522,7 @@ namespace Config { return accessor.get(ICodeEditorService).getFocusedCodeEditor(); } - function getActiveEditorWidget(accessor: ServicesAccessor): editorCommon.ICommonCodeEditor { + function getWorkbenchActiveEditor(accessor: ServicesAccessor): editorCommon.ICommonCodeEditor { const editorService = accessor.get(IEditorService); let activeEditor = (editorService).getActiveEditor && (editorService).getActiveEditor(); return getCodeEditor(activeEditor); @@ -1532,7 +1532,13 @@ namespace Config { KeybindingsRegistry.registerCommandAndKeybindingRule(command.toCommandAndKeybindingRule(CORE_WEIGHT)); } - class BaseTextInputAwareCommand extends Command { + /** + * A command that will: + * 1. invoke a command on the focused editor. + * 2. otherwise, invoke a browser built-in command on the `activeElement`. + * 3. otherwise, invoke a command on the workbench active editor. + */ + class EditorOrNativeTextInputCommand extends Command { private readonly _editorHandler: string | EditorCommand; private readonly _inputHandler: string; @@ -1559,7 +1565,7 @@ namespace Config { } // Redirecting to last active editor - let activeEditor = getActiveEditorWidget(accessor); + let activeEditor = getWorkbenchActiveEditor(accessor); if (activeEditor) { activeEditor.focus(); return this._runEditorHandler(activeEditor, args); @@ -1578,7 +1584,7 @@ namespace Config { } } - registerCommand(new BaseTextInputAwareCommand({ + registerCommand(new EditorOrNativeTextInputCommand({ editorHandler: CoreNavigationCommands.SelectAll, inputHandler: 'selectAll', id: 'editor.action.selectAll', @@ -1590,7 +1596,7 @@ namespace Config { } })); - registerCommand(new BaseTextInputAwareCommand({ + registerCommand(new EditorOrNativeTextInputCommand({ editorHandler: H.Undo, inputHandler: 'undo', id: H.Undo, @@ -1602,7 +1608,7 @@ namespace Config { } })); - registerCommand(new BaseTextInputAwareCommand({ + registerCommand(new EditorOrNativeTextInputCommand({ editorHandler: H.Redo, inputHandler: 'redo', id: H.Redo, @@ -1616,4 +1622,41 @@ namespace Config { } })); + /** + * A command that will invoke a command on the focused editor. + */ + class EditorHandlerCommand extends Command { + + private readonly _handlerId: string; + + constructor(id: string, handlerId: string) { + super({ + id: id, + precondition: null + }); + this._handlerId = handlerId; + } + + public runCommand(accessor: ServicesAccessor, args: any): void { + const editor = findFocusedEditor(accessor); + if (!editor) { + return; + } + + editor.trigger('keyboard', this._handlerId, args); + } + } + + function registerOverwritableCommand(handlerId: string): void { + registerCommand(new EditorHandlerCommand('default:' + handlerId, handlerId)); + registerCommand(new EditorHandlerCommand(handlerId, handlerId)); + } + + registerOverwritableCommand(H.Type); + registerOverwritableCommand(H.ReplacePreviousChar); + registerOverwritableCommand(H.CompositionStart); + registerOverwritableCommand(H.CompositionEnd); + registerOverwritableCommand(H.Paste); + registerOverwritableCommand(H.Cut); + } From 80e93de878192d5bce15c9d8c05d26cb66b9b1a5 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 11:23:34 +0200 Subject: [PATCH 0671/1164] Bring editor command classes together --- src/vs/editor/common/config/config.ts | 140 ---------------- .../editor/common/controller/coreCommands.ts | 3 +- .../editor/common/editorCommonExtensions.ts | 156 ++++++++++++++++-- .../snippet/browser/snippetController2.ts | 3 +- .../test/common/wordOperations.test.ts | 2 +- .../emmet/electron-browser/emmetActions.ts | 3 +- .../browser/keybindingsEditorContribution.ts | 3 +- 7 files changed, 146 insertions(+), 164 deletions(-) delete mode 100644 src/vs/editor/common/config/config.ts diff --git a/src/vs/editor/common/config/config.ts b/src/vs/editor/common/config/config.ts deleted file mode 100644 index 59cdce4151f..00000000000 --- a/src/vs/editor/common/config/config.ts +++ /dev/null @@ -1,140 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { TPromise } from 'vs/base/common/winjs.base'; -import { IEditorService } from 'vs/platform/editor/common/editor'; -import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { ICommandAndKeybindingRule, IKeybindings } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import * as editorCommon from 'vs/editor/common/editorCommon'; -import { ICodeEditorService, getCodeEditor } from 'vs/editor/common/services/codeEditorService'; -import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; - -export interface ICommandKeybindingsOptions extends IKeybindings { - kbExpr?: ContextKeyExpr; - weight?: number; -} - -export interface ICommandOptions { - id: string; - precondition: ContextKeyExpr; - kbOpts?: ICommandKeybindingsOptions; - description?: ICommandHandlerDescription; -} - -export abstract class Command { - public readonly id: string; - public readonly precondition: ContextKeyExpr; - private readonly _kbOpts: ICommandKeybindingsOptions; - private readonly _description: ICommandHandlerDescription; - - constructor(opts: ICommandOptions) { - this.id = opts.id; - this.precondition = opts.precondition; - this._kbOpts = opts.kbOpts; - this._description = opts.description; - } - - public toCommandAndKeybindingRule(defaultWeight: number): ICommandAndKeybindingRule { - const kbOpts = this._kbOpts || { primary: 0 }; - - let kbWhen = kbOpts.kbExpr; - if (this.precondition) { - if (kbWhen) { - kbWhen = ContextKeyExpr.and(kbWhen, this.precondition); - } else { - kbWhen = this.precondition; - } - } - - const weight = (typeof kbOpts.weight === 'number' ? kbOpts.weight : defaultWeight); - - return { - id: this.id, - handler: (accessor, args) => this.runCommand(accessor, args), - weight: weight, - when: kbWhen, - primary: kbOpts.primary, - secondary: kbOpts.secondary, - win: kbOpts.win, - linux: kbOpts.linux, - mac: kbOpts.mac, - description: this._description - }; - } - - public abstract runCommand(accessor: ServicesAccessor, args: any): void | TPromise; -} - -export interface IContributionCommandOptions extends ICommandOptions { - handler: (controller: T) => void; -} - -export interface EditorControllerCommand { - new (opts: IContributionCommandOptions): EditorCommand; -} - -function findFocusedEditor(accessor: ServicesAccessor): editorCommon.ICommonCodeEditor { - return accessor.get(ICodeEditorService).getFocusedCodeEditor(); -} - -function getWorkbenchActiveEditor(accessor: ServicesAccessor): editorCommon.ICommonCodeEditor { - const editorService = accessor.get(IEditorService); - let activeEditor = (editorService).getActiveEditor && (editorService).getActiveEditor(); - return getCodeEditor(activeEditor); -} - -export abstract class EditorCommand extends Command { - - /** - * Create a command class that is bound to a certain editor contribution. - */ - public static bindToContribution(controllerGetter: (editor: editorCommon.ICommonCodeEditor) => T): EditorControllerCommand { - return class EditorControllerCommandImpl extends EditorCommand { - private _callback: (controller: T) => void; - - constructor(opts: IContributionCommandOptions) { - super(opts); - - this._callback = opts.handler; - } - - public runEditorCommand(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor, args: any): void { - let controller = controllerGetter(editor); - if (controller) { - this._callback(controllerGetter(editor)); - } - } - }; - } - - public runCommand(accessor: ServicesAccessor, args: any): void | TPromise { - // Find the editor with text focus - let editor = findFocusedEditor(accessor); - - if (!editor) { - // Fallback to use what the workbench considers the active editor - editor = getWorkbenchActiveEditor(accessor); - } - - if (!editor) { - // well, at least we tried... - return; - } - - return editor.invokeWithinContext((editorAccessor) => { - const kbService = editorAccessor.get(IContextKeyService); - if (!kbService.contextMatchesRules(this.precondition)) { - // precondition does not hold - return; - } - - return this.runEditorCommand(editorAccessor, editor, args); - }); - } - - public abstract runEditorCommand(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor, args: any): void | TPromise; -} diff --git a/src/vs/editor/common/controller/coreCommands.ts b/src/vs/editor/common/controller/coreCommands.ts index 8004f96f402..9172351e644 100644 --- a/src/vs/editor/common/controller/coreCommands.ts +++ b/src/vs/editor/common/controller/coreCommands.ts @@ -11,9 +11,8 @@ import * as editorCommon from 'vs/editor/common/editorCommon'; import { CursorState, ICursors, RevealTarget, IColumnSelectData, CursorContext } from 'vs/editor/common/controller/cursorCommon'; import { CursorChangeReason, VerticalRevealType } from 'vs/editor/common/controller/cursorEvents'; import { CursorMoveCommands, CursorMove as CursorMove_ } from 'vs/editor/common/controller/cursorMoveCommands'; -import { EditorCommand, ICommandOptions, Command } from 'vs/editor/common/config/config'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { registerEditorCommand } from 'vs/editor/common/editorCommonExtensions'; +import { registerEditorCommand, ICommandOptions, EditorCommand, Command } from 'vs/editor/common/editorCommonExtensions'; import { IColumnSelectResult, ColumnSelection } from 'vs/editor/common/controller/cursorColumnSelection'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; diff --git a/src/vs/editor/common/editorCommonExtensions.ts b/src/vs/editor/common/editorCommonExtensions.ts index c80f219223d..e991a1a208c 100644 --- a/src/vs/editor/common/editorCommonExtensions.ts +++ b/src/vs/editor/common/editorCommonExtensions.ts @@ -8,22 +8,148 @@ import { illegalArgument } from 'vs/base/common/errors'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import { ServicesAccessor, IConstructorSignature1 } from 'vs/platform/instantiation/common/instantiation'; -import { CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { CommandsRegistry, ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; +import { KeybindingsRegistry, ICommandAndKeybindingRule, IKeybindings } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { Registry } from 'vs/platform/platform'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { ICommandOptions, Command as ConfigBasicCommand, EditorCommand as ConfigEditorCommand } from 'vs/editor/common/config/config'; import { Position } from 'vs/editor/common/core/position'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { IModelService } from 'vs/editor/common/services/modelService'; import { MenuId, MenuRegistry, IMenuItem } from 'vs/platform/actions/common/actions'; +import { IEditorService } from 'vs/platform/editor/common/editor'; +import { IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { ICodeEditorService, getCodeEditor } from 'vs/editor/common/services/codeEditorService'; export type ServicesAccessor = ServicesAccessor; -export const Command = ConfigBasicCommand; -export const EditorCommand = ConfigEditorCommand; -export type ICommandOptions = ICommandOptions; export type ICommonEditorContributionCtor = IConstructorSignature1; +// ----- Generic Command + +export interface ICommandKeybindingsOptions extends IKeybindings { + kbExpr?: ContextKeyExpr; + weight?: number; +} +export interface ICommandOptions { + id: string; + precondition: ContextKeyExpr; + kbOpts?: ICommandKeybindingsOptions; + description?: ICommandHandlerDescription; +} +export abstract class Command { + public readonly id: string; + public readonly precondition: ContextKeyExpr; + private readonly _kbOpts: ICommandKeybindingsOptions; + private readonly _description: ICommandHandlerDescription; + + constructor(opts: ICommandOptions) { + this.id = opts.id; + this.precondition = opts.precondition; + this._kbOpts = opts.kbOpts; + this._description = opts.description; + } + + public toCommandAndKeybindingRule(defaultWeight: number): ICommandAndKeybindingRule { + const kbOpts = this._kbOpts || { primary: 0 }; + + let kbWhen = kbOpts.kbExpr; + if (this.precondition) { + if (kbWhen) { + kbWhen = ContextKeyExpr.and(kbWhen, this.precondition); + } else { + kbWhen = this.precondition; + } + } + + const weight = (typeof kbOpts.weight === 'number' ? kbOpts.weight : defaultWeight); + + return { + id: this.id, + handler: (accessor, args) => this.runCommand(accessor, args), + weight: weight, + when: kbWhen, + primary: kbOpts.primary, + secondary: kbOpts.secondary, + win: kbOpts.win, + linux: kbOpts.linux, + mac: kbOpts.mac, + description: this._description + }; + } + + public abstract runCommand(accessor: ServicesAccessor, args: any): void | TPromise; +} + +// ----- Editor Command & Editor Contribution Command + +function findFocusedEditor(accessor: ServicesAccessor): editorCommon.ICommonCodeEditor { + return accessor.get(ICodeEditorService).getFocusedCodeEditor(); +} +function getWorkbenchActiveEditor(accessor: ServicesAccessor): editorCommon.ICommonCodeEditor { + const editorService = accessor.get(IEditorService); + let activeEditor = (editorService).getActiveEditor && (editorService).getActiveEditor(); + return getCodeEditor(activeEditor); +} + +export interface IContributionCommandOptions extends ICommandOptions { + handler: (controller: T) => void; +} +export interface EditorControllerCommand { + new (opts: IContributionCommandOptions): EditorCommand; +} +export abstract class EditorCommand extends Command { + + /** + * Create a command class that is bound to a certain editor contribution. + */ + public static bindToContribution(controllerGetter: (editor: editorCommon.ICommonCodeEditor) => T): EditorControllerCommand { + return class EditorControllerCommandImpl extends EditorCommand { + private _callback: (controller: T) => void; + + constructor(opts: IContributionCommandOptions) { + super(opts); + + this._callback = opts.handler; + } + + public runEditorCommand(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor, args: any): void { + let controller = controllerGetter(editor); + if (controller) { + this._callback(controllerGetter(editor)); + } + } + }; + } + + public runCommand(accessor: ServicesAccessor, args: any): void | TPromise { + // Find the editor with text focus + let editor = findFocusedEditor(accessor); + + if (!editor) { + // Fallback to use what the workbench considers the active editor + editor = getWorkbenchActiveEditor(accessor); + } + + if (!editor) { + // well, at least we tried... + return; + } + + return editor.invokeWithinContext((editorAccessor) => { + const kbService = editorAccessor.get(IContextKeyService); + if (!kbService.contextMatchesRules(this.precondition)) { + // precondition does not hold + return; + } + + return this.runEditorCommand(editorAccessor, editor, args); + }); + } + + public abstract runEditorCommand(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor, args: any): void | TPromise; +} + +// ----- Editor Action + export interface IEditorCommandMenuOptions { group?: string; order?: number; @@ -33,7 +159,7 @@ export interface IActionOptions extends ICommandOptions { alias: string; menuOpts?: IEditorCommandMenuOptions; } -export abstract class EditorAction extends ConfigEditorCommand { +export abstract class EditorAction extends EditorCommand { public label: string; public alias: string; @@ -74,17 +200,17 @@ export abstract class EditorAction extends ConfigEditorCommand { public abstract run(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor, args: any): void | TPromise; } -// --- Editor Actions +// --- Registration of commands and actions export function editorAction(ctor: { new (): EditorAction; }): void { CommonEditorRegistry.registerEditorAction(new ctor()); } -export function editorCommand(ctor: { new (): ConfigEditorCommand }): void { +export function editorCommand(ctor: { new (): EditorCommand }): void { registerEditorCommand(new ctor()); } -export function registerEditorCommand(editorCommand: T): T { +export function registerEditorCommand(editorCommand: T): T { CommonEditorRegistry.registerEditorCommand(editorCommand); return editorCommand; } @@ -103,7 +229,7 @@ export module CommonEditorRegistry { export function getEditorActions(): EditorAction[] { return EditorContributionRegistry.INSTANCE.getEditorActions(); } - export function getEditorCommand(commandId: string): ConfigEditorCommand { + export function getEditorCommand(commandId: string): EditorCommand { return EditorContributionRegistry.INSTANCE.getEditorCommand(commandId); } @@ -119,7 +245,7 @@ export module CommonEditorRegistry { return KeybindingsRegistry.WEIGHT.editorContrib(importance); } - export function registerEditorCommand(editorCommand: ConfigEditorCommand): void { + export function registerEditorCommand(editorCommand: EditorCommand): void { EditorContributionRegistry.INSTANCE.registerEditorCommand(editorCommand); } @@ -161,7 +287,7 @@ class EditorContributionRegistry { private editorContributions: ICommonEditorContributionCtor[]; private editorActions: EditorAction[]; - private editorCommands: { [commandId: string]: ConfigEditorCommand; }; + private editorCommands: { [commandId: string]: EditorCommand; }; constructor() { this.editorContributions = []; @@ -193,12 +319,12 @@ class EditorContributionRegistry { return this.editorActions.slice(0); } - public registerEditorCommand(editorCommand: ConfigEditorCommand) { + public registerEditorCommand(editorCommand: EditorCommand) { KeybindingsRegistry.registerCommandAndKeybindingRule(editorCommand.toCommandAndKeybindingRule(KeybindingsRegistry.WEIGHT.editorContrib())); this.editorCommands[editorCommand.id] = editorCommand; } - public getEditorCommand(commandId: string): ConfigEditorCommand { + public getEditorCommand(commandId: string): EditorCommand { return (this.editorCommands[commandId] || null); } diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 6f156fffe2d..3983e58599e 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -7,10 +7,9 @@ import { RawContextKey, IContextKey, IContextKeyService, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; -import { commonEditorContribution, CommonEditorRegistry } from 'vs/editor/common/editorCommonExtensions'; +import { commonEditorContribution, CommonEditorRegistry, EditorCommand } from 'vs/editor/common/editorCommonExtensions'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { SnippetSession } from './snippetSession'; -import { EditorCommand } from 'vs/editor/common/config/config'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; diff --git a/src/vs/editor/contrib/wordOperations/test/common/wordOperations.test.ts b/src/vs/editor/contrib/wordOperations/test/common/wordOperations.test.ts index ab99938740b..d67a436a400 100644 --- a/src/vs/editor/contrib/wordOperations/test/common/wordOperations.test.ts +++ b/src/vs/editor/contrib/wordOperations/test/common/wordOperations.test.ts @@ -17,7 +17,7 @@ import { DeleteWordLeft, DeleteWordStartLeft, DeleteWordEndLeft, DeleteWordRight, DeleteWordStartRight, DeleteWordEndRight } from 'vs/editor/contrib/wordOperations/common/wordOperations'; -import { EditorCommand } from 'vs/editor/common/config/config'; +import { EditorCommand } from "vs/editor/common/editorCommonExtensions"; suite('WordOperations', () => { diff --git a/src/vs/workbench/parts/emmet/electron-browser/emmetActions.ts b/src/vs/workbench/parts/emmet/electron-browser/emmetActions.ts index d73bc725327..16c227e8800 100644 --- a/src/vs/workbench/parts/emmet/electron-browser/emmetActions.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/emmetActions.ts @@ -7,8 +7,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; -import { EditorAction, ServicesAccessor, IActionOptions } from 'vs/editor/common/editorCommonExtensions'; -import { ICommandKeybindingsOptions } from 'vs/editor/common/config/config'; +import { EditorAction, ServicesAccessor, IActionOptions, ICommandKeybindingsOptions } from 'vs/editor/common/editorCommonExtensions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { grammarsExtPoint, ITMSyntaxExtensionPoint } from 'vs/editor/node/textMate/TMGrammars'; import { IModeService } from 'vs/editor/common/services/modeService'; diff --git a/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts b/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts index 7f73595d894..9733c62707f 100644 --- a/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts +++ b/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts @@ -15,7 +15,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { Range } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import { ServicesAccessor, registerEditorCommand } from 'vs/editor/common/editorCommonExtensions'; +import { ServicesAccessor, registerEditorCommand, EditorCommand } from 'vs/editor/common/editorCommonExtensions'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; @@ -26,7 +26,6 @@ import { parseTree, Node } from 'vs/base/common/json'; import { KeybindingIO } from 'vs/workbench/services/keybinding/common/keybindingIO'; import { ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCode'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { EditorCommand } from 'vs/editor/common/config/config'; const NLS_LAUNCH_MESSAGE = nls.localize('defineKeybinding.start', "Define Keybinding"); const NLS_KB_LAYOUT_INFO_MESSAGE = nls.localize('defineKeybinding.kbLayoutInfoMessage', "For your current keyboard layout press "); From 2342d2e2311b53e8b82d8881e23fba8160628c7f Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 11:38:49 +0200 Subject: [PATCH 0672/1164] Simplify cursor.trigger --- src/vs/editor/common/controller/cursor.ts | 11 ----------- .../contrib/find/test/common/findModel.test.ts | 10 +++++----- .../test/common/linesOperations.test.ts | 4 ++-- .../test/common/controller/cursor.test.ts | 18 +++++++++--------- .../common/editor/rangeDecorations.test.ts | 7 ++----- 5 files changed, 18 insertions(+), 32 deletions(-) diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 5df9f478073..3c91c510bd9 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -20,8 +20,6 @@ import { DeleteOperations } from 'vs/editor/common/controller/cursorDeleteOperat import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations'; import { TextModelEventType, ModelRawContentChangedEvent, RawContentChangedType } from 'vs/editor/common/model/textModelEvents'; import { CursorEventType, CursorChangeReason, ICursorPositionChangedEvent, VerticalRevealType, ICursorSelectionChangedEvent, ICursorRevealRangeEvent, CursorScrollRequest } from 'vs/editor/common/controller/cursorEvents'; -import { CommonEditorRegistry } from 'vs/editor/common/editorCommonExtensions'; -import { CoreEditorCommand } from 'vs/editor/common/controller/coreCommands'; class CursorOperationArgs { public readonly eventSource: string; @@ -486,14 +484,6 @@ export class Cursor extends Disposable implements ICursors { public trigger(source: string, handlerId: string, payload: any): void { if (!this._handlers.hasOwnProperty(handlerId)) { - const command = CommonEditorRegistry.getEditorCommand(handlerId); - if (!command || !(command instanceof CoreEditorCommand)) { - return; - } - - payload = payload || {}; - payload.source = source; - command.runCoreEditorCommand(this, payload); return; } const handler = this._handlers[handlerId]; @@ -509,7 +499,6 @@ export class Cursor extends Disposable implements ICursors { this._handlers[H.CompositionStart] = (args) => this._compositionStart(args); this._handlers[H.CompositionEnd] = (args) => this._compositionEnd(args); this._handlers[H.Paste] = (args) => this._paste(args); - this._handlers[H.Cut] = (args) => this._cut(args); this._handlers[H.Undo] = (args) => this._undo(args); diff --git a/src/vs/editor/contrib/find/test/common/findModel.test.ts b/src/vs/editor/contrib/find/test/common/findModel.test.ts index b1b48e25499..7dd3ee4ad4d 100644 --- a/src/vs/editor/contrib/find/test/common/findModel.test.ts +++ b/src/vs/editor/contrib/find/test/common/findModel.test.ts @@ -303,7 +303,7 @@ suite('FindModel', () => { ] ); - cursor.trigger('mouse', CoreNavigationCommands.MoveTo.id, { + editor.trigger('mouse', CoreNavigationCommands.MoveTo.id, { position: new Position(6, 20) }); @@ -663,7 +663,7 @@ suite('FindModel', () => { ] ); - cursor.trigger('mouse', CoreNavigationCommands.MoveTo.id, { + editor.trigger('mouse', CoreNavigationCommands.MoveTo.id, { position: new Position(6, 20) }); assertFindState( @@ -1150,7 +1150,7 @@ suite('FindModel', () => { ] ); - cursor.trigger('mouse', CoreNavigationCommands.MoveTo.id, { + editor.trigger('mouse', CoreNavigationCommands.MoveTo.id, { position: new Position(6, 20) }); assertFindState( @@ -1311,7 +1311,7 @@ suite('FindModel', () => { ] ); - cursor.trigger('mouse', CoreNavigationCommands.MoveTo.id, { + editor.trigger('mouse', CoreNavigationCommands.MoveTo.id, { position: new Position(6, 20) }); assertFindState( @@ -1741,7 +1741,7 @@ suite('FindModel', () => { findState.change({ searchString: 'hello(?=\\sworld)', replaceString: 'hi', isRegex: true }, false); let findModel = new FindModelBoundToEditorModel(editor, findState); - cursor.trigger('mouse', CoreNavigationCommands.MoveTo.id, { + editor.trigger('mouse', CoreNavigationCommands.MoveTo.id, { position: new Position(8, 14) }); diff --git a/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts b/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts index 87930f8457f..4a56e203f65 100644 --- a/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts +++ b/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts @@ -478,13 +478,13 @@ suite('Editor Contrib - Line Operations', () => { new Selection(2, 4, 2, 4) ]); - cursor.trigger('tests', Handler.Undo, {}); + editor.trigger('tests', Handler.Undo, {}); assert.deepEqual(editor.getSelections(), [ new Selection(1, 3, 1, 3), new Selection(1, 6, 1, 6), new Selection(3, 4, 3, 4) ]); - cursor.trigger('tests', Handler.Redo, {}); + editor.trigger('tests', Handler.Redo, {}); assert.deepEqual(editor.getSelections(), [ new Selection(1, 3, 1, 3), new Selection(2, 4, 2, 4) diff --git a/src/vs/editor/test/common/controller/cursor.test.ts b/src/vs/editor/test/common/controller/cursor.test.ts index f11a0c6775e..a2700b342cb 100644 --- a/src/vs/editor/test/common/controller/cursor.test.ts +++ b/src/vs/editor/test/common/controller/cursor.test.ts @@ -1863,7 +1863,7 @@ suite('Editor Controller - Cursor Configuration', () => { ], modelOpts: { insertSpaces: true, tabSize: 4, detectIndentation: false, defaultEOL: DefaultEndOfLine.LF, trimAutoWhitespace: true } }, (model, cursor) => { - cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(1, 21) }, 'keyboard'); + CoreNavigationCommands.MoveTo.runCoreEditorCommand(cursor, { position: new Position(1, 21), source: 'keyboard' }); cursorCommand(cursor, H.Type, { text: '\n' }, 'keyboard'); assert.equal(model.getLineContent(1), ' \tMy First Line\t '); assert.equal(model.getLineContent(2), ' '); @@ -1890,56 +1890,56 @@ suite('Editor Controller - Cursor Configuration', () => { withMockCodeEditor(null, { model: model }, (editor, cursor) => { // Tab on column 1 - cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 1) }, 'keyboard'); + CoreNavigationCommands.MoveTo.runCoreEditorCommand(cursor, { position: new Position(2, 1) }); CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), ' My Second Line123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 2 assert.equal(model.getLineContent(2), 'My Second Line123'); - cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 2) }, 'keyboard'); + CoreNavigationCommands.MoveTo.runCoreEditorCommand(cursor, { position: new Position(2, 2) }); CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), 'M y Second Line123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 3 assert.equal(model.getLineContent(2), 'My Second Line123'); - cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 3) }, 'keyboard'); + CoreNavigationCommands.MoveTo.runCoreEditorCommand(cursor, { position: new Position(2, 3) }); CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), 'My Second Line123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 4 assert.equal(model.getLineContent(2), 'My Second Line123'); - cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 4) }, 'keyboard'); + CoreNavigationCommands.MoveTo.runCoreEditorCommand(cursor, { position: new Position(2, 4) }); CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), 'My Second Line123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 5 assert.equal(model.getLineContent(2), 'My Second Line123'); - cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 5) }, 'keyboard'); + CoreNavigationCommands.MoveTo.runCoreEditorCommand(cursor, { position: new Position(2, 5) }); CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), 'My S econd Line123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 5 assert.equal(model.getLineContent(2), 'My Second Line123'); - cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 5) }, 'keyboard'); + CoreNavigationCommands.MoveTo.runCoreEditorCommand(cursor, { position: new Position(2, 5) }); CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), 'My S econd Line123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 13 assert.equal(model.getLineContent(2), 'My Second Line123'); - cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 13) }, 'keyboard'); + CoreNavigationCommands.MoveTo.runCoreEditorCommand(cursor, { position: new Position(2, 13) }); CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), 'My Second Li ne123'); cursorCommand(cursor, H.Undo, null, 'keyboard'); // Tab on column 14 assert.equal(model.getLineContent(2), 'My Second Line123'); - cursorCommand(cursor, CoreNavigationCommands.MoveTo.id, { position: new Position(2, 14) }, 'keyboard'); + CoreNavigationCommands.MoveTo.runCoreEditorCommand(cursor, { position: new Position(2, 14) }); CoreEditingCommands.Tab.runEditorCommand(null, editor, null); assert.equal(model.getLineContent(2), 'My Second Lin e123'); }); diff --git a/src/vs/workbench/test/common/editor/rangeDecorations.test.ts b/src/vs/workbench/test/common/editor/rangeDecorations.test.ts index 617ce785ac1..e9677bbdb23 100644 --- a/src/vs/workbench/test/common/editor/rangeDecorations.test.ts +++ b/src/vs/workbench/test/common/editor/rangeDecorations.test.ts @@ -13,14 +13,13 @@ import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl'; import WorkbenchEditorService = require('vs/workbench/services/editor/common/editorService'); import { RangeHighlightDecorations } from 'vs/workbench/common/editor/rangeDecorations'; import { Model } from 'vs/editor/common/model/model'; -import { mockCodeEditor, MockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; +import { mockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { IEditorInput } from 'vs/platform/editor/common/editor'; import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; import { TextModel } from 'vs/editor/common/model/textModel'; import { Range, IRange } from 'vs/editor/common/core/range'; import { Position } from 'vs/editor/common/core/position'; -import { Cursor } from 'vs/editor/common/controller/cursor'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; @@ -33,7 +32,6 @@ suite('Editor - Range decorations', () => { let modelService: IModelService; let modeService: IModeService; let codeEditor: editorCommon.ICommonCodeEditor; - let cursor: Cursor; let model: Model; let text: string; let testObject: RangeHighlightDecorations; @@ -47,7 +45,6 @@ suite('Editor - Range decorations', () => { text = 'LINE1' + '\n' + 'LINE2' + '\n' + 'LINE3' + '\n' + 'LINE4' + '\r\n' + 'LINE5'; model = aModel(URI.file('some_file')); codeEditor = mockCodeEditor([], { model }); - cursor = (codeEditor).getCursor(); mockEditorService(codeEditor.getModel().uri); instantiationService.stub(WorkbenchEditorService.IWorkbenchEditorService, 'getActiveEditor', { getControl: () => { return codeEditor; } }); @@ -111,7 +108,7 @@ suite('Editor - Range decorations', () => { test('highlight is removed on cursor position change', function () { testObject.highlightRange({ resource: model.uri, range: { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 1 } }); - cursor.trigger('mouse', CoreNavigationCommands.MoveTo.id, { + codeEditor.trigger('mouse', CoreNavigationCommands.MoveTo.id, { position: new Position(2, 1) }); From 972223e581153f6f5807fa2735245451d2063c80 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 13:02:09 +0200 Subject: [PATCH 0673/1164] Simplify cursor handlers --- src/vs/editor/common/controller/cursor.ts | 321 +++++++----------- .../editor/common/controller/cursorCommon.ts | 7 - .../common/controller/cursorTypeOperations.ts | 45 ++- 3 files changed, 166 insertions(+), 207 deletions(-) diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 3c91c510bd9..4a062380b3c 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -64,10 +64,6 @@ export class Cursor extends Disposable implements ICursors { private _isDoingComposition: boolean; private _columnSelectData: IColumnSelectData; - private _handlers: { - [key: string]: (args: CursorOperationArgs) => EditOperationResult; - }; - constructor(configuration: editorCommon.IConfiguration, model: editorCommon.IModel, viewModelHelper: IViewModelHelper) { super(); this._eventEmitter = this._register(new EventEmitter()); @@ -81,9 +77,6 @@ export class Cursor extends Disposable implements ICursors { this._isDoingComposition = false; this._columnSelectData = null; - this._handlers = {}; - this._registerHandlers(); - this._register(this._model.addBulkListener((events) => { if (this._isHandling) { return; @@ -135,6 +128,8 @@ export class Cursor extends Disposable implements ICursors { super.dispose(); } + // ------ some getters/setters + public getPrimaryCursor(): CursorState { return this._cursors.getPrimaryCursor(); } @@ -147,6 +142,26 @@ export class Cursor extends Disposable implements ICursors { return this._cursors.getAll(); } + private static _somethingChanged(oldSelections: Selection[], oldViewSelections: Selection[], newSelections: Selection[], newViewSelections: Selection[]): boolean { + if (oldSelections.length !== newSelections.length) { + return true; + } + + for (let i = 0, len = oldSelections.length; i < len; i++) { + if (!oldSelections[i].equalsSelection(newSelections[i])) { + return true; + } + } + + for (let i = 0, len = oldViewSelections.length; i < len; i++) { + if (!oldViewSelections[i].equalsSelection(newViewSelections[i])) { + return true; + } + } + + return false; + } + public setStates(source: string, reason: CursorChangeReason, states: CursorState[]): void { const oldSelections = this._cursors.getSelections(); const oldViewSelections = this._cursors.getViewSelections(); @@ -162,23 +177,7 @@ export class Cursor extends Disposable implements ICursors { const newSelections = this._cursors.getSelections(); const newViewSelections = this._cursors.getViewSelections(); - let somethingChanged = false; - if (oldSelections.length !== newSelections.length) { - somethingChanged = true; - } else { - for (let i = 0, len = oldSelections.length; !somethingChanged && i < len; i++) { - if (!oldSelections[i].equalsSelection(newSelections[i])) { - somethingChanged = true; - } - } - for (let i = 0, len = oldViewSelections.length; !somethingChanged && i < len; i++) { - if (!oldViewSelections[i].equalsSelection(newViewSelections[i])) { - somethingChanged = true; - } - } - } - - if (somethingChanged) { + if (Cursor._somethingChanged(oldSelections, oldViewSelections, newSelections, newViewSelections)) { this._emitCursorPositionChanged(source, reason); this._emitCursorSelectionChanged(source, reason); } @@ -281,12 +280,22 @@ export class Cursor extends Disposable implements ICursors { } } - // ------ some getters/setters - public getSelection(): Selection { return this._cursors.getPrimaryCursor().modelState.selection; } + public getColumnSelectData(): IColumnSelectData { + if (this._columnSelectData) { + return this._columnSelectData; + } + const primaryCursor = this._cursors.getPrimaryCursor(); + const primaryPos = primaryCursor.viewState.position; + return { + toViewLineNumber: primaryPos.lineNumber, + toViewVisualColumn: CursorColumns.visibleColumnFromColumn2(this.context.config, this.context.viewModel, primaryPos) + }; + } + public getSelections(): Selection[] { return this._cursors.getSelections(); } @@ -301,80 +310,31 @@ export class Cursor extends Disposable implements ICursors { // ------ auxiliary handling logic - private _createAndInterpretHandlerCtx(callback: () => EditOperationResult): void { + private _executeEditOperation(opResult: EditOperationResult): void { - const opResult = callback(); + if (!opResult) { + // Nothing to execute + return; + } - if (opResult && opResult.shouldPushStackElementBefore) { + if (this._configuration.editor.readOnly) { + // Cannot execute when read only + return; + } + + if (opResult.shouldPushStackElementBefore) { this._model.pushStackElement(); } - this._columnSelectData = null; - - if (opResult && !this._configuration.editor.readOnly) { - const result = CommandExecutor.executeCommands(this._model, this._cursors.getSelections(), opResult.commands); - if (result) { - // The commands were applied correctly - this._interpretCommandResult(result); - } + const result = CommandExecutor.executeCommands(this._model, this._cursors.getSelections(), opResult.commands); + if (result) { + // The commands were applied correctly + this._interpretCommandResult(result); } - if (opResult && opResult.shouldPushStackElementAfter) { + if (opResult.shouldPushStackElementAfter) { this._model.pushStackElement(); } - - this._cursors.normalize(); - } - - private _onHandler(command: string, handler: (args: CursorOperationArgs) => EditOperationResult, args: CursorOperationArgs): void { - - this._isHandling = true; - - try { - const oldSelections = this._cursors.getSelections(); - const oldViewSelections = this._cursors.getViewSelections(); - - // ensure valid state on all cursors - this._cursors.ensureValidState(); - - let cursorPositionChangeReason: CursorChangeReason; - - this._createAndInterpretHandlerCtx(() => { - let r = handler(args); - cursorPositionChangeReason = r ? r.reason : CursorChangeReason.NotSet; - return r; - }); - - const newSelections = this._cursors.getSelections(); - const newViewSelections = this._cursors.getViewSelections(); - - let somethingChanged = false; - if (oldSelections.length !== newSelections.length) { - somethingChanged = true; - } else { - for (let i = 0, len = oldSelections.length; !somethingChanged && i < len; i++) { - if (!oldSelections[i].equalsSelection(newSelections[i])) { - somethingChanged = true; - } - } - for (let i = 0, len = oldViewSelections.length; !somethingChanged && i < len; i++) { - if (!oldViewSelections[i].equalsSelection(newViewSelections[i])) { - somethingChanged = true; - } - } - } - - if (somethingChanged) { - this._emitCursorPositionChanged(args.eventSource, cursorPositionChangeReason); - this._revealRange(RevealTarget.Primary, VerticalRevealType.Simple, true); - this._emitCursorSelectionChanged(args.eventSource, cursorPositionChangeReason); - } - - } catch (err) { - onUnexpectedError(err); - } - - this._isHandling = false; } private _interpretCommandResult(cursorState: Selection[]): void { @@ -382,7 +342,9 @@ export class Cursor extends Disposable implements ICursors { return; } + this._columnSelectData = null; this._cursors.setSelections(cursorState); + this._cursors.normalize(); } // ----------------------------------------------------------------------------------------------------------- @@ -483,41 +445,79 @@ export class Cursor extends Disposable implements ICursors { // ----- handlers beyond this point public trigger(source: string, handlerId: string, payload: any): void { - if (!this._handlers.hasOwnProperty(handlerId)) { + const H = editorCommon.Handler; + + if (handlerId === H.CompositionStart) { + this._isDoingComposition = true; return; } - const handler = this._handlers[handlerId]; - const args = new CursorOperationArgs(source, payload); - this._onHandler(handlerId, handler, args); - } - private _registerHandlers(): void { - let H = editorCommon.Handler; - - this._handlers[H.Type] = (args) => this._type(args); - this._handlers[H.ReplacePreviousChar] = (args) => this._replacePreviousChar(args); - this._handlers[H.CompositionStart] = (args) => this._compositionStart(args); - this._handlers[H.CompositionEnd] = (args) => this._compositionEnd(args); - this._handlers[H.Paste] = (args) => this._paste(args); - this._handlers[H.Cut] = (args) => this._cut(args); - - this._handlers[H.Undo] = (args) => this._undo(args); - this._handlers[H.Redo] = (args) => this._redo(args); - - this._handlers[H.ExecuteCommand] = (args) => this._externalExecuteCommand(args); - this._handlers[H.ExecuteCommands] = (args) => this._externalExecuteCommands(args); - } - - public getColumnSelectData(): IColumnSelectData { - if (this._columnSelectData) { - return this._columnSelectData; + if (handlerId === H.CompositionEnd) { + this._isDoingComposition = false; + return; + } + + const args = new CursorOperationArgs(source, payload); + + const oldSelections = this._cursors.getSelections(); + const oldViewSelections = this._cursors.getViewSelections(); + let cursorChangeReason = CursorChangeReason.NotSet; + + // ensure valid state on all cursors + this._cursors.ensureValidState(); + + this._isHandling = true; + + try { + switch (handlerId) { + case H.Type: + this._executeEditOperation(this._type(args)); + break; + + case H.ReplacePreviousChar: + this._executeEditOperation(this._replacePreviousChar(args)); + break; + + case H.Paste: + cursorChangeReason = CursorChangeReason.Paste; + this._executeEditOperation(this._paste(args)); + break; + + case H.Cut: + this._executeEditOperation(this._cut(args)); + break; + + case H.Undo: + cursorChangeReason = CursorChangeReason.Undo; + this._interpretCommandResult(this._model.undo()); + break; + + case H.Redo: + cursorChangeReason = CursorChangeReason.Redo; + this._interpretCommandResult(this._model.redo()); + break; + + case H.ExecuteCommand: + this._executeEditOperation(this._externalExecuteCommand(args)); + break; + + case H.ExecuteCommands: + this._executeEditOperation(this._externalExecuteCommands(args)); + break; + } + } catch (err) { + onUnexpectedError(err); + } + + this._isHandling = false; + + const newSelections = this._cursors.getSelections(); + const newViewSelections = this._cursors.getViewSelections(); + if (Cursor._somethingChanged(oldSelections, oldViewSelections, newSelections, newViewSelections)) { + this._emitCursorPositionChanged(args.eventSource, cursorChangeReason); + this._revealRange(RevealTarget.Primary, VerticalRevealType.Simple, true); + this._emitCursorSelectionChanged(args.eventSource, cursorChangeReason); } - const primaryCursor = this._cursors.getPrimaryCursor(); - const primaryPos = primaryCursor.viewState.position; - return { - toViewLineNumber: primaryPos.lineNumber, - toViewVisualColumn: CursorColumns.visibleColumnFromColumn2(this.context.config, this.context.viewModel, primaryPos) - }; } // -------------------- START editing operations @@ -539,12 +539,7 @@ export class Cursor extends Disposable implements ICursors { } // Here we must interpret each typed character individually, that's why we create a new context - this._createAndInterpretHandlerCtx(() => { - - // Decide what all cursors will do up-front - return TypeOperations.typeWithInterceptors(this.context.config, this.context.model, this.getSelections(), chr); - }); - + this._executeEditOperation(TypeOperations.typeWithInterceptors(this.context.config, this.context.model, this.getSelections(), chr)); } return null; @@ -554,55 +549,15 @@ export class Cursor extends Disposable implements ICursors { } private _replacePreviousChar(args: CursorOperationArgs<{ text: string; replaceCharCnt: number; }>): EditOperationResult { - let text = args.eventData.text; - let replaceCharCnt = args.eventData.replaceCharCnt; + const text = args.eventData.text; + const replaceCharCnt = args.eventData.replaceCharCnt; return TypeOperations.replacePreviousChar(this.context.config, this.context.model, this.getSelections(), text, replaceCharCnt); } - private _compositionStart(args: CursorOperationArgs): EditOperationResult { - this._isDoingComposition = true; - return null; - } - - private _compositionEnd(args: CursorOperationArgs): EditOperationResult { - this._isDoingComposition = false; - return null; - } - - private _distributePasteToCursors(args: CursorOperationArgs<{ pasteOnNewLine: boolean; text: string; }>): string[] { - if (args.eventData.pasteOnNewLine) { - return null; - } - - const selections = this._cursors.getSelections(); - if (selections.length === 1) { - return null; - } - - for (let i = 0; i < selections.length; i++) { - if (selections[i].startLineNumber !== selections[i].endLineNumber) { - return null; - } - } - - let pastePieces = args.eventData.text.split(/\r\n|\r|\n/); - if (pastePieces.length !== selections.length) { - return null; - } - - return pastePieces; - } - private _paste(args: CursorOperationArgs<{ pasteOnNewLine: boolean; text: string; }>): EditOperationResult { - const distributedPaste = this._distributePasteToCursors(args); - - if (distributedPaste) { - let selections = this.getSelections(); - selections = selections.sort(Range.compareRangesUsingStarts); - return TypeOperations.distributedPaste(this.context.config, this.context.model, selections, distributedPaste); - } else { - return TypeOperations.paste(this.context.config, this.context.model, this.getSelections(), args.eventData.text, args.eventData.pasteOnNewLine); - } + const pasteOnNewLine = args.eventData.pasteOnNewLine; + const text = args.eventData.text; + return TypeOperations.paste(this.context.config, this.context.model, this.getSelections(), pasteOnNewLine, text); } private _cut(args: CursorOperationArgs): EditOperationResult { @@ -611,26 +566,6 @@ export class Cursor extends Disposable implements ICursors { // -------------------- END editing operations - private _undo(args: CursorOperationArgs): EditOperationResult { - this._interpretCommandResult(this._model.undo()); - - return new EditOperationResult([], { - shouldPushStackElementBefore: false, - shouldPushStackElementAfter: false, - reason: CursorChangeReason.Undo - }); - } - - private _redo(args: CursorOperationArgs): EditOperationResult { - this._interpretCommandResult(this._model.redo()); - - return new EditOperationResult([], { - shouldPushStackElementBefore: false, - shouldPushStackElementAfter: false, - reason: CursorChangeReason.Redo - }); - } - private _externalExecuteCommand(args: CursorOperationArgs): EditOperationResult { const command = args.eventData; diff --git a/src/vs/editor/common/controller/cursorCommon.ts b/src/vs/editor/common/controller/cursorCommon.ts index 8684392bd95..a8d9c46dfca 100644 --- a/src/vs/editor/common/controller/cursorCommon.ts +++ b/src/vs/editor/common/controller/cursorCommon.ts @@ -438,24 +438,17 @@ export class EditOperationResult { readonly commands: ICommand[]; readonly shouldPushStackElementBefore: boolean; readonly shouldPushStackElementAfter: boolean; - readonly reason: CursorChangeReason; constructor( commands: ICommand[], opts: { shouldPushStackElementBefore: boolean; shouldPushStackElementAfter: boolean; - reason?: CursorChangeReason; } ) { this.commands = commands; this.shouldPushStackElementBefore = opts.shouldPushStackElementBefore; this.shouldPushStackElementAfter = opts.shouldPushStackElementAfter; - if (typeof opts.reason === 'undefined') { - this.reason = CursorChangeReason.NotSet; - } else { - this.reason = opts.reason; - } } } diff --git a/src/vs/editor/common/controller/cursorTypeOperations.ts b/src/vs/editor/common/controller/cursorTypeOperations.ts index 899ff598a82..b36938ce5e7 100644 --- a/src/vs/editor/common/controller/cursorTypeOperations.ts +++ b/src/vs/editor/common/controller/cursorTypeOperations.ts @@ -17,7 +17,6 @@ import { IndentAction } from 'vs/editor/common/modes/languageConfiguration'; import { SurroundSelectionCommand } from 'vs/editor/common/commands/surroundSelectionCommand'; import { IElectricAction } from 'vs/editor/common/modes/supports/electricCharacter'; import { getMapForWordSeparators, WordCharacterClass } from "vs/editor/common/controller/cursorWordOperations"; -import { CursorChangeReason } from "vs/editor/common/controller/cursorEvents"; export class TypeOperations { @@ -69,19 +68,18 @@ export class TypeOperations { return newIndentation; } - public static distributedPaste(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[], text: string[]): EditOperationResult { + private static _distributedPaste(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[], text: string[]): EditOperationResult { let commands: ICommand[] = []; for (let i = 0, len = selections.length; i < len; i++) { commands[i] = new ReplaceCommand(selections[i], text[i]); } return new EditOperationResult(commands, { shouldPushStackElementBefore: true, - shouldPushStackElementAfter: true, - reason: CursorChangeReason.Paste + shouldPushStackElementAfter: true }); } - public static paste(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[], text: string, pasteOnNewLine: boolean): EditOperationResult { + private static _simplePaste(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[], text: string, pasteOnNewLine: boolean): EditOperationResult { let commands: ICommand[] = []; for (let i = 0, len = selections.length; i < len; i++) { const selection = selections[i]; @@ -107,11 +105,44 @@ export class TypeOperations { } return new EditOperationResult(commands, { shouldPushStackElementBefore: true, - shouldPushStackElementAfter: true, - reason: CursorChangeReason.Paste + shouldPushStackElementAfter: true }); } + private static _distributePasteToCursors(selections: Selection[], pasteOnNewLine: boolean, text: string): string[] { + if (pasteOnNewLine) { + return null; + } + + if (selections.length === 1) { + return null; + } + + for (let i = 0; i < selections.length; i++) { + if (selections[i].startLineNumber !== selections[i].endLineNumber) { + return null; + } + } + + let pastePieces = text.split(/\r\n|\r|\n/); + if (pastePieces.length !== selections.length) { + return null; + } + + return pastePieces; + } + + public static paste(config: CursorConfiguration, model: ICursorSimpleModel, selections: Selection[], pasteOnNewLine: boolean, text: string): EditOperationResult { + const distributedPaste = this._distributePasteToCursors(selections, pasteOnNewLine, text); + + if (distributedPaste) { + selections = selections.sort(Range.compareRangesUsingStarts); + return this._distributedPaste(config, model, selections, distributedPaste); + } else { + return this._simplePaste(config, model, selections, text, pasteOnNewLine); + } + } + private static _goodIndentForLine(config: CursorConfiguration, model: ITokenizedModel, lineNumber: number): string { let expectedIndentAction = LanguageConfigurationRegistry.getGoodIndentActionForLine(model, lineNumber); From 0e8cd85d64595c4b5b0a009c9128039a0420c906 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 14:54:48 +0200 Subject: [PATCH 0674/1164] Simplifications --- src/vs/editor/common/controller/cursor.ts | 93 ++++++++--------------- 1 file changed, 33 insertions(+), 60 deletions(-) diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 4a062380b3c..318a6d84daf 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -21,26 +21,6 @@ import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations import { TextModelEventType, ModelRawContentChangedEvent, RawContentChangedType } from 'vs/editor/common/model/textModelEvents'; import { CursorEventType, CursorChangeReason, ICursorPositionChangedEvent, VerticalRevealType, ICursorSelectionChangedEvent, ICursorRevealRangeEvent, CursorScrollRequest } from 'vs/editor/common/controller/cursorEvents'; -class CursorOperationArgs { - public readonly eventSource: string; - public readonly eventData: T; - - constructor(eventSource: string, eventData: T) { - this.eventSource = eventSource; - this.eventData = eventData; - } -} - -interface ICommandData { - operations: editorCommon.IIdentifiedSingleEditOperation[]; - hadTrackedEditOperation: boolean; -} - -interface ICommandsData { - operations: editorCommon.IIdentifiedSingleEditOperation[]; - hadTrackedEditOperation: boolean; -} - export class Cursor extends Disposable implements ICursors { public onDidChangePosition(listener: (e: ICursorPositionChangedEvent) => void): IDisposable { @@ -457,8 +437,6 @@ export class Cursor extends Disposable implements ICursors { return; } - const args = new CursorOperationArgs(source, payload); - const oldSelections = this._cursors.getSelections(); const oldViewSelections = this._cursors.getViewSelections(); let cursorChangeReason = CursorChangeReason.NotSet; @@ -471,20 +449,20 @@ export class Cursor extends Disposable implements ICursors { try { switch (handlerId) { case H.Type: - this._executeEditOperation(this._type(args)); + this._type(source, payload.text); break; case H.ReplacePreviousChar: - this._executeEditOperation(this._replacePreviousChar(args)); + this._replacePreviousChar(payload.text, payload.replaceCharCnt); break; case H.Paste: cursorChangeReason = CursorChangeReason.Paste; - this._executeEditOperation(this._paste(args)); + this._paste(payload.text, payload.pasteOnNewLine); break; case H.Cut: - this._executeEditOperation(this._cut(args)); + this._cut(); break; case H.Undo: @@ -498,11 +476,11 @@ export class Cursor extends Disposable implements ICursors { break; case H.ExecuteCommand: - this._executeEditOperation(this._externalExecuteCommand(args)); + this._externalExecuteCommand(payload); break; case H.ExecuteCommands: - this._executeEditOperation(this._externalExecuteCommands(args)); + this._externalExecuteCommands(payload); break; } } catch (err) { @@ -514,18 +492,14 @@ export class Cursor extends Disposable implements ICursors { const newSelections = this._cursors.getSelections(); const newViewSelections = this._cursors.getViewSelections(); if (Cursor._somethingChanged(oldSelections, oldViewSelections, newSelections, newViewSelections)) { - this._emitCursorPositionChanged(args.eventSource, cursorChangeReason); + this._emitCursorPositionChanged(source, cursorChangeReason); this._revealRange(RevealTarget.Primary, VerticalRevealType.Simple, true); - this._emitCursorSelectionChanged(args.eventSource, cursorChangeReason); + this._emitCursorSelectionChanged(source, cursorChangeReason); } } - // -------------------- START editing operations - - private _type(args: CursorOperationArgs<{ text: string; }>): EditOperationResult { - const text = args.eventData.text; - - if (!this._isDoingComposition && args.eventSource === 'keyboard') { + private _type(source: string, text: string): void { + if (!this._isDoingComposition && source === 'keyboard') { // If this event is coming straight from the keyboard, look for electric characters and enter for (let i = 0, len = text.length; i < len; i++) { @@ -542,48 +516,37 @@ export class Cursor extends Disposable implements ICursors { this._executeEditOperation(TypeOperations.typeWithInterceptors(this.context.config, this.context.model, this.getSelections(), chr)); } - return null; } else { - return TypeOperations.typeWithoutInterceptors(this.context.config, this.context.model, this.getSelections(), text); + this._executeEditOperation(TypeOperations.typeWithoutInterceptors(this.context.config, this.context.model, this.getSelections(), text)); } } - private _replacePreviousChar(args: CursorOperationArgs<{ text: string; replaceCharCnt: number; }>): EditOperationResult { - const text = args.eventData.text; - const replaceCharCnt = args.eventData.replaceCharCnt; - return TypeOperations.replacePreviousChar(this.context.config, this.context.model, this.getSelections(), text, replaceCharCnt); + private _replacePreviousChar(text: string, replaceCharCnt: number): void { + this._executeEditOperation(TypeOperations.replacePreviousChar(this.context.config, this.context.model, this.getSelections(), text, replaceCharCnt)); } - private _paste(args: CursorOperationArgs<{ pasteOnNewLine: boolean; text: string; }>): EditOperationResult { - const pasteOnNewLine = args.eventData.pasteOnNewLine; - const text = args.eventData.text; - return TypeOperations.paste(this.context.config, this.context.model, this.getSelections(), pasteOnNewLine, text); + private _paste(text: string, pasteOnNewLine: boolean): void { + this._executeEditOperation(TypeOperations.paste(this.context.config, this.context.model, this.getSelections(), pasteOnNewLine, text)); } - private _cut(args: CursorOperationArgs): EditOperationResult { - return DeleteOperations.cut(this.context.config, this.context.model, this.getSelections()); + private _cut(): void { + this._executeEditOperation(DeleteOperations.cut(this.context.config, this.context.model, this.getSelections())); } - // -------------------- END editing operations - - private _externalExecuteCommand(args: CursorOperationArgs): EditOperationResult { - const command = args.eventData; - + private _externalExecuteCommand(command: editorCommon.ICommand): void { this._cursors.killSecondaryCursors(); - return new EditOperationResult([command], { + this._executeEditOperation(new EditOperationResult([command], { shouldPushStackElementBefore: false, shouldPushStackElementAfter: false - }); + })); } - private _externalExecuteCommands(args: CursorOperationArgs): EditOperationResult { - const commands = args.eventData; - - return new EditOperationResult(commands, { + private _externalExecuteCommands(commands: editorCommon.ICommand[]): void { + this._executeEditOperation(new EditOperationResult(commands, { shouldPushStackElementBefore: false, shouldPushStackElementAfter: false - }); + })); } } @@ -594,6 +557,16 @@ interface IExecContext { readonly positionMarkers: string[]; } +interface ICommandData { + operations: editorCommon.IIdentifiedSingleEditOperation[]; + hadTrackedEditOperation: boolean; +} + +interface ICommandsData { + operations: editorCommon.IIdentifiedSingleEditOperation[]; + hadTrackedEditOperation: boolean; +} + class CommandExecutor { public static executeCommands(model: editorCommon.IModel, selectionsBefore: Selection[], commands: editorCommon.ICommand[]): Selection[] { From 7a765323ac8eeb901a3b503f5d500ef29734ccf3 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 15:08:14 +0200 Subject: [PATCH 0675/1164] Move ViewEventEmitter out of viewModelImpl --- src/vs/editor/common/view/viewEvents.ts | 50 ++++++++++++++ src/vs/editor/common/viewModel/viewModel.ts | 8 +-- .../common/viewModel/viewModelCursors.ts | 3 +- .../common/viewModel/viewModelDecorations.ts | 9 +-- .../editor/common/viewModel/viewModelImpl.ts | 65 ++++--------------- 5 files changed, 68 insertions(+), 67 deletions(-) diff --git a/src/vs/editor/common/view/viewEvents.ts b/src/vs/editor/common/view/viewEvents.ts index 31c994adea8..7ad7a285c6d 100644 --- a/src/vs/editor/common/view/viewEvents.ts +++ b/src/vs/editor/common/view/viewEvents.ts @@ -10,6 +10,8 @@ import { Selection } from 'vs/editor/common/core/selection'; import { ScrollEvent } from 'vs/base/common/scrollable'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; import { VerticalRevealType } from 'vs/editor/common/controller/cursorEvents'; +import * as errors from 'vs/base/common/errors'; +import { IDisposable, Disposable } from "vs/base/common/lifecycle"; export const enum ViewEventType { ViewConfigurationChanged = 1, @@ -311,3 +313,51 @@ export type ViewEvent = ( | ViewZonesChangedEvent | ViewThemeChangedEvent ); + +export interface IViewEventListener { + (events: ViewEvent[]): void; +} + +export class ViewEventEmitter extends Disposable { + private _listeners: IViewEventListener[]; + + constructor() { + super(); + this._listeners = []; + } + + public dispose(): void { + this._listeners = []; + super.dispose(); + } + + protected _emit(events: ViewEvent[]): void { + const listeners = this._listeners.slice(0); + for (let i = 0, len = listeners.length; i < len; i++) { + safeInvokeListener(listeners[i], events); + } + } + + public addEventListener(listener: (events: ViewEvent[]) => void): IDisposable { + this._listeners.push(listener); + return { + dispose: () => { + let listeners = this._listeners; + for (let i = 0, len = listeners.length; i < len; i++) { + if (listeners[i] === listener) { + listeners.splice(i, 1); + break; + } + } + } + }; + } +} + +function safeInvokeListener(listener: IViewEventListener, events: ViewEvent[]): void { + try { + listener(events); + } catch (e) { + errors.onUnexpectedError(e); + } +} diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index f04c2936c74..93808ca90a3 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -9,7 +9,7 @@ import { ViewLineToken } from 'vs/editor/common/core/viewLineToken'; import { Position, IPosition } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { ViewEvent } from 'vs/editor/common/view/viewEvents'; +import { ViewEvent, IViewEventListener } from 'vs/editor/common/view/viewEvents'; import { IDisposable } from 'vs/base/common/lifecycle'; import { Scrollable } from "vs/base/common/scrollable"; import { IPartialViewLinesViewportData } from "vs/editor/common/viewLayout/viewLinesViewportData"; @@ -104,13 +104,9 @@ export interface ICoordinatesConverter { modelPositionIsVisible(modelPosition: Position): boolean; } -export interface IViewModelListener { - (events: ViewEvent[]): void; -} - export interface IViewModel { - addEventListener(listener: IViewModelListener): IDisposable; + addEventListener(listener: IViewEventListener): IDisposable; readonly coordinatesConverter: ICoordinatesConverter; diff --git a/src/vs/editor/common/viewModel/viewModelCursors.ts b/src/vs/editor/common/viewModel/viewModelCursors.ts index 1b37e3ef3d9..b0e5fb8d920 100644 --- a/src/vs/editor/common/viewModel/viewModelCursors.ts +++ b/src/vs/editor/common/viewModel/viewModelCursors.ts @@ -11,7 +11,6 @@ import { Selection } from 'vs/editor/common/core/selection'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { ICursorRevealRangeEvent, CursorEventType, CursorScrollRequest } from 'vs/editor/common/controller/cursorEvents'; import { Cursor } from "vs/editor/common/controller/cursor"; -import { ViewEventEmitter } from "vs/editor/common/viewModel/viewModelImpl"; import { EmitterEvent } from "vs/base/common/eventEmitter"; export interface ICursorPositionChangedEvent { @@ -38,7 +37,7 @@ function containsLineMappingChanged(events: viewEvents.ViewEvent[]): boolean { return false; } -export class ViewModelCursors extends ViewEventEmitter { +export class ViewModelCursors extends viewEvents.ViewEventEmitter { private readonly configuration: editorCommon.IConfiguration; private readonly viewModel: IViewModel; diff --git a/src/vs/editor/common/viewModel/viewModelDecorations.ts b/src/vs/editor/common/viewModel/viewModelDecorations.ts index 2a5bbea8d82..6f1a0a184b2 100644 --- a/src/vs/editor/common/viewModel/viewModelDecorations.ts +++ b/src/vs/editor/common/viewModel/viewModelDecorations.ts @@ -8,8 +8,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { Range } from 'vs/editor/common/core/range'; import { Position } from 'vs/editor/common/core/position'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import { InlineDecoration, ViewModelDecoration, ICoordinatesConverter, ViewEventsCollector } from 'vs/editor/common/viewModel/viewModel'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import { InlineDecoration, ViewModelDecoration, ICoordinatesConverter } from 'vs/editor/common/viewModel/viewModel'; import { IModelDecorationsChangedEvent } from 'vs/editor/common/model/textModelEvents'; export interface IDecorationsViewportData { @@ -59,7 +58,7 @@ export class ViewModelDecorations implements IDisposable { this._clearCachedModelDecorationsResolver(); } - public onModelDecorationsChanged(eventsCollector: ViewEventsCollector, e: IModelDecorationsChangedEvent): void { + public onModelDecorationsChanged(e: IModelDecorationsChangedEvent): void { let changedDecorations = e.changedDecorations; for (let i = 0, len = changedDecorations.length; i < len; i++) { let changedDecoration = changedDecorations[i]; @@ -78,14 +77,12 @@ export class ViewModelDecorations implements IDisposable { } this._clearCachedModelDecorationsResolver(); - eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent()); } - public onLineMappingChanged(eventsCollector: ViewEventsCollector): void { + public onLineMappingChanged(): void { this._decorationsCache = Object.create(null); this._clearCachedModelDecorationsResolver(); - eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent()); } private _getOrCreateViewModelDecoration(modelDecoration: editorCommon.IModelDecoration): ViewModelDecoration { diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 34e254267dd..93fb6d5fea7 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -5,7 +5,6 @@ 'use strict'; import { EmitterEvent } from 'vs/base/common/eventEmitter'; -import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import * as strings from 'vs/base/common/strings'; import { Position, IPosition } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; @@ -14,10 +13,9 @@ import * as editorCommon from 'vs/editor/common/editorCommon'; import { TokenizationRegistry, ColorId, LanguageId } from 'vs/editor/common/modes'; import { tokenizeLineToHTML } from 'vs/editor/common/modes/textToHtmlTokenizer'; import { ViewModelDecorations } from 'vs/editor/common/viewModel/viewModelDecorations'; -import { MinimapLinesRenderingData, ViewLineRenderingData, ViewModelDecoration, IViewModelListener, IViewModel, ICoordinatesConverter, ViewEventsCollector } from 'vs/editor/common/viewModel/viewModel'; +import { MinimapLinesRenderingData, ViewLineRenderingData, ViewModelDecoration, IViewModel, ICoordinatesConverter, ViewEventsCollector } from 'vs/editor/common/viewModel/viewModel'; import { SplitLinesCollection } from 'vs/editor/common/viewModel/splitLinesCollection'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import * as errors from 'vs/base/common/errors'; import { MinimapTokensColorTracker } from 'vs/editor/common/view/minimapCharRenderer'; import * as textModelEvents from 'vs/editor/common/model/textModelEvents'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; @@ -85,43 +83,7 @@ export class CoordinatesConverter implements ICoordinatesConverter { } -export class ViewEventEmitter extends Disposable { - private _listeners: IViewModelListener[]; - - constructor() { - super(); - this._listeners = []; - } - - public dispose(): void { - this._listeners = []; - super.dispose(); - } - - protected _emit(events: viewEvents.ViewEvent[]): void { - const listeners = this._listeners.slice(0); - for (let i = 0, len = listeners.length; i < len; i++) { - safeInvokeListener(listeners[i], events); - } - } - - public addEventListener(listener: (events: viewEvents.ViewEvent[]) => void): IDisposable { - this._listeners.push(listener); - return { - dispose: () => { - let listeners = this._listeners; - for (let i = 0, len = listeners.length; i < len; i++) { - if (listeners[i] === listener) { - listeners.splice(i, 1); - break; - } - } - } - }; - } -} - -export class ViewModel extends ViewEventEmitter implements IViewModel { +export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel { private readonly editorId: number; private readonly configuration: editorCommon.IConfiguration; @@ -214,7 +176,8 @@ export class ViewModel extends ViewEventEmitter implements IViewModel { if (this.lines.setWrappingSettings(conf.wrappingInfo.wrappingIndent, conf.wrappingInfo.wrappingColumn, conf.fontInfo.typicalFullwidthCharacterWidth / conf.fontInfo.typicalHalfwidthCharacterWidth)) { eventsCollector.emit(new viewEvents.ViewFlushedEvent()); eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); - this.decorations.onLineMappingChanged(eventsCollector); + eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent()); + this.decorations.onLineMappingChanged(); this.viewLayout.onFlushed(this.getLineCount()); revealPreviousCenteredModelRange = true; } @@ -356,7 +319,8 @@ export class ViewModel extends ViewEventEmitter implements IViewModel { if (this.lines.setTabSize(this.model.getOptions().tabSize)) { eventsCollector.emit(new viewEvents.ViewFlushedEvent()); eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); - this.decorations.onLineMappingChanged(eventsCollector); + eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent()); + this.decorations.onLineMappingChanged(); this.viewLayout.onFlushed(this.getLineCount()); } @@ -364,7 +328,8 @@ export class ViewModel extends ViewEventEmitter implements IViewModel { } case textModelEvents.TextModelEventType.ModelDecorationsChanged: { const e = data; - this.decorations.onModelDecorationsChanged(eventsCollector, e); + this.decorations.onModelDecorationsChanged(e); + eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent()); break; } case textModelEvents.TextModelEventType.ModelDispose: { @@ -379,7 +344,8 @@ export class ViewModel extends ViewEventEmitter implements IViewModel { if (!hadOtherModelChange && hadModelLineChangeThatChangedLineMapping) { eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); - this.decorations.onLineMappingChanged(eventsCollector); + eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent()); + this.decorations.onLineMappingChanged(); } } @@ -389,7 +355,8 @@ export class ViewModel extends ViewEventEmitter implements IViewModel { if (lineMappingChanged) { eventsCollector.emit(new viewEvents.ViewFlushedEvent()); eventsCollector.emit(new viewEvents.ViewLineMappingChangedEvent()); - this.decorations.onLineMappingChanged(eventsCollector); + eventsCollector.emit(new viewEvents.ViewDecorationsChangedEvent()); + this.decorations.onLineMappingChanged(); this.viewLayout.onFlushed(this.getLineCount()); } this._emit(eventsCollector.finalize()); @@ -623,11 +590,3 @@ export class ViewModel extends ViewEventEmitter implements IViewModel { return result; } } - -function safeInvokeListener(listener: IViewModelListener, events: viewEvents.ViewEvent[]): void { - try { - listener(events); - } catch (e) { - errors.onUnexpectedError(e); - } -} From dcbe78a1244abe9d4e39a51c065efa327e8f9b76 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 15:39:57 +0200 Subject: [PATCH 0676/1164] The cursor gets passed in the ViewModel --- src/vs/editor/common/commonCodeEditor.ts | 21 +-- src/vs/editor/common/controller/cursor.ts | 21 ++- src/vs/editor/common/viewModel/viewModel.ts | 4 + .../test/common/commands/commandTestUtils.ts | 21 ++- .../test/common/commands/sideEditing.test.ts | 24 ++-- .../test/common/controller/cursor.test.ts | 132 ++++++++++-------- .../controller/cursorMoveCommand.test.ts | 78 ++--------- src/vs/editor/test/common/editorTestUtils.ts | 50 ------- .../test/common/mocks/mockCodeEditor.ts | 27 +++- 9 files changed, 152 insertions(+), 226 deletions(-) diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index 1f652adcaf2..531c248be3a 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -13,7 +13,7 @@ import { ServiceCollection } from 'vs/platform/instantiation/common/serviceColle import { IContextKey, IContextKeyServiceTarget, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { CommonEditorConfiguration } from 'vs/editor/common/config/commonEditorConfig'; import { Cursor } from 'vs/editor/common/controller/cursor'; -import { CursorColumns, IViewModelHelper, ICursors, CursorConfiguration } from 'vs/editor/common/controller/cursorCommon'; +import { CursorColumns, ICursors, CursorConfiguration } from 'vs/editor/common/controller/cursorCommon'; import { Position, IPosition } from 'vs/editor/common/core/position'; import { Range, IRange } from 'vs/editor/common/core/range'; import { Selection, ISelection } from 'vs/editor/common/core/selection'; @@ -863,23 +863,6 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo this.viewModel = new ViewModel(this.id, this._configuration, this.model); - let viewModelHelper: IViewModelHelper = { - viewModel: this.viewModel, - coordinatesConverter: this.viewModel.coordinatesConverter, - getScrollTop: (): number => { - return this.viewModel.viewLayout.getScrollTop(); - }, - getCompletelyVisibleViewRange: (): Range => { - return this.viewModel.getCompletelyVisibleViewRange(); - }, - getCompletelyVisibleViewRangeAtScrollTop: (scrollTop: number): Range => { - return this.viewModel.getCompletelyVisibleViewRangeAtScrollTop(scrollTop); - }, - getVerticalOffsetForViewLineNumber: (viewLineNumber: number): number => { - return this.viewModel.viewLayout.getVerticalOffsetForLineNumber(viewLineNumber); - } - }; - this.listenersToRemove.push(this.model.addBulkListener((events) => { for (let i = 0, len = events.length; i < len; i++) { let eventType = events[i].type; @@ -917,7 +900,7 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo this.cursor = new Cursor( this._configuration, this.model, - viewModelHelper + this.viewModel ); this.viewCursor = new ViewModelCursors( diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 318a6d84daf..3a596ad5730 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -20,6 +20,7 @@ import { DeleteOperations } from 'vs/editor/common/controller/cursorDeleteOperat import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations'; import { TextModelEventType, ModelRawContentChangedEvent, RawContentChangedType } from 'vs/editor/common/model/textModelEvents'; import { CursorEventType, CursorChangeReason, ICursorPositionChangedEvent, VerticalRevealType, ICursorSelectionChangedEvent, ICursorRevealRangeEvent, CursorScrollRequest } from 'vs/editor/common/controller/cursorEvents'; +import { IViewModel } from "vs/editor/common/viewModel/viewModel"; export class Cursor extends Disposable implements ICursors { @@ -44,11 +45,29 @@ export class Cursor extends Disposable implements ICursors { private _isDoingComposition: boolean; private _columnSelectData: IColumnSelectData; - constructor(configuration: editorCommon.IConfiguration, model: editorCommon.IModel, viewModelHelper: IViewModelHelper) { + constructor(configuration: editorCommon.IConfiguration, model: editorCommon.IModel, viewModel: IViewModel) { super(); this._eventEmitter = this._register(new EventEmitter()); this._configuration = configuration; this._model = model; + + let viewModelHelper: IViewModelHelper = { + viewModel: viewModel, + coordinatesConverter: viewModel.coordinatesConverter, + getScrollTop: (): number => { + return viewModel.viewLayout.getScrollTop(); + }, + getCompletelyVisibleViewRange: (): Range => { + return viewModel.getCompletelyVisibleViewRange(); + }, + getCompletelyVisibleViewRangeAtScrollTop: (scrollTop: number): Range => { + return viewModel.getCompletelyVisibleViewRangeAtScrollTop(scrollTop); + }, + getVerticalOffsetForViewLineNumber: (viewLineNumber: number): number => { + return viewModel.viewLayout.getVerticalOffsetForLineNumber(viewLineNumber); + } + }; + this._viewModelHelper = viewModelHelper; this.context = new CursorContext(this._configuration, this._model, this._viewModelHelper); this._cursors = new CursorCollection(this.context); diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index 93808ca90a3..e812f5710f2 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -120,6 +120,8 @@ export interface IViewModel { getDecorationsInViewport(visibleRange: Range): ViewModelDecoration[]; getViewLineRenderingData(visibleRange: Range, lineNumber: number): ViewLineRenderingData; getMinimapLinesRenderingData(startLineNumber: number, endLineNumber: number, needed: boolean[]): MinimapLinesRenderingData; + getCompletelyVisibleViewRange(): Range; + getCompletelyVisibleViewRangeAtScrollTop(scrollTop: number): Range; getTabSize(): number; getLineCount(): number; @@ -127,6 +129,8 @@ export interface IViewModel { getLineIndentGuide(lineNumber: number): number; getLineMinColumn(lineNumber: number): number; getLineMaxColumn(lineNumber: number): number; + getLineFirstNonWhitespaceColumn(lineNumber: number): number; + getLineLastNonWhitespaceColumn(lineNumber: number): number; getAllOverviewRulerDecorations(): ViewModelDecoration[]; getValueInRange(range: Range, eol: EndOfLinePreference): string; diff --git a/src/vs/editor/test/common/commands/commandTestUtils.ts b/src/vs/editor/test/common/commands/commandTestUtils.ts index 3db5dc1fd3c..b753b8a063a 100644 --- a/src/vs/editor/test/common/commands/commandTestUtils.ts +++ b/src/vs/editor/test/common/commands/commandTestUtils.ts @@ -5,14 +5,12 @@ 'use strict'; import * as assert from 'assert'; -import { Cursor } from 'vs/editor/common/controller/cursor'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { Model } from 'vs/editor/common/model/model'; import { LanguageIdentifier } from 'vs/editor/common/modes'; -import { TestConfiguration } from 'vs/editor/test/common/mocks/testConfiguration'; -import { viewModelHelper } from 'vs/editor/test/common/editorTestUtils'; +import { withMockCodeEditor } from "vs/editor/test/common/mocks/mockCodeEditor"; export function testCommand( lines: string[], @@ -22,22 +20,19 @@ export function testCommand( expectedLines: string[], expectedSelection: Selection ): void { - let model = Model.createFromString(lines.join('\n'), undefined, languageIdentifier); - let config = new TestConfiguration(null); - let cursor = new Cursor(config, model, viewModelHelper(model)); + withMockCodeEditor(null, { model: model }, (editor, cursor) => { - cursor.setSelections('tests', [selection]); + cursor.setSelections('tests', [selection]); - cursor.trigger('tests', editorCommon.Handler.ExecuteCommand, commandFactory(cursor.getSelection())); + cursor.trigger('tests', editorCommon.Handler.ExecuteCommand, commandFactory(cursor.getSelection())); - assert.deepEqual(model.getLinesContent(), expectedLines); + assert.deepEqual(model.getLinesContent(), expectedLines); - let actualSelection = cursor.getSelection(); - assert.deepEqual(actualSelection.toString(), expectedSelection.toString()); + let actualSelection = cursor.getSelection(); + assert.deepEqual(actualSelection.toString(), expectedSelection.toString()); - cursor.dispose(); - config.dispose(); + }); model.dispose(); } diff --git a/src/vs/editor/test/common/commands/sideEditing.test.ts b/src/vs/editor/test/common/commands/sideEditing.test.ts index 6ccc560d22c..2fa3ea6035f 100644 --- a/src/vs/editor/test/common/commands/sideEditing.test.ts +++ b/src/vs/editor/test/common/commands/sideEditing.test.ts @@ -5,36 +5,30 @@ 'use strict'; import * as assert from 'assert'; -import { Cursor } from 'vs/editor/common/controller/cursor'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { IIdentifiedSingleEditOperation } from 'vs/editor/common/editorCommon'; -import { Model } from 'vs/editor/common/model/model'; import { ILineEdit, ModelLine, LineMarker, MarkersTracker } from 'vs/editor/common/model/modelLine'; -import { TestConfiguration } from 'vs/editor/test/common/mocks/testConfiguration'; -import { viewModelHelper } from 'vs/editor/test/common/editorTestUtils'; +import { withMockCodeEditor } from "vs/editor/test/common/mocks/mockCodeEditor"; const NO_TAB_SIZE = 0; function testCommand(lines: string[], selections: Selection[], edits: IIdentifiedSingleEditOperation[], expectedLines: string[], expectedSelections: Selection[]): void { - let model = Model.createFromString(lines.join('\n')); - let config = new TestConfiguration(null); - let cursor = new Cursor(config, model, viewModelHelper(model)); + withMockCodeEditor(lines, {}, (editor, cursor) => { + const model = editor.getModel(); - cursor.setSelections('tests', selections); + cursor.setSelections('tests', selections); - model.applyEdits(edits); + model.applyEdits(edits); - assert.deepEqual(model.getLinesContent(), expectedLines); + assert.deepEqual(model.getLinesContent(), expectedLines); - let actualSelections = cursor.getSelections(); - assert.deepEqual(actualSelections.map(s => s.toString()), expectedSelections.map(s => s.toString())); + let actualSelections = cursor.getSelections(); + assert.deepEqual(actualSelections.map(s => s.toString()), expectedSelections.map(s => s.toString())); - cursor.dispose(); - config.dispose(); - model.dispose(); + }); } function testLineEditMarker(text: string, column: number, stickToPreviousCharacter: boolean, edit: ILineEdit, expectedColumn: number): void { diff --git a/src/vs/editor/test/common/controller/cursor.test.ts b/src/vs/editor/test/common/controller/cursor.test.ts index a2700b342cb..3619bef7d23 100644 --- a/src/vs/editor/test/common/controller/cursor.test.ts +++ b/src/vs/editor/test/common/controller/cursor.test.ts @@ -21,12 +21,12 @@ import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageCo import { TestConfiguration } from 'vs/editor/test/common/mocks/testConfiguration'; import { MockMode } from 'vs/editor/test/common/mocks/mockMode'; import { LanguageIdentifier } from 'vs/editor/common/modes'; -import { viewModelHelper } from 'vs/editor/test/common/editorTestUtils'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { CoreNavigationCommands, CoreEditingCommands } from 'vs/editor/common/controller/coreCommands'; import { withMockCodeEditor } from "vs/editor/test/common/mocks/mockCodeEditor"; import { TextModel } from "vs/editor/common/model/textModel"; +import { ViewModel } from "vs/editor/common/viewModel/viewModelImpl"; let H = Handler; @@ -136,6 +136,7 @@ suite('Editor Controller - Cursor', () => { let thisModel: Model; let thisConfiguration: TestConfiguration; + let thisViewModel: ViewModel; let thisCursor: Cursor; setup(() => { @@ -148,11 +149,14 @@ suite('Editor Controller - Cursor', () => { thisModel = Model.createFromString(text); thisConfiguration = new TestConfiguration(null); - thisCursor = new Cursor(thisConfiguration, thisModel, viewModelHelper(thisModel)); + thisViewModel = new ViewModel(0, thisConfiguration, thisModel); + + thisCursor = new Cursor(thisConfiguration, thisModel, thisViewModel); }); teardown(() => { thisCursor.dispose(); + thisViewModel.dispose(); thisModel.dispose(); thisConfiguration.dispose(); }); @@ -700,39 +704,37 @@ suite('Editor Controller - Cursor', () => { }); test('column select 1', () => { - let model = Model.createFromString([ + withMockCodeEditor([ '\tprivate compute(a:number): boolean {', '\t\tif (a + 3 === 0 || a + 5 === 0) {', '\t\t\treturn false;', '\t\t}', '\t}' - ].join('\n')); - let cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model)); + ], {}, (editor, cursor) => { - moveTo(cursor, 1, 7, false); - assertCursor(cursor, new Position(1, 7)); + moveTo(cursor, 1, 7, false); + assertCursor(cursor, new Position(1, 7)); + + CoreNavigationCommands.ColumnSelect.runCoreEditorCommand(cursor, { + position: new Position(4, 4), + viewPosition: new Position(4, 4), + mouseColumn: 15 + }); + + let expectedSelections = [ + new Selection(1, 7, 1, 12), + new Selection(2, 4, 2, 9), + new Selection(3, 3, 3, 6), + new Selection(4, 4, 4, 4), + ]; + + assertCursor(cursor, expectedSelections); - CoreNavigationCommands.ColumnSelect.runCoreEditorCommand(cursor, { - position: new Position(4, 4), - viewPosition: new Position(4, 4), - mouseColumn: 15 }); - - let expectedSelections = [ - new Selection(1, 7, 1, 12), - new Selection(2, 4, 2, 9), - new Selection(3, 3, 3, 6), - new Selection(4, 4, 4, 4), - ]; - - assertCursor(cursor, expectedSelections); - - cursor.dispose(); - model.dispose(); }); test('issue #4905 - column select is biased to the right', () => { - let model = Model.createFromString([ + const model = Model.createFromString([ 'var gulp = require("gulp");', 'var path = require("path");', 'var rimraf = require("rimraf");', @@ -741,7 +743,9 @@ suite('Editor Controller - Cursor', () => { 'var concat = require("gulp-concat");', 'var newer = require("gulp-newer");', ].join('\n')); - let cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model)); + const config = new TestConfiguration(null); + const viewModel = new ViewModel(0, config, model); + const cursor = new Cursor(config, model, viewModel); moveTo(cursor, 1, 4, false); assertCursor(cursor, new Position(1, 4)); @@ -760,11 +764,13 @@ suite('Editor Controller - Cursor', () => { ]); cursor.dispose(); + viewModel.dispose(); + config.dispose(); model.dispose(); }); test('issue #20087: column select with mouse', () => { - let model = Model.createFromString([ + const model = Model.createFromString([ '', '', '', @@ -776,7 +782,9 @@ suite('Editor Controller - Cursor', () => { '', '', ].join('\n')); - let cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model)); + const config = new TestConfiguration(null); + const viewModel = new ViewModel(0, config, model); + const cursor = new Cursor(config, model, viewModel); moveTo(cursor, 10, 10, false); assertCursor(cursor, new Position(10, 10)); @@ -818,11 +826,13 @@ suite('Editor Controller - Cursor', () => { ]); cursor.dispose(); + viewModel.dispose(); + config.dispose(); model.dispose(); }); test('issue #20087: column select with keyboard', () => { - let model = Model.createFromString([ + const model = Model.createFromString([ '', '', '', @@ -834,7 +844,9 @@ suite('Editor Controller - Cursor', () => { '', '', ].join('\n')); - let cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model)); + const config = new TestConfiguration(null); + const viewModel = new ViewModel(0, config, model); + const cursor = new Cursor(config, model, viewModel); moveTo(cursor, 10, 10, false); assertCursor(cursor, new Position(10, 10)); @@ -866,11 +878,13 @@ suite('Editor Controller - Cursor', () => { ]); cursor.dispose(); + viewModel.dispose(); + config.dispose(); model.dispose(); }); test('column select with keyboard', () => { - let model = Model.createFromString([ + const model = Model.createFromString([ 'var gulp = require("gulp");', 'var path = require("path");', 'var rimraf = require("rimraf");', @@ -879,7 +893,9 @@ suite('Editor Controller - Cursor', () => { 'var concat = require("gulp-concat");', 'var newer = require("gulp-newer");', ].join('\n')); - let cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model)); + const config = new TestConfiguration(null); + const viewModel = new ViewModel(0, config, model); + const cursor = new Cursor(config, model, viewModel); moveTo(cursor, 1, 4, false); assertCursor(cursor, new Position(1, 4)); @@ -1076,6 +1092,8 @@ suite('Editor Controller - Cursor', () => { ]); cursor.dispose(); + viewModel.dispose(); + config.dispose(); model.dispose(); }); }); @@ -1438,45 +1456,41 @@ suite('Editor Controller - Regression tests', () => { }); test('bug #16740: [editor] Cut line doesn\'t quite cut the last line', () => { + // Part 1 => there is text on the last line - let text = [ + withMockCodeEditor([ 'asdasd', 'qwerty' - ]; - let model = Model.createFromString(text.join('\n')); - let cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model)); + ], {}, (editor, cursor) => { + const model = editor.getModel(); - moveTo(cursor, 2, 1, false); - assertCursor(cursor, new Selection(2, 1, 2, 1)); + moveTo(cursor, 2, 1, false); + assertCursor(cursor, new Selection(2, 1, 2, 1)); - cursorCommand(cursor, H.Cut, null, 'keyboard'); - assert.equal(model.getLineCount(), 1); - assert.equal(model.getLineContent(1), 'asdasd'); + cursorCommand(cursor, H.Cut, null, 'keyboard'); + assert.equal(model.getLineCount(), 1); + assert.equal(model.getLineContent(1), 'asdasd'); - cursor.dispose(); - model.dispose(); + }); // Part 2 => there is no text on the last line - text = [ + withMockCodeEditor([ 'asdasd', '' - ]; - model = Model.createFromString(text.join('\n')); - cursor = new Cursor(new TestConfiguration(null), model, viewModelHelper(model)); + ], {}, (editor, cursor) => { + const model = editor.getModel(); - moveTo(cursor, 2, 1, false); - assertCursor(cursor, new Selection(2, 1, 2, 1)); + moveTo(cursor, 2, 1, false); + assertCursor(cursor, new Selection(2, 1, 2, 1)); - cursorCommand(cursor, H.Cut, null, 'keyboard'); - assert.equal(model.getLineCount(), 1); - assert.equal(model.getLineContent(1), 'asdasd'); + cursorCommand(cursor, H.Cut, null, 'keyboard'); + assert.equal(model.getLineCount(), 1); + assert.equal(model.getLineContent(1), 'asdasd'); - cursorCommand(cursor, H.Cut, null, 'keyboard'); - assert.equal(model.getLineCount(), 1); - assert.equal(model.getLineContent(1), ''); - - cursor.dispose(); - model.dispose(); + cursorCommand(cursor, H.Cut, null, 'keyboard'); + assert.equal(model.getLineCount(), 1); + assert.equal(model.getLineContent(1), ''); + }); }); test('Bug #11476: Double bracket surrounding + undo is broken', () => { @@ -2756,11 +2770,13 @@ interface ICursorOpts { function usingCursor(opts: ICursorOpts, callback: (model: Model, cursor: Cursor) => void): void { let model = Model.createFromString(opts.text.join('\n'), opts.modelOpts, opts.languageIdentifier); let config = new TestConfiguration(opts.editorOpts); - let cursor = new Cursor(config, model, viewModelHelper(model)); + let viewModel = new ViewModel(0, config, model); + let cursor = new Cursor(config, model, viewModel); callback(model, cursor); cursor.dispose(); + viewModel.dispose(); config.dispose(); model.dispose(); } diff --git a/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts b/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts index acab85b463e..7236cf52bb8 100644 --- a/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts +++ b/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts @@ -11,18 +11,18 @@ import { ITextModelCreationOptions } from 'vs/editor/common/editorCommon'; import { Model } from 'vs/editor/common/model/model'; import { IMode } from 'vs/editor/common/modes'; import { TestConfiguration } from 'vs/editor/test/common/mocks/testConfiguration'; -import { viewModelHelper as aViewModelHelper } from 'vs/editor/test/common/editorTestUtils'; import { CursorMove } from 'vs/editor/common/controller/cursorMoveCommands'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; -import { IViewModelHelper } from 'vs/editor/common/controller/cursorCommon'; import { CoreNavigationCommands } from 'vs/editor/common/controller/coreCommands'; +import { ViewModel } from "vs/editor/common/viewModel/viewModelImpl"; suite('Cursor move command test', () => { let thisModel: Model; let thisConfiguration: TestConfiguration; + let thisViewModel: ViewModel; let thisCursor: Cursor; setup(() => { @@ -36,16 +36,18 @@ suite('Cursor move command test', () => { thisModel = Model.createFromString(text); thisConfiguration = new TestConfiguration(null); + thisViewModel = new ViewModel(0, thisConfiguration, thisModel); + thisCursor = new Cursor(thisConfiguration, thisModel, thisViewModel); }); teardown(() => { thisCursor.dispose(); + thisViewModel.dispose(); thisModel.dispose(); thisConfiguration.dispose(); }); test('move left should move to left character', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 8); moveLeft(thisCursor); @@ -54,7 +56,6 @@ suite('Cursor move command test', () => { }); test('move left should move to left by n characters', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 8); moveLeft(thisCursor, 3); @@ -63,7 +64,6 @@ suite('Cursor move command test', () => { }); test('move left should move to left by half line', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 8); moveLeft(thisCursor, 1, CursorMove.RawUnit.HalfLine); @@ -72,7 +72,6 @@ suite('Cursor move command test', () => { }); test('move left moves to previous line', () => { - thisCursor = aCursor(); moveTo(thisCursor, 2, 3); moveLeft(thisCursor, 10); @@ -81,7 +80,6 @@ suite('Cursor move command test', () => { }); test('move right should move to right character', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 5); moveRight(thisCursor); @@ -90,7 +88,6 @@ suite('Cursor move command test', () => { }); test('move right should move to right by n characters', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 2); moveRight(thisCursor, 6); @@ -99,7 +96,6 @@ suite('Cursor move command test', () => { }); test('move right should move to right by half line', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 4); moveRight(thisCursor, 1, CursorMove.RawUnit.HalfLine); @@ -108,7 +104,6 @@ suite('Cursor move command test', () => { }); test('move right moves to next line', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 8); moveRight(thisCursor, 100); @@ -117,14 +112,12 @@ suite('Cursor move command test', () => { }); test('move to first character of line from middle', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 8); moveToLineStart(thisCursor); cursorEqual(thisCursor, 1, 1); }); test('move to first character of line from first non white space character', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 6); moveToLineStart(thisCursor); @@ -133,7 +126,6 @@ suite('Cursor move command test', () => { }); test('move to first character of line from first character', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 1); moveToLineStart(thisCursor); @@ -142,7 +134,6 @@ suite('Cursor move command test', () => { }); test('move to first non white space character of line from middle', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 8); moveToLineFirstNonWhiteSpaceCharacter(thisCursor); @@ -151,7 +142,6 @@ suite('Cursor move command test', () => { }); test('move to first non white space character of line from first non white space character', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 6); moveToLineFirstNonWhiteSpaceCharacter(thisCursor); @@ -160,7 +150,6 @@ suite('Cursor move command test', () => { }); test('move to first non white space character of line from first character', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 1); moveToLineFirstNonWhiteSpaceCharacter(thisCursor); @@ -169,7 +158,6 @@ suite('Cursor move command test', () => { }); test('move to end of line from middle', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 8); moveToLineEnd(thisCursor); @@ -178,7 +166,6 @@ suite('Cursor move command test', () => { }); test('move to end of line from last non white space character', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 19); moveToLineEnd(thisCursor); @@ -187,7 +174,6 @@ suite('Cursor move command test', () => { }); test('move to end of line from line end', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 21); moveToLineEnd(thisCursor); @@ -196,7 +182,6 @@ suite('Cursor move command test', () => { }); test('move to last non white space character from middle', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 8); moveToLineLastNonWhiteSpaceCharacter(thisCursor); @@ -205,7 +190,6 @@ suite('Cursor move command test', () => { }); test('move to last non white space character from last non white space character', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 19); moveToLineLastNonWhiteSpaceCharacter(thisCursor); @@ -214,7 +198,6 @@ suite('Cursor move command test', () => { }); test('move to last non white space character from line end', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 21); moveToLineLastNonWhiteSpaceCharacter(thisCursor); @@ -223,7 +206,6 @@ suite('Cursor move command test', () => { }); test('move to center of line not from center', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 8); moveToLineCenter(thisCursor); @@ -232,7 +214,6 @@ suite('Cursor move command test', () => { }); test('move to center of line from center', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 11); moveToLineCenter(thisCursor); @@ -241,7 +222,6 @@ suite('Cursor move command test', () => { }); test('move to center of line from start', () => { - thisCursor = aCursor(); moveToLineStart(thisCursor); moveToLineCenter(thisCursor); @@ -250,7 +230,6 @@ suite('Cursor move command test', () => { }); test('move to center of line from end', () => { - thisCursor = aCursor(); moveToLineEnd(thisCursor); moveToLineCenter(thisCursor); @@ -259,7 +238,6 @@ suite('Cursor move command test', () => { }); test('move up by cursor move command', () => { - thisCursor = aCursor(); moveTo(thisCursor, 3, 5); cursorEqual(thisCursor, 3, 5); @@ -272,7 +250,6 @@ suite('Cursor move command test', () => { }); test('move up by model line cursor move command', () => { - thisCursor = aCursor(); moveTo(thisCursor, 3, 5); cursorEqual(thisCursor, 3, 5); @@ -285,7 +262,6 @@ suite('Cursor move command test', () => { }); test('move down by model line cursor move command', () => { - thisCursor = aCursor(); moveTo(thisCursor, 3, 5); cursorEqual(thisCursor, 3, 5); @@ -298,7 +274,6 @@ suite('Cursor move command test', () => { }); test('move up with selection by cursor move command', () => { - thisCursor = aCursor(); moveTo(thisCursor, 3, 5); cursorEqual(thisCursor, 3, 5); @@ -311,7 +286,6 @@ suite('Cursor move command test', () => { }); test('move up and down with tabs by cursor move command', () => { - thisCursor = aCursor(); moveTo(thisCursor, 1, 5); cursorEqual(thisCursor, 1, 5); @@ -333,7 +307,6 @@ suite('Cursor move command test', () => { }); test('move up and down with end of lines starting from a long one by cursor move command', () => { - thisCursor = aCursor(); moveToEndOfLine(thisCursor); cursorEqual(thisCursor, 1, 21); @@ -355,9 +328,7 @@ suite('Cursor move command test', () => { }); test('move to view top line moves to first visible line if it is first line', () => { - let viewModelHelper = aViewModelHelper(thisModel); - viewModelHelper.getCompletelyVisibleViewRange = () => new Range(1, 1, 10, 1); - thisCursor = aCursor(viewModelHelper); + thisViewModel.getCompletelyVisibleViewRange = () => new Range(1, 1, 10, 1); moveTo(thisCursor, 2, 2); moveToTop(thisCursor); @@ -366,9 +337,7 @@ suite('Cursor move command test', () => { }); test('move to view top line moves to top visible line when first line is not visible', () => { - let viewModelHelper = aViewModelHelper(thisModel); - viewModelHelper.getCompletelyVisibleViewRange = () => new Range(2, 1, 10, 1); - thisCursor = aCursor(viewModelHelper); + thisViewModel.getCompletelyVisibleViewRange = () => new Range(2, 1, 10, 1); moveTo(thisCursor, 4, 1); moveToTop(thisCursor); @@ -377,9 +346,7 @@ suite('Cursor move command test', () => { }); test('move to view top line moves to nth line from top', () => { - let viewModelHelper = aViewModelHelper(thisModel); - viewModelHelper.getCompletelyVisibleViewRange = () => new Range(1, 1, 10, 1); - thisCursor = aCursor(viewModelHelper); + thisViewModel.getCompletelyVisibleViewRange = () => new Range(1, 1, 10, 1); moveTo(thisCursor, 4, 1); moveToTop(thisCursor, 3); @@ -388,9 +355,7 @@ suite('Cursor move command test', () => { }); test('move to view top line moves to last line if n is greater than last visible line number', () => { - let viewModelHelper = aViewModelHelper(thisModel); - viewModelHelper.getCompletelyVisibleViewRange = () => new Range(1, 1, 3, 1); - thisCursor = aCursor(viewModelHelper); + thisViewModel.getCompletelyVisibleViewRange = () => new Range(1, 1, 3, 1); moveTo(thisCursor, 2, 2); moveToTop(thisCursor, 4); @@ -399,9 +364,7 @@ suite('Cursor move command test', () => { }); test('move to view center line moves to the center line', () => { - let viewModelHelper = aViewModelHelper(thisModel); - viewModelHelper.getCompletelyVisibleViewRange = () => new Range(3, 1, 3, 1); - thisCursor = aCursor(viewModelHelper); + thisViewModel.getCompletelyVisibleViewRange = () => new Range(3, 1, 3, 1); moveTo(thisCursor, 2, 2); moveToCenter(thisCursor); @@ -410,9 +373,7 @@ suite('Cursor move command test', () => { }); test('move to view bottom line moves to last visible line if it is last line', () => { - let viewModelHelper = aViewModelHelper(thisModel); - viewModelHelper.getCompletelyVisibleViewRange = () => new Range(1, 1, 5, 1); - thisCursor = aCursor(viewModelHelper); + thisViewModel.getCompletelyVisibleViewRange = () => new Range(1, 1, 5, 1); moveTo(thisCursor, 2, 2); moveToBottom(thisCursor); @@ -421,9 +382,7 @@ suite('Cursor move command test', () => { }); test('move to view bottom line moves to last visible line when last line is not visible', () => { - let viewModelHelper = aViewModelHelper(thisModel); - viewModelHelper.getCompletelyVisibleViewRange = () => new Range(2, 1, 3, 1); - thisCursor = aCursor(viewModelHelper); + thisViewModel.getCompletelyVisibleViewRange = () => new Range(2, 1, 3, 1); moveTo(thisCursor, 2, 2); moveToBottom(thisCursor); @@ -432,9 +391,7 @@ suite('Cursor move command test', () => { }); test('move to view bottom line moves to nth line from bottom', () => { - let viewModelHelper = aViewModelHelper(thisModel); - viewModelHelper.getCompletelyVisibleViewRange = () => new Range(1, 1, 5, 1); - thisCursor = aCursor(viewModelHelper); + thisViewModel.getCompletelyVisibleViewRange = () => new Range(1, 1, 5, 1); moveTo(thisCursor, 4, 1); moveToBottom(thisCursor, 3); @@ -443,20 +400,13 @@ suite('Cursor move command test', () => { }); test('move to view bottom line moves to first line if n is lesser than first visible line number', () => { - let viewModelHelper = aViewModelHelper(thisModel); - viewModelHelper.getCompletelyVisibleViewRange = () => new Range(2, 1, 5, 1); - thisCursor = aCursor(viewModelHelper); + thisViewModel.getCompletelyVisibleViewRange = () => new Range(2, 1, 5, 1); moveTo(thisCursor, 4, 1); moveToBottom(thisCursor, 5); cursorEqual(thisCursor, 2, 2); }); - - function aCursor(viewModelHelper?: IViewModelHelper): Cursor { - return new Cursor(thisConfiguration, thisModel, viewModelHelper || aViewModelHelper(thisModel)); - } - }); interface ICursorOpts { diff --git a/src/vs/editor/test/common/editorTestUtils.ts b/src/vs/editor/test/common/editorTestUtils.ts index 493a466de87..476e1c4ae26 100644 --- a/src/vs/editor/test/common/editorTestUtils.ts +++ b/src/vs/editor/test/common/editorTestUtils.ts @@ -5,59 +5,9 @@ 'use strict'; import { Model } from 'vs/editor/common/model/model'; -import { Position } from 'vs/editor/common/core/position'; -import { Range } from 'vs/editor/common/core/range'; -import { Selection } from 'vs/editor/common/core/selection'; -import { IModel } from 'vs/editor/common/editorCommon'; -import { IViewModelHelper } from 'vs/editor/common/controller/cursorCommon'; export function withEditorModel(text: string[], callback: (model: Model) => void): void { var model = Model.createFromString(text.join('\n')); callback(model); model.dispose(); } - -export function viewModelHelper(model: IModel): IViewModelHelper { - return { - viewModel: model, - - coordinatesConverter: { - convertViewPositionToModelPosition: (viewPosition: Position): Position => { - return viewPosition; - }, - convertViewRangeToModelRange: (viewRange: Range): Range => { - return viewRange; - }, - convertViewSelectionToModelSelection: (viewSelection: Selection): Selection => { - return viewSelection; - }, - validateViewPosition: (viewPosition: Position, expectedModelPosition: Position): Position => { - return expectedModelPosition; - }, - validateViewRange: (viewRange: Range, modelRange: Range): Range => { - return modelRange; - }, - convertModelPositionToViewPosition: (modelPosition: Position): Position => { - return modelPosition; - }, - convertModelRangeToViewRange: (modelRange: Range): Range => { - return modelRange; - }, - convertModelSelectionToViewSelection: (modelSelection: Selection): Selection => { - return modelSelection; - }, - modelPositionIsVisible: (modelPosition: Position): boolean => { - return true; - }, - }, - - getScrollTop: (): number => 0, - - getCompletelyVisibleViewRange: () => null, - - getCompletelyVisibleViewRangeAtScrollTop: (scrollTop: number) => null, - - getVerticalOffsetForViewLineNumber: (viewLineNumber: number) => 0 - - }; -} diff --git a/src/vs/editor/test/common/mocks/mockCodeEditor.ts b/src/vs/editor/test/common/mocks/mockCodeEditor.ts index f927151d734..52e03d79906 100644 --- a/src/vs/editor/test/common/mocks/mockCodeEditor.ts +++ b/src/vs/editor/test/common/mocks/mockCodeEditor.ts @@ -71,12 +71,31 @@ export interface MockCodeEditorCreationOptions extends editorOptions.IEditorOpti } export function withMockCodeEditor(text: string[], options: MockCodeEditorCreationOptions, callback: (editor: MockCodeEditor, cursor: Cursor) => void): void { - let editor = mockCodeEditor(text, options); + // create a model if necessary and remember it in order to dispose it. + let modelToDispose: Model = null; + if (!options.model) { + modelToDispose = Model.createFromString(text.join('\n')); + options.model = modelToDispose; + } + + let editor = _mockCodeEditor(options); callback(editor, editor.getCursor()); + + if (modelToDispose) { + modelToDispose.dispose(); + } editor.dispose(); } export function mockCodeEditor(text: string[], options: MockCodeEditorCreationOptions): CommonCodeEditor { + // TODO: who owns this model now? + if (!options.model) { + options.model = Model.createFromString(text.join('\n')); + } + return _mockCodeEditor(options); +} + +function _mockCodeEditor(options: MockCodeEditorCreationOptions): CommonCodeEditor { let contextKeyService = new MockContextKeyService(); @@ -85,10 +104,6 @@ export function mockCodeEditor(text: string[], options: MockCodeEditorCreationOp let instantiationService = new InstantiationService(services); let editor = new MockCodeEditor(new MockScopeLocation(), options, instantiationService, contextKeyService); - let model = options.model || Model.createFromString(text.join('\n')); - if (model) { - editor.setModel(model); - } - + editor.setModel(options.model); return editor; } From 2b0bb057260776e45aca236dc272557e325183cb Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 16:28:57 +0200 Subject: [PATCH 0677/1164] Fixes #26251: Update cursor's view position when view model line mapping changes --- .../browser/controller/textAreaHandler.ts | 3 +- src/vs/editor/browser/view/viewImpl.ts | 4 +- .../browser/viewParts/lines/viewLines.ts | 11 +- .../browser/viewParts/minimap/minimap.ts | 3 +- .../editor/browser/widget/codeEditorWidget.ts | 2 +- src/vs/editor/common/commonCodeEditor.ts | 16 +- .../editor/common/controller/coreCommands.ts | 3 +- src/vs/editor/common/controller/cursor.ts | 87 ++++----- .../editor/common/controller/cursorCommon.ts | 61 ++---- .../editor/common/controller/cursorEvents.ts | 46 ----- src/vs/editor/common/view/viewEvents.ts | 9 +- .../common/viewModel/viewModelCursors.ts | 184 ------------------ .../editor/common/viewModel/viewModelImpl.ts | 3 +- 13 files changed, 86 insertions(+), 346 deletions(-) delete mode 100644 src/vs/editor/common/viewModel/viewModelCursors.ts diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index 247fddd15e0..f5dab069f58 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -16,7 +16,6 @@ import { ViewContext } from 'vs/editor/common/view/viewContext'; import { HorizontalRange, RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; -import { VerticalRevealType } from 'vs/editor/common/controller/cursorEvents'; import { ViewController } from 'vs/editor/browser/view/viewController'; import { EndOfLinePreference } from "vs/editor/common/editorCommon"; import { IKeyboardEvent } from "vs/base/browser/keyboardEvent"; @@ -207,7 +206,7 @@ export class TextAreaHandler extends ViewPart { this._context.privateViewEventBus.emit(new viewEvents.ViewRevealRangeRequestEvent( new Range(lineNumber, column, lineNumber, column), - VerticalRevealType.Simple, + viewEvents.VerticalRevealType.Simple, true )); diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index cc7605339cc..c900db8d510 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -49,7 +49,7 @@ import { EditorScrollbar } from 'vs/editor/browser/viewParts/editorScrollbar/edi import { Minimap } from 'vs/editor/browser/viewParts/minimap/minimap'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { IThemeService, getThemeTypeSelector } from 'vs/platform/theme/common/themeService'; -import { ViewModelCursors } from "vs/editor/common/viewModel/viewModelCursors"; +import { Cursor } from "vs/editor/common/controller/cursor"; export interface IContentWidgetData { widget: editorBrowser.IContentWidget; @@ -98,7 +98,7 @@ export class View extends ViewEventHandler { configuration: Configuration, themeService: IThemeService, model: IViewModel, - cursor: ViewModelCursors, + cursor: Cursor, execCoreEditorCommandFunc: ExecCoreEditorCommandFunc ) { super(); diff --git a/src/vs/editor/browser/viewParts/lines/viewLines.ts b/src/vs/editor/browser/viewParts/lines/viewLines.ts index 730e42ad417..fc5cd9f21de 100644 --- a/src/vs/editor/browser/viewParts/lines/viewLines.ts +++ b/src/vs/editor/browser/viewParts/lines/viewLines.ts @@ -18,7 +18,6 @@ import { IViewLines, HorizontalRange, LineVisibleRanges } from 'vs/editor/common import { Viewport } from 'vs/editor/common/viewModel/viewModel'; import { ViewPart, PartFingerprint, PartFingerprints } from 'vs/editor/browser/view/viewPart'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { VerticalRevealType } from 'vs/editor/common/controller/cursorEvents'; class LastRenderedData { @@ -468,7 +467,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, } } - private _computeScrollTopToRevealRange(viewport: Viewport, range: Range, verticalType: VerticalRevealType): number { + private _computeScrollTopToRevealRange(viewport: Viewport, range: Range, verticalType: viewEvents.VerticalRevealType): number { let viewportStartY = viewport.top; let viewportHeight = viewport.height; let viewportEndY = viewportStartY + viewportHeight; @@ -478,15 +477,15 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, // Have a box that includes one extra line height (for the horizontal scrollbar) boxStartY = this._context.viewLayout.getVerticalOffsetForLineNumber(range.startLineNumber); boxEndY = this._context.viewLayout.getVerticalOffsetForLineNumber(range.endLineNumber) + this._lineHeight; - if (verticalType === VerticalRevealType.Simple || verticalType === VerticalRevealType.Bottom) { + if (verticalType === viewEvents.VerticalRevealType.Simple || verticalType === viewEvents.VerticalRevealType.Bottom) { // Reveal one line more when the last line would be covered by the scrollbar - arrow down case or revealing a line explicitly at bottom boxEndY += this._lineHeight; } let newScrollTop: number; - if (verticalType === VerticalRevealType.Center || verticalType === VerticalRevealType.CenterIfOutsideViewport) { - if (verticalType === VerticalRevealType.CenterIfOutsideViewport && viewportStartY <= boxStartY && boxEndY <= viewportEndY) { + if (verticalType === viewEvents.VerticalRevealType.Center || verticalType === viewEvents.VerticalRevealType.CenterIfOutsideViewport) { + if (verticalType === viewEvents.VerticalRevealType.CenterIfOutsideViewport && viewportStartY <= boxStartY && boxEndY <= viewportEndY) { // Box is already in the viewport... do nothing newScrollTop = viewportStartY; } else { @@ -495,7 +494,7 @@ export class ViewLines extends ViewPart implements IVisibleLinesHost, newScrollTop = Math.max(0, boxMiddleY - viewportHeight / 2); } } else { - newScrollTop = this._computeMinimumScrolling(viewportStartY, viewportEndY, boxStartY, boxEndY, verticalType === VerticalRevealType.Top, verticalType === VerticalRevealType.Bottom); + newScrollTop = this._computeMinimumScrolling(viewportStartY, viewportEndY, boxStartY, boxEndY, verticalType === viewEvents.VerticalRevealType.Top, verticalType === viewEvents.VerticalRevealType.Bottom); } return newScrollTop; diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index b24dba31f87..5cd3d6fedef 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -25,7 +25,6 @@ import { RGBA } from 'vs/base/common/color'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { GlobalMouseMoveMonitor, IStandardMouseMoveEventData, standardMouseMoveMerger } from 'vs/base/browser/globalMouseMoveMonitor'; import * as platform from 'vs/base/common/platform'; -import { VerticalRevealType } from 'vs/editor/common/controller/cursorEvents'; import { registerThemingParticipant } from "vs/platform/theme/common/themeService"; import { scrollbarSliderBackground, scrollbarSliderHoverBackground, scrollbarSliderActiveBackground, scrollbarShadow } from "vs/platform/theme/common/colorRegistry"; @@ -484,7 +483,7 @@ export class Minimap extends ViewPart { this._context.privateViewEventBus.emit(new viewEvents.ViewRevealRangeRequestEvent( new Range(lineNumber, 1, lineNumber, 1), - VerticalRevealType.Center, + viewEvents.VerticalRevealType.Center, false )); }); diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index a7de1e2bac1..ae2b1ad3ae9 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -420,7 +420,7 @@ export abstract class CodeEditorWidget extends CommonCodeEditor implements edito this._configuration, this._themeService, this.viewModel, - this.viewCursor, + this.cursor, (editorCommand: CoreEditorCommand, args: any) => { if (!this.cursor) { return; diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index 531c248be3a..edda01a3b78 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -26,10 +26,10 @@ import { IModelLanguageChangedEvent, IModelOptionsChangedEvent, TextModelEventType } from 'vs/editor/common/model/textModelEvents'; import * as editorOptions from 'vs/editor/common/config/editorOptions'; -import { CursorEventType, ICursorPositionChangedEvent, VerticalRevealType, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { CursorEventType, ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { ViewModelCursors } from "vs/editor/common/viewModel/viewModelCursors"; import { CommonEditorRegistry } from "vs/editor/common/editorCommonExtensions"; +import { VerticalRevealType } from "vs/editor/common/view/viewEvents"; let EDITOR_ID = 0; @@ -101,7 +101,6 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo protected viewModel: ViewModel; protected cursor: Cursor; - protected viewCursor: ViewModelCursors; protected readonly _instantiationService: IInstantiationService; protected readonly _contextKeyService: IContextKeyService; @@ -903,12 +902,6 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo this.viewModel ); - this.viewCursor = new ViewModelCursors( - this._configuration, - this.viewModel, - this.cursor - ); - this._createView(); this.listenersToRemove.push(this.cursor.addBulkListener((events) => { @@ -967,11 +960,6 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo this.cursor = null; } - if (this.viewCursor) { - this.viewCursor.dispose(); - this.viewCursor = null; - } - if (this.viewModel) { this.viewModel.dispose(); this.viewModel = null; diff --git a/src/vs/editor/common/controller/coreCommands.ts b/src/vs/editor/common/controller/coreCommands.ts index 9172351e644..02fade2c3d2 100644 --- a/src/vs/editor/common/controller/coreCommands.ts +++ b/src/vs/editor/common/controller/coreCommands.ts @@ -9,7 +9,7 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { CursorState, ICursors, RevealTarget, IColumnSelectData, CursorContext } from 'vs/editor/common/controller/cursorCommon'; -import { CursorChangeReason, VerticalRevealType } from 'vs/editor/common/controller/cursorEvents'; +import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; import { CursorMoveCommands, CursorMove as CursorMove_ } from 'vs/editor/common/controller/cursorMoveCommands'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { registerEditorCommand, ICommandOptions, EditorCommand, Command } from 'vs/editor/common/editorCommonExtensions'; @@ -25,6 +25,7 @@ import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands import { IEditorService } from 'vs/platform/editor/common/editor'; import { TypeOperations } from "vs/editor/common/controller/cursorTypeOperations"; import { DeleteOperations } from "vs/editor/common/controller/cursorDeleteOperations"; +import { VerticalRevealType } from "vs/editor/common/view/viewEvents"; const CORE_WEIGHT = KeybindingsRegistry.WEIGHT.editorCore(); diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 3a596ad5730..8dfcf3112e7 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -8,21 +8,31 @@ import * as nls from 'vs/nls'; import * as strings from 'vs/base/common/strings'; import { onUnexpectedError } from 'vs/base/common/errors'; import { EventEmitter, BulkListenerCallback } from 'vs/base/common/eventEmitter'; -import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; +import { IDisposable } from 'vs/base/common/lifecycle'; import { CursorCollection } from 'vs/editor/common/controller/cursorCollection'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection, SelectionDirection, ISelection } from 'vs/editor/common/core/selection'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import { CursorColumns, CursorConfiguration, EditOperationResult, IViewModelHelper, CursorContext, CursorState, RevealTarget, IColumnSelectData, ICursors } from 'vs/editor/common/controller/cursorCommon'; +import { CursorColumns, CursorConfiguration, EditOperationResult, CursorContext, CursorState, RevealTarget, IColumnSelectData, ICursors } from 'vs/editor/common/controller/cursorCommon'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { DeleteOperations } from 'vs/editor/common/controller/cursorDeleteOperations'; import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations'; import { TextModelEventType, ModelRawContentChangedEvent, RawContentChangedType } from 'vs/editor/common/model/textModelEvents'; -import { CursorEventType, CursorChangeReason, ICursorPositionChangedEvent, VerticalRevealType, ICursorSelectionChangedEvent, ICursorRevealRangeEvent, CursorScrollRequest } from 'vs/editor/common/controller/cursorEvents'; +import { CursorEventType, CursorChangeReason, ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { IViewModel } from "vs/editor/common/viewModel/viewModel"; +import * as viewEvents from 'vs/editor/common/view/viewEvents'; -export class Cursor extends Disposable implements ICursors { +function containsLineMappingChanged(events: viewEvents.ViewEvent[]): boolean { + for (let i = 0, len = events.length; i < len; i++) { + if (events[i].type === viewEvents.ViewEventType.ViewLineMappingChanged) { + return true; + } + } + return false; +} + +export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { public onDidChangePosition(listener: (e: ICursorPositionChangedEvent) => void): IDisposable { return this._eventEmitter.addListener(CursorEventType.CursorPositionChanged, listener); @@ -37,7 +47,7 @@ export class Cursor extends Disposable implements ICursors { private readonly _eventEmitter: EventEmitter; private readonly _configuration: editorCommon.IConfiguration; private readonly _model: editorCommon.IModel; - private readonly _viewModelHelper: IViewModelHelper; + private readonly _viewModel: IViewModel; public context: CursorContext; private _cursors: CursorCollection; @@ -50,26 +60,8 @@ export class Cursor extends Disposable implements ICursors { this._eventEmitter = this._register(new EventEmitter()); this._configuration = configuration; this._model = model; - - let viewModelHelper: IViewModelHelper = { - viewModel: viewModel, - coordinatesConverter: viewModel.coordinatesConverter, - getScrollTop: (): number => { - return viewModel.viewLayout.getScrollTop(); - }, - getCompletelyVisibleViewRange: (): Range => { - return viewModel.getCompletelyVisibleViewRange(); - }, - getCompletelyVisibleViewRangeAtScrollTop: (scrollTop: number): Range => { - return viewModel.getCompletelyVisibleViewRangeAtScrollTop(scrollTop); - }, - getVerticalOffsetForViewLineNumber: (viewLineNumber: number): number => { - return viewModel.viewLayout.getVerticalOffsetForLineNumber(viewLineNumber); - } - }; - - this._viewModelHelper = viewModelHelper; - this.context = new CursorContext(this._configuration, this._model, this._viewModelHelper); + this._viewModel = viewModel; + this.context = new CursorContext(this._configuration, this._model, this._viewModel); this._cursors = new CursorCollection(this.context); this._isHandling = false; @@ -101,8 +93,17 @@ export class Cursor extends Disposable implements ICursors { this._onModelContentChanged(hadFlushEvent); })); + this._register(viewModel.addEventListener((events: viewEvents.ViewEvent[]) => { + if (!containsLineMappingChanged(events)) { + return; + } + + // Ensure valid state + this.setStates('viewModel', CursorChangeReason.NotSet, this.getAll()); + })); + const updateCursorContext = () => { - this.context = new CursorContext(this._configuration, this._model, this._viewModelHelper); + this.context = new CursorContext(this._configuration, this._model, this._viewModel); this._cursors.updateContext(this.context); }; this._register(this._model.onDidChangeLanguage((e) => { @@ -165,10 +166,6 @@ export class Cursor extends Disposable implements ICursors { const oldSelections = this._cursors.getSelections(); const oldViewSelections = this._cursors.getViewSelections(); - // TODO@Alex - // ensure valid state on all cursors - // this.cursors.ensureValidState(); - this._cursors.setStates(states); this._cursors.normalize(); this._columnSelectData = null; @@ -187,17 +184,17 @@ export class Cursor extends Disposable implements ICursors { } public reveal(horizontal: boolean, target: RevealTarget): void { - this._revealRange(target, VerticalRevealType.Simple, horizontal); + this._revealRange(target, viewEvents.VerticalRevealType.Simple, horizontal); } - public revealRange(revealHorizontal: boolean, modelRange: Range, viewRange: Range, verticalType: VerticalRevealType) { + public revealRange(revealHorizontal: boolean, modelRange: Range, viewRange: Range, verticalType: viewEvents.VerticalRevealType) { this.emitCursorRevealRange(modelRange, viewRange, verticalType, revealHorizontal); } public scrollTo(desiredScrollTop: number): void { - this._eventEmitter.emit(CursorEventType.CursorScrollRequest, new CursorScrollRequest( - desiredScrollTop - )); + this._viewModel.viewLayout.setScrollPosition({ + scrollTop: desiredScrollTop + }); } public saveState(): editorCommon.ICursorState[] { @@ -375,6 +372,7 @@ export class Cursor extends Disposable implements ICursors { isInEditableRange: isInEditableRange }; this._eventEmitter.emit(CursorEventType.CursorPositionChanged, e); + this._emit([new viewEvents.ViewCursorPositionChangedEvent(primaryViewPosition, secondaryViewPositions, isInEditableRange)]); } private _emitCursorSelectionChanged(source: string, reason: CursorChangeReason): void { @@ -395,9 +393,10 @@ export class Cursor extends Disposable implements ICursors { reason: reason }; this._eventEmitter.emit(CursorEventType.CursorSelectionChanged, e); + this._emit([new viewEvents.ViewCursorSelectionChangedEvent(primaryViewSelection, secondaryViewSelections)]); } - private _revealRange(revealTarget: RevealTarget, verticalType: VerticalRevealType, revealHorizontal: boolean): void { + private _revealRange(revealTarget: RevealTarget, verticalType: viewEvents.VerticalRevealType, revealHorizontal: boolean): void { const positions = this._cursors.getPositions(); const viewPositions = this._cursors.getViewPositions(); @@ -430,14 +429,12 @@ export class Cursor extends Disposable implements ICursors { this.emitCursorRevealRange(range, viewRange, verticalType, revealHorizontal); } - public emitCursorRevealRange(range: Range, viewRange: Range, verticalType: VerticalRevealType, revealHorizontal: boolean) { - const e: ICursorRevealRangeEvent = { - range: range, - viewRange: viewRange, - verticalType: verticalType, - revealHorizontal: revealHorizontal - }; - this._eventEmitter.emit(CursorEventType.CursorRevealRange, e); + public emitCursorRevealRange(range: Range, viewRange: Range, verticalType: viewEvents.VerticalRevealType, revealHorizontal: boolean) { + // Ensure event has viewRange + if (!viewRange) { + viewRange = this.context.convertModelRangeToViewRange(range); + } + this._emit([new viewEvents.ViewRevealRangeRequestEvent(viewRange, verticalType, revealHorizontal)]); } // ----------------------------------------------------------------------------------------------------------- @@ -512,7 +509,7 @@ export class Cursor extends Disposable implements ICursors { const newViewSelections = this._cursors.getViewSelections(); if (Cursor._somethingChanged(oldSelections, oldViewSelections, newSelections, newViewSelections)) { this._emitCursorPositionChanged(source, cursorChangeReason); - this._revealRange(RevealTarget.Primary, VerticalRevealType.Simple, true); + this._revealRange(RevealTarget.Primary, viewEvents.VerticalRevealType.Simple, true); this._emitCursorSelectionChanged(source, cursorChangeReason); } } diff --git a/src/vs/editor/common/controller/cursorCommon.ts b/src/vs/editor/common/controller/cursorCommon.ts index a8d9c46dfca..6adb347b4dc 100644 --- a/src/vs/editor/common/controller/cursorCommon.ts +++ b/src/vs/editor/common/controller/cursorCommon.ts @@ -16,8 +16,9 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { LanguageIdentifier } from 'vs/editor/common/modes'; import { IAutoClosingPair } from 'vs/editor/common/modes/languageConfiguration'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; -import { ICoordinatesConverter } from 'vs/editor/common/viewModel/viewModel'; -import { CursorChangeReason, VerticalRevealType } from 'vs/editor/common/controller/cursorEvents'; +import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; +import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; +import { VerticalRevealType } from "vs/editor/common/view/viewEvents"; export interface IColumnSelectData { toViewLineNumber: number; @@ -259,92 +260,72 @@ export class SingleCursorState { } } -export interface IViewModelHelper { - - coordinatesConverter: ICoordinatesConverter; - - viewModel: ICursorSimpleModel; - - getScrollTop(): number; - - getCompletelyVisibleViewRange(): Range; - - getCompletelyVisibleViewRangeAtScrollTop(scrollTop: number): Range; - - getVerticalOffsetForViewLineNumber(viewLineNumber: number): number; -} - export class CursorContext { _cursorContextBrand: void; public readonly model: IModel; - public readonly viewModel: ICursorSimpleModel; + public readonly viewModel: IViewModel; public readonly config: CursorConfiguration; - private readonly _viewModelHelper: IViewModelHelper; - private readonly _coordinatesConverter: ICoordinatesConverter; - - constructor(configuration: IConfiguration, model: IModel, viewModelHelper: IViewModelHelper) { + constructor(configuration: IConfiguration, model: IModel, viewModel: IViewModel) { this.model = model; - this.viewModel = viewModelHelper.viewModel; + this.viewModel = viewModel; this.config = new CursorConfiguration( this.model.getLanguageIdentifier(), this.model.getOneIndent(), this.model.getOptions(), configuration - );; - this._viewModelHelper = viewModelHelper; - this._coordinatesConverter = viewModelHelper.coordinatesConverter; + ); } public validateViewPosition(viewPosition: Position, modelPosition: Position): Position { - return this._coordinatesConverter.validateViewPosition(viewPosition, modelPosition); + return this.viewModel.coordinatesConverter.validateViewPosition(viewPosition, modelPosition); } public validateViewRange(viewRange: Range, expectedModelRange: Range): Range { - return this._coordinatesConverter.validateViewRange(viewRange, expectedModelRange); + return this.viewModel.coordinatesConverter.validateViewRange(viewRange, expectedModelRange); } public convertViewRangeToModelRange(viewRange: Range): Range { - return this._coordinatesConverter.convertViewRangeToModelRange(viewRange); + return this.viewModel.coordinatesConverter.convertViewRangeToModelRange(viewRange); } public convertViewPositionToModelPosition(lineNumber: number, column: number): Position { - return this._coordinatesConverter.convertViewPositionToModelPosition(new Position(lineNumber, column)); + return this.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(lineNumber, column)); } public convertModelPositionToViewPosition(modelPosition: Position): Position { - return this._coordinatesConverter.convertModelPositionToViewPosition(modelPosition); + return this.viewModel.coordinatesConverter.convertModelPositionToViewPosition(modelPosition); } public convertModelRangeToViewRange(modelRange: Range): Range { - return this._coordinatesConverter.convertModelRangeToViewRange(modelRange); + return this.viewModel.coordinatesConverter.convertModelRangeToViewRange(modelRange); } public getScrollTop(): number { - return this._viewModelHelper.getScrollTop(); + return this.viewModel.viewLayout.getScrollTop(); } public getCompletelyVisibleViewRange(): Range { - return this._viewModelHelper.getCompletelyVisibleViewRange(); + return this.viewModel.getCompletelyVisibleViewRange(); } public getCompletelyVisibleModelRange(): Range { - const viewRange = this._viewModelHelper.getCompletelyVisibleViewRange(); - return this._coordinatesConverter.convertViewRangeToModelRange(viewRange); + const viewRange = this.viewModel.getCompletelyVisibleViewRange(); + return this.viewModel.coordinatesConverter.convertViewRangeToModelRange(viewRange); } public getCompletelyVisibleViewRangeAtScrollTop(scrollTop: number): Range { - return this._viewModelHelper.getCompletelyVisibleViewRangeAtScrollTop(scrollTop); + return this.viewModel.getCompletelyVisibleViewRangeAtScrollTop(scrollTop); } public getCompletelyVisibleModelRangeAtScrollTop(scrollTop: number): Range { - const viewRange = this._viewModelHelper.getCompletelyVisibleViewRangeAtScrollTop(scrollTop); - return this._coordinatesConverter.convertViewRangeToModelRange(viewRange); + const viewRange = this.viewModel.getCompletelyVisibleViewRangeAtScrollTop(scrollTop); + return this.viewModel.coordinatesConverter.convertViewRangeToModelRange(viewRange); } public getVerticalOffsetForViewLine(viewLineNumber: number): number { - return this._viewModelHelper.getVerticalOffsetForViewLineNumber(viewLineNumber); + return this.viewModel.viewLayout.getVerticalOffsetForLineNumber(viewLineNumber); } } diff --git a/src/vs/editor/common/controller/cursorEvents.ts b/src/vs/editor/common/controller/cursorEvents.ts index 5b0992d96f1..01dc81093d4 100644 --- a/src/vs/editor/common/controller/cursorEvents.ts +++ b/src/vs/editor/common/controller/cursorEvents.ts @@ -6,7 +6,6 @@ 'use strict'; import { Position } from 'vs/editor/common/core/position'; -import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; /** @@ -15,8 +14,6 @@ import { Selection } from 'vs/editor/common/core/selection'; export const CursorEventType = { CursorPositionChanged: 'positionChanged', CursorSelectionChanged: 'selectionChanged', - CursorRevealRange: 'revealRange', - CursorScrollRequest: 'scrollRequest', }; /** @@ -114,46 +111,3 @@ export interface ICursorSelectionChangedEvent { */ readonly reason: CursorChangeReason; } -/** - * @internal - */ -export const enum VerticalRevealType { - Simple = 0, - Center = 1, - CenterIfOutsideViewport = 2, - Top = 3, - Bottom = 4 -} -/** - * An event describing a request to reveal a specific range in the view of the editor. - * @internal - */ -export interface ICursorRevealRangeEvent { - /** - * Range to be reavealed. - */ - readonly range: Range; - /** - * View range to be reavealed. - */ - readonly viewRange: Range; - - readonly verticalType: VerticalRevealType; - /** - * If true: there should be a horizontal & vertical revealing - * If false: there should be just a vertical revealing - */ - readonly revealHorizontal: boolean; -} - -/** - * @internal - */ -export class CursorScrollRequest { - - public readonly desiredScrollTop: number; - - constructor(desiredScrollTop: number) { - this.desiredScrollTop = desiredScrollTop; - } -} diff --git a/src/vs/editor/common/view/viewEvents.ts b/src/vs/editor/common/view/viewEvents.ts index 7ad7a285c6d..d100a0ca0ec 100644 --- a/src/vs/editor/common/view/viewEvents.ts +++ b/src/vs/editor/common/view/viewEvents.ts @@ -9,7 +9,6 @@ import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ScrollEvent } from 'vs/base/common/scrollable'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; -import { VerticalRevealType } from 'vs/editor/common/controller/cursorEvents'; import * as errors from 'vs/base/common/errors'; import { IDisposable, Disposable } from "vs/base/common/lifecycle"; @@ -199,6 +198,14 @@ export class ViewLinesInsertedEvent { } } +export const enum VerticalRevealType { + Simple = 0, + Center = 1, + CenterIfOutsideViewport = 2, + Top = 3, + Bottom = 4 +} + export class ViewRevealRangeRequestEvent { public readonly type = ViewEventType.ViewRevealRangeRequest; diff --git a/src/vs/editor/common/viewModel/viewModelCursors.ts b/src/vs/editor/common/viewModel/viewModelCursors.ts deleted file mode 100644 index b0e5fb8d920..00000000000 --- a/src/vs/editor/common/viewModel/viewModelCursors.ts +++ /dev/null @@ -1,184 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import * as editorCommon from 'vs/editor/common/editorCommon'; -import { Position } from 'vs/editor/common/core/position'; -import { ICoordinatesConverter, ViewEventsCollector, IViewModel } from 'vs/editor/common/viewModel/viewModel'; -import { Selection } from 'vs/editor/common/core/selection'; -import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { ICursorRevealRangeEvent, CursorEventType, CursorScrollRequest } from 'vs/editor/common/controller/cursorEvents'; -import { Cursor } from "vs/editor/common/controller/cursor"; -import { EmitterEvent } from "vs/base/common/eventEmitter"; - -export interface ICursorPositionChangedEvent { - readonly position: Position; - readonly viewPosition: Position; - readonly secondaryPositions: Position[]; - readonly secondaryViewPositions: Position[]; - readonly isInEditableRange: boolean; -} - -export interface ICursorSelectionChangedEvent { - readonly selection: Selection; - readonly viewSelection: Selection; - readonly secondarySelections: Selection[]; - readonly secondaryViewSelections: Selection[]; -} - -function containsLineMappingChanged(events: viewEvents.ViewEvent[]): boolean { - for (let i = 0, len = events.length; i < len; i++) { - if (events[i].type === viewEvents.ViewEventType.ViewLineMappingChanged) { - return true; - } - } - return false; -} - -export class ViewModelCursors extends viewEvents.ViewEventEmitter { - - private readonly configuration: editorCommon.IConfiguration; - private readonly viewModel: IViewModel; - private readonly cursor: Cursor; - private readonly coordinatesConverter: ICoordinatesConverter; - - private lastCursorPositionChangedEvent: ICursorPositionChangedEvent; - private lastCursorSelectionChangedEvent: ICursorSelectionChangedEvent; - - constructor(configuration: editorCommon.IConfiguration, viewModel: IViewModel, cursor: Cursor) { - super(); - this.configuration = configuration; - this.viewModel = viewModel; - this.cursor = cursor; - this.coordinatesConverter = viewModel.coordinatesConverter; - this.lastCursorPositionChangedEvent = null; - this.lastCursorSelectionChangedEvent = null; - - this._register(cursor.addBulkListener((events: EmitterEvent[]) => { - const eventsCollector = new ViewEventsCollector(); - this._onCursorEvents(eventsCollector, events); - this._emit(eventsCollector.finalize()); - })); - - this._register(viewModel.addEventListener((events: viewEvents.ViewEvent[]) => { - if (!containsLineMappingChanged(events)) { - return; - } - const eventsCollector = new ViewEventsCollector(); - this.onLineMappingChanged(eventsCollector); - this._emit(eventsCollector.finalize()); - })); - } - - private _onCursorEvents(eventsCollector: ViewEventsCollector, events: EmitterEvent[]): void { - for (let i = 0, len = events.length; i < len; i++) { - const _e = events[i]; - const type = _e.type; - const data = _e.data; - - switch (type) { - case CursorEventType.CursorPositionChanged: { - const e = data; - this.onCursorPositionChanged(eventsCollector, e); - break; - } - case CursorEventType.CursorSelectionChanged: { - const e = data; - this.onCursorSelectionChanged(eventsCollector, e); - break; - } - case CursorEventType.CursorRevealRange: { - const e = data; - this.onCursorRevealRange(eventsCollector, e); - break; - } - case CursorEventType.CursorScrollRequest: { - const e = data; - this.viewModel.viewLayout.setScrollPosition({ - scrollTop: e.desiredScrollTop - }); - break; - } - default: - console.info('View received unknown event: '); - console.info(type, data); - } - } - } - - public dispose(): void { - super.dispose(); - } - - /** - * Limit position to be somewhere where it can actually be rendered - */ - private static _toPositionThatCanBeRendered(position: Position, stopRenderingLineAfter: number) { - // Limit position to be somewhere where it can actually be rendered - if (stopRenderingLineAfter !== -1 && position.column > stopRenderingLineAfter) { - position = new Position(position.lineNumber, stopRenderingLineAfter); - } - return position; - } - - private onCursorPositionChanged(eventsCollector: ViewEventsCollector, e: ICursorPositionChangedEvent): void { - this.lastCursorPositionChangedEvent = e; - - const stopRenderingLineAfter = this.configuration.editor.viewInfo.stopRenderingLineAfter; - - let position = ViewModelCursors._toPositionThatCanBeRendered(e.viewPosition, stopRenderingLineAfter); - let secondaryPositions: Position[] = []; - for (let i = 0, len = e.secondaryPositions.length; i < len; i++) { - secondaryPositions[i] = ViewModelCursors._toPositionThatCanBeRendered(e.secondaryViewPositions[i], stopRenderingLineAfter); - } - - eventsCollector.emit(new viewEvents.ViewCursorPositionChangedEvent(position, secondaryPositions, e.isInEditableRange)); - } - - private onCursorSelectionChanged(eventsCollector: ViewEventsCollector, e: ICursorSelectionChangedEvent): void { - this.lastCursorSelectionChangedEvent = e; - - eventsCollector.emit(new viewEvents.ViewCursorSelectionChangedEvent(e.viewSelection, e.secondaryViewSelections)); - } - - private onCursorRevealRange(eventsCollector: ViewEventsCollector, e: ICursorRevealRangeEvent): void { - // Ensure event has viewRange - const viewRange = ( - e.viewRange - ? e.viewRange - : this.coordinatesConverter.convertModelRangeToViewRange(e.range) - ); - eventsCollector.emit(new viewEvents.ViewRevealRangeRequestEvent( - viewRange, - e.verticalType, - e.revealHorizontal - )); - } - - private onLineMappingChanged(eventsCollector: ViewEventsCollector): void { - if (this.lastCursorPositionChangedEvent) { - const toViewPos = (pos: Position) => this.coordinatesConverter.convertModelPositionToViewPosition(pos); - let e: ICursorPositionChangedEvent = { - position: this.lastCursorPositionChangedEvent.position, - viewPosition: toViewPos(this.lastCursorPositionChangedEvent.position), - secondaryPositions: this.lastCursorPositionChangedEvent.secondaryPositions, - secondaryViewPositions: this.lastCursorPositionChangedEvent.secondaryPositions.map(toViewPos), - isInEditableRange: this.lastCursorPositionChangedEvent.isInEditableRange, - }; - this.onCursorPositionChanged(eventsCollector, e); - } - - if (this.lastCursorSelectionChangedEvent) { - const toViewSel = (sel: Selection) => this.coordinatesConverter.convertModelSelectionToViewSelection(sel); - let e: ICursorSelectionChangedEvent = { - selection: this.lastCursorSelectionChangedEvent.selection, - viewSelection: toViewSel(this.lastCursorSelectionChangedEvent.selection), - secondarySelections: this.lastCursorSelectionChangedEvent.secondarySelections, - secondaryViewSelections: this.lastCursorSelectionChangedEvent.secondarySelections.map(toViewSel), - }; - this.onCursorSelectionChanged(eventsCollector, e); - } - } -} diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 93fb6d5fea7..f7bb5b8bbb4 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -19,7 +19,6 @@ import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { MinimapTokensColorTracker } from 'vs/editor/common/view/minimapCharRenderer'; import * as textModelEvents from 'vs/editor/common/model/textModelEvents'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; -import { VerticalRevealType } from 'vs/editor/common/controller/cursorEvents'; import { CharacterHardWrappingLineMapperFactory } from "vs/editor/common/viewModel/characterHardWrappingLineMapper"; import { ViewLayout } from 'vs/editor/common/viewLayout/viewLayout'; @@ -198,7 +197,7 @@ export class ViewModel extends viewEvents.ViewEventEmitter implements IViewModel // Send a reveal event to restore the centered content eventsCollector.emit(new viewEvents.ViewRevealRangeRequestEvent( newCenteredViewRange, - VerticalRevealType.Center, + viewEvents.VerticalRevealType.Center, false )); } From 36ec8ea1de984f306df69ed7b4322332c271ae36 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 16:35:54 +0200 Subject: [PATCH 0678/1164] Ensure the diff overview slider has the correct size on the first diff computation --- src/vs/editor/browser/widget/diffEditorWidget.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index 8ab50398262..48b18d28aa2 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -372,7 +372,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE if (this._isHandlingScrollEvent) { return; } - if (!e.scrollTopChanged && !e.scrollLeftChanged) { + if (!e.scrollTopChanged && !e.scrollLeftChanged && !e.scrollHeightChanged) { return; } this._isHandlingScrollEvent = true; @@ -403,7 +403,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE if (this._isHandlingScrollEvent) { return; } - if (!e.scrollTopChanged && !e.scrollLeftChanged) { + if (!e.scrollTopChanged && !e.scrollLeftChanged && !e.scrollHeightChanged) { return; } this._isHandlingScrollEvent = true; From 1c984e8dfa389b388283f7178465f20de0e9f4a5 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 17:02:39 +0200 Subject: [PATCH 0679/1164] Remove synchronous layout in the editor resize case (#26566) --- src/vs/editor/browser/view/viewImpl.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index c900db8d510..c447686be87 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -6,7 +6,6 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { IDisposable } from 'vs/base/common/lifecycle'; -import * as browser from 'vs/base/browser/browser'; import * as dom from 'vs/base/browser/dom'; import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { ICommandService } from 'vs/platform/commands/common/commands'; @@ -294,13 +293,6 @@ export class View extends ViewEventHandler { private _setLayout(): void { const layoutInfo = this._context.configuration.editor.layoutInfo; - if (browser.isChrome) { - /* tslint:disable:no-unused-variable */ - // Access overflowGuardContainer.clientWidth to prevent relayouting bug in Chrome - // See Bug 19676: Editor misses a layout event - let clientWidth = this.overflowGuardContainer.domNode.clientWidth + 'px'; - /* tslint:enable:no-unused-variable */ - } this.domNode.setWidth(layoutInfo.width); this.domNode.setHeight(layoutInfo.height); From edaa1a848c0bd4e033235203dba24a53c1bd0a99 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 17:07:28 +0200 Subject: [PATCH 0680/1164] Fixes #26517 --- src/vs/workbench/parts/extensions/browser/extensionEditor.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/workbench/parts/extensions/browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/browser/extensionEditor.ts index f6ff2ad5dd9..11915ba81c4 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionEditor.ts @@ -688,6 +688,10 @@ export class ExtensionEditor extends BaseEditor { } const keyBinding = KeybindingIO.readKeybinding(key || rawKeyBinding.key, OS); + if (!keyBinding) { + return null; + } + return this.keybindingService.resolveKeybinding(keyBinding)[0]; } From c523e2a131986dd980b23129b17aabe26acf4394 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 19 May 2017 17:16:00 +0200 Subject: [PATCH 0681/1164] add quick open seperator for scm and debug quick pick before 'install more...' #25696 --- .../electron-browser/debugConfigurationManager.ts | 2 +- .../parts/scm/electron-browser/scm.contribution.ts | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts b/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts index 0d259effe70..35091fbd8b7 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts @@ -409,7 +409,7 @@ export class ConfigurationManager implements debug.IConfigurationManager { } } - return this.quickOpenService.pick([...this.adapters.filter(a => a.hasInitialConfiguration()), { label: 'More...' }], { placeHolder: nls.localize('selectDebug', "Select Environment") }) + return this.quickOpenService.pick([...this.adapters.filter(a => a.hasInitialConfiguration()), { label: 'More...', separator: { border: true } }], { placeHolder: nls.localize('selectDebug', "Select Environment") }) .then(picked => { if (picked instanceof Adapter) { return picked; diff --git a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts b/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts index 68cf1af5775..e4cedd1923c 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts @@ -11,7 +11,7 @@ import { Action } from 'vs/base/common/actions'; import { Registry } from 'vs/platform/platform'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { DirtyDiffDecorator } from './dirtydiffDecorator'; -import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; +import { IQuickOpenService, IPickOpenEntry } from 'vs/platform/quickOpen/common/quickOpen'; import { ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor, ToggleViewletAction } from 'vs/workbench/browser/viewlet'; import { VIEWLET_ID } from 'vs/workbench/parts/scm/common/scm'; import { IWorkbenchActionRegistry, Extensions as WorkbenchActionExtensions } from 'vs/workbench/common/actionRegistry'; @@ -49,19 +49,21 @@ export class SwitchProvider extends Action { } run(): TPromise { - const picks = this.scmService.providers.map(provider => ({ + const picks: IPickOpenEntry[] = this.scmService.providers.map(provider => ({ label: provider.label, run: () => this.scmService.activeProvider = provider })); picks.push({ - label: localize('installAdditionalSCMProviders', "Install Additional SCM Providers..."), run: () => { + label: localize('installAdditionalSCMProviders', "Install Additional SCM Providers..."), + run: () => { this.viewletService.openViewlet(EXTENSIONS_VIEWLET_ID, true).then(viewlet => viewlet as IExtensionsViewlet) .then(viewlet => { viewlet.search('category:"SCM Providers" @sort:installs'); viewlet.focus(); }); return this.scmService.activeProvider; - } + }, + separator: { border: true } }); return this.quickOpenService.pick(picks); From a331c647e797f57955a60bf98f77d467e7414749 Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 19 May 2017 17:20:18 +0200 Subject: [PATCH 0682/1164] rename parts/nps -> parts/surveys --- src/vs/workbench/electron-browser/workbench.main.ts | 2 +- .../parts/{nps => surveys}/electron-browser/nps.contribution.ts | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/vs/workbench/parts/{nps => surveys}/electron-browser/nps.contribution.ts (100%) diff --git a/src/vs/workbench/electron-browser/workbench.main.ts b/src/vs/workbench/electron-browser/workbench.main.ts index d0d2f6888e9..07b48d526c9 100644 --- a/src/vs/workbench/electron-browser/workbench.main.ts +++ b/src/vs/workbench/electron-browser/workbench.main.ts @@ -99,7 +99,7 @@ import 'vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarte import 'vs/workbench/parts/update/electron-browser/update.contribution'; -import 'vs/workbench/parts/nps/electron-browser/nps.contribution'; +import 'vs/workbench/parts/surveys/electron-browser/nps.contribution'; import 'vs/workbench/parts/performance/electron-browser/performance.contribution'; diff --git a/src/vs/workbench/parts/nps/electron-browser/nps.contribution.ts b/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.ts similarity index 100% rename from src/vs/workbench/parts/nps/electron-browser/nps.contribution.ts rename to src/vs/workbench/parts/surveys/electron-browser/nps.contribution.ts From 87cfa195245479f201a8be1dfb4aff5f047647e4 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Fri, 19 May 2017 17:35:08 +0200 Subject: [PATCH 0683/1164] Fixes #25518: Cannot associate a problem matcher with an auto detected tasks --- build/npm/postinstall.js | 3 +- extensions/grunt/package.json | 4 +- extensions/gulp/src/main.ts | 1 + extensions/jake/package.json | 48 ++++++ extensions/jake/package.nls.json | 3 + extensions/jake/src/main.ts | 151 ++++++++++++++++++ extensions/jake/src/typings/refs.d.ts | 8 + extensions/jake/tsconfig.json | 18 +++ src/vs/workbench/api/node/extHostTask.ts | 9 +- .../parts/tasks/browser/quickOpen.ts | 85 +++++++--- .../parts/tasks/browser/restartQuickOpen.ts | 4 - .../parts/tasks/browser/taskQuickOpen.ts | 4 - .../parts/tasks/common/taskConfiguration.ts | 116 ++++++++++---- src/vs/workbench/parts/tasks/common/tasks.ts | 16 ++ .../electron-browser/task.contribution.ts | 117 ++++++++++++-- .../tasks/test/node/configuration.test.ts | 1 + 16 files changed, 500 insertions(+), 88 deletions(-) create mode 100644 extensions/jake/package.json create mode 100644 extensions/jake/package.nls.json create mode 100644 extensions/jake/src/main.ts create mode 100644 extensions/jake/src/typings/refs.d.ts create mode 100644 extensions/jake/tsconfig.json diff --git a/build/npm/postinstall.js b/build/npm/postinstall.js index fd64909a4ee..d8703441b7c 100644 --- a/build/npm/postinstall.js +++ b/build/npm/postinstall.js @@ -33,7 +33,8 @@ const extensions = [ 'html', 'git', 'gulp', - 'grunt' + 'grunt', + 'jake' ]; extensions.forEach(extension => npmInstall(`extensions/${extension}`)); diff --git a/extensions/grunt/package.json b/extensions/grunt/package.json index 6e67c3153de..e3f55e398ad 100644 --- a/extensions/grunt/package.json +++ b/extensions/grunt/package.json @@ -12,8 +12,8 @@ "Other" ], "scripts": { - "compile": "gulp compile-extension:gulp", - "watch": "gulp watch-extension:gulp" + "compile": "gulp compile-extension:grunt", + "watch": "gulp watch-extension:grunt" }, "dependencies": { "vscode-nls": "^2.0.2" diff --git a/extensions/gulp/src/main.ts b/extensions/gulp/src/main.ts index e4bbba3b422..666b66bf120 100644 --- a/extensions/gulp/src/main.ts +++ b/extensions/gulp/src/main.ts @@ -103,6 +103,7 @@ async function getGulpTasks(): Promise { let { stdout, stderr } = await exec(commandLine, { cwd: workspaceRoot }); if (stderr) { channel.appendLine(stderr); + channel.show(true); } let result: vscode.Task[] = []; if (stdout) { diff --git a/extensions/jake/package.json b/extensions/jake/package.json new file mode 100644 index 00000000000..8298e01ad17 --- /dev/null +++ b/extensions/jake/package.json @@ -0,0 +1,48 @@ +{ + "name": "jake", + "publisher": "vscode", + "description": "Extension to add Jake capabilities to VSCode.", + "displayName": "Jake support for VSCode", + "version": "0.0.1", + "engines": { + "vscode": "*" + }, + "enableProposedApi": true, + "categories": [ + "Other" + ], + "scripts": { + "compile": "gulp compile-extension:jake", + "watch": "gulp watch-extension:jake" + }, + "dependencies": { + "vscode-nls": "^2.0.2" + }, + "devDependencies": { + "@types/node": "^7.0.18" + }, + "main": "./out/main", + "activationEvents": [ + "onCommand:workbench.action.tasks.runTask", + "onCommand:workbench.action.tasks.build", + "onCommand:workbench.action.tasks.test" + ], + "contributes": { + "configuration": { + "id": "jake", + "type": "object", + "title": "Jake", + "properties": { + "jake.autoDetect": { + "type": "string", + "enum": [ + "off", + "on" + ], + "default": "on", + "description": "%config.jake.autoDetect%" + } + } + } + } +} \ No newline at end of file diff --git a/extensions/jake/package.nls.json b/extensions/jake/package.nls.json new file mode 100644 index 00000000000..c6ca7464a75 --- /dev/null +++ b/extensions/jake/package.nls.json @@ -0,0 +1,3 @@ +{ + "config.jake.autoDetect": "Controls whether auto detection of Jake tasks is on or off. Default is on." +} \ No newline at end of file diff --git a/extensions/jake/src/main.ts b/extensions/jake/src/main.ts new file mode 100644 index 00000000000..93b55873eab --- /dev/null +++ b/extensions/jake/src/main.ts @@ -0,0 +1,151 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import * as path from 'path'; +import * as fs from 'fs'; +import * as cp from 'child_process'; +import * as vscode from 'vscode'; +import * as nls from 'vscode-nls'; + +const localize = nls.config(process.env.VSCODE_NLS_CONFIG)(); + +type AutoDetect = 'on' | 'off'; +let taskProvider: vscode.Disposable | undefined; + +export function activate(_context: vscode.ExtensionContext): void { + let workspaceRoot = vscode.workspace.rootPath; + if (!workspaceRoot) { + return; + } + let pattern = path.join(workspaceRoot, '{Jakefile,Jakefile.js}'); + let jakePromise: Thenable | undefined = undefined; + let fileWatcher = vscode.workspace.createFileSystemWatcher(pattern); + fileWatcher.onDidChange(() => jakePromise = undefined); + fileWatcher.onDidCreate(() => jakePromise = undefined); + fileWatcher.onDidDelete(() => jakePromise = undefined); + + function onConfigurationChanged() { + let autoDetect = vscode.workspace.getConfiguration('jake').get('autoDetect'); + if (taskProvider && autoDetect === 'off') { + jakePromise = undefined; + taskProvider.dispose(); + taskProvider = undefined; + } else if (!taskProvider && autoDetect === 'on') { + taskProvider = vscode.workspace.registerTaskProvider({ + provideTasks: () => { + if (!jakePromise) { + jakePromise = getJakeTasks(); + } + return jakePromise; + } + }); + } + } + vscode.workspace.onDidChangeConfiguration(onConfigurationChanged); + onConfigurationChanged(); +} + +export function deactivate(): void { + if (taskProvider) { + taskProvider.dispose(); + } +} + +function exists(file: string): Promise { + return new Promise((resolve, _reject) => { + fs.exists(file, (value) => { + resolve(value); + }); + }); +} + +function exec(command: string, options: cp.ExecOptions): Promise<{ stdout: string; stderr: string }> { + return new Promise<{ stdout: string; stderr: string }>((resolve, reject) => { + cp.exec(command, options, (error, stdout, stderr) => { + if (error) { + reject({ error, stdout, stderr }); + } + resolve({ stdout, stderr }); + }); + }); +} + +async function getJakeTasks(): Promise { + let workspaceRoot = vscode.workspace.rootPath; + let emptyTasks: vscode.Task[] = []; + if (!workspaceRoot) { + return emptyTasks; + } + let jakefile = path.join(workspaceRoot, 'Jakefile'); + if (!await exists(jakefile)) { + jakefile = path.join(workspaceRoot, 'Jakefile.js'); + if (! await exists(jakefile)) { + return emptyTasks; + } + } + + let jakeCommand: string; + let platform = process.platform; + if (platform === 'win32' && await exists(path.join(workspaceRoot!, 'node_modules', '.bin', 'jake.cmd'))) { + jakeCommand = path.join('.', 'node_modules', '.bin', 'jake.cmd'); + } else if ((platform === 'linux' || platform === 'darwin') && await exists(path.join(workspaceRoot!, 'node_modules', '.bin', 'jake'))) { + jakeCommand = path.join('.', 'node_modules', '.bin', 'jake'); + } else { + jakeCommand = 'jake'; + } + + let commandLine = `${jakeCommand} --tasks`; + let channel = vscode.window.createOutputChannel('tasks'); + try { + let { stdout, stderr } = await exec(commandLine, { cwd: workspaceRoot }); + if (stderr) { + channel.appendLine(stderr); + channel.show(true); + } + let result: vscode.Task[] = []; + if (stdout) { + let buildTask: { task: vscode.Task | undefined, rank: number } = { task: undefined, rank: 0 }; + let testTask: { task: vscode.Task | undefined, rank: number } = { task: undefined, rank: 0 }; + let lines = stdout.split(/\r{0,1}\n/); + for (let line of lines) { + if (line.length === 0) { + continue; + } + let regExp = /^jake\s+([^\s]+)\s/g; + let matches = regExp.exec(line); + if (matches && matches.length === 2) { + let taskName = matches[1]; + let task = new vscode.ShellTask(`jake: ${taskName}`, `${jakeCommand} ${taskName}`); + task.identifier = `jake.${taskName}`; + result.push(task); + let lowerCaseLine = line.toLowerCase(); + if (lowerCaseLine === 'build') { + buildTask = { task, rank: 2 }; + } else if (lowerCaseLine.indexOf('build') !== -1 && buildTask.rank < 1) { + buildTask = { task, rank: 1 }; + } else if (lowerCaseLine === 'test') { + testTask = { task, rank: 2 }; + } else if (lowerCaseLine.indexOf('test') !== -1 && testTask.rank < 1) { + testTask = { task, rank: 1 }; + } + } + } + if (buildTask.task) { + buildTask.task.group = vscode.TaskGroup.Build; + } + if (testTask.task) { + testTask.task.group = vscode.TaskGroup.Test; + } + } + return result; + } catch (err) { + if (err.stderr) { + channel.appendLine(err.stderr); + } + channel.appendLine(localize('execFailed', 'Auto detecting Jake failed with error: {0}', err.error ? err.error.toString() : 'unknown')); + return emptyTasks; + } +} \ No newline at end of file diff --git a/extensions/jake/src/typings/refs.d.ts b/extensions/jake/src/typings/refs.d.ts new file mode 100644 index 00000000000..954bab971e3 --- /dev/null +++ b/extensions/jake/src/typings/refs.d.ts @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/// +/// +/// diff --git a/extensions/jake/tsconfig.json b/extensions/jake/tsconfig.json new file mode 100644 index 00000000000..e804fa3acd7 --- /dev/null +++ b/extensions/jake/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "lib": [ + "es2016" + ], + "outDir": "./out", + "strictNullChecks": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "noUnusedLocals": true, + "noUnusedParameters": true + }, + "include": [ + "src/**/*" + ] +} \ No newline at end of file diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index c6bdc5a4d96..f1c5a8065b8 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -268,7 +268,7 @@ namespace ShellConfiguration { namespace Tasks { - export function from(tasks: vscode.Task[], uuidMap: UUIDMap): TaskSystem.Task[] { + export function from(tasks: vscode.Task[], extension: IExtensionDescription, uuidMap: UUIDMap): TaskSystem.Task[] { if (tasks === void 0 || tasks === null) { return []; } @@ -276,7 +276,7 @@ namespace Tasks { try { uuidMap.start(); for (let task of tasks) { - let converted = fromSingle(task, uuidMap); + let converted = fromSingle(task, extension, uuidMap); if (converted) { result.push(converted); } @@ -287,7 +287,7 @@ namespace Tasks { return result; } - function fromSingle(task: vscode.Task, uuidMap: UUIDMap): TaskSystem.Task { + function fromSingle(task: vscode.Task, extension: IExtensionDescription, uuidMap: UUIDMap): TaskSystem.Task { if (typeof task.name !== 'string' || typeof task.identifier !== 'string') { return undefined; } @@ -306,6 +306,7 @@ namespace Tasks { command.echo = behaviour.echo; let result: TaskSystem.Task = { _id: uuidMap.getUUID(task.identifier), + _source: { kind: TaskSystem.TaskSourceKind.Extension, detail: extension.id }, name: task.name, identifier: task.identifier, group: types.TaskGroup.is(task.group) ? task.group : undefined, @@ -421,7 +422,7 @@ export class ExtHostTask extends ExtHostTaskShape { } return asWinJsPromise(token => handler.provider.provideTasks(token)).then(value => { return { - tasks: Tasks.from(value, this.getUUIDMap(handler.extension.id)), + tasks: Tasks.from(value, handler.extension, this.getUUIDMap(handler.extension.id)), extension: handler.extension }; }); diff --git a/src/vs/workbench/parts/tasks/browser/quickOpen.ts b/src/vs/workbench/parts/tasks/browser/quickOpen.ts index fc2df2f1c40..743413653aa 100644 --- a/src/vs/workbench/parts/tasks/browser/quickOpen.ts +++ b/src/vs/workbench/parts/tasks/browser/quickOpen.ts @@ -12,7 +12,7 @@ import QuickOpen = require('vs/base/parts/quickopen/common/quickOpen'); import Model = require('vs/base/parts/quickopen/browser/quickOpenModel'); import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; -import { Task } from 'vs/workbench/parts/tasks/common/tasks'; +import { Task, TaskSourceKind } from 'vs/workbench/parts/tasks/common/tasks'; import { ITaskService } from 'vs/workbench/parts/tasks/common/taskService'; export class TaskEntry extends Model.QuickOpenEntry { @@ -31,11 +31,20 @@ export class TaskEntry extends Model.QuickOpenEntry { } } +export class TaskGroupEntry extends Model.QuickOpenEntryGroup { + constructor(entry: TaskEntry, groupLabel: string, withBorder: boolean) { + super(entry, groupLabel, withBorder); + } +} + export abstract class QuickOpenHandler extends Quickopen.QuickOpenHandler { + private tasks: TPromise; + + constructor( - @IQuickOpenService protected quickOpenService: IQuickOpenService, - @ITaskService protected taskService: ITaskService + protected quickOpenService: IQuickOpenService, + protected taskService: ITaskService, ) { super(); @@ -43,38 +52,64 @@ export abstract class QuickOpenHandler extends Quickopen.QuickOpenHandler { this.taskService = taskService; } + public onOpen(): void { + this.tasks = this.getTasks(); + } + + public onClose(canceled: boolean): void { + this.tasks = undefined; + } + public getResults(input: string): TPromise { - return this.getTasks().then(tasks => tasks - .sort((a, b) => a.name.localeCompare(b.name)) - .map(task => ({ task: task, highlights: Filters.matchesContiguousSubString(input, task.name) })) - .filter(({ highlights }) => !!highlights) - .map(({ task, highlights }) => this.createEntry(this.taskService, task, highlights)) - , _ => []).then(e => new Model.QuickOpenModel(e)); + return this.tasks.then((tasks) => { + let entries: Model.QuickOpenEntry[] = []; + if (tasks.length === 0) { + return new Model.QuickOpenModel(entries); + } + tasks = tasks.sort((a, b) => { + let aKind = a._source.kind; + let bKind = b._source.kind; + if (aKind === bKind) { + return a.name.localeCompare(b.name); + } + if (aKind === TaskSourceKind.Workspace) { + return -1; + } else { + return +1; + } + }); + let hasWorkspace: boolean = tasks[0]._source.kind === TaskSourceKind.Workspace; + let hasExtension: boolean = tasks[tasks.length - 1]._source.kind === TaskSourceKind.Extension; + let groupWorkspace = hasWorkspace && hasExtension; + let groupExtension = groupWorkspace; + let hadWorkspace = false; + for (let task of tasks) { + let highlights = Filters.matchesContiguousSubString(input, task.name); + if (!highlights) { + continue; + } + if (task._source.kind === TaskSourceKind.Workspace && groupWorkspace) { + groupWorkspace = false; + hadWorkspace = true; + entries.push(new TaskGroupEntry(this.createEntry(this.taskService, task, highlights), nls.localize('workspace', 'From Workspace'), false)); + } else if (task._source.kind === TaskSourceKind.Extension && groupExtension) { + groupExtension = false; + entries.push(new TaskGroupEntry(this.createEntry(this.taskService, task, highlights), nls.localize('extension', 'From Extensions'), hadWorkspace)); + } else { + entries.push(this.createEntry(this.taskService, task, highlights)); + } + } + return new Model.QuickOpenModel(entries); + }); } protected abstract getTasks(): TPromise; protected abstract createEntry(taskService: ITaskService, task: Task, highlights: Model.IHighlight[]): TaskEntry; - public getClass(): string { - return null; - } - - public canRun(): boolean { - return true; - } - public getAutoFocus(input: string): QuickOpen.IAutoFocus { return { autoFocusFirstEntry: !!input }; } - - public onClose(canceled: boolean): void { - return; - } - - public getGroupLabel(): string { - return null; - } } \ No newline at end of file diff --git a/src/vs/workbench/parts/tasks/browser/restartQuickOpen.ts b/src/vs/workbench/parts/tasks/browser/restartQuickOpen.ts index 9a8ee28964a..2c78bdac7e8 100644 --- a/src/vs/workbench/parts/tasks/browser/restartQuickOpen.ts +++ b/src/vs/workbench/parts/tasks/browser/restartQuickOpen.ts @@ -20,10 +20,6 @@ class TaskEntry extends base.TaskEntry { super(taskService, task, highlights); } - public getAriaLabel(): string { - return nls.localize('entryAriaLabel', "{0}, tasks", this.getLabel()); - } - public run(mode: QuickOpen.Mode, context: Model.IContext): boolean { if (mode === QuickOpen.Mode.PREVIEW) { return false; diff --git a/src/vs/workbench/parts/tasks/browser/taskQuickOpen.ts b/src/vs/workbench/parts/tasks/browser/taskQuickOpen.ts index b7f8e4515e2..f32f5d199f9 100644 --- a/src/vs/workbench/parts/tasks/browser/taskQuickOpen.ts +++ b/src/vs/workbench/parts/tasks/browser/taskQuickOpen.ts @@ -22,10 +22,6 @@ class TaskEntry extends base.TaskEntry { super(taskService, task, highlights); } - public getAriaLabel(): string { - return nls.localize('entryAriaLabel', "{0}, tasks", this.getLabel()); - } - public run(mode: QuickOpen.Mode, context: Model.IContext): boolean { if (mode === QuickOpen.Mode.PREVIEW) { return false; diff --git a/src/vs/workbench/parts/tasks/common/taskConfiguration.ts b/src/vs/workbench/parts/tasks/common/taskConfiguration.ts index abc0a29c2de..87feaedfd38 100644 --- a/src/vs/workbench/parts/tasks/common/taskConfiguration.ts +++ b/src/vs/workbench/parts/tasks/common/taskConfiguration.ts @@ -631,13 +631,24 @@ namespace ProblemMatcherConverter { } } +interface TaskParseResult { + tasks: Tasks.Task[] | undefined; + annotatingTasks: Tasks.Task[] | undefined; +} + namespace TaskDescription { - export function from(this: void, tasks: TaskDescription[], globals: Globals, context: ParseContext): Tasks.Task[] { + export let source: Tasks.TaskSource = { + kind: Tasks.TaskSourceKind.Workspace, + detail: '.settins\tasks.json' + }; + + export function from(this: void, tasks: TaskDescription[], globals: Globals, context: ParseContext): TaskParseResult { if (!tasks) { return undefined; } let parsedTasks: Tasks.Task[] = []; + let annotatingTasks: Tasks.Task[] = []; let defaultBuildTask: { task: Tasks.Task; rank: number; } = { task: null, rank: -1 }; let defaultTestTask: { task: Tasks.Task; rank: number; } = { task: null, rank: -1 }; tasks.forEach((externalTask) => { @@ -653,6 +664,7 @@ namespace TaskDescription { let identifer = Types.isString(externalTask.identifier) ? externalTask.identifier : taskName; let task: Tasks.Task = { _id: UUID.generateUuid(), + _source: source, name: taskName, identifier: identifer, command, @@ -691,6 +703,10 @@ namespace TaskDescription { task.problemMatchers = problemMatchers; } mergeGlobals(task, globals); + if (context.isTermnial && isAnnotating(task)) { + annotatingTasks.push(task); + return; + } fillDefaults(task); let addTask: boolean = true; if (context.isTermnial && task.command && task.command.name && task.command.isShellCommand && task.command.args && task.command.args.length > 0) { @@ -739,10 +755,10 @@ namespace TaskDescription { if (defaultTestTask.task) { defaultTestTask.task.group = Tasks.TaskGroup.Test; } - return parsedTasks.length === 0 ? undefined : parsedTasks; + return parsedTasks.length === 0 && annotatingTasks.length === 0 ? undefined : { tasks: parsedTasks, annotatingTasks: annotatingTasks }; } - export function merge(target: Tasks.Task[], source: Tasks.Task[]): Tasks.Task[] { + export function mergeTasks(target: Tasks.Task[], source: Tasks.Task[]): Tasks.Task[] { if (source === void 0 || source.length === 0) { return target; } @@ -841,6 +857,30 @@ namespace TaskDescription { return false; } } + + function isAnnotating(task: Tasks.Task): boolean { + return (task.command === void 0 || task.command.name === void 0) && (task.dependsOn === void 0 || task.dependsOn.length === 0); + } + + export function merge(target: Tasks.Task, source: Tasks.Task): Tasks.Task { + if (!target) { + return source; + } + if (!source) { + return target; + } + + mergeProperty(target, source, 'group'); + target.command = CommandConfiguration.merge(target.command, source.command); + mergeProperty(target, source, 'suppressTaskName'); + mergeProperty(target, source, 'args'); + mergeProperty(target, source, 'isBackground'); + mergeProperty(target, source, 'promptOnClose'); + mergeProperty(target, source, 'showOutput'); + mergeProperty(target, source, 'dependsOn'); + mergeProperty(target, source, 'problemMatchers'); + return target; + } } interface Globals { @@ -950,6 +990,7 @@ export namespace ExecutionEngine { export interface ParseResult { validationStatus: ValidationStatus; tasks: Tasks.Task[]; + annotatingTasks: Tasks.Task[]; engine: Tasks.ExecutionEngine; } @@ -960,7 +1001,6 @@ export interface IProblemReporter extends IProblemReporterBase { class ConfigurationParser { private problemReporter: IProblemReporter; - constructor(problemReporter: IProblemReporter) { this.problemReporter = problemReporter; } @@ -970,21 +1010,27 @@ class ConfigurationParser { if (engine === Tasks.ExecutionEngine.Terminal) { this.problemReporter.clearOutput(); } - let context: ParseContext = { problemReporter: this.problemReporter, namedProblemMatchers: undefined, isTermnial: engine === Tasks.ExecutionEngine.Terminal }; + let context: ParseContext = { + problemReporter: this.problemReporter, + namedProblemMatchers: undefined, + isTermnial: engine === Tasks.ExecutionEngine.Terminal + }; + let taskParseResult = this.createTaskRunnerConfiguration(fileConfig, context); return { validationStatus: this.problemReporter.status, - tasks: this.createTaskRunnerConfiguration(fileConfig, context), + tasks: taskParseResult.tasks, + annotatingTasks: taskParseResult.annotatingTasks, engine }; } - private createTaskRunnerConfiguration(fileConfig: ExternalTaskRunnerConfiguration, context: ParseContext): Tasks.Task[] { + private createTaskRunnerConfiguration(fileConfig: ExternalTaskRunnerConfiguration, context: ParseContext): TaskParseResult { let globals = Globals.from(fileConfig, context); if (this.problemReporter.status.isFatal()) { return undefined; } context.namedProblemMatchers = ProblemMatcherConverter.namedFrom(fileConfig.declares, context); - let globalTasks: Tasks.Task[]; + let globalTasks: TaskParseResult; if (fileConfig.windows && Platform.platform === Platform.Platform.Windows) { globalTasks = TaskDescription.from(fileConfig.windows.tasks, globals, context); } else if (fileConfig.osx && Platform.platform === Platform.Platform.Mac) { @@ -993,36 +1039,44 @@ class ConfigurationParser { globalTasks = TaskDescription.from(fileConfig.linux.tasks, globals, context); } - let tasks: Tasks.Task[]; + let result: TaskParseResult = { tasks: undefined, annotatingTasks: undefined }; if (fileConfig.tasks) { - tasks = TaskDescription.from(fileConfig.tasks, globals, context); + result = TaskDescription.from(fileConfig.tasks, globals, context); + } + if (globalTasks) { + result.tasks = TaskDescription.mergeTasks(result.tasks, globalTasks.tasks); + result.annotatingTasks = TaskDescription.mergeTasks(result.annotatingTasks, globalTasks.annotatingTasks); } - tasks = TaskDescription.merge(tasks, globalTasks); - if (!tasks || tasks.length === 0) { - if (globals.command && globals.command.name) { - let matchers: ProblemMatcher[] = ProblemMatcherConverter.from(fileConfig.problemMatcher, context);; - let isBackground = fileConfig.isBackground ? !!fileConfig.isBackground : fileConfig.isWatching ? !!fileConfig.isWatching : undefined; - let task: Tasks.Task = { - _id: UUID.generateUuid(), - name: globals.command.name, - identifier: globals.command.name, - group: Tasks.TaskGroup.Build, - command: undefined, - isBackground: isBackground, - showOutput: undefined, - suppressTaskName: true, // this must be true since we infer the task from the global data. - problemMatchers: matchers - }; - TaskDescription.mergeGlobals(task, globals); - TaskDescription.fillDefaults(task); - tasks = [task]; - } + if ((!result.tasks || result.tasks.length === 0) && (globals.command && globals.command.name)) { + let matchers: ProblemMatcher[] = ProblemMatcherConverter.from(fileConfig.problemMatcher, context);; + let isBackground = fileConfig.isBackground ? !!fileConfig.isBackground : fileConfig.isWatching ? !!fileConfig.isWatching : undefined; + let task: Tasks.Task = { + _id: UUID.generateUuid(), + _source: TaskDescription.source, + name: globals.command.name, + identifier: globals.command.name, + group: Tasks.TaskGroup.Build, + command: undefined, + isBackground: isBackground, + showOutput: undefined, + suppressTaskName: true, // this must be true since we infer the task from the global data. + problemMatchers: matchers + }; + TaskDescription.mergeGlobals(task, globals); + TaskDescription.fillDefaults(task); + result.tasks = [task]; } - return tasks || []; + result.tasks = result.tasks || []; + result.annotatingTasks = result.annotatingTasks || []; + return result; } } export function parse(configuration: ExternalTaskRunnerConfiguration, logger: IProblemReporter): ParseResult { return (new ConfigurationParser(logger)).run(configuration); +} + +export function mergeTasks(target: Tasks.Task, source: Tasks.Task): Tasks.Task { + return TaskDescription.merge(target, source); } \ No newline at end of file diff --git a/src/vs/workbench/parts/tasks/common/tasks.ts b/src/vs/workbench/parts/tasks/common/tasks.ts index 78ba0fc9fa6..c7b3d4ebf9b 100644 --- a/src/vs/workbench/parts/tasks/common/tasks.ts +++ b/src/vs/workbench/parts/tasks/common/tasks.ts @@ -110,6 +110,17 @@ export namespace TaskGroup { export type TaskGroup = 'clean' | 'build' | 'rebuildAll' | 'test'; +export enum TaskSourceKind { + Workspace = 1, + Extension = 2, + Generic = 3 +} + +export interface TaskSource { + kind: TaskSourceKind; + detail?: string; +} + /** * A task description */ @@ -120,6 +131,11 @@ export interface Task { */ _id: string; + /** + * Indicated the source of the task (e.g tasks.json or extension) + */ + _source: TaskSource; + /** * The task's name */ diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index 6dd5972868d..dd1b8025ae4 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -69,7 +69,7 @@ import { IOutputService, IOutputChannelRegistry, Extensions as OutputExt, IOutpu import { ITerminalService } from 'vs/workbench/parts/terminal/common/terminal'; import { ITaskSystem, ITaskResolver, ITaskSummary, ITaskExecuteResult, TaskExecuteKind, TaskError, TaskErrors, TaskSystemEvents } from 'vs/workbench/parts/tasks/common/taskSystem'; -import { Task, TaskSet, TaskGroup, ExecutionEngine, ShowOutput } from 'vs/workbench/parts/tasks/common/tasks'; +import { Task, TaskSet, TaskGroup, ExecutionEngine, ShowOutput, TaskSourceKind } from 'vs/workbench/parts/tasks/common/tasks'; import { ITaskService, TaskServiceEvents, ITaskProvider } from 'vs/workbench/parts/tasks/common/taskService'; import { templates as taskTemplates } from 'vs/workbench/parts/tasks/common/taskTemplates'; @@ -489,6 +489,10 @@ class ProblemReporter implements TaskConfig.IProblemReporter { interface WorkspaceTaskResult { set: TaskSet; + annotatingTasks: { + byIdentifier: IStringDictionary; + byName: IStringDictionary; + }; hasErrors: boolean; } @@ -522,7 +526,8 @@ class TaskService extends EventEmitter implements ITaskService { private _configHasErrors: boolean; private _providers: Map; - private _workspaceTasksPromise: TPromise; + + private _workspaceTasksPromise: TPromise; private _taskSystem: ITaskSystem; private _taskSystemListeners: IDisposable[]; @@ -759,6 +764,7 @@ class TaskService extends EventEmitter implements ITaskService { let id: string = UUID.generateUuid(); let task: Task = { _id: id, + _source: { kind: TaskSourceKind.Generic }, name: id, identifier: id, dependsOn: primaryTasks.map(task => task._id), @@ -894,30 +900,94 @@ class TaskService extends EventEmitter implements ITaskService { provider.provideTasks().done(done, error); }); } - // Do this last since the then of a resolved promise returns immediatelly. - counter++; - this.getWorkspaceTasks().done(done, error); + }).then((result) => { + return this.getWorkspaceTasks().then((workspaceTaskResult) => { + let workspaceTasksToDelete: Task[] = []; + let annotatingTasks = workspaceTaskResult.annotatingTasks; + let legacyAnnotatingTasks = workspaceTaskResult.set ? this.getLegacyAnnotatingTasks(workspaceTaskResult.set) : undefined; + if (annotatingTasks || legacyAnnotatingTasks) { + for (let set of result) { + for (let task of set.tasks) { + if (annotatingTasks) { + let annotatingTask = annotatingTasks.byIdentifier[task.identifier] || annotatingTasks.byName[task.name]; + if (annotatingTask) { + TaskConfig.mergeTasks(task, annotatingTask); + task._source.kind = TaskSourceKind.Workspace; + continue; + } + } + if (legacyAnnotatingTasks) { + let legacyAnnotatingTask = legacyAnnotatingTasks[task.identifier]; + if (legacyAnnotatingTask) { + TaskConfig.mergeTasks(task, legacyAnnotatingTask); + task._source.kind = TaskSourceKind.Workspace; + workspaceTasksToDelete.push(legacyAnnotatingTask); + continue; + } + } + } + } + } + if (workspaceTaskResult.set) { + if (workspaceTasksToDelete.length > 0) { + let tasks = workspaceTaskResult.set.tasks; + let newSet: TaskSet = { + extension: workspaceTaskResult.set.extension, + tasks: [] + }; + let toDelete = workspaceTasksToDelete.reduce>((map, task) => { + map[task._id] = true; + return map; + }, Object.create(null)); + newSet.tasks = tasks.filter(task => !toDelete[task._id]); + result.push(newSet); + } else { + result.push(workspaceTaskResult.set); + } + } + return result; + }, () => { + // If we can't read the tasks.json file provide at least the contributed tasks + return result; + }); }); } - private getWorkspaceTasks(): TPromise { + private getLegacyAnnotatingTasks(workspaceTasks: TaskSet): IStringDictionary { + let result: IStringDictionary; + function getResult() { + if (result) { + return result; + } + result = Object.create(null); + return result; + } + for (let task of workspaceTasks.tasks) { + let commandName = task.command && task.command.name; + // This is for backwards compatibility with the 0.1.0 task annotation code + // if we had a gulp, jake or grunt command a task specification was a annotation + if (commandName === 'gulp' || commandName === 'grunt' || commandName === 'jake') { + getResult()[`${commandName}.${task.name}`] = task; + } + } + return result; + } + + private getWorkspaceTasks(): TPromise { if (this._workspaceTasksPromise) { return this._workspaceTasksPromise; } - this._workspaceTasksPromise = this.computeWorkspaceTasks().then(value => { - this._configHasErrors = value.hasErrors; - if (this._taskSystem instanceof ProcessTaskSystem) { - this._taskSystem.hasErrors(this._configHasErrors); - } - return value.set; - }); + this.updateWorkspaceTasks(); return this._workspaceTasksPromise; } private updateWorkspaceTasks(): void { this._workspaceTasksPromise = this.computeWorkspaceTasks().then(value => { this._configHasErrors = value.hasErrors; - return value.set; + if (this._taskSystem instanceof ProcessTaskSystem) { + this._taskSystem.hasErrors(this._configHasErrors); + } + return value; }); } @@ -966,7 +1036,7 @@ class TaskService extends EventEmitter implements ITaskService { return configPromise.then((resolved) => { return ProblemMatcherRegistry.onReady().then((): WorkspaceTaskResult => { if (!resolved || !resolved.config) { - return { set: undefined, hasErrors: resolved !== void 0 ? resolved.hasErrors : false }; + return { set: undefined, annotatingTasks: undefined, hasErrors: resolved !== void 0 ? resolved.hasErrors : false }; } let problemReporter = new ProblemReporter(this._outputChannel); let parseResult = TaskConfig.parse(resolved.config, problemReporter); @@ -977,9 +1047,22 @@ class TaskService extends EventEmitter implements ITaskService { } if (problemReporter.status.isFatal()) { problemReporter.fatal(nls.localize('TaskSystem.configurationErrors', 'Error: the provided task configuration has validation errors and can\'t not be used. Please correct the errors first.')); - return { set: undefined, hasErrors }; + return { set: undefined, annotatingTasks: undefined, hasErrors }; } - return { set: { tasks: parseResult.tasks }, hasErrors }; + let annotatingTasks: { byIdentifier: IStringDictionary; byName: IStringDictionary; }; + if (parseResult.annotatingTasks && parseResult.annotatingTasks.length > 0) { + annotatingTasks = { + byIdentifier: Object.create(null), + byName: Object.create(null) + }; + for (let task of parseResult.annotatingTasks) { + annotatingTasks.byIdentifier[task.identifier] = task; + if (task.name) { + annotatingTasks.byName[task.name] = task; + } + } + } + return { set: { tasks: parseResult.tasks }, annotatingTasks: annotatingTasks, hasErrors }; }); }); } diff --git a/src/vs/workbench/parts/tasks/test/node/configuration.test.ts b/src/vs/workbench/parts/tasks/test/node/configuration.test.ts index fb53a216bd3..40ef9ddda1d 100644 --- a/src/vs/workbench/parts/tasks/test/node/configuration.test.ts +++ b/src/vs/workbench/parts/tasks/test/node/configuration.test.ts @@ -123,6 +123,7 @@ class TaskBuilder { this.commandBuilder = new CommandConfigurationBuilder(this, command); this.result = { _id: name, + _source: { kind: Tasks.TaskSourceKind.Workspace }, identifier: name, name: name, command: this.commandBuilder.result, From d33fce1c91a9a901f9b550139840ba55a9fbb83c Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 17:56:33 +0200 Subject: [PATCH 0684/1164] Simplify key code to string mappings --- src/vs/base/common/keyCodes.ts | 336 +++++++++++++++------------------ 1 file changed, 149 insertions(+), 187 deletions(-) diff --git a/src/vs/base/common/keyCodes.ts b/src/vs/base/common/keyCodes.ts index c2b5c9d519a..893b7c0540b 100644 --- a/src/vs/base/common/keyCodes.ts +++ b/src/vs/base/common/keyCodes.ts @@ -200,222 +200,184 @@ export const enum KeyCode { MAX_VALUE } -export interface IReverseMap { - [str: string]: KeyCode; -} +class KeyCodeStrMap { -export class Mapping { + private _keyCodeToStr: string[]; + private _strToKeyCode: { [str: string]: KeyCode; }; - _fromKeyCode: string[]; - _toKeyCode: IReverseMap; + constructor() { + this._keyCodeToStr = []; + this._strToKeyCode = Object.create(null); + } - constructor(fromKeyCode: string[], toKeyCode: IReverseMap) { - this._fromKeyCode = fromKeyCode; - this._toKeyCode = toKeyCode; + define(keyCode: KeyCode, str: string): void { + this._keyCodeToStr[keyCode] = str; + this._strToKeyCode[str.toLowerCase()] = keyCode; } fromKeyCode(keyCode: KeyCode): string { - return this._fromKeyCode[keyCode]; + return this._keyCodeToStr[keyCode]; } toKeyCode(str: string): KeyCode { - if (this._toKeyCode.hasOwnProperty(str)) { - return this._toKeyCode[str]; - } - return KeyCode.Unknown; + return this._strToKeyCode[str.toLowerCase()] || KeyCode.Unknown; } - } -function createMapping(fill1: (map: string[]) => void, fill2: (reverseMap: IReverseMap) => void): Mapping { - let MAP: string[] = []; - fill1(MAP); +const ui = new KeyCodeStrMap(); +const usUserSettings = new KeyCodeStrMap(); +const generalUserSettings = new KeyCodeStrMap(); - let REVERSE_MAP: IReverseMap = {}; - for (let i = 0, len = MAP.length; i < len; i++) { - if (!MAP[i]) { - continue; - } - REVERSE_MAP[MAP[i]] = i; - } - fill2(REVERSE_MAP); +(function () { - let FINAL_REVERSE_MAP: IReverseMap = {}; - for (let entry in REVERSE_MAP) { - if (REVERSE_MAP.hasOwnProperty(entry)) { - FINAL_REVERSE_MAP[entry] = REVERSE_MAP[entry]; - FINAL_REVERSE_MAP[entry.toLowerCase()] = REVERSE_MAP[entry]; - } + function define(keyCode: KeyCode, uiLabel: string, usUserSettingsLabel: string = uiLabel, generalUserSettingsLabel: string = usUserSettingsLabel): void { + ui.define(keyCode, uiLabel); + usUserSettings.define(keyCode, usUserSettingsLabel); + generalUserSettings.define(keyCode, generalUserSettingsLabel); } - return new Mapping(MAP, FINAL_REVERSE_MAP); -} + define(KeyCode.Unknown, 'unknown'); -let STRING = createMapping((TO_STRING_MAP) => { - TO_STRING_MAP[KeyCode.Unknown] = 'unknown'; + define(KeyCode.Backspace, 'Backspace'); + define(KeyCode.Tab, 'Tab'); + define(KeyCode.Enter, 'Enter'); + define(KeyCode.Shift, 'Shift'); + define(KeyCode.Ctrl, 'Ctrl'); + define(KeyCode.Alt, 'Alt'); + define(KeyCode.PauseBreak, 'PauseBreak'); + define(KeyCode.CapsLock, 'CapsLock'); + define(KeyCode.Escape, 'Escape'); + define(KeyCode.Space, 'Space'); + define(KeyCode.PageUp, 'PageUp'); + define(KeyCode.PageDown, 'PageDown'); + define(KeyCode.End, 'End'); + define(KeyCode.Home, 'Home'); - TO_STRING_MAP[KeyCode.Backspace] = 'Backspace'; - TO_STRING_MAP[KeyCode.Tab] = 'Tab'; - TO_STRING_MAP[KeyCode.Enter] = 'Enter'; - TO_STRING_MAP[KeyCode.Shift] = 'Shift'; - TO_STRING_MAP[KeyCode.Ctrl] = 'Ctrl'; - TO_STRING_MAP[KeyCode.Alt] = 'Alt'; - TO_STRING_MAP[KeyCode.PauseBreak] = 'PauseBreak'; - TO_STRING_MAP[KeyCode.CapsLock] = 'CapsLock'; - TO_STRING_MAP[KeyCode.Escape] = 'Escape'; - TO_STRING_MAP[KeyCode.Space] = 'Space'; - TO_STRING_MAP[KeyCode.PageUp] = 'PageUp'; - TO_STRING_MAP[KeyCode.PageDown] = 'PageDown'; - TO_STRING_MAP[KeyCode.End] = 'End'; - TO_STRING_MAP[KeyCode.Home] = 'Home'; - TO_STRING_MAP[KeyCode.LeftArrow] = 'LeftArrow'; - TO_STRING_MAP[KeyCode.UpArrow] = 'UpArrow'; - TO_STRING_MAP[KeyCode.RightArrow] = 'RightArrow'; - TO_STRING_MAP[KeyCode.DownArrow] = 'DownArrow'; - TO_STRING_MAP[KeyCode.Insert] = 'Insert'; - TO_STRING_MAP[KeyCode.Delete] = 'Delete'; + define(KeyCode.LeftArrow, 'LeftArrow', 'Left'); + define(KeyCode.UpArrow, 'UpArrow', 'Up'); + define(KeyCode.RightArrow, 'RightArrow', 'Right'); + define(KeyCode.DownArrow, 'DownArrow', 'Down'); + define(KeyCode.Insert, 'Insert'); + define(KeyCode.Delete, 'Delete'); - TO_STRING_MAP[KeyCode.KEY_0] = '0'; - TO_STRING_MAP[KeyCode.KEY_1] = '1'; - TO_STRING_MAP[KeyCode.KEY_2] = '2'; - TO_STRING_MAP[KeyCode.KEY_3] = '3'; - TO_STRING_MAP[KeyCode.KEY_4] = '4'; - TO_STRING_MAP[KeyCode.KEY_5] = '5'; - TO_STRING_MAP[KeyCode.KEY_6] = '6'; - TO_STRING_MAP[KeyCode.KEY_7] = '7'; - TO_STRING_MAP[KeyCode.KEY_8] = '8'; - TO_STRING_MAP[KeyCode.KEY_9] = '9'; + define(KeyCode.KEY_0, '0'); + define(KeyCode.KEY_1, '1'); + define(KeyCode.KEY_2, '2'); + define(KeyCode.KEY_3, '3'); + define(KeyCode.KEY_4, '4'); + define(KeyCode.KEY_5, '5'); + define(KeyCode.KEY_6, '6'); + define(KeyCode.KEY_7, '7'); + define(KeyCode.KEY_8, '8'); + define(KeyCode.KEY_9, '9'); - TO_STRING_MAP[KeyCode.KEY_A] = 'A'; - TO_STRING_MAP[KeyCode.KEY_B] = 'B'; - TO_STRING_MAP[KeyCode.KEY_C] = 'C'; - TO_STRING_MAP[KeyCode.KEY_D] = 'D'; - TO_STRING_MAP[KeyCode.KEY_E] = 'E'; - TO_STRING_MAP[KeyCode.KEY_F] = 'F'; - TO_STRING_MAP[KeyCode.KEY_G] = 'G'; - TO_STRING_MAP[KeyCode.KEY_H] = 'H'; - TO_STRING_MAP[KeyCode.KEY_I] = 'I'; - TO_STRING_MAP[KeyCode.KEY_J] = 'J'; - TO_STRING_MAP[KeyCode.KEY_K] = 'K'; - TO_STRING_MAP[KeyCode.KEY_L] = 'L'; - TO_STRING_MAP[KeyCode.KEY_M] = 'M'; - TO_STRING_MAP[KeyCode.KEY_N] = 'N'; - TO_STRING_MAP[KeyCode.KEY_O] = 'O'; - TO_STRING_MAP[KeyCode.KEY_P] = 'P'; - TO_STRING_MAP[KeyCode.KEY_Q] = 'Q'; - TO_STRING_MAP[KeyCode.KEY_R] = 'R'; - TO_STRING_MAP[KeyCode.KEY_S] = 'S'; - TO_STRING_MAP[KeyCode.KEY_T] = 'T'; - TO_STRING_MAP[KeyCode.KEY_U] = 'U'; - TO_STRING_MAP[KeyCode.KEY_V] = 'V'; - TO_STRING_MAP[KeyCode.KEY_W] = 'W'; - TO_STRING_MAP[KeyCode.KEY_X] = 'X'; - TO_STRING_MAP[KeyCode.KEY_Y] = 'Y'; - TO_STRING_MAP[KeyCode.KEY_Z] = 'Z'; + define(KeyCode.KEY_A, 'A'); + define(KeyCode.KEY_B, 'B'); + define(KeyCode.KEY_C, 'C'); + define(KeyCode.KEY_D, 'D'); + define(KeyCode.KEY_E, 'E'); + define(KeyCode.KEY_F, 'F'); + define(KeyCode.KEY_G, 'G'); + define(KeyCode.KEY_H, 'H'); + define(KeyCode.KEY_I, 'I'); + define(KeyCode.KEY_J, 'J'); + define(KeyCode.KEY_K, 'K'); + define(KeyCode.KEY_L, 'L'); + define(KeyCode.KEY_M, 'M'); + define(KeyCode.KEY_N, 'N'); + define(KeyCode.KEY_O, 'O'); + define(KeyCode.KEY_P, 'P'); + define(KeyCode.KEY_Q, 'Q'); + define(KeyCode.KEY_R, 'R'); + define(KeyCode.KEY_S, 'S'); + define(KeyCode.KEY_T, 'T'); + define(KeyCode.KEY_U, 'U'); + define(KeyCode.KEY_V, 'V'); + define(KeyCode.KEY_W, 'W'); + define(KeyCode.KEY_X, 'X'); + define(KeyCode.KEY_Y, 'Y'); + define(KeyCode.KEY_Z, 'Z'); - TO_STRING_MAP[KeyCode.Meta] = 'Meta'; - TO_STRING_MAP[KeyCode.ContextMenu] = 'ContextMenu'; + define(KeyCode.Meta, 'Meta'); + define(KeyCode.ContextMenu, 'ContextMenu'); - TO_STRING_MAP[KeyCode.F1] = 'F1'; - TO_STRING_MAP[KeyCode.F2] = 'F2'; - TO_STRING_MAP[KeyCode.F3] = 'F3'; - TO_STRING_MAP[KeyCode.F4] = 'F4'; - TO_STRING_MAP[KeyCode.F5] = 'F5'; - TO_STRING_MAP[KeyCode.F6] = 'F6'; - TO_STRING_MAP[KeyCode.F7] = 'F7'; - TO_STRING_MAP[KeyCode.F8] = 'F8'; - TO_STRING_MAP[KeyCode.F9] = 'F9'; - TO_STRING_MAP[KeyCode.F10] = 'F10'; - TO_STRING_MAP[KeyCode.F11] = 'F11'; - TO_STRING_MAP[KeyCode.F12] = 'F12'; - TO_STRING_MAP[KeyCode.F13] = 'F13'; - TO_STRING_MAP[KeyCode.F14] = 'F14'; - TO_STRING_MAP[KeyCode.F15] = 'F15'; - TO_STRING_MAP[KeyCode.F16] = 'F16'; - TO_STRING_MAP[KeyCode.F17] = 'F17'; - TO_STRING_MAP[KeyCode.F18] = 'F18'; - TO_STRING_MAP[KeyCode.F19] = 'F19'; + define(KeyCode.F1, 'F1'); + define(KeyCode.F2, 'F2'); + define(KeyCode.F3, 'F3'); + define(KeyCode.F4, 'F4'); + define(KeyCode.F5, 'F5'); + define(KeyCode.F6, 'F6'); + define(KeyCode.F7, 'F7'); + define(KeyCode.F8, 'F8'); + define(KeyCode.F9, 'F9'); + define(KeyCode.F10, 'F10'); + define(KeyCode.F11, 'F11'); + define(KeyCode.F12, 'F12'); + define(KeyCode.F13, 'F13'); + define(KeyCode.F14, 'F14'); + define(KeyCode.F15, 'F15'); + define(KeyCode.F16, 'F16'); + define(KeyCode.F17, 'F17'); + define(KeyCode.F18, 'F18'); + define(KeyCode.F19, 'F19'); + + define(KeyCode.NumLock, 'NumLock'); + define(KeyCode.ScrollLock, 'ScrollLock'); + + define(KeyCode.US_SEMICOLON, ';', ';', 'OEM_1'); + define(KeyCode.US_EQUAL, '=', '=', 'OEM_PLUS'); + define(KeyCode.US_COMMA, ',', ',', 'OEM_COMMA'); + define(KeyCode.US_MINUS, '-', '-', 'OEM_MINUS'); + define(KeyCode.US_DOT, '.', '.', 'OEM_PERIOD'); + define(KeyCode.US_SLASH, '/', '/', 'OEM_2'); + define(KeyCode.US_BACKTICK, '`', '`', 'OEM_3'); + define(KeyCode.ABNT_C1, 'ABNT_C1'); + define(KeyCode.ABNT_C2, 'ABNT_C2'); + define(KeyCode.US_OPEN_SQUARE_BRACKET, '[', '[', 'OEM_4'); + define(KeyCode.US_BACKSLASH, '\\', '\\', 'OEM_5'); + define(KeyCode.US_CLOSE_SQUARE_BRACKET, ']', ']', 'OEM_6'); + define(KeyCode.US_QUOTE, '\'', '\'', 'OEM_7'); + define(KeyCode.OEM_8, 'OEM_8'); + define(KeyCode.OEM_102, 'OEM_102'); + + define(KeyCode.NUMPAD_0, 'NumPad0'); + define(KeyCode.NUMPAD_1, 'NumPad1'); + define(KeyCode.NUMPAD_2, 'NumPad2'); + define(KeyCode.NUMPAD_3, 'NumPad3'); + define(KeyCode.NUMPAD_4, 'NumPad4'); + define(KeyCode.NUMPAD_5, 'NumPad5'); + define(KeyCode.NUMPAD_6, 'NumPad6'); + define(KeyCode.NUMPAD_7, 'NumPad7'); + define(KeyCode.NUMPAD_8, 'NumPad8'); + define(KeyCode.NUMPAD_9, 'NumPad9'); + + define(KeyCode.NUMPAD_MULTIPLY, 'NumPad_Multiply'); + define(KeyCode.NUMPAD_ADD, 'NumPad_Add'); + define(KeyCode.NUMPAD_SEPARATOR, 'NumPad_Separator'); + define(KeyCode.NUMPAD_SUBTRACT, 'NumPad_Subtract'); + define(KeyCode.NUMPAD_DECIMAL, 'NumPad_Decimal'); + define(KeyCode.NUMPAD_DIVIDE, 'NumPad_Divide'); + +})(); - TO_STRING_MAP[KeyCode.NumLock] = 'NumLock'; - TO_STRING_MAP[KeyCode.ScrollLock] = 'ScrollLock'; - - TO_STRING_MAP[KeyCode.US_SEMICOLON] = ';'; - TO_STRING_MAP[KeyCode.US_EQUAL] = '='; - TO_STRING_MAP[KeyCode.US_COMMA] = ','; - TO_STRING_MAP[KeyCode.US_MINUS] = '-'; - TO_STRING_MAP[KeyCode.US_DOT] = '.'; - TO_STRING_MAP[KeyCode.US_SLASH] = '/'; - TO_STRING_MAP[KeyCode.US_BACKTICK] = '`'; - TO_STRING_MAP[KeyCode.ABNT_C1] = 'ABNT_C1'; - TO_STRING_MAP[KeyCode.ABNT_C2] = 'ABNT_C2'; - TO_STRING_MAP[KeyCode.US_OPEN_SQUARE_BRACKET] = '['; - TO_STRING_MAP[KeyCode.US_BACKSLASH] = '\\'; - TO_STRING_MAP[KeyCode.US_CLOSE_SQUARE_BRACKET] = ']'; - TO_STRING_MAP[KeyCode.US_QUOTE] = '\''; - TO_STRING_MAP[KeyCode.OEM_8] = 'OEM_8'; - TO_STRING_MAP[KeyCode.OEM_102] = 'OEM_102'; - - TO_STRING_MAP[KeyCode.NUMPAD_0] = 'NumPad0'; - TO_STRING_MAP[KeyCode.NUMPAD_1] = 'NumPad1'; - TO_STRING_MAP[KeyCode.NUMPAD_2] = 'NumPad2'; - TO_STRING_MAP[KeyCode.NUMPAD_3] = 'NumPad3'; - TO_STRING_MAP[KeyCode.NUMPAD_4] = 'NumPad4'; - TO_STRING_MAP[KeyCode.NUMPAD_5] = 'NumPad5'; - TO_STRING_MAP[KeyCode.NUMPAD_6] = 'NumPad6'; - TO_STRING_MAP[KeyCode.NUMPAD_7] = 'NumPad7'; - TO_STRING_MAP[KeyCode.NUMPAD_8] = 'NumPad8'; - TO_STRING_MAP[KeyCode.NUMPAD_9] = 'NumPad9'; - - TO_STRING_MAP[KeyCode.NUMPAD_MULTIPLY] = 'NumPad_Multiply'; - TO_STRING_MAP[KeyCode.NUMPAD_ADD] = 'NumPad_Add'; - TO_STRING_MAP[KeyCode.NUMPAD_SEPARATOR] = 'NumPad_Separator'; - TO_STRING_MAP[KeyCode.NUMPAD_SUBTRACT] = 'NumPad_Subtract'; - TO_STRING_MAP[KeyCode.NUMPAD_DECIMAL] = 'NumPad_Decimal'; - TO_STRING_MAP[KeyCode.NUMPAD_DIVIDE] = 'NumPad_Divide'; - - // for (let i = 0; i < KeyCode.MAX_VALUE; i++) { - // if (!TO_STRING_MAP[i]) { - // console.warn('Missing string representation for ' + KeyCode[i]); - // } - // } -}, (FROM_STRING_MAP) => { - FROM_STRING_MAP['\r'] = KeyCode.Enter; -}); - - -export let USER_SETTINGS = createMapping((TO_USER_SETTINGS_MAP) => { - for (let i = 0, len = STRING._fromKeyCode.length; i < len; i++) { - TO_USER_SETTINGS_MAP[i] = STRING._fromKeyCode[i]; +export const USER_SETTINGS = { + fromKeyCode: (keyCode: KeyCode) => { + return usUserSettings.fromKeyCode(keyCode); + }, + toKeyCode: (str: string) => { + return usUserSettings.toKeyCode(str) || generalUserSettings.toKeyCode(str); } - TO_USER_SETTINGS_MAP[KeyCode.LeftArrow] = 'Left'; - TO_USER_SETTINGS_MAP[KeyCode.UpArrow] = 'Up'; - TO_USER_SETTINGS_MAP[KeyCode.RightArrow] = 'Right'; - TO_USER_SETTINGS_MAP[KeyCode.DownArrow] = 'Down'; -}, (FROM_USER_SETTINGS_MAP) => { - FROM_USER_SETTINGS_MAP['OEM_1'] = KeyCode.US_SEMICOLON; - FROM_USER_SETTINGS_MAP['OEM_PLUS'] = KeyCode.US_EQUAL; - FROM_USER_SETTINGS_MAP['OEM_COMMA'] = KeyCode.US_COMMA; - FROM_USER_SETTINGS_MAP['OEM_MINUS'] = KeyCode.US_MINUS; - FROM_USER_SETTINGS_MAP['OEM_PERIOD'] = KeyCode.US_DOT; - FROM_USER_SETTINGS_MAP['OEM_2'] = KeyCode.US_SLASH; - FROM_USER_SETTINGS_MAP['OEM_3'] = KeyCode.US_BACKTICK; - FROM_USER_SETTINGS_MAP['ABNT_C1'] = KeyCode.ABNT_C1; - FROM_USER_SETTINGS_MAP['ABNT_C2'] = KeyCode.ABNT_C2; - FROM_USER_SETTINGS_MAP['OEM_4'] = KeyCode.US_OPEN_SQUARE_BRACKET; - FROM_USER_SETTINGS_MAP['OEM_5'] = KeyCode.US_BACKSLASH; - FROM_USER_SETTINGS_MAP['OEM_6'] = KeyCode.US_CLOSE_SQUARE_BRACKET; - FROM_USER_SETTINGS_MAP['OEM_7'] = KeyCode.US_QUOTE; - FROM_USER_SETTINGS_MAP['OEM_8'] = KeyCode.OEM_8; - FROM_USER_SETTINGS_MAP['OEM_102'] = KeyCode.OEM_102; -}); +}; export namespace KeyCodeUtils { - export function toString(key: KeyCode): string { - return STRING.fromKeyCode(key); + export function toString(keyCode: KeyCode): string { + return ui.fromKeyCode(keyCode); + // return STRING.fromKeyCode(keyCode); } export function fromString(key: string): KeyCode { - return STRING.toKeyCode(key); + return ui.toKeyCode(key); + // return STRING.toKeyCode(key); } } From 227b38f6421c72274a32cb6678eebb5b5501c7b1 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 18:14:03 +0200 Subject: [PATCH 0685/1164] Fixes #26945: Present symbolic names in keybindings.json for non-US standard keyboard layouts --- src/vs/base/common/keyCodes.ts | 42 +++++++++---------- .../common/usLayoutResolvedKeybinding.ts | 4 +- .../keybinding/common/keybindingIO.ts | 6 +-- .../common/macLinuxKeyboardMapper.ts | 6 +-- .../common/windowsKeyboardMapper.ts | 11 +++-- .../electron-browser/keybindingService.ts | 4 +- .../test/windowsKeyboardMapper.test.ts | 26 ++++++------ 7 files changed, 51 insertions(+), 48 deletions(-) diff --git a/src/vs/base/common/keyCodes.ts b/src/vs/base/common/keyCodes.ts index 893b7c0540b..b3a1ee94fbe 100644 --- a/src/vs/base/common/keyCodes.ts +++ b/src/vs/base/common/keyCodes.ts @@ -215,25 +215,25 @@ class KeyCodeStrMap { this._strToKeyCode[str.toLowerCase()] = keyCode; } - fromKeyCode(keyCode: KeyCode): string { + keyCodeToStr(keyCode: KeyCode): string { return this._keyCodeToStr[keyCode]; } - toKeyCode(str: string): KeyCode { + strToKeyCode(str: string): KeyCode { return this._strToKeyCode[str.toLowerCase()] || KeyCode.Unknown; } } -const ui = new KeyCodeStrMap(); -const usUserSettings = new KeyCodeStrMap(); -const generalUserSettings = new KeyCodeStrMap(); +const uiMap = new KeyCodeStrMap(); +const userSettingsUSMap = new KeyCodeStrMap(); +const userSettingsGeneralMap = new KeyCodeStrMap(); (function () { function define(keyCode: KeyCode, uiLabel: string, usUserSettingsLabel: string = uiLabel, generalUserSettingsLabel: string = usUserSettingsLabel): void { - ui.define(keyCode, uiLabel); - usUserSettings.define(keyCode, usUserSettingsLabel); - generalUserSettings.define(keyCode, generalUserSettingsLabel); + uiMap.define(keyCode, uiLabel); + userSettingsUSMap.define(keyCode, usUserSettingsLabel); + userSettingsGeneralMap.define(keyCode, generalUserSettingsLabel); } define(KeyCode.Unknown, 'unknown'); @@ -360,24 +360,22 @@ const generalUserSettings = new KeyCodeStrMap(); })(); - -export const USER_SETTINGS = { - fromKeyCode: (keyCode: KeyCode) => { - return usUserSettings.fromKeyCode(keyCode); - }, - toKeyCode: (str: string) => { - return usUserSettings.toKeyCode(str) || generalUserSettings.toKeyCode(str); - } -}; - export namespace KeyCodeUtils { export function toString(keyCode: KeyCode): string { - return ui.fromKeyCode(keyCode); - // return STRING.fromKeyCode(keyCode); + return uiMap.keyCodeToStr(keyCode); } export function fromString(key: string): KeyCode { - return ui.toKeyCode(key); - // return STRING.toKeyCode(key); + return uiMap.strToKeyCode(key); + } + + export function toUserSettingsUS(keyCode: KeyCode): string { + return userSettingsUSMap.keyCodeToStr(keyCode); + } + export function toUserSettingsGeneral(keyCode: KeyCode): string { + return userSettingsGeneralMap.keyCodeToStr(keyCode); + } + export function fromUserSettings(key: string): KeyCode { + return userSettingsUSMap.strToKeyCode(key) || userSettingsGeneralMap.strToKeyCode(key); } } diff --git a/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding.ts b/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding.ts index 11bf5ad1801..08d67882828 100644 --- a/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding.ts +++ b/src/vs/platform/keybinding/common/usLayoutResolvedKeybinding.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { ResolvedKeybinding, ResolvedKeybindingPart, KeyCode, KeyCodeUtils, USER_SETTINGS, Keybinding, KeybindingType, SimpleKeybinding } from 'vs/base/common/keyCodes'; +import { ResolvedKeybinding, ResolvedKeybindingPart, KeyCode, KeyCodeUtils, Keybinding, KeybindingType, SimpleKeybinding } from 'vs/base/common/keyCodes'; import { UILabelProvider, AriaLabelProvider, ElectronAcceleratorLabelProvider, UserSettingsLabelProvider } from 'vs/platform/keybinding/common/keybindingLabels'; import { OperatingSystem } from 'vs/base/common/platform'; @@ -127,7 +127,7 @@ export class USLayoutResolvedKeybinding extends ResolvedKeybinding { if (keybinding.isDuplicateModifierCase()) { return ''; } - return USER_SETTINGS.fromKeyCode(keybinding.keyCode); + return KeyCodeUtils.toUserSettingsUS(keybinding.keyCode); } public getUserSettingsLabel(): string { diff --git a/src/vs/workbench/services/keybinding/common/keybindingIO.ts b/src/vs/workbench/services/keybinding/common/keybindingIO.ts index 5a432e6d0c1..64037ac9774 100644 --- a/src/vs/workbench/services/keybinding/common/keybindingIO.ts +++ b/src/vs/workbench/services/keybinding/common/keybindingIO.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { USER_SETTINGS, Keybinding, SimpleKeybinding, ChordKeybinding } from 'vs/base/common/keyCodes'; +import { Keybinding, SimpleKeybinding, ChordKeybinding, KeyCodeUtils } from 'vs/base/common/keyCodes'; import { OperatingSystem } from 'vs/base/common/platform'; import { IUserFriendlyKeybinding } from 'vs/platform/keybinding/common/keybinding'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -119,7 +119,7 @@ export class KeybindingIO { private static _readSimpleKeybinding(input: string): [SimpleKeybinding, string] { const mods = this._readModifiers(input); - const keyCode = USER_SETTINGS.toKeyCode(mods.key); + const keyCode = KeyCodeUtils.fromUserSettings(mods.key); return [new SimpleKeybinding(mods.ctrl, mods.shift, mods.alt, mods.meta, keyCode), mods.remains]; } @@ -148,7 +148,7 @@ export class KeybindingIO { const scanCode = ScanCodeUtils.lowerCaseToEnum(strScanCode); return [new ScanCodeBinding(mods.ctrl, mods.shift, mods.alt, mods.meta, scanCode), mods.remains]; } - const keyCode = USER_SETTINGS.toKeyCode(mods.key); + const keyCode = KeyCodeUtils.fromUserSettings(mods.key); return [new SimpleKeybinding(mods.ctrl, mods.shift, mods.alt, mods.meta, keyCode), mods.remains]; } diff --git a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts index e7eacdb6a96..aec84334a98 100644 --- a/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts @@ -6,7 +6,7 @@ 'use strict'; import { OperatingSystem } from 'vs/base/common/platform'; -import { KeyCode, ResolvedKeybinding, KeyCodeUtils, SimpleKeybinding, Keybinding, KeybindingType, USER_SETTINGS, ResolvedKeybindingPart } from 'vs/base/common/keyCodes'; +import { KeyCode, ResolvedKeybinding, KeyCodeUtils, SimpleKeybinding, Keybinding, KeybindingType, ResolvedKeybindingPart } from 'vs/base/common/keyCodes'; import { ScanCode, ScanCodeUtils, IMMUTABLE_CODE_TO_KEY_CODE, IMMUTABLE_KEY_CODE_TO_CODE, ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCode'; import { CharCode } from 'vs/base/common/charCode'; import { UILabelProvider, AriaLabelProvider, UserSettingsLabelProvider, ElectronAcceleratorLabelProvider } from 'vs/platform/keybinding/common/keybindingLabels'; @@ -926,7 +926,7 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { const immutableKeyCode = IMMUTABLE_CODE_TO_KEY_CODE[binding.scanCode]; if (immutableKeyCode !== -1) { - return USER_SETTINGS.fromKeyCode(immutableKeyCode).toLowerCase(); + return KeyCodeUtils.toUserSettingsUS(immutableKeyCode).toLowerCase(); } // Check if this scanCode always maps to the same keyCode and back @@ -937,7 +937,7 @@ export class MacLinuxKeyboardMapper implements IKeyboardMapper { for (let i = 0, len = reverseBindings.length; i < len; i++) { const reverseBinding = reverseBindings[i]; if (reverseBinding.scanCode === binding.scanCode) { - return USER_SETTINGS.fromKeyCode(constantKeyCode).toLowerCase(); + return KeyCodeUtils.toUserSettingsUS(constantKeyCode).toLowerCase(); } } } diff --git a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts index 80074140439..6eef623475f 100644 --- a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts @@ -5,7 +5,7 @@ 'use strict'; -import { KeyCode, KeyCodeUtils, ResolvedKeybinding, Keybinding, SimpleKeybinding, KeybindingType, USER_SETTINGS, ResolvedKeybindingPart } from 'vs/base/common/keyCodes'; +import { KeyCode, KeyCodeUtils, ResolvedKeybinding, Keybinding, SimpleKeybinding, KeybindingType, ResolvedKeybindingPart } from 'vs/base/common/keyCodes'; import { ScanCode, ScanCodeUtils, IMMUTABLE_CODE_TO_KEY_CODE, ScanCodeBinding } from 'vs/workbench/services/keybinding/common/scanCode'; import { CharCode } from 'vs/base/common/charCode'; import { UILabelProvider, AriaLabelProvider, ElectronAcceleratorLabelProvider, UserSettingsLabelProvider } from 'vs/platform/keybinding/common/keybindingLabels'; @@ -171,7 +171,10 @@ export class WindowsNativeResolvedKeybinding extends ResolvedKeybinding { if (keybinding.isDuplicateModifierCase()) { return ''; } - return USER_SETTINGS.fromKeyCode(keybinding.keyCode); + if (this._mapper.isUSStandard) { + return KeyCodeUtils.toUserSettingsUS(keybinding.keyCode); + } + return KeyCodeUtils.toUserSettingsGeneral(keybinding.keyCode); } public getUserSettingsLabel(): string { @@ -273,12 +276,14 @@ export class WindowsNativeResolvedKeybinding extends ResolvedKeybinding { export class WindowsKeyboardMapper implements IKeyboardMapper { + public readonly isUSStandard: boolean; private readonly _codeInfo: IScanCodeMapping[]; private readonly _scanCodeToKeyCode: KeyCode[]; private readonly _keyCodeToLabel: string[] = []; private readonly _keyCodeExists: boolean[]; - constructor(rawMappings: IWindowsKeyboardMapping) { + constructor(isUSStandard: boolean, rawMappings: IWindowsKeyboardMapping) { + this.isUSStandard = isUSStandard; this._scanCodeToKeyCode = []; this._keyCodeToLabel = []; this._keyCodeExists = []; diff --git a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts index a569b807971..c7c61fc9d37 100644 --- a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts @@ -126,8 +126,9 @@ export class KeyboardMapperFactory { } private static _createKeyboardMapper(isISOKeyboard: boolean, layoutInfo: nativeKeymap.IKeyboardLayoutInfo, rawMapping: nativeKeymap.IKeyboardMapping): IKeyboardMapper { + const isUSStandard = KeyboardMapperFactory._isUSStandard(layoutInfo); if (OS === OperatingSystem.Windows) { - return new WindowsKeyboardMapper(rawMapping); + return new WindowsKeyboardMapper(isUSStandard, rawMapping); } if (Object.keys(rawMapping).length === 0) { @@ -143,7 +144,6 @@ export class KeyboardMapperFactory { } } - const isUSStandard = KeyboardMapperFactory._isUSStandard(layoutInfo); return new MacLinuxKeyboardMapper(isISOKeyboard, isUSStandard, rawMapping, OS); } diff --git a/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts index 431bfd0a20b..9ec12ce6b6c 100644 --- a/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts @@ -14,9 +14,9 @@ import { ScanCodeBinding, ScanCode } from 'vs/workbench/services/keybinding/comm const WRITE_FILE_IF_DIFFERENT = false; -function createKeyboardMapper(file: string): TPromise { +function createKeyboardMapper(isUSStandard: boolean, file: string): TPromise { return readRawMapping(file).then((rawMappings) => { - return new WindowsKeyboardMapper(rawMappings); + return new WindowsKeyboardMapper(isUSStandard, rawMappings); }); } @@ -29,7 +29,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => { let mapper: WindowsKeyboardMapper; suiteSetup((done) => { - createKeyboardMapper('win_de_ch').then((_mapper) => { + createKeyboardMapper(false, 'win_de_ch').then((_mapper) => { mapper = _mapper; done(); }, done); @@ -102,7 +102,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => { label: 'Ctrl+^', ariaLabel: 'Control+^', electronAccelerator: 'Ctrl+]', - userSettingsLabel: 'ctrl+]', + userSettingsLabel: 'ctrl+oem_6', isWYSIWYG: false, isChord: false, dispatchParts: ['ctrl+]', null], @@ -125,7 +125,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => { label: 'Ctrl+^', ariaLabel: 'Control+^', electronAccelerator: 'Ctrl+]', - userSettingsLabel: 'ctrl+]', + userSettingsLabel: 'ctrl+oem_6', isWYSIWYG: false, isChord: false, dispatchParts: ['ctrl+]', null], @@ -141,7 +141,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => { label: 'Shift+^', ariaLabel: 'Shift+^', electronAccelerator: 'Shift+]', - userSettingsLabel: 'shift+]', + userSettingsLabel: 'shift+oem_6', isWYSIWYG: false, isChord: false, dispatchParts: ['shift+]', null], @@ -157,7 +157,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => { label: 'Ctrl+§', ariaLabel: 'Control+§', electronAccelerator: 'Ctrl+/', - userSettingsLabel: 'ctrl+/', + userSettingsLabel: 'ctrl+oem_2', isWYSIWYG: false, isChord: false, dispatchParts: ['ctrl+/', null], @@ -173,7 +173,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => { label: 'Ctrl+Shift+§', ariaLabel: 'Control+Shift+§', electronAccelerator: 'Ctrl+Shift+/', - userSettingsLabel: 'ctrl+shift+/', + userSettingsLabel: 'ctrl+shift+oem_2', isWYSIWYG: false, isChord: false, dispatchParts: ['ctrl+shift+/', null], @@ -189,7 +189,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => { label: 'Ctrl+K Ctrl+ä', ariaLabel: 'Control+K Control+ä', electronAccelerator: null, - userSettingsLabel: 'ctrl+k ctrl+\\', + userSettingsLabel: 'ctrl+k ctrl+oem_5', isWYSIWYG: false, isChord: true, dispatchParts: ['ctrl+K', 'ctrl+\\'], @@ -285,7 +285,7 @@ suite('keyboardMapper - WINDOWS de_ch', () => { label: 'Ctrl+, Ctrl+§', ariaLabel: 'Control+, Control+§', electronAccelerator: null, - userSettingsLabel: 'ctrl+, ctrl+/', + userSettingsLabel: 'ctrl+oem_comma ctrl+oem_2', isWYSIWYG: false, isChord: true, dispatchParts: ['ctrl+,', 'ctrl+/'], @@ -322,7 +322,7 @@ suite('keyboardMapper - WINDOWS en_us', () => { let mapper: WindowsKeyboardMapper; suiteSetup((done) => { - createKeyboardMapper('win_en_us').then((_mapper) => { + createKeyboardMapper(true, 'win_en_us').then((_mapper) => { mapper = _mapper; done(); }, done); @@ -412,7 +412,7 @@ suite('keyboardMapper - WINDOWS por_ptb', () => { let mapper: WindowsKeyboardMapper; suiteSetup((done) => { - createKeyboardMapper('win_por_ptb').then((_mapper) => { + createKeyboardMapper(false, 'win_por_ptb').then((_mapper) => { mapper = _mapper; done(); }, done); @@ -471,7 +471,7 @@ suite('keyboardMapper - WINDOWS por_ptb', () => { suite('misc', () => { test('issue #23513: Toggle Sidebar Visibility and Go to Line display same key mapping in Arabic keyboard', () => { - const mapper = new WindowsKeyboardMapper({ + const mapper = new WindowsKeyboardMapper(false, { 'KeyB': { 'vkey': 'VK_B', 'value': 'لا', From 6fd1ac9ccc4f062d271899f9d4919c8c8c5a9b74 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Fri, 19 May 2017 18:17:26 +0200 Subject: [PATCH 0686/1164] Fixes #26949: Task version 0.1.0 doesn't list any task anymore. Shows endless progress --- .../parts/tasks/electron-browser/task.contribution.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index dd1b8025ae4..3aff765da6a 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -894,11 +894,13 @@ class TaskService extends EventEmitter implements ITaskService { resolve(result); } }; - if (this.getExecutionEngine() === ExecutionEngine.Terminal) { + if (this.getExecutionEngine() === ExecutionEngine.Terminal && this._providers.size > 0) { this._providers.forEach((provider) => { counter++; provider.provideTasks().done(done, error); }); + } else { + resolve(result); } }).then((result) => { return this.getWorkspaceTasks().then((workspaceTaskResult) => { From e87e0999d43cca3dbbf30ca842e6707cf1585500 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 19 May 2017 18:22:59 +0200 Subject: [PATCH 0687/1164] Implement #26948 - Initial version of custom views and tree data provider API --- .../base/browser/ui/splitview/splitview.css | 4 + src/vs/base/browser/ui/splitview/splitview.ts | 35 ++- src/vs/vscode.proposed.d.ts | 111 +++----- .../extensionHost.contribution.ts | 4 +- .../mainThreadExplorerView.ts | 83 ------ .../electron-browser/mainThreadTreeViews.ts | 123 ++++++++ src/vs/workbench/api/node/extHost.api.impl.ts | 9 +- src/vs/workbench/api/node/extHost.protocol.ts | 34 ++- .../workbench/api/node/extHostExplorerView.ts | 163 ----------- src/vs/workbench/api/node/extHostTreeViews.ts | 210 ++++++++++++++ src/vs/workbench/api/node/extHostTypes.ts | 5 + src/vs/workbench/browser/viewlet.ts | 30 +- .../electron-browser/workbench.main.ts | 5 +- .../browser/explorer.contribution.ts | 10 - .../parts/explorers/browser/media/Refresh.svg | 1 - .../browser/media/Refresh_inverse.svg | 1 - .../browser/treeExplorer.contribution.ts | 120 -------- .../explorers/browser/treeExplorerActions.ts | 21 -- .../explorers/browser/treeExplorerMenus.ts | 100 ------- .../explorers/browser/treeExplorerService.ts | 85 ------ .../explorers/browser/treeExplorerViewlet.ts | 102 ------- .../browser/views/treeExplorerView.ts | 139 --------- .../browser/views/treeExplorerViewer.ts | 208 -------------- .../parts/explorers/common/explorer.ts | 37 --- .../parts/explorers/common/treeExplorer.ts | 21 -- .../explorers/common/treeExplorerService.ts | 28 -- .../explorers/common/treeExplorerViewModel.ts | 27 -- .../parts/files/browser/explorerViewlet.ts | 103 +++++-- .../browser/media/views.css} | 26 +- .../browser/treeView.ts} | 269 ++++++++++-------- src/vs/workbench/parts/views/browser/views.ts | 144 ++++++++++ .../views/browser/viewsExtensionPoint.ts | 101 +++++++ 32 files changed, 969 insertions(+), 1390 deletions(-) delete mode 100644 src/vs/workbench/api/electron-browser/mainThreadExplorerView.ts create mode 100644 src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts delete mode 100644 src/vs/workbench/api/node/extHostExplorerView.ts create mode 100644 src/vs/workbench/api/node/extHostTreeViews.ts delete mode 100644 src/vs/workbench/parts/explorers/browser/explorer.contribution.ts delete mode 100644 src/vs/workbench/parts/explorers/browser/media/Refresh.svg delete mode 100644 src/vs/workbench/parts/explorers/browser/media/Refresh_inverse.svg delete mode 100644 src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.ts delete mode 100644 src/vs/workbench/parts/explorers/browser/treeExplorerActions.ts delete mode 100644 src/vs/workbench/parts/explorers/browser/treeExplorerMenus.ts delete mode 100644 src/vs/workbench/parts/explorers/browser/treeExplorerService.ts delete mode 100644 src/vs/workbench/parts/explorers/browser/treeExplorerViewlet.ts delete mode 100644 src/vs/workbench/parts/explorers/browser/views/treeExplorerView.ts delete mode 100644 src/vs/workbench/parts/explorers/browser/views/treeExplorerViewer.ts delete mode 100644 src/vs/workbench/parts/explorers/common/explorer.ts delete mode 100644 src/vs/workbench/parts/explorers/common/treeExplorer.ts delete mode 100644 src/vs/workbench/parts/explorers/common/treeExplorerService.ts delete mode 100644 src/vs/workbench/parts/explorers/common/treeExplorerViewModel.ts rename src/vs/workbench/parts/{explorers/browser/media/treeExplorer.contribution.css => views/browser/media/views.css} (50%) rename src/vs/workbench/parts/{explorers/browser/explorerView.ts => views/browser/treeView.ts} (59%) create mode 100644 src/vs/workbench/parts/views/browser/views.ts create mode 100644 src/vs/workbench/parts/views/browser/viewsExtensionPoint.ts diff --git a/src/vs/base/browser/ui/splitview/splitview.css b/src/vs/base/browser/ui/splitview/splitview.css index 8936d95727e..4a6de69c521 100644 --- a/src/vs/base/browser/ui/splitview/splitview.css +++ b/src/vs/base/browser/ui/splitview/splitview.css @@ -30,6 +30,10 @@ display: flex; } +.monaco-split-view > .split-view-view > .header.hide { + display: none; +} + /* Bold font style does not go well with CJK fonts */ .monaco-split-view:lang(zh-Hans) > .split-view-view > .header, .monaco-split-view:lang(zh-Hant) > .split-view-view > .header, diff --git a/src/vs/base/browser/ui/splitview/splitview.ts b/src/vs/base/browser/ui/splitview/splitview.ts index 09df1966a15..b642b5359e4 100644 --- a/src/vs/base/browser/ui/splitview/splitview.ts +++ b/src/vs/base/browser/ui/splitview/splitview.ts @@ -117,7 +117,9 @@ const headerDefaultOpts = { export abstract class HeaderView extends View { - protected headerSize: number; + private _headerSize: number; + private _showHeader: boolean; + protected header: HTMLElement; protected body: HTMLElement; @@ -127,7 +129,8 @@ export abstract class HeaderView extends View { constructor(opts: IHeaderViewOptions) { super(opts); - this.headerSize = types.isUndefined(opts.headerSize) ? 22 : opts.headerSize; + this._headerSize = types.isUndefined(opts.headerSize) ? 22 : opts.headerSize; + this._showHeader = this._headerSize > 0; this.headerBackground = opts.headerBackground || headerDefaultOpts.headerBackground; this.headerHighContrastBorder = opts.headerHighContrastBorder; @@ -140,6 +143,10 @@ export abstract class HeaderView extends View { this.applyStyles(); } + protected get headerSize(): number { + return this._showHeader ? this._headerSize : 0; + } + protected applyStyles(): void { if (this.header) { const headerBackgroundColor = this.headerBackground ? this.headerBackground.toString() : null; @@ -162,7 +169,7 @@ export abstract class HeaderView extends View { this.header.style.height = headerSize; } - if (this.headerSize > 0) { + if (this._showHeader) { this.renderHeader(this.header); container.appendChild(this.header); } @@ -177,6 +184,28 @@ export abstract class HeaderView extends View { this.applyStyles(); } + showHeader(): boolean { + if (!this._showHeader) { + if (!this.body.parentElement.contains(this.header)) { + this.renderHeader(this.header); + this.body.parentElement.insertBefore(this.header, this.body); + } + dom.removeClass(this.header, 'hide'); + this._showHeader = true; + return true; + } + return false; + } + + hideHeader(): boolean { + if (this._showHeader) { + dom.addClass(this.header, 'hide'); + this._showHeader = false; + return true; + } + return false; + } + layout(size: number, orientation: Orientation): void { this.layoutBodyContainer(orientation); this.layoutBody(size - this.headerSize); diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 5e6265c2d20..c1cad09129d 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -13,98 +13,81 @@ declare module 'vscode' { } export namespace window { - /** - * Create a new explorer view. - * + * Register a [TreeDataProvider](#TreeDataProvider) for the registered view `id`. * @param id View id. - * @param name View name. - * @param dataProvider A [TreeDataProvider](#TreeDataProvider). - * @return An instance of [View](#View). + * @param treeDataProvider A [TreeDataProvider](#TreeDataProvider) that provides tree data for the view */ - export function createExplorerView(id: string, name: string, dataProvider: TreeDataProvider): View; + export function registerTreeDataProvider(id: string, treeDataProvider: TreeDataProvider): Disposable; } /** - * A view to interact with nodes - */ - export interface View { - - /** - * Refresh the given nodes - */ - refresh(...nodes: T[]): void; - - /** - * Dispose this view - */ - dispose(): void; - } - - /** - * A data provider for a tree view contribution. - * - * The contributed tree view will ask the corresponding provider to provide the root - * node and resolve children for each node. In addition, the provider could **optionally** - * provide the following information for each node: - * - label: A human-readable label used for rendering the node. - * - hasChildren: Whether the node has children and is expandable. - * - clickCommand: A command to execute when the node is clicked. + * A data provider that provides tree data for a view */ export interface TreeDataProvider { + /** + * An optional event to signal that an element or root has changed. + */ + onDidChange?: Event; /** - * Provide the root node. This function will be called when the tree explorer is activated - * for the first time. The root node is hidden and its direct children will be displayed on the first level of - * the tree explorer. + * get [TreeItem](#TreeItem) representation of the `element` * - * @return The root node. + * @param element The element for which [TreeItem](#TreeItem) representation is asked for. + * @return [TreeItem](#TreeItem) representation of the element */ - provideRootNode(): T | Thenable; + getTreeItem(element: T): TreeItem; /** - * Resolve the children of `node`. + * get the children of `element` or root. * - * @param node The node from which the provider resolves children. - * @return Children of `node`. + * @param element The element from which the provider gets children for. + * @return Children of `element` or root. */ - resolveChildren?(node: T): T[] | Thenable; + getChildren(element?: T): T[] | Thenable; + } + + export interface TreeItem { + /** + * Label of the tree item + */ + label: string; /** - * Provide a human-readable string that will be used for rendering the node. Default to use - * `node.toString()` if not provided. - * - * @param node The node from which the provider computes label. - * @return A human-readable label. + * The icon path for the tree item */ - getLabel?(node: T): string; + iconPath?: string | Uri | { light: string | Uri; dark: string | Uri }; /** - * Determine if `node` has children and is expandable. Default to `true` if not provided. - * - * @param node The node to determine if it has children and is expandable. - * @return A boolean that determines if `node` has children and is expandable. + * The [command](#Command) which should be run when the tree item + * is open in the Source Control viewlet. */ - getHasChildren?(node: T): boolean; + command?: Command; /** - * Provider a context key to be set for the node. This can be used to describe actions for each node. - * - * @param node The node from which the provider computes context key. - * @return A context key. + * Context value of the tree node */ - getContextKey?(node: T): string; + contextValue?: string; /** - * Get the command to execute when `node` is clicked. - * - * Commands can be registered through [registerCommand](#commands.registerCommand). `node` will be provided - * as the first argument to the command's callback function. - * - * @param node The node that the command is associated with. - * @return The command to execute when `node` is clicked. + * Collapsible state of the tree item. + * Required only when item has children. */ - getClickCommand?(node: T): Command; + collapsibleState?: TreeItemCollapsibleState; + } + + /** + * Collapsible state of the tree item + */ + export enum TreeItemCollapsibleState { + /** + * Determines an item is collapsed + */ + Collapsed = 1, + /** + * Determines an item is expanded + */ + Expanded = 2 } /** diff --git a/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts b/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts index 5c84c61db35..f60782ffe63 100644 --- a/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts +++ b/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts @@ -19,7 +19,7 @@ import { MainThreadDiagnostics } from './mainThreadDiagnostics'; import { MainThreadDocuments } from './mainThreadDocuments'; import { MainThreadEditors } from './mainThreadEditors'; import { MainThreadErrors } from './mainThreadErrors'; -import { MainThreadExplorerView } from './mainThreadExplorerView'; +import { MainThreadTreeViews } from './mainThreadTreeViews'; import { MainThreadLanguageFeatures } from './mainThreadLanguageFeatures'; import { MainThreadLanguages } from './mainThreadLanguages'; import { MainThreadMessageService } from './mainThreadMessageService'; @@ -74,7 +74,7 @@ export class ExtHostContribution implements IWorkbenchContribution { col.define(MainContext.MainThreadDocuments).set(this.instantiationService.createInstance(MainThreadDocuments, documentsAndEditors)); col.define(MainContext.MainThreadEditors).set(this.instantiationService.createInstance(MainThreadEditors, documentsAndEditors)); col.define(MainContext.MainThreadErrors).set(create(MainThreadErrors)); - col.define(MainContext.MainThreadExplorerViews).set(create(MainThreadExplorerView)); + col.define(MainContext.MainThreadTreeViews).set(create(MainThreadTreeViews)); col.define(MainContext.MainThreadLanguageFeatures).set(create(MainThreadLanguageFeatures)); col.define(MainContext.MainThreadLanguages).set(create(MainThreadLanguages)); col.define(MainContext.MainThreadMessageService).set(create(MainThreadMessageService)); diff --git a/src/vs/workbench/api/electron-browser/mainThreadExplorerView.ts b/src/vs/workbench/api/electron-browser/mainThreadExplorerView.ts deleted file mode 100644 index 19013b27409..00000000000 --- a/src/vs/workbench/api/electron-browser/mainThreadExplorerView.ts +++ /dev/null @@ -1,83 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { TPromise } from 'vs/base/common/winjs.base'; -import Event, { Emitter } from 'vs/base/common/event'; -import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; -import { ExtHostContext, MainThreadExplorerViewShape, ExtHostExplorerViewShape, ITreeNode } from '../node/extHost.protocol'; -import { IMessageService, Severity } from 'vs/platform/message/common/message'; -import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IExplorerViewsService, IExplorerViewDataProvider, IExplorerView } from 'vs/workbench/parts/explorers/common/explorer'; - -export class MainThreadExplorerView extends MainThreadExplorerViewShape { - - private _proxy: ExtHostExplorerViewShape; - private _views: Map> = new Map>(); - - constructor( - @IThreadService threadService: IThreadService, - @IExplorerViewsService private explorerViewsService: IExplorerViewsService, - @IMessageService private messageService: IMessageService, - @ICommandService private commandService: ICommandService - ) { - super(); - this._proxy = threadService.get(ExtHostContext.ExtHostExplorerView); - } - - $registerView(providerId: string, name: string): void { - const provider = new TreeExplorerNodeProvider(providerId, this._proxy, this.messageService, this.commandService); - const view = this.explorerViewsService.createView(providerId, name, provider); - this._views.set(providerId, view); - } - - $refresh(providerId: string, node: ITreeNode): void { - this._views.get(providerId).refresh(node); - } -} - -class TreeExplorerNodeProvider implements IExplorerViewDataProvider { - - readonly _onRefresh: Emitter = new Emitter(); - readonly onRefresh: Event = this._onRefresh.event; - - constructor(public readonly id: string, private _proxy: ExtHostExplorerViewShape, - private messageService: IMessageService, - private commandService: ICommandService - ) { - } - - provideRoot(): TPromise { - return this._proxy.$provideRootNode(this.id).then(rootNode => rootNode, err => this.messageService.show(Severity.Error, err)); - } - - resolveChildren(node: ITreeNode): TPromise { - return this._proxy.$resolveChildren(this.id, node).then(children => children, err => this.messageService.show(Severity.Error, err)); - } - - hasChildren(node: ITreeNode): boolean { - return node.hasChildren; - } - - getLabel(node: ITreeNode): string { - return node.label; - } - - getId(node: ITreeNode): string { - return node.id; - } - - getContextKey(node: ITreeNode): string { - return node.contextKey; - } - - select(node: ITreeNode): void { - this._proxy.$getInternalCommand(this.id, node).then(command => { - if (command) { - this.commandService.executeCommand(command.id, ...command.arguments); - } - }); - } -} diff --git a/src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts b/src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts new file mode 100644 index 00000000000..186c646eace --- /dev/null +++ b/src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts @@ -0,0 +1,123 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import Event, { Emitter } from 'vs/base/common/event'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; +import { ExtHostContext, MainThreadTreeViewsShape, ExtHostTreeViewsShape } from '../node/extHost.protocol'; +import { IMessageService, Severity } from 'vs/platform/message/common/message'; +import { ViewsRegistry, ITreeViewDataProvider, ITreeItem, TreeItemCollapsibleState } from 'vs/workbench/parts/views/browser/views'; + +export class MainThreadTreeViews extends MainThreadTreeViewsShape { + + private _proxy: ExtHostTreeViewsShape; + + constructor( + @IThreadService threadService: IThreadService, + @IMessageService private messageService: IMessageService + ) { + super(); + this._proxy = threadService.get(ExtHostContext.ExtHostTreeViews); + } + + $registerView(treeViewId: string): void { + ViewsRegistry.registerTreeViewDataProvider(treeViewId, new TreeViewDataProvider(treeViewId, this._proxy, this.messageService)); + } + + $refresh(treeViewId: string, treeItemHandle?: number): void { + const treeViewDataProvider: TreeViewDataProvider = ViewsRegistry.getTreeViewDataProvider(treeViewId); + if (treeViewDataProvider) { + treeViewDataProvider.refresh(treeItemHandle); + } + } +} + +type TreeItemHandle = number; + +class TreeViewDataProvider implements ITreeViewDataProvider { + + private _onDidChange: Emitter = new Emitter(); + readonly onDidChange: Event = this._onDidChange.event; + + private childrenMap: Map = new Map(); + private itemsMap: Map = new Map(); + + constructor(private treeViewId: string, + private _proxy: ExtHostTreeViewsShape, + private messageService: IMessageService + ) { + } + + getElements(): TPromise { + return this._proxy.$getElements(this.treeViewId) + .then(elements => { + this.postGetElements(null, elements); + return elements; + }, err => this.messageService.show(Severity.Error, err)); + } + + getChildren(treeItem: ITreeItem): TPromise { + if (treeItem.children) { + return TPromise.as(treeItem.children); + } + return this._proxy.$getChildren(this.treeViewId, treeItem.handle) + .then(children => { + this.postGetElements(treeItem.handle, children); + return children; + }, err => this.messageService.show(Severity.Error, err)); + } + + refresh(treeItemHandle?: number) { + if (treeItemHandle) { + let treeItem = this.itemsMap.get(treeItemHandle); + if (treeItem) { + this._onDidChange.fire(treeItem); + } + } else { + this._onDidChange.fire(); + } + } + + private clearChildren(treeItemHandle: TreeItemHandle): void { + const children = this.childrenMap.get(treeItemHandle); + if (children) { + for (const child of children) { + this.clearChildren(child); + this.itemsMap.delete(child); + } + this.childrenMap.delete(treeItemHandle); + } + } + + private postGetElements(parent: TreeItemHandle, children: ITreeItem[]) { + this.setElements(parent, children); + } + + private setElements(parent: TreeItemHandle, children: ITreeItem[]) { + if (children && children.length) { + for (const child of children) { + this.itemsMap.set(child.handle, child); + if (child.children && child.children.length) { + this.setElements(child.handle, child.children); + } + } + if (parent) { + this.childrenMap.set(parent, children.map(child => child.handle)); + } + } + } + + private populateElementsToExpand(elements: ITreeItem[], toExpand: ITreeItem[]) { + for (const element of elements) { + if (element.collapsibleState === TreeItemCollapsibleState.Expanded) { + toExpand.push(element); + if (element.children && element.children.length) { + this.populateElementsToExpand(element.children, toExpand); + } + } + } + } +} \ No newline at end of file diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index b1e56a9c7e1..a9cf6c35ce8 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -18,7 +18,7 @@ import { ExtHostDocuments } from 'vs/workbench/api/node/extHostDocuments'; import { ExtHostDocumentSaveParticipant } from 'vs/workbench/api/node/extHostDocumentSaveParticipant'; import { ExtHostConfiguration } from 'vs/workbench/api/node/extHostConfiguration'; import { ExtHostDiagnostics } from 'vs/workbench/api/node/extHostDiagnostics'; -import { ExtHostExplorerView } from 'vs/workbench/api/node/extHostExplorerView'; +import { ExtHostTreeViews } from 'vs/workbench/api/node/extHostTreeViews'; import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace'; import { ExtHostQuickOpen } from 'vs/workbench/api/node/extHostQuickOpen'; import { ExtHostProgress } from 'vs/workbench/api/node/extHostProgress'; @@ -111,7 +111,7 @@ export function createApiFactory( const extHostDocumentSaveParticipant = col.define(ExtHostContext.ExtHostDocumentSaveParticipant).set(new ExtHostDocumentSaveParticipant(extHostDocuments, threadService.get(MainContext.MainThreadWorkspace))); const extHostEditors = col.define(ExtHostContext.ExtHostEditors).set(new ExtHostEditors(threadService, extHostDocumentsAndEditors)); const extHostCommands = col.define(ExtHostContext.ExtHostCommands).set(new ExtHostCommands(threadService, extHostHeapService)); - const extHostExplorerView = col.define(ExtHostContext.ExtHostExplorerView).set(new ExtHostExplorerView(threadService, extHostCommands)); + const extHostTreeViews = col.define(ExtHostContext.ExtHostTreeViews).set(new ExtHostTreeViews(threadService, extHostCommands)); const extHostConfiguration = col.define(ExtHostContext.ExtHostConfiguration).set(new ExtHostConfiguration(threadService.get(MainContext.MainThreadConfiguration), initData.configuration)); const extHostDiagnostics = col.define(ExtHostContext.ExtHostDiagnostics).set(new ExtHostDiagnostics(threadService)); const languageFeatures = col.define(ExtHostContext.ExtHostLanguageFeatures).set(new ExtHostLanguageFeatures(threadService, extHostDocuments, extHostCommands, extHostHeapService, extHostDiagnostics)); @@ -369,8 +369,8 @@ export function createApiFactory( sampleFunction: proposedApiFunction(extension, () => { return extHostMessageService.showMessage(Severity.Info, 'Hello Proposed Api!', {}, []); }), - createExplorerView: proposedApiFunction(extension, (id: string, name: string, provider: vscode.TreeDataProvider): vscode.View => { - return extHostExplorerView.createExplorerView(id, name, provider); + registerTreeDataProvider: proposedApiFunction(extension, (id: string, treeDataProvider: vscode.TreeDataProvider): vscode.Disposable => { + return extHostTreeViews.registerTreeDataProvider(id, treeDataProvider); }) }; @@ -533,6 +533,7 @@ export function createApiFactory( ViewColumn: extHostTypes.ViewColumn, WorkspaceEdit: extHostTypes.WorkspaceEdit, ProgressLocation: extHostTypes.ProgressLocation, + TreeItemCollapsibleState: extHostTypes.TreeItemCollapsibleState, // functions FileLocationKind: extHostTypes.FileLocationKind, ApplyToKind: extHostTypes.ApplyToKind, diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 1f602e9ac5f..df7977297c3 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -194,17 +194,17 @@ export abstract class MainThreadEditorsShape { $getDiffInformation(id: string): TPromise { throw ni(); } } -export interface ITreeNode { - id: string; - label: string; - hasChildren: boolean; - clickCommand: string; - contextKey: string; +export interface TreeItem extends vscode.TreeItem { + handle: number; + commandId?: string; + icon?: string; + iconDark?: string; + children?: TreeItem[]; } -export abstract class MainThreadExplorerViewShape { - $registerView(id: string, name: string): void { throw ni(); } - $refresh(viewId: string, node: ITreeNode): void { throw ni(); } +export abstract class MainThreadTreeViewsShape { + $registerView(treeViewId: string): void { throw ni(); } + $refresh(treeViewId: string, treeItemHandle?: number): void { throw ni(); } } export abstract class MainThreadErrorsShape { @@ -408,11 +408,15 @@ export abstract class ExtHostDocumentsAndEditorsShape { $acceptDocumentsAndEditorsDelta(delta: IDocumentsAndEditorsDelta): void { throw ni(); } } +export type TreeViewCommandArg = { + treeViewId: string, + treeItemHandle: number +}; -export abstract class ExtHostExplorerViewShape { - $provideRootNode(viewId: string): TPromise { throw ni(); }; - $resolveChildren(viewId: string, node: ITreeNode): TPromise { throw ni(); } - $getInternalCommand(viewId: string, node: ITreeNode): TPromise { throw ni(); } +export abstract class ExtHostTreeViewsShape { + $getElements(treeViewId: string): TPromise { throw ni(); } + $getChildren(treeViewId: string, treeItemHandle: number): TPromise { throw ni(); } + $restore(treeViewId: string, treeItems: TreeItem[]): TPromise { throw ni(); } } export abstract class ExtHostExtensionServiceShape { @@ -503,7 +507,7 @@ export const MainContext = { MainThreadDocuments: createMainId('MainThreadDocuments', MainThreadDocumentsShape), MainThreadEditors: createMainId('MainThreadEditors', MainThreadEditorsShape), MainThreadErrors: createMainId('MainThreadErrors', MainThreadErrorsShape), - MainThreadExplorerViews: createMainId('MainThreadExplorerView', MainThreadExplorerViewShape), + MainThreadTreeViews: createMainId('MainThreadTreeViews', MainThreadTreeViewsShape), MainThreadLanguageFeatures: createMainId('MainThreadLanguageFeatures', MainThreadLanguageFeaturesShape), MainThreadLanguages: createMainId('MainThreadLanguages', MainThreadLanguagesShape), MainThreadMessageService: createMainId('MainThreadMessageService', MainThreadMessageServiceShape), @@ -528,7 +532,7 @@ export const ExtHostContext = { ExtHostDocuments: createExtId('ExtHostDocuments', ExtHostDocumentsShape), ExtHostDocumentSaveParticipant: createExtId('ExtHostDocumentSaveParticipant', ExtHostDocumentSaveParticipantShape), ExtHostEditors: createExtId('ExtHostEditors', ExtHostEditorsShape), - ExtHostExplorerView: createExtId('ExtHostExplorerView', ExtHostExplorerViewShape), + ExtHostTreeViews: createExtId('ExtHostTreeViews', ExtHostTreeViewsShape), ExtHostFileSystemEventService: createExtId('ExtHostFileSystemEventService', ExtHostFileSystemEventServiceShape), ExtHostHeapService: createExtId('ExtHostHeapMonitor', ExtHostHeapServiceShape), ExtHostLanguageFeatures: createExtId('ExtHostLanguageFeatures', ExtHostLanguageFeaturesShape), diff --git a/src/vs/workbench/api/node/extHostExplorerView.ts b/src/vs/workbench/api/node/extHostExplorerView.ts deleted file mode 100644 index cb2bd09645b..00000000000 --- a/src/vs/workbench/api/node/extHostExplorerView.ts +++ /dev/null @@ -1,163 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { localize } from 'vs/nls'; -import { View, TreeDataProvider } from 'vscode'; -import { defaultGenerator } from 'vs/base/common/idGenerator'; -import { TPromise } from 'vs/base/common/winjs.base'; -import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; -import { MainContext, ExtHostExplorerViewShape, MainThreadExplorerViewShape, ITreeNode } from './extHost.protocol'; -import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; -import { asWinJsPromise } from 'vs/base/common/async'; -import * as modes from 'vs/editor/common/modes'; - -class TreeNodeImpl implements ITreeNode { - - readonly id: string; - label: string; - hasChildren: boolean; - clickCommand: string = null; - contextKey: string; - - constructor(readonly providerId: string, node: any, provider: TreeDataProvider) { - this.id = defaultGenerator.nextId(); - this.label = provider.getLabel ? provider.getLabel(node) : node.toString(); - this.hasChildren = provider.getHasChildren ? provider.getHasChildren(node) : true; - this.contextKey = provider.getContextKey ? provider.getContextKey(node) : null; - if (provider.getClickCommand) { - const command = provider.getClickCommand(node); - if (command) { - this.clickCommand = command.command; - } - } - } -} - -export class ExtHostExplorerView extends ExtHostExplorerViewShape { - private _proxy: MainThreadExplorerViewShape; - - private _extNodeProviders: { [providerId: string]: TreeDataProvider }; - private _extViews: Map> = new Map>(); - private _extNodeMaps: { [providerId: string]: { [id: string]: ITreeNode } }; - private _mainNodesMap: Map>; - private _childrenNodesMap: Map>; - - constructor( - threadService: IThreadService, - private commands: ExtHostCommands - ) { - super(); - - this._proxy = threadService.get(MainContext.MainThreadExplorerViews); - - this._extNodeProviders = Object.create(null); - this._extNodeMaps = Object.create(null); - this._mainNodesMap = new Map>(); - this._childrenNodesMap = new Map>(); - - commands.registerArgumentProcessor({ - processArgument: arg => { - if (arg && arg.providerId && arg.id) { - const extNodeMap = this._extNodeMaps[arg.providerId]; - return extNodeMap[arg.id]; - } - return arg; - } - }); - } - - createExplorerView(viewId: string, viewName: string, provider: TreeDataProvider): View { - this._proxy.$registerView(viewId, viewName); - this._extNodeProviders[viewId] = provider; - this._mainNodesMap.set(viewId, new Map()); - this._childrenNodesMap.set(viewId, new Map()); - - const treeView: View = { - refresh: (node: T) => { - const mainThreadNode = this._mainNodesMap.get(viewId).get(node); - this._proxy.$refresh(viewId, mainThreadNode); - }, - dispose: () => { - delete this._extNodeProviders[viewId]; - delete this._extNodeProviders[viewId]; - this._mainNodesMap.delete(viewId); - this._childrenNodesMap.delete(viewId); - this._extViews.delete(viewId); - } - }; - this._extViews.set(viewId, treeView); - return treeView; - } - - $provideRootNode(providerId: string): TPromise { - const provider = this._extNodeProviders[providerId]; - if (!provider) { - const errMessage = localize('treeExplorer.notRegistered', 'No TreeExplorerNodeProvider with id \'{0}\' registered.', providerId); - return TPromise.wrapError(errMessage); - } - - return asWinJsPromise(() => provider.provideRootNode()).then(extRootNode => { - const extNodeMap: { [id: string]: ITreeNode } = Object.create(null); - const internalRootNode = new TreeNodeImpl(providerId, extRootNode, provider); - - extNodeMap[internalRootNode.id] = extRootNode; - this._extNodeMaps[providerId] = extNodeMap; - - this._mainNodesMap.get(providerId).set(extRootNode, internalRootNode); - - return internalRootNode; - }, err => { - const errMessage = localize('treeExplorer.failedToProvideRootNode', 'TreeExplorerNodeProvider \'{0}\' failed to provide root node.', providerId); - return TPromise.wrapError(errMessage); - }); - } - - $resolveChildren(providerId: string, mainThreadNode: ITreeNode): TPromise { - const provider = this._extNodeProviders[providerId]; - if (!provider) { - const errMessage = localize('treeExplorer.notRegistered', 'No TreeExplorerNodeProvider with id \'{0}\' registered.', providerId); - return TPromise.wrapError(errMessage); - } - - const extNodeMap = this._extNodeMaps[providerId]; - const extNode = extNodeMap[mainThreadNode.id]; - - const currentChildren = this._childrenNodesMap.get(providerId).get(extNode); - if (currentChildren) { - for (const child of currentChildren) { - this._mainNodesMap.get(providerId).delete(child); - } - } - - return asWinJsPromise(() => provider.resolveChildren(extNode)).then(children => { - return children.map(extChild => { - const internalChild = new TreeNodeImpl(providerId, extChild, provider); - extNodeMap[internalChild.id] = extChild; - this._mainNodesMap.get(providerId).set(extChild, internalChild); - return internalChild; - }); - }); - } - - // Convert the command on the ExtHost side so we can pass the original externalNode to the registered handler - $getInternalCommand(providerId: string, mainThreadNode: ITreeNode): TPromise { - const commandConverter = this.commands.converter; - - if (mainThreadNode.clickCommand) { - const extNode = this._extNodeMaps[providerId][mainThreadNode.id]; - - const internalCommand = commandConverter.toInternal({ - title: '', - command: mainThreadNode.clickCommand, - arguments: [extNode] - }); - - return TPromise.wrap(internalCommand); - } - - return TPromise.as(null); - } -} \ No newline at end of file diff --git a/src/vs/workbench/api/node/extHostTreeViews.ts b/src/vs/workbench/api/node/extHostTreeViews.ts new file mode 100644 index 00000000000..bbfde013ddd --- /dev/null +++ b/src/vs/workbench/api/node/extHostTreeViews.ts @@ -0,0 +1,210 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { localize } from 'vs/nls'; +import * as vscode from 'vscode'; +import URI from 'vs/base/common/uri'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; +import { MainContext, ExtHostTreeViewsShape, MainThreadTreeViewsShape, TreeItem, TreeViewCommandArg } from './extHost.protocol'; +import { TreeItemCollapsibleState } from './extHostTypes'; +import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; +import { asWinJsPromise } from 'vs/base/common/async'; +import * as modes from 'vs/editor/common/modes'; + +type TreeItemHandle = number; + +export class ExtHostTreeViews extends ExtHostTreeViewsShape { + + private treeViews: Map> = new Map>(); + private _proxy: MainThreadTreeViewsShape; + + constructor( + threadService: IThreadService, + private commands: ExtHostCommands + ) { + super(); + this._proxy = threadService.get(MainContext.MainThreadTreeViews); + commands.registerArgumentProcessor({ + processArgument: arg => { + if (arg && arg.treeViewId && arg.treeItemHandle) { + return this.convertArgument(arg); + } + return arg; + } + }); + } + + registerTreeDataProvider(id: string, treeDataProvider: vscode.TreeDataProvider): vscode.Disposable { + const treeView = new ExtHostTreeView(id, treeDataProvider, this._proxy); + this.treeViews.set(id, treeView); + return { + dispose: () => { + this.treeViews.delete(id); + treeView.dispose(); + } + }; + } + + $getElements(treeViewId: string): TPromise { + const treeView = this.treeViews.get(treeViewId); + if (!treeView) { + return TPromise.wrapError(localize('treeView.notRegistered', 'No tree view with id \'{0}\' registered.', treeViewId)); + } + return treeView.getTreeItems(); + } + + $getChildren(treeViewId: string, treeItemHandle?: number): TPromise { + const treeView = this.treeViews.get(treeViewId); + if (!treeView) { + return TPromise.wrapError(localize('treeView.notRegistered', 'No tree view with id \'{0}\' registered.', treeViewId)); + } + return treeView.getChildren(treeItemHandle); + } + + private convertArgument(arg: TreeViewCommandArg): any { + const treeView = this.treeViews.get(arg.treeViewId); + if (!treeView) { + return TPromise.wrapError(localize('treeView.notRegistered', 'No tree view with id \'{0}\' registered.', arg.treeViewId)); + } + return treeView.getExtensionElement(arg.treeItemHandle); + } +} + +class ExtHostTreeView extends Disposable { + + private _itemHandlePool = 0; + + private extElementsMap: Map = new Map(); + private itemHandlesMap: Map = new Map(); + private extChildrenElementsMap: Map = new Map(); + + constructor(private viewId: string, private dataProvider: vscode.TreeDataProvider, private proxy: MainThreadTreeViewsShape) { + super(); + this.proxy.$registerView(viewId); + this._register(dataProvider.onDidChange(element => this._refresh(element))); + } + + getTreeItems(): TPromise { + this.extChildrenElementsMap.clear(); + this.extElementsMap.clear(); + this.itemHandlesMap.clear(); + + return asWinJsPromise(() => this.dataProvider.getChildren()) + .then(elements => this.processAndMapElements(elements)); + } + + getChildren(treeItemHandle: TreeItemHandle): TPromise { + let extElement = this.getExtensionElement(treeItemHandle); + if (extElement) { + this.clearChildren(extElement); + } else { + return TPromise.wrapError(localize('treeItem.notFound', 'No tree item with id \'{0}\' found.', treeItemHandle)); + } + + return asWinJsPromise(() => this.dataProvider.getChildren(extElement)) + .then(childrenElements => this.processAndMapElements(childrenElements)); + } + + getExtensionElement(treeItemHandle: TreeItemHandle): T { + return this.extElementsMap.get(treeItemHandle); + } + + private _refresh(element: T): void { + if (element) { + const itemHandle = this.itemHandlesMap.get(element); + if (itemHandle) { + this.proxy.$refresh(this.viewId, itemHandle); + } + } else { + this.proxy.$refresh(this.viewId); + } + } + + private processAndMapElements(elements: T[]): TPromise { + const treeItemsPromises: TPromise[] = []; + for (const element of elements) { + if (this.extChildrenElementsMap.has(element)) { + return TPromise.wrapError(localize('treeView.duplicateElement', 'Element {0} is already registered', element)); + } + const treeItem = this.massageTreeItem(this.dataProvider.getTreeItem(element)); + this.itemHandlesMap.set(element, treeItem.handle); + this.extElementsMap.set(treeItem.handle, element); + if (treeItem.collapsibleState === TreeItemCollapsibleState.Expanded) { + treeItemsPromises.push(this.getChildren(treeItem.handle).then(children => { + treeItem.children = children; + return treeItem; + })); + } else { + treeItemsPromises.push(TPromise.as(treeItem)); + } + } + return TPromise.join(treeItemsPromises); + } + + private massageTreeItem(extensionTreeItem: vscode.TreeItem): TreeItem { + return { + handle: ++this._itemHandlePool, + label: extensionTreeItem.label, + commandId: extensionTreeItem.command ? extensionTreeItem.command.command : void 0, + contextValue: extensionTreeItem.contextValue, + icon: this.getLightIconPath(extensionTreeItem), + iconDark: this.getDarkIconPath(extensionTreeItem), + collapsibleState: extensionTreeItem.collapsibleState, + }; + } + + private getLightIconPath(extensionTreeItem: vscode.TreeItem) { + if (extensionTreeItem.iconPath) { + if (typeof extensionTreeItem.iconPath === 'string' || extensionTreeItem.iconPath instanceof URI) { + return this.getIconPath(extensionTreeItem.iconPath); + } + return this.getIconPath(extensionTreeItem.iconPath['light']); + } + return void 0; + } + + private getDarkIconPath(extensionTreeItem: vscode.TreeItem) { + if (extensionTreeItem.iconPath && extensionTreeItem.iconPath['dark']) { + return this.getIconPath(extensionTreeItem.iconPath['dark']); + } + return void 0; + } + + private getIconPath(iconPath: string | URI): string { + if (iconPath instanceof URI) { + return iconPath.toString(); + } + return URI.file(iconPath).toString(); + } + + private clearChildren(extElement: T): void { + const children = this.extChildrenElementsMap.get(extElement); + if (children) { + for (const child of children) { + this.clearElement(child); + } + this.extChildrenElementsMap.delete(extElement); + } + } + + private clearElement(extElement: T): void { + this.clearChildren(extElement); + + const treeItemhandle = this.itemHandlesMap.get(extElement); + this.itemHandlesMap.delete(extElement); + if (treeItemhandle) { + this.extElementsMap.delete(treeItemhandle); + } + } + + dispose() { + this.extElementsMap.clear(); + this.itemHandlesMap.clear(); + this.extChildrenElementsMap.clear(); + } +} \ No newline at end of file diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index e52b04efaa4..1c10cc26251 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1265,3 +1265,8 @@ export enum ProgressLocation { SourceControl = 1, Window = 10, } + +export enum TreeItemCollapsibleState { + Collapsed = 1, + Expanded = 2 +} diff --git a/src/vs/workbench/browser/viewlet.ts b/src/vs/workbench/browser/viewlet.ts index b6b84f4b4c8..01ef125d238 100644 --- a/src/vs/workbench/browser/viewlet.ts +++ b/src/vs/workbench/browser/viewlet.ts @@ -295,6 +295,8 @@ export interface IViewletView extends IView, IThemable { getActions(): IAction[]; getSecondaryActions(): IAction[]; getActionItem(action: IAction): IActionItem; + showHeader(): boolean; + hideHeader(): boolean; shutdown(): void; focusBody(): void; isExpanded(): boolean; @@ -319,20 +321,26 @@ export abstract class AdaptiveCollapsibleViewletView extends FixedCollapsibleVie initialBodySize: number, collapsed: boolean, private viewName: string, - private keybindingService: IKeybindingService, + protected keybindingService: IKeybindingService, protected contextMenuService: IContextMenuService ) { super({ expandedBodySize: initialBodySize, - headerSize: 22, initialState: collapsed ? CollapsibleState.COLLAPSED : CollapsibleState.EXPANDED, - ariaHeaderLabel: viewName + ariaHeaderLabel: viewName, + headerSize: 22, }); this.actionRunner = actionRunner; this.toDispose = []; } + protected changeState(state: CollapsibleState): void { + updateTreeVisibility(this.tree, state === CollapsibleState.EXPANDED); + + super.changeState(state); + } + public create(): TPromise { return TPromise.as(null); } @@ -347,7 +355,7 @@ export abstract class AdaptiveCollapsibleViewletView extends FixedCollapsibleVie getKeyBinding: (action) => this.keybindingService.lookupKeybinding(action.id) }); this.toolBar.actionRunner = this.actionRunner; - this.toolBar.setActions(prepareActions(this.getActions()), prepareActions(this.getSecondaryActions()))(); + this.updateActions(); // Expand on drag over this.dragHandler = new DelayedDragHandler(container, () => { @@ -357,10 +365,8 @@ export abstract class AdaptiveCollapsibleViewletView extends FixedCollapsibleVie }); } - protected changeState(state: CollapsibleState): void { - updateTreeVisibility(this.tree, state === CollapsibleState.EXPANDED); - - super.changeState(state); + protected updateActions(): void { + this.toolBar.setActions(prepareActions(this.getActions()), prepareActions(this.getSecondaryActions()))(); } protected renderViewTree(container: HTMLElement): HTMLElement { @@ -446,7 +452,7 @@ export abstract class CollapsibleViewletView extends CollapsibleView implements headerSize?: number ) { super({ - minimumSize: 2 * 22, + minimumSize: 5 * 22, initialState: collapsed ? CollapsibleState.COLLAPSED : CollapsibleState.EXPANDED, ariaHeaderLabel: viewName, headerSize @@ -476,7 +482,7 @@ export abstract class CollapsibleViewletView extends CollapsibleView implements getKeyBinding: (action) => this.keybindingService.lookupKeybinding(action.id) }); this.toolBar.actionRunner = this.actionRunner; - this.toolBar.setActions(prepareActions(this.getActions()), prepareActions(this.getSecondaryActions()))(); + this.updateActions(); // Expand on drag over this.dragHandler = new DelayedDragHandler(container, () => { @@ -486,6 +492,10 @@ export abstract class CollapsibleViewletView extends CollapsibleView implements }); } + protected updateActions(): void { + this.toolBar.setActions(prepareActions(this.getActions()), prepareActions(this.getSecondaryActions()))(); + } + protected renderViewTree(container: HTMLElement): HTMLElement { return renderViewTree(container); } diff --git a/src/vs/workbench/electron-browser/workbench.main.ts b/src/vs/workbench/electron-browser/workbench.main.ts index 07b48d526c9..ae9d791d648 100644 --- a/src/vs/workbench/electron-browser/workbench.main.ts +++ b/src/vs/workbench/electron-browser/workbench.main.ts @@ -18,6 +18,9 @@ import 'vs/editor/browser/editor.all'; // Menus/Actions import 'vs/platform/actions/electron-browser/menusExtensionPoint'; +// Views +import 'vs/workbench/parts/views/browser/viewsExtensionPoint'; + // Workbench import 'vs/workbench/browser/actions/toggleActivityBarVisibility'; import 'vs/workbench/browser/actions/toggleStatusbarVisibility'; @@ -64,8 +67,6 @@ import 'vs/workbench/parts/extensions/electron-browser/extensionsViewlet'; // ca import 'vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution'; -import 'vs/workbench/parts/explorers/browser/explorer.contribution'; - import 'vs/workbench/parts/output/browser/output.contribution'; import 'vs/workbench/parts/output/browser/outputPanel'; // can be packaged separately diff --git a/src/vs/workbench/parts/explorers/browser/explorer.contribution.ts b/src/vs/workbench/parts/explorers/browser/explorer.contribution.ts deleted file mode 100644 index 2c3a9eecbf0..00000000000 --- a/src/vs/workbench/parts/explorers/browser/explorer.contribution.ts +++ /dev/null @@ -1,10 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { IExplorerViewsService } from 'vs/workbench/parts/explorers/common/explorer'; -import { ExplorerViewsService } from 'vs/workbench/parts/explorers/browser/explorerView'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; - -registerSingleton(IExplorerViewsService, ExplorerViewsService); \ No newline at end of file diff --git a/src/vs/workbench/parts/explorers/browser/media/Refresh.svg b/src/vs/workbench/parts/explorers/browser/media/Refresh.svg deleted file mode 100644 index e0345748192..00000000000 --- a/src/vs/workbench/parts/explorers/browser/media/Refresh.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/explorers/browser/media/Refresh_inverse.svg b/src/vs/workbench/parts/explorers/browser/media/Refresh_inverse.svg deleted file mode 100644 index d79fdaa4e8e..00000000000 --- a/src/vs/workbench/parts/explorers/browser/media/Refresh_inverse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.ts b/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.ts deleted file mode 100644 index c55073b1027..00000000000 --- a/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.ts +++ /dev/null @@ -1,120 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import 'vs/css!./media/treeExplorer.contribution'; - -import { localize } from 'vs/nls'; -import { join } from 'vs/base/common/paths'; -import { createCSSRule } from 'vs/base/browser/dom'; -import { Registry } from 'vs/platform/platform'; -import { ExtensionsRegistry } from 'vs/platform/extensions/common/extensionsRegistry'; -import { IJSONSchema } from 'vs/base/common/jsonSchema'; -import { ITreeExplorerService } from 'vs/workbench/parts/explorers/common/treeExplorerService'; -import { TreeExplorerService } from 'vs/workbench/parts/explorers/browser/treeExplorerService'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor, ToggleViewletAction } from 'vs/workbench/browser/viewlet'; -import { ITreeExplorer } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { toViewletId, toViewletCSSClass, isValidViewletId } from 'vs/workbench/parts/explorers/common/treeExplorer'; -import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; -import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actionRegistry'; -import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; -import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; - -registerSingleton(ITreeExplorerService, TreeExplorerService); - -const viewSchema: IJSONSchema = { - description: localize('vscode.extension.contributes.view', 'Contributes custom view'), - type: 'object', - properties: { - id: { - description: localize('vscode.extension.contributes.view.id', 'Unique id used to identify view created through vscode.workspace.createTreeView'), - type: 'string' - }, - label: { - description: localize('vscode.extension.contributes.view.label', 'Human readable string used to render the view'), - type: 'string' - }, - icon: { - description: localize('vscode.extension.contributes.view.icon', 'Path to the view icon'), - type: 'string' - } - } -}; - -const viewsSchema: IJSONSchema = { - description: localize('vscode.extension.contributes.views', 'Contributes custom views'), - type: 'object', - items: viewSchema -}; - -export class OpenViewletAction extends ToggleViewletAction { - - constructor( - id: string, - label: string, - @IViewletService viewletService: IViewletService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService - ) { - super(id, label, id, viewletService, editorService); - } -} - -export class ExtensionExplorersContribtion implements IWorkbenchContribution { - - constructor() { - this.init(); - } - - public getId(): string { - return 'vs.extension.view'; - } - - private init() { - ExtensionsRegistry.registerExtensionPoint('views', [], viewsSchema).setHandler(extensions => { - for (let extension of extensions) { - for (const { id, label, icon } of extension.value) { - if (!isValidViewletId(id)) { - console.warn(`Tree view extension '${label}' has invalid id and failed to activate.`); - continue; - } - - const viewletId = toViewletId(id); - const viewletCSSClass = toViewletCSSClass(id); - - // Generate CSS to show the icon in the activity bar - if (icon) { - const iconClass = `.monaco-workbench > .activitybar .monaco-action-bar .action-label.${viewletCSSClass}`; - const iconPath = join(extension.description.extensionFolderPath, icon); - - createCSSRule(iconClass, `-webkit-mask: url('${iconPath}') no-repeat 50% 50%`); - } - - // Register action to open the viewlet - const registry = Registry.as(ActionExtensions.WorkbenchActions); - registry.registerWorkbenchAction( - new SyncActionDescriptor(OpenViewletAction, viewletId, localize('showViewlet', "Show {0}", label)), - 'View: Show {0}', - localize('view', "View") - ); - - // Register as viewlet - Registry.as(ViewletExtensions.Viewlets).registerViewlet(new ViewletDescriptor( - 'vs/workbench/parts/explorers/browser/treeExplorerViewlet', - 'TreeExplorerViewlet', - viewletId, - label, - viewletCSSClass, - -1, - extension.description.id - )); - } - } - }); - } -} - -Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(ExtensionExplorersContribtion); \ No newline at end of file diff --git a/src/vs/workbench/parts/explorers/browser/treeExplorerActions.ts b/src/vs/workbench/parts/explorers/browser/treeExplorerActions.ts deleted file mode 100644 index 04103edf29f..00000000000 --- a/src/vs/workbench/parts/explorers/browser/treeExplorerActions.ts +++ /dev/null @@ -1,21 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { TPromise } from 'vs/base/common/winjs.base'; -import * as nls from 'vs/nls'; -import { Action } from 'vs/base/common/actions'; -import { TreeExplorerView } from 'vs/workbench/parts/explorers/browser/views/treeExplorerView'; -import { toViewletActionId } from 'vs/workbench/parts/explorers/common/treeExplorer'; - -export class RefreshViewExplorerAction extends Action { - - constructor(view: TreeExplorerView) { - super(toViewletActionId('refresh'), nls.localize('refresh', "Refresh"), 'extensionViewlet-action toggle', true, () => { - view.updateInput(); - return TPromise.as(null); - }); - } -} diff --git a/src/vs/workbench/parts/explorers/browser/treeExplorerMenus.ts b/src/vs/workbench/parts/explorers/browser/treeExplorerMenus.ts deleted file mode 100644 index 4fa05c578f7..00000000000 --- a/src/vs/workbench/parts/explorers/browser/treeExplorerMenus.ts +++ /dev/null @@ -1,100 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import Event, { Emitter } from 'vs/base/common/event'; -import { IDisposable, dispose, empty as EmptyDisposable, toDisposable } from 'vs/base/common/lifecycle'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { IMenuService, MenuId } from 'vs/platform/actions/common/actions'; -import { IAction } from 'vs/base/common/actions'; -import { fillInActions } from 'vs/platform/actions/browser/menuItemActionItem'; -import { ITreeExplorerService } from 'vs/workbench/parts/explorers/common/treeExplorerService'; - - -export class TreeExplorerMenus implements IDisposable { - - private disposables: IDisposable[] = []; - - private activeProviderId: string; - private titleDisposable: IDisposable = EmptyDisposable; - private titleActions: IAction[] = []; - private titleSecondaryActions: IAction[] = []; - - private _onDidChangeTitle = new Emitter(); - get onDidChangeTitle(): Event { return this._onDidChangeTitle.event; } - - constructor( - @IContextKeyService private contextKeyService: IContextKeyService, - @ITreeExplorerService private treeExplorerService: ITreeExplorerService, - @IMenuService private menuService: IMenuService - ) { - this.setActiveProvider(this.treeExplorerService.activeProvider); - this.treeExplorerService.onDidChangeProvider(this.setActiveProvider, this, this.disposables); - } - - private setActiveProvider(activeProvider: string | undefined): void { - if (this.titleDisposable) { - this.titleDisposable.dispose(); - this.titleDisposable = EmptyDisposable; - } - - if (!activeProvider) { - return; - } - - this.activeProviderId = activeProvider; - - const titleMenu = this.menuService.createMenu(MenuId.ViewTitle, this.contextKeyService); - const updateActions = () => { - this.titleActions = []; - this.titleSecondaryActions = []; - fillInActions(titleMenu, null, { primary: this.titleActions, secondary: this.titleSecondaryActions }); - this._onDidChangeTitle.fire(); - }; - - const listener = titleMenu.onDidChange(updateActions); - updateActions(); - - this.titleDisposable = toDisposable(() => { - listener.dispose(); - titleMenu.dispose(); - this.titleActions = []; - this.titleSecondaryActions = []; - }); - } - - getTitleActions(): IAction[] { - return this.titleActions; - } - - getTitleSecondaryActions(): IAction[] { - return this.titleSecondaryActions; - } - - getResourceContextActions(): IAction[] { - return this.getActions(MenuId.ViewResource).secondary; - } - - private getActions(menuId: MenuId): { primary: IAction[]; secondary: IAction[]; } { - if (!this.activeProviderId) { - return { primary: [], secondary: [] }; - } - - const menu = this.menuService.createMenu(menuId, this.contextKeyService); - const primary = []; - const secondary = []; - const result = { primary, secondary }; - fillInActions(menu, { shouldForwardArgs: true }, result, g => g === 'inline'); - - menu.dispose(); - - return result; - } - - dispose(): void { - this.disposables = dispose(this.disposables); - } -} diff --git a/src/vs/workbench/parts/explorers/browser/treeExplorerService.ts b/src/vs/workbench/parts/explorers/browser/treeExplorerService.ts deleted file mode 100644 index 649fa221e2a..00000000000 --- a/src/vs/workbench/parts/explorers/browser/treeExplorerService.ts +++ /dev/null @@ -1,85 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import Event, { Emitter } from 'vs/base/common/event'; -import { localize } from 'vs/nls'; -import { TPromise } from 'vs/base/common/winjs.base'; -import { IMessageService, Severity } from 'vs/platform/message/common/message'; -import { InternalTreeNode, InternalTreeNodeProvider } from 'vs/workbench/parts/explorers/common/treeExplorerViewModel'; -import { ITreeExplorerService } from 'vs/workbench/parts/explorers/common/treeExplorerService'; -import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; - -export class TreeExplorerService implements ITreeExplorerService { - public _serviceBrand: any; - - private _activeProvider: string; - private activeProviderContextKey: IContextKey; - - private _onDidChangeProvider = new Emitter(); - get onDidChangeProvider(): Event { return this._onDidChangeProvider.event; } - - private _onTreeExplorerNodeProviderRegistered = new Emitter(); - public get onTreeExplorerNodeProviderRegistered(): Event { return this._onTreeExplorerNodeProviderRegistered.event; }; - - private _treeExplorerNodeProviders: { [providerId: string]: InternalTreeNodeProvider }; - - constructor( - @IContextKeyService private contextKeyService: IContextKeyService, - @IMessageService private messageService: IMessageService - ) { - this._treeExplorerNodeProviders = Object.create(null); - this.activeProviderContextKey = this.contextKeyService.createKey('view', void 0); - } - - get activeProvider(): string { - return this._activeProvider; - } - - set activeProvider(provider: string) { - if (!provider) { - throw new Error('invalid provider'); - } - - this._activeProvider = provider; - this.activeProviderContextKey.set(provider ? provider : void 0); - - this._onDidChangeProvider.fire(provider); - } - - public registerTreeExplorerNodeProvider(providerId: string, provider: InternalTreeNodeProvider): void { - this._treeExplorerNodeProviders[providerId] = provider; - this._onTreeExplorerNodeProviderRegistered.fire(providerId); - } - - public hasProvider(providerId: string): boolean { - return !!this._treeExplorerNodeProviders[providerId]; - } - - public provideRootNode(providerId: string): TPromise { - const provider = this.getProvider(providerId); - return TPromise.wrap(provider.provideRootNode()); - } - - public resolveChildren(providerId: string, node: InternalTreeNode): TPromise { - const provider = this.getProvider(providerId); - return TPromise.wrap(provider.resolveChildren(node)); - } - - public executeCommand(providerId: string, node: InternalTreeNode): TPromise { - const provider = this.getProvider(providerId); - return TPromise.wrap(provider.executeCommand(node)); - } - - public getProvider(providerId: string): InternalTreeNodeProvider { - const provider = this._treeExplorerNodeProviders[providerId]; - - if (!provider) { - this.messageService.show(Severity.Error, localize('treeExplorer.noMatchingProviderId', 'No TreeExplorerNodeProvider with id {providerId} registered.')); - } - - return provider; - } -} diff --git a/src/vs/workbench/parts/explorers/browser/treeExplorerViewlet.ts b/src/vs/workbench/parts/explorers/browser/treeExplorerViewlet.ts deleted file mode 100644 index 51a384bf51c..00000000000 --- a/src/vs/workbench/parts/explorers/browser/treeExplorerViewlet.ts +++ /dev/null @@ -1,102 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { TPromise } from 'vs/base/common/winjs.base'; -import { Builder, Dimension } from 'vs/base/browser/builder'; -import { Orientation } from 'vs/base/browser/ui/splitview/splitview'; -import { IAction } from 'vs/base/common/actions'; -import { Viewlet } from 'vs/workbench/browser/viewlet'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { TreeExplorerView } from 'vs/workbench/parts/explorers/browser/views/treeExplorerView'; -import { TreeExplorerViewletState } from 'vs/workbench/parts/explorers/browser/views/treeExplorerViewer'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { attachHeaderViewStyler } from 'vs/platform/theme/common/styler'; - -export class TreeExplorerViewlet extends Viewlet { - - private viewletContainer: Builder; - private view: TreeExplorerView; - - private viewletState: TreeExplorerViewletState; - private viewletId: string; - private treeNodeProviderId: string; - - constructor( - viewletId: string, - @ITelemetryService telemetryService: ITelemetryService, - @IInstantiationService private instantiationService: IInstantiationService, - @IThemeService themeService: IThemeService - ) { - super(viewletId, telemetryService, themeService); - - this.viewletState = new TreeExplorerViewletState(); - this.viewletId = viewletId; - - const tokens = viewletId.split('.'); - this.treeNodeProviderId = tokens[tokens.length - 1]; - } - - public getId(): string { - return this.viewletId; - } - - public create(parent: Builder): TPromise { - super.create(parent); - - this.viewletContainer = parent.div(); - this.addTreeView(); - - return TPromise.as(null); - } - - public layout(dimension: Dimension): void { - this.view.layout(dimension.height, Orientation.VERTICAL); - } - - public setVisible(visible: boolean): TPromise { - return super.setVisible(visible).then(() => { - this.view.setVisible(visible).done(); - }); - } - - public getActions(): IAction[] { - return this.view.getActions(); - } - - private addTreeView(): void { - const headerSize = 0; // Hide header (root node) by default - - this.view = this.instantiationService.createInstance(TreeExplorerView, this.viewletState, this.treeNodeProviderId, this.getActionRunner(), headerSize); - attachHeaderViewStyler(this.view, this.themeService, { noContrastBorder: true }); - this.view.render(this.viewletContainer.getHTMLElement(), Orientation.VERTICAL); - } - - public focus(): void { - super.focus(); - - if (this.view) { - this.view.focusBody(); - } - } - - public shutdown(): void { - if (this.view) { - this.view.shutdown(); - } - - super.shutdown(); - } - - public dispose(): void { - if (this.view) { - this.view = null; - this.view.dispose(); - } - - super.dispose(); - } -} diff --git a/src/vs/workbench/parts/explorers/browser/views/treeExplorerView.ts b/src/vs/workbench/parts/explorers/browser/views/treeExplorerView.ts deleted file mode 100644 index 332041abe84..00000000000 --- a/src/vs/workbench/parts/explorers/browser/views/treeExplorerView.ts +++ /dev/null @@ -1,139 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import nls = require('vs/nls'); -import { TPromise } from 'vs/base/common/winjs.base'; -import * as DOM from 'vs/base/browser/dom'; -import { Builder, $ } from 'vs/base/browser/builder'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { CollapsibleViewletView } from 'vs/workbench/browser/viewlet'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { IAction, IActionRunner, IActionItem } from 'vs/base/common/actions'; -import { IMessageService } from 'vs/platform/message/common/message'; -import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IListService } from 'vs/platform/list/browser/listService'; -import { ITreeExplorerService } from 'vs/workbench/parts/explorers/common/treeExplorerService'; -import { ITree } from 'vs/base/parts/tree/browser/tree'; -import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; -import { TreeExplorerViewletState, TreeDataSource, TreeRenderer, TreeController } from 'vs/workbench/parts/explorers/browser/views/treeExplorerViewer'; -import { TreeExplorerMenus } from 'vs/workbench/parts/explorers/browser/treeExplorerMenus'; -import { RefreshViewExplorerAction } from 'vs/workbench/parts/explorers/browser/treeExplorerActions'; -import { attachListStyler } from 'vs/platform/theme/common/styler'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { createActionItem } from 'vs/platform/actions/browser/menuItemActionItem'; - -export class TreeExplorerView extends CollapsibleViewletView { - - private providerDisposables: IDisposable[]; - private menus: TreeExplorerMenus; - - constructor( - private viewletState: TreeExplorerViewletState, - private treeNodeProviderId: string, - actionRunner: IActionRunner, - headerSize: number, - @IMessageService messageService: IMessageService, - @IKeybindingService keybindingService: IKeybindingService, - @IContextMenuService contextMenuService: IContextMenuService, - @IWorkspaceContextService contextService: IWorkspaceContextService, - @IInstantiationService private instantiationService: IInstantiationService, - @ITreeExplorerService private treeExplorerService: ITreeExplorerService, - @IListService private listService: IListService, - @IThemeService private themeService: IThemeService - ) { - super(actionRunner, false, nls.localize('treeExplorerViewlet.tree', "Tree Explorer Section"), messageService, keybindingService, contextMenuService, headerSize); - this.treeExplorerService.activeProvider = treeNodeProviderId; - this.menus = this.instantiationService.createInstance(TreeExplorerMenus); - this.create(); - } - - public renderBody(container: HTMLElement): void { - this.treeContainer = super.renderViewTree(container); - DOM.addClass(this.treeContainer, 'tree-explorer-viewlet-tree-view'); - - this.tree = this.createViewer($(this.treeContainer)); - } - - public createViewer(container: Builder): ITree { - const dataSource = this.instantiationService.createInstance(TreeDataSource, this.treeNodeProviderId); - const renderer = this.instantiationService.createInstance(TreeRenderer, this.viewletState, this.actionRunner, container.getHTMLElement()); - const controller = this.instantiationService.createInstance(TreeController, this.treeNodeProviderId, this.menus); - - const tree = new Tree(container.getHTMLElement(), { - dataSource, - renderer, - controller - }, { - keyboardSupport: false - }); - - this.toDispose.push(attachListStyler(tree, this.themeService)); - this.toDispose.push(this.listService.register(tree)); - - return tree; - } - - getActions(): IAction[] { - return [...this.menus.getTitleActions(), new RefreshViewExplorerAction(this)]; - } - - getSecondaryActions(): IAction[] { - return this.menus.getTitleSecondaryActions(); - } - - getActionItem(action: IAction): IActionItem { - return createActionItem(action, this.keybindingService, this.messageService); - } - - public create(): TPromise { - return this.updateInput(); - } - - public setVisible(visible: boolean): TPromise { - return super.setVisible(visible); - } - - public updateInput(): TPromise { - if (this.treeExplorerService.hasProvider(this.treeNodeProviderId)) { - return this.updateProvider(); - } - // Provider registration happens independently of the reading of extension's contribution, - // which constructs the viewlet, so it's possible the viewlet is constructed before a provider - // is registered. - // This renders the viewlet first and wait for a corresponding provider is registered. - else { - this.treeExplorerService.onTreeExplorerNodeProviderRegistered(providerId => { - if (this.treeNodeProviderId === providerId) { - return this.updateProvider(); - } - return undefined; - }); - - return TPromise.as(null); - } - } - - public getOptimalWidth(): number { - const parentNode = this.tree.getHTMLElement(); - const childNodes = [].slice.call(parentNode.querySelectorAll('.outline-item-label > a')); - - return DOM.getLargestChildWidth(parentNode, childNodes); - } - - private updateProvider(): TPromise { - if (this.providerDisposables) { - dispose(this.providerDisposables); - } - - const provider = this.treeExplorerService.getProvider(this.treeNodeProviderId); - provider.onRefresh(node => this.tree.refresh(node)); - return this.treeExplorerService.provideRootNode(this.treeNodeProviderId).then(tree => { - this.tree.setInput(tree); - }); - } -} diff --git a/src/vs/workbench/parts/explorers/browser/views/treeExplorerViewer.ts b/src/vs/workbench/parts/explorers/browser/views/treeExplorerViewer.ts deleted file mode 100644 index a54e64d0c77..00000000000 --- a/src/vs/workbench/parts/explorers/browser/views/treeExplorerViewer.ts +++ /dev/null @@ -1,208 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { TPromise } from 'vs/base/common/winjs.base'; -import { $, Builder } from 'vs/base/browser/builder'; -import { ITree, IDataSource, IRenderer, IActionProvider, ContextMenuEvent } from 'vs/base/parts/tree/browser/tree'; -import { InternalTreeNode } from 'vs/workbench/parts/explorers/common/treeExplorerViewModel'; -import { ClickBehavior, DefaultController } from 'vs/base/parts/tree/browser/treeDefaults'; -import { IMouseEvent } from 'vs/base/browser/mouseEvent'; -import { IActionRunner, IAction, ActionRunner } from 'vs/base/common/actions'; -import { ContributableActionProvider } from 'vs/workbench/browser/actionBarRegistry'; -import { ITreeExplorerService } from 'vs/workbench/parts/explorers/common/treeExplorerService'; -import { IProgressService } from 'vs/platform/progress/common/progress'; -import { TreeExplorerMenus } from 'vs/workbench/parts/explorers/browser/treeExplorerMenus'; -import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { ResolvedKeybinding } from 'vs/base/common/keyCodes'; -import { ActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; -import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { MenuItemAction } from 'vs/platform/actions/common/actions'; - -export class TreeDataSource implements IDataSource { - - constructor( - private treeNodeProviderId: string, - @ITreeExplorerService private treeExplorerService: ITreeExplorerService, - @IProgressService private progressService: IProgressService - ) { - - } - - public getId(tree: ITree, node: InternalTreeNode): string { - return node.id.toString(); - } - - public hasChildren(tree: ITree, node: InternalTreeNode): boolean { - return node.hasChildren; - } - - public getChildren(tree: ITree, node: InternalTreeNode): TPromise { - const promise = this.treeExplorerService.resolveChildren(this.treeNodeProviderId, node); - - this.progressService.showWhile(promise, 800); - - return promise; - } - - public getParent(tree: ITree, node: InternalTreeNode): TPromise { - return TPromise.as(null); - } -} - -export interface ITreeExplorerTemplateData { - label: Builder; -} - -export class TreeRenderer implements IRenderer { - - private static ITEM_HEIGHT = 22; - private static TREE_TEMPLATE_ID = 'treeExplorer'; - - constructor( - state: TreeExplorerViewletState, - actionRunner: IActionRunner - ) { - } - - public getHeight(tree: ITree, element: any): number { - return TreeRenderer.ITEM_HEIGHT; - } - - public getTemplateId(tree: ITree, element: any): string { - return TreeRenderer.TREE_TEMPLATE_ID; - } - - public renderTemplate(tree: ITree, templateId: string, container: HTMLElement): ITreeExplorerTemplateData { - const el = $(container); - const item = $('.custom-viewlet-tree-node-item'); - item.appendTo(el); - - const label = $('.custom-viewlet-tree-node-item-label').appendTo(item); - const link = $('a.plain').appendTo(label); - - return { label: link }; - } - - public renderElement(tree: ITree, node: InternalTreeNode, templateId: string, templateData: ITreeExplorerTemplateData): void { - templateData.label.text(node.label).title(node.label); - } - - public disposeTemplate(tree: ITree, templateId: string, templateData: ITreeExplorerTemplateData): void { - } -} - -export class TreeController extends DefaultController { - - constructor( - private treeNodeProviderId: string, - private menus: TreeExplorerMenus, - @IContextMenuService private contextMenuService: IContextMenuService, - @ITreeExplorerService private treeExplorerService: ITreeExplorerService, - @IKeybindingService private _keybindingService: IKeybindingService - ) { - super({ clickBehavior: ClickBehavior.ON_MOUSE_UP /* do not change to not break DND */, keyboardSupport: false }); - } - - public onLeftClick(tree: ITree, node: InternalTreeNode, event: IMouseEvent, origin: string = 'mouse'): boolean { - super.onLeftClick(tree, node, event, origin); - - if (node.clickCommand) { - this.treeExplorerService.executeCommand(this.treeNodeProviderId, node); - } - - return true; - } - - public onContextMenu(tree: ITree, node: InternalTreeNode, event: ContextMenuEvent): boolean { - tree.setFocus(node); - const actions = this.menus.getResourceContextActions(); - if (!actions.length) { - return true; - } - const anchor = { x: event.posx + 1, y: event.posy }; - this.contextMenuService.showContextMenu({ - getAnchor: () => anchor, - - getActions: () => { - return TPromise.as(actions); - }, - - getActionItem: (action) => { - const keybinding = this._keybindingFor(action); - if (keybinding) { - return new ActionItem(action, action, { label: true, keybinding: keybinding.getLabel() }); - } - return null; - }, - - getKeyBinding: (action): ResolvedKeybinding => { - return this._keybindingFor(action); - }, - - onHide: (wasCancelled?: boolean) => { - if (wasCancelled) { - tree.DOMFocus(); - } - }, - - getActionsContext: () => node, - - actionRunner: new MultipleSelectionActionRunner(() => tree.getSelection()) - }); - - return true; - } - - private _keybindingFor(action: IAction): ResolvedKeybinding { - return this._keybindingService.lookupKeybinding(action.id); - } -} - -export interface ITreeExplorerViewletState { - actionProvider: IActionProvider; -} - -export class TreeExplorerActionProvider extends ContributableActionProvider { - private state: TreeExplorerViewletState; - - constructor(state: TreeExplorerViewletState) { - super(); - - this.state = state; - } -} - -export class TreeExplorerViewletState implements ITreeExplorerViewletState { - private _actionProvider: TreeExplorerActionProvider; - - constructor() { - this._actionProvider = new TreeExplorerActionProvider(this); - } - - public get actionProvider() { return this._actionProvider; } -} - -class MultipleSelectionActionRunner extends ActionRunner { - - constructor(private getSelectedResources: () => InternalTreeNode[]) { - super(); - } - - runAction(action: IAction, context: InternalTreeNode): TPromise { - if (action instanceof MenuItemAction) { - const selection = this.getSelectedResources(); - const filteredSelection = selection.filter(s => s !== context); - - if (selection.length === filteredSelection.length || selection.length === 1) { - return action.run(context); - } - - return action.run(context, ...filteredSelection); - } - - return super.runAction(action, context); - } -} diff --git a/src/vs/workbench/parts/explorers/common/explorer.ts b/src/vs/workbench/parts/explorers/common/explorer.ts deleted file mode 100644 index 338b63463de..00000000000 --- a/src/vs/workbench/parts/explorers/common/explorer.ts +++ /dev/null @@ -1,37 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import Event from 'vs/base/common/event'; -import { IDisposable } from 'vs/base/common/lifecycle'; -import { TPromise } from 'vs/base/common/winjs.base'; -import { IActionRunner } from 'vs/base/common/actions'; -import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; - -export const IExplorerViewsService = createDecorator('explorerViewsService'); - -export interface IExplorerViewsService { - _serviceBrand: any; - - readonly onViewCreated: Event>; - - createView(id: string, name: string, dataProvider: IExplorerViewDataProvider): IExplorerView; - getViews(): IExplorerView[]; -} - -export interface IExplorerView extends IDisposable { - refresh(element: T): void; - instantiate(actionRunner: IActionRunner, viewletSetings: any, instantiationService: IInstantiationService): any; -} - -export interface IExplorerViewDataProvider { - provideRoot(): TPromise; - resolveChildren(element: T): TPromise; - getId(element: T): string; - getLabel(element: T): string; - getContextKey(element: T): string; - hasChildren(element: T): boolean; - select(element: T): void; -} diff --git a/src/vs/workbench/parts/explorers/common/treeExplorer.ts b/src/vs/workbench/parts/explorers/common/treeExplorer.ts deleted file mode 100644 index fad6a30fd85..00000000000 --- a/src/vs/workbench/parts/explorers/common/treeExplorer.ts +++ /dev/null @@ -1,21 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -export function toViewletId(viewletId: string): string { - return `workbench.view.extension.${viewletId}`; -} - -export function toViewletActionId(viewletId: string): string { - return `workbench.action.extension.${viewletId}`; -} - -export function toViewletCSSClass(viewletId: string): string { - return `extensionViewlet-${viewletId}`; -} - -export function isValidViewletId(viewletId: string): boolean { - return /^[a-z0-9_-]+$/i.test(viewletId); // Only allow alphanumeric letters, `_` and `-`. -} diff --git a/src/vs/workbench/parts/explorers/common/treeExplorerService.ts b/src/vs/workbench/parts/explorers/common/treeExplorerService.ts deleted file mode 100644 index 6e388e29b82..00000000000 --- a/src/vs/workbench/parts/explorers/common/treeExplorerService.ts +++ /dev/null @@ -1,28 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import Event from 'vs/base/common/event'; -import { TPromise } from 'vs/base/common/winjs.base'; -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { InternalTreeNode, InternalTreeNodeProvider } from 'vs/workbench/parts/explorers/common/treeExplorerViewModel'; - -export const ITreeExplorerService = createDecorator('treeExplorerService'); - -export interface ITreeExplorerService { - _serviceBrand: any; - - onDidChangeProvider: Event; - activeProvider: string; - - onTreeExplorerNodeProviderRegistered: Event; - registerTreeExplorerNodeProvider(providerId: string, provider: InternalTreeNodeProvider): void; - hasProvider(providerId: string): boolean; - getProvider(providerId: string): InternalTreeNodeProvider; - - provideRootNode(providerId: string): TPromise; - resolveChildren(providerId: string, node: InternalTreeNode): TPromise; - executeCommand(providerId: string, node: InternalTreeNode): TPromise; -} diff --git a/src/vs/workbench/parts/explorers/common/treeExplorerViewModel.ts b/src/vs/workbench/parts/explorers/common/treeExplorerViewModel.ts deleted file mode 100644 index a2b19716471..00000000000 --- a/src/vs/workbench/parts/explorers/common/treeExplorerViewModel.ts +++ /dev/null @@ -1,27 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import { TPromise } from 'vs/base/common/winjs.base'; -import Event from 'vs/base/common/event'; - -export interface InternalTreeNodeContent { - label: string; - hasChildren: boolean; - clickCommand: string; -} - -export interface InternalTreeNode extends InternalTreeNodeContent { - readonly id: string; - readonly providerId: string; -} - -export interface InternalTreeNodeProvider { - id: string; - provideRootNode(): Thenable; - resolveChildren(node: InternalTreeNodeContent): Thenable; - executeCommand(node: InternalTreeNodeContent): TPromise; - onRefresh?: Event; -} diff --git a/src/vs/workbench/parts/files/browser/explorerViewlet.ts b/src/vs/workbench/parts/files/browser/explorerViewlet.ts index 80e70692d78..f4f1460ac74 100644 --- a/src/vs/workbench/parts/files/browser/explorerViewlet.ts +++ b/src/vs/workbench/parts/files/browser/explorerViewlet.ts @@ -32,7 +32,7 @@ import { IEditorGroupService } from 'vs/workbench/services/group/common/groupSer import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { attachHeaderViewStyler } from 'vs/platform/theme/common/styler'; -import { IExplorerViewsService } from 'vs/workbench/parts/explorers/common/explorer'; +import { ViewsRegistry, ViewLocation, IViewDescriptor } from 'vs/workbench/parts/views/browser/views'; export class ExplorerViewlet extends Viewlet { private viewletContainer: Builder; @@ -57,14 +57,13 @@ export class ExplorerViewlet extends Viewlet { constructor( @ITelemetryService telemetryService: ITelemetryService, @IWorkspaceContextService private contextService: IWorkspaceContextService, - @IStorageService storageService: IStorageService, + @IStorageService private storageService: IStorageService, @IEditorGroupService private editorGroupService: IEditorGroupService, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IConfigurationService private configurationService: IConfigurationService, @IInstantiationService private instantiationService: IInstantiationService, @IContextKeyService contextKeyService: IContextKeyService, @IThemeService themeService: IThemeService, - @IExplorerViewsService private explorerViewsService: IExplorerViewsService ) { super(VIEWLET_ID, telemetryService, themeService); @@ -75,7 +74,7 @@ export class ExplorerViewlet extends Viewlet { this.viewletSettings = this.getMemento(storageService, Scope.WORKSPACE); this.configurationService.onDidUpdateConfiguration(e => this.onConfigurationUpdated(e.config)); - this.explorerViewsService.onViewCreated(view => this.render()); + ViewsRegistry.onViewsRegistered(viewDescriptors => this.addViews(viewDescriptors.filter(viewDescriptor => ViewLocation.Explorer === viewDescriptor.location))); } public create(parent: Builder): TPromise { @@ -102,7 +101,6 @@ export class ExplorerViewlet extends Viewlet { // Open editors view should always be visible in no folder workspace. this.openEditorsVisible = !this.contextService.hasWorkspace() || config.explorer.openEditors.visible !== 0; - this.dispose(); this.views = []; this.viewletContainer.clearChildren(); @@ -113,7 +111,7 @@ export class ExplorerViewlet extends Viewlet { this.lastFocusedView = view; }); - const customViews = this.explorerViewsService.getViews(); + const customViews = ViewsRegistry.getViews(ViewLocation.Explorer); if (this.openEditorsVisible) { // Open editors view @@ -122,12 +120,14 @@ export class ExplorerViewlet extends Viewlet { } // Explorer view - const view = this.createExplorerOrEmptyView(this.views.length || customViews.length ? undefined : 0); - this.views.push(view); + this.views.push(this.createExplorerOrEmptyView()); // custom views for (const view of customViews) { - this.views.push(view.instantiate(this.getActionRunner(), this.viewletSettings, this.instantiationService)); + this.views.push(this.instantiationService.createInstance(view.ctor, view.id, { + name: view.name, + actionRunner: this.getActionRunner(), + })); } for (let i = 0; i < this.views.length; i++) { @@ -139,6 +139,10 @@ export class ExplorerViewlet extends Viewlet { this.lastFocusedView = this.explorerView; return TPromise.join(this.views.map(view => view.create())).then(() => void 0).then(() => { + if (this.views.length === 1) { + this.views[0].hideHeader(); + + } if (this.dimension) { this.layout(this.dimension); } @@ -149,15 +153,81 @@ export class ExplorerViewlet extends Viewlet { }); } + private updateOpenEditorsView(): void { + if (!this.splitView) { + return; + } + + if (this.openEditorsVisible) { + this.openEditorsView = this.instantiationService.createInstance(OpenEditorsView, this.getActionRunner(), this.viewletSettings); + this.views.unshift(this.openEditorsView); + this.splitView.addView(this.openEditorsView, undefined, 0); + this.openEditorsView.create().then(() => { + if (this.views.length === 2) { + this.views[1].showHeader(); + } + if (this.dimension) { + this.layout(this.dimension); + } + // Update title area since the title actions have changed. + this.updateTitleArea(); + }); + } else { + this.views.shift(); + this.splitView.removeView(this.openEditorsView); + this.openEditorsView.dispose(); + this.openEditorsView = null; + + if (this.views.length === 1) { + this.views[0].hideHeader(); + } + if (this.dimension) { + this.layout(this.dimension); + } + // Update title area since the title actions have changed. + this.updateTitleArea(); + } + } + + private addViews(viewDescriptors: IViewDescriptor[]): void { + if (!this.splitView || !viewDescriptors.length) { + return; + } + const views = []; + + for (const viewDescrirptor of viewDescriptors) { + const view = this.instantiationService.createInstance(viewDescrirptor.ctor, viewDescrirptor.id, { + name: viewDescrirptor.name, + actionRunner: this.getActionRunner(), + }); + views.push(view); + this.views.push(view); + attachHeaderViewStyler(view, this.themeService); + this.splitView.addView(view); + } + + TPromise.join(views.map(view => view.create())).then(() => void 0).then(() => { + this.views[0].showHeader(); + + if (this.dimension) { + this.layout(this.dimension); + } + + // Update title area since the title actions have changed. + this.updateTitleArea(); + }); + } + private onConfigurationUpdated(config: IFilesConfiguration): void { // Open editors view should always be visible in no folder workspace. const openEditorsVisible = !this.contextService.hasWorkspace() || config.explorer.openEditors.visible !== 0; if (this.openEditorsVisible !== openEditorsVisible) { - this.render(); + this.openEditorsVisible = openEditorsVisible; + this.updateOpenEditorsView(); } } - private createExplorerOrEmptyView(headerSize: number): IViewletView { + private createExplorerOrEmptyView(): IViewletView { let explorerOrEmptyView: ExplorerView | EmptyView; // With a Workspace @@ -194,7 +264,7 @@ export class ExplorerViewlet extends Viewlet { }); const explorerInstantiator = this.instantiationService.createChild(new ServiceCollection([IWorkbenchEditorService, delegatingEditorService])); - this.explorerView = explorerOrEmptyView = explorerInstantiator.createInstance(ExplorerView, this.viewletState, this.getActionRunner(), this.viewletSettings, headerSize); + this.explorerView = explorerOrEmptyView = explorerInstantiator.createInstance(ExplorerView, this.viewletState, this.getActionRunner(), this.viewletSettings, void 0); } // No workspace @@ -312,23 +382,24 @@ export class ExplorerViewlet extends Viewlet { } public dispose(): void { + + for (const view of this.views) { + view.dispose(); + } + if (this.splitView) { - this.splitView.dispose(); this.splitView = null; } if (this.explorerView) { - this.explorerView.dispose(); this.explorerView = null; } if (this.openEditorsView) { - this.openEditorsView.dispose(); this.openEditorsView = null; } if (this.emptyView) { - this.emptyView.dispose(); this.emptyView = null; } diff --git a/src/vs/workbench/parts/explorers/browser/media/treeExplorer.contribution.css b/src/vs/workbench/parts/views/browser/media/views.css similarity index 50% rename from src/vs/workbench/parts/explorers/browser/media/treeExplorer.contribution.css rename to src/vs/workbench/parts/views/browser/media/views.css index 35425359a07..30eede64993 100644 --- a/src/vs/workbench/parts/explorers/browser/media/treeExplorer.contribution.css +++ b/src/vs/workbench/parts/views/browser/media/views.css @@ -3,16 +3,22 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -.monaco-workbench .extensionViewlet-action.toggle { - background: url('Refresh.svg') center center no-repeat; -} - -.vs-dark .monaco-workbench .extensionViewlet-action.toggle, -.hc-black .monaco-workbench .extensionViewlet-action.toggle { - background: url('Refresh_inverse.svg') center center no-repeat; -} - -.custom-viewlet-tree-node-item { +.custom-view-tree-node-item { + display: flex; height: 22px; line-height: 22px; } + +.custom-view-tree-node-item > .custom-view-tree-node-item-icon { + background-size: 16px; + background-position: left center; + background-repeat: no-repeat; + padding-right: 6px; + width: 16px; + height: 22px; + -webkit-font-smoothing: antialiased; +} + +.custom-view-tree-node-item > .custom-view-tree-node-item-label .label { + vertical-align: middle; +} \ No newline at end of file diff --git a/src/vs/workbench/parts/explorers/browser/explorerView.ts b/src/vs/workbench/parts/views/browser/treeView.ts similarity index 59% rename from src/vs/workbench/parts/explorers/browser/explorerView.ts rename to src/vs/workbench/parts/views/browser/treeView.ts index 7b7d6f375d2..fc0e34b8a62 100644 --- a/src/vs/workbench/parts/explorers/browser/explorerView.ts +++ b/src/vs/workbench/parts/views/browser/treeView.ts @@ -3,16 +3,15 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import 'vs/css!./media/views'; import Event, { Emitter } from 'vs/base/common/event'; -import { IDisposable, Disposable, dispose, empty as EmptyDisposable, toDisposable } from 'vs/base/common/lifecycle'; -import { IViewletView, CollapsibleViewletView } from 'vs/workbench/browser/viewlet'; -import { IExplorerViewsService, IExplorerViewDataProvider, IExplorerView } from 'vs/workbench/parts/explorers/common/explorer'; +import { IDisposable, dispose, empty as EmptyDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { CollapsibleViewletView } from 'vs/workbench/browser/viewlet'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { TPromise } from 'vs/base/common/winjs.base'; import * as DOM from 'vs/base/browser/dom'; import { Builder, $ } from 'vs/base/browser/builder'; -import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { IAction, IActionRunner, IActionItem, ActionRunner } from 'vs/base/common/actions'; +import { IAction, IActionItem, ActionRunner } from 'vs/base/common/actions'; import { IMessageService } from 'vs/platform/message/common/message'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; @@ -21,96 +20,51 @@ import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { ClickBehavior, DefaultController } from 'vs/base/parts/tree/browser/treeDefaults'; import { IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; import { attachListStyler } from 'vs/platform/theme/common/styler'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IThemeService, LIGHT } from 'vs/platform/theme/common/themeService'; import { createActionItem, fillInActions } from 'vs/platform/actions/browser/menuItemActionItem'; import { IProgressService } from 'vs/platform/progress/common/progress'; import { ITree, IDataSource, IRenderer, ContextMenuEvent } from 'vs/base/parts/tree/browser/tree'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { ResolvedKeybinding } from 'vs/base/common/keyCodes'; import { ActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; +import { ViewsRegistry, ITreeViewDataProvider, IViewOptions, ITreeItem, TreeItemCollapsibleState } from 'vs/workbench/parts/views/browser/views'; +import { IExtensionService } from 'vs/platform/extensions/common/extensions'; +import { CollapsibleState } from 'vs/base/browser/ui/splitview/splitview'; +import { ICommandService } from 'vs/platform/commands/common/commands'; -export interface IViewInstantiator { - instantiate(actionRunner: IActionRunner, viewletSetings: any, instantiationService: IInstantiationService): IViewletView; -} - -export class ExplorerViewsService implements IExplorerViewsService { - - public _serviceBrand: any; - - private explorerViews: Map> = new Map>(); - - private _onViewCreated: Emitter> = new Emitter>(); - public readonly onViewCreated: Event> = this._onViewCreated.event; - - private _onDataProviderRegistered: Emitter> = new Emitter>(); - public readonly onDataProviderRegistered: Event> = this._onDataProviderRegistered.event; - - createView(id: string, name: string, dataProvider: IExplorerViewDataProvider): IExplorerView { - const view = new ExplorerView(id, name, dataProvider); - this.explorerViews.set(id, view); - this._onViewCreated.fire(view); - return view; - } - - public getViews(): IExplorerView[] { - const views = []; - this.explorerViews.forEach(view => { - views.push(view); - }); - return views; - } -} - -class ExplorerView extends Disposable implements IExplorerView, IViewInstantiator { - - private view: TreeExplorerView; - - constructor(private id: string, private name: string, private dataProvider: IExplorerViewDataProvider) { - super(); - } - - refresh(element: T): void { - if (this.view) { - this.view.refresh(element); - } - } - - instantiate(actionRunner: IActionRunner, viewletSettings: any, instantiationService: IInstantiationService): IViewletView { - if (!this.view) { - this.view = instantiationService.createInstance(TreeExplorerView, this.id, this.name, this.dataProvider, actionRunner); - } - return this.view; - } -} - -class TreeExplorerView extends CollapsibleViewletView { +export class TreeView extends CollapsibleViewletView { private menus: Menus; private viewFocusContext: IContextKey; + private activated: boolean = false; + private treeInputPromise: TPromise; + + private dataProviderElementChangeListener: IDisposable; + private disposables: IDisposable[] = []; constructor( - private id: string, - private name: string, - private dataProvider: IExplorerViewDataProvider, - actionRunner: IActionRunner, + readonly id: string, + private options: IViewOptions, @IMessageService messageService: IMessageService, @IKeybindingService keybindingService: IKeybindingService, @IContextMenuService contextMenuService: IContextMenuService, - @IWorkspaceContextService contextService: IWorkspaceContextService, @IInstantiationService private instantiationService: IInstantiationService, @IListService private listService: IListService, @IThemeService private themeService: IThemeService, @IContextKeyService private contextKeyService: IContextKeyService, - @IExplorerViewsService private explorerViewsService: IExplorerViewsService + @IExtensionService private extensionService: IExtensionService, + @ICommandService private commandService: ICommandService ) { - super(actionRunner, false, name, messageService, keybindingService, contextMenuService); - this.menus = this.instantiationService.createInstance(Menus, this.id, this.dataProvider); + super(options.actionRunner, true, options.name, messageService, keybindingService, contextMenuService); + this.menus = this.instantiationService.createInstance(Menus, this.id); this.viewFocusContext = this.contextKeyService.createKey(this.id, void 0); + this.menus.onDidChangeTitle(() => this.updateActions(), this, this.disposables); + this.themeService.onThemeChange(() => this.tree.refresh() /* soft refresh */, this, this.disposables); } public renderHeader(container: HTMLElement): void { const titleDiv = $('div.title').appendTo(container); - $('span').text(this.name).appendTo(titleDiv); + $('span').text(this.options.name).appendTo(titleDiv); super.renderHeader(container); } @@ -121,10 +75,24 @@ class TreeExplorerView extends CollapsibleViewletView { this.tree = this.createViewer($(this.treeContainer)); } + protected changeState(state: CollapsibleState): void { + super.changeState(state); + if (state === CollapsibleState.EXPANDED) { + this.triggerActivation(); + } + } + + private triggerActivation() { + if (!this.activated && this.extensionService) { + this.extensionService.activateByEvent(`onView:${this.id}`); + this.activated = true; + } + } + public createViewer(container: Builder): ITree { - const dataSource = this.instantiationService.createInstance(TreeDataSource, this.dataProvider); - const renderer = this.instantiationService.createInstance(TreeRenderer, this.dataProvider); - const controller = this.instantiationService.createInstance(TreeController, this.menus); + const dataSource = this.instantiationService.createInstance(TreeDataSource, this.id); + const renderer = this.instantiationService.createInstance(TreeRenderer); + const controller = this.instantiationService.createInstance(TreeController, this.id, this.menus); const tree = new Tree(container.getHTMLElement(), { dataSource, renderer, @@ -135,12 +103,7 @@ class TreeExplorerView extends CollapsibleViewletView { this.toDispose.push(attachListStyler(tree, this.themeService)); this.toDispose.push(this.listService.register(tree, [this.viewFocusContext])); - tree.addListener('selection', (event: any) => { - const selection = tree.getSelection()[0]; - if (selection) { - this.dataProvider.select(selection); - } - }); + tree.addListener('selection', (event: any) => this.onSelection()); return tree; } @@ -157,16 +120,41 @@ class TreeExplorerView extends CollapsibleViewletView { } public create(): TPromise { - return this.updateInput(); + return this.setInput(); } public setVisible(visible: boolean): TPromise { return super.setVisible(visible); } - public updateInput(): TPromise { - return this.dataProvider.provideRoot() - .then(root => this.tree.setInput(root)); + public setInput(): TPromise { + if (this.listenToDataProvider()) { + this.treeInputPromise = this.tree.setInput(new Root()); + return this.treeInputPromise; + } + this.treeInputPromise = new TPromise((c, e) => { + const disposable = ViewsRegistry.onTreeViewDataProviderRegistered(id => { + if (this.id === id) { + if (this.listenToDataProvider()) { + this.tree.setInput(new Root()).then(() => c(null)); + disposable.dispose(); + } + } + }); + }); + return TPromise.as(null); + } + + private listenToDataProvider(): boolean { + let dataProvider = ViewsRegistry.getTreeViewDataProvider(this.id); + if (dataProvider) { + if (this.dataProviderElementChangeListener) { + this.dataProviderElementChangeListener.dispose(); + } + this.dataProviderElementChangeListener = dataProvider.onDidChange(element => this.refresh(element)); + return true; + } + return false; } public getOptimalWidth(): number { @@ -176,42 +164,81 @@ class TreeExplorerView extends CollapsibleViewletView { return DOM.getLargestChildWidth(parentNode, childNodes); } - refresh(element: any) { + private onSelection(): void { + const selection: ITreeItem = this.tree.getSelection()[0]; + if (selection) { + if (selection.commandId) { + this.commandService.executeCommand(selection.commandId, { treeViewId: this.id, treeItemHandle: selection.handle }); + } + } + } + + private refresh(element?: ITreeItem): void { + element = element ? element : this.tree.getInput(); + element.children = null; this.tree.refresh(element); } + + dispose(): void { + dispose(this.disposables); + super.dispose(); + } +} + +class Root implements ITreeItem { + label = 'root'; + handle = -1; + collapsibleState = TreeItemCollapsibleState.Expanded; } class TreeDataSource implements IDataSource { constructor( - private dataProvider: IExplorerViewDataProvider, - @IProgressService private progressService: IProgressService, - @IExplorerViewsService private explorerViewsService: IExplorerViewsService + private id: string, + @IProgressService private progressService: IProgressService ) { } - public getId(tree: ITree, node: any): string { - return this.dataProvider.getId(node); + public getId(tree: ITree, node: ITreeItem): string { + return '' + node.handle; } - public hasChildren(tree: ITree, node: any): boolean { - return this.dataProvider.hasChildren(node); + public hasChildren(tree: ITree, node: ITreeItem): boolean { + return node.collapsibleState === TreeItemCollapsibleState.Collapsed || node.collapsibleState === TreeItemCollapsibleState.Expanded; } - public getChildren(tree: ITree, node: any): TPromise { - const promise = this.dataProvider.resolveChildren(node); + public getChildren(tree: ITree, node: ITreeItem): TPromise { + if (node.children) { + return TPromise.as(node.children); + } - this.progressService.showWhile(promise, 800); + const dataProvider = this.getDataProvider(); + if (dataProvider) { + const promise = node instanceof Root ? dataProvider.getElements() : dataProvider.getChildren(node); + this.progressService.showWhile(promise, 100); + return promise.then(children => { + node.children = children; + return children; + }); + } + return TPromise.as(null); + } - return promise; + public shouldAutoexpand(tree: ITree, node: ITreeItem): boolean { + return node.collapsibleState === TreeItemCollapsibleState.Expanded; } public getParent(tree: ITree, node: any): TPromise { return TPromise.as(null); } + + private getDataProvider(): ITreeViewDataProvider { + return ViewsRegistry.getTreeViewDataProvider(this.id); + } } interface ITreeExplorerTemplateData { + icon: Builder; label: Builder; } @@ -220,10 +247,7 @@ class TreeRenderer implements IRenderer { private static ITEM_HEIGHT = 22; private static TREE_TEMPLATE_ID = 'treeExplorer'; - constructor( - private dataProvider: IExplorerViewDataProvider, - @IExplorerViewsService private explorerViewsService: IExplorerViewsService - ) { + constructor( @IThemeService private themeService: IThemeService) { } public getHeight(tree: ITree, element: any): number { @@ -236,18 +260,29 @@ class TreeRenderer implements IRenderer { public renderTemplate(tree: ITree, templateId: string, container: HTMLElement): ITreeExplorerTemplateData { const el = $(container); - const item = $('.custom-viewlet-tree-node-item'); + const item = $('.custom-view-tree-node-item'); item.appendTo(el); - const label = $('.custom-viewlet-tree-node-item-label').appendTo(item); - const link = $('a.plain').appendTo(label); + const icon = $('.custom-view-tree-node-item-icon').appendTo(item); + const label = $('.custom-view-tree-node-item-label').appendTo(item); + const link = $('a.label').appendTo(label); - return { label: link }; + return { label: link, icon }; } - public renderElement(tree: ITree, node: any, templateId: string, templateData: ITreeExplorerTemplateData): void { - const label = this.dataProvider.getLabel(node); - templateData.label.text(label).title(label); + public renderElement(tree: ITree, node: ITreeItem, templateId: string, templateData: ITreeExplorerTemplateData): void { + templateData.label.text(node.label).title(node.label); + + const theme = this.themeService.getTheme(); + const icon = theme.type === LIGHT ? node.icon : node.iconDark; + + if (icon) { + templateData.icon.getHTMLElement().style.backgroundImage = `url('${icon}')`; + DOM.addClass(templateData.icon.getHTMLElement(), 'custom-view-tree-node-item-icon'); + } else { + templateData.icon.getHTMLElement().style.backgroundImage = ''; + DOM.removeClass(templateData.icon.getHTMLElement(), 'custom-view-tree-node-item-icon'); + } } public disposeTemplate(tree: ITree, templateId: string, templateData: ITreeExplorerTemplateData): void { @@ -257,6 +292,7 @@ class TreeRenderer implements IRenderer { class TreeController extends DefaultController { constructor( + private treeViewId: string, private menus: Menus, @IContextMenuService private contextMenuService: IContextMenuService, @IKeybindingService private _keybindingService: IKeybindingService @@ -264,7 +300,7 @@ class TreeController extends DefaultController { super({ clickBehavior: ClickBehavior.ON_MOUSE_UP /* do not change to not break DND */, keyboardSupport: false }); } - public onContextMenu(tree: ITree, node: any, event: ContextMenuEvent): boolean { + public onContextMenu(tree: ITree, node: ITreeItem, event: ContextMenuEvent): boolean { tree.setFocus(node); const actions = this.menus.getResourceContextActions(node); if (!actions.length) { @@ -296,7 +332,7 @@ class TreeController extends DefaultController { } }, - getActionsContext: () => node, + getActionsContext: () => ({ treeViewId: this.treeViewId, treeItemHandle: node.handle }), actionRunner: new MultipleSelectionActionRunner(() => tree.getSelection()) }); @@ -342,11 +378,9 @@ class Menus implements IDisposable { get onDidChangeTitle(): Event { return this._onDidChangeTitle.event; } constructor( - private viewId: string, - private dataProvider: IExplorerViewDataProvider, + private id: string, @IContextKeyService private contextKeyService: IContextKeyService, - @IMenuService private menuService: IMenuService, - @IExplorerViewsService private explorerViewsService: IExplorerViewsService + @IMenuService private menuService: IMenuService ) { if (this.titleDisposable) { this.titleDisposable.dispose(); @@ -354,7 +388,7 @@ class Menus implements IDisposable { } const _contextKeyService = this.contextKeyService.createScoped(); - contextKeyService.createKey('view', viewId); + contextKeyService.createKey('view', id); const titleMenu = this.menuService.createMenu(MenuId.ViewTitle, _contextKeyService); const updateActions = () => { @@ -367,7 +401,6 @@ class Menus implements IDisposable { const listener = titleMenu.onDidChange(updateActions); updateActions(); - this.titleDisposable = toDisposable(() => { listener.dispose(); titleMenu.dispose(); @@ -385,13 +418,13 @@ class Menus implements IDisposable { return this.titleSecondaryActions; } - getResourceContextActions(element: any): IAction[] { - return this.getActions(MenuId.ViewResource, { key: 'resource', value: this.dataProvider.getContextKey(element) }).secondary; + getResourceContextActions(element: ITreeItem): IAction[] { + return this.getActions(MenuId.ViewResource, { key: 'resource', value: element.contextValue }).secondary; } private getActions(menuId: MenuId, context: { key: string, value: string }): { primary: IAction[]; secondary: IAction[]; } { const contextKeyService = this.contextKeyService.createScoped(); - contextKeyService.createKey('view', this.viewId); + contextKeyService.createKey('view', this.id); contextKeyService.createKey(context.key, context.value); const menu = this.menuService.createMenu(menuId, contextKeyService); @@ -409,4 +442,4 @@ class Menus implements IDisposable { dispose(): void { this.disposables = dispose(this.disposables); } -} +} \ No newline at end of file diff --git a/src/vs/workbench/parts/views/browser/views.ts b/src/vs/workbench/parts/views/browser/views.ts new file mode 100644 index 00000000000..831f09c8ecf --- /dev/null +++ b/src/vs/workbench/parts/views/browser/views.ts @@ -0,0 +1,144 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { TPromise } from 'vs/base/common/winjs.base'; +import Event, { Emitter } from 'vs/base/common/event'; +import { IActionRunner } from 'vs/base/common/actions'; +import { IViewletView as IView } from 'vs/workbench/browser/viewlet'; + +export class ViewLocation { + + static readonly Explorer = new ViewLocation('explorer'); + + constructor(private _id: string) { + } + + get id(): string { + return this._id; + } +} + +export enum TreeItemCollapsibleState { + Collapsed = 1, + Expanded = 2 +} + +export interface IViewOptions { + name: string; + actionRunner: IActionRunner; +} + +export interface IViewConstructorSignature { + + new (id: string, options: IViewOptions, ...services: { _serviceBrand: any; }[]): IView; + +} + +export interface IViewDescriptor { + + readonly id: string; + + readonly name: string; + + readonly location: ViewLocation; + + readonly ctor: IViewConstructorSignature; + + readonly order?: number; + +} + +export interface ITreeItem { + + handle: number; + + label: string; + + icon?: string; + + iconDark?: string; + + contextValue?: string; + + commandId?: string; + + children?: ITreeItem[]; + + collapsibleState?: TreeItemCollapsibleState; +} + +export interface ITreeViewDataProvider { + + onDidChange: Event; + + getElements(): TPromise; + + getChildren(element: ITreeItem): TPromise; + +} + +export interface IViewsRegistry { + + readonly onViewsRegistered: Event; + + readonly onTreeViewDataProviderRegistered: Event; + + registerViews(views: IViewDescriptor[]): void; + + registerTreeViewDataProvider(id: string, factory: ITreeViewDataProvider): void; + + getViews(loc: ViewLocation): IViewDescriptor[]; + + getTreeViewDataProvider(id: string): ITreeViewDataProvider; + +} + +export const ViewsRegistry: IViewsRegistry = new class { + + private _onViewsRegistered: Emitter = new Emitter(); + readonly onViewsRegistered: Event = this._onViewsRegistered.event; + + private _onTreeViewDataProviderRegistered: Emitter = new Emitter(); + readonly onTreeViewDataProviderRegistered: Event = this._onTreeViewDataProviderRegistered.event; + + private _views: Map = new Map(); + private _treeViewDataPoviders: Map = new Map(); + + registerViews(viewDescriptors: IViewDescriptor[]): void { + if (viewDescriptors.length) { + for (const viewDescriptor of viewDescriptors) { + let views = this._views.get(viewDescriptor.location); + if (!views) { + views = []; + this._views.set(viewDescriptor.location, views); + } + views.push(viewDescriptor); + } + this._onViewsRegistered.fire(viewDescriptors); + } + } + + registerTreeViewDataProvider(id: string, factory: ITreeViewDataProvider) { + if (!this.isViewRegistered(id)) { + // TODO: throw error + } + this._treeViewDataPoviders.set(id, factory); + this._onTreeViewDataProviderRegistered.fire(id); + } + + getViews(loc: ViewLocation): IViewDescriptor[] { + return this._views.get(loc) || []; + } + + getTreeViewDataProvider(id: string): ITreeViewDataProvider { + return this._treeViewDataPoviders.get(id); + } + + private isViewRegistered(id: string): boolean { + let registered = false; + this._views.forEach(views => registered = registered || views.some(view => view.id === id)); + return registered; + } +}; \ No newline at end of file diff --git a/src/vs/workbench/parts/views/browser/viewsExtensionPoint.ts b/src/vs/workbench/parts/views/browser/viewsExtensionPoint.ts new file mode 100644 index 00000000000..da935449c64 --- /dev/null +++ b/src/vs/workbench/parts/views/browser/viewsExtensionPoint.ts @@ -0,0 +1,101 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { localize } from 'vs/nls'; +import { forEach } from 'vs/base/common/collections'; +import { IJSONSchema } from 'vs/base/common/jsonSchema'; +import { ExtensionMessageCollector, ExtensionsRegistry } from 'vs/platform/extensions/common/extensionsRegistry'; +import { ViewLocation, ViewsRegistry } from 'vs/workbench/parts/views/browser/views'; +import { TreeView } from 'vs/workbench/parts/views/browser/treeView'; + +namespace schema { + + // --views contribution point + + export interface IUserFriendlyViewDescriptor { + id: string; + name: string; + } + + export function parseLocation(value: string): ViewLocation { + switch (value) { + case ViewLocation.Explorer.id: return ViewLocation.Explorer; + } + return void 0; + } + + export function isValidViewDescriptors(viewDescriptors: IUserFriendlyViewDescriptor[], collector: ExtensionMessageCollector): boolean { + if (!Array.isArray(viewDescriptors)) { + collector.error(localize('requirearray', "views must be an array")); + return false; + } + + for (let descriptor of viewDescriptors) { + if (typeof descriptor.id !== 'string') { + collector.error(localize('requirestring', "property `{0}` is mandatory and must be of type `string`", 'id')); + return false; + } + if (typeof descriptor.name !== 'string') { + collector.error(localize('requirestring', "property `{0}` is mandatory and must be of type `string`", 'label')); + return false; + } + } + + return true; + } + + const viewDescriptor: IJSONSchema = { + type: 'object', + properties: { + id: { + description: localize('vscode.extension.contributes.view.id', 'Identifier of the view. Use the same identifier to register a data provider through API.'), + type: 'string' + }, + name: { + description: localize('vscode.extension.contributes.view.name', 'The human-readable name of the view. Will be shown'), + type: 'string' + } + } + }; + + export const viewsContribution: IJSONSchema = { + description: localize('vscode.extension.contributes.views', "Contributes views to the editor"), + type: 'object', + properties: { + 'explorer': { + description: localize('views.explorer', "Explorer"), + type: 'array', + items: viewDescriptor + } + } + }; +} + +ExtensionsRegistry.registerExtensionPoint<{ [loc: string]: schema.IUserFriendlyViewDescriptor[] }>('views', [], schema.viewsContribution).setHandler(extensions => { + for (let extension of extensions) { + const { value, collector } = extension; + + forEach(value, entry => { + if (!schema.isValidViewDescriptors(entry.value, collector)) { + return; + } + + const location = schema.parseLocation(entry.key); + if (!location) { + collector.warn(localize('locationId.invalid', "`{0}` is not a valid view location", entry.key)); + return; + } + + const viewDescriptors = entry.value.map(item => ({ + id: item.id, + name: item.name, + ctor: TreeView, + location + })); + ViewsRegistry.registerViews(viewDescriptors); + }); + } +}); \ No newline at end of file From 1d2d9fe416894659331ad8cc29f434d4a53d34bb Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Fri, 19 May 2017 11:08:03 -0700 Subject: [PATCH 0688/1164] Config for automatically closing 'needs more info' issues --- .github/needs_more_info.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/needs_more_info.yml diff --git a/.github/needs_more_info.yml b/.github/needs_more_info.yml new file mode 100644 index 00000000000..0e246fd554a --- /dev/null +++ b/.github/needs_more_info.yml @@ -0,0 +1,6 @@ +{ + daysUntilClose: 7, + needsMoreInfoLabel: 'needs more info', + perform: false, + closeComment: 'This issue has been closed automatically because it needs more information and has not had recent activity. Please refer to our [guidelines](https://github.com/Microsoft/vscode/blob/master/CONTRIBUTING.md) for filing issues. Thank you for your contributions.' +} From b5fff27131a5e0942703b40b235d89c8c226e7af Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 20:09:55 +0200 Subject: [PATCH 0689/1164] Fixes #5400 --- .../contrib/find/common/findController.ts | 31 ++++++++++++++----- .../find/test/common/findController.test.ts | 27 ++++++++++++++++ 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/vs/editor/contrib/find/common/findController.ts b/src/vs/editor/contrib/find/common/findController.ts index a8f06599b3f..a6edc01be71 100644 --- a/src/vs/editor/contrib/find/common/findController.ts +++ b/src/vs/editor/contrib/find/common/findController.ts @@ -803,16 +803,31 @@ export class MoveSelectionToPreviousFindMatchAction extends SelectPreviousFindMa export abstract class AbstractSelectHighlightsAction extends EditorAction { public run(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor): void { - let r = multiCursorFind(editor, { - changeFindSearchString: true, - allowMultiline: true, - highlightFindOptions: true - }); - if (!r) { - return; + let controller = CommonFindController.get(editor); + if (!controller) { + return null; } - let matches = editor.getModel().findMatches(r.searchText, true, false, r.matchCase, r.wholeWord, false).map(m => m.range); + let matches: Range[] = null; + + const findState = controller.getState(); + if (findState.isRegex && findState.searchString.length > 0) { + + matches = editor.getModel().findMatches(findState.searchString, true, findState.isRegex, findState.matchCase, findState.wholeWord, false).map(m => m.range); + + } else { + + let r = multiCursorFind(editor, { + changeFindSearchString: true, + allowMultiline: true, + highlightFindOptions: true + }); + if (!r) { + return; + } + + matches = editor.getModel().findMatches(r.searchText, true, false, r.matchCase, r.wholeWord, false).map(m => m.range); + } if (matches.length > 0) { let editorSelection = editor.getSelection(); diff --git a/src/vs/editor/contrib/find/test/common/findController.test.ts b/src/vs/editor/contrib/find/test/common/findController.test.ts index 93825e61b96..24403188519 100644 --- a/src/vs/editor/contrib/find/test/common/findController.test.ts +++ b/src/vs/editor/contrib/find/test/common/findController.test.ts @@ -215,6 +215,33 @@ suite('FindController', () => { }); }); + test('issue #5400: "Select All Occurences of Find Match" does not select all if find uses regex', () => { + withMockCodeEditor([ + 'something', + 'someething', + 'someeething', + 'nothing' + ], { serviceCollection: serviceCollection }, (editor, cursor) => { + + let findController = editor.registerAndInstantiateContribution(TestFindController); + let selectHighlightsAction = new SelectHighlightsAction(); + + editor.setSelection(new Selection(1, 1, 1, 1)); + findController.getState().change({ searchString: 'some+thing', isRegex: true }, false); + + selectHighlightsAction.run(null, editor); + assert.deepEqual(editor.getSelections().map(fromRange), [ + [1, 1, 1, 10], + [2, 1, 2, 11], + [3, 1, 3, 12], + ]); + + assert.equal(findController.getState().searchString, 'some+thing'); + + findController.dispose(); + }); + }); + test('issue #9043: Clear search scope when find widget is hidden', () => { withMockCodeEditor([ 'var x = (3 * 5)', From 42a38fb1f7b8f83f3c4d1e3c102c5f22ac0b8fe6 Mon Sep 17 00:00:00 2001 From: rebornix Date: Fri, 19 May 2017 11:04:23 -0700 Subject: [PATCH 0690/1164] Fix #5525. Scroll beyond first line to avoid Find Widget covering anything --- .../editor/contrib/find/browser/findWidget.ts | 101 +++++++++++++++++- 1 file changed, 100 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index e909b466c00..70b5df9beb5 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -17,7 +17,7 @@ import { FindInput, IFindInputStyles } from 'vs/base/browser/ui/findinput/findIn import { IMessage as InputBoxMessage, InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { Widget } from 'vs/base/browser/ui/widget'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition, OverlayWidgetPositionPreference } from 'vs/editor/browser/editorBrowser'; +import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition, IViewZone, OverlayWidgetPositionPreference } from 'vs/editor/browser/editorBrowser'; import { FIND_IDS, MATCHES_LIMIT } from 'vs/editor/contrib/find/common/findModel'; import { FindReplaceState, FindReplaceStateChangedEvent } from 'vs/editor/contrib/find/common/findState'; import { Range } from 'vs/editor/common/core/range'; @@ -51,12 +51,31 @@ const NLS_NO_RESULTS = nls.localize('label.noResults', "No Results"); let MAX_MATCHES_COUNT_WIDTH = 69; const WIDGET_FIXED_WIDTH = 411 - 69; +export class FindWidgetViewZone implements IViewZone { + + public afterLineNumber: number; + public heightInPx: number; + public suppressMouseDown: boolean; + public domNode: HTMLElement; + + constructor(afterLineNumber: number) { + this.afterLineNumber = afterLineNumber; + + this.heightInPx = 34; + this.suppressMouseDown = false; + this.domNode = document.createElement('div'); + this.domNode.className = 'dock-find-viewzone'; + } +} + export class FindWidget extends Widget implements IOverlayWidget { private static ID = 'editor.contrib.findWidget'; private static PART_WIDTH = 275; private static FIND_INPUT_AREA_WIDTH = FindWidget.PART_WIDTH - 54; private static REPLACE_INPUT_AREA_WIDTH = FindWidget.FIND_INPUT_AREA_WIDTH; + private static FIND_INPUT_AREA_HEIGHT = 34; // The height of Find Widget when Replace Input is not visible. + private static FIND_REPLACE_AREA_HEIGHT = 64; // The height of Find Widget when Replace Input is visible. private _codeEditor: ICodeEditor; private _state: FindReplaceState; @@ -82,6 +101,8 @@ export class FindWidget extends Widget implements IOverlayWidget { private _focusTracker: dom.IFocusTracker; private _findInputFocussed: IContextKey; + private _viewZone: FindWidgetViewZone; + private _viewZoneId: number; constructor( codeEditor: ICodeEditor, @@ -169,9 +190,29 @@ export class FindWidget extends Widget implements IOverlayWidget { }); this._codeEditor.addOverlayWidget(this); + this._viewZone = new FindWidgetViewZone(0); // Put it before the first line then users can scroll beyond the first line. this._applyTheme(themeService.getTheme()); this._register(themeService.onThemeChange(this._applyTheme.bind(this))); + + this._register(this._codeEditor.onDidChangeModel((e) => { + if (!this._isVisible) { + return; + } + + if (this._viewZoneId === undefined) { + return; + } + + this._codeEditor.changeViewZones((accessor) => { + accessor.removeZone(this._viewZoneId); + this._viewZoneId = undefined; + }); + })); + + this._register(this._codeEditor.onDidScrollChange((e) => { + this._layoutViewZone(); + })); } // ----- IOverlayWidget API @@ -246,6 +287,9 @@ export class FindWidget extends Widget implements IOverlayWidget { this._updateMatchesCount(); } + if (e.searchString || e.currentMatch) { + this._layoutViewZone(); + } } private _updateMatchesCount(): void { @@ -331,6 +375,7 @@ export class FindWidget extends Widget implements IOverlayWidget { } }, 0); this._codeEditor.layoutOverlayWidget(this); + this._showViewZone(); } } @@ -345,9 +390,62 @@ export class FindWidget extends Widget implements IOverlayWidget { this._codeEditor.focus(); } this._codeEditor.layoutOverlayWidget(this); + this._codeEditor.changeViewZones((accessor) => { + if (this._viewZoneId !== undefined) { + accessor.removeZone(this._viewZoneId); + this._viewZoneId = undefined; + this._codeEditor.setScrollTop(this._codeEditor.getScrollTop() - this._viewZone.heightInPx); + } + }); } } + private _layoutViewZone() { + if (!this._isVisible) { + return; + } + + if (this._viewZoneId !== undefined) { + return; + } + + this._codeEditor.changeViewZones((accessor) => { + if (this._state.isReplaceRevealed) { + this._viewZone.heightInPx = FindWidget.FIND_REPLACE_AREA_HEIGHT; + } else { + this._viewZone.heightInPx = FindWidget.FIND_INPUT_AREA_HEIGHT; + } + + this._viewZoneId = accessor.addZone(this._viewZone); + this._codeEditor.setScrollTop(this._codeEditor.getScrollTop() + this._viewZone.heightInPx); + }); + } + + private _showViewZone() { + if (!this._isVisible) { + return; + } + + this._codeEditor.changeViewZones((accessor) => { + let scrollAdjustment = FindWidget.FIND_INPUT_AREA_HEIGHT; + + if (this._viewZoneId !== undefined) { + if (this._state.isReplaceRevealed) { + this._viewZone.heightInPx = FindWidget.FIND_REPLACE_AREA_HEIGHT; + scrollAdjustment = FindWidget.FIND_REPLACE_AREA_HEIGHT - FindWidget.FIND_INPUT_AREA_HEIGHT; + } else { + this._viewZone.heightInPx = FindWidget.FIND_INPUT_AREA_HEIGHT; + scrollAdjustment = FindWidget.FIND_INPUT_AREA_HEIGHT - FindWidget.FIND_REPLACE_AREA_HEIGHT; + } + accessor.removeZone(this._viewZoneId); + } else { + this._viewZone.heightInPx = FindWidget.FIND_INPUT_AREA_HEIGHT; + } + this._viewZoneId = accessor.addZone(this._viewZone); + this._codeEditor.setScrollTop(this._codeEditor.getScrollTop() + scrollAdjustment); + }); + } + private _applyTheme(theme: ITheme) { let inputStyles: IFindInputStyles = { inputActiveOptionBorder: theme.getColor(inputActiveOptionBorder), @@ -644,6 +742,7 @@ export class FindWidget extends Widget implements IOverlayWidget { className: 'toggle left', onTrigger: () => { this._state.change({ isReplaceRevealed: !this._isReplaceVisible }, false); + this._showViewZone(); }, onKeyDown: (e) => { } })); From 0f9771757b7fdc4dffde0cf75f11f6648077040c Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Fri, 19 May 2017 11:57:42 -0700 Subject: [PATCH 0691/1164] Fix seizure when filtered suggest list is above cursor --- .../contrib/suggest/browser/suggestWidget.ts | 59 +++++++++++-------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index a572d9beb4b..51f12cd01a8 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -352,7 +352,6 @@ export class SuggestWidget implements IContentWidget, IDelegate private readonly maxWidgetWidth = 660; private readonly listWidth = 330; - private readonly minWidgetWidth = 430; private storageService: IStorageService; private detailsFocusBorderColor: string; private detailsBorderColor: string; @@ -548,7 +547,7 @@ export class SuggestWidget implements IContentWidget, IDelegate this.ignoreFocusEvents = false; } - this.updateWidgetHeight(); + this.updateListHeight(); this.list.reveal(index); this.currentSuggestionDetails = item.resolve() @@ -562,7 +561,7 @@ export class SuggestWidget implements IContentWidget, IDelegate if (this.storageService.getBoolean('expandSuggestionDocs', StorageScope.GLOBAL, false)) { this.showDetails(); - this.adjustDocsPosition(); + this._ariaAlert(this.details.getAriaLabel()); } else { removeClass(this.element, 'docs-side'); @@ -827,15 +826,23 @@ export class SuggestWidget implements IContentWidget, IDelegate } show(this.details.element); + this.renderDetails(); + + // With docs showing up, list might need adjustments to keep it close to the cursor + this.adjustListPosition(); + + // with docs showing up widget width/height may change, so reposition the widget + this.editor.layoutContentWidget(this); + + this.adjustDocsPosition(); - this.show(); this.editor.focus(); } private show(): void { - this.updateWidgetHeight(); + this.updateListHeight(); this.suggestWidgetVisible.set(true); - this.renderDetails(); + this.showTimeout = TPromise.timeout(100).then(() => { addClass(this.element, 'visible'); this.onDidShowEmitter.fire(this); @@ -873,12 +880,9 @@ export class SuggestWidget implements IContentWidget, IDelegate return SuggestWidget.ID; } - private updateWidgetHeight(): number { + private updateListHeight(): number { let height = 0; let maxSuggestionsToShow = 11; - if (hasClass(this.element, 'small')) { - maxSuggestionsToShow = 5; - } if (this.state === State.Empty || this.state === State.Loading) { height = this.unfocusedHeight; @@ -895,7 +899,6 @@ export class SuggestWidget implements IContentWidget, IDelegate this.listElement.style.height = `${height}px`; this.list.layout(height); - this.listElement.style.marginTop = '0px'; this.editor.layoutContentWidget(this); return height; @@ -909,23 +912,22 @@ export class SuggestWidget implements IContentWidget, IDelegate const widgetX = this.element.offsetLeft; const widgetY = this.element.offsetTop; - removeClass(this.element, 'list-right'); - - if (this.element.clientWidth < this.maxWidgetWidth && this.listElement.clientWidth !== this.minWidgetWidth) { - // Not enough space to show side by side, so show docs below the list - addClass(this.element, 'docs-below'); - removeClass(this.element, 'docs-side'); - return; - } - if (widgetX < cursorX - this.listWidth) { // Widget is too far to the left of cursor, swap list and docs addClass(this.element, 'list-right'); + } else { + removeClass(this.element, 'list-right'); } - if (cursorY > widgetY && this.details.element.clientHeight > this.listElement.clientHeight) { - // Docs is bigger than list and widget is above cursor, apply margin-top so that list appears right above cursor - this.listElement.style.marginTop = `${this.details.element.clientHeight - this.listElement.clientHeight}px`; + if (cursorY > widgetY) { + if (!hasClass(this.element, 'widget-above')) { + addClass(this.element, 'widget-above'); + // Since the widget was previously not above the cursor, + // the list needs to be adjusted to keep it close to the cursor + this.adjustListPosition(); + } + } else { + removeClass(this.element, 'widget-above'); } } @@ -940,6 +942,17 @@ export class SuggestWidget implements IContentWidget, IDelegate } } + private adjustListPosition(): void { + if (hasClass(this.element, 'widget-above') + && hasClass(this.element, 'docs-side') + && this.details.element.offsetHeight > this.listElement.offsetHeight) { + // Docs is bigger than list and widget is above cursor, apply margin-top so that list appears right above cursor + this.listElement.style.marginTop = `${this.details.element.offsetHeight - this.listElement.offsetHeight}px`; + } else { + this.listElement.style.marginTop = '0px'; + } + } + private renderDetails(): void { if (this.state === State.Details || this.state === State.Open) { this.details.render(this.list.getFocusedElements()[0]); From ada3874b9867ff622ebdf2a50fa4515364ed9a15 Mon Sep 17 00:00:00 2001 From: rebornix Date: Fri, 19 May 2017 12:20:31 -0700 Subject: [PATCH 0692/1164] Fix #26106. Make sure arrary key is string --- src/vs/editor/common/viewModel/viewModelDecorations.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/common/viewModel/viewModelDecorations.ts b/src/vs/editor/common/viewModel/viewModelDecorations.ts index 6f1a0a184b2..2a04c160d94 100644 --- a/src/vs/editor/common/viewModel/viewModelDecorations.ts +++ b/src/vs/editor/common/viewModel/viewModelDecorations.ts @@ -73,7 +73,9 @@ export class ViewModelDecorations implements IDisposable { let removedDecorations = e.removedDecorations; for (let i = 0, len = removedDecorations.length; i < len; i++) { let removedDecoration = removedDecorations[i]; - delete this._decorationsCache[removedDecoration]; + if (removedDecoration !== null && removedDecoration !== undefined) { + delete this._decorationsCache[removedDecoration]; + } } this._clearCachedModelDecorationsResolver(); From 09300167973f0093814b733060baf0a5763a8926 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 21:39:03 +0200 Subject: [PATCH 0693/1164] var -> let, const --- .../common/controller/cursorCollection.ts | 102 +++++++++--------- 1 file changed, 50 insertions(+), 52 deletions(-) diff --git a/src/vs/editor/common/controller/cursorCollection.ts b/src/vs/editor/common/controller/cursorCollection.ts index 0aa97317662..51ea5a50477 100644 --- a/src/vs/editor/common/controller/cursorCollection.ts +++ b/src/vs/editor/common/controller/cursorCollection.ts @@ -51,13 +51,6 @@ export class CursorCollection { return result; } - private _getAll(): OneCursor[] { - var result: OneCursor[] = []; - result.push(this.primaryCursor); - result = result.concat(this.secondaryCursors); - return result; - } - public getAll(): CursorState[] { let result: CursorState[] = []; result[0] = this.primaryCursor.asCursorState(); @@ -68,37 +61,37 @@ export class CursorCollection { } public getPositions(): Position[] { - var result: Position[] = []; - result.push(this.primaryCursor.modelState.position); - for (var i = 0, len = this.secondaryCursors.length; i < len; i++) { - result.push(this.secondaryCursors[i].modelState.position); + let result: Position[] = []; + result[0] = this.primaryCursor.modelState.position; + for (let i = 0, len = this.secondaryCursors.length; i < len; i++) { + result[i + 1] = this.secondaryCursors[i].modelState.position; } return result; } public getViewPositions(): Position[] { - var result: Position[] = []; - result.push(this.primaryCursor.viewState.position); - for (var i = 0, len = this.secondaryCursors.length; i < len; i++) { - result.push(this.secondaryCursors[i].viewState.position); + let result: Position[] = []; + result[0] = this.primaryCursor.viewState.position; + for (let i = 0, len = this.secondaryCursors.length; i < len; i++) { + result[i + 1] = this.secondaryCursors[i].viewState.position; } return result; } public getSelections(): Selection[] { - var result: Selection[] = []; - result.push(this.primaryCursor.modelState.selection); - for (var i = 0, len = this.secondaryCursors.length; i < len; i++) { - result.push(this.secondaryCursors[i].modelState.selection); + let result: Selection[] = []; + result[0] = this.primaryCursor.modelState.selection; + for (let i = 0, len = this.secondaryCursors.length; i < len; i++) { + result[i + 1] = this.secondaryCursors[i].modelState.selection; } return result; } public getViewSelections(): Selection[] { - var result: Selection[] = []; - result.push(this.primaryCursor.viewState.selection); - for (var i = 0, len = this.secondaryCursors.length; i < len; i++) { - result.push(this.secondaryCursors[i].viewState.selection); + let result: Selection[] = []; + result[0] = this.primaryCursor.viewState.selection; + for (let i = 0, len = this.secondaryCursors.length; i < len; i++) { + result[i + 1] = this.secondaryCursors[i].viewState.selection; } return result; } @@ -147,13 +140,8 @@ export class CursorCollection { this._setSecondaryStates([]); } - public normalize(): void { - this._mergeCursorsIfNecessary(); - } - private _addSecondaryCursor(): void { - var newCursor = new OneCursor(this.context); - this.secondaryCursors.push(newCursor); + this.secondaryCursors.push(new OneCursor(this.context)); this.lastAddedCursorIndex = this.secondaryCursors.length; } @@ -172,24 +160,34 @@ export class CursorCollection { this.secondaryCursors.splice(removeIndex, 1); } - private _mergeCursorsIfNecessary(): void { + private _getAll(): OneCursor[] { + let result: OneCursor[] = []; + result[0] = this.primaryCursor; + for (let i = 0, len = this.secondaryCursors.length; i < len; i++) { + result[i + 1] = this.secondaryCursors[i]; + } + return result; + } + + public normalize(): void { if (this.secondaryCursors.length === 0) { return; } - var cursors = this._getAll(); - var sortedCursors: { + let cursors = this._getAll(); + + interface SortedCursor { index: number; selection: Selection; viewSelection: Selection; - }[] = []; - for (var i = 0; i < cursors.length; i++) { + } + let sortedCursors: SortedCursor[] = []; + for (let i = 0, len = cursors.length; i < len; i++) { sortedCursors.push({ index: i, selection: cursors[i].modelState.selection, viewSelection: cursors[i].viewState.selection }); } - sortedCursors.sort((a, b) => { if (a.viewSelection.startLineNumber === b.viewSelection.startLineNumber) { return a.viewSelection.startColumn - b.viewSelection.startColumn; @@ -197,30 +195,30 @@ export class CursorCollection { return a.viewSelection.startLineNumber - b.viewSelection.startLineNumber; }); - for (var sortedCursorIndex = 0; sortedCursorIndex < sortedCursors.length - 1; sortedCursorIndex++) { - var current = sortedCursors[sortedCursorIndex]; - var next = sortedCursors[sortedCursorIndex + 1]; + for (let sortedCursorIndex = 0; sortedCursorIndex < sortedCursors.length - 1; sortedCursorIndex++) { + const current = sortedCursors[sortedCursorIndex]; + const next = sortedCursors[sortedCursorIndex + 1]; - var currentViewSelection = current.viewSelection; - var nextViewSelection = next.viewSelection; + const currentViewSelection = current.viewSelection; + const nextViewSelection = next.viewSelection; if (nextViewSelection.getStartPosition().isBeforeOrEqual(currentViewSelection.getEndPosition())) { - var winnerSortedCursorIndex = current.index < next.index ? sortedCursorIndex : sortedCursorIndex + 1; - var looserSortedCursorIndex = current.index < next.index ? sortedCursorIndex + 1 : sortedCursorIndex; + const winnerSortedCursorIndex = current.index < next.index ? sortedCursorIndex : sortedCursorIndex + 1; + const looserSortedCursorIndex = current.index < next.index ? sortedCursorIndex + 1 : sortedCursorIndex; - var looserIndex = sortedCursors[looserSortedCursorIndex].index; - var winnerIndex = sortedCursors[winnerSortedCursorIndex].index; + const looserIndex = sortedCursors[looserSortedCursorIndex].index; + const winnerIndex = sortedCursors[winnerSortedCursorIndex].index; - var looserSelection = sortedCursors[looserSortedCursorIndex].selection; - var winnerSelection = sortedCursors[winnerSortedCursorIndex].selection; + const looserSelection = sortedCursors[looserSortedCursorIndex].selection; + const winnerSelection = sortedCursors[winnerSortedCursorIndex].selection; if (!looserSelection.equalsSelection(winnerSelection)) { - var resultingRange = looserSelection.plusRange(winnerSelection); - var looserSelectionIsLTR = (looserSelection.selectionStartLineNumber === looserSelection.startLineNumber && looserSelection.selectionStartColumn === looserSelection.startColumn); - var winnerSelectionIsLTR = (winnerSelection.selectionStartLineNumber === winnerSelection.startLineNumber && winnerSelection.selectionStartColumn === winnerSelection.startColumn); + const resultingRange = looserSelection.plusRange(winnerSelection); + const looserSelectionIsLTR = (looserSelection.selectionStartLineNumber === looserSelection.startLineNumber && looserSelection.selectionStartColumn === looserSelection.startColumn); + const winnerSelectionIsLTR = (winnerSelection.selectionStartLineNumber === winnerSelection.startLineNumber && winnerSelection.selectionStartColumn === winnerSelection.startColumn); // Give more importance to the last added cursor (think Ctrl-dragging + hitting another cursor) - var resultingSelectionIsLTR: boolean; + let resultingSelectionIsLTR: boolean; if (looserIndex === this.lastAddedCursorIndex) { resultingSelectionIsLTR = looserSelectionIsLTR; this.lastAddedCursorIndex = winnerIndex; @@ -229,7 +227,7 @@ export class CursorCollection { resultingSelectionIsLTR = winnerSelectionIsLTR; } - var resultingSelection: Selection; + let resultingSelection: Selection; if (resultingSelectionIsLTR) { resultingSelection = new Selection(resultingRange.startLineNumber, resultingRange.startColumn, resultingRange.endLineNumber, resultingRange.endColumn); } else { @@ -241,7 +239,7 @@ export class CursorCollection { cursors[winnerIndex].setState(this.context, resultingState.modelState, resultingState.viewState); } - for (var j = 0; j < sortedCursors.length; j++) { + for (let j = 0; j < sortedCursors.length; j++) { if (sortedCursors[j].index > looserIndex) { sortedCursors[j].index--; } From b3041cbc66fd7896c3f750974a1164fa390c1ecb Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 21:50:41 +0200 Subject: [PATCH 0694/1164] Fixes #6661: Relax cursor merging rules in case of touching ranges --- .../common/controller/cursorCollection.ts | 11 ++++- .../find/test/common/findController.test.ts | 49 ++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/common/controller/cursorCollection.ts b/src/vs/editor/common/controller/cursorCollection.ts index 51ea5a50477..2f176653af7 100644 --- a/src/vs/editor/common/controller/cursorCollection.ts +++ b/src/vs/editor/common/controller/cursorCollection.ts @@ -202,7 +202,16 @@ export class CursorCollection { const currentViewSelection = current.viewSelection; const nextViewSelection = next.viewSelection; - if (nextViewSelection.getStartPosition().isBeforeOrEqual(currentViewSelection.getEndPosition())) { + let shouldMergeCursors: boolean; + if (nextViewSelection.isEmpty() || currentViewSelection.isEmpty()) { + // Merge touching cursors if one of them is collapsed + shouldMergeCursors = nextViewSelection.getStartPosition().isBeforeOrEqual(currentViewSelection.getEndPosition()); + } else { + // Merge only overlapping cursors (i.e. allow touching ranges) + shouldMergeCursors = nextViewSelection.getStartPosition().isBefore(currentViewSelection.getEndPosition()); + } + + if (shouldMergeCursors) { const winnerSortedCursorIndex = current.index < next.index ? sortedCursorIndex : sortedCursorIndex + 1; const looserSortedCursorIndex = current.index < next.index ? sortedCursorIndex + 1 : sortedCursorIndex; diff --git a/src/vs/editor/contrib/find/test/common/findController.test.ts b/src/vs/editor/contrib/find/test/common/findController.test.ts index 24403188519..d6e5591d3c2 100644 --- a/src/vs/editor/contrib/find/test/common/findController.test.ts +++ b/src/vs/editor/contrib/find/test/common/findController.test.ts @@ -11,7 +11,7 @@ import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Selection } from 'vs/editor/common/core/selection'; import { Range } from 'vs/editor/common/core/range'; -import { EndOfLineSequence, ICommonCodeEditor } from 'vs/editor/common/editorCommon'; +import { EndOfLineSequence, ICommonCodeEditor, Handler } from 'vs/editor/common/editorCommon'; import { CommonFindController, FindStartFocusAction, IFindStartOptions, NextMatchFindAction, StartFindAction, SelectHighlightsAction, @@ -412,6 +412,53 @@ suite('FindController', () => { }); }); + test('issue #6661: AddSelectionToNextFindMatchAction can work with touching ranges', () => { + withMockCodeEditor([ + 'abcabc', + 'abc', + 'abcabc', + ], { serviceCollection: serviceCollection }, (editor, cursor) => { + + let findController = editor.registerAndInstantiateContribution(TestFindController); + let addSelectionToNextFindMatch = new AddSelectionToNextFindMatchAction(); + + editor.setSelection(new Selection(1, 1, 1, 4)); + + addSelectionToNextFindMatch.run(null, editor); + assert.deepEqual(editor.getSelections().map(fromRange), [ + [1, 1, 1, 4], + [1, 4, 1, 7] + ]); + + addSelectionToNextFindMatch.run(null, editor); + addSelectionToNextFindMatch.run(null, editor); + addSelectionToNextFindMatch.run(null, editor); + assert.deepEqual(editor.getSelections().map(fromRange), [ + [1, 1, 1, 4], + [1, 4, 1, 7], + [2, 1, 2, 4], + [3, 1, 3, 4], + [3, 4, 3, 7] + ]); + + editor.trigger('test', Handler.Type, { text: 'z' }); + assert.deepEqual(editor.getSelections().map(fromRange), [ + [1, 2, 1, 2], + [1, 3, 1, 3], + [2, 2, 2, 2], + [3, 2, 3, 2], + [3, 3, 3, 3] + ]); + assert.equal(editor.getValue(), [ + 'zz', + 'z', + 'zz', + ].join('\n')); + + findController.dispose(); + }); + }); + test('issue #23541: Multiline Ctrl+D does not work in CRLF files', () => { withMockCodeEditor([ '', From 7e3e420c330e8f99ad72636f08b005c449487179 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 21:54:26 +0200 Subject: [PATCH 0695/1164] Change all respects find state only if the find widget is revealed --- src/vs/editor/contrib/find/common/findController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/find/common/findController.ts b/src/vs/editor/contrib/find/common/findController.ts index a6edc01be71..f06f35867fd 100644 --- a/src/vs/editor/contrib/find/common/findController.ts +++ b/src/vs/editor/contrib/find/common/findController.ts @@ -811,7 +811,7 @@ export abstract class AbstractSelectHighlightsAction extends EditorAction { let matches: Range[] = null; const findState = controller.getState(); - if (findState.isRegex && findState.searchString.length > 0) { + if (findState.isRevealed && findState.isRegex && findState.searchString.length > 0) { matches = editor.getModel().findMatches(findState.searchString, true, findState.isRegex, findState.matchCase, findState.wholeWord, false).map(m => m.range); From fce56a92a86cd45302a6f6d5d177b5e77a052099 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 22:23:01 +0200 Subject: [PATCH 0696/1164] Fixes #26747 --- src/vs/editor/browser/standalone/standaloneLanguages.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/browser/standalone/standaloneLanguages.ts b/src/vs/editor/browser/standalone/standaloneLanguages.ts index f3f5584a0db..2e23e5a33ec 100644 --- a/src/vs/editor/browser/standalone/standaloneLanguages.ts +++ b/src/vs/editor/browser/standalone/standaloneLanguages.ts @@ -242,7 +242,7 @@ export function registerHoverProvider(languageId: string, provider: modes.HoverP return undefined; } if (!value.range && word) { - value.range = new Range(position.lineNumber, word.startColumn, position.column, word.endColumn); + value.range = new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn); } if (!value.range) { value.range = new Range(position.lineNumber, position.column, position.lineNumber, position.column); From efd6e50d493fea2e7b35509d408ad68d49f95ac3 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 19 May 2017 14:03:00 -0700 Subject: [PATCH 0697/1164] Fix scroll of webview sometimes getting reset --- .../parts/html/browser/webview-pre.js | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/parts/html/browser/webview-pre.js b/src/vs/workbench/parts/html/browser/webview-pre.js index da511a2c866..a371b3f33c0 100644 --- a/src/vs/workbench/parts/html/browser/webview-pre.js +++ b/src/vs/workbench/parts/html/browser/webview-pre.js @@ -9,6 +9,8 @@ const ipcRenderer = require('electron').ipcRenderer; + var firstLoad = true; + const initData = { initialScrollProgress: undefined }; @@ -155,21 +157,25 @@ // keep current scrollTop around and use later var setInitialScrollPosition; - if (frame) { - const scrollY = frame.contentDocument && frame.contentDocument.body ? frame.contentDocument.body.scrollTop : 0; - setInitialScrollPosition = function (body) { - body.scrollTop = scrollY; - } - } else { - // First load + if (firstLoad) { + firstLoad = false; setInitialScrollPosition = function (body, window) { body.scrollTop = 0; if (!isNaN(initData.initialScrollProgress)) { window.addEventListener('load', function () { - body.scrollTop = body.clientHeight * initData.initialScrollProgress + if (body.scrollTop === 0) { + body.scrollTop = body.clientHeight * initData.initialScrollProgress + } }); } } + } else { + const scrollY = frame.contentDocument && frame.contentDocument.body ? frame.contentDocument.body.scrollTop : 0; + setInitialScrollPosition = function (body) { + if (body.scrollTop === 0) { + body.scrollTop = scrollY; + } + } } // Clean up old pending frames and set current one as new one From 96a95af63785fabd0e9a9eb8a47b9ad414ca40c3 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 23:15:21 +0200 Subject: [PATCH 0698/1164] Fixes #2106 --- .../editor/common/controller/coreCommands.ts | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/common/controller/coreCommands.ts b/src/vs/editor/common/controller/coreCommands.ts index 02fade2c3d2..9ad0e099b2c 100644 --- a/src/vs/editor/common/controller/coreCommands.ts +++ b/src/vs/editor/common/controller/coreCommands.ts @@ -712,14 +712,45 @@ export namespace CoreNavigationCommands { newState = CursorMoveCommands.moveTo(context, cursors.getPrimaryCursor(), false, args.position, args.viewPosition); } - let newStates = cursors.getAll().slice(0); - newStates.push(newState); + const states = cursors.getAll(); + + // Check if we should remove a cursor (sort of like a toggle) + if (states.length > 1) { + const newModelPosition = (newState.modelState ? newState.modelState.position : null); + const newViewPosition = (newState.viewState ? newState.viewState.position : null); + + for (let i = 0, len = states.length; i < len; i++) { + const state = states[i]; + + if (newModelPosition && !state.modelState.selection.containsPosition(newModelPosition)) { + continue; + } + + if (newViewPosition && !state.viewState.selection.containsPosition(newViewPosition)) { + continue; + } + + // => Remove the cursor + states.splice(i, 1); + + cursors.context.model.pushStackElement(); + cursors.setStates( + args.source, + CursorChangeReason.Explicit, + states + ); + return; + } + } + + // => Add the new cursor + states.push(newState); cursors.context.model.pushStackElement(); cursors.setStates( args.source, CursorChangeReason.Explicit, - newStates + states ); } }); From 9a2b30c1fd69448a11258ec3aa45c4f55611bc9e Mon Sep 17 00:00:00 2001 From: isidor Date: Fri, 19 May 2017 23:12:52 +0200 Subject: [PATCH 0699/1164] Theme: Debugger task dropdown inconsistency fixes #26953 --- .../parts/debug/browser/debugActionItems.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/debugActionItems.ts b/src/vs/workbench/parts/debug/browser/debugActionItems.ts index 8165e4055b6..b81283f1ac1 100644 --- a/src/vs/workbench/parts/debug/browser/debugActionItems.ts +++ b/src/vs/workbench/parts/debug/browser/debugActionItems.ts @@ -10,7 +10,7 @@ import { IAction, IActionRunner } from 'vs/base/common/actions'; import { KeyCode } from 'vs/base/common/keyCodes'; import * as dom from 'vs/base/browser/dom'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { SelectBox } from 'vs/base/browser/ui/selectBox/selectBox'; +import { SelectBox, ISelectBoxStyles } from 'vs/base/browser/ui/selectBox/selectBox'; import { SelectActionItem, IActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { EventEmitter } from 'vs/base/common/eventEmitter'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -37,7 +37,7 @@ export class StartDebugActionItem extends EventEmitter implements IActionItem { private context: any, private action: IAction, @IDebugService private debugService: IDebugService, - @IThemeService themeService: IThemeService, + @IThemeService private themeService: IThemeService, @IConfigurationService private configurationService: IConfigurationService, @ICommandService private commandService: ICommandService ) { @@ -115,6 +115,14 @@ export class StartDebugActionItem extends EventEmitter implements IActionItem { event.stopPropagation(); } })); + this.toDispose.push(attachSelectBoxStyler({ + style: (colors: ISelectBoxStyles) => { + if (colors.selectBorder) { + this.container.style.borderColor = colors.selectBorder.toString(); + selectBoxContainer.style.borderLeftColor = colors.selectBorder.toString(); + } + } + }, this.themeService)); this.updateOptions(); } From 521c9120c9f87eae2831d4e7098f5262b4e97151 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Fri, 19 May 2017 23:21:03 +0200 Subject: [PATCH 0700/1164] Fixes #2292: Place the textarea before the overlay widgets in the dom --- src/vs/editor/browser/view/viewImpl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index c447686be87..3ad217b9787 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -227,9 +227,9 @@ export class View extends ViewEventHandler { this.overflowGuardContainer.appendChild(margin.getDomNode()); this.overflowGuardContainer.appendChild(this._scrollbar.getDomNode()); this.overflowGuardContainer.appendChild(scrollDecoration.getDomNode()); - this.overflowGuardContainer.appendChild(this.overlayWidgets.getDomNode()); this.overflowGuardContainer.appendChild(this._textAreaHandler.textArea); this.overflowGuardContainer.appendChild(this._textAreaHandler.textAreaCover); + this.overflowGuardContainer.appendChild(this.overlayWidgets.getDomNode()); this.overflowGuardContainer.appendChild(minimap.getDomNode()); this.domNode.appendChild(this.overflowGuardContainer); this.domNode.appendChild(this.contentWidgets.overflowingContentWidgetsDomNode); From 33843a5916c3a52a297d4f450524273984d32c7d Mon Sep 17 00:00:00 2001 From: isidor Date: Sat, 20 May 2017 00:17:11 +0200 Subject: [PATCH 0701/1164] add generic surveys --- src/vs/platform/node/product.ts | 8 + .../electron-browser/workbench.main.ts | 1 + .../languageSurveys.contribution.ts | 143 ++++++++++++++++++ 3 files changed, 152 insertions(+) create mode 100644 src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.ts diff --git a/src/vs/platform/node/product.ts b/src/vs/platform/node/product.ts index ece6de31f9b..718fc5a477a 100644 --- a/src/vs/platform/node/product.ts +++ b/src/vs/platform/node/product.ts @@ -53,6 +53,7 @@ export interface IProductConfiguration { licenseUrl: string; privacyStatementUrl: string; npsSurveyUrl: string; + surveys: ISurveyData[]; checksums: { [path: string]: string; }; checksumFailMoreInfoUrl: string; hockeyApp: { @@ -64,6 +65,13 @@ export interface IProductConfiguration { }; } +export interface ISurveyData { + surveyUrl: string; + languageId: string; + editCount: number; + userProbability: number; +} + const rootPath = path.dirname(uri.parse(require.toUrl('')).fsPath); const productJsonPath = path.join(rootPath, 'product.json'); const product = require.__$__nodeRequire(productJsonPath) as IProductConfiguration; diff --git a/src/vs/workbench/electron-browser/workbench.main.ts b/src/vs/workbench/electron-browser/workbench.main.ts index ae9d791d648..0d6c2c4aa0c 100644 --- a/src/vs/workbench/electron-browser/workbench.main.ts +++ b/src/vs/workbench/electron-browser/workbench.main.ts @@ -101,6 +101,7 @@ import 'vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarte import 'vs/workbench/parts/update/electron-browser/update.contribution'; import 'vs/workbench/parts/surveys/electron-browser/nps.contribution'; +import 'vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution'; import 'vs/workbench/parts/performance/electron-browser/performance.contribution'; diff --git a/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.ts b/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.ts new file mode 100644 index 00000000000..76c6dcf6a4b --- /dev/null +++ b/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.ts @@ -0,0 +1,143 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as nls from 'vs/nls'; +import { TPromise } from 'vs/base/common/winjs.base'; +import { Action } from 'vs/base/common/actions'; +import { language } from 'vs/base/common/platform'; +import { IModelService } from 'vs/editor/common/services/modelService'; +import { IWorkbenchContributionsRegistry, IWorkbenchContribution, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; +import { Registry } from 'vs/platform/platform'; +import { IMessageService, Severity } from 'vs/platform/message/common/message'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { FileChangeType, IFileService } from 'vs/platform/files/common/files'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import pkg from 'vs/platform/node/package'; +import product, { ISurveyData } from 'vs/platform/node/product'; + +class LanguageSurvey { + + constructor( + data: ISurveyData, + instantiationService: IInstantiationService, + storageService: IStorageService, + messageService: IMessageService, + telemetryService: ITelemetryService, + fileService: IFileService, + modelService: IModelService + ) { + const SESSION_COUNT_KEY = `${data.languageId}.sessionCount`; + const LAST_SESSION_DATE_KEY = `${data.languageId}.lastSessionDate`; + const SKIP_VERSION_KEY = `${data.languageId}.skipVersion`; + const IS_CANDIDATE_KEY = `${data.languageId}.isCandidate`; + const EDITED_LANGUAGE_COUNT_KEY = `${data.languageId}.editedCount`; + const EDITED_LANGUAGE_DATE_KEY = `${data.languageId}.editedDate`; + + const skipVersion = storageService.get(SKIP_VERSION_KEY, StorageScope.GLOBAL, ''); + if (skipVersion) { + return; + } + const date = new Date().toDateString(); + + if (storageService.getInteger(EDITED_LANGUAGE_COUNT_KEY, StorageScope.GLOBAL, 0) < data.editCount) { + fileService.onFileChanges(e => { + e.getUpdated().forEach(event => { + if (event.type === FileChangeType.UPDATED) { + const model = modelService.getModel(event.resource); + if (model && model.getModeId() === data.languageId && date !== storageService.get(EDITED_LANGUAGE_DATE_KEY, StorageScope.GLOBAL)) { + const editedCount = storageService.getInteger(EDITED_LANGUAGE_COUNT_KEY, StorageScope.GLOBAL, 0) + 1; + storageService.store(EDITED_LANGUAGE_COUNT_KEY, editedCount, StorageScope.GLOBAL); + storageService.store(EDITED_LANGUAGE_DATE_KEY, date, StorageScope.GLOBAL); + } + } + }); + }); + } + + const lastSessionDate = storageService.get(LAST_SESSION_DATE_KEY, StorageScope.GLOBAL, new Date(0).toDateString()); + if (date === lastSessionDate) { + return; + } + + const sessionCount = storageService.getInteger(SESSION_COUNT_KEY, StorageScope.GLOBAL, 0) + 1; + storageService.store(LAST_SESSION_DATE_KEY, date, StorageScope.GLOBAL); + storageService.store(SESSION_COUNT_KEY, sessionCount, StorageScope.GLOBAL); + + if (sessionCount < 9) { + return; + } + if (storageService.getInteger(EDITED_LANGUAGE_COUNT_KEY, StorageScope.GLOBAL, 0) < data.editCount) { + return; + } + + const isCandidate = storageService.getBoolean(IS_CANDIDATE_KEY, StorageScope.GLOBAL, false) + || Math.random() < data.userProbability; + + storageService.store(IS_CANDIDATE_KEY, isCandidate, StorageScope.GLOBAL); + + if (!isCandidate) { + storageService.store(SKIP_VERSION_KEY, pkg.version, StorageScope.GLOBAL); + return; + } + + const message = nls.localize('helpUs', "Help us improve our support for {0}", data.languageId); + + const takeSurveyAction = new Action('takeSurvey', nls.localize('takeShortSurvey', "Take Short Survey"), '', true, () => { + telemetryService.publicLog(`${data.languageId}.survey/takeShortSurvey`); + return telemetryService.getTelemetryInfo().then(info => { + window.open(`${data.surveyUrl}?o=${encodeURIComponent(process.platform)}&v=${encodeURIComponent(pkg.version)}&m=${encodeURIComponent(info.machineId)}`); + storageService.store(IS_CANDIDATE_KEY, false, StorageScope.GLOBAL); + storageService.store(SKIP_VERSION_KEY, pkg.version, StorageScope.GLOBAL); + }); + }); + + const remindMeLaterAction = new Action('later', nls.localize('remindLater', "Remind Me later"), '', true, () => { + telemetryService.publicLog(`${data.languageId}.survey/remindMeLater`); + storageService.store(SESSION_COUNT_KEY, sessionCount - 3, StorageScope.GLOBAL); + return TPromise.as(null); + }); + + const neverAgainAction = new Action('never', nls.localize('neverAgain', "Don't Show Again"), '', true, () => { + telemetryService.publicLog(`${data.languageId}.survey/dontShowAgain`); + storageService.store(IS_CANDIDATE_KEY, false, StorageScope.GLOBAL); + storageService.store(SKIP_VERSION_KEY, pkg.version, StorageScope.GLOBAL); + return TPromise.as(null); + }); + + const actions = [neverAgainAction, remindMeLaterAction, takeSurveyAction]; + telemetryService.publicLog(`${data.languageId}.survey/userAsked`); + messageService.show(Severity.Info, { message, actions }); + } + +} + +class LanguageSurveysContribution implements IWorkbenchContribution { + + private surveys: LanguageSurvey[]; + + constructor( + @IInstantiationService instantiationService: IInstantiationService, + @IStorageService storageService: IStorageService, + @IMessageService messageService: IMessageService, + @ITelemetryService telemetryService: ITelemetryService, + @IFileService fileService: IFileService, + @IModelService modelService: IModelService + ) { + this.surveys = product.surveys.filter(surveyData => surveyData.editCount && surveyData.languageId && surveyData.surveyUrl && surveyData.userProbability).map(surveyData => + new LanguageSurvey(surveyData, instantiationService, storageService, messageService, telemetryService, fileService, modelService)); + } + + getId(): string { + return 'languagesurveys.contribution'; + } +} + +if (language === 'en' && product.surveys && product.surveys.length) { + const workbenchRegistry = Registry.as(WorkbenchExtensions.Workbench); + workbenchRegistry.registerWorkbenchContribution(LanguageSurveysContribution); +} \ No newline at end of file From 9c4331038920f7045310b7549623b6efb987708b Mon Sep 17 00:00:00 2001 From: isidor Date: Sat, 20 May 2017 00:22:03 +0200 Subject: [PATCH 0702/1164] update distro --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fa2e5bddfa5..817d3162edb 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "code-oss-dev", "version": "1.13.0", "electronVersion": "1.6.6", - "distro": "a1870d5e65d959a5ee8a4c7fce08b136ca47dd79", + "distro": "4de68ec7f643597f97a2bd849d6afeba2ae6a729", "author": { "name": "Microsoft Corporation" }, From 338dea778bf98f0a79ef54b686000a716ad2cfbd Mon Sep 17 00:00:00 2001 From: isidor Date: Sat, 20 May 2017 00:49:37 +0200 Subject: [PATCH 0703/1164] Do not log write to settings.json as a filePUT event as it ruins our JSON usage data --- .../services/textfile/common/textFileEditorModel.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index 234b9c8cc2d..debbf1fc972 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -18,6 +18,7 @@ import diagnostics = require('vs/base/common/diagnostics'); import types = require('vs/base/common/types'); import { IMode } from 'vs/editor/common/modes'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ITextFileService, IAutoSaveConfiguration, ModelState, ITextFileEditorModel, IModelSaveOptions, ISaveErrorHandler, ISaveParticipant, StateChange, SaveReason, IRawTextContent } from 'vs/workbench/services/textfile/common/textfiles'; import { EncodingMode, EditorModel } from 'vs/workbench/common/editor'; import { BaseTextEditorModel } from 'vs/workbench/common/editor/textEditorModel'; @@ -81,7 +82,8 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil @IInstantiationService private instantiationService: IInstantiationService, @ITelemetryService private telemetryService: ITelemetryService, @ITextFileService private textFileService: ITextFileService, - @IBackupFileService private backupFileService: IBackupFileService + @IBackupFileService private backupFileService: IBackupFileService, + @IEnvironmentService private environmentService: IEnvironmentService ) { super(modelService, modeService); @@ -665,7 +667,12 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil diag(`doSave(${versionId}) - after updateContent()`, this.resource, new Date()); // Telemetry - this.telemetryService.publicLog('filePUT', { mimeType: guessMimeTypes(this.resource.fsPath).join(', '), ext: paths.extname(this.lastResolvedDiskStat.resource.fsPath) }); + if (this.resource.fsPath === this.environmentService.appSettingsPath) { + // Do not log write to settings.json as a filePUT event as it ruins our JSON usage data + this.telemetryService.publicLog('settingsWritten'); + } else { + this.telemetryService.publicLog('filePUT', { mimeType: guessMimeTypes(this.resource.fsPath).join(', '), ext: paths.extname(this.lastResolvedDiskStat.resource.fsPath) }); + } // Update dirty state unless model has changed meanwhile if (versionId === this.versionId) { From bd14b32aeaaec846f41a8ceaee90752e7198354b Mon Sep 17 00:00:00 2001 From: Daniel Ye Date: Fri, 19 May 2017 16:10:35 -0700 Subject: [PATCH 0704/1164] 2017-05-19. Merged in translations. --- .../out/settingsDocumentHelper.i18n.json | 2 +- i18n/chs/extensions/git/out/main.i18n.json | 2 +- .../extensions/git/out/scmProvider.i18n.json | 2 +- i18n/chs/extensions/git/package.i18n.json | 8 +++---- i18n/chs/extensions/jake/out/main.i18n.json | 6 +++++ i18n/chs/extensions/jake/package.i18n.json | 6 +++++ .../typescript/out/utils/logger.i18n.json | 4 +++- .../extensions/typescript/package.i18n.json | 5 +++- .../base/common/jsonErrorMessages.i18n.json | 2 +- .../src/vs/code/electron-main/menus.i18n.json | 1 + .../config/commonEditorConfig.i18n.json | 3 ++- .../browser/referencesWidget.i18n.json | 3 +++ .../suggest/browser/suggestWidget.i18n.json | 2 ++ ...guageConfigurationExtensionPoint.i18n.json | 6 ++++- .../markers/common/problemMatcher.i18n.json | 2 -- .../theme/common/colorRegistry.i18n.json | 17 ++++++++++--- .../api/node/extHostTreeViews.i18n.json | 6 +++++ .../src/vs/workbench/common/theme.i18n.json | 3 +++ .../electron-browser/shell.i18n.json | 6 +---- .../electron-browser/window.i18n.json | 4 +--- .../debugConfigurationManager.i18n.json | 2 +- .../electronDebugActions.i18n.json | 1 + .../parts/debug/node/debugAdapter.i18n.json | 1 - .../actions/balance.i18n.json | 5 +++- .../actions/editPoints.i18n.json | 5 +++- .../actions/evaluateMath.i18n.json | 4 +++- .../actions/expandAbbreviation.i18n.json | 4 +++- .../actions/incrementDecrement.i18n.json | 9 ++++++- .../actions/matchingPair.i18n.json | 4 +++- .../actions/mergeLines.i18n.json | 4 +++- .../actions/reflectCssValue.i18n.json | 4 +++- .../actions/removeTag.i18n.json | 4 +++- .../actions/selectItem.i18n.json | 5 +++- .../actions/splitJoinTag.i18n.json | 4 +++- .../actions/toggleComment.i18n.json | 4 +++- .../actions/updateImageSize.i18n.json | 4 +++- .../actions/updateTag.i18n.json | 6 ++++- .../actions/wrapWithAbbreviation.i18n.json | 6 ++++- .../emmet.contribution.i18n.json | 9 ++++++- .../extensionsUtils.i18n.json | 6 +++++ .../browser/files.contribution.i18n.json | 2 +- .../browser/preferencesRenderers.i18n.json | 1 + .../browser/searchResultsView.i18n.json | 4 +++- .../tasks/browser/restartQuickOpen.i18n.json | 1 - .../tasks/browser/taskQuickOpen.i18n.json | 1 - .../terminalActions.i18n.json | 4 +++- .../themes.contribution.i18n.json | 1 + .../vs_code_welcome_page.i18n.json | 20 +++++++--------- .../electron-browser/welcomePage.i18n.json | 8 ++++--- .../walkThroughPart.i18n.json | 3 ++- .../configurationEditingService.i18n.json | 5 +++- .../common/workbenchModeService.i18n.json | 2 +- .../cht/extensions/git/out/commands.i18n.json | 1 + i18n/cht/extensions/git/package.i18n.json | 4 +++- i18n/cht/extensions/jake/out/main.i18n.json | 6 +++++ i18n/cht/extensions/jake/package.i18n.json | 6 +++++ .../typescript/out/utils/logger.i18n.json | 4 +++- .../extensions/typescript/package.i18n.json | 1 + .../resourceviewer/resourceViewer.i18n.json | 3 +++ .../base/common/jsonErrorMessages.i18n.json | 12 +++++++++- .../config/commonEditorConfig.i18n.json | 1 - .../common/view/editorColorRegistry.i18n.json | 8 +++---- .../browser/referencesWidget.i18n.json | 1 + .../suggest/browser/suggestWidget.i18n.json | 1 + ...guageConfigurationExtensionPoint.i18n.json | 3 ++- .../markers/common/problemMatcher.i18n.json | 2 -- .../theme/common/colorRegistry.i18n.json | 9 ++++++- .../api/node/extHostTreeViews.i18n.json | 6 +++++ .../browser/actions/configureLocale.i18n.json | 1 + .../electron-browser/shell.i18n.json | 6 +---- .../electron-browser/window.i18n.json | 4 +--- .../actions/balance.i18n.json | 5 +++- .../actions/editPoints.i18n.json | 5 +++- .../actions/evaluateMath.i18n.json | 4 +++- .../actions/expandAbbreviation.i18n.json | 4 +++- .../actions/incrementDecrement.i18n.json | 9 ++++++- .../actions/matchingPair.i18n.json | 4 +++- .../actions/mergeLines.i18n.json | 4 +++- .../actions/reflectCssValue.i18n.json | 4 +++- .../actions/removeTag.i18n.json | 4 +++- .../actions/selectItem.i18n.json | 5 +++- .../actions/splitJoinTag.i18n.json | 4 +++- .../actions/toggleComment.i18n.json | 4 +++- .../actions/updateImageSize.i18n.json | 4 +++- .../actions/updateTag.i18n.json | 6 ++++- .../actions/wrapWithAbbreviation.i18n.json | 6 ++++- .../emmet.contribution.i18n.json | 9 ++++++- .../extensionsUtils.i18n.json | 6 +++++ .../tasks/browser/restartQuickOpen.i18n.json | 1 - .../tasks/browser/taskQuickOpen.i18n.json | 1 - .../vs_code_welcome_page.i18n.json | 18 +++++--------- .../electron-browser/welcomePage.i18n.json | 4 ++-- .../deu/extensions/git/out/commands.i18n.json | 1 + i18n/deu/extensions/git/package.i18n.json | 3 ++- i18n/deu/extensions/jake/out/main.i18n.json | 6 +++++ i18n/deu/extensions/jake/package.i18n.json | 6 +++++ .../typescript/out/utils/logger.i18n.json | 4 +++- .../config/commonEditorConfig.i18n.json | 1 - .../common/view/editorColorRegistry.i18n.json | 4 +++- .../suggest/browser/suggestWidget.i18n.json | 1 + .../markers/common/problemMatcher.i18n.json | 2 -- .../theme/common/colorRegistry.i18n.json | 19 ++++++++++++++- .../api/node/extHostTreeViews.i18n.json | 6 +++++ .../electron-browser/shell.i18n.json | 6 +---- .../electron-browser/window.i18n.json | 4 +--- .../actions/balance.i18n.json | 5 +++- .../actions/editPoints.i18n.json | 5 +++- .../actions/evaluateMath.i18n.json | 4 +++- .../actions/expandAbbreviation.i18n.json | 4 +++- .../actions/incrementDecrement.i18n.json | 9 ++++++- .../actions/matchingPair.i18n.json | 4 +++- .../actions/mergeLines.i18n.json | 4 +++- .../actions/reflectCssValue.i18n.json | 4 +++- .../actions/removeTag.i18n.json | 4 +++- .../actions/selectItem.i18n.json | 5 +++- .../actions/splitJoinTag.i18n.json | 4 +++- .../actions/toggleComment.i18n.json | 4 +++- .../actions/updateImageSize.i18n.json | 4 +++- .../actions/updateTag.i18n.json | 6 ++++- .../actions/wrapWithAbbreviation.i18n.json | 6 ++++- .../emmet.contribution.i18n.json | 9 ++++++- .../extensionsUtils.i18n.json | 6 +++++ .../tasks/browser/restartQuickOpen.i18n.json | 1 - .../tasks/browser/taskQuickOpen.i18n.json | 1 - .../vs_code_welcome_page.i18n.json | 18 +++++--------- .../electron-browser/welcomePage.i18n.json | 4 ++-- i18n/esn/extensions/jake/out/main.i18n.json | 6 +++++ i18n/esn/extensions/jake/package.i18n.json | 6 +++++ .../typescript/out/utils/logger.i18n.json | 4 +++- .../extensions/typescript/package.i18n.json | 5 +++- .../src/vs/code/electron-main/menus.i18n.json | 1 + .../config/commonEditorConfig.i18n.json | 1 - .../suggest/browser/suggestWidget.i18n.json | 1 + .../markers/common/problemMatcher.i18n.json | 2 -- .../theme/common/colorRegistry.i18n.json | 6 ++++- .../api/node/extHostTreeViews.i18n.json | 6 +++++ .../electron-browser/shell.i18n.json | 6 +---- .../electron-browser/window.i18n.json | 4 +--- .../electronDebugActions.i18n.json | 1 + .../parts/debug/node/debugAdapter.i18n.json | 1 - .../actions/balance.i18n.json | 5 +++- .../actions/editPoints.i18n.json | 5 +++- .../actions/evaluateMath.i18n.json | 4 +++- .../actions/expandAbbreviation.i18n.json | 4 +++- .../actions/incrementDecrement.i18n.json | 9 ++++++- .../actions/matchingPair.i18n.json | 4 +++- .../actions/mergeLines.i18n.json | 4 +++- .../actions/reflectCssValue.i18n.json | 4 +++- .../actions/removeTag.i18n.json | 4 +++- .../actions/selectItem.i18n.json | 5 +++- .../actions/splitJoinTag.i18n.json | 4 +++- .../actions/toggleComment.i18n.json | 4 +++- .../actions/updateImageSize.i18n.json | 4 +++- .../actions/updateTag.i18n.json | 6 ++++- .../actions/wrapWithAbbreviation.i18n.json | 6 ++++- .../emmet.contribution.i18n.json | 9 ++++++- .../extensionsUtils.i18n.json | 6 +++++ .../browser/preferencesRenderers.i18n.json | 1 + .../tasks/browser/restartQuickOpen.i18n.json | 1 - .../tasks/browser/taskQuickOpen.i18n.json | 1 - .../terminalActions.i18n.json | 4 +++- .../themes.contribution.i18n.json | 1 + .../vs_code_welcome_page.i18n.json | 20 +++++++--------- .../electron-browser/welcomePage.i18n.json | 8 ++++--- .../walkThroughPart.i18n.json | 3 ++- .../configurationEditingService.i18n.json | 1 + i18n/fra/extensions/jake/out/main.i18n.json | 6 +++++ i18n/fra/extensions/jake/package.i18n.json | 6 +++++ .../typescript/out/utils/logger.i18n.json | 4 +++- .../config/commonEditorConfig.i18n.json | 1 + .../common/view/editorColorRegistry.i18n.json | 8 ++++++- .../suggest/browser/suggestWidget.i18n.json | 1 + ...guageConfigurationExtensionPoint.i18n.json | 6 ++++- .../markers/common/problemMatcher.i18n.json | 2 -- .../theme/common/colorRegistry.i18n.json | 15 +++++++++++- .../api/node/extHostTreeViews.i18n.json | 6 +++++ .../electron-browser/shell.i18n.json | 6 +---- .../electron-browser/window.i18n.json | 4 +--- .../actions/balance.i18n.json | 5 +++- .../actions/editPoints.i18n.json | 5 +++- .../actions/evaluateMath.i18n.json | 4 +++- .../actions/expandAbbreviation.i18n.json | 4 +++- .../actions/incrementDecrement.i18n.json | 9 ++++++- .../actions/matchingPair.i18n.json | 4 +++- .../actions/mergeLines.i18n.json | 4 +++- .../actions/reflectCssValue.i18n.json | 4 +++- .../actions/removeTag.i18n.json | 4 +++- .../actions/selectItem.i18n.json | 5 +++- .../actions/splitJoinTag.i18n.json | 4 +++- .../actions/toggleComment.i18n.json | 4 +++- .../actions/updateImageSize.i18n.json | 4 +++- .../actions/updateTag.i18n.json | 6 ++++- .../actions/wrapWithAbbreviation.i18n.json | 6 ++++- .../emmet.contribution.i18n.json | 9 ++++++- .../extensionsUtils.i18n.json | 6 +++++ .../tasks/browser/restartQuickOpen.i18n.json | 1 - .../tasks/browser/taskQuickOpen.i18n.json | 1 - .../vs_code_welcome_page.i18n.json | 18 +++++--------- .../electron-browser/welcomePage.i18n.json | 4 ++-- .../ita/extensions/git/out/commands.i18n.json | 1 + i18n/ita/extensions/git/package.i18n.json | 4 +++- i18n/ita/extensions/jake/out/main.i18n.json | 6 +++++ i18n/ita/extensions/jake/package.i18n.json | 6 +++++ ...rectiveCommentCompletionProvider.i18n.json | 6 ++++- .../typescript/out/utils/logger.i18n.json | 4 +++- .../extensions/typescript/package.i18n.json | 6 ++++- .../config/commonEditorConfig.i18n.json | 1 + .../common/view/editorColorRegistry.i18n.json | 8 ++++++- .../browser/referencesWidget.i18n.json | 3 +++ .../suggest/browser/suggestWidget.i18n.json | 2 ++ ...guageConfigurationExtensionPoint.i18n.json | 6 ++++- .../markers/common/problemMatcher.i18n.json | 2 -- .../theme/common/colorRegistry.i18n.json | 24 ++++++++++++++++++- .../api/node/extHostTreeViews.i18n.json | 6 +++++ .../electron-browser/shell.i18n.json | 6 +---- .../electron-browser/window.i18n.json | 4 +--- .../actions/balance.i18n.json | 5 +++- .../actions/editPoints.i18n.json | 5 +++- .../actions/evaluateMath.i18n.json | 4 +++- .../actions/expandAbbreviation.i18n.json | 4 +++- .../actions/incrementDecrement.i18n.json | 9 ++++++- .../actions/matchingPair.i18n.json | 4 +++- .../actions/mergeLines.i18n.json | 4 +++- .../actions/reflectCssValue.i18n.json | 4 +++- .../actions/removeTag.i18n.json | 4 +++- .../actions/selectItem.i18n.json | 5 +++- .../actions/splitJoinTag.i18n.json | 4 +++- .../actions/toggleComment.i18n.json | 4 +++- .../actions/updateImageSize.i18n.json | 4 +++- .../actions/updateTag.i18n.json | 6 ++++- .../actions/wrapWithAbbreviation.i18n.json | 6 ++++- .../emmet.contribution.i18n.json | 9 ++++++- .../extensionsUtils.i18n.json | 6 +++++ .../tasks/browser/restartQuickOpen.i18n.json | 1 - .../tasks/browser/taskQuickOpen.i18n.json | 1 - .../vs_code_welcome_page.i18n.json | 18 +++++--------- .../electron-browser/welcomePage.i18n.json | 4 ++-- i18n/jpn/extensions/jake/out/main.i18n.json | 6 +++++ i18n/jpn/extensions/jake/package.i18n.json | 6 +++++ .../typescript/out/utils/logger.i18n.json | 4 +++- .../src/vs/code/electron-main/menus.i18n.json | 1 + .../config/commonEditorConfig.i18n.json | 2 +- .../suggest/browser/suggestWidget.i18n.json | 1 + ...guageConfigurationExtensionPoint.i18n.json | 5 +++- .../markers/common/problemMatcher.i18n.json | 2 -- .../theme/common/colorRegistry.i18n.json | 8 ++++++- .../api/node/extHostTreeViews.i18n.json | 6 +++++ .../electron-browser/shell.i18n.json | 6 +---- .../electron-browser/window.i18n.json | 4 +--- .../parts/debug/node/debugAdapter.i18n.json | 1 - .../actions/balance.i18n.json | 5 +++- .../actions/editPoints.i18n.json | 5 +++- .../actions/evaluateMath.i18n.json | 4 +++- .../actions/expandAbbreviation.i18n.json | 4 +++- .../actions/incrementDecrement.i18n.json | 9 ++++++- .../actions/matchingPair.i18n.json | 4 +++- .../actions/mergeLines.i18n.json | 4 +++- .../actions/reflectCssValue.i18n.json | 4 +++- .../actions/removeTag.i18n.json | 4 +++- .../actions/selectItem.i18n.json | 5 +++- .../actions/splitJoinTag.i18n.json | 4 +++- .../actions/toggleComment.i18n.json | 4 +++- .../actions/updateImageSize.i18n.json | 4 +++- .../actions/updateTag.i18n.json | 6 ++++- .../actions/wrapWithAbbreviation.i18n.json | 6 ++++- .../emmet.contribution.i18n.json | 9 ++++++- .../extensionsUtils.i18n.json | 6 +++++ .../tasks/browser/restartQuickOpen.i18n.json | 1 - .../tasks/browser/taskQuickOpen.i18n.json | 1 - .../vs_code_welcome_page.i18n.json | 18 +++++--------- .../electron-browser/welcomePage.i18n.json | 4 ++-- .../walkThroughPart.i18n.json | 3 ++- i18n/kor/extensions/jake/out/main.i18n.json | 6 +++++ i18n/kor/extensions/jake/package.i18n.json | 6 +++++ .../typescript/out/utils/logger.i18n.json | 4 +++- .../suggest/browser/suggestWidget.i18n.json | 1 + .../markers/common/problemMatcher.i18n.json | 2 -- .../theme/common/colorRegistry.i18n.json | 6 ++++- .../api/node/extHostTreeViews.i18n.json | 6 +++++ .../electron-browser/shell.i18n.json | 6 +---- .../electron-browser/window.i18n.json | 4 +--- .../actions/balance.i18n.json | 5 +++- .../actions/editPoints.i18n.json | 5 +++- .../actions/evaluateMath.i18n.json | 4 +++- .../actions/expandAbbreviation.i18n.json | 4 +++- .../actions/incrementDecrement.i18n.json | 9 ++++++- .../actions/matchingPair.i18n.json | 4 +++- .../actions/mergeLines.i18n.json | 4 +++- .../actions/reflectCssValue.i18n.json | 4 +++- .../actions/removeTag.i18n.json | 4 +++- .../actions/selectItem.i18n.json | 5 +++- .../actions/splitJoinTag.i18n.json | 4 +++- .../actions/toggleComment.i18n.json | 4 +++- .../actions/updateImageSize.i18n.json | 4 +++- .../actions/updateTag.i18n.json | 6 ++++- .../actions/wrapWithAbbreviation.i18n.json | 6 ++++- .../emmet.contribution.i18n.json | 9 ++++++- .../extensionsUtils.i18n.json | 6 +++++ .../tasks/browser/restartQuickOpen.i18n.json | 1 - .../tasks/browser/taskQuickOpen.i18n.json | 1 - .../vs_code_welcome_page.i18n.json | 18 +++++--------- .../electron-browser/welcomePage.i18n.json | 4 ++-- i18n/rus/extensions/jake/out/main.i18n.json | 6 +++++ i18n/rus/extensions/jake/package.i18n.json | 6 +++++ .../typescript/out/utils/logger.i18n.json | 4 +++- .../suggest/browser/suggestWidget.i18n.json | 1 + .../markers/common/problemMatcher.i18n.json | 2 -- .../theme/common/colorRegistry.i18n.json | 18 +++++++++++++- .../api/node/extHostTreeViews.i18n.json | 6 +++++ .../electron-browser/shell.i18n.json | 6 +---- .../electron-browser/window.i18n.json | 4 +--- .../actions/balance.i18n.json | 5 +++- .../actions/editPoints.i18n.json | 5 +++- .../actions/evaluateMath.i18n.json | 4 +++- .../actions/expandAbbreviation.i18n.json | 4 +++- .../actions/incrementDecrement.i18n.json | 9 ++++++- .../actions/matchingPair.i18n.json | 4 +++- .../actions/mergeLines.i18n.json | 4 +++- .../actions/reflectCssValue.i18n.json | 4 +++- .../actions/removeTag.i18n.json | 4 +++- .../actions/selectItem.i18n.json | 5 +++- .../actions/splitJoinTag.i18n.json | 4 +++- .../actions/toggleComment.i18n.json | 4 +++- .../actions/updateImageSize.i18n.json | 4 +++- .../actions/updateTag.i18n.json | 6 ++++- .../actions/wrapWithAbbreviation.i18n.json | 6 ++++- .../emmet.contribution.i18n.json | 9 ++++++- .../extensionsUtils.i18n.json | 6 +++++ .../tasks/browser/restartQuickOpen.i18n.json | 1 - .../tasks/browser/taskQuickOpen.i18n.json | 1 - .../vs_code_welcome_page.i18n.json | 18 +++++--------- .../electron-browser/welcomePage.i18n.json | 4 ++-- 332 files changed, 1192 insertions(+), 446 deletions(-) create mode 100644 i18n/chs/extensions/jake/out/main.i18n.json create mode 100644 i18n/chs/extensions/jake/package.i18n.json create mode 100644 i18n/chs/src/vs/workbench/api/node/extHostTreeViews.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json create mode 100644 i18n/cht/extensions/jake/out/main.i18n.json create mode 100644 i18n/cht/extensions/jake/package.i18n.json create mode 100644 i18n/cht/src/vs/workbench/api/node/extHostTreeViews.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json create mode 100644 i18n/deu/extensions/jake/out/main.i18n.json create mode 100644 i18n/deu/extensions/jake/package.i18n.json create mode 100644 i18n/deu/src/vs/workbench/api/node/extHostTreeViews.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json create mode 100644 i18n/esn/extensions/jake/out/main.i18n.json create mode 100644 i18n/esn/extensions/jake/package.i18n.json create mode 100644 i18n/esn/src/vs/workbench/api/node/extHostTreeViews.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json create mode 100644 i18n/fra/extensions/jake/out/main.i18n.json create mode 100644 i18n/fra/extensions/jake/package.i18n.json create mode 100644 i18n/fra/src/vs/workbench/api/node/extHostTreeViews.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json create mode 100644 i18n/ita/extensions/jake/out/main.i18n.json create mode 100644 i18n/ita/extensions/jake/package.i18n.json create mode 100644 i18n/ita/src/vs/workbench/api/node/extHostTreeViews.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json create mode 100644 i18n/jpn/extensions/jake/out/main.i18n.json create mode 100644 i18n/jpn/extensions/jake/package.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/api/node/extHostTreeViews.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json create mode 100644 i18n/kor/extensions/jake/out/main.i18n.json create mode 100644 i18n/kor/extensions/jake/package.i18n.json create mode 100644 i18n/kor/src/vs/workbench/api/node/extHostTreeViews.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json create mode 100644 i18n/rus/extensions/jake/out/main.i18n.json create mode 100644 i18n/rus/extensions/jake/package.i18n.json create mode 100644 i18n/rus/src/vs/workbench/api/node/extHostTreeViews.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json diff --git a/i18n/chs/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json b/i18n/chs/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json index 214156f8972..6ad910135a0 100644 --- a/i18n/chs/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json +++ b/i18n/chs/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json @@ -6,7 +6,7 @@ { "activeEditorShort": "例如 myFile.txt", "activeEditorMedium": "e.g. myFolder/myFile.txt", - "activeEditorLong": "e.g. /Users/Development/myProject/myFolder/myFile.txt", + "activeEditorLong": "例如 /Users/Development/myProject/myFolder/myFile.txt", "rootName": "例如 myProject", "rootPath": "例如 /Users/Development/myProject", "appName": "例如 VS Code", diff --git a/i18n/chs/extensions/git/out/main.i18n.json b/i18n/chs/extensions/git/out/main.i18n.json index 266c6a1a3e5..7b6c6f37d1f 100644 --- a/i18n/chs/extensions/git/out/main.i18n.json +++ b/i18n/chs/extensions/git/out/main.i18n.json @@ -7,5 +7,5 @@ "using git": "使用 {1} 中的 GIT {0}", "updateGit": "更新 GIT", "neverShowAgain": "不再显示", - "git20": "似乎已安装 GIT {0}。Code 非常适合 GIT >= 2" + "git20": "你似乎已安装 Git {0}。Code 和 Git 版本 >=2 一起工作最佳" } \ No newline at end of file diff --git a/i18n/chs/extensions/git/out/scmProvider.i18n.json b/i18n/chs/extensions/git/out/scmProvider.i18n.json index 7fded37328a..c52199b46c1 100644 --- a/i18n/chs/extensions/git/out/scmProvider.i18n.json +++ b/i18n/chs/extensions/git/out/scmProvider.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "commit": "Commit" + "commit": "提交" } \ No newline at end of file diff --git a/i18n/chs/extensions/git/package.i18n.json b/i18n/chs/extensions/git/package.i18n.json index 3ae1cbfe222..bed9f4de89c 100644 --- a/i18n/chs/extensions/git/package.i18n.json +++ b/i18n/chs/extensions/git/package.i18n.json @@ -20,9 +20,9 @@ "command.cleanAll": "放弃所有更改", "command.commit": "Commit", "command.commitStaged": "提交已暂存文件", - "command.commitStagedSigned": "提交暂存数据(已签收)", + "command.commitStagedSigned": "提交已暂存文件(已签名)", "command.commitAll": "全部提交", - "command.commitAllSigned": "提交所有数据(已签收)", + "command.commitAllSigned": "全部提交(已签名)", "command.undoCommit": "撤消上次提交", "command.checkout": "签出到...", "command.branch": "创建分支...", @@ -34,11 +34,11 @@ "command.publish": "发布", "command.showOutput": "显示 GIT 输出", "config.enabled": "是否已启用 GIT", - "config.path": "可执行 GIT 的路径", + "config.path": "Git 可执行文件路径", "config.autorefresh": "是否已启用自动刷新", "config.autofetch": "是否启用了自动提取", "config.enableLongCommitWarning": "是否针对长段提交消息进行警告", - "config.confirmSync": "同步 GIT 存储库前请先进行确认", + "config.confirmSync": "同步 Git 存储库前进行确认", "config.countBadge": "控制 Git 徽章计数器。“all”计算所有更改。“tracked”只计算跟踪的更改。“off”关闭此功能。", "config.checkoutType": "控制运行“签出到...”时列出的分支的类型。“all”显示所有 refs,“local”只显示本地分支,“tags”只显示标签,“remote”只显示远程分支。", "config.ignoreLegacyWarning": "忽略旧版 Git 警告", diff --git a/i18n/chs/extensions/jake/out/main.i18n.json b/i18n/chs/extensions/jake/out/main.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/extensions/jake/out/main.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/extensions/jake/package.i18n.json b/i18n/chs/extensions/jake/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/extensions/jake/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript/out/utils/logger.i18n.json b/i18n/chs/extensions/typescript/out/utils/logger.i18n.json index 8b6ad71cd4e..bc738f43d0c 100644 --- a/i18n/chs/extensions/typescript/out/utils/logger.i18n.json +++ b/i18n/chs/extensions/typescript/out/utils/logger.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript/package.i18n.json b/i18n/chs/extensions/typescript/package.i18n.json index 5e077ba8d02..7d185d9e36e 100644 --- a/i18n/chs/extensions/typescript/package.i18n.json +++ b/i18n/chs/extensions/typescript/package.i18n.json @@ -33,10 +33,13 @@ "javascript.validate.enable": "启用/禁用 JavaScript 验证。", "typescript.goToProjectConfig.title": "转到项目配置", "javascript.goToProjectConfig.title": "转到项目配置", + "javascript.referencesCodeLens.enabled": "启用/禁用在 JavaScript 文件中引用 CodeLens。", + "typescript.referencesCodeLens.enabled": "启用/禁用在 TypeScript 文件中引用 CodeLens。要求 TypeScript >= 2.0.6。", "typescript.implementationsCodeLens.enabled": "启用/禁用实现 CodeLens。要求 TypeScript >= 2.2.0。", "typescript.openTsServerLog.title": "打开 TS 服务器日志", "typescript.selectTypeScriptVersion.title": "选择 TypeScript 版本", "jsDocCompletion.enabled": "启用/禁用自动 JSDoc 注释", "javascript.implicitProjectConfig.checkJs": "启用/禁用 JavaScript 文件的语义检查。现有的 jsconfig.json 或\n tsconfig.json 文件会覆盖此设置。要求 TypeScript >=2.3.1。", - "typescript.check.npmIsInstalled": "检查是否安装了 NPM 以进行自动 typings 获取" + "typescript.check.npmIsInstalled": "检查是否安装了 NPM 以进行自动 typings 获取", + "javascript.nameSuggestions": "启用/禁用在 JavaScript 建议列表中包含文件中的唯一名称。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/chs/src/vs/base/common/jsonErrorMessages.i18n.json index a8dcb4d1020..0400ef47d7c 100644 --- a/i18n/chs/src/vs/base/common/jsonErrorMessages.i18n.json +++ b/i18n/chs/src/vs/base/common/jsonErrorMessages.i18n.json @@ -12,5 +12,5 @@ "error.commaExpected": "需要逗号", "error.closeBraceExpected": "需要右大括号", "error.closeBracketExpected": "需要右括号", - "error.endOfFileExpected": "预期的文件结尾" + "error.endOfFileExpected": "需要文件结尾(EOF)" } \ No newline at end of file diff --git a/i18n/chs/src/vs/code/electron-main/menus.i18n.json b/i18n/chs/src/vs/code/electron-main/menus.i18n.json index d2d3d4ed796..16b5dc1479a 100644 --- a/i18n/chs/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/chs/src/vs/code/electron-main/menus.i18n.json @@ -143,6 +143,7 @@ "miAccessibilityOptions": "辅助功能选项(&&O)", "miReportIssues": "报告问题(&&I)", "miWelcome": "欢迎使用(&&W)", + "miInteractivePlayground": "交互式演练场(&&I)", "miDocumentation": "文档(&&D)", "miReleaseNotes": "发行说明(&&R)", "miKeyboardShortcuts": "键盘快捷方式参考(&&K)", diff --git a/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json index 97e41cde2c5..ad55e59f4eb 100644 --- a/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -9,6 +9,7 @@ "fontWeight": "控制字体粗细。", "fontSize": "以像素为单位控制字号。", "lineHeight": "控制行高。使用 0 通过字号计算行高。", + "letterSpacing": "以像素为单位控制字符间距。", "lineNumbers": "控制行号的显示。可能的值为“开”、“关”和“相对”。“相对”将显示从当前光标位置开始计数的行数。", "rulers": "显示垂直标尺的列", "wordSeparators": "执行文字相关的导航或操作时将用作文字分隔符的字符", @@ -26,6 +27,7 @@ "wordWrap.on": "将在视区宽度处换行。", "wordWrap.wordWrapColumn": "将在 \"editor.wordWrapColumn\" 处换行。", "wordWrap.bounded": "将在最小视区和 \"editor.wordWrapColumn\" 处换行。", + "wordWrap": "控制折行方式。可以选择: - “off” (禁用折行), - “on” (视区折行), - “wordWrapColumn”(在“editor.wordWrapColumn”处折行)或 - “bounded”(在视区与“editor.wordWrapColumn”两者的较小者处折行)。", "wordWrapColumn": "在 \"editor.wordWrap\" 为 \"wordWrapColumn\" 或 \"bounded\" 时控制编辑器列的换行。", "wrappingIndent": "控制换行的行的缩进。可以是\\\\\"none\\\\\"、 \\\\\"same\\\\\" 或 \\\\\"indent\\\\\"。", "mouseWheelScrollSensitivity": "要对鼠标滚轮滚动事件的 \"deltaX\" 和 \"deltaY\" 使用的乘数 ", @@ -61,7 +63,6 @@ "renderLineHighlight": "控制编辑器应如何呈现当前行突出显示,可能为“无”、“装订线”、“线”和“全部”。", "codeLens": "控制编辑器是否显示代码滤镜", "folding": "控制编辑器是否启用代码折叠功能", - "hideFoldIcons": "控制是否自动隐藏导航线上的折叠图标。", "matchBrackets": "当选择其中一项时,将突出显示匹配的括号。", "glyphMargin": "控制编辑器是否应呈现垂直字形边距。字形边距最常用于调试。", "useTabStops": "在制表位后插入和删除空格", diff --git a/i18n/chs/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json b/i18n/chs/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json index ae160d59235..70e89645ee3 100644 --- a/i18n/chs/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json @@ -16,9 +16,12 @@ "peekViewTitleInfoForeground": "速览视图标题信息颜色。", "peekViewBorder": "速览视图边框和箭头颜色。", "peekViewResultsBackground": "速览视图结果列表背景颜色。", + "peekViewResultsMatchForeground": "速览视图结果列表中行节点的前景色。", + "peekViewResultsFileForeground": "速览视图结果列表中文件节点的前景色。", "peekViewResultsSelectionBackground": "速览视图结果列表中所选条目的背景颜色。", "peekViewResultsSelectionForeground": "速览视图结果列表中所选条目的前景色。", "peekViewEditorBackground": "速览视图编辑器背景颜色。", + "peekViewEditorGutterBackground": "速览视图编辑器中导航线的背景颜色。", "peekViewResultsMatchHighlight": "在速览视图结果列表中匹配突出显示颜色。", "peekViewEditorMatchHighlight": "在速览视图编辑器中匹配突出显示颜色。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/chs/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 215e790d4d5..4e1a0a30e42 100644 --- a/i18n/chs/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,8 +9,10 @@ "editorSuggestWidgetForeground": "建议小组件的前景颜色。", "editorSuggestWidgetSelectedBackground": "建议小组件中被选择条目的背景颜色。", "editorSuggestWidgetHighlightForeground": "建议小组件中匹配内容的高亮颜色。", + "readMore": "阅读更多...{0}", "suggestionWithDetailsAriaLabel": "{0}(建议)具有详细信息", "suggestionAriaLabel": "{0},建议", + "readLess": "阅读简略信息...{0}", "suggestWidget.loading": "正在加载...", "suggestWidget.noSuggestions": "无建议。", "suggestionAriaAccepted": "{0},已接受", diff --git a/i18n/chs/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json b/i18n/chs/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json index f588a8a1586..a4b09b5b447 100644 --- a/i18n/chs/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json +++ b/i18n/chs/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json @@ -15,5 +15,9 @@ "schema.brackets": "定义增加和减少缩进的括号。", "schema.autoClosingPairs": "定义括号对。当输入左方括号时,将自动插入右方括号。", "schema.autoClosingPairs.notIn": "定义禁用了自动配对的作用域列表。", - "schema.surroundingPairs": "定义可用于包围所选字符串的括号对。" + "schema.surroundingPairs": "定义可用于包围所选字符串的括号对。", + "schema.wordPattern": "此语言的文本定义。", + "schema.wordPattern.pattern": "用于匹配文本的正则表达式模式。", + "schema.wordPattern.flags": "用于匹配文本的正则表达式标志。", + "schema.wordPattern.flags.errorMessage": "必须匹配模式“/^([gimuy]+)$/”。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/chs/src/vs/platform/markers/common/problemMatcher.i18n.json index a28f091a27b..7dc0d66e0aa 100644 --- a/i18n/chs/src/vs/platform/markers/common/problemMatcher.i18n.json +++ b/i18n/chs/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -34,7 +34,6 @@ "ProblemMatcherParser.noValidIdentifier": "错误: 模式属性 {0} 是无效的模式变量名。", "ProblemMatcherParser.problemPattern.watchingMatcher": "问题匹配程序必须定义监视的开始模式和结束模式。", "ProblemMatcherParser.invalidRegexp": "错误: 字符串 {0} 不是有效的正则表达式。\n", - "WatchingPatternSchema.regexp": "用于检测监视任务的开始和结束的正则表达式。", "WatchingPatternSchema.file": "文件名的匹配组索引。可以省略。", "PatternTypeSchema.name": "所提供或预定义模式的名称", "PatternTypeSchema.description": "问题模式或者所提供或预定义问题模式的名称。如果已指定基准,则可以省略。", @@ -46,7 +45,6 @@ "ProblemMatcherSchema.watching.activeOnStart": "如果设置为 true,则当任务开始时观察程序处于活动模式。这相当于发出与 beginPattern 匹配的行。", "ProblemMatcherSchema.watching.beginsPattern": "如果在输出内匹配,则在监视任务开始时会发出信号。", "ProblemMatcherSchema.watching.endsPattern": "如果在输出内匹配,则在监视任务结束时会发出信号。", - "ProblemMatcherSchema.watching": "用于跟踪观看模式开始和结束的模式。", "LegacyProblemMatcherSchema.watchedBegin.deprecated": "此属性已弃用。请改用观看属性。", "LegacyProblemMatcherSchema.watchedBegin": "一个正则表达式,发出受监视任务开始执行(通过文件监视触发)的信号。", "LegacyProblemMatcherSchema.watchedEnd.deprecated": "此属性已弃用。请改用观看属性。", diff --git a/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json index 6e56d819256..0af4fc2114c 100644 --- a/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/chs/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -16,6 +16,7 @@ "textSeparatorForeground": "文字分隔符的颜色。", "textLinkForeground": "文本中链接的前景色。", "textLinkActiveForeground": "文本中活动链接的前景色。", + "textPreformatForeground": "预格式化文本段的前景色。", "textBlockQuoteBackground": "文本中块引用的背景颜色。", "textBlockQuoteBorder": "文本中块引用的边框颜色。", "textCodeBlockBackground": "文本中代码块的背景颜色。", @@ -35,10 +36,13 @@ "dropdownForeground": "下拉列表前景色。", "dropdownBorder": "下拉列表边框。", "listFocusBackground": "焦点项在列表或树活动时的背景颜色。活动的列表或树具有键盘焦点,非活动的没有。", + "listFocusForeground": "焦点项在列表或树活动时的背景颜色。活动的列表或树具有键盘焦点,非活动的没有。", "listActiveSelectionBackground": "已选项在列表或树活动时的背景颜色。活动的列表或树具有键盘焦点,非活动的没有。", "listActiveSelectionForeground": "已选项在列表或树活动时的前景颜色。活动的列表或树具有键盘焦点,非活动的没有。", "listInactiveSelectionBackground": "已选项在列表或树非活动时的背景颜色。活动的列表或树具有键盘焦点,非活动的没有。", + "listInactiveSelectionForeground": "已选项在列表或树非活动时的前景颜色。活动的列表或树具有键盘焦点,非活动的没有。", "listHoverBackground": "使用鼠标移动项目时,列表或树的背景颜色。", + "listHoverForeground": "鼠标在项目上悬停时,列表或树的前景颜色。", "listDropBackground": "使用鼠标移动项目时,列表或树进行拖放的背景颜色。", "highlight": "在列表或树中搜索时,其中匹配内容的高亮颜色。", "pickerGroupForeground": "快速选取器分组标签的颜色。", @@ -46,6 +50,8 @@ "buttonForeground": "按钮前景色。", "buttonBackground": "按钮背景色。", "buttonHoverBackground": "按钮在悬停时的背景颜色。", + "badgeBackground": "Badge 背景色。Badge 是小型的信息标签,如表示搜索结果数量的标签。", + "badgeForeground": "Badge 前景色。Badge 是小型的信息标签,如表示搜索结果数量的标签。", "scrollbarShadow": "表示视图被滚动的滚动条阴影。", "scrollbarSliderBackground": "滑块的背景颜色。", "scrollbarSliderHoverBackground": "滑块在悬停时的背景颜色。", @@ -54,14 +60,19 @@ "editorBackground": "编辑器背景颜色。", "editorForeground": "编辑器默认前景色。", "editorWidgetBackground": "编辑器组件(如查找/替换)背景颜色。", + "editorWidgetBorder": "编辑器小组件的边框颜色。", "editorSelection": "编辑器所选内容的颜色。", "editorInactiveSelection": "非活动编辑器中所选内容的颜色。", "editorSelectionHighlight": "与所选内容具有相同内容的区域颜色。", "editorFindMatch": "当前搜索匹配项的颜色。", "findMatchHighlight": "其他搜索匹配项的颜色。", "findRangeHighlight": "限制搜索的范围的颜色。", - "hoverHighlight": "在显示软键盘的字下方突出显示。", - "hoverBackground": "编辑器软键盘背景色。", + "hoverHighlight": "悬停提示显示时文本底下的高亮颜色。", + "hoverBackground": "编辑器悬停提示的背景颜色。", "hoverBorder": "编辑器软键盘边框颜色。", - "activeLinkForeground": "活动链接颜色。" + "activeLinkForeground": "活动链接颜色。", + "diffEditorInserted": "已插入文本的背景颜色。", + "diffEditorRemoved": "被删除文本的背景颜色。", + "diffEditorInsertedOutline": "插入的文本的轮廓颜色。", + "diffEditorRemovedOutline": "被删除文本的轮廓颜色。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/chs/src/vs/workbench/api/node/extHostTreeViews.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/common/theme.i18n.json b/i18n/chs/src/vs/workbench/common/theme.i18n.json index d268b3ff224..64c51b8e74c 100644 --- a/i18n/chs/src/vs/workbench/common/theme.i18n.json +++ b/i18n/chs/src/vs/workbench/common/theme.i18n.json @@ -10,8 +10,10 @@ "tabActiveEditorGroupActiveForeground": "活动组中活动选项卡的前景色。在编辑器区域,选项卡是编辑器的容器。可在一个编辑器组中打开多个选项卡。可以有多个编辑器组。", "tabInactiveEditorGroupActiveForeground": "活动组中非活动选项卡的前景色。在编辑器区域,选项卡是编辑器的容器。可在一个编辑器组中打开多个选项卡。可以有多个编辑器组。", "editorGroupBackground": "编辑器组的背景颜色。编辑器组是编辑器的容器。此颜色在拖动编辑器组时显示。", + "tabsContainerBackground": "启用选项卡时编辑器组标题的背景颜色。编辑器组是编辑器的容器。", "editorGroupHeaderBackground": "禁用选项卡时编辑器组标题的背景颜色。编辑器组是编辑器的容器。", "editorGroupBorder": "将多个编辑器组彼此分隔开的颜色。编辑器组是编辑器的容器。", + "editorDragAndDropBackground": "拖动编辑器时的背景颜色。此颜色应有透明度,以便编辑器内容能透过背景。", "panelBackground": "面板的背景色。面板显示在编辑器区域下方,可包含输出和集成终端等视图。", "panelBorder": "分隔到编辑器的顶部面板边框色。面板显示在编辑器区域下方,可包含输出和集成终端等视图。", "panelActiveTitleForeground": "活动面板的标题颜色。面板显示在编辑器区域下方,并包含输出和集成终端等视图。", @@ -26,6 +28,7 @@ "statusBarProminentItemHoverBackground": "状态栏突出显示项在悬停时的背景颜色。突出显示项比状态栏中的其他条目更显眼,表明其重要性更高。状态栏显示在窗口底部。", "activityBarBackground": "活动栏背景色。活动栏显示在最左侧或最右侧,并允许在侧边栏的视图间切换。", "activityBarForeground": "活动栏前景色(例如用于图标)。活动栏显示在最左侧或最右侧,并允许在侧边栏的视图间切换。", + "activityBarDragAndDropBackground": "活动栏项在被拖放时的反馈颜色。此颜色应有透明度,以便活动栏条目能透过此颜色。活动栏显示在最左侧或最右侧,并允许在侧边栏视图之间切换。", "activityBarBadgeBackground": "活动通知徽章背景色。活动栏显示在最左侧或最右侧,并允许在侧边栏的视图间切换。", "activityBarBadgeForeground": "活动通知徽章前景色。活动栏显示在最左侧或最右侧,并允许在侧边栏的视图间切换。", "sideBarBackground": "侧边栏背景色。侧边栏是资源管理器和搜索等视图的容器。", diff --git a/i18n/chs/src/vs/workbench/electron-browser/shell.i18n.json b/i18n/chs/src/vs/workbench/electron-browser/shell.i18n.json index 3af5d3e32a6..3f8eff44c3f 100644 --- a/i18n/chs/src/vs/workbench/electron-browser/shell.i18n.json +++ b/i18n/chs/src/vs/workbench/electron-browser/shell.i18n.json @@ -4,9 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "runningAsRoot": "不建议将 Code 作为“根”运行。", - "prof.message": "成功创建的配置文件。", - "prof.detail": "请创建问题并手动附加以下文件:\n{0}", - "prof.restartAndFileIssue": "创建问题并重启", - "prof.restart": "重启" + "runningAsRoot": "不建议将 Code 作为“根”运行。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/electron-browser/window.i18n.json b/i18n/chs/src/vs/workbench/electron-browser/window.i18n.json index 365d467f270..0f5f23325d4 100644 --- a/i18n/chs/src/vs/workbench/electron-browser/window.i18n.json +++ b/i18n/chs/src/vs/workbench/electron-browser/window.i18n.json @@ -11,7 +11,5 @@ "paste": "粘贴", "selectAll": "全选", "confirmOpen": "是否确定要打开 {0} 个文件夹?", - "confirmOpenButton": "打开(&&O)...", - "developer": "开发者", - "file": "文件" + "confirmOpenButton": "打开(&&O)..." } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json index 3cd5741027e..776abd849a7 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -24,7 +24,7 @@ "vscode.extension.contributes.debuggers.osx.runtime": "用于 OSX 的运行时。", "vscode.extension.contributes.debuggers.linux": "Linux 特定的设置。", "vscode.extension.contributes.debuggers.linux.runtime": "用于 Linux 的运行时。", - "vscode.extension.contributes.breakpoints": "贡献断电。", + "vscode.extension.contributes.breakpoints": "添加断点。", "vscode.extension.contributes.breakpoints.language": "对此语言允许断点。", "app.launch.json.title": "启动", "app.launch.json.version": "此文件格式的版本。", diff --git a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json index b02aea13f1d..83ff9579591 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json @@ -6,5 +6,6 @@ { "copyValue": "复制值", "copy": "复制", + "copyAll": "全部复制", "copyStackTrace": "复制调用堆栈" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 54243f83ce3..c322b5a660a 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,7 +7,6 @@ "debugAdapterBinNotFound": "调试适配器可执行的“{0}”不存在。", "debugAdapterCannotDetermineExecutable": "无法确定调试适配器“{0}”的可执行文件。", "debugType": "配置类型。", - "debugTypeNotRecognised": "无法识别此调试类型。确保已经安装并启用相应的调试扩展。", "node2NotSupported": "不再支持 \"node2\",改用 \"node\",并将 \"protocol\" 属性设为 \"inspector\"。", "debugName": "配置名称;在启动配置下拉菜单中显示。", "debugRequest": "请求配置类型。可以是“启动”或“附加”。", diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json index 8b6ad71cd4e..344b7a80602 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "balanceInward": "Emmet: 平衡(向内)", + "balanceOutward": "Emmet: 平衡(向外)" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json index 8b6ad71cd4e..87fec1a103c 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "previousEditPoint": "Emmet: 上一编辑点", + "nextEditPoint": "Emmet: 下一编辑点" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json index 8b6ad71cd4e..0598c67b46e 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "evaluateMathExpression": "Emmet: 评估数学表达式" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json index 8b6ad71cd4e..dcef9178c36 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "expandAbbreviationAction": "Emmet: 展开缩写" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json index 8b6ad71cd4e..403f855e5eb 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -3,4 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "incrementNumberByOneTenth": "Emmet: 以 0.1 为增量", + "incrementNumberByOne": "Emmet: 以 1 为增量", + "incrementNumberByTen": "Emmet: 以 10 为增量", + "decrementNumberByOneTenth": "Emmet: 以 0.1 为减量", + "decrementNumberByOne": "Emmet: 以 1 为减量", + "decrementNumberByTen": "Emmet: 以 10 为减量" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json index 8b6ad71cd4e..bb3ef016208 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "matchingPair": "Emmet: 转到匹配对" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json index 8b6ad71cd4e..8548113b66b 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "mergeLines": "Emmet: 合并行" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json index 8b6ad71cd4e..1dcfdd7b85c 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "reflectCSSValue": "Emmet: 反射 CSS 值" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json index 8b6ad71cd4e..b58d42bcafe 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "removeTag": "Emmet: 删除标记" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json index 8b6ad71cd4e..6d307aadabf 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "selectPreviousItem": "Emmet: 选择上一项", + "selectNextItem": "Emmet: 选择下一项" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json index 8b6ad71cd4e..5796a0dcab8 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "splitJoinTag": "Emmet: 分离/联接标记" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json index 8b6ad71cd4e..ecb3f893e89 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "toggleComment": "Emmet: 切换注释" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json index 8b6ad71cd4e..c5d6fd7b350 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "updateImageSize": "Emmet: 更新映像大小" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json index 8b6ad71cd4e..486e5397c4b 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "updateTag": "Emmet: 更新标记", + "enterTag": "输入标记", + "tag": "标记" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json index 8b6ad71cd4e..dbca7bf9016 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "wrapWithAbbreviationAction": "Emmet: 使用缩写进行包装", + "enterAbbreviation": "输入缩写", + "abbreviation": "缩写" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json index 8b6ad71cd4e..6a402e79e1e 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -3,4 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "emmetConfigurationTitle": "Emmet", + "triggerExpansionOnTab": "启用后,按 TAB 键时,将展开 Emmet 缩写。", + "emmetPreferences": "用于修改 Emmet 的某些操作和解决程序的首选项。", + "emmetSyntaxProfiles": "为指定的语法定义配置文件或使用带有特定规则的配置文件。", + "emmetExclude": "emmet 缩写不应在其中展开的语言数组。", + "emmetExtensionsPath": "转至包含 Emmet 配置文件、片段和首选项的文件的路径" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 7ceecf29ccc..ba343731820 100644 --- a/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -24,7 +24,7 @@ "files.autoSave.onFocusChange": "编辑器失去焦点时自动保存更新后的文件。", "files.autoSave.onWindowChange": "窗口失去焦点时自动保存更新后的文件。", "autoSave": "控制已更新文件的自动保存。接受的值:“{0}”、\"{1}”、“{2}”(编辑器失去焦点)、“{3}”(窗口失去焦点)。如果设置为“{4}”,则可在 \"files.autoSaveDelay\" 中配置延迟。", - "autoSaveDelay": "控制延迟(以秒为单位),在该延迟后将自动保存更新后的文件。仅在 \"files.autoSave'\" 设置为“{0}”时适用。", + "autoSaveDelay": "控制在多少毫秒后自动保存更改过的文件。仅在“files.autoSave”设置为“{0}”时适用。", "watcherExclude": "配置文件路径的 glob 模式以从文件监视排除。更改此设置要求重启。如果在启动时遇到 Code 消耗大量 CPU 时间,则可以排除大型文件夹以减少初始加载。", "hotExit.off": "禁用热退出。", "hotExit.onExit": "应用程序关闭时将触发热退出。在 Windows/Linux 上关闭最后一个窗口或触发 workbench.action.quit 命令(命令托盘、键绑定、菜单)会引起应用程序关闭。下次启动时将还原所有已备份的窗口。", diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 4cefcb62c6f..fe715f38bb4 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "errorInvalidConfiguration": "无法写入设置。请更正文件中的错误/警告,然后重试。", "editTtile": "编辑", "replaceDefaultValue": "在设置中替换", "copyDefaultValue": "复制到设置", diff --git a/i18n/chs/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json b/i18n/chs/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json index 66f5e523f6b..cce9767d1ac 100644 --- a/i18n/chs/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json @@ -6,5 +6,7 @@ { "searchMatches": "已找到 {0} 个匹配项", "searchMatch": "已找到 {0} 个匹配项", - "fileMatchAriaLabel": "文件夹 {2} 的文件 {1} 中有 {0} 个匹配项,搜索结果" + "fileMatchAriaLabel": "文件夹 {2} 的文件 {1} 中有 {0} 个匹配项,搜索结果", + "replacePreviewResultAria": "在第 {2} 列替换词组 {0} 为 {1},同行文本为 {3}", + "searchResultAria": "在第 {1} 列找到词组 {0},同行文本为 {2}" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json index 0fb0ed162d4..5ddd907a1c1 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0},任务", "tasksAriaLabel": "键入要重启的任务的名称", "noTasksMatching": "没有匹配的任务", "noTasksFound": "没有发现要重启的任务" diff --git a/i18n/chs/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json index fd9dbffc710..9094587319a 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0},任务", "tasksAriaLabel": "键入要运行的任务的名称", "noTasksMatching": "没有匹配的任务", "noTasksFound": "找不到任务" diff --git a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index a90f5c8220c..3b09b277be3 100644 --- a/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -26,5 +26,7 @@ "workbench.action.terminal.scrollUp": "向上滚动(行)", "workbench.action.terminal.scrollUpPage": "向上滚动(页)", "workbench.action.terminal.scrollToTop": "滚动到顶部", - "workbench.action.terminal.clear": "清除" + "workbench.action.terminal.clear": "清除", + "workbench.action.terminal.allowWorkspaceShell": "允许配置工作区 Shell", + "workbench.action.terminal.disallowWorkspaceShell": "禁止配置工作区 Shell" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index ea901c652ca..7a4782c7762 100644 --- a/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,6 +6,7 @@ { "selectTheme.label": "颜色主题", "installColorThemes": "安装其他颜色主题...", + "themes.selectTheme": "选择颜色主题(按上下箭头键预览)", "selectIconTheme.label": "文件图标主题", "installIconThemes": "安装其他文件图标主题...", "noIconThemeLabel": "无", diff --git a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index d72b1788e10..3b9d1ffa9ca 100644 --- a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -11,27 +11,20 @@ "welcomePage.openFolder": "打开文件夹...", "welcomePage.cloneGitRepository": "克隆 GIT 存储库...", "welcomePage.recent": "最近", + "welcomePage.moreRecent": "更多...", "welcomePage.noRecentFolders": "无最近使用文件夹", "welcomePage.help": "帮助", - "welcomePage.productDocumentation": "产品文档", "welcomePage.introductoryVideos": "入门视频", - "welcomePage.keybindingsReference": "键盘快捷方式参考", + "welcomePage.productDocumentation": "产品文档", "welcomePage.gitHubRepository": "GitHub 存储库", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "启动时显示欢迎页", + "welcomePage.customize": "自定义", "welcomePage.installKeymapDescription": "安装键盘快捷方式", - "welcomePage.installKeymap": "安装 {0}、{1}、{2} 和 {3} 的键盘快捷方式", - "welcomePage.vim": "Vim", - "welcomePage.vimCurrent": "Vim (当前)", - "welcomePage.sublime": "Sublime", - "welcomePage.sublimeCurrent": "Sublime (当前)", - "welcomePage.atom": "Atom", - "welcomePage.atomCurrent": "Atom (当前)", "welcomePage.others": "其他", "welcomePage.colorTheme": "颜色主题", "welcomePage.colorThemeDescription": "使编辑器和代码呈现你喜欢的外观", - "welcomePage.configureSettings": "配置设置", - "welcomePage.configureSettingsDescription": "通过调整设置来解锁 VS Code 的全部功能", + "welcomePage.learn": "学习", "welcomePage.showCommands": "查找并运行所有命令", "welcomePage.showCommandsDescription": "从控制面板快速访问并搜索命令({0})", "welcomePage.interfaceOverview": "界面概述", @@ -39,5 +32,8 @@ "welcomePage.interactivePlayground": "交互式演练场", "welcomePage.interactivePlaygroundDescription": "在简短演练中试用编辑器的基本功能", "welcomePage.quickLinks": "快速链接", - "welcomePage.keybindingsReferenceDescription": "包含常见键盘快捷方式的可打印 PDF 文件" + "welcomePage.keybindingsReference": "键盘快捷方式参考", + "welcomePage.keybindingsReferenceDescription": "包含常见键盘快捷方式的可打印 PDF 文件", + "welcomePage.configureSettings": "配置设置", + "welcomePage.configureSettingsDescription": "通过调整设置来解锁 VS Code 的全部功能" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index 71001529b3c..de7e3aa24d5 100644 --- a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,11 +5,13 @@ // Do not edit this file. It is machine generated. { "welcomePage": "欢迎使用", - "welcome.title": "欢迎使用", "welcomePage.keymapAlreadyInstalled": "已安装 {0} 键盘快捷方式。", "welcomePage.willReloadAfterInstallingKeymap": "安装 {0} 键盘快捷方式后,将重载窗口。", - "ok": "确定", "welcomePage.installingKeymap": "正在安装 {0} 键盘快捷方式...", "welcomePage.keymapNotFound": "找不到 ID 为 {1} 的 {0} 键盘快捷方式。", - "cancel": "取消" + "welcome.title": "欢迎使用", + "ok": "确定", + "cancel": "取消", + "welcomePage.quickLinkBackground": "欢迎页快速链接的背景颜色。", + "welcomePage.quickLinkHoverBackground": "欢迎页快速链接被悬停时的背景颜色。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json b/i18n/chs/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json index 20d662cd6cf..4beaf7510a9 100644 --- a/i18n/chs/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json @@ -5,5 +5,6 @@ // Do not edit this file. It is machine generated. { "walkThrough.unboundCommand": "未绑定", - "walkThrough.gitNotFound": "你的系统上似乎未安装 Git。" + "walkThrough.gitNotFound": "你的系统上似乎未安装 Git。", + "walkThrough.embeddedEditorBackground": "嵌入于交互式演练场中的编辑器的背景颜色。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index a7a1da08c20..e8a58d8ccea 100644 --- a/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -6,9 +6,12 @@ { "open": "打开设置", "close": "关闭", + "saveAndRetry": "保存设置并重试", "errorUnknownKey": "无法写入配置文件(未知密钥)", "errorInvalidTarget": "无法写入到配置文件(无效的目标)", "errorNoWorkspaceOpened": "没有打开任何文件夹,因此无法写入设置。请先打开一个文件夹,然后重试。", "errorInvalidConfiguration": "无法写入设置。请打开 **用户设置** 更正文件中的错误/警告,然后重试。", - "errorInvalidConfigurationWorkspace": "无法写入设置。请打开 **工作区设置** 更正文件中的错误/警告,然后重试。" + "errorInvalidConfigurationWorkspace": "无法写入设置。请打开 **工作区设置** 更正文件中的错误/警告,然后重试。", + "errorConfigurationFileDirty": "文件已变更,因此无法写入设置。请先保存 **用户设置** 文件,然后重试。", + "errorConfigurationFileDirtyWorkspace": "文件已变更,因此无法写入设置。请先保存 **工作区设置** 文件,然后重试。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json b/i18n/chs/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json index 30dff55c8ca..b21d42c25ac 100644 --- a/i18n/chs/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "invalid": "无效的“contributes.{0}”。应为数组。", + "invalid": "“contributes.{0}”无效。应为数组。", "invalid.empty": "“contributes.{0}”的值为空", "require.id": "属性“{0}”是必需的,其类型必须是“字符串”", "opt.extensions": "属性“{0}”可以省略,其类型必须是 \"string[]\"", diff --git a/i18n/cht/extensions/git/out/commands.i18n.json b/i18n/cht/extensions/git/out/commands.i18n.json index 2c6e6503951..849277aa8fe 100644 --- a/i18n/cht/extensions/git/out/commands.i18n.json +++ b/i18n/cht/extensions/git/out/commands.i18n.json @@ -18,6 +18,7 @@ "discard": "捨棄變更", "confirm discard all": "確定要捨棄所有變更嗎? 此動作無法復原!", "discardAll": "捨棄所有變更", + "no staged changes": "沒有暫存變更進行提交\n\n您希望自動暫存您所有變更並直接提交?", "yes": "是", "always": "永遠", "no changes": "沒有任何變更要認可。", diff --git a/i18n/cht/extensions/git/package.i18n.json b/i18n/cht/extensions/git/package.i18n.json index 8bab2a3d3eb..63f725ec183 100644 --- a/i18n/cht/extensions/git/package.i18n.json +++ b/i18n/cht/extensions/git/package.i18n.json @@ -42,5 +42,7 @@ "config.countBadge": "控制 git 徽章計數器。[全部] 會計算所有變更。[已追蹤] 只會計算追蹤的變更。[關閉] 會將其關閉。", "config.checkoutType": "控制在執行 [簽出至...] 時,會列出那些類型的分支。[全部] 會顯示所有參考,[本機] 只會顯示本機分支,[標記] 只會顯示標記,[遠端] 只會顯示遠端分支。", "config.ignoreLegacyWarning": "略過舊的 Git 警告", - "config.ignoreLimitWarning": "當存放庫中有過多變更時,略過警告。" + "config.ignoreLimitWarning": "當存放庫中有過多變更時,略過警告。", + "config.defaultCloneDirectory": "複製 Git 存放庫的預設位置", + "config.enableSmartCommit": "無暫存變更時提交所有變更" } \ No newline at end of file diff --git a/i18n/cht/extensions/jake/out/main.i18n.json b/i18n/cht/extensions/jake/out/main.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/extensions/jake/out/main.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/extensions/jake/package.i18n.json b/i18n/cht/extensions/jake/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/extensions/jake/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript/out/utils/logger.i18n.json b/i18n/cht/extensions/typescript/out/utils/logger.i18n.json index 8b6ad71cd4e..bc738f43d0c 100644 --- a/i18n/cht/extensions/typescript/out/utils/logger.i18n.json +++ b/i18n/cht/extensions/typescript/out/utils/logger.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/cht/extensions/typescript/package.i18n.json b/i18n/cht/extensions/typescript/package.i18n.json index 40830ab8a6c..316f057d5a8 100644 --- a/i18n/cht/extensions/typescript/package.i18n.json +++ b/i18n/cht/extensions/typescript/package.i18n.json @@ -34,6 +34,7 @@ "typescript.goToProjectConfig.title": "移至專案組態", "javascript.goToProjectConfig.title": "移至專案組態", "typescript.implementationsCodeLens.enabled": "啟用/停用實作 CodeLens。需要 TypeScript >= 2.2.0。", + "typescript.openTsServerLog.title": "開啟 TS 伺服器記錄", "typescript.selectTypeScriptVersion.title": "選取 TypeScript 版本", "jsDocCompletion.enabled": "啟用/停用自動 JSDoc 註解", "javascript.implicitProjectConfig.checkJs": "啟用/停用 JavaScript 檔案的語意檢查。現有的 jsconfig.json 或 tsconfig.json 檔案會覆寫此設定。需要 TypeScript >=2.3.1。", diff --git a/i18n/cht/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/cht/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index e50c19fed72..da6b8c6d2c0 100644 --- a/i18n/cht/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/cht/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -5,6 +5,9 @@ // Do not edit this file. It is machine generated. { "imgMeta": "{0}x{1} {2}", + "largeImageError": "因為影像太大,所以無法在編輯器中顯示。", + "resourceOpenExternalButton": "開啟影像", + "resourceOpenExternalText": " 要使用外部程式嗎?", "nativeBinaryError": "檔案為二進位檔、非常大或使用不支援的文字編碼,因此將不會顯示於編輯器中。", "sizeB": "{0}B", "sizeKB": "{0}KB", diff --git a/i18n/cht/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/cht/src/vs/base/common/jsonErrorMessages.i18n.json index 8b6ad71cd4e..a131a45e657 100644 --- a/i18n/cht/src/vs/base/common/jsonErrorMessages.i18n.json +++ b/i18n/cht/src/vs/base/common/jsonErrorMessages.i18n.json @@ -3,4 +3,14 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "error.invalidSymbol": "符號無效", + "error.invalidNumberFormat": "數字格式無效", + "error.propertyNameExpected": "必須有屬性名稱", + "error.valueExpected": "必須有值", + "error.colonExpected": "必須為冒號", + "error.commaExpected": "必須為逗號", + "error.closeBraceExpected": "必須為右大括號", + "error.closeBracketExpected": "必須為右中括號", + "error.endOfFileExpected": "必須為檔案結尾" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json index 23eb6654668..ec8f05fe340 100644 --- a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -62,7 +62,6 @@ "renderLineHighlight": "控制編輯器應如何轉譯目前反白的行,可能的值有 'none'、'gutter'、'line' 和 'all'。", "codeLens": "控制編輯器是否顯示程式碼濾鏡", "folding": "控制編輯器是否已啟用程式碼摺疊功能", - "hideFoldIcons": "自動隱藏摺疊圖示", "matchBrackets": "當選取某側的括號時,強調顯示另一側的配對括號。", "glyphMargin": "控制編輯器是否應轉譯垂直字符邊界。字符邊界最常用來進行偵錯。", "useTabStops": "插入和刪除接在定位停駐點後的空白字元", diff --git a/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json index 3597fc58634..7b011979df9 100644 --- a/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -7,11 +7,11 @@ "lineHighlight": "目前游標位置行的反白顯示背景色彩。", "lineHighlightBorderBox": "目前游標位置行之周圍框線的背景色彩。", "rangeHighlight": "反白顯示範圍的背景色彩,例如 Quick Open 與尋找功能。", - "caret": "編輯器游標的色彩。", - "editorWhitespaces": "編輯器中空白字元的色彩。", - "editorIndentGuides": "編輯器縮排輔助線的色彩。", "editorLineNumbers": "編輯器行號的色彩。", + "editorRuler": "編輯器尺規的色彩", "editorCodeLensForeground": "編輯器程式碼濾鏡的前景色彩", "editorBracketMatchBackground": "成對括號背景色彩", - "editorBracketMatchBorder": "成對括號邊框色彩" + "editorBracketMatchBorder": "成對括號邊框色彩", + "editorOverviewRulerBorder": "預覽檢視編輯器尺規的邊框色彩.", + "editorGutter": "編輯器邊框的背景顏色,包含行號與字形圖示的邊框." } \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json b/i18n/cht/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json index e0be46a962e..3dca8b60ce1 100644 --- a/i18n/cht/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json +++ b/i18n/cht/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json @@ -21,6 +21,7 @@ "peekViewResultsSelectionBackground": "在預覽檢視之結果清單中選取項目時的背景色彩。", "peekViewResultsSelectionForeground": "在預覽檢視之結果清單中選取項目時的前景色彩。", "peekViewEditorBackground": "預覽檢視編輯器的背景色彩。", + "peekViewEditorGutterBackground": "預覽檢視編輯器邊框(含行號或字形圖示)的背景色彩。", "peekViewResultsMatchHighlight": "在預覽檢視編輯器中比對時的反白顯示色彩。", "peekViewEditorMatchHighlight": "預覽檢視編輯器中比對時的反白顯示色彩。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/cht/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index e7251477a6c..28f57ee6a5f 100644 --- a/i18n/cht/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/cht/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,6 +9,7 @@ "editorSuggestWidgetForeground": "建議小工具的前景色彩。", "editorSuggestWidgetSelectedBackground": "建議小工具中所選項目的背景色彩。", "editorSuggestWidgetHighlightForeground": "建議小工具中相符醒目提示的色彩。", + "readMore": "進一步了解...{0}", "suggestionWithDetailsAriaLabel": "{0},建議,有詳細資料", "suggestionAriaLabel": "{0},建議", "suggestWidget.loading": "正在載入...", diff --git a/i18n/cht/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json b/i18n/cht/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json index e62440bc202..13c0c141c50 100644 --- a/i18n/cht/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json +++ b/i18n/cht/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json @@ -15,5 +15,6 @@ "schema.brackets": "定義增加或減少縮排的括弧符號。", "schema.autoClosingPairs": "定義成對括弧。輸入左括弧時,即自動插入右括弧。", "schema.autoClosingPairs.notIn": "定義停用自動配對的範圍清單。", - "schema.surroundingPairs": "定義可用以括住所選字串的成對括弧。" + "schema.surroundingPairs": "定義可用以括住所選字串的成對括弧。", + "schema.wordPattern.flags.errorMessage": "必須符合樣式 `/^([gimuy]+)$/`" } \ No newline at end of file diff --git a/i18n/cht/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/cht/src/vs/platform/markers/common/problemMatcher.i18n.json index d924f278ad0..cd3b3aa69fe 100644 --- a/i18n/cht/src/vs/platform/markers/common/problemMatcher.i18n.json +++ b/i18n/cht/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -34,7 +34,6 @@ "ProblemMatcherParser.noValidIdentifier": "錯誤: 樣式屬性 {0} 不是有效的樣式變數名稱。", "ProblemMatcherParser.problemPattern.watchingMatcher": "問題比對器必須同時定義監控的開始模式和結束模式。", "ProblemMatcherParser.invalidRegexp": "錯誤: 字串 {0} 不是有效的規則運算式。\n", - "WatchingPatternSchema.regexp": "規則運算式,用來偵測監看工作開始或結束。", "WatchingPatternSchema.file": "檔案名稱的符合群組索引。可以省略。", "PatternTypeSchema.name": "所提供或預先定義之模式的名稱", "PatternTypeSchema.description": "問題模式或所提供或預先定義之問題模式的名稱。如有指定基底,即可發出。", @@ -46,7 +45,6 @@ "ProblemMatcherSchema.watching.activeOnStart": "如果設定為 True,監控程式在工作啟動時處於主動模式。這相當於發出符合 beginPattern 的行", "ProblemMatcherSchema.watching.beginsPattern": "如果在輸出中相符,則會指示監看工作開始。", "ProblemMatcherSchema.watching.endsPattern": "如果在輸出中相符,則會指示監看工作結束。", - "ProblemMatcherSchema.watching": "這些模式可用於從頭到尾追蹤所關注的模式。", "LegacyProblemMatcherSchema.watchedBegin.deprecated": "此屬性即將淘汰。請改用關注的屬性。", "LegacyProblemMatcherSchema.watchedBegin": "規則運算式,指示監看的工作開始執行 (透過檔案監看觸發)。", "LegacyProblemMatcherSchema.watchedEnd.deprecated": "此屬性即將淘汰。請改用關注的屬性。", diff --git a/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json index 67ff64fbd80..85fdbbbbdf2 100644 --- a/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/cht/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -16,6 +16,8 @@ "textSeparatorForeground": "文字分隔符號的顏色。", "textLinkForeground": "內文連結的前景色彩", "textLinkActiveForeground": "內文使用連結的前景色彩", + "textPreformatForeground": "提示及建議文字的前景色彩。", + "textBlockQuoteBorder": "引用文字的框線顏色。", "textCodeBlockBackground": "文字區塊的背景顏色。", "widgetShadow": "小工具的陰影色彩,例如編輯器中的尋找/取代。", "inputBoxBackground": "輸入方塊的背景。", @@ -51,6 +53,7 @@ "scrollbarSliderBackground": "滑桿背景色彩。", "scrollbarSliderHoverBackground": "暫留時的滑桿背景色彩。", "scrollbarSliderActiveBackground": "使用中狀態時的滑桿背景色彩。", + "progressBarBackground": "長時間運行進度條的背景色彩.", "editorBackground": "編輯器的背景色彩。", "editorForeground": "編輯器的預設前景色彩。", "editorWidgetBackground": "編輯器小工具的背景色彩,例如尋找/取代。", @@ -63,5 +66,9 @@ "hoverHighlight": "在顯示了動態顯示的單字下方醒目提示。", "hoverBackground": "編輯器動態顯示的背景色彩。", "hoverBorder": "編輯器動態顯示的框線色彩。", - "activeLinkForeground": "使用中之連結的色彩。" + "activeLinkForeground": "使用中之連結的色彩。", + "diffEditorInserted": "插入文字的背景色彩。", + "diffEditorRemoved": "移除文字的背景色彩。", + "diffEditorInsertedOutline": "插入的文字外框色彩。", + "diffEditorRemovedOutline": "移除的文字外框色彩。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/cht/src/vs/workbench/api/node/extHostTreeViews.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/browser/actions/configureLocale.i18n.json b/i18n/cht/src/vs/workbench/browser/actions/configureLocale.i18n.json index f0c2e15a100..3e4cd2547c5 100644 --- a/i18n/cht/src/vs/workbench/browser/actions/configureLocale.i18n.json +++ b/i18n/cht/src/vs/workbench/browser/actions/configureLocale.i18n.json @@ -7,6 +7,7 @@ "configureLocale": "設定語言", "displayLanguage": "定義 VSCode 的顯示語言。", "doc": "如需支援的語言清單,請參閱 {0}。", + "restart": "變更值必須重新啟動 VSCode。", "fail.createSettings": "無法建立 '{0}' ({1})。", "JsonSchema.locale": "要使用的 UI 語言。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/electron-browser/shell.i18n.json b/i18n/cht/src/vs/workbench/electron-browser/shell.i18n.json index cd49d332f0d..5a00c198549 100644 --- a/i18n/cht/src/vs/workbench/electron-browser/shell.i18n.json +++ b/i18n/cht/src/vs/workbench/electron-browser/shell.i18n.json @@ -4,9 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "runningAsRoot": "建議不要以 'root' 身分執行 Code。", - "prof.message": "已成功建立設定檔。", - "prof.detail": "請建立問題,並手動附加下列檔案:\n{0}", - "prof.restartAndFileIssue": "建立問題並重新啟動", - "prof.restart": "重新啟動" + "runningAsRoot": "建議不要以 'root' 身分執行 Code。" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/electron-browser/window.i18n.json b/i18n/cht/src/vs/workbench/electron-browser/window.i18n.json index 89eb6c3653d..091cf1f44e4 100644 --- a/i18n/cht/src/vs/workbench/electron-browser/window.i18n.json +++ b/i18n/cht/src/vs/workbench/electron-browser/window.i18n.json @@ -11,7 +11,5 @@ "paste": "貼上", "selectAll": "全選", "confirmOpen": "確定要開啟 {0} 資料夾嗎?", - "confirmOpenButton": "開啟(&&O)...", - "developer": "開發人員", - "file": "檔案" + "confirmOpenButton": "開啟(&&O)..." } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json index 8b6ad71cd4e..71f6e49ff95 100644 --- a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "balanceInward": "Emmet: 平衡 (向內)", + "balanceOutward": "Emmet: 平衡 (向外)" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json index 8b6ad71cd4e..9c79dedc0ca 100644 --- a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "previousEditPoint": "Emmet: 上一個編輯端點", + "nextEditPoint": "Emmet: 下一個編輯端點" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json index 8b6ad71cd4e..2fd101d6104 100644 --- a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "evaluateMathExpression": "Emmet: 評估數學運算式" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json index 8b6ad71cd4e..e44c6de8d4a 100644 --- a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "expandAbbreviationAction": "Emmet: 展開縮寫" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json index 8b6ad71cd4e..64cf880ae48 100644 --- a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -3,4 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "incrementNumberByOneTenth": "Emmet: 依 0.1 遞增", + "incrementNumberByOne": "Emmet: 依 1 遞增", + "incrementNumberByTen": "Emmet: 依 10 遞增", + "decrementNumberByOneTenth": "Emmet: 依 0.1 遞減", + "decrementNumberByOne": "Emmet: 依 1 遞減", + "decrementNumberByTen": "Emmet: 依 10 遞減" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json index 8b6ad71cd4e..211f58191fe 100644 --- a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "matchingPair": "Emmet: 前往相符的配對" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json index 8b6ad71cd4e..3e491126dc2 100644 --- a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "mergeLines": "Emmet: 合併行" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json index 8b6ad71cd4e..1dcfdd7b85c 100644 --- a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "reflectCSSValue": "Emmet: 反射 CSS 值" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json index 8b6ad71cd4e..0c12d23d41a 100644 --- a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "removeTag": "Emmet: 移除標記" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json index 8b6ad71cd4e..2674e2efa4e 100644 --- a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "selectPreviousItem": "Emmet: 選取上一個項目", + "selectNextItem": "Emmet: 選取下一個項目" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json index 8b6ad71cd4e..b861468d52e 100644 --- a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "splitJoinTag": "Emmet: 分割/聯結標記" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json index 8b6ad71cd4e..9980a634fb8 100644 --- a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "toggleComment": "Emmet: 切換註解" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json index 8b6ad71cd4e..11fbb1e13ba 100644 --- a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "updateImageSize": "Emmet: 更新影像大小" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json index 8b6ad71cd4e..659656b1b2b 100644 --- a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "updateTag": "Emmet: 更新標記", + "enterTag": "輸入標記", + "tag": "標記" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json index 8b6ad71cd4e..78eafe156b1 100644 --- a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "wrapWithAbbreviationAction": "Emmet: 以縮寫包裝", + "enterAbbreviation": "輸入縮寫", + "abbreviation": "縮寫" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json index 8b6ad71cd4e..fa22b35c419 100644 --- a/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -3,4 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "emmetConfigurationTitle": "Emmet", + "triggerExpansionOnTab": "如有啟用,只要按 Tab 鍵就能展開 Emmet 縮寫。", + "emmetPreferences": "喜好設定,用以修改某些動作的行為及 Emmet 的解析程式。", + "emmetSyntaxProfiles": "為指定的語法定義設定檔,或透過特定規則使用自己的設定檔。", + "emmetExclude": "不應展開 Emmet 縮寫的語言陣列。", + "emmetExtensionsPath": "包含 Emmet 設定檔、程式碼片段及參考的資料夾路徑" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json index a6d7f30447a..b0cd09ce051 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0},工作", "tasksAriaLabel": "請鍵入要重新啟動的工作名稱", "noTasksMatching": "沒有工作相符", "noTasksFound": "找不到工作可重新啟動" diff --git a/i18n/cht/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json index 7eb3693cef9..c6d5f5a478b 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0},工作", "tasksAriaLabel": "輸入要執行的工作名稱", "noTasksMatching": "No tasks matching", "noTasksFound": "找不到工作" diff --git a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index d9994a0fc55..00a45ea1dc0 100644 --- a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -13,25 +13,16 @@ "welcomePage.recent": "最近使用", "welcomePage.noRecentFolders": "沒有最近使用的資料夾", "welcomePage.help": "說明", - "welcomePage.productDocumentation": "產品文件", "welcomePage.introductoryVideos": "簡介影片", - "welcomePage.keybindingsReference": "鍵盤快速鍵參考", + "welcomePage.productDocumentation": "產品文件", "welcomePage.gitHubRepository": "GitHub 存放庫", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "啟動時顯示歡迎頁面", + "welcomePage.customize": "自訂", "welcomePage.installKeymapDescription": "安裝鍵盤快速鍵", - "welcomePage.installKeymap": "安裝鍵盤快速鍵 {0}、{1}、{2} 及 {3}", - "welcomePage.vim": "活力", - "welcomePage.vimCurrent": "活力 (目前)", - "welcomePage.sublime": "壯麗", - "welcomePage.sublimeCurrent": "壯麗 (目前)", - "welcomePage.atom": "Atom", - "welcomePage.atomCurrent": "Atom (目前)", "welcomePage.others": "其他", "welcomePage.colorTheme": "彩色佈景主題", "welcomePage.colorThemeDescription": "將編輯器及您的程式碼設定成您喜愛的外觀", - "welcomePage.configureSettings": "組態設定", - "welcomePage.configureSettingsDescription": "微調設定就能發揮 VS Code 的所有功能", "welcomePage.showCommands": "尋找及執行所有命令", "welcomePage.showCommandsDescription": "從控制台快速存取及搜尋命令 ({0})", "welcomePage.interfaceOverview": "介面概觀", @@ -39,5 +30,8 @@ "welcomePage.interactivePlayground": "Interactive Playground", "welcomePage.interactivePlaygroundDescription": "嘗試使用逐步解說短片中的一些基本編輯器功能", "welcomePage.quickLinks": "快速連結", - "welcomePage.keybindingsReferenceDescription": "可列印的 PDF,附有最常用的鍵盤快速鍵" + "welcomePage.keybindingsReference": "鍵盤快速鍵參考", + "welcomePage.keybindingsReferenceDescription": "可列印的 PDF,附有最常用的鍵盤快速鍵", + "welcomePage.configureSettings": "組態設定", + "welcomePage.configureSettingsDescription": "微調設定就能發揮 VS Code 的所有功能" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index aceea3407e3..02eb36873b6 100644 --- a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,11 +5,11 @@ // Do not edit this file. It is machine generated. { "welcomePage": "歡迎使用", - "welcome.title": "歡迎使用", "welcomePage.keymapAlreadyInstalled": "已安裝 {0} 鍵盤快速鍵。", "welcomePage.willReloadAfterInstallingKeymap": "{0} 鍵盤快速鍵安裝完成後,將會重新載入此視窗。", - "ok": "確定", "welcomePage.installingKeymap": "正在安裝 {0} 鍵盤快速鍵...", "welcomePage.keymapNotFound": "找不到識別碼為 {1} 的 {0} 鍵盤快速鍵。", + "welcome.title": "歡迎使用", + "ok": "確定", "cancel": "取消" } \ No newline at end of file diff --git a/i18n/deu/extensions/git/out/commands.i18n.json b/i18n/deu/extensions/git/out/commands.i18n.json index d0fbcdb0a28..1a8943807b8 100644 --- a/i18n/deu/extensions/git/out/commands.i18n.json +++ b/i18n/deu/extensions/git/out/commands.i18n.json @@ -18,6 +18,7 @@ "discard": "Änderungen verwerfen", "confirm discard all": "Möchten Sie wirklich ALLE Änderungen verwerfen? Dieser Vorgang kann nicht rückgängig gemacht werden!", "discardAll": "ALLE Änderungen verwerfen", + "no staged changes": "Es sind keine Änderungen bereitgestellt.\n\nMöchten Sie alle Ihre Änderungen automatisch bereitstellen und direkt committen?", "yes": "Ja", "always": "Immer", "no changes": "Keine Änderungen zum Speichern vorhanden.", diff --git a/i18n/deu/extensions/git/package.i18n.json b/i18n/deu/extensions/git/package.i18n.json index c11e465ce45..26ab785ffbf 100644 --- a/i18n/deu/extensions/git/package.i18n.json +++ b/i18n/deu/extensions/git/package.i18n.json @@ -42,5 +42,6 @@ "config.countBadge": "Steuert die Git-Badgeanzahl. \"Alle\" zählt alle Änderungen. \"tracked\" (Nachverfolgt) zählt nur die nachverfolgten Änderungen. \"off\" (Aus) deaktiviert dies.", "config.checkoutType": "Steuert, welcher Branchtyp beim Ausführen von \"Auschecken an...\" aufgelistet wird. \"Alle\" zeigt alle Verweise an, \"Lokal\" nur die lokalen Branches, \"Tags\" zeigt nur Tags an, und \"Remote\" zeigt nur Remotebranches an.", "config.ignoreLegacyWarning": "Ignoriert die Legacy-Git-Warnung.", - "config.ignoreLimitWarning": "Ignoriert Warnung bei zu hoher Anzahl von Änderungen in einem Repository" + "config.ignoreLimitWarning": "Ignoriert Warnung bei zu hoher Anzahl von Änderungen in einem Repository", + "config.enableSmartCommit": "Alle Änderungen committen, wenn keine Änderungen bereitgestellt sind." } \ No newline at end of file diff --git a/i18n/deu/extensions/jake/out/main.i18n.json b/i18n/deu/extensions/jake/out/main.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/extensions/jake/out/main.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/extensions/jake/package.i18n.json b/i18n/deu/extensions/jake/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/extensions/jake/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/extensions/typescript/out/utils/logger.i18n.json b/i18n/deu/extensions/typescript/out/utils/logger.i18n.json index 8b6ad71cd4e..bc738f43d0c 100644 --- a/i18n/deu/extensions/typescript/out/utils/logger.i18n.json +++ b/i18n/deu/extensions/typescript/out/utils/logger.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json index c3e22e8d671..2fe70e62eed 100644 --- a/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -62,7 +62,6 @@ "renderLineHighlight": "Steuert, wie der Editor die aktuelle Zeilenhervorhebung rendern soll. Mögliche Werte sind \"none\", \"gutter\", \"line\" und \"all\".", "codeLens": "Steuert, ob der Editor CodeLenses anzeigt.", "folding": "Steuert, ob für den Editor Codefaltung aktiviert ist.", - "hideFoldIcons": "Steuert, ob die Falt-Symbole an der Leiste automatisch ausgeblendet werden.", "matchBrackets": "Übereinstimmende Klammern hervorheben, wenn eine davon ausgewählt wird.", "glyphMargin": "Steuert, ob der Editor den vertikalen Glyphenrand rendert. Der Glyphenrand wird hauptsächlich zum Debuggen verwendet.", "useTabStops": "Das Einfügen und Löschen von Leerzeichen folgt auf Tabstopps.", diff --git a/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json index aff2b6db4db..de766791c87 100644 --- a/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/deu/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -10,5 +10,7 @@ "caret": "Farbe des Cursors im Editor.", "editorWhitespaces": "Farbe der Leerzeichen im Editor.", "editorIndentGuides": "Farbe der Führungslinien für Einzüge im Editor.", - "editorLineNumbers": "Zeilennummernfarbe im Editor." + "editorLineNumbers": "Zeilennummernfarbe im Editor.", + "editorCodeLensForeground": "Vordergrundfarbe der CodeLens-Links im Editor", + "editorBracketMatchBackground": "Hintergrundfarbe für zusammengehörige Klammern" } \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/deu/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index b63b3d41898..73686f1e295 100644 --- a/i18n/deu/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/deu/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,6 +9,7 @@ "editorSuggestWidgetForeground": "Vordergrundfarbe des Vorschlagswidgets.", "editorSuggestWidgetSelectedBackground": "Hintergrundfarbe des ausgewählten Eintrags im Vorschlagswidget.", "editorSuggestWidgetHighlightForeground": "Farbe der Trefferhervorhebung im Vorschlagswidget.", + "readMore": "Mehr anzeigen...{0}", "suggestionWithDetailsAriaLabel": "{0}, Vorschlag, hat Details", "suggestionAriaLabel": "{0}, Vorschlag", "suggestWidget.loading": "Wird geladen...", diff --git a/i18n/deu/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/deu/src/vs/platform/markers/common/problemMatcher.i18n.json index 1955c94d40b..565c50e40d1 100644 --- a/i18n/deu/src/vs/platform/markers/common/problemMatcher.i18n.json +++ b/i18n/deu/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -34,7 +34,6 @@ "ProblemMatcherParser.noValidIdentifier": "Fehler: Die Mustereigenschaft {0} ist kein gültiger Name für eine Mustervariable.", "ProblemMatcherParser.problemPattern.watchingMatcher": "Ein Problemmatcher muss ein Anfangsmuster und ein Endmuster für die Überwachung definieren.", "ProblemMatcherParser.invalidRegexp": "Fehler: Die Zeichenfolge {0} ist kein gültiger regulärer Ausdruck.\n", - "WatchingPatternSchema.regexp": "Der reguläre Ausdruck zum Erkennen des Anfangs oder Endes eines Überwachungstasks.", "WatchingPatternSchema.file": "Der Übereinstimmungsgruppenindex des Dateinamens. Kann ausgelassen werden.", "PatternTypeSchema.name": "Der Name eines beigetragenen oder vordefinierten Musters", "PatternTypeSchema.description": "Ein Problemmuster oder der Name eines beigetragenen oder vordefinierten Problemmusters. Kann ausgelassen werden, wenn die Basis angegeben ist.", @@ -46,7 +45,6 @@ "ProblemMatcherSchema.watching.activeOnStart": "Wenn dieser Wert auf \"true\" festgelegt wird, befindet sich die Überwachung im aktiven Modus, wenn der Task gestartet wird. Dies entspricht dem Ausgeben einer Zeile, die mit dem \"beginPattern\" übereinstimmt.", "ProblemMatcherSchema.watching.beginsPattern": "Wenn eine Übereinstimmung mit der Ausgabe vorliegt, wird der Start eines Überwachungstasks signalisiert.", "ProblemMatcherSchema.watching.endsPattern": "Wenn eine Übereinstimmung mit der Ausgabe vorliegt, wird das Ende eines Überwachungstasks signalisiert.", - "ProblemMatcherSchema.watching": "Muster zum Nachverfolgen des Beginns und Endes eines Beobachtungsmusters.", "LegacyProblemMatcherSchema.watchedBegin.deprecated": "Diese Eigenschaft ist veraltet. Verwenden Sie stattdessen die Überwachungseigenschaft.", "LegacyProblemMatcherSchema.watchedBegin": "Ein regulärer Ausdruck, der signalisiert, dass die Ausführung eines überwachten Tasks (ausgelöst durch die Dateiüberwachung) beginnt.", "LegacyProblemMatcherSchema.watchedEnd.deprecated": "Diese Eigenschaft ist veraltet. Verwenden Sie stattdessen die Überwachungseigenschaft.", diff --git a/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json index 90e66cbb9c0..e8bca8886d1 100644 --- a/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/deu/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -7,14 +7,24 @@ "invalid.color": "Ungültiges Farbformat. Verwenden Sie #RGB, #RGBA, #RRGGBB oder #RRGGBBAA.", "schema.colors": "In der Workbench verwendete Farben.", "foreground": "Allgemeine Vordergrundfarbe. Diese Farbe wird nur verwendet, wenn sie nicht durch eine Komponente überschrieben wird.", + "errorForeground": "Allgemeine Vordergrundfarbe. Diese Farbe wird nur verwendet, wenn sie nicht durch eine Komponente überschrieben wird.", + "descriptionForeground": "Vordergrundfarbe für Beschreibungstexte, die weitere Informationen anzeigen, z. B. für ein Label.", "focusBorder": "Allgemeine Rahmenfarbe für fokussierte Elemente. Diese Farbe wird nur verwendet, wenn sie nicht durch eine Komponente überschrieben wird.", "contrastBorder": "Ein zusätzlicher Rahmen um Elemente, mit dem diese von anderen getrennt werden, um einen größeren Kontrast zu erreichen.", "activeContrastBorder": "Ein zusätzlicher Rahmen um aktive Elemente, mit dem diese von anderen getrennt werden, um einen größeren Kontrast zu erreichen.", + "textSeparatorForeground": "Farbe für Text-Trennzeichen.", + "textLinkForeground": "Vordergrundfarbe für Links im Text.", + "textLinkActiveForeground": "Vordergrundfarbe für aktive Links im Text.", + "textPreformatForeground": "Vordergrundfarbe für vorformatierte Textsegmente.", + "textBlockQuoteBackground": "Hintergrundfarbe für block quotes im Text.", + "textBlockQuoteBorder": "Rahmenfarbe für block quotes im Text.", + "textCodeBlockBackground": "Hintergrundfarbe für Code-Blöcke im Text.", "widgetShadow": "Schattenfarbe von Widgets wie zum Beispiel Suchen/Ersetzen innerhalb des Editors.", "inputBoxBackground": "Hintergrund für Eingabefeld.", "inputBoxForeground": "Vordergrund für Eingabefeld.", "inputBoxBorder": "Rahmen für Eingabefeld.", "inputBoxActiveOptionBorder": "Rahmenfarbe für aktivierte Optionen in Eingabefeldern.", + "inputPlaceholderForeground": "Input box - Vordergrundfarbe für Platzhalter-Text.", "inputValidationInfoBackground": "Hintergrundfarbe bei der Eingabevalidierung für den Schweregrad der Information.", "inputValidationInfoBorder": "Rahmenfarbe bei der Eingabevalidierung für den Schweregrad der Information.", "inputValidationWarningBackground": "Hintergrundfarbe bei der Eingabevalidierung für eine Warnung zur Information.", @@ -28,6 +38,7 @@ "listActiveSelectionBackground": "Hintergrundfarbe der Liste/Struktur für das ausgewählte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.", "listActiveSelectionForeground": "Vordergrundfarbe der Liste/Struktur für das ausgewählte Element, wenn die Liste/Struktur aktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.", "listInactiveSelectionBackground": "Hintergrundfarbe der Liste/Struktur für das ausgewählte Element, wenn die Liste/Struktur inaktiv ist. Eine aktive Liste/Struktur hat Tastaturfokus, eine inaktive hingegen nicht.", + "listInactiveSelectionForeground": "Liste/Baumstruktur - Vordergrundfarbe für das ausgewählte Element, wenn die Liste/Baumstruktur inaktiv ist. Eine aktive Liste/Baumstruktur hat Tastaturfokus, eine inaktive hingegen nicht.", "listHoverBackground": "Hintergrund der Liste/Struktur, wenn mit der Maus auf Elemente gezeigt wird.", "listDropBackground": "Drag & Drop-Hintergrund der Liste/Struktur, wenn Elemente mithilfe der Maus verschoben werden.", "highlight": "Vordergrundfarbe der Liste/Struktur zur Trefferhervorhebung beim Suchen innerhalb der Liste/Struktur.", @@ -36,6 +47,8 @@ "buttonForeground": "Vordergrundfarbe der Schaltfläche.", "buttonBackground": "Hintergrundfarbe der Schaltfläche.", "buttonHoverBackground": "Hintergrundfarbe der Schaltfläche, wenn darauf gezeigt wird.", + "badgeBackground": "Badge - Hintergrundfarbe. Badges sind kurze Info-Texte, z. B. für Anzahl Suchergebnisse.", + "badgeForeground": "Badge - Vordergrundfarbe. Badges sind kurze Info-Texte, z. B. für Anzahl Suchergebnisse.", "scrollbarShadow": "Schatten der Scrollleiste, um anzuzeigen, dass die Ansicht gescrollt wird.", "scrollbarSliderBackground": "Hintergrundfarbe des Schiebereglers.", "scrollbarSliderHoverBackground": "Hintergrundfarbe des Schiebereglers, wenn darauf gezeigt wird.", @@ -52,5 +65,9 @@ "hoverHighlight": "Hervorhebung eines Worts, unter dem ein Mauszeiger angezeigt wird.", "hoverBackground": "Background color of the editor hover.", "hoverBorder": "Rahmenfarbe des Editor-Mauszeigers.", - "activeLinkForeground": "Farbe der aktiven Links." + "activeLinkForeground": "Farbe der aktiven Links.", + "diffEditorInserted": "Hintergrundfarbe für eingefügten Text.", + "diffEditorRemoved": "Hintergrundfarbe für entfernten Text.", + "diffEditorInsertedOutline": "Konturfarbe für eingefügten Text.", + "diffEditorRemovedOutline": "Konturfarbe für entfernten Text." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/deu/src/vs/workbench/api/node/extHostTreeViews.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/electron-browser/shell.i18n.json b/i18n/deu/src/vs/workbench/electron-browser/shell.i18n.json index dd4ad3fcbb9..b225b8a0012 100644 --- a/i18n/deu/src/vs/workbench/electron-browser/shell.i18n.json +++ b/i18n/deu/src/vs/workbench/electron-browser/shell.i18n.json @@ -4,9 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "runningAsRoot": "Es wird empfohlen, Code nicht als \"root\" auszuführen.", - "prof.message": "Profile wurden erfolgreich erstellt.", - "prof.detail": "Erstellen Sie ein Problem, und fügen Sie die folgenden Dateien manuell an:\n{0}", - "prof.restartAndFileIssue": "Problem erstellen und neu starten", - "prof.restart": "Neu starten" + "runningAsRoot": "Es wird empfohlen, Code nicht als \"root\" auszuführen." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/electron-browser/window.i18n.json b/i18n/deu/src/vs/workbench/electron-browser/window.i18n.json index 1c580a18212..41496cf43a0 100644 --- a/i18n/deu/src/vs/workbench/electron-browser/window.i18n.json +++ b/i18n/deu/src/vs/workbench/electron-browser/window.i18n.json @@ -11,7 +11,5 @@ "paste": "Einfügen", "selectAll": "Alles auswählen", "confirmOpen": "Möchten Sie \"{0}\" Ordner wirklich öffnen?", - "confirmOpenButton": "&&Öffnen", - "developer": "Entwickler", - "file": "Datei" + "confirmOpenButton": "&&Öffnen" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json index 8b6ad71cd4e..e0afee42485 100644 --- a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "balanceInward": "Emmet: Ausgleichen (einwärts)", + "balanceOutward": "Emmet: Ausgleichen (auswärts)" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json index 8b6ad71cd4e..35ffc123f14 100644 --- a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "previousEditPoint": "Emmet: Vorheriger Bearbeitungspunkt", + "nextEditPoint": "Emmet: Nächster Bearbeitungspunkt" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json index 8b6ad71cd4e..a3f778d565a 100644 --- a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "evaluateMathExpression": "Emmet: Mathematischen Ausdruck auswerten" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json index 8b6ad71cd4e..278d10a21dc 100644 --- a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "expandAbbreviationAction": "Emmet: Abkürzung erweitern" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json index 8b6ad71cd4e..2aab3f2af7c 100644 --- a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -3,4 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "incrementNumberByOneTenth": "Emmet: Um 0,1 inkrementieren", + "incrementNumberByOne": "Emmet: Um 1 inkrementieren", + "incrementNumberByTen": "Emmet: Um 10 inkrementieren", + "decrementNumberByOneTenth": "Emmet: Um 0,1 dekrementieren", + "decrementNumberByOne": "Emmet: Um 1 dekrementieren", + "decrementNumberByTen": "Emmet: Um 10 dekrementieren" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json index 8b6ad71cd4e..158b074c05b 100644 --- a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "matchingPair": "Emmet: Gehe zu übereinstimmendem Paar" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json index 8b6ad71cd4e..e6f2b3e1ba7 100644 --- a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "mergeLines": "Emmet: Zeilen mergen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json index 8b6ad71cd4e..1569d015669 100644 --- a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "reflectCSSValue": "Emmet: CSS-Wert reflektieren" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json index 8b6ad71cd4e..bb2a97fd42e 100644 --- a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "removeTag": "Emmet: Tag entfernen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json index 8b6ad71cd4e..0ddd0df478e 100644 --- a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "selectPreviousItem": "Emmet: Vorheriges Element auswählen", + "selectNextItem": "Emmet: Nächstes Element auswählen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json index 8b6ad71cd4e..a214ce3766a 100644 --- a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "splitJoinTag": "Emmet: Tag teilen/verknüpfen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json index 8b6ad71cd4e..118d88c7df8 100644 --- a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "toggleComment": "Emmet: Kommentar umschalten" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json index 8b6ad71cd4e..b682f5d97c3 100644 --- a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "updateImageSize": "Emmet: Bildgröße aktualisieren" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json index 8b6ad71cd4e..bba2b0b703e 100644 --- a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "updateTag": "Emmet: Tag aktualisieren", + "enterTag": "Tag eingeben", + "tag": "Tag" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json index 8b6ad71cd4e..45013796dd3 100644 --- a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "wrapWithAbbreviationAction": "Emmet: Mit Abkürzung umschließen", + "enterAbbreviation": "Abkürzung eingeben", + "abbreviation": "Abkürzung" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json index 8b6ad71cd4e..5beaa142e9f 100644 --- a/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -3,4 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "emmetConfigurationTitle": "Emmet", + "triggerExpansionOnTab": "Wenn aktiviert, werden Emmet-Abkürzungen beim Drücken der TAB-TASTE erweitert.", + "emmetPreferences": "Einstellungen, die zum Ändern des Verhaltens einiger Aktionen und Konfliktlöser von Emmet verwendet werden.", + "emmetSyntaxProfiles": "Definieren Sie das Profil für die angegebene Syntax, oder verwenden Sie Ihr eigenes Profil mit bestimmten Regeln.", + "emmetExclude": "Ein Array von Sprachen, in dem Emmet-Abkürzungen nicht erweitert werden sollen.", + "emmetExtensionsPath": "Pfad zu einem Ordner mit Emmet-Profilen, Ausschnitten und Voreinstellungen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json b/i18n/deu/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json index 272bcf769ea..5c23eff8b3c 100644 --- a/i18n/deu/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}, tasks", "tasksAriaLabel": "Name einer neu zu startenden Aufgabe eingeben", "noTasksMatching": "Keine übereinstimmenden Aufgaben", "noTasksFound": "Keine neu zu startenden Aufgaben gefunden." diff --git a/i18n/deu/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json b/i18n/deu/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json index 7add7130d90..6a58cd9cf4c 100644 --- a/i18n/deu/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}, tasks", "tasksAriaLabel": "Geben Sie den Namen des auszuführenden Tasks ein.", "noTasksMatching": "Keine übereinstimmenden Tasks", "noTasksFound": "Es wurden keine Tasks gefunden." diff --git a/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 0a1018ac4fa..b167d91d677 100644 --- a/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -13,25 +13,16 @@ "welcomePage.recent": "Zuletzt verwendet", "welcomePage.noRecentFolders": "Keine kürzlich verwendeten Ordner", "welcomePage.help": "Hilfe", - "welcomePage.productDocumentation": "Produktdokumentation", "welcomePage.introductoryVideos": "Einführungsvideos", - "welcomePage.keybindingsReference": "Referenz für Tastenkombinationen", + "welcomePage.productDocumentation": "Produktdokumentation", "welcomePage.gitHubRepository": "GitHub-Repository", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "Willkommensseite beim Start anzeigen", + "welcomePage.customize": "Anpassen", "welcomePage.installKeymapDescription": "Tastenkombinationen installieren", - "welcomePage.installKeymap": "Installieren Sie die Tastenkombinationen von {0} {1}, {2} und {3}.", - "welcomePage.vim": "Vim", - "welcomePage.vimCurrent": "Vim (aktuell)", - "welcomePage.sublime": "Sublime", - "welcomePage.sublimeCurrent": "Sublime (aktuell)", - "welcomePage.atom": "Atom", - "welcomePage.atomCurrent": "Atom (aktuell)", "welcomePage.others": "Andere", "welcomePage.colorTheme": "Farbdesign", "welcomePage.colorThemeDescription": "Passen Sie das Aussehen des Editors und Ihres Codes an Ihre Wünsche an.", - "welcomePage.configureSettings": "Einstellungen konfigurieren", - "welcomePage.configureSettingsDescription": "Optimieren Sie die Einstellungen, um VS Code bestmöglich zu nutzen.", "welcomePage.showCommands": "Alle Befehle suchen und ausführen", "welcomePage.showCommandsDescription": "Über die Einstellungen ({0}) können Sie Befehle schnell suchen und darauf zugreifen.", "welcomePage.interfaceOverview": "Überblick über die Schnittstelle", @@ -39,5 +30,8 @@ "welcomePage.interactivePlayground": "Interaktiver Playground", "welcomePage.interactivePlaygroundDescription": "Testen Sie die wichtigsten Editorfunktionen in einer kurzen exemplarischen Vorgehensweise.", "welcomePage.quickLinks": "Direktlinks", - "welcomePage.keybindingsReferenceDescription": "Eine druckbare PDF mit den wichtigsten Tastenkombinationen" + "welcomePage.keybindingsReference": "Referenz für Tastenkombinationen", + "welcomePage.keybindingsReferenceDescription": "Eine druckbare PDF mit den wichtigsten Tastenkombinationen", + "welcomePage.configureSettings": "Einstellungen konfigurieren", + "welcomePage.configureSettingsDescription": "Optimieren Sie die Einstellungen, um VS Code bestmöglich zu nutzen." } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index ce4f274eb90..1bc33347222 100644 --- a/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,11 +5,11 @@ // Do not edit this file. It is machine generated. { "welcomePage": "Willkommen", - "welcome.title": "Willkommen", "welcomePage.keymapAlreadyInstalled": "Die {0} Tastenkombinationen sind bereits installiert.", "welcomePage.willReloadAfterInstallingKeymap": "Das Fenster wird nach der Installation der {0}-Tastaturbefehle neu geladen.", - "ok": "OK", "welcomePage.installingKeymap": "Die {0}-Tastenkombinationen werden installiert...", "welcomePage.keymapNotFound": "Die {0} Tastenkombinationen mit der ID {1} wurden nicht gefunden.", + "welcome.title": "Willkommen", + "ok": "OK", "cancel": "Abbrechen" } \ No newline at end of file diff --git a/i18n/esn/extensions/jake/out/main.i18n.json b/i18n/esn/extensions/jake/out/main.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/extensions/jake/out/main.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/extensions/jake/package.i18n.json b/i18n/esn/extensions/jake/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/extensions/jake/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript/out/utils/logger.i18n.json b/i18n/esn/extensions/typescript/out/utils/logger.i18n.json index 8b6ad71cd4e..bc738f43d0c 100644 --- a/i18n/esn/extensions/typescript/out/utils/logger.i18n.json +++ b/i18n/esn/extensions/typescript/out/utils/logger.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript/package.i18n.json b/i18n/esn/extensions/typescript/package.i18n.json index 80029cd25d6..599140da8f5 100644 --- a/i18n/esn/extensions/typescript/package.i18n.json +++ b/i18n/esn/extensions/typescript/package.i18n.json @@ -33,10 +33,13 @@ "javascript.validate.enable": "Habilita o deshabilita la validación de JavaScript.", "typescript.goToProjectConfig.title": "Ir a configuración del proyecto", "javascript.goToProjectConfig.title": "Ir a configuración del proyecto", + "javascript.referencesCodeLens.enabled": "Habilitar/deshabilitar las referencias de CodeLens en los archivos de JavaScript.", + "typescript.referencesCodeLens.enabled": "Habilitar/deshabilitar las referencias de CodeLens en los archivos de TypeScript. Requiere TypeScript >= 2.0.6.", "typescript.implementationsCodeLens.enabled": "Habilita o deshabilita implementaciones de CodeLens. Requiere TypeScript >= 2.2.0.", "typescript.openTsServerLog.title": "Abrir registro del servidor de TS", "typescript.selectTypeScriptVersion.title": "Seleccionar versión de TypeScript", "jsDocCompletion.enabled": "Habilita o deshabilita comentarios automaticos de JSDoc", "javascript.implicitProjectConfig.checkJs": "Habilita/deshabilita la comprobación semántica de los archivos JavaScript. Los archivos jsconfig.json o tsconfig.json reemplazan esta configuración. Se requiere TypeScript >=2.3.1.", - "typescript.check.npmIsInstalled": "Comprueba si NPM esta instalado para recibir adquisiciones automaticas de Typings" + "typescript.check.npmIsInstalled": "Comprueba si NPM esta instalado para recibir adquisiciones automaticas de Typings", + "javascript.nameSuggestions": "Habilitar/deshabilitar nombres únicos de la lista de sugerencias en los archivos de JavaScript. " } \ No newline at end of file diff --git a/i18n/esn/src/vs/code/electron-main/menus.i18n.json b/i18n/esn/src/vs/code/electron-main/menus.i18n.json index 06ce8e40cb3..44ff7a3f5f1 100644 --- a/i18n/esn/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/esn/src/vs/code/electron-main/menus.i18n.json @@ -143,6 +143,7 @@ "miAccessibilityOptions": "&&Opciones de accesibilidad", "miReportIssues": "&&Notificar problemas", "miWelcome": "&&Bienvenido", + "miInteractivePlayground": "Área de juegos &&interactiva", "miDocumentation": "&&Documentación", "miReleaseNotes": "&&Notas de la versión", "miKeyboardShortcuts": "&&Referencia de métodos abreviados de teclado", diff --git a/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json index a8373baa8d6..deeb605c6a6 100644 --- a/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -62,7 +62,6 @@ "renderLineHighlight": "Controla cómo el editor debe presentar el resaltado de línea. Las posibilidades son \"ninguno\", \"margen\", \"línea\" y \"todo\".", "codeLens": "Controla si el editor muestra lentes de código", "folding": "Controla si el editor tiene habilitado el plegado de código.", - "hideFoldIcons": "Controla cuándo los iconos de plegado del margen son ocultados automáticamente.", "matchBrackets": "Resaltar corchetes coincidentes cuando se seleccione uno de ellos.", "glyphMargin": "Controla si el editor debe representar el margen de glifo vertical. El margen de glifo se usa, principalmente, para depuración.", "useTabStops": "La inserción y eliminación del espacio en blanco sigue a las tabulaciones.", diff --git a/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 6f314db4b76..f9d2c2d5f09 100644 --- a/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,6 +9,7 @@ "editorSuggestWidgetForeground": "Color de primer plano del widget sugerido.", "editorSuggestWidgetSelectedBackground": "Color de fondo de la entrada seleccionada del widget sugerido.", "editorSuggestWidgetHighlightForeground": "Color del resaltado coincidido en el widget sugerido.", + "readMore": "Leer más...{0}", "suggestionWithDetailsAriaLabel": "{0}, sugerencia, con detalles", "suggestionAriaLabel": "{0}, sugerencia", "suggestWidget.loading": "Cargando...", diff --git a/i18n/esn/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/esn/src/vs/platform/markers/common/problemMatcher.i18n.json index dac52437515..967ffc75983 100644 --- a/i18n/esn/src/vs/platform/markers/common/problemMatcher.i18n.json +++ b/i18n/esn/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -34,7 +34,6 @@ "ProblemMatcherParser.noValidIdentifier": "Error: La propiedad pattern {0} no es un nombre de variable de patrón válido.", "ProblemMatcherParser.problemPattern.watchingMatcher": "Un buscador de coincidencias de problemas debe definir tanto un patrón de inicio como un patrón de finalización para la inspección.", "ProblemMatcherParser.invalidRegexp": "Error: La cadena {0} no es una expresión regular válida.\n", - "WatchingPatternSchema.regexp": "Expresión regular para detectar el principio o el final de una tarea de inspección.", "WatchingPatternSchema.file": "Índice de grupo de coincidencias del nombre de archivo. Se puede omitir.", "PatternTypeSchema.name": "Nombre de un patrón aportado o predefinido", "PatternTypeSchema.description": "Patrón de problema o nombre de un patrón de problema que se ha aportado o predefinido. Se puede omitir si se especifica la base.", @@ -46,7 +45,6 @@ "ProblemMatcherSchema.watching.activeOnStart": "Si se establece en true, el monitor está en modo activo cuando la tarea empieza. Esto es equivalente a emitir una línea que coincide con beginPattern", "ProblemMatcherSchema.watching.beginsPattern": "Si se encuentran coincidencias en la salida, se señala el inicio de una tarea de inspección.", "ProblemMatcherSchema.watching.endsPattern": "Si se encuentran coincidencias en la salida, se señala el fin de una tarea de inspección", - "ProblemMatcherSchema.watching": "Patrones para hacer un seguimiento del comienzo y el final de un patrón de supervisión.", "LegacyProblemMatcherSchema.watchedBegin.deprecated": "This property is deprecated. Use the watching property instead.", "LegacyProblemMatcherSchema.watchedBegin": "Expresión regular que señala que una tarea inspeccionada comienza a ejecutarse desencadenada a través de la inspección de archivos.", "LegacyProblemMatcherSchema.watchedEnd.deprecated": "This property is deprecated. Use the watching property instead.", diff --git a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json index 987f41fef7b..85f87911be1 100644 --- a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -67,5 +67,9 @@ "hoverHighlight": "Resaltado debajo de la palabra para la que se muestra un recuadro al mantener el puntero.", "hoverBackground": "Color de fondo al mantener el puntero en el editor.", "hoverBorder": "Color del borde al mantener el puntero en el editor.", - "activeLinkForeground": "Color de los vínculos activos." + "activeLinkForeground": "Color de los vínculos activos.", + "diffEditorInserted": "Color de fondo para el texto insertado.", + "diffEditorRemoved": "Color de fondo para el texto quitado.", + "diffEditorInsertedOutline": "Color de contorno para el texto insertado.", + "diffEditorRemovedOutline": "Color de contorno para el texto quitado." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/esn/src/vs/workbench/api/node/extHostTreeViews.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/electron-browser/shell.i18n.json b/i18n/esn/src/vs/workbench/electron-browser/shell.i18n.json index b9f16ccb05c..403b7012cbe 100644 --- a/i18n/esn/src/vs/workbench/electron-browser/shell.i18n.json +++ b/i18n/esn/src/vs/workbench/electron-browser/shell.i18n.json @@ -4,9 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "runningAsRoot": "Se recomienda no ejecutar Code como 'root'.", - "prof.message": "Los perfiles se crearon correctamente.", - "prof.detail": "Cree un problema y asóciele manualmente los siguientes archivos: {0}", - "prof.restartAndFileIssue": "Crear problema y reiniciar", - "prof.restart": "Reiniciar" + "runningAsRoot": "Se recomienda no ejecutar Code como 'root'." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/electron-browser/window.i18n.json b/i18n/esn/src/vs/workbench/electron-browser/window.i18n.json index f3b1f414ce3..8622e2e3d7d 100644 --- a/i18n/esn/src/vs/workbench/electron-browser/window.i18n.json +++ b/i18n/esn/src/vs/workbench/electron-browser/window.i18n.json @@ -11,7 +11,5 @@ "paste": "Pegar", "selectAll": "Seleccionar todo", "confirmOpen": "¿Seguro que desea abrir {0} carpetas?", - "confirmOpenButton": "&&Abrir...", - "developer": "Desarrollador", - "file": "Archivo" + "confirmOpenButton": "&&Abrir..." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json index 62859637baa..8155a083b75 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json @@ -6,5 +6,6 @@ { "copyValue": "Copiar valor", "copy": "Copiar", + "copyAll": "Copiar todo", "copyStackTrace": "Copiar pila de llamadas" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index 00a55728fff..cb1c2139583 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,7 +7,6 @@ "debugAdapterBinNotFound": "El ejecutable del adaptador de depuración \"{0}\" no existe.", "debugAdapterCannotDetermineExecutable": "No se puede determinar el ejecutable para el adaptador de depuración \"{0}\".", "debugType": "Tipo de configuración.", - "debugTypeNotRecognised": "Este tipo de depuración no se reconoce. Compruebe que tiene instalada la correspondiente extensión de depuración y que está habilitada.", "node2NotSupported": "\"node2\" ya no se admite; use \"node\" en su lugar y establezca el atributo \"protocol\" en \"inspector\".", "debugName": "Nombre de la configuración. Aparece en el menú desplegable de la configuración de inicio.", "debugRequest": "Tipo de solicitud de la configuración. Puede ser \"launch\" o \"attach\".", diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json index 8b6ad71cd4e..80bd75c0a09 100644 --- a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "balanceInward": "Emmet: Equilibrio (entrante)", + "balanceOutward": "Emmet: Equilibrio (saliente)" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json index 8b6ad71cd4e..328583915c4 100644 --- a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "previousEditPoint": "Emmet: Punto de edición anterior", + "nextEditPoint": "Emmet: Punto de edición siguiente" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json index 8b6ad71cd4e..0cc657ddc14 100644 --- a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "evaluateMathExpression": "Emmet: Evaluar expresión matemática" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json index 8b6ad71cd4e..89f65c5221b 100644 --- a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "expandAbbreviationAction": "Emmet: Expandir abreviatura" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json index 8b6ad71cd4e..ad86576118f 100644 --- a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -3,4 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "incrementNumberByOneTenth": "Emmet: Aumentar por 0.1", + "incrementNumberByOne": "Emmet: Aumentar por 1", + "incrementNumberByTen": "Emmet: Aumentar por 10", + "decrementNumberByOneTenth": "Emmet: Disminuir por 0.1", + "decrementNumberByOne": "Emmet: Disminuir por 1", + "decrementNumberByTen": "Emmet: Disminuir por 10" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json index 8b6ad71cd4e..d87b661b4e8 100644 --- a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "matchingPair": "Emmet: Ir al par coincidente" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json index 8b6ad71cd4e..c0708b46d94 100644 --- a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "mergeLines": "Emmet: Combinar líneas" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json index 8b6ad71cd4e..13ab5650e82 100644 --- a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "reflectCSSValue": "Emmet: Reflejar valor CSS" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json index 8b6ad71cd4e..376b817f89e 100644 --- a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "removeTag": "Emmet: Quitar etiqueta" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json index 8b6ad71cd4e..632ec2d3325 100644 --- a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "selectPreviousItem": "Emmet: Seleccionar elemento anterior", + "selectNextItem": "Emmet: Seleccionar elemento siguiente" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json index 8b6ad71cd4e..7daa5503951 100644 --- a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "splitJoinTag": "Emmet: Dividir/combinar etiqueta" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json index 8b6ad71cd4e..4c135de0f9c 100644 --- a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "toggleComment": "Emmet: Alternar comentario" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json index 8b6ad71cd4e..7e29db17919 100644 --- a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "updateImageSize": "Emmet: Actualizar tamaño de la imagen" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json index 8b6ad71cd4e..b09f7caa8be 100644 --- a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "updateTag": "Emmet: Actualizar etiqueta", + "enterTag": "Ingresar etiqueta", + "tag": "Etiqueta" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json index 8b6ad71cd4e..5b686426df5 100644 --- a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "wrapWithAbbreviationAction": "Emmet: Encapsular con abreviatura", + "enterAbbreviation": "Ingresar abreviatura", + "abbreviation": "Abreviatura" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json index 8b6ad71cd4e..176ecb884a1 100644 --- a/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -3,4 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "emmetConfigurationTitle": "Emmet", + "triggerExpansionOnTab": "Cuando se habilita, se expande la abreviación Emmet al presionar la tecla TAB.", + "emmetPreferences": "Preferencias usadas para modificar el comportamiento de algunas acciones y resoluciones de Emmet.", + "emmetSyntaxProfiles": "Defina el perfil de la sintaxis especificada o use su propio perfil con reglas específicas.", + "emmetExclude": "Matriz de lenguajes donde no deben expandirse la abreviación Emmet.", + "emmetExtensionsPath": "Ruta de acceso a una carpeta que contiene perfiles de Emmet, fragmentos de código y preferencias" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 7f0f754882e..abfe36e35ad 100644 --- a/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "errorInvalidConfiguration": "No se puede escribir la configuración. Corrija los errores o advertencias del archivo y vuelva a intentarlo.", "editTtile": "Editar", "replaceDefaultValue": "Reemplazar en Configuración", "copyDefaultValue": "Copiar en Configuración", diff --git a/i18n/esn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json index 7050d4b2731..743e9be299c 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}, tareas", "tasksAriaLabel": "Escriba el nombre de una tarea para reiniciar", "noTasksMatching": "No tasks matching", "noTasksFound": "No se encontró ninguna tarea para reiniciar" diff --git a/i18n/esn/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json index d4bed99f1a2..e6855cb8a9c 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}, tareas", "tasksAriaLabel": "Escribir el nombre de una tarea para ejecutar", "noTasksMatching": "No tasks matching", "noTasksFound": "No se encontraron tareas" diff --git a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 29e623a5d20..50e571af89f 100644 --- a/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -26,5 +26,7 @@ "workbench.action.terminal.scrollUp": "Desplazar hacia arriba (línea)", "workbench.action.terminal.scrollUpPage": "Desplazar hacia arriba (página)", "workbench.action.terminal.scrollToTop": "Desplazar al principio", - "workbench.action.terminal.clear": "Borrar" + "workbench.action.terminal.clear": "Borrar", + "workbench.action.terminal.allowWorkspaceShell": "Permitir la configuración del área de trabajo Shell", + "workbench.action.terminal.disallowWorkspaceShell": "No permitir la configuración del área de trabajo Shell" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index e39c3a6cfd2..107a0eecf8a 100644 --- a/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,6 +6,7 @@ { "selectTheme.label": "Tema de color", "installColorThemes": "Instalar temas de color adicionales...", + "themes.selectTheme": "Seleccione el tema de color (flecha arriba/abajo para vista previa)", "selectIconTheme.label": "Tema de icono de archivo", "installIconThemes": "Instalar temas de icono de archivo adicionles...", "noIconThemeLabel": "Ninguno", diff --git a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index eebabe22162..9591e0b1673 100644 --- a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -11,27 +11,20 @@ "welcomePage.openFolder": "Abrir carpeta...", "welcomePage.cloneGitRepository": "Clonar el repositorio GIT...", "welcomePage.recent": "Reciente", + "welcomePage.moreRecent": "Más...", "welcomePage.noRecentFolders": "No hay ninguna carpeta reciente", "welcomePage.help": "Ayuda", - "welcomePage.productDocumentation": "Documentación del producto", "welcomePage.introductoryVideos": "Vídeos de introducción", - "welcomePage.keybindingsReference": "Referencia de métodos abreviados de teclado", + "welcomePage.productDocumentation": "Documentación del producto", "welcomePage.gitHubRepository": "Repositorio de GitHub", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "Mostrar página principal al inicio", + "welcomePage.customize": "Personalizar", "welcomePage.installKeymapDescription": "Instalar los métodos abreviados de teclado", - "welcomePage.installKeymap": "Instale los métodos abreviados de teclado de {0}, {1} {2} y {3}", - "welcomePage.vim": "Vim", - "welcomePage.vimCurrent": "Vim (actual)", - "welcomePage.sublime": "Sublime", - "welcomePage.sublimeCurrent": "Sublime (actual)", - "welcomePage.atom": "Atom", - "welcomePage.atomCurrent": "Atom (actual)", "welcomePage.others": "otros", "welcomePage.colorTheme": "Tema de color", "welcomePage.colorThemeDescription": "Modifique a su gusto la apariencia del editor y el código", - "welcomePage.configureSettings": "Definir la configuración", - "welcomePage.configureSettingsDescription": "Revele el poder total de VS Code cambiando la configuración", + "welcomePage.learn": "Más información", "welcomePage.showCommands": "Buscar y ejecutar todos los comandos", "welcomePage.showCommandsDescription": "Acceda rápidamente y busque comandos desde el panel de control ({0})", "welcomePage.interfaceOverview": "Introducción a la interfaz", @@ -39,5 +32,8 @@ "welcomePage.interactivePlayground": "Área de juegos interactiva", "welcomePage.interactivePlaygroundDescription": "Pruebe las características esenciales del editor en un tutorial corto", "welcomePage.quickLinks": "Vínculos rápidos", - "welcomePage.keybindingsReferenceDescription": "Un PDF imprimible con los métodos abreviados de teclado más comunes" + "welcomePage.keybindingsReference": "Referencia de métodos abreviados de teclado", + "welcomePage.keybindingsReferenceDescription": "Un PDF imprimible con los métodos abreviados de teclado más comunes", + "welcomePage.configureSettings": "Definir la configuración", + "welcomePage.configureSettingsDescription": "Revele el poder total de VS Code cambiando la configuración" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index 78fdb50afd6..28283fba5c3 100644 --- a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,11 +5,13 @@ // Do not edit this file. It is machine generated. { "welcomePage": "Bienvenido", - "welcome.title": "Bienvenido", "welcomePage.keymapAlreadyInstalled": "Los métodos abreviados de teclado {0} ya están instalados.", "welcomePage.willReloadAfterInstallingKeymap": "La ventana se volverá a cargar después de instalar los métodos abreviados de teclado {0}.", - "ok": "Aceptar", "welcomePage.installingKeymap": "Instalando los métodos abreviados de teclado de {0}...", "welcomePage.keymapNotFound": "No se pudieron encontrar los métodos abreviados de teclado {0} con el identificador {1}.", - "cancel": "Cancelar" + "welcome.title": "Bienvenido", + "ok": "Aceptar", + "cancel": "Cancelar", + "welcomePage.quickLinkBackground": "Color de fondo de los vínculos rápidos en la página principal.", + "welcomePage.quickLinkHoverBackground": "Mantener el puntero sobre el color de fondo para acceder los vínculos rápidos en la página principal." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json b/i18n/esn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json index bf82a6e7f65..7dc0e8efbdf 100644 --- a/i18n/esn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json @@ -5,5 +5,6 @@ // Do not edit this file. It is machine generated. { "walkThrough.unboundCommand": "sin enlazar", - "walkThrough.gitNotFound": "Parece que GIT no está instalado en el sistema." + "walkThrough.gitNotFound": "Parece que GIT no está instalado en el sistema.", + "walkThrough.embeddedEditorBackground": "Color de fondo de los editores incrustrados en la área de juegos" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 108c1b85824..c8e25212f8b 100644 --- a/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/esn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -6,6 +6,7 @@ { "open": "Abrir configuración", "close": "Cerrar", + "saveAndRetry": "Guardar la configuración y reintentar. ", "errorUnknownKey": "No se puede escribir en el archivo de configuración (clave desconocida)", "errorInvalidTarget": "No se puede escribir en el archivo de configuración (destino no válido).", "errorNoWorkspaceOpened": "No se pudo guardar la configuración porque no tiene una carpeta abierta. Abra una carpeta primero y vuelva a intentarlo.", diff --git a/i18n/fra/extensions/jake/out/main.i18n.json b/i18n/fra/extensions/jake/out/main.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/extensions/jake/out/main.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/extensions/jake/package.i18n.json b/i18n/fra/extensions/jake/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/extensions/jake/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/extensions/typescript/out/utils/logger.i18n.json b/i18n/fra/extensions/typescript/out/utils/logger.i18n.json index 8b6ad71cd4e..bc738f43d0c 100644 --- a/i18n/fra/extensions/typescript/out/utils/logger.i18n.json +++ b/i18n/fra/extensions/typescript/out/utils/logger.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json index 93596cccabe..afe0864b817 100644 --- a/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -9,6 +9,7 @@ "fontWeight": "Contrôle l'épaisseur de police.", "fontSize": "Contrôle la taille de police en pixels.", "lineHeight": "Contrôle la hauteur de ligne. Utilisez 0 pour calculer lineHeight à partir de fontSize.", + "letterSpacing": "Définit l'espacement des caractères en pixels.", "lineNumbers": "Contrôle l'affichage des numéros de ligne. Les valeurs possibles sont 'activé', 'désactivé' et 'relatif'. La valeur 'relatif' indique le numéro de ligne à partir de la position actuelle du curseur.", "rulers": "Colonnes où afficher les règles verticales", "wordSeparators": "Caractères utilisés comme séparateurs de mots durant la navigation ou les opérations basées sur les mots", diff --git a/i18n/fra/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/fra/src/vs/editor/common/view/editorColorRegistry.i18n.json index b8302d62f69..77ca0b5bb8f 100644 --- a/i18n/fra/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/fra/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -10,5 +10,11 @@ "caret": "Couleur du curseur de l'éditeur.", "editorWhitespaces": "Couleur des espaces blancs dans l'éditeur.", "editorIndentGuides": "Couleur des repères de retrait de l'éditeur.", - "editorLineNumbers": "Couleur des numéros de ligne de l'éditeur." + "editorLineNumbers": "Couleur des numéros de ligne de l'éditeur.", + "editorRuler": "Couleur des règles de l'éditeur", + "editorCodeLensForeground": "Couleur pour les indicateurs CodeLens", + "editorBracketMatchBackground": "Couleur d'arrière-plan pour les accolades associées", + "editorBracketMatchBorder": "Couleur pour le contour des accolades associées", + "editorOverviewRulerBorder": "Couleur de la bordure de la règle d'apperçu.", + "editorGutter": "Couleur de fond pour la bordure de l'éditeur. La bordure contient les marges pour les symboles et les numéros de ligne." } \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/fra/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 0632013723d..e38b8d1bf14 100644 --- a/i18n/fra/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/fra/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,6 +9,7 @@ "editorSuggestWidgetForeground": "Couleur de premier plan du widget de suggestion.", "editorSuggestWidgetSelectedBackground": "Couleur d'arrière-plan de l'entrée sélectionnée dans le widget de suggestion.", "editorSuggestWidgetHighlightForeground": "Couleur de la surbrillance des correspondances dans le widget de suggestion.", + "readMore": "En savoir plus...{0}", "suggestionWithDetailsAriaLabel": "{0}, suggestion, avec détails", "suggestionAriaLabel": "{0}, suggestion", "suggestWidget.loading": "Chargement...", diff --git a/i18n/fra/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json b/i18n/fra/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json index bdd70d229db..1d2d1988d2f 100644 --- a/i18n/fra/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json +++ b/i18n/fra/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json @@ -15,5 +15,9 @@ "schema.brackets": "Définit les symboles de type crochet qui augmentent ou diminuent le retrait.", "schema.autoClosingPairs": "Définit les paires de crochets. Quand vous entrez un crochet ouvrant, le crochet fermant est inséré automatiquement.", "schema.autoClosingPairs.notIn": "Définit une liste d'étendues où les paires automatiques sont désactivées.", - "schema.surroundingPairs": "Définit les paires de crochets qui peuvent être utilisées pour entourer la chaîne sélectionnée." + "schema.surroundingPairs": "Définit les paires de crochets qui peuvent être utilisées pour entourer la chaîne sélectionnée.", + "schema.wordPattern": "La définition du mot dans le langage", + "schema.wordPattern.pattern": "L'expression régulière utilisée pour la recherche", + "schema.wordPattern.flags": "Les options d'expression régulière utilisées pour la recherche", + "schema.wordPattern.flags.errorMessage": "Doit valider l'expression régulière `/^([gimuy]+)$/`." } \ No newline at end of file diff --git a/i18n/fra/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/fra/src/vs/platform/markers/common/problemMatcher.i18n.json index 144b90a8319..985f7884334 100644 --- a/i18n/fra/src/vs/platform/markers/common/problemMatcher.i18n.json +++ b/i18n/fra/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -34,7 +34,6 @@ "ProblemMatcherParser.noValidIdentifier": "Erreur : la propriété de modèle {0} n'est pas un nom de variable de modèle valide.", "ProblemMatcherParser.problemPattern.watchingMatcher": "Un détecteur de problèmes de correspondance doit définir un modèle de début et un modèle de fin à observer.", "ProblemMatcherParser.invalidRegexp": "Erreur : la chaîne {0} est une expression régulière non valide.\n", - "WatchingPatternSchema.regexp": "Expression régulière permettant de détecter le début ou la fin d'une tâche de suivi.", "WatchingPatternSchema.file": "Index de groupe de correspondance du nom de fichier. Peut être omis.", "PatternTypeSchema.name": "Nom d'un modèle faisant l'objet d'une contribution ou prédéfini", "PatternTypeSchema.description": "Modèle de problème ou bien nom d'un modèle de problème faisant l'objet d'une contribution ou prédéfini. Peut être omis si base est spécifié.", @@ -46,7 +45,6 @@ "ProblemMatcherSchema.watching.activeOnStart": "Si la valeur est true, le mode espion est actif au démarrage de la tâche. Cela revient à émettre une ligne qui correspond à beginPattern", "ProblemMatcherSchema.watching.beginsPattern": "En cas de correspondance dans la sortie, le début d'une tâche de suivi est signalé.", "ProblemMatcherSchema.watching.endsPattern": "En cas de correspondance dans la sortie, la fin d'une tâche de suivi est signalée.", - "ProblemMatcherSchema.watching": "Modèles de suivi du début et de la fin d'un modèle espion.", "LegacyProblemMatcherSchema.watchedBegin.deprecated": "Cette propriété est déconseillée. Utilisez la propriété espion à la place.", "LegacyProblemMatcherSchema.watchedBegin": "Expression régulière signalant qu'une tâche faisant l'objet d'un suivi commence à s'exécuter via le suivi d'un fichier.", "LegacyProblemMatcherSchema.watchedEnd.deprecated": "Cette propriété est déconseillée. Utilisez la propriété espion à la place.", diff --git a/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json index c626b2d262b..4977fe04f0b 100644 --- a/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/fra/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -7,9 +7,15 @@ "invalid.color": "Format de couleur non valide. Utilisez #RGB, #RGBA, #RRGGBB ou #RRGGBBAA", "schema.colors": "Couleurs utilisées dans le banc d'essai.", "foreground": "Couleur de premier plan globale. Cette couleur est utilisée si elle n'est pas remplacée par un composant.", + "errorForeground": "Couleur principale de premier plan pour les messages d'erreur. Cette couleur est utilisée uniquement si elle n'est pas redéfinie par un composant.", + "descriptionForeground": "Couleur de premier plan du texte descriptif fournissant des informations supplémentaires, par exemple pour un label.", "focusBorder": "Couleur de bordure globale des éléments ayant le focus. Cette couleur est utilisée si elle n'est pas remplacée par un composant.", "contrastBorder": "Bordure supplémentaire autour des éléments pour les séparer des autres et obtenir un meilleur contraste.", "activeContrastBorder": "Bordure supplémentaire autour des éléments actifs pour les séparer des autres et obtenir un meilleur contraste.", + "textSeparatorForeground": "Couleur pour les séparateurs de texte.", + "textLinkForeground": "Couleur des liens dans le texte.", + "textLinkActiveForeground": "Couleur des liens actifs dans le texte.", + "textPreformatForeground": "Couleur des segments de texte préformatés.", "widgetShadow": "Couleur de l'ombre des widgets, comme rechercher/remplacer, au sein de l'éditeur.", "inputBoxBackground": "Arrière-plan de la zone d'entrée.", "inputBoxForeground": "Premier plan de la zone d'entrée.", @@ -36,10 +42,13 @@ "buttonForeground": "Couleur de premier plan du bouton.", "buttonBackground": "Couleur d'arrière-plan du bouton.", "buttonHoverBackground": "Couleur d'arrière-plan du bouton pendant le pointage.", + "badgeBackground": "Couleur de fond des badges. Les badges sont de courts libelés d'information, ex. le nombre de résultats de recherche.", + "badgeForeground": "Couleur des badges. Les badges sont de courts libelés d'information, ex. le nombre de résultats de recherche.", "scrollbarShadow": "Ombre de la barre de défilement pour indiquer que la vue défile.", "scrollbarSliderBackground": "Couleur d'arrière-plan du curseur.", "scrollbarSliderHoverBackground": "Couleur d'arrière-plan du curseur pendant le pointage.", "scrollbarSliderActiveBackground": "Couleur d'arrière-plan du curseur actif.", + "progressBarBackground": "Couleur de fond pour la barre de progression qui peut s'afficher lors d'opérations longues.", "editorBackground": "Couleur d'arrière-plan de l'éditeur.", "editorForeground": "Couleur de premier plan par défaut de l'éditeur.", "editorWidgetBackground": "Couleur d'arrière-plan des gadgets de l'éditeur tels que rechercher/remplacer.", @@ -52,5 +61,9 @@ "hoverHighlight": "Mettez en surbrillance ci-dessous le mot pour lequel un pointage s'affiche.", "hoverBackground": "Couleur d'arrière-plan du pointage de l'éditeur.", "hoverBorder": "Couleur de bordure du pointage de l'éditeur.", - "activeLinkForeground": "Couleur des liens actifs." + "activeLinkForeground": "Couleur des liens actifs.", + "diffEditorInserted": "Couleur d'arrière-plan du texte inséré.", + "diffEditorRemoved": "Couleur d'arrière-plan du texte supprimé.", + "diffEditorInsertedOutline": "Couleur de contour du texte inséré.", + "diffEditorRemovedOutline": "Couleur de contour du texte supprimé." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/fra/src/vs/workbench/api/node/extHostTreeViews.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/electron-browser/shell.i18n.json b/i18n/fra/src/vs/workbench/electron-browser/shell.i18n.json index 6a2b2ffff3f..a24bedcde3d 100644 --- a/i18n/fra/src/vs/workbench/electron-browser/shell.i18n.json +++ b/i18n/fra/src/vs/workbench/electron-browser/shell.i18n.json @@ -4,9 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "runningAsRoot": "Il est déconseillé d'exécuter du code en tant qu'utilisateur 'root'.", - "prof.message": "Création réussie des profils.", - "prof.detail": "Créez un problème et joignez manuellement les fichiers suivants :\n{0}", - "prof.restartAndFileIssue": "Créer le problème et redémarrer", - "prof.restart": "Redémarrer" + "runningAsRoot": "Il est déconseillé d'exécuter du code en tant qu'utilisateur 'root'." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/electron-browser/window.i18n.json b/i18n/fra/src/vs/workbench/electron-browser/window.i18n.json index 133473eb180..4bb9062991d 100644 --- a/i18n/fra/src/vs/workbench/electron-browser/window.i18n.json +++ b/i18n/fra/src/vs/workbench/electron-browser/window.i18n.json @@ -11,7 +11,5 @@ "paste": "Coller", "selectAll": "Tout Sélectionner", "confirmOpen": "Voulez-vous vraiment ouvrir {0} dossiers ?", - "confirmOpenButton": "&&Ouvrir...", - "developer": "Développeur", - "file": "Fichier" + "confirmOpenButton": "&&Ouvrir..." } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json index 8b6ad71cd4e..b64bb8a15cc 100644 --- a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "balanceInward": "Emmet : Balance (inward)", + "balanceOutward": "Emmet : Balance (outward)" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json index 8b6ad71cd4e..a8c57987711 100644 --- a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "previousEditPoint": "Emmet : Previous Edit Point", + "nextEditPoint": "Emmet : Next Edit Point" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json index 8b6ad71cd4e..4f8041f2fb1 100644 --- a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "evaluateMathExpression": "Emmet : Evaluate Math Expression" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json index 8b6ad71cd4e..29b06df4dce 100644 --- a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "expandAbbreviationAction": "Emmet : Expand Abbreviation" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json index 8b6ad71cd4e..89cee185d4d 100644 --- a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -3,4 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "incrementNumberByOneTenth": "Emmet : Increment by 0.1", + "incrementNumberByOne": "Emmet : Increment by 1", + "incrementNumberByTen": "Emmet : Increment by 10", + "decrementNumberByOneTenth": "Emmet : Decrement by 0.1", + "decrementNumberByOne": "Emmet : Decrement by 1", + "decrementNumberByTen": "Emmet : Decrement by 10" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json index 8b6ad71cd4e..fd27599315a 100644 --- a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "matchingPair": "Emmet : Go to Matching Pair" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json index 8b6ad71cd4e..172231ee72c 100644 --- a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "mergeLines": "Emmet : Merge Lines" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json index 8b6ad71cd4e..e15d8ff52bc 100644 --- a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "reflectCSSValue": "Emmet : Reflect CSS Value" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json index 8b6ad71cd4e..1764345605f 100644 --- a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "removeTag": "Emmet : Remove Tag" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json index 8b6ad71cd4e..b53add87909 100644 --- a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "selectPreviousItem": "Emmet : Select Previous Item", + "selectNextItem": "Emmet : Select Next Item" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json index 8b6ad71cd4e..701bd61f9b9 100644 --- a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "splitJoinTag": "Emmet : Split/Join Tag" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json index 8b6ad71cd4e..46ab423bdfc 100644 --- a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "toggleComment": "Emmet : Toggle Comment" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json index 8b6ad71cd4e..ce110b0e82d 100644 --- a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "updateImageSize": "Emmet : Update Image Size" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json index 8b6ad71cd4e..948679f37cf 100644 --- a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "updateTag": "Emmet : Update Tag", + "enterTag": "Entrer une balise", + "tag": "Balise" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json index 8b6ad71cd4e..4e4c925168c 100644 --- a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "wrapWithAbbreviationAction": "Emmet : Wrap with Abbreviation", + "enterAbbreviation": "Entrer une abréviation", + "abbreviation": "Abréviation" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json index 8b6ad71cd4e..33db3866d0c 100644 --- a/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -3,4 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "emmetConfigurationTitle": "Emmet", + "triggerExpansionOnTab": "Une fois les abréviations Emmet activées, elles se développent quand vous appuyez sur la touche Tab.", + "emmetPreferences": "Préférences utilisées pour modifier le comportement de certaines actions et résolveurs d'Emmet.", + "emmetSyntaxProfiles": "Définissez le profil pour la syntaxe spécifiée ou utilisez votre propre profil avec des règles spécifiques.", + "emmetExclude": "Ensemble de langages où les abréviations emmet ne doivent pas être développées.", + "emmetExtensionsPath": "Chemin d'un dossier contenant les profils, extraits et préférences Emmet" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json b/i18n/fra/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json index 523b1b3eedf..03c80a19e00 100644 --- a/i18n/fra/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}, tasks", "tasksAriaLabel": "Tapez le nom d'une tâche à redémarrer", "noTasksMatching": "Aucune tâche correspondante", "noTasksFound": "Aucune tâche à recommencer n'a été trouvée" diff --git a/i18n/fra/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json b/i18n/fra/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json index dbe8afe6d87..f1a32f4b7bf 100644 --- a/i18n/fra/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}, tasks", "tasksAriaLabel": "Tapez le nom d'une tâche à exécuter", "noTasksMatching": "No tasks matching", "noTasksFound": "Tâches introuvables" diff --git a/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index f533c1e348e..88d26394dcf 100644 --- a/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -13,25 +13,16 @@ "welcomePage.recent": "Récent", "welcomePage.noRecentFolders": "Aucun dossier récent", "welcomePage.help": "Aide", - "welcomePage.productDocumentation": "Documentation du produit", "welcomePage.introductoryVideos": "Vidéos d'introduction", - "welcomePage.keybindingsReference": "Référence des raccourcis clavier", + "welcomePage.productDocumentation": "Documentation du produit", "welcomePage.gitHubRepository": "Dépôt GitHub", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "Afficher la page d'accueil au démarrage", + "welcomePage.customize": "Personnaliser", "welcomePage.installKeymapDescription": "Installer les raccourcis clavier", - "welcomePage.installKeymap": "Installez les raccourcis clavier de {0}, {1}, {2} et {3}", - "welcomePage.vim": "Vim", - "welcomePage.vimCurrent": "Vim (actuel)", - "welcomePage.sublime": "Sublime", - "welcomePage.sublimeCurrent": "Sublime (actuel)", - "welcomePage.atom": "Atom", - "welcomePage.atomCurrent": "Atom (actuel)", "welcomePage.others": "autres", "welcomePage.colorTheme": "Thème de couleur", "welcomePage.colorThemeDescription": "Personnalisez l'apparence de l'éditeur et de votre code", - "welcomePage.configureSettings": "Configurer les paramètres", - "welcomePage.configureSettingsDescription": "Déverrouillez toute la puissance de VS Code en adaptant les paramètres", "welcomePage.showCommands": "Rechercher et exécuter toutes les commandes", "welcomePage.showCommandsDescription": "Utilisez et recherchez rapidement des commandes dans le Panneau de configuration ({0})", "welcomePage.interfaceOverview": "Vue d'ensemble de l'interface", @@ -39,5 +30,8 @@ "welcomePage.interactivePlayground": "Terrain de jeu interactif", "welcomePage.interactivePlaygroundDescription": "Essayez les fonctionnalités essentielles de l'éditeur en suivant une brève procédure pas à pas", "welcomePage.quickLinks": "Liens rapides", - "welcomePage.keybindingsReferenceDescription": "Fichier PDF imprimable avec les raccourcis clavier les plus usuels" + "welcomePage.keybindingsReference": "Référence des raccourcis clavier", + "welcomePage.keybindingsReferenceDescription": "Fichier PDF imprimable avec les raccourcis clavier les plus usuels", + "welcomePage.configureSettings": "Configurer les paramètres", + "welcomePage.configureSettingsDescription": "Déverrouillez toute la puissance de VS Code en adaptant les paramètres" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index 3d4de6c3ca3..915c12960a0 100644 --- a/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,11 +5,11 @@ // Do not edit this file. It is machine generated. { "welcomePage": "Bienvenue", - "welcome.title": "Bienvenue", "welcomePage.keymapAlreadyInstalled": "Les raccourcis clavier {0} sont déjà installés.", "welcomePage.willReloadAfterInstallingKeymap": "La fenêtre se recharge après l'installation des raccourcis clavier {0}.", - "ok": "OK", "welcomePage.installingKeymap": "Installation des raccourcis clavier de {0}...", "welcomePage.keymapNotFound": "Les raccourcis clavier {0} ayant l'ID {1} sont introuvables.", + "welcome.title": "Bienvenue", + "ok": "OK", "cancel": "Annuler" } \ No newline at end of file diff --git a/i18n/ita/extensions/git/out/commands.i18n.json b/i18n/ita/extensions/git/out/commands.i18n.json index a95a76b686a..530bbe4a409 100644 --- a/i18n/ita/extensions/git/out/commands.i18n.json +++ b/i18n/ita/extensions/git/out/commands.i18n.json @@ -18,6 +18,7 @@ "discard": "Rimuovi modifiche", "confirm discard all": "Sei sicuro di voler annullare TUTTE le modifiche? Quest'azione è IRREVERSIBILE!", "discardAll": "Rimuovi TUTTE le modifiche", + "no staged changes": "Non ci sono modifiche in stage di cui eseguire il commit.\n\nSI desidera mettere in stage automaticamente tutte le modifiche ed eseguirne il commit direttamente?", "yes": "Sì", "always": "Sempre", "no changes": "Non ci sono modifiche di cui eseguire il commit.", diff --git a/i18n/ita/extensions/git/package.i18n.json b/i18n/ita/extensions/git/package.i18n.json index ec477ab6861..3ba24f908e9 100644 --- a/i18n/ita/extensions/git/package.i18n.json +++ b/i18n/ita/extensions/git/package.i18n.json @@ -42,5 +42,7 @@ "config.countBadge": "Controlla il contatore delle notifiche git. Con `all` vengono conteggiate tutte le modifiche. Con `tracked` vengono conteggiate solo le revisioni. Con `off` il contatore è disattivato.", "config.checkoutType": "Controlla il tipo di branch mostrati eseguendo il comando `Checkout in...`. `all` mostra tutti i refs, `local` mostra solamente i branch locali, `tags` mostra solamente i tag e `remote` mostra solamente i branch remoti.", "config.ignoreLegacyWarning": "Ignora l'avvertimento legacy di Git", - "config.ignoreLimitWarning": "Ignora il messaggio di avviso quando ci sono troppi cambiamenti in un repository" + "config.ignoreLimitWarning": "Ignora il messaggio di avviso quando ci sono troppi cambiamenti in un repository", + "config.defaultCloneDirectory": "Il percorso predefinito dove clonare un repository GIT", + "config.enableSmartCommit": "Eseguire il commit di tutte le modifiche quando non ci sono cambiamenti in stage." } \ No newline at end of file diff --git a/i18n/ita/extensions/jake/out/main.i18n.json b/i18n/ita/extensions/jake/out/main.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/extensions/jake/out/main.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/extensions/jake/package.i18n.json b/i18n/ita/extensions/jake/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/extensions/jake/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/ita/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json index 8b6ad71cd4e..39fde0fced3 100644 --- a/i18n/ita/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json +++ b/i18n/ita/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "ts-check": "Attiva il controllo semantico in un file JavaScript. Deve essere all'inizio del file.", + "ts-nocheck": "Disattiva il controllo semantico in un file JavaScript. Deve essere all'inizio del file.", + "ts-ignore": "Elimina errori di @ts-check sulla riga successiva di un file." +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript/out/utils/logger.i18n.json b/i18n/ita/extensions/typescript/out/utils/logger.i18n.json index 8b6ad71cd4e..bc738f43d0c 100644 --- a/i18n/ita/extensions/typescript/out/utils/logger.i18n.json +++ b/i18n/ita/extensions/typescript/out/utils/logger.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/ita/extensions/typescript/package.i18n.json b/i18n/ita/extensions/typescript/package.i18n.json index c6928c13332..36ff2654b3e 100644 --- a/i18n/ita/extensions/typescript/package.i18n.json +++ b/i18n/ita/extensions/typescript/package.i18n.json @@ -33,9 +33,13 @@ "javascript.validate.enable": "Abilita/Disabilita la convalida JavaScript.", "typescript.goToProjectConfig.title": "Passa a Configurazione progetto", "javascript.goToProjectConfig.title": "Passa a Configurazione progetto", + "javascript.referencesCodeLens.enabled": "Abilita/disabilita riferimenti CodeLens nei file JavaScript.", + "typescript.referencesCodeLens.enabled": "Abilita/disabilita riferimenti CodeLens nei file TypeScript. Richiede TypeScript >= 2.0.6.", "typescript.implementationsCodeLens.enabled": "Abilita/Disabilita le finestre CodeLens per le implementazioni. Richiede una versione di TypeScript uguale o successiva alla 2.2.0.", + "typescript.openTsServerLog.title": "Apri il log del server TypeScript", "typescript.selectTypeScriptVersion.title": "Seleziona la versione di TypeScript", "jsDocCompletion.enabled": "Abilita/Disabilita commenti automatici JSDoc", "javascript.implicitProjectConfig.checkJs": "Abilita/disabilita il controllo semantico di file JavaScript. File jsconfig.json o tsconfig.json esistenti sovrascrivono su questa impostazione. Richiede TypeScript >= 2.3.1.", - "typescript.check.npmIsInstalled": "Controllare se NPM è installato per l'acquisizione automatica delle definizioni di tipi" + "typescript.check.npmIsInstalled": "Controllare se NPM è installato per l'acquisizione automatica delle definizioni di tipi", + "javascript.nameSuggestions": "Abilita/disabilita l'inclusione di nomi univoci dal file negli elenchi di suggerimento di JavaScript." } \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json index 99cb8b5cd77..59f730fe1dc 100644 --- a/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -9,6 +9,7 @@ "fontWeight": "Controlla lo spessore del carattere.", "fontSize": "Controlla le dimensioni del carattere in pixel.", "lineHeight": "Controlla l'altezza della riga. Usare 0 per calcolare l'altezza della riga dalle dimensioni del carattere.", + "letterSpacing": "Controlla la spaziatura tra le lettere in pixel.", "lineNumbers": "Consente di controllare la visualizzazione dei numeri di riga. I valori possibili sono 'on', 'off' e 'relative'. Con 'relative' viene visualizzato il conteggio delle righe a partire dalla posizione corrente del cursore.", "rulers": "Colonne in corrispondenza delle quali visualizzare i righelli verticali", "wordSeparators": "Caratteri che verranno usati come separatori di parola quando si eseguono operazioni o spostamenti correlati a parole", diff --git a/i18n/ita/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/ita/src/vs/editor/common/view/editorColorRegistry.i18n.json index 6cf52ddd21e..48a155767d2 100644 --- a/i18n/ita/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/ita/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -10,5 +10,11 @@ "caret": "Colore del cursore dell'editor.", "editorWhitespaces": "Colore dei caratteri di spazio vuoto nell'editor.", "editorIndentGuides": "Colore delle guide per i rientri dell'editor.", - "editorLineNumbers": "Colore dei numeri di riga dell'editor." + "editorLineNumbers": "Colore dei numeri di riga dell'editor.", + "editorRuler": "Colore dei righelli dell'editor.", + "editorCodeLensForeground": "Colore primo piano delle finestre di CodeLens dell'editor", + "editorBracketMatchBackground": "Colore di sfondo delle parentesi corrispondenti", + "editorBracketMatchBorder": "Colore delle caselle di parentesi corrispondenti", + "editorOverviewRulerBorder": "Colore del bordo del righello delle annotazioni.", + "editorGutter": "Colore di sfondo della barra di navigazione dell'editor. La barra contiene i margini di glifo e i numeri di riga." } \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json b/i18n/ita/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json index 60ce91d8df1..1b3c14ffa2f 100644 --- a/i18n/ita/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json @@ -16,9 +16,12 @@ "peekViewTitleInfoForeground": "Colore delle informazioni del titolo della visualizzazione rapida.", "peekViewBorder": "Colore dei bordi e della freccia della visualizzazione rapida.", "peekViewResultsBackground": "Colore di sfondo dell'elenco risultati della visualizzazione rapida.", + "peekViewResultsMatchForeground": "Colore primo piano dei nodi riga nell'elenco risultati della visualizzazione rapida.", + "peekViewResultsFileForeground": "Colore primo piano dei nodi file nell'elenco risultati della visualizzazione rapida.", "peekViewResultsSelectionBackground": "Colore di sfondo della voce selezionata nell'elenco risultati della visualizzazione rapida.", "peekViewResultsSelectionForeground": "Colore primo piano della voce selezionata nell'elenco risultati della visualizzazione rapida.", "peekViewEditorBackground": "Colore di sfondo dell'editor di visualizzazioni rapide.", + "peekViewEditorGutterBackground": "Colore di sfondo della barra di navigazione nell'editor visualizzazione rapida.", "peekViewResultsMatchHighlight": "Colore dell'evidenziazione delle corrispondenze nell'elenco risultati della visualizzazione rapida.", "peekViewEditorMatchHighlight": "Colore dell'evidenziazione delle corrispondenze nell'editor di visualizzazioni rapide." } \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/ita/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index bbb46151abd..eb519f2c5dd 100644 --- a/i18n/ita/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/ita/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,8 +9,10 @@ "editorSuggestWidgetForeground": "Colore primo piano del widget dei suggerimenti.", "editorSuggestWidgetSelectedBackground": "Colore di sfondo della voce selezionata del widget dei suggerimenti.", "editorSuggestWidgetHighlightForeground": "Colore delle evidenziazioni corrispondenze nel widget dei suggerimenti.", + "readMore": "Altre informazioni...{0}", "suggestionWithDetailsAriaLabel": "{0}, suggerimento, con dettagli", "suggestionAriaLabel": "{0}, suggerimento", + "readLess": "Meno informazioni... {0}", "suggestWidget.loading": "Caricamento...", "suggestWidget.noSuggestions": "Non ci sono suggerimenti.", "suggestionAriaAccepted": "{0}, accettato", diff --git a/i18n/ita/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json b/i18n/ita/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json index 50520a5626e..0a974d14915 100644 --- a/i18n/ita/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json +++ b/i18n/ita/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json @@ -15,5 +15,9 @@ "schema.brackets": "Definisce i simboli di parentesi quadra che aumentano o riducono il rientro.", "schema.autoClosingPairs": "Definisce le coppie di parentesi quadre. Quando viene immessa una parentesi quadra di apertura, quella di chiusura viene inserita automaticamente.", "schema.autoClosingPairs.notIn": "Definisce un elenco di ambiti in cui la corrispondenza automatica delle coppie è disabilitata.", - "schema.surroundingPairs": "Definisce le coppie di parentesi quadre che possono essere usate per racchiudere una stringa selezionata." + "schema.surroundingPairs": "Definisce le coppie di parentesi quadre che possono essere usate per racchiudere una stringa selezionata.", + "schema.wordPattern": "La definizione di parola per il linguaggio.", + "schema.wordPattern.pattern": "Il modello di RegExp utilizzato per trovare parole.", + "schema.wordPattern.flags": "I flag di RegExp utilizzati per trovare parole.", + "schema.wordPattern.flags.errorMessage": "Deve corrispondere al modello `/^([gimuy]+)$/`." } \ No newline at end of file diff --git a/i18n/ita/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/ita/src/vs/platform/markers/common/problemMatcher.i18n.json index a69fc6f95b3..a2611139aec 100644 --- a/i18n/ita/src/vs/platform/markers/common/problemMatcher.i18n.json +++ b/i18n/ita/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -34,7 +34,6 @@ "ProblemMatcherParser.noValidIdentifier": "Errore: la proprietà {0} del criterio non è un nome di variabile criterio valido.", "ProblemMatcherParser.problemPattern.watchingMatcher": "Un matcher problemi deve definire un criterio di inizio e un criterio di fine per il controllo.", "ProblemMatcherParser.invalidRegexp": "Errore: la stringa {0} non è un'espressione regolare valida.\n", - "WatchingPatternSchema.regexp": "Espressione regolare per rilevare l'inizio o la fine di un'attività di controllo.", "WatchingPatternSchema.file": "Indice del gruppo di corrispondenze del nome file. Può essere omesso.", "PatternTypeSchema.name": "Nome di un criterio predefinito o aggiunto come contributo", "PatternTypeSchema.description": "Criterio di problema o nome di un criterio di problema predefinito o aggiunto come contributo. Può essere omesso se si specifica base.", @@ -46,7 +45,6 @@ "ProblemMatcherSchema.watching.activeOnStart": "Se impostato su true, indica che il watcher è in modalità attiva all'avvio dell'attività. Equivale a inviare una riga che corrisponde al criterio di avvio", "ProblemMatcherSchema.watching.beginsPattern": "Se corrisponde nell'output, viene segnalato l'avvio di un'attività di controllo.", "ProblemMatcherSchema.watching.endsPattern": "Se corrisponde nell'output, viene segnalata la fine di un'attività di controllo.", - "ProblemMatcherSchema.watching": "Criteri per tenere traccia dell'inizio e della fine di un criterio di controllo.", "LegacyProblemMatcherSchema.watchedBegin.deprecated": "Questa proprietà è deprecata. In alternativa, usare la proprietà watching.", "LegacyProblemMatcherSchema.watchedBegin": "Espressione regolare con cui viene segnalato l'avvio dell'esecuzione di un'attività controllata attivato tramite il controllo dei file.", "LegacyProblemMatcherSchema.watchedEnd.deprecated": "Questa proprietà è deprecata. In alternativa, usare la proprietà watching.", diff --git a/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json index 927b93f7b8d..e1d1005789b 100644 --- a/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/ita/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -7,14 +7,25 @@ "invalid.color": "Formato colore non valido. Usare #RGB, #RGBA, #RRGGBB o #RRGGBBAA", "schema.colors": "Colori usati nell'area di lavoro.", "foreground": "Colore primo piano. Questo colore è utilizzato solo se non viene sovrascritto da un componente.", + "errorForeground": "Colore primo piano globale per i messaggi di errore. Questo colore è utilizzato solamente se non viene sottoposto a override da un componente.", + "descriptionForeground": "Colore primo piano del testo che fornisce informazioni aggiuntive, ad esempio per un'etichetta di testo.", "focusBorder": "Colore dei bordi degli elementi evidenziati. Questo colore è utilizzato solo se non viene sovrascritto da un componente.", "contrastBorder": "Un bordo supplementare attorno agli elementi per contrastarli maggiormente rispetto agli altri.", "activeContrastBorder": "Un bordo supplementare intorno agli elementi attivi per contrastarli maggiormente rispetto agli altri.", + "selectionBackground": "Il colore di sfondo delle selezioni di testo nel workbench (ad esempio per i campi di input o aree di testo). Si noti che questo non si applica alle selezioni all'interno dell'editor e del terminale.", + "textSeparatorForeground": "Colore dei separatori di testo.", + "textLinkForeground": "Colore primo piano dei link nel testo.", + "textLinkActiveForeground": "Colore primo piano dei link attivi nel testo.", + "textPreformatForeground": "Colore primo piano dei segmenti di testo preformattato.", + "textBlockQuoteBackground": "Colore di sfondo per le citazioni nel testo.", + "textBlockQuoteBorder": "Colore bordo per citazioni nel testo.", + "textCodeBlockBackground": "Colore sfondo per blocchi di codice nel testo.", "widgetShadow": "Colore ombreggiatura dei widget, ad es. Trova/Sostituisci all'interno dell'editor.", "inputBoxBackground": "Sfondo della casella di input.", "inputBoxForeground": "Primo piano della casella di input.", "inputBoxBorder": "Bordo della casella di input.", "inputBoxActiveOptionBorder": "Colore del bordo di opzioni attivate nei campi di input.", + "inputPlaceholderForeground": "Colore primo piano di casella di input per il testo segnaposto.", "inputValidationInfoBackground": "Colore di sfondo di convalida dell'input di tipo Informazione.", "inputValidationInfoBorder": "Colore bordo di convalida dell'input di tipo Informazione.", "inputValidationWarningBackground": "Colore di sfondo di convalida dell'input di tipo Avviso.", @@ -25,10 +36,13 @@ "dropdownForeground": "Primo piano dell'elenco a discesa.", "dropdownBorder": "Bordo dell'elenco a discesa.", "listFocusBackground": "Colore sfondo Elenco/Struttura ad albero per l'elemento evidenziato quando l'Elenco/Struttura ad albero è attivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no.", + "listFocusForeground": "Colore primo piano Elenco/Struttura ad albero per l'elemento con stato attivo quando l'Elenco/Struttura ad albero è attivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no.", "listActiveSelectionBackground": "Colore sfondo Elenco/Struttura ad albero per l'elemento selezionato quando l'Elenco/Struttura ad albero è attivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no.", "listActiveSelectionForeground": "Colore primo piano Elenco/Struttura ad albero per l'elemento selezionato quando l'Elenco/Struttura ad albero è attivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no.", "listInactiveSelectionBackground": "Colore sfondo Elenco/Struttura ad albero per l'elemento selezionato quando l'Elenco/Struttura ad albero è inattivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no.", + "listInactiveSelectionForeground": "Colore primo piano Elenco/Struttura ad albero per l'elemento selezionato quando l'Elenco/Struttura ad albero è inattivo. Un Elenco/Struttura ad albero attivo\nha il focus della tastiera, uno inattivo no.", "listHoverBackground": "Sfondo Elenco/Struttura ad albero al passaggio del mouse sugli elementi.", + "listHoverForeground": "Primo piano Elenco/Struttura ad albero al passaggio del mouse sugli elementi.", "listDropBackground": "Sfondo Elenco/Struttura ad albero durante il trascinamento degli elementi selezionati.", "highlight": "Colore primo piano Elenco/Struttura ad albero delle occorrenze trovate durante la ricerca nell'Elenco/Struttura ad albero.", "pickerGroupForeground": "Colore di selezione rapida per il raggruppamento delle etichette.", @@ -36,13 +50,17 @@ "buttonForeground": "Colore primo piano del pulsante.", "buttonBackground": "Colore di sfondo del pulsante.", "buttonHoverBackground": "Colore di sfondo del pulsante al passaggio del mouse.", + "badgeBackground": "Colore di sfondo del badge. I badge sono piccole etichette informative, ad esempio per mostrare il conteggio dei risultati di una ricerca.", + "badgeForeground": "Colore primo piano del badge. I badge sono piccole etichette informative, ad esempio per mostrare il conteggio dei risultati di una ricerca.", "scrollbarShadow": "Ombra di ScrollBar per indicare lo scorrimento della visualizzazione.", "scrollbarSliderBackground": "Colore di sfondo dello Slider.", "scrollbarSliderHoverBackground": "Colore di sfondo dello Slider al passaggio del mouse", "scrollbarSliderActiveBackground": "Colore di sfondo dello Slider quando attivo.", + "progressBarBackground": "Colore di sfondo dell'indicatore di stato che può essere mostrato durante l'esecuzione di operazioni lunghe.", "editorBackground": "Colore di sfondo dell'editor.", "editorForeground": "Colore primo piano predefinito dell'editor.", "editorWidgetBackground": "Colore di sfondo dei widget dell'editor, ad esempio Trova/Sostituisci.", + "editorWidgetBorder": "Colore del bordo del widget editor.", "editorSelection": "Colore della selezione dell'editor.", "editorInactiveSelection": "Colore della selezione in un editor inattivo.", "editorSelectionHighlight": "Colore delle aree con lo stesso contenuto della selezione.", @@ -52,5 +70,9 @@ "hoverHighlight": "Evidenziazione sotto la parola per cui è visualizzata un'area sensibile al passaggio del mouse.", "hoverBackground": "Colore di sfondo dell'area sensibile al passaggio del mouse dell'editor.", "hoverBorder": "Colore del bordo dell'area sensibile al passaggio del mouse dell'editor.", - "activeLinkForeground": "Colore dei collegamenti attivi." + "activeLinkForeground": "Colore dei collegamenti attivi.", + "diffEditorInserted": "Colore di sfondo del testo che è stato inserito.", + "diffEditorRemoved": "Colore di sfondo del testo che è stato rimosso.", + "diffEditorInsertedOutline": "Colore del contorno del testo che è stato inserito.", + "diffEditorRemovedOutline": "Colore del contorno del testo che è stato rimosso." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/ita/src/vs/workbench/api/node/extHostTreeViews.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/electron-browser/shell.i18n.json b/i18n/ita/src/vs/workbench/electron-browser/shell.i18n.json index c0bbd0ba75e..efda81182a1 100644 --- a/i18n/ita/src/vs/workbench/electron-browser/shell.i18n.json +++ b/i18n/ita/src/vs/workbench/electron-browser/shell.i18n.json @@ -4,9 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "runningAsRoot": "È consigliabile non eseguire il codice come 'radice'.", - "prof.message": "I profili sono stati creati.", - "prof.detail": "Creare un problema e allegare manualmente i file seguenti:\n{0}", - "prof.restartAndFileIssue": "Crea problema e riavvia", - "prof.restart": "Riavvia" + "runningAsRoot": "È consigliabile non eseguire il codice come 'radice'." } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/electron-browser/window.i18n.json b/i18n/ita/src/vs/workbench/electron-browser/window.i18n.json index e4fdc2f801a..c3698933985 100644 --- a/i18n/ita/src/vs/workbench/electron-browser/window.i18n.json +++ b/i18n/ita/src/vs/workbench/electron-browser/window.i18n.json @@ -11,7 +11,5 @@ "paste": "Incolla", "selectAll": "Seleziona tutto", "confirmOpen": "Aprire le cartelle di {0}?", - "confirmOpenButton": "&&Apri", - "developer": "Sviluppatore", - "file": "File" + "confirmOpenButton": "&&Apri" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json index 8b6ad71cd4e..22f94f4cf36 100644 --- a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "balanceInward": "Emmet: Saldo (in ingresso)", + "balanceOutward": "Emmet: Saldo (in uscita)" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json index 8b6ad71cd4e..1549e77ce27 100644 --- a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "previousEditPoint": "Emmet: Punto di modifica precedente", + "nextEditPoint": "Emmet: Punto di modifica successivo" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json index 8b6ad71cd4e..27d67e79fef 100644 --- a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "evaluateMathExpression": "Emmet: Valuta espressione matematica" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json index 8b6ad71cd4e..71a96f5f840 100644 --- a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "expandAbbreviationAction": "Emmet: Espandi abbreviazione" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json index 8b6ad71cd4e..ece4609ebc5 100644 --- a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -3,4 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "incrementNumberByOneTenth": "Emmet: Aumenta di 0,1", + "incrementNumberByOne": "Emmet: Aumenta di 1", + "incrementNumberByTen": "Emmet: Aumenta di 10", + "decrementNumberByOneTenth": "Emmet: Riduci di 0,1", + "decrementNumberByOne": "Emmet: Riduci di 1", + "decrementNumberByTen": "Emmet: Riduci di 10" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json index 8b6ad71cd4e..e7e21455b6b 100644 --- a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "matchingPair": "Emmet: Vai alla coppia corrispondente" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json index 8b6ad71cd4e..5dc3268b490 100644 --- a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "mergeLines": "Emmet: Esegui merge delle righe" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json index 8b6ad71cd4e..15cd2c912c4 100644 --- a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "reflectCSSValue": "Emmet: Effettua reflection del valore CSS" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json index 8b6ad71cd4e..a375d4ca576 100644 --- a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "removeTag": "Emmet: Rimuovi tag" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json index 8b6ad71cd4e..78c6fd0761b 100644 --- a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "selectPreviousItem": "Emmet: Seleziona elemento precedente", + "selectNextItem": "Emmet: Seleziona elemento successivo" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json index 8b6ad71cd4e..006ad09b523 100644 --- a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "splitJoinTag": "Emmet: Dividi/Unisci tag" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json index 8b6ad71cd4e..f4338f86f4e 100644 --- a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "toggleComment": "Emmet: Attiva/Disattiva commento" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json index 8b6ad71cd4e..49c7306573d 100644 --- a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "updateImageSize": "Emmet: Aggiorna dimensioni immagine" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json index 8b6ad71cd4e..38caa12dc95 100644 --- a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "updateTag": "Emmet: Aggiorna tag", + "enterTag": "Immetti tag", + "tag": "Tag" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json index 8b6ad71cd4e..f83f8f86716 100644 --- a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "wrapWithAbbreviationAction": "Emmet: Esegui il wrapping con l'abbreviazione", + "enterAbbreviation": "Immetti abbreviazione", + "abbreviation": "Abbreviazione" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json index 8b6ad71cd4e..2b16a19f047 100644 --- a/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -3,4 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "emmetConfigurationTitle": "Emmet", + "triggerExpansionOnTab": "Se abilitate, le abbreviazioni Emmet vengono espanse quando si preme TAB.", + "emmetPreferences": "Preferenze usate per modificare il comportamento di alcune azioni e i resolver di Emmet.", + "emmetSyntaxProfiles": "Consente di definire il profilo per la sintassi specificata oppure di usare un profilo personalizzato con regole specifiche.", + "emmetExclude": "Matrice di linguaggi in cui le abbreviazioni Emmet non devono essere espanse.", + "emmetExtensionsPath": "Percorso di una cartella contenente snippet, preferenze e profili Emmet" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json b/i18n/ita/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json index a0b8634361d..cce0f602a0f 100644 --- a/i18n/ita/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}, tasks", "tasksAriaLabel": "Digitare il nome di un'attività da riavviare", "noTasksMatching": "No tasks matching", "noTasksFound": "Non sono state trovate attività da riavviare" diff --git a/i18n/ita/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json b/i18n/ita/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json index 1bf6e6b40b9..ed1ead3e156 100644 --- a/i18n/ita/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}, tasks", "tasksAriaLabel": "Digitare il nome di un'attività da eseguire", "noTasksMatching": "No tasks matching", "noTasksFound": "Non sono state trovate attività" diff --git a/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 1ea541dafa1..aa2a81f6197 100644 --- a/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -13,25 +13,16 @@ "welcomePage.recent": "Recenti", "welcomePage.noRecentFolders": "Non ci sono cartelle recenti", "welcomePage.help": "Guida", - "welcomePage.productDocumentation": "Documentazione del prodotto", "welcomePage.introductoryVideos": "Video introduttivi", - "welcomePage.keybindingsReference": "Riferimento per tasti di scelta rapida", + "welcomePage.productDocumentation": "Documentazione del prodotto", "welcomePage.gitHubRepository": "Repository GitHub", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "Mostra la pagina iniziale all'avvio", + "welcomePage.customize": "Personalizza", "welcomePage.installKeymapDescription": "Installa i tasti di scelta rapida", - "welcomePage.installKeymap": "Installa i tasti di scelta rapida di {0}, {1}, {2} e {3}", - "welcomePage.vim": "Vim", - "welcomePage.vimCurrent": "Vim (corrente)", - "welcomePage.sublime": "Sublime", - "welcomePage.sublimeCurrent": "Sublime (corrente)", - "welcomePage.atom": "Atom", - "welcomePage.atomCurrent": "Atom (corrente)", "welcomePage.others": "altri", "welcomePage.colorTheme": "Tema colori", "welcomePage.colorThemeDescription": "Tutto quel che serve per configurare editor e codice nel modo desiderato", - "welcomePage.configureSettings": "Configura le impostazioni", - "welcomePage.configureSettingsDescription": "Perfeziona le impostazioni per sfruttare appieno tutta la potenza di Visual Studio Code", "welcomePage.showCommands": "Trova ed esegui tutti i comandi", "welcomePage.showCommandsDescription": "Accesso e ricerca rapida di comandi dal pannello di controllo ({0})", "welcomePage.interfaceOverview": "Panoramica dell'interfaccia", @@ -39,5 +30,8 @@ "welcomePage.interactivePlayground": "Playground interattivo", "welcomePage.interactivePlaygroundDescription": "Breve panoramica delle funzionalità essenziali dell'editor", "welcomePage.quickLinks": "Collegamenti rapidi", - "welcomePage.keybindingsReferenceDescription": "PDF stampabile con i tasti di scelta rapida più comuni" + "welcomePage.keybindingsReference": "Riferimento per tasti di scelta rapida", + "welcomePage.keybindingsReferenceDescription": "PDF stampabile con i tasti di scelta rapida più comuni", + "welcomePage.configureSettings": "Configura le impostazioni", + "welcomePage.configureSettingsDescription": "Perfeziona le impostazioni per sfruttare appieno tutta la potenza di Visual Studio Code" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index 6614c86ca0b..d2d18b208df 100644 --- a/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,11 +5,11 @@ // Do not edit this file. It is machine generated. { "welcomePage": "Benvenuti", - "welcome.title": "Benvenuti", "welcomePage.keymapAlreadyInstalled": "I tasti di scelta rapida di {0} sono già installati.", "welcomePage.willReloadAfterInstallingKeymap": "La finestra verrà ricaricata dopo l'installazione dei tasti di scelta rapida di {0}.", - "ok": "OK", "welcomePage.installingKeymap": "Installazione dei tasti di scelta rapida di {0}...", "welcomePage.keymapNotFound": "I tasti di scelta rapida di {0} con ID {1} non sono stati trovati.", + "welcome.title": "Benvenuti", + "ok": "OK", "cancel": "Annulla" } \ No newline at end of file diff --git a/i18n/jpn/extensions/jake/out/main.i18n.json b/i18n/jpn/extensions/jake/out/main.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/extensions/jake/out/main.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/extensions/jake/package.i18n.json b/i18n/jpn/extensions/jake/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/extensions/jake/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript/out/utils/logger.i18n.json b/i18n/jpn/extensions/typescript/out/utils/logger.i18n.json index 8b6ad71cd4e..bc738f43d0c 100644 --- a/i18n/jpn/extensions/typescript/out/utils/logger.i18n.json +++ b/i18n/jpn/extensions/typescript/out/utils/logger.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/code/electron-main/menus.i18n.json b/i18n/jpn/src/vs/code/electron-main/menus.i18n.json index 1231ec0a275..79412979d8d 100644 --- a/i18n/jpn/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/jpn/src/vs/code/electron-main/menus.i18n.json @@ -143,6 +143,7 @@ "miAccessibilityOptions": "ユーザー補助オプション(&&O)", "miReportIssues": "問題の報告(&&I)", "miWelcome": "ようこそ(&&W)", + "miInteractivePlayground": "対話型プレイグラウンド(&&I)", "miDocumentation": "参照資料(&&D)", "miReleaseNotes": "リリース ノート(&&R)", "miKeyboardShortcuts": "キーボード ショートカットの参照(&&K)", diff --git a/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json index a202eb95765..da6b50dacf0 100644 --- a/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -9,6 +9,7 @@ "fontWeight": "フォントの太さを制御します。", "fontSize": "フォント サイズをピクセル単位で制御します。", "lineHeight": "行の高さを制御します。fontSize に基づいて lineHeight を計算する場合には、0 を使用します。", + "letterSpacing": "文字の間隔をピクセル単位で制御します。", "lineNumbers": "行番号の表示を制御します。使用可能な値は、'on'、'off'、および 'relative' です。'relative' は現在のカーソル位置からの行数を示します。", "rulers": "垂直ルーラーを表示する列", "wordSeparators": "単語に関連したナビゲーションまたは操作を実行するときに、単語の区切り文字として使用される文字", @@ -62,7 +63,6 @@ "renderLineHighlight": "エディターが現在の行をどのように強調表示するかを制御します。考えられる値は 'none'、'gutter'、'line'、'all' です。", "codeLens": "エディターで CodeLens を表示するかどうかを制御する", "folding": "エディターでコードの折りたたみを有効にするかどうかを制御します", - "hideFoldIcons": "余白上の展開アイコンを自動的に非表示にするかどうかを制御します 。", "matchBrackets": "かっこを選択すると、対応するかっこを強調表示します。", "glyphMargin": "エディターで縦のグリフ余白が表示されるかどうかを制御します。ほとんどの場合、グリフ余白はデバッグに使用されます。", "useTabStops": "空白の挿入や削除はタブ位置に従って行われます", diff --git a/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index c57f70f47ef..b5c107a4338 100644 --- a/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,6 +9,7 @@ "editorSuggestWidgetForeground": "候補ウィジェットの前景色。", "editorSuggestWidgetSelectedBackground": "候補ウィジェット内で選択済みエントリの背景色。", "editorSuggestWidgetHighlightForeground": "候補のウィジェット内で一致したハイライトの色。", + "readMore": "詳細を表示...{0}", "suggestionWithDetailsAriaLabel": "{0}、候補、詳細あり", "suggestionAriaLabel": "{0}、候補", "suggestWidget.loading": "読み込んでいます...", diff --git a/i18n/jpn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json b/i18n/jpn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json index 918be3ac1a1..991783c6602 100644 --- a/i18n/jpn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json +++ b/i18n/jpn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json @@ -15,5 +15,8 @@ "schema.brackets": "インデントを増減する角かっこを定義します。", "schema.autoClosingPairs": "角かっこのペアを定義します。左角かっこが入力されると、右角かっこが自動的に挿入されます。", "schema.autoClosingPairs.notIn": "自動ペアが無効なスコープの一覧を定義します。", - "schema.surroundingPairs": "選択文字列を囲むときに使用できる角かっこのペアを定義します。" + "schema.surroundingPairs": "選択文字列を囲むときに使用できる角かっこのペアを定義します。", + "schema.wordPattern.pattern": "言葉の照合に使用する正規表現パターン。", + "schema.wordPattern.flags": "言葉の照合に使用する正規表現フラグ。", + "schema.wordPattern.flags.errorMessage": "`/^([gimuy]+)$/` パターンに一致する必要があります。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/jpn/src/vs/platform/markers/common/problemMatcher.i18n.json index b656a78c799..2bbfe1d0b1d 100644 --- a/i18n/jpn/src/vs/platform/markers/common/problemMatcher.i18n.json +++ b/i18n/jpn/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -34,7 +34,6 @@ "ProblemMatcherParser.noValidIdentifier": "エラー: パターン プロパティ {0} は有効なパターン変数名ではありません。", "ProblemMatcherParser.problemPattern.watchingMatcher": "問題マッチャーは、ウォッチ対象の開始パターンと終了パターンの両方を定義する必要があります。", "ProblemMatcherParser.invalidRegexp": "エラー: 文字列 {0} は、有効な正規表現ではありません。\n", - "WatchingPatternSchema.regexp": "ウォッチ中タスクの開始または終了を検出する正規表現。", "WatchingPatternSchema.file": "ファイル名の一致グループ インデックス。省略できます。", "PatternTypeSchema.name": "提供されたか事前定義された問題パターンの名前", "PatternTypeSchema.description": "A problem pattern or the name of a contributed or predefined problem pattern. Can be omitted if base is specified.", @@ -46,7 +45,6 @@ "ProblemMatcherSchema.watching.activeOnStart": "true に設定すると、タスクの開始時にウォッチャーがアクティブ モードになります。これは beginPattern と一致する行の発行と同等です。", "ProblemMatcherSchema.watching.beginsPattern": "出力内で一致すると、ウォッチ中のタスクの開始が通知されます。", "ProblemMatcherSchema.watching.endsPattern": "出力内で一致すると、ウォッチ中のタスクの終了が通知されます。", - "ProblemMatcherSchema.watching": "監視パターンの開始と終了を追跡するパターン。", "LegacyProblemMatcherSchema.watchedBegin.deprecated": "This property is deprecated. Use the watching property instead.", "LegacyProblemMatcherSchema.watchedBegin": "ファイル ウォッチでトリガーされた ウォッチ対象タスクの実行が開始されたことを伝達する正規表現。", "LegacyProblemMatcherSchema.watchedEnd.deprecated": "This property is deprecated. Use the watching property instead.", diff --git a/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json index 750764aa27a..8da89f6115c 100644 --- a/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -36,11 +36,13 @@ "dropdownForeground": "ドロップダウンの前景。", "dropdownBorder": "ドロップダウンの境界線。", "listFocusBackground": "ツリーリストがアクティブのとき、フォーカスされた項目のツリーリスト背景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", + "listFocusForeground": "ツリーリストがアクティブのとき、フォーカスされた項目のツリーリスト前景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", "listActiveSelectionBackground": "ツリーリストがアクティブのとき、選択された項目のツリーリスト背景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", "listActiveSelectionForeground": "ツリーリストがアクティブのとき、選択された項目のツリーリスト前景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", "listInactiveSelectionBackground": "ツリーリストが非アクティブのとき、フォーカスされた項目のツリーリスト背景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", "listInactiveSelectionForeground": "ツリーリストが非アクティブのとき、選択された項目のツリーリスト前景色。アクティブなツリーリストはキーボード フォーカスがあり、非アクティブではこれがありません。", "listHoverBackground": "マウス操作で項目をホバーするときのツリーリスト背景。", + "listHoverForeground": "マウス操作で項目をホバーするときのツリーリスト前景。", "listDropBackground": "マウス操作で項目を移動するときのツリーリスト ドラッグ アンド ドロップの背景。", "highlight": "ツリーリスト内を検索しているとき、一致した強調のツリーリスト前景色。", "pickerGroupForeground": "ラベルをグループ化するためのクリック選択の色。", @@ -67,5 +69,9 @@ "hoverHighlight": "ホバーが表示されているワードの下を強調表示します。", "hoverBackground": "エディター ホバーの背景色。", "hoverBorder": "エディター ホバーの境界線の色。", - "activeLinkForeground": "アクティブなリンクの色。" + "activeLinkForeground": "アクティブなリンクの色。", + "diffEditorInserted": "挿入されたテキストの背景色。", + "diffEditorRemoved": "削除されたテキストの背景色。", + "diffEditorInsertedOutline": "挿入されたテキストの輪郭の色。", + "diffEditorRemovedOutline": "削除されたテキストの輪郭の色。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/jpn/src/vs/workbench/api/node/extHostTreeViews.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/electron-browser/shell.i18n.json b/i18n/jpn/src/vs/workbench/electron-browser/shell.i18n.json index 298d1518ca4..7edc0e838e8 100644 --- a/i18n/jpn/src/vs/workbench/electron-browser/shell.i18n.json +++ b/i18n/jpn/src/vs/workbench/electron-browser/shell.i18n.json @@ -4,9 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "runningAsRoot": "コードを 'root ' として実行しないことをお勧めします。", - "prof.message": "プロファイルが正常に作成されました。", - "prof.detail": "案件を作成し、手動で次のファイルを添付してください:\n{0}", - "prof.restartAndFileIssue": "案件を作成し再起動する", - "prof.restart": "再起動" + "runningAsRoot": "コードを 'root ' として実行しないことをお勧めします。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/electron-browser/window.i18n.json b/i18n/jpn/src/vs/workbench/electron-browser/window.i18n.json index acff2870cf9..472d053bdf6 100644 --- a/i18n/jpn/src/vs/workbench/electron-browser/window.i18n.json +++ b/i18n/jpn/src/vs/workbench/electron-browser/window.i18n.json @@ -11,7 +11,5 @@ "paste": "貼り付け", "selectAll": "すべて選択", "confirmOpen": "{0} 個のフォルダーを開きますか?", - "confirmOpenButton": "&&開く", - "developer": "Developer", - "file": "ファイル" + "confirmOpenButton": "&&開く" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index d63fe387f50..af68e40b4ae 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,7 +7,6 @@ "debugAdapterBinNotFound": "デバッグ アダプターの実行可能ファイル '{0}' がありません。", "debugAdapterCannotDetermineExecutable": "デバッグ アダプター '{0}' の実行可能ファイルを判別できません。", "debugType": "構成の種類。", - "debugTypeNotRecognised": "デバッグの種類は認識されませんでした。対応するデバッグの拡張機能がインストールされており、有効になっていることを確認してください。", "node2NotSupported": "\"node2\" はサポートされていません。代わりに \"node\" を使用し、\"protocol\" 属性を \"inspector\" に設定してください。", "debugName": "構成の名前。起動構成のドロップダウン メニューに表示されます。", "debugRequest": "構成の要求の種類。\"launch\" または \"attach\" です。", diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json index 8b6ad71cd4e..13eb719a34f 100644 --- a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "balanceInward": "Emmet: バランス (内側)", + "balanceOutward": "Emmet: バランス (外側)" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json index 8b6ad71cd4e..cf9dccd3bbd 100644 --- a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "previousEditPoint": "Emmet: 前の編集点", + "nextEditPoint": "Emmet: 次の編集点" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json index 8b6ad71cd4e..f6a68a59f42 100644 --- a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "evaluateMathExpression": "Emmet: 数式の評価" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json index 8b6ad71cd4e..23680f558e5 100644 --- a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "expandAbbreviationAction": "Emmet: 略語の展開" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json index 8b6ad71cd4e..4c2a1db638c 100644 --- a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -3,4 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "incrementNumberByOneTenth": "Emmet: 0.1 ずつ増加", + "incrementNumberByOne": "Emmet: 1 ずつ増加", + "incrementNumberByTen": "Emmet: 10 ずつ増加", + "decrementNumberByOneTenth": "Emmet: 0.1 ずつ減少", + "decrementNumberByOne": "Emmet: 1 減少", + "decrementNumberByTen": "Emmet: 10 ずつ減少" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json index 8b6ad71cd4e..adcbee4abaf 100644 --- a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "matchingPair": "Emmet: 一致するペアに移動" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json index 8b6ad71cd4e..c834e4b5aaa 100644 --- a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "mergeLines": "Emmet: 行のマージ" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json index 8b6ad71cd4e..ab8fd5a62ba 100644 --- a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "reflectCSSValue": "Emmet: CSS 値の反転" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json index 8b6ad71cd4e..c3bc9dd651f 100644 --- a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "removeTag": "Emmet: タグの削除" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json index 8b6ad71cd4e..350aee6aff9 100644 --- a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "selectPreviousItem": "Emmet: 前の項目の選択", + "selectNextItem": "Emmet: 次の項目の選択" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json index 8b6ad71cd4e..4b1dbd8a454 100644 --- a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "splitJoinTag": "Emmet: タグの分割/結合" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json index 8b6ad71cd4e..942a483bfa3 100644 --- a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "toggleComment": "Emmet: コメントの表示/非表示" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json index 8b6ad71cd4e..ba3773dfcdb 100644 --- a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "updateImageSize": "Emmet: イメージ サイズの更新" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json index 8b6ad71cd4e..873d819f37a 100644 --- a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "updateTag": "Emmet: タグの更新", + "enterTag": "タグの入力", + "tag": "タグ" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json index 8b6ad71cd4e..3f72714a048 100644 --- a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "wrapWithAbbreviationAction": "Emmet: 省略形でラップ", + "enterAbbreviation": "省略形の入力", + "abbreviation": "省略形" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json index 8b6ad71cd4e..f8b16e8c78d 100644 --- a/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -3,4 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "emmetConfigurationTitle": "Emmet", + "triggerExpansionOnTab": "これをオンにすると、TAB キーを押したときに emmet 省略記法が展開されます.", + "emmetPreferences": "Emmet の一部のアクションやリゾルバーの動作の変更に使用される基本設定。", + "emmetSyntaxProfiles": "指定した構文に対してプロファイルを定義するか、特定の規則がある独自のプロファイルをご使用ください。", + "emmetExclude": "emmet 省略記法を展開すべきでない言語の配列。", + "emmetExtensionsPath": "Emmet のプロファイル、スニペット、基本設定を含むフォルダーへのパス" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json index eb8ef6b8069..37bbf2ce2e0 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}、タスク", "tasksAriaLabel": "再開するタスクの名前を入力します", "noTasksMatching": "No tasks matching", "noTasksFound": "再開するタスクはありません" diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json index 17dcb80868e..99543dd018a 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}, tasks", "tasksAriaLabel": "実行するタスクの名前を入力します", "noTasksMatching": "No tasks matching", "noTasksFound": "タスクが見つかりません" diff --git a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 997a9ed0f2c..587eecb5f9d 100644 --- a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -13,25 +13,16 @@ "welcomePage.recent": "最近", "welcomePage.noRecentFolders": "最近使用したフォルダーなし", "welcomePage.help": "ヘルプ", - "welcomePage.productDocumentation": "製品ドキュメント", "welcomePage.introductoryVideos": "紹介ビデオ", - "welcomePage.keybindingsReference": "キーボード ショートカットの参照資料", + "welcomePage.productDocumentation": "製品ドキュメント", "welcomePage.gitHubRepository": "GitHub リポジトリ", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "起動時にウェルカム ページを表示", + "welcomePage.customize": "カスタマイズする", "welcomePage.installKeymapDescription": "キーボード ショートカットをインストールします", - "welcomePage.installKeymap": "{0}、{1}、{2}、{3} のキーボード ショートカットをインストール", - "welcomePage.vim": "Vim", - "welcomePage.vimCurrent": "Vim (最新)", - "welcomePage.sublime": "Sublime", - "welcomePage.sublimeCurrent": "Sublime (最新)", - "welcomePage.atom": "Atom", - "welcomePage.atomCurrent": "Atom (最新)", "welcomePage.others": "その他", "welcomePage.colorTheme": "配色テーマ", "welcomePage.colorThemeDescription": "エディターとコードの外観を自由に設定します", - "welcomePage.configureSettings": "設定を構成する", - "welcomePage.configureSettingsDescription": "VS Code の全機能を活用するために設定を微調整します", "welcomePage.showCommands": "すべてのコマンドの検索と実行", "welcomePage.showCommandsDescription": "コントロール パネルからコマンドを検索してすばやくアクセスします ({0})", "welcomePage.interfaceOverview": "インターフェイスの概要", @@ -39,5 +30,8 @@ "welcomePage.interactivePlayground": "対話型プレイグラウンド", "welcomePage.interactivePlaygroundDescription": "エディターの基本機能を簡潔なチュートリアルで体験します", "welcomePage.quickLinks": "クイック リンク", - "welcomePage.keybindingsReferenceDescription": "最も一般的なキーボード ショートカットを掲載した印刷可能な PDF です" + "welcomePage.keybindingsReference": "キーボード ショートカットの参照資料", + "welcomePage.keybindingsReferenceDescription": "最も一般的なキーボード ショートカットを掲載した印刷可能な PDF です", + "welcomePage.configureSettings": "設定を構成する", + "welcomePage.configureSettingsDescription": "VS Code の全機能を活用するために設定を微調整します" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index e669bacef12..07b2eb85861 100644 --- a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,11 +5,11 @@ // Do not edit this file. It is machine generated. { "welcomePage": "ようこそ", - "welcome.title": "ようこそ", "welcomePage.keymapAlreadyInstalled": "キーボード ショートカット {0} は既にインストールされています。", "welcomePage.willReloadAfterInstallingKeymap": "キーボード ショートカット {0} をインストールした後、ウィンドウが再度読み込まれます。", - "ok": "OK", "welcomePage.installingKeymap": "{0} のキーボード ショートカットをインストールしています...", "welcomePage.keymapNotFound": "ID {1} のキーボード ショートカット {0} は見つかりませんでした。", + "welcome.title": "ようこそ", + "ok": "OK", "cancel": "キャンセル" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json b/i18n/jpn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json index 0a5b15ce4a4..f2d0c06274d 100644 --- a/i18n/jpn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json @@ -5,5 +5,6 @@ // Do not edit this file. It is machine generated. { "walkThrough.unboundCommand": "バインドなし", - "walkThrough.gitNotFound": "システムに Git がインストールされていない可能性があります。" + "walkThrough.gitNotFound": "システムに Git がインストールされていない可能性があります。", + "walkThrough.embeddedEditorBackground": "対話型プレイグラウンドの埋め込みエディターの背景色。" } \ No newline at end of file diff --git a/i18n/kor/extensions/jake/out/main.i18n.json b/i18n/kor/extensions/jake/out/main.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/extensions/jake/out/main.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/extensions/jake/package.i18n.json b/i18n/kor/extensions/jake/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/extensions/jake/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/extensions/typescript/out/utils/logger.i18n.json b/i18n/kor/extensions/typescript/out/utils/logger.i18n.json index 8b6ad71cd4e..bc738f43d0c 100644 --- a/i18n/kor/extensions/typescript/out/utils/logger.i18n.json +++ b/i18n/kor/extensions/typescript/out/utils/logger.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/kor/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 35c92b65eea..8f85109ab67 100644 --- a/i18n/kor/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/kor/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,6 +9,7 @@ "editorSuggestWidgetForeground": "제안 위젯의 전경색입니다.", "editorSuggestWidgetSelectedBackground": "제한 위젯에서 선택된 항목의 배경색입니다.", "editorSuggestWidgetHighlightForeground": "제안 위젯의 일치 항목 강조 표시 색입니다.", + "readMore": "자세히 알아보기...{0}", "suggestionWithDetailsAriaLabel": "{0}, 제안, 세부 정보 있음", "suggestionAriaLabel": "{0}, 제안", "suggestWidget.loading": "로드 중...", diff --git a/i18n/kor/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/kor/src/vs/platform/markers/common/problemMatcher.i18n.json index e2cb0557fbc..ff679b577b2 100644 --- a/i18n/kor/src/vs/platform/markers/common/problemMatcher.i18n.json +++ b/i18n/kor/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -34,7 +34,6 @@ "ProblemMatcherParser.noValidIdentifier": "오류: 패턴 속성 {0}이(가) 유효한 패턴 변수 이름이 아닙니다.", "ProblemMatcherParser.problemPattern.watchingMatcher": "문제 검사기에서 감시 시작 패턴과 종료 패턴을 모두 정의해야 합니다.", "ProblemMatcherParser.invalidRegexp": "오류: {0} 문자열은 유효한 정규식이 아닙니다.\n", - "WatchingPatternSchema.regexp": "조사 작업의 시작 또는 끝을 검색하는 정규식입니다.", "WatchingPatternSchema.file": "파일 이름의 일치 그룹 인덱스이며 생략할 수 있습니다.", "PatternTypeSchema.name": "제공되거나 미리 정의된 패턴의 이름", "PatternTypeSchema.description": "문제 패턴 또는 제공되거나 미리 정의된 문제 패턴의 이름입니다. 기본이 지정된 경우 생략할 수 있습니다.", @@ -46,7 +45,6 @@ "ProblemMatcherSchema.watching.activeOnStart": "true로 설정한 경우 작업이 시작되면 선택기가 활성 모드로 전환됩니다. 이는 beginPattern과 일치하는 줄을 실행하는 것과 같습니다.", "ProblemMatcherSchema.watching.beginsPattern": "출력이 일치하는 경우 조사 작업을 시작할 때 신호를 받습니다.", "ProblemMatcherSchema.watching.endsPattern": "출력이 일치하는 경우 조사 작업을 끝날 때 신호를 받습니다.", - "ProblemMatcherSchema.watching": "감시 패턴의 시작과 끝을 추적하는 패턴입니다.", "LegacyProblemMatcherSchema.watchedBegin.deprecated": "이 속성은 사용되지 않습니다. 대신 감시 속성을 사용하세요.", "LegacyProblemMatcherSchema.watchedBegin": "파일 감시를 통해 트리거되는 감시되는 작업이 시작됨을 나타내는 정규식입니다.", "LegacyProblemMatcherSchema.watchedEnd.deprecated": "이 속성은 사용되지 않습니다. 대신 감시 속성을 사용하세요.", diff --git a/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json index d5555899eba..4ff5446bc03 100644 --- a/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/kor/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -52,5 +52,9 @@ "hoverHighlight": "호버가 표시된 단어 아래를 강조 표시합니다.", "hoverBackground": "편집기 호버의 배경색.", "hoverBorder": "편집기 호버의 테두리 색입니다.", - "activeLinkForeground": "활성 링크의 색입니다." + "activeLinkForeground": "활성 링크의 색입니다.", + "diffEditorInserted": "삽입된 텍스트의 배경색입니다.", + "diffEditorRemoved": "제거된 텍스트의 배경색입니다.", + "diffEditorInsertedOutline": "삽입된 텍스트의 윤곽선 색입니다.", + "diffEditorRemovedOutline": "제거된 텍스트의 윤곽선 색입니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/kor/src/vs/workbench/api/node/extHostTreeViews.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/electron-browser/shell.i18n.json b/i18n/kor/src/vs/workbench/electron-browser/shell.i18n.json index 1233e0b9ff8..79ac1b1fdaa 100644 --- a/i18n/kor/src/vs/workbench/electron-browser/shell.i18n.json +++ b/i18n/kor/src/vs/workbench/electron-browser/shell.i18n.json @@ -4,9 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "runningAsRoot": "Code를 '루트'로 실행하지 않는 것이 좋습니다.", - "prof.message": "프로필을 만들었습니다.", - "prof.detail": "문제를 발생시키고 다음 파일을 수동으로 첨부하세요.\n{0}", - "prof.restartAndFileIssue": "문제 만들기 및 다시 시작", - "prof.restart": "다시 시작" + "runningAsRoot": "Code를 '루트'로 실행하지 않는 것이 좋습니다." } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/electron-browser/window.i18n.json b/i18n/kor/src/vs/workbench/electron-browser/window.i18n.json index 05bb1370294..a185383bf4c 100644 --- a/i18n/kor/src/vs/workbench/electron-browser/window.i18n.json +++ b/i18n/kor/src/vs/workbench/electron-browser/window.i18n.json @@ -11,7 +11,5 @@ "paste": "붙여넣기", "selectAll": "모두 선택", "confirmOpen": "{0}개의 폴더를 여시겠습니까?", - "confirmOpenButton": "열기(&&O)", - "developer": "개발자", - "file": "파일" + "confirmOpenButton": "열기(&&O)" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json index 8b6ad71cd4e..82d5698f1e0 100644 --- a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "balanceInward": "Emmet: 균형있게(안쪽으로)", + "balanceOutward": "Emmet: 균형있게(바깥쪽으로)" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json index 8b6ad71cd4e..739aa4ea537 100644 --- a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "previousEditPoint": "Emmet: 이전 편집 점", + "nextEditPoint": "Emmet: 다음 편집 점" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json index 8b6ad71cd4e..5323baf8c08 100644 --- a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "evaluateMathExpression": "Emmet: 수학 식 평가" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json index 8b6ad71cd4e..15be0c84d97 100644 --- a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "expandAbbreviationAction": "Emmet: 약어 확장" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json index 8b6ad71cd4e..2255914bed5 100644 --- a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -3,4 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "incrementNumberByOneTenth": "Emmet: 0.1 증가", + "incrementNumberByOne": "Emmet: 1 증가", + "incrementNumberByTen": "Emmet: 10 증가", + "decrementNumberByOneTenth": "Emmet: 0.1 감소", + "decrementNumberByOne": "Emmet: 1 감소", + "decrementNumberByTen": "Emmet: 10 감소" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json index 8b6ad71cd4e..83a77e69884 100644 --- a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "matchingPair": "Emmet: 일치하는 쌍으로 이동" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json index 8b6ad71cd4e..161537077b5 100644 --- a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "mergeLines": "Emmet: 줄 병합" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json index 8b6ad71cd4e..9de599d6dbe 100644 --- a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "reflectCSSValue": "Emmet: CSS 값 반영" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json index 8b6ad71cd4e..d694fdaa5d8 100644 --- a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "removeTag": "Emmet: 태그 제거" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json index 8b6ad71cd4e..ce90cf1c917 100644 --- a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "selectPreviousItem": "Emmet: 이전 항목 선택", + "selectNextItem": "Emmet: 다음 항목 선택" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json index 8b6ad71cd4e..d700fca47b3 100644 --- a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "splitJoinTag": "Emmet: 태그 분할/조인" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json index 8b6ad71cd4e..47d9fb34230 100644 --- a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "toggleComment": "Emmet: 주석 설정/해제" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json index 8b6ad71cd4e..4cf87429ced 100644 --- a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "updateImageSize": "Emmet: 이미지 크기 업데이트" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json index 8b6ad71cd4e..00369305a07 100644 --- a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "updateTag": "Emmet: 태그 업데이트", + "enterTag": "태그 입력", + "tag": "태그" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json index 8b6ad71cd4e..d86b2ec66c0 100644 --- a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "wrapWithAbbreviationAction": "Emmet: 약어로 래핑", + "enterAbbreviation": "약어 입력", + "abbreviation": "약어" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json index 8b6ad71cd4e..b4ba4df288c 100644 --- a/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -3,4 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "emmetConfigurationTitle": "Emmet", + "triggerExpansionOnTab": "사용하도록 설정하면 emmet 약어는 키를 눌렀을 때 확장됩니다.", + "emmetPreferences": "Emmet의 일부 작업 및 해결 프로그램의 동작을 수정하는 데 사용되는 기본 설정입니다.", + "emmetSyntaxProfiles": "지정된 구문에 대한 프로필을 정의하거나 특정 규칙이 포함된 고유한 프로필을 사용하세요.", + "emmetExclude": "Emmet 약어를 확장하면 안 되는 언어의 배열입니다.", + "emmetExtensionsPath": "Emmet 프로필, 코드 조각 및 기본 설정이 포함된 폴더의 경로" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json b/i18n/kor/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json index 61ec0a4e8b1..0417fe610ad 100644 --- a/i18n/kor/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}, 작업", "tasksAriaLabel": "다시 시작할 작업 이름 입력", "noTasksMatching": "일치하는 작업 없음", "noTasksFound": "다시 시작할 작업이 없습니다." diff --git a/i18n/kor/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json b/i18n/kor/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json index 63feb95524e..e3f31c9106d 100644 --- a/i18n/kor/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}, 작업", "tasksAriaLabel": "실행할 작업의 이름 입력", "noTasksMatching": "일치하는 작업 없음", "noTasksFound": "작업을 찾을 수 없음" diff --git a/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 8cb064b9a49..3b4766bb5d9 100644 --- a/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -13,25 +13,16 @@ "welcomePage.recent": "최근 항목", "welcomePage.noRecentFolders": "최근 폴더 없음", "welcomePage.help": "도움말", - "welcomePage.productDocumentation": "제품 설명서", "welcomePage.introductoryVideos": "소개 비디오", - "welcomePage.keybindingsReference": "바로 가기 키 참조", + "welcomePage.productDocumentation": "제품 설명서", "welcomePage.gitHubRepository": "GitHub 리포지토리", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "시작 시 시작 페이지 표시", + "welcomePage.customize": "사용자 지정", "welcomePage.installKeymapDescription": "바로 가기 키 설치", - "welcomePage.installKeymap": "{0}, {1}, {2} 및 {3}의 바로 가기 키 설치", - "welcomePage.vim": "Vim", - "welcomePage.vimCurrent": "Vim(현재)", - "welcomePage.sublime": "Sublime", - "welcomePage.sublimeCurrent": "Sublime(현재)", - "welcomePage.atom": "Atom", - "welcomePage.atomCurrent": "Atom(현재)", "welcomePage.others": "기타", "welcomePage.colorTheme": "색 테마", "welcomePage.colorThemeDescription": "편집기 및 코드가 좋아하는 방식으로 표시되게 만들기", - "welcomePage.configureSettings": "설정 구성", - "welcomePage.configureSettingsDescription": "설정을 조정하여 VS Code 의 전체 기능 잠금 해제", "welcomePage.showCommands": "모든 명령 찾기 및 실행", "welcomePage.showCommandsDescription": "제어판에서 명령을 빠르게 검색 및 액세스({0})", "welcomePage.interfaceOverview": "인터페이스 개요", @@ -39,5 +30,8 @@ "welcomePage.interactivePlayground": "대화형 실습", "welcomePage.interactivePlaygroundDescription": "짧은 연습에서 기본 편집기 기능 사용해 보기", "welcomePage.quickLinks": "빠른 링크", - "welcomePage.keybindingsReferenceDescription": "가장 일반적인 바로 가기 키가 포함된 인쇄 가능한 PDF" + "welcomePage.keybindingsReference": "바로 가기 키 참조", + "welcomePage.keybindingsReferenceDescription": "가장 일반적인 바로 가기 키가 포함된 인쇄 가능한 PDF", + "welcomePage.configureSettings": "설정 구성", + "welcomePage.configureSettingsDescription": "설정을 조정하여 VS Code 의 전체 기능 잠금 해제" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index f4fb40d0799..cb5666d331a 100644 --- a/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,11 +5,11 @@ // Do not edit this file. It is machine generated. { "welcomePage": "시작", - "welcome.title": "시작", "welcomePage.keymapAlreadyInstalled": "{0} 바로 가기 키가 이미 설치되어 있습니다.", "welcomePage.willReloadAfterInstallingKeymap": "{0} 바로 가기 키를 설치한 후 창이 다시 로드됩니다.", - "ok": "확인", "welcomePage.installingKeymap": "{0} 바로 가기 키를 설치하는 중...", "welcomePage.keymapNotFound": "ID가 {1}인 {0} 바로 가기 키를 찾을 수 없습니다.", + "welcome.title": "시작", + "ok": "확인", "cancel": "취소" } \ No newline at end of file diff --git a/i18n/rus/extensions/jake/out/main.i18n.json b/i18n/rus/extensions/jake/out/main.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/extensions/jake/out/main.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/extensions/jake/package.i18n.json b/i18n/rus/extensions/jake/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/extensions/jake/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/extensions/typescript/out/utils/logger.i18n.json b/i18n/rus/extensions/typescript/out/utils/logger.i18n.json index 8b6ad71cd4e..bc738f43d0c 100644 --- a/i18n/rus/extensions/typescript/out/utils/logger.i18n.json +++ b/i18n/rus/extensions/typescript/out/utils/logger.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/rus/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 9f09465ad47..83631e142ec 100644 --- a/i18n/rus/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/rus/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,6 +9,7 @@ "editorSuggestWidgetForeground": "Цвет переднего плана мини-приложения предложений.", "editorSuggestWidgetSelectedBackground": "Фоновый цвет выбранной записи в мини-приложении предложений.", "editorSuggestWidgetHighlightForeground": "Цвет выделения соответствия в мини-приложении предложений.", + "readMore": "Подробнее...{0}", "suggestionWithDetailsAriaLabel": "{0}, предложение, содержит данные", "suggestionAriaLabel": "{0}, предложение", "suggestWidget.loading": "Идет загрузка...", diff --git a/i18n/rus/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/rus/src/vs/platform/markers/common/problemMatcher.i18n.json index 3d34238d89c..2595229d2aa 100644 --- a/i18n/rus/src/vs/platform/markers/common/problemMatcher.i18n.json +++ b/i18n/rus/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -34,7 +34,6 @@ "ProblemMatcherParser.noValidIdentifier": "Ошибка: свойство шаблона {0} не является допустимым именем переменной шаблона.", "ProblemMatcherParser.problemPattern.watchingMatcher": "В сопоставителе проблем должны быть определены как начальный, так и конечный шаблоны для отслеживания.", "ProblemMatcherParser.invalidRegexp": "Ошибка: строка {0} не является допустимым регулярным выражением.\n", - "WatchingPatternSchema.regexp": "Регулярное выражение для обнаружения начала или конца задачи наблюдения.", "WatchingPatternSchema.file": "Индекс группы сопоставления для имени файла. Может быть опущен.", "PatternTypeSchema.name": "Имя добавленного или предопределенного шаблона", "PatternTypeSchema.description": "Шаблон проблем либо имя добавленного или предопределенного шаблона проблем. Его можно опустить, если указано базовое значение.", @@ -46,7 +45,6 @@ "ProblemMatcherSchema.watching.activeOnStart": "Если задано значение true, наблюдатель находится в активном режиме, когда задача запускается. Это равносильно выдаче строки, соответствующей шаблону начала.", "ProblemMatcherSchema.watching.beginsPattern": "При соответствии в выходных данных сообщает о запуске задачи наблюдения.", "ProblemMatcherSchema.watching.endsPattern": "При соответствии в выходных данных сообщает о завершении задачи наблюдения.", - "ProblemMatcherSchema.watching": "Шаблоны для отслеживания начала и окончания шаблона просмотра.", "LegacyProblemMatcherSchema.watchedBegin.deprecated": "Это свойство устарело. Используйте свойство просмотра.", "LegacyProblemMatcherSchema.watchedBegin": "Регулярное выражение, сообщающее о том, что отслеживаемая задача начинает выполняться в результате активации отслеживания файлов.", "LegacyProblemMatcherSchema.watchedEnd.deprecated": "Это свойство устарело. Используйте свойство просмотра.", diff --git a/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json index 9ce2d835836..6d4a756ac40 100644 --- a/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/rus/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -8,15 +8,24 @@ "schema.colors": "Цвета, используемые на рабочем месте.", "foreground": "Общий цвет переднего плана. Этот цвет используется, только если его не переопределит компонент.", "errorForeground": "Общий цвет переднего плана для сообщений об ошибках. Этот цвет используется только если его не переопределяет компонент.", + "descriptionForeground": "Цвет текста элемента, содержащего пояснения, например, для метки.", "focusBorder": "Общий цвет границ для элементов с фокусом. Этот цвет используется только в том случае, если не переопределен в компоненте.", "contrastBorder": "Дополнительная граница вокруг элементов, которая отделяет их от других элементов для улучшения контраста.", "activeContrastBorder": "Дополнительная граница вокруг активных элементов, которая отделяет их от других элементов для улучшения контраста.", + "selectionBackground": "Цвет фона выделенного текста в элементах пользовательского интерфейса (например, в поле для ввода значений или текстовом поле). Не применяется к области редактора и терминала.", "textSeparatorForeground": "Цвет для разделителей текста.", + "textLinkForeground": "Цвет переднего плана для ссылок в тексте.", + "textLinkActiveForeground": "Цвет переднего фона для активных ссылок в тексте.", + "textPreformatForeground": "Цвет текста фиксированного формата.", + "textBlockQuoteBackground": "Цвет фона для блоков с цитатами в тексте.", + "textBlockQuoteBorder": "Цвет границ для блоков с цитатами в тексте.", + "textCodeBlockBackground": "Цвет фона для программного кода в тексте.", "widgetShadow": "Цвет тени мини-приложений редактора, таких как \"Найти/заменить\".", "inputBoxBackground": "Фон поля ввода.", "inputBoxForeground": "Передний план поля ввода.", "inputBoxBorder": "Граница поля ввода.", "inputBoxActiveOptionBorder": "Цвет границ активированных параметров в полях ввода.", + "inputPlaceholderForeground": "Цвет фона поясняющего текста в элементе ввода.", "inputValidationInfoBackground": "Фоновый цвет проверки ввода для уровня серьезности \"Сведения\".", "inputValidationInfoBorder": "Цвет границы проверки ввода для уровня серьезности \"Сведения\".", "inputValidationWarningBackground": "Фоновый цвет проверки ввода для уровня серьезности \"Предупреждение\".", @@ -30,6 +39,7 @@ "listActiveSelectionBackground": "Фоновый цвет выбранного элемента List/Tree, когда элемент List/Tree активен. На активном элементе List/Tree есть фокус клавиатуры, на неактивном — нет.", "listActiveSelectionForeground": "Цвет переднего плана выбранного элемента List/Tree, когда элемент List/Tree активен. На активном элементе List/Tree есть фокус клавиатуры, на неактивном — нет.", "listInactiveSelectionBackground": "Фоновый цвет выбранного элемента List/Tree, когда элемент List/Tree неактивен. На активном элементе List/Tree есть фокус клавиатуры, на неактивном — нет.", + "listInactiveSelectionForeground": "Цвет текста выбранного элемента List/Tree, когда элемент List/Tree неактивен. На активном элементе List/Tree есть фокус клавиатуры, на неактивном — нет.", "listHoverBackground": "Фоновый цвет элементов List/Tree при наведении курсора мыши.", "listDropBackground": "Фоновый цвет элементов List/Tree при перемещении с помощью мыши.", "highlight": "Цвет переднего плана для выделения соответствия при поиске по элементу List/Tree.", @@ -38,6 +48,8 @@ "buttonForeground": "Цвет переднего плана кнопки.", "buttonBackground": "Цвет фона кнопки.", "buttonHoverBackground": "Цвет фона кнопки при наведении.", + "badgeBackground": "Цвет фона бэджа. Бэджи - небольшие информационные элементы, отображающие количество, например, результатов поиска.", + "badgeForeground": "Цвет текста бэджа. Бэджи - небольшие информационные элементы, отображающие количество, например, результатов поиска.", "scrollbarShadow": "Цвет тени полосы прокрутки, которая свидетельствует о том, что содержимое прокручивается.", "scrollbarSliderBackground": "Цвет фона ползунка.", "scrollbarSliderHoverBackground": "Цвет фона ползунка при наведении.", @@ -54,5 +66,9 @@ "hoverHighlight": "Выделение под словом, для которого показано наведение.", "hoverBackground": "Цвет фона при наведении указателя на редактор.", "hoverBorder": "Цвет границ при наведении указателя на редактор.", - "activeLinkForeground": "Цвет активных ссылок." + "activeLinkForeground": "Цвет активных ссылок.", + "diffEditorInserted": "Цвет фона для добавленных строк.", + "diffEditorRemoved": "Цвет фона для удаленных строк.", + "diffEditorInsertedOutline": "Цвет контура для добавленных строк.", + "diffEditorRemovedOutline": "Цвет контура для удаленных строк." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/rus/src/vs/workbench/api/node/extHostTreeViews.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/electron-browser/shell.i18n.json b/i18n/rus/src/vs/workbench/electron-browser/shell.i18n.json index b2ec5a62b60..39183187ef0 100644 --- a/i18n/rus/src/vs/workbench/electron-browser/shell.i18n.json +++ b/i18n/rus/src/vs/workbench/electron-browser/shell.i18n.json @@ -4,9 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "runningAsRoot": "Не рекомендуется запускать код с правами администратора.", - "prof.message": "Профили успешно созданы.", - "prof.detail": "Создайте проблему и вручную вложите следующие файлы:\n{0}", - "prof.restartAndFileIssue": "Создать проблему и выполнить перезапуск", - "prof.restart": "Перезапустить" + "runningAsRoot": "Не рекомендуется запускать код с правами администратора." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/electron-browser/window.i18n.json b/i18n/rus/src/vs/workbench/electron-browser/window.i18n.json index 46ef3c781f0..fb864141a42 100644 --- a/i18n/rus/src/vs/workbench/electron-browser/window.i18n.json +++ b/i18n/rus/src/vs/workbench/electron-browser/window.i18n.json @@ -11,7 +11,5 @@ "paste": "Вставить", "selectAll": "Выбрать все", "confirmOpen": "Действительно открыть папки ({0})?", - "confirmOpenButton": "&&Открыть...", - "developer": "Разработчик", - "file": "Файл" + "confirmOpenButton": "&&Открыть..." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json index 8b6ad71cd4e..6f2d64eeffb 100644 --- a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "balanceInward": "Emmet: баланс (входящий)", + "balanceOutward": "Emmet: баланс (исходящий)" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json index 8b6ad71cd4e..4a07fdffeba 100644 --- a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "previousEditPoint": "Emmet: предыдущая точка изменения", + "nextEditPoint": "Emmet: следующая точка изменения" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json index 8b6ad71cd4e..24098651eac 100644 --- a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "evaluateMathExpression": "Emmet: вычисление математического выражения" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json index 8b6ad71cd4e..982ec325649 100644 --- a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "expandAbbreviationAction": "Emmet: расшифровать аббревиатуру" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json index 8b6ad71cd4e..1befe3f2264 100644 --- a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -3,4 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "incrementNumberByOneTenth": "Emmet: увеличение значения на 0,1", + "incrementNumberByOne": "Emmet: увеличение значения на 1", + "incrementNumberByTen": "Emmet: увеличение значения на 10", + "decrementNumberByOneTenth": "Emmet: уменьшение значения на 0,1", + "decrementNumberByOne": "Emmet: уменьшение значения на 1", + "decrementNumberByTen": "Emmet: уменьшение значения на 10" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json index 8b6ad71cd4e..526b5d5303f 100644 --- a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "matchingPair": "Emmet: перейти к соответствующей паре" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json index 8b6ad71cd4e..81f00b3edbc 100644 --- a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "mergeLines": "Emmet: объединение строк" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json index 8b6ad71cd4e..4673022a248 100644 --- a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "reflectCSSValue": "Emmet: отражение значения CSS" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json index 8b6ad71cd4e..99b383ac902 100644 --- a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "removeTag": "Emmet: удаление тега" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json index 8b6ad71cd4e..50ca8bd70b7 100644 --- a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "selectPreviousItem": "Emmet: выбор предыдущего элемента", + "selectNextItem": "Emmet: выбор следующего элемента" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json index 8b6ad71cd4e..b2b30614cea 100644 --- a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "splitJoinTag": "Emmet: разделение и объединение тегов" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json index 8b6ad71cd4e..0bb940b0c93 100644 --- a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "toggleComment": "Emmet: переключение комментариев" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json index 8b6ad71cd4e..8c273b41250 100644 --- a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "updateImageSize": "Emmet: изменение размера изображения" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json index 8b6ad71cd4e..3c3bd54c27a 100644 --- a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "updateTag": "Emmet: изменение тега", + "enterTag": "Ввод тега", + "tag": "Тег" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json index 8b6ad71cd4e..f493f727ad3 100644 --- a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "wrapWithAbbreviationAction": "Emmet: перенос с сокращением", + "enterAbbreviation": "Ввод сокращения", + "abbreviation": "Сокращение" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json index 8b6ad71cd4e..b632b35fef6 100644 --- a/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -3,4 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "emmetConfigurationTitle": "Emmet", + "triggerExpansionOnTab": "Если включено, сокращения Emmet разворачиваются при нажатии клавиши TAB.", + "emmetPreferences": "Настройки, которые используются для изменения поведения некоторых действий и сопоставителей Emmet.", + "emmetSyntaxProfiles": "Задайте профиль для указанного синтаксиса или используйте свой собственный профиль с определенными правилами.", + "emmetExclude": "Массив языков, в которых не должны развертываться сокращения Emmet.", + "emmetExtensionsPath": "Путь к папке, содержащей профили Emmet, фрагменты кода и настройки" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json b/i18n/rus/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json index 6e9f10d466a..b24656f0f48 100644 --- a/i18n/rus/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}, задачи", "tasksAriaLabel": "Введите имя задачи для перезапуска", "noTasksMatching": "Нет соответствующих задач", "noTasksFound": "Задачи для перезапуска не найдены" diff --git a/i18n/rus/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json b/i18n/rus/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json index 3b76f56cac0..d68fa91047a 100644 --- a/i18n/rus/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}, задачи", "tasksAriaLabel": "Введите имя задачи, которую нужно выполнить", "noTasksMatching": "Нет соответствующих задач", "noTasksFound": "Задачи не найдены" diff --git a/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 19a58cb1728..9cf8071dbbf 100644 --- a/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -13,25 +13,16 @@ "welcomePage.recent": "Последние", "welcomePage.noRecentFolders": "Нет последних папок.", "welcomePage.help": "Справка", - "welcomePage.productDocumentation": "Документация по продукту", "welcomePage.introductoryVideos": "Вступительные видео", - "welcomePage.keybindingsReference": "Справочник по сочетаниям клавиш", + "welcomePage.productDocumentation": "Документация по продукту", "welcomePage.gitHubRepository": "Репозиторий GitHub", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "Отображать страницу приветствия при запуске", + "welcomePage.customize": "Настроить", "welcomePage.installKeymapDescription": "Установка сочетаний клавиш", - "welcomePage.installKeymap": "Установите сочетания клавиш {0}, {1}, {2} и {3}.", - "welcomePage.vim": "Vim", - "welcomePage.vimCurrent": "Vim (текущий)", - "welcomePage.sublime": "Sublime", - "welcomePage.sublimeCurrent": "Sublime (текущий)", - "welcomePage.atom": "Atom", - "welcomePage.atomCurrent": "Atom (текущий)", "welcomePage.others": "Другие", "welcomePage.colorTheme": "Цветовая тема", "welcomePage.colorThemeDescription": "Настройте редактор и код удобным образом.", - "welcomePage.configureSettings": "Настройка параметров", - "welcomePage.configureSettingsDescription": "Используйте все возможности VS Code, подобрав нужные параметры.", "welcomePage.showCommands": "Найти и выполнить все команды.", "welcomePage.showCommandsDescription": "Быстрый доступ и поиск команд на панели управления ({0})", "welcomePage.interfaceOverview": "Общие сведения об интерфейсе", @@ -39,5 +30,8 @@ "welcomePage.interactivePlayground": "Интерактивная площадка", "welcomePage.interactivePlaygroundDescription": "Опробуйте основные функции редактора в ходе краткого пошагового руководства.", "welcomePage.quickLinks": "Быстрые ссылки", - "welcomePage.keybindingsReferenceDescription": "Подготовленный к печати PDF-файл с самыми частыми сочетаниями клавиш" + "welcomePage.keybindingsReference": "Справочник по сочетаниям клавиш", + "welcomePage.keybindingsReferenceDescription": "Подготовленный к печати PDF-файл с самыми частыми сочетаниями клавиш", + "welcomePage.configureSettings": "Настройка параметров", + "welcomePage.configureSettingsDescription": "Используйте все возможности VS Code, подобрав нужные параметры." } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index 16cf088164d..901720ad5dd 100644 --- a/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,11 +5,11 @@ // Do not edit this file. It is machine generated. { "welcomePage": "Добро пожаловать", - "welcome.title": "Добро пожаловать", "welcomePage.keymapAlreadyInstalled": "Сочетания клавиш {0} уже установлены.", "welcomePage.willReloadAfterInstallingKeymap": "Окно перезагрузится после установки сочетаний клавиш {0}.", - "ok": "ОК", "welcomePage.installingKeymap": "Устанавливаются сочетания клавиш {0}...", "welcomePage.keymapNotFound": "Не удалось найти сочетания клавиш {0} с идентификатором {1}.", + "welcome.title": "Добро пожаловать", + "ok": "ОК", "cancel": "Отмена" } \ No newline at end of file From 185886a2d84d3207042764077a4b33dc4dece88d Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sat, 20 May 2017 03:18:46 +0200 Subject: [PATCH 0705/1164] Fix test --- src/vs/editor/contrib/find/test/common/findController.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/find/test/common/findController.test.ts b/src/vs/editor/contrib/find/test/common/findController.test.ts index d6e5591d3c2..edd256ccedb 100644 --- a/src/vs/editor/contrib/find/test/common/findController.test.ts +++ b/src/vs/editor/contrib/find/test/common/findController.test.ts @@ -227,7 +227,7 @@ suite('FindController', () => { let selectHighlightsAction = new SelectHighlightsAction(); editor.setSelection(new Selection(1, 1, 1, 1)); - findController.getState().change({ searchString: 'some+thing', isRegex: true }, false); + findController.getState().change({ searchString: 'some+thing', isRegex: true, isRevealed: true }, false); selectHighlightsAction.run(null, editor); assert.deepEqual(editor.getSelections().map(fromRange), [ From 4ba913058376d23a9641448e5ef56b010d092e46 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 19 May 2017 18:25:36 -0700 Subject: [PATCH 0706/1164] Fix workspace shell settings Fixes #26178 --- .../electron-browser/terminalConfigHelper.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts index 5f4e739354e..236474f7366 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts @@ -141,14 +141,12 @@ export class TerminalConfigHelper implements ITerminalConfigHelper { const message = nls.localize('terminal.integrated.allowWorkspaceShell', "Do you allow {0} (defined as a workspace setting) to be launched in the terminal?", changeString); const options = [nls.localize('allow', "Allow"), nls.localize('disallow', "Disallow")]; this._choiceService.choose(Severity.Info, message, options, 1).then(choice => { - switch (choice) { - case 0: - this._storageService.store(IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, true, StorageScope.WORKSPACE); - case 1: - this._storageService.store(IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, false, StorageScope.WORKSPACE); - default: - return TPromise.as(null); + if (choice === 0) { + this._storageService.store(IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, true, StorageScope.WORKSPACE); + } else { + this._storageService.store(IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, false, StorageScope.WORKSPACE); } + return TPromise.as(null); }); } From 3cbd4a1973c6317eb43eb9cefb99e301d396b1aa Mon Sep 17 00:00:00 2001 From: Young Rok Kim Date: Sat, 20 May 2017 14:24:38 +0900 Subject: [PATCH 0707/1164] Make TMScope inspector togglable (#19675) --- .../electron-browser/inspectTMScopes.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.ts b/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.ts index b0792b493ef..6b424655f7b 100644 --- a/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.ts +++ b/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.ts @@ -89,6 +89,14 @@ class InspectTMScopesController extends Disposable implements IEditorContributio this._widget = null; } } + + public toggle(): void { + if (!this._widget) { + this.launch(); + } else { + this.dispose(); + } + } } @editorAction @@ -106,7 +114,7 @@ class InspectTMScopes extends EditorAction { public run(accessor: ServicesAccessor, editor: ICommonCodeEditor): void { let controller = InspectTMScopesController.get(editor); if (controller) { - controller.launch(); + controller.toggle(); } } } From f459d5b17ea49f1e2fa4ae03eac318d67c37b2a6 Mon Sep 17 00:00:00 2001 From: Young Rok Kim Date: Sat, 20 May 2017 15:15:55 +0900 Subject: [PATCH 0708/1164] Add feature to close TMScope inspector with ESCAPE keyboard event --- .../inspectTMScopes/electron-browser/inspectTMScopes.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.ts b/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.ts index 6b424655f7b..e407188b906 100644 --- a/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.ts +++ b/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.ts @@ -9,6 +9,7 @@ import * as nls from 'vs/nls'; import * as dom from 'vs/base/browser/dom'; import { Disposable } from 'vs/base/common/lifecycle'; import { escape } from 'vs/base/common/strings'; +import { KeyCode } from 'vs/base/common/keyCodes'; import { Position } from 'vs/editor/common/core/position'; import { ICommonCodeEditor, IEditorContribution, IModel } from 'vs/editor/common/editorCommon'; import { editorAction, EditorAction, ServicesAccessor } from 'vs/editor/common/editorCommonExtensions'; @@ -62,6 +63,7 @@ class InspectTMScopesController extends Disposable implements IEditorContributio this._register(this._editor.onDidChangeModel((e) => this.stop())); this._register(this._editor.onDidChangeModelLanguage((e) => this.stop())); + this._register(this._editor.onKeyUp((e) => e.keyCode === KeyCode.Escape && this.stop())); } public getId(): string { @@ -94,7 +96,7 @@ class InspectTMScopesController extends Disposable implements IEditorContributio if (!this._widget) { this.launch(); } else { - this.dispose(); + this.stop(); } } } From f151b3ef1fff3f25b02b4f3416888a4fdb5a3011 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sat, 20 May 2017 10:50:45 +0200 Subject: [PATCH 0709/1164] Fixes #3623: Match whole word does not work for not latin characters --- src/vs/base/common/strings.ts | 2 +- .../common/controller/cursorTypeOperations.ts | 2 +- .../common/controller/cursorWordOperations.ts | 38 +--- .../controller/wordCharacterClassifier.ts | 43 ++++ src/vs/editor/common/editorCommon.ts | 16 +- src/vs/editor/common/model/textModel.ts | 12 +- src/vs/editor/common/model/textModelSearch.ts | 207 +++++++++++++----- .../contrib/find/common/findController.ts | 10 +- .../editor/contrib/find/common/findModel.ts | 12 +- .../wordOperations/common/wordOperations.ts | 3 +- .../test/common/model/textModelSearch.test.ts | 144 +++++++----- src/vs/monaco.d.ts | 16 +- src/vs/platform/search/common/search.ts | 4 + .../parts/search/browser/searchViewlet.ts | 3 +- .../parts/search/common/searchModel.ts | 4 +- .../services/search/node/searchService.ts | 2 +- 16 files changed, 326 insertions(+), 192 deletions(-) create mode 100644 src/vs/editor/common/controller/wordCharacterClassifier.ts diff --git a/src/vs/base/common/strings.ts b/src/vs/base/common/strings.ts index dd078b1f449..83bbdaf61b0 100644 --- a/src/vs/base/common/strings.ts +++ b/src/vs/base/common/strings.ts @@ -202,7 +202,7 @@ export interface RegExpOptions { } export function createRegExp(searchString: string, isRegex: boolean, options: RegExpOptions = {}): RegExp { - if (searchString === '') { + if (!searchString) { throw new Error('Cannot create regex from empty string'); } if (!isRegex) { diff --git a/src/vs/editor/common/controller/cursorTypeOperations.ts b/src/vs/editor/common/controller/cursorTypeOperations.ts index b36938ce5e7..cb2b2184669 100644 --- a/src/vs/editor/common/controller/cursorTypeOperations.ts +++ b/src/vs/editor/common/controller/cursorTypeOperations.ts @@ -16,7 +16,7 @@ import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageCo import { IndentAction } from 'vs/editor/common/modes/languageConfiguration'; import { SurroundSelectionCommand } from 'vs/editor/common/commands/surroundSelectionCommand'; import { IElectricAction } from 'vs/editor/common/modes/supports/electricCharacter'; -import { getMapForWordSeparators, WordCharacterClass } from "vs/editor/common/controller/cursorWordOperations"; +import { getMapForWordSeparators, WordCharacterClass } from "vs/editor/common/controller/wordCharacterClassifier"; export class TypeOperations { diff --git a/src/vs/editor/common/controller/cursorWordOperations.ts b/src/vs/editor/common/controller/cursorWordOperations.ts index d420a29b871..305cfe68392 100644 --- a/src/vs/editor/common/controller/cursorWordOperations.ts +++ b/src/vs/editor/common/controller/cursorWordOperations.ts @@ -6,8 +6,7 @@ import { SingleCursorState, CursorConfiguration, ICursorSimpleModel } from 'vs/editor/common/controller/cursorCommon'; import { Position } from 'vs/editor/common/core/position'; -import { CharCode } from 'vs/base/common/charCode'; -import { CharacterClassifier } from 'vs/editor/common/core/characterClassifier'; +import { WordCharacterClassifier, WordCharacterClass, getMapForWordSeparators } from "vs/editor/common/controller/wordCharacterClassifier"; import * as strings from 'vs/base/common/strings'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; @@ -33,46 +32,11 @@ const enum WordType { Separator = 2 } -export const enum WordCharacterClass { - Regular = 0, - Whitespace = 1, - WordSeparator = 2 -} - export const enum WordNavigationType { WordStart = 0, WordEnd = 1 } -export class WordCharacterClassifier extends CharacterClassifier { - - constructor(wordSeparators: string) { - super(WordCharacterClass.Regular); - - for (let i = 0, len = wordSeparators.length; i < len; i++) { - this.set(wordSeparators.charCodeAt(i), WordCharacterClass.WordSeparator); - } - - this.set(CharCode.Space, WordCharacterClass.Whitespace); - this.set(CharCode.Tab, WordCharacterClass.Whitespace); - } - -} - -function once(computeFn: (input: string) => R): (input: string) => R { - let cache: { [key: string]: R; } = {}; // TODO@Alex unbounded cache - return (input: string): R => { - if (!cache.hasOwnProperty(input)) { - cache[input] = computeFn(input); - } - return cache[input]; - }; -} - -export const getMapForWordSeparators = once( - (input) => new WordCharacterClassifier(input) -); - export class WordOperations { private static _createWord(lineContent: string, wordType: WordType, start: number, end: number): IFindWordResult { diff --git a/src/vs/editor/common/controller/wordCharacterClassifier.ts b/src/vs/editor/common/controller/wordCharacterClassifier.ts new file mode 100644 index 00000000000..c8399717727 --- /dev/null +++ b/src/vs/editor/common/controller/wordCharacterClassifier.ts @@ -0,0 +1,43 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { CharCode } from 'vs/base/common/charCode'; +import { CharacterClassifier } from 'vs/editor/common/core/characterClassifier'; + +export const enum WordCharacterClass { + Regular = 0, + Whitespace = 1, + WordSeparator = 2 +} + +export class WordCharacterClassifier extends CharacterClassifier { + + constructor(wordSeparators: string) { + super(WordCharacterClass.Regular); + + for (let i = 0, len = wordSeparators.length; i < len; i++) { + this.set(wordSeparators.charCodeAt(i), WordCharacterClass.WordSeparator); + } + + this.set(CharCode.Space, WordCharacterClass.Whitespace); + this.set(CharCode.Tab, WordCharacterClass.Whitespace); + } + +} + +function once(computeFn: (input: string) => R): (input: string) => R { + let cache: { [key: string]: R; } = {}; // TODO@Alex unbounded cache + return (input: string): R => { + if (!cache.hasOwnProperty(input)) { + cache[input] = computeFn(input); + } + return cache[input]; + }; +} + +export const getMapForWordSeparators = once( + (input) => new WordCharacterClassifier(input) +); diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index bec905e6cf2..c2cb21c2c52 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -711,46 +711,46 @@ export interface ITextModel { * @param searchOnlyEditableRange Limit the searching to only search inside the editable range of the model. * @param isRegex Used to indicate that `searchString` is a regular expression. * @param matchCase Force the matching to match lower/upper case exactly. - * @param wholeWord Force the matching to match entire words only. + * @param wordSeparators Force the matching to match entire words only. Pass null otherwise. * @param captureMatches The result will contain the captured groups. * @param limitResultCount Limit the number of results * @return The ranges where the matches are. It is empty if not matches have been found. */ - findMatches(searchString: string, searchOnlyEditableRange: boolean, isRegex: boolean, matchCase: boolean, wholeWord: boolean, captureMatches: boolean, limitResultCount?: number): FindMatch[]; + findMatches(searchString: string, searchOnlyEditableRange: boolean, isRegex: boolean, matchCase: boolean, wordSeparators: string, captureMatches: boolean, limitResultCount?: number): FindMatch[]; /** * Search the model. * @param searchString The string used to search. If it is a regular expression, set `isRegex` to true. * @param searchScope Limit the searching to only search inside this range. * @param isRegex Used to indicate that `searchString` is a regular expression. * @param matchCase Force the matching to match lower/upper case exactly. - * @param wholeWord Force the matching to match entire words only. + * @param wordSeparators Force the matching to match entire words only. Pass null otherwise. * @param captureMatches The result will contain the captured groups. * @param limitResultCount Limit the number of results * @return The ranges where the matches are. It is empty if no matches have been found. */ - findMatches(searchString: string, searchScope: IRange, isRegex: boolean, matchCase: boolean, wholeWord: boolean, captureMatches: boolean, limitResultCount?: number): FindMatch[]; + findMatches(searchString: string, searchScope: IRange, isRegex: boolean, matchCase: boolean, wordSeparators: string, captureMatches: boolean, limitResultCount?: number): FindMatch[]; /** * Search the model for the next match. Loops to the beginning of the model if needed. * @param searchString The string used to search. If it is a regular expression, set `isRegex` to true. * @param searchStart Start the searching at the specified position. * @param isRegex Used to indicate that `searchString` is a regular expression. * @param matchCase Force the matching to match lower/upper case exactly. - * @param wholeWord Force the matching to match entire words only. + * @param wordSeparators Force the matching to match entire words only. Pass null otherwise. * @param captureMatches The result will contain the captured groups. * @return The range where the next match is. It is null if no next match has been found. */ - findNextMatch(searchString: string, searchStart: IPosition, isRegex: boolean, matchCase: boolean, wholeWord: boolean, captureMatches: boolean): FindMatch; + findNextMatch(searchString: string, searchStart: IPosition, isRegex: boolean, matchCase: boolean, wordSeparators: string, captureMatches: boolean): FindMatch; /** * Search the model for the previous match. Loops to the end of the model if needed. * @param searchString The string used to search. If it is a regular expression, set `isRegex` to true. * @param searchStart Start the searching at the specified position. * @param isRegex Used to indicate that `searchString` is a regular expression. * @param matchCase Force the matching to match lower/upper case exactly. - * @param wholeWord Force the matching to match entire words only. + * @param wordSeparators Force the matching to match entire words only. Pass null otherwise. * @param captureMatches The result will contain the captured groups. * @return The range where the previous match is. It is null if no previous match has been found. */ - findPreviousMatch(searchString: string, searchStart: IPosition, isRegex: boolean, matchCase: boolean, wholeWord: boolean, captureMatches: boolean): FindMatch; + findPreviousMatch(searchString: string, searchStart: IPosition, isRegex: boolean, matchCase: boolean, wordSeparators: string, captureMatches: boolean): FindMatch; } export class FindMatch { diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 7654eec1586..0d7ec1065b4 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -782,7 +782,7 @@ export class TextModel implements editorCommon.ITextModel { throw new Error('Unknown EOL preference'); } - public findMatches(searchString: string, rawSearchScope: any, isRegex: boolean, matchCase: boolean, wholeWord: boolean, captureMatches: boolean, limitResultCount: number = LIMIT_FIND_COUNT): editorCommon.FindMatch[] { + public findMatches(searchString: string, rawSearchScope: any, isRegex: boolean, matchCase: boolean, wordSeparators: string, captureMatches: boolean, limitResultCount: number = LIMIT_FIND_COUNT): editorCommon.FindMatch[] { this._assertNotDisposed(); let searchRange: Range; @@ -792,18 +792,18 @@ export class TextModel implements editorCommon.ITextModel { searchRange = this.getFullModelRange(); } - return TextModelSearch.findMatches(this, new SearchParams(searchString, isRegex, matchCase, wholeWord), searchRange, captureMatches, limitResultCount); + return TextModelSearch.findMatches(this, new SearchParams(searchString, isRegex, matchCase, wordSeparators), searchRange, captureMatches, limitResultCount); } - public findNextMatch(searchString: string, rawSearchStart: IPosition, isRegex: boolean, matchCase: boolean, wholeWord: boolean, captureMatches: boolean): editorCommon.FindMatch { + public findNextMatch(searchString: string, rawSearchStart: IPosition, isRegex: boolean, matchCase: boolean, wordSeparators: string, captureMatches: boolean): editorCommon.FindMatch { this._assertNotDisposed(); const searchStart = this.validatePosition(rawSearchStart); - return TextModelSearch.findNextMatch(this, new SearchParams(searchString, isRegex, matchCase, wholeWord), searchStart, captureMatches); + return TextModelSearch.findNextMatch(this, new SearchParams(searchString, isRegex, matchCase, wordSeparators), searchStart, captureMatches); } - public findPreviousMatch(searchString: string, rawSearchStart: IPosition, isRegex: boolean, matchCase: boolean, wholeWord: boolean, captureMatches: boolean): editorCommon.FindMatch { + public findPreviousMatch(searchString: string, rawSearchStart: IPosition, isRegex: boolean, matchCase: boolean, wordSeparators: string, captureMatches: boolean): editorCommon.FindMatch { this._assertNotDisposed(); const searchStart = this.validatePosition(rawSearchStart); - return TextModelSearch.findPreviousMatch(this, new SearchParams(searchString, isRegex, matchCase, wholeWord), searchStart, captureMatches); + return TextModelSearch.findPreviousMatch(this, new SearchParams(searchString, isRegex, matchCase, wordSeparators), searchStart, captureMatches); } } diff --git a/src/vs/editor/common/model/textModelSearch.ts b/src/vs/editor/common/model/textModelSearch.ts index 4c6bd91c3b2..e34a2abf57a 100644 --- a/src/vs/editor/common/model/textModelSearch.ts +++ b/src/vs/editor/common/model/textModelSearch.ts @@ -10,6 +10,7 @@ import { Range } from 'vs/editor/common/core/range'; import { FindMatch, EndOfLinePreference } from 'vs/editor/common/editorCommon'; import { CharCode } from 'vs/base/common/charCode'; import { TextModel } from 'vs/editor/common/model/textModel'; +import { getMapForWordSeparators, WordCharacterClassifier, WordCharacterClass } from "vs/editor/common/controller/wordCharacterClassifier"; const LIMIT_FIND_COUNT = 999; @@ -17,13 +18,13 @@ export class SearchParams { public readonly searchString: string; public readonly isRegex: boolean; public readonly matchCase: boolean; - public readonly wholeWord: boolean; + public readonly wordSeparators: string; - constructor(searchString: string, isRegex: boolean, matchCase: boolean, wholeWord: boolean) { + constructor(searchString: string, isRegex: boolean, matchCase: boolean, wordSeparators: string) { this.searchString = searchString; this.isRegex = isRegex; this.matchCase = matchCase; - this.wholeWord = wholeWord; + this.wordSeparators = wordSeparators; } private static _isMultilineRegexSource(searchString: string): boolean { @@ -71,8 +72,8 @@ export class SearchParams { try { regex = strings.createRegExp(this.searchString, this.isRegex, { matchCase: this.matchCase, - wholeWord: this.wholeWord, - multiline, + wholeWord: false, + multiline: multiline, global: true }); } catch (err) { @@ -83,13 +84,13 @@ export class SearchParams { return null; } - let canUseSimpleSearch = (!this.isRegex && !this.wholeWord && !multiline); + let canUseSimpleSearch = (!this.isRegex && !multiline); if (canUseSimpleSearch && this.searchString.toLowerCase() !== this.searchString.toUpperCase()) { // casing might make a difference canUseSimpleSearch = this.matchCase; } - return new SearchData(regex, canUseSimpleSearch ? this.searchString : null); + return new SearchData(regex, this.wordSeparators ? getMapForWordSeparators(this.wordSeparators) : null, canUseSimpleSearch ? this.searchString : null); } } @@ -99,13 +100,18 @@ export class SearchData { * The regex to search for. Always defined. */ public readonly regex: RegExp; + /** + * The word separator classifier. + */ + public readonly wordSeparators: WordCharacterClassifier; /** * The simple string to search for (if possible). */ public readonly simpleSearch: string; - constructor(regex: RegExp, simpleSearch: string) { + constructor(regex: RegExp, wordSeparators: WordCharacterClassifier, simpleSearch: string) { this.regex = regex; + this.wordSeparators = wordSeparators; this.simpleSearch = simpleSearch; } } @@ -130,7 +136,7 @@ export class TextModelSearch { } if (searchData.regex.multiline) { - return this._doFindMatchesMultiline(model, searchRange, searchData.regex, captureMatches, limitResultCount); + return this._doFindMatchesMultiline(model, searchRange, new Searcher(searchData.wordSeparators, searchData.regex), captureMatches, limitResultCount); } return this._doFindMatchesLineByLine(model, searchRange, searchData, captureMatches, limitResultCount); } @@ -173,7 +179,7 @@ export class TextModelSearch { return new Range(startPosition.lineNumber, startPosition.column, endPosition.lineNumber, endPosition.column); } - private static _doFindMatchesMultiline(model: TextModel, searchRange: Range, searchRegex: RegExp, captureMatches: boolean, limitResultCount: number): FindMatch[] { + private static _doFindMatchesMultiline(model: TextModel, searchRange: Range, searcher: Searcher, captureMatches: boolean, limitResultCount: number): FindMatch[] { const deltaOffset = model.getOffsetAt(searchRange.getStartPosition()); // We always execute multiline search over the lines joined with \n // This makes it that \n will match the EOL for both CRLF and LF models @@ -181,20 +187,11 @@ export class TextModelSearch { const text = model.getValueInRange(searchRange, EndOfLinePreference.LF); const result: FindMatch[] = []; - let prevStartOffset = 0; - let prevEndOffset = 0; let counter = 0; let m: RegExpExecArray; - while ((m = searchRegex.exec(text))) { - const startOffset = deltaOffset + m.index; - const endOffset = startOffset + m[0].length; - - if (prevStartOffset === startOffset && prevEndOffset === endOffset) { - // Exit early if the regex matches the same range - return result; - } - + searcher.reset(0); + while ((m = searcher.next(text))) { result[counter++] = createFindMatch( this._getMultilineMatchRange(model, deltaOffset, text, m.index, m[0]), m, @@ -203,9 +200,6 @@ export class TextModelSearch { if (counter >= limitResultCount) { return result; } - - prevStartOffset = startOffset; - prevEndOffset = endOffset; } return result; @@ -241,38 +235,43 @@ export class TextModelSearch { } private static _findMatchesInLine(searchData: SearchData, text: string, lineNumber: number, deltaOffset: number, resultLen: number, result: FindMatch[], captureMatches: boolean, limitResultCount: number): number { + const wordSeparators = searchData.wordSeparators; if (!captureMatches && searchData.simpleSearch) { const searchString = searchData.simpleSearch; const searchStringLen = searchString.length; + const textLength = text.length; let lastMatchIndex = -searchStringLen; while ((lastMatchIndex = text.indexOf(searchString, lastMatchIndex + searchStringLen)) !== -1) { - const range = new Range(lineNumber, lastMatchIndex + 1 + deltaOffset, lineNumber, lastMatchIndex + 1 + searchStringLen + deltaOffset); - result[resultLen++] = new FindMatch(range, null); - if (resultLen >= limitResultCount) { - return resultLen; + if (!wordSeparators || isValidMatch(wordSeparators, text, textLength, lastMatchIndex, searchStringLen)) { + const range = new Range(lineNumber, lastMatchIndex + 1 + deltaOffset, lineNumber, lastMatchIndex + 1 + searchStringLen + deltaOffset); + result[resultLen++] = new FindMatch(range, null); + if (resultLen >= limitResultCount) { + return resultLen; + } } } return resultLen; } - const searchRegex = searchData.regex; + const searcher = new Searcher(searchData.wordSeparators, searchData.regex); let m: RegExpExecArray; // Reset regex to search from the beginning - searchRegex.lastIndex = 0; + searcher.reset(0); do { - m = searchRegex.exec(text); + m = searcher.next(text); if (m) { - const range = new Range(lineNumber, m.index + 1 + deltaOffset, lineNumber, m.index + 1 + m[0].length + deltaOffset); - if (result.length > 0 && range.equalsRange(result[result.length - 1].range)) { - // Exit early if the regex matches the same range - return resultLen; - } + const matchStartIndex = m.index; + const matchLength = m[0].length; + + const range = new Range(lineNumber, matchStartIndex + 1 + deltaOffset, lineNumber, matchStartIndex + 1 + matchLength + deltaOffset); + result[resultLen++] = createFindMatch(range, m, captureMatches); if (resultLen >= limitResultCount) { return resultLen; } - if (m.index + m[0].length === text.length) { + + if (matchStartIndex + matchLength === text.length) { // Reached the end of the line return resultLen; } @@ -287,13 +286,15 @@ export class TextModelSearch { return null; } + const searcher = new Searcher(searchData.wordSeparators, searchData.regex); + if (searchData.regex.multiline) { - return this._doFindNextMatchMultiline(model, searchStart, searchData.regex, captureMatches); + return this._doFindNextMatchMultiline(model, searchStart, searcher, captureMatches); } - return this._doFindNextMatchLineByLine(model, searchStart, searchData.regex, captureMatches); + return this._doFindNextMatchLineByLine(model, searchStart, searcher, captureMatches); } - private static _doFindNextMatchMultiline(model: TextModel, searchStart: Position, searchRegex: RegExp, captureMatches: boolean): FindMatch { + private static _doFindNextMatchMultiline(model: TextModel, searchStart: Position, searcher: Searcher, captureMatches: boolean): FindMatch { const searchTextStart = new Position(searchStart.lineNumber, 1); const deltaOffset = model.getOffsetAt(searchTextStart); const lineCount = model.getLineCount(); @@ -301,8 +302,8 @@ export class TextModelSearch { // This makes it that \n will match the EOL for both CRLF and LF models // We compensate for offset errors in `_getMultilineMatchRange` const text = model.getValueInRange(new Range(searchTextStart.lineNumber, searchTextStart.column, lineCount, model.getLineMaxColumn(lineCount)), EndOfLinePreference.LF); - searchRegex.lastIndex = searchStart.column - 1; - let m = searchRegex.exec(text); + searcher.reset(searchStart.column - 1); + let m = searcher.next(text); if (m) { return createFindMatch( this._getMultilineMatchRange(model, deltaOffset, text, m.index, m[0]), @@ -313,19 +314,19 @@ export class TextModelSearch { if (searchStart.lineNumber !== 1 || searchStart.column !== 1) { // Try again from the top - return this._doFindNextMatchMultiline(model, new Position(1, 1), searchRegex, captureMatches); + return this._doFindNextMatchMultiline(model, new Position(1, 1), searcher, captureMatches); } return null; } - private static _doFindNextMatchLineByLine(model: TextModel, searchStart: Position, searchRegex: RegExp, captureMatches: boolean): FindMatch { + private static _doFindNextMatchLineByLine(model: TextModel, searchStart: Position, searcher: Searcher, captureMatches: boolean): FindMatch { const lineCount = model.getLineCount(); const startLineNumber = searchStart.lineNumber; // Look in first line const text = model.getLineContent(startLineNumber); - const r = this._findFirstMatchInLine(searchRegex, text, startLineNumber, searchStart.column, captureMatches); + const r = this._findFirstMatchInLine(searcher, text, startLineNumber, searchStart.column, captureMatches); if (r) { return r; } @@ -333,7 +334,7 @@ export class TextModelSearch { for (let i = 1; i <= lineCount; i++) { const lineIndex = (startLineNumber + i - 1) % lineCount; const text = model.getLineContent(lineIndex + 1); - const r = this._findFirstMatchInLine(searchRegex, text, lineIndex + 1, 1, captureMatches); + const r = this._findFirstMatchInLine(searcher, text, lineIndex + 1, 1, captureMatches); if (r) { return r; } @@ -342,10 +343,10 @@ export class TextModelSearch { return null; } - private static _findFirstMatchInLine(searchRegex: RegExp, text: string, lineNumber: number, fromColumn: number, captureMatches: boolean): FindMatch { + private static _findFirstMatchInLine(searcher: Searcher, text: string, lineNumber: number, fromColumn: number, captureMatches: boolean): FindMatch { // Set regex to search from column - searchRegex.lastIndex = fromColumn - 1; - const m: RegExpExecArray = searchRegex.exec(text); + searcher.reset(fromColumn - 1); + const m: RegExpExecArray = searcher.next(text); if (m) { return createFindMatch( new Range(lineNumber, m.index + 1, lineNumber, m.index + 1 + m[0].length), @@ -362,14 +363,16 @@ export class TextModelSearch { return null; } + const searcher = new Searcher(searchData.wordSeparators, searchData.regex); + if (searchData.regex.multiline) { - return this._doFindPreviousMatchMultiline(model, searchStart, searchData.regex, captureMatches); + return this._doFindPreviousMatchMultiline(model, searchStart, searcher, captureMatches); } - return this._doFindPreviousMatchLineByLine(model, searchStart, searchData.regex, captureMatches); + return this._doFindPreviousMatchLineByLine(model, searchStart, searcher, captureMatches); } - private static _doFindPreviousMatchMultiline(model: TextModel, searchStart: Position, searchRegex: RegExp, captureMatches: boolean): FindMatch { - const matches = this._doFindMatchesMultiline(model, new Range(1, 1, searchStart.lineNumber, searchStart.column), searchRegex, captureMatches, 10 * LIMIT_FIND_COUNT); + private static _doFindPreviousMatchMultiline(model: TextModel, searchStart: Position, searcher: Searcher, captureMatches: boolean): FindMatch { + const matches = this._doFindMatchesMultiline(model, new Range(1, 1, searchStart.lineNumber, searchStart.column), searcher, captureMatches, 10 * LIMIT_FIND_COUNT); if (matches.length > 0) { return matches[matches.length - 1]; } @@ -377,19 +380,19 @@ export class TextModelSearch { const lineCount = model.getLineCount(); if (searchStart.lineNumber !== lineCount || searchStart.column !== model.getLineMaxColumn(lineCount)) { // Try again with all content - return this._doFindPreviousMatchMultiline(model, new Position(lineCount, model.getLineMaxColumn(lineCount)), searchRegex, captureMatches); + return this._doFindPreviousMatchMultiline(model, new Position(lineCount, model.getLineMaxColumn(lineCount)), searcher, captureMatches); } return null; } - private static _doFindPreviousMatchLineByLine(model: TextModel, searchStart: Position, searchRegex: RegExp, captureMatches: boolean): FindMatch { + private static _doFindPreviousMatchLineByLine(model: TextModel, searchStart: Position, searcher: Searcher, captureMatches: boolean): FindMatch { const lineCount = model.getLineCount(); const startLineNumber = searchStart.lineNumber; // Look in first line const text = model.getLineContent(startLineNumber).substring(0, searchStart.column - 1); - const r = this._findLastMatchInLine(searchRegex, text, startLineNumber, captureMatches); + const r = this._findLastMatchInLine(searcher, text, startLineNumber, captureMatches); if (r) { return r; } @@ -397,7 +400,7 @@ export class TextModelSearch { for (let i = 1; i <= lineCount; i++) { const lineIndex = (lineCount + startLineNumber - i - 1) % lineCount; const text = model.getLineContent(lineIndex + 1); - const r = this._findLastMatchInLine(searchRegex, text, lineIndex + 1, captureMatches); + const r = this._findLastMatchInLine(searcher, text, lineIndex + 1, captureMatches); if (r) { return r; } @@ -406,10 +409,11 @@ export class TextModelSearch { return null; } - private static _findLastMatchInLine(searchRegex: RegExp, text: string, lineNumber: number, captureMatches: boolean): FindMatch { + private static _findLastMatchInLine(searcher: Searcher, text: string, lineNumber: number, captureMatches: boolean): FindMatch { let bestResult: FindMatch = null; let m: RegExpExecArray; - while ((m = searchRegex.exec(text))) { + searcher.reset(0); + while ((m = searcher.next(text))) { const result = new Range(lineNumber, m.index + 1, lineNumber, m.index + 1 + m[0].length); if (bestResult && result.equalsRange(bestResult.range)) { break; @@ -423,3 +427,88 @@ export class TextModelSearch { return bestResult; } } + +function isValidMatch(wordSeparators: WordCharacterClassifier, text: string, textLength: number, matchStartIndex: number, matchLength: number): boolean { + + if (matchStartIndex - 1 >= 0) { + const charBefore = text.charCodeAt(matchStartIndex - 1); + if (wordSeparators.get(charBefore) === WordCharacterClass.Regular) { + return false; + } + } + + if (matchStartIndex + matchLength < textLength) { + const charAfter = text.charCodeAt(matchStartIndex + matchLength); + if (wordSeparators.get(charAfter) === WordCharacterClass.Regular) { + return false; + } + } + + return true; +} + +class Searcher { + private _wordSeparators: WordCharacterClassifier; + private _searchRegex: RegExp; + private _prevMatchStartIndex: number; + private _prevMatchLength: number; + + constructor(wordSeparators: WordCharacterClassifier, searchRegex: RegExp, ) { + this._wordSeparators = wordSeparators; + this._searchRegex = searchRegex; + this._prevMatchStartIndex = -1; + this._prevMatchLength = 0; + } + + public reset(lastIndex: number): void { + this._searchRegex.lastIndex = lastIndex; + this._prevMatchStartIndex = -1; + this._prevMatchLength = 0; + } + + public next(text: string): RegExpExecArray { + if (!this._wordSeparators) { + return this._next(text); + } + + const textLength = text.length; + + let m: RegExpExecArray; + do { + m = this._next(text); + if (!m) { + return null; + } + + const matchStartIndex = m.index; + const matchLength = m[0].length; + + if (isValidMatch(this._wordSeparators, text, textLength, matchStartIndex, matchLength)) { + return m; + } + + } while (m); + + return null; + } + + private _next(text: string): RegExpExecArray { + const m = this._searchRegex.exec(text); + if (!m) { + return null; + } + + const matchStartIndex = m.index; + const matchLength = m[0].length; + + if (matchStartIndex === this._prevMatchStartIndex && matchLength === this._prevMatchLength) { + // Exit early if the regex matches the same range + return null; + } + + this._prevMatchStartIndex = matchStartIndex; + this._prevMatchLength = matchLength; + + return m; + } +} diff --git a/src/vs/editor/contrib/find/common/findController.ts b/src/vs/editor/contrib/find/common/findController.ts index f06f35867fd..cef058f8640 100644 --- a/src/vs/editor/contrib/find/common/findController.ts +++ b/src/vs/editor/contrib/find/common/findController.ts @@ -604,7 +604,7 @@ export abstract class SelectNextFindMatchAction extends EditorAction { let allSelections = editor.getSelections(); let lastAddedSelection = allSelections[allSelections.length - 1]; - let nextMatch = editor.getModel().findNextMatch(r.searchText, lastAddedSelection.getEndPosition(), false, r.matchCase, r.wholeWord, false); + let nextMatch = editor.getModel().findNextMatch(r.searchText, lastAddedSelection.getEndPosition(), false, r.matchCase, r.wholeWord ? editor.getConfiguration().wordSeparators : null, false); if (!nextMatch) { return null; @@ -631,7 +631,7 @@ export abstract class SelectPreviousFindMatchAction extends EditorAction { let allSelections = editor.getSelections(); let lastAddedSelection = allSelections[allSelections.length - 1]; - let previousMatch = editor.getModel().findPreviousMatch(r.searchText, lastAddedSelection.getStartPosition(), false, r.matchCase, r.wholeWord, false); + let previousMatch = editor.getModel().findPreviousMatch(r.searchText, lastAddedSelection.getStartPosition(), false, r.matchCase, r.wholeWord ? editor.getConfiguration().wordSeparators : null, false); if (!previousMatch) { return null; @@ -813,7 +813,7 @@ export abstract class AbstractSelectHighlightsAction extends EditorAction { const findState = controller.getState(); if (findState.isRevealed && findState.isRegex && findState.searchString.length > 0) { - matches = editor.getModel().findMatches(findState.searchString, true, findState.isRegex, findState.matchCase, findState.wholeWord, false).map(m => m.range); + matches = editor.getModel().findMatches(findState.searchString, true, findState.isRegex, findState.matchCase, findState.wholeWord ? editor.getConfiguration().wordSeparators : null, false).map(m => m.range); } else { @@ -826,7 +826,7 @@ export abstract class AbstractSelectHighlightsAction extends EditorAction { return; } - matches = editor.getModel().findMatches(r.searchText, true, false, r.matchCase, r.wholeWord, false).map(m => m.range); + matches = editor.getModel().findMatches(r.searchText, true, false, r.matchCase, r.wholeWord ? editor.getConfiguration().wordSeparators : null, false).map(m => m.range); } if (matches.length > 0) { @@ -1010,7 +1010,7 @@ export class SelectionHighlighter extends Disposable implements editorCommon.IEd } - let allMatches = model.findMatches(r.searchText, true, false, r.matchCase, r.wholeWord, false).map(m => m.range); + let allMatches = model.findMatches(r.searchText, true, false, r.matchCase, r.wholeWord ? this.editor.getConfiguration().wordSeparators : null, false).map(m => m.range); allMatches.sort(Range.compareRangesUsingStarts); selections.sort(Range.compareRangesUsingStarts); diff --git a/src/vs/editor/contrib/find/common/findModel.ts b/src/vs/editor/contrib/find/common/findModel.ts index 02ccc8f4ea5..ed888ad922a 100644 --- a/src/vs/editor/contrib/find/common/findModel.ts +++ b/src/vs/editor/contrib/find/common/findModel.ts @@ -235,7 +235,7 @@ export class FindModelBoundToEditorModel { let position = new Position(lineNumber, column); - let prevMatch = model.findPreviousMatch(this._state.searchString, position, this._state.isRegex, this._state.matchCase, this._state.wholeWord, false); + let prevMatch = model.findPreviousMatch(this._state.searchString, position, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getConfiguration().wordSeparators : null, false); if (prevMatch && prevMatch.range.isEmpty() && prevMatch.range.getStartPosition().equals(position)) { // Looks like we're stuck at this position, unacceptable! @@ -257,7 +257,7 @@ export class FindModelBoundToEditorModel { } position = new Position(lineNumber, column); - prevMatch = model.findPreviousMatch(this._state.searchString, position, this._state.isRegex, this._state.matchCase, this._state.wholeWord, false); + prevMatch = model.findPreviousMatch(this._state.searchString, position, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getConfiguration().wordSeparators : null, false); } if (!prevMatch) { @@ -306,7 +306,7 @@ export class FindModelBoundToEditorModel { let position = new Position(lineNumber, column); - let nextMatch = model.findNextMatch(this._state.searchString, position, this._state.isRegex, this._state.matchCase, this._state.wholeWord, captureMatches); + let nextMatch = model.findNextMatch(this._state.searchString, position, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getConfiguration().wordSeparators : null, captureMatches); if (forceMove && nextMatch && nextMatch.range.isEmpty() && nextMatch.range.getStartPosition().equals(position)) { // Looks like we're stuck at this position, unacceptable! @@ -328,7 +328,7 @@ export class FindModelBoundToEditorModel { } position = new Position(lineNumber, column); - nextMatch = model.findNextMatch(this._state.searchString, position, this._state.isRegex, this._state.matchCase, this._state.wholeWord, captureMatches); + nextMatch = model.findNextMatch(this._state.searchString, position, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getConfiguration().wordSeparators : null, captureMatches); } if (!nextMatch) { @@ -382,7 +382,7 @@ export class FindModelBoundToEditorModel { private _findMatches(findScope: Range, captureMatches: boolean, limitResultCount: number): editorCommon.FindMatch[] { let searchRange = FindModelBoundToEditorModel._getSearchRange(this._editor.getModel(), this._state.isReplaceRevealed, findScope); - return this._editor.getModel().findMatches(this._state.searchString, searchRange, this._state.isRegex, this._state.matchCase, this._state.wholeWord, captureMatches, limitResultCount); + return this._editor.getModel().findMatches(this._state.searchString, searchRange, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getConfiguration().wordSeparators : null, captureMatches, limitResultCount); } public replaceAll(): void { @@ -403,7 +403,7 @@ export class FindModelBoundToEditorModel { } private _largeReplaceAll(): void { - const searchParams = new SearchParams(this._state.searchString, this._state.isRegex, this._state.matchCase, this._state.wholeWord); + const searchParams = new SearchParams(this._state.searchString, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getConfiguration().wordSeparators : null); const searchData = searchParams.parseSearchRequest(); if (!searchData) { return; diff --git a/src/vs/editor/contrib/wordOperations/common/wordOperations.ts b/src/vs/editor/contrib/wordOperations/common/wordOperations.ts index b4b6a410f9d..b09317b09e6 100644 --- a/src/vs/editor/contrib/wordOperations/common/wordOperations.ts +++ b/src/vs/editor/contrib/wordOperations/common/wordOperations.ts @@ -12,8 +12,9 @@ import { Selection } from 'vs/editor/common/core/selection'; import { editorCommand, ServicesAccessor, EditorCommand, ICommandOptions } from 'vs/editor/common/editorCommonExtensions'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { WordNavigationType, WordOperations, getMapForWordSeparators, WordCharacterClassifier } from 'vs/editor/common/controller/cursorWordOperations'; +import { WordNavigationType, WordOperations } from 'vs/editor/common/controller/cursorWordOperations'; import { ReplaceCommand } from 'vs/editor/common/commands/replaceCommand'; +import { getMapForWordSeparators, WordCharacterClassifier } from "vs/editor/common/controller/wordCharacterClassifier"; export interface MoveWordOptions extends ICommandOptions { inSelectionMode: boolean; diff --git a/src/vs/editor/test/common/model/textModelSearch.test.ts b/src/vs/editor/test/common/model/textModelSearch.test.ts index 278ee1539ca..4102cfad4fe 100644 --- a/src/vs/editor/test/common/model/textModelSearch.test.ts +++ b/src/vs/editor/test/common/model/textModelSearch.test.ts @@ -10,10 +10,14 @@ import { FindMatch, EndOfLineSequence } from 'vs/editor/common/editorCommon'; import { Range } from 'vs/editor/common/core/range'; import { TextModel } from 'vs/editor/common/model/textModel'; import { TextModelSearch, SearchParams, SearchData } from 'vs/editor/common/model/textModelSearch'; +import { getMapForWordSeparators } from "vs/editor/common/controller/wordCharacterClassifier"; +import { USUAL_WORD_SEPARATORS } from "vs/editor/common/model/wordHelper"; // --------- Find suite('TextModelSearch', () => { + const usualWordSeparators = getMapForWordSeparators(USUAL_WORD_SEPARATORS); + function assertFindMatch(actual: FindMatch, expectedRange: Range, expectedMatches: string[] = null): void { assert.deepEqual(actual, new FindMatch(expectedRange, expectedMatches)); } @@ -43,10 +47,10 @@ suite('TextModelSearch', () => { } } - function assertFindMatches(text: string, searchString: string, isRegex: boolean, matchCase: boolean, wholeWord: boolean, _expected: [number, number, number, number][]): void { + function assertFindMatches(text: string, searchString: string, isRegex: boolean, matchCase: boolean, wordSeparators: string, _expected: [number, number, number, number][]): void { let expectedRanges = _expected.map(entry => new Range(entry[0], entry[1], entry[2], entry[3])); let expectedMatches = expectedRanges.map(entry => new FindMatch(entry, null)); - let searchParams = new SearchParams(searchString, isRegex, matchCase, wholeWord); + let searchParams = new SearchParams(searchString, isRegex, matchCase, wordSeparators); let model = TextModel.createFromString(text); _assertFindMatches(model, searchParams, expectedMatches); @@ -70,7 +74,7 @@ suite('TextModelSearch', () => { test('Simple find', () => { assertFindMatches( regularText.join('\n'), - 'foo', false, false, false, + 'foo', false, false, null, [ [1, 14, 1, 17], [1, 44, 1, 47], @@ -84,7 +88,7 @@ suite('TextModelSearch', () => { test('Case sensitive find', () => { assertFindMatches( regularText.join('\n'), - 'foo', false, true, false, + 'foo', false, true, null, [ [1, 14, 1, 17], [1, 44, 1, 47], @@ -96,7 +100,7 @@ suite('TextModelSearch', () => { test('Whole words find', () => { assertFindMatches( regularText.join('\n'), - 'foo', false, false, true, + 'foo', false, false, USUAL_WORD_SEPARATORS, [ [1, 14, 1, 17], [1, 44, 1, 47], @@ -108,7 +112,7 @@ suite('TextModelSearch', () => { test('/^/ find', () => { assertFindMatches( regularText.join('\n'), - '^', true, false, false, + '^', true, false, null, [ [1, 1, 1, 1], [2, 1, 2, 1], @@ -122,7 +126,7 @@ suite('TextModelSearch', () => { test('/$/ find', () => { assertFindMatches( regularText.join('\n'), - '$', true, false, false, + '$', true, false, null, [ [1, 74, 1, 74], [2, 69, 2, 69], @@ -136,7 +140,7 @@ suite('TextModelSearch', () => { test('/.*/ find', () => { assertFindMatches( regularText.join('\n'), - '.*', true, false, false, + '.*', true, false, null, [ [1, 1, 1, 74], [2, 1, 2, 69], @@ -156,7 +160,7 @@ suite('TextModelSearch', () => { '', 'Again nothing interesting here' ].join('\n'), - '^$', true, false, false, + '^$', true, false, null, [ [2, 1, 2, 1], [4, 1, 4, 1] @@ -172,7 +176,7 @@ suite('TextModelSearch', () => { 'some text again', 'again some text' ].join('\n'), - 'text\\n', true, false, false, + 'text\\n', true, false, null, [ [1, 16, 2, 1], [2, 16, 3, 1], @@ -188,7 +192,7 @@ suite('TextModelSearch', () => { 'some text again', 'again some text' ].join('\n'), - 'text\\nJust', true, false, false, + 'text\\nJust', true, false, null, [ [1, 16, 2, 5] ] @@ -203,7 +207,7 @@ suite('TextModelSearch', () => { 'some text again', 'again some text' ].join('\n'), - '\\nagain', true, false, false, + '\\nagain', true, false, null, [ [3, 16, 4, 6] ] @@ -218,7 +222,7 @@ suite('TextModelSearch', () => { 'some text again', 'again some text' ].join('\n'), - '.*\\nJust.*\\n', true, false, false, + '.*\\nJust.*\\n', true, false, null, [ [1, 1, 3, 1] ] @@ -234,7 +238,7 @@ suite('TextModelSearch', () => { 'if', 'else' ].join('\n'), - '^if\\nelse', true, false, false, + '^if\\nelse', true, false, null, [ [1, 1, 2, 5], [4, 1, 5, 5] @@ -253,7 +257,7 @@ suite('TextModelSearch', () => { ' ', 'else' ].join('\n'), - '^\\s*$\\n', true, false, false, + '^\\s*$\\n', true, false, null, [ [2, 1, 3, 1], [4, 1, 5, 1], @@ -270,7 +274,7 @@ suite('TextModelSearch', () => { 'ab', 'eb' ].join('\n'), - '^a.*b$', true, false, false, + '^a.*b$', true, false, null, [ [1, 1, 1, 7], [3, 1, 3, 3] @@ -288,7 +292,7 @@ suite('TextModelSearch', () => { 'elseif', 'else' ].join('\n'), - 'if\\nelse$', true, false, false, + 'if\\nelse$', true, false, null, [ [1, 1, 2, 5], [5, 5, 6, 5] @@ -305,7 +309,7 @@ suite('TextModelSearch', () => { '', 'again some text' ].join('\n'), - '^.*$', true, false, false, + '^.*$', true, false, null, [ [1, 1, 1, 20], [2, 1, 2, 1], @@ -325,7 +329,7 @@ suite('TextModelSearch', () => { 'again some text', 'but not some' ].join('\n'), - 'text\nsome', false, false, false, + 'text\nsome', false, false, null, [ [1, 16, 2, 5], [2, 11, 3, 5], @@ -333,10 +337,27 @@ suite('TextModelSearch', () => { ); }); + test('issue #3623: Match whole word does not work for not latin characters', () => { + assertFindMatches( + [ + 'я', + 'компилятор', + 'обфускация', + ':я-я' + ].join('\n'), + 'я', false, false, USUAL_WORD_SEPARATORS, + [ + [1, 1, 1, 2], + [4, 2, 4, 3], + [4, 4, 4, 5], + ] + ); + }); + test('findNextMatch without regex', () => { let model = TextModel.createFromString('line line one\nline two\nthree'); - let searchParams = new SearchParams('line', false, false, false); + let searchParams = new SearchParams('line', false, false, null); let actual = TextModelSearch.findNextMatch(model, searchParams, new Position(1, 1), false); assertFindMatch(actual, new Range(1, 1, 1, 5)); @@ -359,7 +380,7 @@ suite('TextModelSearch', () => { test('findNextMatch with beginning boundary regex', () => { let model = TextModel.createFromString('line one\nline two\nthree'); - let searchParams = new SearchParams('^line', true, false, false); + let searchParams = new SearchParams('^line', true, false, null); let actual = TextModelSearch.findNextMatch(model, searchParams, new Position(1, 1), false); assertFindMatch(actual, new Range(1, 1, 1, 5)); @@ -379,7 +400,7 @@ suite('TextModelSearch', () => { test('findNextMatch with beginning boundary regex and line has repetitive beginnings', () => { let model = TextModel.createFromString('line line one\nline two\nthree'); - let searchParams = new SearchParams('^line', true, false, false); + let searchParams = new SearchParams('^line', true, false, null); let actual = TextModelSearch.findNextMatch(model, searchParams, new Position(1, 1), false); assertFindMatch(actual, new Range(1, 1, 1, 5)); @@ -399,7 +420,7 @@ suite('TextModelSearch', () => { test('findNextMatch with beginning boundary multiline regex and line has repetitive beginnings', () => { let model = TextModel.createFromString('line line one\nline two\nline three\nline four'); - let searchParams = new SearchParams('^line.*\\nline', true, false, false); + let searchParams = new SearchParams('^line.*\\nline', true, false, null); let actual = TextModelSearch.findNextMatch(model, searchParams, new Position(1, 1), false); assertFindMatch(actual, new Range(1, 1, 2, 5)); @@ -416,7 +437,7 @@ suite('TextModelSearch', () => { test('findNextMatch with ending boundary regex', () => { let model = TextModel.createFromString('one line line\ntwo line\nthree'); - let searchParams = new SearchParams('line$', true, false, false); + let searchParams = new SearchParams('line$', true, false, null); let actual = TextModelSearch.findNextMatch(model, searchParams, new Position(1, 1), false); assertFindMatch(actual, new Range(1, 10, 1, 14)); @@ -436,7 +457,7 @@ suite('TextModelSearch', () => { test('findMatches with capturing matches', () => { let model = TextModel.createFromString('one line line\ntwo line\nthree'); - let searchParams = new SearchParams('(l(in)e)', true, false, false); + let searchParams = new SearchParams('(l(in)e)', true, false, null); let actual = TextModelSearch.findMatches(model, searchParams, model.getFullModelRange(), true, 100); assert.deepEqual(actual, [ @@ -451,7 +472,7 @@ suite('TextModelSearch', () => { test('findMatches multiline with capturing matches', () => { let model = TextModel.createFromString('one line line\ntwo line\nthree'); - let searchParams = new SearchParams('(l(in)e)\\n', true, false, false); + let searchParams = new SearchParams('(l(in)e)\\n', true, false, null); let actual = TextModelSearch.findMatches(model, searchParams, model.getFullModelRange(), true, 100); assert.deepEqual(actual, [ @@ -465,7 +486,7 @@ suite('TextModelSearch', () => { test('findNextMatch with capturing matches', () => { let model = TextModel.createFromString('one line line\ntwo line\nthree'); - let searchParams = new SearchParams('(l(in)e)', true, false, false); + let searchParams = new SearchParams('(l(in)e)', true, false, null); let actual = TextModelSearch.findNextMatch(model, searchParams, new Position(1, 1), true); assertFindMatch(actual, new Range(1, 5, 1, 9), ['line', 'line', 'in']); @@ -476,7 +497,7 @@ suite('TextModelSearch', () => { test('findNextMatch multiline with capturing matches', () => { let model = TextModel.createFromString('one line line\ntwo line\nthree'); - let searchParams = new SearchParams('(l(in)e)\\n', true, false, false); + let searchParams = new SearchParams('(l(in)e)\\n', true, false, null); let actual = TextModelSearch.findNextMatch(model, searchParams, new Position(1, 1), true); assertFindMatch(actual, new Range(1, 10, 2, 1), ['line\n', 'line', 'in']); @@ -487,7 +508,7 @@ suite('TextModelSearch', () => { test('findPreviousMatch with capturing matches', () => { let model = TextModel.createFromString('one line line\ntwo line\nthree'); - let searchParams = new SearchParams('(l(in)e)', true, false, false); + let searchParams = new SearchParams('(l(in)e)', true, false, null); let actual = TextModelSearch.findPreviousMatch(model, searchParams, new Position(1, 1), true); assertFindMatch(actual, new Range(2, 5, 2, 9), ['line', 'line', 'in']); @@ -498,7 +519,7 @@ suite('TextModelSearch', () => { test('findPreviousMatch multiline with capturing matches', () => { let model = TextModel.createFromString('one line line\ntwo line\nthree'); - let searchParams = new SearchParams('(l(in)e)\\n', true, false, false); + let searchParams = new SearchParams('(l(in)e)\\n', true, false, null); let actual = TextModelSearch.findPreviousMatch(model, searchParams, new Position(1, 1), true); assertFindMatch(actual, new Range(2, 5, 3, 1), ['line\n', 'line', 'in']); @@ -511,17 +532,17 @@ suite('TextModelSearch', () => { assert.equal(model.getEOL(), '\r\n'); - let searchParams = new SearchParams('h\\n', true, false, false); + let searchParams = new SearchParams('h\\n', true, false, null); let actual = TextModelSearch.findNextMatch(model, searchParams, new Position(1, 1), true); actual = TextModelSearch.findMatches(model, searchParams, model.getFullModelRange(), true, 1000)[0]; assertFindMatch(actual, new Range(8, 1, 9, 1), ['h\n']); - searchParams = new SearchParams('g\\nh\\n', true, false, false); + searchParams = new SearchParams('g\\nh\\n', true, false, null); actual = TextModelSearch.findNextMatch(model, searchParams, new Position(1, 1), true); actual = TextModelSearch.findMatches(model, searchParams, model.getFullModelRange(), true, 1000)[0]; assertFindMatch(actual, new Range(7, 1, 9, 1), ['g\nh\n']); - searchParams = new SearchParams('\\ni', true, false, false); + searchParams = new SearchParams('\\ni', true, false, null); actual = TextModelSearch.findNextMatch(model, searchParams, new Position(1, 1), true); actual = TextModelSearch.findMatches(model, searchParams, model.getFullModelRange(), true, 1000)[0]; assertFindMatch(actual, new Range(8, 2, 9, 2), ['\ni']); @@ -534,7 +555,7 @@ suite('TextModelSearch', () => { assert.equal(model.getEOL(), '\r\n'); - let searchParams = new SearchParams('\\r\\n', true, false, false); + let searchParams = new SearchParams('\\r\\n', true, false, null); let actual = TextModelSearch.findNextMatch(model, searchParams, new Position(1, 1), true); assert.equal(actual, null); assert.deepEqual(TextModelSearch.findMatches(model, searchParams, model.getFullModelRange(), true, 1000), []); @@ -542,37 +563,48 @@ suite('TextModelSearch', () => { model.dispose(); }); - function assertParseSearchResult(searchString: string, isRegex: boolean, matchCase: boolean, wholeWord: boolean, expected: SearchData): void { - let searchParams = new SearchParams(searchString, isRegex, matchCase, wholeWord); + function assertParseSearchResult(searchString: string, isRegex: boolean, matchCase: boolean, wordSeparators: string, expected: SearchData): void { + let searchParams = new SearchParams(searchString, isRegex, matchCase, wordSeparators); let actual = searchParams.parseSearchRequest(); - assert.deepEqual(actual, expected); + + if (expected === null) { + assert.ok(actual === null); + } else { + assert.deepEqual(actual.regex, expected.regex); + assert.deepEqual(actual.simpleSearch, expected.simpleSearch); + if (wordSeparators) { + assert.ok(actual.wordSeparators !== null); + } else { + assert.ok(actual.wordSeparators === null); + } + } } test('parseSearchRequest invalid', () => { - assertParseSearchResult('', true, true, true, null); - assertParseSearchResult(null, true, true, true, null); - assertParseSearchResult('(', true, false, false, null); + assertParseSearchResult('', true, true, USUAL_WORD_SEPARATORS, null); + assertParseSearchResult(null, true, true, USUAL_WORD_SEPARATORS, null); + assertParseSearchResult('(', true, false, null, null); }); test('parseSearchRequest non regex', () => { - assertParseSearchResult('foo', false, false, false, new SearchData(/foo/gi, null)); - assertParseSearchResult('foo', false, false, true, new SearchData(/\bfoo\b/gi, null)); - assertParseSearchResult('foo', false, true, false, new SearchData(/foo/g, 'foo')); - assertParseSearchResult('foo', false, true, true, new SearchData(/\bfoo\b/g, null)); - assertParseSearchResult('foo\\n', false, false, false, new SearchData(/foo\\n/gi, null)); - assertParseSearchResult('foo\\\\n', false, false, false, new SearchData(/foo\\\\n/gi, null)); - assertParseSearchResult('foo\\r', false, false, false, new SearchData(/foo\\r/gi, null)); - assertParseSearchResult('foo\\\\r', false, false, false, new SearchData(/foo\\\\r/gi, null)); + assertParseSearchResult('foo', false, false, null, new SearchData(/foo/gi, null, null)); + assertParseSearchResult('foo', false, false, USUAL_WORD_SEPARATORS, new SearchData(/foo/gi, usualWordSeparators, null)); + assertParseSearchResult('foo', false, true, null, new SearchData(/foo/g, null, 'foo')); + assertParseSearchResult('foo', false, true, USUAL_WORD_SEPARATORS, new SearchData(/foo/g, usualWordSeparators, 'foo')); + assertParseSearchResult('foo\\n', false, false, null, new SearchData(/foo\\n/gi, null, null)); + assertParseSearchResult('foo\\\\n', false, false, null, new SearchData(/foo\\\\n/gi, null, null)); + assertParseSearchResult('foo\\r', false, false, null, new SearchData(/foo\\r/gi, null, null)); + assertParseSearchResult('foo\\\\r', false, false, null, new SearchData(/foo\\\\r/gi, null, null)); }); test('parseSearchRequest regex', () => { - assertParseSearchResult('foo', true, false, false, new SearchData(/foo/gi, null)); - assertParseSearchResult('foo', true, false, true, new SearchData(/\bfoo\b/gi, null)); - assertParseSearchResult('foo', true, true, false, new SearchData(/foo/g, null)); - assertParseSearchResult('foo', true, true, true, new SearchData(/\bfoo\b/g, null)); - assertParseSearchResult('foo\\n', true, false, false, new SearchData(/foo\n/gim, null)); - assertParseSearchResult('foo\\\\n', true, false, false, new SearchData(/foo\\n/gi, null)); - assertParseSearchResult('foo\\r', true, false, false, new SearchData(/foo\r/gim, null)); - assertParseSearchResult('foo\\\\r', true, false, false, new SearchData(/foo\\r/gi, null)); + assertParseSearchResult('foo', true, false, null, new SearchData(/foo/gi, null, null)); + assertParseSearchResult('foo', true, false, USUAL_WORD_SEPARATORS, new SearchData(/foo/gi, usualWordSeparators, null)); + assertParseSearchResult('foo', true, true, null, new SearchData(/foo/g, null, null)); + assertParseSearchResult('foo', true, true, USUAL_WORD_SEPARATORS, new SearchData(/foo/g, usualWordSeparators, null)); + assertParseSearchResult('foo\\n', true, false, null, new SearchData(/foo\n/gim, null, null)); + assertParseSearchResult('foo\\\\n', true, false, null, new SearchData(/foo\\n/gi, null, null)); + assertParseSearchResult('foo\\r', true, false, null, new SearchData(/foo\r/gim, null, null)); + assertParseSearchResult('foo\\\\r', true, false, null, new SearchData(/foo\\r/gi, null, null)); }); }); diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index e12595a783f..5380ba9b866 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -1538,46 +1538,46 @@ declare module monaco.editor { * @param searchOnlyEditableRange Limit the searching to only search inside the editable range of the model. * @param isRegex Used to indicate that `searchString` is a regular expression. * @param matchCase Force the matching to match lower/upper case exactly. - * @param wholeWord Force the matching to match entire words only. + * @param wordSeparators Force the matching to match entire words only. Pass null otherwise. * @param captureMatches The result will contain the captured groups. * @param limitResultCount Limit the number of results * @return The ranges where the matches are. It is empty if not matches have been found. */ - findMatches(searchString: string, searchOnlyEditableRange: boolean, isRegex: boolean, matchCase: boolean, wholeWord: boolean, captureMatches: boolean, limitResultCount?: number): FindMatch[]; + findMatches(searchString: string, searchOnlyEditableRange: boolean, isRegex: boolean, matchCase: boolean, wordSeparators: string, captureMatches: boolean, limitResultCount?: number): FindMatch[]; /** * Search the model. * @param searchString The string used to search. If it is a regular expression, set `isRegex` to true. * @param searchScope Limit the searching to only search inside this range. * @param isRegex Used to indicate that `searchString` is a regular expression. * @param matchCase Force the matching to match lower/upper case exactly. - * @param wholeWord Force the matching to match entire words only. + * @param wordSeparators Force the matching to match entire words only. Pass null otherwise. * @param captureMatches The result will contain the captured groups. * @param limitResultCount Limit the number of results * @return The ranges where the matches are. It is empty if no matches have been found. */ - findMatches(searchString: string, searchScope: IRange, isRegex: boolean, matchCase: boolean, wholeWord: boolean, captureMatches: boolean, limitResultCount?: number): FindMatch[]; + findMatches(searchString: string, searchScope: IRange, isRegex: boolean, matchCase: boolean, wordSeparators: string, captureMatches: boolean, limitResultCount?: number): FindMatch[]; /** * Search the model for the next match. Loops to the beginning of the model if needed. * @param searchString The string used to search. If it is a regular expression, set `isRegex` to true. * @param searchStart Start the searching at the specified position. * @param isRegex Used to indicate that `searchString` is a regular expression. * @param matchCase Force the matching to match lower/upper case exactly. - * @param wholeWord Force the matching to match entire words only. + * @param wordSeparators Force the matching to match entire words only. Pass null otherwise. * @param captureMatches The result will contain the captured groups. * @return The range where the next match is. It is null if no next match has been found. */ - findNextMatch(searchString: string, searchStart: IPosition, isRegex: boolean, matchCase: boolean, wholeWord: boolean, captureMatches: boolean): FindMatch; + findNextMatch(searchString: string, searchStart: IPosition, isRegex: boolean, matchCase: boolean, wordSeparators: string, captureMatches: boolean): FindMatch; /** * Search the model for the previous match. Loops to the end of the model if needed. * @param searchString The string used to search. If it is a regular expression, set `isRegex` to true. * @param searchStart Start the searching at the specified position. * @param isRegex Used to indicate that `searchString` is a regular expression. * @param matchCase Force the matching to match lower/upper case exactly. - * @param wholeWord Force the matching to match entire words only. + * @param wordSeparators Force the matching to match entire words only. Pass null otherwise. * @param captureMatches The result will contain the captured groups. * @return The range where the previous match is. It is null if no previous match has been found. */ - findPreviousMatch(searchString: string, searchStart: IPosition, isRegex: boolean, matchCase: boolean, wholeWord: boolean, captureMatches: boolean): FindMatch; + findPreviousMatch(searchString: string, searchStart: IPosition, isRegex: boolean, matchCase: boolean, wordSeparators: string, captureMatches: boolean): FindMatch; } export class FindMatch { diff --git a/src/vs/platform/search/common/search.ts b/src/vs/platform/search/common/search.ts index 171c91ffb8d..365796b2a32 100644 --- a/src/vs/platform/search/common/search.ts +++ b/src/vs/platform/search/common/search.ts @@ -55,6 +55,7 @@ export interface IPatternInfo { pattern: string; isRegExp?: boolean; isWordMatch?: boolean; + wordSeparators?: string; isMultiline?: boolean; isCaseSensitive?: boolean; } @@ -138,6 +139,9 @@ export interface ISearchConfiguration extends IFilesConfiguration { useRipgrep: boolean; useIgnoreFilesByDefault: boolean; }; + editor: { + wordSeparators: string; + }; } export function getExcludes(configuration: ISearchConfiguration): IExpression { diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index ebb3c5d3217..c481f311de5 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -948,7 +948,8 @@ export class SearchViewlet extends Viewlet { pattern: contentPattern, isRegExp: isRegex, isCaseSensitive: isCaseSensitive, - isWordMatch: isWholeWords + isWordMatch: isWholeWords, + wordSeparators: this.configurationService.getConfiguration().editor.wordSeparators }; const { expression: excludePattern } = this.inputPatternExclusions.getGlob(); diff --git a/src/vs/workbench/parts/search/common/searchModel.ts b/src/vs/workbench/parts/search/common/searchModel.ts index ed1489ad1ff..5911cbbcbc2 100644 --- a/src/vs/workbench/parts/search/common/searchModel.ts +++ b/src/vs/workbench/parts/search/common/searchModel.ts @@ -187,7 +187,7 @@ export class FileMatch extends Disposable { } this._matches = new LinkedMap(); let matches = this._model - .findMatches(this._query.pattern, this._model.getFullModelRange(), this._query.isRegExp, this._query.isCaseSensitive, this._query.isWordMatch, false, this._maxResults); + .findMatches(this._query.pattern, this._model.getFullModelRange(), this._query.isRegExp, this._query.isCaseSensitive, this._query.isWordMatch ? this._query.wordSeparators : null, false, this._maxResults); this.updateMatches(matches, true); } @@ -202,7 +202,7 @@ export class FileMatch extends Disposable { const oldMatches = this._matches.values().filter(match => match.range().startLineNumber === lineNumber); oldMatches.forEach(match => this._matches.delete(match.id())); - const matches = this._model.findMatches(this._query.pattern, range, this._query.isRegExp, this._query.isCaseSensitive, this._query.isWordMatch, false, this._maxResults); + const matches = this._model.findMatches(this._query.pattern, range, this._query.isRegExp, this._query.isCaseSensitive, this._query.isWordMatch ? this._query.wordSeparators : null, false, this._maxResults); this.updateMatches(matches, modelChange); } diff --git a/src/vs/workbench/services/search/node/searchService.ts b/src/vs/workbench/services/search/node/searchService.ts index dbdec9c59cc..b1317d6b7cc 100644 --- a/src/vs/workbench/services/search/node/searchService.ts +++ b/src/vs/workbench/services/search/node/searchService.ts @@ -135,7 +135,7 @@ export class SearchService implements ISearchService { } // Use editor API to find matches - let matches = model.findMatches(query.contentPattern.pattern, false, query.contentPattern.isRegExp, query.contentPattern.isCaseSensitive, query.contentPattern.isWordMatch, false, query.maxResults); + let matches = model.findMatches(query.contentPattern.pattern, false, query.contentPattern.isRegExp, query.contentPattern.isCaseSensitive, query.contentPattern.isWordMatch ? query.contentPattern.wordSeparators : null, false, query.maxResults); if (matches.length) { let fileMatch = new FileMatch(resource); localResults.set(resource, fileMatch); From 0ac4b3181b449d4a7568a26a9f589160adb45ec4 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sat, 20 May 2017 10:58:37 +0200 Subject: [PATCH 0710/1164] Simplifications in textModelSearch.ts --- src/vs/editor/common/model/textModelSearch.ts | 70 +++++-------------- 1 file changed, 17 insertions(+), 53 deletions(-) diff --git a/src/vs/editor/common/model/textModelSearch.ts b/src/vs/editor/common/model/textModelSearch.ts index e34a2abf57a..d19ad9e608c 100644 --- a/src/vs/editor/common/model/textModelSearch.ts +++ b/src/vs/editor/common/model/textModelSearch.ts @@ -192,11 +192,7 @@ export class TextModelSearch { let m: RegExpExecArray; searcher.reset(0); while ((m = searcher.next(text))) { - result[counter++] = createFindMatch( - this._getMultilineMatchRange(model, deltaOffset, text, m.index, m[0]), - m, - captureMatches - ); + result[counter++] = createFindMatch(this._getMultilineMatchRange(model, deltaOffset, text, m.index, m[0]), m, captureMatches); if (counter >= limitResultCount) { return result; } @@ -244,8 +240,7 @@ export class TextModelSearch { let lastMatchIndex = -searchStringLen; while ((lastMatchIndex = text.indexOf(searchString, lastMatchIndex + searchStringLen)) !== -1) { if (!wordSeparators || isValidMatch(wordSeparators, text, textLength, lastMatchIndex, searchStringLen)) { - const range = new Range(lineNumber, lastMatchIndex + 1 + deltaOffset, lineNumber, lastMatchIndex + 1 + searchStringLen + deltaOffset); - result[resultLen++] = new FindMatch(range, null); + result[resultLen++] = new FindMatch(new Range(lineNumber, lastMatchIndex + 1 + deltaOffset, lineNumber, lastMatchIndex + 1 + searchStringLen + deltaOffset), null); if (resultLen >= limitResultCount) { return resultLen; } @@ -261,20 +256,10 @@ export class TextModelSearch { do { m = searcher.next(text); if (m) { - const matchStartIndex = m.index; - const matchLength = m[0].length; - - const range = new Range(lineNumber, matchStartIndex + 1 + deltaOffset, lineNumber, matchStartIndex + 1 + matchLength + deltaOffset); - - result[resultLen++] = createFindMatch(range, m, captureMatches); + result[resultLen++] = createFindMatch(new Range(lineNumber, m.index + 1 + deltaOffset, lineNumber, m.index + 1 + m[0].length + deltaOffset), m, captureMatches); if (resultLen >= limitResultCount) { return resultLen; } - - if (matchStartIndex + matchLength === text.length) { - // Reached the end of the line - return resultLen; - } } } while (m); return resultLen; @@ -414,15 +399,7 @@ export class TextModelSearch { let m: RegExpExecArray; searcher.reset(0); while ((m = searcher.next(text))) { - const result = new Range(lineNumber, m.index + 1, lineNumber, m.index + 1 + m[0].length); - if (bestResult && result.equalsRange(bestResult.range)) { - break; - } - bestResult = createFindMatch(result, m, captureMatches); - if (m.index + m[0].length === text.length) { - // Reached the end of the line - break; - } + bestResult = createFindMatch(new Range(lineNumber, m.index + 1, lineNumber, m.index + 1 + m[0].length), m, captureMatches); } return bestResult; } @@ -467,23 +444,30 @@ class Searcher { } public next(text: string): RegExpExecArray { - if (!this._wordSeparators) { - return this._next(text); - } - const textLength = text.length; let m: RegExpExecArray; do { - m = this._next(text); + if (this._prevMatchStartIndex + this._prevMatchLength === textLength) { + // Reached the end of the line + return null; + } + + m = this._searchRegex.exec(text); if (!m) { return null; } const matchStartIndex = m.index; const matchLength = m[0].length; + if (matchStartIndex === this._prevMatchStartIndex && matchLength === this._prevMatchLength) { + // Exit early if the regex matches the same range twice + return null; + } + this._prevMatchStartIndex = matchStartIndex; + this._prevMatchLength = matchLength; - if (isValidMatch(this._wordSeparators, text, textLength, matchStartIndex, matchLength)) { + if (!this._wordSeparators || isValidMatch(this._wordSeparators, text, textLength, matchStartIndex, matchLength)) { return m; } @@ -491,24 +475,4 @@ class Searcher { return null; } - - private _next(text: string): RegExpExecArray { - const m = this._searchRegex.exec(text); - if (!m) { - return null; - } - - const matchStartIndex = m.index; - const matchLength = m[0].length; - - if (matchStartIndex === this._prevMatchStartIndex && matchLength === this._prevMatchLength) { - // Exit early if the regex matches the same range - return null; - } - - this._prevMatchStartIndex = matchStartIndex; - this._prevMatchLength = matchLength; - - return m; - } } From c327b186d668c8b1b6a039907dd5388c40ac0599 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sat, 20 May 2017 11:44:46 +0200 Subject: [PATCH 0711/1164] Improve files.eol description (#2957) --- src/vs/workbench/parts/files/browser/files.contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/files/browser/files.contribution.ts b/src/vs/workbench/parts/files/browser/files.contribution.ts index 3a8ab2e8e01..3e19dc5ed9d 100644 --- a/src/vs/workbench/parts/files/browser/files.contribution.ts +++ b/src/vs/workbench/parts/files/browser/files.contribution.ts @@ -228,7 +228,7 @@ configurationRegistry.registerConfiguration({ '\r\n' ], 'default': (platform.isLinux || platform.isMacintosh) ? '\n' : '\r\n', - 'description': nls.localize('eol', "The default end of line character."), + 'description': nls.localize('eol', "The default end of line character. Use \\n for LF and \\r\\n for CRLF."), }, 'files.trimTrailingWhitespace': { 'type': 'boolean', From b090499274f1830c981bff91139c1109eef60da1 Mon Sep 17 00:00:00 2001 From: Florent Viel Date: Fri, 12 May 2017 12:03:03 +0200 Subject: [PATCH 0712/1164] update tes tests to show off function name with nbsp --- .../php/test/colorize-fixtures/test.php | 4 +- .../php/test/colorize-results/test_php.json | 90 ++++++++++++++++++- 2 files changed, 92 insertions(+), 2 deletions(-) diff --git a/extensions/php/test/colorize-fixtures/test.php b/extensions/php/test/colorize-fixtures/test.php index 2a641966368..b7d9578dcac 100644 --- a/extensions/php/test/colorize-fixtures/test.php +++ b/extensions/php/test/colorize-fixtures/test.php @@ -40,7 +40,9 @@ print("Uncut Point: $deck[$index] "); $starting_point++; } + + function foo bar(){} ?> - \ No newline at end of file + diff --git a/extensions/php/test/colorize-results/test_php.json b/extensions/php/test/colorize-results/test_php.json index 4cf717c50c3..71480eae524 100644 --- a/extensions/php/test/colorize-results/test_php.json +++ b/extensions/php/test/colorize-results/test_php.json @@ -3233,6 +3233,94 @@ "hc_black": "default: #FFFFFF" } }, + { + "c": "\t", + "t": "text.html.php meta.embedded.block.php source.php meta.function.php", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "function", + "t": "text.html.php meta.embedded.block.php source.php meta.function.php storage.type.function.php", + "r": { + "dark_plus": "storage.type: #569CD6", + "light_plus": "storage.type: #0000FF", + "dark_vs": "storage.type: #569CD6", + "light_vs": "storage.type: #0000FF", + "hc_black": "storage.type: #569CD6" + } + }, + { + "c": " ", + "t": "text.html.php meta.embedded.block.php source.php meta.function.php", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "foo bar", + "t": "text.html.php meta.embedded.block.php source.php meta.function.php entity.name.function.php", + "r": { + "dark_plus": "entity.name.function: #DCDCAA", + "light_plus": "entity.name.function: #795E26", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "(", + "t": "text.html.php meta.embedded.block.php source.php meta.function.php punctuation.definition.parameters.begin.php", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": ")", + "t": "text.html.php meta.embedded.block.php source.php meta.function.php punctuation.definition.parameters.end.php", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "{", + "t": "text.html.php meta.embedded.block.php source.php punctuation.section.scope.begin.php", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "}", + "t": "text.html.php meta.embedded.block.php source.php punctuation.section.scope.end.php", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, { "c": "?", "t": "text.html.php meta.embedded.block.php punctuation.section.embedded.end.php source.php", @@ -3321,4 +3409,4 @@ "hc_black": "punctuation.definition.tag: #808080" } } -] \ No newline at end of file +] From 310bcbc40085d979d6e9fa0a5b91b11ae2b002f2 Mon Sep 17 00:00:00 2001 From: Florent Viel Date: Sat, 20 May 2017 13:19:25 +0200 Subject: [PATCH 0713/1164] fix tests --- extensions/php/test/colorize-results/test_php.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/php/test/colorize-results/test_php.json b/extensions/php/test/colorize-results/test_php.json index 71480eae524..8285f8dee9b 100644 --- a/extensions/php/test/colorize-results/test_php.json +++ b/extensions/php/test/colorize-results/test_php.json @@ -3274,7 +3274,7 @@ "light_plus": "entity.name.function: #795E26", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "entity.name.function: #DCDCAA" } }, { From d1e209bb674112504657740c7b41f8299058abbf Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sat, 20 May 2017 15:03:02 +0200 Subject: [PATCH 0714/1164] Fix some TS noImplicitAny and noUnusedLocals warnings --- src/typings/native-keymap.d.ts | 2 +- src/vs/base/common/objects.ts | 2 +- src/vs/base/test/common/diff/diff.test.ts | 4 ++-- src/vs/base/worker/workerMain.ts | 2 +- .../browser/services/codeEditorServiceImpl.ts | 12 ++++------ .../services/standaloneThemeServiceImpl.ts | 4 ++-- .../contentWidgets/contentWidgets.ts | 4 ++-- .../browser/viewParts/minimap/minimap.ts | 2 +- .../editor/browser/widget/diffEditorWidget.ts | 5 ----- .../editor/common/controller/coreCommands.ts | 4 ++-- .../editor/common/controller/cursorCommon.ts | 2 +- .../common/controller/cursorMoveCommands.ts | 2 +- src/vs/editor/common/services/bulkEdit.ts | 4 ++-- .../common/services/editorSimpleWorker.ts | 2 +- .../editor/common/view/overviewZoneManager.ts | 2 +- src/vs/editor/common/viewModel/viewModel.ts | 2 +- .../bracketMatching/common/bracketMatching.ts | 4 +--- .../find/test/common/findController.test.ts | 15 ++++++++----- .../editor/contrib/folding/browser/folding.ts | 2 +- .../editor/contrib/folding/common/folding.ts | 4 ++-- .../folding/common/indentFoldStrategy.ts | 2 +- .../contrib/gotoError/browser/gotoError.ts | 6 ++--- .../linesOperations/common/linesOperations.ts | 8 +++---- .../quickFix/browser/lightBulbWidget.ts | 2 +- .../browser/referenceSearch.ts | 4 ++-- .../browser/referencesController.ts | 2 +- .../editor/contrib/snippet/common/snippet.ts | 10 ++++----- .../contrib/suggest/browser/suggestModel.ts | 2 +- .../test/browser/completionModel.test.ts | 3 ++- .../zoneWidget/browser/peekViewWidget.ts | 2 +- .../languageConfigurationExtensionPoint.ts | 4 ++-- .../services/decorationRenderOptions.test.ts | 2 +- .../test/browser/view/viewLayer.test.ts | 4 ++-- .../test/common/controller/cursor.test.ts | 2 +- .../controller/cursorMoveCommand.test.ts | 10 --------- .../test/common/diff/diffComputer.test.ts | 22 ++++++++++--------- .../test/common/mocks/mockExtensionService.ts | 2 +- .../test/common/model/model.modes.test.ts | 10 ++++----- .../common/model/modelDecorations.test.ts | 12 +++++----- .../common/model/textModelWithTokens.test.ts | 4 ++-- .../contextkey/test/common/contextkey.test.ts | 8 ++++++- .../common/abstractKeybindingService.test.ts | 8 ++++++- .../test/common/keybindingResolver.test.ts | 8 ++++++- .../browser/keybindingsEditorContribution.ts | 1 - .../electron-browser/snippetsService.ts | 2 +- .../electron-browser/keybindingService.ts | 4 ++-- .../test/keyboardMapperTestUtils.ts | 2 +- 47 files changed, 113 insertions(+), 113 deletions(-) diff --git a/src/typings/native-keymap.d.ts b/src/typings/native-keymap.d.ts index 65acdb584fa..092191dd759 100644 --- a/src/typings/native-keymap.d.ts +++ b/src/typings/native-keymap.d.ts @@ -65,7 +65,7 @@ declare module 'native-keymap' { export function getCurrentKeyboardLayout(): IKeyboardLayoutInfo; - export function onDidChangeKeyboardLayout(callback: () => void); + export function onDidChangeKeyboardLayout(callback: () => void): void; export function isISOKeyboard(): boolean; } \ No newline at end of file diff --git a/src/vs/base/common/objects.ts b/src/vs/base/common/objects.ts index c073ced725f..9a814afa30c 100644 --- a/src/vs/base/common/objects.ts +++ b/src/vs/base/common/objects.ts @@ -304,7 +304,7 @@ export function getOrDefault(obj: T, fn: (obj: T) => R, defaultValue: R = * @param obj the object to use for diffing */ export type obj = { [key: string]: any; }; -export function distinct(base: obj, target: obj): obj { +export function distinct(base: obj, target: obj): obj { const result = Object.create(null); if (!base || !target) { diff --git a/src/vs/base/test/common/diff/diff.test.ts b/src/vs/base/test/common/diff/diff.test.ts index a1eb6010406..b5467da27fc 100644 --- a/src/vs/base/test/common/diff/diff.test.ts +++ b/src/vs/base/test/common/diff/diff.test.ts @@ -19,7 +19,7 @@ class StringDiffSequence { return this.source.length; } - getElementHash(i) { + getElementHash(i: number) { return this.source.charAt(i); } } @@ -96,7 +96,7 @@ function lcsTest(Algorithm: any, originalStr: string, modifiedStr: string, answe } } -function lcsTests(Algorithm) { +function lcsTests(Algorithm: any) { lcsTest(Algorithm, 'heLLo world', 'hello orlando', 'heo orld'); lcsTest(Algorithm, 'abcde', 'acd', 'acd'); // simple lcsTest(Algorithm, 'abcdbce', 'bcede', 'bcde'); // skip diff --git a/src/vs/base/worker/workerMain.ts b/src/vs/base/worker/workerMain.ts index f80f9d44e16..9bf45f0b202 100644 --- a/src/vs/base/worker/workerMain.ts +++ b/src/vs/base/worker/workerMain.ts @@ -18,7 +18,7 @@ catchError: true }); - let loadCode = function (moduleId) { + let loadCode = function (moduleId: string) { require([moduleId], function (ws) { setTimeout(function () { let messageHandler = ws.create((msg: any) => { diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index f79bca4879d..fa45f009cf8 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -280,7 +280,7 @@ class DecorationRenderHelper { * Build the CSS for decorations styled via `className`. */ public static getCSSTextForModelDecorationClassName(opts: IThemeDecorationRenderOptions): string { - let cssTextArr = []; + let cssTextArr: string[] = []; DecorationRenderHelper.collectCSSText(opts, ['backgroundColor', 'outline', 'outlineColor', 'outlineStyle', 'outlineWidth'], cssTextArr); DecorationRenderHelper.collectBorderSettingsCSSText(opts, cssTextArr); @@ -291,7 +291,7 @@ class DecorationRenderHelper { * Build the CSS for decorations styled via `inlineClassName`. */ public static getCSSTextForModelDecorationInlineClassName(opts: IThemeDecorationRenderOptions): string { - let cssTextArr = []; + let cssTextArr: string[] = []; DecorationRenderHelper.collectCSSText(opts, ['textDecoration', 'cursor', 'color', 'letterSpacing'], cssTextArr); return cssTextArr.join(''); } @@ -300,7 +300,7 @@ class DecorationRenderHelper { * Build the CSS for decorations styled before or after content. */ public static getCSSTextForModelDecorationContentClassName(opts: IContentDecorationRenderOptions): string { - let cssTextArr = []; + let cssTextArr: string[] = []; if (typeof opts !== 'undefined') { DecorationRenderHelper.collectBorderSettingsCSSText(opts, cssTextArr); @@ -442,10 +442,6 @@ class CSSNameHelper { } // ---- Normalize decoration render options per theme -interface IResolvedDecorationRenderOptions { - light: IThemeDecorationRenderOptions; - dark: IThemeDecorationRenderOptions; -} function getThemedRenderOptions(opts: { light?: T, dark?: T }): { light?: T, dark?: T } { // TODO@alex,joh - not really how/what deep clone is being used // for here but it will break the URI TODO@martin @@ -462,4 +458,4 @@ function getThemedRenderOptions(opts: { light?: T, dark?: T }): { light?: T, light: light, dark: dark }; -} \ No newline at end of file +} diff --git a/src/vs/editor/browser/services/standaloneThemeServiceImpl.ts b/src/vs/editor/browser/services/standaloneThemeServiceImpl.ts index dd29c95ffc4..ed9e8f753df 100644 --- a/src/vs/editor/browser/services/standaloneThemeServiceImpl.ts +++ b/src/vs/editor/browser/services/standaloneThemeServiceImpl.ts @@ -172,8 +172,8 @@ export class StandaloneThemeServiceImpl implements IStandaloneThemeService { } this._theme = theme; - let cssRules = []; - let hasRule = {}; + let cssRules: string[] = []; + let hasRule: { [rule: string]: boolean; } = {}; let ruleCollector: ICssStyleCollector = { addRule: (rule: string) => { if (!hasRule[rule]) { diff --git a/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts b/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts index 66e04e6cbf6..15adceca2e1 100644 --- a/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts +++ b/src/vs/editor/browser/viewParts/contentWidgets/contentWidgets.ts @@ -338,14 +338,14 @@ class Widget { let position = this._context.model.coordinatesConverter.convertModelPositionToViewPosition(validModelPosition); let placement: IBoxLayoutResult = null; - let fetchPlacement = () => { + let fetchPlacement = (): void => { if (placement) { return; } const topLeft = this._getTopLeft(ctx, position); if (!topLeft) { - return null; + return; } const domNode = this.domNode.domNode; diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index 5cd3d6fedef..0b0f19f012e 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -797,7 +797,7 @@ export class Minimap extends ViewPart { private static _renderLine( target: ImageData, backgroundColor: RGBA, - useLighterFont, + useLighterFont: boolean, renderMinimap: RenderMinimap, colorTracker: MinimapTokensColorTracker, minimapCharRenderer: MinimapCharRenderer, diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index 48b18d28aa2..98c20984b8e 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -46,11 +46,6 @@ interface IEditorDiffDecorationsWithZones extends IEditorDiffDecorations { zones: editorBrowser.IViewZone[]; } -interface IEditorsDiffDecorations { - original: IEditorDiffDecorations; - modified: IEditorDiffDecorations; -} - interface IEditorsDiffDecorationsWithZones { original: IEditorDiffDecorationsWithZones; modified: IEditorDiffDecorationsWithZones; diff --git a/src/vs/editor/common/controller/coreCommands.ts b/src/vs/editor/common/controller/coreCommands.ts index 9ad0e099b2c..d4ae88bfadd 100644 --- a/src/vs/editor/common/controller/coreCommands.ts +++ b/src/vs/editor/common/controller/coreCommands.ts @@ -39,7 +39,7 @@ export abstract class CoreEditorCommand extends EditorCommand { export namespace EditorScroll_ { - const isEditorScrollArgs = function (arg): boolean { + const isEditorScrollArgs = function (arg: any): boolean { if (!types.isObject(arg)) { return false; } @@ -183,7 +183,7 @@ export namespace EditorScroll_ { export namespace RevealLine_ { - const isRevealLineArgs = function (arg): boolean { + const isRevealLineArgs = function (arg: any): boolean { if (!types.isObject(arg)) { return false; } diff --git a/src/vs/editor/common/controller/cursorCommon.ts b/src/vs/editor/common/controller/cursorCommon.ts index 6adb347b4dc..bc94291aab8 100644 --- a/src/vs/editor/common/controller/cursorCommon.ts +++ b/src/vs/editor/common/controller/cursorCommon.ts @@ -42,7 +42,7 @@ export interface ICursors { setStates(source: string, reason: CursorChangeReason, states: CursorState[]): void; reveal(horizontal: boolean, target: RevealTarget): void; - revealRange(revealHorizontal: boolean, modelRange: Range, viewRange: Range, verticalType: VerticalRevealType); + revealRange(revealHorizontal: boolean, modelRange: Range, viewRange: Range, verticalType: VerticalRevealType): void; scrollTo(desiredScrollTop: number): void; } diff --git a/src/vs/editor/common/controller/cursorMoveCommands.ts b/src/vs/editor/common/controller/cursorMoveCommands.ts index 37f6197d6ec..c4fd36b4b6e 100644 --- a/src/vs/editor/common/controller/cursorMoveCommands.ts +++ b/src/vs/editor/common/controller/cursorMoveCommands.ts @@ -498,7 +498,7 @@ export class CursorMoveCommands { export namespace CursorMove { - const isCursorMoveArgs = function (arg): boolean { + const isCursorMoveArgs = function (arg: any): boolean { if (!types.isObject(arg)) { return false; } diff --git a/src/vs/editor/common/services/bulkEdit.ts b/src/vs/editor/common/services/bulkEdit.ts index 2f63c6f64a7..e847eafc911 100644 --- a/src/vs/editor/common/services/bulkEdit.ts +++ b/src/vs/editor/common/services/bulkEdit.ts @@ -274,7 +274,7 @@ class BulkEditModel implements IDisposable { return r; } - private applyTask(task): void { + private applyTask(task: EditTask): void { task.apply(); if (this.progress) { this.progress.worked(1); @@ -287,7 +287,7 @@ class BulkEditModel implements IDisposable { } export interface BulkEdit { - progress(progress: IProgressRunner); + progress(progress: IProgressRunner): void; add(edit: IResourceEdit[]): void; finish(): TPromise; ariaMessage(): string; diff --git a/src/vs/editor/common/services/editorSimpleWorker.ts b/src/vs/editor/common/services/editorSimpleWorker.ts index 88d5690bd13..5d36b8f6c4b 100644 --- a/src/vs/editor/common/services/editorSimpleWorker.ts +++ b/src/vs/editor/common/services/editorSimpleWorker.ts @@ -474,7 +474,7 @@ export abstract class BaseEditorSimpleWorker { public loadForeignModule(moduleId: string, createData: any): TPromise { return new TPromise((c, e) => { // Use the global require to be sure to get the global config - (self).require([moduleId], (foreignModule) => { + (self).require([moduleId], (foreignModule: { create: (ctx: IWorkerContext, createData: any) => any; }) => { let ctx: IWorkerContext = { getMirrorModels: (): IMirrorModel[] => { return this._getModels(); diff --git a/src/vs/editor/common/view/overviewZoneManager.ts b/src/vs/editor/common/view/overviewZoneManager.ts index a9d9ec99a1e..a13baf1e0d2 100644 --- a/src/vs/editor/common/view/overviewZoneManager.ts +++ b/src/vs/editor/common/view/overviewZoneManager.ts @@ -126,7 +126,7 @@ export class OverviewZoneManager { private _themeType: ThemeType; private _pixelRatio: number; - private _lastAssignedId; + private _lastAssignedId: number; private _color2Id: { [color: string]: number; }; private _id2Color: string[]; diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index e812f5710f2..ffb43fadd6a 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -84,7 +84,7 @@ export interface IViewLayout { getWhitespaceViewportData(): IViewWhitespaceViewportData[]; // TODO@Alex whitespace management should work via a change accessor sort of thing - onHeightMaybeChanged(); + onHeightMaybeChanged(): void; // --------------- End vertical whitespace management } diff --git a/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts b/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts index 909547185f2..0f0a0592836 100644 --- a/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts +++ b/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts @@ -13,7 +13,6 @@ import { Position } from 'vs/editor/common/core/position'; import { RunOnceScheduler } from 'vs/base/common/async'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { editorAction, commonEditorContribution, ServicesAccessor, EditorAction } from 'vs/editor/common/editorCommonExtensions'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { registerThemingParticipant } from "vs/platform/theme/common/themeService"; import { editorBracketMatchBackground, editorBracketMatchBorder } from "vs/editor/common/view/editorColorRegistry"; @@ -71,8 +70,7 @@ export class BracketMatchingController extends Disposable implements editorCommo private _matchBrackets: boolean; constructor( - editor: editorCommon.ICommonCodeEditor, - @IConfigurationService private configurationService: IConfigurationService + editor: editorCommon.ICommonCodeEditor ) { super(); this._editor = editor; diff --git a/src/vs/editor/contrib/find/test/common/findController.test.ts b/src/vs/editor/contrib/find/test/common/findController.test.ts index edd256ccedb..aa2fb4de23d 100644 --- a/src/vs/editor/contrib/find/test/common/findController.test.ts +++ b/src/vs/editor/contrib/find/test/common/findController.test.ts @@ -73,11 +73,11 @@ function fromRange(rng: Range): number[] { } suite('FindController', () => { - let queryState = {}; + let queryState: { [key: string]: any; } = {}; let serviceCollection = new ServiceCollection(); serviceCollection.set(IStorageService, { - get: (key) => queryState[key], - getBoolean: (key) => !!queryState[key], + get: (key: string) => queryState[key], + getBoolean: (key: string) => !!queryState[key], store: (key: string, value: any) => { queryState[key] = value; } }); @@ -789,11 +789,14 @@ suite('FindController', () => { }); suite('FindController query options persistence', () => { - let queryState = { 'editor.isRegex': false, 'editor.matchCase': false, 'editor.wholeWord': false }; + let queryState: { [key: string]: any; } = {}; + queryState['editor.isRegex'] = false; + queryState['editor.matchCase'] = false; + queryState['editor.wholeWord'] = false; let serviceCollection = new ServiceCollection(); serviceCollection.set(IStorageService, { - get: (key) => queryState[key], - getBoolean: (key) => !!queryState[key], + get: (key: string) => queryState[key], + getBoolean: (key: string) => !!queryState[key], store: (key: string, value: any) => { queryState[key] = value; } }); diff --git a/src/vs/editor/contrib/folding/browser/folding.ts b/src/vs/editor/contrib/folding/browser/folding.ts index f89d26c6536..121869d46ed 100644 --- a/src/vs/editor/contrib/folding/browser/folding.ts +++ b/src/vs/editor/contrib/folding/browser/folding.ts @@ -531,7 +531,7 @@ interface FoldingArguments { direction?: 'up' | 'down'; } -function foldingArgumentsConstraint(args) { +function foldingArgumentsConstraint(args: any) { if (!types.isUndefined(args)) { if (!types.isObject(args)) { return false; diff --git a/src/vs/editor/contrib/folding/common/folding.ts b/src/vs/editor/contrib/folding/common/folding.ts index 148fd8f6b88..c0f677cb95c 100644 --- a/src/vs/editor/contrib/folding/common/folding.ts +++ b/src/vs/editor/contrib/folding/common/folding.ts @@ -9,7 +9,7 @@ export const ID = 'editor.contrib.folding'; export interface IFoldingController extends IEditorContribution { - foldAll(); - unfoldAll(); + foldAll(): void; + unfoldAll(): void; } \ No newline at end of file diff --git a/src/vs/editor/contrib/folding/common/indentFoldStrategy.ts b/src/vs/editor/contrib/folding/common/indentFoldStrategy.ts index 66e7af5ffe1..39f3b5aa635 100644 --- a/src/vs/editor/contrib/folding/common/indentFoldStrategy.ts +++ b/src/vs/editor/contrib/folding/common/indentFoldStrategy.ts @@ -21,7 +21,7 @@ export function limitByIndent(ranges: IFoldingRange[], maxEntries: number): IFol return ranges; } - let indentOccurrences = []; + let indentOccurrences: number[] = []; ranges.forEach(r => { if (r.indent < 1000) { indentOccurrences[r.indent] = (indentOccurrences[r.indent] || 0) + 1; diff --git a/src/vs/editor/contrib/gotoError/browser/gotoError.ts b/src/vs/editor/contrib/gotoError/browser/gotoError.ts index 30de9d1b446..89fb5203c60 100644 --- a/src/vs/editor/contrib/gotoError/browser/gotoError.ts +++ b/src/vs/editor/contrib/gotoError/browser/gotoError.ts @@ -13,7 +13,6 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import Severity from 'vs/base/common/severity'; import URI from 'vs/base/common/uri'; import * as dom from 'vs/base/browser/dom'; -import { ICommandService } from 'vs/platform/commands/common/commands'; import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IMarker, IMarkerService } from 'vs/platform/markers/common/markers'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -221,7 +220,7 @@ class MarkerNavigationWidget extends ZoneWidget { private _severity: Severity; private _backgroundColor: Color; - constructor(editor: ICodeEditor, private _model: MarkerModel, private _commandService: ICommandService, private _themeService: IThemeService) { + constructor(editor: ICodeEditor, private _model: MarkerModel, private _themeService: IThemeService) { super(editor, { showArrow: true, showFrame: true, isAccessible: true }); this._severity = Severity.Warning; this._backgroundColor = Color.white; @@ -377,7 +376,6 @@ class MarkerController implements editorCommon.IEditorContribution { editor: ICodeEditor, @IMarkerService private _markerService: IMarkerService, @IContextKeyService private _contextKeyService: IContextKeyService, - @ICommandService private _commandService: ICommandService, @IThemeService private _themeService: IThemeService ) { this._editor = editor; @@ -407,7 +405,7 @@ class MarkerController implements editorCommon.IEditorContribution { const markers = this._getMarkers(); this._model = new MarkerModel(this._editor, markers); - this._zone = new MarkerNavigationWidget(this._editor, this._model, this._commandService, this._themeService); + this._zone = new MarkerNavigationWidget(this._editor, this._model, this._themeService); this._markersNavigationVisible.set(true); this._callOnClose.push(this._model); diff --git a/src/vs/editor/contrib/linesOperations/common/linesOperations.ts b/src/vs/editor/contrib/linesOperations/common/linesOperations.ts index 54143b106ba..4bc4b88d0fa 100644 --- a/src/vs/editor/contrib/linesOperations/common/linesOperations.ts +++ b/src/vs/editor/contrib/linesOperations/common/linesOperations.ts @@ -434,8 +434,8 @@ export class DeleteAllLeftAction extends AbstractDeleteAllToBoundaryAction { } _getEndCursorState(primaryCursor: Range, rangesToDelete: Range[]): Selection[] { - let endPrimaryCursor: Range; - let endCursorState = []; + let endPrimaryCursor: Selection; + let endCursorState: Selection[] = []; for (let i = 0, len = rangesToDelete.length; i < len; i++) { let range = rangesToDelete[i]; @@ -488,8 +488,8 @@ export class DeleteAllRightAction extends AbstractDeleteAllToBoundaryAction { } _getEndCursorState(primaryCursor: Range, rangesToDelete: Range[]): Selection[] { - let endPrimaryCursor: Range; - let endCursorState = []; + let endPrimaryCursor: Selection; + let endCursorState: Selection[] = []; for (let i = 0, len = rangesToDelete.length, offset = 0; i < len; i++) { let range = rangesToDelete[i]; let endCursor = new Selection(range.startLineNumber - offset, range.startColumn, range.startLineNumber - offset, range.startColumn); diff --git a/src/vs/editor/contrib/quickFix/browser/lightBulbWidget.ts b/src/vs/editor/contrib/quickFix/browser/lightBulbWidget.ts index f0946cd7929..c1bde40b2d7 100644 --- a/src/vs/editor/contrib/quickFix/browser/lightBulbWidget.ts +++ b/src/vs/editor/contrib/quickFix/browser/lightBulbWidget.ts @@ -18,7 +18,7 @@ export class LightBulbWidget implements IDisposable { private readonly _options = { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, glyphMarginClassName: 'lightbulb-glyph', - glyphMarginHoverMessage: undefined + glyphMarginHoverMessage: undefined }; private readonly _editor: ICodeEditor; diff --git a/src/vs/editor/contrib/referenceSearch/browser/referenceSearch.ts b/src/vs/editor/contrib/referenceSearch/browser/referenceSearch.ts index 3adcedc0662..6249277425f 100644 --- a/src/vs/editor/contrib/referenceSearch/browser/referenceSearch.ts +++ b/src/vs/editor/contrib/referenceSearch/browser/referenceSearch.ts @@ -163,8 +163,8 @@ CommandsRegistry.registerCommand('editor.action.showReferences', { } }); -function closeActiveReferenceSearch(accessor, args) { - var outerEditor = getOuterEditor(accessor, args); +function closeActiveReferenceSearch(accessor: ServicesAccessor, args: any) { + var outerEditor = getOuterEditor(accessor); if (!outerEditor) { return; } diff --git a/src/vs/editor/contrib/referenceSearch/browser/referencesController.ts b/src/vs/editor/contrib/referenceSearch/browser/referencesController.ts index d4bff8009dd..140a7e3e0e8 100644 --- a/src/vs/editor/contrib/referenceSearch/browser/referencesController.ts +++ b/src/vs/editor/contrib/referenceSearch/browser/referencesController.ts @@ -58,7 +58,7 @@ export class ReferencesController implements editorCommon.IEditorContribution { editor: ICodeEditor, @IContextKeyService contextKeyService: IContextKeyService, @IEditorService private _editorService: IEditorService, - @ITextModelResolverService private _textModelResolverService, + @ITextModelResolverService private _textModelResolverService: ITextModelResolverService, @ITelemetryService private _telemetryService: ITelemetryService, @IMessageService private _messageService: IMessageService, @IInstantiationService private _instantiationService: IInstantiationService, diff --git a/src/vs/editor/contrib/snippet/common/snippet.ts b/src/vs/editor/contrib/snippet/common/snippet.ts index 84c1b1490ef..8efd9e2b887 100644 --- a/src/vs/editor/contrib/snippet/common/snippet.ts +++ b/src/vs/editor/contrib/snippet/common/snippet.ts @@ -214,7 +214,7 @@ export class CodeSnippet implements ICodeSnippet { // Compute resultPlaceHolders for (const originalPlaceHolder of this.placeHolders) { - let resultOccurences = []; + let resultOccurences: Range[] = []; for (let { startLineNumber, startColumn, endLineNumber, endColumn } of originalPlaceHolder.occurences) { @@ -232,12 +232,12 @@ export class CodeSnippet implements ICodeSnippet { endColumn += referenceIndentation.length; } - resultOccurences.push({ - startLineNumber: startLineNumber + deltaLine, + resultOccurences.push(new Range( + startLineNumber + deltaLine, startColumn, - endLineNumber: endLineNumber + deltaLine, + endLineNumber + deltaLine, endColumn, - }); + )); } resultPlaceHolders.push({ diff --git a/src/vs/editor/contrib/suggest/browser/suggestModel.ts b/src/vs/editor/contrib/suggest/browser/suggestModel.ts index 1bb4c209b18..93a9a0a9219 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestModel.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestModel.ts @@ -68,7 +68,7 @@ export class LineContext { readonly column: number; readonly leadingLineContent: string; readonly leadingWord: IWordAtPosition; - readonly auto; + readonly auto: boolean; constructor(model: IModel, position: Position, auto: boolean) { this.leadingLineContent = model.getLineContent(position.lineNumber).substr(0, position.column - 1); diff --git a/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts b/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts index ba122d64d51..af82d02dca0 100644 --- a/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts +++ b/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts @@ -9,6 +9,7 @@ import { ISuggestion, ISuggestResult, ISuggestSupport, SuggestionType } from 'vs import { ISuggestionItem } from 'vs/editor/contrib/suggest/browser/suggest'; import { CompletionModel } from 'vs/editor/contrib/suggest/browser/completionModel'; import { IPosition } from 'vs/editor/common/core/position'; +import { TPromise } from "vs/base/common/winjs.base"; suite('CompletionModel', function () { @@ -36,7 +37,7 @@ suite('CompletionModel', function () { } }; - resolve() { + resolve(): TPromise { return null; } }; diff --git a/src/vs/editor/contrib/zoneWidget/browser/peekViewWidget.ts b/src/vs/editor/contrib/zoneWidget/browser/peekViewWidget.ts index c994fda89fb..97a76078bba 100644 --- a/src/vs/editor/contrib/zoneWidget/browser/peekViewWidget.ts +++ b/src/vs/editor/contrib/zoneWidget/browser/peekViewWidget.ts @@ -37,7 +37,7 @@ export interface IPeekViewService { isActive: boolean; } -export function getOuterEditor(accessor: ServicesAccessor, args: any): ICommonCodeEditor { +export function getOuterEditor(accessor: ServicesAccessor): ICommonCodeEditor { let editor = accessor.get(ICodeEditorService).getFocusedCodeEditor(); if (editor instanceof EmbeddedCodeEditorWidget) { return editor.getParentEditor(); diff --git a/src/vs/editor/node/languageConfigurationExtensionPoint.ts b/src/vs/editor/node/languageConfigurationExtensionPoint.ts index 25a180b79f0..ee24733bf1b 100644 --- a/src/vs/editor/node/languageConfigurationExtensionPoint.ts +++ b/src/vs/editor/node/languageConfigurationExtensionPoint.ts @@ -5,7 +5,7 @@ 'use strict'; import * as nls from 'vs/nls'; -import { parse } from 'vs/base/common/json'; +import { parse, ParseError } from 'vs/base/common/json'; import { readFile } from 'vs/base/node/pfs'; import { CharacterPair, LanguageConfiguration, IAutoClosingPair, IAutoClosingPairConditional, CommentRule } from 'vs/editor/common/modes/languageConfiguration'; import { IModeService } from 'vs/editor/common/services/modeService'; @@ -60,7 +60,7 @@ export class LanguageConfigurationFileHandler { private _handleConfigFile(languageIdentifier: LanguageIdentifier, configFilePath: string): void { readFile(configFilePath).then((fileContents) => { - var errors = []; + var errors: ParseError[] = []; var configuration = parse(fileContents.toString(), errors); if (errors.length) { console.error(nls.localize('parseErrors', "Errors parsing {0}: {1}", configFilePath, errors.join('\n'))); diff --git a/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts b/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts index a5cf90e7e1a..2dbd09ac1c0 100644 --- a/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts +++ b/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts @@ -32,7 +32,7 @@ suite('Decoration Render Options', () => { function readStyleSheet(styleSheet: HTMLStyleElement): string { if ((styleSheet.sheet).rules) { - return Array.prototype.map.call((styleSheet.sheet).rules, r => r.cssText).join('\n'); + return Array.prototype.map.call((styleSheet.sheet).rules, (r: { cssText: string }) => r.cssText).join('\n'); } return styleSheet.sheet.toString(); } diff --git a/src/vs/editor/test/browser/view/viewLayer.test.ts b/src/vs/editor/test/browser/view/viewLayer.test.ts index 51344c85c73..a71138fc3b7 100644 --- a/src/vs/editor/test/browser/view/viewLayer.test.ts +++ b/src/vs/editor/test/browser/view/viewLayer.test.ts @@ -51,7 +51,7 @@ suite('RenderedLinesCollection onLinesDeleted', () => { new TestLine('old9') ]); let actualDeleted1 = col.onLinesDeleted(deleteFromLineNumber, deleteToLineNumber); - let actualDeleted = []; + let actualDeleted: string[] = []; if (actualDeleted1) { actualDeleted = actualDeleted1.map(line => line.id); } @@ -407,7 +407,7 @@ suite('RenderedLinesCollection onLinesInserted', () => { new TestLine('old9') ]); let actualDeleted1 = col.onLinesInserted(insertFromLineNumber, insertToLineNumber); - let actualDeleted = []; + let actualDeleted: string[] = []; if (actualDeleted1) { actualDeleted = actualDeleted1.map(line => line.id); } diff --git a/src/vs/editor/test/common/controller/cursor.test.ts b/src/vs/editor/test/common/controller/cursor.test.ts index 3619bef7d23..69351a8a81d 100644 --- a/src/vs/editor/test/common/controller/cursor.test.ts +++ b/src/vs/editor/test/common/controller/cursor.test.ts @@ -1699,7 +1699,7 @@ suite('Editor Controller - Regression tests', () => { }, (model, cursor) => { moveTo(cursor, 1, 1, false); - function assertWordRight(col, expectedCol) { + function assertWordRight(col: number, expectedCol: number) { let args = { position: { lineNumber: 1, diff --git a/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts b/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts index 7236cf52bb8..1b4ae6b014d 100644 --- a/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts +++ b/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts @@ -7,14 +7,11 @@ import * as assert from 'assert'; import { Cursor } from 'vs/editor/common/controller/cursor'; import { Position } from 'vs/editor/common/core/position'; -import { ITextModelCreationOptions } from 'vs/editor/common/editorCommon'; import { Model } from 'vs/editor/common/model/model'; -import { IMode } from 'vs/editor/common/modes'; import { TestConfiguration } from 'vs/editor/test/common/mocks/testConfiguration'; import { CursorMove } from 'vs/editor/common/controller/cursorMoveCommands'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; -import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { CoreNavigationCommands } from 'vs/editor/common/controller/coreCommands'; import { ViewModel } from "vs/editor/common/viewModel/viewModelImpl"; @@ -409,13 +406,6 @@ suite('Cursor move command test', () => { }); }); -interface ICursorOpts { - text: string[]; - mode?: IMode; - modelOpts?: ITextModelCreationOptions; - editorOpts?: IEditorOptions; -} - // Move command function move(cursor: Cursor, args: any) { diff --git a/src/vs/editor/test/common/diff/diffComputer.test.ts b/src/vs/editor/test/common/diff/diffComputer.test.ts index 90349d7b7b0..3bb149dcf53 100644 --- a/src/vs/editor/test/common/diff/diffComputer.test.ts +++ b/src/vs/editor/test/common/diff/diffComputer.test.ts @@ -8,7 +8,7 @@ import * as assert from 'assert'; import { DiffComputer } from 'vs/editor/common/diff/diffComputer'; import { IChange, ICharChange, ILineChange } from 'vs/editor/common/editorCommon'; -function extractCharChangeRepresentation(change, expectedChange): ICharChange { +function extractCharChangeRepresentation(change: ICharChange, expectedChange: ICharChange): ICharChange { var hasOriginal = expectedChange && expectedChange.originalStartLineNumber > 0; var hasModified = expectedChange && expectedChange.modifiedStartLineNumber > 0; return { @@ -24,7 +24,7 @@ function extractCharChangeRepresentation(change, expectedChange): ICharChange { }; } -function extractLineChangeRepresentation(change, expectedChange): IChange | ILineChange { +function extractLineChangeRepresentation(change: ILineChange, expectedChange: ILineChange): IChange | ILineChange { if (change.charChanges) { let charChanges: ICharChange[] = []; for (let i = 0; i < change.charChanges.length; i++) { @@ -61,12 +61,12 @@ function assertDiff(originalLines: string[], modifiedLines: string[], expectedCh var extracted = []; for (var i = 0; i < changes.length; i++) { - extracted.push(extractLineChangeRepresentation(changes[i], i < expectedChanges.length ? expectedChanges[i] : null)); + extracted.push(extractLineChangeRepresentation(changes[i], (i < expectedChanges.length ? expectedChanges[i] : null))); } assert.deepEqual(extracted, expectedChanges); } -function createLineDeletion(startLineNumber, endLineNumber, modifiedLineNumber): IChange { +function createLineDeletion(startLineNumber: number, endLineNumber: number, modifiedLineNumber: number): IChange { return { originalStartLineNumber: startLineNumber, originalEndLineNumber: endLineNumber, @@ -75,7 +75,7 @@ function createLineDeletion(startLineNumber, endLineNumber, modifiedLineNumber): }; } -function createLineInsertion(startLineNumber, endLineNumber, originalLineNumber): IChange { +function createLineInsertion(startLineNumber: number, endLineNumber: number, originalLineNumber: number): IChange { return { originalStartLineNumber: originalLineNumber, originalEndLineNumber: 0, @@ -84,7 +84,7 @@ function createLineInsertion(startLineNumber, endLineNumber, originalLineNumber) }; } -function createLineChange(originalStartLineNumber, originalEndLineNumber, modifiedStartLineNumber, modifiedEndLineNumber, charChanges): ILineChange { +function createLineChange(originalStartLineNumber: number, originalEndLineNumber: number, modifiedStartLineNumber: number, modifiedEndLineNumber: number, charChanges: ICharChange[]): ILineChange { return { originalStartLineNumber: originalStartLineNumber, originalEndLineNumber: originalEndLineNumber, @@ -94,7 +94,7 @@ function createLineChange(originalStartLineNumber, originalEndLineNumber, modifi }; } -function createCharInsertion(startLineNumber, startColumn, endLineNumber, endColumn) { +function createCharInsertion(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number) { return { originalStartLineNumber: 0, originalStartColumn: 0, @@ -107,7 +107,7 @@ function createCharInsertion(startLineNumber, startColumn, endLineNumber, endCol }; } -function createCharDeletion(startLineNumber, startColumn, endLineNumber, endColumn) { +function createCharDeletion(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number) { return { originalStartLineNumber: startLineNumber, originalStartColumn: startColumn, @@ -120,8 +120,10 @@ function createCharDeletion(startLineNumber, startColumn, endLineNumber, endColu }; } -function createCharChange(originalStartLineNumber, originalStartColumn, originalEndLineNumber, originalEndColumn, - modifiedStartLineNumber, modifiedStartColumn, modifiedEndLineNumber, modifiedEndColumn) { +function createCharChange( + originalStartLineNumber: number, originalStartColumn: number, originalEndLineNumber: number, originalEndColumn: number, + modifiedStartLineNumber: number, modifiedStartColumn: number, modifiedEndLineNumber: number, modifiedEndColumn: number +) { return { originalStartLineNumber: originalStartLineNumber, originalStartColumn: originalStartColumn, diff --git a/src/vs/editor/test/common/mocks/mockExtensionService.ts b/src/vs/editor/test/common/mocks/mockExtensionService.ts index 7eb1c1be346..039c9ec9eb6 100644 --- a/src/vs/editor/test/common/mocks/mockExtensionService.ts +++ b/src/vs/editor/test/common/mocks/mockExtensionService.ts @@ -32,7 +32,7 @@ export class MockExtensionService extends AbstractExtensionService { [1, 4, 4, 7, 7, 10, 10, 13], ]; tokenIterator(thisModel, new Position(1, 1), (iter) => { - var a = [], line = 0; + var a: number[] = [], line = 0; while (iter.hasNext()) { calls++; if (a.length === 0) { @@ -450,7 +450,7 @@ suite('Editor Model - Token Iterator', () => { test('iterator allows next/prev', () => { var n = 0; - var up = [], down = []; + var up: ITokenInfo[] = [], down: ITokenInfo[] = []; tokenIterator(thisModel, new Position(1, 1), (iter) => { while (iter.hasNext()) { var next = iter.next(); @@ -473,7 +473,7 @@ suite('Editor Model - Token Iterator', () => { test('iterator allows prev/next', () => { var n = 0; - var up = [], down = []; + var up: ITokenInfo[] = [], down: ITokenInfo[] = []; tokenIterator(thisModel, new Position(3, 12), (iter) => { while (iter.hasPrev()) { var prev = iter.prev(); @@ -496,7 +496,7 @@ suite('Editor Model - Token Iterator', () => { test('iterator can not be used outside of callback', () => { - var illegalIterReference; + var illegalIterReference: TokenIterator; tokenIterator(thisModel, new Position(3, 12), (iter) => { illegalIterReference = iter; }); diff --git a/src/vs/editor/test/common/model/modelDecorations.test.ts b/src/vs/editor/test/common/model/modelDecorations.test.ts index 12a6c4233d0..b148ac36e17 100644 --- a/src/vs/editor/test/common/model/modelDecorations.test.ts +++ b/src/vs/editor/test/common/model/modelDecorations.test.ts @@ -49,7 +49,7 @@ function addDecoration(model: Model, startLineNumber: number, startColumn: numbe }); } -function lineHasDecorations(model, lineNumber, decorations) { +function lineHasDecorations(model: Model, lineNumber: number, decorations: { start: number; end: number; className: string; }[]) { var lineDecorations = []; var decs = model.getLineDecorations(lineNumber); for (var i = 0, len = decs.length; i < len; i++) { @@ -62,11 +62,11 @@ function lineHasDecorations(model, lineNumber, decorations) { assert.deepEqual(lineDecorations, decorations, 'Line decorations'); } -function lineHasNoDecorations(model, lineNumber) { +function lineHasNoDecorations(model: Model, lineNumber: number) { lineHasDecorations(model, lineNumber, []); } -function lineHasDecoration(model, lineNumber, start, end, className) { +function lineHasDecoration(model: Model, lineNumber: number, start: number, end: number, className: string) { lineHasDecorations(model, lineNumber, [{ start: start, end: end, @@ -542,7 +542,7 @@ suite('deltaDecorations', () => { endColumn: 1 }, options: { - hoverMessage: ['hello1'] + hoverMessage: 'hello1' } }]); @@ -554,13 +554,13 @@ suite('deltaDecorations', () => { endColumn: 1 }, options: { - hoverMessage: ['hello2'] + hoverMessage: 'hello2' } }]); let actualDecoration = model.getDecorationOptions(ids[0]); - assert.equal(actualDecoration.hoverMessage[0], 'hello2'); + assert.equal(actualDecoration.hoverMessage, 'hello2'); model.dispose(); }); diff --git a/src/vs/editor/test/common/model/textModelWithTokens.test.ts b/src/vs/editor/test/common/model/textModelWithTokens.test.ts index 09ac2a2df07..6ac512096dd 100644 --- a/src/vs/editor/test/common/model/textModelWithTokens.test.ts +++ b/src/vs/editor/test/common/model/textModelWithTokens.test.ts @@ -240,7 +240,7 @@ suite('TextModelWithTokens - bracket matching', () => { [new Position(5, 5), new Range(5, 4, 5, 5), new Range(1, 11, 1, 12)], ]; - let isABracket = { 1: {}, 2: {}, 3: {}, 4: {}, 5: {} }; + let isABracket: { [lineNumber: number]: { [col: number]: boolean; }; } = { 1: {}, 2: {}, 3: {}, 4: {}, 5: {} }; for (let i = 0, len = brackets.length; i < len; i++) { let [testPos, b1, b2] = brackets[i]; isBracket2(model, testPos, [b1, b2]); @@ -250,7 +250,7 @@ suite('TextModelWithTokens - bracket matching', () => { for (let i = 1, len = model.getLineCount(); i <= len; i++) { let line = model.getLineContent(i); for (let j = 1, lenJ = line.length + 1; j <= lenJ; j++) { - if (!isABracket[i].hasOwnProperty(j)) { + if (!isABracket[i].hasOwnProperty(j)) { isNotABracket(model, i, j); } } diff --git a/src/vs/platform/contextkey/test/common/contextkey.test.ts b/src/vs/platform/contextkey/test/common/contextkey.test.ts index 84562268907..69f8bca0930 100644 --- a/src/vs/platform/contextkey/test/common/contextkey.test.ts +++ b/src/vs/platform/contextkey/test/common/contextkey.test.ts @@ -7,7 +7,13 @@ import * as assert from 'assert'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -const createContext = ctx => ({ getValue: key => ctx[key] }); +function createContext(ctx: any) { + return { + getValue: (key: string) => { + return ctx[key]; + } + }; +} suite('ContextKeyExpr', () => { test('ContextKeyExpr.equals', function () { diff --git a/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts b/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts index 64be8f6ad36..f5cc9fb7984 100644 --- a/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts +++ b/src/vs/platform/keybinding/test/common/abstractKeybindingService.test.ts @@ -20,7 +20,13 @@ import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKe import { OS } from 'vs/base/common/platform'; import { IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; -const createContext = ctx => ({ getValue: key => ctx[key] }); +function createContext(ctx: any) { + return { + getValue: (key: string) => { + return ctx[key]; + } + }; +} suite('AbstractKeybindingService', () => { diff --git a/src/vs/platform/keybinding/test/common/keybindingResolver.test.ts b/src/vs/platform/keybinding/test/common/keybindingResolver.test.ts index 13088ab90c2..dc22f50d3ce 100644 --- a/src/vs/platform/keybinding/test/common/keybindingResolver.test.ts +++ b/src/vs/platform/keybinding/test/common/keybindingResolver.test.ts @@ -12,7 +12,13 @@ import { ResolvedKeybindingItem } from 'vs/platform/keybinding/common/resolvedKe import { USLayoutResolvedKeybinding } from 'vs/platform/keybinding/common/usLayoutResolvedKeybinding'; import { OS } from 'vs/base/common/platform'; -const createContext = ctx => ({ getValue: key => ctx[key] }); +function createContext(ctx: any) { + return { + getValue: (key: string) => { + return ctx[key]; + } + }; +} suite('KeybindingResolver', () => { diff --git a/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts b/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts index 9733c62707f..58359b3d352 100644 --- a/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts +++ b/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts @@ -93,7 +93,6 @@ export class KeybindingEditorRenderer extends Disposable { constructor( private _editor: ICodeEditor, - @IKeybindingService private _keybindingService: IKeybindingService, @IInstantiationService private _instantiationService: IInstantiationService ) { super(); diff --git a/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts b/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts index dacd436e194..fdb96d9beaa 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts +++ b/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts @@ -156,7 +156,7 @@ class SnippetsService implements ISnippetsService { registerSingleton(ISnippetsService, SnippetsService); export interface ISimpleModel { - getLineContent(lineNumber): string; + getLineContent(lineNumber: number): string; } export function getNonWhitespacePrefix(model: ISimpleModel, position: Position): string { diff --git a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts index c7c61fc9d37..9e6f12e696c 100644 --- a/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts +++ b/src/vs/workbench/services/keybinding/electron-browser/keybindingService.ts @@ -266,10 +266,10 @@ export class WorkbenchKeybindingService extends AbstractKeybindingService { @IContextKeyService contextKeyService: IContextKeyService, @ICommandService commandService: ICommandService, @ITelemetryService private telemetryService: ITelemetryService, - @IMessageService private messageService: IMessageService, + @IMessageService messageService: IMessageService, @IEnvironmentService environmentService: IEnvironmentService, @IStatusbarService statusBarService: IStatusbarService, - @IConfigurationService private configurationService: IConfigurationService + @IConfigurationService configurationService: IConfigurationService ) { super(contextKeyService, commandService, messageService, statusBarService); diff --git a/src/vs/workbench/services/keybinding/test/keyboardMapperTestUtils.ts b/src/vs/workbench/services/keybinding/test/keyboardMapperTestUtils.ts index ae6d665728b..d79895b63f0 100644 --- a/src/vs/workbench/services/keybinding/test/keyboardMapperTestUtils.ts +++ b/src/vs/workbench/services/keybinding/test/keyboardMapperTestUtils.ts @@ -88,7 +88,7 @@ export function readRawMapping(file: string): TPromise { let contents = buff.toString(); let func = new Function('define', contents); let rawMappings: T = null; - func(function (value) { + func(function (value: T) { rawMappings = value; }); return rawMappings; From 95d5107965cbf6d8672a24f52569ce11ebb14a7c Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sat, 20 May 2017 17:23:39 +0200 Subject: [PATCH 0715/1164] Fixes #16332: Do not break at offsets that would lead to overflows --- .../common/viewModel/characterHardWrappingLineMapper.ts | 4 ++-- .../common/viewModel/characterHardWrappingLineMapper.test.ts | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/common/viewModel/characterHardWrappingLineMapper.ts b/src/vs/editor/common/viewModel/characterHardWrappingLineMapper.ts index 39d5d618325..d301593e8c1 100644 --- a/src/vs/editor/common/viewModel/characterHardWrappingLineMapper.ts +++ b/src/vs/editor/common/viewModel/characterHardWrappingLineMapper.ts @@ -162,13 +162,13 @@ export class CharacterHardWrappingLineMapperFactory implements ILineMapperFactor let breakBeforeOffset: number; let restoreVisibleColumnFrom: number; - if (niceBreakOffset !== -1) { + if (niceBreakOffset !== -1 && niceBreakVisibleColumn <= breakingColumn) { // We will break before `niceBreakLastOffset` breakBeforeOffset = niceBreakOffset; restoreVisibleColumnFrom = niceBreakVisibleColumn; - } else if (obtrusiveBreakOffset !== -1) { + } else if (obtrusiveBreakOffset !== -1 && obtrusiveBreakVisibleColumn <= breakingColumn) { // We will break before `obtrusiveBreakLastOffset` breakBeforeOffset = obtrusiveBreakOffset; diff --git a/src/vs/editor/test/common/viewModel/characterHardWrappingLineMapper.test.ts b/src/vs/editor/test/common/viewModel/characterHardWrappingLineMapper.test.ts index 54c7b2b28a6..614295413ff 100644 --- a/src/vs/editor/test/common/viewModel/characterHardWrappingLineMapper.test.ts +++ b/src/vs/editor/test/common/viewModel/characterHardWrappingLineMapper.test.ts @@ -101,4 +101,9 @@ suite('Editor ViewModel - CharacterHardWrappingLineMapper', () => { let factory = new CharacterHardWrappingLineMapperFactory('', ' ', ''); assertLineMapping(factory, 4, 38, ' *123456789012345678901234567890123456|7890', WrappingIndent.Same); }); + + test('issue #16332: Scroll bar overlaying on top of text', () => { + let factory = new CharacterHardWrappingLineMapperFactory('', ' ', ''); + assertLineMapping(factory, 4, 24, 'a/ very/long/line/of/tex|t/that/expands/beyon|d/your/typical/line/|of/code/', WrappingIndent.Indent); + }); }); From c671df07d63756f57533d98fe97c04e0c5fd2d75 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Sat, 20 May 2017 10:29:14 -0700 Subject: [PATCH 0716/1164] Move focus to docs only if docs is open --- src/vs/editor/contrib/suggest/browser/suggestWidget.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 51f12cd01a8..ac95a24f608 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -488,6 +488,7 @@ export class SuggestWidget implements IContentWidget, IDelegate this.listElement.style.borderColor = borderColor.toString(); this.details.element.style.borderColor = borderColor.toString(); this.messageElement.style.borderColor = borderColor.toString(); + this.detailsBorderColor = borderColor.toString(); } let focusBorderColor = theme.getColor(focusBorder); if (focusBorderColor) { @@ -795,7 +796,8 @@ export class SuggestWidget implements IContentWidget, IDelegate if (this.detailsBorderColor) { this.details.element.style.borderColor = this.detailsBorderColor; } - } else if (this.state === State.Open) { + } else if (this.state === State.Open + && this.storageService.getBoolean('expandSuggestionDocs', StorageScope.GLOBAL, false)) { this.setState(State.Details); if (this.detailsFocusBorderColor) { this.details.element.style.borderColor = this.detailsFocusBorderColor; From cef4a07203146d7335e58fe3f5394a4c0aa0d328 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sat, 20 May 2017 21:14:57 +0200 Subject: [PATCH 0717/1164] Optimize allocation and comparison of static model decoration options --- .../editor/browser/widget/diffEditorWidget.ts | 109 ++++++++------ src/vs/editor/common/editorCommon.ts | 6 +- .../editor/common/model/editableTextModel.ts | 10 +- .../common/model/textModelWithDecorations.ts | 135 ++++++++++-------- .../common/viewModel/splitLinesCollection.ts | 4 +- .../bracketMatching/common/bracketMatching.ts | 5 +- .../contrib/codelens/browser/codelens.ts | 5 +- src/vs/editor/contrib/dnd/browser/dnd.ts | 7 +- .../contrib/find/common/findController.ts | 28 ++-- .../contrib/find/common/findDecorations.ts | 62 ++++---- .../contrib/folding/common/foldingModel.ts | 35 +++-- .../hover/browser/modesContentHover.ts | 11 +- .../inPlaceReplace/common/inPlaceReplace.ts | 5 +- src/vs/editor/contrib/links/browser/links.ts | 40 +++--- .../quickOpen/browser/editorQuickOpen.ts | 11 +- .../browser/referencesWidget.ts | 5 +- .../contrib/snippet/browser/snippetSession.ts | 11 +- .../wordHighlighter/common/wordHighlighter.ts | 62 +++++--- .../contrib/zoneWidget/browser/zoneWidget.ts | 3 +- src/vs/monaco.d.ts | 4 - .../common/editor/rangeDecorations.ts | 20 ++- .../browser/preferencesRenderers.ts | 11 +- .../electron-browser/dirtydiffDecorator.ts | 13 +- .../parts/search/common/searchModel.ts | 35 +++-- 24 files changed, 383 insertions(+), 254 deletions(-) diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index 98c20984b8e..c655b958451 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -36,6 +36,7 @@ import { scrollbarShadow, diffInserted, diffRemoved, defaultInsertColor, default import { Color } from 'vs/base/common/color'; import { OverviewRulerZone } from 'vs/editor/common/view/overviewZoneManager'; import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; interface IEditorDiffDecorations { decorations: editorCommon.IModelDeltaDecoration[]; @@ -1373,6 +1374,61 @@ abstract class ViewZonesComputer { protected abstract _produceModifiedFromDiff(lineChange: editorCommon.ILineChange, lineChangeOriginalLength: number, lineChangeModifiedLength: number): IMyViewZone; } +function createDecoration(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number, options: ModelDecorationOptions) { + return { + range: new Range(startLineNumber, startColumn, endLineNumber, endColumn), + options: options + }; +} + +const DECORATIONS = { + + charDelete: ModelDecorationOptions.register({ + className: 'char-delete' + }), + charDeleteWholeLine: ModelDecorationOptions.register({ + className: 'char-delete', + isWholeLine: true + }), + + charInsert: ModelDecorationOptions.register({ + className: 'char-insert' + }), + charInsertWholeLine: ModelDecorationOptions.register({ + className: 'char-insert', + isWholeLine: true + }), + + lineInsert: ModelDecorationOptions.register({ + className: 'line-insert', + marginClassName: 'line-insert', + isWholeLine: true + }), + lineInsertWithSign: ModelDecorationOptions.register({ + className: 'line-insert', + linesDecorationsClassName: 'insert-sign', + marginClassName: 'line-insert', + isWholeLine: true + }), + + lineDelete: ModelDecorationOptions.register({ + className: 'line-delete', + marginClassName: 'line-delete', + isWholeLine: true + }), + lineDeleteWithSign: ModelDecorationOptions.register({ + className: 'line-delete', + linesDecorationsClassName: 'delete-sign', + marginClassName: 'line-delete', + isWholeLine: true + + }), + lineDeleteMargin: ModelDecorationOptions.register({ + marginClassName: 'line-delete', + }) + +}; + class DiffEdtorWidgetSideBySide extends DiffEditorWidgetStyle implements IDiffEditorWidgetStyle, IVerticalSashLayoutProvider { static MINIMUM_EDITOR_WIDTH = 100; @@ -1503,15 +1559,10 @@ class DiffEdtorWidgetSideBySide extends DiffEditorWidgetStyle implements IDiffEd if (isChangeOrDelete(lineChange)) { result.decorations.push({ range: new Range(lineChange.originalStartLineNumber, 1, lineChange.originalEndLineNumber, Number.MAX_VALUE), - options: { - className: 'line-delete', - linesDecorationsClassName: renderIndicators ? 'delete-sign' : undefined, - marginClassName: 'line-delete', - isWholeLine: true - } + options: (renderIndicators ? DECORATIONS.lineDeleteWithSign : DECORATIONS.lineDelete) }); if (!isChangeOrInsert(lineChange) || !lineChange.charChanges) { - result.decorations.push(createDecoration(lineChange.originalStartLineNumber, 1, lineChange.originalEndLineNumber, Number.MAX_VALUE, 'char-delete', true)); + result.decorations.push(createDecoration(lineChange.originalStartLineNumber, 1, lineChange.originalEndLineNumber, Number.MAX_VALUE, DECORATIONS.charDeleteWholeLine)); } let color = this._removeColor.toString(); @@ -1544,10 +1595,10 @@ class DiffEdtorWidgetSideBySide extends DiffEditorWidgetStyle implements IDiffEd } else { endColumn = originalModel.getLineLastNonWhitespaceColumn(lineNumber); } - result.decorations.push(createDecoration(lineNumber, startColumn, lineNumber, endColumn, 'char-delete', false)); + result.decorations.push(createDecoration(lineNumber, startColumn, lineNumber, endColumn, DECORATIONS.charDelete)); } } else { - result.decorations.push(createDecoration(charChange.originalStartLineNumber, charChange.originalStartColumn, charChange.originalEndLineNumber, charChange.originalEndColumn, 'char-delete', false)); + result.decorations.push(createDecoration(charChange.originalStartLineNumber, charChange.originalStartColumn, charChange.originalEndLineNumber, charChange.originalEndColumn, DECORATIONS.charDelete)); } } } @@ -1574,15 +1625,10 @@ class DiffEdtorWidgetSideBySide extends DiffEditorWidgetStyle implements IDiffEd result.decorations.push({ range: new Range(lineChange.modifiedStartLineNumber, 1, lineChange.modifiedEndLineNumber, Number.MAX_VALUE), - options: { - className: 'line-insert', - linesDecorationsClassName: renderIndicators ? 'insert-sign' : undefined, - marginClassName: 'line-insert', - isWholeLine: true - } + options: (renderIndicators ? DECORATIONS.lineInsertWithSign : DECORATIONS.lineInsert) }); if (!isChangeOrDelete(lineChange) || !lineChange.charChanges) { - result.decorations.push(createDecoration(lineChange.modifiedStartLineNumber, 1, lineChange.modifiedEndLineNumber, Number.MAX_VALUE, 'char-insert', true)); + result.decorations.push(createDecoration(lineChange.modifiedStartLineNumber, 1, lineChange.modifiedEndLineNumber, Number.MAX_VALUE, DECORATIONS.charInsertWholeLine)); } let color = this._insertColor.toString(); result.overviewZones.push(new OverviewRulerZone( @@ -1613,10 +1659,10 @@ class DiffEdtorWidgetSideBySide extends DiffEditorWidgetStyle implements IDiffEd } else { endColumn = modifiedModel.getLineLastNonWhitespaceColumn(lineNumber); } - result.decorations.push(createDecoration(lineNumber, startColumn, lineNumber, endColumn, 'char-insert', false)); + result.decorations.push(createDecoration(lineNumber, startColumn, lineNumber, endColumn, DECORATIONS.charInsert)); } } else { - result.decorations.push(createDecoration(charChange.modifiedStartLineNumber, charChange.modifiedStartColumn, charChange.modifiedEndLineNumber, charChange.modifiedEndColumn, 'char-insert', false)); + result.decorations.push(createDecoration(charChange.modifiedStartLineNumber, charChange.modifiedStartColumn, charChange.modifiedEndLineNumber, charChange.modifiedEndColumn, DECORATIONS.charInsert)); } } } @@ -1700,9 +1746,7 @@ class DiffEdtorWidgetInline extends DiffEditorWidgetStyle implements IDiffEditor if (isChangeOrDelete(lineChange)) { result.decorations.push({ range: new Range(lineChange.originalStartLineNumber, 1, lineChange.originalEndLineNumber, Number.MAX_VALUE), - options: { - marginClassName: 'line-delete', - } + options: DECORATIONS.lineDeleteMargin }); let color = this._removeColor.toString(); @@ -1737,12 +1781,7 @@ class DiffEdtorWidgetInline extends DiffEditorWidgetStyle implements IDiffEditor if (isChangeOrInsert(lineChange)) { result.decorations.push({ range: new Range(lineChange.modifiedStartLineNumber, 1, lineChange.modifiedEndLineNumber, Number.MAX_VALUE), - options: { - className: 'line-insert', - linesDecorationsClassName: renderIndicators ? 'insert-sign' : undefined, - marginClassName: 'line-insert', - isWholeLine: true - } + options: (renderIndicators ? DECORATIONS.lineInsertWithSign : DECORATIONS.lineInsert) }); let color = this._insertColor.toString(); @@ -1774,15 +1813,15 @@ class DiffEdtorWidgetInline extends DiffEditorWidgetStyle implements IDiffEditor } else { endColumn = modifiedModel.getLineLastNonWhitespaceColumn(lineNumber); } - result.decorations.push(createDecoration(lineNumber, startColumn, lineNumber, endColumn, 'char-insert', false)); + result.decorations.push(createDecoration(lineNumber, startColumn, lineNumber, endColumn, DECORATIONS.charInsert)); } } else { - result.decorations.push(createDecoration(charChange.modifiedStartLineNumber, charChange.modifiedStartColumn, charChange.modifiedEndLineNumber, charChange.modifiedEndColumn, 'char-insert', false)); + result.decorations.push(createDecoration(charChange.modifiedStartLineNumber, charChange.modifiedStartColumn, charChange.modifiedEndLineNumber, charChange.modifiedEndColumn, DECORATIONS.charInsert)); } } } } else { - result.decorations.push(createDecoration(lineChange.modifiedStartLineNumber, 1, lineChange.modifiedEndLineNumber, Number.MAX_VALUE, 'char-insert', true)); + result.decorations.push(createDecoration(lineChange.modifiedStartLineNumber, 1, lineChange.modifiedEndLineNumber, Number.MAX_VALUE, DECORATIONS.charInsertWholeLine)); } } } @@ -1924,16 +1963,6 @@ function isChangeOrDelete(lineChange: editorCommon.IChange): boolean { return lineChange.originalEndLineNumber > 0; } -function createDecoration(startLineNumber: number, startColumn: number, endLineNumber: number, endColumn: number, className: string, isWholeLine: boolean) { - return { - range: new Range(startLineNumber, startColumn, endLineNumber, endColumn), - options: { - className: className, - isWholeLine: isWholeLine - } - }; -} - function createFakeLinesDiv(): HTMLElement { let r = document.createElement('div'); r.className = 'diagonal-fill'; diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index c2cb21c2c52..9a0674a5f28 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -89,11 +89,7 @@ export interface IModelDecorationOptions { * Always render the decoration (even when the range it encompasses is collapsed). * @internal */ - showIfCollapsed?: boolean; - /** - * @deprecated : Use `overviewRuler` instead - */ - showInOverviewRuler?: string; + readonly showIfCollapsed?: boolean; /** * If set, render this decoration in the overview ruler. */ diff --git a/src/vs/editor/common/model/editableTextModel.ts b/src/vs/editor/common/model/editableTextModel.ts index 358a30d6330..265d8486fa9 100644 --- a/src/vs/editor/common/model/editableTextModel.ts +++ b/src/vs/editor/common/model/editableTextModel.ts @@ -8,7 +8,7 @@ import { Range, IRange } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { EditStack } from 'vs/editor/common/model/editStack'; import { ILineEdit, LineMarker, ModelLine, MarkersTracker } from 'vs/editor/common/model/modelLine'; -import { TextModelWithDecorations } from 'vs/editor/common/model/textModelWithDecorations'; +import { TextModelWithDecorations, ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; import * as strings from 'vs/base/common/strings'; import { Selection } from 'vs/editor/common/core/selection'; import { Position } from 'vs/editor/common/core/position'; @@ -813,13 +813,15 @@ export class EditableTextModel extends TextModelWithDecorations implements edito if (range) { this._hasEditableRange = true; - this._editableRangeId = changeAccessor.addDecoration(range, { - stickiness: editorCommon.TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges - }); + this._editableRangeId = changeAccessor.addDecoration(range, EditableTextModel._DECORATION_OPTION); } }); } + private static _DECORATION_OPTION = ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges + }); + public hasEditableRange(): boolean { return this._hasEditableRange; } diff --git a/src/vs/editor/common/model/textModelWithDecorations.ts b/src/vs/editor/common/model/textModelWithDecorations.ts index 8f7d1a1b660..b37aaf892df 100644 --- a/src/vs/editor/common/model/textModelWithDecorations.ts +++ b/src/vs/editor/common/model/textModelWithDecorations.ts @@ -839,31 +839,81 @@ function cleanClassName(className: string): string { return className.replace(/[^a-z0-9\-]/gi, ' '); } +export class ModelDecorationOverviewRulerOptions implements editorCommon.IModelDecorationOverviewRulerOptions { + readonly color: string; + readonly darkColor: string; + readonly hcColor: string; + readonly position: editorCommon.OverviewRulerLane; + + constructor(options: editorCommon.IModelDecorationOverviewRulerOptions) { + this.color = strings.empty; + this.darkColor = strings.empty; + this.hcColor = strings.empty; + this.position = editorCommon.OverviewRulerLane.Center; + + if (options && options.color) { + this.color = options.color; + } + if (options && options.darkColor) { + this.darkColor = options.darkColor; + this.hcColor = options.darkColor; + } + if (options && options.hcColor) { + this.hcColor = options.hcColor; + } + if (options && options.hasOwnProperty('position')) { + this.position = options.position; + } + } + + public equals(other: ModelDecorationOverviewRulerOptions): boolean { + return ( + this.color === other.color + && this.darkColor === other.darkColor + && this.hcColor === other.hcColor + && this.position === other.position + ); + } +} + +let lastStaticId = 0; + export class ModelDecorationOptions implements editorCommon.IModelDecorationOptions { - stickiness: editorCommon.TrackedRangeStickiness; - className: string; - hoverMessage: MarkedString | MarkedString[]; - glyphMarginHoverMessage: MarkedString | MarkedString[]; - isWholeLine: boolean; - showIfCollapsed: boolean; - showInOverviewRuler: string; - overviewRuler: editorCommon.IModelDecorationOverviewRulerOptions; - glyphMarginClassName: string; - linesDecorationsClassName: string; - marginClassName: string; - inlineClassName: string; - beforeContentClassName: string; - afterContentClassName: string; + public static EMPTY = ModelDecorationOptions.register({}); - constructor(options: editorCommon.IModelDecorationOptions) { + public static register(options: editorCommon.IModelDecorationOptions): ModelDecorationOptions { + return new ModelDecorationOptions(++lastStaticId, options); + } + + public static createDynamic(options: editorCommon.IModelDecorationOptions): ModelDecorationOptions { + return new ModelDecorationOptions(0, options); + } + + readonly staticId: number; + readonly stickiness: editorCommon.TrackedRangeStickiness; + readonly className: string; + readonly hoverMessage: MarkedString | MarkedString[]; + readonly glyphMarginHoverMessage: MarkedString | MarkedString[]; + readonly isWholeLine: boolean; + readonly showIfCollapsed: boolean; + readonly overviewRuler: ModelDecorationOverviewRulerOptions; + readonly glyphMarginClassName: string; + readonly linesDecorationsClassName: string; + readonly marginClassName: string; + readonly inlineClassName: string; + readonly beforeContentClassName: string; + readonly afterContentClassName: string; + + private constructor(staticId: number, options: editorCommon.IModelDecorationOptions) { + this.staticId = staticId; this.stickiness = options.stickiness || editorCommon.TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges; this.className = options.className ? cleanClassName(options.className) : strings.empty; this.hoverMessage = options.hoverMessage || []; this.glyphMarginHoverMessage = options.glyphMarginHoverMessage || strings.empty; this.isWholeLine = options.isWholeLine || false; this.showIfCollapsed = options.showIfCollapsed || false; - this.overviewRuler = _normalizeOverviewRulerOptions(options.overviewRuler, options.showInOverviewRuler); + this.overviewRuler = new ModelDecorationOverviewRulerOptions(options.overviewRuler); this.glyphMarginClassName = options.glyphMarginClassName ? cleanClassName(options.glyphMarginClassName) : strings.empty; this.linesDecorationsClassName = options.linesDecorationsClassName ? cleanClassName(options.linesDecorationsClassName) : strings.empty; this.marginClassName = options.marginClassName ? cleanClassName(options.marginClassName) : strings.empty; @@ -872,21 +922,16 @@ export class ModelDecorationOptions implements editorCommon.IModelDecorationOpti this.afterContentClassName = options.afterContentClassName ? cleanClassName(options.afterContentClassName) : strings.empty; } - private static _overviewRulerEquals(a: editorCommon.IModelDecorationOverviewRulerOptions, b: editorCommon.IModelDecorationOverviewRulerOptions): boolean { - return ( - a.color === b.color - && a.position === b.position - && a.darkColor === b.darkColor - ); - } - public equals(other: ModelDecorationOptions): boolean { + if (this.staticId > 0 || other.staticId > 0) { + return this.staticId === other.staticId; + } + return ( this.stickiness === other.stickiness && this.className === other.className && this.isWholeLine === other.isWholeLine && this.showIfCollapsed === other.showIfCollapsed - && this.showInOverviewRuler === other.showInOverviewRuler && this.glyphMarginClassName === other.glyphMarginClassName && this.linesDecorationsClassName === other.linesDecorationsClassName && this.marginClassName === other.marginClassName @@ -895,7 +940,7 @@ export class ModelDecorationOptions implements editorCommon.IModelDecorationOpti && this.afterContentClassName === other.afterContentClassName && markedStringsEquals(this.hoverMessage, other.hoverMessage) && markedStringsEquals(this.glyphMarginHoverMessage, other.glyphMarginHoverMessage) - && ModelDecorationOptions._overviewRulerEquals(this.overviewRuler, other.overviewRuler) + && this.overviewRuler.equals(other.overviewRuler) ); } } @@ -914,40 +959,8 @@ class ModelDeltaDecoration implements editorCommon.IModelDeltaDecoration { } function _normalizeOptions(options: editorCommon.IModelDecorationOptions): ModelDecorationOptions { - return new ModelDecorationOptions(options); -} - -class ModelDecorationOverviewRulerOptions implements editorCommon.IModelDecorationOverviewRulerOptions { - color: string; - darkColor: string; - hcColor: string; - position: editorCommon.OverviewRulerLane; - - constructor(options: editorCommon.IModelDecorationOverviewRulerOptions, legacyShowInOverviewRuler: string) { - this.color = strings.empty; - this.darkColor = strings.empty; - this.hcColor = strings.empty; - this.position = editorCommon.OverviewRulerLane.Center; - - if (legacyShowInOverviewRuler) { - this.color = legacyShowInOverviewRuler; - } - if (options && options.color) { - this.color = options.color; - } - if (options && options.darkColor) { - this.darkColor = options.darkColor; - this.hcColor = options.darkColor; - } - if (options && options.hcColor) { - this.hcColor = options.hcColor; - } - if (options && options.hasOwnProperty('position')) { - this.position = options.position; - } + if (options instanceof ModelDecorationOptions) { + return options; } -} - -function _normalizeOverviewRulerOptions(options: editorCommon.IModelDecorationOverviewRulerOptions, legacyShowInOverviewRuler: string = null): editorCommon.IModelDecorationOverviewRulerOptions { - return new ModelDecorationOverviewRulerOptions(options, legacyShowInOverviewRuler); + return ModelDecorationOptions.createDynamic(options); } diff --git a/src/vs/editor/common/viewModel/splitLinesCollection.ts b/src/vs/editor/common/viewModel/splitLinesCollection.ts index 726df79208e..72caeb160e8 100644 --- a/src/vs/editor/common/viewModel/splitLinesCollection.ts +++ b/src/vs/editor/common/viewModel/splitLinesCollection.ts @@ -12,6 +12,7 @@ import { PrefixSumComputerWithCache } from 'vs/editor/common/viewModel/prefixSum import { ViewLineData } from 'vs/editor/common/viewModel/viewModel'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { WrappingIndent } from 'vs/editor/common/config/editorOptions'; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; export class OutputPosition { _outputPositionBrand: void; @@ -190,8 +191,7 @@ export class SplitLinesCollection { for (let i = 0; i < newRanges.length; i++) { newDecorations.push({ range: newRanges[i], - options: { - } + options: ModelDecorationOptions.EMPTY }); } diff --git a/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts b/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts index 0f0a0592836..3851de0c02a 100644 --- a/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts +++ b/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts @@ -16,6 +16,7 @@ import { editorAction, commonEditorContribution, ServicesAccessor, EditorAction import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { registerThemingParticipant } from "vs/platform/theme/common/themeService"; import { editorBracketMatchBackground, editorBracketMatchBorder } from "vs/editor/common/view/editorColorRegistry"; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; @editorAction class SelectBracketAction extends EditorAction { @@ -127,10 +128,10 @@ export class BracketMatchingController extends Disposable implements editorCommo } } - private static _DECORATION_OPTIONS: editorCommon.IModelDecorationOptions = { + private static _DECORATION_OPTIONS = ModelDecorationOptions.register({ stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, className: 'bracket-match' - }; + }); private _updateBrackets(): void { if (!this._matchBrackets) { diff --git a/src/vs/editor/contrib/codelens/browser/codelens.ts b/src/vs/editor/contrib/codelens/browser/codelens.ts index 428fa8ba7ae..84fcda05eb1 100644 --- a/src/vs/editor/contrib/codelens/browser/codelens.ts +++ b/src/vs/editor/contrib/codelens/browser/codelens.ts @@ -25,6 +25,7 @@ import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOption import { editorCodeLensForeground } from "vs/editor/common/view/editorColorRegistry"; import { registerThemingParticipant } from "vs/platform/theme/common/themeService"; import { editorActiveLinkForeground } from "vs/platform/theme/common/colorRegistry"; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; class CodeLensViewZone implements editorBrowser.IViewZone { @@ -250,7 +251,7 @@ class CodeLens { helper.addDecoration({ range: codeLensData.symbol.range, - options: {} + options: ModelDecorationOptions.EMPTY }, id => this._decorationIds[i] = id); // the range contains all lenses on this line @@ -297,7 +298,7 @@ class CodeLens { this._data.forEach((codeLensData, i) => { helper.addDecoration({ range: codeLensData.symbol.range, - options: {} + options: ModelDecorationOptions.EMPTY }, id => this._decorationIds[i] = id); }); } diff --git a/src/vs/editor/contrib/dnd/browser/dnd.ts b/src/vs/editor/contrib/dnd/browser/dnd.ts index 49a944af722..e305c8af11a 100644 --- a/src/vs/editor/contrib/dnd/browser/dnd.ts +++ b/src/vs/editor/contrib/dnd/browser/dnd.ts @@ -17,6 +17,7 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { DragAndDropCommand } from '../common/dragAndDropCommand'; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; @editorContribution export class DragAndDropController implements editorCommon.IEditorContribution { @@ -161,12 +162,16 @@ export class DragAndDropController implements editorCommon.IEditorContribution { this._mouseDown = false; } + private static _DECORATION_OPTIONS = ModelDecorationOptions.register({ + className: 'dnd-target' + }); + public showAt(position: Position): void { this._editor.changeDecorations(changeAccessor => { let newDecorations: editorCommon.IModelDeltaDecoration[] = []; newDecorations.push({ range: new Range(position.lineNumber, position.column, position.lineNumber, position.column), - options: { className: 'dnd-target' } + options: DragAndDropController._DECORATION_OPTIONS }); this._dndDecorationIds = changeAccessor.deltaDecorations(this._dndDecorationIds, newDecorations); diff --git a/src/vs/editor/contrib/find/common/findController.ts b/src/vs/editor/contrib/find/common/findController.ts index cef058f8640..c9fbee3b8a2 100644 --- a/src/vs/editor/contrib/find/common/findController.ts +++ b/src/vs/editor/contrib/find/common/findController.ts @@ -21,6 +21,7 @@ import { RunOnceScheduler, Delayer } from 'vs/base/common/async'; import { CursorChangeReason, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; export const enum FindStartFocusAction { NoFocusChange, @@ -1044,22 +1045,29 @@ export class SelectionHighlighter extends Disposable implements editorCommon.IEd let decorations = matches.map(r => { return { range: r, - options: { - stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, - className: 'selectionHighlight', - // Show in overviewRuler only if model has no semantic highlighting - overviewRuler: (hasFindOccurences ? undefined : { - color: '#A0A0A0', - darkColor: '#A0A0A0', - position: editorCommon.OverviewRulerLane.Center - }) - } + // Show in overviewRuler only if model has no semantic highlighting + options: (hasFindOccurences ? SelectionHighlighter._SELECTION_HIGHLIGHT : SelectionHighlighter._SELECTION_HIGHLIGHT_OVERVIEW) }; }); this.decorations = this.editor.deltaDecorations(this.decorations, decorations); } + private static _SELECTION_HIGHLIGHT_OVERVIEW = ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + className: 'selectionHighlight', + overviewRuler: { + color: '#A0A0A0', + darkColor: '#A0A0A0', + position: editorCommon.OverviewRulerLane.Center + } + }); + + private static _SELECTION_HIGHLIGHT = ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + className: 'selectionHighlight', + }); + public dispose(): void { this.removeDecorations(); super.dispose(); diff --git a/src/vs/editor/contrib/find/common/findDecorations.ts b/src/vs/editor/contrib/find/common/findDecorations.ts index 30fcf8f68e7..2a80081cf0a 100644 --- a/src/vs/editor/contrib/find/common/findDecorations.ts +++ b/src/vs/editor/contrib/find/common/findDecorations.ts @@ -8,6 +8,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; export class FindDecorations implements IDisposable { @@ -105,7 +106,7 @@ export class FindDecorations implements IDisposable { } if (newCurrentDecorationId !== null) { let rng = this._editor.getModel().getDecorationRange(newCurrentDecorationId); - this._rangeHighlightDecorationId = changeAccessor.addDecoration(rng, FindDecorations.createRangeHighlightDecoration()); + this._rangeHighlightDecorationId = changeAccessor.addDecoration(rng, FindDecorations._RANGE_HIGHLIGHT_DECORATION); } }); } @@ -123,7 +124,7 @@ export class FindDecorations implements IDisposable { if (findScope) { newDecorations.unshift({ range: findScope, - options: FindDecorations.createFindScopeDecorationOptions() + options: FindDecorations._FIND_SCOPE_DECORATION }); } let tmpDecorations = this._editor.deltaDecorations(this._allDecorations(), newDecorations); @@ -150,31 +151,40 @@ export class FindDecorations implements IDisposable { return result; } - private static createFindMatchDecorationOptions(isCurrent: boolean): editorCommon.IModelDecorationOptions { - return { - stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, - className: isCurrent ? 'currentFindMatch' : 'findMatch', - showIfCollapsed: true, - overviewRuler: { - color: 'rgba(246, 185, 77, 0.7)', - darkColor: 'rgba(246, 185, 77, 0.7)', - position: editorCommon.OverviewRulerLane.Center - } - }; + private static createFindMatchDecorationOptions(isCurrent: boolean): ModelDecorationOptions { + return (isCurrent ? this._CURRENT_FIND_MATCH_DECORATION : this._FIND_MATCH_DECORATION); } - private static createRangeHighlightDecoration(): editorCommon.IModelDecorationOptions { - return { - stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, - className: 'rangeHighlight', - isWholeLine: true - }; - } + private static _CURRENT_FIND_MATCH_DECORATION = ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + className: 'currentFindMatch', + showIfCollapsed: true, + overviewRuler: { + color: 'rgba(246, 185, 77, 0.7)', + darkColor: 'rgba(246, 185, 77, 0.7)', + position: editorCommon.OverviewRulerLane.Center + } + }); - private static createFindScopeDecorationOptions(): editorCommon.IModelDecorationOptions { - return { - className: 'findScope', - isWholeLine: true - }; - } + private static _FIND_MATCH_DECORATION = ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + className: 'findMatch', + showIfCollapsed: true, + overviewRuler: { + color: 'rgba(246, 185, 77, 0.7)', + darkColor: 'rgba(246, 185, 77, 0.7)', + position: editorCommon.OverviewRulerLane.Center + } + }); + + private static _RANGE_HIGHLIGHT_DECORATION = ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + className: 'rangeHighlight', + isWholeLine: true + }); + + private static _FIND_SCOPE_DECORATION = ModelDecorationOptions.register({ + className: 'findScope', + isWholeLine: true + }); } diff --git a/src/vs/editor/contrib/folding/common/foldingModel.ts b/src/vs/editor/contrib/folding/common/foldingModel.ts index fe771764da6..128f450b087 100644 --- a/src/vs/editor/contrib/folding/common/foldingModel.ts +++ b/src/vs/editor/contrib/folding/common/foldingModel.ts @@ -5,6 +5,7 @@ import * as editorCommon from 'vs/editor/common/editorCommon'; import { Range } from 'vs/editor/common/core/range'; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; export interface IFoldingRange { startLineNumber: number; @@ -68,25 +69,31 @@ export class CollapsibleRegion { return null; } - private getVisualDecorationOptions(): editorCommon.IModelDecorationOptions { + private static _COLLAPSED_VISUAL_DECORATION = ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + afterContentClassName: 'inline-folded', + linesDecorationsClassName: 'folding collapsed' + }); + + private static _EXPANDED_VISUAL_DECORATION = ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + linesDecorationsClassName: 'folding' + }); + + private getVisualDecorationOptions(): ModelDecorationOptions { if (this._isCollapsed) { - return { - stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, - afterContentClassName: 'inline-folded', - linesDecorationsClassName: 'folding collapsed' - }; + return CollapsibleRegion._COLLAPSED_VISUAL_DECORATION; } else { - return { - stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, - linesDecorationsClassName: 'folding' - }; + return CollapsibleRegion._EXPANDED_VISUAL_DECORATION; } } - private getRangeDecorationOptions(): editorCommon.IModelDecorationOptions { - return { - stickiness: editorCommon.TrackedRangeStickiness.GrowsOnlyWhenTypingBefore - }; + private static _RANGE_DECORATION = ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.GrowsOnlyWhenTypingBefore + }); + + private getRangeDecorationOptions(): ModelDecorationOptions { + return CollapsibleRegion._RANGE_DECORATION; } public update(newRange: IFoldingRange, model: editorCommon.IModel, changeAccessor: editorCommon.IModelDecorationsChangeAccessor): void { diff --git a/src/vs/editor/contrib/hover/browser/modesContentHover.ts b/src/vs/editor/contrib/hover/browser/modesContentHover.ts index 6c9d4105c27..636180c1a66 100644 --- a/src/vs/editor/contrib/hover/browser/modesContentHover.ts +++ b/src/vs/editor/contrib/hover/browser/modesContentHover.ts @@ -22,6 +22,7 @@ import { getHover } from '../common/hover'; import { HoverOperation, IHoverComputer } from './hoverOperation'; import { ContentHoverWidget } from './hoverWidgets'; import { textToMarkedString, MarkedString } from 'vs/base/common/htmlContent'; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; class ModesContentComputer implements IHoverComputer { @@ -274,10 +275,12 @@ export class ModesContentHoverWidget extends ContentHoverWidget { this._isChangingDecorations = true; this._highlightDecorations = this._editor.deltaDecorations(this._highlightDecorations, [{ range: highlightRange, - options: { - className: 'hoverHighlight' - } + options: ModesContentHoverWidget._DECORATION_OPTIONS }]); this._isChangingDecorations = false; } -} \ No newline at end of file + + private static _DECORATION_OPTIONS = ModelDecorationOptions.register({ + className: 'hoverHighlight' + }); +} diff --git a/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.ts b/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.ts index 773b69e156e..874af70feda 100644 --- a/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.ts +++ b/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.ts @@ -18,6 +18,7 @@ import { InPlaceReplaceCommand } from './inPlaceReplaceCommand'; import { EditorState, CodeEditorStateFlag } from 'vs/editor/common/core/editorState'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { editorBracketMatchBorder } from 'vs/editor/common/view/editorColorRegistry'; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; @commonEditorContribution class InPlaceReplaceController implements IEditorContribution { @@ -28,9 +29,9 @@ class InPlaceReplaceController implements IEditorContribution { return editor.getContribution(InPlaceReplaceController.ID); } - private static DECORATION = { + private static DECORATION = ModelDecorationOptions.register({ className: 'valueSetReplacement' - }; + }); private editor: ICommonCodeEditor; private requestIdPool: number; diff --git a/src/vs/editor/contrib/links/browser/links.ts b/src/vs/editor/contrib/links/browser/links.ts index 3be7d77a575..44f1d2fb3bd 100644 --- a/src/vs/editor/contrib/links/browser/links.ts +++ b/src/vs/editor/contrib/links/browser/links.ts @@ -26,6 +26,13 @@ import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { Position } from 'vs/editor/common/core/position'; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; + +const HOVER_MESSAGE_GENERAL = ( + platform.isMacintosh + ? nls.localize('links.navigate.mac', "Cmd + click to follow link") + : nls.localize('links.navigate', "Ctrl + click to follow link") +); class LinkOccurence { @@ -37,24 +44,24 @@ class LinkOccurence { endLineNumber: link.range.endLineNumber, endColumn: link.range.endColumn }, - options: LinkOccurence._getOptions(link, false) + options: LinkOccurence._getOptions(false) }; } - private static _getOptions(link: Link, isActive: boolean): editorCommon.IModelDecorationOptions { - var result = ''; + private static _LINK_DECORATION = ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + inlineClassName: 'detected-link', + hoverMessage: HOVER_MESSAGE_GENERAL + }); - if (isActive) { - result += LinkDetector.CLASS_NAME_ACTIVE; - } else { - result += LinkDetector.CLASS_NAME; - } + private static _ACTIVE_LINK_DECORATION = ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + inlineClassName: 'detected-link-active', + hoverMessage: HOVER_MESSAGE_GENERAL + }); - return { - stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, - inlineClassName: result, - hoverMessage: LinkDetector.HOVER_MESSAGE_GENERAL - }; + private static _getOptions(isActive: boolean): ModelDecorationOptions { + return (isActive ? this._ACTIVE_LINK_DECORATION : this._LINK_DECORATION); } public decorationId: string; @@ -66,11 +73,11 @@ class LinkOccurence { } public activate(changeAccessor: editorCommon.IModelDecorationsChangeAccessor): void { - changeAccessor.changeDecorationOptions(this.decorationId, LinkOccurence._getOptions(this.link, true)); + changeAccessor.changeDecorationOptions(this.decorationId, LinkOccurence._getOptions(true)); } public deactivate(changeAccessor: editorCommon.IModelDecorationsChangeAccessor): void { - changeAccessor.changeDecorationOptions(this.decorationId, LinkOccurence._getOptions(this.link, false)); + changeAccessor.changeDecorationOptions(this.decorationId, LinkOccurence._getOptions(false)); } } @@ -86,9 +93,6 @@ class LinkDetector implements editorCommon.IEditorContribution { static RECOMPUTE_TIME = 1000; // ms static TRIGGER_KEY_VALUE = platform.isMacintosh ? KeyCode.Meta : KeyCode.Ctrl; static TRIGGER_MODIFIER = platform.isMacintosh ? 'metaKey' : 'ctrlKey'; - static HOVER_MESSAGE_GENERAL = platform.isMacintosh ? nls.localize('links.navigate.mac', "Cmd + click to follow link") : nls.localize('links.navigate', "Ctrl + click to follow link"); - static CLASS_NAME = 'detected-link'; - static CLASS_NAME_ACTIVE = 'detected-link-active'; private editor: ICodeEditor; private listenersToRemove: IDisposable[]; diff --git a/src/vs/editor/contrib/quickOpen/browser/editorQuickOpen.ts b/src/vs/editor/contrib/quickOpen/browser/editorQuickOpen.ts index feb1726927b..3b088852ed4 100644 --- a/src/vs/editor/contrib/quickOpen/browser/editorQuickOpen.ts +++ b/src/vs/editor/contrib/quickOpen/browser/editorQuickOpen.ts @@ -14,6 +14,7 @@ import { Selection } from 'vs/editor/common/core/selection'; import { IActionOptions, EditorAction } from 'vs/editor/common/editorCommonExtensions'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Range } from 'vs/editor/common/core/range'; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; export interface IQuickOpenControllerOpts { inputAriaLabel: string; @@ -94,6 +95,11 @@ export class QuickOpenController implements editorCommon.IEditorContribution { this.widget.show(''); } + private static _RANGE_HIGHLIGHT_DECORATION = ModelDecorationOptions.register({ + className: 'rangeHighlight', + isWholeLine: true + }); + public decorateLine(range: Range, editor: ICodeEditor): void { editor.changeDecorations((changeAccessor: editorCommon.IModelDecorationsChangeAccessor) => { var oldDecorations: string[] = []; @@ -105,10 +111,7 @@ export class QuickOpenController implements editorCommon.IEditorContribution { var newDecorations: editorCommon.IModelDeltaDecoration[] = [ { range: range, - options: { - className: 'rangeHighlight', - isWholeLine: true - } + options: QuickOpenController._RANGE_HIGHLIGHT_DECORATION } ]; diff --git a/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts b/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts index cd68e923530..a7175ad5a1f 100644 --- a/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts +++ b/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts @@ -44,13 +44,14 @@ import { attachListStyler, attachBadgeStyler } from 'vs/platform/theme/common/st import { IModelDecorationsChangedEvent } from 'vs/editor/common/model/textModelEvents'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IEnvironmentService } from "vs/platform/environment/common/environment"; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; class DecorationsManager implements IDisposable { - private static DecorationOptions: editorCommon.IModelDecorationOptions = { + private static DecorationOptions = ModelDecorationOptions.register({ stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, className: 'reference-decoration' - }; + }); private _decorations = new Map(); private _decorationIgnoreSet = new Set(); diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts index 1496dda543d..72395327a67 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -6,7 +6,7 @@ 'use strict'; import { getLeadingWhitespace } from 'vs/base/common/strings'; -import { ICommonCodeEditor, IModel, IModelDecorationOptions, TrackedRangeStickiness, IIdentifiedSingleEditOperation } from 'vs/editor/common/editorCommon'; +import { ICommonCodeEditor, IModel, TrackedRangeStickiness, IIdentifiedSingleEditOperation } from 'vs/editor/common/editorCommon'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { TextmateSnippet, Placeholder, SnippetParser } from '../common/snippetParser'; import { Selection } from 'vs/editor/common/core/selection'; @@ -15,6 +15,7 @@ import { IPosition } from 'vs/editor/common/core/position'; import { groupBy } from 'vs/base/common/arrays'; import { dispose } from 'vs/base/common/lifecycle'; import { EditorSnippetVariableResolver } from "vs/editor/contrib/snippet/common/snippetVariables"; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; export class OneSnippet { @@ -27,10 +28,10 @@ export class OneSnippet { private _placeholderGroupsIdx: number; private static readonly _decor = { - active: { stickiness: TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, className: 'snippet-placeholder' }, - inactive: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, className: 'snippet-placeholder' }, - activeFinal: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, className: 'finish-snippet-placeholder' }, - inactiveFinal: { stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, className: 'finish-snippet-placeholder' }, + active: ModelDecorationOptions.register({ stickiness: TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges, className: 'snippet-placeholder' }), + inactive: ModelDecorationOptions.register({ stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, className: 'snippet-placeholder' }), + activeFinal: ModelDecorationOptions.register({ stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, className: 'finish-snippet-placeholder' }), + inactiveFinal: ModelDecorationOptions.register({ stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, className: 'finish-snippet-placeholder' }), }; constructor(editor: ICommonCodeEditor, snippet: TextmateSnippet, offset: number) { diff --git a/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts b/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts index e0eca99d8f3..ac03ba1d647 100644 --- a/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts +++ b/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts @@ -18,6 +18,7 @@ import { Position } from 'vs/editor/common/core/position'; import { registerColor, editorSelectionHighlight, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { CursorChangeReason, ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; export const editorWordHighlight = registerColor('editor.wordHighlightBackground', { dark: '#575757B8', light: '#57575740', hc: null }, nls.localize('wordHighlight', 'Background color of a symbol during read-access, like reading a variable.')); export const editorWordHighlightStrong = registerColor('editor.wordHighlightStrongBackground', { dark: '#004972B8', light: '#0e639c40', hc: null }, nls.localize('wordHighlightStrong', 'Background color of a symbol during write-access, like writing to a variable.')); @@ -262,34 +263,55 @@ class WordHighlighter { var decorations: editorCommon.IModelDeltaDecoration[] = []; for (var i = 0, len = this.workerRequestValue.length; i < len; i++) { var info = this.workerRequestValue[i]; - var color = '#A0A0A0'; - - let className: string; - if (info.kind === DocumentHighlightKind.Write) { - className = 'wordHighlightStrong'; - } else if (info.kind === DocumentHighlightKind.Text) { - className = 'selectionHighlight'; - } else { - className = 'wordHighlight'; - } - decorations.push({ range: info.range, - options: { - stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, - className: className, - overviewRuler: { - color: color, - darkColor: color, - position: editorCommon.OverviewRulerLane.Center - } - } + options: WordHighlighter._getDecorationOptions(info.kind) }); } this._decorationIds = this.editor.deltaDecorations(this._decorationIds, decorations); } + private static _getDecorationOptions(kind: DocumentHighlightKind): ModelDecorationOptions { + if (kind === DocumentHighlightKind.Write) { + return this._WRITE_OPTIONS; + } else if (kind === DocumentHighlightKind.Text) { + return this._TEXT_OPTIONS; + } else { + return this._REGULAR_OPTIONS; + } + } + + private static _WRITE_OPTIONS = ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + className: 'wordHighlightStrong', + overviewRuler: { + color: '#A0A0A0', + darkColor: '#A0A0A0', + position: editorCommon.OverviewRulerLane.Center + } + }); + + private static _TEXT_OPTIONS = ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + className: 'selectionHighlight', + overviewRuler: { + color: '#A0A0A0', + darkColor: '#A0A0A0', + position: editorCommon.OverviewRulerLane.Center + } + }); + + private static _REGULAR_OPTIONS = ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + className: 'wordHighlight', + overviewRuler: { + color: '#A0A0A0', + darkColor: '#A0A0A0', + position: editorCommon.OverviewRulerLane.Center + } + }); + public dispose(): void { this._stopAll(); this.toUnhook = dispose(this.toUnhook); diff --git a/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts b/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts index 1c987bf7d9f..e0de87646d8 100644 --- a/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts +++ b/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts @@ -16,6 +16,7 @@ import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition, IViewZone, IViewZo import { Color, RGBA } from 'vs/base/common/color'; import { EditorLayoutInfo } from 'vs/editor/common/config/editorOptions'; import { Position, IPosition } from 'vs/editor/common/core/position'; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; export interface IOptions { showFrame?: boolean; @@ -228,7 +229,7 @@ export abstract class ZoneWidget extends Widget implements IHorizontalSashLayout this._isShowing = true; this._showImpl(range, heightInLines); this._isShowing = false; - this._positionMarkerId = this.editor.deltaDecorations(this._positionMarkerId, [{ range, options: {} }]); + this._positionMarkerId = this.editor.deltaDecorations(this._positionMarkerId, [{ range, options: ModelDecorationOptions.EMPTY }]); } public hide(): void { diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 5380ba9b866..9c7b1c6cdfe 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -1112,10 +1112,6 @@ declare module monaco.editor { * Should the decoration expand to encompass a whole line. */ isWholeLine?: boolean; - /** - * @deprecated : Use `overviewRuler` instead - */ - showInOverviewRuler?: string; /** * If set, render this decoration in the overview ruler. */ diff --git a/src/vs/workbench/common/editor/rangeDecorations.ts b/src/vs/workbench/common/editor/rangeDecorations.ts index 322f0cb7c26..7c8678ab24c 100644 --- a/src/vs/workbench/common/editor/rangeDecorations.ts +++ b/src/vs/workbench/common/editor/rangeDecorations.ts @@ -12,6 +12,7 @@ import { toResource } from 'vs/workbench/common/editor'; import { isEqual } from 'vs/platform/files/common/files'; import { IRange } from 'vs/editor/common/core/range'; import { CursorChangeReason, ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; export interface IRangeHighlightDecoration { resource: URI; @@ -91,12 +92,19 @@ export class RangeHighlightDecorations implements IDisposable { this.editorDisposables = []; } - private createRangeHighlightDecoration(isWholeLine: boolean = true): editorCommon.IModelDecorationOptions { - return { - stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, - className: 'rangeHighlight', - isWholeLine - }; + private static _WHOLE_LINE_RANGE_HIGHLIGHT = ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + className: 'rangeHighlight', + isWholeLine: true + }); + + private static _RANGE_HIGHLIGHT = ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + className: 'rangeHighlight' + }); + + private createRangeHighlightDecoration(isWholeLine: boolean = true): ModelDecorationOptions { + return (isWholeLine ? RangeHighlightDecorations._WHOLE_LINE_RANGE_HIGHLIGHT : RangeHighlightDecorations._RANGE_HIGHLIGHT); } public dispose() { diff --git a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts index adcb8af04f2..bd29a6a03df 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts @@ -32,6 +32,7 @@ import { IWorkspaceConfigurationService } from 'vs/workbench/services/configurat import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; export interface IPreferencesRenderer extends IDisposable { preferencesModel: IPreferencesEditorModel; @@ -568,13 +569,15 @@ export class HighlightPreferencesRenderer extends Disposable { } } + private static _FIND_MATCH = ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + className: 'findMatch' + }); + private createDecoration(range: IRange, model: editorCommon.IModel): editorCommon.IModelDeltaDecoration { return { range, - options: { - stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, - className: 'findMatch' - } + options: HighlightPreferencesRenderer._FIND_MATCH }; } diff --git a/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts b/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts index bfe34e1fde2..fb3d45c4e7c 100644 --- a/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts +++ b/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts @@ -22,10 +22,11 @@ import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerServ import URI from 'vs/base/common/uri'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { ISCMService } from 'vs/workbench/services/scm/common/scm'; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; class DirtyDiffModelDecorator { - static MODIFIED_DECORATION_OPTIONS: common.IModelDecorationOptions = { + static MODIFIED_DECORATION_OPTIONS = ModelDecorationOptions.register({ linesDecorationsClassName: 'dirty-diff-modified-glyph', isWholeLine: true, overviewRuler: { @@ -33,9 +34,9 @@ class DirtyDiffModelDecorator { darkColor: 'rgba(0, 122, 204, 0.6)', position: common.OverviewRulerLane.Left } - }; + }); - static ADDED_DECORATION_OPTIONS: common.IModelDecorationOptions = { + static ADDED_DECORATION_OPTIONS = ModelDecorationOptions.register({ linesDecorationsClassName: 'dirty-diff-added-glyph', isWholeLine: true, overviewRuler: { @@ -43,9 +44,9 @@ class DirtyDiffModelDecorator { darkColor: 'rgba(0, 122, 204, 0.6)', position: common.OverviewRulerLane.Left } - }; + }); - static DELETED_DECORATION_OPTIONS: common.IModelDecorationOptions = { + static DELETED_DECORATION_OPTIONS = ModelDecorationOptions.register({ linesDecorationsClassName: 'dirty-diff-deleted-glyph', isWholeLine: true, overviewRuler: { @@ -53,7 +54,7 @@ class DirtyDiffModelDecorator { darkColor: 'rgba(0, 122, 204, 0.6)', position: common.OverviewRulerLane.Left } - }; + }); private decorations: string[]; private baselineModel: common.IModel; diff --git a/src/vs/workbench/parts/search/common/searchModel.ts b/src/vs/workbench/parts/search/common/searchModel.ts index 5911cbbcbc2..87dae50f90e 100644 --- a/src/vs/workbench/parts/search/common/searchModel.ts +++ b/src/vs/workbench/parts/search/common/searchModel.ts @@ -18,12 +18,13 @@ import { ISearchService, ISearchProgressItem, ISearchComplete, ISearchQuery, IPa import { ReplacePattern } from 'vs/platform/search/common/replace'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { Range } from 'vs/editor/common/core/range'; -import { IModel, IModelDeltaDecoration, OverviewRulerLane, TrackedRangeStickiness, IModelDecorationOptions, FindMatch } from 'vs/editor/common/editorCommon'; +import { IModel, IModelDeltaDecoration, OverviewRulerLane, TrackedRangeStickiness, FindMatch } from 'vs/editor/common/editorCommon'; import { IInstantiationService, createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IReplaceService } from 'vs/workbench/parts/search/common/replace'; import { IProgressRunner } from 'vs/platform/progress/common/progress'; import { RangeHighlightDecorations } from 'vs/workbench/common/editor/rangeDecorations'; +import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; export class Match { @@ -92,16 +93,28 @@ export class Match { export class FileMatch extends Disposable { - private static getDecorationOption(selected: boolean): IModelDecorationOptions { - return { - stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, - className: selected ? 'currentFindMatch' : 'findMatch', - overviewRuler: { - color: 'rgba(246, 185, 77, 0.7)', - darkColor: 'rgba(246, 185, 77, 0.7)', - position: OverviewRulerLane.Center - } - }; + private static _CURRENT_FIND_MATCH = ModelDecorationOptions.register({ + stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + className: 'currentFindMatch', + overviewRuler: { + color: 'rgba(246, 185, 77, 0.7)', + darkColor: 'rgba(246, 185, 77, 0.7)', + position: OverviewRulerLane.Center + } + }); + + private static _FIND_MATCH = ModelDecorationOptions.register({ + stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + className: 'findMatch', + overviewRuler: { + color: 'rgba(246, 185, 77, 0.7)', + darkColor: 'rgba(246, 185, 77, 0.7)', + position: OverviewRulerLane.Center + } + }); + + private static getDecorationOption(selected: boolean): ModelDecorationOptions { + return (selected ? FileMatch._CURRENT_FIND_MATCH : FileMatch._FIND_MATCH); } private _onChange = this._register(new Emitter()); From 6b1a8e89a2c9783e5b564125e68bfd80d9d54602 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sat, 20 May 2017 21:47:07 +0200 Subject: [PATCH 0718/1164] Fixes #14437: Update state in selection highlighter only if needed --- .../contrib/find/common/findController.ts | 124 ++++++++++++------ 1 file changed, 82 insertions(+), 42 deletions(-) diff --git a/src/vs/editor/contrib/find/common/findController.ts b/src/vs/editor/contrib/find/common/findController.ts index c9fbee3b8a2..40d299bedfb 100644 --- a/src/vs/editor/contrib/find/common/findController.ts +++ b/src/vs/editor/contrib/find/common/findController.ts @@ -883,6 +883,36 @@ export class CompatChangeAll extends AbstractSelectHighlightsAction { } } +class SelectionHighlighterState { + public readonly lastWordUnderCursor: Selection; + public readonly searchText: string; + public readonly matchCase: boolean; + public readonly wordSeparators: string; + + constructor(lastWordUnderCursor: Selection, searchText: string, matchCase: boolean, wordSeparators: string) { + this.searchText = searchText; + this.matchCase = matchCase; + this.wordSeparators = wordSeparators; + } + + /** + * Everything equals except for `lastWordUnderCursor` + */ + public static softEquals(a: SelectionHighlighterState, b: SelectionHighlighterState): boolean { + if (!a && !b) { + return true; + } + if (!a || !b) { + return false; + } + return ( + a.searchText === b.searchText + && a.matchCase === b.matchCase + && a.wordSeparators === b.wordSeparators + ); + } +} + @commonEditorContribution export class SelectionHighlighter extends Disposable implements editorCommon.IEditorContribution { private static ID = 'editor.contrib.selectionHighlighter'; @@ -890,25 +920,25 @@ export class SelectionHighlighter extends Disposable implements editorCommon.IEd private editor: editorCommon.ICommonCodeEditor; private decorations: string[]; private updateSoon: RunOnceScheduler; - private lastWordUnderCursor: Range; + private state: SelectionHighlighterState; constructor(editor: editorCommon.ICommonCodeEditor) { super(); this.editor = editor; this.decorations = []; this.updateSoon = this._register(new RunOnceScheduler(() => this._update(), 300)); - this.lastWordUnderCursor = null; + this.state = null; this._register(editor.onDidChangeCursorSelection((e: ICursorSelectionChangedEvent) => { if (e.selection.isEmpty()) { if (e.reason === CursorChangeReason.Explicit) { - if (!this.lastWordUnderCursor || !this.lastWordUnderCursor.containsPosition(e.selection.getStartPosition())) { + if (this.state && (!this.state.lastWordUnderCursor || !this.state.lastWordUnderCursor.containsPosition(e.selection.getStartPosition()))) { // no longer valid - this.removeDecorations(); + this._setState(null); } this.updateSoon.schedule(); } else { - this.removeDecorations(); + this._setState(null); } } else { @@ -916,7 +946,7 @@ export class SelectionHighlighter extends Disposable implements editorCommon.IEd } })); this._register(editor.onDidChangeModel((e) => { - this.removeDecorations(); + this._setState(null); })); this._register(CommonFindController.get(editor).getState().addChangeListener((e) => { this._update(); @@ -927,73 +957,63 @@ export class SelectionHighlighter extends Disposable implements editorCommon.IEd return SelectionHighlighter.ID; } - private removeDecorations(): void { - this.lastWordUnderCursor = null; - if (this.decorations.length > 0) { - this.decorations = this.editor.deltaDecorations(this.decorations, []); - } + private _update(): void { + this._setState(SelectionHighlighter._createState(this.editor)); } - private _update(): void { - const model = this.editor.getModel(); + private static _createState(editor: editorCommon.ICommonCodeEditor): SelectionHighlighterState { + const model = editor.getModel(); if (!model) { - return; + return null; } - const config = this.editor.getConfiguration(); + const config = editor.getConfiguration(); - this.lastWordUnderCursor = null; + let lastWordUnderCursor: Selection = null; if (!config.contribInfo.selectionHighlight) { - this.removeDecorations(); - return; + return null; } - let r = multiCursorFind(this.editor, { + const r = multiCursorFind(editor, { changeFindSearchString: false, allowMultiline: false, highlightFindOptions: false }); if (!r) { - this.removeDecorations(); - return; + return null; } - let hasFindOccurences = DocumentHighlightProviderRegistry.has(model); + const hasFindOccurences = DocumentHighlightProviderRegistry.has(model); if (r.currentMatch) { // This is an empty selection if (hasFindOccurences) { // Do not interfere with semantic word highlighting in the no selection case - this.removeDecorations(); - return; + return null; } if (!config.contribInfo.occurrencesHighlight) { - this.removeDecorations(); - return; + return null; } - this.lastWordUnderCursor = r.currentMatch; + lastWordUnderCursor = r.currentMatch; } if (/^[ \t]+$/.test(r.searchText)) { // whitespace only selection - this.removeDecorations(); - return; + return null; } if (r.searchText.length > 200) { // very long selection - this.removeDecorations(); - return; + return null; } - const controller = CommonFindController.get(this.editor); + const controller = CommonFindController.get(editor); if (!controller) { - this.removeDecorations(); - return; + return null; } const findState = controller.getState(); const caseSensitive = findState.matchCase; - let selections = this.editor.getSelections(); + const selections = editor.getSelections(); let firstSelectedText = model.getValueInRange(selections[0]); if (!caseSensitive) { firstSelectedText = firstSelectedText.toLowerCase(); @@ -1005,28 +1025,48 @@ export class SelectionHighlighter extends Disposable implements editorCommon.IEd } if (firstSelectedText !== selectedText) { // not all selections have the same text - this.removeDecorations(); - return; + return null; } } + return new SelectionHighlighterState(lastWordUnderCursor, r.searchText, r.matchCase, r.wholeWord ? editor.getConfiguration().wordSeparators : null); + } - let allMatches = model.findMatches(r.searchText, true, false, r.matchCase, r.wholeWord ? this.editor.getConfiguration().wordSeparators : null, false).map(m => m.range); + + private _setState(state: SelectionHighlighterState): void { + if (SelectionHighlighterState.softEquals(this.state, state)) { + this.state = state; + return; + } + this.state = state; + + if (!this.state) { + if (this.decorations.length > 0) { + this.decorations = this.editor.deltaDecorations(this.decorations, []); + } + return; + } + + const model = this.editor.getModel(); + const hasFindOccurences = DocumentHighlightProviderRegistry.has(model); + + let allMatches = model.findMatches(this.state.searchText, true, false, this.state.matchCase, this.state.wordSeparators, false).map(m => m.range); allMatches.sort(Range.compareRangesUsingStarts); + let selections = this.editor.getSelections(); selections.sort(Range.compareRangesUsingStarts); // do not overlap with selection (issue #64 and #512) let matches: Range[] = []; for (let i = 0, j = 0, len = allMatches.length, lenJ = selections.length; i < len;) { - let match = allMatches[i]; + const match = allMatches[i]; if (j >= lenJ) { // finished all editor selections matches.push(match); i++; } else { - let cmp = Range.compareRangesUsingStarts(match, selections[j]); + const cmp = Range.compareRangesUsingStarts(match, selections[j]); if (cmp < 0) { // match is before sel matches.push(match); @@ -1042,7 +1082,7 @@ export class SelectionHighlighter extends Disposable implements editorCommon.IEd } } - let decorations = matches.map(r => { + const decorations = matches.map(r => { return { range: r, // Show in overviewRuler only if model has no semantic highlighting @@ -1069,7 +1109,7 @@ export class SelectionHighlighter extends Disposable implements editorCommon.IEd }); public dispose(): void { - this.removeDecorations(); + this._setState(null); super.dispose(); } } From d4d94b1de9eb56430a6aa1e31eded35d377c04e5 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sun, 21 May 2017 10:28:31 +0200 Subject: [PATCH 0719/1164] Fixes #27019 --- .../browser/keybindingsEditorContribution.ts | 79 +++++++++++++------ 1 file changed, 53 insertions(+), 26 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts b/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts index 58359b3d352..d5aaccbae45 100644 --- a/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts +++ b/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts @@ -42,51 +42,82 @@ export class DefineKeybindingController extends Disposable implements editorComm return editor.getContribution(DefineKeybindingController.ID); } - private _keybindingEditorRenderer: KeybindingEditorRenderer; + private _keybindingWidgetRenderer: KeybindingWidgetRenderer; + private _keybindingDecorationRenderer: KeybindingEditorDecorationsRenderer; constructor( private _editor: ICodeEditor, - @IKeybindingService keybindingService: IKeybindingService, - @IInstantiationService private instantiationService: IInstantiationService + @IInstantiationService private _instantiationService: IInstantiationService ) { super(); - this._register(this._editor.onDidChangeModel(e => this._renderKeybindingEditor())); - this._renderKeybindingEditor(); + this._keybindingWidgetRenderer = null; + this._keybindingDecorationRenderer = null; + + this._register(this._editor.onDidChangeModel(e => this._update())); + this._update(); } public getId(): string { return DefineKeybindingController.ID; } - public get keybindingEditorRenderer(): KeybindingEditorRenderer { - return this._keybindingEditorRenderer; + public get keybindingWidgetRenderer(): KeybindingWidgetRenderer { + return this._keybindingWidgetRenderer; } public dispose(): void { - this._disposeKeybindingEditorRenderer(); + this._disposeKeybindingWidgetRenderer(); + this._disposeKeybindingDecorationRenderer(); super.dispose(); } - private _renderKeybindingEditor(): void { - if (isInterestingEditorModel(this._editor)) { - if (!this._keybindingEditorRenderer) { - this._keybindingEditorRenderer = this.instantiationService.createInstance(KeybindingEditorRenderer, this._editor); - } + private _update(): void { + if (!isInterestingEditorModel(this._editor)) { + this._disposeKeybindingWidgetRenderer(); + this._disposeKeybindingDecorationRenderer(); + return; + } + + // Decorations are shown for the default keybindings.json **and** for the user keybindings.json + this._createKeybindingDecorationRenderer(); + + // The button to define keybindings is shown only for the user keybindings.json + if (!this._editor.getConfiguration().readOnly) { + this._createKeybindingWidgetRenderer(); } else { - this._disposeKeybindingEditorRenderer(); + this._disposeKeybindingWidgetRenderer(); } } - private _disposeKeybindingEditorRenderer(): void { - if (this._keybindingEditorRenderer) { - this._keybindingEditorRenderer.dispose(); - this._keybindingEditorRenderer = null; + private _createKeybindingWidgetRenderer(): void { + if (!this._keybindingWidgetRenderer) { + this._keybindingWidgetRenderer = this._instantiationService.createInstance(KeybindingWidgetRenderer, this._editor); + } + } + + private _disposeKeybindingWidgetRenderer(): void { + if (this._keybindingWidgetRenderer) { + this._keybindingWidgetRenderer.dispose(); + this._keybindingWidgetRenderer = null; + } + } + + private _createKeybindingDecorationRenderer(): void { + if (!this._keybindingDecorationRenderer) { + this._keybindingDecorationRenderer = this._instantiationService.createInstance(KeybindingEditorDecorationsRenderer, this._editor); + } + } + + private _disposeKeybindingDecorationRenderer(): void { + if (this._keybindingDecorationRenderer) { + this._keybindingDecorationRenderer.dispose(); + this._keybindingDecorationRenderer = null; } } } -export class KeybindingEditorRenderer extends Disposable { +export class KeybindingWidgetRenderer extends Disposable { private _launchWidget: FloatingClickWidget; private _defineWidget: DefineKeybindingOverlayWidget; @@ -100,7 +131,6 @@ export class KeybindingEditorRenderer extends Disposable { this._register(this._launchWidget.onClick(() => this.showDefineKeybindingWidget())); this._defineWidget = this._register(this._instantiationService.createInstance(DefineKeybindingOverlayWidget, this._editor)); - this._register(this._instantiationService.createInstance(KeybindingEditorDecorationsRenderer, this._editor)); this._launchWidget.render(); } @@ -314,20 +344,17 @@ class DefineKeybindingCommand extends EditorCommand { } public runEditorCommand(accessor: ServicesAccessor, editor: editorCommon.ICommonCodeEditor): void { - if (!isInterestingEditorModel(editor)) { + if (!isInterestingEditorModel(editor) || editor.getConfiguration().readOnly) { return; } let controller = DefineKeybindingController.get(editor); - if (controller && controller.keybindingEditorRenderer) { - controller.keybindingEditorRenderer.showDefineKeybindingWidget(); + if (controller && controller.keybindingWidgetRenderer) { + controller.keybindingWidgetRenderer.showDefineKeybindingWidget(); } } } function isInterestingEditorModel(editor: editorCommon.ICommonCodeEditor): boolean { - if (editor.getConfiguration().readOnly) { - return false; - } let model = editor.getModel(); if (!model) { return false; From 1d7146c103c3ca9eb95c7e860c4f51c44ff28504 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sun, 21 May 2017 10:50:46 +0200 Subject: [PATCH 0720/1164] Fixes #27021 --- .../common/windowsKeyboardMapper.ts | 38 ++++++++++++++----- .../services/keybinding/test/win_de_ch.txt | 24 ++++++------ .../services/keybinding/test/win_por_ptb.txt | 32 ++++++++-------- 3 files changed, 56 insertions(+), 38 deletions(-) diff --git a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts index 6eef623475f..0f59d1047f1 100644 --- a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts @@ -171,10 +171,7 @@ export class WindowsNativeResolvedKeybinding extends ResolvedKeybinding { if (keybinding.isDuplicateModifierCase()) { return ''; } - if (this._mapper.isUSStandard) { - return KeyCodeUtils.toUserSettingsUS(keybinding.keyCode); - } - return KeyCodeUtils.toUserSettingsGeneral(keybinding.keyCode); + return this._mapper.getUserSettingsLabelForKeyCode(keybinding.keyCode); } public getUserSettingsLabel(): string { @@ -185,13 +182,27 @@ export class WindowsNativeResolvedKeybinding extends ResolvedKeybinding { } public isWYSIWYG(): boolean { - let firstPart1 = this._firstPart ? this._mapper.getAriaLabelForKeyCode(this._firstPart.keyCode) : null; - let chordPart1 = this._chordPart ? this._mapper.getAriaLabelForKeyCode(this._chordPart.keyCode) : null; + if (this._firstPart && !this._isWYSIWYG(this._firstPart.keyCode)) { + return false; + } + if (this._chordPart && !this._isWYSIWYG(this._chordPart.keyCode)) { + return false; + } + return true; + } - let firstPart2 = this._firstPart ? KeyCodeUtils.toString(this._firstPart.keyCode) : null; - let chordPart2 = this._chordPart ? KeyCodeUtils.toString(this._chordPart.keyCode) : null; - - return (firstPart1 === firstPart2 && chordPart1 === chordPart2); + private _isWYSIWYG(keyCode: KeyCode): boolean { + if ( + keyCode === KeyCode.LeftArrow + || keyCode === KeyCode.UpArrow + || keyCode === KeyCode.RightArrow + || keyCode === KeyCode.DownArrow + ) { + return true; + } + const ariaLabel = this._mapper.getAriaLabelForKeyCode(keyCode); + const userSettingsLabel = this._mapper.getUserSettingsLabelForKeyCode(keyCode); + return (ariaLabel === userSettingsLabel); } public isChord(): boolean { @@ -428,6 +439,13 @@ export class WindowsKeyboardMapper implements IKeyboardMapper { return this._getLabelForKeyCode(keyCode); } + public getUserSettingsLabelForKeyCode(keyCode: KeyCode): string { + if (this.isUSStandard) { + return KeyCodeUtils.toUserSettingsUS(keyCode); + } + return KeyCodeUtils.toUserSettingsGeneral(keyCode); + } + private _getLabelForKeyCode(keyCode: KeyCode): string { return this._keyCodeToLabel[keyCode] || KeyCodeUtils.toString(KeyCode.Unknown); } diff --git a/src/vs/workbench/services/keybinding/test/win_de_ch.txt b/src/vs/workbench/services/keybinding/test/win_de_ch.txt index 4936e72b405..c0358ef1a49 100644 --- a/src/vs/workbench/services/keybinding/test/win_de_ch.txt +++ b/src/vs/workbench/services/keybinding/test/win_de_ch.txt @@ -240,20 +240,20 @@ | Ctrl+Alt+Backquote | --- | Ctrl+Alt+/ | Ctrl+Alt+§ | NO | | Ctrl+Shift+Alt+Backquote | --- | Ctrl+Shift+Alt+/ | Ctrl+Shift+Alt+§ | NO | ------------------------------------------------------------------------------------------------------------ -| Comma | , | , | , | | -| Shift+Comma | ; | Shift+, | Shift+, | | -| Ctrl+Alt+Comma | --- | Ctrl+Alt+, | Ctrl+Alt+, | | -| Ctrl+Shift+Alt+Comma | --- | Ctrl+Shift+Alt+, | Ctrl+Shift+Alt+, | | +| Comma | , | , | , | NO | +| Shift+Comma | ; | Shift+, | Shift+, | NO | +| Ctrl+Alt+Comma | --- | Ctrl+Alt+, | Ctrl+Alt+, | NO | +| Ctrl+Shift+Alt+Comma | --- | Ctrl+Shift+Alt+, | Ctrl+Shift+Alt+, | NO | ------------------------------------------------------------------------------------------------------------ -| Period | . | . | . | | -| Shift+Period | : | Shift+. | Shift+. | | -| Ctrl+Alt+Period | --- | Ctrl+Alt+. | Ctrl+Alt+. | | -| Ctrl+Shift+Alt+Period | --- | Ctrl+Shift+Alt+. | Ctrl+Shift+Alt+. | | +| Period | . | . | . | NO | +| Shift+Period | : | Shift+. | Shift+. | NO | +| Ctrl+Alt+Period | --- | Ctrl+Alt+. | Ctrl+Alt+. | NO | +| Ctrl+Shift+Alt+Period | --- | Ctrl+Shift+Alt+. | Ctrl+Shift+Alt+. | NO | ------------------------------------------------------------------------------------------------------------ -| Slash | - | - | - | | -| Shift+Slash | _ | Shift+- | Shift+- | | -| Ctrl+Alt+Slash | --- | Ctrl+Alt+- | Ctrl+Alt+- | | -| Ctrl+Shift+Alt+Slash | --- | Ctrl+Shift+Alt+- | Ctrl+Shift+Alt+- | | +| Slash | - | - | - | NO | +| Shift+Slash | _ | Shift+- | Shift+- | NO | +| Ctrl+Alt+Slash | --- | Ctrl+Alt+- | Ctrl+Alt+- | NO | +| Ctrl+Shift+Alt+Slash | --- | Ctrl+Shift+Alt+- | Ctrl+Shift+Alt+- | NO | ------------------------------------------------------------------------------------------------------------ | HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------ diff --git a/src/vs/workbench/services/keybinding/test/win_por_ptb.txt b/src/vs/workbench/services/keybinding/test/win_por_ptb.txt index 1a6f16fcbdc..a09f7654b32 100644 --- a/src/vs/workbench/services/keybinding/test/win_por_ptb.txt +++ b/src/vs/workbench/services/keybinding/test/win_por_ptb.txt @@ -193,15 +193,15 @@ ------------------------------------------------------------------------------------------------------------ | HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------ -| Minus | - | - | - | | -| Shift+Minus | _ | Shift+- | Shift+- | | -| Ctrl+Alt+Minus | --- | Ctrl+Alt+- | Ctrl+Alt+- | | -| Ctrl+Shift+Alt+Minus | --- | Ctrl+Shift+Alt+- | Ctrl+Shift+Alt+- | | +| Minus | - | - | - | NO | +| Shift+Minus | _ | Shift+- | Shift+- | NO | +| Ctrl+Alt+Minus | --- | Ctrl+Alt+- | Ctrl+Alt+- | NO | +| Ctrl+Shift+Alt+Minus | --- | Ctrl+Shift+Alt+- | Ctrl+Shift+Alt+- | NO | ------------------------------------------------------------------------------------------------------------ -| Equal | = | = | = | | -| Shift+Equal | + | Shift+= | Shift+= | | -| Ctrl+Alt+Equal | § | Ctrl+Alt+= | Ctrl+Alt+= | | -| Ctrl+Shift+Alt+Equal | --- | Ctrl+Shift+Alt+= | Ctrl+Shift+Alt+= | | +| Equal | = | = | = | NO | +| Shift+Equal | + | Shift+= | Shift+= | NO | +| Ctrl+Alt+Equal | § | Ctrl+Alt+= | Ctrl+Alt+= | NO | +| Ctrl+Shift+Alt+Equal | --- | Ctrl+Shift+Alt+= | Ctrl+Shift+Alt+= | NO | ------------------------------------------------------------------------------------------------------------ | BracketLeft | ´ | [ | ´ | NO | | Shift+BracketLeft | ` | Shift+[ | Shift+´ | NO | @@ -240,15 +240,15 @@ | Ctrl+Alt+Backquote | --- | Ctrl+Alt+` | Ctrl+Alt+' | NO | | Ctrl+Shift+Alt+Backquote | --- | Ctrl+Shift+Alt+` | Ctrl+Shift+Alt+' | NO | ------------------------------------------------------------------------------------------------------------ -| Comma | , | , | , | | -| Shift+Comma | < | Shift+, | Shift+, | | -| Ctrl+Alt+Comma | --- | Ctrl+Alt+, | Ctrl+Alt+, | | -| Ctrl+Shift+Alt+Comma | --- | Ctrl+Shift+Alt+, | Ctrl+Shift+Alt+, | | +| Comma | , | , | , | NO | +| Shift+Comma | < | Shift+, | Shift+, | NO | +| Ctrl+Alt+Comma | --- | Ctrl+Alt+, | Ctrl+Alt+, | NO | +| Ctrl+Shift+Alt+Comma | --- | Ctrl+Shift+Alt+, | Ctrl+Shift+Alt+, | NO | ------------------------------------------------------------------------------------------------------------ -| Period | . | . | . | | -| Shift+Period | > | Shift+. | Shift+. | | -| Ctrl+Alt+Period | --- | Ctrl+Alt+. | Ctrl+Alt+. | | -| Ctrl+Shift+Alt+Period | --- | Ctrl+Shift+Alt+. | Ctrl+Shift+Alt+. | | +| Period | . | . | . | NO | +| Shift+Period | > | Shift+. | Shift+. | NO | +| Ctrl+Alt+Period | --- | Ctrl+Alt+. | Ctrl+Alt+. | NO | +| Ctrl+Shift+Alt+Period | --- | Ctrl+Shift+Alt+. | Ctrl+Shift+Alt+. | NO | ------------------------------------------------------------------------------------------------------------ | Slash | ; | / | ; | NO | | Shift+Slash | : | Shift+/ | Shift+; | NO | From 155b5c91c9e8a5591b3ff951914ac7bea6ddf2fe Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sun, 21 May 2017 11:00:42 +0200 Subject: [PATCH 0721/1164] Add suite for Russian keyboard layout --- .../services/keybinding/test/win_ru.js | 1093 +++++++++++++++++ .../services/keybinding/test/win_ru.txt | 284 +++++ .../test/windowsKeyboardMapper.test.ts | 17 +- 3 files changed, 1393 insertions(+), 1 deletion(-) create mode 100644 src/vs/workbench/services/keybinding/test/win_ru.js create mode 100644 src/vs/workbench/services/keybinding/test/win_ru.txt diff --git a/src/vs/workbench/services/keybinding/test/win_ru.js b/src/vs/workbench/services/keybinding/test/win_ru.js new file mode 100644 index 00000000000..4f024d361eb --- /dev/null +++ b/src/vs/workbench/services/keybinding/test/win_ru.js @@ -0,0 +1,1093 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +define({ + Sleep: { + vkey: 'VK_SLEEP', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + WakeUp: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + KeyA: { + vkey: 'VK_A', + value: 'ф', + withShift: 'Ф', + withAltGr: '', + withShiftAltGr: '' + }, + KeyB: { + vkey: 'VK_B', + value: 'и', + withShift: 'И', + withAltGr: '', + withShiftAltGr: '' + }, + KeyC: { + vkey: 'VK_C', + value: 'с', + withShift: 'С', + withAltGr: '', + withShiftAltGr: '' + }, + KeyD: { + vkey: 'VK_D', + value: 'в', + withShift: 'В', + withAltGr: '', + withShiftAltGr: '' + }, + KeyE: { + vkey: 'VK_E', + value: 'у', + withShift: 'У', + withAltGr: '', + withShiftAltGr: '' + }, + KeyF: { + vkey: 'VK_F', + value: 'а', + withShift: 'А', + withAltGr: '', + withShiftAltGr: '' + }, + KeyG: { + vkey: 'VK_G', + value: 'п', + withShift: 'П', + withAltGr: '', + withShiftAltGr: '' + }, + KeyH: { + vkey: 'VK_H', + value: 'р', + withShift: 'Р', + withAltGr: '', + withShiftAltGr: '' + }, + KeyI: { + vkey: 'VK_I', + value: 'ш', + withShift: 'Ш', + withAltGr: '', + withShiftAltGr: '' + }, + KeyJ: { + vkey: 'VK_J', + value: 'о', + withShift: 'О', + withAltGr: '', + withShiftAltGr: '' + }, + KeyK: { + vkey: 'VK_K', + value: 'л', + withShift: 'Л', + withAltGr: '', + withShiftAltGr: '' + }, + KeyL: { + vkey: 'VK_L', + value: 'д', + withShift: 'Д', + withAltGr: '', + withShiftAltGr: '' + }, + KeyM: { + vkey: 'VK_M', + value: 'ь', + withShift: 'Ь', + withAltGr: '', + withShiftAltGr: '' + }, + KeyN: { + vkey: 'VK_N', + value: 'т', + withShift: 'Т', + withAltGr: '', + withShiftAltGr: '' + }, + KeyO: { + vkey: 'VK_O', + value: 'щ', + withShift: 'Щ', + withAltGr: '', + withShiftAltGr: '' + }, + KeyP: { + vkey: 'VK_P', + value: 'з', + withShift: 'З', + withAltGr: '', + withShiftAltGr: '' + }, + KeyQ: { + vkey: 'VK_Q', + value: 'й', + withShift: 'Й', + withAltGr: '', + withShiftAltGr: '' + }, + KeyR: { + vkey: 'VK_R', + value: 'к', + withShift: 'К', + withAltGr: '', + withShiftAltGr: '' + }, + KeyS: { + vkey: 'VK_S', + value: 'ы', + withShift: 'Ы', + withAltGr: '', + withShiftAltGr: '' + }, + KeyT: { + vkey: 'VK_T', + value: 'е', + withShift: 'Е', + withAltGr: '', + withShiftAltGr: '' + }, + KeyU: { + vkey: 'VK_U', + value: 'г', + withShift: 'Г', + withAltGr: '', + withShiftAltGr: '' + }, + KeyV: { + vkey: 'VK_V', + value: 'м', + withShift: 'М', + withAltGr: '', + withShiftAltGr: '' + }, + KeyW: { + vkey: 'VK_W', + value: 'ц', + withShift: 'Ц', + withAltGr: '', + withShiftAltGr: '' + }, + KeyX: { + vkey: 'VK_X', + value: 'ч', + withShift: 'Ч', + withAltGr: '', + withShiftAltGr: '' + }, + KeyY: { + vkey: 'VK_Y', + value: 'н', + withShift: 'Н', + withAltGr: '', + withShiftAltGr: '' + }, + KeyZ: { + vkey: 'VK_Z', + value: 'я', + withShift: 'Я', + withAltGr: '', + withShiftAltGr: '' + }, + Digit1: { + vkey: 'VK_1', + value: '1', + withShift: '!', + withAltGr: '', + withShiftAltGr: '' + }, + Digit2: { + vkey: 'VK_2', + value: '2', + withShift: '\"', + withAltGr: '', + withShiftAltGr: '' + }, + Digit3: { + vkey: 'VK_3', + value: '3', + withShift: '№', + withAltGr: '', + withShiftAltGr: '' + }, + Digit4: { + vkey: 'VK_4', + value: '4', + withShift: ';', + withAltGr: '', + withShiftAltGr: '' + }, + Digit5: { + vkey: 'VK_5', + value: '5', + withShift: '%', + withAltGr: '', + withShiftAltGr: '' + }, + Digit6: { + vkey: 'VK_6', + value: '6', + withShift: ':', + withAltGr: '', + withShiftAltGr: '' + }, + Digit7: { + vkey: 'VK_7', + value: '7', + withShift: '?', + withAltGr: '', + withShiftAltGr: '' + }, + Digit8: { + vkey: 'VK_8', + value: '8', + withShift: '*', + withAltGr: '₽', + withShiftAltGr: '' + }, + Digit9: { + vkey: 'VK_9', + value: '9', + withShift: '(', + withAltGr: '', + withShiftAltGr: '' + }, + Digit0: { + vkey: 'VK_0', + value: '0', + withShift: ')', + withAltGr: '', + withShiftAltGr: '' + }, + Enter: { + vkey: 'VK_RETURN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Escape: { + vkey: 'VK_ESCAPE', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Backspace: { + vkey: 'VK_BACK', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Tab: { + vkey: 'VK_TAB', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Space: { + vkey: 'VK_SPACE', + value: ' ', + withShift: ' ', + withAltGr: '', + withShiftAltGr: '' + }, + Minus: { + vkey: 'VK_OEM_MINUS', + value: '-', + withShift: '_', + withAltGr: '', + withShiftAltGr: '' + }, + Equal: { + vkey: 'VK_OEM_PLUS', + value: '=', + withShift: '+', + withAltGr: '', + withShiftAltGr: '' + }, + BracketLeft: { + vkey: 'VK_OEM_4', + value: 'х', + withShift: 'Х', + withAltGr: '', + withShiftAltGr: '' + }, + BracketRight: { + vkey: 'VK_OEM_6', + value: 'ъ', + withShift: 'Ъ', + withAltGr: '', + withShiftAltGr: '' + }, + Backslash: { + vkey: 'VK_OEM_5', + value: '\\', + withShift: '/', + withAltGr: '', + withShiftAltGr: '' + }, + Semicolon: { + vkey: 'VK_OEM_1', + value: 'ж', + withShift: 'Ж', + withAltGr: '', + withShiftAltGr: '' + }, + Quote: { + vkey: 'VK_OEM_7', + value: 'э', + withShift: 'Э', + withAltGr: '', + withShiftAltGr: '' + }, + Backquote: { + vkey: 'VK_OEM_3', + value: 'ё', + withShift: 'Ё', + withAltGr: '', + withShiftAltGr: '' + }, + Comma: { + vkey: 'VK_OEM_COMMA', + value: 'б', + withShift: 'Б', + withAltGr: '', + withShiftAltGr: '' + }, + Period: { + vkey: 'VK_OEM_PERIOD', + value: 'ю', + withShift: 'Ю', + withAltGr: '', + withShiftAltGr: '' + }, + Slash: { + vkey: 'VK_OEM_2', + value: '.', + withShift: ',', + withAltGr: '', + withShiftAltGr: '' + }, + CapsLock: { + vkey: 'VK_CAPITAL', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F1: { + vkey: 'VK_F1', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F2: { + vkey: 'VK_F2', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F3: { + vkey: 'VK_F3', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F4: { + vkey: 'VK_F4', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F5: { + vkey: 'VK_F5', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F6: { + vkey: 'VK_F6', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F7: { + vkey: 'VK_F7', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F8: { + vkey: 'VK_F8', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F9: { + vkey: 'VK_F9', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F10: { + vkey: 'VK_F10', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F11: { + vkey: 'VK_F11', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F12: { + vkey: 'VK_F12', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + PrintScreen: { + vkey: 'VK_SNAPSHOT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ScrollLock: { + vkey: 'VK_SCROLL', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Pause: { + vkey: 'VK_NUMLOCK', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Insert: { + vkey: 'VK_INSERT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Home: { + vkey: 'VK_HOME', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + PageUp: { + vkey: 'VK_PRIOR', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Delete: { + vkey: 'VK_DELETE', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + End: { + vkey: 'VK_END', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + PageDown: { + vkey: 'VK_NEXT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowRight: { + vkey: 'VK_RIGHT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowLeft: { + vkey: 'VK_LEFT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowDown: { + vkey: 'VK_DOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ArrowUp: { + vkey: 'VK_UP', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumLock: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadDivide: { + vkey: 'VK_DIVIDE', + value: '/', + withShift: '/', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadMultiply: { + vkey: 'VK_MULTIPLY', + value: '*', + withShift: '*', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadSubtract: { + vkey: 'VK_SUBTRACT', + value: '-', + withShift: '-', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadAdd: { + vkey: 'VK_ADD', + value: '+', + withShift: '+', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadEnter: { + vkey: 'VK_RETURN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad1: { + vkey: 'VK_END', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad2: { + vkey: 'VK_DOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad3: { + vkey: 'VK_NEXT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad4: { + vkey: 'VK_LEFT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad5: { + vkey: 'VK_CLEAR', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad6: { + vkey: 'VK_RIGHT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad7: { + vkey: 'VK_HOME', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad8: { + vkey: 'VK_UP', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad9: { + vkey: 'VK_PRIOR', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Numpad0: { + vkey: 'VK_INSERT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadDecimal: { + vkey: 'VK_DELETE', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + IntlBackslash: { + vkey: 'VK_OEM_102', + value: '\\', + withShift: '/', + withAltGr: '', + withShiftAltGr: '' + }, + ContextMenu: { + vkey: 'VK_APPS', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Power: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadEqual: { + vkey: 'VK_CLEAR', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F13: { + vkey: 'VK_F13', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F14: { + vkey: 'VK_F14', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F15: { + vkey: 'VK_F15', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F16: { + vkey: 'VK_F16', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F17: { + vkey: 'VK_F17', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F18: { + vkey: 'VK_F18', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F19: { + vkey: 'VK_F19', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F20: { + vkey: 'VK_F20', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F21: { + vkey: 'VK_F21', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F22: { + vkey: 'VK_F22', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F23: { + vkey: 'VK_F23', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + F24: { + vkey: 'VK_F24', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Help: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Undo: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Cut: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Copy: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Paste: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AudioVolumeMute: { + vkey: 'VK_VOLUME_MUTE', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AudioVolumeUp: { + vkey: 'VK_VOLUME_UP', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AudioVolumeDown: { + vkey: 'VK_VOLUME_DOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NumpadComma: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + IntlRo: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + KanaMode: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + IntlYen: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Convert: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + NonConvert: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang1: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang2: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang3: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Lang4: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ControlLeft: { + vkey: 'VK_CONTROL', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ShiftLeft: { + vkey: 'VK_SHIFT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AltLeft: { + vkey: 'VK_MENU', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MetaLeft: { + vkey: 'VK_LWIN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ControlRight: { + vkey: 'VK_CONTROL', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + ShiftRight: { + vkey: 'VK_SHIFT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + AltRight: { + vkey: 'VK_MENU', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MetaRight: { + vkey: 'VK_RWIN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaTrackNext: { + vkey: 'VK_MEDIA_NEXT_TRACK', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaTrackPrevious: { + vkey: 'VK_MEDIA_PREV_TRACK', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaStop: { + vkey: 'VK_MEDIA_STOP', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + Eject: { + vkey: 'VK_UNKNOWN', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaPlayPause: { + vkey: 'VK_MEDIA_PLAY_PAUSE', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + MediaSelect: { + vkey: 'VK_LAUNCH_MEDIA_SELECT', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + LaunchMail: { + vkey: 'VK_LAUNCH_MAIL', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + LaunchApp2: { + vkey: 'VK_LAUNCH_APP2', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + LaunchApp1: { + vkey: 'VK_LAUNCH_APP1', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserSearch: { + vkey: 'VK_BROWSER_SEARCH', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserHome: { + vkey: 'VK_BROWSER_HOME', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserBack: { + vkey: 'VK_BROWSER_BACK', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserForward: { + vkey: 'VK_BROWSER_FORWARD', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserStop: { + vkey: 'VK_BROWSER_STOP', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserRefresh: { + vkey: 'VK_BROWSER_REFRESH', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + }, + BrowserFavorites: { + vkey: 'VK_BROWSER_FAVORITES', + value: '', + withShift: '', + withAltGr: '', + withShiftAltGr: '' + } +}); diff --git a/src/vs/workbench/services/keybinding/test/win_ru.txt b/src/vs/workbench/services/keybinding/test/win_ru.txt new file mode 100644 index 00000000000..d3872618cd9 --- /dev/null +++ b/src/vs/workbench/services/keybinding/test/win_ru.txt @@ -0,0 +1,284 @@ +------------------------------------------------------------------------------------------------------------ +| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | +------------------------------------------------------------------------------------------------------------ +| KeyA | ф | A | ф | NO | +| Shift+KeyA | Ф | Shift+A | Shift+ф | NO | +| Ctrl+Alt+KeyA | --- | Ctrl+Alt+A | Ctrl+Alt+ф | NO | +| Ctrl+Shift+Alt+KeyA | --- | Ctrl+Shift+Alt+A | Ctrl+Shift+Alt+ф | NO | +------------------------------------------------------------------------------------------------------------ +| KeyB | и | B | и | NO | +| Shift+KeyB | И | Shift+B | Shift+и | NO | +| Ctrl+Alt+KeyB | --- | Ctrl+Alt+B | Ctrl+Alt+и | NO | +| Ctrl+Shift+Alt+KeyB | --- | Ctrl+Shift+Alt+B | Ctrl+Shift+Alt+и | NO | +------------------------------------------------------------------------------------------------------------ +| KeyC | с | C | с | NO | +| Shift+KeyC | С | Shift+C | Shift+с | NO | +| Ctrl+Alt+KeyC | --- | Ctrl+Alt+C | Ctrl+Alt+с | NO | +| Ctrl+Shift+Alt+KeyC | --- | Ctrl+Shift+Alt+C | Ctrl+Shift+Alt+с | NO | +------------------------------------------------------------------------------------------------------------ +| KeyD | в | D | в | NO | +| Shift+KeyD | В | Shift+D | Shift+в | NO | +| Ctrl+Alt+KeyD | --- | Ctrl+Alt+D | Ctrl+Alt+в | NO | +| Ctrl+Shift+Alt+KeyD | --- | Ctrl+Shift+Alt+D | Ctrl+Shift+Alt+в | NO | +------------------------------------------------------------------------------------------------------------ +| KeyE | у | E | у | NO | +| Shift+KeyE | У | Shift+E | Shift+у | NO | +| Ctrl+Alt+KeyE | --- | Ctrl+Alt+E | Ctrl+Alt+у | NO | +| Ctrl+Shift+Alt+KeyE | --- | Ctrl+Shift+Alt+E | Ctrl+Shift+Alt+у | NO | +------------------------------------------------------------------------------------------------------------ +| KeyF | а | F | а | NO | +| Shift+KeyF | А | Shift+F | Shift+а | NO | +| Ctrl+Alt+KeyF | --- | Ctrl+Alt+F | Ctrl+Alt+а | NO | +| Ctrl+Shift+Alt+KeyF | --- | Ctrl+Shift+Alt+F | Ctrl+Shift+Alt+а | NO | +------------------------------------------------------------------------------------------------------------ +| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | +------------------------------------------------------------------------------------------------------------ +| KeyG | п | G | п | NO | +| Shift+KeyG | П | Shift+G | Shift+п | NO | +| Ctrl+Alt+KeyG | --- | Ctrl+Alt+G | Ctrl+Alt+п | NO | +| Ctrl+Shift+Alt+KeyG | --- | Ctrl+Shift+Alt+G | Ctrl+Shift+Alt+п | NO | +------------------------------------------------------------------------------------------------------------ +| KeyH | р | H | р | NO | +| Shift+KeyH | Р | Shift+H | Shift+р | NO | +| Ctrl+Alt+KeyH | --- | Ctrl+Alt+H | Ctrl+Alt+р | NO | +| Ctrl+Shift+Alt+KeyH | --- | Ctrl+Shift+Alt+H | Ctrl+Shift+Alt+р | NO | +------------------------------------------------------------------------------------------------------------ +| KeyI | ш | I | ш | NO | +| Shift+KeyI | Ш | Shift+I | Shift+ш | NO | +| Ctrl+Alt+KeyI | --- | Ctrl+Alt+I | Ctrl+Alt+ш | NO | +| Ctrl+Shift+Alt+KeyI | --- | Ctrl+Shift+Alt+I | Ctrl+Shift+Alt+ш | NO | +------------------------------------------------------------------------------------------------------------ +| KeyJ | о | J | о | NO | +| Shift+KeyJ | О | Shift+J | Shift+о | NO | +| Ctrl+Alt+KeyJ | --- | Ctrl+Alt+J | Ctrl+Alt+о | NO | +| Ctrl+Shift+Alt+KeyJ | --- | Ctrl+Shift+Alt+J | Ctrl+Shift+Alt+о | NO | +------------------------------------------------------------------------------------------------------------ +| KeyK | л | K | л | NO | +| Shift+KeyK | Л | Shift+K | Shift+л | NO | +| Ctrl+Alt+KeyK | --- | Ctrl+Alt+K | Ctrl+Alt+л | NO | +| Ctrl+Shift+Alt+KeyK | --- | Ctrl+Shift+Alt+K | Ctrl+Shift+Alt+л | NO | +------------------------------------------------------------------------------------------------------------ +| KeyL | д | L | д | NO | +| Shift+KeyL | Д | Shift+L | Shift+д | NO | +| Ctrl+Alt+KeyL | --- | Ctrl+Alt+L | Ctrl+Alt+д | NO | +| Ctrl+Shift+Alt+KeyL | --- | Ctrl+Shift+Alt+L | Ctrl+Shift+Alt+д | NO | +------------------------------------------------------------------------------------------------------------ +| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | +------------------------------------------------------------------------------------------------------------ +| KeyM | ь | M | ь | NO | +| Shift+KeyM | Ь | Shift+M | Shift+ь | NO | +| Ctrl+Alt+KeyM | --- | Ctrl+Alt+M | Ctrl+Alt+ь | NO | +| Ctrl+Shift+Alt+KeyM | --- | Ctrl+Shift+Alt+M | Ctrl+Shift+Alt+ь | NO | +------------------------------------------------------------------------------------------------------------ +| KeyN | т | N | т | NO | +| Shift+KeyN | Т | Shift+N | Shift+т | NO | +| Ctrl+Alt+KeyN | --- | Ctrl+Alt+N | Ctrl+Alt+т | NO | +| Ctrl+Shift+Alt+KeyN | --- | Ctrl+Shift+Alt+N | Ctrl+Shift+Alt+т | NO | +------------------------------------------------------------------------------------------------------------ +| KeyO | щ | O | щ | NO | +| Shift+KeyO | Щ | Shift+O | Shift+щ | NO | +| Ctrl+Alt+KeyO | --- | Ctrl+Alt+O | Ctrl+Alt+щ | NO | +| Ctrl+Shift+Alt+KeyO | --- | Ctrl+Shift+Alt+O | Ctrl+Shift+Alt+щ | NO | +------------------------------------------------------------------------------------------------------------ +| KeyP | з | P | з | NO | +| Shift+KeyP | З | Shift+P | Shift+з | NO | +| Ctrl+Alt+KeyP | --- | Ctrl+Alt+P | Ctrl+Alt+з | NO | +| Ctrl+Shift+Alt+KeyP | --- | Ctrl+Shift+Alt+P | Ctrl+Shift+Alt+з | NO | +------------------------------------------------------------------------------------------------------------ +| KeyQ | й | Q | й | NO | +| Shift+KeyQ | Й | Shift+Q | Shift+й | NO | +| Ctrl+Alt+KeyQ | --- | Ctrl+Alt+Q | Ctrl+Alt+й | NO | +| Ctrl+Shift+Alt+KeyQ | --- | Ctrl+Shift+Alt+Q | Ctrl+Shift+Alt+й | NO | +------------------------------------------------------------------------------------------------------------ +| KeyR | к | R | к | NO | +| Shift+KeyR | К | Shift+R | Shift+к | NO | +| Ctrl+Alt+KeyR | --- | Ctrl+Alt+R | Ctrl+Alt+к | NO | +| Ctrl+Shift+Alt+KeyR | --- | Ctrl+Shift+Alt+R | Ctrl+Shift+Alt+к | NO | +------------------------------------------------------------------------------------------------------------ +| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | +------------------------------------------------------------------------------------------------------------ +| KeyS | ы | S | ы | NO | +| Shift+KeyS | Ы | Shift+S | Shift+ы | NO | +| Ctrl+Alt+KeyS | --- | Ctrl+Alt+S | Ctrl+Alt+ы | NO | +| Ctrl+Shift+Alt+KeyS | --- | Ctrl+Shift+Alt+S | Ctrl+Shift+Alt+ы | NO | +------------------------------------------------------------------------------------------------------------ +| KeyT | е | T | е | NO | +| Shift+KeyT | Е | Shift+T | Shift+е | NO | +| Ctrl+Alt+KeyT | --- | Ctrl+Alt+T | Ctrl+Alt+е | NO | +| Ctrl+Shift+Alt+KeyT | --- | Ctrl+Shift+Alt+T | Ctrl+Shift+Alt+е | NO | +------------------------------------------------------------------------------------------------------------ +| KeyU | г | U | г | NO | +| Shift+KeyU | Г | Shift+U | Shift+г | NO | +| Ctrl+Alt+KeyU | --- | Ctrl+Alt+U | Ctrl+Alt+г | NO | +| Ctrl+Shift+Alt+KeyU | --- | Ctrl+Shift+Alt+U | Ctrl+Shift+Alt+г | NO | +------------------------------------------------------------------------------------------------------------ +| KeyV | м | V | м | NO | +| Shift+KeyV | М | Shift+V | Shift+м | NO | +| Ctrl+Alt+KeyV | --- | Ctrl+Alt+V | Ctrl+Alt+м | NO | +| Ctrl+Shift+Alt+KeyV | --- | Ctrl+Shift+Alt+V | Ctrl+Shift+Alt+м | NO | +------------------------------------------------------------------------------------------------------------ +| KeyW | ц | W | ц | NO | +| Shift+KeyW | Ц | Shift+W | Shift+ц | NO | +| Ctrl+Alt+KeyW | --- | Ctrl+Alt+W | Ctrl+Alt+ц | NO | +| Ctrl+Shift+Alt+KeyW | --- | Ctrl+Shift+Alt+W | Ctrl+Shift+Alt+ц | NO | +------------------------------------------------------------------------------------------------------------ +| KeyX | ч | X | ч | NO | +| Shift+KeyX | Ч | Shift+X | Shift+ч | NO | +| Ctrl+Alt+KeyX | --- | Ctrl+Alt+X | Ctrl+Alt+ч | NO | +| Ctrl+Shift+Alt+KeyX | --- | Ctrl+Shift+Alt+X | Ctrl+Shift+Alt+ч | NO | +------------------------------------------------------------------------------------------------------------ +| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | +------------------------------------------------------------------------------------------------------------ +| KeyY | н | Y | н | NO | +| Shift+KeyY | Н | Shift+Y | Shift+н | NO | +| Ctrl+Alt+KeyY | --- | Ctrl+Alt+Y | Ctrl+Alt+н | NO | +| Ctrl+Shift+Alt+KeyY | --- | Ctrl+Shift+Alt+Y | Ctrl+Shift+Alt+н | NO | +------------------------------------------------------------------------------------------------------------ +| KeyZ | я | Z | я | NO | +| Shift+KeyZ | Я | Shift+Z | Shift+я | NO | +| Ctrl+Alt+KeyZ | --- | Ctrl+Alt+Z | Ctrl+Alt+я | NO | +| Ctrl+Shift+Alt+KeyZ | --- | Ctrl+Shift+Alt+Z | Ctrl+Shift+Alt+я | NO | +------------------------------------------------------------------------------------------------------------ +| Digit1 | 1 | 1 | 1 | | +| Shift+Digit1 | ! | Shift+1 | Shift+1 | | +| Ctrl+Alt+Digit1 | --- | Ctrl+Alt+1 | Ctrl+Alt+1 | | +| Ctrl+Shift+Alt+Digit1 | --- | Ctrl+Shift+Alt+1 | Ctrl+Shift+Alt+1 | | +------------------------------------------------------------------------------------------------------------ +| Digit2 | 2 | 2 | 2 | | +| Shift+Digit2 | " | Shift+2 | Shift+2 | | +| Ctrl+Alt+Digit2 | --- | Ctrl+Alt+2 | Ctrl+Alt+2 | | +| Ctrl+Shift+Alt+Digit2 | --- | Ctrl+Shift+Alt+2 | Ctrl+Shift+Alt+2 | | +------------------------------------------------------------------------------------------------------------ +| Digit3 | 3 | 3 | 3 | | +| Shift+Digit3 | № | Shift+3 | Shift+3 | | +| Ctrl+Alt+Digit3 | --- | Ctrl+Alt+3 | Ctrl+Alt+3 | | +| Ctrl+Shift+Alt+Digit3 | --- | Ctrl+Shift+Alt+3 | Ctrl+Shift+Alt+3 | | +------------------------------------------------------------------------------------------------------------ +| Digit4 | 4 | 4 | 4 | | +| Shift+Digit4 | ; | Shift+4 | Shift+4 | | +| Ctrl+Alt+Digit4 | --- | Ctrl+Alt+4 | Ctrl+Alt+4 | | +| Ctrl+Shift+Alt+Digit4 | --- | Ctrl+Shift+Alt+4 | Ctrl+Shift+Alt+4 | | +------------------------------------------------------------------------------------------------------------ +| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | +------------------------------------------------------------------------------------------------------------ +| Digit5 | 5 | 5 | 5 | | +| Shift+Digit5 | % | Shift+5 | Shift+5 | | +| Ctrl+Alt+Digit5 | --- | Ctrl+Alt+5 | Ctrl+Alt+5 | | +| Ctrl+Shift+Alt+Digit5 | --- | Ctrl+Shift+Alt+5 | Ctrl+Shift+Alt+5 | | +------------------------------------------------------------------------------------------------------------ +| Digit6 | 6 | 6 | 6 | | +| Shift+Digit6 | : | Shift+6 | Shift+6 | | +| Ctrl+Alt+Digit6 | --- | Ctrl+Alt+6 | Ctrl+Alt+6 | | +| Ctrl+Shift+Alt+Digit6 | --- | Ctrl+Shift+Alt+6 | Ctrl+Shift+Alt+6 | | +------------------------------------------------------------------------------------------------------------ +| Digit7 | 7 | 7 | 7 | | +| Shift+Digit7 | ? | Shift+7 | Shift+7 | | +| Ctrl+Alt+Digit7 | --- | Ctrl+Alt+7 | Ctrl+Alt+7 | | +| Ctrl+Shift+Alt+Digit7 | --- | Ctrl+Shift+Alt+7 | Ctrl+Shift+Alt+7 | | +------------------------------------------------------------------------------------------------------------ +| Digit8 | 8 | 8 | 8 | | +| Shift+Digit8 | * | Shift+8 | Shift+8 | | +| Ctrl+Alt+Digit8 | ₽ | Ctrl+Alt+8 | Ctrl+Alt+8 | | +| Ctrl+Shift+Alt+Digit8 | --- | Ctrl+Shift+Alt+8 | Ctrl+Shift+Alt+8 | | +------------------------------------------------------------------------------------------------------------ +| Digit9 | 9 | 9 | 9 | | +| Shift+Digit9 | ( | Shift+9 | Shift+9 | | +| Ctrl+Alt+Digit9 | --- | Ctrl+Alt+9 | Ctrl+Alt+9 | | +| Ctrl+Shift+Alt+Digit9 | --- | Ctrl+Shift+Alt+9 | Ctrl+Shift+Alt+9 | | +------------------------------------------------------------------------------------------------------------ +| Digit0 | 0 | 0 | 0 | | +| Shift+Digit0 | ) | Shift+0 | Shift+0 | | +| Ctrl+Alt+Digit0 | --- | Ctrl+Alt+0 | Ctrl+Alt+0 | | +| Ctrl+Shift+Alt+Digit0 | --- | Ctrl+Shift+Alt+0 | Ctrl+Shift+Alt+0 | | +------------------------------------------------------------------------------------------------------------ +| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | +------------------------------------------------------------------------------------------------------------ +| Minus | - | - | - | NO | +| Shift+Minus | _ | Shift+- | Shift+- | NO | +| Ctrl+Alt+Minus | --- | Ctrl+Alt+- | Ctrl+Alt+- | NO | +| Ctrl+Shift+Alt+Minus | --- | Ctrl+Shift+Alt+- | Ctrl+Shift+Alt+- | NO | +------------------------------------------------------------------------------------------------------------ +| Equal | = | = | = | NO | +| Shift+Equal | + | Shift+= | Shift+= | NO | +| Ctrl+Alt+Equal | --- | Ctrl+Alt+= | Ctrl+Alt+= | NO | +| Ctrl+Shift+Alt+Equal | --- | Ctrl+Shift+Alt+= | Ctrl+Shift+Alt+= | NO | +------------------------------------------------------------------------------------------------------------ +| BracketLeft | х | [ | х | NO | +| Shift+BracketLeft | Х | Shift+[ | Shift+х | NO | +| Ctrl+Alt+BracketLeft | --- | Ctrl+Alt+[ | Ctrl+Alt+х | NO | +| Ctrl+Shift+Alt+BracketLeft | --- | Ctrl+Shift+Alt+[ | Ctrl+Shift+Alt+х | NO | +------------------------------------------------------------------------------------------------------------ +| BracketRight | ъ | ] | ъ | NO | +| Shift+BracketRight | Ъ | Shift+] | Shift+ъ | NO | +| Ctrl+Alt+BracketRight | --- | Ctrl+Alt+] | Ctrl+Alt+ъ | NO | +| Ctrl+Shift+Alt+BracketRight | --- | Ctrl+Shift+Alt+] | Ctrl+Shift+Alt+ъ | NO | +------------------------------------------------------------------------------------------------------------ +| Backslash | \ | \ | \ | NO | +| Shift+Backslash | / | Shift+\ | Shift+\ | NO | +| Ctrl+Alt+Backslash | --- | Ctrl+Alt+\ | Ctrl+Alt+\ | NO | +| Ctrl+Shift+Alt+Backslash | --- | Ctrl+Shift+Alt+\ | Ctrl+Shift+Alt+\ | NO | +------------------------------------------------------------------------------------------------------------ +| IntlHash | --- | null | null | NO | +| Shift+IntlHash | --- | null | null | NO | +| Ctrl+Alt+IntlHash | --- | null | null | NO | +| Ctrl+Shift+Alt+IntlHash | --- | null | null | NO | +------------------------------------------------------------------------------------------------------------ +| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | +------------------------------------------------------------------------------------------------------------ +| Semicolon | ж | ; | ж | NO | +| Shift+Semicolon | Ж | Shift+; | Shift+ж | NO | +| Ctrl+Alt+Semicolon | --- | Ctrl+Alt+; | Ctrl+Alt+ж | NO | +| Ctrl+Shift+Alt+Semicolon | --- | Ctrl+Shift+Alt+; | Ctrl+Shift+Alt+ж | NO | +------------------------------------------------------------------------------------------------------------ +| Quote | э | ' | э | NO | +| Shift+Quote | Э | Shift+' | Shift+э | NO | +| Ctrl+Alt+Quote | --- | Ctrl+Alt+' | Ctrl+Alt+э | NO | +| Ctrl+Shift+Alt+Quote | --- | Ctrl+Shift+Alt+' | Ctrl+Shift+Alt+э | NO | +------------------------------------------------------------------------------------------------------------ +| Backquote | ё | ` | ё | NO | +| Shift+Backquote | Ё | Shift+` | Shift+ё | NO | +| Ctrl+Alt+Backquote | --- | Ctrl+Alt+` | Ctrl+Alt+ё | NO | +| Ctrl+Shift+Alt+Backquote | --- | Ctrl+Shift+Alt+` | Ctrl+Shift+Alt+ё | NO | +------------------------------------------------------------------------------------------------------------ +| Comma | б | , | б | NO | +| Shift+Comma | Б | Shift+, | Shift+б | NO | +| Ctrl+Alt+Comma | --- | Ctrl+Alt+, | Ctrl+Alt+б | NO | +| Ctrl+Shift+Alt+Comma | --- | Ctrl+Shift+Alt+, | Ctrl+Shift+Alt+б | NO | +------------------------------------------------------------------------------------------------------------ +| Period | ю | . | ю | NO | +| Shift+Period | Ю | Shift+. | Shift+ю | NO | +| Ctrl+Alt+Period | --- | Ctrl+Alt+. | Ctrl+Alt+ю | NO | +| Ctrl+Shift+Alt+Period | --- | Ctrl+Shift+Alt+. | Ctrl+Shift+Alt+ю | NO | +------------------------------------------------------------------------------------------------------------ +| Slash | . | / | . | NO | +| Shift+Slash | , | Shift+/ | Shift+. | NO | +| Ctrl+Alt+Slash | --- | Ctrl+Alt+/ | Ctrl+Alt+. | NO | +| Ctrl+Shift+Alt+Slash | --- | Ctrl+Shift+Alt+/ | Ctrl+Shift+Alt+. | NO | +------------------------------------------------------------------------------------------------------------ +| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | +------------------------------------------------------------------------------------------------------------ +| ArrowUp | --- | UpArrow | UpArrow | | +| Shift+ArrowUp | --- | Shift+UpArrow | Shift+UpArrow | | +| Ctrl+Alt+ArrowUp | --- | Ctrl+Alt+UpArrow | Ctrl+Alt+UpArrow | | +| Ctrl+Shift+Alt+ArrowUp | --- | Ctrl+Shift+Alt+UpArrow | Ctrl+Shift+Alt+UpArrow | | +------------------------------------------------------------------------------------------------------------ +| Numpad0 | --- | NumPad0 | NumPad0 | | +| Shift+Numpad0 | --- | Shift+NumPad0 | Shift+NumPad0 | | +| Ctrl+Alt+Numpad0 | --- | Ctrl+Alt+NumPad0 | Ctrl+Alt+NumPad0 | | +| Ctrl+Shift+Alt+Numpad0 | --- | Ctrl+Shift+Alt+NumPad0 | Ctrl+Shift+Alt+NumPad0 | | +------------------------------------------------------------------------------------------------------------ +| IntlBackslash | \ | OEM_102 | \ | NO | +| Shift+IntlBackslash | / | Shift+OEM_102 | Shift+\ | NO | +| Ctrl+Alt+IntlBackslash | --- | Ctrl+Alt+OEM_102 | Ctrl+Alt+\ | NO | +| Ctrl+Shift+Alt+IntlBackslash | --- | Ctrl+Shift+Alt+OEM_102 | Ctrl+Shift+Alt+\ | NO | +------------------------------------------------------------------------------------------------------------ +| IntlRo | --- | null | null | NO | +| Shift+IntlRo | --- | null | null | NO | +| Ctrl+Alt+IntlRo | --- | null | null | NO | +| Ctrl+Shift+Alt+IntlRo | --- | null | null | NO | +------------------------------------------------------------------------------------------------------------ +| IntlYen | --- | null | null | NO | +| Shift+IntlYen | --- | null | null | NO | +| Ctrl+Alt+IntlYen | --- | null | null | NO | +| Ctrl+Shift+Alt+IntlYen | --- | null | null | NO | +------------------------------------------------------------------------------------------------------------ \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts index 9ec12ce6b6c..5378fae982e 100644 --- a/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts @@ -406,7 +406,6 @@ suite('keyboardMapper - WINDOWS en_us', () => { }); }); - suite('keyboardMapper - WINDOWS por_ptb', () => { let mapper: WindowsKeyboardMapper; @@ -469,6 +468,22 @@ suite('keyboardMapper - WINDOWS por_ptb', () => { }); }); +suite('keyboardMapper - WINDOWS ru', () => { + + let mapper: WindowsKeyboardMapper; + + suiteSetup((done) => { + createKeyboardMapper(false, 'win_ru').then((_mapper) => { + mapper = _mapper; + done(); + }, done); + }); + + test('mapping', (done) => { + assertMapping(WRITE_FILE_IF_DIFFERENT, mapper, 'win_ru.txt', done); + }); +}); + suite('misc', () => { test('issue #23513: Toggle Sidebar Visibility and Go to Line display same key mapping in Arabic keyboard', () => { const mapper = new WindowsKeyboardMapper(false, { From cf5c7cf6e3167994905253625cf99661ffb49fda Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sun, 21 May 2017 11:19:30 +0200 Subject: [PATCH 0722/1164] Add User settings column to windows keyboard mapper test suites --- .../common/windowsKeyboardMapper.ts | 11 +- .../services/keybinding/test/win_de_ch.txt | 568 +++++++++--------- .../services/keybinding/test/win_en_us.txt | 568 +++++++++--------- .../services/keybinding/test/win_por_ptb.txt | 568 +++++++++--------- .../services/keybinding/test/win_ru.txt | 568 +++++++++--------- 5 files changed, 1142 insertions(+), 1141 deletions(-) diff --git a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts index 0f59d1047f1..3a90f85fdfd 100644 --- a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts @@ -377,7 +377,7 @@ export class WindowsKeyboardMapper implements IKeyboardMapper { ]; let cnt = 0; - result.push(`------------------------------------------------------------------------------------------------------------`); + result.push(`-----------------------------------------------------------------------------------------------------------------------------------------`); for (let scanCode = ScanCode.None; scanCode < ScanCode.MAX_VALUE; scanCode++) { if (IMMUTABLE_CODE_TO_KEY_CODE[scanCode] !== -1) { if (immutableSamples.indexOf(scanCode) === -1) { @@ -386,8 +386,8 @@ export class WindowsKeyboardMapper implements IKeyboardMapper { } if (cnt % 6 === 0) { - result.push(`| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG |`); - result.push(`------------------------------------------------------------------------------------------------------------`); + result.push(`| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG |`); + result.push(`-----------------------------------------------------------------------------------------------------------------------------------------`); } cnt++; @@ -408,13 +408,14 @@ export class WindowsKeyboardMapper implements IKeyboardMapper { const outScanCode = `${ctrlKey ? 'Ctrl+' : ''}${shiftKey ? 'Shift+' : ''}${altKey ? 'Alt+' : ''}${strCode}`; const ariaLabel = (resolvedKb ? resolvedKb.getAriaLabel() : null); const outUILabel = (ariaLabel ? ariaLabel.replace(/Control\+/, 'Ctrl+') : null); + const outUserSettings = (resolvedKb ? resolvedKb.getUserSettingsLabel() : null); const outKey = WindowsNativeResolvedKeybinding.getProducedChar(scanCodeBinding, mapping); const outKb = (strKeyCode ? `${ctrlKey ? 'Ctrl+' : ''}${shiftKey ? 'Shift+' : ''}${altKey ? 'Alt+' : ''}${strKeyCode}` : null); const isWYSIWYG = (resolvedKb ? resolvedKb.isWYSIWYG() : false); const outWYSIWYG = (isWYSIWYG ? ' ' : ' NO '); - result.push(`| ${this._leftPad(outScanCode, 30)} | ${outKey} | ${this._leftPad(outKb, 25)} | ${this._leftPad(outUILabel, 25)} | ${outWYSIWYG} |`); + result.push(`| ${this._leftPad(outScanCode, 30)} | ${outKey} | ${this._leftPad(outKb, 25)} | ${this._leftPad(outUILabel, 25)} | ${this._leftPad(outUserSettings, 25)} | ${outWYSIWYG} |`); } - result.push(`------------------------------------------------------------------------------------------------------------`); + result.push(`-----------------------------------------------------------------------------------------------------------------------------------------`); } diff --git a/src/vs/workbench/services/keybinding/test/win_de_ch.txt b/src/vs/workbench/services/keybinding/test/win_de_ch.txt index c0358ef1a49..ac0575e250e 100644 --- a/src/vs/workbench/services/keybinding/test/win_de_ch.txt +++ b/src/vs/workbench/services/keybinding/test/win_de_ch.txt @@ -1,284 +1,284 @@ ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyA | a | A | A | | -| Shift+KeyA | A | Shift+A | Shift+A | | -| Ctrl+Alt+KeyA | --- | Ctrl+Alt+A | Ctrl+Alt+A | | -| Ctrl+Shift+Alt+KeyA | --- | Ctrl+Shift+Alt+A | Ctrl+Shift+Alt+A | | ------------------------------------------------------------------------------------------------------------- -| KeyB | b | B | B | | -| Shift+KeyB | B | Shift+B | Shift+B | | -| Ctrl+Alt+KeyB | --- | Ctrl+Alt+B | Ctrl+Alt+B | | -| Ctrl+Shift+Alt+KeyB | --- | Ctrl+Shift+Alt+B | Ctrl+Shift+Alt+B | | ------------------------------------------------------------------------------------------------------------- -| KeyC | c | C | C | | -| Shift+KeyC | C | Shift+C | Shift+C | | -| Ctrl+Alt+KeyC | --- | Ctrl+Alt+C | Ctrl+Alt+C | | -| Ctrl+Shift+Alt+KeyC | --- | Ctrl+Shift+Alt+C | Ctrl+Shift+Alt+C | | ------------------------------------------------------------------------------------------------------------- -| KeyD | d | D | D | | -| Shift+KeyD | D | Shift+D | Shift+D | | -| Ctrl+Alt+KeyD | --- | Ctrl+Alt+D | Ctrl+Alt+D | | -| Ctrl+Shift+Alt+KeyD | --- | Ctrl+Shift+Alt+D | Ctrl+Shift+Alt+D | | ------------------------------------------------------------------------------------------------------------- -| KeyE | e | E | E | | -| Shift+KeyE | E | Shift+E | Shift+E | | -| Ctrl+Alt+KeyE | € | Ctrl+Alt+E | Ctrl+Alt+E | | -| Ctrl+Shift+Alt+KeyE | --- | Ctrl+Shift+Alt+E | Ctrl+Shift+Alt+E | | ------------------------------------------------------------------------------------------------------------- -| KeyF | f | F | F | | -| Shift+KeyF | F | Shift+F | Shift+F | | -| Ctrl+Alt+KeyF | --- | Ctrl+Alt+F | Ctrl+Alt+F | | -| Ctrl+Shift+Alt+KeyF | --- | Ctrl+Shift+Alt+F | Ctrl+Shift+Alt+F | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyG | g | G | G | | -| Shift+KeyG | G | Shift+G | Shift+G | | -| Ctrl+Alt+KeyG | --- | Ctrl+Alt+G | Ctrl+Alt+G | | -| Ctrl+Shift+Alt+KeyG | --- | Ctrl+Shift+Alt+G | Ctrl+Shift+Alt+G | | ------------------------------------------------------------------------------------------------------------- -| KeyH | h | H | H | | -| Shift+KeyH | H | Shift+H | Shift+H | | -| Ctrl+Alt+KeyH | --- | Ctrl+Alt+H | Ctrl+Alt+H | | -| Ctrl+Shift+Alt+KeyH | --- | Ctrl+Shift+Alt+H | Ctrl+Shift+Alt+H | | ------------------------------------------------------------------------------------------------------------- -| KeyI | i | I | I | | -| Shift+KeyI | I | Shift+I | Shift+I | | -| Ctrl+Alt+KeyI | --- | Ctrl+Alt+I | Ctrl+Alt+I | | -| Ctrl+Shift+Alt+KeyI | --- | Ctrl+Shift+Alt+I | Ctrl+Shift+Alt+I | | ------------------------------------------------------------------------------------------------------------- -| KeyJ | j | J | J | | -| Shift+KeyJ | J | Shift+J | Shift+J | | -| Ctrl+Alt+KeyJ | --- | Ctrl+Alt+J | Ctrl+Alt+J | | -| Ctrl+Shift+Alt+KeyJ | --- | Ctrl+Shift+Alt+J | Ctrl+Shift+Alt+J | | ------------------------------------------------------------------------------------------------------------- -| KeyK | k | K | K | | -| Shift+KeyK | K | Shift+K | Shift+K | | -| Ctrl+Alt+KeyK | --- | Ctrl+Alt+K | Ctrl+Alt+K | | -| Ctrl+Shift+Alt+KeyK | --- | Ctrl+Shift+Alt+K | Ctrl+Shift+Alt+K | | ------------------------------------------------------------------------------------------------------------- -| KeyL | l | L | L | | -| Shift+KeyL | L | Shift+L | Shift+L | | -| Ctrl+Alt+KeyL | --- | Ctrl+Alt+L | Ctrl+Alt+L | | -| Ctrl+Shift+Alt+KeyL | --- | Ctrl+Shift+Alt+L | Ctrl+Shift+Alt+L | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyM | m | M | M | | -| Shift+KeyM | M | Shift+M | Shift+M | | -| Ctrl+Alt+KeyM | --- | Ctrl+Alt+M | Ctrl+Alt+M | | -| Ctrl+Shift+Alt+KeyM | --- | Ctrl+Shift+Alt+M | Ctrl+Shift+Alt+M | | ------------------------------------------------------------------------------------------------------------- -| KeyN | n | N | N | | -| Shift+KeyN | N | Shift+N | Shift+N | | -| Ctrl+Alt+KeyN | --- | Ctrl+Alt+N | Ctrl+Alt+N | | -| Ctrl+Shift+Alt+KeyN | --- | Ctrl+Shift+Alt+N | Ctrl+Shift+Alt+N | | ------------------------------------------------------------------------------------------------------------- -| KeyO | o | O | O | | -| Shift+KeyO | O | Shift+O | Shift+O | | -| Ctrl+Alt+KeyO | --- | Ctrl+Alt+O | Ctrl+Alt+O | | -| Ctrl+Shift+Alt+KeyO | --- | Ctrl+Shift+Alt+O | Ctrl+Shift+Alt+O | | ------------------------------------------------------------------------------------------------------------- -| KeyP | p | P | P | | -| Shift+KeyP | P | Shift+P | Shift+P | | -| Ctrl+Alt+KeyP | --- | Ctrl+Alt+P | Ctrl+Alt+P | | -| Ctrl+Shift+Alt+KeyP | --- | Ctrl+Shift+Alt+P | Ctrl+Shift+Alt+P | | ------------------------------------------------------------------------------------------------------------- -| KeyQ | q | Q | Q | | -| Shift+KeyQ | Q | Shift+Q | Shift+Q | | -| Ctrl+Alt+KeyQ | --- | Ctrl+Alt+Q | Ctrl+Alt+Q | | -| Ctrl+Shift+Alt+KeyQ | --- | Ctrl+Shift+Alt+Q | Ctrl+Shift+Alt+Q | | ------------------------------------------------------------------------------------------------------------- -| KeyR | r | R | R | | -| Shift+KeyR | R | Shift+R | Shift+R | | -| Ctrl+Alt+KeyR | --- | Ctrl+Alt+R | Ctrl+Alt+R | | -| Ctrl+Shift+Alt+KeyR | --- | Ctrl+Shift+Alt+R | Ctrl+Shift+Alt+R | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyS | s | S | S | | -| Shift+KeyS | S | Shift+S | Shift+S | | -| Ctrl+Alt+KeyS | --- | Ctrl+Alt+S | Ctrl+Alt+S | | -| Ctrl+Shift+Alt+KeyS | --- | Ctrl+Shift+Alt+S | Ctrl+Shift+Alt+S | | ------------------------------------------------------------------------------------------------------------- -| KeyT | t | T | T | | -| Shift+KeyT | T | Shift+T | Shift+T | | -| Ctrl+Alt+KeyT | --- | Ctrl+Alt+T | Ctrl+Alt+T | | -| Ctrl+Shift+Alt+KeyT | --- | Ctrl+Shift+Alt+T | Ctrl+Shift+Alt+T | | ------------------------------------------------------------------------------------------------------------- -| KeyU | u | U | U | | -| Shift+KeyU | U | Shift+U | Shift+U | | -| Ctrl+Alt+KeyU | --- | Ctrl+Alt+U | Ctrl+Alt+U | | -| Ctrl+Shift+Alt+KeyU | --- | Ctrl+Shift+Alt+U | Ctrl+Shift+Alt+U | | ------------------------------------------------------------------------------------------------------------- -| KeyV | v | V | V | | -| Shift+KeyV | V | Shift+V | Shift+V | | -| Ctrl+Alt+KeyV | --- | Ctrl+Alt+V | Ctrl+Alt+V | | -| Ctrl+Shift+Alt+KeyV | --- | Ctrl+Shift+Alt+V | Ctrl+Shift+Alt+V | | ------------------------------------------------------------------------------------------------------------- -| KeyW | w | W | W | | -| Shift+KeyW | W | Shift+W | Shift+W | | -| Ctrl+Alt+KeyW | --- | Ctrl+Alt+W | Ctrl+Alt+W | | -| Ctrl+Shift+Alt+KeyW | --- | Ctrl+Shift+Alt+W | Ctrl+Shift+Alt+W | | ------------------------------------------------------------------------------------------------------------- -| KeyX | x | X | X | | -| Shift+KeyX | X | Shift+X | Shift+X | | -| Ctrl+Alt+KeyX | --- | Ctrl+Alt+X | Ctrl+Alt+X | | -| Ctrl+Shift+Alt+KeyX | --- | Ctrl+Shift+Alt+X | Ctrl+Shift+Alt+X | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyY | z | Z | Z | | -| Shift+KeyY | Z | Shift+Z | Shift+Z | | -| Ctrl+Alt+KeyY | --- | Ctrl+Alt+Z | Ctrl+Alt+Z | | -| Ctrl+Shift+Alt+KeyY | --- | Ctrl+Shift+Alt+Z | Ctrl+Shift+Alt+Z | | ------------------------------------------------------------------------------------------------------------- -| KeyZ | y | Y | Y | | -| Shift+KeyZ | Y | Shift+Y | Shift+Y | | -| Ctrl+Alt+KeyZ | --- | Ctrl+Alt+Y | Ctrl+Alt+Y | | -| Ctrl+Shift+Alt+KeyZ | --- | Ctrl+Shift+Alt+Y | Ctrl+Shift+Alt+Y | | ------------------------------------------------------------------------------------------------------------- -| Digit1 | 1 | 1 | 1 | | -| Shift+Digit1 | + | Shift+1 | Shift+1 | | -| Ctrl+Alt+Digit1 | ¦ | Ctrl+Alt+1 | Ctrl+Alt+1 | | -| Ctrl+Shift+Alt+Digit1 | --- | Ctrl+Shift+Alt+1 | Ctrl+Shift+Alt+1 | | ------------------------------------------------------------------------------------------------------------- -| Digit2 | 2 | 2 | 2 | | -| Shift+Digit2 | " | Shift+2 | Shift+2 | | -| Ctrl+Alt+Digit2 | @ | Ctrl+Alt+2 | Ctrl+Alt+2 | | -| Ctrl+Shift+Alt+Digit2 | --- | Ctrl+Shift+Alt+2 | Ctrl+Shift+Alt+2 | | ------------------------------------------------------------------------------------------------------------- -| Digit3 | 3 | 3 | 3 | | -| Shift+Digit3 | * | Shift+3 | Shift+3 | | -| Ctrl+Alt+Digit3 | # | Ctrl+Alt+3 | Ctrl+Alt+3 | | -| Ctrl+Shift+Alt+Digit3 | --- | Ctrl+Shift+Alt+3 | Ctrl+Shift+Alt+3 | | ------------------------------------------------------------------------------------------------------------- -| Digit4 | 4 | 4 | 4 | | -| Shift+Digit4 | ç | Shift+4 | Shift+4 | | -| Ctrl+Alt+Digit4 | ° | Ctrl+Alt+4 | Ctrl+Alt+4 | | -| Ctrl+Shift+Alt+Digit4 | --- | Ctrl+Shift+Alt+4 | Ctrl+Shift+Alt+4 | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| Digit5 | 5 | 5 | 5 | | -| Shift+Digit5 | % | Shift+5 | Shift+5 | | -| Ctrl+Alt+Digit5 | § | Ctrl+Alt+5 | Ctrl+Alt+5 | | -| Ctrl+Shift+Alt+Digit5 | --- | Ctrl+Shift+Alt+5 | Ctrl+Shift+Alt+5 | | ------------------------------------------------------------------------------------------------------------- -| Digit6 | 6 | 6 | 6 | | -| Shift+Digit6 | & | Shift+6 | Shift+6 | | -| Ctrl+Alt+Digit6 | ¬ | Ctrl+Alt+6 | Ctrl+Alt+6 | | -| Ctrl+Shift+Alt+Digit6 | --- | Ctrl+Shift+Alt+6 | Ctrl+Shift+Alt+6 | | ------------------------------------------------------------------------------------------------------------- -| Digit7 | 7 | 7 | 7 | | -| Shift+Digit7 | / | Shift+7 | Shift+7 | | -| Ctrl+Alt+Digit7 | | | Ctrl+Alt+7 | Ctrl+Alt+7 | | -| Ctrl+Shift+Alt+Digit7 | --- | Ctrl+Shift+Alt+7 | Ctrl+Shift+Alt+7 | | ------------------------------------------------------------------------------------------------------------- -| Digit8 | 8 | 8 | 8 | | -| Shift+Digit8 | ( | Shift+8 | Shift+8 | | -| Ctrl+Alt+Digit8 | ¢ | Ctrl+Alt+8 | Ctrl+Alt+8 | | -| Ctrl+Shift+Alt+Digit8 | --- | Ctrl+Shift+Alt+8 | Ctrl+Shift+Alt+8 | | ------------------------------------------------------------------------------------------------------------- -| Digit9 | 9 | 9 | 9 | | -| Shift+Digit9 | ) | Shift+9 | Shift+9 | | -| Ctrl+Alt+Digit9 | --- | Ctrl+Alt+9 | Ctrl+Alt+9 | | -| Ctrl+Shift+Alt+Digit9 | --- | Ctrl+Shift+Alt+9 | Ctrl+Shift+Alt+9 | | ------------------------------------------------------------------------------------------------------------- -| Digit0 | 0 | 0 | 0 | | -| Shift+Digit0 | = | Shift+0 | Shift+0 | | -| Ctrl+Alt+Digit0 | --- | Ctrl+Alt+0 | Ctrl+Alt+0 | | -| Ctrl+Shift+Alt+Digit0 | --- | Ctrl+Shift+Alt+0 | Ctrl+Shift+Alt+0 | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| Minus | ' | [ | ' | NO | -| Shift+Minus | ? | Shift+[ | Shift+' | NO | -| Ctrl+Alt+Minus | ´ | Ctrl+Alt+[ | Ctrl+Alt+' | NO | -| Ctrl+Shift+Alt+Minus | --- | Ctrl+Shift+Alt+[ | Ctrl+Shift+Alt+' | NO | ------------------------------------------------------------------------------------------------------------- -| Equal | ^ | ] | ^ | NO | -| Shift+Equal | ` | Shift+] | Shift+^ | NO | -| Ctrl+Alt+Equal | ~ | Ctrl+Alt+] | Ctrl+Alt+^ | NO | -| Ctrl+Shift+Alt+Equal | --- | Ctrl+Shift+Alt+] | Ctrl+Shift+Alt+^ | NO | ------------------------------------------------------------------------------------------------------------- -| BracketLeft | ü | ; | ü | NO | -| Shift+BracketLeft | è | Shift+; | Shift+ü | NO | -| Ctrl+Alt+BracketLeft | [ | Ctrl+Alt+; | Ctrl+Alt+ü | NO | -| Ctrl+Shift+Alt+BracketLeft | --- | Ctrl+Shift+Alt+; | Ctrl+Shift+Alt+ü | NO | ------------------------------------------------------------------------------------------------------------- -| BracketRight | ¨ | ` | ¨ | NO | -| Shift+BracketRight | ! | Shift+` | Shift+¨ | NO | -| Ctrl+Alt+BracketRight | ] | Ctrl+Alt+` | Ctrl+Alt+¨ | NO | -| Ctrl+Shift+Alt+BracketRight | --- | Ctrl+Shift+Alt+` | Ctrl+Shift+Alt+¨ | NO | ------------------------------------------------------------------------------------------------------------- -| Backslash | $ | OEM_8 | $ | NO | -| Shift+Backslash | £ | Shift+OEM_8 | Shift+$ | NO | -| Ctrl+Alt+Backslash | } | Ctrl+Alt+OEM_8 | Ctrl+Alt+$ | NO | -| Ctrl+Shift+Alt+Backslash | --- | Ctrl+Shift+Alt+OEM_8 | Ctrl+Shift+Alt+$ | NO | ------------------------------------------------------------------------------------------------------------- -| IntlHash | --- | null | null | NO | -| Shift+IntlHash | --- | null | null | NO | -| Ctrl+Alt+IntlHash | --- | null | null | NO | -| Ctrl+Shift+Alt+IntlHash | --- | null | null | NO | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| Semicolon | ö | ' | ö | NO | -| Shift+Semicolon | é | Shift+' | Shift+ö | NO | -| Ctrl+Alt+Semicolon | --- | Ctrl+Alt+' | Ctrl+Alt+ö | NO | -| Ctrl+Shift+Alt+Semicolon | --- | Ctrl+Shift+Alt+' | Ctrl+Shift+Alt+ö | NO | ------------------------------------------------------------------------------------------------------------- -| Quote | ä | \ | ä | NO | -| Shift+Quote | à | Shift+\ | Shift+ä | NO | -| Ctrl+Alt+Quote | { | Ctrl+Alt+\ | Ctrl+Alt+ä | NO | -| Ctrl+Shift+Alt+Quote | --- | Ctrl+Shift+Alt+\ | Ctrl+Shift+Alt+ä | NO | ------------------------------------------------------------------------------------------------------------- -| Backquote | § | / | § | NO | -| Shift+Backquote | ° | Shift+/ | Shift+§ | NO | -| Ctrl+Alt+Backquote | --- | Ctrl+Alt+/ | Ctrl+Alt+§ | NO | -| Ctrl+Shift+Alt+Backquote | --- | Ctrl+Shift+Alt+/ | Ctrl+Shift+Alt+§ | NO | ------------------------------------------------------------------------------------------------------------- -| Comma | , | , | , | NO | -| Shift+Comma | ; | Shift+, | Shift+, | NO | -| Ctrl+Alt+Comma | --- | Ctrl+Alt+, | Ctrl+Alt+, | NO | -| Ctrl+Shift+Alt+Comma | --- | Ctrl+Shift+Alt+, | Ctrl+Shift+Alt+, | NO | ------------------------------------------------------------------------------------------------------------- -| Period | . | . | . | NO | -| Shift+Period | : | Shift+. | Shift+. | NO | -| Ctrl+Alt+Period | --- | Ctrl+Alt+. | Ctrl+Alt+. | NO | -| Ctrl+Shift+Alt+Period | --- | Ctrl+Shift+Alt+. | Ctrl+Shift+Alt+. | NO | ------------------------------------------------------------------------------------------------------------- -| Slash | - | - | - | NO | -| Shift+Slash | _ | Shift+- | Shift+- | NO | -| Ctrl+Alt+Slash | --- | Ctrl+Alt+- | Ctrl+Alt+- | NO | -| Ctrl+Shift+Alt+Slash | --- | Ctrl+Shift+Alt+- | Ctrl+Shift+Alt+- | NO | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| ArrowUp | --- | UpArrow | UpArrow | | -| Shift+ArrowUp | --- | Shift+UpArrow | Shift+UpArrow | | -| Ctrl+Alt+ArrowUp | --- | Ctrl+Alt+UpArrow | Ctrl+Alt+UpArrow | | -| Ctrl+Shift+Alt+ArrowUp | --- | Ctrl+Shift+Alt+UpArrow | Ctrl+Shift+Alt+UpArrow | | ------------------------------------------------------------------------------------------------------------- -| Numpad0 | --- | NumPad0 | NumPad0 | | -| Shift+Numpad0 | --- | Shift+NumPad0 | Shift+NumPad0 | | -| Ctrl+Alt+Numpad0 | --- | Ctrl+Alt+NumPad0 | Ctrl+Alt+NumPad0 | | -| Ctrl+Shift+Alt+Numpad0 | --- | Ctrl+Shift+Alt+NumPad0 | Ctrl+Shift+Alt+NumPad0 | | ------------------------------------------------------------------------------------------------------------- -| IntlBackslash | < | OEM_102 | < | NO | -| Shift+IntlBackslash | > | Shift+OEM_102 | Shift+< | NO | -| Ctrl+Alt+IntlBackslash | \ | Ctrl+Alt+OEM_102 | Ctrl+Alt+< | NO | -| Ctrl+Shift+Alt+IntlBackslash | --- | Ctrl+Shift+Alt+OEM_102 | Ctrl+Shift+Alt+< | NO | ------------------------------------------------------------------------------------------------------------- -| IntlRo | --- | null | null | NO | -| Shift+IntlRo | --- | null | null | NO | -| Ctrl+Alt+IntlRo | --- | null | null | NO | -| Ctrl+Shift+Alt+IntlRo | --- | null | null | NO | ------------------------------------------------------------------------------------------------------------- -| IntlYen | --- | null | null | NO | -| Shift+IntlYen | --- | null | null | NO | -| Ctrl+Alt+IntlYen | --- | null | null | NO | -| Ctrl+Shift+Alt+IntlYen | --- | null | null | NO | ------------------------------------------------------------------------------------------------------------- \ No newline at end of file +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyA | a | A | A | a | | +| Shift+KeyA | A | Shift+A | Shift+A | shift+a | | +| Ctrl+Alt+KeyA | --- | Ctrl+Alt+A | Ctrl+Alt+A | ctrl+alt+a | | +| Ctrl+Shift+Alt+KeyA | --- | Ctrl+Shift+Alt+A | Ctrl+Shift+Alt+A | ctrl+shift+alt+a | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyB | b | B | B | b | | +| Shift+KeyB | B | Shift+B | Shift+B | shift+b | | +| Ctrl+Alt+KeyB | --- | Ctrl+Alt+B | Ctrl+Alt+B | ctrl+alt+b | | +| Ctrl+Shift+Alt+KeyB | --- | Ctrl+Shift+Alt+B | Ctrl+Shift+Alt+B | ctrl+shift+alt+b | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyC | c | C | C | c | | +| Shift+KeyC | C | Shift+C | Shift+C | shift+c | | +| Ctrl+Alt+KeyC | --- | Ctrl+Alt+C | Ctrl+Alt+C | ctrl+alt+c | | +| Ctrl+Shift+Alt+KeyC | --- | Ctrl+Shift+Alt+C | Ctrl+Shift+Alt+C | ctrl+shift+alt+c | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyD | d | D | D | d | | +| Shift+KeyD | D | Shift+D | Shift+D | shift+d | | +| Ctrl+Alt+KeyD | --- | Ctrl+Alt+D | Ctrl+Alt+D | ctrl+alt+d | | +| Ctrl+Shift+Alt+KeyD | --- | Ctrl+Shift+Alt+D | Ctrl+Shift+Alt+D | ctrl+shift+alt+d | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyE | e | E | E | e | | +| Shift+KeyE | E | Shift+E | Shift+E | shift+e | | +| Ctrl+Alt+KeyE | € | Ctrl+Alt+E | Ctrl+Alt+E | ctrl+alt+e | | +| Ctrl+Shift+Alt+KeyE | --- | Ctrl+Shift+Alt+E | Ctrl+Shift+Alt+E | ctrl+shift+alt+e | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyF | f | F | F | f | | +| Shift+KeyF | F | Shift+F | Shift+F | shift+f | | +| Ctrl+Alt+KeyF | --- | Ctrl+Alt+F | Ctrl+Alt+F | ctrl+alt+f | | +| Ctrl+Shift+Alt+KeyF | --- | Ctrl+Shift+Alt+F | Ctrl+Shift+Alt+F | ctrl+shift+alt+f | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyG | g | G | G | g | | +| Shift+KeyG | G | Shift+G | Shift+G | shift+g | | +| Ctrl+Alt+KeyG | --- | Ctrl+Alt+G | Ctrl+Alt+G | ctrl+alt+g | | +| Ctrl+Shift+Alt+KeyG | --- | Ctrl+Shift+Alt+G | Ctrl+Shift+Alt+G | ctrl+shift+alt+g | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyH | h | H | H | h | | +| Shift+KeyH | H | Shift+H | Shift+H | shift+h | | +| Ctrl+Alt+KeyH | --- | Ctrl+Alt+H | Ctrl+Alt+H | ctrl+alt+h | | +| Ctrl+Shift+Alt+KeyH | --- | Ctrl+Shift+Alt+H | Ctrl+Shift+Alt+H | ctrl+shift+alt+h | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyI | i | I | I | i | | +| Shift+KeyI | I | Shift+I | Shift+I | shift+i | | +| Ctrl+Alt+KeyI | --- | Ctrl+Alt+I | Ctrl+Alt+I | ctrl+alt+i | | +| Ctrl+Shift+Alt+KeyI | --- | Ctrl+Shift+Alt+I | Ctrl+Shift+Alt+I | ctrl+shift+alt+i | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyJ | j | J | J | j | | +| Shift+KeyJ | J | Shift+J | Shift+J | shift+j | | +| Ctrl+Alt+KeyJ | --- | Ctrl+Alt+J | Ctrl+Alt+J | ctrl+alt+j | | +| Ctrl+Shift+Alt+KeyJ | --- | Ctrl+Shift+Alt+J | Ctrl+Shift+Alt+J | ctrl+shift+alt+j | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyK | k | K | K | k | | +| Shift+KeyK | K | Shift+K | Shift+K | shift+k | | +| Ctrl+Alt+KeyK | --- | Ctrl+Alt+K | Ctrl+Alt+K | ctrl+alt+k | | +| Ctrl+Shift+Alt+KeyK | --- | Ctrl+Shift+Alt+K | Ctrl+Shift+Alt+K | ctrl+shift+alt+k | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyL | l | L | L | l | | +| Shift+KeyL | L | Shift+L | Shift+L | shift+l | | +| Ctrl+Alt+KeyL | --- | Ctrl+Alt+L | Ctrl+Alt+L | ctrl+alt+l | | +| Ctrl+Shift+Alt+KeyL | --- | Ctrl+Shift+Alt+L | Ctrl+Shift+Alt+L | ctrl+shift+alt+l | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyM | m | M | M | m | | +| Shift+KeyM | M | Shift+M | Shift+M | shift+m | | +| Ctrl+Alt+KeyM | --- | Ctrl+Alt+M | Ctrl+Alt+M | ctrl+alt+m | | +| Ctrl+Shift+Alt+KeyM | --- | Ctrl+Shift+Alt+M | Ctrl+Shift+Alt+M | ctrl+shift+alt+m | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyN | n | N | N | n | | +| Shift+KeyN | N | Shift+N | Shift+N | shift+n | | +| Ctrl+Alt+KeyN | --- | Ctrl+Alt+N | Ctrl+Alt+N | ctrl+alt+n | | +| Ctrl+Shift+Alt+KeyN | --- | Ctrl+Shift+Alt+N | Ctrl+Shift+Alt+N | ctrl+shift+alt+n | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyO | o | O | O | o | | +| Shift+KeyO | O | Shift+O | Shift+O | shift+o | | +| Ctrl+Alt+KeyO | --- | Ctrl+Alt+O | Ctrl+Alt+O | ctrl+alt+o | | +| Ctrl+Shift+Alt+KeyO | --- | Ctrl+Shift+Alt+O | Ctrl+Shift+Alt+O | ctrl+shift+alt+o | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyP | p | P | P | p | | +| Shift+KeyP | P | Shift+P | Shift+P | shift+p | | +| Ctrl+Alt+KeyP | --- | Ctrl+Alt+P | Ctrl+Alt+P | ctrl+alt+p | | +| Ctrl+Shift+Alt+KeyP | --- | Ctrl+Shift+Alt+P | Ctrl+Shift+Alt+P | ctrl+shift+alt+p | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyQ | q | Q | Q | q | | +| Shift+KeyQ | Q | Shift+Q | Shift+Q | shift+q | | +| Ctrl+Alt+KeyQ | --- | Ctrl+Alt+Q | Ctrl+Alt+Q | ctrl+alt+q | | +| Ctrl+Shift+Alt+KeyQ | --- | Ctrl+Shift+Alt+Q | Ctrl+Shift+Alt+Q | ctrl+shift+alt+q | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyR | r | R | R | r | | +| Shift+KeyR | R | Shift+R | Shift+R | shift+r | | +| Ctrl+Alt+KeyR | --- | Ctrl+Alt+R | Ctrl+Alt+R | ctrl+alt+r | | +| Ctrl+Shift+Alt+KeyR | --- | Ctrl+Shift+Alt+R | Ctrl+Shift+Alt+R | ctrl+shift+alt+r | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyS | s | S | S | s | | +| Shift+KeyS | S | Shift+S | Shift+S | shift+s | | +| Ctrl+Alt+KeyS | --- | Ctrl+Alt+S | Ctrl+Alt+S | ctrl+alt+s | | +| Ctrl+Shift+Alt+KeyS | --- | Ctrl+Shift+Alt+S | Ctrl+Shift+Alt+S | ctrl+shift+alt+s | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyT | t | T | T | t | | +| Shift+KeyT | T | Shift+T | Shift+T | shift+t | | +| Ctrl+Alt+KeyT | --- | Ctrl+Alt+T | Ctrl+Alt+T | ctrl+alt+t | | +| Ctrl+Shift+Alt+KeyT | --- | Ctrl+Shift+Alt+T | Ctrl+Shift+Alt+T | ctrl+shift+alt+t | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyU | u | U | U | u | | +| Shift+KeyU | U | Shift+U | Shift+U | shift+u | | +| Ctrl+Alt+KeyU | --- | Ctrl+Alt+U | Ctrl+Alt+U | ctrl+alt+u | | +| Ctrl+Shift+Alt+KeyU | --- | Ctrl+Shift+Alt+U | Ctrl+Shift+Alt+U | ctrl+shift+alt+u | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyV | v | V | V | v | | +| Shift+KeyV | V | Shift+V | Shift+V | shift+v | | +| Ctrl+Alt+KeyV | --- | Ctrl+Alt+V | Ctrl+Alt+V | ctrl+alt+v | | +| Ctrl+Shift+Alt+KeyV | --- | Ctrl+Shift+Alt+V | Ctrl+Shift+Alt+V | ctrl+shift+alt+v | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyW | w | W | W | w | | +| Shift+KeyW | W | Shift+W | Shift+W | shift+w | | +| Ctrl+Alt+KeyW | --- | Ctrl+Alt+W | Ctrl+Alt+W | ctrl+alt+w | | +| Ctrl+Shift+Alt+KeyW | --- | Ctrl+Shift+Alt+W | Ctrl+Shift+Alt+W | ctrl+shift+alt+w | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyX | x | X | X | x | | +| Shift+KeyX | X | Shift+X | Shift+X | shift+x | | +| Ctrl+Alt+KeyX | --- | Ctrl+Alt+X | Ctrl+Alt+X | ctrl+alt+x | | +| Ctrl+Shift+Alt+KeyX | --- | Ctrl+Shift+Alt+X | Ctrl+Shift+Alt+X | ctrl+shift+alt+x | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyY | z | Z | Z | z | | +| Shift+KeyY | Z | Shift+Z | Shift+Z | shift+z | | +| Ctrl+Alt+KeyY | --- | Ctrl+Alt+Z | Ctrl+Alt+Z | ctrl+alt+z | | +| Ctrl+Shift+Alt+KeyY | --- | Ctrl+Shift+Alt+Z | Ctrl+Shift+Alt+Z | ctrl+shift+alt+z | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyZ | y | Y | Y | y | | +| Shift+KeyZ | Y | Shift+Y | Shift+Y | shift+y | | +| Ctrl+Alt+KeyZ | --- | Ctrl+Alt+Y | Ctrl+Alt+Y | ctrl+alt+y | | +| Ctrl+Shift+Alt+KeyZ | --- | Ctrl+Shift+Alt+Y | Ctrl+Shift+Alt+Y | ctrl+shift+alt+y | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit1 | 1 | 1 | 1 | 1 | | +| Shift+Digit1 | + | Shift+1 | Shift+1 | shift+1 | | +| Ctrl+Alt+Digit1 | ¦ | Ctrl+Alt+1 | Ctrl+Alt+1 | ctrl+alt+1 | | +| Ctrl+Shift+Alt+Digit1 | --- | Ctrl+Shift+Alt+1 | Ctrl+Shift+Alt+1 | ctrl+shift+alt+1 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit2 | 2 | 2 | 2 | 2 | | +| Shift+Digit2 | " | Shift+2 | Shift+2 | shift+2 | | +| Ctrl+Alt+Digit2 | @ | Ctrl+Alt+2 | Ctrl+Alt+2 | ctrl+alt+2 | | +| Ctrl+Shift+Alt+Digit2 | --- | Ctrl+Shift+Alt+2 | Ctrl+Shift+Alt+2 | ctrl+shift+alt+2 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit3 | 3 | 3 | 3 | 3 | | +| Shift+Digit3 | * | Shift+3 | Shift+3 | shift+3 | | +| Ctrl+Alt+Digit3 | # | Ctrl+Alt+3 | Ctrl+Alt+3 | ctrl+alt+3 | | +| Ctrl+Shift+Alt+Digit3 | --- | Ctrl+Shift+Alt+3 | Ctrl+Shift+Alt+3 | ctrl+shift+alt+3 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit4 | 4 | 4 | 4 | 4 | | +| Shift+Digit4 | ç | Shift+4 | Shift+4 | shift+4 | | +| Ctrl+Alt+Digit4 | ° | Ctrl+Alt+4 | Ctrl+Alt+4 | ctrl+alt+4 | | +| Ctrl+Shift+Alt+Digit4 | --- | Ctrl+Shift+Alt+4 | Ctrl+Shift+Alt+4 | ctrl+shift+alt+4 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit5 | 5 | 5 | 5 | 5 | | +| Shift+Digit5 | % | Shift+5 | Shift+5 | shift+5 | | +| Ctrl+Alt+Digit5 | § | Ctrl+Alt+5 | Ctrl+Alt+5 | ctrl+alt+5 | | +| Ctrl+Shift+Alt+Digit5 | --- | Ctrl+Shift+Alt+5 | Ctrl+Shift+Alt+5 | ctrl+shift+alt+5 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit6 | 6 | 6 | 6 | 6 | | +| Shift+Digit6 | & | Shift+6 | Shift+6 | shift+6 | | +| Ctrl+Alt+Digit6 | ¬ | Ctrl+Alt+6 | Ctrl+Alt+6 | ctrl+alt+6 | | +| Ctrl+Shift+Alt+Digit6 | --- | Ctrl+Shift+Alt+6 | Ctrl+Shift+Alt+6 | ctrl+shift+alt+6 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit7 | 7 | 7 | 7 | 7 | | +| Shift+Digit7 | / | Shift+7 | Shift+7 | shift+7 | | +| Ctrl+Alt+Digit7 | | | Ctrl+Alt+7 | Ctrl+Alt+7 | ctrl+alt+7 | | +| Ctrl+Shift+Alt+Digit7 | --- | Ctrl+Shift+Alt+7 | Ctrl+Shift+Alt+7 | ctrl+shift+alt+7 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit8 | 8 | 8 | 8 | 8 | | +| Shift+Digit8 | ( | Shift+8 | Shift+8 | shift+8 | | +| Ctrl+Alt+Digit8 | ¢ | Ctrl+Alt+8 | Ctrl+Alt+8 | ctrl+alt+8 | | +| Ctrl+Shift+Alt+Digit8 | --- | Ctrl+Shift+Alt+8 | Ctrl+Shift+Alt+8 | ctrl+shift+alt+8 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit9 | 9 | 9 | 9 | 9 | | +| Shift+Digit9 | ) | Shift+9 | Shift+9 | shift+9 | | +| Ctrl+Alt+Digit9 | --- | Ctrl+Alt+9 | Ctrl+Alt+9 | ctrl+alt+9 | | +| Ctrl+Shift+Alt+Digit9 | --- | Ctrl+Shift+Alt+9 | Ctrl+Shift+Alt+9 | ctrl+shift+alt+9 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit0 | 0 | 0 | 0 | 0 | | +| Shift+Digit0 | = | Shift+0 | Shift+0 | shift+0 | | +| Ctrl+Alt+Digit0 | --- | Ctrl+Alt+0 | Ctrl+Alt+0 | ctrl+alt+0 | | +| Ctrl+Shift+Alt+Digit0 | --- | Ctrl+Shift+Alt+0 | Ctrl+Shift+Alt+0 | ctrl+shift+alt+0 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| Minus | ' | [ | ' | oem_4 | NO | +| Shift+Minus | ? | Shift+[ | Shift+' | shift+oem_4 | NO | +| Ctrl+Alt+Minus | ´ | Ctrl+Alt+[ | Ctrl+Alt+' | ctrl+alt+oem_4 | NO | +| Ctrl+Shift+Alt+Minus | --- | Ctrl+Shift+Alt+[ | Ctrl+Shift+Alt+' | ctrl+shift+alt+oem_4 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Equal | ^ | ] | ^ | oem_6 | NO | +| Shift+Equal | ` | Shift+] | Shift+^ | shift+oem_6 | NO | +| Ctrl+Alt+Equal | ~ | Ctrl+Alt+] | Ctrl+Alt+^ | ctrl+alt+oem_6 | NO | +| Ctrl+Shift+Alt+Equal | --- | Ctrl+Shift+Alt+] | Ctrl+Shift+Alt+^ | ctrl+shift+alt+oem_6 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| BracketLeft | ü | ; | ü | oem_1 | NO | +| Shift+BracketLeft | è | Shift+; | Shift+ü | shift+oem_1 | NO | +| Ctrl+Alt+BracketLeft | [ | Ctrl+Alt+; | Ctrl+Alt+ü | ctrl+alt+oem_1 | NO | +| Ctrl+Shift+Alt+BracketLeft | --- | Ctrl+Shift+Alt+; | Ctrl+Shift+Alt+ü | ctrl+shift+alt+oem_1 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| BracketRight | ¨ | ` | ¨ | oem_3 | NO | +| Shift+BracketRight | ! | Shift+` | Shift+¨ | shift+oem_3 | NO | +| Ctrl+Alt+BracketRight | ] | Ctrl+Alt+` | Ctrl+Alt+¨ | ctrl+alt+oem_3 | NO | +| Ctrl+Shift+Alt+BracketRight | --- | Ctrl+Shift+Alt+` | Ctrl+Shift+Alt+¨ | ctrl+shift+alt+oem_3 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Backslash | $ | OEM_8 | $ | oem_8 | NO | +| Shift+Backslash | £ | Shift+OEM_8 | Shift+$ | shift+oem_8 | NO | +| Ctrl+Alt+Backslash | } | Ctrl+Alt+OEM_8 | Ctrl+Alt+$ | ctrl+alt+oem_8 | NO | +| Ctrl+Shift+Alt+Backslash | --- | Ctrl+Shift+Alt+OEM_8 | Ctrl+Shift+Alt+$ | ctrl+shift+alt+oem_8 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| IntlHash | --- | null | null | null | NO | +| Shift+IntlHash | --- | null | null | null | NO | +| Ctrl+Alt+IntlHash | --- | null | null | null | NO | +| Ctrl+Shift+Alt+IntlHash | --- | null | null | null | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| Semicolon | ö | ' | ö | oem_7 | NO | +| Shift+Semicolon | é | Shift+' | Shift+ö | shift+oem_7 | NO | +| Ctrl+Alt+Semicolon | --- | Ctrl+Alt+' | Ctrl+Alt+ö | ctrl+alt+oem_7 | NO | +| Ctrl+Shift+Alt+Semicolon | --- | Ctrl+Shift+Alt+' | Ctrl+Shift+Alt+ö | ctrl+shift+alt+oem_7 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Quote | ä | \ | ä | oem_5 | NO | +| Shift+Quote | à | Shift+\ | Shift+ä | shift+oem_5 | NO | +| Ctrl+Alt+Quote | { | Ctrl+Alt+\ | Ctrl+Alt+ä | ctrl+alt+oem_5 | NO | +| Ctrl+Shift+Alt+Quote | --- | Ctrl+Shift+Alt+\ | Ctrl+Shift+Alt+ä | ctrl+shift+alt+oem_5 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Backquote | § | / | § | oem_2 | NO | +| Shift+Backquote | ° | Shift+/ | Shift+§ | shift+oem_2 | NO | +| Ctrl+Alt+Backquote | --- | Ctrl+Alt+/ | Ctrl+Alt+§ | ctrl+alt+oem_2 | NO | +| Ctrl+Shift+Alt+Backquote | --- | Ctrl+Shift+Alt+/ | Ctrl+Shift+Alt+§ | ctrl+shift+alt+oem_2 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Comma | , | , | , | oem_comma | NO | +| Shift+Comma | ; | Shift+, | Shift+, | shift+oem_comma | NO | +| Ctrl+Alt+Comma | --- | Ctrl+Alt+, | Ctrl+Alt+, | ctrl+alt+oem_comma | NO | +| Ctrl+Shift+Alt+Comma | --- | Ctrl+Shift+Alt+, | Ctrl+Shift+Alt+, | ctrl+shift+alt+oem_comma | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Period | . | . | . | oem_period | NO | +| Shift+Period | : | Shift+. | Shift+. | shift+oem_period | NO | +| Ctrl+Alt+Period | --- | Ctrl+Alt+. | Ctrl+Alt+. | ctrl+alt+oem_period | NO | +| Ctrl+Shift+Alt+Period | --- | Ctrl+Shift+Alt+. | Ctrl+Shift+Alt+. | ctrl+shift+alt+oem_period | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Slash | - | - | - | oem_minus | NO | +| Shift+Slash | _ | Shift+- | Shift+- | shift+oem_minus | NO | +| Ctrl+Alt+Slash | --- | Ctrl+Alt+- | Ctrl+Alt+- | ctrl+alt+oem_minus | NO | +| Ctrl+Shift+Alt+Slash | --- | Ctrl+Shift+Alt+- | Ctrl+Shift+Alt+- | ctrl+shift+alt+oem_minus | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| ArrowUp | --- | UpArrow | UpArrow | up | | +| Shift+ArrowUp | --- | Shift+UpArrow | Shift+UpArrow | shift+up | | +| Ctrl+Alt+ArrowUp | --- | Ctrl+Alt+UpArrow | Ctrl+Alt+UpArrow | ctrl+alt+up | | +| Ctrl+Shift+Alt+ArrowUp | --- | Ctrl+Shift+Alt+UpArrow | Ctrl+Shift+Alt+UpArrow | ctrl+shift+alt+up | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Numpad0 | --- | NumPad0 | NumPad0 | numpad0 | | +| Shift+Numpad0 | --- | Shift+NumPad0 | Shift+NumPad0 | shift+numpad0 | | +| Ctrl+Alt+Numpad0 | --- | Ctrl+Alt+NumPad0 | Ctrl+Alt+NumPad0 | ctrl+alt+numpad0 | | +| Ctrl+Shift+Alt+Numpad0 | --- | Ctrl+Shift+Alt+NumPad0 | Ctrl+Shift+Alt+NumPad0 | ctrl+shift+alt+numpad0 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| IntlBackslash | < | OEM_102 | < | oem_102 | NO | +| Shift+IntlBackslash | > | Shift+OEM_102 | Shift+< | shift+oem_102 | NO | +| Ctrl+Alt+IntlBackslash | \ | Ctrl+Alt+OEM_102 | Ctrl+Alt+< | ctrl+alt+oem_102 | NO | +| Ctrl+Shift+Alt+IntlBackslash | --- | Ctrl+Shift+Alt+OEM_102 | Ctrl+Shift+Alt+< | ctrl+shift+alt+oem_102 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| IntlRo | --- | null | null | null | NO | +| Shift+IntlRo | --- | null | null | null | NO | +| Ctrl+Alt+IntlRo | --- | null | null | null | NO | +| Ctrl+Shift+Alt+IntlRo | --- | null | null | null | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| IntlYen | --- | null | null | null | NO | +| Shift+IntlYen | --- | null | null | null | NO | +| Ctrl+Alt+IntlYen | --- | null | null | null | NO | +| Ctrl+Shift+Alt+IntlYen | --- | null | null | null | NO | +----------------------------------------------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/test/win_en_us.txt b/src/vs/workbench/services/keybinding/test/win_en_us.txt index b0b6ae6b4ac..b011bd0be56 100644 --- a/src/vs/workbench/services/keybinding/test/win_en_us.txt +++ b/src/vs/workbench/services/keybinding/test/win_en_us.txt @@ -1,284 +1,284 @@ ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyA | a | A | A | | -| Shift+KeyA | A | Shift+A | Shift+A | | -| Ctrl+Alt+KeyA | --- | Ctrl+Alt+A | Ctrl+Alt+A | | -| Ctrl+Shift+Alt+KeyA | --- | Ctrl+Shift+Alt+A | Ctrl+Shift+Alt+A | | ------------------------------------------------------------------------------------------------------------- -| KeyB | b | B | B | | -| Shift+KeyB | B | Shift+B | Shift+B | | -| Ctrl+Alt+KeyB | --- | Ctrl+Alt+B | Ctrl+Alt+B | | -| Ctrl+Shift+Alt+KeyB | --- | Ctrl+Shift+Alt+B | Ctrl+Shift+Alt+B | | ------------------------------------------------------------------------------------------------------------- -| KeyC | c | C | C | | -| Shift+KeyC | C | Shift+C | Shift+C | | -| Ctrl+Alt+KeyC | --- | Ctrl+Alt+C | Ctrl+Alt+C | | -| Ctrl+Shift+Alt+KeyC | --- | Ctrl+Shift+Alt+C | Ctrl+Shift+Alt+C | | ------------------------------------------------------------------------------------------------------------- -| KeyD | d | D | D | | -| Shift+KeyD | D | Shift+D | Shift+D | | -| Ctrl+Alt+KeyD | --- | Ctrl+Alt+D | Ctrl+Alt+D | | -| Ctrl+Shift+Alt+KeyD | --- | Ctrl+Shift+Alt+D | Ctrl+Shift+Alt+D | | ------------------------------------------------------------------------------------------------------------- -| KeyE | e | E | E | | -| Shift+KeyE | E | Shift+E | Shift+E | | -| Ctrl+Alt+KeyE | --- | Ctrl+Alt+E | Ctrl+Alt+E | | -| Ctrl+Shift+Alt+KeyE | --- | Ctrl+Shift+Alt+E | Ctrl+Shift+Alt+E | | ------------------------------------------------------------------------------------------------------------- -| KeyF | f | F | F | | -| Shift+KeyF | F | Shift+F | Shift+F | | -| Ctrl+Alt+KeyF | --- | Ctrl+Alt+F | Ctrl+Alt+F | | -| Ctrl+Shift+Alt+KeyF | --- | Ctrl+Shift+Alt+F | Ctrl+Shift+Alt+F | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyG | g | G | G | | -| Shift+KeyG | G | Shift+G | Shift+G | | -| Ctrl+Alt+KeyG | --- | Ctrl+Alt+G | Ctrl+Alt+G | | -| Ctrl+Shift+Alt+KeyG | --- | Ctrl+Shift+Alt+G | Ctrl+Shift+Alt+G | | ------------------------------------------------------------------------------------------------------------- -| KeyH | h | H | H | | -| Shift+KeyH | H | Shift+H | Shift+H | | -| Ctrl+Alt+KeyH | --- | Ctrl+Alt+H | Ctrl+Alt+H | | -| Ctrl+Shift+Alt+KeyH | --- | Ctrl+Shift+Alt+H | Ctrl+Shift+Alt+H | | ------------------------------------------------------------------------------------------------------------- -| KeyI | i | I | I | | -| Shift+KeyI | I | Shift+I | Shift+I | | -| Ctrl+Alt+KeyI | --- | Ctrl+Alt+I | Ctrl+Alt+I | | -| Ctrl+Shift+Alt+KeyI | --- | Ctrl+Shift+Alt+I | Ctrl+Shift+Alt+I | | ------------------------------------------------------------------------------------------------------------- -| KeyJ | j | J | J | | -| Shift+KeyJ | J | Shift+J | Shift+J | | -| Ctrl+Alt+KeyJ | --- | Ctrl+Alt+J | Ctrl+Alt+J | | -| Ctrl+Shift+Alt+KeyJ | --- | Ctrl+Shift+Alt+J | Ctrl+Shift+Alt+J | | ------------------------------------------------------------------------------------------------------------- -| KeyK | k | K | K | | -| Shift+KeyK | K | Shift+K | Shift+K | | -| Ctrl+Alt+KeyK | --- | Ctrl+Alt+K | Ctrl+Alt+K | | -| Ctrl+Shift+Alt+KeyK | --- | Ctrl+Shift+Alt+K | Ctrl+Shift+Alt+K | | ------------------------------------------------------------------------------------------------------------- -| KeyL | l | L | L | | -| Shift+KeyL | L | Shift+L | Shift+L | | -| Ctrl+Alt+KeyL | --- | Ctrl+Alt+L | Ctrl+Alt+L | | -| Ctrl+Shift+Alt+KeyL | --- | Ctrl+Shift+Alt+L | Ctrl+Shift+Alt+L | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyM | m | M | M | | -| Shift+KeyM | M | Shift+M | Shift+M | | -| Ctrl+Alt+KeyM | --- | Ctrl+Alt+M | Ctrl+Alt+M | | -| Ctrl+Shift+Alt+KeyM | --- | Ctrl+Shift+Alt+M | Ctrl+Shift+Alt+M | | ------------------------------------------------------------------------------------------------------------- -| KeyN | n | N | N | | -| Shift+KeyN | N | Shift+N | Shift+N | | -| Ctrl+Alt+KeyN | --- | Ctrl+Alt+N | Ctrl+Alt+N | | -| Ctrl+Shift+Alt+KeyN | --- | Ctrl+Shift+Alt+N | Ctrl+Shift+Alt+N | | ------------------------------------------------------------------------------------------------------------- -| KeyO | o | O | O | | -| Shift+KeyO | O | Shift+O | Shift+O | | -| Ctrl+Alt+KeyO | --- | Ctrl+Alt+O | Ctrl+Alt+O | | -| Ctrl+Shift+Alt+KeyO | --- | Ctrl+Shift+Alt+O | Ctrl+Shift+Alt+O | | ------------------------------------------------------------------------------------------------------------- -| KeyP | p | P | P | | -| Shift+KeyP | P | Shift+P | Shift+P | | -| Ctrl+Alt+KeyP | --- | Ctrl+Alt+P | Ctrl+Alt+P | | -| Ctrl+Shift+Alt+KeyP | --- | Ctrl+Shift+Alt+P | Ctrl+Shift+Alt+P | | ------------------------------------------------------------------------------------------------------------- -| KeyQ | q | Q | Q | | -| Shift+KeyQ | Q | Shift+Q | Shift+Q | | -| Ctrl+Alt+KeyQ | --- | Ctrl+Alt+Q | Ctrl+Alt+Q | | -| Ctrl+Shift+Alt+KeyQ | --- | Ctrl+Shift+Alt+Q | Ctrl+Shift+Alt+Q | | ------------------------------------------------------------------------------------------------------------- -| KeyR | r | R | R | | -| Shift+KeyR | R | Shift+R | Shift+R | | -| Ctrl+Alt+KeyR | --- | Ctrl+Alt+R | Ctrl+Alt+R | | -| Ctrl+Shift+Alt+KeyR | --- | Ctrl+Shift+Alt+R | Ctrl+Shift+Alt+R | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyS | s | S | S | | -| Shift+KeyS | S | Shift+S | Shift+S | | -| Ctrl+Alt+KeyS | --- | Ctrl+Alt+S | Ctrl+Alt+S | | -| Ctrl+Shift+Alt+KeyS | --- | Ctrl+Shift+Alt+S | Ctrl+Shift+Alt+S | | ------------------------------------------------------------------------------------------------------------- -| KeyT | t | T | T | | -| Shift+KeyT | T | Shift+T | Shift+T | | -| Ctrl+Alt+KeyT | --- | Ctrl+Alt+T | Ctrl+Alt+T | | -| Ctrl+Shift+Alt+KeyT | --- | Ctrl+Shift+Alt+T | Ctrl+Shift+Alt+T | | ------------------------------------------------------------------------------------------------------------- -| KeyU | u | U | U | | -| Shift+KeyU | U | Shift+U | Shift+U | | -| Ctrl+Alt+KeyU | --- | Ctrl+Alt+U | Ctrl+Alt+U | | -| Ctrl+Shift+Alt+KeyU | --- | Ctrl+Shift+Alt+U | Ctrl+Shift+Alt+U | | ------------------------------------------------------------------------------------------------------------- -| KeyV | v | V | V | | -| Shift+KeyV | V | Shift+V | Shift+V | | -| Ctrl+Alt+KeyV | --- | Ctrl+Alt+V | Ctrl+Alt+V | | -| Ctrl+Shift+Alt+KeyV | --- | Ctrl+Shift+Alt+V | Ctrl+Shift+Alt+V | | ------------------------------------------------------------------------------------------------------------- -| KeyW | w | W | W | | -| Shift+KeyW | W | Shift+W | Shift+W | | -| Ctrl+Alt+KeyW | --- | Ctrl+Alt+W | Ctrl+Alt+W | | -| Ctrl+Shift+Alt+KeyW | --- | Ctrl+Shift+Alt+W | Ctrl+Shift+Alt+W | | ------------------------------------------------------------------------------------------------------------- -| KeyX | x | X | X | | -| Shift+KeyX | X | Shift+X | Shift+X | | -| Ctrl+Alt+KeyX | --- | Ctrl+Alt+X | Ctrl+Alt+X | | -| Ctrl+Shift+Alt+KeyX | --- | Ctrl+Shift+Alt+X | Ctrl+Shift+Alt+X | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyY | y | Y | Y | | -| Shift+KeyY | Y | Shift+Y | Shift+Y | | -| Ctrl+Alt+KeyY | --- | Ctrl+Alt+Y | Ctrl+Alt+Y | | -| Ctrl+Shift+Alt+KeyY | --- | Ctrl+Shift+Alt+Y | Ctrl+Shift+Alt+Y | | ------------------------------------------------------------------------------------------------------------- -| KeyZ | z | Z | Z | | -| Shift+KeyZ | Z | Shift+Z | Shift+Z | | -| Ctrl+Alt+KeyZ | --- | Ctrl+Alt+Z | Ctrl+Alt+Z | | -| Ctrl+Shift+Alt+KeyZ | --- | Ctrl+Shift+Alt+Z | Ctrl+Shift+Alt+Z | | ------------------------------------------------------------------------------------------------------------- -| Digit1 | 1 | 1 | 1 | | -| Shift+Digit1 | ! | Shift+1 | Shift+1 | | -| Ctrl+Alt+Digit1 | --- | Ctrl+Alt+1 | Ctrl+Alt+1 | | -| Ctrl+Shift+Alt+Digit1 | --- | Ctrl+Shift+Alt+1 | Ctrl+Shift+Alt+1 | | ------------------------------------------------------------------------------------------------------------- -| Digit2 | 2 | 2 | 2 | | -| Shift+Digit2 | @ | Shift+2 | Shift+2 | | -| Ctrl+Alt+Digit2 | --- | Ctrl+Alt+2 | Ctrl+Alt+2 | | -| Ctrl+Shift+Alt+Digit2 | --- | Ctrl+Shift+Alt+2 | Ctrl+Shift+Alt+2 | | ------------------------------------------------------------------------------------------------------------- -| Digit3 | 3 | 3 | 3 | | -| Shift+Digit3 | # | Shift+3 | Shift+3 | | -| Ctrl+Alt+Digit3 | --- | Ctrl+Alt+3 | Ctrl+Alt+3 | | -| Ctrl+Shift+Alt+Digit3 | --- | Ctrl+Shift+Alt+3 | Ctrl+Shift+Alt+3 | | ------------------------------------------------------------------------------------------------------------- -| Digit4 | 4 | 4 | 4 | | -| Shift+Digit4 | $ | Shift+4 | Shift+4 | | -| Ctrl+Alt+Digit4 | --- | Ctrl+Alt+4 | Ctrl+Alt+4 | | -| Ctrl+Shift+Alt+Digit4 | --- | Ctrl+Shift+Alt+4 | Ctrl+Shift+Alt+4 | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| Digit5 | 5 | 5 | 5 | | -| Shift+Digit5 | % | Shift+5 | Shift+5 | | -| Ctrl+Alt+Digit5 | --- | Ctrl+Alt+5 | Ctrl+Alt+5 | | -| Ctrl+Shift+Alt+Digit5 | --- | Ctrl+Shift+Alt+5 | Ctrl+Shift+Alt+5 | | ------------------------------------------------------------------------------------------------------------- -| Digit6 | 6 | 6 | 6 | | -| Shift+Digit6 | ^ | Shift+6 | Shift+6 | | -| Ctrl+Alt+Digit6 | --- | Ctrl+Alt+6 | Ctrl+Alt+6 | | -| Ctrl+Shift+Alt+Digit6 | --- | Ctrl+Shift+Alt+6 | Ctrl+Shift+Alt+6 | | ------------------------------------------------------------------------------------------------------------- -| Digit7 | 7 | 7 | 7 | | -| Shift+Digit7 | & | Shift+7 | Shift+7 | | -| Ctrl+Alt+Digit7 | --- | Ctrl+Alt+7 | Ctrl+Alt+7 | | -| Ctrl+Shift+Alt+Digit7 | --- | Ctrl+Shift+Alt+7 | Ctrl+Shift+Alt+7 | | ------------------------------------------------------------------------------------------------------------- -| Digit8 | 8 | 8 | 8 | | -| Shift+Digit8 | * | Shift+8 | Shift+8 | | -| Ctrl+Alt+Digit8 | --- | Ctrl+Alt+8 | Ctrl+Alt+8 | | -| Ctrl+Shift+Alt+Digit8 | --- | Ctrl+Shift+Alt+8 | Ctrl+Shift+Alt+8 | | ------------------------------------------------------------------------------------------------------------- -| Digit9 | 9 | 9 | 9 | | -| Shift+Digit9 | ( | Shift+9 | Shift+9 | | -| Ctrl+Alt+Digit9 | --- | Ctrl+Alt+9 | Ctrl+Alt+9 | | -| Ctrl+Shift+Alt+Digit9 | --- | Ctrl+Shift+Alt+9 | Ctrl+Shift+Alt+9 | | ------------------------------------------------------------------------------------------------------------- -| Digit0 | 0 | 0 | 0 | | -| Shift+Digit0 | ) | Shift+0 | Shift+0 | | -| Ctrl+Alt+Digit0 | --- | Ctrl+Alt+0 | Ctrl+Alt+0 | | -| Ctrl+Shift+Alt+Digit0 | --- | Ctrl+Shift+Alt+0 | Ctrl+Shift+Alt+0 | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| Minus | - | - | - | | -| Shift+Minus | _ | Shift+- | Shift+- | | -| Ctrl+Alt+Minus | --- | Ctrl+Alt+- | Ctrl+Alt+- | | -| Ctrl+Shift+Alt+Minus | --- | Ctrl+Shift+Alt+- | Ctrl+Shift+Alt+- | | ------------------------------------------------------------------------------------------------------------- -| Equal | = | = | = | | -| Shift+Equal | + | Shift+= | Shift+= | | -| Ctrl+Alt+Equal | --- | Ctrl+Alt+= | Ctrl+Alt+= | | -| Ctrl+Shift+Alt+Equal | --- | Ctrl+Shift+Alt+= | Ctrl+Shift+Alt+= | | ------------------------------------------------------------------------------------------------------------- -| BracketLeft | [ | [ | [ | | -| Shift+BracketLeft | { | Shift+[ | Shift+[ | | -| Ctrl+Alt+BracketLeft | --- | Ctrl+Alt+[ | Ctrl+Alt+[ | | -| Ctrl+Shift+Alt+BracketLeft | --- | Ctrl+Shift+Alt+[ | Ctrl+Shift+Alt+[ | | ------------------------------------------------------------------------------------------------------------- -| BracketRight | ] | ] | ] | | -| Shift+BracketRight | } | Shift+] | Shift+] | | -| Ctrl+Alt+BracketRight | --- | Ctrl+Alt+] | Ctrl+Alt+] | | -| Ctrl+Shift+Alt+BracketRight | --- | Ctrl+Shift+Alt+] | Ctrl+Shift+Alt+] | | ------------------------------------------------------------------------------------------------------------- -| Backslash | \ | \ | \ | | -| Shift+Backslash | | | Shift+\ | Shift+\ | | -| Ctrl+Alt+Backslash | --- | Ctrl+Alt+\ | Ctrl+Alt+\ | | -| Ctrl+Shift+Alt+Backslash | --- | Ctrl+Shift+Alt+\ | Ctrl+Shift+Alt+\ | | ------------------------------------------------------------------------------------------------------------- -| IntlHash | --- | null | null | NO | -| Shift+IntlHash | --- | null | null | NO | -| Ctrl+Alt+IntlHash | --- | null | null | NO | -| Ctrl+Shift+Alt+IntlHash | --- | null | null | NO | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| Semicolon | ; | ; | ; | | -| Shift+Semicolon | : | Shift+; | Shift+; | | -| Ctrl+Alt+Semicolon | --- | Ctrl+Alt+; | Ctrl+Alt+; | | -| Ctrl+Shift+Alt+Semicolon | --- | Ctrl+Shift+Alt+; | Ctrl+Shift+Alt+; | | ------------------------------------------------------------------------------------------------------------- -| Quote | ' | ' | ' | | -| Shift+Quote | " | Shift+' | Shift+' | | -| Ctrl+Alt+Quote | --- | Ctrl+Alt+' | Ctrl+Alt+' | | -| Ctrl+Shift+Alt+Quote | --- | Ctrl+Shift+Alt+' | Ctrl+Shift+Alt+' | | ------------------------------------------------------------------------------------------------------------- -| Backquote | ` | ` | ` | | -| Shift+Backquote | ~ | Shift+` | Shift+` | | -| Ctrl+Alt+Backquote | --- | Ctrl+Alt+` | Ctrl+Alt+` | | -| Ctrl+Shift+Alt+Backquote | --- | Ctrl+Shift+Alt+` | Ctrl+Shift+Alt+` | | ------------------------------------------------------------------------------------------------------------- -| Comma | , | , | , | | -| Shift+Comma | < | Shift+, | Shift+, | | -| Ctrl+Alt+Comma | --- | Ctrl+Alt+, | Ctrl+Alt+, | | -| Ctrl+Shift+Alt+Comma | --- | Ctrl+Shift+Alt+, | Ctrl+Shift+Alt+, | | ------------------------------------------------------------------------------------------------------------- -| Period | . | . | . | | -| Shift+Period | > | Shift+. | Shift+. | | -| Ctrl+Alt+Period | --- | Ctrl+Alt+. | Ctrl+Alt+. | | -| Ctrl+Shift+Alt+Period | --- | Ctrl+Shift+Alt+. | Ctrl+Shift+Alt+. | | ------------------------------------------------------------------------------------------------------------- -| Slash | / | / | / | | -| Shift+Slash | ? | Shift+/ | Shift+/ | | -| Ctrl+Alt+Slash | --- | Ctrl+Alt+/ | Ctrl+Alt+/ | | -| Ctrl+Shift+Alt+Slash | --- | Ctrl+Shift+Alt+/ | Ctrl+Shift+Alt+/ | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| ArrowUp | --- | UpArrow | UpArrow | | -| Shift+ArrowUp | --- | Shift+UpArrow | Shift+UpArrow | | -| Ctrl+Alt+ArrowUp | --- | Ctrl+Alt+UpArrow | Ctrl+Alt+UpArrow | | -| Ctrl+Shift+Alt+ArrowUp | --- | Ctrl+Shift+Alt+UpArrow | Ctrl+Shift+Alt+UpArrow | | ------------------------------------------------------------------------------------------------------------- -| Numpad0 | --- | NumPad0 | NumPad0 | | -| Shift+Numpad0 | --- | Shift+NumPad0 | Shift+NumPad0 | | -| Ctrl+Alt+Numpad0 | --- | Ctrl+Alt+NumPad0 | Ctrl+Alt+NumPad0 | | -| Ctrl+Shift+Alt+Numpad0 | --- | Ctrl+Shift+Alt+NumPad0 | Ctrl+Shift+Alt+NumPad0 | | ------------------------------------------------------------------------------------------------------------- -| IntlBackslash | \ | OEM_102 | \ | NO | -| Shift+IntlBackslash | | | Shift+OEM_102 | Shift+\ | NO | -| Ctrl+Alt+IntlBackslash | --- | Ctrl+Alt+OEM_102 | Ctrl+Alt+\ | NO | -| Ctrl+Shift+Alt+IntlBackslash | --- | Ctrl+Shift+Alt+OEM_102 | Ctrl+Shift+Alt+\ | NO | ------------------------------------------------------------------------------------------------------------- -| IntlRo | --- | null | null | NO | -| Shift+IntlRo | --- | null | null | NO | -| Ctrl+Alt+IntlRo | --- | null | null | NO | -| Ctrl+Shift+Alt+IntlRo | --- | null | null | NO | ------------------------------------------------------------------------------------------------------------- -| IntlYen | --- | null | null | NO | -| Shift+IntlYen | --- | null | null | NO | -| Ctrl+Alt+IntlYen | --- | null | null | NO | -| Ctrl+Shift+Alt+IntlYen | --- | null | null | NO | ------------------------------------------------------------------------------------------------------------- \ No newline at end of file +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyA | a | A | A | a | | +| Shift+KeyA | A | Shift+A | Shift+A | shift+a | | +| Ctrl+Alt+KeyA | --- | Ctrl+Alt+A | Ctrl+Alt+A | ctrl+alt+a | | +| Ctrl+Shift+Alt+KeyA | --- | Ctrl+Shift+Alt+A | Ctrl+Shift+Alt+A | ctrl+shift+alt+a | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyB | b | B | B | b | | +| Shift+KeyB | B | Shift+B | Shift+B | shift+b | | +| Ctrl+Alt+KeyB | --- | Ctrl+Alt+B | Ctrl+Alt+B | ctrl+alt+b | | +| Ctrl+Shift+Alt+KeyB | --- | Ctrl+Shift+Alt+B | Ctrl+Shift+Alt+B | ctrl+shift+alt+b | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyC | c | C | C | c | | +| Shift+KeyC | C | Shift+C | Shift+C | shift+c | | +| Ctrl+Alt+KeyC | --- | Ctrl+Alt+C | Ctrl+Alt+C | ctrl+alt+c | | +| Ctrl+Shift+Alt+KeyC | --- | Ctrl+Shift+Alt+C | Ctrl+Shift+Alt+C | ctrl+shift+alt+c | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyD | d | D | D | d | | +| Shift+KeyD | D | Shift+D | Shift+D | shift+d | | +| Ctrl+Alt+KeyD | --- | Ctrl+Alt+D | Ctrl+Alt+D | ctrl+alt+d | | +| Ctrl+Shift+Alt+KeyD | --- | Ctrl+Shift+Alt+D | Ctrl+Shift+Alt+D | ctrl+shift+alt+d | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyE | e | E | E | e | | +| Shift+KeyE | E | Shift+E | Shift+E | shift+e | | +| Ctrl+Alt+KeyE | --- | Ctrl+Alt+E | Ctrl+Alt+E | ctrl+alt+e | | +| Ctrl+Shift+Alt+KeyE | --- | Ctrl+Shift+Alt+E | Ctrl+Shift+Alt+E | ctrl+shift+alt+e | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyF | f | F | F | f | | +| Shift+KeyF | F | Shift+F | Shift+F | shift+f | | +| Ctrl+Alt+KeyF | --- | Ctrl+Alt+F | Ctrl+Alt+F | ctrl+alt+f | | +| Ctrl+Shift+Alt+KeyF | --- | Ctrl+Shift+Alt+F | Ctrl+Shift+Alt+F | ctrl+shift+alt+f | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyG | g | G | G | g | | +| Shift+KeyG | G | Shift+G | Shift+G | shift+g | | +| Ctrl+Alt+KeyG | --- | Ctrl+Alt+G | Ctrl+Alt+G | ctrl+alt+g | | +| Ctrl+Shift+Alt+KeyG | --- | Ctrl+Shift+Alt+G | Ctrl+Shift+Alt+G | ctrl+shift+alt+g | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyH | h | H | H | h | | +| Shift+KeyH | H | Shift+H | Shift+H | shift+h | | +| Ctrl+Alt+KeyH | --- | Ctrl+Alt+H | Ctrl+Alt+H | ctrl+alt+h | | +| Ctrl+Shift+Alt+KeyH | --- | Ctrl+Shift+Alt+H | Ctrl+Shift+Alt+H | ctrl+shift+alt+h | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyI | i | I | I | i | | +| Shift+KeyI | I | Shift+I | Shift+I | shift+i | | +| Ctrl+Alt+KeyI | --- | Ctrl+Alt+I | Ctrl+Alt+I | ctrl+alt+i | | +| Ctrl+Shift+Alt+KeyI | --- | Ctrl+Shift+Alt+I | Ctrl+Shift+Alt+I | ctrl+shift+alt+i | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyJ | j | J | J | j | | +| Shift+KeyJ | J | Shift+J | Shift+J | shift+j | | +| Ctrl+Alt+KeyJ | --- | Ctrl+Alt+J | Ctrl+Alt+J | ctrl+alt+j | | +| Ctrl+Shift+Alt+KeyJ | --- | Ctrl+Shift+Alt+J | Ctrl+Shift+Alt+J | ctrl+shift+alt+j | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyK | k | K | K | k | | +| Shift+KeyK | K | Shift+K | Shift+K | shift+k | | +| Ctrl+Alt+KeyK | --- | Ctrl+Alt+K | Ctrl+Alt+K | ctrl+alt+k | | +| Ctrl+Shift+Alt+KeyK | --- | Ctrl+Shift+Alt+K | Ctrl+Shift+Alt+K | ctrl+shift+alt+k | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyL | l | L | L | l | | +| Shift+KeyL | L | Shift+L | Shift+L | shift+l | | +| Ctrl+Alt+KeyL | --- | Ctrl+Alt+L | Ctrl+Alt+L | ctrl+alt+l | | +| Ctrl+Shift+Alt+KeyL | --- | Ctrl+Shift+Alt+L | Ctrl+Shift+Alt+L | ctrl+shift+alt+l | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyM | m | M | M | m | | +| Shift+KeyM | M | Shift+M | Shift+M | shift+m | | +| Ctrl+Alt+KeyM | --- | Ctrl+Alt+M | Ctrl+Alt+M | ctrl+alt+m | | +| Ctrl+Shift+Alt+KeyM | --- | Ctrl+Shift+Alt+M | Ctrl+Shift+Alt+M | ctrl+shift+alt+m | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyN | n | N | N | n | | +| Shift+KeyN | N | Shift+N | Shift+N | shift+n | | +| Ctrl+Alt+KeyN | --- | Ctrl+Alt+N | Ctrl+Alt+N | ctrl+alt+n | | +| Ctrl+Shift+Alt+KeyN | --- | Ctrl+Shift+Alt+N | Ctrl+Shift+Alt+N | ctrl+shift+alt+n | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyO | o | O | O | o | | +| Shift+KeyO | O | Shift+O | Shift+O | shift+o | | +| Ctrl+Alt+KeyO | --- | Ctrl+Alt+O | Ctrl+Alt+O | ctrl+alt+o | | +| Ctrl+Shift+Alt+KeyO | --- | Ctrl+Shift+Alt+O | Ctrl+Shift+Alt+O | ctrl+shift+alt+o | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyP | p | P | P | p | | +| Shift+KeyP | P | Shift+P | Shift+P | shift+p | | +| Ctrl+Alt+KeyP | --- | Ctrl+Alt+P | Ctrl+Alt+P | ctrl+alt+p | | +| Ctrl+Shift+Alt+KeyP | --- | Ctrl+Shift+Alt+P | Ctrl+Shift+Alt+P | ctrl+shift+alt+p | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyQ | q | Q | Q | q | | +| Shift+KeyQ | Q | Shift+Q | Shift+Q | shift+q | | +| Ctrl+Alt+KeyQ | --- | Ctrl+Alt+Q | Ctrl+Alt+Q | ctrl+alt+q | | +| Ctrl+Shift+Alt+KeyQ | --- | Ctrl+Shift+Alt+Q | Ctrl+Shift+Alt+Q | ctrl+shift+alt+q | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyR | r | R | R | r | | +| Shift+KeyR | R | Shift+R | Shift+R | shift+r | | +| Ctrl+Alt+KeyR | --- | Ctrl+Alt+R | Ctrl+Alt+R | ctrl+alt+r | | +| Ctrl+Shift+Alt+KeyR | --- | Ctrl+Shift+Alt+R | Ctrl+Shift+Alt+R | ctrl+shift+alt+r | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyS | s | S | S | s | | +| Shift+KeyS | S | Shift+S | Shift+S | shift+s | | +| Ctrl+Alt+KeyS | --- | Ctrl+Alt+S | Ctrl+Alt+S | ctrl+alt+s | | +| Ctrl+Shift+Alt+KeyS | --- | Ctrl+Shift+Alt+S | Ctrl+Shift+Alt+S | ctrl+shift+alt+s | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyT | t | T | T | t | | +| Shift+KeyT | T | Shift+T | Shift+T | shift+t | | +| Ctrl+Alt+KeyT | --- | Ctrl+Alt+T | Ctrl+Alt+T | ctrl+alt+t | | +| Ctrl+Shift+Alt+KeyT | --- | Ctrl+Shift+Alt+T | Ctrl+Shift+Alt+T | ctrl+shift+alt+t | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyU | u | U | U | u | | +| Shift+KeyU | U | Shift+U | Shift+U | shift+u | | +| Ctrl+Alt+KeyU | --- | Ctrl+Alt+U | Ctrl+Alt+U | ctrl+alt+u | | +| Ctrl+Shift+Alt+KeyU | --- | Ctrl+Shift+Alt+U | Ctrl+Shift+Alt+U | ctrl+shift+alt+u | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyV | v | V | V | v | | +| Shift+KeyV | V | Shift+V | Shift+V | shift+v | | +| Ctrl+Alt+KeyV | --- | Ctrl+Alt+V | Ctrl+Alt+V | ctrl+alt+v | | +| Ctrl+Shift+Alt+KeyV | --- | Ctrl+Shift+Alt+V | Ctrl+Shift+Alt+V | ctrl+shift+alt+v | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyW | w | W | W | w | | +| Shift+KeyW | W | Shift+W | Shift+W | shift+w | | +| Ctrl+Alt+KeyW | --- | Ctrl+Alt+W | Ctrl+Alt+W | ctrl+alt+w | | +| Ctrl+Shift+Alt+KeyW | --- | Ctrl+Shift+Alt+W | Ctrl+Shift+Alt+W | ctrl+shift+alt+w | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyX | x | X | X | x | | +| Shift+KeyX | X | Shift+X | Shift+X | shift+x | | +| Ctrl+Alt+KeyX | --- | Ctrl+Alt+X | Ctrl+Alt+X | ctrl+alt+x | | +| Ctrl+Shift+Alt+KeyX | --- | Ctrl+Shift+Alt+X | Ctrl+Shift+Alt+X | ctrl+shift+alt+x | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyY | y | Y | Y | y | | +| Shift+KeyY | Y | Shift+Y | Shift+Y | shift+y | | +| Ctrl+Alt+KeyY | --- | Ctrl+Alt+Y | Ctrl+Alt+Y | ctrl+alt+y | | +| Ctrl+Shift+Alt+KeyY | --- | Ctrl+Shift+Alt+Y | Ctrl+Shift+Alt+Y | ctrl+shift+alt+y | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyZ | z | Z | Z | z | | +| Shift+KeyZ | Z | Shift+Z | Shift+Z | shift+z | | +| Ctrl+Alt+KeyZ | --- | Ctrl+Alt+Z | Ctrl+Alt+Z | ctrl+alt+z | | +| Ctrl+Shift+Alt+KeyZ | --- | Ctrl+Shift+Alt+Z | Ctrl+Shift+Alt+Z | ctrl+shift+alt+z | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit1 | 1 | 1 | 1 | 1 | | +| Shift+Digit1 | ! | Shift+1 | Shift+1 | shift+1 | | +| Ctrl+Alt+Digit1 | --- | Ctrl+Alt+1 | Ctrl+Alt+1 | ctrl+alt+1 | | +| Ctrl+Shift+Alt+Digit1 | --- | Ctrl+Shift+Alt+1 | Ctrl+Shift+Alt+1 | ctrl+shift+alt+1 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit2 | 2 | 2 | 2 | 2 | | +| Shift+Digit2 | @ | Shift+2 | Shift+2 | shift+2 | | +| Ctrl+Alt+Digit2 | --- | Ctrl+Alt+2 | Ctrl+Alt+2 | ctrl+alt+2 | | +| Ctrl+Shift+Alt+Digit2 | --- | Ctrl+Shift+Alt+2 | Ctrl+Shift+Alt+2 | ctrl+shift+alt+2 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit3 | 3 | 3 | 3 | 3 | | +| Shift+Digit3 | # | Shift+3 | Shift+3 | shift+3 | | +| Ctrl+Alt+Digit3 | --- | Ctrl+Alt+3 | Ctrl+Alt+3 | ctrl+alt+3 | | +| Ctrl+Shift+Alt+Digit3 | --- | Ctrl+Shift+Alt+3 | Ctrl+Shift+Alt+3 | ctrl+shift+alt+3 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit4 | 4 | 4 | 4 | 4 | | +| Shift+Digit4 | $ | Shift+4 | Shift+4 | shift+4 | | +| Ctrl+Alt+Digit4 | --- | Ctrl+Alt+4 | Ctrl+Alt+4 | ctrl+alt+4 | | +| Ctrl+Shift+Alt+Digit4 | --- | Ctrl+Shift+Alt+4 | Ctrl+Shift+Alt+4 | ctrl+shift+alt+4 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit5 | 5 | 5 | 5 | 5 | | +| Shift+Digit5 | % | Shift+5 | Shift+5 | shift+5 | | +| Ctrl+Alt+Digit5 | --- | Ctrl+Alt+5 | Ctrl+Alt+5 | ctrl+alt+5 | | +| Ctrl+Shift+Alt+Digit5 | --- | Ctrl+Shift+Alt+5 | Ctrl+Shift+Alt+5 | ctrl+shift+alt+5 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit6 | 6 | 6 | 6 | 6 | | +| Shift+Digit6 | ^ | Shift+6 | Shift+6 | shift+6 | | +| Ctrl+Alt+Digit6 | --- | Ctrl+Alt+6 | Ctrl+Alt+6 | ctrl+alt+6 | | +| Ctrl+Shift+Alt+Digit6 | --- | Ctrl+Shift+Alt+6 | Ctrl+Shift+Alt+6 | ctrl+shift+alt+6 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit7 | 7 | 7 | 7 | 7 | | +| Shift+Digit7 | & | Shift+7 | Shift+7 | shift+7 | | +| Ctrl+Alt+Digit7 | --- | Ctrl+Alt+7 | Ctrl+Alt+7 | ctrl+alt+7 | | +| Ctrl+Shift+Alt+Digit7 | --- | Ctrl+Shift+Alt+7 | Ctrl+Shift+Alt+7 | ctrl+shift+alt+7 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit8 | 8 | 8 | 8 | 8 | | +| Shift+Digit8 | * | Shift+8 | Shift+8 | shift+8 | | +| Ctrl+Alt+Digit8 | --- | Ctrl+Alt+8 | Ctrl+Alt+8 | ctrl+alt+8 | | +| Ctrl+Shift+Alt+Digit8 | --- | Ctrl+Shift+Alt+8 | Ctrl+Shift+Alt+8 | ctrl+shift+alt+8 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit9 | 9 | 9 | 9 | 9 | | +| Shift+Digit9 | ( | Shift+9 | Shift+9 | shift+9 | | +| Ctrl+Alt+Digit9 | --- | Ctrl+Alt+9 | Ctrl+Alt+9 | ctrl+alt+9 | | +| Ctrl+Shift+Alt+Digit9 | --- | Ctrl+Shift+Alt+9 | Ctrl+Shift+Alt+9 | ctrl+shift+alt+9 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit0 | 0 | 0 | 0 | 0 | | +| Shift+Digit0 | ) | Shift+0 | Shift+0 | shift+0 | | +| Ctrl+Alt+Digit0 | --- | Ctrl+Alt+0 | Ctrl+Alt+0 | ctrl+alt+0 | | +| Ctrl+Shift+Alt+Digit0 | --- | Ctrl+Shift+Alt+0 | Ctrl+Shift+Alt+0 | ctrl+shift+alt+0 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| Minus | - | - | - | - | | +| Shift+Minus | _ | Shift+- | Shift+- | shift+- | | +| Ctrl+Alt+Minus | --- | Ctrl+Alt+- | Ctrl+Alt+- | ctrl+alt+- | | +| Ctrl+Shift+Alt+Minus | --- | Ctrl+Shift+Alt+- | Ctrl+Shift+Alt+- | ctrl+shift+alt+- | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Equal | = | = | = | = | | +| Shift+Equal | + | Shift+= | Shift+= | shift+= | | +| Ctrl+Alt+Equal | --- | Ctrl+Alt+= | Ctrl+Alt+= | ctrl+alt+= | | +| Ctrl+Shift+Alt+Equal | --- | Ctrl+Shift+Alt+= | Ctrl+Shift+Alt+= | ctrl+shift+alt+= | | +----------------------------------------------------------------------------------------------------------------------------------------- +| BracketLeft | [ | [ | [ | [ | | +| Shift+BracketLeft | { | Shift+[ | Shift+[ | shift+[ | | +| Ctrl+Alt+BracketLeft | --- | Ctrl+Alt+[ | Ctrl+Alt+[ | ctrl+alt+[ | | +| Ctrl+Shift+Alt+BracketLeft | --- | Ctrl+Shift+Alt+[ | Ctrl+Shift+Alt+[ | ctrl+shift+alt+[ | | +----------------------------------------------------------------------------------------------------------------------------------------- +| BracketRight | ] | ] | ] | ] | | +| Shift+BracketRight | } | Shift+] | Shift+] | shift+] | | +| Ctrl+Alt+BracketRight | --- | Ctrl+Alt+] | Ctrl+Alt+] | ctrl+alt+] | | +| Ctrl+Shift+Alt+BracketRight | --- | Ctrl+Shift+Alt+] | Ctrl+Shift+Alt+] | ctrl+shift+alt+] | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Backslash | \ | \ | \ | \ | | +| Shift+Backslash | | | Shift+\ | Shift+\ | shift+\ | | +| Ctrl+Alt+Backslash | --- | Ctrl+Alt+\ | Ctrl+Alt+\ | ctrl+alt+\ | | +| Ctrl+Shift+Alt+Backslash | --- | Ctrl+Shift+Alt+\ | Ctrl+Shift+Alt+\ | ctrl+shift+alt+\ | | +----------------------------------------------------------------------------------------------------------------------------------------- +| IntlHash | --- | null | null | null | NO | +| Shift+IntlHash | --- | null | null | null | NO | +| Ctrl+Alt+IntlHash | --- | null | null | null | NO | +| Ctrl+Shift+Alt+IntlHash | --- | null | null | null | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| Semicolon | ; | ; | ; | ; | | +| Shift+Semicolon | : | Shift+; | Shift+; | shift+; | | +| Ctrl+Alt+Semicolon | --- | Ctrl+Alt+; | Ctrl+Alt+; | ctrl+alt+; | | +| Ctrl+Shift+Alt+Semicolon | --- | Ctrl+Shift+Alt+; | Ctrl+Shift+Alt+; | ctrl+shift+alt+; | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Quote | ' | ' | ' | ' | | +| Shift+Quote | " | Shift+' | Shift+' | shift+' | | +| Ctrl+Alt+Quote | --- | Ctrl+Alt+' | Ctrl+Alt+' | ctrl+alt+' | | +| Ctrl+Shift+Alt+Quote | --- | Ctrl+Shift+Alt+' | Ctrl+Shift+Alt+' | ctrl+shift+alt+' | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Backquote | ` | ` | ` | ` | | +| Shift+Backquote | ~ | Shift+` | Shift+` | shift+` | | +| Ctrl+Alt+Backquote | --- | Ctrl+Alt+` | Ctrl+Alt+` | ctrl+alt+` | | +| Ctrl+Shift+Alt+Backquote | --- | Ctrl+Shift+Alt+` | Ctrl+Shift+Alt+` | ctrl+shift+alt+` | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Comma | , | , | , | , | | +| Shift+Comma | < | Shift+, | Shift+, | shift+, | | +| Ctrl+Alt+Comma | --- | Ctrl+Alt+, | Ctrl+Alt+, | ctrl+alt+, | | +| Ctrl+Shift+Alt+Comma | --- | Ctrl+Shift+Alt+, | Ctrl+Shift+Alt+, | ctrl+shift+alt+, | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Period | . | . | . | . | | +| Shift+Period | > | Shift+. | Shift+. | shift+. | | +| Ctrl+Alt+Period | --- | Ctrl+Alt+. | Ctrl+Alt+. | ctrl+alt+. | | +| Ctrl+Shift+Alt+Period | --- | Ctrl+Shift+Alt+. | Ctrl+Shift+Alt+. | ctrl+shift+alt+. | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Slash | / | / | / | / | | +| Shift+Slash | ? | Shift+/ | Shift+/ | shift+/ | | +| Ctrl+Alt+Slash | --- | Ctrl+Alt+/ | Ctrl+Alt+/ | ctrl+alt+/ | | +| Ctrl+Shift+Alt+Slash | --- | Ctrl+Shift+Alt+/ | Ctrl+Shift+Alt+/ | ctrl+shift+alt+/ | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| ArrowUp | --- | UpArrow | UpArrow | up | | +| Shift+ArrowUp | --- | Shift+UpArrow | Shift+UpArrow | shift+up | | +| Ctrl+Alt+ArrowUp | --- | Ctrl+Alt+UpArrow | Ctrl+Alt+UpArrow | ctrl+alt+up | | +| Ctrl+Shift+Alt+ArrowUp | --- | Ctrl+Shift+Alt+UpArrow | Ctrl+Shift+Alt+UpArrow | ctrl+shift+alt+up | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Numpad0 | --- | NumPad0 | NumPad0 | numpad0 | | +| Shift+Numpad0 | --- | Shift+NumPad0 | Shift+NumPad0 | shift+numpad0 | | +| Ctrl+Alt+Numpad0 | --- | Ctrl+Alt+NumPad0 | Ctrl+Alt+NumPad0 | ctrl+alt+numpad0 | | +| Ctrl+Shift+Alt+Numpad0 | --- | Ctrl+Shift+Alt+NumPad0 | Ctrl+Shift+Alt+NumPad0 | ctrl+shift+alt+numpad0 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| IntlBackslash | \ | OEM_102 | \ | oem_102 | NO | +| Shift+IntlBackslash | | | Shift+OEM_102 | Shift+\ | shift+oem_102 | NO | +| Ctrl+Alt+IntlBackslash | --- | Ctrl+Alt+OEM_102 | Ctrl+Alt+\ | ctrl+alt+oem_102 | NO | +| Ctrl+Shift+Alt+IntlBackslash | --- | Ctrl+Shift+Alt+OEM_102 | Ctrl+Shift+Alt+\ | ctrl+shift+alt+oem_102 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| IntlRo | --- | null | null | null | NO | +| Shift+IntlRo | --- | null | null | null | NO | +| Ctrl+Alt+IntlRo | --- | null | null | null | NO | +| Ctrl+Shift+Alt+IntlRo | --- | null | null | null | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| IntlYen | --- | null | null | null | NO | +| Shift+IntlYen | --- | null | null | null | NO | +| Ctrl+Alt+IntlYen | --- | null | null | null | NO | +| Ctrl+Shift+Alt+IntlYen | --- | null | null | null | NO | +----------------------------------------------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/test/win_por_ptb.txt b/src/vs/workbench/services/keybinding/test/win_por_ptb.txt index a09f7654b32..c29ed546991 100644 --- a/src/vs/workbench/services/keybinding/test/win_por_ptb.txt +++ b/src/vs/workbench/services/keybinding/test/win_por_ptb.txt @@ -1,284 +1,284 @@ ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyA | a | A | A | | -| Shift+KeyA | A | Shift+A | Shift+A | | -| Ctrl+Alt+KeyA | --- | Ctrl+Alt+A | Ctrl+Alt+A | | -| Ctrl+Shift+Alt+KeyA | --- | Ctrl+Shift+Alt+A | Ctrl+Shift+Alt+A | | ------------------------------------------------------------------------------------------------------------- -| KeyB | b | B | B | | -| Shift+KeyB | B | Shift+B | Shift+B | | -| Ctrl+Alt+KeyB | --- | Ctrl+Alt+B | Ctrl+Alt+B | | -| Ctrl+Shift+Alt+KeyB | --- | Ctrl+Shift+Alt+B | Ctrl+Shift+Alt+B | | ------------------------------------------------------------------------------------------------------------- -| KeyC | c | C | C | | -| Shift+KeyC | C | Shift+C | Shift+C | | -| Ctrl+Alt+KeyC | ₢ | Ctrl+Alt+C | Ctrl+Alt+C | | -| Ctrl+Shift+Alt+KeyC | --- | Ctrl+Shift+Alt+C | Ctrl+Shift+Alt+C | | ------------------------------------------------------------------------------------------------------------- -| KeyD | d | D | D | | -| Shift+KeyD | D | Shift+D | Shift+D | | -| Ctrl+Alt+KeyD | --- | Ctrl+Alt+D | Ctrl+Alt+D | | -| Ctrl+Shift+Alt+KeyD | --- | Ctrl+Shift+Alt+D | Ctrl+Shift+Alt+D | | ------------------------------------------------------------------------------------------------------------- -| KeyE | e | E | E | | -| Shift+KeyE | E | Shift+E | Shift+E | | -| Ctrl+Alt+KeyE | ° | Ctrl+Alt+E | Ctrl+Alt+E | | -| Ctrl+Shift+Alt+KeyE | --- | Ctrl+Shift+Alt+E | Ctrl+Shift+Alt+E | | ------------------------------------------------------------------------------------------------------------- -| KeyF | f | F | F | | -| Shift+KeyF | F | Shift+F | Shift+F | | -| Ctrl+Alt+KeyF | --- | Ctrl+Alt+F | Ctrl+Alt+F | | -| Ctrl+Shift+Alt+KeyF | --- | Ctrl+Shift+Alt+F | Ctrl+Shift+Alt+F | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyG | g | G | G | | -| Shift+KeyG | G | Shift+G | Shift+G | | -| Ctrl+Alt+KeyG | --- | Ctrl+Alt+G | Ctrl+Alt+G | | -| Ctrl+Shift+Alt+KeyG | --- | Ctrl+Shift+Alt+G | Ctrl+Shift+Alt+G | | ------------------------------------------------------------------------------------------------------------- -| KeyH | h | H | H | | -| Shift+KeyH | H | Shift+H | Shift+H | | -| Ctrl+Alt+KeyH | --- | Ctrl+Alt+H | Ctrl+Alt+H | | -| Ctrl+Shift+Alt+KeyH | --- | Ctrl+Shift+Alt+H | Ctrl+Shift+Alt+H | | ------------------------------------------------------------------------------------------------------------- -| KeyI | i | I | I | | -| Shift+KeyI | I | Shift+I | Shift+I | | -| Ctrl+Alt+KeyI | --- | Ctrl+Alt+I | Ctrl+Alt+I | | -| Ctrl+Shift+Alt+KeyI | --- | Ctrl+Shift+Alt+I | Ctrl+Shift+Alt+I | | ------------------------------------------------------------------------------------------------------------- -| KeyJ | j | J | J | | -| Shift+KeyJ | J | Shift+J | Shift+J | | -| Ctrl+Alt+KeyJ | --- | Ctrl+Alt+J | Ctrl+Alt+J | | -| Ctrl+Shift+Alt+KeyJ | --- | Ctrl+Shift+Alt+J | Ctrl+Shift+Alt+J | | ------------------------------------------------------------------------------------------------------------- -| KeyK | k | K | K | | -| Shift+KeyK | K | Shift+K | Shift+K | | -| Ctrl+Alt+KeyK | --- | Ctrl+Alt+K | Ctrl+Alt+K | | -| Ctrl+Shift+Alt+KeyK | --- | Ctrl+Shift+Alt+K | Ctrl+Shift+Alt+K | | ------------------------------------------------------------------------------------------------------------- -| KeyL | l | L | L | | -| Shift+KeyL | L | Shift+L | Shift+L | | -| Ctrl+Alt+KeyL | --- | Ctrl+Alt+L | Ctrl+Alt+L | | -| Ctrl+Shift+Alt+KeyL | --- | Ctrl+Shift+Alt+L | Ctrl+Shift+Alt+L | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyM | m | M | M | | -| Shift+KeyM | M | Shift+M | Shift+M | | -| Ctrl+Alt+KeyM | --- | Ctrl+Alt+M | Ctrl+Alt+M | | -| Ctrl+Shift+Alt+KeyM | --- | Ctrl+Shift+Alt+M | Ctrl+Shift+Alt+M | | ------------------------------------------------------------------------------------------------------------- -| KeyN | n | N | N | | -| Shift+KeyN | N | Shift+N | Shift+N | | -| Ctrl+Alt+KeyN | --- | Ctrl+Alt+N | Ctrl+Alt+N | | -| Ctrl+Shift+Alt+KeyN | --- | Ctrl+Shift+Alt+N | Ctrl+Shift+Alt+N | | ------------------------------------------------------------------------------------------------------------- -| KeyO | o | O | O | | -| Shift+KeyO | O | Shift+O | Shift+O | | -| Ctrl+Alt+KeyO | --- | Ctrl+Alt+O | Ctrl+Alt+O | | -| Ctrl+Shift+Alt+KeyO | --- | Ctrl+Shift+Alt+O | Ctrl+Shift+Alt+O | | ------------------------------------------------------------------------------------------------------------- -| KeyP | p | P | P | | -| Shift+KeyP | P | Shift+P | Shift+P | | -| Ctrl+Alt+KeyP | --- | Ctrl+Alt+P | Ctrl+Alt+P | | -| Ctrl+Shift+Alt+KeyP | --- | Ctrl+Shift+Alt+P | Ctrl+Shift+Alt+P | | ------------------------------------------------------------------------------------------------------------- -| KeyQ | q | Q | Q | | -| Shift+KeyQ | Q | Shift+Q | Shift+Q | | -| Ctrl+Alt+KeyQ | / | Ctrl+Alt+Q | Ctrl+Alt+Q | | -| Ctrl+Shift+Alt+KeyQ | --- | Ctrl+Shift+Alt+Q | Ctrl+Shift+Alt+Q | | ------------------------------------------------------------------------------------------------------------- -| KeyR | r | R | R | | -| Shift+KeyR | R | Shift+R | Shift+R | | -| Ctrl+Alt+KeyR | --- | Ctrl+Alt+R | Ctrl+Alt+R | | -| Ctrl+Shift+Alt+KeyR | --- | Ctrl+Shift+Alt+R | Ctrl+Shift+Alt+R | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyS | s | S | S | | -| Shift+KeyS | S | Shift+S | Shift+S | | -| Ctrl+Alt+KeyS | --- | Ctrl+Alt+S | Ctrl+Alt+S | | -| Ctrl+Shift+Alt+KeyS | --- | Ctrl+Shift+Alt+S | Ctrl+Shift+Alt+S | | ------------------------------------------------------------------------------------------------------------- -| KeyT | t | T | T | | -| Shift+KeyT | T | Shift+T | Shift+T | | -| Ctrl+Alt+KeyT | --- | Ctrl+Alt+T | Ctrl+Alt+T | | -| Ctrl+Shift+Alt+KeyT | --- | Ctrl+Shift+Alt+T | Ctrl+Shift+Alt+T | | ------------------------------------------------------------------------------------------------------------- -| KeyU | u | U | U | | -| Shift+KeyU | U | Shift+U | Shift+U | | -| Ctrl+Alt+KeyU | --- | Ctrl+Alt+U | Ctrl+Alt+U | | -| Ctrl+Shift+Alt+KeyU | --- | Ctrl+Shift+Alt+U | Ctrl+Shift+Alt+U | | ------------------------------------------------------------------------------------------------------------- -| KeyV | v | V | V | | -| Shift+KeyV | V | Shift+V | Shift+V | | -| Ctrl+Alt+KeyV | --- | Ctrl+Alt+V | Ctrl+Alt+V | | -| Ctrl+Shift+Alt+KeyV | --- | Ctrl+Shift+Alt+V | Ctrl+Shift+Alt+V | | ------------------------------------------------------------------------------------------------------------- -| KeyW | w | W | W | | -| Shift+KeyW | W | Shift+W | Shift+W | | -| Ctrl+Alt+KeyW | ? | Ctrl+Alt+W | Ctrl+Alt+W | | -| Ctrl+Shift+Alt+KeyW | --- | Ctrl+Shift+Alt+W | Ctrl+Shift+Alt+W | | ------------------------------------------------------------------------------------------------------------- -| KeyX | x | X | X | | -| Shift+KeyX | X | Shift+X | Shift+X | | -| Ctrl+Alt+KeyX | --- | Ctrl+Alt+X | Ctrl+Alt+X | | -| Ctrl+Shift+Alt+KeyX | --- | Ctrl+Shift+Alt+X | Ctrl+Shift+Alt+X | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyY | y | Y | Y | | -| Shift+KeyY | Y | Shift+Y | Shift+Y | | -| Ctrl+Alt+KeyY | --- | Ctrl+Alt+Y | Ctrl+Alt+Y | | -| Ctrl+Shift+Alt+KeyY | --- | Ctrl+Shift+Alt+Y | Ctrl+Shift+Alt+Y | | ------------------------------------------------------------------------------------------------------------- -| KeyZ | z | Z | Z | | -| Shift+KeyZ | Z | Shift+Z | Shift+Z | | -| Ctrl+Alt+KeyZ | --- | Ctrl+Alt+Z | Ctrl+Alt+Z | | -| Ctrl+Shift+Alt+KeyZ | --- | Ctrl+Shift+Alt+Z | Ctrl+Shift+Alt+Z | | ------------------------------------------------------------------------------------------------------------- -| Digit1 | 1 | 1 | 1 | | -| Shift+Digit1 | ! | Shift+1 | Shift+1 | | -| Ctrl+Alt+Digit1 | ¹ | Ctrl+Alt+1 | Ctrl+Alt+1 | | -| Ctrl+Shift+Alt+Digit1 | --- | Ctrl+Shift+Alt+1 | Ctrl+Shift+Alt+1 | | ------------------------------------------------------------------------------------------------------------- -| Digit2 | 2 | 2 | 2 | | -| Shift+Digit2 | @ | Shift+2 | Shift+2 | | -| Ctrl+Alt+Digit2 | ² | Ctrl+Alt+2 | Ctrl+Alt+2 | | -| Ctrl+Shift+Alt+Digit2 | --- | Ctrl+Shift+Alt+2 | Ctrl+Shift+Alt+2 | | ------------------------------------------------------------------------------------------------------------- -| Digit3 | 3 | 3 | 3 | | -| Shift+Digit3 | # | Shift+3 | Shift+3 | | -| Ctrl+Alt+Digit3 | ³ | Ctrl+Alt+3 | Ctrl+Alt+3 | | -| Ctrl+Shift+Alt+Digit3 | --- | Ctrl+Shift+Alt+3 | Ctrl+Shift+Alt+3 | | ------------------------------------------------------------------------------------------------------------- -| Digit4 | 4 | 4 | 4 | | -| Shift+Digit4 | $ | Shift+4 | Shift+4 | | -| Ctrl+Alt+Digit4 | £ | Ctrl+Alt+4 | Ctrl+Alt+4 | | -| Ctrl+Shift+Alt+Digit4 | --- | Ctrl+Shift+Alt+4 | Ctrl+Shift+Alt+4 | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| Digit5 | 5 | 5 | 5 | | -| Shift+Digit5 | % | Shift+5 | Shift+5 | | -| Ctrl+Alt+Digit5 | ¢ | Ctrl+Alt+5 | Ctrl+Alt+5 | | -| Ctrl+Shift+Alt+Digit5 | --- | Ctrl+Shift+Alt+5 | Ctrl+Shift+Alt+5 | | ------------------------------------------------------------------------------------------------------------- -| Digit6 | 6 | 6 | 6 | | -| Shift+Digit6 | ¨ | Shift+6 | Shift+6 | | -| Ctrl+Alt+Digit6 | ¬ | Ctrl+Alt+6 | Ctrl+Alt+6 | | -| Ctrl+Shift+Alt+Digit6 | --- | Ctrl+Shift+Alt+6 | Ctrl+Shift+Alt+6 | | ------------------------------------------------------------------------------------------------------------- -| Digit7 | 7 | 7 | 7 | | -| Shift+Digit7 | & | Shift+7 | Shift+7 | | -| Ctrl+Alt+Digit7 | --- | Ctrl+Alt+7 | Ctrl+Alt+7 | | -| Ctrl+Shift+Alt+Digit7 | --- | Ctrl+Shift+Alt+7 | Ctrl+Shift+Alt+7 | | ------------------------------------------------------------------------------------------------------------- -| Digit8 | 8 | 8 | 8 | | -| Shift+Digit8 | * | Shift+8 | Shift+8 | | -| Ctrl+Alt+Digit8 | --- | Ctrl+Alt+8 | Ctrl+Alt+8 | | -| Ctrl+Shift+Alt+Digit8 | --- | Ctrl+Shift+Alt+8 | Ctrl+Shift+Alt+8 | | ------------------------------------------------------------------------------------------------------------- -| Digit9 | 9 | 9 | 9 | | -| Shift+Digit9 | ( | Shift+9 | Shift+9 | | -| Ctrl+Alt+Digit9 | --- | Ctrl+Alt+9 | Ctrl+Alt+9 | | -| Ctrl+Shift+Alt+Digit9 | --- | Ctrl+Shift+Alt+9 | Ctrl+Shift+Alt+9 | | ------------------------------------------------------------------------------------------------------------- -| Digit0 | 0 | 0 | 0 | | -| Shift+Digit0 | ) | Shift+0 | Shift+0 | | -| Ctrl+Alt+Digit0 | --- | Ctrl+Alt+0 | Ctrl+Alt+0 | | -| Ctrl+Shift+Alt+Digit0 | --- | Ctrl+Shift+Alt+0 | Ctrl+Shift+Alt+0 | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| Minus | - | - | - | NO | -| Shift+Minus | _ | Shift+- | Shift+- | NO | -| Ctrl+Alt+Minus | --- | Ctrl+Alt+- | Ctrl+Alt+- | NO | -| Ctrl+Shift+Alt+Minus | --- | Ctrl+Shift+Alt+- | Ctrl+Shift+Alt+- | NO | ------------------------------------------------------------------------------------------------------------- -| Equal | = | = | = | NO | -| Shift+Equal | + | Shift+= | Shift+= | NO | -| Ctrl+Alt+Equal | § | Ctrl+Alt+= | Ctrl+Alt+= | NO | -| Ctrl+Shift+Alt+Equal | --- | Ctrl+Shift+Alt+= | Ctrl+Shift+Alt+= | NO | ------------------------------------------------------------------------------------------------------------- -| BracketLeft | ´ | [ | ´ | NO | -| Shift+BracketLeft | ` | Shift+[ | Shift+´ | NO | -| Ctrl+Alt+BracketLeft | --- | Ctrl+Alt+[ | Ctrl+Alt+´ | NO | -| Ctrl+Shift+Alt+BracketLeft | --- | Ctrl+Shift+Alt+[ | Ctrl+Shift+Alt+´ | NO | ------------------------------------------------------------------------------------------------------------- -| BracketRight | [ | ] | [ | NO | -| Shift+BracketRight | { | Shift+] | Shift+[ | NO | -| Ctrl+Alt+BracketRight | ª | Ctrl+Alt+] | Ctrl+Alt+[ | NO | -| Ctrl+Shift+Alt+BracketRight | --- | Ctrl+Shift+Alt+] | Ctrl+Shift+Alt+[ | NO | ------------------------------------------------------------------------------------------------------------- -| Backslash | ] | \ | ] | NO | -| Shift+Backslash | } | Shift+\ | Shift+] | NO | -| Ctrl+Alt+Backslash | º | Ctrl+Alt+\ | Ctrl+Alt+] | NO | -| Ctrl+Shift+Alt+Backslash | --- | Ctrl+Shift+Alt+\ | Ctrl+Shift+Alt+] | NO | ------------------------------------------------------------------------------------------------------------- -| IntlHash | --- | null | null | NO | -| Shift+IntlHash | --- | null | null | NO | -| Ctrl+Alt+IntlHash | --- | null | null | NO | -| Ctrl+Shift+Alt+IntlHash | --- | null | null | NO | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| Semicolon | ç | ; | ç | NO | -| Shift+Semicolon | Ç | Shift+; | Shift+ç | NO | -| Ctrl+Alt+Semicolon | --- | Ctrl+Alt+; | Ctrl+Alt+ç | NO | -| Ctrl+Shift+Alt+Semicolon | --- | Ctrl+Shift+Alt+; | Ctrl+Shift+Alt+ç | NO | ------------------------------------------------------------------------------------------------------------- -| Quote | ~ | ' | ~ | NO | -| Shift+Quote | ^ | Shift+' | Shift+~ | NO | -| Ctrl+Alt+Quote | --- | Ctrl+Alt+' | Ctrl+Alt+~ | NO | -| Ctrl+Shift+Alt+Quote | --- | Ctrl+Shift+Alt+' | Ctrl+Shift+Alt+~ | NO | ------------------------------------------------------------------------------------------------------------- -| Backquote | ' | ` | ' | NO | -| Shift+Backquote | " | Shift+` | Shift+' | NO | -| Ctrl+Alt+Backquote | --- | Ctrl+Alt+` | Ctrl+Alt+' | NO | -| Ctrl+Shift+Alt+Backquote | --- | Ctrl+Shift+Alt+` | Ctrl+Shift+Alt+' | NO | ------------------------------------------------------------------------------------------------------------- -| Comma | , | , | , | NO | -| Shift+Comma | < | Shift+, | Shift+, | NO | -| Ctrl+Alt+Comma | --- | Ctrl+Alt+, | Ctrl+Alt+, | NO | -| Ctrl+Shift+Alt+Comma | --- | Ctrl+Shift+Alt+, | Ctrl+Shift+Alt+, | NO | ------------------------------------------------------------------------------------------------------------- -| Period | . | . | . | NO | -| Shift+Period | > | Shift+. | Shift+. | NO | -| Ctrl+Alt+Period | --- | Ctrl+Alt+. | Ctrl+Alt+. | NO | -| Ctrl+Shift+Alt+Period | --- | Ctrl+Shift+Alt+. | Ctrl+Shift+Alt+. | NO | ------------------------------------------------------------------------------------------------------------- -| Slash | ; | / | ; | NO | -| Shift+Slash | : | Shift+/ | Shift+; | NO | -| Ctrl+Alt+Slash | --- | Ctrl+Alt+/ | Ctrl+Alt+; | NO | -| Ctrl+Shift+Alt+Slash | --- | Ctrl+Shift+Alt+/ | Ctrl+Shift+Alt+; | NO | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| ArrowUp | --- | UpArrow | UpArrow | | -| Shift+ArrowUp | --- | Shift+UpArrow | Shift+UpArrow | | -| Ctrl+Alt+ArrowUp | --- | Ctrl+Alt+UpArrow | Ctrl+Alt+UpArrow | | -| Ctrl+Shift+Alt+ArrowUp | --- | Ctrl+Shift+Alt+UpArrow | Ctrl+Shift+Alt+UpArrow | | ------------------------------------------------------------------------------------------------------------- -| Numpad0 | --- | NumPad0 | NumPad0 | | -| Shift+Numpad0 | --- | Shift+NumPad0 | Shift+NumPad0 | | -| Ctrl+Alt+Numpad0 | --- | Ctrl+Alt+NumPad0 | Ctrl+Alt+NumPad0 | | -| Ctrl+Shift+Alt+Numpad0 | --- | Ctrl+Shift+Alt+NumPad0 | Ctrl+Shift+Alt+NumPad0 | | ------------------------------------------------------------------------------------------------------------- -| IntlBackslash | \ | OEM_102 | \ | NO | -| Shift+IntlBackslash | | | Shift+OEM_102 | Shift+\ | NO | -| Ctrl+Alt+IntlBackslash | --- | Ctrl+Alt+OEM_102 | Ctrl+Alt+\ | NO | -| Ctrl+Shift+Alt+IntlBackslash | --- | Ctrl+Shift+Alt+OEM_102 | Ctrl+Shift+Alt+\ | NO | ------------------------------------------------------------------------------------------------------------- -| IntlRo | / | ABNT_C1 | / | NO | -| Shift+IntlRo | ? | Shift+ABNT_C1 | Shift+/ | NO | -| Ctrl+Alt+IntlRo | ° | Ctrl+Alt+ABNT_C1 | Ctrl+Alt+/ | NO | -| Ctrl+Shift+Alt+IntlRo | --- | Ctrl+Shift+Alt+ABNT_C1 | Ctrl+Shift+Alt+/ | NO | ------------------------------------------------------------------------------------------------------------- -| IntlYen | --- | null | null | NO | -| Shift+IntlYen | --- | null | null | NO | -| Ctrl+Alt+IntlYen | --- | null | null | NO | -| Ctrl+Shift+Alt+IntlYen | --- | null | null | NO | ------------------------------------------------------------------------------------------------------------- \ No newline at end of file +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyA | a | A | A | a | | +| Shift+KeyA | A | Shift+A | Shift+A | shift+a | | +| Ctrl+Alt+KeyA | --- | Ctrl+Alt+A | Ctrl+Alt+A | ctrl+alt+a | | +| Ctrl+Shift+Alt+KeyA | --- | Ctrl+Shift+Alt+A | Ctrl+Shift+Alt+A | ctrl+shift+alt+a | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyB | b | B | B | b | | +| Shift+KeyB | B | Shift+B | Shift+B | shift+b | | +| Ctrl+Alt+KeyB | --- | Ctrl+Alt+B | Ctrl+Alt+B | ctrl+alt+b | | +| Ctrl+Shift+Alt+KeyB | --- | Ctrl+Shift+Alt+B | Ctrl+Shift+Alt+B | ctrl+shift+alt+b | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyC | c | C | C | c | | +| Shift+KeyC | C | Shift+C | Shift+C | shift+c | | +| Ctrl+Alt+KeyC | ₢ | Ctrl+Alt+C | Ctrl+Alt+C | ctrl+alt+c | | +| Ctrl+Shift+Alt+KeyC | --- | Ctrl+Shift+Alt+C | Ctrl+Shift+Alt+C | ctrl+shift+alt+c | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyD | d | D | D | d | | +| Shift+KeyD | D | Shift+D | Shift+D | shift+d | | +| Ctrl+Alt+KeyD | --- | Ctrl+Alt+D | Ctrl+Alt+D | ctrl+alt+d | | +| Ctrl+Shift+Alt+KeyD | --- | Ctrl+Shift+Alt+D | Ctrl+Shift+Alt+D | ctrl+shift+alt+d | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyE | e | E | E | e | | +| Shift+KeyE | E | Shift+E | Shift+E | shift+e | | +| Ctrl+Alt+KeyE | ° | Ctrl+Alt+E | Ctrl+Alt+E | ctrl+alt+e | | +| Ctrl+Shift+Alt+KeyE | --- | Ctrl+Shift+Alt+E | Ctrl+Shift+Alt+E | ctrl+shift+alt+e | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyF | f | F | F | f | | +| Shift+KeyF | F | Shift+F | Shift+F | shift+f | | +| Ctrl+Alt+KeyF | --- | Ctrl+Alt+F | Ctrl+Alt+F | ctrl+alt+f | | +| Ctrl+Shift+Alt+KeyF | --- | Ctrl+Shift+Alt+F | Ctrl+Shift+Alt+F | ctrl+shift+alt+f | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyG | g | G | G | g | | +| Shift+KeyG | G | Shift+G | Shift+G | shift+g | | +| Ctrl+Alt+KeyG | --- | Ctrl+Alt+G | Ctrl+Alt+G | ctrl+alt+g | | +| Ctrl+Shift+Alt+KeyG | --- | Ctrl+Shift+Alt+G | Ctrl+Shift+Alt+G | ctrl+shift+alt+g | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyH | h | H | H | h | | +| Shift+KeyH | H | Shift+H | Shift+H | shift+h | | +| Ctrl+Alt+KeyH | --- | Ctrl+Alt+H | Ctrl+Alt+H | ctrl+alt+h | | +| Ctrl+Shift+Alt+KeyH | --- | Ctrl+Shift+Alt+H | Ctrl+Shift+Alt+H | ctrl+shift+alt+h | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyI | i | I | I | i | | +| Shift+KeyI | I | Shift+I | Shift+I | shift+i | | +| Ctrl+Alt+KeyI | --- | Ctrl+Alt+I | Ctrl+Alt+I | ctrl+alt+i | | +| Ctrl+Shift+Alt+KeyI | --- | Ctrl+Shift+Alt+I | Ctrl+Shift+Alt+I | ctrl+shift+alt+i | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyJ | j | J | J | j | | +| Shift+KeyJ | J | Shift+J | Shift+J | shift+j | | +| Ctrl+Alt+KeyJ | --- | Ctrl+Alt+J | Ctrl+Alt+J | ctrl+alt+j | | +| Ctrl+Shift+Alt+KeyJ | --- | Ctrl+Shift+Alt+J | Ctrl+Shift+Alt+J | ctrl+shift+alt+j | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyK | k | K | K | k | | +| Shift+KeyK | K | Shift+K | Shift+K | shift+k | | +| Ctrl+Alt+KeyK | --- | Ctrl+Alt+K | Ctrl+Alt+K | ctrl+alt+k | | +| Ctrl+Shift+Alt+KeyK | --- | Ctrl+Shift+Alt+K | Ctrl+Shift+Alt+K | ctrl+shift+alt+k | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyL | l | L | L | l | | +| Shift+KeyL | L | Shift+L | Shift+L | shift+l | | +| Ctrl+Alt+KeyL | --- | Ctrl+Alt+L | Ctrl+Alt+L | ctrl+alt+l | | +| Ctrl+Shift+Alt+KeyL | --- | Ctrl+Shift+Alt+L | Ctrl+Shift+Alt+L | ctrl+shift+alt+l | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyM | m | M | M | m | | +| Shift+KeyM | M | Shift+M | Shift+M | shift+m | | +| Ctrl+Alt+KeyM | --- | Ctrl+Alt+M | Ctrl+Alt+M | ctrl+alt+m | | +| Ctrl+Shift+Alt+KeyM | --- | Ctrl+Shift+Alt+M | Ctrl+Shift+Alt+M | ctrl+shift+alt+m | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyN | n | N | N | n | | +| Shift+KeyN | N | Shift+N | Shift+N | shift+n | | +| Ctrl+Alt+KeyN | --- | Ctrl+Alt+N | Ctrl+Alt+N | ctrl+alt+n | | +| Ctrl+Shift+Alt+KeyN | --- | Ctrl+Shift+Alt+N | Ctrl+Shift+Alt+N | ctrl+shift+alt+n | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyO | o | O | O | o | | +| Shift+KeyO | O | Shift+O | Shift+O | shift+o | | +| Ctrl+Alt+KeyO | --- | Ctrl+Alt+O | Ctrl+Alt+O | ctrl+alt+o | | +| Ctrl+Shift+Alt+KeyO | --- | Ctrl+Shift+Alt+O | Ctrl+Shift+Alt+O | ctrl+shift+alt+o | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyP | p | P | P | p | | +| Shift+KeyP | P | Shift+P | Shift+P | shift+p | | +| Ctrl+Alt+KeyP | --- | Ctrl+Alt+P | Ctrl+Alt+P | ctrl+alt+p | | +| Ctrl+Shift+Alt+KeyP | --- | Ctrl+Shift+Alt+P | Ctrl+Shift+Alt+P | ctrl+shift+alt+p | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyQ | q | Q | Q | q | | +| Shift+KeyQ | Q | Shift+Q | Shift+Q | shift+q | | +| Ctrl+Alt+KeyQ | / | Ctrl+Alt+Q | Ctrl+Alt+Q | ctrl+alt+q | | +| Ctrl+Shift+Alt+KeyQ | --- | Ctrl+Shift+Alt+Q | Ctrl+Shift+Alt+Q | ctrl+shift+alt+q | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyR | r | R | R | r | | +| Shift+KeyR | R | Shift+R | Shift+R | shift+r | | +| Ctrl+Alt+KeyR | --- | Ctrl+Alt+R | Ctrl+Alt+R | ctrl+alt+r | | +| Ctrl+Shift+Alt+KeyR | --- | Ctrl+Shift+Alt+R | Ctrl+Shift+Alt+R | ctrl+shift+alt+r | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyS | s | S | S | s | | +| Shift+KeyS | S | Shift+S | Shift+S | shift+s | | +| Ctrl+Alt+KeyS | --- | Ctrl+Alt+S | Ctrl+Alt+S | ctrl+alt+s | | +| Ctrl+Shift+Alt+KeyS | --- | Ctrl+Shift+Alt+S | Ctrl+Shift+Alt+S | ctrl+shift+alt+s | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyT | t | T | T | t | | +| Shift+KeyT | T | Shift+T | Shift+T | shift+t | | +| Ctrl+Alt+KeyT | --- | Ctrl+Alt+T | Ctrl+Alt+T | ctrl+alt+t | | +| Ctrl+Shift+Alt+KeyT | --- | Ctrl+Shift+Alt+T | Ctrl+Shift+Alt+T | ctrl+shift+alt+t | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyU | u | U | U | u | | +| Shift+KeyU | U | Shift+U | Shift+U | shift+u | | +| Ctrl+Alt+KeyU | --- | Ctrl+Alt+U | Ctrl+Alt+U | ctrl+alt+u | | +| Ctrl+Shift+Alt+KeyU | --- | Ctrl+Shift+Alt+U | Ctrl+Shift+Alt+U | ctrl+shift+alt+u | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyV | v | V | V | v | | +| Shift+KeyV | V | Shift+V | Shift+V | shift+v | | +| Ctrl+Alt+KeyV | --- | Ctrl+Alt+V | Ctrl+Alt+V | ctrl+alt+v | | +| Ctrl+Shift+Alt+KeyV | --- | Ctrl+Shift+Alt+V | Ctrl+Shift+Alt+V | ctrl+shift+alt+v | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyW | w | W | W | w | | +| Shift+KeyW | W | Shift+W | Shift+W | shift+w | | +| Ctrl+Alt+KeyW | ? | Ctrl+Alt+W | Ctrl+Alt+W | ctrl+alt+w | | +| Ctrl+Shift+Alt+KeyW | --- | Ctrl+Shift+Alt+W | Ctrl+Shift+Alt+W | ctrl+shift+alt+w | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyX | x | X | X | x | | +| Shift+KeyX | X | Shift+X | Shift+X | shift+x | | +| Ctrl+Alt+KeyX | --- | Ctrl+Alt+X | Ctrl+Alt+X | ctrl+alt+x | | +| Ctrl+Shift+Alt+KeyX | --- | Ctrl+Shift+Alt+X | Ctrl+Shift+Alt+X | ctrl+shift+alt+x | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyY | y | Y | Y | y | | +| Shift+KeyY | Y | Shift+Y | Shift+Y | shift+y | | +| Ctrl+Alt+KeyY | --- | Ctrl+Alt+Y | Ctrl+Alt+Y | ctrl+alt+y | | +| Ctrl+Shift+Alt+KeyY | --- | Ctrl+Shift+Alt+Y | Ctrl+Shift+Alt+Y | ctrl+shift+alt+y | | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyZ | z | Z | Z | z | | +| Shift+KeyZ | Z | Shift+Z | Shift+Z | shift+z | | +| Ctrl+Alt+KeyZ | --- | Ctrl+Alt+Z | Ctrl+Alt+Z | ctrl+alt+z | | +| Ctrl+Shift+Alt+KeyZ | --- | Ctrl+Shift+Alt+Z | Ctrl+Shift+Alt+Z | ctrl+shift+alt+z | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit1 | 1 | 1 | 1 | 1 | | +| Shift+Digit1 | ! | Shift+1 | Shift+1 | shift+1 | | +| Ctrl+Alt+Digit1 | ¹ | Ctrl+Alt+1 | Ctrl+Alt+1 | ctrl+alt+1 | | +| Ctrl+Shift+Alt+Digit1 | --- | Ctrl+Shift+Alt+1 | Ctrl+Shift+Alt+1 | ctrl+shift+alt+1 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit2 | 2 | 2 | 2 | 2 | | +| Shift+Digit2 | @ | Shift+2 | Shift+2 | shift+2 | | +| Ctrl+Alt+Digit2 | ² | Ctrl+Alt+2 | Ctrl+Alt+2 | ctrl+alt+2 | | +| Ctrl+Shift+Alt+Digit2 | --- | Ctrl+Shift+Alt+2 | Ctrl+Shift+Alt+2 | ctrl+shift+alt+2 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit3 | 3 | 3 | 3 | 3 | | +| Shift+Digit3 | # | Shift+3 | Shift+3 | shift+3 | | +| Ctrl+Alt+Digit3 | ³ | Ctrl+Alt+3 | Ctrl+Alt+3 | ctrl+alt+3 | | +| Ctrl+Shift+Alt+Digit3 | --- | Ctrl+Shift+Alt+3 | Ctrl+Shift+Alt+3 | ctrl+shift+alt+3 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit4 | 4 | 4 | 4 | 4 | | +| Shift+Digit4 | $ | Shift+4 | Shift+4 | shift+4 | | +| Ctrl+Alt+Digit4 | £ | Ctrl+Alt+4 | Ctrl+Alt+4 | ctrl+alt+4 | | +| Ctrl+Shift+Alt+Digit4 | --- | Ctrl+Shift+Alt+4 | Ctrl+Shift+Alt+4 | ctrl+shift+alt+4 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit5 | 5 | 5 | 5 | 5 | | +| Shift+Digit5 | % | Shift+5 | Shift+5 | shift+5 | | +| Ctrl+Alt+Digit5 | ¢ | Ctrl+Alt+5 | Ctrl+Alt+5 | ctrl+alt+5 | | +| Ctrl+Shift+Alt+Digit5 | --- | Ctrl+Shift+Alt+5 | Ctrl+Shift+Alt+5 | ctrl+shift+alt+5 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit6 | 6 | 6 | 6 | 6 | | +| Shift+Digit6 | ¨ | Shift+6 | Shift+6 | shift+6 | | +| Ctrl+Alt+Digit6 | ¬ | Ctrl+Alt+6 | Ctrl+Alt+6 | ctrl+alt+6 | | +| Ctrl+Shift+Alt+Digit6 | --- | Ctrl+Shift+Alt+6 | Ctrl+Shift+Alt+6 | ctrl+shift+alt+6 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit7 | 7 | 7 | 7 | 7 | | +| Shift+Digit7 | & | Shift+7 | Shift+7 | shift+7 | | +| Ctrl+Alt+Digit7 | --- | Ctrl+Alt+7 | Ctrl+Alt+7 | ctrl+alt+7 | | +| Ctrl+Shift+Alt+Digit7 | --- | Ctrl+Shift+Alt+7 | Ctrl+Shift+Alt+7 | ctrl+shift+alt+7 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit8 | 8 | 8 | 8 | 8 | | +| Shift+Digit8 | * | Shift+8 | Shift+8 | shift+8 | | +| Ctrl+Alt+Digit8 | --- | Ctrl+Alt+8 | Ctrl+Alt+8 | ctrl+alt+8 | | +| Ctrl+Shift+Alt+Digit8 | --- | Ctrl+Shift+Alt+8 | Ctrl+Shift+Alt+8 | ctrl+shift+alt+8 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit9 | 9 | 9 | 9 | 9 | | +| Shift+Digit9 | ( | Shift+9 | Shift+9 | shift+9 | | +| Ctrl+Alt+Digit9 | --- | Ctrl+Alt+9 | Ctrl+Alt+9 | ctrl+alt+9 | | +| Ctrl+Shift+Alt+Digit9 | --- | Ctrl+Shift+Alt+9 | Ctrl+Shift+Alt+9 | ctrl+shift+alt+9 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit0 | 0 | 0 | 0 | 0 | | +| Shift+Digit0 | ) | Shift+0 | Shift+0 | shift+0 | | +| Ctrl+Alt+Digit0 | --- | Ctrl+Alt+0 | Ctrl+Alt+0 | ctrl+alt+0 | | +| Ctrl+Shift+Alt+Digit0 | --- | Ctrl+Shift+Alt+0 | Ctrl+Shift+Alt+0 | ctrl+shift+alt+0 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| Minus | - | - | - | oem_minus | NO | +| Shift+Minus | _ | Shift+- | Shift+- | shift+oem_minus | NO | +| Ctrl+Alt+Minus | --- | Ctrl+Alt+- | Ctrl+Alt+- | ctrl+alt+oem_minus | NO | +| Ctrl+Shift+Alt+Minus | --- | Ctrl+Shift+Alt+- | Ctrl+Shift+Alt+- | ctrl+shift+alt+oem_minus | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Equal | = | = | = | oem_plus | NO | +| Shift+Equal | + | Shift+= | Shift+= | shift+oem_plus | NO | +| Ctrl+Alt+Equal | § | Ctrl+Alt+= | Ctrl+Alt+= | ctrl+alt+oem_plus | NO | +| Ctrl+Shift+Alt+Equal | --- | Ctrl+Shift+Alt+= | Ctrl+Shift+Alt+= | ctrl+shift+alt+oem_plus | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| BracketLeft | ´ | [ | ´ | oem_4 | NO | +| Shift+BracketLeft | ` | Shift+[ | Shift+´ | shift+oem_4 | NO | +| Ctrl+Alt+BracketLeft | --- | Ctrl+Alt+[ | Ctrl+Alt+´ | ctrl+alt+oem_4 | NO | +| Ctrl+Shift+Alt+BracketLeft | --- | Ctrl+Shift+Alt+[ | Ctrl+Shift+Alt+´ | ctrl+shift+alt+oem_4 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| BracketRight | [ | ] | [ | oem_6 | NO | +| Shift+BracketRight | { | Shift+] | Shift+[ | shift+oem_6 | NO | +| Ctrl+Alt+BracketRight | ª | Ctrl+Alt+] | Ctrl+Alt+[ | ctrl+alt+oem_6 | NO | +| Ctrl+Shift+Alt+BracketRight | --- | Ctrl+Shift+Alt+] | Ctrl+Shift+Alt+[ | ctrl+shift+alt+oem_6 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Backslash | ] | \ | ] | oem_5 | NO | +| Shift+Backslash | } | Shift+\ | Shift+] | shift+oem_5 | NO | +| Ctrl+Alt+Backslash | º | Ctrl+Alt+\ | Ctrl+Alt+] | ctrl+alt+oem_5 | NO | +| Ctrl+Shift+Alt+Backslash | --- | Ctrl+Shift+Alt+\ | Ctrl+Shift+Alt+] | ctrl+shift+alt+oem_5 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| IntlHash | --- | null | null | null | NO | +| Shift+IntlHash | --- | null | null | null | NO | +| Ctrl+Alt+IntlHash | --- | null | null | null | NO | +| Ctrl+Shift+Alt+IntlHash | --- | null | null | null | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| Semicolon | ç | ; | ç | oem_1 | NO | +| Shift+Semicolon | Ç | Shift+; | Shift+ç | shift+oem_1 | NO | +| Ctrl+Alt+Semicolon | --- | Ctrl+Alt+; | Ctrl+Alt+ç | ctrl+alt+oem_1 | NO | +| Ctrl+Shift+Alt+Semicolon | --- | Ctrl+Shift+Alt+; | Ctrl+Shift+Alt+ç | ctrl+shift+alt+oem_1 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Quote | ~ | ' | ~ | oem_7 | NO | +| Shift+Quote | ^ | Shift+' | Shift+~ | shift+oem_7 | NO | +| Ctrl+Alt+Quote | --- | Ctrl+Alt+' | Ctrl+Alt+~ | ctrl+alt+oem_7 | NO | +| Ctrl+Shift+Alt+Quote | --- | Ctrl+Shift+Alt+' | Ctrl+Shift+Alt+~ | ctrl+shift+alt+oem_7 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Backquote | ' | ` | ' | oem_3 | NO | +| Shift+Backquote | " | Shift+` | Shift+' | shift+oem_3 | NO | +| Ctrl+Alt+Backquote | --- | Ctrl+Alt+` | Ctrl+Alt+' | ctrl+alt+oem_3 | NO | +| Ctrl+Shift+Alt+Backquote | --- | Ctrl+Shift+Alt+` | Ctrl+Shift+Alt+' | ctrl+shift+alt+oem_3 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Comma | , | , | , | oem_comma | NO | +| Shift+Comma | < | Shift+, | Shift+, | shift+oem_comma | NO | +| Ctrl+Alt+Comma | --- | Ctrl+Alt+, | Ctrl+Alt+, | ctrl+alt+oem_comma | NO | +| Ctrl+Shift+Alt+Comma | --- | Ctrl+Shift+Alt+, | Ctrl+Shift+Alt+, | ctrl+shift+alt+oem_comma | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Period | . | . | . | oem_period | NO | +| Shift+Period | > | Shift+. | Shift+. | shift+oem_period | NO | +| Ctrl+Alt+Period | --- | Ctrl+Alt+. | Ctrl+Alt+. | ctrl+alt+oem_period | NO | +| Ctrl+Shift+Alt+Period | --- | Ctrl+Shift+Alt+. | Ctrl+Shift+Alt+. | ctrl+shift+alt+oem_period | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Slash | ; | / | ; | oem_2 | NO | +| Shift+Slash | : | Shift+/ | Shift+; | shift+oem_2 | NO | +| Ctrl+Alt+Slash | --- | Ctrl+Alt+/ | Ctrl+Alt+; | ctrl+alt+oem_2 | NO | +| Ctrl+Shift+Alt+Slash | --- | Ctrl+Shift+Alt+/ | Ctrl+Shift+Alt+; | ctrl+shift+alt+oem_2 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| ArrowUp | --- | UpArrow | UpArrow | up | | +| Shift+ArrowUp | --- | Shift+UpArrow | Shift+UpArrow | shift+up | | +| Ctrl+Alt+ArrowUp | --- | Ctrl+Alt+UpArrow | Ctrl+Alt+UpArrow | ctrl+alt+up | | +| Ctrl+Shift+Alt+ArrowUp | --- | Ctrl+Shift+Alt+UpArrow | Ctrl+Shift+Alt+UpArrow | ctrl+shift+alt+up | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Numpad0 | --- | NumPad0 | NumPad0 | numpad0 | | +| Shift+Numpad0 | --- | Shift+NumPad0 | Shift+NumPad0 | shift+numpad0 | | +| Ctrl+Alt+Numpad0 | --- | Ctrl+Alt+NumPad0 | Ctrl+Alt+NumPad0 | ctrl+alt+numpad0 | | +| Ctrl+Shift+Alt+Numpad0 | --- | Ctrl+Shift+Alt+NumPad0 | Ctrl+Shift+Alt+NumPad0 | ctrl+shift+alt+numpad0 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| IntlBackslash | \ | OEM_102 | \ | oem_102 | NO | +| Shift+IntlBackslash | | | Shift+OEM_102 | Shift+\ | shift+oem_102 | NO | +| Ctrl+Alt+IntlBackslash | --- | Ctrl+Alt+OEM_102 | Ctrl+Alt+\ | ctrl+alt+oem_102 | NO | +| Ctrl+Shift+Alt+IntlBackslash | --- | Ctrl+Shift+Alt+OEM_102 | Ctrl+Shift+Alt+\ | ctrl+shift+alt+oem_102 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| IntlRo | / | ABNT_C1 | / | abnt_c1 | NO | +| Shift+IntlRo | ? | Shift+ABNT_C1 | Shift+/ | shift+abnt_c1 | NO | +| Ctrl+Alt+IntlRo | ° | Ctrl+Alt+ABNT_C1 | Ctrl+Alt+/ | ctrl+alt+abnt_c1 | NO | +| Ctrl+Shift+Alt+IntlRo | --- | Ctrl+Shift+Alt+ABNT_C1 | Ctrl+Shift+Alt+/ | ctrl+shift+alt+abnt_c1 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| IntlYen | --- | null | null | null | NO | +| Shift+IntlYen | --- | null | null | null | NO | +| Ctrl+Alt+IntlYen | --- | null | null | null | NO | +| Ctrl+Shift+Alt+IntlYen | --- | null | null | null | NO | +----------------------------------------------------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/src/vs/workbench/services/keybinding/test/win_ru.txt b/src/vs/workbench/services/keybinding/test/win_ru.txt index d3872618cd9..5ea3c8575df 100644 --- a/src/vs/workbench/services/keybinding/test/win_ru.txt +++ b/src/vs/workbench/services/keybinding/test/win_ru.txt @@ -1,284 +1,284 @@ ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyA | ф | A | ф | NO | -| Shift+KeyA | Ф | Shift+A | Shift+ф | NO | -| Ctrl+Alt+KeyA | --- | Ctrl+Alt+A | Ctrl+Alt+ф | NO | -| Ctrl+Shift+Alt+KeyA | --- | Ctrl+Shift+Alt+A | Ctrl+Shift+Alt+ф | NO | ------------------------------------------------------------------------------------------------------------- -| KeyB | и | B | и | NO | -| Shift+KeyB | И | Shift+B | Shift+и | NO | -| Ctrl+Alt+KeyB | --- | Ctrl+Alt+B | Ctrl+Alt+и | NO | -| Ctrl+Shift+Alt+KeyB | --- | Ctrl+Shift+Alt+B | Ctrl+Shift+Alt+и | NO | ------------------------------------------------------------------------------------------------------------- -| KeyC | с | C | с | NO | -| Shift+KeyC | С | Shift+C | Shift+с | NO | -| Ctrl+Alt+KeyC | --- | Ctrl+Alt+C | Ctrl+Alt+с | NO | -| Ctrl+Shift+Alt+KeyC | --- | Ctrl+Shift+Alt+C | Ctrl+Shift+Alt+с | NO | ------------------------------------------------------------------------------------------------------------- -| KeyD | в | D | в | NO | -| Shift+KeyD | В | Shift+D | Shift+в | NO | -| Ctrl+Alt+KeyD | --- | Ctrl+Alt+D | Ctrl+Alt+в | NO | -| Ctrl+Shift+Alt+KeyD | --- | Ctrl+Shift+Alt+D | Ctrl+Shift+Alt+в | NO | ------------------------------------------------------------------------------------------------------------- -| KeyE | у | E | у | NO | -| Shift+KeyE | У | Shift+E | Shift+у | NO | -| Ctrl+Alt+KeyE | --- | Ctrl+Alt+E | Ctrl+Alt+у | NO | -| Ctrl+Shift+Alt+KeyE | --- | Ctrl+Shift+Alt+E | Ctrl+Shift+Alt+у | NO | ------------------------------------------------------------------------------------------------------------- -| KeyF | а | F | а | NO | -| Shift+KeyF | А | Shift+F | Shift+а | NO | -| Ctrl+Alt+KeyF | --- | Ctrl+Alt+F | Ctrl+Alt+а | NO | -| Ctrl+Shift+Alt+KeyF | --- | Ctrl+Shift+Alt+F | Ctrl+Shift+Alt+а | NO | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyG | п | G | п | NO | -| Shift+KeyG | П | Shift+G | Shift+п | NO | -| Ctrl+Alt+KeyG | --- | Ctrl+Alt+G | Ctrl+Alt+п | NO | -| Ctrl+Shift+Alt+KeyG | --- | Ctrl+Shift+Alt+G | Ctrl+Shift+Alt+п | NO | ------------------------------------------------------------------------------------------------------------- -| KeyH | р | H | р | NO | -| Shift+KeyH | Р | Shift+H | Shift+р | NO | -| Ctrl+Alt+KeyH | --- | Ctrl+Alt+H | Ctrl+Alt+р | NO | -| Ctrl+Shift+Alt+KeyH | --- | Ctrl+Shift+Alt+H | Ctrl+Shift+Alt+р | NO | ------------------------------------------------------------------------------------------------------------- -| KeyI | ш | I | ш | NO | -| Shift+KeyI | Ш | Shift+I | Shift+ш | NO | -| Ctrl+Alt+KeyI | --- | Ctrl+Alt+I | Ctrl+Alt+ш | NO | -| Ctrl+Shift+Alt+KeyI | --- | Ctrl+Shift+Alt+I | Ctrl+Shift+Alt+ш | NO | ------------------------------------------------------------------------------------------------------------- -| KeyJ | о | J | о | NO | -| Shift+KeyJ | О | Shift+J | Shift+о | NO | -| Ctrl+Alt+KeyJ | --- | Ctrl+Alt+J | Ctrl+Alt+о | NO | -| Ctrl+Shift+Alt+KeyJ | --- | Ctrl+Shift+Alt+J | Ctrl+Shift+Alt+о | NO | ------------------------------------------------------------------------------------------------------------- -| KeyK | л | K | л | NO | -| Shift+KeyK | Л | Shift+K | Shift+л | NO | -| Ctrl+Alt+KeyK | --- | Ctrl+Alt+K | Ctrl+Alt+л | NO | -| Ctrl+Shift+Alt+KeyK | --- | Ctrl+Shift+Alt+K | Ctrl+Shift+Alt+л | NO | ------------------------------------------------------------------------------------------------------------- -| KeyL | д | L | д | NO | -| Shift+KeyL | Д | Shift+L | Shift+д | NO | -| Ctrl+Alt+KeyL | --- | Ctrl+Alt+L | Ctrl+Alt+д | NO | -| Ctrl+Shift+Alt+KeyL | --- | Ctrl+Shift+Alt+L | Ctrl+Shift+Alt+д | NO | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyM | ь | M | ь | NO | -| Shift+KeyM | Ь | Shift+M | Shift+ь | NO | -| Ctrl+Alt+KeyM | --- | Ctrl+Alt+M | Ctrl+Alt+ь | NO | -| Ctrl+Shift+Alt+KeyM | --- | Ctrl+Shift+Alt+M | Ctrl+Shift+Alt+ь | NO | ------------------------------------------------------------------------------------------------------------- -| KeyN | т | N | т | NO | -| Shift+KeyN | Т | Shift+N | Shift+т | NO | -| Ctrl+Alt+KeyN | --- | Ctrl+Alt+N | Ctrl+Alt+т | NO | -| Ctrl+Shift+Alt+KeyN | --- | Ctrl+Shift+Alt+N | Ctrl+Shift+Alt+т | NO | ------------------------------------------------------------------------------------------------------------- -| KeyO | щ | O | щ | NO | -| Shift+KeyO | Щ | Shift+O | Shift+щ | NO | -| Ctrl+Alt+KeyO | --- | Ctrl+Alt+O | Ctrl+Alt+щ | NO | -| Ctrl+Shift+Alt+KeyO | --- | Ctrl+Shift+Alt+O | Ctrl+Shift+Alt+щ | NO | ------------------------------------------------------------------------------------------------------------- -| KeyP | з | P | з | NO | -| Shift+KeyP | З | Shift+P | Shift+з | NO | -| Ctrl+Alt+KeyP | --- | Ctrl+Alt+P | Ctrl+Alt+з | NO | -| Ctrl+Shift+Alt+KeyP | --- | Ctrl+Shift+Alt+P | Ctrl+Shift+Alt+з | NO | ------------------------------------------------------------------------------------------------------------- -| KeyQ | й | Q | й | NO | -| Shift+KeyQ | Й | Shift+Q | Shift+й | NO | -| Ctrl+Alt+KeyQ | --- | Ctrl+Alt+Q | Ctrl+Alt+й | NO | -| Ctrl+Shift+Alt+KeyQ | --- | Ctrl+Shift+Alt+Q | Ctrl+Shift+Alt+й | NO | ------------------------------------------------------------------------------------------------------------- -| KeyR | к | R | к | NO | -| Shift+KeyR | К | Shift+R | Shift+к | NO | -| Ctrl+Alt+KeyR | --- | Ctrl+Alt+R | Ctrl+Alt+к | NO | -| Ctrl+Shift+Alt+KeyR | --- | Ctrl+Shift+Alt+R | Ctrl+Shift+Alt+к | NO | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyS | ы | S | ы | NO | -| Shift+KeyS | Ы | Shift+S | Shift+ы | NO | -| Ctrl+Alt+KeyS | --- | Ctrl+Alt+S | Ctrl+Alt+ы | NO | -| Ctrl+Shift+Alt+KeyS | --- | Ctrl+Shift+Alt+S | Ctrl+Shift+Alt+ы | NO | ------------------------------------------------------------------------------------------------------------- -| KeyT | е | T | е | NO | -| Shift+KeyT | Е | Shift+T | Shift+е | NO | -| Ctrl+Alt+KeyT | --- | Ctrl+Alt+T | Ctrl+Alt+е | NO | -| Ctrl+Shift+Alt+KeyT | --- | Ctrl+Shift+Alt+T | Ctrl+Shift+Alt+е | NO | ------------------------------------------------------------------------------------------------------------- -| KeyU | г | U | г | NO | -| Shift+KeyU | Г | Shift+U | Shift+г | NO | -| Ctrl+Alt+KeyU | --- | Ctrl+Alt+U | Ctrl+Alt+г | NO | -| Ctrl+Shift+Alt+KeyU | --- | Ctrl+Shift+Alt+U | Ctrl+Shift+Alt+г | NO | ------------------------------------------------------------------------------------------------------------- -| KeyV | м | V | м | NO | -| Shift+KeyV | М | Shift+V | Shift+м | NO | -| Ctrl+Alt+KeyV | --- | Ctrl+Alt+V | Ctrl+Alt+м | NO | -| Ctrl+Shift+Alt+KeyV | --- | Ctrl+Shift+Alt+V | Ctrl+Shift+Alt+м | NO | ------------------------------------------------------------------------------------------------------------- -| KeyW | ц | W | ц | NO | -| Shift+KeyW | Ц | Shift+W | Shift+ц | NO | -| Ctrl+Alt+KeyW | --- | Ctrl+Alt+W | Ctrl+Alt+ц | NO | -| Ctrl+Shift+Alt+KeyW | --- | Ctrl+Shift+Alt+W | Ctrl+Shift+Alt+ц | NO | ------------------------------------------------------------------------------------------------------------- -| KeyX | ч | X | ч | NO | -| Shift+KeyX | Ч | Shift+X | Shift+ч | NO | -| Ctrl+Alt+KeyX | --- | Ctrl+Alt+X | Ctrl+Alt+ч | NO | -| Ctrl+Shift+Alt+KeyX | --- | Ctrl+Shift+Alt+X | Ctrl+Shift+Alt+ч | NO | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| KeyY | н | Y | н | NO | -| Shift+KeyY | Н | Shift+Y | Shift+н | NO | -| Ctrl+Alt+KeyY | --- | Ctrl+Alt+Y | Ctrl+Alt+н | NO | -| Ctrl+Shift+Alt+KeyY | --- | Ctrl+Shift+Alt+Y | Ctrl+Shift+Alt+н | NO | ------------------------------------------------------------------------------------------------------------- -| KeyZ | я | Z | я | NO | -| Shift+KeyZ | Я | Shift+Z | Shift+я | NO | -| Ctrl+Alt+KeyZ | --- | Ctrl+Alt+Z | Ctrl+Alt+я | NO | -| Ctrl+Shift+Alt+KeyZ | --- | Ctrl+Shift+Alt+Z | Ctrl+Shift+Alt+я | NO | ------------------------------------------------------------------------------------------------------------- -| Digit1 | 1 | 1 | 1 | | -| Shift+Digit1 | ! | Shift+1 | Shift+1 | | -| Ctrl+Alt+Digit1 | --- | Ctrl+Alt+1 | Ctrl+Alt+1 | | -| Ctrl+Shift+Alt+Digit1 | --- | Ctrl+Shift+Alt+1 | Ctrl+Shift+Alt+1 | | ------------------------------------------------------------------------------------------------------------- -| Digit2 | 2 | 2 | 2 | | -| Shift+Digit2 | " | Shift+2 | Shift+2 | | -| Ctrl+Alt+Digit2 | --- | Ctrl+Alt+2 | Ctrl+Alt+2 | | -| Ctrl+Shift+Alt+Digit2 | --- | Ctrl+Shift+Alt+2 | Ctrl+Shift+Alt+2 | | ------------------------------------------------------------------------------------------------------------- -| Digit3 | 3 | 3 | 3 | | -| Shift+Digit3 | № | Shift+3 | Shift+3 | | -| Ctrl+Alt+Digit3 | --- | Ctrl+Alt+3 | Ctrl+Alt+3 | | -| Ctrl+Shift+Alt+Digit3 | --- | Ctrl+Shift+Alt+3 | Ctrl+Shift+Alt+3 | | ------------------------------------------------------------------------------------------------------------- -| Digit4 | 4 | 4 | 4 | | -| Shift+Digit4 | ; | Shift+4 | Shift+4 | | -| Ctrl+Alt+Digit4 | --- | Ctrl+Alt+4 | Ctrl+Alt+4 | | -| Ctrl+Shift+Alt+Digit4 | --- | Ctrl+Shift+Alt+4 | Ctrl+Shift+Alt+4 | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| Digit5 | 5 | 5 | 5 | | -| Shift+Digit5 | % | Shift+5 | Shift+5 | | -| Ctrl+Alt+Digit5 | --- | Ctrl+Alt+5 | Ctrl+Alt+5 | | -| Ctrl+Shift+Alt+Digit5 | --- | Ctrl+Shift+Alt+5 | Ctrl+Shift+Alt+5 | | ------------------------------------------------------------------------------------------------------------- -| Digit6 | 6 | 6 | 6 | | -| Shift+Digit6 | : | Shift+6 | Shift+6 | | -| Ctrl+Alt+Digit6 | --- | Ctrl+Alt+6 | Ctrl+Alt+6 | | -| Ctrl+Shift+Alt+Digit6 | --- | Ctrl+Shift+Alt+6 | Ctrl+Shift+Alt+6 | | ------------------------------------------------------------------------------------------------------------- -| Digit7 | 7 | 7 | 7 | | -| Shift+Digit7 | ? | Shift+7 | Shift+7 | | -| Ctrl+Alt+Digit7 | --- | Ctrl+Alt+7 | Ctrl+Alt+7 | | -| Ctrl+Shift+Alt+Digit7 | --- | Ctrl+Shift+Alt+7 | Ctrl+Shift+Alt+7 | | ------------------------------------------------------------------------------------------------------------- -| Digit8 | 8 | 8 | 8 | | -| Shift+Digit8 | * | Shift+8 | Shift+8 | | -| Ctrl+Alt+Digit8 | ₽ | Ctrl+Alt+8 | Ctrl+Alt+8 | | -| Ctrl+Shift+Alt+Digit8 | --- | Ctrl+Shift+Alt+8 | Ctrl+Shift+Alt+8 | | ------------------------------------------------------------------------------------------------------------- -| Digit9 | 9 | 9 | 9 | | -| Shift+Digit9 | ( | Shift+9 | Shift+9 | | -| Ctrl+Alt+Digit9 | --- | Ctrl+Alt+9 | Ctrl+Alt+9 | | -| Ctrl+Shift+Alt+Digit9 | --- | Ctrl+Shift+Alt+9 | Ctrl+Shift+Alt+9 | | ------------------------------------------------------------------------------------------------------------- -| Digit0 | 0 | 0 | 0 | | -| Shift+Digit0 | ) | Shift+0 | Shift+0 | | -| Ctrl+Alt+Digit0 | --- | Ctrl+Alt+0 | Ctrl+Alt+0 | | -| Ctrl+Shift+Alt+Digit0 | --- | Ctrl+Shift+Alt+0 | Ctrl+Shift+Alt+0 | | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| Minus | - | - | - | NO | -| Shift+Minus | _ | Shift+- | Shift+- | NO | -| Ctrl+Alt+Minus | --- | Ctrl+Alt+- | Ctrl+Alt+- | NO | -| Ctrl+Shift+Alt+Minus | --- | Ctrl+Shift+Alt+- | Ctrl+Shift+Alt+- | NO | ------------------------------------------------------------------------------------------------------------- -| Equal | = | = | = | NO | -| Shift+Equal | + | Shift+= | Shift+= | NO | -| Ctrl+Alt+Equal | --- | Ctrl+Alt+= | Ctrl+Alt+= | NO | -| Ctrl+Shift+Alt+Equal | --- | Ctrl+Shift+Alt+= | Ctrl+Shift+Alt+= | NO | ------------------------------------------------------------------------------------------------------------- -| BracketLeft | х | [ | х | NO | -| Shift+BracketLeft | Х | Shift+[ | Shift+х | NO | -| Ctrl+Alt+BracketLeft | --- | Ctrl+Alt+[ | Ctrl+Alt+х | NO | -| Ctrl+Shift+Alt+BracketLeft | --- | Ctrl+Shift+Alt+[ | Ctrl+Shift+Alt+х | NO | ------------------------------------------------------------------------------------------------------------- -| BracketRight | ъ | ] | ъ | NO | -| Shift+BracketRight | Ъ | Shift+] | Shift+ъ | NO | -| Ctrl+Alt+BracketRight | --- | Ctrl+Alt+] | Ctrl+Alt+ъ | NO | -| Ctrl+Shift+Alt+BracketRight | --- | Ctrl+Shift+Alt+] | Ctrl+Shift+Alt+ъ | NO | ------------------------------------------------------------------------------------------------------------- -| Backslash | \ | \ | \ | NO | -| Shift+Backslash | / | Shift+\ | Shift+\ | NO | -| Ctrl+Alt+Backslash | --- | Ctrl+Alt+\ | Ctrl+Alt+\ | NO | -| Ctrl+Shift+Alt+Backslash | --- | Ctrl+Shift+Alt+\ | Ctrl+Shift+Alt+\ | NO | ------------------------------------------------------------------------------------------------------------- -| IntlHash | --- | null | null | NO | -| Shift+IntlHash | --- | null | null | NO | -| Ctrl+Alt+IntlHash | --- | null | null | NO | -| Ctrl+Shift+Alt+IntlHash | --- | null | null | NO | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| Semicolon | ж | ; | ж | NO | -| Shift+Semicolon | Ж | Shift+; | Shift+ж | NO | -| Ctrl+Alt+Semicolon | --- | Ctrl+Alt+; | Ctrl+Alt+ж | NO | -| Ctrl+Shift+Alt+Semicolon | --- | Ctrl+Shift+Alt+; | Ctrl+Shift+Alt+ж | NO | ------------------------------------------------------------------------------------------------------------- -| Quote | э | ' | э | NO | -| Shift+Quote | Э | Shift+' | Shift+э | NO | -| Ctrl+Alt+Quote | --- | Ctrl+Alt+' | Ctrl+Alt+э | NO | -| Ctrl+Shift+Alt+Quote | --- | Ctrl+Shift+Alt+' | Ctrl+Shift+Alt+э | NO | ------------------------------------------------------------------------------------------------------------- -| Backquote | ё | ` | ё | NO | -| Shift+Backquote | Ё | Shift+` | Shift+ё | NO | -| Ctrl+Alt+Backquote | --- | Ctrl+Alt+` | Ctrl+Alt+ё | NO | -| Ctrl+Shift+Alt+Backquote | --- | Ctrl+Shift+Alt+` | Ctrl+Shift+Alt+ё | NO | ------------------------------------------------------------------------------------------------------------- -| Comma | б | , | б | NO | -| Shift+Comma | Б | Shift+, | Shift+б | NO | -| Ctrl+Alt+Comma | --- | Ctrl+Alt+, | Ctrl+Alt+б | NO | -| Ctrl+Shift+Alt+Comma | --- | Ctrl+Shift+Alt+, | Ctrl+Shift+Alt+б | NO | ------------------------------------------------------------------------------------------------------------- -| Period | ю | . | ю | NO | -| Shift+Period | Ю | Shift+. | Shift+ю | NO | -| Ctrl+Alt+Period | --- | Ctrl+Alt+. | Ctrl+Alt+ю | NO | -| Ctrl+Shift+Alt+Period | --- | Ctrl+Shift+Alt+. | Ctrl+Shift+Alt+ю | NO | ------------------------------------------------------------------------------------------------------------- -| Slash | . | / | . | NO | -| Shift+Slash | , | Shift+/ | Shift+. | NO | -| Ctrl+Alt+Slash | --- | Ctrl+Alt+/ | Ctrl+Alt+. | NO | -| Ctrl+Shift+Alt+Slash | --- | Ctrl+Shift+Alt+/ | Ctrl+Shift+Alt+. | NO | ------------------------------------------------------------------------------------------------------------- -| HW Code combination | Key | KeyCode combination | UI label | WYSIWYG | ------------------------------------------------------------------------------------------------------------- -| ArrowUp | --- | UpArrow | UpArrow | | -| Shift+ArrowUp | --- | Shift+UpArrow | Shift+UpArrow | | -| Ctrl+Alt+ArrowUp | --- | Ctrl+Alt+UpArrow | Ctrl+Alt+UpArrow | | -| Ctrl+Shift+Alt+ArrowUp | --- | Ctrl+Shift+Alt+UpArrow | Ctrl+Shift+Alt+UpArrow | | ------------------------------------------------------------------------------------------------------------- -| Numpad0 | --- | NumPad0 | NumPad0 | | -| Shift+Numpad0 | --- | Shift+NumPad0 | Shift+NumPad0 | | -| Ctrl+Alt+Numpad0 | --- | Ctrl+Alt+NumPad0 | Ctrl+Alt+NumPad0 | | -| Ctrl+Shift+Alt+Numpad0 | --- | Ctrl+Shift+Alt+NumPad0 | Ctrl+Shift+Alt+NumPad0 | | ------------------------------------------------------------------------------------------------------------- -| IntlBackslash | \ | OEM_102 | \ | NO | -| Shift+IntlBackslash | / | Shift+OEM_102 | Shift+\ | NO | -| Ctrl+Alt+IntlBackslash | --- | Ctrl+Alt+OEM_102 | Ctrl+Alt+\ | NO | -| Ctrl+Shift+Alt+IntlBackslash | --- | Ctrl+Shift+Alt+OEM_102 | Ctrl+Shift+Alt+\ | NO | ------------------------------------------------------------------------------------------------------------- -| IntlRo | --- | null | null | NO | -| Shift+IntlRo | --- | null | null | NO | -| Ctrl+Alt+IntlRo | --- | null | null | NO | -| Ctrl+Shift+Alt+IntlRo | --- | null | null | NO | ------------------------------------------------------------------------------------------------------------- -| IntlYen | --- | null | null | NO | -| Shift+IntlYen | --- | null | null | NO | -| Ctrl+Alt+IntlYen | --- | null | null | NO | -| Ctrl+Shift+Alt+IntlYen | --- | null | null | NO | ------------------------------------------------------------------------------------------------------------- \ No newline at end of file +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyA | ф | A | ф | a | NO | +| Shift+KeyA | Ф | Shift+A | Shift+ф | shift+a | NO | +| Ctrl+Alt+KeyA | --- | Ctrl+Alt+A | Ctrl+Alt+ф | ctrl+alt+a | NO | +| Ctrl+Shift+Alt+KeyA | --- | Ctrl+Shift+Alt+A | Ctrl+Shift+Alt+ф | ctrl+shift+alt+a | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyB | и | B | и | b | NO | +| Shift+KeyB | И | Shift+B | Shift+и | shift+b | NO | +| Ctrl+Alt+KeyB | --- | Ctrl+Alt+B | Ctrl+Alt+и | ctrl+alt+b | NO | +| Ctrl+Shift+Alt+KeyB | --- | Ctrl+Shift+Alt+B | Ctrl+Shift+Alt+и | ctrl+shift+alt+b | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyC | с | C | с | c | NO | +| Shift+KeyC | С | Shift+C | Shift+с | shift+c | NO | +| Ctrl+Alt+KeyC | --- | Ctrl+Alt+C | Ctrl+Alt+с | ctrl+alt+c | NO | +| Ctrl+Shift+Alt+KeyC | --- | Ctrl+Shift+Alt+C | Ctrl+Shift+Alt+с | ctrl+shift+alt+c | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyD | в | D | в | d | NO | +| Shift+KeyD | В | Shift+D | Shift+в | shift+d | NO | +| Ctrl+Alt+KeyD | --- | Ctrl+Alt+D | Ctrl+Alt+в | ctrl+alt+d | NO | +| Ctrl+Shift+Alt+KeyD | --- | Ctrl+Shift+Alt+D | Ctrl+Shift+Alt+в | ctrl+shift+alt+d | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyE | у | E | у | e | NO | +| Shift+KeyE | У | Shift+E | Shift+у | shift+e | NO | +| Ctrl+Alt+KeyE | --- | Ctrl+Alt+E | Ctrl+Alt+у | ctrl+alt+e | NO | +| Ctrl+Shift+Alt+KeyE | --- | Ctrl+Shift+Alt+E | Ctrl+Shift+Alt+у | ctrl+shift+alt+e | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyF | а | F | а | f | NO | +| Shift+KeyF | А | Shift+F | Shift+а | shift+f | NO | +| Ctrl+Alt+KeyF | --- | Ctrl+Alt+F | Ctrl+Alt+а | ctrl+alt+f | NO | +| Ctrl+Shift+Alt+KeyF | --- | Ctrl+Shift+Alt+F | Ctrl+Shift+Alt+а | ctrl+shift+alt+f | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyG | п | G | п | g | NO | +| Shift+KeyG | П | Shift+G | Shift+п | shift+g | NO | +| Ctrl+Alt+KeyG | --- | Ctrl+Alt+G | Ctrl+Alt+п | ctrl+alt+g | NO | +| Ctrl+Shift+Alt+KeyG | --- | Ctrl+Shift+Alt+G | Ctrl+Shift+Alt+п | ctrl+shift+alt+g | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyH | р | H | р | h | NO | +| Shift+KeyH | Р | Shift+H | Shift+р | shift+h | NO | +| Ctrl+Alt+KeyH | --- | Ctrl+Alt+H | Ctrl+Alt+р | ctrl+alt+h | NO | +| Ctrl+Shift+Alt+KeyH | --- | Ctrl+Shift+Alt+H | Ctrl+Shift+Alt+р | ctrl+shift+alt+h | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyI | ш | I | ш | i | NO | +| Shift+KeyI | Ш | Shift+I | Shift+ш | shift+i | NO | +| Ctrl+Alt+KeyI | --- | Ctrl+Alt+I | Ctrl+Alt+ш | ctrl+alt+i | NO | +| Ctrl+Shift+Alt+KeyI | --- | Ctrl+Shift+Alt+I | Ctrl+Shift+Alt+ш | ctrl+shift+alt+i | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyJ | о | J | о | j | NO | +| Shift+KeyJ | О | Shift+J | Shift+о | shift+j | NO | +| Ctrl+Alt+KeyJ | --- | Ctrl+Alt+J | Ctrl+Alt+о | ctrl+alt+j | NO | +| Ctrl+Shift+Alt+KeyJ | --- | Ctrl+Shift+Alt+J | Ctrl+Shift+Alt+о | ctrl+shift+alt+j | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyK | л | K | л | k | NO | +| Shift+KeyK | Л | Shift+K | Shift+л | shift+k | NO | +| Ctrl+Alt+KeyK | --- | Ctrl+Alt+K | Ctrl+Alt+л | ctrl+alt+k | NO | +| Ctrl+Shift+Alt+KeyK | --- | Ctrl+Shift+Alt+K | Ctrl+Shift+Alt+л | ctrl+shift+alt+k | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyL | д | L | д | l | NO | +| Shift+KeyL | Д | Shift+L | Shift+д | shift+l | NO | +| Ctrl+Alt+KeyL | --- | Ctrl+Alt+L | Ctrl+Alt+д | ctrl+alt+l | NO | +| Ctrl+Shift+Alt+KeyL | --- | Ctrl+Shift+Alt+L | Ctrl+Shift+Alt+д | ctrl+shift+alt+l | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyM | ь | M | ь | m | NO | +| Shift+KeyM | Ь | Shift+M | Shift+ь | shift+m | NO | +| Ctrl+Alt+KeyM | --- | Ctrl+Alt+M | Ctrl+Alt+ь | ctrl+alt+m | NO | +| Ctrl+Shift+Alt+KeyM | --- | Ctrl+Shift+Alt+M | Ctrl+Shift+Alt+ь | ctrl+shift+alt+m | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyN | т | N | т | n | NO | +| Shift+KeyN | Т | Shift+N | Shift+т | shift+n | NO | +| Ctrl+Alt+KeyN | --- | Ctrl+Alt+N | Ctrl+Alt+т | ctrl+alt+n | NO | +| Ctrl+Shift+Alt+KeyN | --- | Ctrl+Shift+Alt+N | Ctrl+Shift+Alt+т | ctrl+shift+alt+n | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyO | щ | O | щ | o | NO | +| Shift+KeyO | Щ | Shift+O | Shift+щ | shift+o | NO | +| Ctrl+Alt+KeyO | --- | Ctrl+Alt+O | Ctrl+Alt+щ | ctrl+alt+o | NO | +| Ctrl+Shift+Alt+KeyO | --- | Ctrl+Shift+Alt+O | Ctrl+Shift+Alt+щ | ctrl+shift+alt+o | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyP | з | P | з | p | NO | +| Shift+KeyP | З | Shift+P | Shift+з | shift+p | NO | +| Ctrl+Alt+KeyP | --- | Ctrl+Alt+P | Ctrl+Alt+з | ctrl+alt+p | NO | +| Ctrl+Shift+Alt+KeyP | --- | Ctrl+Shift+Alt+P | Ctrl+Shift+Alt+з | ctrl+shift+alt+p | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyQ | й | Q | й | q | NO | +| Shift+KeyQ | Й | Shift+Q | Shift+й | shift+q | NO | +| Ctrl+Alt+KeyQ | --- | Ctrl+Alt+Q | Ctrl+Alt+й | ctrl+alt+q | NO | +| Ctrl+Shift+Alt+KeyQ | --- | Ctrl+Shift+Alt+Q | Ctrl+Shift+Alt+й | ctrl+shift+alt+q | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyR | к | R | к | r | NO | +| Shift+KeyR | К | Shift+R | Shift+к | shift+r | NO | +| Ctrl+Alt+KeyR | --- | Ctrl+Alt+R | Ctrl+Alt+к | ctrl+alt+r | NO | +| Ctrl+Shift+Alt+KeyR | --- | Ctrl+Shift+Alt+R | Ctrl+Shift+Alt+к | ctrl+shift+alt+r | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyS | ы | S | ы | s | NO | +| Shift+KeyS | Ы | Shift+S | Shift+ы | shift+s | NO | +| Ctrl+Alt+KeyS | --- | Ctrl+Alt+S | Ctrl+Alt+ы | ctrl+alt+s | NO | +| Ctrl+Shift+Alt+KeyS | --- | Ctrl+Shift+Alt+S | Ctrl+Shift+Alt+ы | ctrl+shift+alt+s | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyT | е | T | е | t | NO | +| Shift+KeyT | Е | Shift+T | Shift+е | shift+t | NO | +| Ctrl+Alt+KeyT | --- | Ctrl+Alt+T | Ctrl+Alt+е | ctrl+alt+t | NO | +| Ctrl+Shift+Alt+KeyT | --- | Ctrl+Shift+Alt+T | Ctrl+Shift+Alt+е | ctrl+shift+alt+t | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyU | г | U | г | u | NO | +| Shift+KeyU | Г | Shift+U | Shift+г | shift+u | NO | +| Ctrl+Alt+KeyU | --- | Ctrl+Alt+U | Ctrl+Alt+г | ctrl+alt+u | NO | +| Ctrl+Shift+Alt+KeyU | --- | Ctrl+Shift+Alt+U | Ctrl+Shift+Alt+г | ctrl+shift+alt+u | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyV | м | V | м | v | NO | +| Shift+KeyV | М | Shift+V | Shift+м | shift+v | NO | +| Ctrl+Alt+KeyV | --- | Ctrl+Alt+V | Ctrl+Alt+м | ctrl+alt+v | NO | +| Ctrl+Shift+Alt+KeyV | --- | Ctrl+Shift+Alt+V | Ctrl+Shift+Alt+м | ctrl+shift+alt+v | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyW | ц | W | ц | w | NO | +| Shift+KeyW | Ц | Shift+W | Shift+ц | shift+w | NO | +| Ctrl+Alt+KeyW | --- | Ctrl+Alt+W | Ctrl+Alt+ц | ctrl+alt+w | NO | +| Ctrl+Shift+Alt+KeyW | --- | Ctrl+Shift+Alt+W | Ctrl+Shift+Alt+ц | ctrl+shift+alt+w | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyX | ч | X | ч | x | NO | +| Shift+KeyX | Ч | Shift+X | Shift+ч | shift+x | NO | +| Ctrl+Alt+KeyX | --- | Ctrl+Alt+X | Ctrl+Alt+ч | ctrl+alt+x | NO | +| Ctrl+Shift+Alt+KeyX | --- | Ctrl+Shift+Alt+X | Ctrl+Shift+Alt+ч | ctrl+shift+alt+x | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyY | н | Y | н | y | NO | +| Shift+KeyY | Н | Shift+Y | Shift+н | shift+y | NO | +| Ctrl+Alt+KeyY | --- | Ctrl+Alt+Y | Ctrl+Alt+н | ctrl+alt+y | NO | +| Ctrl+Shift+Alt+KeyY | --- | Ctrl+Shift+Alt+Y | Ctrl+Shift+Alt+н | ctrl+shift+alt+y | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| KeyZ | я | Z | я | z | NO | +| Shift+KeyZ | Я | Shift+Z | Shift+я | shift+z | NO | +| Ctrl+Alt+KeyZ | --- | Ctrl+Alt+Z | Ctrl+Alt+я | ctrl+alt+z | NO | +| Ctrl+Shift+Alt+KeyZ | --- | Ctrl+Shift+Alt+Z | Ctrl+Shift+Alt+я | ctrl+shift+alt+z | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit1 | 1 | 1 | 1 | 1 | | +| Shift+Digit1 | ! | Shift+1 | Shift+1 | shift+1 | | +| Ctrl+Alt+Digit1 | --- | Ctrl+Alt+1 | Ctrl+Alt+1 | ctrl+alt+1 | | +| Ctrl+Shift+Alt+Digit1 | --- | Ctrl+Shift+Alt+1 | Ctrl+Shift+Alt+1 | ctrl+shift+alt+1 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit2 | 2 | 2 | 2 | 2 | | +| Shift+Digit2 | " | Shift+2 | Shift+2 | shift+2 | | +| Ctrl+Alt+Digit2 | --- | Ctrl+Alt+2 | Ctrl+Alt+2 | ctrl+alt+2 | | +| Ctrl+Shift+Alt+Digit2 | --- | Ctrl+Shift+Alt+2 | Ctrl+Shift+Alt+2 | ctrl+shift+alt+2 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit3 | 3 | 3 | 3 | 3 | | +| Shift+Digit3 | № | Shift+3 | Shift+3 | shift+3 | | +| Ctrl+Alt+Digit3 | --- | Ctrl+Alt+3 | Ctrl+Alt+3 | ctrl+alt+3 | | +| Ctrl+Shift+Alt+Digit3 | --- | Ctrl+Shift+Alt+3 | Ctrl+Shift+Alt+3 | ctrl+shift+alt+3 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit4 | 4 | 4 | 4 | 4 | | +| Shift+Digit4 | ; | Shift+4 | Shift+4 | shift+4 | | +| Ctrl+Alt+Digit4 | --- | Ctrl+Alt+4 | Ctrl+Alt+4 | ctrl+alt+4 | | +| Ctrl+Shift+Alt+Digit4 | --- | Ctrl+Shift+Alt+4 | Ctrl+Shift+Alt+4 | ctrl+shift+alt+4 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit5 | 5 | 5 | 5 | 5 | | +| Shift+Digit5 | % | Shift+5 | Shift+5 | shift+5 | | +| Ctrl+Alt+Digit5 | --- | Ctrl+Alt+5 | Ctrl+Alt+5 | ctrl+alt+5 | | +| Ctrl+Shift+Alt+Digit5 | --- | Ctrl+Shift+Alt+5 | Ctrl+Shift+Alt+5 | ctrl+shift+alt+5 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit6 | 6 | 6 | 6 | 6 | | +| Shift+Digit6 | : | Shift+6 | Shift+6 | shift+6 | | +| Ctrl+Alt+Digit6 | --- | Ctrl+Alt+6 | Ctrl+Alt+6 | ctrl+alt+6 | | +| Ctrl+Shift+Alt+Digit6 | --- | Ctrl+Shift+Alt+6 | Ctrl+Shift+Alt+6 | ctrl+shift+alt+6 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit7 | 7 | 7 | 7 | 7 | | +| Shift+Digit7 | ? | Shift+7 | Shift+7 | shift+7 | | +| Ctrl+Alt+Digit7 | --- | Ctrl+Alt+7 | Ctrl+Alt+7 | ctrl+alt+7 | | +| Ctrl+Shift+Alt+Digit7 | --- | Ctrl+Shift+Alt+7 | Ctrl+Shift+Alt+7 | ctrl+shift+alt+7 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit8 | 8 | 8 | 8 | 8 | | +| Shift+Digit8 | * | Shift+8 | Shift+8 | shift+8 | | +| Ctrl+Alt+Digit8 | ₽ | Ctrl+Alt+8 | Ctrl+Alt+8 | ctrl+alt+8 | | +| Ctrl+Shift+Alt+Digit8 | --- | Ctrl+Shift+Alt+8 | Ctrl+Shift+Alt+8 | ctrl+shift+alt+8 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit9 | 9 | 9 | 9 | 9 | | +| Shift+Digit9 | ( | Shift+9 | Shift+9 | shift+9 | | +| Ctrl+Alt+Digit9 | --- | Ctrl+Alt+9 | Ctrl+Alt+9 | ctrl+alt+9 | | +| Ctrl+Shift+Alt+Digit9 | --- | Ctrl+Shift+Alt+9 | Ctrl+Shift+Alt+9 | ctrl+shift+alt+9 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Digit0 | 0 | 0 | 0 | 0 | | +| Shift+Digit0 | ) | Shift+0 | Shift+0 | shift+0 | | +| Ctrl+Alt+Digit0 | --- | Ctrl+Alt+0 | Ctrl+Alt+0 | ctrl+alt+0 | | +| Ctrl+Shift+Alt+Digit0 | --- | Ctrl+Shift+Alt+0 | Ctrl+Shift+Alt+0 | ctrl+shift+alt+0 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| Minus | - | - | - | oem_minus | NO | +| Shift+Minus | _ | Shift+- | Shift+- | shift+oem_minus | NO | +| Ctrl+Alt+Minus | --- | Ctrl+Alt+- | Ctrl+Alt+- | ctrl+alt+oem_minus | NO | +| Ctrl+Shift+Alt+Minus | --- | Ctrl+Shift+Alt+- | Ctrl+Shift+Alt+- | ctrl+shift+alt+oem_minus | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Equal | = | = | = | oem_plus | NO | +| Shift+Equal | + | Shift+= | Shift+= | shift+oem_plus | NO | +| Ctrl+Alt+Equal | --- | Ctrl+Alt+= | Ctrl+Alt+= | ctrl+alt+oem_plus | NO | +| Ctrl+Shift+Alt+Equal | --- | Ctrl+Shift+Alt+= | Ctrl+Shift+Alt+= | ctrl+shift+alt+oem_plus | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| BracketLeft | х | [ | х | oem_4 | NO | +| Shift+BracketLeft | Х | Shift+[ | Shift+х | shift+oem_4 | NO | +| Ctrl+Alt+BracketLeft | --- | Ctrl+Alt+[ | Ctrl+Alt+х | ctrl+alt+oem_4 | NO | +| Ctrl+Shift+Alt+BracketLeft | --- | Ctrl+Shift+Alt+[ | Ctrl+Shift+Alt+х | ctrl+shift+alt+oem_4 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| BracketRight | ъ | ] | ъ | oem_6 | NO | +| Shift+BracketRight | Ъ | Shift+] | Shift+ъ | shift+oem_6 | NO | +| Ctrl+Alt+BracketRight | --- | Ctrl+Alt+] | Ctrl+Alt+ъ | ctrl+alt+oem_6 | NO | +| Ctrl+Shift+Alt+BracketRight | --- | Ctrl+Shift+Alt+] | Ctrl+Shift+Alt+ъ | ctrl+shift+alt+oem_6 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Backslash | \ | \ | \ | oem_5 | NO | +| Shift+Backslash | / | Shift+\ | Shift+\ | shift+oem_5 | NO | +| Ctrl+Alt+Backslash | --- | Ctrl+Alt+\ | Ctrl+Alt+\ | ctrl+alt+oem_5 | NO | +| Ctrl+Shift+Alt+Backslash | --- | Ctrl+Shift+Alt+\ | Ctrl+Shift+Alt+\ | ctrl+shift+alt+oem_5 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| IntlHash | --- | null | null | null | NO | +| Shift+IntlHash | --- | null | null | null | NO | +| Ctrl+Alt+IntlHash | --- | null | null | null | NO | +| Ctrl+Shift+Alt+IntlHash | --- | null | null | null | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| Semicolon | ж | ; | ж | oem_1 | NO | +| Shift+Semicolon | Ж | Shift+; | Shift+ж | shift+oem_1 | NO | +| Ctrl+Alt+Semicolon | --- | Ctrl+Alt+; | Ctrl+Alt+ж | ctrl+alt+oem_1 | NO | +| Ctrl+Shift+Alt+Semicolon | --- | Ctrl+Shift+Alt+; | Ctrl+Shift+Alt+ж | ctrl+shift+alt+oem_1 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Quote | э | ' | э | oem_7 | NO | +| Shift+Quote | Э | Shift+' | Shift+э | shift+oem_7 | NO | +| Ctrl+Alt+Quote | --- | Ctrl+Alt+' | Ctrl+Alt+э | ctrl+alt+oem_7 | NO | +| Ctrl+Shift+Alt+Quote | --- | Ctrl+Shift+Alt+' | Ctrl+Shift+Alt+э | ctrl+shift+alt+oem_7 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Backquote | ё | ` | ё | oem_3 | NO | +| Shift+Backquote | Ё | Shift+` | Shift+ё | shift+oem_3 | NO | +| Ctrl+Alt+Backquote | --- | Ctrl+Alt+` | Ctrl+Alt+ё | ctrl+alt+oem_3 | NO | +| Ctrl+Shift+Alt+Backquote | --- | Ctrl+Shift+Alt+` | Ctrl+Shift+Alt+ё | ctrl+shift+alt+oem_3 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Comma | б | , | б | oem_comma | NO | +| Shift+Comma | Б | Shift+, | Shift+б | shift+oem_comma | NO | +| Ctrl+Alt+Comma | --- | Ctrl+Alt+, | Ctrl+Alt+б | ctrl+alt+oem_comma | NO | +| Ctrl+Shift+Alt+Comma | --- | Ctrl+Shift+Alt+, | Ctrl+Shift+Alt+б | ctrl+shift+alt+oem_comma | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Period | ю | . | ю | oem_period | NO | +| Shift+Period | Ю | Shift+. | Shift+ю | shift+oem_period | NO | +| Ctrl+Alt+Period | --- | Ctrl+Alt+. | Ctrl+Alt+ю | ctrl+alt+oem_period | NO | +| Ctrl+Shift+Alt+Period | --- | Ctrl+Shift+Alt+. | Ctrl+Shift+Alt+ю | ctrl+shift+alt+oem_period | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| Slash | . | / | . | oem_2 | NO | +| Shift+Slash | , | Shift+/ | Shift+. | shift+oem_2 | NO | +| Ctrl+Alt+Slash | --- | Ctrl+Alt+/ | Ctrl+Alt+. | ctrl+alt+oem_2 | NO | +| Ctrl+Shift+Alt+Slash | --- | Ctrl+Shift+Alt+/ | Ctrl+Shift+Alt+. | ctrl+shift+alt+oem_2 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | +----------------------------------------------------------------------------------------------------------------------------------------- +| ArrowUp | --- | UpArrow | UpArrow | up | | +| Shift+ArrowUp | --- | Shift+UpArrow | Shift+UpArrow | shift+up | | +| Ctrl+Alt+ArrowUp | --- | Ctrl+Alt+UpArrow | Ctrl+Alt+UpArrow | ctrl+alt+up | | +| Ctrl+Shift+Alt+ArrowUp | --- | Ctrl+Shift+Alt+UpArrow | Ctrl+Shift+Alt+UpArrow | ctrl+shift+alt+up | | +----------------------------------------------------------------------------------------------------------------------------------------- +| Numpad0 | --- | NumPad0 | NumPad0 | numpad0 | | +| Shift+Numpad0 | --- | Shift+NumPad0 | Shift+NumPad0 | shift+numpad0 | | +| Ctrl+Alt+Numpad0 | --- | Ctrl+Alt+NumPad0 | Ctrl+Alt+NumPad0 | ctrl+alt+numpad0 | | +| Ctrl+Shift+Alt+Numpad0 | --- | Ctrl+Shift+Alt+NumPad0 | Ctrl+Shift+Alt+NumPad0 | ctrl+shift+alt+numpad0 | | +----------------------------------------------------------------------------------------------------------------------------------------- +| IntlBackslash | \ | OEM_102 | \ | oem_102 | NO | +| Shift+IntlBackslash | / | Shift+OEM_102 | Shift+\ | shift+oem_102 | NO | +| Ctrl+Alt+IntlBackslash | --- | Ctrl+Alt+OEM_102 | Ctrl+Alt+\ | ctrl+alt+oem_102 | NO | +| Ctrl+Shift+Alt+IntlBackslash | --- | Ctrl+Shift+Alt+OEM_102 | Ctrl+Shift+Alt+\ | ctrl+shift+alt+oem_102 | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| IntlRo | --- | null | null | null | NO | +| Shift+IntlRo | --- | null | null | null | NO | +| Ctrl+Alt+IntlRo | --- | null | null | null | NO | +| Ctrl+Shift+Alt+IntlRo | --- | null | null | null | NO | +----------------------------------------------------------------------------------------------------------------------------------------- +| IntlYen | --- | null | null | null | NO | +| Shift+IntlYen | --- | null | null | null | NO | +| Ctrl+Alt+IntlYen | --- | null | null | null | NO | +| Ctrl+Shift+Alt+IntlYen | --- | null | null | null | NO | +----------------------------------------------------------------------------------------------------------------------------------------- \ No newline at end of file From 9ff9e80200b44954d616960bbf3d7833d3e5ecd1 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sun, 21 May 2017 11:50:41 +0200 Subject: [PATCH 0723/1164] Fixes #24361: Hotkey hints are not displayed in English --- .../common/windowsKeyboardMapper.ts | 79 +++++-- .../services/keybinding/test/win_ru.txt | 208 +++++++++--------- .../test/windowsKeyboardMapper.test.ts | 24 +- 3 files changed, 190 insertions(+), 121 deletions(-) diff --git a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts index 3a90f85fdfd..3772cc723fb 100644 --- a/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts +++ b/src/vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts @@ -309,6 +309,8 @@ export class WindowsKeyboardMapper implements IKeyboardMapper { } } + let producesLetter: boolean[] = []; + this._codeInfo = []; for (let strCode in rawMappings) { if (rawMappings.hasOwnProperty(strCode)) { @@ -347,25 +349,76 @@ export class WindowsKeyboardMapper implements IKeyboardMapper { withShiftAltGr: withShiftAltGr, }; this._codeInfo[scanCode] = mapping; + this._scanCodeToKeyCode[scanCode] = keyCode; - if (keyCode !== KeyCode.Unknown) { - this._keyCodeExists[keyCode] = true; - if (value.length === 0) { - this._keyCodeToLabel[keyCode] = null; - } else if (value.length === 1) { - const charCode = value.charCodeAt(0); - if (charCode >= CharCode.a && charCode <= CharCode.z) { - this._keyCodeToLabel[keyCode] = String.fromCharCode(CharCode.A + (charCode - CharCode.a)); - } else { - this._keyCodeToLabel[keyCode] = value; - } - } else { + if (keyCode === KeyCode.Unknown) { + continue; + } + this._keyCodeExists[keyCode] = true; + + if (value.length === 0) { + // This key does not produce strings + this._keyCodeToLabel[keyCode] = null; + } + + else if (value.length > 1) { + // This key produces a letter representable with multiple UTF-16 code units. + this._keyCodeToLabel[keyCode] = value; + } + + else { + const charCode = value.charCodeAt(0); + + if (charCode >= CharCode.a && charCode <= CharCode.z) { + const upperCaseValue = CharCode.A + (charCode - CharCode.a); + producesLetter[upperCaseValue] = true; + this._keyCodeToLabel[keyCode] = String.fromCharCode(CharCode.A + (charCode - CharCode.a)); + } + + else if (charCode >= CharCode.A && charCode <= CharCode.Z) { + producesLetter[charCode] = true; + this._keyCodeToLabel[keyCode] = value; + } + + else { this._keyCodeToLabel[keyCode] = value; } } - this._scanCodeToKeyCode[scanCode] = keyCode; } } + + // Handle keyboard layouts where latin characters are not produced e.g. Cyrillic + const _registerLetterIfMissing = (charCode: CharCode, keyCode: KeyCode): void => { + if (!producesLetter[charCode]) { + this._keyCodeToLabel[keyCode] = String.fromCharCode(charCode); + } + }; + _registerLetterIfMissing(CharCode.A, KeyCode.KEY_A); + _registerLetterIfMissing(CharCode.B, KeyCode.KEY_B); + _registerLetterIfMissing(CharCode.C, KeyCode.KEY_C); + _registerLetterIfMissing(CharCode.D, KeyCode.KEY_D); + _registerLetterIfMissing(CharCode.E, KeyCode.KEY_E); + _registerLetterIfMissing(CharCode.F, KeyCode.KEY_F); + _registerLetterIfMissing(CharCode.G, KeyCode.KEY_G); + _registerLetterIfMissing(CharCode.H, KeyCode.KEY_H); + _registerLetterIfMissing(CharCode.I, KeyCode.KEY_I); + _registerLetterIfMissing(CharCode.J, KeyCode.KEY_J); + _registerLetterIfMissing(CharCode.K, KeyCode.KEY_K); + _registerLetterIfMissing(CharCode.L, KeyCode.KEY_L); + _registerLetterIfMissing(CharCode.M, KeyCode.KEY_M); + _registerLetterIfMissing(CharCode.N, KeyCode.KEY_N); + _registerLetterIfMissing(CharCode.O, KeyCode.KEY_O); + _registerLetterIfMissing(CharCode.P, KeyCode.KEY_P); + _registerLetterIfMissing(CharCode.Q, KeyCode.KEY_Q); + _registerLetterIfMissing(CharCode.R, KeyCode.KEY_R); + _registerLetterIfMissing(CharCode.S, KeyCode.KEY_S); + _registerLetterIfMissing(CharCode.T, KeyCode.KEY_T); + _registerLetterIfMissing(CharCode.U, KeyCode.KEY_U); + _registerLetterIfMissing(CharCode.V, KeyCode.KEY_V); + _registerLetterIfMissing(CharCode.W, KeyCode.KEY_W); + _registerLetterIfMissing(CharCode.X, KeyCode.KEY_X); + _registerLetterIfMissing(CharCode.Y, KeyCode.KEY_Y); + _registerLetterIfMissing(CharCode.Z, KeyCode.KEY_Z); } public dumpDebugInfo(): string { diff --git a/src/vs/workbench/services/keybinding/test/win_ru.txt b/src/vs/workbench/services/keybinding/test/win_ru.txt index 5ea3c8575df..359a3862382 100644 --- a/src/vs/workbench/services/keybinding/test/win_ru.txt +++ b/src/vs/workbench/services/keybinding/test/win_ru.txt @@ -1,143 +1,143 @@ ----------------------------------------------------------------------------------------------------------------------------------------- | HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyA | ф | A | ф | a | NO | -| Shift+KeyA | Ф | Shift+A | Shift+ф | shift+a | NO | -| Ctrl+Alt+KeyA | --- | Ctrl+Alt+A | Ctrl+Alt+ф | ctrl+alt+a | NO | -| Ctrl+Shift+Alt+KeyA | --- | Ctrl+Shift+Alt+A | Ctrl+Shift+Alt+ф | ctrl+shift+alt+a | NO | +| KeyA | ф | A | A | a | | +| Shift+KeyA | Ф | Shift+A | Shift+A | shift+a | | +| Ctrl+Alt+KeyA | --- | Ctrl+Alt+A | Ctrl+Alt+A | ctrl+alt+a | | +| Ctrl+Shift+Alt+KeyA | --- | Ctrl+Shift+Alt+A | Ctrl+Shift+Alt+A | ctrl+shift+alt+a | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyB | и | B | и | b | NO | -| Shift+KeyB | И | Shift+B | Shift+и | shift+b | NO | -| Ctrl+Alt+KeyB | --- | Ctrl+Alt+B | Ctrl+Alt+и | ctrl+alt+b | NO | -| Ctrl+Shift+Alt+KeyB | --- | Ctrl+Shift+Alt+B | Ctrl+Shift+Alt+и | ctrl+shift+alt+b | NO | +| KeyB | и | B | B | b | | +| Shift+KeyB | И | Shift+B | Shift+B | shift+b | | +| Ctrl+Alt+KeyB | --- | Ctrl+Alt+B | Ctrl+Alt+B | ctrl+alt+b | | +| Ctrl+Shift+Alt+KeyB | --- | Ctrl+Shift+Alt+B | Ctrl+Shift+Alt+B | ctrl+shift+alt+b | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyC | с | C | с | c | NO | -| Shift+KeyC | С | Shift+C | Shift+с | shift+c | NO | -| Ctrl+Alt+KeyC | --- | Ctrl+Alt+C | Ctrl+Alt+с | ctrl+alt+c | NO | -| Ctrl+Shift+Alt+KeyC | --- | Ctrl+Shift+Alt+C | Ctrl+Shift+Alt+с | ctrl+shift+alt+c | NO | +| KeyC | с | C | C | c | | +| Shift+KeyC | С | Shift+C | Shift+C | shift+c | | +| Ctrl+Alt+KeyC | --- | Ctrl+Alt+C | Ctrl+Alt+C | ctrl+alt+c | | +| Ctrl+Shift+Alt+KeyC | --- | Ctrl+Shift+Alt+C | Ctrl+Shift+Alt+C | ctrl+shift+alt+c | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyD | в | D | в | d | NO | -| Shift+KeyD | В | Shift+D | Shift+в | shift+d | NO | -| Ctrl+Alt+KeyD | --- | Ctrl+Alt+D | Ctrl+Alt+в | ctrl+alt+d | NO | -| Ctrl+Shift+Alt+KeyD | --- | Ctrl+Shift+Alt+D | Ctrl+Shift+Alt+в | ctrl+shift+alt+d | NO | +| KeyD | в | D | D | d | | +| Shift+KeyD | В | Shift+D | Shift+D | shift+d | | +| Ctrl+Alt+KeyD | --- | Ctrl+Alt+D | Ctrl+Alt+D | ctrl+alt+d | | +| Ctrl+Shift+Alt+KeyD | --- | Ctrl+Shift+Alt+D | Ctrl+Shift+Alt+D | ctrl+shift+alt+d | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyE | у | E | у | e | NO | -| Shift+KeyE | У | Shift+E | Shift+у | shift+e | NO | -| Ctrl+Alt+KeyE | --- | Ctrl+Alt+E | Ctrl+Alt+у | ctrl+alt+e | NO | -| Ctrl+Shift+Alt+KeyE | --- | Ctrl+Shift+Alt+E | Ctrl+Shift+Alt+у | ctrl+shift+alt+e | NO | +| KeyE | у | E | E | e | | +| Shift+KeyE | У | Shift+E | Shift+E | shift+e | | +| Ctrl+Alt+KeyE | --- | Ctrl+Alt+E | Ctrl+Alt+E | ctrl+alt+e | | +| Ctrl+Shift+Alt+KeyE | --- | Ctrl+Shift+Alt+E | Ctrl+Shift+Alt+E | ctrl+shift+alt+e | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyF | а | F | а | f | NO | -| Shift+KeyF | А | Shift+F | Shift+а | shift+f | NO | -| Ctrl+Alt+KeyF | --- | Ctrl+Alt+F | Ctrl+Alt+а | ctrl+alt+f | NO | -| Ctrl+Shift+Alt+KeyF | --- | Ctrl+Shift+Alt+F | Ctrl+Shift+Alt+а | ctrl+shift+alt+f | NO | +| KeyF | а | F | F | f | | +| Shift+KeyF | А | Shift+F | Shift+F | shift+f | | +| Ctrl+Alt+KeyF | --- | Ctrl+Alt+F | Ctrl+Alt+F | ctrl+alt+f | | +| Ctrl+Shift+Alt+KeyF | --- | Ctrl+Shift+Alt+F | Ctrl+Shift+Alt+F | ctrl+shift+alt+f | | ----------------------------------------------------------------------------------------------------------------------------------------- | HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyG | п | G | п | g | NO | -| Shift+KeyG | П | Shift+G | Shift+п | shift+g | NO | -| Ctrl+Alt+KeyG | --- | Ctrl+Alt+G | Ctrl+Alt+п | ctrl+alt+g | NO | -| Ctrl+Shift+Alt+KeyG | --- | Ctrl+Shift+Alt+G | Ctrl+Shift+Alt+п | ctrl+shift+alt+g | NO | +| KeyG | п | G | G | g | | +| Shift+KeyG | П | Shift+G | Shift+G | shift+g | | +| Ctrl+Alt+KeyG | --- | Ctrl+Alt+G | Ctrl+Alt+G | ctrl+alt+g | | +| Ctrl+Shift+Alt+KeyG | --- | Ctrl+Shift+Alt+G | Ctrl+Shift+Alt+G | ctrl+shift+alt+g | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyH | р | H | р | h | NO | -| Shift+KeyH | Р | Shift+H | Shift+р | shift+h | NO | -| Ctrl+Alt+KeyH | --- | Ctrl+Alt+H | Ctrl+Alt+р | ctrl+alt+h | NO | -| Ctrl+Shift+Alt+KeyH | --- | Ctrl+Shift+Alt+H | Ctrl+Shift+Alt+р | ctrl+shift+alt+h | NO | +| KeyH | р | H | H | h | | +| Shift+KeyH | Р | Shift+H | Shift+H | shift+h | | +| Ctrl+Alt+KeyH | --- | Ctrl+Alt+H | Ctrl+Alt+H | ctrl+alt+h | | +| Ctrl+Shift+Alt+KeyH | --- | Ctrl+Shift+Alt+H | Ctrl+Shift+Alt+H | ctrl+shift+alt+h | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyI | ш | I | ш | i | NO | -| Shift+KeyI | Ш | Shift+I | Shift+ш | shift+i | NO | -| Ctrl+Alt+KeyI | --- | Ctrl+Alt+I | Ctrl+Alt+ш | ctrl+alt+i | NO | -| Ctrl+Shift+Alt+KeyI | --- | Ctrl+Shift+Alt+I | Ctrl+Shift+Alt+ш | ctrl+shift+alt+i | NO | +| KeyI | ш | I | I | i | | +| Shift+KeyI | Ш | Shift+I | Shift+I | shift+i | | +| Ctrl+Alt+KeyI | --- | Ctrl+Alt+I | Ctrl+Alt+I | ctrl+alt+i | | +| Ctrl+Shift+Alt+KeyI | --- | Ctrl+Shift+Alt+I | Ctrl+Shift+Alt+I | ctrl+shift+alt+i | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyJ | о | J | о | j | NO | -| Shift+KeyJ | О | Shift+J | Shift+о | shift+j | NO | -| Ctrl+Alt+KeyJ | --- | Ctrl+Alt+J | Ctrl+Alt+о | ctrl+alt+j | NO | -| Ctrl+Shift+Alt+KeyJ | --- | Ctrl+Shift+Alt+J | Ctrl+Shift+Alt+о | ctrl+shift+alt+j | NO | +| KeyJ | о | J | J | j | | +| Shift+KeyJ | О | Shift+J | Shift+J | shift+j | | +| Ctrl+Alt+KeyJ | --- | Ctrl+Alt+J | Ctrl+Alt+J | ctrl+alt+j | | +| Ctrl+Shift+Alt+KeyJ | --- | Ctrl+Shift+Alt+J | Ctrl+Shift+Alt+J | ctrl+shift+alt+j | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyK | л | K | л | k | NO | -| Shift+KeyK | Л | Shift+K | Shift+л | shift+k | NO | -| Ctrl+Alt+KeyK | --- | Ctrl+Alt+K | Ctrl+Alt+л | ctrl+alt+k | NO | -| Ctrl+Shift+Alt+KeyK | --- | Ctrl+Shift+Alt+K | Ctrl+Shift+Alt+л | ctrl+shift+alt+k | NO | +| KeyK | л | K | K | k | | +| Shift+KeyK | Л | Shift+K | Shift+K | shift+k | | +| Ctrl+Alt+KeyK | --- | Ctrl+Alt+K | Ctrl+Alt+K | ctrl+alt+k | | +| Ctrl+Shift+Alt+KeyK | --- | Ctrl+Shift+Alt+K | Ctrl+Shift+Alt+K | ctrl+shift+alt+k | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyL | д | L | д | l | NO | -| Shift+KeyL | Д | Shift+L | Shift+д | shift+l | NO | -| Ctrl+Alt+KeyL | --- | Ctrl+Alt+L | Ctrl+Alt+д | ctrl+alt+l | NO | -| Ctrl+Shift+Alt+KeyL | --- | Ctrl+Shift+Alt+L | Ctrl+Shift+Alt+д | ctrl+shift+alt+l | NO | +| KeyL | д | L | L | l | | +| Shift+KeyL | Д | Shift+L | Shift+L | shift+l | | +| Ctrl+Alt+KeyL | --- | Ctrl+Alt+L | Ctrl+Alt+L | ctrl+alt+l | | +| Ctrl+Shift+Alt+KeyL | --- | Ctrl+Shift+Alt+L | Ctrl+Shift+Alt+L | ctrl+shift+alt+l | | ----------------------------------------------------------------------------------------------------------------------------------------- | HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyM | ь | M | ь | m | NO | -| Shift+KeyM | Ь | Shift+M | Shift+ь | shift+m | NO | -| Ctrl+Alt+KeyM | --- | Ctrl+Alt+M | Ctrl+Alt+ь | ctrl+alt+m | NO | -| Ctrl+Shift+Alt+KeyM | --- | Ctrl+Shift+Alt+M | Ctrl+Shift+Alt+ь | ctrl+shift+alt+m | NO | +| KeyM | ь | M | M | m | | +| Shift+KeyM | Ь | Shift+M | Shift+M | shift+m | | +| Ctrl+Alt+KeyM | --- | Ctrl+Alt+M | Ctrl+Alt+M | ctrl+alt+m | | +| Ctrl+Shift+Alt+KeyM | --- | Ctrl+Shift+Alt+M | Ctrl+Shift+Alt+M | ctrl+shift+alt+m | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyN | т | N | т | n | NO | -| Shift+KeyN | Т | Shift+N | Shift+т | shift+n | NO | -| Ctrl+Alt+KeyN | --- | Ctrl+Alt+N | Ctrl+Alt+т | ctrl+alt+n | NO | -| Ctrl+Shift+Alt+KeyN | --- | Ctrl+Shift+Alt+N | Ctrl+Shift+Alt+т | ctrl+shift+alt+n | NO | +| KeyN | т | N | N | n | | +| Shift+KeyN | Т | Shift+N | Shift+N | shift+n | | +| Ctrl+Alt+KeyN | --- | Ctrl+Alt+N | Ctrl+Alt+N | ctrl+alt+n | | +| Ctrl+Shift+Alt+KeyN | --- | Ctrl+Shift+Alt+N | Ctrl+Shift+Alt+N | ctrl+shift+alt+n | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyO | щ | O | щ | o | NO | -| Shift+KeyO | Щ | Shift+O | Shift+щ | shift+o | NO | -| Ctrl+Alt+KeyO | --- | Ctrl+Alt+O | Ctrl+Alt+щ | ctrl+alt+o | NO | -| Ctrl+Shift+Alt+KeyO | --- | Ctrl+Shift+Alt+O | Ctrl+Shift+Alt+щ | ctrl+shift+alt+o | NO | +| KeyO | щ | O | O | o | | +| Shift+KeyO | Щ | Shift+O | Shift+O | shift+o | | +| Ctrl+Alt+KeyO | --- | Ctrl+Alt+O | Ctrl+Alt+O | ctrl+alt+o | | +| Ctrl+Shift+Alt+KeyO | --- | Ctrl+Shift+Alt+O | Ctrl+Shift+Alt+O | ctrl+shift+alt+o | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyP | з | P | з | p | NO | -| Shift+KeyP | З | Shift+P | Shift+з | shift+p | NO | -| Ctrl+Alt+KeyP | --- | Ctrl+Alt+P | Ctrl+Alt+з | ctrl+alt+p | NO | -| Ctrl+Shift+Alt+KeyP | --- | Ctrl+Shift+Alt+P | Ctrl+Shift+Alt+з | ctrl+shift+alt+p | NO | +| KeyP | з | P | P | p | | +| Shift+KeyP | З | Shift+P | Shift+P | shift+p | | +| Ctrl+Alt+KeyP | --- | Ctrl+Alt+P | Ctrl+Alt+P | ctrl+alt+p | | +| Ctrl+Shift+Alt+KeyP | --- | Ctrl+Shift+Alt+P | Ctrl+Shift+Alt+P | ctrl+shift+alt+p | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyQ | й | Q | й | q | NO | -| Shift+KeyQ | Й | Shift+Q | Shift+й | shift+q | NO | -| Ctrl+Alt+KeyQ | --- | Ctrl+Alt+Q | Ctrl+Alt+й | ctrl+alt+q | NO | -| Ctrl+Shift+Alt+KeyQ | --- | Ctrl+Shift+Alt+Q | Ctrl+Shift+Alt+й | ctrl+shift+alt+q | NO | +| KeyQ | й | Q | Q | q | | +| Shift+KeyQ | Й | Shift+Q | Shift+Q | shift+q | | +| Ctrl+Alt+KeyQ | --- | Ctrl+Alt+Q | Ctrl+Alt+Q | ctrl+alt+q | | +| Ctrl+Shift+Alt+KeyQ | --- | Ctrl+Shift+Alt+Q | Ctrl+Shift+Alt+Q | ctrl+shift+alt+q | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyR | к | R | к | r | NO | -| Shift+KeyR | К | Shift+R | Shift+к | shift+r | NO | -| Ctrl+Alt+KeyR | --- | Ctrl+Alt+R | Ctrl+Alt+к | ctrl+alt+r | NO | -| Ctrl+Shift+Alt+KeyR | --- | Ctrl+Shift+Alt+R | Ctrl+Shift+Alt+к | ctrl+shift+alt+r | NO | +| KeyR | к | R | R | r | | +| Shift+KeyR | К | Shift+R | Shift+R | shift+r | | +| Ctrl+Alt+KeyR | --- | Ctrl+Alt+R | Ctrl+Alt+R | ctrl+alt+r | | +| Ctrl+Shift+Alt+KeyR | --- | Ctrl+Shift+Alt+R | Ctrl+Shift+Alt+R | ctrl+shift+alt+r | | ----------------------------------------------------------------------------------------------------------------------------------------- | HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyS | ы | S | ы | s | NO | -| Shift+KeyS | Ы | Shift+S | Shift+ы | shift+s | NO | -| Ctrl+Alt+KeyS | --- | Ctrl+Alt+S | Ctrl+Alt+ы | ctrl+alt+s | NO | -| Ctrl+Shift+Alt+KeyS | --- | Ctrl+Shift+Alt+S | Ctrl+Shift+Alt+ы | ctrl+shift+alt+s | NO | +| KeyS | ы | S | S | s | | +| Shift+KeyS | Ы | Shift+S | Shift+S | shift+s | | +| Ctrl+Alt+KeyS | --- | Ctrl+Alt+S | Ctrl+Alt+S | ctrl+alt+s | | +| Ctrl+Shift+Alt+KeyS | --- | Ctrl+Shift+Alt+S | Ctrl+Shift+Alt+S | ctrl+shift+alt+s | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyT | е | T | е | t | NO | -| Shift+KeyT | Е | Shift+T | Shift+е | shift+t | NO | -| Ctrl+Alt+KeyT | --- | Ctrl+Alt+T | Ctrl+Alt+е | ctrl+alt+t | NO | -| Ctrl+Shift+Alt+KeyT | --- | Ctrl+Shift+Alt+T | Ctrl+Shift+Alt+е | ctrl+shift+alt+t | NO | +| KeyT | е | T | T | t | | +| Shift+KeyT | Е | Shift+T | Shift+T | shift+t | | +| Ctrl+Alt+KeyT | --- | Ctrl+Alt+T | Ctrl+Alt+T | ctrl+alt+t | | +| Ctrl+Shift+Alt+KeyT | --- | Ctrl+Shift+Alt+T | Ctrl+Shift+Alt+T | ctrl+shift+alt+t | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyU | г | U | г | u | NO | -| Shift+KeyU | Г | Shift+U | Shift+г | shift+u | NO | -| Ctrl+Alt+KeyU | --- | Ctrl+Alt+U | Ctrl+Alt+г | ctrl+alt+u | NO | -| Ctrl+Shift+Alt+KeyU | --- | Ctrl+Shift+Alt+U | Ctrl+Shift+Alt+г | ctrl+shift+alt+u | NO | +| KeyU | г | U | U | u | | +| Shift+KeyU | Г | Shift+U | Shift+U | shift+u | | +| Ctrl+Alt+KeyU | --- | Ctrl+Alt+U | Ctrl+Alt+U | ctrl+alt+u | | +| Ctrl+Shift+Alt+KeyU | --- | Ctrl+Shift+Alt+U | Ctrl+Shift+Alt+U | ctrl+shift+alt+u | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyV | м | V | м | v | NO | -| Shift+KeyV | М | Shift+V | Shift+м | shift+v | NO | -| Ctrl+Alt+KeyV | --- | Ctrl+Alt+V | Ctrl+Alt+м | ctrl+alt+v | NO | -| Ctrl+Shift+Alt+KeyV | --- | Ctrl+Shift+Alt+V | Ctrl+Shift+Alt+м | ctrl+shift+alt+v | NO | +| KeyV | м | V | V | v | | +| Shift+KeyV | М | Shift+V | Shift+V | shift+v | | +| Ctrl+Alt+KeyV | --- | Ctrl+Alt+V | Ctrl+Alt+V | ctrl+alt+v | | +| Ctrl+Shift+Alt+KeyV | --- | Ctrl+Shift+Alt+V | Ctrl+Shift+Alt+V | ctrl+shift+alt+v | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyW | ц | W | ц | w | NO | -| Shift+KeyW | Ц | Shift+W | Shift+ц | shift+w | NO | -| Ctrl+Alt+KeyW | --- | Ctrl+Alt+W | Ctrl+Alt+ц | ctrl+alt+w | NO | -| Ctrl+Shift+Alt+KeyW | --- | Ctrl+Shift+Alt+W | Ctrl+Shift+Alt+ц | ctrl+shift+alt+w | NO | +| KeyW | ц | W | W | w | | +| Shift+KeyW | Ц | Shift+W | Shift+W | shift+w | | +| Ctrl+Alt+KeyW | --- | Ctrl+Alt+W | Ctrl+Alt+W | ctrl+alt+w | | +| Ctrl+Shift+Alt+KeyW | --- | Ctrl+Shift+Alt+W | Ctrl+Shift+Alt+W | ctrl+shift+alt+w | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyX | ч | X | ч | x | NO | -| Shift+KeyX | Ч | Shift+X | Shift+ч | shift+x | NO | -| Ctrl+Alt+KeyX | --- | Ctrl+Alt+X | Ctrl+Alt+ч | ctrl+alt+x | NO | -| Ctrl+Shift+Alt+KeyX | --- | Ctrl+Shift+Alt+X | Ctrl+Shift+Alt+ч | ctrl+shift+alt+x | NO | +| KeyX | ч | X | X | x | | +| Shift+KeyX | Ч | Shift+X | Shift+X | shift+x | | +| Ctrl+Alt+KeyX | --- | Ctrl+Alt+X | Ctrl+Alt+X | ctrl+alt+x | | +| Ctrl+Shift+Alt+KeyX | --- | Ctrl+Shift+Alt+X | Ctrl+Shift+Alt+X | ctrl+shift+alt+x | | ----------------------------------------------------------------------------------------------------------------------------------------- | HW Code combination | Key | KeyCode combination | UI label | User settings | WYSIWYG | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyY | н | Y | н | y | NO | -| Shift+KeyY | Н | Shift+Y | Shift+н | shift+y | NO | -| Ctrl+Alt+KeyY | --- | Ctrl+Alt+Y | Ctrl+Alt+н | ctrl+alt+y | NO | -| Ctrl+Shift+Alt+KeyY | --- | Ctrl+Shift+Alt+Y | Ctrl+Shift+Alt+н | ctrl+shift+alt+y | NO | +| KeyY | н | Y | Y | y | | +| Shift+KeyY | Н | Shift+Y | Shift+Y | shift+y | | +| Ctrl+Alt+KeyY | --- | Ctrl+Alt+Y | Ctrl+Alt+Y | ctrl+alt+y | | +| Ctrl+Shift+Alt+KeyY | --- | Ctrl+Shift+Alt+Y | Ctrl+Shift+Alt+Y | ctrl+shift+alt+y | | ----------------------------------------------------------------------------------------------------------------------------------------- -| KeyZ | я | Z | я | z | NO | -| Shift+KeyZ | Я | Shift+Z | Shift+я | shift+z | NO | -| Ctrl+Alt+KeyZ | --- | Ctrl+Alt+Z | Ctrl+Alt+я | ctrl+alt+z | NO | -| Ctrl+Shift+Alt+KeyZ | --- | Ctrl+Shift+Alt+Z | Ctrl+Shift+Alt+я | ctrl+shift+alt+z | NO | +| KeyZ | я | Z | Z | z | | +| Shift+KeyZ | Я | Shift+Z | Shift+Z | shift+z | | +| Ctrl+Alt+KeyZ | --- | Ctrl+Alt+Z | Ctrl+Alt+Z | ctrl+alt+z | | +| Ctrl+Shift+Alt+KeyZ | --- | Ctrl+Shift+Alt+Z | Ctrl+Shift+Alt+Z | ctrl+shift+alt+z | | ----------------------------------------------------------------------------------------------------------------------------------------- | Digit1 | 1 | 1 | 1 | 1 | | | Shift+Digit1 | ! | Shift+1 | Shift+1 | shift+1 | | diff --git a/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts index 5378fae982e..f66d60bf206 100644 --- a/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts @@ -482,9 +482,25 @@ suite('keyboardMapper - WINDOWS ru', () => { test('mapping', (done) => { assertMapping(WRITE_FILE_IF_DIFFERENT, mapper, 'win_ru.txt', done); }); + + test('issue ##24361: resolveKeybinding Ctrl+K Ctrl+K', () => { + _assertResolveKeybinding( + mapper, + KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_K), + [{ + label: 'Ctrl+K Ctrl+K', + ariaLabel: 'Control+K Control+K', + electronAccelerator: null, + userSettingsLabel: 'ctrl+k ctrl+k', + isWYSIWYG: true, + isChord: true, + dispatchParts: ['ctrl+K', 'ctrl+K'], + }] + ); + }); }); -suite('misc', () => { +suite('keyboardMapper - misc', () => { test('issue #23513: Toggle Sidebar Visibility and Go to Line display same key mapping in Arabic keyboard', () => { const mapper = new WindowsKeyboardMapper(false, { 'KeyB': { @@ -507,11 +523,11 @@ suite('misc', () => { mapper, KeyMod.CtrlCmd | KeyCode.KEY_B, [{ - label: 'Ctrl+لا', - ariaLabel: 'Control+لا', + label: 'Ctrl+B', + ariaLabel: 'Control+B', electronAccelerator: 'Ctrl+B', userSettingsLabel: 'ctrl+b', - isWYSIWYG: false, + isWYSIWYG: true, isChord: false, dispatchParts: ['ctrl+B', null], }] From 4640bd8c183ae34d6c0555cffe6dadf711ec3f39 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 21 May 2017 18:09:44 +0200 Subject: [PATCH 0724/1164] Fixes in Tree view --- src/vs/workbench/api/node/extHostTreeViews.ts | 4 +++- src/vs/workbench/parts/views/browser/treeView.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTreeViews.ts b/src/vs/workbench/api/node/extHostTreeViews.ts index bbfde013ddd..9a27a7fa3a7 100644 --- a/src/vs/workbench/api/node/extHostTreeViews.ts +++ b/src/vs/workbench/api/node/extHostTreeViews.ts @@ -86,7 +86,9 @@ class ExtHostTreeView extends Disposable { constructor(private viewId: string, private dataProvider: vscode.TreeDataProvider, private proxy: MainThreadTreeViewsShape) { super(); this.proxy.$registerView(viewId); - this._register(dataProvider.onDidChange(element => this._refresh(element))); + if (dataProvider.onDidChange) { + this._register(dataProvider.onDidChange(element => this._refresh(element))); + } } getTreeItems(): TPromise { diff --git a/src/vs/workbench/parts/views/browser/treeView.ts b/src/vs/workbench/parts/views/browser/treeView.ts index fc0e34b8a62..d80990bbe72 100644 --- a/src/vs/workbench/parts/views/browser/treeView.ts +++ b/src/vs/workbench/parts/views/browser/treeView.ts @@ -388,7 +388,7 @@ class Menus implements IDisposable { } const _contextKeyService = this.contextKeyService.createScoped(); - contextKeyService.createKey('view', id); + _contextKeyService.createKey('view', id); const titleMenu = this.menuService.createMenu(MenuId.ViewTitle, _contextKeyService); const updateActions = () => { From 2bcb7147e46aebaf9281672cc06a97147b260e79 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Sun, 21 May 2017 18:17:03 +0200 Subject: [PATCH 0725/1164] Fix css in views --- src/vs/workbench/parts/views/browser/media/views.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/vs/workbench/parts/views/browser/media/views.css b/src/vs/workbench/parts/views/browser/media/views.css index 30eede64993..ec19ba40429 100644 --- a/src/vs/workbench/parts/views/browser/media/views.css +++ b/src/vs/workbench/parts/views/browser/media/views.css @@ -19,6 +19,12 @@ -webkit-font-smoothing: antialiased; } +.custom-view-tree-node-item > .custom-view-tree-node-item-label { + flex: 1; + text-overflow: ellipsis; + overflow: hidden; +} + .custom-view-tree-node-item > .custom-view-tree-node-item-label .label { vertical-align: middle; } \ No newline at end of file From 354e809c4a516785499b090c8d7f99ecd997231a Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sun, 21 May 2017 13:08:55 +0200 Subject: [PATCH 0726/1164] Avoid extension registry lookups for multiple equal activation events --- .../extensions/common/abstractExtensionService.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/extensions/common/abstractExtensionService.ts b/src/vs/platform/extensions/common/abstractExtensionService.ts index 25ae438be94..ed0525f99c0 100644 --- a/src/vs/platform/extensions/common/abstractExtensionService.ts +++ b/src/vs/platform/extensions/common/abstractExtensionService.ts @@ -28,6 +28,8 @@ interface IActivatingExtensionMap { [extensionId: string]: TPromise; } +const NO_OP_VOID_PROMISE = TPromise.as(void 0); + export abstract class AbstractExtensionService implements IExtensionService { public _serviceBrand: any; @@ -38,6 +40,11 @@ export abstract class AbstractExtensionService imp private _isReady: boolean; protected _registry: ExtensionDescriptionRegistry; + /** + * A map of already activated events to speed things up if the same activation event is triggered multiple times. + */ + private _alreadyActivatedEvents: { [activationEvent: string]: boolean; }; + constructor(isReadyByDefault: boolean) { if (isReadyByDefault) { this._isReady = true; @@ -54,6 +61,7 @@ export abstract class AbstractExtensionService imp this._activatingExtensions = {}; this._activatedExtensions = {}; this._registry = new ExtensionDescriptionRegistry(); + this._alreadyActivatedEvents = Object.create(null); } protected _triggerOnReady(): void { @@ -97,6 +105,9 @@ export abstract class AbstractExtensionService imp } public activateByEvent(activationEvent: string): TPromise { + if (this._alreadyActivatedEvents[activationEvent]) { + return NO_OP_VOID_PROMISE; + } if (this._isReady) { return this._activateByEvent(activationEvent); } else { @@ -106,7 +117,9 @@ export abstract class AbstractExtensionService imp private _activateByEvent(activationEvent: string): TPromise { let activateExtensions = this._registry.getExtensionDescriptionsForActivationEvent(activationEvent); - return this._activateExtensions(activateExtensions, 0); + return this._activateExtensions(activateExtensions, 0).then(() => { + this._alreadyActivatedEvents[activationEvent] = true; + }); } public activateById(extensionId: string): TPromise { From a0e4acb400f8386f7ecd2aac5aae4d3ab5131bfb Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sun, 21 May 2017 19:02:41 +0200 Subject: [PATCH 0727/1164] Simplify cursor events --- src/vs/editor/common/controller/cursor.ts | 7 +------ .../editor/common/controller/cursorEvents.ts | 20 ------------------- src/vs/monaco.d.ts | 20 ------------------- 3 files changed, 1 insertion(+), 46 deletions(-) diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 8dfcf3112e7..a4999cb942a 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -364,12 +364,9 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { } const e: ICursorPositionChangedEvent = { position: primaryPosition, - viewPosition: primaryViewPosition, secondaryPositions: secondaryPositions, - secondaryViewPositions: secondaryViewPositions, reason: reason, - source: source, - isInEditableRange: isInEditableRange + source: source }; this._eventEmitter.emit(CursorEventType.CursorPositionChanged, e); this._emit([new viewEvents.ViewCursorPositionChangedEvent(primaryViewPosition, secondaryViewPositions, isInEditableRange)]); @@ -386,9 +383,7 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { const e: ICursorSelectionChangedEvent = { selection: primarySelection, - viewSelection: primaryViewSelection, secondarySelections: secondarySelections, - secondaryViewSelections: secondaryViewSelections, source: source || 'keyboard', reason: reason }; diff --git a/src/vs/editor/common/controller/cursorEvents.ts b/src/vs/editor/common/controller/cursorEvents.ts index 01dc81093d4..1a1813499f9 100644 --- a/src/vs/editor/common/controller/cursorEvents.ts +++ b/src/vs/editor/common/controller/cursorEvents.ts @@ -57,18 +57,10 @@ export interface ICursorPositionChangedEvent { * Primary cursor's position. */ readonly position: Position; - /** - * Primary cursor's view position - */ - readonly viewPosition: Position; /** * Secondary cursors' position. */ readonly secondaryPositions: Position[]; - /** - * Secondary cursors' view position. - */ - readonly secondaryViewPositions: Position[]; /** * Reason. */ @@ -77,10 +69,6 @@ export interface ICursorPositionChangedEvent { * Source of the call that caused the event. */ readonly source: string; - /** - * Is the primary cursor in the editable range? - */ - readonly isInEditableRange: boolean; } /** * An event describing that the cursor selection has changed. @@ -90,18 +78,10 @@ export interface ICursorSelectionChangedEvent { * The primary selection. */ readonly selection: Selection; - /** - * The primary selection in view coordinates. - */ - readonly viewSelection: Selection; /** * The secondary selections. */ readonly secondarySelections: Selection[]; - /** - * The secondary selections in view coordinates. - */ - readonly secondaryViewSelections: Selection[]; /** * Source of the call that caused the event. */ diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 9c7b1c6cdfe..83b45948f09 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -2528,18 +2528,10 @@ declare module monaco.editor { * Primary cursor's position. */ readonly position: Position; - /** - * Primary cursor's view position - */ - readonly viewPosition: Position; /** * Secondary cursors' position. */ readonly secondaryPositions: Position[]; - /** - * Secondary cursors' view position. - */ - readonly secondaryViewPositions: Position[]; /** * Reason. */ @@ -2548,10 +2540,6 @@ declare module monaco.editor { * Source of the call that caused the event. */ readonly source: string; - /** - * Is the primary cursor in the editable range? - */ - readonly isInEditableRange: boolean; } /** @@ -2562,18 +2550,10 @@ declare module monaco.editor { * The primary selection. */ readonly selection: Selection; - /** - * The primary selection in view coordinates. - */ - readonly viewSelection: Selection; /** * The secondary selections. */ readonly secondarySelections: Selection[]; - /** - * The secondary selections in view coordinates. - */ - readonly secondaryViewSelections: Selection[]; /** * Source of the call that caused the event. */ From 4cecfd55399a41ea77421d879bde0635b205718b Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sun, 21 May 2017 19:05:50 +0200 Subject: [PATCH 0728/1164] Cursor position and selection change events are always emitted together --- src/vs/editor/common/controller/cursor.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index a4999cb942a..42125c4c86f 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -174,8 +174,7 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { const newViewSelections = this._cursors.getViewSelections(); if (Cursor._somethingChanged(oldSelections, oldViewSelections, newSelections, newViewSelections)) { - this._emitCursorPositionChanged(source, reason); - this._emitCursorSelectionChanged(source, reason); + this._emitStateChanged(source, reason); } } @@ -268,8 +267,7 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { this._cursors.dispose(); this._cursors = new CursorCollection(this.context); - this._emitCursorPositionChanged('model', CursorChangeReason.ContentFlush); - this._emitCursorSelectionChanged('model', CursorChangeReason.ContentFlush); + this._emitStateChanged('model', CursorChangeReason.ContentFlush); } else { const selectionsFromMarkers = this._cursors.readSelectionFromMarkers(); this.setStates('modelChange', CursorChangeReason.RecoverFromMarkers, CursorState.fromModelSelections(selectionsFromMarkers)); @@ -346,6 +344,11 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { // ----------------------------------------------------------------------------------------------------------- // ----- emitting events + private _emitStateChanged(source: string, reason: CursorChangeReason): void { + this._emitCursorPositionChanged(source, reason); + this._emitCursorSelectionChanged(source, reason); + } + private _emitCursorPositionChanged(source: string, reason: CursorChangeReason): void { const positions = this._cursors.getPositions(); const primaryPosition = positions[0]; @@ -503,9 +506,8 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { const newSelections = this._cursors.getSelections(); const newViewSelections = this._cursors.getViewSelections(); if (Cursor._somethingChanged(oldSelections, oldViewSelections, newSelections, newViewSelections)) { - this._emitCursorPositionChanged(source, cursorChangeReason); + this._emitStateChanged(source, cursorChangeReason); this._revealRange(RevealTarget.Primary, viewEvents.VerticalRevealType.Simple, true); - this._emitCursorSelectionChanged(source, cursorChangeReason); } } From 0e3d227c385ba9477501172efcbd9e45184d4a77 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sun, 21 May 2017 19:24:51 +0200 Subject: [PATCH 0729/1164] Cursor fires a single state change event containing both position & selection change details (#26730) --- src/vs/editor/common/commonCodeEditor.ts | 41 +++++++----- src/vs/editor/common/controller/cursor.ts | 67 ++++++++----------- .../editor/common/controller/cursorEvents.ts | 8 --- .../test/common/controller/cursor.test.ts | 28 +++----- 4 files changed, 60 insertions(+), 84 deletions(-) diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index edda01a3b78..4b2a542f673 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -12,7 +12,7 @@ import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiati import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IContextKey, IContextKeyServiceTarget, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { CommonEditorConfiguration } from 'vs/editor/common/config/commonEditorConfig'; -import { Cursor } from 'vs/editor/common/controller/cursor'; +import { Cursor, CursorStateChangedEvent } from 'vs/editor/common/controller/cursor'; import { CursorColumns, ICursors, CursorConfiguration } from 'vs/editor/common/controller/cursorCommon'; import { Position, IPosition } from 'vs/editor/common/core/position'; import { Range, IRange } from 'vs/editor/common/core/range'; @@ -26,7 +26,7 @@ import { IModelLanguageChangedEvent, IModelOptionsChangedEvent, TextModelEventType } from 'vs/editor/common/model/textModelEvents'; import * as editorOptions from 'vs/editor/common/config/editorOptions'; -import { CursorEventType, ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { CommonEditorRegistry } from "vs/editor/common/editorCommonExtensions"; import { VerticalRevealType } from "vs/editor/common/view/viewEvents"; @@ -904,25 +904,30 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo this._createView(); - this.listenersToRemove.push(this.cursor.addBulkListener((events) => { - for (let i = 0, len = events.length; i < len; i++) { - let eventType = events[i].type; - let e = events[i].data; + this.listenersToRemove.push(this.cursor.onDidChange((e: CursorStateChangedEvent) => { - switch (eventType) { - case CursorEventType.CursorPositionChanged: - this._onDidChangeCursorPosition.fire(e); - break; - - case CursorEventType.CursorSelectionChanged: - this._onDidChangeCursorSelection.fire(e); - break; - - default: - // console.warn("Unhandled cursor event: ", e); - } + let positions: Position[] = []; + for (let i = 0, len = e.selections.length; i < len; i++) { + positions[i] = e.selections[i].getPosition(); } + + const e1: ICursorPositionChangedEvent = { + position: positions[0], + secondaryPositions: positions.slice(1), + reason: e.reason, + source: e.source + }; + this._onDidChangeCursorPosition.fire(e1); + + const e2: ICursorSelectionChangedEvent = { + selection: e.selections[0], + secondarySelections: e.selections.slice(1), + source: e.source, + reason: e.reason + }; + this._onDidChangeCursorSelection.fire(e2); })); + } else { this.hasView = false; } diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 42125c4c86f..de0cbab7df3 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -7,8 +7,6 @@ import * as nls from 'vs/nls'; import * as strings from 'vs/base/common/strings'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { EventEmitter, BulkListenerCallback } from 'vs/base/common/eventEmitter'; -import { IDisposable } from 'vs/base/common/lifecycle'; import { CursorCollection } from 'vs/editor/common/controller/cursorCollection'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; @@ -19,9 +17,10 @@ import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageCo import { DeleteOperations } from 'vs/editor/common/controller/cursorDeleteOperations'; import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations'; import { TextModelEventType, ModelRawContentChangedEvent, RawContentChangedType } from 'vs/editor/common/model/textModelEvents'; -import { CursorEventType, CursorChangeReason, ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; import { IViewModel } from "vs/editor/common/viewModel/viewModel"; import * as viewEvents from 'vs/editor/common/view/viewEvents'; +import Event, { Emitter } from 'vs/base/common/event'; function containsLineMappingChanged(events: viewEvents.ViewEvent[]): boolean { for (let i = 0, len = events.length; i < len; i++) { @@ -32,19 +31,33 @@ function containsLineMappingChanged(events: viewEvents.ViewEvent[]): boolean { return false; } +export class CursorStateChangedEvent { + /** + * The new selections. + * The primary selection is always at index 0. + */ + readonly selections: Selection[]; + /** + * Source of the call that caused the event. + */ + readonly source: string; + /** + * Reason. + */ + readonly reason: CursorChangeReason; + + constructor(selections: Selection[], source: string, reason: CursorChangeReason) { + this.selections = selections; + this.source = source; + this.reason = reason; + } +} + export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { - public onDidChangePosition(listener: (e: ICursorPositionChangedEvent) => void): IDisposable { - return this._eventEmitter.addListener(CursorEventType.CursorPositionChanged, listener); - } - public onDidChangeSelection(listener: (e: ICursorSelectionChangedEvent) => void): IDisposable { - return this._eventEmitter.addListener(CursorEventType.CursorSelectionChanged, listener); - } - public addBulkListener(listener: BulkListenerCallback): IDisposable { - return this._eventEmitter.addBulkListener(listener); - } + private readonly _onDidChange: Emitter = this._register(new Emitter()); + public readonly onDidChange: Event = this._onDidChange.event; - private readonly _eventEmitter: EventEmitter; private readonly _configuration: editorCommon.IConfiguration; private readonly _model: editorCommon.IModel; private readonly _viewModel: IViewModel; @@ -57,7 +70,6 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { constructor(configuration: editorCommon.IConfiguration, model: editorCommon.IModel, viewModel: IViewModel) { super(); - this._eventEmitter = this._register(new EventEmitter()); this._configuration = configuration; this._model = model; this._viewModel = viewModel; @@ -345,14 +357,10 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { // ----- emitting events private _emitStateChanged(source: string, reason: CursorChangeReason): void { - this._emitCursorPositionChanged(source, reason); - this._emitCursorSelectionChanged(source, reason); - } + source = source || 'keyboard'; - private _emitCursorPositionChanged(source: string, reason: CursorChangeReason): void { const positions = this._cursors.getPositions(); const primaryPosition = positions[0]; - const secondaryPositions = positions.slice(1); const viewPositions = this._cursors.getViewPositions(); const primaryViewPosition = viewPositions[0]; @@ -365,32 +373,15 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { isInEditableRange = false; } } - const e: ICursorPositionChangedEvent = { - position: primaryPosition, - secondaryPositions: secondaryPositions, - reason: reason, - source: source - }; - this._eventEmitter.emit(CursorEventType.CursorPositionChanged, e); - this._emit([new viewEvents.ViewCursorPositionChangedEvent(primaryViewPosition, secondaryViewPositions, isInEditableRange)]); - } - private _emitCursorSelectionChanged(source: string, reason: CursorChangeReason): void { const selections = this._cursors.getSelections(); - const primarySelection = selections[0]; - const secondarySelections = selections.slice(1); const viewSelections = this._cursors.getViewSelections(); const primaryViewSelection = viewSelections[0]; const secondaryViewSelections = viewSelections.slice(1); - const e: ICursorSelectionChangedEvent = { - selection: primarySelection, - secondarySelections: secondarySelections, - source: source || 'keyboard', - reason: reason - }; - this._eventEmitter.emit(CursorEventType.CursorSelectionChanged, e); + this._onDidChange.fire(new CursorStateChangedEvent(selections, source, reason)); + this._emit([new viewEvents.ViewCursorPositionChangedEvent(primaryViewPosition, secondaryViewPositions, isInEditableRange)]); this._emit([new viewEvents.ViewCursorSelectionChangedEvent(primaryViewSelection, secondaryViewSelections)]); } diff --git a/src/vs/editor/common/controller/cursorEvents.ts b/src/vs/editor/common/controller/cursorEvents.ts index 1a1813499f9..9c7b9789445 100644 --- a/src/vs/editor/common/controller/cursorEvents.ts +++ b/src/vs/editor/common/controller/cursorEvents.ts @@ -8,14 +8,6 @@ import { Position } from 'vs/editor/common/core/position'; import { Selection } from 'vs/editor/common/core/selection'; -/** - * @internal - */ -export const CursorEventType = { - CursorPositionChanged: 'positionChanged', - CursorSelectionChanged: 'selectionChanged', -}; - /** * Describes the reason the cursor has changed its position. */ diff --git a/src/vs/editor/test/common/controller/cursor.test.ts b/src/vs/editor/test/common/controller/cursor.test.ts index 69351a8a81d..3eb3703c7c7 100644 --- a/src/vs/editor/test/common/controller/cursor.test.ts +++ b/src/vs/editor/test/common/controller/cursor.test.ts @@ -5,7 +5,7 @@ 'use strict'; import * as assert from 'assert'; -import { Cursor } from 'vs/editor/common/controller/cursor'; +import { Cursor, CursorStateChangedEvent } from 'vs/editor/common/controller/cursor'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; @@ -22,7 +22,6 @@ import { TestConfiguration } from 'vs/editor/test/common/mocks/testConfiguration import { MockMode } from 'vs/editor/test/common/mocks/mockMode'; import { LanguageIdentifier } from 'vs/editor/common/modes'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; -import { ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { CoreNavigationCommands, CoreEditingCommands } from 'vs/editor/common/controller/coreCommands'; import { withMockCodeEditor } from "vs/editor/test/common/mocks/mockCodeEditor"; import { TextModel } from "vs/editor/common/model/textModel"; @@ -642,10 +641,7 @@ suite('Editor Controller - Cursor', () => { // --------- eventing test('no move doesn\'t trigger event', () => { - thisCursor.onDidChangePosition((e) => { - assert.ok(false, 'was not expecting event'); - }); - thisCursor.onDidChangeSelection((e) => { + thisCursor.onDidChange((e) => { assert.ok(false, 'was not expecting event'); }); moveTo(thisCursor, 1, 1); @@ -653,30 +649,22 @@ suite('Editor Controller - Cursor', () => { test('move eventing', () => { let events = 0; - thisCursor.onDidChangePosition((e: ICursorPositionChangedEvent) => { + thisCursor.onDidChange((e: CursorStateChangedEvent) => { events++; - assert.deepEqual(e.position, new Position(1, 2)); - }); - thisCursor.onDidChangeSelection((e: ICursorSelectionChangedEvent) => { - events++; - assert.deepEqual(e.selection, new Selection(1, 2, 1, 2)); + assert.deepEqual(e.selections, [new Selection(1, 2, 1, 2)]); }); moveTo(thisCursor, 1, 2); - assert.equal(events, 2, 'receives 2 events'); + assert.equal(events, 1, 'receives 1 event'); }); test('move in selection mode eventing', () => { let events = 0; - thisCursor.onDidChangePosition((e: ICursorPositionChangedEvent) => { + thisCursor.onDidChange((e: CursorStateChangedEvent) => { events++; - assert.deepEqual(e.position, new Position(1, 2)); - }); - thisCursor.onDidChangeSelection((e: ICursorSelectionChangedEvent) => { - events++; - assert.deepEqual(e.selection, new Selection(1, 1, 1, 2)); + assert.deepEqual(e.selections, [new Selection(1, 1, 1, 2)]); }); moveTo(thisCursor, 1, 2, true); - assert.equal(events, 2, 'receives 2 events'); + assert.equal(events, 1, 'receives 1 event'); }); // --------- state save & restore From 7d098ad4e15859b2a8b870f9ce32ff800f63c287 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sun, 21 May 2017 20:37:07 +0200 Subject: [PATCH 0730/1164] Merge view cursor position & selection changed events into a single event (#26730) --- .../editor/browser/controller/mouseHandler.ts | 8 +-- .../browser/controller/textAreaHandler.ts | 4 +- .../currentLineHighlight.ts | 23 ++++--- .../currentLineMarginHighlight.ts | 10 ++- .../viewParts/lineNumbers/lineNumbers.ts | 5 +- .../overviewRuler/decorationsOverviewRuler.ts | 8 ++- .../viewParts/selections/selections.ts | 5 +- .../viewParts/viewCursors/viewCursors.ts | 31 +++++---- src/vs/editor/common/controller/cursor.ts | 13 +--- src/vs/editor/common/view/viewEvents.ts | 69 ++++++------------- .../common/viewModel/viewEventHandler.ts | 15 +--- 11 files changed, 81 insertions(+), 110 deletions(-) diff --git a/src/vs/editor/browser/controller/mouseHandler.ts b/src/vs/editor/browser/controller/mouseHandler.ts index c88d807bc53..cc44acdd62d 100644 --- a/src/vs/editor/browser/controller/mouseHandler.ts +++ b/src/vs/editor/browser/controller/mouseHandler.ts @@ -134,8 +134,8 @@ export class MouseHandler extends ViewEventHandler { } // --- begin event handlers - public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { - this._mouseDownOperation.onCursorSelectionChanged(e); + public onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): boolean { + this._mouseDownOperation.onCursorStateChanged(e); return false; } private _isFocused = false; @@ -411,8 +411,8 @@ class MouseDownOperation extends Disposable { }, 10); } - public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): void { - this._currentSelection = e.selection; + public onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): void { + this._currentSelection = e.selections[0]; } private _getPositionOutsideEditor(e: EditorMouseEvent): MouseTarget { diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index f5dab069f58..8c8b4ae5b83 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -292,8 +292,8 @@ export class TextAreaHandler extends ViewPart { return true; } - public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { - this._selections = [e.selection].concat(e.secondarySelections); + public onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): boolean { + this._selections = e.selections.slice(0); return true; } public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean { diff --git a/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts b/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts index cdc9c97ff25..58e4ee7b40c 100644 --- a/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts +++ b/src/vs/editor/browser/viewParts/currentLineHighlight/currentLineHighlight.ts @@ -63,25 +63,28 @@ export class CurrentLineHighlightOverlay extends DynamicViewOverlay { } return true; } - public onCursorPositionChanged(e: viewEvents.ViewCursorPositionChangedEvent): boolean { + public onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): boolean { let hasChanged = false; + if (this._primaryCursorIsInEditableRange !== e.isInEditableRange) { this._primaryCursorIsInEditableRange = e.isInEditableRange; hasChanged = true; } - if (this._primaryCursorLineNumber !== e.position.lineNumber) { - this._primaryCursorLineNumber = e.position.lineNumber; + + const primaryCursorLineNumber = e.selections[0].positionLineNumber; + if (this._primaryCursorLineNumber !== primaryCursorLineNumber) { + this._primaryCursorLineNumber = primaryCursorLineNumber; hasChanged = true; } - return hasChanged; - } - public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { - let isEmpty = e.selection.isEmpty(); - if (this._selectionIsEmpty !== isEmpty) { - this._selectionIsEmpty = isEmpty; + + const selectionIsEmpty = e.selections[0].isEmpty(); + if (this._selectionIsEmpty !== selectionIsEmpty) { + this._selectionIsEmpty = selectionIsEmpty; + hasChanged = true; return true; } - return false; + + return hasChanged; } public onFlushed(e: viewEvents.ViewFlushedEvent): boolean { return true; diff --git a/src/vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight.ts b/src/vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight.ts index 2e0f6dbdb15..38d980922e9 100644 --- a/src/vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight.ts +++ b/src/vs/editor/browser/viewParts/currentLineMarginHighlight/currentLineMarginHighlight.ts @@ -54,16 +54,20 @@ export class CurrentLineMarginHighlightOverlay extends DynamicViewOverlay { } return true; } - public onCursorPositionChanged(e: viewEvents.ViewCursorPositionChangedEvent): boolean { + public onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): boolean { let hasChanged = false; + if (this._primaryCursorIsInEditableRange !== e.isInEditableRange) { this._primaryCursorIsInEditableRange = e.isInEditableRange; hasChanged = true; } - if (this._primaryCursorLineNumber !== e.position.lineNumber) { - this._primaryCursorLineNumber = e.position.lineNumber; + + const primaryCursorLineNumber = e.selections[0].positionLineNumber; + if (this._primaryCursorLineNumber !== primaryCursorLineNumber) { + this._primaryCursorLineNumber = primaryCursorLineNumber; hasChanged = true; } + return hasChanged; } public onFlushed(e: viewEvents.ViewFlushedEvent): boolean { diff --git a/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts b/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts index 10db29cb726..f22cabdff44 100644 --- a/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts +++ b/src/vs/editor/browser/viewParts/lineNumbers/lineNumbers.ts @@ -65,8 +65,9 @@ export class LineNumbersOverlay extends DynamicViewOverlay { this._readConfig(); return true; } - public onCursorPositionChanged(e: viewEvents.ViewCursorPositionChangedEvent): boolean { - this._lastCursorModelPosition = this._context.model.coordinatesConverter.convertViewPositionToModelPosition(e.position); + public onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): boolean { + const primaryViewPosition = e.selections[0].getPosition(); + this._lastCursorModelPosition = this._context.model.coordinatesConverter.convertViewPositionToModelPosition(primaryViewPosition); if (this._renderRelativeLineNumbers) { return true; diff --git a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts index c64a856ba72..6f9f3e03b55 100644 --- a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts +++ b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts @@ -122,10 +122,12 @@ export class DecorationsOverviewRuler extends ViewPart { return true; } - public onCursorPositionChanged(e: viewEvents.ViewCursorPositionChangedEvent): boolean { + public onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): boolean { this._shouldUpdateCursorPosition = true; - this._cursorPositions = [e.position]; - this._cursorPositions = this._cursorPositions.concat(e.secondaryPositions); + this._cursorPositions = []; + for (let i = 0, len = e.selections.length; i < len; i++) { + this._cursorPositions[i] = e.selections[i].getPosition(); + } return true; } diff --git a/src/vs/editor/browser/viewParts/selections/selections.ts b/src/vs/editor/browser/viewParts/selections/selections.ts index a7939523df3..9d8e0168f25 100644 --- a/src/vs/editor/browser/viewParts/selections/selections.ts +++ b/src/vs/editor/browser/viewParts/selections/selections.ts @@ -110,9 +110,8 @@ export class SelectionsOverlay extends DynamicViewOverlay { } return true; } - public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { - this._selections = [e.selection]; - this._selections = this._selections.concat(e.secondarySelections); + public onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): boolean { + this._selections = e.selections.slice(0); return true; } public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean { diff --git a/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts b/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts index 4617e931f31..566424aa72f 100644 --- a/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts +++ b/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts @@ -99,41 +99,48 @@ export class ViewCursors extends ViewPart { } return true; } - public onCursorPositionChanged(e: viewEvents.ViewCursorPositionChangedEvent): boolean { - this._primaryCursor.onCursorPositionChanged(e.position, e.isInEditableRange); + private _onCursorPositionChanged(position: Position, secondaryPositions: Position[], isInEditableRange: boolean): void { + this._primaryCursor.onCursorPositionChanged(position, isInEditableRange); this._updateBlinking(); - if (this._secondaryCursors.length < e.secondaryPositions.length) { + if (this._secondaryCursors.length < secondaryPositions.length) { // Create new cursors - let addCnt = e.secondaryPositions.length - this._secondaryCursors.length; + let addCnt = secondaryPositions.length - this._secondaryCursors.length; for (let i = 0; i < addCnt; i++) { let newCursor = new ViewCursor(this._context, true); this._domNode.domNode.insertBefore(newCursor.getDomNode().domNode, this._primaryCursor.getDomNode().domNode.nextSibling); this._secondaryCursors.push(newCursor); } - } else if (this._secondaryCursors.length > e.secondaryPositions.length) { + } else if (this._secondaryCursors.length > secondaryPositions.length) { // Remove some cursors - let removeCnt = this._secondaryCursors.length - e.secondaryPositions.length; + let removeCnt = this._secondaryCursors.length - secondaryPositions.length; for (let i = 0; i < removeCnt; i++) { this._domNode.removeChild(this._secondaryCursors[0].getDomNode()); this._secondaryCursors.splice(0, 1); } } - for (let i = 0; i < e.secondaryPositions.length; i++) { - this._secondaryCursors[i].onCursorPositionChanged(e.secondaryPositions[i], e.isInEditableRange); + for (let i = 0; i < secondaryPositions.length; i++) { + this._secondaryCursors[i].onCursorPositionChanged(secondaryPositions[i], isInEditableRange); } - return true; } - public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { - let selectionIsEmpty = e.selection.isEmpty(); + public onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): boolean { + let positions: Position[] = []; + for (let i = 0, len = e.selections.length; i < len; i++) { + positions[i] = e.selections[i].getPosition(); + } + this._onCursorPositionChanged(positions[0], positions.slice(1), e.isInEditableRange); + + const selectionIsEmpty = e.selections[0].isEmpty(); if (this._selectionIsEmpty !== selectionIsEmpty) { this._selectionIsEmpty = selectionIsEmpty; this._updateDomClassName(); } - return false; + + return true; } + public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean { // true for inline decorations that can end up relayouting text return true; diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index de0cbab7df3..5f35c0942dc 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -360,29 +360,20 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { source = source || 'keyboard'; const positions = this._cursors.getPositions(); - const primaryPosition = positions[0]; - - const viewPositions = this._cursors.getViewPositions(); - const primaryViewPosition = viewPositions[0]; - const secondaryViewPositions = viewPositions.slice(1); let isInEditableRange: boolean = true; if (this._model.hasEditableRange()) { const editableRange = this._model.getEditableRange(); - if (!editableRange.containsPosition(primaryPosition)) { + if (!editableRange.containsPosition(positions[0])) { isInEditableRange = false; } } const selections = this._cursors.getSelections(); - const viewSelections = this._cursors.getViewSelections(); - const primaryViewSelection = viewSelections[0]; - const secondaryViewSelections = viewSelections.slice(1); this._onDidChange.fire(new CursorStateChangedEvent(selections, source, reason)); - this._emit([new viewEvents.ViewCursorPositionChangedEvent(primaryViewPosition, secondaryViewPositions, isInEditableRange)]); - this._emit([new viewEvents.ViewCursorSelectionChangedEvent(primaryViewSelection, secondaryViewSelections)]); + this._emit([new viewEvents.ViewCursorStateChangedEvent(viewSelections, isInEditableRange)]); } private _revealRange(revealTarget: RevealTarget, verticalType: viewEvents.VerticalRevealType, revealHorizontal: boolean): void { diff --git a/src/vs/editor/common/view/viewEvents.ts b/src/vs/editor/common/view/viewEvents.ts index d100a0ca0ec..e6388d47dd4 100644 --- a/src/vs/editor/common/view/viewEvents.ts +++ b/src/vs/editor/common/view/viewEvents.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ScrollEvent } from 'vs/base/common/scrollable'; @@ -14,21 +13,20 @@ import { IDisposable, Disposable } from "vs/base/common/lifecycle"; export const enum ViewEventType { ViewConfigurationChanged = 1, - ViewCursorPositionChanged = 2, - ViewCursorSelectionChanged = 3, - ViewDecorationsChanged = 4, - ViewFlushed = 5, - ViewFocusChanged = 6, - ViewLineMappingChanged = 7, - ViewLinesChanged = 8, - ViewLinesDeleted = 9, - ViewLinesInserted = 10, - ViewRevealRangeRequest = 11, - ViewScrollChanged = 12, - ViewTokensChanged = 13, - ViewTokensColorsChanged = 14, - ViewZonesChanged = 15, - ViewThemeChanged = 16 + ViewCursorStateChanged = 2, + ViewDecorationsChanged = 3, + ViewFlushed = 4, + ViewFocusChanged = 5, + ViewLineMappingChanged = 6, + ViewLinesChanged = 7, + ViewLinesDeleted = 8, + ViewLinesInserted = 9, + ViewRevealRangeRequest = 10, + ViewScrollChanged = 11, + ViewTokensChanged = 12, + ViewTokensColorsChanged = 13, + ViewZonesChanged = 14, + ViewThemeChanged = 15 } export class ViewConfigurationChangedEvent { @@ -60,49 +58,25 @@ export class ViewConfigurationChangedEvent { } } -export class ViewCursorPositionChangedEvent { +export class ViewCursorStateChangedEvent { - public readonly type = ViewEventType.ViewCursorPositionChanged; + public readonly type = ViewEventType.ViewCursorStateChanged; /** - * Primary cursor's position. + * The primary selection is always at index 0. */ - public readonly position: Position; - /** - * Secondary cursors' position. - */ - public readonly secondaryPositions: Position[]; + public readonly selections: Selection[]; /** * Is the primary cursor in the editable range? */ public readonly isInEditableRange: boolean; - constructor(position: Position, secondaryPositions: Position[], isInEditableRange: boolean) { - this.position = position; - this.secondaryPositions = secondaryPositions; + constructor(selections: Selection[], isInEditableRange: boolean) { + this.selections = selections; this.isInEditableRange = isInEditableRange; } } -export class ViewCursorSelectionChangedEvent { - - public readonly type = ViewEventType.ViewCursorSelectionChanged; - - /** - * The primary selection. - */ - public readonly selection: Selection; - /** - * The secondary selections. - */ - public readonly secondarySelections: Selection[]; - - constructor(selection: Selection, secondarySelections: Selection[]) { - this.selection = selection; - this.secondarySelections = secondarySelections; - } -} - export class ViewDecorationsChangedEvent { public readonly type = ViewEventType.ViewDecorationsChanged; @@ -304,8 +278,7 @@ export class ViewZonesChangedEvent { export type ViewEvent = ( ViewConfigurationChangedEvent - | ViewCursorPositionChangedEvent - | ViewCursorSelectionChangedEvent + | ViewCursorStateChangedEvent | ViewDecorationsChangedEvent | ViewFlushedEvent | ViewFocusChangedEvent diff --git a/src/vs/editor/common/viewModel/viewEventHandler.ts b/src/vs/editor/common/viewModel/viewEventHandler.ts index 6696cf63894..a3e03e9005d 100644 --- a/src/vs/editor/common/viewModel/viewEventHandler.ts +++ b/src/vs/editor/common/viewModel/viewEventHandler.ts @@ -37,10 +37,7 @@ export class ViewEventHandler extends Disposable { public onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean { return false; } - public onCursorPositionChanged(e: viewEvents.ViewCursorPositionChangedEvent): boolean { - return false; - } - public onCursorSelectionChanged(e: viewEvents.ViewCursorSelectionChangedEvent): boolean { + public onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): boolean { return false; } public onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean { @@ -100,14 +97,8 @@ export class ViewEventHandler extends Disposable { } break; - case viewEvents.ViewEventType.ViewCursorPositionChanged: - if (this.onCursorPositionChanged(e)) { - shouldRender = true; - } - break; - - case viewEvents.ViewEventType.ViewCursorSelectionChanged: - if (this.onCursorSelectionChanged(e)) { + case viewEvents.ViewEventType.ViewCursorStateChanged: + if (this.onCursorStateChanged(e)) { shouldRender = true; } break; From 1f74c219c38cea8b44a6773e69c9e73dfcdc3b91 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Sun, 21 May 2017 18:35:03 -0700 Subject: [PATCH 0731/1164] Fix #27034 - special case search string '--' --- src/vs/workbench/services/search/node/ripgrepTextSearch.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/vs/workbench/services/search/node/ripgrepTextSearch.ts b/src/vs/workbench/services/search/node/ripgrepTextSearch.ts index d70ff8bc2e2..50cd95218a9 100644 --- a/src/vs/workbench/services/search/node/ripgrepTextSearch.ts +++ b/src/vs/workbench/services/search/node/ripgrepTextSearch.ts @@ -428,6 +428,13 @@ function getRgArgs(config: IRawSearch): { args: string[], siblingClauses: glob.I args.push('--encoding', encoding.toCanonicalName(config.fileEncoding)); } + // Ripgrep handles -- as a -- arg separator. Only --. + // - is ok, --- is ok, --some-flag is handled as query text. Need to special case. + if (config.contentPattern.pattern === '--') { + config.contentPattern.isRegExp = true; + config.contentPattern.pattern = '\\-\\-'; + } + let searchPatternAfterDoubleDashes: string; if (config.contentPattern.isWordMatch) { const regexp = strings.createRegExp(config.contentPattern.pattern, config.contentPattern.isRegExp, { wholeWord: config.contentPattern.isWordMatch }); From 3382a888a9493d6c8ebabdaa6b312fe15952597a Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 21 May 2017 20:04:48 -0700 Subject: [PATCH 0732/1164] Remove node-pty.d.ts --- src/typings/node-pty.d.ts | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 src/typings/node-pty.d.ts diff --git a/src/typings/node-pty.d.ts b/src/typings/node-pty.d.ts deleted file mode 100644 index ef417f1156e..00000000000 --- a/src/typings/node-pty.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -declare module 'node-pty' { - export function fork(file: string, args: string[], options: any): Terminal; - export function spawn(file: string, args: string[], options: any): Terminal; - export function createTerminal(file: string, args: string[], options: any): Terminal; - - export interface Terminal { - /** - * The title of the active process. - */ - process: string; - - on(event: string, callback: (data: any) => void): void; - - resize(columns: number, rows: number): void; - - write(data: string): void; - } -} \ No newline at end of file From 06e162bb2913ce6dd394bd01c7dc4be9a7aa5991 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sun, 21 May 2017 20:16:06 -0700 Subject: [PATCH 0733/1164] node-pty@0.6.6 --- npm-shrinkwrap.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 35505b635ab..d71aac6cdd1 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -338,9 +338,9 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" }, "node-pty": { - "version": "0.6.5", - "from": "node-pty@0.6.5", - "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-0.6.5.tgz", + "version": "0.6.6", + "from": "node-pty@0.6.6", + "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-0.6.6.tgz", "dependencies": { "nan": { "version": "2.5.0", diff --git a/package.json b/package.json index 817d3162edb..9a92e4ce8d0 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "jschardet": "^1.4.2", "minimist": "1.2.0", "native-keymap": "1.2.4", - "node-pty": "0.6.5", + "node-pty": "0.6.6", "semver": "4.3.6", "v8-profiler": "jrieken/v8-profiler#vscode", "vscode-debugprotocol": "1.19.0", From 7206748b49926b69c36a35fd506dbbc74c8151f0 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 22 May 2017 07:42:25 +0200 Subject: [PATCH 0734/1164] Theming: Allow to change the colour of warning/error squiggles (fixes #9819) --- .../editor/browser/widget/codeEditorWidget.ts | 51 ++++++++++++++++++- src/vs/editor/browser/widget/media/editor.css | 12 +---- .../editor/common/view/editorColorRegistry.ts | 10 ++-- 3 files changed, 56 insertions(+), 17 deletions(-) diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index ae2b1ad3ae9..103e0f09568 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -5,7 +5,6 @@ 'use strict'; import 'vs/css!./media/editor'; -import 'vs/editor/common/view/editorColorRegistry'; // initialze editor theming partcicpants import 'vs/css!./media/tokens'; import { onUnexpectedError } from 'vs/base/common/errors'; import { TPromise } from 'vs/base/common/winjs.base'; @@ -31,7 +30,10 @@ import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IPosition } from 'vs/editor/common/core/position'; import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; import { CoreEditorCommand } from 'vs/editor/common/controller/coreCommands'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { isChrome } from "vs/base/browser/browser"; +import URI from "vs/base/common/uri"; +import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { editorErrorForeground, editorErrorBorder, editorWarningForeground, editorWarningBorder } from "vs/editor/common/view/editorColorRegistry"; export abstract class CodeEditorWidget extends CommonCodeEditor implements editorBrowser.ICodeEditor { @@ -545,3 +547,48 @@ class CodeEditorWidgetFocusTracker extends Disposable { return this._hasFocus; } } + +const errorIconPath = URI.parse(require.toUrl('vs/editor/browser/widget/media/red-squiggly.svg')).fsPath; +const warningIconPath = URI.parse(require.toUrl('vs/editor/browser/widget/media/green-squiggly.svg')).fsPath; +registerThemingParticipant((theme, collector) => { + + // webkit-mask only supported in chrome + if (isChrome) { + let errorForeground = theme.getColor(editorErrorForeground); + if (errorForeground) { + collector.addRule(`.monaco-editor .redsquiggly { background-color: ${errorForeground}; -webkit-mask: url("${errorIconPath}") repeat-x bottom left; }`); + } + + let errorBorderColor = theme.getColor(editorErrorBorder); + if (errorBorderColor) { + collector.addRule(`.monaco-editor .redsquiggly { border-bottom: 4px double ${errorBorderColor}; -webkit-mask: none; background: none; }`); + } + + let warningForeground = theme.getColor(editorWarningForeground); + if (warningForeground) { + collector.addRule(`.monaco-editor .greensquiggly { background-color: ${warningForeground}; -webkit-mask: url("${warningIconPath}") repeat-x bottom left; }`); + } + + let warningBorderColor = theme.getColor(editorWarningBorder); + if (warningBorderColor) { + collector.addRule(`.monaco-editor .greensquiggly { border-bottom: 4px double ${warningBorderColor}; -webkit-mask: none; background: none; }`); + } + } + + // Any other browser + else { + let errorBorderColor = theme.getColor(editorErrorBorder); + if (errorBorderColor) { + collector.addRule(`.monaco-editor .redsquiggly { border-bottom: 4px double ${errorBorderColor}; }`); + } else { + collector.addRule(`.monaco-editor .redsquiggly { background: url("${errorIconPath}") repeat-x bottom left; }`); + } + + let warningBorderColor = theme.getColor(editorWarningBorder); + if (warningBorderColor) { + collector.addRule(`.monaco-editor .greensquiggly { border-bottom: 4px double ${warningBorderColor}; }`); + } else { + collector.addRule(`.monaco-editor .greensquiggly { background: url("${warningIconPath}") repeat-x bottom left; }`); + } + } +}); \ No newline at end of file diff --git a/src/vs/editor/browser/widget/media/editor.css b/src/vs/editor/browser/widget/media/editor.css index 9f2a59b392a..ca070ab9a21 100644 --- a/src/vs/editor/browser/widget/media/editor.css +++ b/src/vs/editor/browser/widget/media/editor.css @@ -40,14 +40,4 @@ .monaco-editor .view-overlays { position: absolute; top: 0; -} - -/* -------------------- Squigglies -------------------- */ - -.monaco-editor.vs .redsquiggly, -.monaco-editor.vs-dark .redsquiggly { background: url("red-squiggly.svg") repeat-x bottom left; } -.monaco-editor.hc-black .redsquiggly { border-bottom: 4px double #E47777; opacity: 0.8; } - -.monaco-editor.vs .greensquiggly, -.monaco-editor.vs-dark .greensquiggly { background: url("green-squiggly.svg") repeat-x bottom left; } -.monaco-editor.hc-black .greensquiggly { border-bottom: 4px double #71B771; opacity: 0.8; } +} \ No newline at end of file diff --git a/src/vs/editor/common/view/editorColorRegistry.ts b/src/vs/editor/common/view/editorColorRegistry.ts index 223e503e53a..9b72bd4af44 100644 --- a/src/vs/editor/common/view/editorColorRegistry.ts +++ b/src/vs/editor/common/view/editorColorRegistry.ts @@ -29,10 +29,14 @@ export const editorOverviewRulerBorder = registerColor('editorOverviewRuler.bord export const editorGutter = registerColor('editorGutter.background', { dark: editorBackground, light: editorBackground, hc: editorBackground }, nls.localize('editorGutter', 'Background color of the editor gutter. The gutter contains the glyph margins and the line numbers.')); +export const editorErrorForeground = registerColor('editorError.foreground', { dark: '#FF0000', light: '#FF0000', hc: null }, nls.localize('errorForeground', 'Foreground color of error squigglies in the editor.')); +export const editorErrorBorder = registerColor('editorError.border', { dark: null, light: null, hc: Color.fromHex('#E47777').transparent(0.8) }, nls.localize('errorBorder', 'Border color of error squigglies in the editor.')); + +export const editorWarningForeground = registerColor('editorWarning.foreground', { dark: '#008000', light: '#008000', hc: null }, nls.localize('warningForeground', 'Foreground color of warning squigglies in the editor.')); +export const editorWarningBorder = registerColor('editorWarning.border', { dark: null, light: null, hc: Color.fromHex('#71B771').transparent(0.8) }, nls.localize('warningBorder', 'Border color of warning squigglies in the editor.')); // contains all color rules that used to defined in editor/browser/widget/editor.css registerThemingParticipant((theme, collector) => { - let background = theme.getColor(editorBackground); if (background) { collector.addRule(`.monaco-editor, .monaco-editor .monaco-editor-background, .monaco-editor .inputarea.ime-input { background-color: ${background}; }`); @@ -60,6 +64,4 @@ registerThemingParticipant((theme, collector) => { if (invisibles) { collector.addRule(`.vs-whitespace { color: ${invisibles} !important; }`); } -}); - - +}); \ No newline at end of file From 2dd19f6ecad4a2dc1fbc8ed92fb9e72bb4da00f6 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 22 May 2017 07:46:57 +0200 Subject: [PATCH 0735/1164] :lipstick: --- src/vs/workbench/electron-browser/workbench.ts | 14 +++++--------- .../parts/debug/browser/debugActionItems.ts | 17 +++++++---------- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index f14318b949a..86c445e811c 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -384,17 +384,13 @@ export class Workbench implements IPartService { } private createGlobalActions(): void { - - // Developer related actions - const developerCategory = localize('developer', "Developer"); - const workbenchActionsRegistry = Registry.as(Extensions.WorkbenchActions); const isDeveloping = !this.environmentService.isBuilt || this.environmentService.isExtensionDevelopment; - workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ReloadWindowAction, ReloadWindowAction.ID, ReloadWindowAction.LABEL, isDeveloping ? { primary: KeyMod.CtrlCmd | KeyCode.KEY_R } : void 0), 'Reload Window'); - workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleDevToolsAction, ToggleDevToolsAction.ID, ToggleDevToolsAction.LABEL, isDeveloping ? { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_I, mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_I } } : void 0), 'Developer: Toggle Developer Tools', developerCategory); - // Action registered here to prevent a keybinding conflict with reload window - const fileCategory = localize('file', "File"); - workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenRecentAction, OpenRecentAction.ID, OpenRecentAction.LABEL, { primary: isDeveloping ? null : KeyMod.CtrlCmd | KeyCode.KEY_R, mac: { primary: KeyMod.WinCtrl | KeyCode.KEY_R } }), 'File: Open Recent', fileCategory); + // Actions registered here to adjust for developing vs built workbench + const workbenchActionsRegistry = Registry.as(Extensions.WorkbenchActions); + workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ReloadWindowAction, ReloadWindowAction.ID, ReloadWindowAction.LABEL, isDeveloping ? { primary: KeyMod.CtrlCmd | KeyCode.KEY_R } : void 0), 'Reload Window'); + workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ToggleDevToolsAction, ToggleDevToolsAction.ID, ToggleDevToolsAction.LABEL, isDeveloping ? { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_I, mac: { primary: KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.KEY_I } } : void 0), 'Developer: Toggle Developer Tools', localize('developer', "Developer")); + workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenRecentAction, OpenRecentAction.ID, OpenRecentAction.LABEL, { primary: isDeveloping ? null : KeyMod.CtrlCmd | KeyCode.KEY_R, mac: { primary: KeyMod.WinCtrl | KeyCode.KEY_R } }), 'File: Open Recent', localize('file', "File")); } private resolveEditorsToOpen(): TPromise { diff --git a/src/vs/workbench/parts/debug/browser/debugActionItems.ts b/src/vs/workbench/parts/debug/browser/debugActionItems.ts index b81283f1ac1..8f83bebe2da 100644 --- a/src/vs/workbench/parts/debug/browser/debugActionItems.ts +++ b/src/vs/workbench/parts/debug/browser/debugActionItems.ts @@ -10,15 +10,16 @@ import { IAction, IActionRunner } from 'vs/base/common/actions'; import { KeyCode } from 'vs/base/common/keyCodes'; import * as dom from 'vs/base/browser/dom'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { SelectBox, ISelectBoxStyles } from 'vs/base/browser/ui/selectBox/selectBox'; +import { SelectBox } from 'vs/base/browser/ui/selectBox/selectBox'; import { SelectActionItem, IActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { EventEmitter } from 'vs/base/common/eventEmitter'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IDebugService } from 'vs/workbench/parts/debug/common/debug'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { attachSelectBoxStyler } from 'vs/platform/theme/common/styler'; +import { attachSelectBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; +import { selectBorder } from "vs/platform/theme/common/colorRegistry"; const $ = dom.$; @@ -115,14 +116,10 @@ export class StartDebugActionItem extends EventEmitter implements IActionItem { event.stopPropagation(); } })); - this.toDispose.push(attachSelectBoxStyler({ - style: (colors: ISelectBoxStyles) => { - if (colors.selectBorder) { - this.container.style.borderColor = colors.selectBorder.toString(); - selectBoxContainer.style.borderLeftColor = colors.selectBorder.toString(); - } - } - }, this.themeService)); + this.toDispose.push(attachStylerCallback(this.themeService, { selectBorder }, colors => { + this.container.style.borderColor = colors.selectBorder; + selectBoxContainer.style.borderLeftColor = colors.selectBorder; + })); this.updateOptions(); } From 8986d52cfcab71521037ead805fe3d2c74ab4406 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 22 May 2017 07:48:40 +0200 Subject: [PATCH 0736/1164] Better support to use tree background color with contrast border (fixes #26218) --- src/vs/workbench/browser/part.ts | 5 +++++ src/vs/workbench/browser/parts/sidebar/sidebarPart.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/part.ts b/src/vs/workbench/browser/part.ts index a0cf82677f9..71e32226b2a 100644 --- a/src/vs/workbench/browser/part.ts +++ b/src/vs/workbench/browser/part.ts @@ -12,6 +12,7 @@ import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; export interface IPartOptions { hasTitle?: boolean; + borderWidth?: () => number; } /** @@ -130,6 +131,10 @@ export class PartLayout { // Content Size: Width (Fill), Height (Variable) const contentSize = new Dimension(width, height - titleSize.height); + if (this.options && typeof this.options.borderWidth === 'function') { + contentSize.width -= this.options.borderWidth(); // adjust for border size + } + sizes.push(titleSize); sizes.push(contentSize); diff --git a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts index f9087b6c6ce..747d240e069 100644 --- a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts +++ b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts @@ -63,7 +63,7 @@ export class SidebarPart extends CompositePart { Scope.VIEWLET, SIDE_BAR_TITLE_FOREGROUND, id, - { hasTitle: true } + { hasTitle: true, borderWidth: () => (this.getColor(SIDE_BAR_BORDER) || this.getColor(contrastBorder)) ? 1 : 0 } ); } From 9979c045e73dbb954853ebe05de11da893c93ec0 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 22 May 2017 07:51:55 +0200 Subject: [PATCH 0737/1164] Theming: introduce border colors for individual components to override contrastBorder (fixes #26530) --- src/vs/platform/theme/common/colorRegistry.ts | 3 +- .../parts/activitybar/activitybarPart.ts | 18 ++++----- .../parts/editor/editorGroupsControl.ts | 16 ++++---- .../browser/parts/panel/panelPart.ts | 8 ++-- .../browser/parts/sidebar/sidebarPart.ts | 16 ++++---- .../browser/parts/statusbar/statusbarPart.ts | 10 ++--- src/vs/workbench/common/theme.ts | 40 +++++++++++++++---- 7 files changed, 67 insertions(+), 44 deletions(-) diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index d8aa35889d8..bc3da9fed16 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -137,7 +137,6 @@ export const focusBorder = registerColor('focusBorder', { dark: Color.fromHex('# export const contrastBorder = registerColor('contrastBorder', { light: null, dark: null, hc: '#6FC3DF' }, nls.localize('contrastBorder', "An extra border around elements to separate them from others for greater contrast.")); export const activeContrastBorder = registerColor('contrastActiveBorder', { light: null, dark: null, hc: focusBorder }, nls.localize('activeContrastBorder', "An extra border around active elements to separate them from others for greater contrast.")); - export const selectionBackground = registerColor('selection.background', { light: null, dark: null, hc: null }, nls.localize('selectionBackground', "The background color of text selections in the workbench (e.g. for input fields or text areas). Note that this does not apply to selections within the editor and the terminal.")); // ------ text colors @@ -160,7 +159,7 @@ export const inputActiveOptionBorder = registerColor('inputOption.activeBorder', export const inputPlaceholderForeground = registerColor('input.placeholderForeground', { dark: null, light: null, hc: null }, nls.localize('inputPlaceholderForeground', "Input box foreground color for placeholder text.")); export const inputValidationInfoBackground = registerColor('inputValidation.infoBackground', { dark: '#063B49', light: '#D6ECF2', hc: Color.black }, nls.localize('inputValidationInfoBackground', "Input validation background color for information severity.")); -export const inputValidationInfoBorder = registerColor('inputValidation.infoBorder', { dark: '#55AAFF', light: '#55AAFF', hc: contrastBorder }, nls.localize('inputValidationInfoBorder', "Input validation border color for information severity.")); +export const inputValidationInfoBorder = registerColor('inputValidation.infoBorder', { dark: '#007acc', light: '#007acc', hc: contrastBorder }, nls.localize('inputValidationInfoBorder', "Input validation border color for information severity.")); export const inputValidationWarningBackground = registerColor('inputValidation.warningBackground', { dark: '#352A05', light: '#F6F5D2', hc: Color.black }, nls.localize('inputValidationWarningBackground', "Input validation background color for information warning.")); export const inputValidationWarningBorder = registerColor('inputValidation.warningBorder', { dark: '#B89500', light: '#B89500', hc: contrastBorder }, nls.localize('inputValidationWarningBorder', "Input validation border color for warning severity.")); export const inputValidationErrorBackground = registerColor('inputValidation.errorBackground', { dark: '#5A1D1D', light: '#F2DEDE', hc: Color.black }, nls.localize('inputValidationErrorBackground', "Input validation background color for error severity.")); diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 8951ed6b900..d824b944e0c 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -30,7 +30,7 @@ import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { ToggleActivityBarVisibilityAction } from 'vs/workbench/browser/actions/toggleActivityBarVisibility'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { ACTIVITY_BAR_BACKGROUND } from 'vs/workbench/common/theme'; +import { ACTIVITY_BAR_BACKGROUND, ACTIVITY_BAR_BORDER } from 'vs/workbench/common/theme'; import { contrastBorder } from 'vs/platform/theme/common/colorRegistry'; interface IViewletActivity { @@ -213,15 +213,15 @@ export class ActivitybarPart extends Part implements IActivityBarService { const background = this.getColor(ACTIVITY_BAR_BACKGROUND); container.style('background-color', background); - const contrastBorderColor = this.getColor(contrastBorder); + const borderColor = this.getColor(ACTIVITY_BAR_BORDER) || this.getColor(contrastBorder); const isPositionLeft = this.partService.getSideBarPosition() === SideBarPosition.LEFT; - container.style('box-sizing', contrastBorderColor && isPositionLeft ? 'border-box' : null); - container.style('border-right-width', contrastBorderColor && isPositionLeft ? '1px' : null); - container.style('border-right-style', contrastBorderColor && isPositionLeft ? 'solid' : null); - container.style('border-right-color', isPositionLeft ? contrastBorderColor : null); - container.style('border-left-width', contrastBorderColor && !isPositionLeft ? '1px' : null); - container.style('border-left-style', contrastBorderColor && !isPositionLeft ? 'solid' : null); - container.style('border-left-color', !isPositionLeft ? contrastBorderColor : null); + container.style('box-sizing', borderColor && isPositionLeft ? 'border-box' : null); + container.style('border-right-width', borderColor && isPositionLeft ? '1px' : null); + container.style('border-right-style', borderColor && isPositionLeft ? 'solid' : null); + container.style('border-right-color', isPositionLeft ? borderColor : null); + container.style('border-left-width', borderColor && !isPositionLeft ? '1px' : null); + container.style('border-left-style', borderColor && !isPositionLeft ? 'solid' : null); + container.style('border-left-color', !isPositionLeft ? borderColor : null); } private showContextMenu(e: MouseEvent): void { diff --git a/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts b/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts index dea7059b171..05bf24ac197 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts @@ -35,7 +35,7 @@ import { IWindowService } from 'vs/platform/windows/common/windows'; import { getCodeEditor } from 'vs/editor/common/services/codeEditorService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { editorBackground, contrastBorder, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; -import { Themable, EDITOR_GROUP_HEADER_TABS_BACKGROUND, EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND, EDITOR_GROUP_BORDER_COLOR, EDITOR_DRAG_AND_DROP_BACKGROUND, EDITOR_GROUP_BACKGROUND } from 'vs/workbench/common/theme'; +import { Themable, EDITOR_GROUP_HEADER_TABS_BACKGROUND, EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND, EDITOR_GROUP_BORDER, EDITOR_DRAG_AND_DROP_BACKGROUND, EDITOR_GROUP_BACKGROUND, EDITOR_GROUP_HEADER_TABS_BORDER } from 'vs/workbench/common/theme'; import { attachProgressBarStyler } from "vs/platform/theme/common/styler"; export enum Rochade { @@ -1011,19 +1011,19 @@ export class EditorGroupsControl extends Themable implements IEditorGroupsContro silo.style('background-color', this.getColor(editorBackground)); // Border - silo.style('border-left-color', index > Position.ONE ? (this.getColor(EDITOR_GROUP_BORDER_COLOR) || this.getColor(contrastBorder)) : null); - silo.style('border-top-color', index > Position.ONE ? (this.getColor(EDITOR_GROUP_BORDER_COLOR) || this.getColor(contrastBorder)) : null); + silo.style('border-left-color', index > Position.ONE ? (this.getColor(EDITOR_GROUP_BORDER) || this.getColor(contrastBorder)) : null); + silo.style('border-top-color', index > Position.ONE ? (this.getColor(EDITOR_GROUP_BORDER) || this.getColor(contrastBorder)) : null); }); // Title control POSITIONS.forEach(position => { const container = this.getTitleAreaControl(position).getContainer(); - const contrastBorderColor = this.getColor(contrastBorder); + const borderColor = this.getColor(EDITOR_GROUP_HEADER_TABS_BORDER) || this.getColor(contrastBorder); container.style.backgroundColor = this.getColor(this.tabOptions.showTabs ? EDITOR_GROUP_HEADER_TABS_BACKGROUND : EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND); - container.style.borderBottomWidth = (contrastBorderColor && this.tabOptions.showTabs) ? '1px' : null; - container.style.borderBottomStyle = (contrastBorderColor && this.tabOptions.showTabs) ? 'solid' : null; - container.style.borderBottomColor = this.tabOptions.showTabs ? contrastBorderColor : null; + container.style.borderBottomWidth = (borderColor && this.tabOptions.showTabs) ? '1px' : null; + container.style.borderBottomStyle = (borderColor && this.tabOptions.showTabs) ? 'solid' : null; + container.style.borderBottomColor = this.tabOptions.showTabs ? borderColor : null; }); } @@ -1556,7 +1556,7 @@ export class EditorGroupsControl extends Themable implements IEditorGroupsContro if (isDragging) { this.parent.addClass('dragging'); silo.addClass('dragging'); - borderColor = this.getColor(EDITOR_GROUP_BORDER_COLOR) || this.getColor(contrastBorder); + borderColor = this.getColor(EDITOR_GROUP_BORDER) || this.getColor(contrastBorder); } else { this.parent.removeClass('dragging'); silo.removeClass('dragging'); diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index 799e4ecc9c4..f163fd6aa15 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -25,7 +25,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ActionsOrientation, ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { ClosePanelAction, PanelAction, ToggleMaximizedPanelAction } from 'vs/workbench/browser/parts/panel/panelActions'; import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; -import { PANEL_BACKGROUND, PANEL_BORDER_COLOR, PANEL_ACTIVE_TITLE_COLOR, PANEL_INACTIVE_TITLE_COLOR, PANEL_ACTIVE_TITLE_BORDER } from 'vs/workbench/common/theme'; +import { PANEL_BACKGROUND, PANEL_BORDER, PANEL_ACTIVE_TITLE_FOREGROUND, PANEL_INACTIVE_TITLE_FOREGROUND, PANEL_ACTIVE_TITLE_BORDER } from 'vs/workbench/common/theme'; import { activeContrastBorder, focusBorder, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; export class PanelPart extends CompositePart implements IPanelService { @@ -104,7 +104,7 @@ export class PanelPart extends CompositePart implements IPanelService { container.style('background-color', this.getColor(PANEL_BACKGROUND)); const title = this.getTitleArea(); - title.style('border-top-color', this.getColor(PANEL_BORDER_COLOR) || this.getColor(contrastBorder)); + title.style('border-top-color', this.getColor(PANEL_BORDER) || this.getColor(contrastBorder)); } public openPanel(id: string, focus?: boolean): TPromise { @@ -195,7 +195,7 @@ export class PanelPart extends CompositePart implements IPanelService { registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { // Title Active - const titleActive = theme.getColor(PANEL_ACTIVE_TITLE_COLOR); + const titleActive = theme.getColor(PANEL_ACTIVE_TITLE_FOREGROUND); const titleActiveBorder = theme.getColor(PANEL_ACTIVE_TITLE_BORDER); collector.addRule(` .monaco-workbench > .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item:hover .action-label, @@ -206,7 +206,7 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { `); // Title Inactive - const titleInactive = theme.getColor(PANEL_INACTIVE_TITLE_COLOR); + const titleInactive = theme.getColor(PANEL_INACTIVE_TITLE_FOREGROUND); collector.addRule(` .monaco-workbench > .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item .action-label { color: ${titleInactive}; diff --git a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts index 747d240e069..fa5d1156e36 100644 --- a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts +++ b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts @@ -26,7 +26,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import Event from 'vs/base/common/event'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { contrastBorder } from 'vs/platform/theme/common/colorRegistry'; -import { SIDE_BAR_TITLE_FOREGROUND, SIDE_BAR_BACKGROUND, SIDE_BAR_FOREGROUND } from 'vs/workbench/common/theme'; +import { SIDE_BAR_TITLE_FOREGROUND, SIDE_BAR_BACKGROUND, SIDE_BAR_FOREGROUND, SIDE_BAR_BORDER } from 'vs/workbench/common/theme'; export class SidebarPart extends CompositePart { @@ -84,14 +84,14 @@ export class SidebarPart extends CompositePart { container.style('background-color', this.getColor(SIDE_BAR_BACKGROUND)); container.style('color', this.getColor(SIDE_BAR_FOREGROUND)); - const contrastBorderColor = this.getColor(contrastBorder); + const borderColor = this.getColor(SIDE_BAR_BORDER) || this.getColor(contrastBorder); const isPositionLeft = this.partService.getSideBarPosition() === SideBarPosition.LEFT; - container.style('border-right-width', contrastBorderColor && isPositionLeft ? '1px' : null); - container.style('border-right-style', contrastBorderColor && isPositionLeft ? 'solid' : null); - container.style('border-right-color', isPositionLeft ? contrastBorderColor : null); - container.style('border-left-width', contrastBorderColor && !isPositionLeft ? '1px' : null); - container.style('border-left-style', contrastBorderColor && !isPositionLeft ? 'solid' : null); - container.style('border-left-color', !isPositionLeft ? contrastBorderColor : null); + container.style('border-right-width', borderColor && isPositionLeft ? '1px' : null); + container.style('border-right-style', borderColor && isPositionLeft ? 'solid' : null); + container.style('border-right-color', isPositionLeft ? borderColor : null); + container.style('border-left-width', borderColor && !isPositionLeft ? '1px' : null); + container.style('border-left-style', borderColor && !isPositionLeft ? 'solid' : null); + container.style('border-left-color', !isPositionLeft ? borderColor : null); } public openViewlet(id: string, focus?: boolean): TPromise { diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index 464a368ab25..4a23e5a2e92 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -27,7 +27,7 @@ import { getCodeEditor } from 'vs/editor/common/services/codeEditorService'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { Action } from 'vs/base/common/actions'; import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; -import { STATUS_BAR_BACKGROUND, STATUS_BAR_FOREGROUND, STATUS_BAR_NO_FOLDER_BACKGROUND, STATUS_BAR_ITEM_HOVER_BACKGROUND, STATUS_BAR_ITEM_ACTIVE_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_HOVER_BACKGROUND } from 'vs/workbench/common/theme'; +import { STATUS_BAR_BACKGROUND, STATUS_BAR_FOREGROUND, STATUS_BAR_NO_FOLDER_BACKGROUND, STATUS_BAR_ITEM_HOVER_BACKGROUND, STATUS_BAR_ITEM_ACTIVE_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_HOVER_BACKGROUND, STATUS_BAR_BORDER } from 'vs/workbench/common/theme'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { contrastBorder } from 'vs/platform/theme/common/colorRegistry'; @@ -139,10 +139,10 @@ export class StatusbarPart extends Part implements IStatusbarService { container.style('color', this.getColor(STATUS_BAR_FOREGROUND)); container.style('background-color', this.getColor(this.contextService.hasWorkspace() ? STATUS_BAR_BACKGROUND : STATUS_BAR_NO_FOLDER_BACKGROUND)); - const contrastBorderColor = this.getColor(contrastBorder); - container.style('border-top-width', contrastBorderColor ? '1px' : null); - container.style('border-top-style', contrastBorderColor ? 'solid' : null); - container.style('border-top-color', contrastBorderColor); + const borderColor = this.getColor(STATUS_BAR_BORDER) || this.getColor(contrastBorder); + container.style('border-top-width', borderColor ? '1px' : null); + container.style('border-top-style', borderColor ? 'solid' : null); + container.style('border-top-color', borderColor); } private doCreateStatusItem(alignment: StatusbarAlignment, priority: number = 0): HTMLElement { diff --git a/src/vs/workbench/common/theme.ts b/src/vs/workbench/common/theme.ts index 3ea47c3df77..a7968aa55d3 100644 --- a/src/vs/workbench/common/theme.ts +++ b/src/vs/workbench/common/theme.ts @@ -56,13 +56,19 @@ export const EDITOR_GROUP_HEADER_TABS_BACKGROUND = registerColor('editorGroupHea hc: null }, nls.localize('tabsContainerBackground', "Background color of the editor group title header when tabs are enabled. Editor groups are the containers of editors.")); +export const EDITOR_GROUP_HEADER_TABS_BORDER = registerColor('editorGroupHeader.tabsBorder', { + dark: null, + light: null, + hc: contrastBorder +}, nls.localize('tabsContainerBorder', "Border color of the editor group title header when tabs are enabled. Editor groups are the containers of editors.")); + export const EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND = registerColor('editorGroupHeader.noTabsBackground', { dark: editorBackground, light: editorBackground, hc: editorBackground }, nls.localize('editorGroupHeaderBackground', "Background color of the editor group title header when tabs are disabled. Editor groups are the containers of editors.")); -export const EDITOR_GROUP_BORDER_COLOR = registerColor('editorGroup.border', { +export const EDITOR_GROUP_BORDER = registerColor('editorGroup.border', { dark: '#444444', light: '#E7E7E7', hc: contrastBorder @@ -84,27 +90,27 @@ export const PANEL_BACKGROUND = registerColor('panel.background', { hc: editorBackground }, nls.localize('panelBackground', "Panel background color. Panels are shown below the editor area and contain views like output and integrated terminal.")); -export const PANEL_BORDER_COLOR = registerColor('panel.border', { +export const PANEL_BORDER = registerColor('panel.border', { dark: Color.fromHex('#808080').transparent(0.35), light: Color.fromHex('#808080').transparent(0.35), hc: contrastBorder }, nls.localize('panelBorder', "Panel border color on the top separating to the editor. Panels are shown below the editor area and contain views like output and integrated terminal.")); -export const PANEL_ACTIVE_TITLE_COLOR = registerColor('panelTitle.activeForeground', { +export const PANEL_ACTIVE_TITLE_FOREGROUND = registerColor('panelTitle.activeForeground', { dark: '#E7E7E7', light: '#424242', hc: Color.white }, nls.localize('panelActiveTitleForeground', "Title color for the active panel. Panels are shown below the editor area and contain views like output and integrated terminal.")); -export const PANEL_INACTIVE_TITLE_COLOR = registerColor('panelTitle.inactiveForeground', { - dark: transparent(PANEL_ACTIVE_TITLE_COLOR, 0.5), - light: transparent(PANEL_ACTIVE_TITLE_COLOR, 0.75), +export const PANEL_INACTIVE_TITLE_FOREGROUND = registerColor('panelTitle.inactiveForeground', { + dark: transparent(PANEL_ACTIVE_TITLE_FOREGROUND, 0.5), + light: transparent(PANEL_ACTIVE_TITLE_FOREGROUND, 0.75), hc: Color.white }, nls.localize('panelInactiveTitleForeground', "Title color for the inactive panel. Panels are shown below the editor area and contain views like output and integrated terminal.")); export const PANEL_ACTIVE_TITLE_BORDER = registerColor('panelTitle.activeBorder', { - dark: PANEL_BORDER_COLOR, - light: PANEL_BORDER_COLOR, + dark: PANEL_BORDER, + light: PANEL_BORDER, hc: contrastBorder }, nls.localize('panelActiveTitleBorder', "Border color for the active panel title. Panels are shown below the editor area and contain views like output and integrated terminal.")); @@ -124,6 +130,12 @@ export const STATUS_BAR_BACKGROUND = registerColor('statusBar.background', { hc: null }, nls.localize('statusBarBackground', "Standard status bar background color. The status bar is shown in the bottom of the window.")); +export const STATUS_BAR_BORDER = registerColor('statusBar.border', { + dark: null, + light: null, + hc: contrastBorder +}, nls.localize('statusBarBorder', "Status bar border color separating to the sidebar and editor. The status bar is shown in the bottom of the window.")); + export const STATUS_BAR_NO_FOLDER_BACKGROUND = registerColor('statusBar.noFolderBackground', { dark: '#68217A', light: '#68217A', @@ -170,6 +182,12 @@ export const ACTIVITY_BAR_FOREGROUND = registerColor('activityBar.foreground', { hc: Color.white }, nls.localize('activityBarForeground', "Activity bar foreground color (e.g. used for the icons). The activity bar is showing on the far left or right and allows to switch between views of the side bar.")); +export const ACTIVITY_BAR_BORDER = registerColor('activityBar.border', { + dark: null, + light: null, + hc: contrastBorder +}, nls.localize('activityBarBorder', "Activity bar border color separating to the side bar. The activity bar is showing on the far left or right and allows to switch between views of the side bar.")); + export const ACTIVITY_BAR_DRAG_AND_DROP_BACKGROUND = registerColor('activityBar.dropBackground', { dark: Color.white.transparent(0.12), light: Color.white.transparent(0.12), @@ -204,6 +222,12 @@ export const SIDE_BAR_FOREGROUND = registerColor('sideBar.foreground', { hc: null }, nls.localize('sideBarForeground', "Side bar foreground color. The side bar is the container for views like explorer and search.")); +export const SIDE_BAR_BORDER = registerColor('sideBar.border', { + dark: null, + light: null, + hc: contrastBorder +}, nls.localize('sideBarBorder', "Side bar border color on the side separating to the editor. The side bar is the container for views like explorer and search.")); + export const SIDE_BAR_TITLE_FOREGROUND = registerColor('sideBarTitle.foreground', { dark: SIDE_BAR_FOREGROUND, light: SIDE_BAR_FOREGROUND, From 9b63b6bea1d9cc40e3fc2c0cea4ee5fa5f0e4ed0 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 22 May 2017 07:56:57 +0200 Subject: [PATCH 0738/1164] Add commands to "list" for focusing the first and last child of the current tree (fixes #26827) --- .../quickopen/browser/quickOpenWidget.ts | 2 +- src/vs/base/parts/tree/browser/tree.ts | 10 +- src/vs/base/parts/tree/browser/treeImpl.ts | 8 +- src/vs/base/parts/tree/browser/treeModel.ts | 32 ++++-- src/vs/workbench/electron-browser/commands.ts | 100 +++++++++++------- 5 files changed, 96 insertions(+), 56 deletions(-) diff --git a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts index 035dbca0d27..5ac4eba8972 100644 --- a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts +++ b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts @@ -349,7 +349,7 @@ export class QuickOpenWidget implements IModelProvider { this.builder.style('color', foreground); this.builder.style('background-color', background); this.builder.style('border-color', borderColor); - this.builder.style('border-width', borderColor ? '2px' : null); + this.builder.style('border-width', borderColor ? '1px' : null); this.builder.style('border-style', borderColor ? 'solid' : null); this.builder.style('box-shadow', widgetShadow ? `0 5px 8px ${widgetShadow}` : null); } diff --git a/src/vs/base/parts/tree/browser/tree.ts b/src/vs/base/parts/tree/browser/tree.ts index 07943806dc2..2b03b5f138b 100644 --- a/src/vs/base/parts/tree/browser/tree.ts +++ b/src/vs/base/parts/tree/browser/tree.ts @@ -283,9 +283,10 @@ export interface ITree extends Events.IEventEmitter { focusFirstChild(eventPayload?: any): void; /** - * Focuses the second element, in visible order. + * Focuses the second element, in visible order. Will focus the first + * child from the provided element's parent if any. */ - focusFirst(eventPayload?: any): void; + focusFirst(eventPayload?: any, from?: any): void; /** * Focuses the nth element, in visible order. @@ -293,9 +294,10 @@ export interface ITree extends Events.IEventEmitter { focusNth(index: number, eventPayload?: any): void; /** - * Focuses the last element, in visible order. + * Focuses the last element, in visible order. Will focus the last + * child from the provided element's parent if any. */ - focusLast(eventPayload?: any): void; + focusLast(eventPayload?: any, from?: any): void; /** * Focuses the element at the end of the next page, in visible order. diff --git a/src/vs/base/parts/tree/browser/treeImpl.ts b/src/vs/base/parts/tree/browser/treeImpl.ts index f2173a9bb2c..ba27e688847 100644 --- a/src/vs/base/parts/tree/browser/treeImpl.ts +++ b/src/vs/base/parts/tree/browser/treeImpl.ts @@ -327,16 +327,16 @@ export class Tree extends Events.EventEmitter implements _.ITree { this.model.focusFirstChild(eventPayload); } - public focusFirst(eventPayload?: any): void { - this.model.focusFirst(eventPayload); + public focusFirst(eventPayload?: any, from?: any): void { + this.model.focusFirst(eventPayload, from); } public focusNth(index: number, eventPayload?: any): void { this.model.focusNth(index, eventPayload); } - public focusLast(eventPayload?: any): void { - this.model.focusLast(eventPayload); + public focusLast(eventPayload?: any, from?: any): void { + this.model.focusLast(eventPayload, from); } public focusNextPage(eventPayload?: any): void { diff --git a/src/vs/base/parts/tree/browser/treeModel.ts b/src/vs/base/parts/tree/browser/treeModel.ts index 1c47debd861..a3fbdfa04d5 100644 --- a/src/vs/base/parts/tree/browser/treeModel.ts +++ b/src/vs/base/parts/tree/browser/treeModel.ts @@ -1207,12 +1207,13 @@ export class TreeModel extends Events.EventEmitter { } } - public focusFirst(eventPayload?: any): void { - this.focusNth(0, eventPayload); + public focusFirst(eventPayload?: any, from?: any): void { + this.focusNth(0, eventPayload, from); } - public focusNth(index: number, eventPayload?: any): void { - var nav = this.getNavigator(this.input); + public focusNth(index: number, eventPayload?: any, from?: any): void { + var navItem = this.getParent(from); + var nav = this.getNavigator(navItem); var item = nav.first(); for (var i = 0; i < index; i++) { item = nav.next(); @@ -1223,15 +1224,32 @@ export class TreeModel extends Events.EventEmitter { } } - public focusLast(eventPayload?: any): void { - var nav = this.getNavigator(this.input); - var item = nav.last(); + public focusLast(eventPayload?: any, from?: any): void { + var navItem = this.getParent(from); + var item: Item; + if (from) { + item = navItem.lastChild; + } else { + var nav = this.getNavigator(navItem); + item = nav.last(); + } if (item) { this.setFocus(item, eventPayload); } } + private getParent(from?: any): Item { + if (from) { + var fromItem = this.getItem(from); + if (fromItem && fromItem.parent) { + return fromItem.parent; + } + } + + return this.getItem(this.input); + } + public getNavigator(element: any = null, subTreeOnly: boolean = true): INavigator { return new TreeNavigator(this.getItem(element), subTreeOnly); } diff --git a/src/vs/workbench/electron-browser/commands.ts b/src/vs/workbench/electron-browser/commands.ts index 09956f9c775..e724e95e880 100644 --- a/src/vs/workbench/electron-browser/commands.ts +++ b/src/vs/workbench/electron-browser/commands.ts @@ -207,55 +207,75 @@ export function registerCommands(): void { weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), when: ListFocusContext, primary: KeyCode.Home, - handler: (accessor) => { - const listService = accessor.get(IListService); - const focused = listService.getFocused(); - - // List - if (focused instanceof List) { - const list = focused; - - list.setFocus([0]); - list.reveal(0); - } - - // Tree - else if (focused) { - const tree = focused; - - tree.focusFirst({ origin: 'keyboard' }); - tree.reveal(tree.getFocus()).done(null, errors.onUnexpectedError); - } - } + handler: accessor => listFocusFirst(accessor) }); + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: 'list.focusFirstChild', + weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), + when: ListFocusContext, + primary: null, + handler: accessor => listFocusFirst(accessor, { fromFocused: true }) + }); + + function listFocusFirst(accessor: ServicesAccessor, options?: { fromFocused: boolean }): void { + const listService = accessor.get(IListService); + const focused = listService.getFocused(); + + // List + if (focused instanceof List) { + const list = focused; + + list.setFocus([0]); + list.reveal(0); + } + + // Tree + else if (focused) { + const tree = focused; + + tree.focusFirst({ origin: 'keyboard' }, options && options.fromFocused ? tree.getFocus() : void 0); + tree.reveal(tree.getFocus()).done(null, errors.onUnexpectedError); + } + } + KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'list.focusLast', weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), when: ListFocusContext, primary: KeyCode.End, - handler: (accessor) => { - const listService = accessor.get(IListService); - const focused = listService.getFocused(); - - // List - if (focused instanceof List) { - const list = focused; - - list.setFocus([list.length - 1]); - list.reveal(list.length - 1); - } - - // Tree - else if (focused) { - const tree = focused; - - tree.focusLast({ origin: 'keyboard' }); - tree.reveal(tree.getFocus()).done(null, errors.onUnexpectedError); - } - } + handler: accessor => listFocusLast(accessor) }); + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: 'list.focusLastChild', + weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), + when: ListFocusContext, + primary: null, + handler: accessor => listFocusLast(accessor, { fromFocused: true }) + }); + + function listFocusLast(accessor: ServicesAccessor, options?: { fromFocused: boolean }): void { + const listService = accessor.get(IListService); + const focused = listService.getFocused(); + + // List + if (focused instanceof List) { + const list = focused; + + list.setFocus([list.length - 1]); + list.reveal(list.length - 1); + } + + // Tree + else if (focused) { + const tree = focused; + + tree.focusLast({ origin: 'keyboard' }, options && options.fromFocused ? tree.getFocus() : void 0); + tree.reveal(tree.getFocus()).done(null, errors.onUnexpectedError); + } + } + KeybindingsRegistry.registerCommandAndKeybindingRule({ id: 'list.select', weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), From afb94f4ec09d01ae4d5214201c8562feca416301 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 22 May 2017 08:01:32 +0200 Subject: [PATCH 0739/1164] Launching Code to edit a file with an unsaved file from prior hot exit focuses incorrect file on start (fixes #26973) --- .../parts/backup/common/backupRestorer.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/vs/workbench/parts/backup/common/backupRestorer.ts b/src/vs/workbench/parts/backup/common/backupRestorer.ts index 54d1e832897..77603e199d9 100644 --- a/src/vs/workbench/parts/backup/common/backupRestorer.ts +++ b/src/vs/workbench/parts/backup/common/backupRestorer.ts @@ -83,26 +83,25 @@ export class BackupRestorer implements IWorkbenchContribution { private doOpenEditors(resources: URI[]): TPromise { const stacks = this.groupService.getStacksModel(); const hasOpenedEditors = stacks.groups.length > 0; - - const inputs = resources.map(resource => this.resolveInput(resource)); - const openEditorsArgs = inputs.map((input, index) => { - return { input, options: { pinned: true, preserveFocus: true, inactive: index > 0 || hasOpenedEditors }, position: Position.ONE }; - }); + const inputs = resources.map((resource, index) => this.resolveInput(resource, index, hasOpenedEditors)); // Open all remaining backups as editors and resolve them to load their backups - return this.editorService.openEditors(openEditorsArgs).then(() => void 0); + return this.editorService.openEditors(inputs.map(input => { return { input, position: Position.ONE }; })).then(() => void 0); } - private resolveInput(resource: URI): IResourceInput | IUntitledResourceInput { + private resolveInput(resource: URI, index: number, hasOpenedEditors: boolean): IResourceInput | IUntitledResourceInput { + const options = { pinned: true, preserveFocus: true, inactive: index > 0 || hasOpenedEditors }; + if (resource.scheme === 'untitled' && !BackupRestorer.UNTITLED_REGEX.test(resource.fsPath)) { // TODO@Ben debt: instead of guessing if an untitled file has an associated file path or not // this information should be provided by the backup service and stored as meta data within - return { filePath: resource.fsPath }; + return { filePath: resource.fsPath, options }; } - return { resource }; + return { resource, options }; } + public getId(): string { return 'vs.backup.backupRestorer'; } From bc46331a485d21bc8e5e2ca2081172238c7c4e9b Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 22 May 2017 09:46:40 +0200 Subject: [PATCH 0740/1164] tfs: upload darwin signed only --- build/package.json | 3 ++- build/tfs/common/publish.ts | 19 ++++++++++++++++--- build/tfs/darwin/build.sh | 4 ++-- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/build/package.json b/build/package.json index 8b510f182e9..ccd8c609141 100644 --- a/build/package.json +++ b/build/package.json @@ -12,6 +12,7 @@ "azure-storage": "^2.1.0", "documentdb": "^1.11.0", "mime": "^1.3.4", + "minimist": "^1.2.0", "typescript": "^2.2.2", "xml2js": "^0.4.17" }, @@ -20,4 +21,4 @@ "watch": "tsc --watch", "postinstall": "npm run compile" } -} \ No newline at end of file +} diff --git a/build/tfs/common/publish.ts b/build/tfs/common/publish.ts index 025689cea7d..6ab683f963b 100644 --- a/build/tfs/common/publish.ts +++ b/build/tfs/common/publish.ts @@ -10,6 +10,7 @@ import { execSync } from 'child_process'; import * as crypto from 'crypto'; import * as azure from 'azure-storage'; import * as mime from 'mime'; +import * as minimist from 'minimist'; import { DocumentClient, NewDocument } from 'documentdb'; if (process.argv.length < 6) { @@ -137,7 +138,11 @@ async function uploadBlob(blobService: azure.BlobService, quality: string, blobN await new Promise((c, e) => blobService.createBlockBlobFromLocalFile(quality, blobName, file, blobOptions, err => err ? e(err) : c())); } -async function publish(commit: string, quality: string, platform: string, type: string, name: string, version: string, _isUpdate: string, file: string): Promise { +interface PublishOptions { + 'upload-only': boolean; +} + +async function publish(commit: string, quality: string, platform: string, type: string, name: string, version: string, _isUpdate: string, file: string, opts: PublishOptions): Promise { const isUpdate = _isUpdate === 'true'; const queuedBy = process.env['BUILD_QUEUEDBY']; @@ -193,6 +198,10 @@ async function publish(commit: string, quality: string, platform: string, type: console.log('Blobs successfully uploaded.'); + if (opts['upload-only']) { + return; + } + const config = await getConfig(quality); console.log('Quality config:', config); @@ -224,10 +233,14 @@ async function publish(commit: string, quality: string, platform: string, type: } function main(): void { - const [, , quality, platform, type, name, version, _isUpdate, file] = process.argv; + const opts = minimist(process.argv.slice(2), { + boolean: ['upload-only'] + }); + + const [quality, platform, type, name, version, _isUpdate, file] = opts._; const commit = execSync('git rev-parse HEAD', { encoding: 'utf8' }).trim(); - publish(commit, quality, platform, type, name, version, _isUpdate, file).catch(err => { + publish(commit, quality, platform, type, name, version, _isUpdate, file, opts).catch(err => { console.error(err); process.exit(1); }); diff --git a/build/tfs/darwin/build.sh b/build/tfs/darwin/build.sh index 0a17036d857..1f569cf74f2 100755 --- a/build/tfs/darwin/build.sh +++ b/build/tfs/darwin/build.sh @@ -46,8 +46,8 @@ rm -rf $UNSIGNEDZIP step "Create unsigned archive" \ zip -r -X -y $UNSIGNEDZIP *) -step "Publish unsigned archive" \ - node build/tfs/common/publish.js $VSCODE_QUALITY darwin archive-unsigned VSCode-darwin-$VSCODE_QUALITY-unsigned.zip $VERSION false $UNSIGNEDZIP +step "Upload unsigned archive" \ + node build/tfs/common/publish.js --upload-only $VSCODE_QUALITY darwin archive-unsigned VSCode-darwin-$VSCODE_QUALITY-unsigned.zip $VERSION false $UNSIGNEDZIP step "Sign build" \ node build/tfs/common/enqueue.js $VSCODE_QUALITY \ No newline at end of file From 72f279e0ad9a21a089acc757cff68d52ccd7d6c5 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 22 May 2017 09:52:16 +0200 Subject: [PATCH 0741/1164] Fix #27057 --- .../parts/extensions/electron-browser/extensionsViewlet.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts index 59764a21fb6..a6047bd0b25 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts @@ -32,7 +32,7 @@ import { Delegate, Renderer } from 'vs/workbench/parts/extensions/browser/extens import { IExtensionsWorkbenchService, IExtension, IExtensionsViewlet, VIEWLET_ID, ExtensionState } from '../common/extensions'; import { ShowRecommendedExtensionsAction, ShowWorkspaceRecommendedExtensionsAction, ShowRecommendedKeymapExtensionsAction, ShowPopularExtensionsAction, ShowInstalledExtensionsAction, ShowDisabledExtensionsAction, - ShowOutdatedExtensionsAction, ClearExtensionsInputAction, ChangeSortAction, UpdateAllAction, CheckForUpdatesAction + ShowOutdatedExtensionsAction, ClearExtensionsInputAction, ChangeSortAction, UpdateAllAction, CheckForUpdatesAction, DisableAllAction, EnableAllAction } from 'vs/workbench/parts/extensions/browser/extensionsActions'; import { InstallVSIXAction } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions'; import { IExtensionManagementService, IExtensionGalleryService, IExtensionTipsService, SortBy, SortOrder, IQueryOptions, LocalExtensionType } from 'vs/platform/extensionManagement/common/extensionManagement'; @@ -207,7 +207,10 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { new Separator(), this.instantiationService.createInstance(CheckForUpdatesAction, CheckForUpdatesAction.ID, CheckForUpdatesAction.LABEL), this.instantiationService.createInstance(UpdateAllAction, UpdateAllAction.ID, UpdateAllAction.LABEL), - this.instantiationService.createInstance(InstallVSIXAction, InstallVSIXAction.ID, InstallVSIXAction.LABEL) + this.instantiationService.createInstance(InstallVSIXAction, InstallVSIXAction.ID, InstallVSIXAction.LABEL), + new Separator(), + this.instantiationService.createInstance(DisableAllAction, DisableAllAction.ID, DisableAllAction.LABEL), + this.instantiationService.createInstance(EnableAllAction, EnableAllAction.ID, EnableAllAction.LABEL) ]; } From 6a35450384591b30bef5dca578cfc63051b47e09 Mon Sep 17 00:00:00 2001 From: Michel Kaporin Date: Mon, 22 May 2017 10:09:41 +0200 Subject: [PATCH 0742/1164] Fixes #26934. --- src/vs/workbench/parts/debug/browser/linkDetector.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/browser/linkDetector.ts b/src/vs/workbench/parts/debug/browser/linkDetector.ts index e75ea509664..d2fd4efab48 100644 --- a/src/vs/workbench/parts/debug/browser/linkDetector.ts +++ b/src/vs/workbench/parts/debug/browser/linkDetector.ts @@ -47,7 +47,8 @@ export class LinkDetector { while (match !== null) { let resource: uri = null; try { - resource = (match && !strings.startsWith(match[0], 'http')) && (match[2] ? uri.file(match[1]) : this.contextService.toResource(match[1])); + resource = (match && !strings.startsWith(match[0], 'http')) + && (match[2] || strings.startsWith(match[0], '/') ? uri.file(match[1]) : this.contextService.toResource(match[1])); } catch (e) { } if (!resource) { From f595041a10d34464c713afd9193b063d52e37dba Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 22 May 2017 10:19:37 +0200 Subject: [PATCH 0743/1164] tfs: fix darwin build --- build/tfs/common/enqueue.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tfs/common/enqueue.ts b/build/tfs/common/enqueue.ts index 875227bdd39..61e1171f2eb 100644 --- a/build/tfs/common/enqueue.ts +++ b/build/tfs/common/enqueue.ts @@ -41,7 +41,7 @@ function isBuildSigned(quality: string, commit: string): Promise { return new Promise((c, e) => { client.queryDocuments(collection, updateQuery).toArray((err, results) => { if (err) { return e(err); } - if (results.length !== 1) { return e(new Error('No such build')); } + if (results.length !== 1) { return c(false); } const [release] = results; const assets: Asset[] = release.assets; From fd141660a8bc4b363461600849137d0712d7f61e Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 22 May 2017 10:25:02 +0200 Subject: [PATCH 0744/1164] tfs: darwin still publish build, but not asset --- build/tfs/common/publish.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/build/tfs/common/publish.ts b/build/tfs/common/publish.ts index 6ab683f963b..d7a31ce7440 100644 --- a/build/tfs/common/publish.ts +++ b/build/tfs/common/publish.ts @@ -198,10 +198,6 @@ async function publish(commit: string, quality: string, platform: string, type: console.log('Blobs successfully uploaded.'); - if (opts['upload-only']) { - return; - } - const config = await getConfig(quality); console.log('Quality config:', config); @@ -221,12 +217,16 @@ async function publish(commit: string, quality: string, platform: string, type: isReleased: config.frozen ? false : isReleased, sourceBranch, queuedBy, - assets: [asset], + assets: [], updates: {} as any }; - if (isUpdate) { - release.updates[platform] = type; + if (!opts['upload-only']) { + release.assets.push(asset); + + if (isUpdate) { + release.updates[platform] = type; + } } await createOrUpdate(commit, quality, platform, type, release, asset, isUpdate); From 2a51ece444b5a7a36ea20a469aaba28e98f6e595 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 22 May 2017 10:29:54 +0200 Subject: [PATCH 0745/1164] fix #26995 --- src/vs/base/common/filters.ts | 1 + src/vs/base/test/common/filters.test.ts | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/src/vs/base/common/filters.ts b/src/vs/base/common/filters.ts index 360da9f2384..19056d36a50 100644 --- a/src/vs/base/common/filters.ts +++ b/src/vs/base/common/filters.ts @@ -446,6 +446,7 @@ _seps['/'] = true; _seps['\\'] = true; _seps['\''] = true; _seps['"'] = true; +_seps[':'] = true; const enum Arrow { Top = 0b1, Diag = 0b10, Left = 0b100 } diff --git a/src/vs/base/test/common/filters.test.ts b/src/vs/base/test/common/filters.test.ts index 1e9a6a1e713..ed8f708e757 100644 --- a/src/vs/base/test/common/filters.test.ts +++ b/src/vs/base/test/common/filters.test.ts @@ -320,6 +320,11 @@ suite('Filters', () => { ); }); + test('Fuzzy IntelliSense matching vs Haxe metadata completion, #26995', function () { + assertMatches('f', ':Foo', ':^Foo', fuzzyScore); + assertMatches('f', ':foo', ':^foo', fuzzyScore); + }); + function assertTopScore(filter: typeof fuzzyScore, pattern: string, expected: number, ...words: string[]) { let topScore = -(100 * 10); let topIdx = 0; From 16b3399e17e8f8742bb5877ec6ce7f75eb458624 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 22 May 2017 11:05:50 +0200 Subject: [PATCH 0746/1164] hc theme status bar: back to black like amy winehouse --- extensions/theme-defaults/themes/hc_black.json | 1 - 1 file changed, 1 deletion(-) diff --git a/extensions/theme-defaults/themes/hc_black.json b/extensions/theme-defaults/themes/hc_black.json index 0db3c99f1fc..5cadf6c65cf 100644 --- a/extensions/theme-defaults/themes/hc_black.json +++ b/extensions/theme-defaults/themes/hc_black.json @@ -4,7 +4,6 @@ "include": "./hc_black_defaults.json", "colors": { "selection.background": "#008000", - "statusBar.background": "#008000", "editor.selectionBackground": "#FFFFFF" }, "tokenColors": [ From ed298f91c6f5d46ebaece4cf72d1254d653a8eb2 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 22 May 2017 11:25:18 +0200 Subject: [PATCH 0747/1164] do not do FilePUT for all files inside .vscode folder --- .../services/textfile/common/textFileEditorModel.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index debbf1fc972..eb3a76b87b1 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -18,12 +18,13 @@ import diagnostics = require('vs/base/common/diagnostics'); import types = require('vs/base/common/types'); import { IMode } from 'vs/editor/common/modes'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ITextFileService, IAutoSaveConfiguration, ModelState, ITextFileEditorModel, IModelSaveOptions, ISaveErrorHandler, ISaveParticipant, StateChange, SaveReason, IRawTextContent } from 'vs/workbench/services/textfile/common/textfiles'; import { EncodingMode, EditorModel } from 'vs/workbench/common/editor'; import { BaseTextEditorModel } from 'vs/workbench/common/editor/textEditorModel'; import { IBackupFileService, BACKUP_FILE_RESOLVE_OPTIONS } from 'vs/workbench/services/backup/common/backup'; -import { IFileService, IFileStat, IFileOperationResult, FileOperationResult, IContent, CONTENT_CHANGE_EVENT_BUFFER_DELAY, FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files'; +import { IFileService, IFileStat, IFileOperationResult, FileOperationResult, IContent, CONTENT_CHANGE_EVENT_BUFFER_DELAY, FileChangesEvent, FileChangeType, isEqualOrParent } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { IModeService } from 'vs/editor/common/services/modeService'; @@ -83,7 +84,8 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil @ITelemetryService private telemetryService: ITelemetryService, @ITextFileService private textFileService: ITextFileService, @IBackupFileService private backupFileService: IBackupFileService, - @IEnvironmentService private environmentService: IEnvironmentService + @IEnvironmentService private environmentService: IEnvironmentService, + @IWorkspaceContextService private contextService: IWorkspaceContextService ) { super(modelService, modeService); @@ -667,8 +669,9 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil diag(`doSave(${versionId}) - after updateContent()`, this.resource, new Date()); // Telemetry - if (this.resource.fsPath === this.environmentService.appSettingsPath) { - // Do not log write to settings.json as a filePUT event as it ruins our JSON usage data + if ((this.contextService.getWorkspace() && isEqualOrParent(this.resource.fsPath, this.contextService.toResource('.vscode').fsPath)) || + this.resource.fsPath === this.environmentService.appSettingsPath) { + // Do not log write to user settings.json and .vscode folder as a filePUT event as it ruins our JSON usage data this.telemetryService.publicLog('settingsWritten'); } else { this.telemetryService.publicLog('filePUT', { mimeType: guessMimeTypes(this.resource.fsPath).join(', '), ext: paths.extname(this.lastResolvedDiskStat.resource.fsPath) }); From 2d0ef8fd56083a24dd1de3be450f525e6aed655e Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Sun, 21 May 2017 21:11:54 +0200 Subject: [PATCH 0748/1164] Clean up accessibility tree --- src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts | 2 ++ src/vs/editor/browser/viewParts/minimap/minimap.ts | 2 ++ src/vs/editor/browser/viewParts/rulers/rulers.ts | 2 ++ .../browser/viewParts/scrollDecoration/scrollDecoration.ts | 2 ++ src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts | 2 -- src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts | 2 ++ 6 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts b/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts index 9d6879f176f..243d62b86f5 100644 --- a/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts +++ b/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts @@ -68,6 +68,8 @@ export abstract class AbstractScrollbar extends Widget { this._mouseMoveMonitor = this._register(new GlobalMouseMoveMonitor()); this._shouldRender = true; this.domNode = createFastDomNode(document.createElement('div')); + this.domNode.setAttribute('role', 'presentation'); + this.domNode.setAttribute('aria-hidden', 'true'); this._visibilityController.setDomNode(this.domNode); this.domNode.setPosition('absolute'); diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index 0b0f19f012e..9c922137ede 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -442,6 +442,8 @@ export class Minimap extends ViewPart { PartFingerprints.write(this._domNode, PartFingerprint.Minimap); this._domNode.setClassName('minimap'); this._domNode.setPosition('absolute'); + this._domNode.setAttribute('role', 'presentation'); + this._domNode.setAttribute('aria-hidden', 'true'); this._domNode.setRight(this._context.configuration.editor.layoutInfo.verticalScrollbarWidth); this._shadow = createFastDomNode(document.createElement('div')); diff --git a/src/vs/editor/browser/viewParts/rulers/rulers.ts b/src/vs/editor/browser/viewParts/rulers/rulers.ts index 56aa748b019..852eb07fb2c 100644 --- a/src/vs/editor/browser/viewParts/rulers/rulers.ts +++ b/src/vs/editor/browser/viewParts/rulers/rulers.ts @@ -25,6 +25,8 @@ export class Rulers extends ViewPart { constructor(context: ViewContext) { super(context); this.domNode = createFastDomNode(document.createElement('div')); + this.domNode.setAttribute('role', 'presentation'); + this.domNode.setAttribute('aria-hidden', 'true'); this.domNode.setClassName('view-rulers'); this._renderedRulers = []; this._rulers = this._context.configuration.editor.viewInfo.rulers; diff --git a/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts b/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts index 3b4252ea035..92134f722a1 100644 --- a/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts +++ b/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts @@ -31,6 +31,8 @@ export class ScrollDecorationViewPart extends ViewPart { this._shouldShow = false; this._useShadows = this._context.configuration.editor.viewInfo.scrollbar.useShadows; this._domNode = createFastDomNode(document.createElement('div')); + this._domNode.setAttribute('role', 'presentation'); + this._domNode.setAttribute('aria-hidden', 'true'); } public dispose(): void { diff --git a/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts b/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts index 974facb28f2..babe35b4178 100644 --- a/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts +++ b/src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts @@ -72,8 +72,6 @@ export class ViewCursor { this._domNode.setHeight(this._lineHeight); this._domNode.setTop(0); this._domNode.setLeft(0); - this._domNode.setAttribute('role', 'presentation'); - this._domNode.setAttribute('aria-hidden', 'true'); Configuration.applyFontInfo(this._domNode, this._context.configuration.editor.fontInfo); this._domNode.setDisplay('none'); diff --git a/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts b/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts index 566424aa72f..a5362a124b8 100644 --- a/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts +++ b/src/vs/editor/browser/viewParts/viewCursors/viewCursors.ts @@ -54,6 +54,8 @@ export class ViewCursors extends ViewPart { this._renderData = []; this._domNode = createFastDomNode(document.createElement('div')); + this._domNode.setAttribute('role', 'presentation'); + this._domNode.setAttribute('aria-hidden', 'true'); this._updateDomClassName(); this._domNode.appendChild(this._primaryCursor.getDomNode()); From 8d30b30eea0a17055a1e60cf7d65870290604c76 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 22 May 2017 11:31:25 +0200 Subject: [PATCH 0749/1164] Let the view get cursor state change events first --- src/vs/editor/browser/controller/textAreaHandler.css | 4 ++++ src/vs/editor/common/controller/cursor.ts | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/browser/controller/textAreaHandler.css b/src/vs/editor/browser/controller/textAreaHandler.css index 69fe6c8497a..19036f1115f 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.css +++ b/src/vs/editor/browser/controller/textAreaHandler.css @@ -24,6 +24,10 @@ left: initial !important; bottom: 0 !important; right: 0 !important; + color: black !important; + background: white !important; + line-height: 15px !important; + font-size: 14px !important; }*/ .monaco-editor .inputarea.ime-input { z-index: 10; diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 5f35c0942dc..e4cbc84ef08 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -372,8 +372,11 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { const selections = this._cursors.getSelections(); const viewSelections = this._cursors.getViewSelections(); - this._onDidChange.fire(new CursorStateChangedEvent(selections, source, reason)); + // Let the view get the event first. this._emit([new viewEvents.ViewCursorStateChangedEvent(viewSelections, isInEditableRange)]); + + // Only after the view has been notified, let the rest of the world know... + this._onDidChange.fire(new CursorStateChangedEvent(selections, source, reason)); } private _revealRange(revealTarget: RevealTarget, verticalType: viewEvents.VerticalRevealType, revealHorizontal: boolean): void { From 8aa69c52424340c6721a44c1cf3161c26b6be336 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 22 May 2017 11:32:55 +0200 Subject: [PATCH 0750/1164] Fix twistie alignment in views --- src/vs/workbench/parts/views/browser/media/views.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/vs/workbench/parts/views/browser/media/views.css b/src/vs/workbench/parts/views/browser/media/views.css index ec19ba40429..5eceb636e91 100644 --- a/src/vs/workbench/parts/views/browser/media/views.css +++ b/src/vs/workbench/parts/views/browser/media/views.css @@ -23,8 +23,4 @@ flex: 1; text-overflow: ellipsis; overflow: hidden; -} - -.custom-view-tree-node-item > .custom-view-tree-node-item-label .label { - vertical-align: middle; } \ No newline at end of file From e8c9db130067f7b963da30ec1ea83b1015a70f68 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 22 May 2017 11:38:41 +0200 Subject: [PATCH 0751/1164] fix aria role for expanded (do not use "undefined") --- src/vs/base/parts/tree/browser/treeView.ts | 2 +- src/vs/editor/contrib/find/browser/findWidget.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/base/parts/tree/browser/treeView.ts b/src/vs/base/parts/tree/browser/treeView.ts index 0836cf0bbec..ca7ec266b42 100644 --- a/src/vs/base/parts/tree/browser/treeView.ts +++ b/src/vs/base/parts/tree/browser/treeView.ts @@ -215,7 +215,7 @@ export class ViewItem implements IViewItem { this.element.removeAttribute('aria-labelledby'); } if (this.model.hasChildren()) { - this.element.setAttribute('aria-expanded', String(this.model.isExpanded())); + this.element.setAttribute('aria-expanded', String(!!this.model.isExpanded())); } else { this.element.removeAttribute('aria-expanded'); } diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index 70b5df9beb5..052efed4506 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -893,7 +893,7 @@ class SimpleButton extends Widget { } public setExpanded(expanded: boolean): void { - this._domNode.setAttribute('aria-expanded', String(expanded)); + this._domNode.setAttribute('aria-expanded', String(!!expanded)); } public toggleClass(className: string, shouldHaveIt: boolean): void { From fd2965124f912382ebe6d146f95c269f0b0b2537 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 22 May 2017 11:43:35 +0200 Subject: [PATCH 0752/1164] don't send vm hint as common property --- src/vs/platform/telemetry/node/workbenchCommonProperties.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/vs/platform/telemetry/node/workbenchCommonProperties.ts b/src/vs/platform/telemetry/node/workbenchCommonProperties.ts index 95f3e801d35..570bac18d00 100644 --- a/src/vs/platform/telemetry/node/workbenchCommonProperties.ts +++ b/src/vs/platform/telemetry/node/workbenchCommonProperties.ts @@ -9,7 +9,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import * as errors from 'vs/base/common/errors'; import * as uuid from 'vs/base/common/uuid'; import { IStorageService } from 'vs/platform/storage/common/storage'; -import { getMachineId, virtualMachineHint } from 'vs/base/node/id'; +import { getMachineId } from 'vs/base/node/id'; import { resolveCommonProperties, machineIdStorageKey } from '../node/commonProperties'; const SQM_KEY: string = '\\Software\\Microsoft\\SQMClient'; @@ -19,7 +19,6 @@ export function resolveWorkbenchCommonProperties(storageService: IStorageService result['common.version.shell'] = process.versions && (process).versions['electron']; result['common.version.renderer'] = process.versions && (process).versions['chrome']; result['common.osVersion'] = os.release(); - result['common.virtualMachineHint'] = virtualMachineHint.value().toString(); const lastSessionDate = storageService.get('telemetry.lastSessionDate'); const firstSessionDate = storageService.get('telemetry.firstSessionDate') || new Date().toUTCString(); From e48ab0af195321cbcd750cf98e17f5cbdb1c3549 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 22 May 2017 11:57:18 +0200 Subject: [PATCH 0753/1164] Tree views: Use light icon path for dark icon if not provided --- src/vs/workbench/api/node/extHostTreeViews.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTreeViews.ts b/src/vs/workbench/api/node/extHostTreeViews.ts index 9a27a7fa3a7..ee77533fc94 100644 --- a/src/vs/workbench/api/node/extHostTreeViews.ts +++ b/src/vs/workbench/api/node/extHostTreeViews.ts @@ -149,13 +149,14 @@ class ExtHostTreeView extends Disposable { } private massageTreeItem(extensionTreeItem: vscode.TreeItem): TreeItem { + const icon = this.getLightIconPath(extensionTreeItem); return { handle: ++this._itemHandlePool, label: extensionTreeItem.label, commandId: extensionTreeItem.command ? extensionTreeItem.command.command : void 0, contextValue: extensionTreeItem.contextValue, - icon: this.getLightIconPath(extensionTreeItem), - iconDark: this.getDarkIconPath(extensionTreeItem), + icon, + iconDark: this.getDarkIconPath(extensionTreeItem) || icon, collapsibleState: extensionTreeItem.collapsibleState, }; } From 146c76df369e358c117a1f9ebd0f65500f9a4731 Mon Sep 17 00:00:00 2001 From: Jan Niklas Hasse Date: Mon, 22 May 2017 11:57:54 +0200 Subject: [PATCH 0754/1164] Use pre-#25570 fonts as a fallback for system-ui (#26912) Workaround for: https://bugs.chromium.org/p/chromium/issues/detail?id=724393 --- extensions/markdown/package.json | 2 +- src/vs/workbench/electron-browser/media/shell.css | 2 +- .../workbench/parts/terminal/electron-browser/media/widgets.css | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/markdown/package.json b/extensions/markdown/package.json index 37ea7fb9506..4ffa3bd6b39 100644 --- a/extensions/markdown/package.json +++ b/extensions/markdown/package.json @@ -143,7 +143,7 @@ }, "markdown.preview.fontFamily": { "type": "string", - "default": "system-ui", + "default": "system-ui, 'Segoe WPC', 'Segoe UI', 'HelveticaNeue-Light', 'Ubuntu', 'Droid Sans', sans-serif", "description": "%markdown.preview.fontFamily.desc%" }, "markdown.preview.fontSize": { diff --git a/src/vs/workbench/electron-browser/media/shell.css b/src/vs/workbench/electron-browser/media/shell.css index 2c41ad5720a..5696fc87867 100644 --- a/src/vs/workbench/electron-browser/media/shell.css +++ b/src/vs/workbench/electron-browser/media/shell.css @@ -15,7 +15,7 @@ /* Font Families (with CJK support) */ -.monaco-shell { font-family: system-ui; } +.monaco-shell { font-family: system-ui, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", "Ubuntu", "Droid Sans", sans-serif; } .monaco-shell:lang(zh-Hans) { font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", "Noto Sans", "Microsoft YaHei", "PingFang SC", "Hiragino Sans GB", "Source Han Sans SC", "Source Han Sans CN", "Source Han Sans", sans-serif; } .monaco-shell:lang(zh-Hant) { font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", "Noto Sans", "Microsoft Jhenghei", "PingFang TC", "Source Han Sans TC", "Source Han Sans", "Source Han Sans TW", sans-serif; } .monaco-shell:lang(ja) { font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", "Noto Sans", "Meiryo", "Hiragino Kaku Gothic Pro", "Source Han Sans J", "Source Han Sans JP", "Source Han Sans", "Sazanami Gothic", "IPA Gothic", sans-serif; } diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/widgets.css b/src/vs/workbench/parts/terminal/electron-browser/media/widgets.css index 49b5376ff57..2549ad70163 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/media/widgets.css +++ b/src/vs/workbench/parts/terminal/electron-browser/media/widgets.css @@ -12,7 +12,7 @@ } .monaco-workbench .terminal-message-widget { - font-family: system-ui; + font-family: system-ui, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", "Ubuntu", "Droid Sans", sans-serif; font-size: 14px; line-height: 19px; padding: 4px 5px; From bcfedfd596b77a55e83f367fe7f8f08c2f9aae79 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 22 May 2017 12:05:15 +0200 Subject: [PATCH 0755/1164] fix #26851 --- .../api/node/extHostFileSystemEventService.ts | 6 ++--- .../api/extHostFileSystemEventService.test.ts | 26 +++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 src/vs/workbench/test/electron-browser/api/extHostFileSystemEventService.test.ts diff --git a/src/vs/workbench/api/node/extHostFileSystemEventService.ts b/src/vs/workbench/api/node/extHostFileSystemEventService.ts index abfcee9b75f..0e6ddf0a9ac 100644 --- a/src/vs/workbench/api/node/extHostFileSystemEventService.ts +++ b/src/vs/workbench/api/node/extHostFileSystemEventService.ts @@ -33,13 +33,13 @@ class FileSystemWatcher implements _FileSystemWatcher { constructor(dispatcher: Event, globPattern: string, ignoreCreateEvents?: boolean, ignoreChangeEvents?: boolean, ignoreDeleteEvents?: boolean) { this._config = 0; - if (!ignoreCreateEvents) { + if (ignoreCreateEvents) { this._config += 0b001; } - if (!ignoreChangeEvents) { + if (ignoreChangeEvents) { this._config += 0b010; } - if (!ignoreDeleteEvents) { + if (ignoreDeleteEvents) { this._config += 0b100; } diff --git a/src/vs/workbench/test/electron-browser/api/extHostFileSystemEventService.test.ts b/src/vs/workbench/test/electron-browser/api/extHostFileSystemEventService.test.ts new file mode 100644 index 00000000000..1bea8cfccef --- /dev/null +++ b/src/vs/workbench/test/electron-browser/api/extHostFileSystemEventService.test.ts @@ -0,0 +1,26 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import * as assert from 'assert'; +import { ExtHostFileSystemEventService } from 'vs/workbench/api/node/extHostFileSystemEventService'; + +suite('ExtHostFileSystemEventService', () => { + + + test('FileSystemWatcher ignore events properties are reversed #26851', function () { + + const watcher1 = new ExtHostFileSystemEventService().createFileSystemWatcher('**/somethingInteresting', false, false, false); + assert.equal(watcher1.ignoreChangeEvents, false); + assert.equal(watcher1.ignoreCreateEvents, false); + assert.equal(watcher1.ignoreDeleteEvents, false); + + const watcher2 = new ExtHostFileSystemEventService().createFileSystemWatcher('**/somethingBoring', true, true, true); + assert.equal(watcher2.ignoreChangeEvents, true); + assert.equal(watcher2.ignoreCreateEvents, true); + assert.equal(watcher2.ignoreDeleteEvents, true); + }); + +}); From a58c7a6f80593858022f3ca729b30bce5b83693d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 22 May 2017 12:21:19 +0200 Subject: [PATCH 0756/1164] Fix tests --- .../services/keybinding/test/keybindingEditing.test.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/services/keybinding/test/keybindingEditing.test.ts b/src/vs/workbench/services/keybinding/test/keybindingEditing.test.ts index 9a0d80873c6..cc4495e14e9 100644 --- a/src/vs/workbench/services/keybinding/test/keybindingEditing.test.ts +++ b/src/vs/workbench/services/keybinding/test/keybindingEditing.test.ts @@ -16,7 +16,8 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { KeyCode, SimpleKeybinding, ChordKeybinding } from 'vs/base/common/keyCodes'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import extfs = require('vs/base/node/extfs'); -import { TestTextFileService, TestEditorGroupService, TestLifecycleService, TestBackupFileService } from 'vs/workbench/test/workbenchTestServices'; +import { TestTextFileService, TestEditorGroupService, TestLifecycleService, TestBackupFileService, TestContextService } from 'vs/workbench/test/workbenchTestServices'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import uuid = require('vs/base/common/uuid'); import { ConfigurationService } from 'vs/platform/configuration/node/configurationService'; import { FileService } from 'vs/workbench/services/files/node/fileService'; @@ -66,6 +67,7 @@ suite('Keybindings Editing', () => { instantiationService.stub(IConfigurationService, 'getConfiguration', { 'eol': '\n' }); instantiationService.stub(IConfigurationService, 'onDidUpdateConfiguration', () => { }); + instantiationService.stub(IWorkspaceContextService, new TestContextService()); instantiationService.stub(ILifecycleService, new TestLifecycleService()); instantiationService.stub(IEditorGroupService, new TestEditorGroupService()); instantiationService.stub(ITelemetryService, NullTelemetryService); From be70f203a417e96bc40c0ef94dbbd65224b2cc61 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Mon, 22 May 2017 12:31:25 +0200 Subject: [PATCH 0757/1164] Fixes #26840: Hard crash (of everything) when terminating running task --- src/vs/base/node/terminateProcess.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/base/node/terminateProcess.sh b/src/vs/base/node/terminateProcess.sh index 2ec9e1c2ec3..acdcbf8ed42 100755 --- a/src/vs/base/node/terminateProcess.sh +++ b/src/vs/base/node/terminateProcess.sh @@ -1,7 +1,7 @@ #!/bin/bash terminateTree() { - for cpid in $(pgrep -P $1); do + for cpid in $(/usr/bin/pgrep -P $1); do terminateTree $cpid done kill -9 $1 > /dev/null 2>&1 From b4615a8f4e823acba2453ffc7e1bcccfbb615b1d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 22 May 2017 12:36:00 +0200 Subject: [PATCH 0758/1164] make `acceptSuggestionOnEnter` a tri state, #24420 --- src/vs/editor/common/config/commonEditorConfig.ts | 3 ++- src/vs/editor/common/config/editorOptions.ts | 10 +++++----- src/vs/editor/contrib/suggest/browser/suggest.ts | 3 +-- .../contrib/suggest/browser/suggestController.ts | 9 +++++++-- src/vs/monaco.d.ts | 6 +++--- 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index f541796f5c5..0850d315588 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -370,7 +370,8 @@ const editorConfiguration: IConfigurationNode = { 'description': nls.localize('suggestOnTriggerCharacters', "Controls if suggestions should automatically show up when typing trigger characters") }, 'editor.acceptSuggestionOnEnter': { - 'type': 'boolean', + 'type': 'string', + 'enum': ['on', 'smart', 'off'], 'default': EDITOR_DEFAULTS.contribInfo.acceptSuggestionOnEnter, 'description': nls.localize('acceptSuggestionOnEnter', "Controls if suggestions should be accepted on 'Enter' - in addition to 'Tab'. Helps to avoid ambiguity between inserting new lines or accepting suggestions.") }, diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index ce5208a0523..0f9f1473f36 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -364,9 +364,9 @@ export interface IEditorOptions { suggestOnTriggerCharacters?: boolean; /** * Accept suggestions on ENTER. - * Defaults to true. + * Defaults to 'on'. */ - acceptSuggestionOnEnter?: boolean; + acceptSuggestionOnEnter?: 'on' | 'smart' | 'off'; /** * Accept suggestions on provider defined characters. * Defaults to true. @@ -726,7 +726,7 @@ export interface EditorContribOptions { readonly formatOnType: boolean; readonly formatOnPaste: boolean; readonly suggestOnTriggerCharacters: boolean; - readonly acceptSuggestionOnEnter: boolean; + readonly acceptSuggestionOnEnter: 'on' | 'smart' | 'off'; readonly acceptSuggestionOnCommitCharacter: boolean; readonly snippetSuggestions: 'top' | 'bottom' | 'inline' | 'none'; readonly wordBasedSuggestions: boolean; @@ -1532,7 +1532,7 @@ export class EditorOptionsValidator { formatOnType: _boolean(opts.formatOnType, defaults.formatOnType), formatOnPaste: _boolean(opts.formatOnPaste, defaults.formatOnPaste), suggestOnTriggerCharacters: _boolean(opts.suggestOnTriggerCharacters, defaults.suggestOnTriggerCharacters), - acceptSuggestionOnEnter: _boolean(opts.acceptSuggestionOnEnter, defaults.acceptSuggestionOnEnter), + acceptSuggestionOnEnter: _stringSet<'on' | 'smart' | 'off'>(opts.acceptSuggestionOnEnter, defaults.acceptSuggestionOnEnter, ['on', 'smart', 'off']), acceptSuggestionOnCommitCharacter: _boolean(opts.acceptSuggestionOnCommitCharacter, defaults.acceptSuggestionOnCommitCharacter), snippetSuggestions: _stringSet<'top' | 'bottom' | 'inline' | 'none'>(opts.snippetSuggestions, defaults.snippetSuggestions, ['top', 'bottom', 'inline', 'none']), wordBasedSuggestions: _boolean(opts.wordBasedSuggestions, defaults.wordBasedSuggestions), @@ -1939,7 +1939,7 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { formatOnType: false, formatOnPaste: false, suggestOnTriggerCharacters: true, - acceptSuggestionOnEnter: true, + acceptSuggestionOnEnter: 'smart', acceptSuggestionOnCommitCharacter: true, snippetSuggestions: 'inline', wordBasedSuggestions: true, diff --git a/src/vs/editor/contrib/suggest/browser/suggest.ts b/src/vs/editor/contrib/suggest/browser/suggest.ts index 6f6a5dbff75..7c2db1e7321 100644 --- a/src/vs/editor/contrib/suggest/browser/suggest.ts +++ b/src/vs/editor/contrib/suggest/browser/suggest.ts @@ -15,14 +15,13 @@ import { CommonEditorRegistry } from 'vs/editor/common/editorCommonExtensions'; import { ISuggestResult, ISuggestSupport, ISuggestion, SuggestRegistry } from 'vs/editor/common/modes'; import { Position, IPosition } from 'vs/editor/common/core/position'; import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { EDITOR_DEFAULTS } from "vs/editor/common/config/editorOptions"; export const Context = { Visible: new RawContextKey('suggestWidgetVisible', false), MultipleSuggestions: new RawContextKey('suggestWidgetMultipleSuggestions', false), MakesTextEdit: new RawContextKey('suggestionMakesTextEdit', true), AcceptOnKey: new RawContextKey('suggestionSupportsAcceptOnKey', true), - AcceptSuggestionsOnEnter: new RawContextKey('acceptSuggestionOnEnter', EDITOR_DEFAULTS.contribInfo.acceptSuggestionOnEnter) + AcceptSuggestionsOnEnter: new RawContextKey('acceptSuggestionOnEnter', true) }; export interface ISuggestionItem { diff --git a/src/vs/editor/contrib/suggest/browser/suggestController.ts b/src/vs/editor/contrib/suggest/browser/suggestController.ts index 0468b72476d..688535972f3 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestController.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestController.ts @@ -102,7 +102,11 @@ export class SuggestController implements IEditorContribution { // Manage the acceptSuggestionsOnEnter context key let acceptSuggestionsOnEnter = SuggestContext.AcceptSuggestionsOnEnter.bindTo(_contextKeyService); let updateFromConfig = () => { - acceptSuggestionsOnEnter.set(this._editor.getConfiguration().contribInfo.acceptSuggestionOnEnter); + const { acceptSuggestionOnEnter } = this._editor.getConfiguration().contribInfo; + acceptSuggestionsOnEnter.set( + acceptSuggestionOnEnter === 'on' || acceptSuggestionOnEnter === 'smart' + || (acceptSuggestionOnEnter) === true + ); }; this._toDispose.push(this._editor.onDidChangeConfiguration((e) => updateFromConfig())); updateFromConfig(); @@ -129,7 +133,8 @@ export class SuggestController implements IEditorContribution { const endColumn = position.column; let value = true; if ( - this._model.state === State.Auto + this._editor.getConfiguration().contribInfo.acceptSuggestionOnEnter === 'smart' + && this._model.state === State.Auto && !item.suggestion.command && !item.suggestion.additionalTextEdits && item.suggestion.snippetType !== 'textmate' diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 83b45948f09..ba397445f67 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -2909,9 +2909,9 @@ declare module monaco.editor { suggestOnTriggerCharacters?: boolean; /** * Accept suggestions on ENTER. - * Defaults to true. + * Defaults to 'on'. */ - acceptSuggestionOnEnter?: boolean; + acceptSuggestionOnEnter?: 'on' | 'smart' | 'off'; /** * Accept suggestions on provider defined characters. * Defaults to true. @@ -3211,7 +3211,7 @@ declare module monaco.editor { readonly formatOnType: boolean; readonly formatOnPaste: boolean; readonly suggestOnTriggerCharacters: boolean; - readonly acceptSuggestionOnEnter: boolean; + readonly acceptSuggestionOnEnter: 'on' | 'smart' | 'off'; readonly acceptSuggestionOnCommitCharacter: boolean; readonly snippetSuggestions: 'top' | 'bottom' | 'inline' | 'none'; readonly wordBasedSuggestions: boolean; From aac718a2846a1854c6d23e259a7df33d06bf80d8 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 22 May 2017 13:23:17 +0200 Subject: [PATCH 0759/1164] Fix #25246 --- .../extensions/browser/extensionsActions.ts | 54 +++++++++++++++++++ .../parts/extensions/common/extensions.ts | 2 + .../extensions.contribution.ts | 5 +- .../electron-browser/extensionsViewlet.ts | 21 ++++++-- .../node/extensionsWorkbenchService.ts | 30 +++++++++-- 5 files changed, 105 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts index 6b29b621d0f..3c8866f1e60 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts @@ -31,6 +31,7 @@ import { IWindowService } from 'vs/platform/windows/common/windows'; import { IExtensionService, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import URI from 'vs/base/common/uri'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; export class InstallAction extends Action { @@ -681,6 +682,59 @@ export class CheckForUpdatesAction extends Action { } } +export class ToggleAutoUpdateAction extends Action { + + constructor( + id: string, + label: string, + private autoUpdateValue: boolean, + @IConfigurationService configurationService: IConfigurationService, + @IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService + ) { + super(id, label, '', true); + this.updateEnablement(); + configurationService.onDidUpdateConfiguration(() => this.updateEnablement()); + } + + private updateEnablement(): void { + this.enabled = this.extensionsWorkbenchService.isAutoUpdateEnabled !== this.autoUpdateValue; + } + + run(): TPromise { + return this.extensionsWorkbenchService.setAutoUpdate(this.autoUpdateValue); + } +} + +export class EnableAutoUpdateAction extends ToggleAutoUpdateAction { + + static ID = 'workbench.extensions.action.enableAutoUpdate'; + static LABEL = localize('enableAutoUpdate', "Enable Auto Updating Extensions"); + + constructor( + id = EnableAutoUpdateAction.ID, + label = EnableAutoUpdateAction.LABEL, + @IConfigurationService configurationService: IConfigurationService, + @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService + ) { + super(id, label, true, configurationService, extensionsWorkbenchService); + } +} + +export class DisableAutoUpdateAction extends ToggleAutoUpdateAction { + + static ID = 'workbench.extensions.action.disableAutoUpdate'; + static LABEL = localize('disableAutoUpdate', "Disable Auto Updating Extensions"); + + constructor( + id = EnableAutoUpdateAction.ID, + label = EnableAutoUpdateAction.LABEL, + @IConfigurationService configurationService: IConfigurationService, + @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService + ) { + super(id, label, false, configurationService, extensionsWorkbenchService); + } +} + export class UpdateAllAction extends Action { static ID = 'workbench.extensions.action.updateAllExtensions'; diff --git a/src/vs/workbench/parts/extensions/common/extensions.ts b/src/vs/workbench/parts/extensions/common/extensions.ts index f11cd884312..269fd45a7df 100644 --- a/src/vs/workbench/parts/extensions/common/extensions.ts +++ b/src/vs/workbench/parts/extensions/common/extensions.ts @@ -67,6 +67,7 @@ export interface IExtensionsWorkbenchService { _serviceBrand: any; onChange: Event; local: IExtension[]; + isAutoUpdateEnabled: boolean; queryLocal(): TPromise; queryGallery(options?: IQueryOptions): TPromise>; canInstall(extension: IExtension): boolean; @@ -77,6 +78,7 @@ export interface IExtensionsWorkbenchService { loadDependencies(extension: IExtension): TPromise; open(extension: IExtension, sideByside?: boolean): TPromise; checkForUpdates(): TPromise; + setAutoUpdate(autoUpdate: boolean): TPromise; } export const ConfigurationKey = 'extensions'; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts index c46c015065d..5fea11020e8 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts @@ -24,7 +24,7 @@ import { ExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/node/e import { OpenExtensionsViewletAction, InstallExtensionsAction, ShowOutdatedExtensionsAction, ShowRecommendedExtensionsAction, ShowRecommendedKeymapExtensionsAction, ShowWorkspaceRecommendedExtensionsAction, ShowPopularExtensionsAction, ShowInstalledExtensionsAction, ShowDisabledExtensionsAction, UpdateAllAction, ConfigureWorkspaceRecommendedExtensionsAction, - EnableAllAction, EnableAllWorkpsaceAction, DisableAllAction, DisableAllWorkpsaceAction, CheckForUpdatesAction, ShowExtensionPacksAction + EnableAllAction, EnableAllWorkpsaceAction, DisableAllAction, DisableAllWorkpsaceAction, CheckForUpdatesAction, ShowExtensionPacksAction, EnableAutoUpdateAction, DisableAutoUpdateAction } from 'vs/workbench/parts/extensions/browser/extensionsActions'; import { OpenExtensionsFolderAction, InstallVSIXAction } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions'; import { ExtensionsInput } from 'vs/workbench/parts/extensions/common/extensionsInput'; @@ -157,6 +157,9 @@ actionRegistry.registerWorkbenchAction(enableAllWorkspaceAction, 'Extensions: En const checkForUpdatesAction = new SyncActionDescriptor(CheckForUpdatesAction, CheckForUpdatesAction.ID, CheckForUpdatesAction.LABEL); actionRegistry.registerWorkbenchAction(checkForUpdatesAction, `Extensions: Check for Updates`, ExtensionsLabel); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(EnableAutoUpdateAction, EnableAutoUpdateAction.ID, EnableAutoUpdateAction.LABEL), `Extensions: Enable Auto Updating Extensions`, ExtensionsLabel); +actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DisableAutoUpdateAction, DisableAutoUpdateAction.ID, DisableAutoUpdateAction.LABEL), `Extensions: Disable Auto Updating Extensions`, ExtensionsLabel); + Registry.as(ConfigurationExtensions.Configuration) .registerConfiguration({ id: 'extensions', diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts index a6047bd0b25..63d676aa2fb 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts @@ -32,7 +32,8 @@ import { Delegate, Renderer } from 'vs/workbench/parts/extensions/browser/extens import { IExtensionsWorkbenchService, IExtension, IExtensionsViewlet, VIEWLET_ID, ExtensionState } from '../common/extensions'; import { ShowRecommendedExtensionsAction, ShowWorkspaceRecommendedExtensionsAction, ShowRecommendedKeymapExtensionsAction, ShowPopularExtensionsAction, ShowInstalledExtensionsAction, ShowDisabledExtensionsAction, - ShowOutdatedExtensionsAction, ClearExtensionsInputAction, ChangeSortAction, UpdateAllAction, CheckForUpdatesAction, DisableAllAction, EnableAllAction + ShowOutdatedExtensionsAction, ClearExtensionsInputAction, ChangeSortAction, UpdateAllAction, CheckForUpdatesAction, DisableAllAction, EnableAllAction, + EnableAutoUpdateAction, DisableAutoUpdateAction } from 'vs/workbench/parts/extensions/browser/extensionsActions'; import { InstallVSIXAction } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions'; import { IExtensionManagementService, IExtensionGalleryService, IExtensionTipsService, SortBy, SortOrder, IQueryOptions, LocalExtensionType } from 'vs/platform/extensionManagement/common/extensionManagement'; @@ -52,6 +53,7 @@ import { IModeService } from 'vs/editor/common/services/modeService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { inputForeground, inputBackground, inputBorder } from 'vs/platform/theme/common/colorRegistry'; import { attachListStyler } from 'vs/platform/theme/common/styler'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; interface SearchInputEvent extends Event { target: HTMLInputElement; @@ -71,6 +73,8 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { private secondaryActions: IAction[]; private disposables: IDisposable[] = []; + private isAutoUpdateEnabled: boolean; + constructor( @ITelemetryService telemetryService: ITelemetryService, @IExtensionGalleryService private galleryService: IExtensionGalleryService, @@ -86,12 +90,23 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { @IViewletService private viewletService: IViewletService, @IExtensionService private extensionService: IExtensionService, @IModeService private modeService: IModeService, - @IThemeService themeService: IThemeService + @IThemeService themeService: IThemeService, + @IConfigurationService private configurationService: IConfigurationService, ) { super(VIEWLET_ID, telemetryService, themeService); this.searchDelayer = new ThrottledDelayer(500); this.disposables.push(viewletService.onDidViewletOpen(this.onViewletOpen, this, this.disposables)); + this.isAutoUpdateEnabled = this.extensionsWorkbenchService.isAutoUpdateEnabled; + + this.configurationService.onDidUpdateConfiguration(() => { + const isAutoUpdateEnabled = this.extensionsWorkbenchService.isAutoUpdateEnabled; + if (this.isAutoUpdateEnabled !== isAutoUpdateEnabled) { + this.isAutoUpdateEnabled = isAutoUpdateEnabled; + this.secondaryActions = null; + this.updateTitleArea(); + } + }, this, this.disposables); } create(parent: Builder): TPromise { @@ -206,7 +221,7 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { this.instantiationService.createInstance(ChangeSortAction, 'extensions.sort.name', localize('sort by name', "Sort By: Name"), this.onSearchChange, 'name'), new Separator(), this.instantiationService.createInstance(CheckForUpdatesAction, CheckForUpdatesAction.ID, CheckForUpdatesAction.LABEL), - this.instantiationService.createInstance(UpdateAllAction, UpdateAllAction.ID, UpdateAllAction.LABEL), + ...(this.isAutoUpdateEnabled ? [this.instantiationService.createInstance(DisableAutoUpdateAction, DisableAutoUpdateAction.ID, DisableAutoUpdateAction.LABEL)] : [this.instantiationService.createInstance(UpdateAllAction, UpdateAllAction.ID, UpdateAllAction.LABEL), this.instantiationService.createInstance(EnableAutoUpdateAction, EnableAutoUpdateAction.ID, EnableAutoUpdateAction.LABEL)]), this.instantiationService.createInstance(InstallVSIXAction, InstallVSIXAction.ID, InstallVSIXAction.LABEL), new Separator(), this.instantiationService.createInstance(DisableAllAction, DisableAllAction.ID, DisableAllAction.LABEL), diff --git a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts index bcaad136e04..9f4f45594c4 100644 --- a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts @@ -26,6 +26,7 @@ import { import { getGalleryExtensionIdFromLocal, getGalleryExtensionTelemetryData, getLocalExtensionTelemetryData } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; import { IChoiceService, IMessageService } from 'vs/platform/message/common/message'; import Severity from 'vs/base/common/severity'; import URI from 'vs/base/common/uri'; @@ -308,12 +309,15 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { private _onChange: Emitter = new Emitter(); get onChange(): Event { return this._onChange.event; } + private _isAutoUpdateEnabled: boolean; + constructor( @IInstantiationService private instantiationService: IInstantiationService, @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IExtensionManagementService private extensionService: IExtensionManagementService, @IExtensionGalleryService private galleryService: IExtensionGalleryService, @IConfigurationService private configurationService: IConfigurationService, + @IConfigurationEditingService private configurationEditingService: IConfigurationEditingService, @ITelemetryService private telemetryService: ITelemetryService, @IMessageService private messageService: IMessageService, @IChoiceService private choiceService: IChoiceService, @@ -337,6 +341,17 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { .filter(uri => /^extension/.test(uri.path)) .on(this.onOpenExtensionUrl, this, this.disposables); + this._isAutoUpdateEnabled = this.configurationService.getConfiguration(ConfigurationKey).autoUpdate; + this.configurationService.onDidUpdateConfiguration(() => { + const isAutoUpdateEnabled = this.configurationService.getConfiguration(ConfigurationKey).autoUpdate; + if (this._isAutoUpdateEnabled !== isAutoUpdateEnabled) { + this._isAutoUpdateEnabled = isAutoUpdateEnabled; + if (this._isAutoUpdateEnabled) { + this.checkForUpdates(); + } + } + }, this, this.disposables); + this.queryLocal().done(() => this.eventuallySyncWithGallery(true)); } @@ -426,6 +441,17 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { return this.syncDelayer.trigger(() => this.syncWithGallery(), 0); } + get isAutoUpdateEnabled(): boolean { + return this._isAutoUpdateEnabled; + } + + setAutoUpdate(autoUpdate: boolean): TPromise { + if (this.isAutoUpdateEnabled === autoUpdate) { + return TPromise.as(null); + } + return this.configurationEditingService.writeConfiguration(ConfigurationTarget.USER, { key: 'extensions.autoUpdate', value: autoUpdate }); + } + private eventuallySyncWithGallery(immediate = false): void { const loop = () => this.syncWithGallery().then(() => this.eventuallySyncWithGallery()); const delay = immediate ? 0 : ExtensionsWorkbenchService.SyncPeriod; @@ -452,9 +478,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { } private autoUpdateExtensions(): TPromise { - const config = this.configurationService.getConfiguration(ConfigurationKey); - - if (!config.autoUpdate) { + if (!this.isAutoUpdateEnabled) { return TPromise.as(null); } From 093eac502f5546171f0f57aecfc9aa1c28bfa413 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 22 May 2017 13:47:01 +0200 Subject: [PATCH 0760/1164] allow offsets for fuzzyScore, towards #26096 --- src/vs/base/common/filters.ts | 74 ++++++++++++------------- src/vs/base/test/common/filters.test.ts | 7 +++ 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/src/vs/base/common/filters.ts b/src/vs/base/common/filters.ts index 19056d36a50..8719c8c662a 100644 --- a/src/vs/base/common/filters.ts +++ b/src/vs/base/common/filters.ts @@ -450,7 +450,7 @@ _seps[':'] = true; const enum Arrow { Top = 0b1, Diag = 0b10, Left = 0b100 } -export function fuzzyScore(pattern: string, word: string): [number, number[]] { +export function fuzzyScore(pattern: string, word: string, patternOffset: number = 0, wordOffset: number = 0): [number, number[]] { const patternLen = pattern.length > 100 ? 100 : pattern.length; const wordLen = word.length > 100 ? 100 : word.length; @@ -465,16 +465,16 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { const lowPattern = pattern.toLowerCase(); const lowWord = word.toLowerCase(); - let i = 0; - let j = 0; + let patternPos = patternOffset; + let wordPos = wordOffset; - while (i < patternLen && j < wordLen) { - if (lowPattern[i] === lowWord[j]) { - i += 1; + while (patternPos < patternLen && wordPos < wordLen) { + if (lowPattern[patternPos] === lowWord[wordPos]) { + patternPos += 1; } - j += 1; + wordPos += 1; } - if (i !== patternLen) { + if (patternPos !== patternLen) { // no simple matches found -> return early return undefined; } @@ -482,24 +482,24 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { // keep track of the maximum score let maxScore = -1; - for (i = 1; i <= patternLen; i++) { + for (patternPos = patternOffset + 1; patternPos <= patternLen; patternPos++) { let lastLowWordChar = ''; - for (j = 1; j <= wordLen; j++) { + for (wordPos = wordOffset + 1; wordPos <= wordLen; wordPos++) { let score = -1; - let lowWordChar = lowWord[j - 1]; - if (lowPattern[i - 1] === lowWordChar) { + let lowWordChar = lowWord[wordPos - 1]; + if (lowPattern[patternPos - 1] === lowWordChar) { - if (j === 1) { - if (pattern[i - 1] === word[j - 1]) { + if (wordPos === wordOffset + 1) { + if (pattern[patternPos - 1] === word[wordPos - 1]) { score = 7; } else { score = 5; } - } else if (lowWordChar !== word[j - 1]) { - if (pattern[i - 1] === word[j - 1]) { + } else if (lowWordChar !== word[wordPos - 1]) { + if (pattern[patternPos - 1] === word[wordPos - 1]) { score = 7; } else { score = 5; @@ -512,38 +512,38 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { } } - _scores[i][j] = score; + _scores[patternPos][wordPos] = score; if (score > maxScore) { maxScore = score; } - let diag = _table[i - 1][j - 1] + (score > 1 ? 1 : score); - let top = _table[i - 1][j] + -1; - let left = _table[i][j - 1] + -1; + let diag = _table[patternPos - 1][wordPos - 1] + (score > 1 ? 1 : score); + let top = _table[patternPos - 1][wordPos] + -1; + let left = _table[patternPos][wordPos - 1] + -1; if (left >= top) { // left or diag if (left > diag) { - _table[i][j] = left; - _arrows[i][j] = Arrow.Left; + _table[patternPos][wordPos] = left; + _arrows[patternPos][wordPos] = Arrow.Left; } else if (left === diag) { - _table[i][j] = left; - _arrows[i][j] = Arrow.Left | Arrow.Diag; + _table[patternPos][wordPos] = left; + _arrows[patternPos][wordPos] = Arrow.Left | Arrow.Diag; } else { - _table[i][j] = diag; - _arrows[i][j] = Arrow.Diag; + _table[patternPos][wordPos] = diag; + _arrows[patternPos][wordPos] = Arrow.Diag; } } else { // top or diag if (top > diag) { - _table[i][j] = top; - _arrows[i][j] = Arrow.Top; + _table[patternPos][wordPos] = top; + _arrows[patternPos][wordPos] = Arrow.Top; } else if (top === diag) { - _table[i][j] = top; - _arrows[i][j] = Arrow.Top | Arrow.Diag; + _table[patternPos][wordPos] = top; + _arrows[patternPos][wordPos] = Arrow.Top | Arrow.Diag; } else { - _table[i][j] = diag; - _arrows[i][j] = Arrow.Diag; + _table[patternPos][wordPos] = diag; + _arrows[patternPos][wordPos] = Arrow.Diag; } } @@ -562,7 +562,7 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { } let bucket: [number, number[]][] = []; - findAllMatches(patternLen, patternLen, wordLen, 0, [], bucket, false); + findAllMatches(patternLen, patternLen, patternOffset, wordLen, wordOffset, 0, [], bucket, false); if (bucket.length === 0) { return undefined; @@ -580,7 +580,7 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { return topMatch; } -function findAllMatches(patternLen: number, patternPos: number, wordPos: number, total: number, matches: number[], bucket: [number, number[]][], lastMatched: boolean): void { +function findAllMatches(patternLen: number, patternPos: number, patternOffset: number, wordPos: number, wordOffset: number, total: number, matches: number[], bucket: [number, number[]][], lastMatched: boolean): void { if (bucket.length >= 10) { return; @@ -588,7 +588,7 @@ function findAllMatches(patternLen: number, patternPos: number, wordPos: number, let simpleMatchCount = 0; - while (patternPos > 0 && wordPos > 0) { + while (patternPos > patternOffset && wordPos > wordOffset) { let score = _scores[patternPos][wordPos]; let arrow = _arrows[patternPos][wordPos]; @@ -609,8 +609,8 @@ function findAllMatches(patternLen: number, patternPos: number, wordPos: number, if (arrow & Arrow.Left) { // left findAllMatches( - patternLen, patternPos, - wordPos - 1, + patternLen, patternPos, patternOffset, + wordPos - 1, wordOffset, matches.length !== 0 ? total - 1 : total, matches.slice(0), bucket, lastMatched ); diff --git a/src/vs/base/test/common/filters.test.ts b/src/vs/base/test/common/filters.test.ts index ed8f708e757..797df43d1a2 100644 --- a/src/vs/base/test/common/filters.test.ts +++ b/src/vs/base/test/common/filters.test.ts @@ -325,6 +325,13 @@ suite('Filters', () => { assertMatches('f', ':foo', ':^foo', fuzzyScore); }); + test('fuzzyScore with offset', function () { + const matches = fuzzyScore('bc', 'abc', 0, 1); + assert.ok(matches); + const [, range] = matches; + assert.deepEqual(range, [1, 2]); + }); + function assertTopScore(filter: typeof fuzzyScore, pattern: string, expected: number, ...words: string[]) { let topScore = -(100 * 10); let topIdx = 0; From aa81dc3e6658e892b702a759e41c4b632901f84e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 22 May 2017 13:49:41 +0200 Subject: [PATCH 0761/1164] remove assertion that checks number of common properties --- .../telemetry/test/electron-browser/commonProperties.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/platform/telemetry/test/electron-browser/commonProperties.test.ts b/src/vs/platform/telemetry/test/electron-browser/commonProperties.test.ts index 2525949ec97..d66d22ec6a0 100644 --- a/src/vs/platform/telemetry/test/electron-browser/commonProperties.test.ts +++ b/src/vs/platform/telemetry/test/electron-browser/commonProperties.test.ts @@ -53,7 +53,6 @@ suite('Telemetry - common properties', function () { assert.ok('common.sqm.machineid' in props, 'machineid'); } - assert.equal(Object.keys(props).length, process.platform === 'win32' ? 18 : 16); }); }); From 9e80eade9c1adfd2339009598a96afefc44d885c Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 22 May 2017 13:52:16 +0200 Subject: [PATCH 0762/1164] fix test runner doc --- test/electron/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/electron/index.js b/test/electron/index.js index 0337a1421f7..f0883bd9ee9 100644 --- a/test/electron/index.js +++ b/test/electron/index.js @@ -13,7 +13,7 @@ const events = require('events'); const optimist = require('optimist') .describe('grep', 'only run tests matching ').alias('grep', 'g').alias('grep', 'f').string('grep') .describe('run', 'only run tests from ').string('run') - .describe('runGrep', 'only run tests matching ').boolean('runGrep') + .describe('runGlob', 'only run tests matching ').boolean('runGlob') .describe('build', 'run with build output (out-build)').boolean('build') .describe('coverage', 'generate coverage report').boolean('coverage') .describe('debug', 'open dev tools, keep window open, reuse app data').string('debug') From cbb27e8c6adc6f032d3b4f25efa78168f5fb746e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 22 May 2017 13:53:14 +0200 Subject: [PATCH 0763/1164] add runGrep as alias --- test/electron/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/electron/index.js b/test/electron/index.js index f0883bd9ee9..97529b3f84d 100644 --- a/test/electron/index.js +++ b/test/electron/index.js @@ -13,7 +13,7 @@ const events = require('events'); const optimist = require('optimist') .describe('grep', 'only run tests matching ').alias('grep', 'g').alias('grep', 'f').string('grep') .describe('run', 'only run tests from ').string('run') - .describe('runGlob', 'only run tests matching ').boolean('runGlob') + .describe('runGlob', 'only run tests matching ').boolean('runGlob').alias('runGrep') .describe('build', 'run with build output (out-build)').boolean('build') .describe('coverage', 'generate coverage report').boolean('coverage') .describe('debug', 'open dev tools, keep window open, reuse app data').string('debug') From cf0d02a2b2b02c131a5a1a71ece2089381f99140 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 22 May 2017 14:00:55 +0200 Subject: [PATCH 0764/1164] #25246 Fix tests --- .../extensions/test/electron-browser/extensionsActions.test.ts | 2 ++ .../test/electron-browser/extensionsWorkbenchService.test.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts index ca746ff803c..f0ae1aaabe1 100644 --- a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts +++ b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts @@ -30,6 +30,7 @@ import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtil import { IExtensionService } from 'vs/platform/extensions/common/extensions'; import { IWorkspaceContextService, WorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; suite('ExtensionsActions Test', () => { @@ -52,6 +53,7 @@ suite('ExtensionsActions Test', () => { instantiationService.stub(ITelemetryService, NullTelemetryService); instantiationService.set(IWorkspaceContextService, new WorkspaceContextService(TestWorkspace)); + instantiationService.stub(IConfigurationService, { onDidUpdateConfiguration: () => { }, getConfiguration: () => ({}) }); instantiationService.stub(IExtensionGalleryService, ExtensionGalleryService); diff --git a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts index 3940de57545..d42837e340e 100644 --- a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts +++ b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts @@ -31,6 +31,7 @@ import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtil import { IWorkspaceContextService, WorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { IChoiceService } from 'vs/platform/message/common/message'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; suite('ExtensionsWorkbenchService Test', () => { @@ -55,6 +56,7 @@ suite('ExtensionsWorkbenchService Test', () => { instantiationService.stub(IExtensionGalleryService, ExtensionGalleryService); instantiationService.set(IWorkspaceContextService, new WorkspaceContextService(TestWorkspace)); + instantiationService.stub(IConfigurationService, { onDidUpdateConfiguration: () => { }, getConfiguration: () => ({}) }); instantiationService.stub(IExtensionManagementService, ExtensionManagementService); instantiationService.stub(IExtensionManagementService, 'onInstallExtension', installEvent.event); From fc4da30933cf790e677a9243167a8ab8c1b92ab2 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 22 May 2017 15:28:42 +0200 Subject: [PATCH 0765/1164] compute sha256 hash of published assets --- build/tfs/common/publish.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/build/tfs/common/publish.ts b/build/tfs/common/publish.ts index d7a31ce7440..79dba115e40 100644 --- a/build/tfs/common/publish.ts +++ b/build/tfs/common/publish.ts @@ -7,6 +7,7 @@ import * as fs from 'fs'; import { execSync } from 'child_process'; +import { Readable } from 'stream'; import * as crypto from 'crypto'; import * as azure from 'azure-storage'; import * as mime from 'mime'; @@ -18,10 +19,9 @@ if (process.argv.length < 6) { process.exit(-1); } -function sha1hash(file: string): Promise { +function hashStream(hashName: string, stream: Readable): Promise { return new Promise((c, e) => { - const shasum = crypto.createHash('sha1'); - const stream = fs.createReadStream(file); + const shasum = crypto.createHash(hashName); stream .on('data', shasum.update.bind(shasum)) @@ -67,6 +67,7 @@ interface Asset { url: string; mooncakeUrl: string; hash: string; + sha256hash: string; } function createOrUpdate(commit: string, quality: string, platform: string, type: string, release: NewDocument, asset: Asset, isUpdate: boolean): Promise { @@ -162,8 +163,11 @@ async function publish(commit: string, quality: string, platform: string, type: console.log('Is Released:', isReleased); console.log('File:', file); - const hash = await sha1hash(file); - console.log('Hash:', hash); + const stream = fs.createReadStream(file); + const [sha1hash, sha256hash] = await Promise.all([hashStream('sha1', stream), hashStream('sha256', stream)]); + + console.log('SHA1:', sha1hash); + console.log('SHA256:', sha1hash); const blobName = commit + '/' + name; const storageAccount = process.env['AZURE_STORAGE_ACCOUNT_2']; @@ -207,7 +211,8 @@ async function publish(commit: string, quality: string, platform: string, type: type: type, url: `${process.env['AZURE_CDN_URL']}/${quality}/${blobName}`, mooncakeUrl: `${process.env['MOONCAKE_CDN_URL']}/${quality}/${blobName}`, - hash: hash + hash: sha1hash, + sha256hash }; const release = { From 5c94029940e07fc9e3f7c540c9d7c77f1dd94d35 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 22 May 2017 15:34:53 +0200 Subject: [PATCH 0766/1164] tfs: fix typo --- build/tfs/common/publish.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tfs/common/publish.ts b/build/tfs/common/publish.ts index 79dba115e40..ecf1148c2ff 100644 --- a/build/tfs/common/publish.ts +++ b/build/tfs/common/publish.ts @@ -167,7 +167,7 @@ async function publish(commit: string, quality: string, platform: string, type: const [sha1hash, sha256hash] = await Promise.all([hashStream('sha1', stream), hashStream('sha256', stream)]); console.log('SHA1:', sha1hash); - console.log('SHA256:', sha1hash); + console.log('SHA256:', sha256hash); const blobName = commit + '/' + name; const storageAccount = process.env['AZURE_STORAGE_ACCOUNT_2']; From cdd3d8eed2644522e22da6e45502b322a9258e3a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 22 May 2017 15:37:13 +0200 Subject: [PATCH 0767/1164] send telemetry when invalid timers have been computed --- .../performance.contribution.ts | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts index 0cc4a86b200..709ecbf800c 100644 --- a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts +++ b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts @@ -25,6 +25,7 @@ import { readdir } from 'vs/base/node/pfs'; import { release } from 'os'; import { stopProfiling } from 'vs/base/node/profiler'; import { virtualMachineHint } from 'vs/base/node/id'; +import { forEach } from "vs/base/common/collections"; class ProfilingHint implements IWorkbenchContribution { @@ -208,6 +209,36 @@ class StartupProfiler implements IWorkbenchContribution { } } +class PerformanceTelemetry implements IWorkbenchContribution { + + constructor( + @ITimerService private readonly _timerService: ITimerService, + @ITelemetryService private readonly _telemetryService: ITelemetryService, + @IExtensionService extensionService: IExtensionService, + ) { + TPromise.join([ + TPromise.timeout(7 * 1000), + extensionService.onReady() + ]).then(() => this._validateTimers()); + } + + getId(): string { + return 'performance.PerformanceTelemetry'; + } + + private _validateTimers(): void { + const { startupMetrics } = this._timerService; + const invalidTimers: string[] = []; + forEach(startupMetrics.timers, (entry) => { + if (entry.value < 0) { + invalidTimers.push(entry.key); + } + }); + this._telemetryService.publicLog('invalidTimers', { invalidTimers }); + } +} + const registry = Registry.as(Extensions.Workbench); registry.registerWorkbenchContribution(ProfilingHint); registry.registerWorkbenchContribution(StartupProfiler); +registry.registerWorkbenchContribution(PerformanceTelemetry); From e1f46c1f6a1fc131c6aca24870fa81be25dd8363 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 22 May 2017 15:44:22 +0200 Subject: [PATCH 0768/1164] send size of workbench.main.js --- .../performance.contribution.ts | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts index 709ecbf800c..5f86e8efa07 100644 --- a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts +++ b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts @@ -21,11 +21,12 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { join } from 'path'; import { localize } from 'vs/nls'; import { platform, Platform } from 'vs/base/common/platform'; -import { readdir } from 'vs/base/node/pfs'; +import { readdir, stat } from 'vs/base/node/pfs'; import { release } from 'os'; import { stopProfiling } from 'vs/base/node/profiler'; import { virtualMachineHint } from 'vs/base/node/id'; -import { forEach } from "vs/base/common/collections"; +import { forEach } from 'vs/base/common/collections'; +import URI from 'vs/base/common/uri'; class ProfilingHint implements IWorkbenchContribution { @@ -219,7 +220,10 @@ class PerformanceTelemetry implements IWorkbenchContribution { TPromise.join([ TPromise.timeout(7 * 1000), extensionService.onReady() - ]).then(() => this._validateTimers()); + ]).then(() => { + this._sendWorkbenchMainSizeTelemetry(); + this._validateTimers(); + }); } getId(): string { @@ -234,7 +238,14 @@ class PerformanceTelemetry implements IWorkbenchContribution { invalidTimers.push(entry.key); } }); - this._telemetryService.publicLog('invalidTimers', { invalidTimers }); + this._telemetryService.publicLog('perf:invalidTimers', { invalidTimers }); + } + + private _sendWorkbenchMainSizeTelemetry(): void { + const { fsPath } = URI.parse(require.toUrl('vs/workbench/electron-browser/workbench.main.js')); + stat(fsPath).then(stats => { + this._telemetryService.publicLog('perf:jsFileSize', { workbenchMain: stats.size }); + }); } } From d718403074bf3848f24715e1c22bde2191fcca78 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 22 May 2017 15:59:42 +0200 Subject: [PATCH 0769/1164] more accurate percentile values --- .../performance.contribution.ts | 71 +++++++++---------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts index 5f86e8efa07..820590107e2 100644 --- a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts +++ b/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts @@ -30,42 +30,39 @@ import URI from 'vs/base/common/uri'; class ProfilingHint implements IWorkbenchContribution { - // p80 to p90 by os&release + // p95 to p95 by os&release static readonly _percentiles: { [key: string]: [number, number] } = { - ['Linux_4.10.0-20-generic']: [3474, 6300], - ['Linux_4.10.0-21-generic']: [5342, 12022], - ['Linux_4.10.13-1-ARCH']: [3047, 4248], - ['Linux_4.10.13-200.fc25.x86_64']: [2380, 2895], - ['Linux_4.10.14-200.fc25.x86_64']: [5164, 14042], - ['Linux_4.4.0-21-generic']: [3777, 8160], - ['Linux_4.4.0-72-generic']: [6173, 10730], - ['Linux_4.4.0-75-generic']: [4769, 8560], - ['Linux_4.4.0-77-generic']: [3834, 7343], - ['Linux_4.4.0-78-generic']: [3115, 7078], - ['Linux_4.8.0-49-generic']: [7174, 10362], - ['Linux_4.8.0-51-generic']: [3906, 7385], - ['Linux_4.8.0-52-generic']: [6757, 13741], - ['Linux_4.9.0-2-amd64']: [4348, 8754], - ['Mac_14.5.0']: [4403, 7216], - ['Mac_15.4.0']: [3831, 4946], - ['Mac_15.5.0']: [5080, 8296], - ['Mac_15.6.0']: [4621, 7160], - ['Mac_16.0.0']: [4748, 11248], - ['Mac_16.1.0']: [4309, 6106], - ['Mac_16.3.0']: [2756, 3674], - ['Mac_16.4.0']: [3625, 5463], - ['Mac_16.5.0']: [3617, 5288], - ['Mac_16.6.0']: [3655, 5279], - ['Mac_16.7.0']: [4415, 6624], - ['Windows_10.0.10240']: [8284, 14438], - ['Windows_10.0.10586']: [5903, 9224], - ['Windows_10.0.14393']: [6065, 10567], - ['Windows_10.0.15063']: [5521, 8696], - ['Windows_10.0.16184']: [5604, 10671], - ['Windows_10.0.16188']: [7028, 12852], - ['Windows_10.0.16193']: [6431, 9628], - ['Windows_6.1.7601']: [7794, 15194], - ['Windows_6.3.9600']: [6129, 10188], + ['Windows_6.3.9600']: [35782, 35782], + ['Windows_6.1.7601']: [11160, 18366], + ['Windows_10.0.16199']: [10423, 17222], + ['Windows_10.0.16193']: [7503, 11033], + ['Windows_10.0.16188']: [8544, 8807], + ['Windows_10.0.15063']: [11085, 16837], + ['Windows_10.0.14393']: [12585, 32662], + ['Windows_10.0.10586']: [7047, 10944], + ['Windows_10.0.10240']: [16176, 16176], + ['Mac_16.7.0']: [2192, 4050], + ['Mac_16.6.0']: [8043, 10608], + ['Mac_16.5.0']: [4912, 11348], + ['Mac_16.4.0']: [3900, 4200], + ['Mac_16.3.0']: [7327, 7327], + ['Mac_16.1.0']: [6090, 6555], + ['Mac_16.0.0']: [32574, 32574], + ['Mac_15.6.0']: [16082, 17469], + ['Linux_4.9.0-3-amd64']: [2092, 2197], + ['Linux_4.9.0-2-amd64']: [9779, 9779], + ['Linux_4.8.0-52-generic']: [12803, 13257], + ['Linux_4.8.0-51-generic']: [2670, 2797], + ['Linux_4.8.0-040800-generic']: [3954, 3954], + ['Linux_4.4.0-78-generic']: [4218, 5891], + ['Linux_4.4.0-77-generic']: [6166, 6166], + ['Linux_4.11.2']: [1323, 1323], + ['Linux_4.10.15-200.fc25.x86_64']: [9270, 9480], + ['Linux_4.10.13-1-ARCH']: [7116, 8511], + ['Linux_4.10.11-100.fc24.x86_64']: [1845, 1845], + ['Linux_4.10.0-21-generic']: [14805, 16050], + ['Linux_3.19.0-84-generic']: [4840, 4840], + ['Linux_3.11.10-29-desktop']: [1637, 2891], }; private static readonly _myPercentiles = ProfilingHint._percentiles[`${Platform[platform]}_${release()}`]; @@ -95,8 +92,8 @@ class ProfilingHint implements IWorkbenchContribution { // Check that we have some data about this // OS version to which we can compare this startup. - // Then only go for startups between the 80th and - // 90th percentile. + // Then only go for startups between the 90 and + // 95th percentile. if (!Array.isArray(ProfilingHint._myPercentiles)) { return; } From 37b02d8ae4ff76175079bf5ccf875f50dd990e20 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 22 May 2017 16:09:58 +0200 Subject: [PATCH 0770/1164] update test/README --- test/README.md | 9 +++++---- test/electron/index.js | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/test/README.md b/test/README.md index cad17e421e9..60860e3f523 100644 --- a/test/README.md +++ b/test/README.md @@ -2,9 +2,7 @@ ## Run -The best way to run the Code tests is from within VS Code. Simply pressF1, type "run test" and press enter to launch the tests. To make development changes to unit tests you need to be running `gulp`. See [Development Workflow](https://github.com/Microsoft/vscode/wiki/How-to-Contribute#incremental-build) for more details. - -If you wish to run the tests from a terminal, from the `vscode` folder run: +The best way to run the Code tests is from the terminal. To make development changes to unit tests you need to be running `gulp`. See [Development Workflow](https://github.com/Microsoft/vscode/wiki/How-to-Contribute#incremental-build) for more details. From the `vscode` folder run: **OS X and Linux** @@ -14,9 +12,12 @@ If you wish to run the tests from a terminal, from the `vscode` folder run: scripts\test + ## Debug -You can use VS Code to debug your tests. Switch to the Debug viewlet, pick the `Unit Tests` debug target and press `Play`. +To debug tests use `--debug` when running the test script. Also, the set of tests can be reduced with the `--run` and `--runGlob` flags. Both require a file path/pattern. Like so: + + ./scripts/test.sh --debug --runGrep **/extHost*.test.js ## Coverage diff --git a/test/electron/index.js b/test/electron/index.js index 97529b3f84d..def0f881a7d 100644 --- a/test/electron/index.js +++ b/test/electron/index.js @@ -13,7 +13,7 @@ const events = require('events'); const optimist = require('optimist') .describe('grep', 'only run tests matching ').alias('grep', 'g').alias('grep', 'f').string('grep') .describe('run', 'only run tests from ').string('run') - .describe('runGlob', 'only run tests matching ').boolean('runGlob').alias('runGrep') + .describe('runGlob', 'only run tests matching ').alias('runGlob', 'runGrep').string('runGlob') .describe('build', 'run with build output (out-build)').boolean('build') .describe('coverage', 'generate coverage report').boolean('coverage') .describe('debug', 'open dev tools, keep window open, reuse app data').string('debug') From 2cda0cdb41de9f6a1bdc58492c17a7d67e5a3d39 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 22 May 2017 16:12:44 +0200 Subject: [PATCH 0771/1164] Update names in Tree api --- src/vs/vscode.proposed.d.ts | 16 ++++++++-------- src/vs/workbench/api/node/extHost.api.impl.ts | 4 ++-- src/vs/workbench/api/node/extHostTreeViews.ts | 6 +++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index c1cad09129d..cf0218df999 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -15,10 +15,10 @@ declare module 'vscode' { export namespace window { /** * Register a [TreeDataProvider](#TreeDataProvider) for the registered view `id`. - * @param id View id. + * @param viewId View id. * @param treeDataProvider A [TreeDataProvider](#TreeDataProvider) that provides tree data for the view */ - export function registerTreeDataProvider(id: string, treeDataProvider: TreeDataProvider): Disposable; + export function registerTreeDataProviderForView(viewId: string, treeDataProvider: TreeDataProvider): Disposable; } /** @@ -28,7 +28,7 @@ declare module 'vscode' { /** * An optional event to signal that an element or root has changed. */ - onDidChange?: Event; + onDidChangeTreeData?: Event; /** * get [TreeItem](#TreeItem) representation of the `element` @@ -51,29 +51,29 @@ declare module 'vscode' { /** * Label of the tree item */ - label: string; + readonly label: string; /** * The icon path for the tree item */ - iconPath?: string | Uri | { light: string | Uri; dark: string | Uri }; + readonly iconPath?: string | Uri | { light: string | Uri; dark: string | Uri }; /** * The [command](#Command) which should be run when the tree item * is open in the Source Control viewlet. */ - command?: Command; + readonly command?: Command; /** * Context value of the tree node */ - contextValue?: string; + readonly contextValue?: string; /** * Collapsible state of the tree item. * Required only when item has children. */ - collapsibleState?: TreeItemCollapsibleState; + readonly collapsibleState?: TreeItemCollapsibleState; } /** diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index a9cf6c35ce8..e87d48660eb 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -369,8 +369,8 @@ export function createApiFactory( sampleFunction: proposedApiFunction(extension, () => { return extHostMessageService.showMessage(Severity.Info, 'Hello Proposed Api!', {}, []); }), - registerTreeDataProvider: proposedApiFunction(extension, (id: string, treeDataProvider: vscode.TreeDataProvider): vscode.Disposable => { - return extHostTreeViews.registerTreeDataProvider(id, treeDataProvider); + registerTreeDataProviderForView: proposedApiFunction(extension, (viewId: string, treeDataProvider: vscode.TreeDataProvider): vscode.Disposable => { + return extHostTreeViews.registerTreeDataProviderForView(viewId, treeDataProvider); }) }; diff --git a/src/vs/workbench/api/node/extHostTreeViews.ts b/src/vs/workbench/api/node/extHostTreeViews.ts index ee77533fc94..b772b894593 100644 --- a/src/vs/workbench/api/node/extHostTreeViews.ts +++ b/src/vs/workbench/api/node/extHostTreeViews.ts @@ -39,7 +39,7 @@ export class ExtHostTreeViews extends ExtHostTreeViewsShape { }); } - registerTreeDataProvider(id: string, treeDataProvider: vscode.TreeDataProvider): vscode.Disposable { + registerTreeDataProviderForView(id: string, treeDataProvider: vscode.TreeDataProvider): vscode.Disposable { const treeView = new ExtHostTreeView(id, treeDataProvider, this._proxy); this.treeViews.set(id, treeView); return { @@ -86,8 +86,8 @@ class ExtHostTreeView extends Disposable { constructor(private viewId: string, private dataProvider: vscode.TreeDataProvider, private proxy: MainThreadTreeViewsShape) { super(); this.proxy.$registerView(viewId); - if (dataProvider.onDidChange) { - this._register(dataProvider.onDidChange(element => this._refresh(element))); + if (dataProvider.onDidChangeTreeData) { + this._register(dataProvider.onDidChangeTreeData(element => this._refresh(element))); } } From 0795b09e764136ba72618165cdd8035762870e80 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 22 May 2017 16:35:16 +0200 Subject: [PATCH 0772/1164] Udate context key for tree items --- src/vs/workbench/parts/views/browser/treeView.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/views/browser/treeView.ts b/src/vs/workbench/parts/views/browser/treeView.ts index d80990bbe72..12af2142c28 100644 --- a/src/vs/workbench/parts/views/browser/treeView.ts +++ b/src/vs/workbench/parts/views/browser/treeView.ts @@ -419,7 +419,7 @@ class Menus implements IDisposable { } getResourceContextActions(element: ITreeItem): IAction[] { - return this.getActions(MenuId.ViewResource, { key: 'resource', value: element.contextValue }).secondary; + return this.getActions(MenuId.ViewResource, { key: 'item', value: element.contextValue }).secondary; } private getActions(menuId: MenuId, context: { key: string, value: string }): { primary: IAction[]; secondary: IAction[]; } { @@ -431,7 +431,7 @@ class Menus implements IDisposable { const primary = []; const secondary = []; const result = { primary, secondary }; - fillInActions(menu, { shouldForwardArgs: true }, result, g => g === 'inline'); + fillInActions(menu, { shouldForwardArgs: true }, result); menu.dispose(); contextKeyService.dispose(); From d02524ff8ed38ad0b365a7862167ab93d5354e8a Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 22 May 2017 16:45:41 +0200 Subject: [PATCH 0773/1164] Update tree view item context keys --- src/vs/platform/actions/common/actions.ts | 2 +- src/vs/platform/actions/electron-browser/menusExtensionPoint.ts | 2 +- src/vs/workbench/parts/views/browser/treeView.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index f94c856c72e..84b232e0130 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -51,7 +51,7 @@ export class MenuId { static readonly SCMResourceContext = new MenuId('13'); static readonly CommandPalette = new MenuId('14'); static readonly ViewTitle = new MenuId('15'); - static readonly ViewResource = new MenuId('16'); + static readonly ViewItemContext = new MenuId('16'); constructor(private _id: string) { diff --git a/src/vs/platform/actions/electron-browser/menusExtensionPoint.ts b/src/vs/platform/actions/electron-browser/menusExtensionPoint.ts index 4896cdea038..a9a61d92d57 100644 --- a/src/vs/platform/actions/electron-browser/menusExtensionPoint.ts +++ b/src/vs/platform/actions/electron-browser/menusExtensionPoint.ts @@ -39,7 +39,7 @@ namespace schema { case 'scm/resourceGroup/context': return MenuId.SCMResourceGroupContext; case 'scm/resourceState/context': return MenuId.SCMResourceContext; case 'view/title': return MenuId.ViewTitle; - case 'view/resource': return MenuId.ViewResource; + case 'view/item/context': return MenuId.ViewItemContext; } return void 0; diff --git a/src/vs/workbench/parts/views/browser/treeView.ts b/src/vs/workbench/parts/views/browser/treeView.ts index 12af2142c28..0802faf97eb 100644 --- a/src/vs/workbench/parts/views/browser/treeView.ts +++ b/src/vs/workbench/parts/views/browser/treeView.ts @@ -419,7 +419,7 @@ class Menus implements IDisposable { } getResourceContextActions(element: ITreeItem): IAction[] { - return this.getActions(MenuId.ViewResource, { key: 'item', value: element.contextValue }).secondary; + return this.getActions(MenuId.ViewItemContext, { key: 'item', value: element.contextValue }).secondary; } private getActions(menuId: MenuId, context: { key: string, value: string }): { primary: IAction[]; secondary: IAction[]; } { From 9f896956eb23c465124b46df69faececc6b5eed6 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 22 May 2017 16:29:30 +0200 Subject: [PATCH 0774/1164] Have all cursor state changes go through the same _emitStateChangedIfNecessary method --- src/vs/editor/common/controller/cursor.ts | 82 +++++++++++-------- .../editor/common/controller/cursorCommon.ts | 4 + 2 files changed, 51 insertions(+), 35 deletions(-) diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index e4cbc84ef08..d6cf1d70d0e 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -53,6 +53,38 @@ export class CursorStateChangedEvent { } } +/** + * A snapshot of the cursor and the model state + */ +class CursorModelState { + + public readonly modelVersionId: number; + public readonly cursorState: CursorState[]; + + constructor(model: editorCommon.IModel, cursor: Cursor) { + this.modelVersionId = model.getVersionId(); + this.cursorState = cursor.getAll(); + } + + public equals(other: CursorModelState): boolean { + if (!other) { + return false; + } + if (this.modelVersionId !== other.modelVersionId) { + return false; + } + if (this.cursorState.length !== other.cursorState.length) { + return false; + } + for (let i = 0, len = this.cursorState.length; i < len; i++) { + if (!this.cursorState[i].equals(other.cursorState[i])) { + return false; + } + } + return true; + } +} + export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { private readonly _onDidChange: Emitter = this._register(new Emitter()); @@ -154,40 +186,14 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { return this._cursors.getAll(); } - private static _somethingChanged(oldSelections: Selection[], oldViewSelections: Selection[], newSelections: Selection[], newViewSelections: Selection[]): boolean { - if (oldSelections.length !== newSelections.length) { - return true; - } - - for (let i = 0, len = oldSelections.length; i < len; i++) { - if (!oldSelections[i].equalsSelection(newSelections[i])) { - return true; - } - } - - for (let i = 0, len = oldViewSelections.length; i < len; i++) { - if (!oldViewSelections[i].equalsSelection(newViewSelections[i])) { - return true; - } - } - - return false; - } - public setStates(source: string, reason: CursorChangeReason, states: CursorState[]): void { - const oldSelections = this._cursors.getSelections(); - const oldViewSelections = this._cursors.getViewSelections(); + const oldState = new CursorModelState(this._model, this); this._cursors.setStates(states); this._cursors.normalize(); this._columnSelectData = null; - const newSelections = this._cursors.getSelections(); - const newViewSelections = this._cursors.getViewSelections(); - - if (Cursor._somethingChanged(oldSelections, oldViewSelections, newSelections, newViewSelections)) { - this._emitStateChanged(source, reason); - } + this._emitStateChangedIfNecessary(source, reason, oldState); } public setColumnSelectData(columnSelectData: IColumnSelectData): void { @@ -279,7 +285,7 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { this._cursors.dispose(); this._cursors = new CursorCollection(this.context); - this._emitStateChanged('model', CursorChangeReason.ContentFlush); + this._emitStateChangedIfNecessary('model', CursorChangeReason.ContentFlush, null); } else { const selectionsFromMarkers = this._cursors.readSelectionFromMarkers(); this.setStates('modelChange', CursorChangeReason.RecoverFromMarkers, CursorState.fromModelSelections(selectionsFromMarkers)); @@ -356,6 +362,16 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { // ----------------------------------------------------------------------------------------------------------- // ----- emitting events + private _emitStateChangedIfNecessary(source: string, reason: CursorChangeReason, oldState: CursorModelState): boolean { + const newState = new CursorModelState(this._model, this); + if (newState.equals(oldState)) { + return false; + } + + this._emitStateChanged(source, reason); + return true; + } + private _emitStateChanged(source: string, reason: CursorChangeReason): void { source = source || 'keyboard'; @@ -436,8 +452,7 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { return; } - const oldSelections = this._cursors.getSelections(); - const oldViewSelections = this._cursors.getViewSelections(); + const oldState = new CursorModelState(this._model, this); let cursorChangeReason = CursorChangeReason.NotSet; // ensure valid state on all cursors @@ -488,10 +503,7 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { this._isHandling = false; - const newSelections = this._cursors.getSelections(); - const newViewSelections = this._cursors.getViewSelections(); - if (Cursor._somethingChanged(oldSelections, oldViewSelections, newSelections, newViewSelections)) { - this._emitStateChanged(source, cursorChangeReason); + if (this._emitStateChangedIfNecessary(source, cursorChangeReason, oldState)) { this._revealRange(RevealTarget.Primary, viewEvents.VerticalRevealType.Simple, true); } } diff --git a/src/vs/editor/common/controller/cursorCommon.ts b/src/vs/editor/common/controller/cursorCommon.ts index bc94291aab8..5a24b3c5016 100644 --- a/src/vs/editor/common/controller/cursorCommon.ts +++ b/src/vs/editor/common/controller/cursorCommon.ts @@ -411,6 +411,10 @@ export class CursorState { this.modelState = modelState; this.viewState = viewState; } + + public equals(other: CursorState): boolean { + return (this.viewState.equals(other.viewState) && this.modelState.equals(other.viewState)); + } } export class EditOperationResult { From 94c647f246c3e0a98f2234a1c2614415a6420736 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 22 May 2017 16:40:04 +0200 Subject: [PATCH 0775/1164] Simplification in cursor eventing --- src/vs/editor/common/commonCodeEditor.ts | 9 ++-- .../editor/common/controller/coreCommands.ts | 4 +- src/vs/editor/common/controller/cursor.ts | 41 ++++++------------- .../common/controller/cursorCollection.ts | 9 ---- .../editor/common/controller/cursorCommon.ts | 2 +- 5 files changed, 22 insertions(+), 43 deletions(-) diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index 4b2a542f673..d8b808d3f06 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -279,16 +279,17 @@ export abstract class CommonCodeEditor extends Disposable implements editorCommo } } - private _sendRevealRange(range: Range, verticalType: VerticalRevealType, revealHorizontal: boolean): void { + private _sendRevealRange(modelRange: Range, verticalType: VerticalRevealType, revealHorizontal: boolean): void { if (!this.model || !this.cursor) { return; } - if (!Range.isIRange(range)) { + if (!Range.isIRange(modelRange)) { throw new Error('Invalid arguments'); } - let validatedRange = this.model.validateRange(range); + const validatedModelRange = this.model.validateRange(modelRange); + const viewRange = this.viewModel.coordinatesConverter.convertModelRangeToViewRange(validatedModelRange); - this.cursor.emitCursorRevealRange(validatedRange, null, verticalType, revealHorizontal); + this.cursor.emitCursorRevealRange(viewRange, verticalType, revealHorizontal); } public revealLine(lineNumber: number): void { diff --git a/src/vs/editor/common/controller/coreCommands.ts b/src/vs/editor/common/controller/coreCommands.ts index d4ae88bfadd..639022470cd 100644 --- a/src/vs/editor/common/controller/coreCommands.ts +++ b/src/vs/editor/common/controller/coreCommands.ts @@ -1405,7 +1405,9 @@ export namespace CoreNavigationCommands { } } - cursors.revealRange(false, range, null, revealAt); + const viewRange = cursors.context.convertModelRangeToViewRange(range); + + cursors.revealRange(false, viewRange, revealAt); } }); diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index d6cf1d70d0e..bcec892c75d 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -204,8 +204,8 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { this._revealRange(target, viewEvents.VerticalRevealType.Simple, horizontal); } - public revealRange(revealHorizontal: boolean, modelRange: Range, viewRange: Range, verticalType: viewEvents.VerticalRevealType) { - this.emitCursorRevealRange(modelRange, viewRange, verticalType, revealHorizontal); + public revealRange(revealHorizontal: boolean, viewRange: Range, verticalType: viewEvents.VerticalRevealType) { + this.emitCursorRevealRange(viewRange, verticalType, revealHorizontal); } public scrollTo(desiredScrollTop: number): void { @@ -368,19 +368,11 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { return false; } - this._emitStateChanged(source, reason); - return true; - } - - private _emitStateChanged(source: string, reason: CursorChangeReason): void { - source = source || 'keyboard'; - - const positions = this._cursors.getPositions(); let isInEditableRange: boolean = true; if (this._model.hasEditableRange()) { const editableRange = this._model.getEditableRange(); - if (!editableRange.containsPosition(positions[0])) { + if (!editableRange.containsPosition(newState.cursorState[0].modelState.position)) { isInEditableRange = false; } } @@ -392,47 +384,40 @@ export class Cursor extends viewEvents.ViewEventEmitter implements ICursors { this._emit([new viewEvents.ViewCursorStateChangedEvent(viewSelections, isInEditableRange)]); // Only after the view has been notified, let the rest of the world know... - this._onDidChange.fire(new CursorStateChangedEvent(selections, source, reason)); + this._onDidChange.fire(new CursorStateChangedEvent(selections, source || 'keyboard', reason)); + + return true; } private _revealRange(revealTarget: RevealTarget, verticalType: viewEvents.VerticalRevealType, revealHorizontal: boolean): void { - const positions = this._cursors.getPositions(); const viewPositions = this._cursors.getViewPositions(); - let position = positions[0]; let viewPosition = viewPositions[0]; if (revealTarget === RevealTarget.TopMost) { - for (let i = 1; i < positions.length; i++) { - if (positions[i].isBefore(position)) { - position = positions[i]; + for (let i = 1; i < viewPositions.length; i++) { + if (viewPositions[i].isBefore(viewPosition)) { viewPosition = viewPositions[i]; } } } else if (revealTarget === RevealTarget.BottomMost) { - for (let i = 1; i < positions.length; i++) { - if (position.isBeforeOrEqual(positions[i])) { - position = positions[i]; + for (let i = 1; i < viewPositions.length; i++) { + if (viewPosition.isBeforeOrEqual(viewPositions[i])) { viewPosition = viewPositions[i]; } } } else { - if (positions.length > 1) { + if (viewPositions.length > 1) { // no revealing! return; } } - const range = new Range(position.lineNumber, position.column, position.lineNumber, position.column); const viewRange = new Range(viewPosition.lineNumber, viewPosition.column, viewPosition.lineNumber, viewPosition.column); - this.emitCursorRevealRange(range, viewRange, verticalType, revealHorizontal); + this.emitCursorRevealRange(viewRange, verticalType, revealHorizontal); } - public emitCursorRevealRange(range: Range, viewRange: Range, verticalType: viewEvents.VerticalRevealType, revealHorizontal: boolean) { - // Ensure event has viewRange - if (!viewRange) { - viewRange = this.context.convertModelRangeToViewRange(range); - } + public emitCursorRevealRange(viewRange: Range, verticalType: viewEvents.VerticalRevealType, revealHorizontal: boolean) { this._emit([new viewEvents.ViewRevealRangeRequestEvent(viewRange, verticalType, revealHorizontal)]); } diff --git a/src/vs/editor/common/controller/cursorCollection.ts b/src/vs/editor/common/controller/cursorCollection.ts index 2f176653af7..9fcae512f2f 100644 --- a/src/vs/editor/common/controller/cursorCollection.ts +++ b/src/vs/editor/common/controller/cursorCollection.ts @@ -60,15 +60,6 @@ export class CursorCollection { return result; } - public getPositions(): Position[] { - let result: Position[] = []; - result[0] = this.primaryCursor.modelState.position; - for (let i = 0, len = this.secondaryCursors.length; i < len; i++) { - result[i + 1] = this.secondaryCursors[i].modelState.position; - } - return result; - } - public getViewPositions(): Position[] { let result: Position[] = []; result[0] = this.primaryCursor.viewState.position; diff --git a/src/vs/editor/common/controller/cursorCommon.ts b/src/vs/editor/common/controller/cursorCommon.ts index 5a24b3c5016..e82708d17da 100644 --- a/src/vs/editor/common/controller/cursorCommon.ts +++ b/src/vs/editor/common/controller/cursorCommon.ts @@ -42,7 +42,7 @@ export interface ICursors { setStates(source: string, reason: CursorChangeReason, states: CursorState[]): void; reveal(horizontal: boolean, target: RevealTarget): void; - revealRange(revealHorizontal: boolean, modelRange: Range, viewRange: Range, verticalType: VerticalRevealType): void; + revealRange(revealHorizontal: boolean, viewRange: Range, verticalType: VerticalRevealType): void; scrollTo(desiredScrollTop: number): void; } From 87b95c2df66c0312051ec6353116d4153e44a9d3 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Mon, 22 May 2017 17:20:44 +0200 Subject: [PATCH 0776/1164] add nodePlatform and nodeArch to telemetry common data --- src/vs/platform/telemetry/node/commonProperties.ts | 2 ++ .../telemetry/test/electron-browser/commonProperties.test.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/vs/platform/telemetry/node/commonProperties.ts b/src/vs/platform/telemetry/node/commonProperties.ts index 6011ea38641..5e6611497c3 100644 --- a/src/vs/platform/telemetry/node/commonProperties.ts +++ b/src/vs/platform/telemetry/node/commonProperties.ts @@ -19,6 +19,8 @@ export function resolveCommonProperties(commit: string, version: string): TPromi result['version'] = version; result['common.osVersion'] = os.release(); result['common.platform'] = Platform.Platform[Platform.platform]; + result['common.nodePlatform'] = process.platform; + result['common.nodeArch'] = process.arch; // dynamic properties which value differs on each call let seq = 0; diff --git a/src/vs/platform/telemetry/test/electron-browser/commonProperties.test.ts b/src/vs/platform/telemetry/test/electron-browser/commonProperties.test.ts index d66d22ec6a0..54bd6cb5618 100644 --- a/src/vs/platform/telemetry/test/electron-browser/commonProperties.test.ts +++ b/src/vs/platform/telemetry/test/electron-browser/commonProperties.test.ts @@ -33,6 +33,8 @@ suite('Telemetry - common properties', function () { assert.ok('sessionID' in props); assert.ok('timestamp' in props); assert.ok('common.platform' in props); + assert.ok('common.nodePlatform' in props); + assert.ok('common.nodeArch' in props); assert.ok('common.timesincesessionstart' in props); assert.ok('common.sequence' in props); From b8e4b7f52d339e124d6cd4375448b9890692cbf2 Mon Sep 17 00:00:00 2001 From: Nick Snyder Date: Fri, 19 May 2017 14:27:24 -0700 Subject: [PATCH 0777/1164] Make SearchWidget dependencies injectable --- .../workbench/parts/search/browser/searchViewlet.ts | 8 +++----- src/vs/workbench/parts/search/browser/searchWidget.ts | 11 ++++++++--- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index c481f311de5..d6bbb549a38 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -42,13 +42,12 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IMessageService } from 'vs/platform/message/common/message'; import { IProgressService } from 'vs/platform/progress/common/progress'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { KeyCode } from 'vs/base/common/keyCodes'; import { PatternInputWidget, ExcludePatternInputWidget } from 'vs/workbench/parts/search/browser/patternInputWidget'; import { SearchRenderer, SearchDataSource, SearchSorter, SearchAccessibilityProvider, SearchFilter } from 'vs/workbench/parts/search/browser/searchResultsView'; -import { SearchWidget } from 'vs/workbench/parts/search/browser/searchWidget'; +import { SearchWidget, ISearchWidgetOptions } from 'vs/workbench/parts/search/browser/searchWidget'; import { RefreshAction, CollapseAllAction, ClearSearchResultsAction, ConfigureGlobalExclusionsAction } from 'vs/workbench/parts/search/browser/searchActions'; import { IReplaceService } from 'vs/workbench/parts/search/common/replace'; import Severity from 'vs/base/common/severity'; @@ -117,7 +116,6 @@ export class SearchViewlet extends Viewlet { @IWorkspaceContextService private contextService: IWorkspaceContextService, @ISearchWorkbenchService private searchWorkbenchService: ISearchWorkbenchService, @IContextKeyService private contextKeyService: IContextKeyService, - @IKeybindingService private keybindingService: IKeybindingService, @IReplaceService private replaceService: IReplaceService, @IUntitledEditorService private untitledEditorService: IUntitledEditorService, @IPreferencesService private preferencesService: IPreferencesService, @@ -290,12 +288,12 @@ export class SearchViewlet extends Viewlet { let isWholeWords = this.viewletSettings['query.wholeWords'] === true; let isCaseSensitive = this.viewletSettings['query.caseSensitive'] === true; - this.searchWidget = new SearchWidget(builder, this.contextViewService, this.themeService, { + this.searchWidget = this.instantiationService.createInstance(SearchWidget, builder, { value: contentPattern, isRegex: isRegex, isCaseSensitive: isCaseSensitive, isWholeWords: isWholeWords - }, this.contextKeyService, this.keybindingService, this.instantiationService); + }); if (this.storageService.getBoolean(SearchViewlet.SHOW_REPLACE_STORAGE_KEY, StorageScope.WORKSPACE, true)) { this.searchWidget.toggleReplace(true); diff --git a/src/vs/workbench/parts/search/browser/searchWidget.ts b/src/vs/workbench/parts/search/browser/searchWidget.ts index 69725a9ba8e..c9853dd70a1 100644 --- a/src/vs/workbench/parts/search/browser/searchWidget.ts +++ b/src/vs/workbench/parts/search/browser/searchWidget.ts @@ -21,7 +21,6 @@ import { IContextViewService } from 'vs/platform/contextview/browser/contextView import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import Event, { Emitter } from 'vs/base/common/event'; import { Builder } from 'vs/base/browser/builder'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { isSearchViewletFocussed, appendKeyBindingLabel } from 'vs/workbench/parts/search/browser/searchActions'; import { CONTEXT_FIND_WIDGET_NOT_VISIBLE } from 'vs/editor/contrib/find/common/findController'; @@ -111,8 +110,14 @@ export class SearchWidget extends Widget { private _onReplaceAll = this._register(new Emitter()); public onReplaceAll: Event = this._onReplaceAll.event; - constructor(container: Builder, private contextViewService: IContextViewService, private themeService: IThemeService, options: ISearchWidgetOptions = Object.create(null), - private keyBindingService: IContextKeyService, private keyBindingService2: IKeybindingService, private instantiationService: IInstantiationService) { + constructor( + container: Builder, + options: ISearchWidgetOptions, + @IContextViewService private contextViewService: IContextViewService, + @IThemeService private themeService: IThemeService, + @IContextKeyService private keyBindingService: IContextKeyService, + @IKeybindingService private keyBindingService2: IKeybindingService, + ) { super(); this.searchHistory = new HistoryNavigator(); this.replaceActive = Constants.ReplaceActiveKey.bindTo(this.keyBindingService); From 3315fcd486ee9ebd7e7280ac5fe079dbd64048c1 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Mon, 22 May 2017 17:34:16 +0200 Subject: [PATCH 0778/1164] First attempt to make the terminal the default runner. --- .../parts/tasks/common/taskSampleConfig.json | 6 -- .../parts/tasks/common/taskTemplates.ts | 56 +++++------ .../tasks/electron-browser/jsonSchema_v2.ts | 43 ++++++++- .../electron-browser/task.contribution.ts | 96 ++++++++----------- 4 files changed, 102 insertions(+), 99 deletions(-) delete mode 100644 src/vs/workbench/parts/tasks/common/taskSampleConfig.json diff --git a/src/vs/workbench/parts/tasks/common/taskSampleConfig.json b/src/vs/workbench/parts/tasks/common/taskSampleConfig.json deleted file mode 100644 index 5fc7fce47f9..00000000000 --- a/src/vs/workbench/parts/tasks/common/taskSampleConfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - // See https://go.microsoft.com/fwlink/?LinkId=733558 - // for the documentation about the tasks.json format - // Use IntelliSense to insert predefined task snippets - -} \ No newline at end of file diff --git a/src/vs/workbench/parts/tasks/common/taskTemplates.ts b/src/vs/workbench/parts/tasks/common/taskTemplates.ts index 01d2b68a0d0..d153e784935 100644 --- a/src/vs/workbench/parts/tasks/common/taskTemplates.ts +++ b/src/vs/workbench/parts/tasks/common/taskTemplates.ts @@ -22,11 +22,9 @@ const gulp: TaskEntry = { '{', '\t// See https://go.microsoft.com/fwlink/?LinkId=733558', '\t// for the documentation about the tasks.json format', - '\t"version": "0.1.0",', - '\t"command": "gulp",', + '\t"version": "2.0.0",', + '\t"command": "gulp --no-color",', '\t"isShellCommand": true,', - '\t"args": ["--no-color"],', - '\t"showOutput": "always"', '}' ].join('\n') }; @@ -39,11 +37,9 @@ const grunt: TaskEntry = { '{', '\t// See https://go.microsoft.com/fwlink/?LinkId=733558', '\t// for the documentation about the tasks.json format', - '\t"version": "0.1.0",', - '\t"command": "grunt",', + '\t"version": "2.0.0",', + '\t"command": "grunt --no-color",', '\t"isShellCommand": true,', - '\t"args": ["--no-color"],', - '\t"showOutput": "always"', '}' ].join('\n') }; @@ -57,23 +53,22 @@ const npm: TaskEntry = { '{', '\t// See https://go.microsoft.com/fwlink/?LinkId=733558', '\t// for the documentation about the tasks.json format', - '\t"version": "0.1.0",', - '\t"command": "npm",', - '\t"isShellCommand": true,', - '\t"showOutput": "always",', - '\t"suppressTaskName": true,', + '\t"version": "2.0.0",', '\t"tasks": [', '\t\t{', '\t\t\t"taskName": "install",', - '\t\t\t"args": ["install"]', + '\t\t\t"command": "npm install",', + '\t\t\t"isShellCommand": true,', '\t\t},', '\t\t{', '\t\t\t"taskName": "update",', - '\t\t\t"args": ["update"]', + '\t\t\t"command": "npm update",', + '\t\t\t"isShellCommand": true,', '\t\t},', '\t\t{', '\t\t\t"taskName": "test",', - '\t\t\t"args": ["run", "test"]', + '\t\t\t"command": "npm run test",', + '\t\t\t"isShellCommand": true,', '\t\t}', '\t]', '}' @@ -89,10 +84,9 @@ const tscConfig: TaskEntry = { '{', '\t// See https://go.microsoft.com/fwlink/?LinkId=733558', '\t// for the documentation about the tasks.json format', - '\t"version": "0.1.0",', - '\t"command": "tsc",', + '\t"version": "2.0.0",', + '\t"command": "tsc -p .",', '\t"isShellCommand": true,', - '\t"args": ["-p", "."],', '\t"showOutput": "silent",', '\t"problemMatcher": "$tsc"', '}' @@ -108,10 +102,9 @@ const tscWatch: TaskEntry = { '{', '\t// See https://go.microsoft.com/fwlink/?LinkId=733558', '\t// for the documentation about the tasks.json format', - '\t"version": "0.1.0",', - '\t"command": "tsc",', + '\t"version": "2.0.0",', + '\t"command": "tsc -w -p .",', '\t"isShellCommand": true,', - '\t"args": ["-w", "-p", "."],', '\t"showOutput": "silent",', '\t"isBackground": true,', '\t"problemMatcher": "$tsc-watch"', @@ -155,7 +148,7 @@ const msbuild: TaskEntry = { '{', '\t// See https://go.microsoft.com/fwlink/?LinkId=733558', '\t// for the documentation about the tasks.json format', - '\t"version": "0.1.0",', + '\t"version": "2.0.0",', '\t"command": "msbuild",', '\t"args": [', '\t\t// Ask msbuild to generate full paths for file names.', @@ -185,11 +178,9 @@ const command: TaskEntry = { '{', '\t// See https://go.microsoft.com/fwlink/?LinkId=733558', '\t// for the documentation about the tasks.json format', - '\t"version": "0.1.0",', - '\t"command": "echo",', + '\t"version": "2.0.0",', + '\t"command": "echo \"Hello World\"",', '\t"isShellCommand": true,', - '\t"args": ["Hello World"],', - '\t"showOutput": "always"', '}' ].join('\n') }; @@ -204,20 +195,19 @@ const maven: TaskEntry = { '{', '\t// See https://go.microsoft.com/fwlink/?LinkId=733558', '\t// for the documentation about the tasks.json format', - '\t"version": "0.1.0",', - '\t"command": "mvn",', - '\t"isShellCommand": true,', + '\t"version": "2.0.0",', '\t"showOutput": "always",', - '\t"suppressTaskName": true,', '\t"tasks": [', '\t\t{', '\t\t\t"taskName": "verify",', - '\t\t\t"args": ["-B", "verify"],', + '\t\t\t"command": "mvn -B verify",', + '\t\t\t"isShellCommand": true,', '\t\t\t"isBuildCommand": true', '\t\t},', '\t\t{', '\t\t\t"taskName": "test",', - '\t\t\t"args": ["-B", "test"],', + '\t\t\t"command": "mvn -B test",', + '\t\t\t"isShellCommand": true,', '\t\t\t"isTestCommand": true', '\t\t}', '\t]', diff --git a/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts b/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts index 441507853aa..4ece04baf2e 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts @@ -75,12 +75,47 @@ const dependsOn: IJSONSchema = { ] }; +const terminal: IJSONSchema = { + type: 'object', + default: { + reveal: 'always', + echo: false + }, + description: nls.localize('JsonSchema.tasks.terminal', 'Describe how the terminal used to execute a task behaves.'), + properties: { + echo: { + type: 'boolean', + default: false, + description: nls.localize('JsonSchema.tasks.terminal.echo', 'Controls whether the executed command is echoed to the terminal. Default is false.') + }, + reveal: { + type: 'string', + enum: ['always', 'silent', 'never'], + default: 'always', + description: nls.localize('JsonSchema.tasks.terminal.reveals', 'Controls whether the terminal running the task is revealed or not. Default is \"always\".') + } + } +}; + +const group: IJSONSchema = { + type: 'string', + enum: ['none', 'clean', 'build', 'rebuildAll', 'test'], + default: 'none', + description: nls.localize('JsonSchema.tasks.group', 'Defines to which execution group this task belongs to. If omitted the task belongs to no group') +}; + schema.definitions = Objects.deepClone(commonSchema.definitions); let definitions = schema.definitions; -definitions['commandConfiguration']['properties']['isShellCommand'] = Objects.deepClone(shellCommand); -definitions['taskDescription']['properties']['isShellCommand'] = Objects.deepClone(shellCommand); -definitions['taskDescription']['properties']['dependsOn'] = dependsOn; -definitions['taskRunnerConfiguration']['properties']['isShellCommand'] = Objects.deepClone(shellCommand); +definitions.commandConfiguration.properties.isShellCommand = Objects.deepClone(shellCommand); +definitions.taskDescription.properties.isShellCommand = Objects.deepClone(shellCommand); +definitions.taskDescription.properties.dependsOn = dependsOn; +definitions.showOutputType.deprecationMessage = nls.localize('JsonSchema.tasks.showOputput.deprecated', 'The property showOutput is deprecated. Use the terminal property instead.'); +definitions.taskDescription.properties.echoCommand.deprecationMessage = nls.localize('JsonSchema.tasks.echoCommand.deprecated', 'The property echoCommand is deprecated. Use the terminal property instead.'); +definitions.taskDescription.properties.isBuildCommand.deprecationMessage = nls.localize('JsonSchema.tasks.isBuildCommand.deprecated', 'The property isBuildCommand is deprecated. Use the group property instead.'); +definitions.taskDescription.properties.isTestCommand.deprecationMessage = nls.localize('JsonSchema.tasks.isTestCommand.deprecated', 'The property isTestCommand is deprecated. Use the group property instead.'); +definitions.taskDescription.properties.terminal = terminal; +definitions.taskDescription.properties.group = group; +definitions.taskRunnerConfiguration.properties.isShellCommand = Objects.deepClone(shellCommand); Object.getOwnPropertyNames(definitions).forEach(key => { let newKey = key + '2'; diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index 3aff765da6a..997b51b2823 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -85,30 +85,17 @@ let tasksCategory = nls.localize('tasksCategory', "Tasks"); abstract class OpenTaskConfigurationAction extends Action { - private configurationService: IConfigurationService; - private fileService: IFileService; - - private editorService: IWorkbenchEditorService; - private contextService: IWorkspaceContextService; - private outputService: IOutputService; - private messageService: IMessageService; - private quickOpenService: IQuickOpenService; - - constructor(id: string, label: string, @IConfigurationService configurationService: IConfigurationService, - @IWorkbenchEditorService editorService: IWorkbenchEditorService, @IFileService fileService: IFileService, - @IWorkspaceContextService contextService: IWorkspaceContextService, @IOutputService outputService: IOutputService, - @IMessageService messageService: IMessageService, @IQuickOpenService quickOpenService: IQuickOpenService, - @IEnvironmentService private environmentService: IEnvironmentService, - @IConfigurationResolverService private configurationResolverService: IConfigurationResolverService) { + constructor(id: string, label: string, + private taskService: ITaskService, + private configurationService: IConfigurationService, + private editorService: IWorkbenchEditorService, private fileService: IFileService, + private contextService: IWorkspaceContextService, private outputService: IOutputService, + private messageService: IMessageService, private quickOpenService: IQuickOpenService, + private environmentService: IEnvironmentService, + private configurationResolverService: IConfigurationResolverService, + private extensionService: IExtensionService) { super(id, label); - this.configurationService = configurationService; - this.editorService = editorService; - this.fileService = fileService; - this.contextService = contextService; - this.outputService = outputService; - this.messageService = messageService; - this.quickOpenService = quickOpenService; } public run(event?: any): TPromise { @@ -128,27 +115,18 @@ abstract class OpenTaskConfigurationAction extends Action { } let contentPromise: TPromise; if (selection.autoDetect) { - const outputChannel = this.outputService.getChannel(TaskService.OutputChannelId); - outputChannel.show(true); - outputChannel.append(nls.localize('ConfigureTaskRunnerAction.autoDetecting', 'Auto detecting tasks for {0}', selection.id) + '\n'); - let detector = new ProcessRunnerDetector(this.fileService, this.contextService, this.configurationResolverService); - contentPromise = detector.detect(false, selection.id).then((value) => { - let config = value.config; - if (value.stderr && value.stderr.length > 0) { - value.stderr.forEach((line) => { - outputChannel.append(line + '\n'); + contentPromise = this.extensionService.activateByEvent('onCommand:workbench.action.tasks.runTask').then(() => { + return this.taskService.tasks().then((tasks) => { + let tasksToInsert: Task[] = tasks.filter((task) => { + return task.identifier && task.identifier.indexOf(selection.id) === 0 && task.identifier[selection.id.length] === '.' && task.group !== void 0; }); - if (config && (!config.tasks || config.tasks.length === 0)) { - this.messageService.show(Severity.Warning, nls.localize('ConfigureTaskRunnerAction.autoDetect', 'Auto detecting the task system failed. Using default template. Consult the task output for details.')); + if (tasksToInsert.length === 0) { return selection.content; - } else { - this.messageService.show(Severity.Warning, nls.localize('ConfigureTaskRunnerAction.autoDetectError', 'Auto detecting the task system produced errors. Consult the task output for details.')); - } - } - if (config) { - if (value.stdout && value.stdout.length > 0) { - value.stdout.forEach(line => outputChannel.append(line + '\n')); } + let config: TaskConfig.ExternalTaskRunnerConfiguration = { + version: '2.0.0', + tasks: tasksToInsert.map((task) => { return { taskName: task.name }; }) + }; let content = JSON.stringify(config, null, '\t'); content = [ '{', @@ -156,9 +134,7 @@ abstract class OpenTaskConfigurationAction extends Action { '\t// for the documentation about the tasks.json format', ].join('\n') + content.substr(1); return content; - } else { - return selection.content; - } + }); }); } else { contentPromise = TPromise.as(selection.content); @@ -194,14 +170,17 @@ class ConfigureTaskRunnerAction extends OpenTaskConfigurationAction { public static ID = 'workbench.action.tasks.configureTaskRunner'; public static TEXT = nls.localize('ConfigureTaskRunnerAction.label', "Configure Task Runner"); - constructor(id: string, label: string, @IConfigurationService configurationService: IConfigurationService, + constructor(id: string, label: string, + @ITaskService taskService, @IConfigurationService configurationService: IConfigurationService, @IWorkbenchEditorService editorService: IWorkbenchEditorService, @IFileService fileService: IFileService, @IWorkspaceContextService contextService: IWorkspaceContextService, @IOutputService outputService: IOutputService, @IMessageService messageService: IMessageService, @IQuickOpenService quickOpenService: IQuickOpenService, @IEnvironmentService environmentService: IEnvironmentService, - @IConfigurationResolverService configurationResolverService: IConfigurationResolverService) { - super(id, label, configurationService, editorService, fileService, contextService, - outputService, messageService, quickOpenService, environmentService, configurationResolverService); + @IConfigurationResolverService configurationResolverService: IConfigurationResolverService, + @IExtensionService extensionService) { + super(id, label, taskService, configurationService, editorService, fileService, contextService, + outputService, messageService, quickOpenService, environmentService, configurationResolverService, + extensionService); } } @@ -210,14 +189,17 @@ class ConfigureBuildTaskAction extends OpenTaskConfigurationAction { public static ID = 'workbench.action.tasks.configureBuildTask'; public static TEXT = nls.localize('ConfigureBuildTaskAction.label', "Configure Build Task"); - constructor(id: string, label: string, @IConfigurationService configurationService: IConfigurationService, + constructor(id: string, label: string, + @ITaskService taskService, @IConfigurationService configurationService: IConfigurationService, @IWorkbenchEditorService editorService: IWorkbenchEditorService, @IFileService fileService: IFileService, @IWorkspaceContextService contextService: IWorkspaceContextService, @IOutputService outputService: IOutputService, @IMessageService messageService: IMessageService, @IQuickOpenService quickOpenService: IQuickOpenService, @IEnvironmentService environmentService: IEnvironmentService, - @IConfigurationResolverService configurationResolverService: IConfigurationResolverService) { - super(id, label, configurationService, editorService, fileService, contextService, - outputService, messageService, quickOpenService, environmentService, configurationResolverService); + @IConfigurationResolverService configurationResolverService: IConfigurationResolverService, + @IExtensionService extensionService) { + super(id, label, taskService, configurationService, editorService, fileService, contextService, + outputService, messageService, quickOpenService, environmentService, configurationResolverService, + extensionService); } } @@ -1072,7 +1054,7 @@ class TaskService extends EventEmitter implements ITaskService { private getExecutionEngine(): ExecutionEngine { let { config } = this.getConfiguration(); if (!config) { - return ExecutionEngine.Process; + return ExecutionEngine.Terminal; } return TaskConfig.ExecutionEngine.from(config); } @@ -1124,15 +1106,17 @@ class TaskService extends EventEmitter implements ITaskService { } public configureAction(): Action { - return new ConfigureTaskRunnerAction(ConfigureTaskRunnerAction.ID, ConfigureTaskRunnerAction.TEXT, + return new ConfigureTaskRunnerAction(ConfigureTaskRunnerAction.ID, ConfigureTaskRunnerAction.TEXT, this, this.configurationService, this.editorService, this.fileService, this.contextService, - this.outputService, this.messageService, this.quickOpenService, this.environmentService, this.configurationResolverService); + this.outputService, this.messageService, this.quickOpenService, this.environmentService, this.configurationResolverService, + this.extensionService); } private configureBuildTask(): Action { - return new ConfigureBuildTaskAction(ConfigureBuildTaskAction.ID, ConfigureBuildTaskAction.TEXT, + return new ConfigureBuildTaskAction(ConfigureBuildTaskAction.ID, ConfigureBuildTaskAction.TEXT, this, this.configurationService, this.editorService, this.fileService, this.contextService, - this.outputService, this.messageService, this.quickOpenService, this.environmentService, this.configurationResolverService); + this.outputService, this.messageService, this.quickOpenService, this.environmentService, this.configurationResolverService, + this.extensionService); } public beforeShutdown(): boolean | TPromise { From 68902f7ecee9926c0acb4b9d3324b16a3290c735 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 22 May 2017 18:20:17 +0200 Subject: [PATCH 0779/1164] Editor doesn't render any problem markers anymore. Fixes #27076 --- .../editor/browser/widget/codeEditorWidget.ts | 65 +++++++------------ .../browser/widget/media/green-squiggly.svg | 1 - .../browser/widget/media/red-squiggly.svg | 1 - 3 files changed, 23 insertions(+), 44 deletions(-) delete mode 100644 src/vs/editor/browser/widget/media/green-squiggly.svg delete mode 100644 src/vs/editor/browser/widget/media/red-squiggly.svg diff --git a/src/vs/editor/browser/widget/codeEditorWidget.ts b/src/vs/editor/browser/widget/codeEditorWidget.ts index 103e0f09568..0749b9d9171 100644 --- a/src/vs/editor/browser/widget/codeEditorWidget.ts +++ b/src/vs/editor/browser/widget/codeEditorWidget.ts @@ -30,10 +30,9 @@ import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IPosition } from 'vs/editor/common/core/position'; import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; import { CoreEditorCommand } from 'vs/editor/common/controller/coreCommands'; -import { isChrome } from "vs/base/browser/browser"; -import URI from "vs/base/common/uri"; import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { editorErrorForeground, editorErrorBorder, editorWarningForeground, editorWarningBorder } from "vs/editor/common/view/editorColorRegistry"; +import { editorErrorForeground, editorErrorBorder, editorWarningForeground, editorWarningBorder } from 'vs/editor/common/view/editorColorRegistry'; +import { Color } from 'vs/base/common/color'; export abstract class CodeEditorWidget extends CommonCodeEditor implements editorBrowser.ICodeEditor { @@ -548,47 +547,29 @@ class CodeEditorWidgetFocusTracker extends Disposable { } } -const errorIconPath = URI.parse(require.toUrl('vs/editor/browser/widget/media/red-squiggly.svg')).fsPath; -const warningIconPath = URI.parse(require.toUrl('vs/editor/browser/widget/media/green-squiggly.svg')).fsPath; +const squigglyStart = encodeURIComponent(``); + +function getSquigglySVGData(color: Color) { + return squigglyStart + encodeURIComponent(color.toString()) + squigglyEnd; +} + registerThemingParticipant((theme, collector) => { - - // webkit-mask only supported in chrome - if (isChrome) { - let errorForeground = theme.getColor(editorErrorForeground); - if (errorForeground) { - collector.addRule(`.monaco-editor .redsquiggly { background-color: ${errorForeground}; -webkit-mask: url("${errorIconPath}") repeat-x bottom left; }`); - } - - let errorBorderColor = theme.getColor(editorErrorBorder); - if (errorBorderColor) { - collector.addRule(`.monaco-editor .redsquiggly { border-bottom: 4px double ${errorBorderColor}; -webkit-mask: none; background: none; }`); - } - - let warningForeground = theme.getColor(editorWarningForeground); - if (warningForeground) { - collector.addRule(`.monaco-editor .greensquiggly { background-color: ${warningForeground}; -webkit-mask: url("${warningIconPath}") repeat-x bottom left; }`); - } - - let warningBorderColor = theme.getColor(editorWarningBorder); - if (warningBorderColor) { - collector.addRule(`.monaco-editor .greensquiggly { border-bottom: 4px double ${warningBorderColor}; -webkit-mask: none; background: none; }`); - } + let errorBorderColor = theme.getColor(editorErrorBorder); + if (errorBorderColor) { + collector.addRule(`.monaco-editor .redsquiggly { border-bottom: 4px double ${errorBorderColor}; }`); + } + let errorForeground = theme.getColor(editorErrorForeground); + if (errorForeground) { + collector.addRule(`.monaco-editor .redsquiggly { background: url("data:image/svg+xml,${getSquigglySVGData(errorForeground)}") repeat-x bottom left; }`); } - // Any other browser - else { - let errorBorderColor = theme.getColor(editorErrorBorder); - if (errorBorderColor) { - collector.addRule(`.monaco-editor .redsquiggly { border-bottom: 4px double ${errorBorderColor}; }`); - } else { - collector.addRule(`.monaco-editor .redsquiggly { background: url("${errorIconPath}") repeat-x bottom left; }`); - } - - let warningBorderColor = theme.getColor(editorWarningBorder); - if (warningBorderColor) { - collector.addRule(`.monaco-editor .greensquiggly { border-bottom: 4px double ${warningBorderColor}; }`); - } else { - collector.addRule(`.monaco-editor .greensquiggly { background: url("${warningIconPath}") repeat-x bottom left; }`); - } + let warningBorderColor = theme.getColor(editorWarningBorder); + if (warningBorderColor) { + collector.addRule(`.monaco-editor .greensquiggly { border-bottom: 4px double ${warningBorderColor}; }`); + } + let warningForeground = theme.getColor(editorWarningForeground); + if (warningForeground) { + collector.addRule(`.monaco-editor .greensquiggly { background: url("data:image/svg+xml;utf8,${getSquigglySVGData(warningForeground)}") repeat-x bottom left; }`); } }); \ No newline at end of file diff --git a/src/vs/editor/browser/widget/media/green-squiggly.svg b/src/vs/editor/browser/widget/media/green-squiggly.svg deleted file mode 100644 index 8fc5c6f099b..00000000000 --- a/src/vs/editor/browser/widget/media/green-squiggly.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/vs/editor/browser/widget/media/red-squiggly.svg b/src/vs/editor/browser/widget/media/red-squiggly.svg deleted file mode 100644 index 690406efa15..00000000000 --- a/src/vs/editor/browser/widget/media/red-squiggly.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From e5983e699c33df7983820ed9cf56ef041c663b50 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Mon, 22 May 2017 09:36:44 -0700 Subject: [PATCH 0780/1164] Show languages instead of extension packs --- .../parts/extensions/browser/extensionsActions.ts | 10 +++++----- .../electron-browser/extensions.contribution.ts | 6 +++--- .../page/electron-browser/vs_code_welcome_page.ts | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts index 3c8866f1e60..47ccf37113e 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts @@ -1102,11 +1102,11 @@ export class ShowRecommendedKeymapExtensionsAction extends Action { } } -export class ShowExtensionPacksAction extends Action { +export class ShowLanguageExtensionsAction extends Action { - static ID = 'workbench.extensions.action.showExtensionPacks'; - static LABEL = localize('showExtensionPacks', "Show Extension Packs"); - static SHORT_LABEL = localize('showExtensionPacksShort', "Extension Packs"); + static ID = 'workbench.extensions.action.showLanguageExtensions'; + static LABEL = localize('showLanguageExtensions', "Show Language Extensions"); + static SHORT_LABEL = localize('showLanguageExtensionsShort', "Language Extensions"); constructor( id: string, @@ -1120,7 +1120,7 @@ export class ShowExtensionPacksAction extends Action { return this.viewletService.openViewlet(VIEWLET_ID, true) .then(viewlet => viewlet as IExtensionsViewlet) .then(viewlet => { - viewlet.search('@sort:installs @category:"extension packs" '); + viewlet.search('@sort:installs @category:languages '); viewlet.focus(); }); } diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts index 5fea11020e8..4597ac4fbe8 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts @@ -24,7 +24,7 @@ import { ExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/node/e import { OpenExtensionsViewletAction, InstallExtensionsAction, ShowOutdatedExtensionsAction, ShowRecommendedExtensionsAction, ShowRecommendedKeymapExtensionsAction, ShowWorkspaceRecommendedExtensionsAction, ShowPopularExtensionsAction, ShowInstalledExtensionsAction, ShowDisabledExtensionsAction, UpdateAllAction, ConfigureWorkspaceRecommendedExtensionsAction, - EnableAllAction, EnableAllWorkpsaceAction, DisableAllAction, DisableAllWorkpsaceAction, CheckForUpdatesAction, ShowExtensionPacksAction, EnableAutoUpdateAction, DisableAutoUpdateAction + EnableAllAction, EnableAllWorkpsaceAction, DisableAllAction, DisableAllWorkpsaceAction, CheckForUpdatesAction, ShowLanguageExtensionsAction, EnableAutoUpdateAction, DisableAutoUpdateAction } from 'vs/workbench/parts/extensions/browser/extensionsActions'; import { OpenExtensionsFolderAction, InstallVSIXAction } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions'; import { ExtensionsInput } from 'vs/workbench/parts/extensions/common/extensionsInput'; @@ -115,8 +115,8 @@ actionRegistry.registerWorkbenchAction(recommendationsActionDescriptor, 'Extensi const keymapRecommendationsActionDescriptor = new SyncActionDescriptor(ShowRecommendedKeymapExtensionsAction, ShowRecommendedKeymapExtensionsAction.ID, ShowRecommendedKeymapExtensionsAction.SHORT_LABEL, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_M) }); actionRegistry.registerWorkbenchAction(keymapRecommendationsActionDescriptor, 'Preferences: Keymaps', PreferencesLabel); -const extensionPacksActionDescriptor = new SyncActionDescriptor(ShowExtensionPacksAction, ShowExtensionPacksAction.ID, ShowExtensionPacksAction.SHORT_LABEL); -actionRegistry.registerWorkbenchAction(extensionPacksActionDescriptor, 'Extensions: Extension Packs', PreferencesLabel); +const languageExtensionsActionDescriptor = new SyncActionDescriptor(ShowLanguageExtensionsAction, ShowLanguageExtensionsAction.ID, ShowLanguageExtensionsAction.SHORT_LABEL); +actionRegistry.registerWorkbenchAction(languageExtensionsActionDescriptor, 'Extensions: Language Extensions', PreferencesLabel); const workspaceRecommendationsActionDescriptor = new SyncActionDescriptor(ShowWorkspaceRecommendedExtensionsAction, ShowWorkspaceRecommendedExtensionsAction.ID, ShowWorkspaceRecommendedExtensionsAction.LABEL); actionRegistry.registerWorkbenchAction(workspaceRecommendationsActionDescriptor, 'Extensions: Show Workspace Recommended Extensions', ExtensionsLabel); diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts b/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts index 041c4026aa7..cc27fe4978c 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts +++ b/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts @@ -52,9 +52,9 @@ export default () => `

    ${escape(localize('welcomePage.customize', "Customize"))}

      -
    ' - ].join('\n')); - - assert.equal(snippet.placeHolders.length, 3); - assert.equal(snippet.finishPlaceHolderIndex, 2); - let [first, second, third] = snippet.placeHolders; - - assert.equal(third.id, 0); - assert.equal(third.occurences.length, 1); - assert.deepEqual(third.occurences[0], new Range(2, 2, 2, 2)); - - assert.equal(second.id, 2); - assert.equal(second.occurences.length, 1); - assert.deepEqual(second.occurences[0], new Range(1, 10, 1, 17)); - - assert.equal(first.id, '1'); - assert.equal(first.occurences.length, 1); - assert.deepEqual(first.occurences[0], new Range(1, 5, 1, 18)); - }); - - test('bug #17541:[snippets] Support default text in mirrors', () => { - - var external = [ - 'begin{${1:enumerate}}', - '\t$0', - 'end{$1}' - ].join('\n'); - - var internal = [ - 'begin\\{{{1:enumerate}}\\}', - '\t{{}}', - 'end\\{{{1:}}\\}' - ].join('\n'); - - assertInternalAndTextmate(internal, external, snippet => { - assert.deepEqual(snippet.lines, [ - 'begin{enumerate}', - '\t', - 'end{enumerate}' - ]); - assert.equal(snippet.placeHolders.length, 2); - assert.equal(snippet.placeHolders[0].id, '1'); - assert.equal(snippet.placeHolders[0].occurences.length, 2); - assert.deepEqual(snippet.placeHolders[0].occurences[0], new Range(1, 7, 1, 16)); - assert.deepEqual(snippet.placeHolders[0].occurences[1], new Range(3, 5, 3, 14)); - assert.equal(snippet.placeHolders[1].id, ''); - assert.equal(snippet.placeHolders[1].occurences.length, 1); - assert.deepEqual(snippet.placeHolders[1].occurences[0], new Range(2, 2, 2, 2)); - }); - }); - - test('bug #7093: Snippet default value is only populated for first variable reference', () => { - var internal = 'logger.error({ logContext: lc, errorContext: `{{1:err}}`, error: {{1:}} });'; - var external = 'logger.error({ logContext: lc, errorContext: `${1:err}`, error: $1 });'; - - assertInternalAndTextmate(internal, external, snippet => { - assert.equal(snippet.lines.length, 1); - assert.equal(snippet.lines[0], 'logger.error({ logContext: lc, errorContext: `err`, error: err });'); - }); - }); - - test('bug #17487:[snippets] four backslashes are required to get one backslash in the inserted text', () => { - - var external = [ - '\\begin{${1:enumerate}}', - '\t$0', - '\\end{$1}' - ].join('\n'); - - var internal = [ - '\\begin\\{{{1:enumerate}}\\}', - '\t{{}}', - '\\end\\{{{1:}}\\}' - ].join('\n'); - - assertInternalAndTextmate(internal, external, snippet => { - assert.deepEqual(snippet.lines, [ - '\\begin{enumerate}', - '\t', - '\\end{enumerate}' - ]); - assert.equal(snippet.placeHolders.length, 2); - assert.equal(snippet.placeHolders[0].id, '1'); - assert.equal(snippet.placeHolders[0].occurences.length, 2); - assert.deepEqual(snippet.placeHolders[0].occurences[0], new Range(1, 8, 1, 17)); - assert.deepEqual(snippet.placeHolders[0].occurences[1], new Range(3, 6, 3, 15)); - assert.equal(snippet.placeHolders[1].id, ''); - assert.equal(snippet.placeHolders[1].occurences.length, 1); - assert.deepEqual(snippet.placeHolders[1].occurences[0], new Range(2, 2, 2, 2)); - }); - }); - - test('issue #3552: Snippet Converted Not Working for literal Dollar Sign', () => { - - let external = '\n\\$scope.\\$broadcast(\'scroll.infiniteScrollComplete\');\n'; - let snippet = CodeSnippet.fromTextmate(external); - assert.equal(snippet.placeHolders.length, 1); - assert.equal(snippet.finishPlaceHolderIndex, 0); - assert.deepEqual(snippet.lines, ['', '$scope.$broadcast(\'scroll.infiniteScrollComplete\');', '']); - }); - - test('bind, adjust indentation', () => { - - // don't move placeholder at the beginning of the line - let snippet = CodeSnippet.fromTextmate([ - 'afterEach((done) => {', - '\t${1}test${2}', - '})' - ].join('\n')); - - // replace tab-stop with two spaces - let boundSnippet = snippet.bind('', 0, 0, { - normalizeIndentation(str: string): string { - return str.replace(/\t/g, ' '); - } - }); - let [first, second] = boundSnippet.placeHolders; - assert.equal(first.occurences.length, 1); - assert.equal(first.occurences[0].startColumn, 3); - assert.equal(second.occurences.length, 1); - assert.equal(second.occurences[0].startColumn, 7); - - // keep tab-stop, identity - boundSnippet = snippet.bind('', 0, 0, { - normalizeIndentation(str: string): string { - return str; - } - }); - [first, second] = boundSnippet.placeHolders; - assert.equal(first.occurences.length, 1); - assert.equal(first.occurences[0].startColumn, 2); - assert.equal(second.occurences.length, 1); - assert.equal(second.occurences[0].startColumn, 6); - }); - - - test('issue #11890: Bad cursor position 1/2', () => { - - let snippet = CodeSnippet.fromTextmate([ - 'afterEach((done) => {', - '${1}\ttest${2}', - '})' - ].join('\n')); - - let boundSnippet = snippet.bind('', 0, 0, { - normalizeIndentation(str: string): string { - return str.replace(/\t/g, ' '); - } - }); - - assert.equal(boundSnippet.lines[1], ' test'); - assert.equal(boundSnippet.placeHolders.length, 3); - assert.equal(boundSnippet.finishPlaceHolderIndex, 2); - - let [first, second] = boundSnippet.placeHolders; - assert.equal(first.occurences.length, 1); - assert.equal(first.occurences[0].startColumn, 1); - assert.equal(second.occurences.length, 1); - assert.equal(second.occurences[0].startColumn, 7); - }); - - test('issue #11890: Bad cursor position 2/2', () => { - - let snippet = CodeSnippet.fromTextmate('${1}\ttest'); - - let boundSnippet = snippet.bind('abc abc abc prefix3', 0, 12, { - normalizeIndentation(str: string): string { - return str.replace(/\t/g, ' '); - } - }); - - assert.equal(boundSnippet.lines[0], '\ttest'); - assert.equal(boundSnippet.placeHolders.length, 2); - assert.equal(boundSnippet.finishPlaceHolderIndex, 1); - - let [first, second] = boundSnippet.placeHolders; - assert.equal(first.occurences.length, 1); - assert.equal(first.occurences[0].startColumn, 13); - assert.equal(second.occurences.length, 1); - assert.equal(second.occurences[0].startColumn, 18); - }); - - test('issue #17989: Bad selection', () => { - - let snippet = CodeSnippet.fromTextmate('${1:HoldMeTight}'); - - let boundSnippet = snippet.bind('abc abc abc prefix3', 0, 12, { - normalizeIndentation(str: string): string { - return str.replace(/\t/g, ' '); - } - }); - - assert.equal(boundSnippet.lines[0], 'HoldMeTight'); - assert.equal(boundSnippet.placeHolders.length, 2); - assert.equal(boundSnippet.finishPlaceHolderIndex, 1); - let [first, second] = boundSnippet.placeHolders; - assert.equal(first.occurences.length, 1); - assert.equal(first.occurences[0].startColumn, 13); - - assert.equal(second.occurences.length, 1); - assert.equal(second.occurences[0].startColumn, 24); - - }); - - test('variables, simple', () => { - - const resolver: ISnippetVariableResolver = { - resolve(name) { - return name.split('').reverse().join(''); - } - }; - - // simple - let snippet = CodeSnippet.fromTextmate('$FOO', resolver); - assert.equal(snippet.lines[0], 'OOF'); - assert.equal(snippet.placeHolders.length, 1); - assert.equal(snippet.placeHolders[0].occurences[0].endColumn, 4); - - snippet = CodeSnippet.fromTextmate('${FOO:BAR}', resolver); - assert.equal(snippet.lines[0], 'OOF'); - assert.equal(snippet.placeHolders.length, 1); - assert.equal(snippet.placeHolders[0].occurences[0].endColumn, 4); - - // placeholder - snippet = CodeSnippet.fromTextmate('${1:$FOO}bar$1', resolver); - assert.equal(snippet.lines[0], 'OOFbarOOF'); - assert.equal(snippet.placeHolders.length, 2); - assert.equal(snippet.placeHolders[0].occurences.length, 2); - assert.equal(snippet.placeHolders[0].occurences[0].startColumn, 1); - assert.equal(snippet.placeHolders[0].occurences[0].endColumn, 4); - assert.equal(snippet.placeHolders[0].occurences[1].startColumn, 7); - assert.equal(snippet.placeHolders[0].occurences[1].endColumn, 10); - assert.equal(snippet.placeHolders[1].occurences.length, 1); - - snippet = CodeSnippet.fromTextmate('${1:${FOO:abc}}bar$1', resolver); - assert.equal(snippet.lines[0], 'OOFbarOOF'); - }); - - test('variables, evil resolver', () => { - - let snippet = CodeSnippet.fromTextmate('$FOO', { resolve(): string { throw new Error(); } }); - assert.equal(snippet.lines[0], 'FOO'); - }); - - test('variables, default', () => { - - let snippet = CodeSnippet.fromTextmate('$FOO', { resolve(): string { return undefined; } }); - assert.equal(snippet.lines[0], 'FOO'); - - snippet = CodeSnippet.fromTextmate('$FOO', { resolve(): string { return ''; } }); - assert.equal(snippet.lines[0], ''); - - snippet = CodeSnippet.fromTextmate('${FOO:BAR}', { resolve(): string { return undefined; } }); - assert.equal(snippet.lines[0], 'BAR'); - - snippet = CodeSnippet.fromTextmate('${FOO:BAR}', { resolve(): string { return ''; } }); - assert.equal(snippet.lines[0], 'BAR'); - }); -}); - diff --git a/src/vs/editor/contrib/snippet/test/common/snippetController.test.ts b/src/vs/editor/contrib/snippet/test/common/snippetController.test.ts deleted file mode 100644 index 75ddf1777cf..00000000000 --- a/src/vs/editor/contrib/snippet/test/common/snippetController.test.ts +++ /dev/null @@ -1,553 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import * as assert from 'assert'; -import { Range } from 'vs/editor/common/core/range'; -import { Position } from 'vs/editor/common/core/position'; -import { Selection } from 'vs/editor/common/core/selection'; -import { CodeSnippet } from 'vs/editor/contrib/snippet/common/snippet'; -import { SnippetController } from 'vs/editor/contrib/snippet/common/snippetController'; -import { MockCodeEditor, withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; -import { Cursor } from 'vs/editor/common/controller/cursor'; - -class TestSnippetController extends SnippetController { - - isInSnippetMode(): boolean { - return !!this._currentController; - } - -} - -suite('SnippetController', () => { - - function snippetTest(cb: (editor: MockCodeEditor, cursor: Cursor, codeSnippet: CodeSnippet, snippetController: TestSnippetController) => void, lines?: string[]): void { - - if (!lines) { - lines = [ - 'function test() {', - '\tvar x = 3;', - '\tvar arr = [];', - '\t', - '}' - ]; - }; - - withMockCodeEditor(lines, {}, (editor, cursor) => { - editor.getModel().updateOptions({ - insertSpaces: false - }); - let snippetController = editor.registerAndInstantiateContribution(TestSnippetController); - let codeSnippet = CodeSnippet.fromInternal([ - 'for (var {{index}}; {{index}} < {{array}}.length; {{index}}++) {', - '\tvar element = {{array}}[{{index}}];', - '\t{{}}', - '}' - ].join('\n')); - - cb(editor, cursor, codeSnippet, snippetController); - - snippetController.dispose(); - }); - } - - test('Simple accepted', () => { - snippetTest((editor, cursor, codeSnippet, snippetController) => { - editor.setPosition({ lineNumber: 4, column: 2 }); - - snippetController.run(codeSnippet, 0, 0); - assert.equal(editor.getModel().getLineContent(4), '\tfor (var index; index < array.length; index++) {'); - assert.equal(editor.getModel().getLineContent(5), '\t\tvar element = array[index];'); - assert.equal(editor.getModel().getLineContent(6), '\t\t'); - assert.equal(editor.getModel().getLineContent(7), '\t}'); - - editor.trigger('test', 'type', { text: 'i' }); - assert.equal(editor.getModel().getLineContent(4), '\tfor (var i; i < array.length; i++) {'); - assert.equal(editor.getModel().getLineContent(5), '\t\tvar element = array[i];'); - assert.equal(editor.getModel().getLineContent(6), '\t\t'); - assert.equal(editor.getModel().getLineContent(7), '\t}'); - - snippetController.jumpToNextPlaceholder(); - editor.trigger('test', 'type', { text: 'arr' }); - assert.equal(editor.getModel().getLineContent(4), '\tfor (var i; i < arr.length; i++) {'); - assert.equal(editor.getModel().getLineContent(5), '\t\tvar element = arr[i];'); - assert.equal(editor.getModel().getLineContent(6), '\t\t'); - assert.equal(editor.getModel().getLineContent(7), '\t}'); - - snippetController.jumpToPrevPlaceholder(); - editor.trigger('test', 'type', { text: 'j' }); - assert.equal(editor.getModel().getLineContent(4), '\tfor (var j; j < arr.length; j++) {'); - assert.equal(editor.getModel().getLineContent(5), '\t\tvar element = arr[j];'); - assert.equal(editor.getModel().getLineContent(6), '\t\t'); - assert.equal(editor.getModel().getLineContent(7), '\t}'); - - snippetController.acceptSnippet(); - assert.deepEqual(editor.getPosition(), new Position(6, 3)); - }); - }); - - test('Simple canceled', () => { - snippetTest((editor, cursor, codeSnippet, snippetController) => { - editor.setPosition({ lineNumber: 4, column: 2 }); - - snippetController.run(codeSnippet, 0, 0); - assert.equal(editor.getModel().getLineContent(4), '\tfor (var index; index < array.length; index++) {'); - assert.equal(editor.getModel().getLineContent(5), '\t\tvar element = array[index];'); - assert.equal(editor.getModel().getLineContent(6), '\t\t'); - assert.equal(editor.getModel().getLineContent(7), '\t}'); - - snippetController.leaveSnippet(); - assert.deepEqual(editor.getPosition(), new Position(4, 16)); - }); - }); - - test('Stops when deleting lines above', () => { - snippetTest((editor, cursor, codeSnippet, snippetController) => { - editor.setPosition({ lineNumber: 4, column: 2 }); - snippetController.run(codeSnippet, 0, 0); - - editor.getModel().applyEdits([{ - forceMoveMarkers: false, - identifier: null, - isAutoWhitespaceEdit: false, - range: new Range(1, 1, 3, 1), - text: null - }]); - - assert.equal(snippetController.isInSnippetMode(), false); - }); - }); - - test('Stops when deleting lines below', () => { - snippetTest((editor, cursor, codeSnippet, snippetController) => { - editor.setPosition({ lineNumber: 4, column: 2 }); - snippetController.run(codeSnippet, 0, 0); - - editor.getModel().applyEdits([{ - forceMoveMarkers: false, - identifier: null, - isAutoWhitespaceEdit: false, - range: new Range(8, 1, 8, 100), - text: null - }]); - - assert.equal(snippetController.isInSnippetMode(), false); - }); - }); - - test('Stops when inserting lines above', () => { - snippetTest((editor, cursor, codeSnippet, snippetController) => { - editor.setPosition({ lineNumber: 4, column: 2 }); - snippetController.run(codeSnippet, 0, 0); - - editor.getModel().applyEdits([{ - forceMoveMarkers: false, - identifier: null, - isAutoWhitespaceEdit: false, - range: new Range(1, 100, 1, 100), - text: '\nHello' - }]); - - assert.equal(snippetController.isInSnippetMode(), false); - }); - }); - - test('Stops when inserting lines below', () => { - snippetTest((editor, cursor, codeSnippet, snippetController) => { - editor.setPosition({ lineNumber: 4, column: 2 }); - snippetController.run(codeSnippet, 0, 0); - - editor.getModel().applyEdits([{ - forceMoveMarkers: false, - identifier: null, - isAutoWhitespaceEdit: false, - range: new Range(8, 100, 8, 100), - text: '\nHello' - }]); - - assert.equal(snippetController.isInSnippetMode(), false); - }); - }); - - test('Stops when calling model.setValue()', () => { - snippetTest((editor, cursor, codeSnippet, snippetController) => { - editor.setPosition({ lineNumber: 4, column: 2 }); - snippetController.run(codeSnippet, 0, 0); - - editor.getModel().setValue('goodbye'); - - assert.equal(snippetController.isInSnippetMode(), false); - }); - }); - - test('Stops when undoing', () => { - snippetTest((editor, cursor, codeSnippet, snippetController) => { - editor.setPosition({ lineNumber: 4, column: 2 }); - snippetController.run(codeSnippet, 0, 0); - - editor.getModel().undo(); - - assert.equal(snippetController.isInSnippetMode(), false); - }); - }); - - test('Stops when moving cursor outside', () => { - snippetTest((editor, cursor, codeSnippet, snippetController) => { - editor.setPosition({ lineNumber: 4, column: 2 }); - snippetController.run(codeSnippet, 0, 0); - - editor.setPosition({ lineNumber: 1, column: 1 }); - - assert.equal(snippetController.isInSnippetMode(), false); - }); - }); - - test('Stops when disconnecting editor model', () => { - snippetTest((editor, cursor, codeSnippet, snippetController) => { - editor.setPosition({ lineNumber: 4, column: 2 }); - snippetController.run(codeSnippet, 0, 0); - - editor.setModel(null); - - assert.equal(snippetController.isInSnippetMode(), false); - }); - }); - - test('Stops when disposing editor', () => { - snippetTest((editor, cursor, codeSnippet, snippetController) => { - editor.setPosition({ lineNumber: 4, column: 2 }); - snippetController.run(codeSnippet, 0, 0); - - snippetController.dispose(); - - assert.equal(snippetController.isInSnippetMode(), false); - }); - }); - - test('Final tabstop with multiple selections', () => { - snippetTest((editor, cursor, codeSnippet, snippetController) => { - editor.setSelections([ - new Selection(1, 1, 1, 1), - new Selection(2, 1, 2, 1), - ]); - - codeSnippet = CodeSnippet.fromInternal('foo{{}}'); - snippetController.run(codeSnippet, 0, 0); - - assert.equal(editor.getSelections().length, 2); - const [first, second] = editor.getSelections(); - assert.ok(first.equalsRange({ startLineNumber: 1, startColumn: 4, endLineNumber: 1, endColumn: 4 }), first.toString()); - assert.ok(second.equalsRange({ startLineNumber: 2, startColumn: 4, endLineNumber: 2, endColumn: 4 }), second.toString()); - }); - - snippetTest((editor, cursor, codeSnippet, snippetController) => { - editor.setSelections([ - new Selection(1, 1, 1, 1), - new Selection(2, 1, 2, 1), - ]); - - codeSnippet = CodeSnippet.fromInternal('foo{{}}bar'); - snippetController.run(codeSnippet, 0, 0); - - assert.equal(editor.getSelections().length, 2); - const [first, second] = editor.getSelections(); - assert.ok(first.equalsRange({ startLineNumber: 1, startColumn: 4, endLineNumber: 1, endColumn: 4 }), first.toString()); - assert.ok(second.equalsRange({ startLineNumber: 2, startColumn: 4, endLineNumber: 2, endColumn: 4 }), second.toString()); - }); - - snippetTest((editor, cursor, codeSnippet, snippetController) => { - editor.setSelections([ - new Selection(1, 1, 1, 1), - new Selection(1, 5, 1, 5), - ]); - - codeSnippet = CodeSnippet.fromInternal('foo{{}}bar'); - snippetController.run(codeSnippet, 0, 0); - - assert.equal(editor.getSelections().length, 2); - const [first, second] = editor.getSelections(); - assert.ok(first.equalsRange({ startLineNumber: 1, startColumn: 4, endLineNumber: 1, endColumn: 4 }), first.toString()); - assert.ok(second.equalsRange({ startLineNumber: 1, startColumn: 14, endLineNumber: 1, endColumn: 14 }), second.toString()); - }); - - snippetTest((editor, cursor, codeSnippet, snippetController) => { - editor.setSelections([ - new Selection(1, 1, 1, 1), - new Selection(1, 5, 1, 5), - ]); - - codeSnippet = CodeSnippet.fromInternal('foo\n{{}}\nbar'); - snippetController.run(codeSnippet, 0, 0); - - assert.equal(editor.getSelections().length, 2); - const [first, second] = editor.getSelections(); - assert.ok(first.equalsRange({ startLineNumber: 2, startColumn: 1, endLineNumber: 2, endColumn: 1 }), first.toString()); - assert.ok(second.equalsRange({ startLineNumber: 4, startColumn: 1, endLineNumber: 4, endColumn: 1 }), second.toString()); - }); - - snippetTest((editor, cursor, codeSnippet, snippetController) => { - editor.setSelections([ - new Selection(1, 1, 1, 1), - new Selection(1, 5, 1, 5), - ]); - - codeSnippet = CodeSnippet.fromInternal('foo\n{{}}\nbar'); - snippetController.run(codeSnippet, 0, 0); - - assert.equal(editor.getSelections().length, 2); - const [first, second] = editor.getSelections(); - assert.ok(first.equalsRange({ startLineNumber: 2, startColumn: 1, endLineNumber: 2, endColumn: 1 }), first.toString()); - assert.ok(second.equalsRange({ startLineNumber: 4, startColumn: 1, endLineNumber: 4, endColumn: 1 }), second.toString()); - }); - - snippetTest((editor, cursor, codeSnippet, snippetController) => { - editor.setSelections([ - new Selection(2, 7, 2, 7), - ]); - - codeSnippet = CodeSnippet.fromInternal('xo{{}}r'); - snippetController.run(codeSnippet, 1, 0); - - assert.equal(editor.getSelections().length, 1); - assert.ok(editor.getSelection().equalsRange({ startLineNumber: 2, startColumn: 8, endColumn: 8, endLineNumber: 2 })); - }); - }); - - test('Final tabstop, #11742 simple', () => { - snippetTest((editor, cursor, codeSnippet, controller) => { - - editor.setSelection(new Selection(1, 19, 1, 19)); - - codeSnippet = CodeSnippet.fromTextmate('{{% url_**$1** %}}'); - controller.run(codeSnippet, 2, 0); - - assert.equal(editor.getSelections().length, 1); - assert.ok(editor.getSelection().equalsRange({ startLineNumber: 1, startColumn: 27, endLineNumber: 1, endColumn: 27 })); - assert.equal(editor.getModel().getValue(), 'example example {{% url_**** %}}'); - - }, ['example example sc']); - - snippetTest((editor, cursor, codeSnippet, controller) => { - - editor.setSelection(new Selection(1, 3, 1, 3)); - - codeSnippet = CodeSnippet.fromTextmate([ - 'afterEach((done) => {', - '\t${1}test', - '});' - ].join('\n')); - - controller.run(codeSnippet, 2, 0); - - assert.equal(editor.getSelections().length, 1); - assert.ok(editor.getSelection().equalsRange({ startLineNumber: 2, startColumn: 2, endLineNumber: 2, endColumn: 2 }), editor.getSelection().toString()); - assert.equal(editor.getModel().getValue(), 'afterEach((done) => {\n\ttest\n});'); - - }, ['af']); - - snippetTest((editor, cursor, codeSnippet, controller) => { - - editor.setSelection(new Selection(1, 3, 1, 3)); - - codeSnippet = CodeSnippet.fromTextmate([ - 'afterEach((done) => {', - '${1}\ttest', - '});' - ].join('\n')); - - controller.run(codeSnippet, 2, 0); - - assert.equal(editor.getSelections().length, 1); - assert.ok(editor.getSelection().equalsRange({ startLineNumber: 2, startColumn: 1, endLineNumber: 2, endColumn: 1 }), editor.getSelection().toString()); - assert.equal(editor.getModel().getValue(), 'afterEach((done) => {\n\ttest\n});'); - - }, ['af']); - - snippetTest((editor, cursor, codeSnippet, controller) => { - - editor.setSelection(new Selection(1, 9, 1, 9)); - - codeSnippet = CodeSnippet.fromTextmate([ - 'aft${1}er' - ].join('\n')); - - controller.run(codeSnippet, 8, 0); - - assert.equal(editor.getModel().getValue(), 'after'); - assert.equal(editor.getSelections().length, 1); - assert.ok(editor.getSelection().equalsRange({ startLineNumber: 1, startColumn: 4, endLineNumber: 1, endColumn: 4 }), editor.getSelection().toString()); - - }, ['afterone']); - }); - - test('Final tabstop, #11742 different indents', () => { - - snippetTest((editor, cursor, codeSnippet, controller) => { - - editor.setSelections([ - new Selection(2, 4, 2, 4), - new Selection(1, 3, 1, 3) - ]); - - codeSnippet = CodeSnippet.fromTextmate([ - 'afterEach((done) => {', - '\t${0}test', - '});' - ].join('\n')); - - controller.run(codeSnippet, 2, 0); - - assert.equal(editor.getSelections().length, 2); - const [first, second] = editor.getSelections(); - - assert.ok(first.equalsRange({ startLineNumber: 5, startColumn: 3, endLineNumber: 5, endColumn: 3 }), first.toString()); - assert.ok(second.equalsRange({ startLineNumber: 2, startColumn: 2, endLineNumber: 2, endColumn: 2 }), second.toString()); - - }, ['af', '\taf']); - }); - - test('Final tabstop, #11890 stay at the beginning', () => { - - snippetTest((editor, cursor, codeSnippet, controller) => { - - editor.setSelections([ - new Selection(1, 5, 1, 5) - ]); - - codeSnippet = CodeSnippet.fromTextmate([ - 'afterEach((done) => {', - '${1}\ttest', - '});' - ].join('\n')); - - controller.run(codeSnippet, 2, 0); - - assert.equal(editor.getSelections().length, 1); - const [first] = editor.getSelections(); - - assert.ok(first.equalsRange({ startLineNumber: 2, startColumn: 3, endLineNumber: 2, endColumn: 3 }), first.toString()); - - }, [' af']); - }); - - test('Final tabstop, no tabstop', () => { - - snippetTest((editor, cursor, codeSnippet, controller) => { - - editor.setSelections([ - new Selection(1, 3, 1, 3) - ]); - - codeSnippet = CodeSnippet.fromTextmate('afterEach'); - - controller.run(codeSnippet, 2, 0); - - assert.ok(editor.getSelection().equalsRange({ startLineNumber: 1, startColumn: 10, endLineNumber: 1, endColumn: 10 })); - - }, ['af', '\taf']); - }); - - test('Multiple cursor and overwriteBefore/After, issue #11060', () => { - - snippetTest((editor, cursor, codeSnippet, controller) => { - - editor.setSelections([ - new Selection(1, 7, 1, 7), - new Selection(2, 4, 2, 4) - ]); - - codeSnippet = CodeSnippet.fromTextmate('_foo'); - controller.run(codeSnippet, 1, 0); - assert.equal(editor.getModel().getValue(), 'this._foo\nabc_foo'); - - }, ['this._', 'abc']); - - snippetTest((editor, cursor, codeSnippet, controller) => { - - editor.setSelections([ - new Selection(1, 7, 1, 7), - new Selection(2, 4, 2, 4) - ]); - - codeSnippet = CodeSnippet.fromTextmate('XX'); - controller.run(codeSnippet, 1, 0); - assert.equal(editor.getModel().getValue(), 'this.XX\nabcXX'); - - }, ['this._', 'abc']); - - snippetTest((editor, cursor, codeSnippet, controller) => { - - editor.setSelections([ - new Selection(1, 7, 1, 7), - new Selection(2, 4, 2, 4), - new Selection(3, 5, 3, 5) - ]); - - codeSnippet = CodeSnippet.fromTextmate('_foo'); - controller.run(codeSnippet, 1, 0); - assert.equal(editor.getModel().getValue(), 'this._foo\nabc_foo\ndef_foo'); - - }, ['this._', 'abc', 'def_']); - - snippetTest((editor, cursor, codeSnippet, controller) => { - - editor.setSelections([ - new Selection(1, 7, 1, 7), - new Selection(2, 4, 2, 4), - new Selection(3, 6, 3, 6) - ]); - - codeSnippet = CodeSnippet.fromTextmate('._foo'); - controller.run(codeSnippet, 2, 0); - assert.equal(editor.getModel().getValue(), 'this._foo\nabc._foo\ndef._foo'); - - }, ['this._', 'abc', 'def._']); - - }); - - test('Multiple cursor and overwriteBefore/After, #16277', () => { - snippetTest((editor, cursor, codeSnippet, controller) => { - - editor.setSelections([ - new Selection(1, 5, 1, 5), - new Selection(2, 5, 2, 5), - ]); - - codeSnippet = CodeSnippet.fromTextmate('document'); - controller.run(codeSnippet, 3, 0); - assert.equal(editor.getModel().getValue(), '{document}\n{document && true}'); - - }, ['{foo}', '{foo && true}']); - }); - - test('Insert snippet twice, #19449', () => { - - snippetTest((editor, cursor, codeSnippet, controller) => { - - editor.setSelections([ - new Selection(1, 1, 1, 1) - ]); - - codeSnippet = CodeSnippet.fromTextmate('for (var ${1:i}=0; ${1:i} { - - editor.setSelections([ - new Selection(1, 1, 1, 1) - ]); - - codeSnippet = CodeSnippet.fromTextmate('for (let ${1:i}=0; ${1:i} { + if (candidate instanceof Placeholder) { + let index = Number(candidate.index); + if (index > maxIndex) { + maxIndex = index; + } + } + return true; + }); + + // rewrite final tabstops + walk(marker, candidate => { + if (candidate instanceof Placeholder) { + if (candidate.isFinalTabstop) { + candidate.index = String(++maxIndex); + } + } + return true; + }); + + // write back as string + function toSnippetString(marker: Marker): string { + if (marker instanceof Text) { + return SnippetParser.escape(marker.string); + + } else if (marker instanceof Placeholder) { + if (marker.defaultValue.length > 0) { + return `\${${marker.index}:${marker.defaultValue.map(toSnippetString).join('')}}`; + } else { + return `\$${marker.index}`; + } + } else if (marker instanceof Variable) { + if (marker.defaultValue.length > 0) { + return `\${${marker.name}:${marker.defaultValue.map(toSnippetString).join('')}}`; + } else { + return `\$${marker.name}`; + } + } else { + throw new Error('unexpected marker: ' + marker); + } + } + return marker.map(toSnippetString).join(''); + } + public getRangeToReplace(value: string, start: number, end: number): Range { //console.log('value', value); let startPosition = this.getPositionFromOffset(start); From 3215f19074d49e32d5ab55203923865910d4d5ca Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 24 May 2017 12:16:42 +0200 Subject: [PATCH 0877/1164] move everything into snippet/browser --- src/vs/editor/browser/editor.all.ts | 3 +-- .../editor/contrib/snippet/{common => browser}/snippet.md | 0 src/vs/editor/contrib/snippet/browser/snippet.ts | 8 -------- .../contrib/snippet/{common => browser}/snippetParser.ts | 0 .../snippet/browser/{snippet.css => snippetSession.css} | 0 src/vs/editor/contrib/snippet/browser/snippetSession.ts | 5 +++-- .../snippet/{common => browser}/snippetVariables.ts | 0 .../contrib/snippet/test/browser/snippetParser.test.ts | 2 +- .../contrib/snippet/test/browser/snippetVariables.test.ts | 4 ++-- .../editor/contrib/suggest/browser/suggestController.ts | 2 +- .../parts/emmet/electron-browser/editorAccessor.ts | 2 +- .../parts/snippets/electron-browser/TMSnippets.ts | 4 ++-- 12 files changed, 11 insertions(+), 19 deletions(-) rename src/vs/editor/contrib/snippet/{common => browser}/snippet.md (100%) delete mode 100644 src/vs/editor/contrib/snippet/browser/snippet.ts rename src/vs/editor/contrib/snippet/{common => browser}/snippetParser.ts (100%) rename src/vs/editor/contrib/snippet/browser/{snippet.css => snippetSession.css} (100%) rename src/vs/editor/contrib/snippet/{common => browser}/snippetVariables.ts (100%) diff --git a/src/vs/editor/browser/editor.all.ts b/src/vs/editor/browser/editor.all.ts index f6decf73a87..4223fbac790 100644 --- a/src/vs/editor/browser/editor.all.ts +++ b/src/vs/editor/browser/editor.all.ts @@ -38,8 +38,7 @@ import 'vs/editor/contrib/quickFix/browser/quickFixCommands'; import 'vs/editor/contrib/referenceSearch/browser/referenceSearch'; import 'vs/editor/contrib/rename/browser/rename'; import 'vs/editor/contrib/smartSelect/common/smartSelect'; -import 'vs/editor/contrib/snippet/common/snippet'; -import 'vs/editor/contrib/snippet/browser/snippet'; +import 'vs/editor/contrib/snippet/browser/snippetController2'; import 'vs/editor/contrib/suggest/browser/suggestController'; import 'vs/editor/contrib/toggleTabFocusMode/common/toggleTabFocusMode'; import 'vs/editor/contrib/wordHighlighter/common/wordHighlighter'; diff --git a/src/vs/editor/contrib/snippet/common/snippet.md b/src/vs/editor/contrib/snippet/browser/snippet.md similarity index 100% rename from src/vs/editor/contrib/snippet/common/snippet.md rename to src/vs/editor/contrib/snippet/browser/snippet.md diff --git a/src/vs/editor/contrib/snippet/browser/snippet.ts b/src/vs/editor/contrib/snippet/browser/snippet.ts deleted file mode 100644 index 3d8b6eb3399..00000000000 --- a/src/vs/editor/contrib/snippet/browser/snippet.ts +++ /dev/null @@ -1,8 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -'use strict'; - -import 'vs/css!./snippet'; \ No newline at end of file diff --git a/src/vs/editor/contrib/snippet/common/snippetParser.ts b/src/vs/editor/contrib/snippet/browser/snippetParser.ts similarity index 100% rename from src/vs/editor/contrib/snippet/common/snippetParser.ts rename to src/vs/editor/contrib/snippet/browser/snippetParser.ts diff --git a/src/vs/editor/contrib/snippet/browser/snippet.css b/src/vs/editor/contrib/snippet/browser/snippetSession.css similarity index 100% rename from src/vs/editor/contrib/snippet/browser/snippet.css rename to src/vs/editor/contrib/snippet/browser/snippetSession.css diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts index 72395327a67..b5938e3c7e4 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -5,16 +5,17 @@ 'use strict'; +import 'vs/css!./snippetSession'; import { getLeadingWhitespace } from 'vs/base/common/strings'; import { ICommonCodeEditor, IModel, TrackedRangeStickiness, IIdentifiedSingleEditOperation } from 'vs/editor/common/editorCommon'; import { EditOperation } from 'vs/editor/common/core/editOperation'; -import { TextmateSnippet, Placeholder, SnippetParser } from '../common/snippetParser'; +import { TextmateSnippet, Placeholder, SnippetParser } from './snippetParser'; import { Selection } from 'vs/editor/common/core/selection'; import { Range } from 'vs/editor/common/core/range'; import { IPosition } from 'vs/editor/common/core/position'; import { groupBy } from 'vs/base/common/arrays'; import { dispose } from 'vs/base/common/lifecycle'; -import { EditorSnippetVariableResolver } from "vs/editor/contrib/snippet/common/snippetVariables"; +import { EditorSnippetVariableResolver } from "./snippetVariables"; import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; export class OneSnippet { diff --git a/src/vs/editor/contrib/snippet/common/snippetVariables.ts b/src/vs/editor/contrib/snippet/browser/snippetVariables.ts similarity index 100% rename from src/vs/editor/contrib/snippet/common/snippetVariables.ts rename to src/vs/editor/contrib/snippet/browser/snippetVariables.ts diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts index f960afe2ffa..66e204e9da2 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetParser.test.ts @@ -5,7 +5,7 @@ 'use strict'; import * as assert from 'assert'; -import { Scanner, TokenType, SnippetParser, Text, Placeholder, Variable, Marker, walk } from 'vs/editor/contrib/snippet/common/snippetParser'; +import { Scanner, TokenType, SnippetParser, Text, Placeholder, Variable, Marker, walk } from 'vs/editor/contrib/snippet/browser/snippetParser'; suite('SnippetParser', () => { diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts index 071119f9104..fa0bb4034f9 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetVariables.test.ts @@ -8,8 +8,8 @@ import * as assert from 'assert'; import { isWindows } from 'vs/base/common/platform'; import URI from 'vs/base/common/uri'; import { Selection } from 'vs/editor/common/core/selection'; -import { EditorSnippetVariableResolver } from 'vs/editor/contrib/snippet/common/snippetVariables'; -import { SnippetParser } from 'vs/editor/contrib/snippet/common/snippetParser'; +import { EditorSnippetVariableResolver } from 'vs/editor/contrib/snippet/browser/snippetVariables'; +import { SnippetParser } from 'vs/editor/contrib/snippet/browser/snippetParser'; import { Model } from 'vs/editor/common/model/model'; suite('Snippet Variables Resolver', function () { diff --git a/src/vs/editor/contrib/suggest/browser/suggestController.ts b/src/vs/editor/contrib/suggest/browser/suggestController.ts index 144a81b17d8..add8b9df096 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestController.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestController.ts @@ -21,7 +21,7 @@ import { alert } from 'vs/base/browser/ui/aria/aria'; import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; -import { SnippetParser } from 'vs/editor/contrib/snippet/common/snippetParser'; +import { SnippetParser } from 'vs/editor/contrib/snippet/browser/snippetParser'; import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { Context as SuggestContext } from './suggest'; import { SuggestModel, State } from './suggestModel'; diff --git a/src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts b/src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts index 12776157397..38cb77ea2fd 100644 --- a/src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts @@ -12,7 +12,7 @@ import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetCon import { LanguageId, LanguageIdentifier } from 'vs/editor/common/modes'; import { Position } from 'vs/editor/common/core/position'; import { CoreEditingCommands } from "vs/editor/common/controller/coreCommands"; -import { SnippetParser, walk, Placeholder, Variable, Text, Marker } from 'vs/editor/contrib/snippet/common/snippetParser'; +import { SnippetParser, walk, Placeholder, Variable, Text, Marker } from 'vs/editor/contrib/snippet/browser/snippetParser'; import emmet = require('emmet'); diff --git a/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.ts b/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.ts index 3c04fb922ff..ae83175077b 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.ts +++ b/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.ts @@ -15,8 +15,8 @@ import { ISnippetsService, ISnippet } from 'vs/workbench/parts/snippets/electron import { IModeService } from 'vs/editor/common/services/modeService'; import { languagesExtPoint } from 'vs/editor/common/services/modeServiceImpl'; import { LanguageIdentifier } from 'vs/editor/common/modes'; -import { SnippetParser, Marker, Placeholder, Variable, Text, walk } from 'vs/editor/contrib/snippet/common/snippetParser'; -import { EditorSnippetVariableResolver } from "vs/editor/contrib/snippet/common/snippetVariables"; +import { SnippetParser, Marker, Placeholder, Variable, Text, walk } from 'vs/editor/contrib/snippet/browser/snippetParser'; +import { EditorSnippetVariableResolver } from "vs/editor/contrib/snippet/browser/snippetVariables"; interface ISnippetsExtensionPoint { language: string; From 04d5fc77ccc0ffbf9af4a721e15abd9c10a69d24 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 24 May 2017 12:04:16 +0200 Subject: [PATCH 0878/1164] theming - dirty diff colors --- .../electron-browser/dirtydiffDecorator.ts | 45 +++++++++++++++++++ .../media/dirtydiffDecorator.css | 24 ++-------- 2 files changed, 48 insertions(+), 21 deletions(-) diff --git a/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts b/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts index fb3d45c4e7c..eaca7cc45e5 100644 --- a/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts +++ b/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts @@ -23,6 +23,10 @@ import URI from 'vs/base/common/uri'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { ISCMService } from 'vs/workbench/services/scm/common/scm'; import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { registerThemingParticipant, ITheme, ICssStyleCollector } from "vs/platform/theme/common/themeService"; +import { registerColor } from "vs/platform/theme/common/colorRegistry"; +import { localize } from "vs/nls"; +import { Color } from "vs/base/common/color"; class DirtyDiffModelDecorator { @@ -266,3 +270,44 @@ export class DirtyDiffDecorator implements ext.IWorkbenchContribution { this.decorators = null; } } + +export const editorGutterModifiedBackground = registerColor('editorGutter.modifiedBackground', { + dark: Color.fromHex('#00bcf2').transparent(0.6), + light: Color.fromHex('#007acc').transparent(0.6), + hc: Color.fromHex('#007acc').transparent(0.6) +}, localize('editorGutterModifiedBackground', "Editor gutter background color for lines that are modified.")); + +export const editorGutterAddedBackground = registerColor('editorGutter.addedBackground', { + dark: Color.fromHex('#7fba00').transparent(0.6), + light: Color.fromHex('#2d883e').transparent(0.6), + hc: Color.fromHex('#2d883e').transparent(0.6) +}, localize('editorGutterAddedBackground', "Editor gutter background color for lines that are added.")); + +export const editorGutteDeletedBackground = registerColor('editorGutter.deletedBackground', { + dark: Color.fromHex('#b9131a').transparent(0.76), + light: Color.fromHex('#b9131a').transparent(0.76), + hc: Color.fromHex('#b9131a').transparent(0.76) +}, localize('editorGutterDeletedBackground', "Editor gutter background color for lines that are deleted.")); + +registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { + const editorGutterModifiedBackgroundColor = theme.getColor(editorGutterModifiedBackground); + if (editorGutterModifiedBackgroundColor) { + collector.addRule(`.monaco-editor .dirty-diff-modified-glyph { border-left: 3px solid ${editorGutterModifiedBackgroundColor}; }`); + } + + const editorGutterAddedBackgroundColor = theme.getColor(editorGutterAddedBackground); + if (editorGutterAddedBackgroundColor) { + collector.addRule(`.monaco-editor .dirty-diff-added-glyph { border-left: 3px solid ${editorGutterAddedBackgroundColor}; }`); + } + + const editorGutteDeletedBackgroundColor = theme.getColor(editorGutteDeletedBackground); + if (editorGutteDeletedBackgroundColor) { + collector.addRule(` + .monaco-editor .dirty-diff-deleted-glyph:after { + border-top: 4px solid transparent; + border-bottom: 4px solid transparent; + border-left: 4px solid ${editorGutteDeletedBackgroundColor}; + } + `); + } +}); \ No newline at end of file diff --git a/src/vs/workbench/parts/scm/electron-browser/media/dirtydiffDecorator.css b/src/vs/workbench/parts/scm/electron-browser/media/dirtydiffDecorator.css index 31023d7ffa9..beaf772629e 100644 --- a/src/vs/workbench/parts/scm/electron-browser/media/dirtydiffDecorator.css +++ b/src/vs/workbench/parts/scm/electron-browser/media/dirtydiffDecorator.css @@ -3,23 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -.monaco-editor .dirty-diff-modified-glyph { - border-left: 3px solid rgba(0, 122, 204, 0.6); - margin-left: 5px; -} - -.monaco-editor.vs-dark .dirty-diff-modified-glyph { - border-left: 3px solid rgba(0, 188, 242, 0.6); - margin-left: 5px; -} - -.monaco-editor .dirty-diff-added-glyph { - border-left: 3px solid rgba(45, 136, 62, 0.6); - margin-left: 5px; -} - -.monaco-editor.vs-dark .dirty-diff-added-glyph { - border-left: 3px solid rgba(127, 186, 0, 0.6); +.monaco-editor .dirty-diff-modified-glyph, +.monaco-editor .dirty-diff-added-glyph, +.monaco-editor .dirty-diff-deleted-glyph:after { margin-left: 5px; } @@ -27,11 +13,7 @@ content: ''; position: absolute; bottom: -4px; - margin-left: 5px; box-sizing: border-box; - border-left: 4px solid rgba(185, 19, 26, 0.76); - border-top: 4px solid transparent; - border-bottom: 4px solid transparent; width: 4px; height: 0; z-index: 9; From 3ea2c216aa42cffa2549301eff73b52f760d9315 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Wed, 24 May 2017 12:29:51 +0200 Subject: [PATCH 0879/1164] More work to make v2 the default --- src/vs/workbench/api/node/extHostTask.ts | 23 ++- .../parts/tasks/browser/quickOpen.ts | 61 +++++++- .../parts/tasks/browser/restartQuickOpen.ts | 2 +- .../parts/tasks/browser/taskQuickOpen.ts | 2 +- .../parts/tasks/browser/terminateQuickOpen.ts | 2 +- .../parts/tasks/common/taskConfiguration.ts | 144 +++++++++++++----- .../parts/tasks/common/taskTemplates.ts | 9 +- src/vs/workbench/parts/tasks/common/tasks.ts | 77 ++++++---- .../electron-browser/task.contribution.ts | 59 +++---- .../electron-browser/terminalTaskSystem.ts | 16 +- .../parts/tasks/node/processTaskSystem.ts | 11 +- .../tasks/test/node/configuration.test.ts | 82 ++++++---- 12 files changed, 332 insertions(+), 156 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index f1c5a8065b8..5f23efc8f80 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -192,26 +192,26 @@ namespace ProblemMatcher { } namespace RevealKind { - export function from(value: vscode.RevealKind): TaskSystem.ShowOutput { + export function from(value: vscode.RevealKind): TaskSystem.RevealKind { if (value === void 0 || value === null) { - return TaskSystem.ShowOutput.Always; + return TaskSystem.RevealKind.Always; } switch (value) { case types.RevealKind.Silent: - return TaskSystem.ShowOutput.Silent; + return TaskSystem.RevealKind.Silent; case types.RevealKind.Never: - return TaskSystem.ShowOutput.Never; + return TaskSystem.RevealKind.Never; } - return TaskSystem.ShowOutput.Always; + return TaskSystem.RevealKind.Always; } } namespace TerminalBehaviour { - export function from(value: vscode.TerminalBehaviour): { showOutput: TaskSystem.ShowOutput, echo: boolean } { + export function from(value: vscode.TerminalBehaviour): TaskSystem.TerminalBehavior { if (value === void 0 || value === null) { - return { showOutput: TaskSystem.ShowOutput.Always, echo: false }; + return { reveal: TaskSystem.RevealKind.Always, echo: false }; } - return { showOutput: RevealKind.from(value.reveal), echo: !!value.echo }; + return { reveal: RevealKind.from(value.reveal), echo: !!value.echo }; } } @@ -302,8 +302,6 @@ namespace Tasks { if (command === void 0) { return undefined; } - let behaviour = TerminalBehaviour.from(task.terminal); - command.echo = behaviour.echo; let result: TaskSystem.Task = { _id: uuidMap.getUUID(task.identifier), _source: { kind: TaskSystem.TaskSourceKind.Extension, detail: extension.id }, @@ -311,7 +309,6 @@ namespace Tasks { identifier: task.identifier, group: types.TaskGroup.is(task.group) ? task.group : undefined, command: command, - showOutput: behaviour.showOutput, isBackground: !!task.isBackground, suppressTaskName: true, problemMatchers: ProblemMatcher.from(task.problemMatchers) @@ -327,7 +324,7 @@ namespace Tasks { name: value.process, args: Strings.from(value.args), isShellCommand: false, - echo: false, + terminal: TerminalBehaviour.from(value.terminal) }; if (value.options) { result.options = CommandOptions.from(value.options); @@ -342,7 +339,7 @@ namespace Tasks { let result: TaskSystem.CommandConfiguration = { name: value.commandLine, isShellCommand: ShellConfiguration.from(value.options), - echo: false + terminal: TerminalBehaviour.from(value.terminal) }; if (value.options) { result.options = CommandOptions.from(value.options); diff --git a/src/vs/workbench/parts/tasks/browser/quickOpen.ts b/src/vs/workbench/parts/tasks/browser/quickOpen.ts index 743413653aa..754d5756a22 100644 --- a/src/vs/workbench/parts/tasks/browser/quickOpen.ts +++ b/src/vs/workbench/parts/tasks/browser/quickOpen.ts @@ -7,6 +7,7 @@ import nls = require('vs/nls'); import Filters = require('vs/base/common/filters'); import { TPromise } from 'vs/base/common/winjs.base'; +import { Action, IAction } from 'vs/base/common/actions'; import Quickopen = require('vs/workbench/browser/quickopen'); import QuickOpen = require('vs/base/parts/quickopen/common/quickOpen'); import Model = require('vs/base/parts/quickopen/browser/quickOpenModel'); @@ -14,21 +15,26 @@ import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; import { Task, TaskSourceKind } from 'vs/workbench/parts/tasks/common/tasks'; import { ITaskService } from 'vs/workbench/parts/tasks/common/taskService'; +import { ActionBarContributor } from 'vs/workbench/browser/actionBarRegistry'; export class TaskEntry extends Model.QuickOpenEntry { - constructor(protected taskService: ITaskService, protected task: Task, highlights: Model.IHighlight[] = []) { + constructor(protected taskService: ITaskService, protected _task: Task, highlights: Model.IHighlight[] = []) { super(highlights); - this.task = task; + this._task = _task; } public getLabel(): string { - return this.task.name; + return this._task.name; } public getAriaLabel(): string { return nls.localize('entryAriaLabel', "{0}, tasks", this.getLabel()); } + + public get task(): Task { + return this._task; + } } export class TaskGroupEntry extends Model.QuickOpenEntryGroup { @@ -112,4 +118,53 @@ export abstract class QuickOpenHandler extends Quickopen.QuickOpenHandler { autoFocusFirstEntry: !!input }; } +} + +class CustomizeTaskAction extends Action { + + private static ID = 'workbench.action.tasks.customizeTask'; + private static LABEL = nls.localize('customizeTask', "Customize Task"); + + constructor() { + super(CustomizeTaskAction.ID, CustomizeTaskAction.LABEL); + this.updateClass(); + } + + public updateClass(): void { + this.class = 'quick-open-sidebyside-vertical'; + } + + public run(context: any): TPromise { + return TPromise.as(false); + } +} + +export class QuickOpenActionContributor extends ActionBarContributor { + + constructor() { + super(); + } + + public hasActions(context: any): boolean { + const entry = this.getEntry(context); + + return !!entry; + } + + public getActions(context: any): IAction[] { + const actions: Action[] = []; + + const entry = this.getEntry(context); + if (entry && entry.task._source.kind === TaskSourceKind.Extension) { + actions.push(new CustomizeTaskAction()); + } + return actions; + } + + private getEntry(context: any): TaskEntry { + if (!context || !(context.element instanceof TaskEntry)) { + return undefined; + } + return context.element as TaskEntry; + } } \ No newline at end of file diff --git a/src/vs/workbench/parts/tasks/browser/restartQuickOpen.ts b/src/vs/workbench/parts/tasks/browser/restartQuickOpen.ts index 2c78bdac7e8..95d4d2bd5dd 100644 --- a/src/vs/workbench/parts/tasks/browser/restartQuickOpen.ts +++ b/src/vs/workbench/parts/tasks/browser/restartQuickOpen.ts @@ -24,7 +24,7 @@ class TaskEntry extends base.TaskEntry { if (mode === QuickOpen.Mode.PREVIEW) { return false; } - this.taskService.restart(this.task._id); + this.taskService.restart(this._task._id); return true; } } diff --git a/src/vs/workbench/parts/tasks/browser/taskQuickOpen.ts b/src/vs/workbench/parts/tasks/browser/taskQuickOpen.ts index f32f5d199f9..b6939d7a77c 100644 --- a/src/vs/workbench/parts/tasks/browser/taskQuickOpen.ts +++ b/src/vs/workbench/parts/tasks/browser/taskQuickOpen.ts @@ -26,7 +26,7 @@ class TaskEntry extends base.TaskEntry { if (mode === QuickOpen.Mode.PREVIEW) { return false; } - this.taskService.run(this.task); + this.taskService.run(this._task); return true; } } diff --git a/src/vs/workbench/parts/tasks/browser/terminateQuickOpen.ts b/src/vs/workbench/parts/tasks/browser/terminateQuickOpen.ts index 767e872a446..80fc424f5d0 100644 --- a/src/vs/workbench/parts/tasks/browser/terminateQuickOpen.ts +++ b/src/vs/workbench/parts/tasks/browser/terminateQuickOpen.ts @@ -24,7 +24,7 @@ class TaskEntry extends base.TaskEntry { if (mode === QuickOpen.Mode.PREVIEW) { return false; } - this.taskService.terminate(this.task._id); + this.taskService.terminate(this._task._id); return true; } } diff --git a/src/vs/workbench/parts/tasks/common/taskConfiguration.ts b/src/vs/workbench/parts/tasks/common/taskConfiguration.ts index 87feaedfd38..b06f6c15bf3 100644 --- a/src/vs/workbench/parts/tasks/common/taskConfiguration.ts +++ b/src/vs/workbench/parts/tasks/common/taskConfiguration.ts @@ -189,6 +189,21 @@ export interface BaseTaskRunnerConfiguration { */ echoCommand?: boolean; + /** + * Controls the behavior of the used terminal + */ + terminal?: { + /** + * The terminal should echo the run command. + */ + echo?: boolean; + /** + * Controls whether or not the terminal is reveal if a task + * is executed. + */ + reveal?: string; + }; + /** * If set to false the task name is added as an additional argument to the * command when executed. If set to true the task name is suppressed. If @@ -402,12 +417,19 @@ namespace ShellConfiguration { } namespace CommandConfiguration { + interface TerminalBehavior { + echo?: boolean; + reveal?: string; + } + interface BaseCommandConfiguationShape { command?: string; isShellCommand?: boolean | ShellConfiguration; args?: string[]; options?: ProcessConfig.CommandOptions; echoCommand?: boolean; + showOutput?: string; + terminal?: TerminalBehavior; taskSelector?: string; } @@ -417,6 +439,70 @@ namespace CommandConfiguration { linux?: BaseCommandConfiguationShape; } + export namespace TerminalBehavior { + export function from(this: void, config: BaseCommandConfiguationShape, context: ParseContext): Tasks.TerminalBehavior { + let echo: boolean = undefined; + let reveal: Tasks.RevealKind = undefined; + if (Types.isBoolean(config.echoCommand)) { + echo = config.echoCommand; + } + if (Types.isString(config.showOutput)) { + reveal = Tasks.RevealKind.fromString(config.showOutput); + } + if (config.terminal) { + if (Types.isBoolean(config.terminal.echo)) { + echo = config.terminal.echo; + } + if (Types.isString(config.terminal.reveal)) { + reveal = Tasks.RevealKind.fromString(config.terminal.reveal); + } + } + if (echo === void 0 && reveal === void 0) { + return undefined; + } + return { echo, reveal }; + } + + export function merge(target: Tasks.TerminalBehavior, source: Tasks.TerminalBehavior): Tasks.TerminalBehavior { + if (isEmpty(source)) { + return target; + } + if (isEmpty(target)) { + return source; + } + mergeProperty(target, source, 'echo'); + mergeProperty(target, source, 'reveal'); + return target; + } + + export function fillDefault(value: Tasks.TerminalBehavior): Tasks.TerminalBehavior { + if (value && Object.isFrozen(value)) { + return value; + } + if (value === void 0) { + return { echo: false, reveal: Tasks.RevealKind.Always }; + } + if (value.echo === void 0) { + value.echo = false; + } + if (value.reveal === void 0) { + value.reveal = Tasks.RevealKind.Always; + } + return value; + } + + export function freeze(value: Tasks.TerminalBehavior): void { + if (value === void 0) { + return; + } + Object.freeze(value); + } + + function isEmpty(this: void, value: Tasks.TerminalBehavior): boolean { + return !value || value.echo === void 0 && value.reveal === void 0; + } + } + export function from(this: void, config: CommandConfiguationShape, context: ParseContext): Tasks.CommandConfiguration { let result: Tasks.CommandConfiguration = fromBase(config, context); @@ -439,7 +525,7 @@ namespace CommandConfiguration { let result: Tasks.CommandConfiguration = { name: undefined, isShellCommand: undefined, - echo: undefined + terminal: undefined }; if (Types.isString(config.command)) { result.name = config.command; @@ -464,8 +550,9 @@ namespace CommandConfiguration { if (config.options !== void 0) { result.options = CommandOptions.from(config.options, context); } - if (Types.isBoolean(config.echoCommand)) { - result.echo = config.echoCommand; + let terminal = TerminalBehavior.from(config, context); + if (terminal) { + result.terminal = terminal; } if (Types.isString(config.taskSelector)) { result.taskSelector = config.taskSelector; @@ -474,11 +561,13 @@ namespace CommandConfiguration { } export function isEmpty(value: Tasks.CommandConfiguration): boolean { - return !value || value.name === void 0 && value.isShellCommand === void 0 && value.args === void 0 && CommandOptions.isEmpty(value.options) && value.echo === void 0; + return !value || value.name === void 0 && value.isShellCommand === void 0 && value.args === void 0 && CommandOptions.isEmpty(value.options) && value.terminal === void 0; } - export function onlyEcho(value: Tasks.CommandConfiguration): boolean { - return value && value.echo !== void 0 && value.name === void 0 && value.isShellCommand === void 0 && value.args === void 0 && CommandOptions.isEmpty(value.options); + export function onlyTerminalBehaviour(value: Tasks.CommandConfiguration): boolean { + return value && + value.terminal && (value.terminal.echo !== void 0 || value.terminal.reveal === void 0) && + value.name === void 0 && value.isShellCommand === void 0 && value.args === void 0 && CommandOptions.isEmpty(value.options); } export function merge(target: Tasks.CommandConfiguration, source: Tasks.CommandConfiguration): Tasks.CommandConfiguration { @@ -500,7 +589,7 @@ namespace CommandConfiguration { target.isShellCommand = source.isShellCommand; } - mergeProperty(target, source, 'echo'); + target.terminal = TerminalBehavior.merge(target.terminal, source.terminal); mergeProperty(target, source, 'taskSelector'); if (source.args !== void 0) { if (target.args === void 0) { @@ -520,9 +609,7 @@ namespace CommandConfiguration { if (value.name !== void 0 && value.isShellCommand === void 0) { value.isShellCommand = false; } - if (value.echo === void 0) { - value.echo = false; - } + value.terminal = TerminalBehavior.fillDefault(value.terminal); if (value.args === void 0) { value.args = EMPTY_ARRAY; } @@ -539,6 +626,9 @@ namespace CommandConfiguration { if (value.options) { CommandOptions.freeze(value.options); } + if (value.terminal) { + TerminalBehavior.freeze(value.terminal); + } if (ShellConfiguration.is(value.isShellCommand)) { ShellConfiguration.freeze(value.isShellCommand); } @@ -660,15 +750,16 @@ namespace TaskDescription { let problemMatchers = ProblemMatcherConverter.from(externalTask.problemMatcher, context); let command: Tasks.CommandConfiguration = externalTask.command !== void 0 ? CommandConfiguration.from(externalTask, context) - : externalTask.echoCommand !== void 0 ? { name: undefined, isShellCommand: undefined, echo: !!externalTask.echoCommand } : undefined; + : externalTask.echoCommand !== void 0 + ? { name: undefined, isShellCommand: undefined, terminal: CommandConfiguration.TerminalBehavior.from(externalTask, context) } + : undefined; let identifer = Types.isString(externalTask.identifier) ? externalTask.identifier : taskName; let task: Tasks.Task = { _id: UUID.generateUuid(), _source: source, name: taskName, identifier: identifer, - command, - showOutput: undefined + command }; if (externalTask.command === void 0 && Types.isStringArray(externalTask.args)) { task.args = externalTask.args.slice(); @@ -682,9 +773,6 @@ namespace TaskDescription { if (externalTask.promptOnClose !== void 0) { task.promptOnClose = !!externalTask.promptOnClose; } - if (Types.isString(externalTask.showOutput)) { - task.showOutput = Tasks.ShowOutput.fromString(externalTask.showOutput); - } if (externalTask.command !== void 0) { // if the task has its own command then we suppress the // task name by default. @@ -793,13 +881,13 @@ namespace TaskDescription { if (CommandConfiguration.isEmpty(task.command) && !CommandConfiguration.isEmpty(globals.command) && globals.command.name !== void 0) { task.command = globals.command; } - if (CommandConfiguration.onlyEcho(task.command)) { + if (CommandConfiguration.onlyTerminalBehaviour(task.command)) { // The globals can have a echo set which would override the local echo // Saves the need of a additional fill method. But might be necessary // at some point. - let oldEcho = task.command.echo; + let oldTerminal = Objects.clone(task.command.terminal); CommandConfiguration.merge(task.command, globals.command); - task.command.echo = oldEcho; + task.command.terminal = oldTerminal; } } // promptOnClose is inferred from isBackground if available @@ -809,9 +897,6 @@ namespace TaskDescription { if (task.suppressTaskName === void 0 && globals.suppressTaskName !== void 0) { task.suppressTaskName = globals.suppressTaskName; } - if (task.showOutput === void 0 && globals.showOutput !== void 0) { - task.showOutput = globals.showOutput; - } } export function fillDefaults(task: Tasks.Task): void { @@ -828,9 +913,6 @@ namespace TaskDescription { if (task.isBackground === void 0) { task.isBackground = false; } - if (task.showOutput === void 0) { - task.showOutput = Tasks.ShowOutput.Always; - } if (task.problemMatchers === void 0) { task.problemMatchers = EMPTY_ARRAY; } @@ -876,7 +958,6 @@ namespace TaskDescription { mergeProperty(target, source, 'args'); mergeProperty(target, source, 'isBackground'); mergeProperty(target, source, 'promptOnClose'); - mergeProperty(target, source, 'showOutput'); mergeProperty(target, source, 'dependsOn'); mergeProperty(target, source, 'problemMatchers'); return target; @@ -887,7 +968,6 @@ interface Globals { command?: Tasks.CommandConfiguration; promptOnClose?: boolean; suppressTaskName?: boolean; - showOutput?: Tasks.ShowOutput; } namespace Globals { @@ -916,9 +996,6 @@ namespace Globals { export function fromBase(this: void, config: BaseTaskRunnerConfiguration, context: ParseContext): Globals { let result: Globals = {}; - if (Types.isString(config.showOutput)) { - result.showOutput = Tasks.ShowOutput.fromString(config.showOutput); - } if (config.suppressTaskName !== void 0) { result.suppressTaskName = !!config.suppressTaskName; } @@ -929,7 +1006,7 @@ namespace Globals { } export function isEmpty(value: Globals): boolean { - return !value || value.command === void 0 && value.promptOnClose === void 0 && value.showOutput === void 0 && value.suppressTaskName === void 0; + return !value || value.command === void 0 && value.promptOnClose === void 0 && value.suppressTaskName === void 0; } export function merge(target: Globals, source: Globals): Globals { @@ -941,7 +1018,6 @@ namespace Globals { } mergeProperty(target, source, 'promptOnClose'); mergeProperty(target, source, 'suppressTaskName'); - mergeProperty(target, source, 'showOutput'); return target; } @@ -952,9 +1028,6 @@ namespace Globals { if (value.suppressTaskName === void 0) { value.suppressTaskName = false; } - if (value.showOutput === void 0) { - value.showOutput = Tasks.ShowOutput.Always; - } if (value.promptOnClose === void 0) { value.promptOnClose = true; } @@ -1059,7 +1132,6 @@ class ConfigurationParser { group: Tasks.TaskGroup.Build, command: undefined, isBackground: isBackground, - showOutput: undefined, suppressTaskName: true, // this must be true since we infer the task from the global data. problemMatchers: matchers }; diff --git a/src/vs/workbench/parts/tasks/common/taskTemplates.ts b/src/vs/workbench/parts/tasks/common/taskTemplates.ts index d153e784935..0d7253582b8 100644 --- a/src/vs/workbench/parts/tasks/common/taskTemplates.ts +++ b/src/vs/workbench/parts/tasks/common/taskTemplates.ts @@ -179,8 +179,13 @@ const command: TaskEntry = { '\t// See https://go.microsoft.com/fwlink/?LinkId=733558', '\t// for the documentation about the tasks.json format', '\t"version": "2.0.0",', - '\t"command": "echo \"Hello World\"",', - '\t"isShellCommand": true,', + '\t"tasks": [', + '\t\t{', + '\t\t\t"taskName": "echo",', + '\t\t\t"command": "echo Hello",', + '\t\t\t"isShellCommand": true', + '\t\t}', + '\t]', '}' ].join('\n') }; diff --git a/src/vs/workbench/parts/tasks/common/tasks.ts b/src/vs/workbench/parts/tasks/common/tasks.ts index c7b3d4ebf9b..4b3031da91f 100644 --- a/src/vs/workbench/parts/tasks/common/tasks.ts +++ b/src/vs/workbench/parts/tasks/common/tasks.ts @@ -41,6 +41,52 @@ export namespace ShellConfiguration { } } +export enum RevealKind { + /** + * Always brings the terminal to front if the task is executed. + */ + Always = 1, + + /** + * Only brings the terminal to front if a problem is detected executing the task + * (e.g. the task couldn't be started because). + */ + Silent = 2, + + /** + * The terminal never comes to front when the task is executed. + */ + Never = 3 +} + +export namespace RevealKind { + export function fromString(value: string): RevealKind { + switch (value.toLowerCase()) { + case 'always': + return RevealKind.Always; + case 'silent': + return RevealKind.Silent; + case 'never': + return RevealKind.Never; + default: + return RevealKind.Always; + } + } +} + +export interface TerminalBehavior { + /** + * Controls whether the terminal executing a task is brought to front or not. + * Defaults to `RevealKind.Always`. + */ + reveal: RevealKind; + + /** + * Controls whether the executed command is printed to the output window or terminal as well. + */ + echo: boolean; +} + export interface CommandConfiguration { /** * The command to execute @@ -68,30 +114,9 @@ export interface CommandConfiguration { taskSelector?: string; /** - * Controls whether the executed command is printed to the output windows as well. + * Describes how the terminal is supposed to behave. */ - echo: boolean; -} - -export enum ShowOutput { - Always = 1, - Silent = 2, - Never = 3 -} - -export namespace ShowOutput { - export function fromString(value: string): ShowOutput { - value = value.toLowerCase(); - if (value === 'always') { - return ShowOutput.Always; - } else if (value === 'silent') { - return ShowOutput.Silent; - } else if (value === 'never') { - return ShowOutput.Never; - } else { - return undefined; - } - } + terminal: TerminalBehavior; } export namespace TaskGroup { @@ -177,12 +202,6 @@ export interface Task { */ promptOnClose?: boolean; - /** - * Controls whether the output of the running tasks is shown or not. Default - * value is "always". - */ - showOutput: ShowOutput; - /** * The other tasks this task depends on. */ diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index ac6c9429c55..98b390f2f21 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -65,11 +65,12 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IOutputService, IOutputChannelRegistry, Extensions as OutputExt, IOutputChannel } from 'vs/workbench/parts/output/common/output'; +import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions } from 'vs/workbench/browser/actionBarRegistry'; import { ITerminalService } from 'vs/workbench/parts/terminal/common/terminal'; import { ITaskSystem, ITaskResolver, ITaskSummary, ITaskExecuteResult, TaskExecuteKind, TaskError, TaskErrors, TaskSystemEvents } from 'vs/workbench/parts/tasks/common/taskSystem'; -import { Task, TaskSet, TaskGroup, ExecutionEngine, ShowOutput, TaskSourceKind } from 'vs/workbench/parts/tasks/common/tasks'; +import { Task, TaskSet, TaskGroup, ExecutionEngine, TaskSourceKind } from 'vs/workbench/parts/tasks/common/tasks'; import { ITaskService, TaskServiceEvents, ITaskProvider } from 'vs/workbench/parts/tasks/common/taskService'; import { templates as taskTemplates } from 'vs/workbench/parts/tasks/common/taskTemplates'; @@ -77,6 +78,7 @@ import * as TaskConfig from 'vs/workbench/parts/tasks/common/taskConfiguration'; import { ProcessTaskSystem } from 'vs/workbench/parts/tasks/node/processTaskSystem'; import { TerminalTaskSystem } from './terminalTaskSystem'; import { ProcessRunnerDetector } from 'vs/workbench/parts/tasks/node/processRunnerDetector'; +import { QuickOpenActionContributor } from '../browser/quickOpen'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -758,7 +760,6 @@ class TaskService extends EventEmitter implements ITaskService { identifier: id, dependsOn: primaryTasks.map(task => task._id), command: undefined, - showOutput: ShowOutput.Never }; return { task, resolver }; } @@ -867,30 +868,32 @@ class TaskService extends EventEmitter implements ITaskService { } private getTaskSets(): TPromise { - return new TPromise((resolve, reject) => { - let result: TaskSet[] = []; - let counter: number = 0; - let done = (value: TaskSet) => { - if (value) { - result.push(value); - } - if (--counter === 0) { + return this.extensionService.activateByEvent('onCommand:workbench.action.tasks.runTask').then(() => { + return new TPromise((resolve, reject) => { + let result: TaskSet[] = []; + let counter: number = 0; + let done = (value: TaskSet) => { + if (value) { + result.push(value); + } + if (--counter === 0) { + resolve(result); + } + }; + let error = () => { + if (--counter === 0) { + resolve(result); + } + }; + if (this.getExecutionEngine() === ExecutionEngine.Terminal && this._providers.size > 0) { + this._providers.forEach((provider) => { + counter++; + provider.provideTasks().done(done, error); + }); + } else { resolve(result); } - }; - let error = () => { - if (--counter === 0) { - resolve(result); - } - }; - if (this.getExecutionEngine() === ExecutionEngine.Terminal && this._providers.size > 0) { - this._providers.forEach((provider) => { - counter++; - provider.provideTasks().done(done, error); - }); - } else { - resolve(result); - } + }); }).then((result) => { return this.getWorkspaceTasks().then((workspaceTaskResult) => { let workspaceTasksToDelete: Task[] = []; @@ -1018,10 +1021,7 @@ class TaskService extends EventEmitter implements ITaskService { configPromise = TPromise.as({ config, hasErrors: false }); } } else { - configPromise = new ProcessRunnerDetector(this.fileService, this.contextService, this.configurationResolverService).detect(true).then((value) => { - let hasErrors = this.printStderr(value.stderr); - return { config: value.config, hasErrors }; - }); + configPromise = TPromise.as({ config, hasErrors: false }); } } return configPromise.then((resolved) => { @@ -1326,6 +1326,9 @@ quickOpenRegistry.registerQuickOpenHandler( ) ); +const actionBarRegistry = Registry.as(ActionBarExtensions.Actionbar); +actionBarRegistry.registerActionBarContributor(Scope.VIEWER, QuickOpenActionContributor); + // Status bar let statusbarRegistry = Registry.as(StatusbarExtensions.Statusbar); statusbarRegistry.registerStatusbarItem(new StatusbarItemDescriptor(StatusBarItem, StatusbarAlignment.LEFT, 50 /* Medium Priority */)); diff --git a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts b/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts index 00b2950731f..504d0114385 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts @@ -33,7 +33,7 @@ import { IConfigurationResolverService } from 'vs/workbench/services/configurati import { ITerminalService, ITerminalInstance, IShellLaunchConfig } from 'vs/workbench/parts/terminal/common/terminal'; import { IOutputService, IOutputChannel } from 'vs/workbench/parts/output/common/output'; import { StartStopProblemCollector, WatchingProblemCollector, ProblemCollectorEvents } from 'vs/workbench/parts/tasks/common/problemCollectors'; -import { Task, ShowOutput, CommandOptions, ShellConfiguration } from 'vs/workbench/parts/tasks/common/tasks'; +import { Task, RevealKind, CommandOptions, ShellConfiguration } from 'vs/workbench/parts/tasks/common/tasks'; import { ITaskSystem, ITaskSummary, ITaskExecuteResult, TaskExecuteKind, TaskError, TaskErrors, ITaskResolver, TelemetryEvent, Triggers, TaskSystemEvents, TaskEvent, TaskType @@ -134,7 +134,8 @@ export class TerminalTaskSystem extends EventEmitter implements ITaskSystem { public run(task: Task, resolver: ITaskResolver, trigger: string = Triggers.command): ITaskExecuteResult { let terminalData = this.activeTasks[task._id]; if (terminalData && terminalData.promise) { - if (task.showOutput === ShowOutput.Always) { + let reveal = task.command.terminal.reveal; + if (reveal === RevealKind.Always) { terminalData.terminal.setVisible(true); } return { kind: TaskExecuteKind.Active, active: { same: true, background: task.isBackground }, promise: terminalData.promise }; @@ -288,7 +289,8 @@ export class TerminalTaskSystem extends EventEmitter implements ITaskSystem { this.emit(TaskSystemEvents.Inactive, event); } eventCounter = 0; - if (exitCode && exitCode === 1 && watchingProblemMatcher.numberOfMatches === 0 && task.showOutput !== ShowOutput.Never) { + let reveal = task.command.terminal.reveal; + if (exitCode && exitCode === 1 && watchingProblemMatcher.numberOfMatches === 0 && reveal !== RevealKind.Never) { this.terminalService.setActiveInstance(terminal); this.terminalService.showPanel(false); } @@ -330,7 +332,7 @@ export class TerminalTaskSystem extends EventEmitter implements ITaskSystem { }); } this.terminalService.setActiveInstance(terminal); - if (task.showOutput === ShowOutput.Always) { + if (task.command.terminal.reveal === RevealKind.Always) { this.terminalService.showPanel(false); } this.activeTasks[task._id] = { terminal, task, promise }; @@ -364,7 +366,7 @@ export class TerminalTaskSystem extends EventEmitter implements ITaskSystem { let options = this.resolveOptions(task.command.options); let { command, args } = this.resolveCommandAndArgs(task); let terminalName = nls.localize('TerminalTaskSystem.terminalName', 'Task - {0}', task.name); - let waitOnExit = task.showOutput !== ShowOutput.Never || !task.isBackground; + let waitOnExit = task.command.terminal.reveal !== RevealKind.Never || !task.isBackground; let shellLaunchConfig: IShellLaunchConfig = undefined; if (task.command.isShellCommand) { if (Platform.isWindows && ((options.cwd && TPath.isUNC(options.cwd)) || (!options.cwd && TPath.isUNC(process.cwd())))) { @@ -413,7 +415,7 @@ export class TerminalTaskSystem extends EventEmitter implements ITaskSystem { }); shellArgs.push(commandLine); shellLaunchConfig.args = Platform.isWindows ? shellArgs.join(' ') : shellArgs; - if (task.command.echo) { + if (task.command.terminal.echo) { shellLaunchConfig.initialText = `> ${commandLine}`; } } else { @@ -427,7 +429,7 @@ export class TerminalTaskSystem extends EventEmitter implements ITaskSystem { args, waitOnExit }; - if (task.command.echo) { + if (task.command.terminal.echo) { let getArgsToEcho = (args: string | string[]): string => { if (!args || args.length === 0) { return ''; diff --git a/src/vs/workbench/parts/tasks/node/processTaskSystem.ts b/src/vs/workbench/parts/tasks/node/processTaskSystem.ts index 9cc26f22205..848368e6dc4 100644 --- a/src/vs/workbench/parts/tasks/node/processTaskSystem.ts +++ b/src/vs/workbench/parts/tasks/node/processTaskSystem.ts @@ -29,7 +29,7 @@ import { StartStopProblemCollector, WatchingProblemCollector, ProblemCollectorEv import { ITaskSystem, ITaskSummary, ITaskExecuteResult, TaskExecuteKind, TaskError, TaskErrors, TelemetryEvent, Triggers, TaskSystemEvents, TaskEvent, TaskType } from 'vs/workbench/parts/tasks/common/taskSystem'; -import { Task, CommandOptions, ShowOutput, CommandConfiguration } from 'vs/workbench/parts/tasks/common/tasks'; +import { Task, CommandOptions, RevealKind, CommandConfiguration } from 'vs/workbench/parts/tasks/common/tasks'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; @@ -178,11 +178,12 @@ export class ProcessTaskSystem extends EventEmitter implements ITaskSystem { this.childProcess = new LineProcess(command, args, !!commandConfig.isShellCommand, this.resolveOptions(commandConfig.options)); telemetryEvent.command = this.childProcess.getSanitizedCommand(); // we have no problem matchers defined. So show the output log - if (task.showOutput === ShowOutput.Always || (task.showOutput === ShowOutput.Silent && task.problemMatchers.length === 0)) { + let reveal = task.command.terminal.reveal; + if (reveal === RevealKind.Always || (reveal === RevealKind.Silent && task.problemMatchers.length === 0)) { this.showOutput(); } - if (commandConfig.echo) { + if (commandConfig.terminal.echo) { let prompt: string = Platform.isWindows ? '>' : '$'; this.log(`running command${prompt} ${command} ${args.join(' ')}`); } @@ -214,7 +215,7 @@ export class ProcessTaskSystem extends EventEmitter implements ITaskSystem { if (!this.checkTerminated(task, success)) { this.log(nls.localize('TaskRunnerSystem.watchingBuildTaskFinished', '\nWatching build tasks has finished.')); } - if (success.cmdCode && success.cmdCode === 1 && watchingProblemMatcher.numberOfMatches === 0 && task.showOutput !== ShowOutput.Never) { + if (success.cmdCode && success.cmdCode === 1 && watchingProblemMatcher.numberOfMatches === 0 && reveal !== RevealKind.Never) { this.showOutput(); } taskSummary.exitCode = success.cmdCode; @@ -258,7 +259,7 @@ export class ProcessTaskSystem extends EventEmitter implements ITaskSystem { startStopProblemMatcher.dispose(); this.checkTerminated(task, success); this.emit(TaskSystemEvents.Inactive, event); - if (success.cmdCode && success.cmdCode === 1 && startStopProblemMatcher.numberOfMatches === 0 && task.showOutput !== ShowOutput.Never) { + if (success.cmdCode && success.cmdCode === 1 && startStopProblemMatcher.numberOfMatches === 0 && reveal !== RevealKind.Never) { this.showOutput(); } taskSummary.exitCode = success.cmdCode; diff --git a/src/vs/workbench/parts/tasks/test/node/configuration.test.ts b/src/vs/workbench/parts/tasks/test/node/configuration.test.ts index 40ef9ddda1d..091899e941a 100644 --- a/src/vs/workbench/parts/tasks/test/node/configuration.test.ts +++ b/src/vs/workbench/parts/tasks/test/node/configuration.test.ts @@ -68,10 +68,32 @@ class ConfiguationBuilder { } } +class TerminalBehaviorBuilder { + + public result: Tasks.TerminalBehavior; + + constructor(public parent: CommandConfigurationBuilder) { + this.result = { echo: false, reveal: Tasks.RevealKind.Always }; + } + + public echo(value: boolean): TerminalBehaviorBuilder { + this.result.echo = value; + return this; + } + + public reveal(value: Tasks.RevealKind): TerminalBehaviorBuilder { + this.result.reveal = value; + return this; + } +} + class CommandConfigurationBuilder { public result: Tasks.CommandConfiguration; + private terminalBuilder: TerminalBehaviorBuilder; + constructor(public parent: TaskBuilder, command: string) { + this.terminalBuilder = new TerminalBehaviorBuilder(this); this.result = { name: command, isShellCommand: false, @@ -79,7 +101,7 @@ class CommandConfigurationBuilder { options: { cwd: '${workspaceRoot}' }, - echo: false + terminal: this.terminalBuilder.result }; } @@ -103,15 +125,14 @@ class CommandConfigurationBuilder { return this; } - public echo(value: boolean): CommandConfigurationBuilder { - this.result.echo = value; - return this; - } - public taskSelector(value: string): CommandConfigurationBuilder { this.result.taskSelector = value; return this; } + + public terminal(): TerminalBehaviorBuilder { + return this.terminalBuilder; + } } class TaskBuilder { @@ -127,7 +148,6 @@ class TaskBuilder { identifier: name, name: name, command: this.commandBuilder.result, - showOutput: Tasks.ShowOutput.Always, suppressTaskName: false, isBackground: false, promptOnClose: true, @@ -150,11 +170,6 @@ class TaskBuilder { return this; } - public showOutput(value: Tasks.ShowOutput): TaskBuilder { - this.result.showOutput = value; - return this; - } - public suppressTaskName(value: boolean): TaskBuilder { this.result.suppressTaskName = value; return this; @@ -401,7 +416,6 @@ function assertTask(actual: Tasks.Task, expected: Tasks.Task) { assert.ok(actual._id); assert.strictEqual(actual.name, expected.name, 'name'); assertCommandConfiguration(actual.command, expected.command); - assert.strictEqual(actual.showOutput, expected.showOutput, 'showOutput'); assert.strictEqual(actual.suppressTaskName, expected.suppressTaskName, 'suppressTaskName'); assert.strictEqual(actual.isBackground, expected.isBackground, 'isBackground'); assert.strictEqual(actual.promptOnClose, expected.promptOnClose, 'promptOnClose'); @@ -417,6 +431,7 @@ function assertTask(actual: Tasks.Task, expected: Tasks.Task) { function assertCommandConfiguration(actual: Tasks.CommandConfiguration, expected: Tasks.CommandConfiguration) { assert.strictEqual(typeof actual, typeof expected); if (actual && expected) { + assertTerminalBehavior(actual.terminal, expected.terminal); assert.strictEqual(actual.name, expected.name, 'name'); assert.strictEqual(actual.isShellCommand, expected.isShellCommand, 'isShellCommand'); assert.deepEqual(actual.args, expected.args, 'args'); @@ -428,11 +443,18 @@ function assertCommandConfiguration(actual: Tasks.CommandConfiguration, expected assert.deepEqual(actual.options.env, expected.options.env, 'env'); } } - assert.strictEqual(actual.echo, expected.echo, 'echo'); assert.strictEqual(actual.taskSelector, expected.taskSelector, 'taskSelector'); } } +function assertTerminalBehavior(actual: Tasks.TerminalBehavior, expected: Tasks.TerminalBehavior) { + assert.strictEqual(typeof actual, typeof expected); + if (actual && expected) { + assert.strictEqual(actual.echo, expected.echo); + assert.strictEqual(actual.reveal, expected.reveal); + } +} + function assertProblemMatcher(actual: string | ProblemMatcher, expected: string | ProblemMatcher) { assert.strictEqual(typeof actual, typeof expected); if (typeof actual === 'string' && typeof expected === 'string') { @@ -525,7 +547,7 @@ suite('Tasks Configuration parsing tests', () => { task('tsc', 'tsc'). group(Tasks.TaskGroup.Build). suppressTaskName(true). - showOutput(Tasks.ShowOutput.Silent); + command().terminal().reveal(Tasks.RevealKind.Silent); testConfiguration( { version: '0.1.0', @@ -590,7 +612,7 @@ suite('Tasks Configuration parsing tests', () => { task('tsc', 'tsc'). group(Tasks.TaskGroup.Build). suppressTaskName(true). - showOutput(Tasks.ShowOutput.Never); + command().terminal().reveal(Tasks.RevealKind.Never); testConfiguration( { version: '0.1.0', @@ -607,7 +629,7 @@ suite('Tasks Configuration parsing tests', () => { task('tsc', 'tsc'). group(Tasks.TaskGroup.Build). suppressTaskName(true). - command(). + command().terminal(). echo(true); testConfiguration( { @@ -759,8 +781,8 @@ suite('Tasks Configuration parsing tests', () => { builder. task('tsc', 'tsc'). group(Tasks.TaskGroup.Build). - showOutput(Platform.isWindows ? Tasks.ShowOutput.Always : Tasks.ShowOutput.Never). - suppressTaskName(true); + suppressTaskName(true). + command().terminal().reveal(Platform.isWindows ? Tasks.RevealKind.Always : Tasks.RevealKind.Never); let external: ExternalTaskRunnerConfiguration = { version: '0.1.0', command: 'tsc', @@ -778,7 +800,7 @@ suite('Tasks Configuration parsing tests', () => { task('tsc', 'tsc'). group(Tasks.TaskGroup.Build). suppressTaskName(true). - command(). + command().terminal(). echo(Platform.isWindows ? false : true); let external: ExternalTaskRunnerConfiguration = { version: '0.1.0', @@ -903,12 +925,11 @@ suite('Tasks Configuration parsing tests', () => { let builder = new ConfiguationBuilder(); builder.task('test', 'tsc'). group(Tasks.TaskGroup.Test). - showOutput(Tasks.ShowOutput.Never). args(['--p']). isBackground(true). promptOnClose(false). - command(). - echo(true); + command().terminal(). + echo(true).reveal(Tasks.RevealKind.Never); testConfiguration(external, builder); }); @@ -928,9 +949,8 @@ suite('Tasks Configuration parsing tests', () => { let builder = new ConfiguationBuilder(); builder.task('test', 'tsc'). group(Tasks.TaskGroup.Test). - showOutput(Tasks.ShowOutput.Never). - command(). - echo(true); + command().terminal(). + echo(true).reveal(Tasks.RevealKind.Never); testConfiguration(external, builder); }); @@ -1392,15 +1412,17 @@ suite('Bugs / regression tests', () => { let builder = new ConfiguationBuilder(); if (Platform.isWindows) { builder.task('composeForDebug', 'powershell'). - suppressTaskName(true).showOutput(Tasks.ShowOutput.Always). + suppressTaskName(true). args(['-ExecutionPolicy', 'RemoteSigned', '.\\dockerTask.ps1', '-ComposeForDebug', '-Environment', 'debug']). - command().echo(true).options({ cwd: '${workspaceRoot}' }); + command().options({ cwd: '${workspaceRoot}' }). + terminal().echo(true).reveal(Tasks.RevealKind.Always); testConfiguration(external, builder); } else if (Platform.isMacintosh) { builder.task('composeForDebug', '/bin/bash'). - suppressTaskName(true).showOutput(Tasks.ShowOutput.Always). + suppressTaskName(true). args(['-c', './dockerTask.sh composeForDebug debug']). - command().options({ cwd: '${workspaceRoot}' }); + command().options({ cwd: '${workspaceRoot}' }). + terminal().reveal(Tasks.RevealKind.Always); testConfiguration(external, builder); } }); From 92adbb1bb7ac699d8d487a84d417758539717da7 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 24 May 2017 12:41:57 +0200 Subject: [PATCH 0880/1164] update service: get initial state --- src/vs/platform/update/common/updateIpc.ts | 25 +++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/vs/platform/update/common/updateIpc.ts b/src/vs/platform/update/common/updateIpc.ts index 2076719e98a..cb48952d2b3 100644 --- a/src/vs/platform/update/common/updateIpc.ts +++ b/src/vs/platform/update/common/updateIpc.ts @@ -7,7 +7,9 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IChannel, eventToCall, eventFromCall } from 'vs/base/parts/ipc/common/ipc'; -import Event from 'vs/base/common/event'; +import Event, { Emitter, any, mapEvent } from 'vs/base/common/event'; +import { onUnexpectedError } from 'vs/base/common/errors'; +import { memoize } from 'vs/base/common/decorators'; import { IUpdateService, IRawUpdate, State, IUpdate } from './update'; export interface IUpdateChannel extends IChannel { @@ -18,6 +20,7 @@ export interface IUpdateChannel extends IChannel { call(command: 'event:onStateChange'): TPromise; call(command: 'checkForUpdates', arg: boolean): TPromise; call(command: 'quitAndInstall'): TPromise; + call(command: '_getInitialState'): TPromise; call(command: string, arg?: any): TPromise; } @@ -34,6 +37,7 @@ export class UpdateChannel implements IUpdateChannel { case 'event:onStateChange': return eventToCall(this.service.onStateChange); case 'checkForUpdates': return this.service.checkForUpdates(arg); case 'quitAndInstall': return this.service.quitAndInstall(); + case '_getInitialState': return TPromise.as(this.service.state); } return undefined; } @@ -55,14 +59,25 @@ export class UpdateChannelClient implements IUpdateService { private _onUpdateReady = eventFromCall(this.channel, 'event:onUpdateReady'); get onUpdateReady(): Event { return this._onUpdateReady; } - private _onStateChange = eventFromCall(this.channel, 'event:onStateChange'); - get onStateChange(): Event { return this._onStateChange; } + private _onInitialStateChange = new Emitter(); + private _onRemoteStateChange = eventFromCall(this.channel, 'event:onStateChange'); + + @memoize + get onStateChange(): Event { + const result = any(this._onInitialStateChange.event, this._onRemoteStateChange); + + return mapEvent(result, state => { + this._state = state; + return state; + }); + } private _state: State = State.Uninitialized; get state(): State { return this._state; }; - constructor(private channel: IChannel) { - this.onStateChange(state => this._state = state); + constructor(private channel: IUpdateChannel) { + channel.call('_getInitialState') + .done(state => this._onInitialStateChange.fire(state), onUnexpectedError); } checkForUpdates(explicit: boolean): TPromise { From 48968ba1f3cca8c67a7504954c5236e63c3a75be Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 24 May 2017 13:02:51 +0200 Subject: [PATCH 0881/1164] theming: extension buttons --- .../extensions/browser/extensionsActions.ts | 66 +++++++++++++++++-- .../browser/media/extensionActions.css | 59 ----------------- 2 files changed, 62 insertions(+), 63 deletions(-) diff --git a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts index 47ccf37113e..3b557abaf33 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts @@ -32,13 +32,16 @@ import { IExtensionService, IExtensionDescription } from 'vs/platform/extensions import URI from 'vs/base/common/uri'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { registerThemingParticipant, ITheme, ICssStyleCollector } from "vs/platform/theme/common/themeService"; +import { buttonBackground, buttonForeground, buttonHoverBackground, contrastBorder, registerColor } from "vs/platform/theme/common/colorRegistry"; +import { Color } from "vs/base/common/color"; export class InstallAction extends Action { private static InstallLabel = localize('installAction', "Install"); private static InstallingLabel = localize('installing', "Installing"); - private static Class = 'extension-action install'; + private static Class = 'extension-action prominent install'; private static InstallingClass = 'extension-action install installing'; private disposables: IDisposable[] = []; @@ -153,7 +156,7 @@ export class UninstallAction extends Action { export class CombinedInstallAction extends Action { - private static NoExtensionClass = 'extension-action install no-extension'; + private static NoExtensionClass = 'extension-action prominent install no-extension'; private installAction: InstallAction; private uninstallAction: UninstallAction; private disposables: IDisposable[] = []; @@ -224,7 +227,7 @@ export class CombinedInstallAction extends Action { export class UpdateAction extends Action { - private static EnabledClass = 'extension-action update'; + private static EnabledClass = 'extension-action prominent update'; private static DisabledClass = `${UpdateAction.EnabledClass} disabled`; private static Label = localize('updateAction', "Update"); @@ -477,7 +480,7 @@ export class EnableGloballyAction extends Action implements IExtensionAction { export class EnableAction extends Action { static ID = 'extensions.enable'; - private static EnabledClass = 'extension-action enable'; + private static EnabledClass = 'extension-action prominent enable'; private static DisabledClass = `${EnableAction.EnabledClass} disabled`; private disposables: IDisposable[] = []; @@ -1385,3 +1388,58 @@ CommandsRegistry.registerCommand('workbench.extensions.action.showLanguageExtens viewlet.focus(); }); }); + +export const extensionButtonProminentBackground = registerColor('extensionButton.prominentBackground', { + dark: '#327e36', + light: '#327e36', + hc: null +}, localize('extensionButtonProminentBackground', "Button background color for actions extension that stand out (e.g. install button).")); + +export const extensionButtonProminentForeground = registerColor('extensionButton.prominentForeground', { + dark: Color.white, + light: Color.white, + hc: null +}, localize('extensionButtonProminentForeground', "Button foreground color for actions extension that stand out (e.g. install button).")); + +export const extensionButtonProminentHoverBackground = registerColor('extensionButton.prominentHoverBackground', { + dark: '#28632b', + light: '#28632b', + hc: null +}, localize('extensionButtonProminentHoverBackground', "Button background hover color for actions extension that stand out (e.g. install button).")); + +registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { + const buttonBackgroundColor = theme.getColor(buttonBackground); + if (buttonBackgroundColor) { + collector.addRule(`.monaco-action-bar .action-item .action-label.extension-action { background-color: ${buttonBackgroundColor}; }`); + } + + const buttonForegroundColor = theme.getColor(buttonForeground); + if (buttonForegroundColor) { + collector.addRule(`.monaco-action-bar .action-item .action-label.extension-action { color: ${buttonForegroundColor}; }`); + } + + const buttonHoverBackgroundColor = theme.getColor(buttonHoverBackground); + if (buttonHoverBackgroundColor) { + collector.addRule(`.monaco-action-bar .action-item:hover .action-label.extension-action { background-color: ${buttonHoverBackgroundColor}; }`); + } + + const contrastBorderColor = theme.getColor(contrastBorder); + if (contrastBorderColor) { + collector.addRule(`.monaco-action-bar .action-item .action-label.extension-action { border: 1px solid ${contrastBorderColor}; }`); + } + + const extensionButtonProminentBackgroundColor = theme.getColor(extensionButtonProminentBackground); + if (extensionButtonProminentBackground) { + collector.addRule(`.monaco-action-bar .action-item .action-label.extension-action.prominent { background-color: ${extensionButtonProminentBackgroundColor}; }`); + } + + const extensionButtonProminentForegroundColor = theme.getColor(extensionButtonProminentForeground); + if (extensionButtonProminentForeground) { + collector.addRule(`.monaco-action-bar .action-item .action-label.extension-action.prominent { color: ${extensionButtonProminentForegroundColor}; }`); + } + + const extensionButtonProminentHoverBackgroundColor = theme.getColor(extensionButtonProminentHoverBackground); + if (extensionButtonProminentHoverBackground) { + collector.addRule(`.monaco-action-bar .action-item:hover .action-label.extension-action.prominent { background-color: ${extensionButtonProminentHoverBackgroundColor}; }`); + } +}); \ No newline at end of file diff --git a/src/vs/workbench/parts/extensions/browser/media/extensionActions.css b/src/vs/workbench/parts/extensions/browser/media/extensionActions.css index 5a51986dce8..e80db60cdef 100644 --- a/src/vs/workbench/parts/extensions/browser/media/extensionActions.css +++ b/src/vs/workbench/parts/extensions/browser/media/extensionActions.css @@ -4,69 +4,10 @@ *--------------------------------------------------------------------------------------------*/ .monaco-action-bar .action-item .action-label.extension-action { - border: 1px solid #CCC; - color: #6C6C6C; - background-color: #E2E2E2; padding: 0 5px; line-height: initial; } -.monaco-action-bar .action-item:not(.disabled):hover .action-label.extension-action { - background-color: #D9D9D9; -} - -.monaco-action-bar .action-item:not(.disabled):active .action-label.extension-action { - background-color: #C9C9C9; -} - -.vs-dark .monaco-action-bar .action-item .action-label.extension-action { - border: 1px solid #545454; - color: #CCC; - background-color: #3A3A3A; -} - -.vs-dark .monaco-action-bar .action-item:not(.disabled):hover .action-label.extension-action { - background-color: #464646; -} - -.vs-dark .monaco-action-bar .action-item:not(.disabled):active .action-label.extension-action { - background-color: #505050; -} - -.monaco-action-bar .action-item .action-label.extension-action.install, -.monaco-action-bar .action-item .action-label.extension-action.enable, -.monaco-action-bar .action-item .action-label.extension-action.update { - color: white; - background-color: #327e36; - border-color: #519A55; -} - -.monaco-action-bar .action-item:not(.disabled):hover .action-label.extension-action.install, -.monaco-action-bar .action-item:not(.disabled):hover .action-label.extension-action.enable, -.monaco-action-bar .action-item:not(.disabled):hover .action-label.extension-action.update { - background-color: #478E4B; -} - -.monaco-action-bar .action-item:not(.disabled):active .action-label.extension-action.install, -.monaco-action-bar .action-item:not(.disabled):active .action-label.extension-action.enable, -.monaco-action-bar .action-item:not(.disabled):active .action-label.extension-action.update { - background-color: #6DA770; -} - -.monaco-action-bar .action-item .action-label.extension-action.reload { - color: white; - background-color: #007ACC; - border-color: #3F8BCE; -} - -.monaco-action-bar .action-item:not(.disabled):hover .action-label.extension-action.reload { - background-color: #2584C4; -} - -.monaco-action-bar .action-item:not(.disabled):active .action-label.extension-action.reload { - background-color: #4294CC -} - .monaco-action-bar .action-item .action-label.clear-extensions { background: url('clear.svg') center center no-repeat; } From 68bf412dcd10bdb38a2e8ffb8f346605f17f68d3 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 24 May 2017 13:12:13 +0200 Subject: [PATCH 0882/1164] Add tests for PagedScreenReaderStrategy --- .../browser/controller/textAreaState.test.ts | 87 ++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/test/browser/controller/textAreaState.test.ts b/src/vs/editor/test/browser/controller/textAreaState.test.ts index 2423f8d3836..1d2c76be87d 100644 --- a/src/vs/editor/test/browser/controller/textAreaState.test.ts +++ b/src/vs/editor/test/browser/controller/textAreaState.test.ts @@ -5,10 +5,12 @@ 'use strict'; import * as assert from 'assert'; -import { ISimpleModel, TextAreaState, ITextAreaWrapper } from 'vs/editor/browser/controller/textAreaState'; +import { ISimpleModel, TextAreaState, ITextAreaWrapper, PagedScreenReaderStrategy } from 'vs/editor/browser/controller/textAreaState'; import { Range } from 'vs/editor/common/core/range'; import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; import { Disposable } from 'vs/base/common/lifecycle'; +import { Model } from "vs/editor/common/model/model"; +import { Selection } from 'vs/editor/common/core/selection'; export class MockTextAreaWrapper extends Disposable implements ITextAreaWrapper { @@ -488,6 +490,89 @@ suite('TextAreaState', () => { '⌨️', 0 ); }); + + suite('PagedScreenReaderStrategy', () => { + + function testPagedScreenReaderStrategy(lines: string[], selection: Selection, expected: TextAreaState): void { + const model = Model.createFromString(lines.join('\n')); + const actual = PagedScreenReaderStrategy.fromEditorSelection(TextAreaState.EMPTY, model, selection); + assert.ok(actual.equals(expected), actual); + model.dispose(); + } + + test('simple', () => { + testPagedScreenReaderStrategy( + [ + 'Hello world!' + ], + new Selection(1, 13, 1, 13), + new TextAreaState('Hello world!', 12, 12) + ); + + testPagedScreenReaderStrategy( + [ + 'Hello world!' + ], + new Selection(1, 1, 1, 1), + new TextAreaState('Hello world!', 0, 0) + ); + + testPagedScreenReaderStrategy( + [ + 'Hello world!' + ], + new Selection(1, 1, 1, 6), + new TextAreaState('Hello world!', 0, 5) + ); + }); + + test('multiline', () => { + testPagedScreenReaderStrategy( + [ + 'Hello world!', + 'How are you?' + ], + new Selection(1, 1, 1, 1), + new TextAreaState('Hello world!\nHow are you?', 0, 0) + ); + + testPagedScreenReaderStrategy( + [ + 'Hello world!', + 'How are you?' + ], + new Selection(2, 1, 2, 1), + new TextAreaState('Hello world!\nHow are you?', 13, 13) + ); + }); + + test('page', () => { + testPagedScreenReaderStrategy( + [ + 'L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10\nL11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20\nL21' + ], + new Selection(1, 1, 1, 1), + new TextAreaState('L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10', 0, 0) + ); + + testPagedScreenReaderStrategy( + [ + 'L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10\nL11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20\nL21' + ], + new Selection(11, 1, 11, 1), + new TextAreaState('L11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20', 0, 0) + ); + + testPagedScreenReaderStrategy( + [ + 'L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10\nL11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20\nL21' + ], + new Selection(12, 1, 12, 1), + new TextAreaState('L11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20', 4, 4) + ); + }); + + }); }); class SimpleModel implements ISimpleModel { From 5f49f0979f83c8d91556c9108acc3893f997d765 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 24 May 2017 13:14:25 +0200 Subject: [PATCH 0883/1164] Add trailing new line to current page (if there is one) --- .../editor/browser/controller/textAreaState.ts | 3 +-- .../browser/controller/textAreaState.test.ts | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/browser/controller/textAreaState.ts b/src/vs/editor/browser/controller/textAreaState.ts index 41581a76cda..d398f510147 100644 --- a/src/vs/editor/browser/controller/textAreaState.ts +++ b/src/vs/editor/browser/controller/textAreaState.ts @@ -6,7 +6,6 @@ import { Range } from 'vs/editor/common/core/range'; import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; -import { Constants } from 'vs/editor/common/core/uint'; import * as strings from 'vs/base/common/strings'; export interface ITextAreaWrapper { @@ -206,7 +205,7 @@ export class PagedScreenReaderStrategy { let offset = page * PagedScreenReaderStrategy._LINES_PER_PAGE; let startLineNumber = offset + 1; let endLineNumber = offset + PagedScreenReaderStrategy._LINES_PER_PAGE; - return new Range(startLineNumber, 1, endLineNumber, Constants.MAX_SAFE_SMALL_INTEGER); + return new Range(startLineNumber, 1, endLineNumber + 1, 1); } public static fromEditorSelection(previousState: TextAreaState, model: ISimpleModel, selection: Range): TextAreaState { diff --git a/src/vs/editor/test/browser/controller/textAreaState.test.ts b/src/vs/editor/test/browser/controller/textAreaState.test.ts index 1d2c76be87d..9170690d5ec 100644 --- a/src/vs/editor/test/browser/controller/textAreaState.test.ts +++ b/src/vs/editor/test/browser/controller/textAreaState.test.ts @@ -496,7 +496,7 @@ suite('TextAreaState', () => { function testPagedScreenReaderStrategy(lines: string[], selection: Selection, expected: TextAreaState): void { const model = Model.createFromString(lines.join('\n')); const actual = PagedScreenReaderStrategy.fromEditorSelection(TextAreaState.EMPTY, model, selection); - assert.ok(actual.equals(expected), actual); + assert.ok(actual.equals(expected)); model.dispose(); } @@ -552,7 +552,7 @@ suite('TextAreaState', () => { 'L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10\nL11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20\nL21' ], new Selection(1, 1, 1, 1), - new TextAreaState('L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10', 0, 0) + new TextAreaState('L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10\n', 0, 0) ); testPagedScreenReaderStrategy( @@ -560,7 +560,7 @@ suite('TextAreaState', () => { 'L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10\nL11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20\nL21' ], new Selection(11, 1, 11, 1), - new TextAreaState('L11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20', 0, 0) + new TextAreaState('L11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20\n', 0, 0) ); testPagedScreenReaderStrategy( @@ -568,7 +568,15 @@ suite('TextAreaState', () => { 'L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10\nL11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20\nL21' ], new Selection(12, 1, 12, 1), - new TextAreaState('L11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20', 4, 4) + new TextAreaState('L11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20\n', 4, 4) + ); + + testPagedScreenReaderStrategy( + [ + 'L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10\nL11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20\nL21' + ], + new Selection(21, 1, 21, 1), + new TextAreaState('L21', 0, 0) ); }); From 667b8956597f130be0911020b27689c30e017637 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 24 May 2017 13:19:01 +0200 Subject: [PATCH 0884/1164] use process.hrtime for tick timers --- src/vs/base/node/startupTimers.d.ts | 6 +++--- src/vs/base/node/startupTimers.js | 16 +++++----------- .../electron-browser/bootstrap/index.js | 2 -- src/vs/workbench/electron-browser/shell.ts | 7 +------ 4 files changed, 9 insertions(+), 22 deletions(-) diff --git a/src/vs/base/node/startupTimers.d.ts b/src/vs/base/node/startupTimers.d.ts index c91175b0262..5a04270f4b6 100644 --- a/src/vs/base/node/startupTimers.d.ts +++ b/src/vs/base/node/startupTimers.d.ts @@ -26,13 +26,13 @@ declare interface TickController { stop(stopped?: number): void; } -export function startTimer(name: string, started?: number): TickController; +export function startTimer(name: string): TickController; -export function stopTimer(name: string, stopped?: number); +export function stopTimer(name: string); export function ticks(): Tick[]; -export function tick(name:string):Tick; +export function tick(name: string): Tick; export function setProfileList(names: string[]): void; diff --git a/src/vs/base/node/startupTimers.js b/src/vs/base/node/startupTimers.js index 45637a77b58..7fc81812efc 100644 --- a/src/vs/base/node/startupTimers.js +++ b/src/vs/base/node/startupTimers.js @@ -31,7 +31,7 @@ define([], function () { this.name = name; this.started = started; this.stopped = stopped; - this.duration = stopped - started; + this.duration = Math.round(((stopped[0] * 1.e9 + stopped[1]) - (started[0] * 1e9 + started[1])) / 1.e6); this.profile = profile; } Tick.compareByStart = function (a, b) { @@ -55,17 +55,14 @@ define([], function () { var _ticks = global._perfTicks; var _toBeProfiled = global._perfToBeProfiled; - function startTimer(name, started) { - if (typeof started !== 'number') { - started = Date.now(); - } + function startTimer(name) { if (_starts.has(name)) { throw new Error("${name}" + " already exists"); } if (_toBeProfiled.has(name)) { requireProfiler().startProfiling(name, true); } - _starts.set(name, { name: name, started: started }); + _starts.set(name, { name: name, started: process.hrtime() }); var stop = stopTimer.bind(undefined, name); return { stop: stop, @@ -76,14 +73,11 @@ define([], function () { }; } - function stopTimer(name, stopped) { - if (typeof stopped !== 'number') { - stopped = Date.now(); - } + function stopTimer(name) { var profile = _toBeProfiled.has(name) ? requireProfiler().stopProfiling(name) : undefined; var start = _starts.get(name); if (start !== undefined) { - var tick = new Tick(start.name, start.started, stopped, profile); + var tick = new Tick(start.name, start.started, process.hrtime(), profile); _ticks.set(name, tick); _starts.delete(name); } diff --git a/src/vs/workbench/electron-browser/bootstrap/index.js b/src/vs/workbench/electron-browser/bootstrap/index.js index 2b20efb7bbc..c01da62847a 100644 --- a/src/vs/workbench/electron-browser/bootstrap/index.js +++ b/src/vs/workbench/electron-browser/bootstrap/index.js @@ -192,8 +192,6 @@ function main() { beforeLoadWorkbenchMain: Date.now() }; - startTimer('elapsed:overall', configuration.perfStartTime); - const workbenchMainTimer = startTimer('load:workbench.main') require([ 'vs/workbench/electron-browser/workbench.main', diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index ac4b1759dde..bec5d37606b 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -59,7 +59,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; -import { ILifecycleService, StartupKind } from 'vs/platform/lifecycle/common/lifecycle'; +import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IMessageService, IChoiceService, Severity, CloseAction } from 'vs/platform/message/common/message'; @@ -101,7 +101,6 @@ import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/work import { WorkbenchThemeService } from 'vs/workbench/services/themes/electron-browser/workbenchThemeService'; import { registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; import { foreground, selectionBackground, focusBorder, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, listHighlightForeground, inputPlaceholderForeground } from 'vs/platform/theme/common/colorRegistry'; -import { stopTimer } from 'vs/base/node/startupTimers'; /** * Services that we require for the Shell @@ -243,10 +242,6 @@ export class WorkbenchShell { startupKind: this.lifecycleService.startupKind }); - if (this.lifecycleService.startupKind === StartupKind.NewWindow) { - stopTimer('elapsed:overall'); - } - // Telemetry: startup metrics this.timerService.workbenchStarted = Date.now(); this.timerService.restoreEditorsDuration = info.restoreEditorsDuration; From b78cd1e05d9e23eda6335cd70ad6444a3702d748 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 24 May 2017 15:27:05 +0200 Subject: [PATCH 0885/1164] use getAccessibilitySupport for F8, fixes #18366 --- src/vs/editor/contrib/gotoError/browser/gotoError.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/gotoError/browser/gotoError.ts b/src/vs/editor/contrib/gotoError/browser/gotoError.ts index 89fb5203c60..cf7c1658777 100644 --- a/src/vs/editor/contrib/gotoError/browser/gotoError.ts +++ b/src/vs/editor/contrib/gotoError/browser/gotoError.ts @@ -27,6 +27,8 @@ import { registerColor } from 'vs/platform/theme/common/colorRegistry'; import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; import { Color } from 'vs/base/common/color'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; +import { getAccessibilitySupport } from 'vs/base/browser/browser'; +import { AccessibilitySupport } from 'vs/base/common/platform'; class MarkerModel { @@ -276,7 +278,9 @@ class MarkerNavigationWidget extends ZoneWidget { public show(where: Position, heightInLines: number): void { super.show(where, heightInLines); - this.focus(); + if (getAccessibilitySupport() !== AccessibilitySupport.Disabled) { + this.focus(); + } } private _wireModelAndView(): void { From 2a5abbaeeb77f359fad6641a4816ad397cd7314a Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 24 May 2017 15:36:37 +0200 Subject: [PATCH 0886/1164] don't double print messages from the extension service --- .../workbench/api/electron-browser/mainThreadExtensionService.ts | 1 - src/vs/workbench/api/node/extHost.protocol.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts b/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts index 4bbea670cc2..14b8d69f5dc 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts @@ -135,7 +135,6 @@ export class MainProcessExtensionService extends AbstractExtensionService { throw ni(); } } From bbfd39561a5053f6767e7047509c4bd15d1f4411 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 24 May 2017 15:38:21 +0200 Subject: [PATCH 0887/1164] fix update state changes --- src/vs/platform/update/common/updateIpc.ts | 28 ++++++++++------------ 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/vs/platform/update/common/updateIpc.ts b/src/vs/platform/update/common/updateIpc.ts index cb48952d2b3..169f827d015 100644 --- a/src/vs/platform/update/common/updateIpc.ts +++ b/src/vs/platform/update/common/updateIpc.ts @@ -7,9 +7,8 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IChannel, eventToCall, eventFromCall } from 'vs/base/parts/ipc/common/ipc'; -import Event, { Emitter, any, mapEvent } from 'vs/base/common/event'; +import Event, { Emitter } from 'vs/base/common/event'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { memoize } from 'vs/base/common/decorators'; import { IUpdateService, IRawUpdate, State, IUpdate } from './update'; export interface IUpdateChannel extends IChannel { @@ -59,25 +58,24 @@ export class UpdateChannelClient implements IUpdateService { private _onUpdateReady = eventFromCall(this.channel, 'event:onUpdateReady'); get onUpdateReady(): Event { return this._onUpdateReady; } - private _onInitialStateChange = new Emitter(); private _onRemoteStateChange = eventFromCall(this.channel, 'event:onStateChange'); - - @memoize - get onStateChange(): Event { - const result = any(this._onInitialStateChange.event, this._onRemoteStateChange); - - return mapEvent(result, state => { - this._state = state; - return state; - }); - } + private _onStateChange = new Emitter(); + get onStateChange(): Event { return this._onStateChange.event; } private _state: State = State.Uninitialized; get state(): State { return this._state; }; constructor(private channel: IUpdateChannel) { - channel.call('_getInitialState') - .done(state => this._onInitialStateChange.fire(state), onUnexpectedError); + // always set this._state as the state changes + this.onStateChange(state => this._state = state); + + channel.call('_getInitialState').done(state => { + // fire initial state + this._onStateChange.fire(state); + + // fire subsequent states as they come in from remote + this._onRemoteStateChange(s => this._onStateChange.fire(state)); + }, onUnexpectedError); } checkForUpdates(explicit: boolean): TPromise { From 04c6d43247a99c34c0523c68bdca84581071eb36 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 24 May 2017 15:54:47 +0200 Subject: [PATCH 0888/1164] fixes #26184 --- extensions/git/src/commands.ts | 2 +- src/vs/base/browser/ui/list/listWidget.ts | 23 +++++++++++++++++++ .../parts/scm/electron-browser/scmViewlet.ts | 17 +++++++++++++- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 24f9c35129a..3cbd3e23033 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -132,7 +132,7 @@ export class CommandCenter { return await commands.executeCommand('vscode.open', right); } - return await commands.executeCommand('vscode.diff', left, right, title); + return await commands.executeCommand('vscode.diff', left, right, title, { preview: true }); } private getLeftResource(resource: Resource): Uri | undefined { diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index 5643cc768a9..d8f833da540 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -321,6 +321,7 @@ class MouseController implements IDisposable { this.disposables = []; this.disposables.push(view.addListener('mousedown', e => this.onMouseDown(e))); this.disposables.push(view.addListener('click', e => this.onPointer(e))); + this.disposables.push(view.addListener('dblclick', e => this.onDoubleClick(e))); this.disposables.push(view.addListener(TouchEventType.Tap, e => this.onPointer(e))); } @@ -362,6 +363,19 @@ class MouseController implements IDisposable { this.list.open(focus); } + private onDoubleClick(e: IListMouseEvent): void { + e.preventDefault(); + e.stopPropagation(); + + if (isSelectionChangeEvent(e)) { + return; + } + + const focus = this.list.getFocus(); + this.list.setSelection(focus); + this.list.pin(focus); + } + private changeSelection(e: IListMouseEvent, reference: number | undefined): void { const focus = e.index; @@ -574,6 +588,11 @@ export class List implements ISpliceable, IDisposable { return mapEvent(this._onOpen.event, indexes => this.toListEvent({ indexes })); } + private _onPin = new Emitter(); + @memoize get onPin(): Event> { + return mapEvent(this._onPin.event, indexes => this.toListEvent({ indexes })); + } + private _onDOMFocus = new Emitter(); get onDOMFocus(): Event { return this._onDOMFocus.event; } @@ -813,6 +832,10 @@ export class List implements ISpliceable, IDisposable { this._onOpen.fire(indexes); } + pin(indexes: number[]): void { + this._onPin.fire(indexes); + } + style(styles: IListStyles): void { const content: string[] = []; diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index f395ebd5eed..1d4064b4fb3 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -25,6 +25,8 @@ import { VIEWLET_ID } from 'vs/workbench/parts/scm/common/scm'; import { FileLabel } from 'vs/workbench/browser/labels'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { ISCMService, ISCMProvider, ISCMResourceGroup, ISCMResource } from 'vs/workbench/services/scm/common/scm'; +import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; +import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -243,7 +245,9 @@ export class SCMViewlet extends Viewlet { @IThemeService protected themeService: IThemeService, @IMenuService private menuService: IMenuService, @IModelService private modelService: IModelService, - @ICommandService private commandService: ICommandService + @ICommandService private commandService: ICommandService, + @IEditorGroupService private groupService: IEditorGroupService, + @IWorkbenchEditorService private editorService: IWorkbenchEditorService ) { super(VIEWLET_ID, telemetryService, themeService); @@ -320,6 +324,11 @@ export class SCMViewlet extends Viewlet { .filter(e => !!e && isSCMResource(e)) .on(this.open, this, this.disposables); + chain(this.list.onPin) + .map(e => e.elements[0]) + .filter(e => !!e && isSCMResource(e)) + .on(this.pin, this, this.disposables); + this.list.onContextMenu(this.onListContextMenu, this, this.disposables); this.disposables.push(this.list); @@ -406,6 +415,12 @@ export class SCMViewlet extends Viewlet { .done(undefined, onUnexpectedError); } + private pin(): void { + const activeEditor = this.editorService.getActiveEditor(); + const activeEditorInput = this.editorService.getActiveEditorInput(); + this.groupService.pinEditor(activeEditor.position, activeEditorInput); + } + getTitle(): string { const title = localize('source control', "Source Control"); const providerLabel = this.scmService.activeProvider && this.scmService.activeProvider.label; From b5d3f45e25615d35d816d8f6c5fdd51e81bca0e5 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 24 May 2017 17:01:41 +0200 Subject: [PATCH 0889/1164] fix typo --- src/vs/platform/update/common/updateIpc.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/platform/update/common/updateIpc.ts b/src/vs/platform/update/common/updateIpc.ts index 169f827d015..0dd76ca51f6 100644 --- a/src/vs/platform/update/common/updateIpc.ts +++ b/src/vs/platform/update/common/updateIpc.ts @@ -74,7 +74,7 @@ export class UpdateChannelClient implements IUpdateService { this._onStateChange.fire(state); // fire subsequent states as they come in from remote - this._onRemoteStateChange(s => this._onStateChange.fire(state)); + this._onRemoteStateChange(state => this._onStateChange.fire(state)); }, onUnexpectedError); } From 2e539276e9d9945b6e6b87661440430271523148 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 24 May 2017 17:06:53 +0200 Subject: [PATCH 0890/1164] Revert "allow offsets for fuzzyScore, towards #26096" This reverts commit 093eac502f5546171f0f57aecfc9aa1c28bfa413. --- src/vs/base/common/filters.ts | 74 ++++++++++++------------- src/vs/base/test/common/filters.test.ts | 7 --- 2 files changed, 37 insertions(+), 44 deletions(-) diff --git a/src/vs/base/common/filters.ts b/src/vs/base/common/filters.ts index 8719c8c662a..19056d36a50 100644 --- a/src/vs/base/common/filters.ts +++ b/src/vs/base/common/filters.ts @@ -450,7 +450,7 @@ _seps[':'] = true; const enum Arrow { Top = 0b1, Diag = 0b10, Left = 0b100 } -export function fuzzyScore(pattern: string, word: string, patternOffset: number = 0, wordOffset: number = 0): [number, number[]] { +export function fuzzyScore(pattern: string, word: string): [number, number[]] { const patternLen = pattern.length > 100 ? 100 : pattern.length; const wordLen = word.length > 100 ? 100 : word.length; @@ -465,16 +465,16 @@ export function fuzzyScore(pattern: string, word: string, patternOffset: number const lowPattern = pattern.toLowerCase(); const lowWord = word.toLowerCase(); - let patternPos = patternOffset; - let wordPos = wordOffset; + let i = 0; + let j = 0; - while (patternPos < patternLen && wordPos < wordLen) { - if (lowPattern[patternPos] === lowWord[wordPos]) { - patternPos += 1; + while (i < patternLen && j < wordLen) { + if (lowPattern[i] === lowWord[j]) { + i += 1; } - wordPos += 1; + j += 1; } - if (patternPos !== patternLen) { + if (i !== patternLen) { // no simple matches found -> return early return undefined; } @@ -482,24 +482,24 @@ export function fuzzyScore(pattern: string, word: string, patternOffset: number // keep track of the maximum score let maxScore = -1; - for (patternPos = patternOffset + 1; patternPos <= patternLen; patternPos++) { + for (i = 1; i <= patternLen; i++) { let lastLowWordChar = ''; - for (wordPos = wordOffset + 1; wordPos <= wordLen; wordPos++) { + for (j = 1; j <= wordLen; j++) { let score = -1; - let lowWordChar = lowWord[wordPos - 1]; - if (lowPattern[patternPos - 1] === lowWordChar) { + let lowWordChar = lowWord[j - 1]; + if (lowPattern[i - 1] === lowWordChar) { - if (wordPos === wordOffset + 1) { - if (pattern[patternPos - 1] === word[wordPos - 1]) { + if (j === 1) { + if (pattern[i - 1] === word[j - 1]) { score = 7; } else { score = 5; } - } else if (lowWordChar !== word[wordPos - 1]) { - if (pattern[patternPos - 1] === word[wordPos - 1]) { + } else if (lowWordChar !== word[j - 1]) { + if (pattern[i - 1] === word[j - 1]) { score = 7; } else { score = 5; @@ -512,38 +512,38 @@ export function fuzzyScore(pattern: string, word: string, patternOffset: number } } - _scores[patternPos][wordPos] = score; + _scores[i][j] = score; if (score > maxScore) { maxScore = score; } - let diag = _table[patternPos - 1][wordPos - 1] + (score > 1 ? 1 : score); - let top = _table[patternPos - 1][wordPos] + -1; - let left = _table[patternPos][wordPos - 1] + -1; + let diag = _table[i - 1][j - 1] + (score > 1 ? 1 : score); + let top = _table[i - 1][j] + -1; + let left = _table[i][j - 1] + -1; if (left >= top) { // left or diag if (left > diag) { - _table[patternPos][wordPos] = left; - _arrows[patternPos][wordPos] = Arrow.Left; + _table[i][j] = left; + _arrows[i][j] = Arrow.Left; } else if (left === diag) { - _table[patternPos][wordPos] = left; - _arrows[patternPos][wordPos] = Arrow.Left | Arrow.Diag; + _table[i][j] = left; + _arrows[i][j] = Arrow.Left | Arrow.Diag; } else { - _table[patternPos][wordPos] = diag; - _arrows[patternPos][wordPos] = Arrow.Diag; + _table[i][j] = diag; + _arrows[i][j] = Arrow.Diag; } } else { // top or diag if (top > diag) { - _table[patternPos][wordPos] = top; - _arrows[patternPos][wordPos] = Arrow.Top; + _table[i][j] = top; + _arrows[i][j] = Arrow.Top; } else if (top === diag) { - _table[patternPos][wordPos] = top; - _arrows[patternPos][wordPos] = Arrow.Top | Arrow.Diag; + _table[i][j] = top; + _arrows[i][j] = Arrow.Top | Arrow.Diag; } else { - _table[patternPos][wordPos] = diag; - _arrows[patternPos][wordPos] = Arrow.Diag; + _table[i][j] = diag; + _arrows[i][j] = Arrow.Diag; } } @@ -562,7 +562,7 @@ export function fuzzyScore(pattern: string, word: string, patternOffset: number } let bucket: [number, number[]][] = []; - findAllMatches(patternLen, patternLen, patternOffset, wordLen, wordOffset, 0, [], bucket, false); + findAllMatches(patternLen, patternLen, wordLen, 0, [], bucket, false); if (bucket.length === 0) { return undefined; @@ -580,7 +580,7 @@ export function fuzzyScore(pattern: string, word: string, patternOffset: number return topMatch; } -function findAllMatches(patternLen: number, patternPos: number, patternOffset: number, wordPos: number, wordOffset: number, total: number, matches: number[], bucket: [number, number[]][], lastMatched: boolean): void { +function findAllMatches(patternLen: number, patternPos: number, wordPos: number, total: number, matches: number[], bucket: [number, number[]][], lastMatched: boolean): void { if (bucket.length >= 10) { return; @@ -588,7 +588,7 @@ function findAllMatches(patternLen: number, patternPos: number, patternOffset: n let simpleMatchCount = 0; - while (patternPos > patternOffset && wordPos > wordOffset) { + while (patternPos > 0 && wordPos > 0) { let score = _scores[patternPos][wordPos]; let arrow = _arrows[patternPos][wordPos]; @@ -609,8 +609,8 @@ function findAllMatches(patternLen: number, patternPos: number, patternOffset: n if (arrow & Arrow.Left) { // left findAllMatches( - patternLen, patternPos, patternOffset, - wordPos - 1, wordOffset, + patternLen, patternPos, + wordPos - 1, matches.length !== 0 ? total - 1 : total, matches.slice(0), bucket, lastMatched ); diff --git a/src/vs/base/test/common/filters.test.ts b/src/vs/base/test/common/filters.test.ts index 797df43d1a2..ed8f708e757 100644 --- a/src/vs/base/test/common/filters.test.ts +++ b/src/vs/base/test/common/filters.test.ts @@ -325,13 +325,6 @@ suite('Filters', () => { assertMatches('f', ':foo', ':^foo', fuzzyScore); }); - test('fuzzyScore with offset', function () { - const matches = fuzzyScore('bc', 'abc', 0, 1); - assert.ok(matches); - const [, range] = matches; - assert.deepEqual(range, [1, 2]); - }); - function assertTopScore(filter: typeof fuzzyScore, pattern: string, expected: number, ...words: string[]) { let topScore = -(100 * 10); let topIdx = 0; From 76bc3fc157f6b80ca0df3d7ee6e8732c2813d886 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 24 May 2017 17:07:19 +0200 Subject: [PATCH 0891/1164] fix instantiation service warning --- .../workbench/browser/parts/activitybar/activitybarPart.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 65d97eb7484..4085747c900 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -13,7 +13,7 @@ import * as arrays from 'vs/base/common/arrays'; import { illegalArgument } from 'vs/base/common/errors'; import { Builder, $, Dimension } from 'vs/base/browser/builder'; import { Action } from 'vs/base/common/actions'; -import { ActionsOrientation, ActionBar, IActionItem, Separator, IBaseActionItemOptions } from 'vs/base/browser/ui/actionbar/actionbar'; +import { ActionsOrientation, ActionBar, IActionItem, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { ViewletDescriptor } from 'vs/workbench/browser/viewlet'; import { IGlobalActivity, GlobalActivityExtensions, IGlobalActivityRegistry } from 'vs/workbench/browser/activity'; import { Registry } from 'vs/platform/platform'; @@ -51,11 +51,10 @@ class GlobalActivityActionItem extends ActivityActionItem { constructor( action: GlobalActivityAction, - options: IBaseActionItemOptions, @IThemeService themeService: IThemeService, @IContextMenuService protected contextMenuService: IContextMenuService ) { - super(action, options, themeService); + super(action, { draggable: false }, themeService); } onClick(e: MouseEvent): void { From fe740b4b6b84e27d1ffdb2fe15c5d8445d980f00 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 24 May 2017 17:31:02 +0200 Subject: [PATCH 0892/1164] make fuzzy match skip leading whitespace in pattern, fixes #26096 --- src/vs/base/common/filters.ts | 92 +++++++++++++++---------- src/vs/base/test/common/filters.test.ts | 14 +++- 2 files changed, 68 insertions(+), 38 deletions(-) diff --git a/src/vs/base/common/filters.ts b/src/vs/base/common/filters.ts index 19056d36a50..cb219b5c31b 100644 --- a/src/vs/base/common/filters.ts +++ b/src/vs/base/common/filters.ts @@ -448,6 +448,10 @@ _seps['\''] = true; _seps['"'] = true; _seps[':'] = true; +const _ws: { [ch: string]: boolean } = Object.create(null); +_ws[' '] = true; +_ws['\t'] = true; + const enum Arrow { Top = 0b1, Diag = 0b10, Left = 0b100 } export function fuzzyScore(pattern: string, word: string): [number, number[]] { @@ -455,7 +459,20 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { const patternLen = pattern.length > 100 ? 100 : pattern.length; const wordLen = word.length > 100 ? 100 : word.length; - if (patternLen === 0) { + // Check for leading whitespace in the pattern and + // start matching just after that position. This is + // like `pattern = pattern.rtrim()` but doesn't create + // a new string + let patternStartPos = 0; + for (const ch of pattern) { + if (_ws[ch]) { + patternStartPos += 1; + } else { + break; + } + } + + if (patternLen === patternStartPos) { return [-1, []]; } @@ -465,16 +482,17 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { const lowPattern = pattern.toLowerCase(); const lowWord = word.toLowerCase(); - let i = 0; - let j = 0; - while (i < patternLen && j < wordLen) { - if (lowPattern[i] === lowWord[j]) { - i += 1; + let patternPos = patternStartPos; + let wordPos = 0; + + while (patternPos < patternLen && wordPos < wordLen) { + if (lowPattern[patternPos] === lowWord[wordPos]) { + patternPos += 1; } - j += 1; + wordPos += 1; } - if (i !== patternLen) { + if (patternPos !== patternLen) { // no simple matches found -> return early return undefined; } @@ -482,24 +500,24 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { // keep track of the maximum score let maxScore = -1; - for (i = 1; i <= patternLen; i++) { + for (patternPos = patternStartPos + 1; patternPos <= patternLen; patternPos++) { let lastLowWordChar = ''; - for (j = 1; j <= wordLen; j++) { + for (wordPos = 1; wordPos <= wordLen; wordPos++) { let score = -1; - let lowWordChar = lowWord[j - 1]; - if (lowPattern[i - 1] === lowWordChar) { + let lowWordChar = lowWord[wordPos - 1]; + if (lowPattern[patternPos - 1] === lowWordChar) { - if (j === 1) { - if (pattern[i - 1] === word[j - 1]) { + if (wordPos === 1) { + if (pattern[patternPos - 1] === word[wordPos - 1]) { score = 7; } else { score = 5; } - } else if (lowWordChar !== word[j - 1]) { - if (pattern[i - 1] === word[j - 1]) { + } else if (lowWordChar !== word[wordPos - 1]) { + if (pattern[patternPos - 1] === word[wordPos - 1]) { score = 7; } else { score = 5; @@ -512,38 +530,38 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { } } - _scores[i][j] = score; + _scores[patternPos][wordPos] = score; if (score > maxScore) { maxScore = score; } - let diag = _table[i - 1][j - 1] + (score > 1 ? 1 : score); - let top = _table[i - 1][j] + -1; - let left = _table[i][j - 1] + -1; + let diag = _table[patternPos - 1][wordPos - 1] + (score > 1 ? 1 : score); + let top = _table[patternPos - 1][wordPos] + -1; + let left = _table[patternPos][wordPos - 1] + -1; if (left >= top) { // left or diag if (left > diag) { - _table[i][j] = left; - _arrows[i][j] = Arrow.Left; + _table[patternPos][wordPos] = left; + _arrows[patternPos][wordPos] = Arrow.Left; } else if (left === diag) { - _table[i][j] = left; - _arrows[i][j] = Arrow.Left | Arrow.Diag; + _table[patternPos][wordPos] = left; + _arrows[patternPos][wordPos] = Arrow.Left | Arrow.Diag; } else { - _table[i][j] = diag; - _arrows[i][j] = Arrow.Diag; + _table[patternPos][wordPos] = diag; + _arrows[patternPos][wordPos] = Arrow.Diag; } } else { // top or diag if (top > diag) { - _table[i][j] = top; - _arrows[i][j] = Arrow.Top; + _table[patternPos][wordPos] = top; + _arrows[patternPos][wordPos] = Arrow.Top; } else if (top === diag) { - _table[i][j] = top; - _arrows[i][j] = Arrow.Top | Arrow.Diag; + _table[patternPos][wordPos] = top; + _arrows[patternPos][wordPos] = Arrow.Top | Arrow.Diag; } else { - _table[i][j] = diag; - _arrows[i][j] = Arrow.Diag; + _table[patternPos][wordPos] = diag; + _arrows[patternPos][wordPos] = Arrow.Diag; } } @@ -562,7 +580,7 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { } let bucket: [number, number[]][] = []; - findAllMatches(patternLen, patternLen, wordLen, 0, [], bucket, false); + findAllMatches(patternLen, patternLen, patternStartPos, wordLen, 0, [], bucket, false); if (bucket.length === 0) { return undefined; @@ -580,7 +598,7 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { return topMatch; } -function findAllMatches(patternLen: number, patternPos: number, wordPos: number, total: number, matches: number[], bucket: [number, number[]][], lastMatched: boolean): void { +function findAllMatches(patternLen: number, patternPos: number, patternStartPos: number, wordPos: number, total: number, matches: number[], bucket: [number, number[]][], lastMatched: boolean): void { if (bucket.length >= 10) { return; @@ -588,7 +606,7 @@ function findAllMatches(patternLen: number, patternPos: number, wordPos: number, let simpleMatchCount = 0; - while (patternPos > 0 && wordPos > 0) { + while (patternPos > patternStartPos && wordPos > 0) { let score = _scores[patternPos][wordPos]; let arrow = _arrows[patternPos][wordPos]; @@ -609,7 +627,7 @@ function findAllMatches(patternLen: number, patternPos: number, wordPos: number, if (arrow & Arrow.Left) { // left findAllMatches( - patternLen, patternPos, + patternLen, patternPos, patternStartPos, wordPos - 1, matches.length !== 0 ? total - 1 : total, matches.slice(0), bucket, lastMatched @@ -635,7 +653,7 @@ function findAllMatches(patternLen: number, patternPos: number, wordPos: number, } } - if (matches.length !== patternLen) { + if (matches.length !== patternLen - patternStartPos) { // doesn't cover whole pattern return undefined; } diff --git a/src/vs/base/test/common/filters.test.ts b/src/vs/base/test/common/filters.test.ts index ed8f708e757..4753059f57c 100644 --- a/src/vs/base/test/common/filters.test.ts +++ b/src/vs/base/test/common/filters.test.ts @@ -195,7 +195,7 @@ suite('Filters', () => { function assertMatches(pattern: string, word: string, decoratedWord: string, filter: typeof fuzzyScore) { let r = filter(pattern, word); - assert.ok(Boolean(r) === Boolean(decoratedWord)); + assert.ok(!decoratedWord === (!r || r[1].length === 0)); if (r) { const [, matches] = r; let pos = 0; @@ -325,6 +325,18 @@ suite('Filters', () => { assertMatches('f', ':foo', ':^foo', fuzzyScore); }); + test('Vscode 1.12 no longer obeys \'sortText\' in completion items (from language server), #26096', function () { + assertMatches(' ', ' group', undefined, fuzzyScore); + assertMatches(' g', ' group', ' ^group', fuzzyScore); + assertMatches('g', ' group', ' ^group', fuzzyScore); + assertMatches('g g', ' groupGroup', undefined, fuzzyScore); + assertMatches('g g', ' group Group', ' ^group^ ^Group', fuzzyScore); + assertMatches(' g g', ' group Group', ' ^group^ ^Group', fuzzyScore); + assertMatches('zz', 'zzGroup', '^z^zGroup', fuzzyScore); + assertMatches('zzg', 'zzGroup', '^z^z^Group', fuzzyScore); + assertMatches('g', 'zzGroup', 'zz^Group', fuzzyScore); + }); + function assertTopScore(filter: typeof fuzzyScore, pattern: string, expected: number, ...words: string[]) { let topScore = -(100 * 10); let topIdx = 0; From 803e7c29ed07d63214fecb8e59042afa1a069988 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 24 May 2017 17:59:05 +0200 Subject: [PATCH 0893/1164] don't score when the word is the empty word, #26096 --- src/vs/base/common/filters.ts | 2 +- .../suggest/browser/completionModel.ts | 10 ++++++- .../test/browser/completionModel.test.ts | 28 ++++++++++++++++++- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/vs/base/common/filters.ts b/src/vs/base/common/filters.ts index cb219b5c31b..d4b186650cc 100644 --- a/src/vs/base/common/filters.ts +++ b/src/vs/base/common/filters.ts @@ -473,7 +473,7 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { } if (patternLen === patternStartPos) { - return [-1, []]; + return [-100, []]; } if (patternLen > wordLen) { diff --git a/src/vs/editor/contrib/suggest/browser/completionModel.ts b/src/vs/editor/contrib/suggest/browser/completionModel.ts index e3bc875458f..7bae1f39781 100644 --- a/src/vs/editor/contrib/suggest/browser/completionModel.ts +++ b/src/vs/editor/contrib/suggest/browser/completionModel.ts @@ -124,7 +124,15 @@ export class CompletionModel { word = wordLen === 0 ? '' : leadingLineContent.slice(-wordLen); } - if (typeof suggestion.filterText === 'string') { + if (wordLen === 0) { + // when there is nothing to score against, don't + // event try to do. Use a const rank and rely on + // the fallback-sort using the initial sort order. + // use a score of `-100` because that is out of the + // bound of values `fuzzyScore` will return + item.score = -100; + + } else if (typeof suggestion.filterText === 'string') { // when there is a `filterText` it must match the `word`. // if it matches we check with the label to compute highlights // and if that doesn't yield a result we have no highlights, diff --git a/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts b/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts index af82d02dca0..fd3f85b3235 100644 --- a/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts +++ b/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { ISuggestion, ISuggestResult, ISuggestSupport, SuggestionType } from 'vs/editor/common/modes'; -import { ISuggestionItem } from 'vs/editor/contrib/suggest/browser/suggest'; +import { ISuggestionItem, getSuggestionComparator } from 'vs/editor/contrib/suggest/browser/suggest'; import { CompletionModel } from 'vs/editor/contrib/suggest/browser/completionModel'; import { IPosition } from 'vs/editor/common/core/position'; import { TPromise } from "vs/base/common/winjs.base"; @@ -202,4 +202,30 @@ suite('CompletionModel', function () { }; assert.equal(model.items.length, 1); }); + + test('Vscode 1.12 no longer obeys \'sortText\' in completion items (from language server), #26096', function () { + + const item1 = createSuggestItem('<- groups', 2, 'property', false, { lineNumber: 1, column: 3 }); + item1.suggestion.filterText = ' groups'; + item1.suggestion.sortText = '00002'; + + const item2 = createSuggestItem('source', 0, 'property', false, { lineNumber: 1, column: 3 }); + item2.suggestion.filterText = 'source'; + item2.suggestion.sortText = '00001'; + + const items = [item1, item2].sort(getSuggestionComparator('inline')); + + model = new CompletionModel(items, 3, { + leadingLineContent: ' ', + characterCountDelta: 0 + }); + + assert.equal(model.items.length, 2); + + const [first, second] = model.items; + assert.equal(first.suggestion.label, 'source'); + assert.equal(second.suggestion.label, '<- groups'); + + }); + }); From 200cfc58639a2dd3f598a301958a8b05ce1e5915 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 24 May 2017 18:02:57 +0200 Subject: [PATCH 0894/1164] Fix extension actions tests --- .../test/electron-browser/extensionsActions.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts index f0ae1aaabe1..0f50eb3a0e5 100644 --- a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts +++ b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts @@ -99,7 +99,7 @@ suite('ExtensionsActions Test', () => { testObject.extension = paged.firstPage[0]; assert.ok(!testObject.enabled); assert.equal('Install', testObject.label); - assert.equal('extension-action install', testObject.class); + assert.equal('extension-action prominent install', testObject.class); done(); }); }); @@ -233,7 +233,7 @@ suite('ExtensionsActions Test', () => { const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction); assert.ok(!testObject.enabled); - assert.equal('extension-action install no-extension', testObject.class); + assert.equal('extension-action prominent install no-extension', testObject.class); }); test('Test CombinedInstallAction when extension is system extension', (done) => { @@ -244,7 +244,7 @@ suite('ExtensionsActions Test', () => { instantiationService.get(IExtensionsWorkbenchService).queryLocal().done(extensions => { testObject.extension = extensions[0]; assert.ok(!testObject.enabled); - assert.equal('extension-action install no-extension', testObject.class); + assert.equal('extension-action prominent install no-extension', testObject.class); done(); }); }); @@ -259,7 +259,7 @@ suite('ExtensionsActions Test', () => { testObject.extension = paged.firstPage[0]; assert.ok(testObject.enabled); assert.equal('Install', testObject.label); - assert.equal('extension-action install', testObject.class); + assert.equal('extension-action prominent install', testObject.class); done(); }); }); From f1f3f60e300abae4055a2a9fe3c40c63be5a8e82 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 24 May 2017 11:04:57 -0700 Subject: [PATCH 0895/1164] Tweak error message for extension table in github issues --- src/vs/workbench/electron-browser/actions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index b5b380afb6a..98e0d84f20c 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -739,7 +739,7 @@ ${tableHeader}\n${table}; // 2000 chars is browsers de-facto limit for URLs, 400 chars are allowed for other string parts of the issue URL // http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers if (encodeURIComponent(extensionTable).length > 1600) { - return 'the listing exceeds the lower minimum of browsers\' URL characters limit'; + return 'the listing length exceeds browsers\' URL characters limit'; } return extensionTable; From 321d8095cf5ab7316b9942ca6f22d059eeed12b3 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 24 May 2017 20:18:03 +0200 Subject: [PATCH 0896/1164] theming :lipstick: --- .../base/browser/ui/findinput/findInput.css | 26 ------------------- .../parts/debug/browser/debugActionItems.ts | 4 +-- .../debug/browser/media/breakpointWidget.css | 4 --- .../debug/browser/media/debugViewlet.css | 15 ----------- .../extensions/browser/extensionsActions.ts | 7 ++++- .../browser/media/extensionActions.css | 1 - .../preferences/browser/keybindingsEditor.ts | 12 +++++++-- .../browser/media/keybindingsEditor.css | 10 ------- 8 files changed, 18 insertions(+), 61 deletions(-) diff --git a/src/vs/base/browser/ui/findinput/findInput.css b/src/vs/base/browser/ui/findinput/findInput.css index 413c2dcafb3..b785b4fa4cc 100644 --- a/src/vs/base/browser/ui/findinput/findInput.css +++ b/src/vs/base/browser/ui/findinput/findInput.css @@ -28,28 +28,6 @@ right: 2px; } -.monaco-findInput > .controls > .matchCount { - margin-left: 2px; - float: left; - overflow: hidden; - max-width: 30px; - min-width: 20px; - text-align: center; - - border-radius: 5px; - padding: 0 4px; - - -webkit-box-sizing: border-box; - -o-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} - -.vs .monaco-findInput > .controls > .matchCount { - background: #ddd; -} - .vs .monaco-findInput.disabled { background-color: #E1E1E1; } @@ -59,10 +37,6 @@ background-color: #333; } -.vs-dark .monaco-findInput > .controls > .matchCount { - background: #555; -} - /* Highlighting */ .monaco-findInput.highlight-0 .controls { animation: monaco-findInput-highlight-0 100ms linear 0s; diff --git a/src/vs/workbench/parts/debug/browser/debugActionItems.ts b/src/vs/workbench/parts/debug/browser/debugActionItems.ts index 8f83bebe2da..edb07e3d969 100644 --- a/src/vs/workbench/parts/debug/browser/debugActionItems.ts +++ b/src/vs/workbench/parts/debug/browser/debugActionItems.ts @@ -117,8 +117,8 @@ export class StartDebugActionItem extends EventEmitter implements IActionItem { } })); this.toDispose.push(attachStylerCallback(this.themeService, { selectBorder }, colors => { - this.container.style.borderColor = colors.selectBorder; - selectBoxContainer.style.borderLeftColor = colors.selectBorder; + this.container.style.border = colors.selectBorder ? `1px solid ${colors.selectBorder}` : null; + selectBoxContainer.style.borderLeft = colors.selectBorder ? `1px solid ${colors.selectBorder}` : null; })); this.updateOptions(); diff --git a/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css b/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css index ad120c2ab7f..8d190b91ca0 100644 --- a/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css +++ b/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css @@ -16,10 +16,6 @@ padding: 0 10px; } -.monaco-editor .zone-widget .zone-widget-container.breakpoint-widget .breakpoint-select-container .select-box { - border-color: rgba(128, 128, 128, 0.35); -} - .monaco-editor .zone-widget .zone-widget-container.breakpoint-widget .inputBoxContainer { flex: 1; } diff --git a/src/vs/workbench/parts/debug/browser/media/debugViewlet.css b/src/vs/workbench/parts/debug/browser/media/debugViewlet.css index feff9b7cff6..b0d6b4510a1 100644 --- a/src/vs/workbench/parts/debug/browser/media/debugViewlet.css +++ b/src/vs/workbench/parts/debug/browser/media/debugViewlet.css @@ -57,7 +57,6 @@ margin-right: 0.3em; height: 20px; flex-shrink: 1; - border: 1px solid #dddddd; margin-top: 7px; } @@ -65,11 +64,6 @@ border-radius: 4px; } -.vs-dark .monaco-workbench > .part > .title > .title-actions .start-debug-action-item, -.hc-black .monaco-workbench > .part > .title > .title-actions .start-debug-action-item { - border-color: #3c3c3c; -} - .monaco-workbench > .part > .title > .title-actions .start-debug-action-item .icon { height: 20px; width: 20px; @@ -84,15 +78,6 @@ background: url('continue-inverse.svg') center center no-repeat; } -.monaco-workbench > .part > .title > .title-actions .start-debug-action-item .configuration { - border-left: 1px solid #dddddd; -} - -.vs-dark .monaco-workbench > .part > .title > .title-actions .start-debug-action-item .configuration, -.hc-black .monaco-workbench > .part > .title > .title-actions .start-debug-action-item .configuration { - border-color: #3c3c3c; -} - .monaco-workbench .monaco-action-bar .start-debug-action-item .configuration .select-box { border: none; margin-top: 0px; diff --git a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts index 3b557abaf33..f2cf8c9cacd 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts @@ -33,7 +33,7 @@ import URI from 'vs/base/common/uri'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { registerThemingParticipant, ITheme, ICssStyleCollector } from "vs/platform/theme/common/themeService"; -import { buttonBackground, buttonForeground, buttonHoverBackground, contrastBorder, registerColor } from "vs/platform/theme/common/colorRegistry"; +import { buttonBackground, buttonForeground, buttonHoverBackground, contrastBorder, registerColor, foreground } from "vs/platform/theme/common/colorRegistry"; import { Color } from "vs/base/common/color"; export class InstallAction extends Action { @@ -1408,6 +1408,11 @@ export const extensionButtonProminentHoverBackground = registerColor('extensionB }, localize('extensionButtonProminentHoverBackground', "Button background hover color for actions extension that stand out (e.g. install button).")); registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { + const foregroundColor = theme.getColor(foreground); + if (foregroundColor) { + collector.addRule(`.monaco-action-bar .action-item .action-label.extension-action.built-in-status { border-color: ${foregroundColor}; }`); + } + const buttonBackgroundColor = theme.getColor(buttonBackground); if (buttonBackgroundColor) { collector.addRule(`.monaco-action-bar .action-item .action-label.extension-action { background-color: ${buttonBackgroundColor}; }`); diff --git a/src/vs/workbench/parts/extensions/browser/media/extensionActions.css b/src/vs/workbench/parts/extensions/browser/media/extensionActions.css index e80db60cdef..c9b9d8508a2 100644 --- a/src/vs/workbench/parts/extensions/browser/media/extensionActions.css +++ b/src/vs/workbench/parts/extensions/browser/media/extensionActions.css @@ -36,7 +36,6 @@ .monaco-action-bar .action-item .action-label.extension-action.built-in-status { border-radius: 4px; - border-color: #c1c1c1; color: inherit; background-color: transparent; opacity: 0.9; diff --git a/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts index 2b8adf6502f..ca94ecd2c2b 100644 --- a/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts @@ -33,12 +33,13 @@ import { IKeybindingEditingService } from 'vs/workbench/services/keybinding/comm import { IListService } from 'vs/platform/list/browser/listService'; import { List } from 'vs/base/browser/ui/list/listWidget'; import { IDelegate, IRenderer, IListContextMenuEvent, IListEvent } from 'vs/base/browser/ui/list/list'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IChoiceService, IMessageService, Severity } from 'vs/platform/message/common/message'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode, ResolvedKeybinding } from 'vs/base/common/keyCodes'; import { attachListStyler } from 'vs/platform/theme/common/styler'; +import { listHighlightForeground } from "vs/platform/theme/common/colorRegistry"; let $ = DOM.$; @@ -797,4 +798,11 @@ class WhenColumn extends Column { private getAriaLabel(keybindingItemEntry: IKeybindingItemEntry): string { return keybindingItemEntry.keybindingItem.when ? localize('whenAriaLabel', "When is {0}.", keybindingItemEntry.keybindingItem.when) : localize('noWhen', "No when context."); } -} \ No newline at end of file +} + +registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { + const listHighlightForegroundColor = theme.getColor(listHighlightForeground); + if (listHighlightForegroundColor) { + collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row > .column .highlight { color: ${listHighlightForegroundColor}; }`); + } +}); \ No newline at end of file diff --git a/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css b/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css index 27a753c86bd..29b4fe0a8d1 100644 --- a/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css +++ b/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css @@ -148,19 +148,9 @@ } .keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row > .column .highlight { - color: #007ACC; font-weight: bold; } -.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:focus .monaco-list-row.selected > .column .highlight { - color: #1b3c53; -} - -.vs-dark .keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:focus .monaco-list-row.selected > .column .highlight, -.hc-black .keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:focus .monaco-list-row.selected > .column .highlight { - color: #049aff; -} - .keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row > .column .monaco-action-bar { display: none; flex: 1; From 78d4aa67e48428ee4cc30ecae34ee82adca3b40a Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 24 May 2017 11:25:31 -0700 Subject: [PATCH 0897/1164] Fixes #26886 --- .../editor/contrib/suggest/browser/media/suggest.css | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index fe64def759b..08b4e45593d 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -34,12 +34,18 @@ .monaco-editor .suggest-widget.docs-side > .tree, .monaco-editor .suggest-widget.docs-side > .details { - width: 328px; + /* subtract 2px for border, and another 2 for the Chromium zoom issue + where the children get slightly bigger width than what is set + which makes the docs go below the list */ + width: calc(50% - 4px); } .monaco-editor.hc-black .suggest-widget.docs-side > .tree, .monaco-editor.hc-black .suggest-widget.docs-side > .details { - width: 326px; + /* subtract 4px for border, and another 2 for the Chromium zoom issue + where the children get slightly bigger width than what is set + which makes the docs go below the list */ + width: calc(50% - 6px); } /* Styles for Message element for when widget is loading or is empty */ From 2f90c173afbab620b343768b8be6cc82ae1bef90 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Wed, 24 May 2017 11:39:04 -0700 Subject: [PATCH 0898/1164] Enable needs-more-info bot plugin --- .github/needs_more_info.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/needs_more_info.yml b/.github/needs_more_info.yml index 0e246fd554a..934e98898d4 100644 --- a/.github/needs_more_info.yml +++ b/.github/needs_more_info.yml @@ -1,6 +1,6 @@ { daysUntilClose: 7, needsMoreInfoLabel: 'needs more info', - perform: false, + perform: true, closeComment: 'This issue has been closed automatically because it needs more information and has not had recent activity. Please refer to our [guidelines](https://github.com/Microsoft/vscode/blob/master/CONTRIBUTING.md) for filing issues. Thank you for your contributions.' } From 87a9dce81d0e70f5fb329ee13a88c9f464082fa2 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 24 May 2017 11:56:54 -0700 Subject: [PATCH 0899/1164] Fixes #27169 --- src/vs/editor/contrib/suggest/browser/suggestWidget.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 168d22bc846..56871ef9504 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -599,12 +599,14 @@ export class SuggestWidget implements IContentWidget, IDelegate this.messageElement.textContent = SuggestWidget.LOADING_MESSAGE; hide(this.listElement, this.details.element); show(this.messageElement); + removeClass(this.element, 'docs-side'); this.show(); break; case State.Empty: this.messageElement.textContent = SuggestWidget.NO_SUGGESTIONS_MESSAGE; hide(this.listElement, this.details.element); show(this.messageElement); + removeClass(this.element, 'docs-side'); this.show(); break; case State.Open: From 8776c1106dcc05463f5ff818f76d57f22a4dfbc8 Mon Sep 17 00:00:00 2001 From: Amy Qiu Date: Wed, 24 May 2017 12:49:23 -0700 Subject: [PATCH 0900/1164] Add mementos to shutdown --- .../parts/search/browser/searchViewlet.ts | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index e99d35d1ad4..68630e31816 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -905,23 +905,10 @@ export class SearchViewlet extends Viewlet { const isCaseSensitive = this.searchWidget.searchInput.getCaseSensitive(); const contentPattern = this.searchWidget.searchInput.getValue(); const patternExcludes = this.inputPatternExclusions.getValue().trim(); - const exclusionsUsePattern = this.inputPatternExclusions.isGlobPattern(); const patternIncludes = this.inputPatternIncludes.getValue().trim(); - const includesUsePattern = this.inputPatternIncludes.isGlobPattern(); const useIgnoreFiles = this.inputPatternExclusions.useIgnoreFiles(); const useExcludeSettings = this.inputPatternExclusions.useExcludeSettings(); - // store memento - this.viewletSettings['query.contentPattern'] = contentPattern; - this.viewletSettings['query.regex'] = isRegex; - this.viewletSettings['query.wholeWords'] = isWholeWords; - this.viewletSettings['query.caseSensitive'] = isCaseSensitive; - this.viewletSettings['query.folderExclusions'] = patternExcludes; - this.viewletSettings['query.exclusionsUsePattern'] = exclusionsUsePattern; - this.viewletSettings['query.folderIncludes'] = patternIncludes; - this.viewletSettings['query.includesUsePattern'] = includesUsePattern; - this.viewletSettings['query.useIgnoreFiles'] = useIgnoreFiles; - if (!rerunQuery) { return; } @@ -1350,7 +1337,27 @@ export class SearchViewlet extends Viewlet { } public shutdown(): void { - this.viewletSettings['query.contentPattern'] = this.searchWidget.searchInput.getValue(); + const isRegex = this.searchWidget.searchInput.getRegex(); + const isWholeWords = this.searchWidget.searchInput.getWholeWords(); + const isCaseSensitive = this.searchWidget.searchInput.getCaseSensitive(); + const contentPattern = this.searchWidget.searchInput.getValue(); + const patternExcludes = this.inputPatternExclusions.getValue().trim(); + const exclusionsUsePattern = this.inputPatternExclusions.isGlobPattern(); + const patternIncludes = this.inputPatternIncludes.getValue().trim(); + const includesUsePattern = this.inputPatternIncludes.isGlobPattern(); + const useIgnoreFiles = this.inputPatternExclusions.useIgnoreFiles(); + + // store memento + this.viewletSettings['query.contentPattern'] = contentPattern; + this.viewletSettings['query.regex'] = isRegex; + this.viewletSettings['query.wholeWords'] = isWholeWords; + this.viewletSettings['query.caseSensitive'] = isCaseSensitive; + this.viewletSettings['query.folderExclusions'] = patternExcludes; + this.viewletSettings['query.exclusionsUsePattern'] = exclusionsUsePattern; + this.viewletSettings['query.folderIncludes'] = patternIncludes; + this.viewletSettings['query.includesUsePattern'] = includesUsePattern; + this.viewletSettings['query.useIgnoreFiles'] = useIgnoreFiles; + this.viewletSettings['query.contentPattern'] = contentPattern; super.shutdown(); } From 6ed4099a89c931505fd2bde0c9791beb99c8f2a9 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 24 May 2017 10:50:28 -0700 Subject: [PATCH 0901/1164] Move terminalProcess to node/ Part of #27182 --- .../parts/terminal/electron-browser/terminalInstance.ts | 4 ++-- .../terminal/{electron-browser => node}/terminalProcess.js | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename src/vs/workbench/parts/terminal/{electron-browser => node}/terminalProcess.js (100%) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index fe48ea264ff..c7bb9a07131 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -473,9 +473,9 @@ export class TerminalInstance implements ITerminalInstance { } const env = TerminalInstance.createTerminalEnv(process.env, shell, this._getCwd(shell, workspace), locale, this._cols, this._rows); this._title = shell.name || ''; - this._process = cp.fork('./terminalProcess', [], { + this._process = cp.fork('../node/terminalProcess', [], { env: env, - cwd: URI.parse(path.dirname(require.toUrl('./terminalProcess'))).fsPath + cwd: URI.parse(path.dirname(require.toUrl('../node/terminalProcess'))).fsPath }); if (!shell.name) { // Only listen for process title changes when a name is not provided diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalProcess.js b/src/vs/workbench/parts/terminal/node/terminalProcess.js similarity index 100% rename from src/vs/workbench/parts/terminal/electron-browser/terminalProcess.js rename to src/vs/workbench/parts/terminal/node/terminalProcess.js From 5f0e32472a8ac0da345e8aef840b2ecd92af6a48 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 24 May 2017 13:34:44 -0700 Subject: [PATCH 0902/1164] Add node-pty typings back --- src/typings/node-pty.d.ts | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/typings/node-pty.d.ts diff --git a/src/typings/node-pty.d.ts b/src/typings/node-pty.d.ts new file mode 100644 index 00000000000..e09b1eb47e5 --- /dev/null +++ b/src/typings/node-pty.d.ts @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module 'node-pty' { + export function fork(file: string, args: string[], options: any): Terminal; + export function spawn(file: string, args: string[], options: any): Terminal; + export function createTerminal(file: string, args: string[], options: any): Terminal; + + export interface Terminal { + pid: number; + + /** + * The title of the active process. + */ + process: string; + + on(event: string, callback: (data: any) => void): void; + + resize(columns: number, rows: number): void; + + write(data: string): void; + + kill(): void; + } +} \ No newline at end of file From bae64c4db24a29c2e9d05fc5e4fb38ae3e6eb189 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 24 May 2017 13:37:43 -0700 Subject: [PATCH 0903/1164] Fork terminalProcess using amd, convert to TS Fixes #27182 --- src/vs/workbench/buildfile.js | 4 ++- .../electron-browser/terminalInstance.ts | 5 +-- ...{terminalProcess.js => terminalProcess.ts} | 35 +++++++++++++------ 3 files changed, 30 insertions(+), 14 deletions(-) rename src/vs/workbench/parts/terminal/node/{terminalProcess.js => terminalProcess.ts} (83%) diff --git a/src/vs/workbench/buildfile.js b/src/vs/workbench/buildfile.js index dfb1ee2b600..b4102009d69 100644 --- a/src/vs/workbench/buildfile.js +++ b/src/vs/workbench/buildfile.js @@ -25,7 +25,9 @@ exports.collectModules = function (excludes) { createModuleDescription('vs/workbench/services/search/node/worker/searchWorkerApp', []), createModuleDescription('vs/workbench/services/files/node/watcher/unix/watcherApp', []), - createModuleDescription('vs/workbench/node/extensionHostProcess', []) + createModuleDescription('vs/workbench/node/extensionHostProcess', []), + + createModuleDescription('vs/workbench/parts/terminal/node/terminalProcess', []) ]; return modules; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index c7bb9a07131..07f8b6b53cb 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -473,8 +473,8 @@ export class TerminalInstance implements ITerminalInstance { } const env = TerminalInstance.createTerminalEnv(process.env, shell, this._getCwd(shell, workspace), locale, this._cols, this._rows); this._title = shell.name || ''; - this._process = cp.fork('../node/terminalProcess', [], { - env: env, + this._process = cp.fork(URI.parse(require.toUrl('bootstrap')).fsPath, ['--type=terminal'], { + env, cwd: URI.parse(path.dirname(require.toUrl('../node/terminalProcess'))).fsPath }); if (!shell.name) { @@ -622,6 +622,7 @@ export class TerminalInstance implements ITerminalInstance { env['PTYCOLS'] = cols.toString(); env['PTYROWS'] = rows.toString(); } + env['AMD_ENTRYPOINT'] = 'vs/workbench/parts/terminal/node/terminalProcess'; return env; } diff --git a/src/vs/workbench/parts/terminal/node/terminalProcess.js b/src/vs/workbench/parts/terminal/node/terminalProcess.ts similarity index 83% rename from src/vs/workbench/parts/terminal/node/terminalProcess.js rename to src/vs/workbench/parts/terminal/node/terminalProcess.ts index 8cfea5673f1..12642b21a41 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcess.js +++ b/src/vs/workbench/parts/terminal/node/terminalProcess.ts @@ -3,21 +3,23 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -var fs = require('fs'); -var os = require('os'); -var path = require('path'); -var ptyJs = require('node-pty'); +import * as fs from 'fs'; +fs.writeFileSync('/home/daniel/testing-terminal-1', 'foo'); +import * as os from 'os'; +import * as path from 'path'; +import * as ptyJs from 'node-pty'; + +fs.writeFileSync('/home/daniel/testing-terminal-2', 'foo'); // The pty process needs to be run in its own child process to get around maxing out CPU on Mac, // see https://github.com/electron/electron/issues/38 - -var name; +var shellName: string; if (os.platform() === 'win32') { - name = path.basename(process.env.PTYSHELL); + shellName = path.basename(process.env.PTYSHELL); } else { // Using 'xterm-256color' here helps ensure that the majority of Linux distributions will use a // color prompt as defined in the default ~/.bashrc file. - name = 'xterm-256color'; + shellName = 'xterm-256color'; } var shell = process.env.PTYSHELL; var args = getArgs(); @@ -29,16 +31,26 @@ var currentTitle = ''; setupPlanB(process.env.PTYPID); cleanEnv(); -var options = { - name: name, - cwd: cwd +interface IOptions { + name: string; + cwd: string; + cols?: number; + rows?: number; +} + +var options: IOptions = { + name: shellName, + cwd }; if (cols && rows) { options.cols = parseInt(cols, 10); options.rows = parseInt(rows, 10); } +fs.writeFileSync('/home/daniel/testing-terminal-3', 'foo'); var ptyProcess = ptyJs.fork(shell, args, options); + +fs.writeFileSync('/home/daniel/testing-terminal-4', 'foo'); var closeTimeout; var exitCode; @@ -93,6 +105,7 @@ function getArgs() { function cleanEnv() { var keys = [ + 'AMD_ENTRYPOINT', 'ELECTRON_RUN_AS_NODE', 'PTYCWD', 'PTYPID', From d1b366fe333c663d50568b6f8b33962534c49eb7 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 24 May 2017 13:39:32 -0700 Subject: [PATCH 0904/1164] Fix ts/js code lens for trailing special character. Fixes #27211 --- extensions/typescript/src/features/baseCodeLensProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/typescript/src/features/baseCodeLensProvider.ts b/extensions/typescript/src/features/baseCodeLensProvider.ts index 9d2c4bfb768..98e4de9cc1c 100644 --- a/extensions/typescript/src/features/baseCodeLensProvider.ts +++ b/extensions/typescript/src/features/baseCodeLensProvider.ts @@ -108,7 +108,7 @@ export abstract class TypeScriptBaseCodeLensProvider implements CodeLensProvider const text = document.getText(range); - const identifierMatch = new RegExp(`^(.*?(\\b|\\W))${(item.text || '').replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')}\\b`, 'gm'); + const identifierMatch = new RegExp(`^(.*?(\\b|\\W))${(item.text || '').replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')}(\\b|\\W)`, 'gm'); const match = identifierMatch.exec(text); const prefixLength = match ? match.index + match[1].length : 0; const startOffset = document.offsetAt(new Position(range.start.line, range.start.character)) + prefixLength; From 7236f4a191477510fa4ea0e1771848fd54680386 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 24 May 2017 13:54:05 -0700 Subject: [PATCH 0905/1164] Fix 27195 Make sure we handle the case of `/**/` properly in json files --- extensions/json/syntaxes/JSON.tmLanguage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/json/syntaxes/JSON.tmLanguage b/extensions/json/syntaxes/JSON.tmLanguage index 9d6a24cc16a..507eb03ec93 100644 --- a/extensions/json/syntaxes/JSON.tmLanguage +++ b/extensions/json/syntaxes/JSON.tmLanguage @@ -98,7 +98,7 @@ begin - /\*\* + /\*\*(?!/) captures 0 From 410807085666c03712ac831c4c75653e828f74f1 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 24 May 2017 13:55:34 -0700 Subject: [PATCH 0906/1164] Remove debug logs --- src/vs/workbench/parts/terminal/node/terminalProcess.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/vs/workbench/parts/terminal/node/terminalProcess.ts b/src/vs/workbench/parts/terminal/node/terminalProcess.ts index 12642b21a41..3a2b00a4a70 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcess.ts +++ b/src/vs/workbench/parts/terminal/node/terminalProcess.ts @@ -3,14 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as fs from 'fs'; -fs.writeFileSync('/home/daniel/testing-terminal-1', 'foo'); - import * as os from 'os'; import * as path from 'path'; import * as ptyJs from 'node-pty'; -fs.writeFileSync('/home/daniel/testing-terminal-2', 'foo'); // The pty process needs to be run in its own child process to get around maxing out CPU on Mac, // see https://github.com/electron/electron/issues/38 var shellName: string; @@ -47,10 +43,8 @@ if (cols && rows) { options.rows = parseInt(rows, 10); } -fs.writeFileSync('/home/daniel/testing-terminal-3', 'foo'); var ptyProcess = ptyJs.fork(shell, args, options); -fs.writeFileSync('/home/daniel/testing-terminal-4', 'foo'); var closeTimeout; var exitCode; From 985d05f92004a85a8595ec9cb77148e4c727e964 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 23 May 2017 21:00:41 +0200 Subject: [PATCH 0907/1164] Kimbie builtin theme has dark curly braces. Fixes #27121 --- .../theme-kimbie-dark/themes/kimbie-dark-color-theme.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json b/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json index 2d5e0fadb31..7de6b3fd42e 100644 --- a/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json +++ b/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json @@ -369,7 +369,7 @@ "variable.interpolation" ], "settings": { - "foreground": "#18401e" + "foreground": "#088649" } }, { From b320bd0de71600ee0ba9fb61cccf191da7184341 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 24 May 2017 22:56:13 +0200 Subject: [PATCH 0908/1164] Allow decorations to use theme colors. For #26974 --- src/vs/base/browser/dom.ts | 5 +- .../browser/services/codeEditorServiceImpl.ts | 468 +++++++++--------- .../browser/standalone/standaloneServices.ts | 5 +- .../overviewRuler/decorationsOverviewRuler.ts | 15 +- src/vs/editor/common/editorCommon.ts | 38 +- .../common/model/textModelWithDecorations.ts | 6 +- .../services/decorationRenderOptions.test.ts | 84 +++- src/vs/monaco.d.ts | 16 +- src/vs/platform/theme/common/themeService.ts | 6 +- src/vs/vscode.d.ts | 32 +- src/vs/workbench/api/node/extHost.api.impl.ts | 1 + src/vs/workbench/api/node/extHostTypes.ts | 7 + .../workbench/test/workbenchTestServices.ts | 36 +- 13 files changed, 436 insertions(+), 283 deletions(-) diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 21698e938db..228550b57af 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -710,7 +710,7 @@ export function createCSSRule(selector: string, cssText: string, style: HTMLStyl return; } - (style.sheet).insertRule(selector + '{' + cssText + '}', 0); + (style.sheet).insertRule(selector + '{' + cssText + '}', 0); } export function getCSSRule(selector: string, style: HTMLStyleElement = sharedStyle): any { @@ -739,8 +739,7 @@ export function removeCSSRulesContainingSelector(ruleName: string, style = share let toDelete: number[] = []; for (let i = 0; i < rules.length; i++) { let rule = rules[i]; - let normalizedSelectorText = rule.selectorText.replace(/::/gi, ':'); - if (normalizedSelectorText.indexOf(ruleName) !== -1) { + if (rule.selectorText.indexOf(ruleName) !== -1) { toDelete.push(i); } } diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index fa45f009cf8..703e6e4f0ee 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -4,36 +4,43 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import * as objects from 'vs/base/common/objects'; -import { parse, stringify } from 'vs/base/common/marshalling'; import * as strings from 'vs/base/common/strings'; import URI from 'vs/base/common/uri'; import * as dom from 'vs/base/browser/dom'; import { IDecorationRenderOptions, IModelDecorationOptions, IModelDecorationOverviewRulerOptions, IThemeDecorationRenderOptions, - IContentDecorationRenderOptions, OverviewRulerLane, TrackedRangeStickiness + IContentDecorationRenderOptions, OverviewRulerLane, TrackedRangeStickiness, ThemeColor, isThemeColor } from 'vs/editor/common/editorCommon'; import { AbstractCodeEditorService } from 'vs/editor/common/services/abstractCodeEditorService'; -import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose as disposeAll } from 'vs/base/common/lifecycle'; +import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; export class CodeEditorServiceImpl extends AbstractCodeEditorService { private _styleSheet: HTMLStyleElement; private _decorationOptionProviders: { [key: string]: IModelDecorationOptionsProvider }; + private _themeService: IThemeService; - constructor(styleSheet = dom.createStyleSheet()) { + constructor( @IThemeService themeService: IThemeService, styleSheet = dom.createStyleSheet()) { super(); this._styleSheet = styleSheet; this._decorationOptionProviders = Object.create(null); + this._themeService = themeService; } public registerDecorationType(key: string, options: IDecorationRenderOptions, parentTypeKey?: string): void { let provider = this._decorationOptionProviders[key]; if (!provider) { + let providerArgs: ProviderArguments = { + styleSheet: this._styleSheet, + key: key, + parentTypeKey: parentTypeKey, + options: options + }; if (!parentTypeKey) { - provider = new DecorationTypeOptionsProvider(this._styleSheet, key, options); + provider = new DecorationTypeOptionsProvider(this._themeService, providerArgs); } else { - provider = new DecorationSubTypeOptionsProvider(this._styleSheet, key, parentTypeKey, options); + provider = new DecorationSubTypeOptionsProvider(this._themeService, providerArgs); } this._decorationOptionProviders[key] = provider; } @@ -71,67 +78,52 @@ class DecorationSubTypeOptionsProvider implements IModelDecorationOptionsProvide public refCount: number; - private _disposable: IDisposable; private _parentTypeKey: string; - private _beforeContentClassName: string; - private _afterContentClassName: string; + private _beforeContentRules: DecorationCSSRules; + private _afterContentRules: DecorationCSSRules; - constructor(styleSheet: HTMLStyleElement, key: string, parentTypeKey: string, options: IDecorationRenderOptions) { - this._parentTypeKey = parentTypeKey; + constructor(themeService: IThemeService, providerArgs: ProviderArguments) { + this._parentTypeKey = providerArgs.parentTypeKey; this.refCount = 0; - let themedOpts = getThemedRenderOptions(options); - - this._beforeContentClassName = DecorationRenderHelper.createCSSRules( - styleSheet, - key, - parentTypeKey, - ModelDecorationCSSRuleType.BeforeContentClassName, - { - light: DecorationRenderHelper.getCSSTextForModelDecorationContentClassName(themedOpts.light.before), - dark: DecorationRenderHelper.getCSSTextForModelDecorationContentClassName(themedOpts.dark.before) - } - ); - - this._afterContentClassName = DecorationRenderHelper.createCSSRules( - styleSheet, - key, - parentTypeKey, - ModelDecorationCSSRuleType.AfterContentClassName, - { - light: DecorationRenderHelper.getCSSTextForModelDecorationContentClassName(themedOpts.light.after), - dark: DecorationRenderHelper.getCSSTextForModelDecorationContentClassName(themedOpts.dark.after) - } - ); - if (this._beforeContentClassName || this._afterContentClassName) { - this._disposable = toDisposable(() => { - dom.removeCSSRulesContainingSelector(CSSNameHelper.getDeletionSubstring(key), styleSheet); - }); - } + this._beforeContentRules = new DecorationCSSRules(ModelDecorationCSSRuleType.BeforeContentClassName, providerArgs, themeService); + this._afterContentRules = new DecorationCSSRules(ModelDecorationCSSRuleType.AfterContentClassName, providerArgs, themeService); } public getOptions(codeEditorService: AbstractCodeEditorService, writable: boolean): IModelDecorationOptions { let options = codeEditorService.resolveDecorationOptions(this._parentTypeKey, true); - if (this._beforeContentClassName) { - options.beforeContentClassName = this._beforeContentClassName; + if (this._beforeContentRules) { + options.beforeContentClassName = this._beforeContentRules.className; } - if (this._afterContentClassName) { - options.afterContentClassName = this._afterContentClassName; + if (this._afterContentRules) { + options.afterContentClassName = this._afterContentRules.className; } return options; } public dispose(): void { - if (this._disposable) { - this._disposable.dispose(); - delete this._disposable; + if (this._beforeContentRules) { + this._beforeContentRules.dispose(); + this._beforeContentRules = null; + } + if (this._afterContentRules) { + this._afterContentRules.dispose(); + this._afterContentRules = null; } } } +interface ProviderArguments { + styleSheet: HTMLStyleElement; + key: string; + parentTypeKey?: string; + options: IDecorationRenderOptions; +} + + class DecorationTypeOptionsProvider implements IModelDecorationOptionsProvider { - private _disposable: IDisposable; + private _disposables: IDisposable[]; public refCount: number; public className: string; @@ -143,82 +135,40 @@ class DecorationTypeOptionsProvider implements IModelDecorationOptionsProvider { public overviewRuler: IModelDecorationOverviewRulerOptions; public stickiness: TrackedRangeStickiness; - constructor(styleSheet: HTMLStyleElement, key: string, options: IDecorationRenderOptions) { + constructor(themeService: IThemeService, providerArgs: ProviderArguments) { this.refCount = 0; + this._disposables = []; - let themedOpts = getThemedRenderOptions(options); - - this.className = DecorationRenderHelper.createCSSRules( - styleSheet, - key, - null, - ModelDecorationCSSRuleType.ClassName, - { - light: DecorationRenderHelper.getCSSTextForModelDecorationClassName(themedOpts.light), - dark: DecorationRenderHelper.getCSSTextForModelDecorationClassName(themedOpts.dark) + let createCSSRules = (type: ModelDecorationCSSRuleType) => { + let rules = new DecorationCSSRules(type, providerArgs, themeService); + if (rules.hasContent) { + this._disposables.push(rules); + return rules.className; } - ); + return void 0; + }; - this.inlineClassName = DecorationRenderHelper.createCSSRules( - styleSheet, - key, - null, - ModelDecorationCSSRuleType.InlineClassName, - { - light: DecorationRenderHelper.getCSSTextForModelDecorationInlineClassName(themedOpts.light), - dark: DecorationRenderHelper.getCSSTextForModelDecorationInlineClassName(themedOpts.dark) - } - ); - - this.beforeContentClassName = DecorationRenderHelper.createCSSRules( - styleSheet, - key, - null, - ModelDecorationCSSRuleType.BeforeContentClassName, - { - light: DecorationRenderHelper.getCSSTextForModelDecorationContentClassName(themedOpts.light.before), - dark: DecorationRenderHelper.getCSSTextForModelDecorationContentClassName(themedOpts.dark.before) - } - ); - - this.afterContentClassName = DecorationRenderHelper.createCSSRules( - styleSheet, - key, - null, - ModelDecorationCSSRuleType.AfterContentClassName, - { - light: DecorationRenderHelper.getCSSTextForModelDecorationContentClassName(themedOpts.light.after), - dark: DecorationRenderHelper.getCSSTextForModelDecorationContentClassName(themedOpts.dark.after) - } - ); - - this.glyphMarginClassName = DecorationRenderHelper.createCSSRules( - styleSheet, - key, - null, - ModelDecorationCSSRuleType.GlyphMarginClassName, - { - light: DecorationRenderHelper.getCSSTextForModelDecorationGlyphMarginClassName(themedOpts.light), - dark: DecorationRenderHelper.getCSSTextForModelDecorationGlyphMarginClassName(themedOpts.dark) - } - ); + this.className = createCSSRules(ModelDecorationCSSRuleType.ClassName); + this.inlineClassName = createCSSRules(ModelDecorationCSSRuleType.InlineClassName); + this.beforeContentClassName = createCSSRules(ModelDecorationCSSRuleType.BeforeContentClassName); + this.beforeContentClassName = createCSSRules(ModelDecorationCSSRuleType.AfterContentClassName); + this.glyphMarginClassName = createCSSRules(ModelDecorationCSSRuleType.GlyphMarginClassName); + let options = providerArgs.options; this.isWholeLine = Boolean(options.isWholeLine); + let lightOverviewRulerColor = options.light && options.light.overviewRulerColor || options.overviewRulerColor; + let darkOverviewRulerColor = options.dark && options.dark.overviewRulerColor || options.overviewRulerColor; if ( - typeof themedOpts.light.overviewRulerColor !== 'undefined' - || typeof themedOpts.dark.overviewRulerColor !== 'undefined' + typeof lightOverviewRulerColor !== 'undefined' + || typeof darkOverviewRulerColor !== 'undefined' ) { this.overviewRuler = { - color: themedOpts.light.overviewRulerColor || themedOpts.dark.overviewRulerColor, - darkColor: themedOpts.dark.overviewRulerColor || themedOpts.light.overviewRulerColor, + color: lightOverviewRulerColor || darkOverviewRulerColor, + darkColor: darkOverviewRulerColor || lightOverviewRulerColor, position: options.overviewRulerLane || OverviewRulerLane.Center }; } - - this._disposable = toDisposable(() => { - dom.removeCSSRulesContainingSelector(CSSNameHelper.getDeletionSubstring(key), styleSheet); - }); } public getOptions(codeEditorService: AbstractCodeEditorService, writable: boolean): IModelDecorationOptions { @@ -238,51 +188,162 @@ class DecorationTypeOptionsProvider implements IModelDecorationOptionsProvider { } public dispose(): void { - if (this._disposable) { - this._disposable.dispose(); - delete this._disposable; - } + this._disposables = disposeAll(this._disposables); } } -class DecorationRenderHelper { - private static _CSS_MAP = { - color: 'color:{0} !important;', - backgroundColor: 'background-color:{0};', - outline: 'outline:{0};', - outlineColor: 'outline-color:{0};', - outlineStyle: 'outline-style:{0};', - outlineWidth: 'outline-width:{0};', +const _CSS_MAP = { + color: 'color:{0} !important;', + backgroundColor: 'background-color:{0};', - border: 'border:{0};', - borderColor: 'border-color:{0};', - borderRadius: 'border-radius:{0};', - borderSpacing: 'border-spacing:{0};', - borderStyle: 'border-style:{0};', - borderWidth: 'border-width:{0};', + outline: 'outline:{0};', + outlineColor: 'outline-color:{0};', + outlineStyle: 'outline-style:{0};', + outlineWidth: 'outline-width:{0};', - textDecoration: 'text-decoration:{0};', - cursor: 'cursor:{0};', - letterSpacing: 'letter-spacing:{0};', + border: 'border:{0};', + borderColor: 'border-color:{0};', + borderRadius: 'border-radius:{0};', + borderSpacing: 'border-spacing:{0};', + borderStyle: 'border-style:{0};', + borderWidth: 'border-width:{0};', - gutterIconPath: 'background:url(\'{0}\') center center no-repeat;', - gutterIconSize: 'background-size:{0};', + textDecoration: 'text-decoration:{0};', + cursor: 'cursor:{0};', + letterSpacing: 'letter-spacing:{0};', - contentText: 'content:\'{0}\';', - contentIconPath: 'content:url(\'{0}\');', - margin: 'margin:{0};', - width: 'width:{0};', - height: 'height:{0};' - }; + gutterIconPath: 'background:url(\'{0}\') center center no-repeat;', + gutterIconSize: 'background-size:{0};', + + contentText: 'content:\'{0}\';', + contentIconPath: 'content:url(\'{0}\');', + margin: 'margin:{0};', + width: 'width:{0};', + height: 'height:{0};' +}; + + +class DecorationCSSRules { + + private _theme: ITheme; + private _className: string; + private _unThemedSelector: string; + private _hasContent: boolean; + private _ruleType: ModelDecorationCSSRuleType; + private _themeListener: IDisposable; + private _providerArgs: ProviderArguments; + private _usesThemeColors: boolean; + + public constructor(ruleType: ModelDecorationCSSRuleType, providerArgs: ProviderArguments, themeService: IThemeService) { + this._theme = themeService.getTheme(); + this._ruleType = ruleType; + this._providerArgs = providerArgs; + this._usesThemeColors = false; + this._hasContent = false; + + let className = CSSNameHelper.getClassName(this._providerArgs.key, ruleType); + if (this._providerArgs.parentTypeKey) { + className = className + ' ' + CSSNameHelper.getClassName(this._providerArgs.parentTypeKey, ruleType); + } + this._className = className; + + this._unThemedSelector = CSSNameHelper.getSelector(this._providerArgs.key, this._providerArgs.parentTypeKey, ruleType); + + this._buildCSS(); + + if (this._usesThemeColors) { + this._themeListener = themeService.onThemeChange(theme => { + this._theme = themeService.getTheme(); + this._removeCSS(); + this._buildCSS(); + }); + } + } + + public dispose() { + if (this._hasContent) { + this._removeCSS(); + this._hasContent = false; + } + if (this._themeListener) { + this._themeListener.dispose(); + this._themeListener = null; + } + } + + public get hasContent(): boolean { + return this._hasContent; + } + + public get className(): string { + return this._className; + } + + private _buildCSS(): void { + let options = this._providerArgs.options; + let unthemedCSS, lightCSS, darkCSS: string; + switch (this._ruleType) { + case ModelDecorationCSSRuleType.ClassName: + unthemedCSS = this.getCSSTextForModelDecorationClassName(options); + lightCSS = this.getCSSTextForModelDecorationClassName(options.light); + darkCSS = this.getCSSTextForModelDecorationClassName(options.dark); + break; + case ModelDecorationCSSRuleType.InlineClassName: + unthemedCSS = this.getCSSTextForModelDecorationInlineClassName(options); + lightCSS = this.getCSSTextForModelDecorationInlineClassName(options.light); + darkCSS = this.getCSSTextForModelDecorationInlineClassName(options.dark); + break; + case ModelDecorationCSSRuleType.GlyphMarginClassName: + unthemedCSS = this.getCSSTextForModelDecorationGlyphMarginClassName(options); + lightCSS = this.getCSSTextForModelDecorationGlyphMarginClassName(options.light); + darkCSS = this.getCSSTextForModelDecorationGlyphMarginClassName(options.dark); + break; + case ModelDecorationCSSRuleType.BeforeContentClassName: + unthemedCSS = this.getCSSTextForModelDecorationContentClassName(options.before); + lightCSS = this.getCSSTextForModelDecorationContentClassName(options.light && options.light.before); + darkCSS = this.getCSSTextForModelDecorationContentClassName(options.dark && options.dark.before); + break; + case ModelDecorationCSSRuleType.AfterContentClassName: + unthemedCSS = this.getCSSTextForModelDecorationContentClassName(options.after); + lightCSS = this.getCSSTextForModelDecorationContentClassName(options.light && options.light.after); + darkCSS = this.getCSSTextForModelDecorationContentClassName(options.dark && options.dark.after); + break; + default: + throw new Error('Unknown rule type: ' + this._ruleType); + } + let sheet = this._providerArgs.styleSheet.sheet; + + let hasContent = false; + if (unthemedCSS.length > 0) { + sheet.insertRule(`${this._unThemedSelector} {${unthemedCSS}}`); + hasContent = true; + } + if (lightCSS.length > 0) { + sheet.insertRule(`.vs${this._unThemedSelector} {${lightCSS}}`); + hasContent = true; + } + if (darkCSS.length > 0) { + sheet.insertRule(`.vs-dark${this._unThemedSelector}, .hc-black${this._unThemedSelector} {${darkCSS}}`); + hasContent = true; + } + this._hasContent = hasContent; + } + + private _removeCSS(): void { + dom.removeCSSRulesContainingSelector(this._unThemedSelector, this._providerArgs.styleSheet); + } /** * Build the CSS for decorations styled via `className`. */ - public static getCSSTextForModelDecorationClassName(opts: IThemeDecorationRenderOptions): string { + private getCSSTextForModelDecorationClassName(opts: IThemeDecorationRenderOptions): string { + if (!opts) { + return ''; + } let cssTextArr: string[] = []; - DecorationRenderHelper.collectCSSText(opts, ['backgroundColor', 'outline', 'outlineColor', 'outlineStyle', 'outlineWidth'], cssTextArr); - DecorationRenderHelper.collectBorderSettingsCSSText(opts, cssTextArr); + this.collectCSSText(opts, ['backgroundColor', 'outline', 'outlineColor', 'outlineStyle', 'outlineWidth'], cssTextArr); + this.collectBorderSettingsCSSText(opts, cssTextArr); return cssTextArr.join(''); } @@ -290,33 +351,39 @@ class DecorationRenderHelper { /** * Build the CSS for decorations styled via `inlineClassName`. */ - public static getCSSTextForModelDecorationInlineClassName(opts: IThemeDecorationRenderOptions): string { + private getCSSTextForModelDecorationInlineClassName(opts: IThemeDecorationRenderOptions): string { + if (!opts) { + return ''; + } let cssTextArr: string[] = []; - DecorationRenderHelper.collectCSSText(opts, ['textDecoration', 'cursor', 'color', 'letterSpacing'], cssTextArr); + this.collectCSSText(opts, ['textDecoration', 'cursor', 'color', 'letterSpacing'], cssTextArr); return cssTextArr.join(''); } /** * Build the CSS for decorations styled before or after content. */ - public static getCSSTextForModelDecorationContentClassName(opts: IContentDecorationRenderOptions): string { + private getCSSTextForModelDecorationContentClassName(opts: IContentDecorationRenderOptions): string { + if (!opts) { + return ''; + } let cssTextArr: string[] = []; if (typeof opts !== 'undefined') { - DecorationRenderHelper.collectBorderSettingsCSSText(opts, cssTextArr); + this.collectBorderSettingsCSSText(opts, cssTextArr); if (typeof opts.contentIconPath === 'string') { - cssTextArr.push(strings.format(this._CSS_MAP.contentIconPath, URI.file(opts.contentIconPath).toString().replace(/'/g, '%27'))); + cssTextArr.push(strings.format(_CSS_MAP.contentIconPath, URI.file(opts.contentIconPath).toString().replace(/'/g, '%27'))); } else if (opts.contentIconPath instanceof URI) { - cssTextArr.push(strings.format(this._CSS_MAP.contentIconPath, opts.contentIconPath.toString(true).replace(/'/g, '%27'))); + cssTextArr.push(strings.format(_CSS_MAP.contentIconPath, opts.contentIconPath.toString(true).replace(/'/g, '%27'))); } if (typeof opts.contentText === 'string') { const truncated = opts.contentText.match(/^.*$/m)[0]; // only take first line const escaped = truncated.replace(/['\\]/g, '\\$&'); - cssTextArr.push(strings.format(this._CSS_MAP.contentText, escaped)); + cssTextArr.push(strings.format(_CSS_MAP.contentText, escaped)); } - DecorationRenderHelper.collectCSSText(opts, ['textDecoration', 'color', 'backgroundColor', 'margin'], cssTextArr); - if (DecorationRenderHelper.collectCSSText(opts, ['width', 'height'], cssTextArr)) { + this.collectCSSText(opts, ['textDecoration', 'color', 'backgroundColor', 'margin'], cssTextArr); + if (this.collectCSSText(opts, ['width', 'height'], cssTextArr)) { cssTextArr.push('display:inline-block;'); } } @@ -327,17 +394,20 @@ class DecorationRenderHelper { /** * Build the CSS for decorations styled via `glpyhMarginClassName`. */ - public static getCSSTextForModelDecorationGlyphMarginClassName(opts: IThemeDecorationRenderOptions): string { + private getCSSTextForModelDecorationGlyphMarginClassName(opts: IThemeDecorationRenderOptions): string { + if (!opts) { + return ''; + } let cssTextArr = []; if (typeof opts.gutterIconPath !== 'undefined') { if (typeof opts.gutterIconPath === 'string') { - cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, URI.file(opts.gutterIconPath).toString())); + cssTextArr.push(strings.format(_CSS_MAP.gutterIconPath, URI.file(opts.gutterIconPath).toString())); } else { - cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, opts.gutterIconPath.toString(true).replace(/'/g, '%27'))); + cssTextArr.push(strings.format(_CSS_MAP.gutterIconPath, opts.gutterIconPath.toString(true).replace(/'/g, '%27'))); } if (typeof opts.gutterIconSize !== 'undefined') { - cssTextArr.push(strings.format(this._CSS_MAP.gutterIconSize, opts.gutterIconSize)); + cssTextArr.push(strings.format(_CSS_MAP.gutterIconSize, opts.gutterIconSize)); } } @@ -346,59 +416,38 @@ class DecorationRenderHelper { private static border_rules = ['border', 'borderRadius', 'borderColor', 'borderSpacing', 'borderStyle', 'borderWidth']; - public static collectBorderSettingsCSSText(opts: any, cssTextArr: string[]): boolean { - if (DecorationRenderHelper.collectCSSText(opts, DecorationRenderHelper.border_rules, cssTextArr)) { + private collectBorderSettingsCSSText(opts: any, cssTextArr: string[]): boolean { + if (this.collectCSSText(opts, DecorationCSSRules.border_rules, cssTextArr)) { cssTextArr.push(strings.format('box-sizing: border-box;')); return true; } return false; } - private static collectCSSText(opts: any, properties: string[], cssTextArr: string[]): boolean { + private collectCSSText(opts: any, properties: string[], cssTextArr: string[]): boolean { let lenBefore = cssTextArr.length; for (let property of properties) { - if (typeof opts[property] !== 'undefined') { - cssTextArr.push(strings.format(this._CSS_MAP[property], opts[property])); + let value = this.resolveValue(opts[property]); + if (typeof value === 'string') { + cssTextArr.push(strings.format(_CSS_MAP[property], value)); } } return cssTextArr.length !== lenBefore; } - /** - * Create CSS rules for `cssTexts` with the generated class names from `ruleType` - */ - public static createCSSRules(styleSheet: HTMLStyleElement, key: string, parentKey: string, ruleType: ModelDecorationCSSRuleType, cssTexts: { light: string, dark: string }): string { - function createCSSSelector(themeType: ThemeType, cssText: string) { - let selector = CSSNameHelper.getSelector(themeType, key, parentKey, ruleType); - dom.createCSSRule(selector, cssText, styleSheet); - } - - let hasContent = false; - if (cssTexts.light.length > 0) { - createCSSSelector(ThemeType.Light, cssTexts.light); - hasContent = true; - } - if (cssTexts.dark.length > 0) { - createCSSSelector(ThemeType.Dark, cssTexts.dark); - createCSSSelector(ThemeType.HighContrastBlack, cssTexts.dark); - hasContent = true; - } - if (hasContent) { - let className = CSSNameHelper.getClassName(key, ruleType); - if (parentKey) { - className = className + ' ' + CSSNameHelper.getClassName(parentKey, ruleType); + private resolveValue(value: string | ThemeColor): string { + if (isThemeColor(value)) { + this._usesThemeColors = true; + let color = this._theme.getColor(value.id); + if (color) { + return color.toString(); } - return className; + return void 0; } - return void 0; + return value; } } -const enum ThemeType { - Light = 0, - Dark = 1, - HighContrastBlack = 2 -} const enum ModelDecorationCSSRuleType { ClassName = 0, InlineClassName = 1, @@ -409,22 +458,12 @@ const enum ModelDecorationCSSRuleType { class CSSNameHelper { - private static _getSelectorPrefixOf(theme: ThemeType): string { - if (theme === ThemeType.Light) { - return '.monaco-editor.vs'; - } - if (theme === ThemeType.Dark) { - return '.monaco-editor.vs-dark'; - } - return '.monaco-editor.hc-black'; - } - public static getClassName(key: string, type: ModelDecorationCSSRuleType): string { return 'ced-' + key + '-' + type; } - public static getSelector(themeType: ThemeType, key: string, parentKey: string, ruleType: ModelDecorationCSSRuleType): string { - let selector = this._getSelectorPrefixOf(themeType) + ' .' + this.getClassName(key, ruleType); + public static getSelector(key: string, parentKey: string, ruleType: ModelDecorationCSSRuleType): string { + let selector = '.monaco-editor .' + this.getClassName(key, ruleType); if (parentKey) { selector = selector + '.' + this.getClassName(parentKey, ruleType); } @@ -435,27 +474,4 @@ class CSSNameHelper { } return selector; } - - public static getDeletionSubstring(key: string): string { - return '.ced-' + key + '-'; - } -} - -// ---- Normalize decoration render options per theme -function getThemedRenderOptions(opts: { light?: T, dark?: T }): { light?: T, dark?: T } { - // TODO@alex,joh - not really how/what deep clone is being used - // for here but it will break the URI TODO@martin - - // let light = objects.deepClone(opts); - let light = parse(stringify(opts)); - objects.mixin(light, opts.light); - - // let dark = objects.deepClone(opts); - let dark = parse(stringify(opts)); - objects.mixin(dark, opts.dark); - - return { - light: light, - dark: dark - }; } diff --git a/src/vs/editor/browser/standalone/standaloneServices.ts b/src/vs/editor/browser/standalone/standaloneServices.ts index 1ce2c0d30b3..550b5294605 100644 --- a/src/vs/editor/browser/standalone/standaloneServices.ts +++ b/src/vs/editor/browser/standalone/standaloneServices.ts @@ -133,13 +133,14 @@ export module StaticServices { export const editorWorkerService = define(IEditorWorkerService, (o) => new EditorWorkerServiceImpl(modelService.get(o), configurationService.get(o), modeService.get(o))); - export const codeEditorService = define(ICodeEditorService, () => new CodeEditorServiceImpl()); + export const standaloneThemeService = define(IStandaloneThemeService, () => new StandaloneThemeServiceImpl()); + + export const codeEditorService = define(ICodeEditorService, (o) => new CodeEditorServiceImpl(standaloneThemeService.get(o))); export const progressService = define(IProgressService, () => new SimpleProgressService()); export const storageService = define(IStorageService, () => NullStorageService); - export const standaloneThemeService = define(IStandaloneThemeService, () => new StandaloneThemeServiceImpl()); } export class DynamicStandaloneServices extends Disposable { diff --git a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts index 6f9f3e03b55..46c6d71d941 100644 --- a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts +++ b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts @@ -15,6 +15,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { OverviewRulerZone } from 'vs/editor/common/view/overviewZoneManager'; import { editorOverviewRulerBorder, editorCursor } from 'vs/editor/common/view/editorColorRegistry'; +import { Color } from 'vs/base/common/color'; export class DecorationsOverviewRuler extends ViewPart { @@ -186,15 +187,23 @@ export class DecorationsOverviewRuler extends ViewPart { dec.range.endLineNumber, overviewRuler.position, 0, - overviewRuler.color, - overviewRuler.darkColor, - overviewRuler.hcColor + this.resolveRulerColor(overviewRuler.color), + this.resolveRulerColor(overviewRuler.darkColor), + this.resolveRulerColor(overviewRuler.hcColor) )); } return zones; } + private resolveRulerColor(color: string | editorCommon.ThemeColor): string { + if (editorCommon.isThemeColor(color)) { + let c = this._context.theme.getColor(color.id) || Color.transparent; + return c.toString(); + } + return color; + } + private _createZonesFromCursors(): OverviewRulerZone[] { let zones: OverviewRulerZone[] = []; diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index 9a0674a5f28..058ea7e3653 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -41,19 +41,19 @@ export enum OverviewRulerLane { export interface IModelDecorationOverviewRulerOptions { /** * CSS color to render in the overview ruler. - * e.g.: rgba(100, 100, 100, 0.5) + * e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry */ - color: string; + color: string | ThemeColor; /** * CSS color to render in the overview ruler. - * e.g.: rgba(100, 100, 100, 0.5) + * e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry */ - darkColor: string; + darkColor: string | ThemeColor; /** * CSS color to render in the overview ruler. - * e.g.: rgba(100, 100, 100, 0.5) + * e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry */ - hcColor?: string; + hcColor?: string | ThemeColor; /** * The position in the overview ruler. */ @@ -1621,19 +1621,30 @@ export interface IEditorContribution { restoreViewState?(state: any): void; } +export interface ThemeColor { + id: string; +} + +/** + * @internal + */ +export function isThemeColor(o): o is ThemeColor { + return o && typeof o.id === 'string'; +} + /** * @internal */ export interface IThemeDecorationRenderOptions { - backgroundColor?: string; + backgroundColor?: string | ThemeColor; outline?: string; - outlineColor?: string; + outlineColor?: string | ThemeColor; outlineStyle?: string; outlineWidth?: string; border?: string; - borderColor?: string; + borderColor?: string | ThemeColor; borderRadius?: string; borderSpacing?: string; borderStyle?: string; @@ -1641,13 +1652,13 @@ export interface IThemeDecorationRenderOptions { textDecoration?: string; cursor?: string; - color?: string; + color?: string | ThemeColor; letterSpacing?: string; gutterIconPath?: string | URI; gutterIconSize?: string; - overviewRulerColor?: string; + overviewRulerColor?: string | ThemeColor; before?: IContentDecorationRenderOptions; after?: IContentDecorationRenderOptions; @@ -1661,9 +1672,10 @@ export interface IContentDecorationRenderOptions { contentIconPath?: string | URI; border?: string; + borderColor?: string | ThemeColor; textDecoration?: string; - color?: string; - backgroundColor?: string; + color?: string | ThemeColor; + backgroundColor?: string | ThemeColor; margin?: string; width?: string; diff --git a/src/vs/editor/common/model/textModelWithDecorations.ts b/src/vs/editor/common/model/textModelWithDecorations.ts index 3e36eeedda6..84380b69ef3 100644 --- a/src/vs/editor/common/model/textModelWithDecorations.ts +++ b/src/vs/editor/common/model/textModelWithDecorations.ts @@ -840,9 +840,9 @@ function cleanClassName(className: string): string { } export class ModelDecorationOverviewRulerOptions implements editorCommon.IModelDecorationOverviewRulerOptions { - readonly color: string; - readonly darkColor: string; - readonly hcColor: string; + readonly color: string | editorCommon.ThemeColor; + readonly darkColor: string | editorCommon.ThemeColor; + readonly hcColor: string | editorCommon.ThemeColor; readonly position: editorCommon.OverviewRulerLane; constructor(options: editorCommon.IModelDecorationOverviewRulerOptions) { diff --git a/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts b/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts index 2dbd09ac1c0..d68266803a7 100644 --- a/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts +++ b/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts @@ -9,6 +9,9 @@ import URI from 'vs/base/common/uri'; import * as dom from 'vs/base/browser/dom'; import { CodeEditorServiceImpl } from 'vs/editor/browser/services/codeEditorServiceImpl'; import { IDecorationRenderOptions } from 'vs/editor/common/editorCommon'; +import { TestThemeService, TestTheme } from 'vs/workbench/test/workbenchTestServices'; + +const themeServiceMock = new TestThemeService(); suite('Decoration Render Options', () => { var options: IDecorationRenderOptions = { @@ -18,12 +21,12 @@ suite('Decoration Render Options', () => { borderColor: 'yellow' }; test('register and resolve decoration type', () => { - var s = new CodeEditorServiceImpl(); + var s = new CodeEditorServiceImpl(themeServiceMock); s.registerDecorationType('example', options); assert.notEqual(s.resolveDecorationOptions('example', false), undefined); }); test('remove decoration type', () => { - var s = new CodeEditorServiceImpl(); + var s = new CodeEditorServiceImpl(themeServiceMock); s.registerDecorationType('example', options); assert.notEqual(s.resolveDecorationOptions('example', false), undefined); s.removeDecorationType('example'); @@ -39,7 +42,7 @@ suite('Decoration Render Options', () => { test('css properties', () => { var styleSheet = dom.createStyleSheet(); - var s = new CodeEditorServiceImpl(styleSheet); + var s = new CodeEditorServiceImpl(themeServiceMock, styleSheet); s.registerDecorationType('example', options); var sheet = readStyleSheet(styleSheet); assert( @@ -50,11 +53,76 @@ suite('Decoration Render Options', () => { assert(sheet.indexOf('background-color: red;') > 0); }); + test('theme color', () => { + var options: IDecorationRenderOptions = { + backgroundColor: { id: 'editorBackground' }, + borderColor: { id: 'editorBorder' }, + }; + var colors: { [key: string]: string } = { + editorBackground: '#FF0000' + }; + + var styleSheet = dom.createStyleSheet(); + let themeService = new TestThemeService(new TestTheme(colors)); + var s = new CodeEditorServiceImpl(themeService, styleSheet); + s.registerDecorationType('example', options); + var sheet = readStyleSheet(styleSheet); + assert.equal(sheet, '.monaco-editor .ced-example-0 { background-color: rgb(255, 0, 0); }'); + + colors = { + editorBackground: '#EE0000', + editorBorder: '#00FFFF' + }; + themeService.setTheme(new TestTheme(colors)); + sheet = readStyleSheet(styleSheet); + assert.equal(sheet, '.monaco-editor .ced-example-0 { background-color: rgb(238, 0, 0); border-color: rgb(0, 255, 255); box-sizing: border-box; }'); + + s.removeDecorationType('example'); + sheet = readStyleSheet(styleSheet); + assert.equal(sheet, ''); + + }); + + test('theme overrides', () => { + var options: IDecorationRenderOptions = { + color: { id: 'editorBackground' }, + light: { + color: '#FF00FF' + }, + dark: { + color: '#000000', + after: { + color: { id: 'infoForeground' } + } + } + }; + var colors: { [key: string]: string } = { + editorBackground: '#FF0000', + infoForeground: '#444444' + }; + + var styleSheet = dom.createStyleSheet(); + let themeService = new TestThemeService(new TestTheme(colors)); + var s = new CodeEditorServiceImpl(themeService, styleSheet); + s.registerDecorationType('example', options); + var sheet = readStyleSheet(styleSheet); + let expected = + '.vs-dark.monaco-editor .ced-example-4::after, .hc-black.monaco-editor .ced-example-4::after { color: rgb(68, 68, 68) !important; }\n' + + '.vs-dark.monaco-editor .ced-example-1, .hc-black.monaco-editor .ced-example-1 { color: rgb(0, 0, 0) !important; }\n' + + '.vs.monaco-editor .ced-example-1 { color: rgb(255, 0, 255) !important; }\n' + + '.monaco-editor .ced-example-1 { color: rgb(255, 0, 0) !important; }'; + assert.equal(sheet, expected); + + s.removeDecorationType('example'); + sheet = readStyleSheet(styleSheet); + assert.equal(sheet, ''); + }); + test('css properties, gutterIconPaths', () => { var styleSheet = dom.createStyleSheet(); // unix file path (used as string) - var s = new CodeEditorServiceImpl(styleSheet); + var s = new CodeEditorServiceImpl(themeServiceMock, styleSheet); s.registerDecorationType('example', { gutterIconPath: '/Users/foo/bar.png' }); var sheet = readStyleSheet(styleSheet);//.innerHTML || styleSheet.sheet.toString(); assert( @@ -63,7 +131,7 @@ suite('Decoration Render Options', () => { ); // windows file path (used as string) - s = new CodeEditorServiceImpl(styleSheet); + s = new CodeEditorServiceImpl(themeServiceMock, styleSheet); s.registerDecorationType('example', { gutterIconPath: 'c:\\files\\miles\\more.png' }); sheet = readStyleSheet(styleSheet); // TODO@Alex test fails @@ -73,7 +141,7 @@ suite('Decoration Render Options', () => { // ); // URI, only minimal encoding - s = new CodeEditorServiceImpl(styleSheet); + s = new CodeEditorServiceImpl(themeServiceMock, styleSheet); s.registerDecorationType('example', { gutterIconPath: URI.parse('data:image/svg+xml;base64,PHN2ZyB4b+') }); sheet = readStyleSheet(styleSheet); assert( @@ -82,7 +150,7 @@ suite('Decoration Render Options', () => { ); // single quote must always be escaped/encoded - s = new CodeEditorServiceImpl(styleSheet); + s = new CodeEditorServiceImpl(themeServiceMock, styleSheet); s.registerDecorationType('example', { gutterIconPath: '/Users/foo/b\'ar.png' }); sheet = readStyleSheet(styleSheet); assert( @@ -90,7 +158,7 @@ suite('Decoration Render Options', () => { || sheet.indexOf('background: url("file:///Users/foo/b%27ar.png") center center no-repeat;') > 0 ); - s = new CodeEditorServiceImpl(styleSheet); + s = new CodeEditorServiceImpl(themeServiceMock, styleSheet); s.registerDecorationType('example', { gutterIconPath: URI.parse('http://test/pa\'th') }); sheet = readStyleSheet(styleSheet); assert( diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index cee64b0706f..707cb1047fa 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -1068,19 +1068,19 @@ declare module monaco.editor { export interface IModelDecorationOverviewRulerOptions { /** * CSS color to render in the overview ruler. - * e.g.: rgba(100, 100, 100, 0.5) + * e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry */ - color: string; + color: string | ThemeColor; /** * CSS color to render in the overview ruler. - * e.g.: rgba(100, 100, 100, 0.5) + * e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry */ - darkColor: string; + darkColor: string | ThemeColor; /** * CSS color to render in the overview ruler. - * e.g.: rgba(100, 100, 100, 0.5) + * e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry */ - hcColor?: string; + hcColor?: string | ThemeColor; /** * The position in the overview ruler. */ @@ -2158,6 +2158,10 @@ declare module monaco.editor { restoreViewState?(state: any): void; } + export interface ThemeColor { + id: string; + } + export interface ICommonCodeEditor extends IEditor { /** * An event emitted when the content of the current model has changed. diff --git a/src/vs/platform/theme/common/themeService.ts b/src/vs/platform/theme/common/themeService.ts index 64e028e6215..10305538863 100644 --- a/src/vs/platform/theme/common/themeService.ts +++ b/src/vs/platform/theme/common/themeService.ts @@ -14,9 +14,9 @@ import Event, { Emitter } from 'vs/base/common/event'; export let IThemeService = createDecorator('themeService'); // base themes -export const DARK = 'dark'; -export const LIGHT = 'light'; -export const HIGH_CONTRAST = 'hc'; +export const DARK: ThemeType = 'dark'; +export const LIGHT: ThemeType = 'light'; +export const HIGH_CONTRAST: ThemeType = 'hc'; export type ThemeType = 'light' | 'dark' | 'hc'; export function getThemeTypeSelector(type: ThemeType): string { diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 190042afeea..4850740fec1 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -721,14 +721,28 @@ declare module 'vscode' { preview?: boolean; } + /** + * A reference to one of the workbench colors as defined in https://code.visualstudio.com/docs/getstarted/theme-color-reference. + * Using a theme color is preferred over a custom color as it gives theme authors and users the possibility to change the color. + */ + export class ThemeColor { + + /** + * Creates a reference to a theme color. + * @param id of the color. The available colors are listed in https://code.visualstudio.com/docs/getstarted/theme-color-reference. + */ + constructor(id: string); + } + /** * Represents theme specific rendering styles for a [text editor decoration](#TextEditorDecorationType). */ export interface ThemableDecorationRenderOptions { /** * Background color of the decoration. Use rgba() and define transparent background colors to play well with other decorations. + * Alternativly a color from the color registry an be [referenced](#ColorIdentifier). */ - backgroundColor?: string; + backgroundColor?: string | ThemeColor; /** * CSS styling property that will be applied to text enclosed by a decoration. @@ -739,7 +753,7 @@ declare module 'vscode' { * CSS styling property that will be applied to text enclosed by a decoration. * Better use 'outline' for setting one or more of the individual outline properties. */ - outlineColor?: string; + outlineColor?: string | ThemeColor; /** * CSS styling property that will be applied to text enclosed by a decoration. @@ -762,7 +776,7 @@ declare module 'vscode' { * CSS styling property that will be applied to text enclosed by a decoration. * Better use 'border' for setting one or more of the individual border properties. */ - borderColor?: string; + borderColor?: string | ThemeColor; /** * CSS styling property that will be applied to text enclosed by a decoration. @@ -801,7 +815,7 @@ declare module 'vscode' { /** * CSS styling property that will be applied to text enclosed by a decoration. */ - color?: string; + color?: string | ThemeColor; /** * CSS styling property that will be applied to text enclosed by a decoration. @@ -823,7 +837,7 @@ declare module 'vscode' { /** * The color of the decoration in the overview ruler. Use rgba() and define transparent colors to play well with other decorations. */ - overviewRulerColor?: string; + overviewRulerColor?: string | ThemeColor; /** * Defines the rendering options of the attachment that is inserted before the decorated text @@ -850,6 +864,10 @@ declare module 'vscode' { * CSS styling property that will be applied to the decoration attachment. */ border?: string; + /** + * CSS styling property that will be applied to text enclosed by a decoration. + */ + borderColor?: string | ThemeColor; /** * CSS styling property that will be applied to the decoration attachment. */ @@ -857,11 +875,11 @@ declare module 'vscode' { /** * CSS styling property that will be applied to the decoration attachment. */ - color?: string; + color?: string | ThemeColor; /** * CSS styling property that will be applied to the decoration attachment. */ - backgroundColor?: string; + backgroundColor?: string | ThemeColor; /** * CSS styling property that will be applied to the decoration attachment. */ diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 6aebd241572..eb5b38f2391 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -534,6 +534,7 @@ export function createApiFactory( WorkspaceEdit: extHostTypes.WorkspaceEdit, ProgressLocation: extHostTypes.ProgressLocation, TreeItemCollapsibleState: extHostTypes.TreeItemCollapsibleState, + ThemeColor: extHostTypes.ThemeColor, // functions FileLocationKind: extHostTypes.FileLocationKind, ApplyToKind: extHostTypes.ApplyToKind, diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index 1c10cc26251..20b0d2a1aff 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1270,3 +1270,10 @@ export enum TreeItemCollapsibleState { Collapsed = 1, Expanded = 2 } + +export class ThemeColor { + id: string; + constructor(id: string) { + this.id = id; + } +} \ No newline at end of file diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index bc6e0f5e11d..899b03112be 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -50,8 +50,7 @@ import { IWindowsService, IWindowService } from 'vs/platform/windows/common/wind import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { RawTextSource, IRawTextSource } from 'vs/editor/common/model/textSource'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { IThemeService, ITheme, IThemingParticipant, ThemeType } from 'vs/platform/theme/common/themeService'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { IThemeService, ITheme, DARK } from 'vs/platform/theme/common/themeService'; import { Color } from 'vs/base/common/color'; import { isLinux } from 'vs/base/common/platform'; @@ -1000,10 +999,16 @@ export class TestWindowsService implements IWindowsService { } export class TestTheme implements ITheme { - type: ThemeType; + + constructor(private colors: { [id: string]: string; } = {}, public type = DARK) { + } getColor(color: string, useDefault?: boolean): Color { - throw new Error('Method not implemented.'); + let value = this.colors[color]; + if (value) { + return Color.fromHex(value); + } + return void 0; } defines(color: string): boolean { @@ -1011,17 +1016,30 @@ export class TestTheme implements ITheme { } } -const testTheme = new TestTheme(); - export class TestThemeService implements IThemeService { _serviceBrand: any; + _theme: ITheme; + _onThemeChange = new Emitter(); + + constructor(theme = new TestTheme()) { + this._theme = theme; + } getTheme(): ITheme { - return testTheme; + return this._theme; } - onThemeChange(participant: IThemingParticipant): IDisposable { - return { dispose: () => { } }; + setTheme(theme: ITheme) { + this._theme = theme; + this.fireThemeChange(); + } + + fireThemeChange() { + this._onThemeChange.fire(this._theme); + } + + public get onThemeChange(): Event { + return this._onThemeChange.event; } } From 2bf7fbfc367ac78871a8c2ca597037741d00b582 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 24 May 2017 13:59:47 -0700 Subject: [PATCH 0909/1164] Fix #25422 - also search external files --- src/vs/workbench/services/search/node/ripgrepTextSearch.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/services/search/node/ripgrepTextSearch.ts b/src/vs/workbench/services/search/node/ripgrepTextSearch.ts index 50cd95218a9..829406f52fe 100644 --- a/src/vs/workbench/services/search/node/ripgrepTextSearch.ts +++ b/src/vs/workbench/services/search/node/ripgrepTextSearch.ts @@ -225,7 +225,7 @@ export class RipgrepParser extends EventEmitter { this.onResult(); } - this.fileMatch = new FileMatch(path.join(this.rootFolder, r[1])); + this.fileMatch = new FileMatch(path.resolve(this.rootFolder, r[1])); } else { // Line is empty (or malformed) } @@ -461,6 +461,8 @@ function getRgArgs(config: IRawSearch): { args: string[], siblingClauses: glob.I args.push('./'); } + args.push(...config.extraFiles); + return { args, siblingClauses }; } From 68c6a61380017c857addc1f98a241832f93fbc3a Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 24 May 2017 14:00:58 -0700 Subject: [PATCH 0910/1164] Clean up var name --- src/vs/workbench/parts/terminal/node/terminalProcess.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/node/terminalProcess.ts b/src/vs/workbench/parts/terminal/node/terminalProcess.ts index 3a2b00a4a70..ab1589b4dcf 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcess.ts +++ b/src/vs/workbench/parts/terminal/node/terminalProcess.ts @@ -5,7 +5,7 @@ import * as os from 'os'; import * as path from 'path'; -import * as ptyJs from 'node-pty'; +import * as pty from 'node-pty'; // The pty process needs to be run in its own child process to get around maxing out CPU on Mac, // see https://github.com/electron/electron/issues/38 @@ -43,7 +43,7 @@ if (cols && rows) { options.rows = parseInt(rows, 10); } -var ptyProcess = ptyJs.fork(shell, args, options); +var ptyProcess = pty.fork(shell, args, options); var closeTimeout; var exitCode; From 6b69d77eb5d5f74d4db061a07db150a2c51eb982 Mon Sep 17 00:00:00 2001 From: rebornix Date: Wed, 10 May 2017 14:57:21 -0700 Subject: [PATCH 0911/1164] draft version --- .../contrib/find/browser/findWidget.css | 34 ++++++++---- .../editor/contrib/find/browser/findWidget.ts | 53 +++++++++++++++++-- 2 files changed, 73 insertions(+), 14 deletions(-) diff --git a/src/vs/editor/contrib/find/browser/findWidget.css b/src/vs/editor/contrib/find/browser/findWidget.css index 74d52635a45..f5b3f333204 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.css +++ b/src/vs/editor/contrib/find/browser/findWidget.css @@ -51,7 +51,9 @@ height: 64px; /* find input height + replace input height */ } .monaco-editor .find-widget.replaceToggled > .replace-part { - display: inline-block; + display: flex; + display: -webkit-flex; + align-items: center; } .monaco-editor .find-widget.visible, @@ -81,6 +83,9 @@ .monaco-editor .find-widget > .replace-part { margin: 4px 0 0 17px; font-size: 12px; + display: flex; + display: -webkit-flex; + align-items: center; } .monaco-editor .find-widget > .find-part .monaco-inputbox, @@ -95,8 +100,9 @@ } .monaco-editor .find-widget .monaco-findInput { - display: inline-block; vertical-align: middle; + display: flex; + flex:1; } .monaco-editor .find-widget .matchesCount { @@ -111,6 +117,7 @@ } .monaco-editor .find-widget .button { + min-width: 20px; width: 20px; height: 20px; display: inline-block; @@ -227,7 +234,8 @@ } .monaco-editor .find-widget > .replace-part > .replace-input { - display: inline-block; + display: flex; + flex:1; vertical-align: middle; } @@ -242,12 +250,9 @@ } /* NARROW (SMALLER THAN REDUCED) */ -.monaco-editor .find-widget.narrow-find-widget > .find-part .monaco-findInput, -.monaco-editor .find-widget.narrow-find-widget > .replace-part .replace-input { - width: 171px !important; -} -.monaco-editor .find-widget.narrow-find-widget > .find-part .monaco-inputbox > .wrapper > .input { - width: 105px !important; +.monaco-editor .find-widget.narrow-find-widget > .find-part, +.monaco-editor .find-widget.narrow-find-widget > .replace-part { + width: 240px !important; } /* COLLAPSED (SMALLER THAN NARROW) */ @@ -258,10 +263,14 @@ .monaco-editor .find-widget.collapsed-find-widget > .find-part .monaco-findInput .controls { display:none; } +.monaco-editor .find-widget.collapsed-find-widget > .find-part, +.monaco-editor .find-widget.collapsed-find-widget > .replace-part { + max-width: 94px !important; +} .monaco-editor .find-widget.collapsed-find-widget > .find-part .monaco-findInput, .monaco-editor .find-widget.collapsed-find-widget > .replace-part .replace-input, .monaco-editor .find-widget.collapsed-find-widget > .find-part .monaco-inputbox > .wrapper > .input { - width: 71px !important; + max-width: 71px !important; } .monaco-editor .findMatch { @@ -275,6 +284,11 @@ animation-name: inherit !important; } +.monaco-editor .find-widget .monaco-sash { + background: grey; + margin-left: -4px; +} + .monaco-editor.hc-black .find-widget .previous, .monaco-editor.vs-dark .find-widget .previous { background-image: url('images/previous-inverse.svg'); diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index 145453e625e..a36edf38b05 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -16,6 +16,7 @@ import { IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview import { FindInput, IFindInputStyles } from 'vs/base/browser/ui/findinput/findInput'; import { IMessage as InputBoxMessage, InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { Widget } from 'vs/base/browser/ui/widget'; +import { Sash, IHorizontalSashLayoutProvider, ISashEvent } from 'vs/base/browser/ui/sash/sash'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition, IViewZone, OverlayWidgetPositionPreference } from 'vs/editor/browser/editorBrowser'; import { FIND_IDS, MATCHES_LIMIT } from 'vs/editor/contrib/find/common/findModel'; @@ -68,7 +69,9 @@ export class FindWidgetViewZone implements IViewZone { } } -export class FindWidget extends Widget implements IOverlayWidget { + +export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSashLayoutProvider { + private static ID = 'editor.contrib.findWidget'; private static PART_WIDTH = 275; @@ -104,6 +107,8 @@ export class FindWidget extends Widget implements IOverlayWidget { private _viewZone: FindWidgetViewZone; private _viewZoneId: number; + private _resizeSash: Sash; + constructor( codeEditor: ICodeEditor, controller: IFindController, @@ -126,6 +131,26 @@ export class FindWidget extends Widget implements IOverlayWidget { this._register(this._state.addChangeListener((e) => this._onStateChanged(e))); this._buildDomNode(); + this._resizeSash = new Sash(this._domNode, this, { orientation: 0}); + let data: { startX: number; }; + let originalWidth = 411; + this._register(this._resizeSash.addListener('start', (e: ISashEvent) => { + data = { + startX: e.startX, + }; + originalWidth = dom.getTotalWidth(this._domNode); + })); + + this._register(this._resizeSash.addListener('end', () => { + data = undefined; + })); + + this._register(this._resizeSash.addListener('change', (evt: ISashEvent) => { + if (data) { + this._domNode.style.width = `${originalWidth + data.startX - evt.currentX}px`; + this._findInput.setWidth(FindWidget.FIND_INPUT_AREA_WIDTH + Math.max(0, data.startX - evt.currentX)); + } + })); this._updateButtons(); let checkEditorWidth = () => { @@ -134,18 +159,27 @@ export class FindWidget extends Widget implements IOverlayWidget { let collapsedFindWidget = false; let reducedFindWidget = false; let narrowFindWidget = false; - if (WIDGET_FIXED_WIDTH + 28 >= editorWidth + 50) { + let widgetWidth = Math.max(411, dom.getTotalWidth(this._domNode)) - 69; + if (widgetWidth + 28 >= editorWidth + 50) { collapsedFindWidget = true; } - if (WIDGET_FIXED_WIDTH + 28 >= editorWidth) { + if (widgetWidth + 28 >= editorWidth) { narrowFindWidget = true; } - if (WIDGET_FIXED_WIDTH + MAX_MATCHES_COUNT_WIDTH + 28 + minimapWidth >= editorWidth) { + if (widgetWidth + MAX_MATCHES_COUNT_WIDTH + 28 + minimapWidth >= editorWidth) { reducedFindWidget = true; } dom.toggleClass(this._domNode, 'collapsed-find-widget', collapsedFindWidget); dom.toggleClass(this._domNode, 'reduced-find-widget', reducedFindWidget); dom.toggleClass(this._domNode, 'narrow-find-widget', narrowFindWidget); + if (collapsedFindWidget) { + this._domNode.style.maxWidth = '111px'; + } else if (narrowFindWidget) { + this._domNode.style.maxWidth = '257px'; + } else { + this._domNode.style.maxWidth = `${editorWidth - 28 - minimapWidth - 15}px`; + } + }; checkEditorWidth(); @@ -552,6 +586,17 @@ export class FindWidget extends Widget implements IOverlayWidget { } } + // ----- sash + public getHorizontalSashTop(sash: Sash): number { + return 0; + } + public getHorizontalSashLeft?(sash: Sash): number { + return 0; + } + public getHorizontalSashWidth?(sash: Sash): number { + return 500; + } + // ----- initialization private _keybindingLabelFor(actionId: string): string { From 0ac843e30646244cb90a80d79d23ac618cff87ee Mon Sep 17 00:00:00 2001 From: rebornix Date: Thu, 11 May 2017 15:11:28 -0700 Subject: [PATCH 0912/1164] Flex Box --- .../contrib/find/browser/findWidget.css | 27 +++++++++++++------ .../editor/contrib/find/browser/findWidget.ts | 25 +++++++++++++---- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/vs/editor/contrib/find/browser/findWidget.css b/src/vs/editor/contrib/find/browser/findWidget.css index f5b3f333204..e974c6a83c7 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.css +++ b/src/vs/editor/contrib/find/browser/findWidget.css @@ -93,6 +93,10 @@ height: 25px; } +.monaco-editor .find-widget > .find-part .monaco-inputbox > .wrapper > .input { + width: 100% !important; + padding-right: 66px; +} .monaco-editor .find-widget > .find-part .monaco-inputbox > .wrapper > .input, .monaco-editor .find-widget > .replace-part .monaco-inputbox > .wrapper > .input { padding-top: 2px; @@ -106,7 +110,9 @@ } .monaco-editor .find-widget .matchesCount { - display: inline-block; + display: flex; + display: -webkit-flex; + flex: initial; margin: 0 1px 0 3px; padding: 2px 2px 0 2px; height: 25px; @@ -120,8 +126,9 @@ min-width: 20px; width: 20px; height: 20px; - display: inline-block; - vertical-align: middle; + display: flex; + display: -webkit-flex; + flex: initial; margin-left: 3px; background-position: center center; background-repeat: no-repeat; @@ -250,10 +257,10 @@ } /* NARROW (SMALLER THAN REDUCED) */ -.monaco-editor .find-widget.narrow-find-widget > .find-part, +/*.monaco-editor .find-widget.narrow-find-widget > .find-part, .monaco-editor .find-widget.narrow-find-widget > .replace-part { width: 240px !important; -} +}*/ /* COLLAPSED (SMALLER THAN NARROW) */ .monaco-editor .find-widget.collapsed-find-widget .button.previous, @@ -263,7 +270,11 @@ .monaco-editor .find-widget.collapsed-find-widget > .find-part .monaco-findInput .controls { display:none; } -.monaco-editor .find-widget.collapsed-find-widget > .find-part, + +.monaco-editor .find-widget.collapsed-find-widget > .find-part .monaco-inputbox > .wrapper > .input { + padding-right: 0px; +} +/*.monaco-editor .find-widget.collapsed-find-widget > .find-part, .monaco-editor .find-widget.collapsed-find-widget > .replace-part { max-width: 94px !important; } @@ -271,7 +282,7 @@ .monaco-editor .find-widget.collapsed-find-widget > .replace-part .replace-input, .monaco-editor .find-widget.collapsed-find-widget > .find-part .monaco-inputbox > .wrapper > .input { max-width: 71px !important; -} +}*/ .monaco-editor .findMatch { -webkit-animation-duration: 0; @@ -286,7 +297,7 @@ .monaco-editor .find-widget .monaco-sash { background: grey; - margin-left: -4px; + margin-left: -4px; } .monaco-editor.hc-black .find-widget .previous, diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index a36edf38b05..297d4fe6155 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -50,7 +50,6 @@ const NLS_MATCHES_LOCATION = nls.localize('label.matchesLocation', "{0} of {1}") const NLS_NO_RESULTS = nls.localize('label.noResults', "No Results"); let MAX_MATCHES_COUNT_WIDTH = 69; -const WIDGET_FIXED_WIDTH = 411 - 69; export class FindWidgetViewZone implements IViewZone { @@ -131,7 +130,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas this._register(this._state.addChangeListener((e) => this._onStateChanged(e))); this._buildDomNode(); - this._resizeSash = new Sash(this._domNode, this, { orientation: 0}); + this._resizeSash = new Sash(this._domNode, this, { orientation: 0 }); let data: { startX: number; }; let originalWidth = 411; this._register(this._resizeSash.addListener('start', (e: ISashEvent) => { @@ -147,8 +146,24 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas this._register(this._resizeSash.addListener('change', (evt: ISashEvent) => { if (data) { - this._domNode.style.width = `${originalWidth + data.startX - evt.currentX}px`; - this._findInput.setWidth(FindWidget.FIND_INPUT_AREA_WIDTH + Math.max(0, data.startX - evt.currentX)); + let reducedFindWidget = false; + let narrowFindWidget = false; + let collapsedFindWidget = false; + let width = originalWidth + data.startX - evt.currentX; + if (width < 411) { + reducedFindWidget = true; + } + if (width < 411 - 69) { + narrowFindWidget = true; + } + if (width < 265) { + collapsedFindWidget = true; + } + dom.toggleClass(this._domNode, 'collapsed-find-widget', collapsedFindWidget); + dom.toggleClass(this._domNode, 'narrow-find-widget', narrowFindWidget); + dom.toggleClass(this._domNode, 'reduced-find-widget', reducedFindWidget); + this._domNode.style.width = `${width}px`; + // this._findInput.setWidth(FindWidget.FIND_INPUT_AREA_WIDTH + Math.max(0, data.startX - evt.currentX)); } })); this._updateButtons(); @@ -170,8 +185,8 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas reducedFindWidget = true; } dom.toggleClass(this._domNode, 'collapsed-find-widget', collapsedFindWidget); - dom.toggleClass(this._domNode, 'reduced-find-widget', reducedFindWidget); dom.toggleClass(this._domNode, 'narrow-find-widget', narrowFindWidget); + dom.toggleClass(this._domNode, 'reduced-find-widget', reducedFindWidget); if (collapsedFindWidget) { this._domNode.style.maxWidth = '111px'; } else if (narrowFindWidget) { From 3f683632a38292903c96c51122f311ee9649b3ef Mon Sep 17 00:00:00 2001 From: rebornix Date: Wed, 24 May 2017 14:44:40 -0700 Subject: [PATCH 0913/1164] make input box responsive when widget or editor resizes --- .../contrib/find/browser/findWidget.css | 30 ++-- .../editor/contrib/find/browser/findWidget.ts | 155 ++++++++++-------- 2 files changed, 95 insertions(+), 90 deletions(-) diff --git a/src/vs/editor/contrib/find/browser/findWidget.css b/src/vs/editor/contrib/find/browser/findWidget.css index e974c6a83c7..0fdd4694549 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.css +++ b/src/vs/editor/contrib/find/browser/findWidget.css @@ -106,6 +106,7 @@ .monaco-editor .find-widget .monaco-findInput { vertical-align: middle; display: flex; + display: -webkit-flex; flex:1; } @@ -242,12 +243,9 @@ .monaco-editor .find-widget > .replace-part > .replace-input { display: flex; - flex:1; + display: -webkit-flex; vertical-align: middle; -} - -.monaco-editor .find-widget > .replace-part > .replace-input > .monaco-inputbox { - width: 100%; + width: auto !important; } /* REDUCED */ @@ -257,12 +255,15 @@ } /* NARROW (SMALLER THAN REDUCED) */ -/*.monaco-editor .find-widget.narrow-find-widget > .find-part, -.monaco-editor .find-widget.narrow-find-widget > .replace-part { - width: 240px !important; -}*/ +.monaco-editor .find-widget.narrow-find-widget { + max-width: 257px !important; +} /* COLLAPSED (SMALLER THAN NARROW) */ +.monaco-editor .find-widget.collapsed-find-widget { + max-width: 111px !important; +} + .monaco-editor .find-widget.collapsed-find-widget .button.previous, .monaco-editor .find-widget.collapsed-find-widget .button.next, .monaco-editor .find-widget.collapsed-find-widget .button.replace, @@ -274,15 +275,6 @@ .monaco-editor .find-widget.collapsed-find-widget > .find-part .monaco-inputbox > .wrapper > .input { padding-right: 0px; } -/*.monaco-editor .find-widget.collapsed-find-widget > .find-part, -.monaco-editor .find-widget.collapsed-find-widget > .replace-part { - max-width: 94px !important; -} -.monaco-editor .find-widget.collapsed-find-widget > .find-part .monaco-findInput, -.monaco-editor .find-widget.collapsed-find-widget > .replace-part .replace-input, -.monaco-editor .find-widget.collapsed-find-widget > .find-part .monaco-inputbox > .wrapper > .input { - max-width: 71px !important; -}*/ .monaco-editor .findMatch { -webkit-animation-duration: 0; @@ -296,7 +288,7 @@ } .monaco-editor .find-widget .monaco-sash { - background: grey; + width: 2px !important; margin-left: -4px; } diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index 297d4fe6155..74454a278ec 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -16,7 +16,7 @@ import { IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview import { FindInput, IFindInputStyles } from 'vs/base/browser/ui/findinput/findInput'; import { IMessage as InputBoxMessage, InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { Widget } from 'vs/base/browser/ui/widget'; -import { Sash, IHorizontalSashLayoutProvider, ISashEvent } from 'vs/base/browser/ui/sash/sash'; +import { Sash, IHorizontalSashLayoutProvider, ISashEvent, Orientation } from 'vs/base/browser/ui/sash/sash'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition, IViewZone, OverlayWidgetPositionPreference } from 'vs/editor/browser/editorBrowser'; import { FIND_IDS, MATCHES_LIMIT } from 'vs/editor/contrib/find/common/findModel'; @@ -29,6 +29,7 @@ import { Color } from 'vs/base/common/color'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; import { editorFindRangeHighlight, editorFindMatch, editorFindMatchHighlight, activeContrastBorder, contrastBorder, inputBackground, editorWidgetBackground, inputActiveOptionBorder, widgetShadow, inputForeground, inputBorder, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationErrorBackground, inputValidationErrorBorder, errorForeground } from 'vs/platform/theme/common/colorRegistry'; + export interface IFindController { replace(): void; replaceAll(): void; @@ -49,10 +50,19 @@ const NLS_MATCHES_COUNT_LIMIT_TITLE = nls.localize('title.matchesCountLimit', "O const NLS_MATCHES_LOCATION = nls.localize('label.matchesLocation', "{0} of {1}"); const NLS_NO_RESULTS = nls.localize('label.noResults', "No Results"); +const FIND_WIDGET_INITIAL_WIDTH = 411; +const PART_WIDTH = 275; +const FIND_INPUT_AREA_WIDTH = PART_WIDTH - 54; +const REPLACE_INPUT_AREA_WIDTH = FIND_INPUT_AREA_WIDTH; + let MAX_MATCHES_COUNT_WIDTH = 69; +let FIND_ALL_CONTROLS_WIDTH = 17/** Find Input margin-left */ + (MAX_MATCHES_COUNT_WIDTH + 3 + 1) /** Match Results */ + 23 /** Button */ * 4 + 2/** sash */; + +const FIND_INPUT_AREA_HEIGHT = 34; // The height of Find Widget when Replace Input is not visible. +const FIND_REPLACE_AREA_HEIGHT = 64; // The height of Find Widget when Replace Input is visible. + export class FindWidgetViewZone implements IViewZone { - public afterLineNumber: number; public heightInPx: number; public suppressMouseDown: boolean; @@ -61,24 +71,15 @@ export class FindWidgetViewZone implements IViewZone { constructor(afterLineNumber: number) { this.afterLineNumber = afterLineNumber; - this.heightInPx = 34; + this.heightInPx = FIND_INPUT_AREA_HEIGHT; this.suppressMouseDown = false; this.domNode = document.createElement('div'); this.domNode.className = 'dock-find-viewzone'; } } - export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSashLayoutProvider { - - - private static ID = 'editor.contrib.findWidget'; - private static PART_WIDTH = 275; - private static FIND_INPUT_AREA_WIDTH = FindWidget.PART_WIDTH - 54; - private static REPLACE_INPUT_AREA_WIDTH = FindWidget.FIND_INPUT_AREA_WIDTH; - private static FIND_INPUT_AREA_HEIGHT = 34; // The height of Find Widget when Replace Input is not visible. - private static FIND_REPLACE_AREA_HEIGHT = 64; // The height of Find Widget when Replace Input is visible. - + private static ID = 'editor.contrib.findWidget';; private _codeEditor: ICodeEditor; private _state: FindReplaceState; private _controller: IFindController; @@ -128,44 +129,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas this._isReplaceVisible = false; this._register(this._state.addChangeListener((e) => this._onStateChanged(e))); - this._buildDomNode(); - this._resizeSash = new Sash(this._domNode, this, { orientation: 0 }); - let data: { startX: number; }; - let originalWidth = 411; - this._register(this._resizeSash.addListener('start', (e: ISashEvent) => { - data = { - startX: e.startX, - }; - originalWidth = dom.getTotalWidth(this._domNode); - })); - - this._register(this._resizeSash.addListener('end', () => { - data = undefined; - })); - - this._register(this._resizeSash.addListener('change', (evt: ISashEvent) => { - if (data) { - let reducedFindWidget = false; - let narrowFindWidget = false; - let collapsedFindWidget = false; - let width = originalWidth + data.startX - evt.currentX; - if (width < 411) { - reducedFindWidget = true; - } - if (width < 411 - 69) { - narrowFindWidget = true; - } - if (width < 265) { - collapsedFindWidget = true; - } - dom.toggleClass(this._domNode, 'collapsed-find-widget', collapsedFindWidget); - dom.toggleClass(this._domNode, 'narrow-find-widget', narrowFindWidget); - dom.toggleClass(this._domNode, 'reduced-find-widget', reducedFindWidget); - this._domNode.style.width = `${width}px`; - // this._findInput.setWidth(FindWidget.FIND_INPUT_AREA_WIDTH + Math.max(0, data.startX - evt.currentX)); - } - })); this._updateButtons(); let checkEditorWidth = () => { @@ -174,27 +138,38 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas let collapsedFindWidget = false; let reducedFindWidget = false; let narrowFindWidget = false; - let widgetWidth = Math.max(411, dom.getTotalWidth(this._domNode)) - 69; - if (widgetWidth + 28 >= editorWidth + 50) { - collapsedFindWidget = true; + let widgetWidth = dom.getTotalWidth(this._domNode); + + if (widgetWidth > FIND_WIDGET_INITIAL_WIDTH) { + // as the widget is resized by users, we may need to change the max width of the widget as the editor width changes. + this._domNode.style.maxWidth = `${editorWidth - 28 - minimapWidth - 15}px`; + this._replaceInputBox.inputElement.style.width = `${dom.getTotalWidth(this._findInput.inputBox.inputElement)}px`; + return; } - if (widgetWidth + 28 >= editorWidth) { + + if (FIND_WIDGET_INITIAL_WIDTH + 28 + minimapWidth >= editorWidth) { + reducedFindWidget = true; + } + if (FIND_WIDGET_INITIAL_WIDTH + 28 + minimapWidth - MAX_MATCHES_COUNT_WIDTH >= editorWidth) { narrowFindWidget = true; } - if (widgetWidth + MAX_MATCHES_COUNT_WIDTH + 28 + minimapWidth >= editorWidth) { - reducedFindWidget = true; + if (FIND_WIDGET_INITIAL_WIDTH + 28 + minimapWidth - MAX_MATCHES_COUNT_WIDTH >= editorWidth + 50) { + collapsedFindWidget = true; } dom.toggleClass(this._domNode, 'collapsed-find-widget', collapsedFindWidget); dom.toggleClass(this._domNode, 'narrow-find-widget', narrowFindWidget); dom.toggleClass(this._domNode, 'reduced-find-widget', reducedFindWidget); - if (collapsedFindWidget) { - this._domNode.style.maxWidth = '111px'; - } else if (narrowFindWidget) { - this._domNode.style.maxWidth = '257px'; - } else { + + if (!narrowFindWidget && !collapsedFindWidget) { + // the minimal left offset of findwidget is 15px. this._domNode.style.maxWidth = `${editorWidth - 28 - minimapWidth - 15}px`; } + let findInputWidth = dom.getTotalWidth(this._findInput.inputBox.inputElement); + if (findInputWidth > 0) { + this._replaceInputBox.inputElement.style.width = `${findInputWidth}px`; + } + }; checkEditorWidth(); @@ -467,9 +442,9 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas this._codeEditor.changeViewZones((accessor) => { if (this._state.isReplaceRevealed) { - this._viewZone.heightInPx = FindWidget.FIND_REPLACE_AREA_HEIGHT; + this._viewZone.heightInPx = FIND_REPLACE_AREA_HEIGHT; } else { - this._viewZone.heightInPx = FindWidget.FIND_INPUT_AREA_HEIGHT; + this._viewZone.heightInPx = FIND_INPUT_AREA_HEIGHT; } this._viewZoneId = accessor.addZone(this._viewZone); @@ -483,19 +458,19 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas } this._codeEditor.changeViewZones((accessor) => { - let scrollAdjustment = FindWidget.FIND_INPUT_AREA_HEIGHT; + let scrollAdjustment = FIND_INPUT_AREA_HEIGHT; if (this._viewZoneId !== undefined) { if (this._state.isReplaceRevealed) { - this._viewZone.heightInPx = FindWidget.FIND_REPLACE_AREA_HEIGHT; - scrollAdjustment = FindWidget.FIND_REPLACE_AREA_HEIGHT - FindWidget.FIND_INPUT_AREA_HEIGHT; + this._viewZone.heightInPx = FIND_REPLACE_AREA_HEIGHT; + scrollAdjustment = FIND_REPLACE_AREA_HEIGHT - FIND_INPUT_AREA_HEIGHT; } else { - this._viewZone.heightInPx = FindWidget.FIND_INPUT_AREA_HEIGHT; - scrollAdjustment = FindWidget.FIND_INPUT_AREA_HEIGHT - FindWidget.FIND_REPLACE_AREA_HEIGHT; + this._viewZone.heightInPx = FIND_INPUT_AREA_HEIGHT; + scrollAdjustment = FIND_INPUT_AREA_HEIGHT - FIND_REPLACE_AREA_HEIGHT; } accessor.removeZone(this._viewZoneId); } else { - this._viewZone.heightInPx = FindWidget.FIND_INPUT_AREA_HEIGHT; + this._viewZone.heightInPx = FIND_INPUT_AREA_HEIGHT; } this._viewZoneId = accessor.addZone(this._viewZone); this._codeEditor.setScrollTop(this._codeEditor.getScrollTop() + scrollAdjustment); @@ -625,7 +600,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas private _buildFindPart(): HTMLElement { // Find input this._findInput = this._register(new FindInput(null, this._contextViewProvider, { - width: FindWidget.FIND_INPUT_AREA_WIDTH, + width: FIND_INPUT_AREA_WIDTH, label: NLS_FIND_INPUT_LABEL, placeholder: NLS_FIND_INPUT_PLACEHOLDER, appendCaseSensitiveLabel: this._keybindingLabelFor(FIND_IDS.ToggleCaseSensitiveCommand), @@ -751,7 +726,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas // Replace input let replaceInput = document.createElement('div'); replaceInput.className = 'replace-input'; - replaceInput.style.width = FindWidget.REPLACE_INPUT_AREA_WIDTH + 'px'; + replaceInput.style.width = REPLACE_INPUT_AREA_WIDTH + 'px'; this._replaceInputBox = this._register(new InputBox(replaceInput, null, { ariaLabel: NLS_REPLACE_INPUT_LABEL, placeholder: NLS_REPLACE_INPUT_PLACEHOLDER @@ -809,6 +784,9 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas className: 'toggle left', onTrigger: () => { this._state.change({ isReplaceRevealed: !this._isReplaceVisible }, false); + if (this._isReplaceVisible) { + this._replaceInputBox.width = this._findInput.inputBox.width; + } this._showViewZone(); }, onKeyDown: (e) => { } @@ -825,6 +803,36 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas this._domNode.appendChild(this._toggleReplaceBtn.domNode); this._domNode.appendChild(findPart); this._domNode.appendChild(replacePart); + + this._buildSash(); + } + + private _buildSash() { + this._resizeSash = new Sash(this._domNode, this, { orientation: Orientation.VERTICAL }); + let originalWidth = FIND_WIDGET_INITIAL_WIDTH; + + this._register(this._resizeSash.addListener('start', (e: ISashEvent) => { + originalWidth = dom.getTotalWidth(this._domNode); + })); + + this._register(this._resizeSash.addListener('change', (evt: ISashEvent) => { + let width = originalWidth + evt.startX - evt.currentX; + + if (width < FIND_WIDGET_INITIAL_WIDTH) { + // narrow down the find widget should be handled by CSS. + return; + } + + let inputBoxWidth = width - FIND_ALL_CONTROLS_WIDTH; + let maxWidth = parseFloat(dom.getComputedStyle(this._domNode).maxWidth) || 0; + if (width > maxWidth) { + return; + } + this._domNode.style.width = `${width}px`; + if (this._isReplaceVisible) { + this._replaceInputBox.width = inputBoxWidth; + } + })); } } @@ -1009,5 +1017,10 @@ registerThemingParticipant((theme, collector) => { if (error) { collector.addRule(`.monaco-editor .find-widget.no-results .matchesCount { color: ${error}; }`); } + + let border = theme.getColor('panel.border'); + if (border) { + collector.addRule(`.monaco-editor .find-widget .monaco-sash { background-color: ${border}; width: 2px !important; margin-left: -4px;}`); + } }); From 8e1714c81be3ffbed6491a707649df25487116e5 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 24 May 2017 23:49:51 +0200 Subject: [PATCH 0914/1164] Allow extensions to use theme colors in status bar --- src/vs/platform/statusbar/common/statusbar.ts | 3 ++- src/vs/vscode.d.ts | 2 +- .../electron-browser/mainThreadStatusBar.ts | 3 ++- src/vs/workbench/api/node/extHost.protocol.ts | 2 +- src/vs/workbench/api/node/extHostStatusBar.ts | 8 ++++---- .../browser/parts/statusbar/statusbarPart.ts | 18 +++++++++++++++--- 6 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/vs/platform/statusbar/common/statusbar.ts b/src/vs/platform/statusbar/common/statusbar.ts index 6e45f806115..d42f792b801 100644 --- a/src/vs/platform/statusbar/common/statusbar.ts +++ b/src/vs/platform/statusbar/common/statusbar.ts @@ -7,6 +7,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IDisposable } from 'vs/base/common/lifecycle'; +import { ThemeColor } from 'vs/editor/common/editorCommon'; export var IStatusbarService = createDecorator('statusbarService'); @@ -34,7 +35,7 @@ export interface IStatusbarEntry { /** * An optional color to use for the entry */ - color?: string; + color?: string | ThemeColor; /** * An optional id of a command that is known to the workbench to execute on click diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 4850740fec1..35a6a58cc03 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3301,7 +3301,7 @@ declare module 'vscode' { /** * The foreground color for this entry. */ - color: string | undefined; + color: string | ThemeColor | undefined; /** * The identifier of a command to run on click. The command must be diff --git a/src/vs/workbench/api/electron-browser/mainThreadStatusBar.ts b/src/vs/workbench/api/electron-browser/mainThreadStatusBar.ts index d64d9d3ac2b..d16e17cda09 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadStatusBar.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadStatusBar.ts @@ -7,6 +7,7 @@ import { IStatusbarService, StatusbarAlignment as MainThreadStatusBarAlignment } from 'vs/platform/statusbar/common/statusbar'; import { IDisposable } from 'vs/base/common/lifecycle'; import { MainThreadStatusBarShape } from '../node/extHost.protocol'; +import { ThemeColor } from 'vs/editor/common/editorCommon'; export class MainThreadStatusBar extends MainThreadStatusBarShape { private mapIdToDisposable: { [id: number]: IDisposable }; @@ -18,7 +19,7 @@ export class MainThreadStatusBar extends MainThreadStatusBarShape { this.mapIdToDisposable = Object.create(null); } - $setEntry(id: number, extensionId: string, text: string, tooltip: string, command: string, color: string, alignment: MainThreadStatusBarAlignment, priority: number): void { + $setEntry(id: number, extensionId: string, text: string, tooltip: string, command: string, color: string | ThemeColor, alignment: MainThreadStatusBarAlignment, priority: number): void { // Dispose any old this.$dispose(id); diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 1dbe9058048..f9c02d01d8c 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -277,7 +277,7 @@ export abstract class MainThreadQuickOpenShape { } export abstract class MainThreadStatusBarShape { - $setEntry(id: number, extensionId: string, text: string, tooltip: string, command: string, color: string, alignment: MainThreadStatusBarAlignment, priority: number): void { throw ni(); } + $setEntry(id: number, extensionId: string, text: string, tooltip: string, command: string, color: string | editorCommon.ThemeColor, alignment: MainThreadStatusBarAlignment, priority: number): void { throw ni(); } $dispose(id: number) { throw ni(); } } diff --git a/src/vs/workbench/api/node/extHostStatusBar.ts b/src/vs/workbench/api/node/extHostStatusBar.ts index 97c917caf51..6e91e7dbf9a 100644 --- a/src/vs/workbench/api/node/extHostStatusBar.ts +++ b/src/vs/workbench/api/node/extHostStatusBar.ts @@ -6,7 +6,7 @@ import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; import { StatusbarAlignment as MainThreadStatusBarAlignment } from 'vs/platform/statusbar/common/statusbar'; -import { StatusBarAlignment as ExtHostStatusBarAlignment, Disposable } from './extHostTypes'; +import { StatusBarAlignment as ExtHostStatusBarAlignment, Disposable, ThemeColor } from './extHostTypes'; import { StatusBarItem, StatusBarAlignment } from 'vscode'; import { MainContext, MainThreadStatusBarShape } from './extHost.protocol'; @@ -21,7 +21,7 @@ export class ExtHostStatusBarEntry implements StatusBarItem { private _text: string; private _tooltip: string; - private _color: string; + private _color: string | ThemeColor; private _command: string; private _timeoutHandle: number; @@ -57,7 +57,7 @@ export class ExtHostStatusBarEntry implements StatusBarItem { return this._tooltip; } - public get color(): string { + public get color(): string | ThemeColor { return this._color; } @@ -75,7 +75,7 @@ export class ExtHostStatusBarEntry implements StatusBarItem { this.update(); } - public set color(color: string) { + public set color(color: string | ThemeColor) { this._color = color; this.update(); } diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index 123f0f5d26e..fd2fd574fb4 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -30,6 +30,8 @@ import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } import { STATUS_BAR_BACKGROUND, STATUS_BAR_FOREGROUND, STATUS_BAR_NO_FOLDER_BACKGROUND, STATUS_BAR_ITEM_HOVER_BACKGROUND, STATUS_BAR_ITEM_ACTIVE_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_HOVER_BACKGROUND, STATUS_BAR_BORDER, STATUS_BAR_NO_FOLDER_FOREGROUND } from 'vs/workbench/common/theme'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { contrastBorder } from 'vs/platform/theme/common/colorRegistry'; +import { isThemeColor } from "vs/editor/common/editorCommon"; +import { Color } from 'vs/base/common/color'; export class StatusbarPart extends Part implements IStatusbarService { @@ -217,7 +219,8 @@ class StatusBarEntryItem implements IStatusbarItem { @IMessageService private messageService: IMessageService, @ITelemetryService private telemetryService: ITelemetryService, @IContextMenuService private contextMenuService: IContextMenuService, - @IWorkbenchEditorService private editorService: IWorkbenchEditorService + @IWorkbenchEditorService private editorService: IWorkbenchEditorService, + @IThemeService private themeService: IThemeService ) { this.entry = entry; @@ -249,8 +252,17 @@ class StatusBarEntryItem implements IStatusbarItem { } // Color - if (this.entry.color) { - $(textContainer).color(this.entry.color); + let color = this.entry.color; + if (color) { + if (isThemeColor(color)) { + let colorId = color.id; + color = (this.themeService.getTheme().getColor(colorId) || Color.transparent).toString(); + toDispose.push(this.themeService.onThemeChange(theme => { + let colorValue = (this.themeService.getTheme().getColor(colorId) || Color.transparent).toString(); + $(textContainer).color(colorValue); + })); + } + $(textContainer).color(color); } // Context Menu From 16dc0593147cc9ef17d8e75919a5116d21fd7835 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 24 May 2017 23:50:40 +0200 Subject: [PATCH 0915/1164] Fix deprecation warning on StyleSheet.insertRule --- src/vs/editor/browser/services/codeEditorServiceImpl.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index 703e6e4f0ee..26bc62e9e6a 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -316,15 +316,15 @@ class DecorationCSSRules { let hasContent = false; if (unthemedCSS.length > 0) { - sheet.insertRule(`${this._unThemedSelector} {${unthemedCSS}}`); + sheet.insertRule(`${this._unThemedSelector} {${unthemedCSS}}`, 0); hasContent = true; } if (lightCSS.length > 0) { - sheet.insertRule(`.vs${this._unThemedSelector} {${lightCSS}}`); + sheet.insertRule(`.vs${this._unThemedSelector} {${lightCSS}}`, 0); hasContent = true; } if (darkCSS.length > 0) { - sheet.insertRule(`.vs-dark${this._unThemedSelector}, .hc-black${this._unThemedSelector} {${darkCSS}}`); + sheet.insertRule(`.vs-dark${this._unThemedSelector}, .hc-black${this._unThemedSelector} {${darkCSS}}`, 0); hasContent = true; } this._hasContent = hasContent; From 50cc0f90677e2bcabe3346d9c67e8c12b5f56dec Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 24 May 2017 15:03:40 -0700 Subject: [PATCH 0916/1164] use alwaysStrict in TS extension --- extensions/typescript/src/features/baseCodeLensProvider.ts | 2 -- extensions/typescript/src/features/bufferSyncSupport.ts | 1 - extensions/typescript/src/features/codeActionProvider.ts | 2 -- extensions/typescript/src/features/completionItemProvider.ts | 2 -- extensions/typescript/src/features/definitionProvider.ts | 2 -- extensions/typescript/src/features/definitionProviderBase.ts | 2 -- .../src/features/directiveCommentCompletionProvider.ts | 2 -- .../typescript/src/features/documentHighlightProvider.ts | 2 -- extensions/typescript/src/features/documentSymbolProvider.ts | 2 -- extensions/typescript/src/features/formattingProvider.ts | 2 -- extensions/typescript/src/features/hoverProvider.ts | 2 -- extensions/typescript/src/features/implementationProvider.ts | 2 -- .../src/features/implementationsCodeLensProvider.ts | 2 -- extensions/typescript/src/features/jsDocCompletionProvider.ts | 2 -- extensions/typescript/src/features/previewer.ts | 2 -- extensions/typescript/src/features/referenceProvider.ts | 2 -- .../typescript/src/features/referencesCodeLensProvider.ts | 2 -- extensions/typescript/src/features/renameProvider.ts | 2 -- extensions/typescript/src/features/signatureHelpProvider.ts | 2 -- extensions/typescript/src/features/typeDefinitionProvider.ts | 2 -- extensions/typescript/src/features/workspaceSymbolProvider.ts | 2 -- extensions/typescript/src/protocol.const.ts | 2 -- extensions/typescript/src/typescriptMain.ts | 1 - extensions/typescript/src/typescriptService.ts | 1 - extensions/typescript/src/typescriptServiceClient.ts | 2 -- extensions/typescript/src/utils/async.ts | 2 -- extensions/typescript/src/utils/buildStatus.ts | 2 -- extensions/typescript/src/utils/electron.ts | 2 -- extensions/typescript/src/utils/is.ts | 2 -- extensions/typescript/src/utils/logger.ts | 2 -- extensions/typescript/src/utils/plugins.ts | 1 - extensions/typescript/src/utils/projectStatus.ts | 2 -- extensions/typescript/src/utils/telemetry.ts | 2 -- extensions/typescript/src/utils/tracer.ts | 2 -- extensions/typescript/src/utils/typingsStatus.ts | 2 -- extensions/typescript/src/utils/versionStatus.ts | 2 -- extensions/typescript/src/utils/wireProtocol.ts | 2 -- extensions/typescript/tsconfig.json | 4 +++- 38 files changed, 3 insertions(+), 71 deletions(-) diff --git a/extensions/typescript/src/features/baseCodeLensProvider.ts b/extensions/typescript/src/features/baseCodeLensProvider.ts index 98e4de9cc1c..20952150c4b 100644 --- a/extensions/typescript/src/features/baseCodeLensProvider.ts +++ b/extensions/typescript/src/features/baseCodeLensProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { CodeLensProvider, CodeLens, CancellationToken, TextDocument, Range, Uri, Position, Event, EventEmitter, ProviderResult, } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/features/bufferSyncSupport.ts b/extensions/typescript/src/features/bufferSyncSupport.ts index dfb32d759da..f2b11faebef 100644 --- a/extensions/typescript/src/features/bufferSyncSupport.ts +++ b/extensions/typescript/src/features/bufferSyncSupport.ts @@ -2,7 +2,6 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; import * as cp from 'child_process'; import * as fs from 'fs'; diff --git a/extensions/typescript/src/features/codeActionProvider.ts b/extensions/typescript/src/features/codeActionProvider.ts index 0a9d297987c..8f0dd56f01d 100644 --- a/extensions/typescript/src/features/codeActionProvider.ts +++ b/extensions/typescript/src/features/codeActionProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { CodeActionProvider, TextDocument, Range, CancellationToken, CodeActionContext, Command, commands, Uri, workspace, WorkspaceEdit, TextEdit, FormattingOptions, window, ProviderResult } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/features/completionItemProvider.ts b/extensions/typescript/src/features/completionItemProvider.ts index 618c84174bc..5f0740be10c 100644 --- a/extensions/typescript/src/features/completionItemProvider.ts +++ b/extensions/typescript/src/features/completionItemProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { CompletionItem, TextDocument, Position, CompletionItemKind, CompletionItemProvider, CancellationToken, TextEdit, Range, SnippetString, workspace, ProviderResult } from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; diff --git a/extensions/typescript/src/features/definitionProvider.ts b/extensions/typescript/src/features/definitionProvider.ts index ee364a63614..2713fc603db 100644 --- a/extensions/typescript/src/features/definitionProvider.ts +++ b/extensions/typescript/src/features/definitionProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { DefinitionProvider, TextDocument, Position, CancellationToken, Definition } from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; diff --git a/extensions/typescript/src/features/definitionProviderBase.ts b/extensions/typescript/src/features/definitionProviderBase.ts index 3cf66901015..b405d28fbaf 100644 --- a/extensions/typescript/src/features/definitionProviderBase.ts +++ b/extensions/typescript/src/features/definitionProviderBase.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { TextDocument, Position, Range, CancellationToken, Location } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/features/directiveCommentCompletionProvider.ts b/extensions/typescript/src/features/directiveCommentCompletionProvider.ts index a334e8c2f7b..6dd8aa8418d 100644 --- a/extensions/typescript/src/features/directiveCommentCompletionProvider.ts +++ b/extensions/typescript/src/features/directiveCommentCompletionProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { Position, CompletionItemProvider, CompletionItemKind, TextDocument, CancellationToken, CompletionItem, ProviderResult, Range } from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; diff --git a/extensions/typescript/src/features/documentHighlightProvider.ts b/extensions/typescript/src/features/documentHighlightProvider.ts index afffc9fa60c..f0140953d92 100644 --- a/extensions/typescript/src/features/documentHighlightProvider.ts +++ b/extensions/typescript/src/features/documentHighlightProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { DocumentHighlightProvider, DocumentHighlight, DocumentHighlightKind, TextDocument, Position, Range, CancellationToken } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/features/documentSymbolProvider.ts b/extensions/typescript/src/features/documentSymbolProvider.ts index 5d4a8595a37..aa6a4e5ab7f 100644 --- a/extensions/typescript/src/features/documentSymbolProvider.ts +++ b/extensions/typescript/src/features/documentSymbolProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { DocumentSymbolProvider, SymbolInformation, SymbolKind, TextDocument, Range, Location, CancellationToken, Uri } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/features/formattingProvider.ts b/extensions/typescript/src/features/formattingProvider.ts index 77f6971201e..40b5522d0fa 100644 --- a/extensions/typescript/src/features/formattingProvider.ts +++ b/extensions/typescript/src/features/formattingProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { workspace as Workspace, DocumentRangeFormattingEditProvider, OnTypeFormattingEditProvider, FormattingOptions, TextDocument, Position, Range, CancellationToken, TextEdit, WorkspaceConfiguration } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/features/hoverProvider.ts b/extensions/typescript/src/features/hoverProvider.ts index 75d36131baf..e726ff1dc34 100644 --- a/extensions/typescript/src/features/hoverProvider.ts +++ b/extensions/typescript/src/features/hoverProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { HoverProvider, Hover, TextDocument, Position, Range, CancellationToken } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/features/implementationProvider.ts b/extensions/typescript/src/features/implementationProvider.ts index 452afad1033..ab4d5b8c45b 100644 --- a/extensions/typescript/src/features/implementationProvider.ts +++ b/extensions/typescript/src/features/implementationProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { ImplementationProvider, TextDocument, Position, CancellationToken, Definition } from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; diff --git a/extensions/typescript/src/features/implementationsCodeLensProvider.ts b/extensions/typescript/src/features/implementationsCodeLensProvider.ts index 793176bb4f6..30daa644a4e 100644 --- a/extensions/typescript/src/features/implementationsCodeLensProvider.ts +++ b/extensions/typescript/src/features/implementationsCodeLensProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { CodeLens, CancellationToken, TextDocument, Range, Location, ProviderResult, workspace } from 'vscode'; import * as Proto from '../protocol'; import * as PConst from '../protocol.const'; diff --git a/extensions/typescript/src/features/jsDocCompletionProvider.ts b/extensions/typescript/src/features/jsDocCompletionProvider.ts index fc8e88d5df2..da02e942bfc 100644 --- a/extensions/typescript/src/features/jsDocCompletionProvider.ts +++ b/extensions/typescript/src/features/jsDocCompletionProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { Position, Range, CompletionItemProvider, CompletionItemKind, TextDocument, CancellationToken, CompletionItem, window, Uri, ProviderResult, TextEditor, SnippetString, workspace } from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; diff --git a/extensions/typescript/src/features/previewer.ts b/extensions/typescript/src/features/previewer.ts index d02ab69550b..c418e92d59a 100644 --- a/extensions/typescript/src/features/previewer.ts +++ b/extensions/typescript/src/features/previewer.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import * as Proto from '../protocol'; export function plain(parts: Proto.SymbolDisplayPart[]): string { diff --git a/extensions/typescript/src/features/referenceProvider.ts b/extensions/typescript/src/features/referenceProvider.ts index 56aac3a0cd8..47921d128ea 100644 --- a/extensions/typescript/src/features/referenceProvider.ts +++ b/extensions/typescript/src/features/referenceProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { ReferenceProvider, Location, TextDocument, Position, Range, CancellationToken } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/features/referencesCodeLensProvider.ts b/extensions/typescript/src/features/referencesCodeLensProvider.ts index 46ecf347e72..5576bfc4825 100644 --- a/extensions/typescript/src/features/referencesCodeLensProvider.ts +++ b/extensions/typescript/src/features/referencesCodeLensProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { CodeLens, CancellationToken, TextDocument, Range, Location, ProviderResult, workspace } from 'vscode'; import * as Proto from '../protocol'; import * as PConst from '../protocol.const'; diff --git a/extensions/typescript/src/features/renameProvider.ts b/extensions/typescript/src/features/renameProvider.ts index da279ab5596..39c85f307a7 100644 --- a/extensions/typescript/src/features/renameProvider.ts +++ b/extensions/typescript/src/features/renameProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { RenameProvider, WorkspaceEdit, TextDocument, Position, Range, CancellationToken } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/features/signatureHelpProvider.ts b/extensions/typescript/src/features/signatureHelpProvider.ts index b8247e03154..0a794878624 100644 --- a/extensions/typescript/src/features/signatureHelpProvider.ts +++ b/extensions/typescript/src/features/signatureHelpProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { SignatureHelpProvider, SignatureHelp, SignatureInformation, ParameterInformation, TextDocument, Position, CancellationToken } from 'vscode'; import * as Previewer from './previewer'; diff --git a/extensions/typescript/src/features/typeDefinitionProvider.ts b/extensions/typescript/src/features/typeDefinitionProvider.ts index edaccf0bf33..d107f67580a 100644 --- a/extensions/typescript/src/features/typeDefinitionProvider.ts +++ b/extensions/typescript/src/features/typeDefinitionProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { TypeDefinitionProvider, TextDocument, Position, CancellationToken, Definition } from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; diff --git a/extensions/typescript/src/features/workspaceSymbolProvider.ts b/extensions/typescript/src/features/workspaceSymbolProvider.ts index 8593c4a8955..016ac8726b3 100644 --- a/extensions/typescript/src/features/workspaceSymbolProvider.ts +++ b/extensions/typescript/src/features/workspaceSymbolProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { workspace, window, Uri, WorkspaceSymbolProvider, SymbolInformation, SymbolKind, Range, Location, CancellationToken } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/protocol.const.ts b/extensions/typescript/src/protocol.const.ts index 6990868683d..822e05d2b21 100644 --- a/extensions/typescript/src/protocol.const.ts +++ b/extensions/typescript/src/protocol.const.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - export class Kind { public static readonly alias = 'alias'; public static readonly callSignature = 'call'; diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index 037ae6f8464..45ba3a85290 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -7,7 +7,6 @@ * Includes code from typescript-sublime-plugin project, obtained from * https://github.com/Microsoft/TypeScript-Sublime-Plugin/blob/master/TypeScript%20Indent.tmPreferences * ------------------------------------------------------------------------------------------ */ -'use strict'; import { env, languages, commands, workspace, window, ExtensionContext, Memento, IndentAction, Diagnostic, DiagnosticCollection, Range, Disposable, Uri, MessageItem, TextEditor, DiagnosticSeverity, TextDocument, SnippetString } from 'vscode'; diff --git a/extensions/typescript/src/typescriptService.ts b/extensions/typescript/src/typescriptService.ts index bfc410c6cba..8b15cc79f7b 100644 --- a/extensions/typescript/src/typescriptService.ts +++ b/extensions/typescript/src/typescriptService.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; import { CancellationToken, Uri, Event } from 'vscode'; import * as Proto from './protocol'; diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index f5a92dbd4cd..cf2b7c3be6f 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import * as cp from 'child_process'; import * as path from 'path'; import * as fs from 'fs'; diff --git a/extensions/typescript/src/utils/async.ts b/extensions/typescript/src/utils/async.ts index fb260bde50b..f87754e69e8 100644 --- a/extensions/typescript/src/utils/async.ts +++ b/extensions/typescript/src/utils/async.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - export interface ITask { (): T; } diff --git a/extensions/typescript/src/utils/buildStatus.ts b/extensions/typescript/src/utils/buildStatus.ts index cf640508af3..ced56fd43b9 100644 --- a/extensions/typescript/src/utils/buildStatus.ts +++ b/extensions/typescript/src/utils/buildStatus.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import vscode = require('vscode'); const statusItem: vscode.StatusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, Number.MIN_VALUE); diff --git a/extensions/typescript/src/utils/electron.ts b/extensions/typescript/src/utils/electron.ts index 51c44519891..4418ca51dbd 100644 --- a/extensions/typescript/src/utils/electron.ts +++ b/extensions/typescript/src/utils/electron.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import path = require('path'); import os = require('os'); import net = require('net'); diff --git a/extensions/typescript/src/utils/is.ts b/extensions/typescript/src/utils/is.ts index 78ef8c734cd..fc6fd6ad286 100644 --- a/extensions/typescript/src/utils/is.ts +++ b/extensions/typescript/src/utils/is.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - const toString = Object.prototype.toString; export function defined(value: any): boolean { diff --git a/extensions/typescript/src/utils/logger.ts b/extensions/typescript/src/utils/logger.ts index 577314c351d..7f82fb28c96 100644 --- a/extensions/typescript/src/utils/logger.ts +++ b/extensions/typescript/src/utils/logger.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { OutputChannel, window } from "vscode"; import * as is from './is'; diff --git a/extensions/typescript/src/utils/plugins.ts b/extensions/typescript/src/utils/plugins.ts index 24fb56e99b7..49f0d93b4b6 100644 --- a/extensions/typescript/src/utils/plugins.ts +++ b/extensions/typescript/src/utils/plugins.ts @@ -2,7 +2,6 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; import { extensions } from "vscode"; diff --git a/extensions/typescript/src/utils/projectStatus.ts b/extensions/typescript/src/utils/projectStatus.ts index f6042d29449..8c9911531eb 100644 --- a/extensions/typescript/src/utils/projectStatus.ts +++ b/extensions/typescript/src/utils/projectStatus.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import * as vscode from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; import { loadMessageBundle } from 'vscode-nls'; diff --git a/extensions/typescript/src/utils/telemetry.ts b/extensions/typescript/src/utils/telemetry.ts index 17c43339a9e..5162a0c24d5 100644 --- a/extensions/typescript/src/utils/telemetry.ts +++ b/extensions/typescript/src/utils/telemetry.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import * as path from 'path'; import VsCodeTelemetryReporter from 'vscode-extension-telemetry'; import { Disposable } from "vscode"; diff --git a/extensions/typescript/src/utils/tracer.ts b/extensions/typescript/src/utils/tracer.ts index 078d2e6f45a..fe16a13d61a 100644 --- a/extensions/typescript/src/utils/tracer.ts +++ b/extensions/typescript/src/utils/tracer.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { workspace } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/utils/typingsStatus.ts b/extensions/typescript/src/utils/typingsStatus.ts index 4798046abf6..44f90ec15c1 100644 --- a/extensions/typescript/src/utils/typingsStatus.ts +++ b/extensions/typescript/src/utils/typingsStatus.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { MessageItem, workspace, Disposable, ProgressLocation, window, commands, Uri } from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; import { loadMessageBundle } from 'vscode-nls'; diff --git a/extensions/typescript/src/utils/versionStatus.ts b/extensions/typescript/src/utils/versionStatus.ts index 358d3a9b103..e92b87d0f24 100644 --- a/extensions/typescript/src/utils/versionStatus.ts +++ b/extensions/typescript/src/utils/versionStatus.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import vscode = require('vscode'); const versionBarEntry = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, Number.MIN_VALUE); diff --git a/extensions/typescript/src/utils/wireProtocol.ts b/extensions/typescript/src/utils/wireProtocol.ts index 218d461f853..ad5d464304d 100644 --- a/extensions/typescript/src/utils/wireProtocol.ts +++ b/extensions/typescript/src/utils/wireProtocol.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import stream = require('stream'); const DefaultSize: number = 8192; diff --git a/extensions/typescript/tsconfig.json b/extensions/typescript/tsconfig.json index 3112725c103..da4f1bb399b 100644 --- a/extensions/typescript/tsconfig.json +++ b/extensions/typescript/tsconfig.json @@ -11,7 +11,9 @@ "noImplicitAny": true, "noImplicitReturns": true, "noUnusedLocals": true, - "noUnusedParameters": true + "noUnusedParameters": true, + "strict": true, + "alwaysStrict": true }, "include": [ "src/**/*" From d167cf370f36299a4af5d50b2ae33c5227242389 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 24 May 2017 15:07:43 -0700 Subject: [PATCH 0917/1164] Add restart TSServer command. Fixes #22335 --- extensions/typescript/package.json | 5 +++++ extensions/typescript/package.nls.json | 1 + extensions/typescript/src/typescriptMain.ts | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/extensions/typescript/package.json b/extensions/typescript/package.json index cb4fa518bf0..a24c0c10519 100644 --- a/extensions/typescript/package.json +++ b/extensions/typescript/package.json @@ -345,6 +345,11 @@ "command": "typescript.openTsServerLog", "title": "%typescript.openTsServerLog.title%", "category": "TypeScript" + }, + { + "command": "typescript.restartTsServer", + "title": "%typescript.restartTsServer%", + "category": "TypeScript" } ], "menus": { diff --git a/extensions/typescript/package.nls.json b/extensions/typescript/package.nls.json index faa59a26d7f..821257b38a1 100644 --- a/extensions/typescript/package.nls.json +++ b/extensions/typescript/package.nls.json @@ -32,6 +32,7 @@ "typescript.referencesCodeLens.enabled": "Enable/disable references CodeLens in TypeScript files. Requires TypeScript >= 2.0.6.", "typescript.implementationsCodeLens.enabled": "Enable/disable implementations CodeLens. Requires TypeScript >= 2.2.0.", "typescript.openTsServerLog.title": "Open TS Server log", + "typescript.restartTsServer": "Restart TS server", "typescript.selectTypeScriptVersion.title": "Select TypeScript Version", "jsDocCompletion.enabled": "Enable/disable auto JSDoc comments", "javascript.implicitProjectConfig.checkJs": "Enable/disable semantic checking of JavaScript files. Existing jsconfig.json or tsconfig.json files override this setting. Requires TypeScript >=2.3.1.", diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index 45ba3a85290..9949d0db9d2 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -109,6 +109,10 @@ export function activate(context: ExtensionContext): void { client.openTsServerLogFile(); })); + context.subscriptions.push(commands.registerCommand('typescript.restartTsServer', () => { + client.restartTsServer(); + })); + const goToProjectConfig = (isTypeScript: boolean) => { const editor = window.activeTextEditor; if (editor) { From c77ae5912b43aa69be1cbbc6f5dc53e43bc043dd Mon Sep 17 00:00:00 2001 From: rebornix Date: Wed, 24 May 2017 15:11:57 -0700 Subject: [PATCH 0918/1164] Fix #27144. We just need to listen to scrollTop change for FindWidget --- src/vs/editor/contrib/find/browser/findWidget.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index 74454a278ec..78e442c6992 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -235,7 +235,9 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas })); this._register(this._codeEditor.onDidScrollChange((e) => { - this._layoutViewZone(); + if (e.scrollTopChanged) { + this._layoutViewZone(); + } })); } From c35b4b42900a7d100fa8ed8f24ac0e75adca418b Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 24 May 2017 16:43:49 +0200 Subject: [PATCH 0919/1164] Introduce `multicursorModifier` editor options --- .../common/config/commonEditorConfig.ts | 6 ++++ src/vs/editor/common/config/editorOptions.ts | 34 +++++++++++++++++++ src/vs/monaco.d.ts | 7 ++++ 3 files changed, 47 insertions(+) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 6fca4c237d0..bf24f6608be 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -321,6 +321,12 @@ const editorConfiguration: IConfigurationNode = { 'default': EDITOR_DEFAULTS.viewInfo.scrollbar.mouseWheelScrollSensitivity, 'description': nls.localize('mouseWheelScrollSensitivity', "A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events") }, + 'editor.multicursorModifier': { + 'type': 'string', + 'enum': (platform.isMacintosh ? ['cmd', 'alt'] : ['ctrl', 'alt']), + 'default': 'alt', + 'description': nls.localize('multicursorModifier', "The modifier to be used to add multiple cursors with the mouse.") + }, 'editor.quickSuggestions': { 'anyOf': [ { diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 59056ff8227..720302d227e 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -331,6 +331,11 @@ export interface IEditorOptions { * Defaults to 1. */ mouseWheelScrollSensitivity?: number; + /** + * The modifier to be used to add multiple cursors with the mouse. + * Defaults to 'alt' + */ + multicursorModifier?: 'cmd' | 'ctrl' | 'alt'; /** * Enable quick suggestions (shadow suggestions) * Defaults to true. @@ -783,6 +788,7 @@ export interface IValidatedEditorOptions { readonly dragAndDrop: boolean; readonly emptySelectionClipboard: boolean; readonly useTabStops: boolean; + readonly multicursorModifier: 'altKey' | 'ctrlKey' | 'metaKey'; readonly viewInfo: InternalEditorViewOptions; readonly contribInfo: EditorContribOptions; @@ -803,6 +809,7 @@ export class InternalEditorOptions { * @internal */ readonly accessibilitySupport: platform.AccessibilitySupport; + readonly multicursorModifier: 'altKey' | 'ctrlKey' | 'metaKey'; // ---- cursor options readonly wordSeparators: string; @@ -829,6 +836,7 @@ export class InternalEditorOptions { lineHeight: number; readOnly: boolean; accessibilitySupport: platform.AccessibilitySupport; + multicursorModifier: 'altKey' | 'ctrlKey' | 'metaKey'; wordSeparators: string; autoClosingBrackets: boolean; useTabStops: boolean; @@ -847,6 +855,7 @@ export class InternalEditorOptions { this.lineHeight = source.lineHeight | 0; this.readOnly = source.readOnly; this.accessibilitySupport = source.accessibilitySupport; + this.multicursorModifier = source.multicursorModifier; this.wordSeparators = source.wordSeparators; this.autoClosingBrackets = source.autoClosingBrackets; this.useTabStops = source.useTabStops; @@ -871,6 +880,7 @@ export class InternalEditorOptions { && this.lineHeight === other.lineHeight && this.readOnly === other.readOnly && this.accessibilitySupport === other.accessibilitySupport + && this.multicursorModifier === other.multicursorModifier && this.wordSeparators === other.wordSeparators && this.autoClosingBrackets === other.autoClosingBrackets && this.useTabStops === other.useTabStops @@ -896,6 +906,7 @@ export class InternalEditorOptions { lineHeight: (this.lineHeight !== newOpts.lineHeight), readOnly: (this.readOnly !== newOpts.readOnly), accessibilitySupport: (this.accessibilitySupport !== newOpts.accessibilitySupport), + multicursorModifier: (this.multicursorModifier !== newOpts.multicursorModifier), wordSeparators: (this.wordSeparators !== newOpts.wordSeparators), autoClosingBrackets: (this.autoClosingBrackets !== newOpts.autoClosingBrackets), useTabStops: (this.useTabStops !== newOpts.useTabStops), @@ -1233,6 +1244,7 @@ export interface IConfigurationChangedEvent { readonly lineHeight: boolean; readonly readOnly: boolean; readonly accessibilitySupport: boolean; + readonly multicursorModifier: boolean; readonly wordSeparators: boolean; readonly autoClosingBrackets: boolean; readonly useTabStops: boolean; @@ -1386,6 +1398,24 @@ export class EditorOptionsValidator { const viewInfo = this._sanitizeViewInfo(opts, defaults.viewInfo); const contribInfo = this._sanitizeContribInfo(opts, defaults.contribInfo); + let configuredMulticursorModifier: 'altKey' | 'metaKey' | 'ctrlKey'; + if (typeof opts.multicursorModifier === 'string') { + if (platform.isMacintosh) { + if (opts.multicursorModifier === 'cmd') { + configuredMulticursorModifier = 'metaKey'; + } else { + configuredMulticursorModifier = 'altKey'; + } + } else { + if (opts.multicursorModifier === 'ctrl') { + configuredMulticursorModifier = 'ctrlKey'; + } else { + configuredMulticursorModifier = 'altKey'; + } + } + } + const multicursorModifier = _stringSet<'altKey' | 'metaKey' | 'ctrlKey'>(configuredMulticursorModifier, defaults.multicursorModifier, ['altKey', 'metaKey', 'ctrlKey']); + return { inDiffEditor: _boolean(opts.inDiffEditor, defaults.inDiffEditor), wordSeparators: _string(opts.wordSeparators, defaults.wordSeparators), @@ -1406,6 +1436,7 @@ export class EditorOptionsValidator { dragAndDrop: _boolean(opts.dragAndDrop, defaults.dragAndDrop), emptySelectionClipboard: _boolean(opts.emptySelectionClipboard, defaults.emptySelectionClipboard), useTabStops: _boolean(opts.useTabStops, defaults.useTabStops), + multicursorModifier: multicursorModifier, viewInfo: viewInfo, contribInfo: contribInfo, }; @@ -1629,6 +1660,7 @@ export class InternalEditorOptionsFactory { dragAndDrop: opts.dragAndDrop, emptySelectionClipboard: opts.emptySelectionClipboard, useTabStops: opts.useTabStops, + multicursorModifier: opts.multicursorModifier, viewInfo: { extraEditorClassName: opts.viewInfo.extraEditorClassName, @@ -1805,6 +1837,7 @@ export class InternalEditorOptionsFactory { lineHeight: env.fontInfo.lineHeight, readOnly: opts.readOnly, accessibilitySupport: env.accessibilitySupport, + multicursorModifier: opts.multicursorModifier, wordSeparators: opts.wordSeparators, autoClosingBrackets: opts.autoClosingBrackets, useTabStops: opts.useTabStops, @@ -2023,6 +2056,7 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { dragAndDrop: false, emptySelectionClipboard: true, useTabStops: true, + multicursorModifier: 'altKey', viewInfo: { extraEditorClassName: '', diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 707cb1047fa..7f3c80b83fa 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -2876,6 +2876,11 @@ declare module monaco.editor { * Defaults to 1. */ mouseWheelScrollSensitivity?: number; + /** + * The modifier to be used to add multiple cursors with the mouse. + * Defaults to 'alt' + */ + multicursorModifier?: 'cmd' | 'ctrl' | 'alt'; /** * Enable quick suggestions (shadow suggestions) * Defaults to true. @@ -3257,6 +3262,7 @@ declare module monaco.editor { readonly editorClassName: string; readonly lineHeight: number; readonly readOnly: boolean; + readonly multicursorModifier: 'altKey' | 'ctrlKey' | 'metaKey'; readonly wordSeparators: string; readonly autoClosingBrackets: boolean; readonly useTabStops: boolean; @@ -3388,6 +3394,7 @@ declare module monaco.editor { readonly lineHeight: boolean; readonly readOnly: boolean; readonly accessibilitySupport: boolean; + readonly multicursorModifier: boolean; readonly wordSeparators: boolean; readonly autoClosingBrackets: boolean; readonly useTabStops: boolean; From fd021256871b0434559bc4443a3872ec58e9095f Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 24 May 2017 17:35:55 +0200 Subject: [PATCH 0920/1164] Encapsulate trigger modifier logic in goToDeclarationMouse --- .../browser/goToDeclarationMouse.ts | 81 +++++++++++++------ 1 file changed, 58 insertions(+), 23 deletions(-) diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts index 05aecd1ec0f..15ccefb5d73 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts @@ -30,6 +30,40 @@ import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegist import { EditorState, CodeEditorStateFlag } from 'vs/editor/common/core/editorState'; import { DefinitionAction, DefinitionActionConfig } from './goToDeclarationCommands'; +/** + * An event that encapsulates the various trigger modifiers logic needed for go to definition. + */ +class MyMouseEvent { + + public readonly target: IMouseTarget; + public readonly hasTriggerModifier: boolean; + public readonly hasSideBySideModifier: boolean; + public readonly isSingleMouseDown: boolean; + + constructor(source: IEditorMouseEvent) { + this.target = source.target; + this.hasTriggerModifier = !!source.event[GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER]; + this.hasSideBySideModifier = source.event.altKey; + this.isSingleMouseDown = (browser.isIE || source.event.detail <= 1); // IE does not support event.detail properly + } +} + +/** + * An event that encapsulates the various trigger modifiers logic needed for go to definition. + */ +class MyKeyboardEvent { + + public readonly keyCodeIsTriggerKey: boolean; + public readonly keyCodeIsSideBySideKey: boolean; + public readonly hasTriggerModifier: boolean; + + constructor(source: IKeyboardEvent) { + this.keyCodeIsTriggerKey = (source.keyCode === GotoDefinitionWithMouseEditorContribution.TRIGGER_KEY_VALUE); + this.keyCodeIsSideBySideKey = (source.keyCode === GotoDefinitionWithMouseEditorContribution.TRIGGER_SIDEBYSIDE_KEY_VALUE); + this.hasTriggerModifier = !!source[GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER]; + } +} + @editorContribution class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorContribution { @@ -44,7 +78,7 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC private decorations: string[]; private currentWordUnderMouse: editorCommon.IWordAtPosition; private throttler: Throttler; - private lastMouseMoveEvent: IEditorMouseEvent; + private lastMouseMoveEvent: MyMouseEvent; private hasTriggerKeyOnMouseDown: boolean; constructor( @@ -57,12 +91,12 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC this.editor = editor; this.throttler = new Throttler(); - this.toUnhook.push(this.editor.onMouseDown((e: IEditorMouseEvent) => this.onEditorMouseDown(e))); - this.toUnhook.push(this.editor.onMouseUp((e: IEditorMouseEvent) => this.onEditorMouseUp(e))); - this.toUnhook.push(this.editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(e))); + this.toUnhook.push(this.editor.onMouseDown((e: IEditorMouseEvent) => this.onEditorMouseDown(new MyMouseEvent(e)))); + this.toUnhook.push(this.editor.onMouseUp((e: IEditorMouseEvent) => this.onEditorMouseUp(new MyMouseEvent(e)))); + this.toUnhook.push(this.editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(new MyMouseEvent(e)))); this.toUnhook.push(this.editor.onMouseDrag(() => this.resetHandler())); - this.toUnhook.push(this.editor.onKeyDown((e: IKeyboardEvent) => this.onEditorKeyDown(e))); - this.toUnhook.push(this.editor.onKeyUp((e: IKeyboardEvent) => this.onEditorKeyUp(e))); + this.toUnhook.push(this.editor.onKeyDown((e: IKeyboardEvent) => this.onEditorKeyDown(new MyKeyboardEvent(e)))); + this.toUnhook.push(this.editor.onKeyUp((e: IKeyboardEvent) => this.onEditorKeyUp(new MyKeyboardEvent(e)))); this.toUnhook.push(this.editor.onDidChangeCursorSelection((e) => this.onDidChangeCursorSelection(e))); this.toUnhook.push(this.editor.onDidChangeModel((e) => this.resetHandler())); @@ -80,13 +114,13 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } - private onEditorMouseMove(mouseEvent: IEditorMouseEvent, withKey?: IKeyboardEvent): void { + private onEditorMouseMove(mouseEvent: MyMouseEvent): void { this.lastMouseMoveEvent = mouseEvent; - this.startFindDefinition(mouseEvent, withKey); + this.startFindDefinition(mouseEvent); } - private startFindDefinition(mouseEvent: IEditorMouseEvent, withKey?: IKeyboardEvent): void { + private startFindDefinition(mouseEvent: MyMouseEvent, withKey?: MyKeyboardEvent): void { if (!this.isEnabled(mouseEvent, withKey)) { this.currentWordUnderMouse = null; this.removeDecorations(); @@ -196,15 +230,16 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } - private onEditorKeyDown(e: IKeyboardEvent): void { + private onEditorKeyDown(e: MyKeyboardEvent): void { if ( - this.lastMouseMoveEvent && ( - e.keyCode === GotoDefinitionWithMouseEditorContribution.TRIGGER_KEY_VALUE || // User just pressed Ctrl/Cmd (normal goto definition) - e.keyCode === GotoDefinitionWithMouseEditorContribution.TRIGGER_SIDEBYSIDE_KEY_VALUE && e[GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER] // User pressed Ctrl/Cmd+Alt (goto definition to the side) + this.lastMouseMoveEvent + && ( + e.keyCodeIsTriggerKey // User just pressed Ctrl/Cmd (normal goto definition) + || (e.keyCodeIsSideBySideKey && e.hasTriggerModifier) // User pressed Ctrl/Cmd+Alt (goto definition to the side) ) ) { this.startFindDefinition(this.lastMouseMoveEvent, e); - } else if (e[GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER]) { + } else if (e.hasTriggerModifier) { this.removeDecorations(); // remove decorations if user holds another key with ctrl/cmd to prevent accident goto declaration } } @@ -215,17 +250,17 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC this.removeDecorations(); } - private onEditorMouseDown(mouseEvent: IEditorMouseEvent): void { + private onEditorMouseDown(mouseEvent: MyMouseEvent): void { // We need to record if we had the trigger key on mouse down because someone might select something in the editor // holding the mouse down and then while mouse is down start to press Ctrl/Cmd to start a copy operation and then // release the mouse button without wanting to do the navigation. // With this flag we prevent goto definition if the mouse was down before the trigger key was pressed. - this.hasTriggerKeyOnMouseDown = !!mouseEvent.event[GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER]; + this.hasTriggerKeyOnMouseDown = mouseEvent.hasTriggerModifier; } - private onEditorMouseUp(mouseEvent: IEditorMouseEvent): void { + private onEditorMouseUp(mouseEvent: MyMouseEvent): void { if (this.isEnabled(mouseEvent) && this.hasTriggerKeyOnMouseDown) { - this.gotoDefinition(mouseEvent.target, mouseEvent.event.altKey).done(() => { + this.gotoDefinition(mouseEvent.target, mouseEvent.hasSideBySideModifier).done(() => { this.removeDecorations(); }, (error: Error) => { this.removeDecorations(); @@ -234,18 +269,18 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } - private onEditorKeyUp(e: IKeyboardEvent): void { - if (e.keyCode === GotoDefinitionWithMouseEditorContribution.TRIGGER_KEY_VALUE) { + private onEditorKeyUp(e: MyKeyboardEvent): void { + if (e.keyCodeIsTriggerKey) { this.removeDecorations(); this.currentWordUnderMouse = null; } } - private isEnabled(mouseEvent: IEditorMouseEvent, withKey?: IKeyboardEvent): boolean { + private isEnabled(mouseEvent: MyMouseEvent, withKey?: MyKeyboardEvent): boolean { return this.editor.getModel() && - (browser.isIE || mouseEvent.event.detail <= 1) && // IE does not support event.detail properly + mouseEvent.isSingleMouseDown && mouseEvent.target.type === MouseTargetType.CONTENT_TEXT && - (mouseEvent.event[GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER] || (withKey && withKey.keyCode === GotoDefinitionWithMouseEditorContribution.TRIGGER_KEY_VALUE)) && + (mouseEvent.hasTriggerModifier || (withKey && withKey.keyCodeIsTriggerKey)) && DefinitionProviderRegistry.has(this.editor.getModel()); } From d07a391b6b242f47ff404126be0556ca66b0baca Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 24 May 2017 17:40:31 +0200 Subject: [PATCH 0921/1164] Group method logically --- .../browser/goToDeclarationMouse.ts | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts index 15ccefb5d73..e4d9aa7b6f4 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts @@ -91,12 +91,12 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC this.editor = editor; this.throttler = new Throttler(); + this.toUnhook.push(this.editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(new MyMouseEvent(e)))); this.toUnhook.push(this.editor.onMouseDown((e: IEditorMouseEvent) => this.onEditorMouseDown(new MyMouseEvent(e)))); this.toUnhook.push(this.editor.onMouseUp((e: IEditorMouseEvent) => this.onEditorMouseUp(new MyMouseEvent(e)))); - this.toUnhook.push(this.editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(new MyMouseEvent(e)))); - this.toUnhook.push(this.editor.onMouseDrag(() => this.resetHandler())); this.toUnhook.push(this.editor.onKeyDown((e: IKeyboardEvent) => this.onEditorKeyDown(new MyKeyboardEvent(e)))); this.toUnhook.push(this.editor.onKeyUp((e: IKeyboardEvent) => this.onEditorKeyUp(new MyKeyboardEvent(e)))); + this.toUnhook.push(this.editor.onMouseDrag(() => this.resetHandler())); this.toUnhook.push(this.editor.onDidChangeCursorSelection((e) => this.onDidChangeCursorSelection(e))); this.toUnhook.push(this.editor.onDidChangeModel((e) => this.resetHandler())); @@ -114,12 +114,6 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } - private onEditorMouseMove(mouseEvent: MyMouseEvent): void { - this.lastMouseMoveEvent = mouseEvent; - - this.startFindDefinition(mouseEvent); - } - private startFindDefinition(mouseEvent: MyMouseEvent, withKey?: MyKeyboardEvent): void { if (!this.isEnabled(mouseEvent, withKey)) { this.currentWordUnderMouse = null; @@ -230,24 +224,10 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } - private onEditorKeyDown(e: MyKeyboardEvent): void { - if ( - this.lastMouseMoveEvent - && ( - e.keyCodeIsTriggerKey // User just pressed Ctrl/Cmd (normal goto definition) - || (e.keyCodeIsSideBySideKey && e.hasTriggerModifier) // User pressed Ctrl/Cmd+Alt (goto definition to the side) - ) - ) { - this.startFindDefinition(this.lastMouseMoveEvent, e); - } else if (e.hasTriggerModifier) { - this.removeDecorations(); // remove decorations if user holds another key with ctrl/cmd to prevent accident goto declaration - } - } + private onEditorMouseMove(mouseEvent: MyMouseEvent): void { + this.lastMouseMoveEvent = mouseEvent; - private resetHandler(): void { - this.lastMouseMoveEvent = null; - this.hasTriggerKeyOnMouseDown = false; - this.removeDecorations(); + this.startFindDefinition(mouseEvent); } private onEditorMouseDown(mouseEvent: MyMouseEvent): void { @@ -269,6 +249,20 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } + private onEditorKeyDown(e: MyKeyboardEvent): void { + if ( + this.lastMouseMoveEvent + && ( + e.keyCodeIsTriggerKey // User just pressed Ctrl/Cmd (normal goto definition) + || (e.keyCodeIsSideBySideKey && e.hasTriggerModifier) // User pressed Ctrl/Cmd+Alt (goto definition to the side) + ) + ) { + this.startFindDefinition(this.lastMouseMoveEvent, e); + } else if (e.hasTriggerModifier) { + this.removeDecorations(); // remove decorations if user holds another key with ctrl/cmd to prevent accident goto declaration + } + } + private onEditorKeyUp(e: MyKeyboardEvent): void { if (e.keyCodeIsTriggerKey) { this.removeDecorations(); @@ -276,6 +270,12 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } + private resetHandler(): void { + this.lastMouseMoveEvent = null; + this.hasTriggerKeyOnMouseDown = false; + this.removeDecorations(); + } + private isEnabled(mouseEvent: MyMouseEvent, withKey?: MyKeyboardEvent): boolean { return this.editor.getModel() && mouseEvent.isSingleMouseDown && From d0d23a8752373bba6584b5e949e59a40f312f6d7 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 24 May 2017 19:36:56 +0200 Subject: [PATCH 0922/1164] Encapsulate opening a link gesture in LinkGesture --- .../browser/goToDeclarationMouse.ts | 192 +++++++++++------- 1 file changed, 117 insertions(+), 75 deletions(-) diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts index e4d9aa7b6f4..9bc13d23c2b 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts @@ -22,13 +22,14 @@ import { Location, DefinitionProviderRegistry } from 'vs/editor/common/modes'; import { ICodeEditor, IEditorMouseEvent, IMouseTarget, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; import { getDefinitionsAtPosition } from './goToDeclaration'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; import { ITextModelResolverService } from 'vs/editor/common/services/resolverService'; import { ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { EditorState, CodeEditorStateFlag } from 'vs/editor/common/core/editorState'; import { DefinitionAction, DefinitionActionConfig } from './goToDeclarationCommands'; +import Event, { Emitter } from 'vs/base/common/event'; /** * An event that encapsulates the various trigger modifiers logic needed for go to definition. @@ -38,13 +39,13 @@ class MyMouseEvent { public readonly target: IMouseTarget; public readonly hasTriggerModifier: boolean; public readonly hasSideBySideModifier: boolean; - public readonly isSingleMouseDown: boolean; + public readonly isNoneOrSingleMouseDown: boolean; constructor(source: IEditorMouseEvent) { this.target = source.target; this.hasTriggerModifier = !!source.event[GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER]; this.hasSideBySideModifier = source.event.altKey; - this.isSingleMouseDown = (browser.isIE || source.event.detail <= 1); // IE does not support event.detail properly + this.isNoneOrSingleMouseDown = (browser.isIE || source.event.detail <= 1); // IE does not support event.detail properly } } @@ -64,6 +65,99 @@ class MyKeyboardEvent { } } +class LinkGesture extends Disposable { + + private readonly editor: ICodeEditor; + + private lastMouseMoveEvent: MyMouseEvent; + private hasTriggerKeyOnMouseDown: boolean; + + private readonly _onMouseMoveOrRelevantKeyDown: Emitter<[MyMouseEvent, MyKeyboardEvent]> = this._register(new Emitter<[MyMouseEvent, MyKeyboardEvent]>()); + public readonly onMouseMoveOrRelevantKeyDown: Event<[MyMouseEvent, MyKeyboardEvent]> = this._onMouseMoveOrRelevantKeyDown.event; + + private readonly _onExecute: Emitter = this._register(new Emitter()); + public readonly onExecute: Event = this._onExecute.event; + + private readonly _onCancel: Emitter = this._register(new Emitter()); + public readonly onCancel: Event = this._onCancel.event; + + constructor(editor: ICodeEditor) { + super(); + + this.editor = editor; + this.lastMouseMoveEvent = null; + this.hasTriggerKeyOnMouseDown = false; + + this._register(this.editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(new MyMouseEvent(e)))); + this._register(this.editor.onMouseDown((e: IEditorMouseEvent) => this.onEditorMouseDown(new MyMouseEvent(e)))); + this._register(this.editor.onMouseUp((e: IEditorMouseEvent) => this.onEditorMouseUp(new MyMouseEvent(e)))); + this._register(this.editor.onKeyDown((e: IKeyboardEvent) => this.onEditorKeyDown(new MyKeyboardEvent(e)))); + this._register(this.editor.onKeyUp((e: IKeyboardEvent) => this.onEditorKeyUp(new MyKeyboardEvent(e)))); + this._register(this.editor.onMouseDrag(() => this.resetHandler())); + + this._register(this.editor.onDidChangeCursorSelection((e) => this.onDidChangeCursorSelection(e))); + this._register(this.editor.onDidChangeModel((e) => this.resetHandler())); + this._register(this.editor.onDidChangeModelContent(() => this.resetHandler())); + this._register(this.editor.onDidScrollChange((e) => { + if (e.scrollTopChanged || e.scrollLeftChanged) { + this.resetHandler(); + } + })); + } + + private onDidChangeCursorSelection(e: ICursorSelectionChangedEvent): void { + if (e.selection && e.selection.startColumn !== e.selection.endColumn) { + this.resetHandler(); // immediately stop this feature if the user starts to select (https://github.com/Microsoft/vscode/issues/7827) + } + } + + private onEditorMouseMove(mouseEvent: MyMouseEvent): void { + this.lastMouseMoveEvent = mouseEvent; + + this._onMouseMoveOrRelevantKeyDown.fire([mouseEvent, null]); + } + + private onEditorMouseDown(mouseEvent: MyMouseEvent): void { + // We need to record if we had the trigger key on mouse down because someone might select something in the editor + // holding the mouse down and then while mouse is down start to press Ctrl/Cmd to start a copy operation and then + // release the mouse button without wanting to do the navigation. + // With this flag we prevent goto definition if the mouse was down before the trigger key was pressed. + this.hasTriggerKeyOnMouseDown = mouseEvent.hasTriggerModifier; + } + + private onEditorMouseUp(mouseEvent: MyMouseEvent): void { + if (this.hasTriggerKeyOnMouseDown) { + this._onExecute.fire(mouseEvent); + } + } + + private onEditorKeyDown(e: MyKeyboardEvent): void { + if ( + this.lastMouseMoveEvent + && ( + e.keyCodeIsTriggerKey // User just pressed Ctrl/Cmd (normal goto definition) + || (e.keyCodeIsSideBySideKey && e.hasTriggerModifier) // User pressed Ctrl/Cmd+Alt (goto definition to the side) + ) + ) { + this._onMouseMoveOrRelevantKeyDown.fire([this.lastMouseMoveEvent, e]); + } else if (e.hasTriggerModifier) { + this._onCancel.fire(); // remove decorations if user holds another key with ctrl/cmd to prevent accident goto declaration + } + } + + private onEditorKeyUp(e: MyKeyboardEvent): void { + if (e.keyCodeIsTriggerKey) { + this._onCancel.fire(); + } + } + + private resetHandler(): void { + this.lastMouseMoveEvent = null; + this.hasTriggerKeyOnMouseDown = false; + this._onCancel.fire(); + } +} + @editorContribution class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorContribution { @@ -78,8 +172,6 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC private decorations: string[]; private currentWordUnderMouse: editorCommon.IWordAtPosition; private throttler: Throttler; - private lastMouseMoveEvent: MyMouseEvent; - private hasTriggerKeyOnMouseDown: boolean; constructor( editor: ICodeEditor, @@ -91,27 +183,29 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC this.editor = editor; this.throttler = new Throttler(); - this.toUnhook.push(this.editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(new MyMouseEvent(e)))); - this.toUnhook.push(this.editor.onMouseDown((e: IEditorMouseEvent) => this.onEditorMouseDown(new MyMouseEvent(e)))); - this.toUnhook.push(this.editor.onMouseUp((e: IEditorMouseEvent) => this.onEditorMouseUp(new MyMouseEvent(e)))); - this.toUnhook.push(this.editor.onKeyDown((e: IKeyboardEvent) => this.onEditorKeyDown(new MyKeyboardEvent(e)))); - this.toUnhook.push(this.editor.onKeyUp((e: IKeyboardEvent) => this.onEditorKeyUp(new MyKeyboardEvent(e)))); - this.toUnhook.push(this.editor.onMouseDrag(() => this.resetHandler())); + let linkGesture = new LinkGesture(editor); + this.toUnhook.push(linkGesture); - this.toUnhook.push(this.editor.onDidChangeCursorSelection((e) => this.onDidChangeCursorSelection(e))); - this.toUnhook.push(this.editor.onDidChangeModel((e) => this.resetHandler())); - this.toUnhook.push(this.editor.onDidChangeModelContent(() => this.resetHandler())); - this.toUnhook.push(this.editor.onDidScrollChange((e) => { - if (e.scrollTopChanged || e.scrollLeftChanged) { - this.resetHandler(); + this.toUnhook.push(linkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => { + this.startFindDefinition(mouseEvent, keyboardEvent); + })); + + this.toUnhook.push(linkGesture.onExecute((mouseEvent: MyMouseEvent) => { + if (this.isEnabled(mouseEvent)) { + this.gotoDefinition(mouseEvent.target, mouseEvent.hasSideBySideModifier).done(() => { + this.removeDecorations(); + }, (error: Error) => { + this.removeDecorations(); + onUnexpectedError(error); + }); } })); - } - private onDidChangeCursorSelection(e: ICursorSelectionChangedEvent): void { - if (e.selection && e.selection.startColumn !== e.selection.endColumn) { - this.resetHandler(); // immediately stop this feature if the user starts to select (https://github.com/Microsoft/vscode/issues/7827) - } + this.toUnhook.push(linkGesture.onCancel(() => { + this.removeDecorations(); + this.currentWordUnderMouse = null; + })); + } private startFindDefinition(mouseEvent: MyMouseEvent, withKey?: MyKeyboardEvent): void { @@ -224,61 +318,9 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } - private onEditorMouseMove(mouseEvent: MyMouseEvent): void { - this.lastMouseMoveEvent = mouseEvent; - - this.startFindDefinition(mouseEvent); - } - - private onEditorMouseDown(mouseEvent: MyMouseEvent): void { - // We need to record if we had the trigger key on mouse down because someone might select something in the editor - // holding the mouse down and then while mouse is down start to press Ctrl/Cmd to start a copy operation and then - // release the mouse button without wanting to do the navigation. - // With this flag we prevent goto definition if the mouse was down before the trigger key was pressed. - this.hasTriggerKeyOnMouseDown = mouseEvent.hasTriggerModifier; - } - - private onEditorMouseUp(mouseEvent: MyMouseEvent): void { - if (this.isEnabled(mouseEvent) && this.hasTriggerKeyOnMouseDown) { - this.gotoDefinition(mouseEvent.target, mouseEvent.hasSideBySideModifier).done(() => { - this.removeDecorations(); - }, (error: Error) => { - this.removeDecorations(); - onUnexpectedError(error); - }); - } - } - - private onEditorKeyDown(e: MyKeyboardEvent): void { - if ( - this.lastMouseMoveEvent - && ( - e.keyCodeIsTriggerKey // User just pressed Ctrl/Cmd (normal goto definition) - || (e.keyCodeIsSideBySideKey && e.hasTriggerModifier) // User pressed Ctrl/Cmd+Alt (goto definition to the side) - ) - ) { - this.startFindDefinition(this.lastMouseMoveEvent, e); - } else if (e.hasTriggerModifier) { - this.removeDecorations(); // remove decorations if user holds another key with ctrl/cmd to prevent accident goto declaration - } - } - - private onEditorKeyUp(e: MyKeyboardEvent): void { - if (e.keyCodeIsTriggerKey) { - this.removeDecorations(); - this.currentWordUnderMouse = null; - } - } - - private resetHandler(): void { - this.lastMouseMoveEvent = null; - this.hasTriggerKeyOnMouseDown = false; - this.removeDecorations(); - } - private isEnabled(mouseEvent: MyMouseEvent, withKey?: MyKeyboardEvent): boolean { return this.editor.getModel() && - mouseEvent.isSingleMouseDown && + mouseEvent.isNoneOrSingleMouseDown && mouseEvent.target.type === MouseTargetType.CONTENT_TEXT && (mouseEvent.hasTriggerModifier || (withKey && withKey.keyCodeIsTriggerKey)) && DefinitionProviderRegistry.has(this.editor.getModel()); From 1c38b011ea1534cc65cd020c4a39e95348201c98 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 24 May 2017 20:34:46 +0200 Subject: [PATCH 0923/1164] Extract clicking link logic to its own file --- .../browser/clickLinkGesture.ts | 158 ++++++++++++++++++ .../browser/goToDeclarationMouse.ts | 150 ++--------------- 2 files changed, 170 insertions(+), 138 deletions(-) create mode 100644 src/vs/editor/contrib/goToDeclaration/browser/clickLinkGesture.ts diff --git a/src/vs/editor/contrib/goToDeclaration/browser/clickLinkGesture.ts b/src/vs/editor/contrib/goToDeclaration/browser/clickLinkGesture.ts new file mode 100644 index 00000000000..bec68dcf19a --- /dev/null +++ b/src/vs/editor/contrib/goToDeclaration/browser/clickLinkGesture.ts @@ -0,0 +1,158 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import 'vs/css!./goToDeclarationMouse'; +import { KeyCode } from 'vs/base/common/keyCodes'; +import * as browser from 'vs/base/browser/browser'; +import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { ICodeEditor, IEditorMouseEvent, IMouseTarget } from 'vs/editor/browser/editorBrowser'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import Event, { Emitter } from 'vs/base/common/event'; + +/** + * An event that encapsulates the various trigger modifiers logic needed for go to definition. + */ +export class ClickLinkMouseEvent { + + public readonly target: IMouseTarget; + public readonly hasTriggerModifier: boolean; + public readonly hasSideBySideModifier: boolean; + public readonly isNoneOrSingleMouseDown: boolean; + + constructor(source: IEditorMouseEvent, opts: ClickLinkOptions) { + this.target = source.target; + this.hasTriggerModifier = !!source.event[opts.triggerModifier]; + this.hasSideBySideModifier = source.event.altKey; + this.isNoneOrSingleMouseDown = (browser.isIE || source.event.detail <= 1); // IE does not support event.detail properly + } +} + +/** + * An event that encapsulates the various trigger modifiers logic needed for go to definition. + */ +export class ClickLinkKeyboardEvent { + + public readonly keyCodeIsTriggerKey: boolean; + public readonly keyCodeIsSideBySideKey: boolean; + public readonly hasTriggerModifier: boolean; + + constructor(source: IKeyboardEvent, opts: ClickLinkOptions) { + this.keyCodeIsTriggerKey = (source.keyCode === opts.triggerKey); + this.keyCodeIsSideBySideKey = (source.keyCode === opts.triggerSideBySideKey); + this.hasTriggerModifier = !!source[opts.triggerModifier]; + } +} + +export class ClickLinkOptions { + + public readonly triggerKey: KeyCode; + public readonly triggerModifier: 'ctrlKey' | 'shiftKey' | 'altKey' | 'metaKey'; + public readonly triggerSideBySideKey: KeyCode; + + constructor(triggerKey: KeyCode, triggerModifier: 'ctrlKey' | 'shiftKey' | 'altKey' | 'metaKey', triggerSideBySideKey: KeyCode) { + this.triggerKey = triggerKey; + this.triggerModifier = triggerModifier; + this.triggerSideBySideKey = triggerSideBySideKey; + } +} + +export class ClickLinkGesture extends Disposable { + + private readonly _onMouseMoveOrRelevantKeyDown: Emitter<[ClickLinkMouseEvent, ClickLinkKeyboardEvent]> = this._register(new Emitter<[ClickLinkMouseEvent, ClickLinkKeyboardEvent]>()); + public readonly onMouseMoveOrRelevantKeyDown: Event<[ClickLinkMouseEvent, ClickLinkKeyboardEvent]> = this._onMouseMoveOrRelevantKeyDown.event; + + private readonly _onExecute: Emitter = this._register(new Emitter()); + public readonly onExecute: Event = this._onExecute.event; + + private readonly _onCancel: Emitter = this._register(new Emitter()); + public readonly onCancel: Event = this._onCancel.event; + + private readonly _editor: ICodeEditor; + private readonly _opts: ClickLinkOptions; + + private lastMouseMoveEvent: ClickLinkMouseEvent; + private hasTriggerKeyOnMouseDown: boolean; + + constructor(editor: ICodeEditor, opts: ClickLinkOptions) { + super(); + + this._editor = editor; + this._opts = opts; + + this.lastMouseMoveEvent = null; + this.hasTriggerKeyOnMouseDown = false; + + this._register(this._editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(new ClickLinkMouseEvent(e, this._opts)))); + this._register(this._editor.onMouseDown((e: IEditorMouseEvent) => this.onEditorMouseDown(new ClickLinkMouseEvent(e, this._opts)))); + this._register(this._editor.onMouseUp((e: IEditorMouseEvent) => this.onEditorMouseUp(new ClickLinkMouseEvent(e, this._opts)))); + this._register(this._editor.onKeyDown((e: IKeyboardEvent) => this.onEditorKeyDown(new ClickLinkKeyboardEvent(e, this._opts)))); + this._register(this._editor.onKeyUp((e: IKeyboardEvent) => this.onEditorKeyUp(new ClickLinkKeyboardEvent(e, this._opts)))); + this._register(this._editor.onMouseDrag(() => this.resetHandler())); + + this._register(this._editor.onDidChangeCursorSelection((e) => this.onDidChangeCursorSelection(e))); + this._register(this._editor.onDidChangeModel((e) => this.resetHandler())); + this._register(this._editor.onDidChangeModelContent(() => this.resetHandler())); + this._register(this._editor.onDidScrollChange((e) => { + if (e.scrollTopChanged || e.scrollLeftChanged) { + this.resetHandler(); + } + })); + } + + private onDidChangeCursorSelection(e: ICursorSelectionChangedEvent): void { + if (e.selection && e.selection.startColumn !== e.selection.endColumn) { + this.resetHandler(); // immediately stop this feature if the user starts to select (https://github.com/Microsoft/vscode/issues/7827) + } + } + + private onEditorMouseMove(mouseEvent: ClickLinkMouseEvent): void { + this.lastMouseMoveEvent = mouseEvent; + + this._onMouseMoveOrRelevantKeyDown.fire([mouseEvent, null]); + } + + private onEditorMouseDown(mouseEvent: ClickLinkMouseEvent): void { + // We need to record if we had the trigger key on mouse down because someone might select something in the editor + // holding the mouse down and then while mouse is down start to press Ctrl/Cmd to start a copy operation and then + // release the mouse button without wanting to do the navigation. + // With this flag we prevent goto definition if the mouse was down before the trigger key was pressed. + this.hasTriggerKeyOnMouseDown = mouseEvent.hasTriggerModifier; + } + + private onEditorMouseUp(mouseEvent: ClickLinkMouseEvent): void { + if (this.hasTriggerKeyOnMouseDown) { + this._onExecute.fire(mouseEvent); + } + } + + private onEditorKeyDown(e: ClickLinkKeyboardEvent): void { + if ( + this.lastMouseMoveEvent + && ( + e.keyCodeIsTriggerKey // User just pressed Ctrl/Cmd (normal goto definition) + || (e.keyCodeIsSideBySideKey && e.hasTriggerModifier) // User pressed Ctrl/Cmd+Alt (goto definition to the side) + ) + ) { + this._onMouseMoveOrRelevantKeyDown.fire([this.lastMouseMoveEvent, e]); + } else if (e.hasTriggerModifier) { + this._onCancel.fire(); // remove decorations if user holds another key with ctrl/cmd to prevent accident goto declaration + } + } + + private onEditorKeyUp(e: ClickLinkKeyboardEvent): void { + if (e.keyCodeIsTriggerKey) { + this._onCancel.fire(); + } + } + + private resetHandler(): void { + this.lastMouseMoveEvent = null; + this.hasTriggerKeyOnMouseDown = false; + this._onCancel.fire(); + } +} diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts index 9bc13d23c2b..e063801f2d9 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts @@ -13,156 +13,26 @@ import { MarkedString } from 'vs/base/common/htmlContent'; import { KeyCode } from 'vs/base/common/keyCodes'; import * as platform from 'vs/base/common/platform'; import { TPromise } from 'vs/base/common/winjs.base'; -import * as browser from 'vs/base/browser/browser'; -import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { IModeService } from 'vs/editor/common/services/modeService'; import { Range } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { Location, DefinitionProviderRegistry } from 'vs/editor/common/modes'; -import { ICodeEditor, IEditorMouseEvent, IMouseTarget, MouseTargetType } from 'vs/editor/browser/editorBrowser'; +import { ICodeEditor, IMouseTarget, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; import { getDefinitionsAtPosition } from './goToDeclaration'; -import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ITextModelResolverService } from 'vs/editor/common/services/resolverService'; -import { ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { EditorState, CodeEditorStateFlag } from 'vs/editor/common/core/editorState'; import { DefinitionAction, DefinitionActionConfig } from './goToDeclarationCommands'; -import Event, { Emitter } from 'vs/base/common/event'; - -/** - * An event that encapsulates the various trigger modifiers logic needed for go to definition. - */ -class MyMouseEvent { - - public readonly target: IMouseTarget; - public readonly hasTriggerModifier: boolean; - public readonly hasSideBySideModifier: boolean; - public readonly isNoneOrSingleMouseDown: boolean; - - constructor(source: IEditorMouseEvent) { - this.target = source.target; - this.hasTriggerModifier = !!source.event[GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER]; - this.hasSideBySideModifier = source.event.altKey; - this.isNoneOrSingleMouseDown = (browser.isIE || source.event.detail <= 1); // IE does not support event.detail properly - } -} - -/** - * An event that encapsulates the various trigger modifiers logic needed for go to definition. - */ -class MyKeyboardEvent { - - public readonly keyCodeIsTriggerKey: boolean; - public readonly keyCodeIsSideBySideKey: boolean; - public readonly hasTriggerModifier: boolean; - - constructor(source: IKeyboardEvent) { - this.keyCodeIsTriggerKey = (source.keyCode === GotoDefinitionWithMouseEditorContribution.TRIGGER_KEY_VALUE); - this.keyCodeIsSideBySideKey = (source.keyCode === GotoDefinitionWithMouseEditorContribution.TRIGGER_SIDEBYSIDE_KEY_VALUE); - this.hasTriggerModifier = !!source[GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER]; - } -} - -class LinkGesture extends Disposable { - - private readonly editor: ICodeEditor; - - private lastMouseMoveEvent: MyMouseEvent; - private hasTriggerKeyOnMouseDown: boolean; - - private readonly _onMouseMoveOrRelevantKeyDown: Emitter<[MyMouseEvent, MyKeyboardEvent]> = this._register(new Emitter<[MyMouseEvent, MyKeyboardEvent]>()); - public readonly onMouseMoveOrRelevantKeyDown: Event<[MyMouseEvent, MyKeyboardEvent]> = this._onMouseMoveOrRelevantKeyDown.event; - - private readonly _onExecute: Emitter = this._register(new Emitter()); - public readonly onExecute: Event = this._onExecute.event; - - private readonly _onCancel: Emitter = this._register(new Emitter()); - public readonly onCancel: Event = this._onCancel.event; - - constructor(editor: ICodeEditor) { - super(); - - this.editor = editor; - this.lastMouseMoveEvent = null; - this.hasTriggerKeyOnMouseDown = false; - - this._register(this.editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(new MyMouseEvent(e)))); - this._register(this.editor.onMouseDown((e: IEditorMouseEvent) => this.onEditorMouseDown(new MyMouseEvent(e)))); - this._register(this.editor.onMouseUp((e: IEditorMouseEvent) => this.onEditorMouseUp(new MyMouseEvent(e)))); - this._register(this.editor.onKeyDown((e: IKeyboardEvent) => this.onEditorKeyDown(new MyKeyboardEvent(e)))); - this._register(this.editor.onKeyUp((e: IKeyboardEvent) => this.onEditorKeyUp(new MyKeyboardEvent(e)))); - this._register(this.editor.onMouseDrag(() => this.resetHandler())); - - this._register(this.editor.onDidChangeCursorSelection((e) => this.onDidChangeCursorSelection(e))); - this._register(this.editor.onDidChangeModel((e) => this.resetHandler())); - this._register(this.editor.onDidChangeModelContent(() => this.resetHandler())); - this._register(this.editor.onDidScrollChange((e) => { - if (e.scrollTopChanged || e.scrollLeftChanged) { - this.resetHandler(); - } - })); - } - - private onDidChangeCursorSelection(e: ICursorSelectionChangedEvent): void { - if (e.selection && e.selection.startColumn !== e.selection.endColumn) { - this.resetHandler(); // immediately stop this feature if the user starts to select (https://github.com/Microsoft/vscode/issues/7827) - } - } - - private onEditorMouseMove(mouseEvent: MyMouseEvent): void { - this.lastMouseMoveEvent = mouseEvent; - - this._onMouseMoveOrRelevantKeyDown.fire([mouseEvent, null]); - } - - private onEditorMouseDown(mouseEvent: MyMouseEvent): void { - // We need to record if we had the trigger key on mouse down because someone might select something in the editor - // holding the mouse down and then while mouse is down start to press Ctrl/Cmd to start a copy operation and then - // release the mouse button without wanting to do the navigation. - // With this flag we prevent goto definition if the mouse was down before the trigger key was pressed. - this.hasTriggerKeyOnMouseDown = mouseEvent.hasTriggerModifier; - } - - private onEditorMouseUp(mouseEvent: MyMouseEvent): void { - if (this.hasTriggerKeyOnMouseDown) { - this._onExecute.fire(mouseEvent); - } - } - - private onEditorKeyDown(e: MyKeyboardEvent): void { - if ( - this.lastMouseMoveEvent - && ( - e.keyCodeIsTriggerKey // User just pressed Ctrl/Cmd (normal goto definition) - || (e.keyCodeIsSideBySideKey && e.hasTriggerModifier) // User pressed Ctrl/Cmd+Alt (goto definition to the side) - ) - ) { - this._onMouseMoveOrRelevantKeyDown.fire([this.lastMouseMoveEvent, e]); - } else if (e.hasTriggerModifier) { - this._onCancel.fire(); // remove decorations if user holds another key with ctrl/cmd to prevent accident goto declaration - } - } - - private onEditorKeyUp(e: MyKeyboardEvent): void { - if (e.keyCodeIsTriggerKey) { - this._onCancel.fire(); - } - } - - private resetHandler(): void { - this.lastMouseMoveEvent = null; - this.hasTriggerKeyOnMouseDown = false; - this._onCancel.fire(); - } -} +import { ClickLinkGesture, ClickLinkOptions, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from "vs/editor/contrib/goToDeclaration/browser/clickLinkGesture"; @editorContribution class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorContribution { private static ID = 'editor.contrib.gotodefinitionwithmouse'; - static TRIGGER_MODIFIER = platform.isMacintosh ? 'metaKey' : 'ctrlKey'; + static TRIGGER_MODIFIER: 'metaKey' | 'ctrlKey' = platform.isMacintosh ? 'metaKey' : 'ctrlKey'; static TRIGGER_SIDEBYSIDE_KEY_VALUE = KeyCode.Alt; static TRIGGER_KEY_VALUE = platform.isMacintosh ? KeyCode.Meta : KeyCode.Ctrl; static MAX_SOURCE_PREVIEW_LINES = 8; @@ -183,14 +53,18 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC this.editor = editor; this.throttler = new Throttler(); - let linkGesture = new LinkGesture(editor); + let linkGesture = new ClickLinkGesture(editor, new ClickLinkOptions( + GotoDefinitionWithMouseEditorContribution.TRIGGER_KEY_VALUE, + GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER, + GotoDefinitionWithMouseEditorContribution.TRIGGER_SIDEBYSIDE_KEY_VALUE + )); this.toUnhook.push(linkGesture); this.toUnhook.push(linkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => { this.startFindDefinition(mouseEvent, keyboardEvent); })); - this.toUnhook.push(linkGesture.onExecute((mouseEvent: MyMouseEvent) => { + this.toUnhook.push(linkGesture.onExecute((mouseEvent: ClickLinkMouseEvent) => { if (this.isEnabled(mouseEvent)) { this.gotoDefinition(mouseEvent.target, mouseEvent.hasSideBySideModifier).done(() => { this.removeDecorations(); @@ -208,7 +82,7 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } - private startFindDefinition(mouseEvent: MyMouseEvent, withKey?: MyKeyboardEvent): void { + private startFindDefinition(mouseEvent: ClickLinkMouseEvent, withKey?: ClickLinkKeyboardEvent): void { if (!this.isEnabled(mouseEvent, withKey)) { this.currentWordUnderMouse = null; this.removeDecorations(); @@ -318,7 +192,7 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } - private isEnabled(mouseEvent: MyMouseEvent, withKey?: MyKeyboardEvent): boolean { + private isEnabled(mouseEvent: ClickLinkMouseEvent, withKey?: ClickLinkKeyboardEvent): boolean { return this.editor.getModel() && mouseEvent.isNoneOrSingleMouseDown && mouseEvent.target.type === MouseTargetType.CONTENT_TEXT && From 9e8f922647e973fba4e52557f823494e2f7b7fed Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 24 May 2017 22:32:38 +0200 Subject: [PATCH 0924/1164] Fixes #6910: Left mouse button up when selecting text with CTRL pressed causes to follow link --- src/vs/editor/contrib/links/browser/links.ts | 60 ++++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/vs/editor/contrib/links/browser/links.ts b/src/vs/editor/contrib/links/browser/links.ts index 44f1d2fb3bd..c14eaf2d911 100644 --- a/src/vs/editor/contrib/links/browser/links.ts +++ b/src/vs/editor/contrib/links/browser/links.ts @@ -12,14 +12,13 @@ import { KeyCode } from 'vs/base/common/keyCodes'; import * as platform from 'vs/base/common/platform'; import Severity from 'vs/base/common/severity'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { IMessageService } from 'vs/platform/message/common/message'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { editorAction, ServicesAccessor, EditorAction } from 'vs/editor/common/editorCommonExtensions'; import { LinkProviderRegistry } from 'vs/editor/common/modes'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; -import { IEditorMouseEvent, ICodeEditor, MouseTargetType } from 'vs/editor/browser/editorBrowser'; +import { ICodeEditor, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { getLinks, Link } from 'vs/editor/contrib/links/common/links'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; @@ -27,6 +26,7 @@ import { registerThemingParticipant } from 'vs/platform/theme/common/themeServic import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { Position } from 'vs/editor/common/core/position'; import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ClickLinkGesture, ClickLinkOptions, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from "vs/editor/contrib/goToDeclaration/browser/clickLinkGesture"; const HOVER_MESSAGE_GENERAL = ( platform.isMacintosh @@ -67,7 +67,7 @@ class LinkOccurence { public decorationId: string; public link: Link; - constructor(link: Link, decorationId: string/*, changeAccessor:editorCommon.IModelDecorationsChangeAccessor*/) { + constructor(link: Link, decorationId: string) { this.link = link; this.decorationId = decorationId; } @@ -92,14 +92,13 @@ class LinkDetector implements editorCommon.IEditorContribution { static RECOMPUTE_TIME = 1000; // ms static TRIGGER_KEY_VALUE = platform.isMacintosh ? KeyCode.Meta : KeyCode.Ctrl; - static TRIGGER_MODIFIER = platform.isMacintosh ? 'metaKey' : 'ctrlKey'; + static TRIGGER_MODIFIER: 'metaKey' | 'ctrlKey' = platform.isMacintosh ? 'metaKey' : 'ctrlKey'; private editor: ICodeEditor; private listenersToRemove: IDisposable[]; private timeoutPromise: TPromise; private computePromise: TPromise; private activeLinkDecorationId: string; - private lastMouseEvent: IEditorMouseEvent; private openerService: IOpenerService; private messageService: IMessageService; private editorWorkerService: IEditorWorkerService; @@ -116,14 +115,28 @@ class LinkDetector implements editorCommon.IEditorContribution { this.messageService = messageService; this.editorWorkerService = editorWorkerService; this.listenersToRemove = []; + + let clickLinkGesture = new ClickLinkGesture(editor, new ClickLinkOptions( + LinkDetector.TRIGGER_KEY_VALUE, + LinkDetector.TRIGGER_MODIFIER, + KeyCode.Alt + )); + this.listenersToRemove.push(clickLinkGesture); + this.listenersToRemove.push(clickLinkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => { + this._onEditorMouseMove(mouseEvent, keyboardEvent); + })); + this.listenersToRemove.push(clickLinkGesture.onExecute((e) => { + this.onEditorMouseUp(e); + })); + this.listenersToRemove.push(clickLinkGesture.onCancel((e) => { + this.cleanUpActiveLinkDecoration(); + })); + this.listenersToRemove.push(editor.onDidChangeModelContent((e) => this.onChange())); this.listenersToRemove.push(editor.onDidChangeModel((e) => this.onModelChanged())); this.listenersToRemove.push(editor.onDidChangeModelLanguage((e) => this.onModelModeChanged())); this.listenersToRemove.push(LinkProviderRegistry.onDidChange((e) => this.onModelModeChanged())); - this.listenersToRemove.push(this.editor.onMouseUp((e: IEditorMouseEvent) => this.onEditorMouseUp(e))); - this.listenersToRemove.push(this.editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(e))); - this.listenersToRemove.push(this.editor.onKeyDown((e: IKeyboardEvent) => this.onEditorKeyDown(e))); - this.listenersToRemove.push(this.editor.onKeyUp((e: IKeyboardEvent) => this.onEditorKeyUp(e))); + this.timeoutPromise = null; this.computePromise = null; this.currentOccurences = {}; @@ -140,7 +153,6 @@ class LinkDetector implements editorCommon.IEditorContribution { } private onModelChanged(): void { - this.lastMouseEvent = null; this.currentOccurences = {}; this.activeLinkDecorationId = null; this.stop(); @@ -206,21 +218,7 @@ class LinkDetector implements editorCommon.IEditorContribution { }); } - private onEditorKeyDown(e: IKeyboardEvent): void { - if (e.keyCode === LinkDetector.TRIGGER_KEY_VALUE && this.lastMouseEvent) { - this.onEditorMouseMove(this.lastMouseEvent, e); - } - } - - private onEditorKeyUp(e: IKeyboardEvent): void { - if (e.keyCode === LinkDetector.TRIGGER_KEY_VALUE) { - this.cleanUpActiveLinkDecoration(); - } - } - - private onEditorMouseMove(mouseEvent: IEditorMouseEvent, withKey?: IKeyboardEvent): void { - this.lastMouseEvent = mouseEvent; - + private _onEditorMouseMove(mouseEvent: ClickLinkMouseEvent, withKey?: ClickLinkKeyboardEvent): void { if (this.isEnabled(mouseEvent, withKey)) { this.cleanUpActiveLinkDecoration(); // always remove previous link decoration as their can only be one var occurence = this.getLinkOccurence(mouseEvent.target.position); @@ -248,7 +246,7 @@ class LinkDetector implements editorCommon.IEditorContribution { } } - private onEditorMouseUp(mouseEvent: IEditorMouseEvent): void { + private onEditorMouseUp(mouseEvent: ClickLinkMouseEvent): void { if (!this.isEnabled(mouseEvent)) { return; } @@ -256,7 +254,7 @@ class LinkDetector implements editorCommon.IEditorContribution { if (!occurence) { return; } - this.openLinkOccurence(occurence, mouseEvent.event.altKey); + this.openLinkOccurence(occurence, mouseEvent.hasSideBySideModifier); } public openLinkOccurence(occurence: LinkOccurence, openToSide: boolean): void { @@ -302,9 +300,11 @@ class LinkDetector implements editorCommon.IEditorContribution { return null; } - private isEnabled(mouseEvent: IEditorMouseEvent, withKey?: IKeyboardEvent): boolean { - return mouseEvent.target.type === MouseTargetType.CONTENT_TEXT && - (mouseEvent.event[LinkDetector.TRIGGER_MODIFIER] || (withKey && withKey.keyCode === LinkDetector.TRIGGER_KEY_VALUE)); + private isEnabled(mouseEvent: ClickLinkMouseEvent, withKey?: ClickLinkKeyboardEvent): boolean { + return ( + mouseEvent.target.type === MouseTargetType.CONTENT_TEXT + && (mouseEvent.hasTriggerModifier || (withKey && withKey.keyCodeIsTriggerKey)) + ); } private stop(): void { From f7a42a865211994d11766f54d21dbecb1f9089b4 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 25 May 2017 00:00:54 +0200 Subject: [PATCH 0925/1164] Implement editor.multicursorModifier --- src/vs/editor/browser/view/viewController.ts | 99 +++++++++---------- src/vs/editor/browser/view/viewImpl.ts | 2 +- .../browser/clickLinkGesture.ts | 61 ++++++++++-- .../browser/goToDeclarationMouse.ts | 13 +-- src/vs/editor/contrib/hover/browser/hover.ts | 3 +- src/vs/editor/contrib/links/browser/links.ts | 11 +-- 6 files changed, 109 insertions(+), 80 deletions(-) diff --git a/src/vs/editor/browser/view/viewController.ts b/src/vs/editor/browser/view/viewController.ts index f37a97d9344..e05ca74ea60 100644 --- a/src/vs/editor/browser/view/viewController.ts +++ b/src/vs/editor/browser/view/viewController.ts @@ -12,6 +12,7 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; import { ViewOutgoingEvents } from 'vs/editor/browser/view/viewOutgoingEvents'; import { CoreNavigationCommands, CoreEditorCommand } from 'vs/editor/common/controller/coreCommands'; +import { Configuration } from "vs/editor/browser/config/configuration"; export interface ExecCoreEditorCommandFunc { (editorCommand: CoreEditorCommand, args: any): void; @@ -35,17 +36,20 @@ export interface IMouseDispatchData { export class ViewController { + private readonly configuration: Configuration; private readonly viewModel: IViewModel; private readonly _execCoreEditorCommandFunc: ExecCoreEditorCommandFunc; private readonly outgoingEvents: ViewOutgoingEvents; private readonly commandService: ICommandService; constructor( + configuration: Configuration, viewModel: IViewModel, execCommandFunc: ExecCoreEditorCommandFunc, outgoingEvents: ViewOutgoingEvents, commandService: ICommandService ) { + this.configuration = configuration; this.viewModel = viewModel; this._execCoreEditorCommandFunc = execCommandFunc; this.outgoingEvents = outgoingEvents; @@ -97,10 +101,34 @@ export class ViewController { return viewPosition; } + private _hasMulticursorModifier(data: IMouseDispatchData): boolean { + switch (this.configuration.editor.multicursorModifier) { + case 'altKey': + return data.altKey; + case 'ctrlKey': + return data.ctrlKey; + case 'metaKey': + return data.metaKey; + } + return false; + } + + private _hasNonMulticursorModifier(data: IMouseDispatchData): boolean { + switch (this.configuration.editor.multicursorModifier) { + case 'altKey': + return data.ctrlKey || data.metaKey; + case 'ctrlKey': + return data.altKey || data.metaKey; + case 'metaKey': + return data.ctrlKey || data.altKey; + } + return false; + } + public dispatchMouse(data: IMouseDispatchData): void { if (data.startedOnLineNumbers) { // If the dragging started on the gutter, then have operations work on the entire line - if (data.altKey) { + if (this._hasMulticursorModifier(data)) { if (data.inSelectionMode) { this.lastCursorLineSelect(data.position); } else { @@ -116,7 +144,7 @@ export class ViewController { } else if (data.mouseDownCount >= 4) { this.selectAll(); } else if (data.mouseDownCount === 3) { - if (data.altKey) { + if (this._hasMulticursorModifier(data)) { if (data.inSelectionMode) { this.lastCursorLineSelectDrag(data.position); } else { @@ -130,7 +158,7 @@ export class ViewController { } } } else if (data.mouseDownCount === 2) { - if (data.altKey) { + if (this._hasMulticursorModifier(data)) { this.lastCursorWordSelect(data.position); } else { if (data.inSelectionMode) { @@ -140,8 +168,8 @@ export class ViewController { } } } else { - if (data.altKey) { - if (!data.ctrlKey && !data.metaKey) { + if (this._hasMulticursorModifier(data)) { + if (!this._hasNonMulticursorModifier(data)) { if (data.shiftKey) { this.columnSelect(data.position, data.mouseColumn); } else { @@ -163,20 +191,20 @@ export class ViewController { } } - public moveTo(viewPosition: Position): void { + private _usualArgs(viewPosition: Position) { viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.MoveTo, { + return { position: this.convertViewToModelPosition(viewPosition), viewPosition: viewPosition - }); + }; + } + + public moveTo(viewPosition: Position): void { + this._execMouseCommand(CoreNavigationCommands.MoveTo, this._usualArgs(viewPosition)); } private moveToSelect(viewPosition: Position): void { - viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.MoveToSelect, { - position: this.convertViewToModelPosition(viewPosition), - viewPosition: viewPosition - }); + this._execMouseCommand(CoreNavigationCommands.MoveToSelect, this._usualArgs(viewPosition)); } private columnSelect(viewPosition: Position, mouseColumn: number): void { @@ -198,64 +226,35 @@ export class ViewController { } private lastCursorMoveToSelect(viewPosition: Position): void { - viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.LastCursorMoveToSelect, { - position: this.convertViewToModelPosition(viewPosition), - viewPosition: viewPosition - }); + this._execMouseCommand(CoreNavigationCommands.LastCursorMoveToSelect, this._usualArgs(viewPosition)); } private wordSelect(viewPosition: Position): void { - viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.WordSelect, { - position: this.convertViewToModelPosition(viewPosition) - }); + this._execMouseCommand(CoreNavigationCommands.WordSelect, this._usualArgs(viewPosition)); } private wordSelectDrag(viewPosition: Position): void { - viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.WordSelectDrag, { - position: this.convertViewToModelPosition(viewPosition) - }); + this._execMouseCommand(CoreNavigationCommands.WordSelectDrag, this._usualArgs(viewPosition)); } private lastCursorWordSelect(viewPosition: Position): void { - viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.LastCursorWordSelect, { - position: this.convertViewToModelPosition(viewPosition) - }); + this._execMouseCommand(CoreNavigationCommands.LastCursorWordSelect, this._usualArgs(viewPosition)); } private lineSelect(viewPosition: Position): void { - viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.LineSelect, { - position: this.convertViewToModelPosition(viewPosition), - viewPosition: viewPosition - }); + this._execMouseCommand(CoreNavigationCommands.LineSelect, this._usualArgs(viewPosition)); } private lineSelectDrag(viewPosition: Position): void { - viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.LineSelectDrag, { - position: this.convertViewToModelPosition(viewPosition), - viewPosition: viewPosition - }); + this._execMouseCommand(CoreNavigationCommands.LineSelectDrag, this._usualArgs(viewPosition)); } private lastCursorLineSelect(viewPosition: Position): void { - viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.LastCursorLineSelect, { - position: this.convertViewToModelPosition(viewPosition), - viewPosition: viewPosition - }); + this._execMouseCommand(CoreNavigationCommands.LastCursorLineSelect, this._usualArgs(viewPosition)); } private lastCursorLineSelectDrag(viewPosition: Position): void { - viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.LastCursorLineSelectDrag, { - position: this.convertViewToModelPosition(viewPosition), - viewPosition: viewPosition - }); + this._execMouseCommand(CoreNavigationCommands.LastCursorLineSelectDrag, this._usualArgs(viewPosition)); } private selectAll(): void { diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index 321c4719a6d..927c1d19486 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -105,7 +105,7 @@ export class View extends ViewEventHandler { this._renderAnimationFrame = null; this.outgoingEvents = new ViewOutgoingEvents(model); - let viewController = new ViewController(model, execCoreEditorCommandFunc, this.outgoingEvents, commandService); + let viewController = new ViewController(configuration, model, execCoreEditorCommandFunc, this.outgoingEvents, commandService); // The event dispatcher will always go through _renderOnce before dispatching any events this.eventDispatcher = new ViewEventDispatcher((callback: () => void) => this._renderOnce(callback)); diff --git a/src/vs/editor/contrib/goToDeclaration/browser/clickLinkGesture.ts b/src/vs/editor/contrib/goToDeclaration/browser/clickLinkGesture.ts index bec68dcf19a..79d1043cf50 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/clickLinkGesture.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/clickLinkGesture.ts @@ -13,6 +13,11 @@ import { ICodeEditor, IEditorMouseEvent, IMouseTarget } from 'vs/editor/browser/ import { Disposable } from 'vs/base/common/lifecycle'; import { ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import Event, { Emitter } from 'vs/base/common/event'; +import * as platform from 'vs/base/common/platform'; + +function hasModifier(e: { ctrlKey: boolean; shiftKey: boolean; altKey: boolean; metaKey: boolean }, modifier: 'ctrlKey' | 'shiftKey' | 'altKey' | 'metaKey'): boolean { + return !!e[modifier]; +} /** * An event that encapsulates the various trigger modifiers logic needed for go to definition. @@ -26,8 +31,8 @@ export class ClickLinkMouseEvent { constructor(source: IEditorMouseEvent, opts: ClickLinkOptions) { this.target = source.target; - this.hasTriggerModifier = !!source.event[opts.triggerModifier]; - this.hasSideBySideModifier = source.event.altKey; + this.hasTriggerModifier = hasModifier(source.event, opts.triggerModifier); + this.hasSideBySideModifier = hasModifier(source.event, opts.triggerSideBySideModifier); this.isNoneOrSingleMouseDown = (browser.isIE || source.event.detail <= 1); // IE does not support event.detail properly } } @@ -44,7 +49,7 @@ export class ClickLinkKeyboardEvent { constructor(source: IKeyboardEvent, opts: ClickLinkOptions) { this.keyCodeIsTriggerKey = (source.keyCode === opts.triggerKey); this.keyCodeIsSideBySideKey = (source.keyCode === opts.triggerSideBySideKey); - this.hasTriggerModifier = !!source[opts.triggerModifier]; + this.hasTriggerModifier = hasModifier(source, opts.triggerModifier); } } @@ -53,12 +58,42 @@ export class ClickLinkOptions { public readonly triggerKey: KeyCode; public readonly triggerModifier: 'ctrlKey' | 'shiftKey' | 'altKey' | 'metaKey'; public readonly triggerSideBySideKey: KeyCode; + public readonly triggerSideBySideModifier: 'ctrlKey' | 'shiftKey' | 'altKey' | 'metaKey'; - constructor(triggerKey: KeyCode, triggerModifier: 'ctrlKey' | 'shiftKey' | 'altKey' | 'metaKey', triggerSideBySideKey: KeyCode) { + constructor( + triggerKey: KeyCode, + triggerModifier: 'ctrlKey' | 'shiftKey' | 'altKey' | 'metaKey', + triggerSideBySideKey: KeyCode, + triggerSideBySideModifier: 'ctrlKey' | 'shiftKey' | 'altKey' | 'metaKey' + ) { this.triggerKey = triggerKey; this.triggerModifier = triggerModifier; this.triggerSideBySideKey = triggerSideBySideKey; + this.triggerSideBySideModifier = triggerSideBySideModifier; } + + public equals(other: ClickLinkOptions): boolean { + return ( + this.triggerKey === other.triggerKey + && this.triggerModifier === other.triggerModifier + && this.triggerSideBySideKey === other.triggerSideBySideKey + && this.triggerSideBySideModifier === other.triggerSideBySideModifier + ); + } +} + +function createOptions(multicursorModifier: 'altKey' | 'ctrlKey' | 'metaKey'): ClickLinkOptions { + if (multicursorModifier === 'altKey') { + if (platform.isMacintosh) { + return new ClickLinkOptions(KeyCode.Meta, 'metaKey', KeyCode.Alt, 'altKey'); + } + return new ClickLinkOptions(KeyCode.Ctrl, 'ctrlKey', KeyCode.Alt, 'altKey'); + } + + if (platform.isMacintosh) { + return new ClickLinkOptions(KeyCode.Alt, 'altKey', KeyCode.Meta, 'metaKey'); + } + return new ClickLinkOptions(KeyCode.Alt, 'altKey', KeyCode.Ctrl, 'ctrlKey'); } export class ClickLinkGesture extends Disposable { @@ -73,20 +108,32 @@ export class ClickLinkGesture extends Disposable { public readonly onCancel: Event = this._onCancel.event; private readonly _editor: ICodeEditor; - private readonly _opts: ClickLinkOptions; + private _opts: ClickLinkOptions; private lastMouseMoveEvent: ClickLinkMouseEvent; private hasTriggerKeyOnMouseDown: boolean; - constructor(editor: ICodeEditor, opts: ClickLinkOptions) { + constructor(editor: ICodeEditor) { super(); this._editor = editor; - this._opts = opts; + this._opts = createOptions(this._editor.getConfiguration().multicursorModifier); this.lastMouseMoveEvent = null; this.hasTriggerKeyOnMouseDown = false; + this._register(this._editor.onDidChangeConfiguration((e) => { + if (e.multicursorModifier) { + const newOpts = createOptions(this._editor.getConfiguration().multicursorModifier); + if (this._opts.equals(newOpts)) { + return; + } + this._opts = newOpts; + this.lastMouseMoveEvent = null; + this.hasTriggerKeyOnMouseDown = false; + this._onCancel.fire(); + } + })); this._register(this._editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(new ClickLinkMouseEvent(e, this._opts)))); this._register(this._editor.onMouseDown((e: IEditorMouseEvent) => this.onEditorMouseDown(new ClickLinkMouseEvent(e, this._opts)))); this._register(this._editor.onMouseUp((e: IEditorMouseEvent) => this.onEditorMouseUp(new ClickLinkMouseEvent(e, this._opts)))); diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts index e063801f2d9..a29f1511b44 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts @@ -10,8 +10,6 @@ import * as nls from 'vs/nls'; import { Throttler } from 'vs/base/common/async'; import { onUnexpectedError } from 'vs/base/common/errors'; import { MarkedString } from 'vs/base/common/htmlContent'; -import { KeyCode } from 'vs/base/common/keyCodes'; -import * as platform from 'vs/base/common/platform'; import { TPromise } from 'vs/base/common/winjs.base'; import { IModeService } from 'vs/editor/common/services/modeService'; import { Range } from 'vs/editor/common/core/range'; @@ -26,15 +24,12 @@ import { registerThemingParticipant } from 'vs/platform/theme/common/themeServic import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { EditorState, CodeEditorStateFlag } from 'vs/editor/common/core/editorState'; import { DefinitionAction, DefinitionActionConfig } from './goToDeclarationCommands'; -import { ClickLinkGesture, ClickLinkOptions, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from "vs/editor/contrib/goToDeclaration/browser/clickLinkGesture"; +import { ClickLinkGesture, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from "vs/editor/contrib/goToDeclaration/browser/clickLinkGesture"; @editorContribution class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorContribution { private static ID = 'editor.contrib.gotodefinitionwithmouse'; - static TRIGGER_MODIFIER: 'metaKey' | 'ctrlKey' = platform.isMacintosh ? 'metaKey' : 'ctrlKey'; - static TRIGGER_SIDEBYSIDE_KEY_VALUE = KeyCode.Alt; - static TRIGGER_KEY_VALUE = platform.isMacintosh ? KeyCode.Meta : KeyCode.Ctrl; static MAX_SOURCE_PREVIEW_LINES = 8; private editor: ICodeEditor; @@ -53,11 +48,7 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC this.editor = editor; this.throttler = new Throttler(); - let linkGesture = new ClickLinkGesture(editor, new ClickLinkOptions( - GotoDefinitionWithMouseEditorContribution.TRIGGER_KEY_VALUE, - GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER, - GotoDefinitionWithMouseEditorContribution.TRIGGER_SIDEBYSIDE_KEY_VALUE - )); + let linkGesture = new ClickLinkGesture(editor); this.toUnhook.push(linkGesture); this.toUnhook.push(linkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => { diff --git a/src/vs/editor/contrib/hover/browser/hover.ts b/src/vs/editor/contrib/hover/browser/hover.ts index 7660cff426e..b0229e73f1b 100644 --- a/src/vs/editor/contrib/hover/browser/hover.ts +++ b/src/vs/editor/contrib/hover/browser/hover.ts @@ -112,8 +112,7 @@ export class ModesHoverController implements editorCommon.IEditorContribution { } private _onKeyDown(e: IKeyboardEvent): void { - var stopKey = platform.isMacintosh ? KeyCode.Meta : KeyCode.Ctrl; - if (e.keyCode !== stopKey) { + if (e.keyCode !== KeyCode.Ctrl && e.keyCode !== KeyCode.Alt && e.keyCode !== KeyCode.Meta) { // Do not hide hover when Ctrl/Meta is pressed this._hideWidgets(); } diff --git a/src/vs/editor/contrib/links/browser/links.ts b/src/vs/editor/contrib/links/browser/links.ts index c14eaf2d911..58808a66a34 100644 --- a/src/vs/editor/contrib/links/browser/links.ts +++ b/src/vs/editor/contrib/links/browser/links.ts @@ -8,7 +8,6 @@ import 'vs/css!./links'; import * as nls from 'vs/nls'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { KeyCode } from 'vs/base/common/keyCodes'; import * as platform from 'vs/base/common/platform'; import Severity from 'vs/base/common/severity'; import { TPromise } from 'vs/base/common/winjs.base'; @@ -26,7 +25,7 @@ import { registerThemingParticipant } from 'vs/platform/theme/common/themeServic import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { Position } from 'vs/editor/common/core/position'; import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; -import { ClickLinkGesture, ClickLinkOptions, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from "vs/editor/contrib/goToDeclaration/browser/clickLinkGesture"; +import { ClickLinkGesture, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from "vs/editor/contrib/goToDeclaration/browser/clickLinkGesture"; const HOVER_MESSAGE_GENERAL = ( platform.isMacintosh @@ -91,8 +90,6 @@ class LinkDetector implements editorCommon.IEditorContribution { } static RECOMPUTE_TIME = 1000; // ms - static TRIGGER_KEY_VALUE = platform.isMacintosh ? KeyCode.Meta : KeyCode.Ctrl; - static TRIGGER_MODIFIER: 'metaKey' | 'ctrlKey' = platform.isMacintosh ? 'metaKey' : 'ctrlKey'; private editor: ICodeEditor; private listenersToRemove: IDisposable[]; @@ -116,11 +113,7 @@ class LinkDetector implements editorCommon.IEditorContribution { this.editorWorkerService = editorWorkerService; this.listenersToRemove = []; - let clickLinkGesture = new ClickLinkGesture(editor, new ClickLinkOptions( - LinkDetector.TRIGGER_KEY_VALUE, - LinkDetector.TRIGGER_MODIFIER, - KeyCode.Alt - )); + let clickLinkGesture = new ClickLinkGesture(editor); this.listenersToRemove.push(clickLinkGesture); this.listenersToRemove.push(clickLinkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => { this._onEditorMouseMove(mouseEvent, keyboardEvent); From 31aaf8757e04094421393e887a0ae5249b8c4cb1 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 25 May 2017 00:27:30 +0200 Subject: [PATCH 0926/1164] Show correct link hover when links open with Alt --- src/vs/editor/contrib/links/browser/links.ts | 67 +++++++++++++------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/src/vs/editor/contrib/links/browser/links.ts b/src/vs/editor/contrib/links/browser/links.ts index 58808a66a34..356f9bf6843 100644 --- a/src/vs/editor/contrib/links/browser/links.ts +++ b/src/vs/editor/contrib/links/browser/links.ts @@ -27,15 +27,40 @@ import { Position } from 'vs/editor/common/core/position'; import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; import { ClickLinkGesture, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from "vs/editor/contrib/goToDeclaration/browser/clickLinkGesture"; -const HOVER_MESSAGE_GENERAL = ( +const HOVER_MESSAGE_GENERAL_META = ( platform.isMacintosh ? nls.localize('links.navigate.mac', "Cmd + click to follow link") : nls.localize('links.navigate', "Ctrl + click to follow link") ); +const HOVER_MESSAGE_GENERAL_ALT = nls.localize('links.navigate.al', "Alt + click to follow link"); + +const decoration = { + meta: ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + inlineClassName: 'detected-link', + hoverMessage: HOVER_MESSAGE_GENERAL_META + }), + metaActive: ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + inlineClassName: 'detected-link-active', + hoverMessage: HOVER_MESSAGE_GENERAL_META + }), + alt: ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + inlineClassName: 'detected-link', + hoverMessage: HOVER_MESSAGE_GENERAL_ALT + }), + altActive: ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + inlineClassName: 'detected-link-active', + hoverMessage: HOVER_MESSAGE_GENERAL_ALT + }), +}; + class LinkOccurence { - public static decoration(link: Link): editorCommon.IModelDeltaDecoration { + public static decoration(link: Link, useMetaKey: boolean): editorCommon.IModelDeltaDecoration { return { range: { startLineNumber: link.range.startLineNumber, @@ -43,24 +68,15 @@ class LinkOccurence { endLineNumber: link.range.endLineNumber, endColumn: link.range.endColumn }, - options: LinkOccurence._getOptions(false) + options: LinkOccurence._getOptions(useMetaKey, false) }; } - private static _LINK_DECORATION = ModelDecorationOptions.register({ - stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, - inlineClassName: 'detected-link', - hoverMessage: HOVER_MESSAGE_GENERAL - }); - - private static _ACTIVE_LINK_DECORATION = ModelDecorationOptions.register({ - stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, - inlineClassName: 'detected-link-active', - hoverMessage: HOVER_MESSAGE_GENERAL - }); - - private static _getOptions(isActive: boolean): ModelDecorationOptions { - return (isActive ? this._ACTIVE_LINK_DECORATION : this._LINK_DECORATION); + private static _getOptions(useMetaKey: boolean, isActive: boolean): ModelDecorationOptions { + if (useMetaKey) { + return (isActive ? decoration.metaActive : decoration.meta); + } + return (isActive ? decoration.altActive : decoration.alt); } public decorationId: string; @@ -71,12 +87,12 @@ class LinkOccurence { this.decorationId = decorationId; } - public activate(changeAccessor: editorCommon.IModelDecorationsChangeAccessor): void { - changeAccessor.changeDecorationOptions(this.decorationId, LinkOccurence._getOptions(true)); + public activate(changeAccessor: editorCommon.IModelDecorationsChangeAccessor, useMetaKey: boolean): void { + changeAccessor.changeDecorationOptions(this.decorationId, LinkOccurence._getOptions(useMetaKey, true)); } - public deactivate(changeAccessor: editorCommon.IModelDecorationsChangeAccessor): void { - changeAccessor.changeDecorationOptions(this.decorationId, LinkOccurence._getOptions(false)); + public deactivate(changeAccessor: editorCommon.IModelDecorationsChangeAccessor, useMetaKey: boolean): void { + changeAccessor.changeDecorationOptions(this.decorationId, LinkOccurence._getOptions(useMetaKey, false)); } } @@ -183,6 +199,7 @@ class LinkDetector implements editorCommon.IEditorContribution { } private updateDecorations(links: Link[]): void { + const useMetaKey = (this.editor.getConfiguration().multicursorModifier === 'altKey'); this.editor.changeDecorations((changeAccessor: editorCommon.IModelDecorationsChangeAccessor) => { var oldDecorations: string[] = []; let keys = Object.keys(this.currentOccurences); @@ -196,7 +213,7 @@ class LinkDetector implements editorCommon.IEditorContribution { if (links) { // Not sure why this is sometimes null for (var i = 0; i < links.length; i++) { - newDecorations.push(LinkOccurence.decoration(links[i])); + newDecorations.push(LinkOccurence.decoration(links[i], useMetaKey)); } } @@ -212,12 +229,13 @@ class LinkDetector implements editorCommon.IEditorContribution { } private _onEditorMouseMove(mouseEvent: ClickLinkMouseEvent, withKey?: ClickLinkKeyboardEvent): void { + const useMetaKey = (this.editor.getConfiguration().multicursorModifier === 'altKey'); if (this.isEnabled(mouseEvent, withKey)) { this.cleanUpActiveLinkDecoration(); // always remove previous link decoration as their can only be one var occurence = this.getLinkOccurence(mouseEvent.target.position); if (occurence) { this.editor.changeDecorations((changeAccessor) => { - occurence.activate(changeAccessor); + occurence.activate(changeAccessor, useMetaKey); this.activeLinkDecorationId = occurence.decorationId; }); } @@ -227,11 +245,12 @@ class LinkDetector implements editorCommon.IEditorContribution { } private cleanUpActiveLinkDecoration(): void { + const useMetaKey = (this.editor.getConfiguration().multicursorModifier === 'altKey'); if (this.activeLinkDecorationId) { var occurence = this.currentOccurences[this.activeLinkDecorationId]; if (occurence) { this.editor.changeDecorations((changeAccessor) => { - occurence.deactivate(changeAccessor); + occurence.deactivate(changeAccessor, useMetaKey); }); } From 70c10c9172452809c88d2ccf7e8d713580457e31 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 24 May 2017 15:46:59 -0700 Subject: [PATCH 0927/1164] Fix #26634 - if a `./` include pattern contains glob characters, ignore the `./` --- .../search/browser/patternInputWidget.ts | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/patternInputWidget.ts b/src/vs/workbench/parts/search/browser/patternInputWidget.ts index 75bef0a6f43..0657073ca2f 100644 --- a/src/vs/workbench/parts/search/browser/patternInputWidget.ts +++ b/src/vs/workbench/parts/search/browser/patternInputWidget.ts @@ -110,8 +110,6 @@ export class PatternInputWidget extends Widget { return {}; } - const isSearchPath = segment => segment.match(/^\.\//); - let exprSegments: string[]; let searchPaths: string[]; if (isGlobPattern) { @@ -119,21 +117,17 @@ export class PatternInputWidget extends Widget { .map(s => s.trim()) .filter(s => !!s.length); - const groups = collections.groupBy(segments, - segment => isSearchPath(segment) ? 'searchPaths' : 'exprSegments'); - searchPaths = groups.searchPaths || []; - exprSegments = groups.exprSegments || []; + const groups = this.groupByPathsAndExprSegments(segments); + searchPaths = groups.searchPaths; + exprSegments = groups.exprSegments; } else { const segments = pattern.split(',') .map(s => strings.trim(s.trim(), '/')) .filter(s => !!s.length); - const groups = collections.groupBy(segments, - segment => isSearchPath(segment) ? 'searchPaths' : 'exprSegments'); - searchPaths = groups.searchPaths || []; - exprSegments = groups.exprSegments || []; - - exprSegments = exprSegments + const groups = this.groupByPathsAndExprSegments(segments); + searchPaths = groups.searchPaths; + exprSegments = groups.exprSegments .map(p => { if (p[0] === '.') { p = '*' + p; // convert ".js" to "*.js" @@ -147,6 +141,27 @@ export class PatternInputWidget extends Widget { return { expression, searchPaths }; } + private groupByPathsAndExprSegments(segments: string[]) { + const isSearchPath = segment => segment.match(/^\.\//); + + const groups = collections.groupBy(segments, + segment => isSearchPath(segment) ? 'searchPaths' : 'exprSegments'); + groups.searchPaths = groups.searchPaths || []; + groups.exprSegments = groups.exprSegments || []; + + // If a ./searchPath has a glob character, remove ./ and use it as an expression segment + groups.searchPaths = groups.searchPaths.filter(searchPath => { + if (searchPath.match(/[\*\{\}\(\)\[\]\?]/)) { + groups.exprSegments.push(strings.ltrim(searchPath, './')); + return false; + } + + return true; + }); + + return groups; + } + public select(): void { this.inputBox.select(); } From f95866f07eaf1cdea610479a11778ae82f69bf4b Mon Sep 17 00:00:00 2001 From: rebornix Date: Wed, 24 May 2017 16:17:47 -0700 Subject: [PATCH 0928/1164] Fix #25783. Middle click pastes in Find Widget on Linux --- src/vs/base/browser/ui/findinput/findInput.ts | 5 +++++ src/vs/editor/contrib/find/browser/findWidget.ts | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/vs/base/browser/ui/findinput/findInput.ts b/src/vs/base/browser/ui/findinput/findInput.ts index 2d38be64dc9..2d447646974 100644 --- a/src/vs/base/browser/ui/findinput/findInput.ts +++ b/src/vs/base/browser/ui/findinput/findInput.ts @@ -13,6 +13,7 @@ import { IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview import { Widget } from 'vs/base/browser/ui/widget'; import Event, { Emitter } from 'vs/base/common/event'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { IMouseEvent } from 'vs/base/browser/mouseEvent'; import { KeyCode } from 'vs/base/common/keyCodes'; import { CaseSensitiveCheckbox, WholeWordsCheckbox, RegexCheckbox } from 'vs/base/browser/ui/findinput/findInputCheckboxes'; import { Color } from 'vs/base/common/color'; @@ -69,6 +70,9 @@ export class FindInput extends Widget { private _onKeyDown = this._register(new Emitter()); public onKeyDown: Event = this._onKeyDown.event; + private _onMouseDown = this._register(new Emitter()); + public onMouseDown: Event = this._onMouseDown.event; + private _onInput = this._register(new Emitter()); public onInput: Event = this._onInput.event; @@ -113,6 +117,7 @@ export class FindInput extends Widget { this.onkeydown(this.inputBox.inputElement, (e) => this._onKeyDown.fire(e)); this.onkeyup(this.inputBox.inputElement, (e) => this._onKeyUp.fire(e)); this.oninput(this.inputBox.inputElement, (e) => this._onInput.fire()); + this.onmousedown(this.inputBox.inputElement, (e) => this._onMouseDown.fire(e)); } public enable(): void { diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index 78e442c6992..409caf8fb73 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -9,9 +9,11 @@ import 'vs/css!./findWidget'; import * as nls from 'vs/nls'; import { onUnexpectedError } from 'vs/base/common/errors'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import * as platform from 'vs/base/common/platform'; import * as strings from 'vs/base/common/strings'; import * as dom from 'vs/base/browser/dom'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { IMouseEvent } from 'vs/base/browser/mouseEvent'; import { IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview'; import { FindInput, IFindInputStyles } from 'vs/base/browser/ui/findinput/findInput'; import { IMessage as InputBoxMessage, InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; @@ -514,6 +516,13 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas this._findInput.highlightFindOptions(); } + private _onFindInputMouseDown(e: IMouseEvent): void { + // on linux, middle key does pasting. + if (e.middleButton) { + e.stopPropagation(); + } + } + private _onFindInputKeyDown(e: IKeyboardEvent): void { if (e.equals(KeyCode.Enter)) { @@ -647,6 +656,9 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas } } })); + if (platform.isLinux) { + this._register(this._findInput.onMouseDown((e) => this._onFindInputMouseDown(e))); + } this._matchesCount = document.createElement('div'); this._matchesCount.className = 'matchesCount'; From 755d45a10785bf5008f27e10a8d607c4443dbf0c Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 24 May 2017 20:04:00 -0700 Subject: [PATCH 0929/1164] Clean up termianl imports --- .../electron-browser/terminal.contribution.ts | 4 +- .../electron-browser/terminalActions.ts | 4 +- .../electron-browser/terminalColorRegistry.ts | 2 +- .../electron-browser/terminalInstance.ts | 46 +++++++++---------- .../electron-browser/terminalPanel.ts | 26 +++++------ 5 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts index 6becf5badb0..c4e3fc01471 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts @@ -7,9 +7,10 @@ import 'vs/css!./media/scrollbar'; import 'vs/css!./media/terminal'; import 'vs/css!./media/xterm'; import 'vs/css!./media/widgets'; +import * as debugActions from 'vs/workbench/parts/debug/browser/debugActions'; +import * as nls from 'vs/nls'; import * as panel from 'vs/workbench/browser/panel'; import * as platform from 'vs/base/common/platform'; -import nls = require('vs/nls'); import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { GlobalQuickOpenAction } from 'vs/workbench/browser/parts/quickopen/quickopen.contribution'; import { ITerminalService, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_PANEL_ID, TERMINAL_DEFAULT_RIGHT_CLICK_COPY_PASTE, TerminalCursorStyle } from 'vs/workbench/parts/terminal/common/terminal'; @@ -24,7 +25,6 @@ import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { TerminalService } from 'vs/workbench/parts/terminal/electron-browser/terminalService'; import { ToggleTabFocusModeAction } from 'vs/editor/contrib/toggleTabFocusMode/common/toggleTabFocusMode'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import debugActions = require('vs/workbench/parts/debug/browser/debugActions'); import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { OpenNextRecentlyUsedEditorInGroupAction, OpenPreviousRecentlyUsedEditorInGroupAction, FocusActiveGroupAction, FocusFirstGroupAction, FocusSecondGroupAction, FocusThirdGroupAction } from 'vs/workbench/browser/parts/editor/editorActions'; import { EDITOR_FONT_DEFAULTS } from "vs/editor/common/config/editorOptions"; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts index 58cd361fd34..3b62f9642ed 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import nls = require('vs/nls'); -import os = require('os'); +import * as nls from 'vs/nls'; +import * as os from 'os'; import { Action, IAction } from 'vs/base/common/actions'; import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService'; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts index 727078be3bc..27f3f23c8ba 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import nls = require('vs/nls'); +import * as nls from 'vs/nls'; import { registerColor, ColorIdentifier } from 'vs/platform/theme/common/colorRegistry'; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 07f8b6b53cb..8d7d30b7099 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -3,15 +3,15 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as cp from 'child_process'; +import * as os from 'os'; import * as path from 'path'; -import DOM = require('vs/base/browser/dom'); +import * as lifecycle from 'vs/base/common/lifecycle'; +import * as nls from 'vs/nls'; +import * as platform from 'vs/base/common/platform'; +import * as dom from 'vs/base/browser/dom'; import Event, { Emitter } from 'vs/base/common/event'; -import URI from 'vs/base/common/uri'; -import cp = require('child_process'); -import lifecycle = require('vs/base/common/lifecycle'); -import nls = require('vs/nls'); -import os = require('os'); -import platform = require('vs/base/common/platform'); +import Uri from 'vs/base/common/uri'; import xterm = require('xterm'); import { Dimension } from 'vs/base/browser/builder'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; @@ -39,7 +39,7 @@ class StandardTerminalProcessFactory implements ITerminalProcessFactory { public create(env: { [key: string]: string }): cp.ChildProcess { return cp.fork('./terminalProcess', [], { env, - cwd: URI.parse(path.dirname(require.toUrl('./terminalProcess'))).fsPath + cwd: Uri.parse(path.dirname(require.toUrl('./terminalProcess'))).fsPath }); } } @@ -217,7 +217,7 @@ export class TerminalInstance implements ITerminalInstance { this._container = container; this._wrapperElement = document.createElement('div'); - DOM.addClass(this._wrapperElement, 'terminal-wrapper'); + dom.addClass(this._wrapperElement, 'terminal-wrapper'); this._xtermElement = document.createElement('div'); this._xterm.open(this._xtermElement, false); @@ -242,7 +242,7 @@ export class TerminalInstance implements ITerminalInstance { } return undefined; }); - this._instanceDisposables.push(DOM.addDisposableListener(this._xterm.element, 'mouseup', (event: KeyboardEvent) => { + this._instanceDisposables.push(dom.addDisposableListener(this._xterm.element, 'mouseup', (event: KeyboardEvent) => { // Wait until mouseup has propogated through the DOM before evaluating the new selection // state. setTimeout(() => { @@ -251,7 +251,7 @@ export class TerminalInstance implements ITerminalInstance { })); // xterm.js currently drops selection on keyup as we need to handle this case. - this._instanceDisposables.push(DOM.addDisposableListener(this._xterm.element, 'keyup', (event: KeyboardEvent) => { + this._instanceDisposables.push(dom.addDisposableListener(this._xterm.element, 'keyup', (event: KeyboardEvent) => { // Wait until keyup has propogated through the DOM before evaluating the new selection // state. setTimeout(() => { @@ -262,10 +262,10 @@ export class TerminalInstance implements ITerminalInstance { const xtermHelper: HTMLElement = this._xterm.element.querySelector('.xterm-helpers'); const focusTrap: HTMLElement = document.createElement('div'); focusTrap.setAttribute('tabindex', '0'); - DOM.addClass(focusTrap, 'focus-trap'); - this._instanceDisposables.push(DOM.addDisposableListener(focusTrap, 'focus', (event: FocusEvent) => { + dom.addClass(focusTrap, 'focus-trap'); + this._instanceDisposables.push(dom.addDisposableListener(focusTrap, 'focus', (event: FocusEvent) => { let currentElement = focusTrap; - while (!DOM.hasClass(currentElement, 'part')) { + while (!dom.hasClass(currentElement, 'part')) { currentElement = currentElement.parentElement; } const hidePanelElement = currentElement.querySelector('.hide-panel-action'); @@ -273,17 +273,17 @@ export class TerminalInstance implements ITerminalInstance { })); xtermHelper.insertBefore(focusTrap, this._xterm.textarea); - this._instanceDisposables.push(DOM.addDisposableListener(this._xterm.textarea, 'focus', (event: KeyboardEvent) => { + this._instanceDisposables.push(dom.addDisposableListener(this._xterm.textarea, 'focus', (event: KeyboardEvent) => { this._terminalFocusContextKey.set(true); })); - this._instanceDisposables.push(DOM.addDisposableListener(this._xterm.textarea, 'blur', (event: KeyboardEvent) => { + this._instanceDisposables.push(dom.addDisposableListener(this._xterm.textarea, 'blur', (event: KeyboardEvent) => { this._terminalFocusContextKey.reset(); this._refreshSelectionContextKey(); })); - this._instanceDisposables.push(DOM.addDisposableListener(this._xterm.element, 'focus', (event: KeyboardEvent) => { + this._instanceDisposables.push(dom.addDisposableListener(this._xterm.element, 'focus', (event: KeyboardEvent) => { this._terminalFocusContextKey.set(true); })); - this._instanceDisposables.push(DOM.addDisposableListener(this._xterm.element, 'blur', (event: KeyboardEvent) => { + this._instanceDisposables.push(dom.addDisposableListener(this._xterm.element, 'blur', (event: KeyboardEvent) => { this._terminalFocusContextKey.reset(); this._refreshSelectionContextKey(); })); @@ -336,7 +336,7 @@ export class TerminalInstance implements ITerminalInstance { this._linkHandler.dispose(); } if (this._xterm && this._xterm.element) { - this._hadFocusOnExit = DOM.hasClass(this._xterm.element, 'focus'); + this._hadFocusOnExit = dom.hasClass(this._xterm.element, 'focus'); } if (this._wrapperElement) { this._container.removeChild(this._wrapperElement); @@ -389,7 +389,7 @@ export class TerminalInstance implements ITerminalInstance { public setVisible(visible: boolean): void { this._isVisible = visible; if (this._wrapperElement) { - DOM.toggleClass(this._wrapperElement, 'active', visible); + dom.toggleClass(this._wrapperElement, 'active', visible); } if (visible && this._xterm) { // Trigger a manual scroll event which will sync the viewport and scroll bar. This is @@ -473,9 +473,9 @@ export class TerminalInstance implements ITerminalInstance { } const env = TerminalInstance.createTerminalEnv(process.env, shell, this._getCwd(shell, workspace), locale, this._cols, this._rows); this._title = shell.name || ''; - this._process = cp.fork(URI.parse(require.toUrl('bootstrap')).fsPath, ['--type=terminal'], { + this._process = cp.fork(Uri.parse(require.toUrl('bootstrap')).fsPath, ['--type=terminal'], { env, - cwd: URI.parse(path.dirname(require.toUrl('../node/terminalProcess'))).fsPath + cwd: Uri.parse(path.dirname(require.toUrl('../node/terminalProcess'))).fsPath }); if (!shell.name) { // Only listen for process title changes when a name is not provided @@ -559,7 +559,7 @@ export class TerminalInstance implements ITerminalInstance { } private _attachPressAnyKeyToCloseListener() { - this._processDisposables.push(DOM.addDisposableListener(this._xterm.textarea, 'keypress', (event: KeyboardEvent) => { + this._processDisposables.push(dom.addDisposableListener(this._xterm.textarea, 'keypress', (event: KeyboardEvent) => { this.dispose(); event.preventDefault(); })); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index 81ed253bd42..ec880bdd12c 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -3,9 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import DOM = require('vs/base/browser/dom'); -import nls = require('vs/nls'); -import platform = require('vs/base/common/platform'); +import * as dom from 'vs/base/browser/dom'; +import * as nls from 'vs/nls'; +import * as platform from 'vs/base/common/platform'; import { Action, IAction } from 'vs/base/common/actions'; import { Builder, Dimension } from 'vs/base/browser/builder'; import { IActionItem, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; @@ -51,12 +51,12 @@ export class TerminalPanel extends Panel { public create(parent: Builder): TPromise { super.create(parent); this._parentDomElement = parent.getHTMLElement(); - DOM.addClass(this._parentDomElement, 'integrated-terminal'); + dom.addClass(this._parentDomElement, 'integrated-terminal'); this._themeStyleElement = document.createElement('style'); this._fontStyleElement = document.createElement('style'); this._terminalContainer = document.createElement('div'); - DOM.addClass(this._terminalContainer, 'terminal-outer-container'); + dom.addClass(this._terminalContainer, 'terminal-outer-container'); this._parentDomElement.appendChild(this._themeStyleElement); this._parentDomElement.appendChild(this._fontStyleElement); this._parentDomElement.appendChild(this._terminalContainer); @@ -152,7 +152,7 @@ export class TerminalPanel extends Panel { } private _attachEventListeners(): void { - this._register(DOM.addDisposableListener(this._parentDomElement, 'mousedown', (event: MouseEvent) => { + this._register(dom.addDisposableListener(this._parentDomElement, 'mousedown', (event: MouseEvent) => { if (this._terminalService.terminalInstances.length === 0) { return; } @@ -183,7 +183,7 @@ export class TerminalPanel extends Panel { } } })); - this._register(DOM.addDisposableListener(this._parentDomElement, 'contextmenu', (event: MouseEvent) => { + this._register(dom.addDisposableListener(this._parentDomElement, 'contextmenu', (event: MouseEvent) => { if (!this._cancelContextMenu) { const standardEvent = new StandardMouseEvent(event); let anchor: { x: number, y: number } = { x: standardEvent.posx, y: standardEvent.posy }; @@ -196,7 +196,7 @@ export class TerminalPanel extends Panel { } this._cancelContextMenu = false; })); - this._register(DOM.addDisposableListener(this._parentDomElement, 'click', (event) => { + this._register(dom.addDisposableListener(this._parentDomElement, 'click', (event) => { if (this._terminalService.terminalInstances.length === 0) { return; } @@ -205,14 +205,14 @@ export class TerminalPanel extends Panel { this._terminalService.getActiveInstance().focus(); } })); - this._register(DOM.addDisposableListener(this._parentDomElement, 'keyup', (event: KeyboardEvent) => { + this._register(dom.addDisposableListener(this._parentDomElement, 'keyup', (event: KeyboardEvent) => { if (event.keyCode === 27) { // Keep terminal open on escape event.stopPropagation(); } })); - this._register(DOM.addDisposableListener(this._parentDomElement, DOM.EventType.DROP, (e: DragEvent) => { - if (e.target === this._parentDomElement || DOM.isAncestor(e.target as HTMLElement, this._parentDomElement)) { + this._register(dom.addDisposableListener(this._parentDomElement, dom.EventType.DROP, (e: DragEvent) => { + if (e.target === this._parentDomElement || dom.isAncestor(e.target as HTMLElement, this._parentDomElement)) { if (!e.dataTransfer) { return; } @@ -269,8 +269,8 @@ export class TerminalPanel extends Panel { return; } let newFont = this._terminalService.configHelper.getFont(); - DOM.toggleClass(this._parentDomElement, 'enable-ligatures', this._terminalService.configHelper.config.fontLigatures); - DOM.toggleClass(this._parentDomElement, 'disable-bold', !this._terminalService.configHelper.config.enableBold); + dom.toggleClass(this._parentDomElement, 'enable-ligatures', this._terminalService.configHelper.config.fontLigatures); + dom.toggleClass(this._parentDomElement, 'disable-bold', !this._terminalService.configHelper.config.enableBold); if (!this._font || this._fontsDiffer(this._font, newFont)) { this._fontStyleElement.innerHTML = '.monaco-workbench .panel.integrated-terminal .xterm {' + `font-family: ${newFont.fontFamily};` + From 17f0dc9aad1213b46d00fea41e1fe1e68f7ab838 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 24 May 2017 22:33:35 -0700 Subject: [PATCH 0930/1164] Reverting prev fix as it adds gap between docs and list --- .../editor/contrib/suggest/browser/media/suggest.css | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index 08b4e45593d..fe64def759b 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -34,18 +34,12 @@ .monaco-editor .suggest-widget.docs-side > .tree, .monaco-editor .suggest-widget.docs-side > .details { - /* subtract 2px for border, and another 2 for the Chromium zoom issue - where the children get slightly bigger width than what is set - which makes the docs go below the list */ - width: calc(50% - 4px); + width: 328px; } .monaco-editor.hc-black .suggest-widget.docs-side > .tree, .monaco-editor.hc-black .suggest-widget.docs-side > .details { - /* subtract 4px for border, and another 2 for the Chromium zoom issue - where the children get slightly bigger width than what is set - which makes the docs go below the list */ - width: calc(50% - 6px); + width: 326px; } /* Styles for Message element for when widget is loading or is empty */ From 9c6dd374824a40b8425835e813b9b16b598b2945 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 24 May 2017 22:48:10 -0700 Subject: [PATCH 0931/1164] Fixes #26244 prevent double border --- .../contrib/suggest/browser/media/suggest.css | 30 +++++++++---- .../contrib/suggest/browser/suggestWidget.ts | 42 +++++++++++++++---- 2 files changed, 58 insertions(+), 14 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index fe64def759b..7ca54b83969 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -34,7 +34,17 @@ .monaco-editor .suggest-widget.docs-side > .tree, .monaco-editor .suggest-widget.docs-side > .details { - width: 328px; + /* subtract 2px for border, and another 2 for the Chromium zoom issue + where the children get slightly bigger width than what is set + which makes the docs go below the list */ + width: calc(50% - 4px); + float: left; + +} + +.monaco-editor .suggest-widget.docs-side.list-right > .tree, +.monaco-editor .suggest-widget.docs-side.list-right > .details { + float: right; } .monaco-editor.hc-black .suggest-widget.docs-side > .tree, @@ -42,6 +52,14 @@ width: 326px; } +.monaco-editor .suggest-widget.docs-side .empty-left-border { + border-left-width: 0px; +} + +.monaco-editor .suggest-widget.docs-side .empty-right-border { + border-right-width: 0px; +} + /* Styles for Message element for when widget is loading or is empty */ .monaco-editor .suggest-widget > .message { padding-left: 22px; @@ -58,13 +76,7 @@ height: 100%; } -.monaco-editor .suggest-widget.docs-side > .tree { - float: left; -} -.monaco-editor .suggest-widget.docs-side.list-right > .tree { - float: right -} /** Styles for each row in the list element **/ @@ -207,6 +219,10 @@ display: none; } +.monaco-editor .suggest-widget.docs-below .details { + border-top-width: 0px; +} + .monaco-editor .suggest-widget .details > .monaco-scrollable-element { flex: 1; } diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 56871ef9504..c27e0dbaa95 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -948,14 +948,42 @@ export class SuggestWidget implements IContentWidget, IDelegate } private adjustListPosition(): void { - if (hasClass(this.element, 'widget-above') - && hasClass(this.element, 'docs-side') - && this.details.element.offsetHeight > this.listElement.offsetHeight) { - // Docs is bigger than list and widget is above cursor, apply margin-top so that list appears right above cursor - this.listElement.style.marginTop = `${this.details.element.offsetHeight - this.listElement.offsetHeight}px`; - } else { - this.listElement.style.marginTop = '0px'; + + + if (hasClass(this.element, 'docs-side')) { + + if (this.details.element.offsetHeight > this.listElement.offsetHeight) { + if (hasClass(this.element, 'widget-above')) { + // Docs is bigger than list and widget is above cursor, apply margin-top so that list appears right above cursor + this.listElement.style.marginTop = `${this.details.element.offsetHeight - this.listElement.offsetHeight}px`; + } + + if (hasClass(this.element, 'list-right')) { + addClass(this.listElement, 'empty-left-border'); + removeClass(this.listElement, 'empty-right-border'); + } else { + addClass(this.listElement, 'empty-right-border'); + removeClass(this.listElement, 'empty-left-border'); + } + + removeClass(this.details.element, 'empty-left-border'); + removeClass(this.details.element, 'empty-right-border'); + return; + } else { + if (hasClass(this.element, 'list-right')) { + addClass(this.details.element, 'empty-right-border'); + removeClass(this.details.element, 'empty-left-border'); + } else { + addClass(this.details.element, 'empty-left-border'); + removeClass(this.details.element, 'empty-right-border'); + } + + removeClass(this.listElement, 'empty-right-border'); + removeClass(this.listElement, 'empty-left-border'); + } } + + this.listElement.style.marginTop = '0px'; } private renderDetails(): void { From 2e08585bac59ee3e721803e6234e7e0e7623d5c8 Mon Sep 17 00:00:00 2001 From: Daniel Ye Date: Wed, 24 May 2017 22:56:48 -0700 Subject: [PATCH 0932/1164] 2017-05-24. Merged in translations from transifex. --- build/win32/i18n/messages.pt-br.isl | 8 + .../out/settingsDocumentHelper.i18n.json | 2 +- i18n/chs/extensions/gulp/out/main.i18n.json | 2 +- i18n/chs/extensions/jake/out/main.i18n.json | 4 +- i18n/chs/extensions/jake/package.i18n.json | 4 +- .../markdown/out/extension.i18n.json | 6 + .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/chs/extensions/npm/package.i18n.json | 6 + .../resourceviewer/resourceViewer.i18n.json | 2 - .../src/vs/code/electron-main/menus.i18n.json | 4 +- .../config/commonEditorConfig.i18n.json | 6 +- .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../indentation/common/indentation.i18n.json | 2 +- .../suggest/browser/suggestWidget.i18n.json | 2 +- .../common/configurationRegistry.i18n.json | 2 +- .../markers/common/problemMatcher.i18n.json | 7 + .../api/node/extHostTreeViews.i18n.json | 6 +- .../src/vs/workbench/common/theme.i18n.json | 1 + .../main.contribution.i18n.json | 1 + .../inspectKeybindings.i18n.json | 2 +- .../electron-browser/toggleWordWrap.i18n.json | 2 +- .../parts/debug/node/debugAdapter.i18n.json | 1 + .../actions/evaluateMath.i18n.json | 2 +- .../actions/incrementDecrement.i18n.json | 12 +- .../actions/removeTag.i18n.json | 2 +- .../actions/splitJoinTag.i18n.json | 2 +- .../actions/updateImageSize.i18n.json | 2 +- .../actions/updateTag.i18n.json | 6 +- .../actions/wrapWithAbbreviation.i18n.json | 2 +- .../emmet.contribution.i18n.json | 6 +- .../treeExplorer.contribution.i18n.json | 4 +- .../extensionsUtils.i18n.json | 6 +- .../browser/files.contribution.i18n.json | 1 - .../common/editors/fileEditorInput.i18n.json | 2 +- .../performance.contribution.i18n.json | 8 +- .../browser/keybindingsEditor.i18n.json | 4 +- .../browser/preferencesActions.i18n.json | 2 +- .../scm.contribution.i18n.json | 3 +- .../scm/electron-browser/scmMenus.i18n.json | 3 +- .../electron-browser/TMSnippets.i18n.json | 2 +- .../parts/tasks/browser/quickOpen.i18n.json | 4 +- .../terminalTaskSystem.i18n.json | 3 +- .../tasks/node/processTaskSystem.i18n.json | 3 +- .../electron-browser/watermark.i18n.json | 2 +- .../vs_code_welcome_page.i18n.json | 7 +- .../electron-browser/welcomePage.i18n.json | 14 ++ .../workbenchThemeService.i18n.json | 12 +- .../markdown/out/extension.i18n.json | 6 + .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/cht/extensions/npm/package.i18n.json | 6 + .../resourceviewer/resourceViewer.i18n.json | 2 - .../src/vs/code/electron-main/menus.i18n.json | 1 + .../config/commonEditorConfig.i18n.json | 1 - .../common/view/editorColorRegistry.i18n.json | 3 + .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../api/node/extHostTreeViews.i18n.json | 4 +- .../src/vs/workbench/common/theme.i18n.json | 1 + .../main.contribution.i18n.json | 1 + .../extensionsUtils.i18n.json | 6 +- .../browser/files.contribution.i18n.json | 1 - .../performance.contribution.i18n.json | 6 +- .../scm.contribution.i18n.json | 1 + .../scm/electron-browser/scmMenus.i18n.json | 1 + .../parts/tasks/browser/quickOpen.i18n.json | 4 +- .../themes.contribution.i18n.json | 1 + .../vs_code_welcome_page.i18n.json | 3 + .../electron-browser/welcomePage.i18n.json | 13 +- .../walkThroughPart.i18n.json | 3 +- i18n/deu/extensions/git/out/main.i18n.json | 2 +- .../markdown/out/extension.i18n.json | 6 + .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/deu/extensions/npm/package.i18n.json | 6 + .../resourceviewer/resourceViewer.i18n.json | 2 - .../config/commonEditorConfig.i18n.json | 1 - .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../main.contribution.i18n.json | 1 + .../extensionsUtils.i18n.json | 6 +- .../browser/files.contribution.i18n.json | 1 - .../performance.contribution.i18n.json | 6 +- .../electron-browser/welcomePage.i18n.json | 5 + i18n/esn/extensions/jake/out/main.i18n.json | 4 +- i18n/esn/extensions/jake/package.i18n.json | 4 +- .../markdown/out/extension.i18n.json | 6 + .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/esn/extensions/npm/package.i18n.json | 6 + .../resourceviewer/resourceViewer.i18n.json | 2 - .../config/commonEditorConfig.i18n.json | 3 +- .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../suggest/browser/suggestWidget.i18n.json | 1 + ...guageConfigurationExtensionPoint.i18n.json | 6 +- .../markers/common/problemMatcher.i18n.json | 7 + .../theme/common/colorRegistry.i18n.json | 3 + .../api/node/extHostTreeViews.i18n.json | 6 +- .../src/vs/workbench/common/theme.i18n.json | 1 + .../main.contribution.i18n.json | 1 + .../parts/debug/node/debugAdapter.i18n.json | 1 + .../extensionsUtils.i18n.json | 6 +- .../browser/files.contribution.i18n.json | 1 - .../performance.contribution.i18n.json | 8 +- .../scm.contribution.i18n.json | 1 + .../scm/electron-browser/scmMenus.i18n.json | 1 + .../parts/tasks/browser/quickOpen.i18n.json | 4 +- .../terminalTaskSystem.i18n.json | 3 +- .../tasks/node/processTaskSystem.i18n.json | 3 +- .../vs_code_welcome_page.i18n.json | 5 + .../electron-browser/welcomePage.i18n.json | 14 ++ .../markdown/out/extension.i18n.json | 6 + .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/fra/extensions/npm/package.i18n.json | 6 + .../resourceviewer/resourceViewer.i18n.json | 2 - .../config/commonEditorConfig.i18n.json | 1 - .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../main.contribution.i18n.json | 1 + .../extensionsUtils.i18n.json | 6 +- .../browser/files.contribution.i18n.json | 1 - .../performance.contribution.i18n.json | 6 +- .../electron-browser/welcomePage.i18n.json | 5 + .../markdown/out/extension.i18n.json | 6 + .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/ita/extensions/npm/package.i18n.json | 6 + .../resourceviewer/resourceViewer.i18n.json | 2 - .../config/commonEditorConfig.i18n.json | 2 +- .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../markers/common/problemMatcher.i18n.json | 7 + .../main.contribution.i18n.json | 1 + .../extensionsUtils.i18n.json | 6 +- .../browser/files.contribution.i18n.json | 1 - .../performance.contribution.i18n.json | 6 +- .../electron-browser/welcomePage.i18n.json | 5 + i18n/jpn/extensions/jake/out/main.i18n.json | 4 +- i18n/jpn/extensions/jake/package.i18n.json | 4 +- .../markdown/out/extension.i18n.json | 6 + .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/jpn/extensions/npm/package.i18n.json | 6 + .../extensions/typescript/package.i18n.json | 5 +- .../resourceviewer/resourceViewer.i18n.json | 2 - .../config/commonEditorConfig.i18n.json | 2 +- .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../suggest/browser/suggestWidget.i18n.json | 1 + ...guageConfigurationExtensionPoint.i18n.json | 1 + .../markers/common/problemMatcher.i18n.json | 7 + .../theme/common/colorRegistry.i18n.json | 1 + .../api/node/extHostTreeViews.i18n.json | 6 +- .../src/vs/workbench/common/theme.i18n.json | 1 + .../main.contribution.i18n.json | 1 + .../electronDebugActions.i18n.json | 1 + .../parts/debug/node/debugAdapter.i18n.json | 1 + .../extensionsUtils.i18n.json | 6 +- .../browser/files.contribution.i18n.json | 3 +- .../performance.contribution.i18n.json | 8 +- .../browser/preferencesRenderers.i18n.json | 1 + .../scm.contribution.i18n.json | 1 + .../scm/electron-browser/scmMenus.i18n.json | 1 + .../parts/tasks/browser/quickOpen.i18n.json | 4 +- .../tasks/browser/restartQuickOpen.i18n.json | 2 +- .../tasks/browser/taskQuickOpen.i18n.json | 2 +- .../terminalTaskSystem.i18n.json | 3 +- .../tasks/node/processTaskSystem.i18n.json | 3 +- .../terminalActions.i18n.json | 4 +- .../themes.contribution.i18n.json | 1 + .../vs_code_welcome_page.i18n.json | 7 + .../electron-browser/welcomePage.i18n.json | 18 +- .../configurationEditingService.i18n.json | 1 + .../markdown/out/extension.i18n.json | 6 + .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/kor/extensions/npm/package.i18n.json | 6 + .../resourceviewer/resourceViewer.i18n.json | 2 - .../config/commonEditorConfig.i18n.json | 1 - .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../main.contribution.i18n.json | 1 + .../extensionsUtils.i18n.json | 6 +- .../browser/files.contribution.i18n.json | 1 - .../performance.contribution.i18n.json | 6 +- .../electron-browser/welcomePage.i18n.json | 5 + .../out/settingsDocumentHelper.i18n.json | 36 ++++ .../css/client/out/cssMain.i18n.json | 8 + i18n/ptb/extensions/css/package.i18n.json | 67 +++++++ .../out/packageDocumentHelper.i18n.json | 9 + .../extensions/git/out/askpass-main.i18n.json | 8 + .../ptb/extensions/git/out/commands.i18n.json | 43 +++++ i18n/ptb/extensions/git/out/main.i18n.json | 11 ++ i18n/ptb/extensions/git/out/model.i18n.json | 14 ++ .../extensions/git/out/scmProvider.i18n.json | 8 + .../extensions/git/out/statusbar.i18n.json | 11 ++ i18n/ptb/extensions/git/package.i18n.json | 48 +++++ i18n/ptb/extensions/grunt/out/main.i18n.json | 8 + i18n/ptb/extensions/grunt/package.i18n.json | 8 + i18n/ptb/extensions/gulp/out/main.i18n.json | 8 + i18n/ptb/extensions/gulp/package.i18n.json | 8 + .../html/client/out/htmlMain.i18n.json | 8 + i18n/ptb/extensions/html/package.i18n.json | 27 +++ i18n/ptb/extensions/jake/out/main.i18n.json | 8 + i18n/ptb/extensions/jake/package.i18n.json | 8 + .../features/bowerJSONContribution.i18n.json | 10 ++ .../packageJSONContribution.i18n.json | 13 ++ .../json/client/out/jsonMain.i18n.json | 8 + i18n/ptb/extensions/json/package.i18n.json | 15 ++ .../markdown/out/extension.i18n.json | 6 + .../out/previewContentProvider.i18n.json | 10 ++ .../markdown/out/security.i18n.json | 11 ++ .../ptb/extensions/markdown/package.i18n.json | 22 +++ .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/ptb/extensions/npm/package.i18n.json | 6 + .../out/features/validationProvider.i18n.json | 13 ++ i18n/ptb/extensions/php/package.i18n.json | 14 ++ .../out/features/bufferSyncSupport.i18n.json | 12 ++ .../features/completionItemProvider.i18n.json | 9 + ...rectiveCommentCompletionProvider.i18n.json | 10 ++ .../implementationsCodeLensProvider.i18n.json | 10 ++ .../jsDocCompletionProvider.i18n.json | 8 + .../referencesCodeLensProvider.i18n.json | 10 ++ .../typescript/out/typescriptMain.i18n.json | 15 ++ .../out/typescriptServiceClient.i18n.json | 24 +++ .../typescript/out/utils/logger.i18n.json | 8 + .../out/utils/projectStatus.i18n.json | 12 ++ .../out/utils/typingsStatus.i18n.json | 12 ++ .../extensions/typescript/package.i18n.json | 45 +++++ .../browser/ui/actionbar/actionbar.i18n.json | 8 + .../vs/base/browser/ui/aria/aria.i18n.json | 8 + .../browser/ui/findinput/findInput.i18n.json | 8 + .../findinput/findInputCheckboxes.i18n.json | 10 ++ .../browser/ui/inputbox/inputBox.i18n.json | 10 ++ .../resourceviewer/resourceViewer.i18n.json | 15 ++ .../base/browser/ui/toolbar/toolbar.i18n.json | 8 + .../src/vs/base/common/errorMessage.i18n.json | 18 ++ .../base/common/jsonErrorMessages.i18n.json | 16 ++ .../src/vs/base/common/processes.i18n.json | 11 ++ .../ptb/src/vs/base/common/severity.i18n.json | 10 ++ i18n/ptb/src/vs/base/node/processes.i18n.json | 8 + i18n/ptb/src/vs/base/node/zip.i18n.json | 8 + .../browser/quickOpenModel.i18n.json | 9 + .../browser/quickOpenWidget.i18n.json | 9 + .../parts/tree/browser/treeDefaults.i18n.json | 8 + .../src/vs/code/electron-main/menus.i18n.json | 164 ++++++++++++++++++ .../vs/code/electron-main/window.i18n.json | 8 + .../vs/code/electron-main/windows.i18n.json | 22 +++ .../src/vs/code/node/cliProcessMain.i18n.json | 17 ++ .../config/commonEditorConfig.i18n.json | 76 ++++++++ .../common/config/editorOptions.i18n.json | 8 + .../editor/common/controller/cursor.i18n.json | 8 + .../model/textModelWithTokens.i18n.json | 8 + .../common/modes/modesRegistry.i18n.json | 8 + .../editor/common/services/bulkEdit.i18n.json | 11 ++ .../common/services/modeServiceImpl.i18n.json | 16 ++ .../services/modelServiceImpl.i18n.json | 9 + .../common/view/editorColorRegistry.i18n.json | 20 +++ .../browser/accessibility.i18n.json | 15 ++ .../common/bracketMatching.i18n.json | 8 + .../common/caretOperations.i18n.json | 9 + .../common/transpose.i18n.json | 8 + .../clipboard/browser/clipboard.i18n.json | 11 ++ .../contrib/comment/common/comment.i18n.json | 11 ++ .../contextmenu/browser/contextmenu.i18n.json | 8 + .../contrib/find/browser/findWidget.i18n.json | 21 +++ .../find/common/findController.i18n.json | 19 ++ .../contrib/folding/browser/folding.i18n.json | 14 ++ .../format/browser/formatActions.i18n.json | 13 ++ .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../gotoError/browser/gotoError.i18n.json | 13 ++ .../contrib/hover/browser/hover.i18n.json | 8 + .../hover/browser/modesContentHover.i18n.json | 8 + .../common/inPlaceReplace.i18n.json | 9 + .../indentation/common/indentation.i18n.json | 15 ++ .../inspectTMScopes.i18n.json | 9 + .../common/linesOperations.i18n.json | 25 +++ .../contrib/links/browser/links.i18n.json | 12 ++ .../multicursor/common/multicursor.i18n.json | 10 ++ .../browser/parameterHints.i18n.json | 8 + .../browser/parameterHintsWidget.i18n.json | 8 + .../browser/quickFixCommands.i18n.json | 10 ++ .../browser/referenceSearch.i18n.json | 9 + .../browser/referencesController.i18n.json | 8 + .../browser/referencesModel.i18n.json | 14 ++ .../browser/referencesWidget.i18n.json | 27 +++ .../contrib/rename/browser/rename.i18n.json | 11 ++ .../rename/browser/renameInputField.i18n.json | 8 + .../smartSelect/common/smartSelect.i18n.json | 9 + .../browser/suggestController.i18n.json | 9 + .../suggest/browser/suggestWidget.i18n.json | 21 +++ .../common/toggleTabFocusMode.i18n.json | 8 + .../common/wordHighlighter.i18n.json | 9 + .../browser/peekViewWidget.i18n.json | 8 + .../textMate/TMSyntax.i18n.json | 14 ++ ...guageConfigurationExtensionPoint.i18n.json | 23 +++ .../editor/node/textMate/TMGrammars.i18n.json | 13 ++ .../browser/menuItemActionItem.i18n.json | 8 + .../menusExtensionPoint.i18n.json | 41 +++++ .../common/configurationRegistry.i18n.json | 19 ++ .../platform/environment/node/argv.i18n.json | 32 ++++ .../extensionEnablementService.i18n.json | 8 + .../common/extensionManagement.i18n.json | 9 + .../node/extensionGalleryService.i18n.json | 9 + .../node/extensionManagementService.i18n.json | 22 +++ .../common/abstractExtensionService.i18n.json | 11 ++ .../common/extensionsRegistry.i18n.json | 24 +++ .../node/extensionValidator.i18n.json | 24 +++ .../node/integrityServiceImpl.i18n.json | 11 ++ .../jsonValidationExtensionPoint.i18n.json | 15 ++ .../abstractKeybindingService.i18n.json | 9 + .../common/keybindingLabels.i18n.json | 16 ++ .../markers/common/problemMatcher.i18n.json | 61 +++++++ .../platform/message/common/message.i18n.json | 10 ++ .../platform/request/node/request.i18n.json | 11 ++ .../common/telemetryService.i18n.json | 9 + .../theme/common/colorRegistry.i18n.json | 78 +++++++++ .../mainThreadExtensionService.i18n.json | 9 + .../mainThreadMessageService.i18n.json | 10 ++ .../api/node/extHostDiagnostics.i18n.json | 8 + .../api/node/extHostTreeViews.i18n.json | 10 ++ .../browser/actions/configureLocale.i18n.json | 13 ++ .../browser/actions/fileActions.i18n.json | 9 + .../toggleActivityBarVisibility.i18n.json | 9 + .../actions/toggleEditorLayout.i18n.json | 11 ++ .../actions/toggleSidebarPosition.i18n.json | 9 + .../actions/toggleSidebarVisibility.i18n.json | 9 + .../toggleStatusbarVisibility.i18n.json | 9 + .../browser/actions/toggleZenMode.i18n.json | 9 + .../activitybar/activitybarActions.i18n.json | 14 ++ .../activitybar/activitybarPart.i18n.json | 9 + .../browser/parts/compositePart.i18n.json | 9 + .../parts/editor/binaryDiffEditor.i18n.json | 8 + .../parts/editor/binaryEditor.i18n.json | 8 + .../editor/editor.contribution.i18n.json | 16 ++ .../parts/editor/editorActions.i18n.json | 55 ++++++ .../parts/editor/editorCommands.i18n.json | 12 ++ .../browser/parts/editor/editorPart.i18n.json | 14 ++ .../parts/editor/editorPicker.i18n.json | 13 ++ .../parts/editor/editorStatus.i18n.json | 49 ++++++ .../parts/editor/tabsTitleControl.i18n.json | 8 + .../parts/editor/textDiffEditor.i18n.json | 16 ++ .../browser/parts/editor/textEditor.i18n.json | 8 + .../parts/editor/textResourceEditor.i18n.json | 12 ++ .../parts/editor/titleControl.i18n.json | 14 ++ .../parts/panel/panelActions.i18n.json | 15 ++ .../browser/parts/panel/panelPart.i18n.json | 8 + .../quickopen/quickOpenController.i18n.json | 17 ++ .../quickopen.contribution.i18n.json | 12 ++ .../parts/sidebar/sidebarPart.i18n.json | 9 + .../parts/statusbar/statusbarPart.i18n.json | 9 + .../parts/titlebar/titlebarPart.i18n.json | 9 + .../vs/workbench/browser/quickopen.i18n.json | 11 ++ .../vs/workbench/browser/viewlet.i18n.json | 9 + .../src/vs/workbench/common/theme.i18n.json | 44 +++++ .../electron-browser/actions.i18n.json | 41 +++++ .../electron-browser/commands.i18n.json | 8 + .../electron-browser/crashReporter.i18n.json | 9 + .../electron-browser/extensionHost.i18n.json | 11 ++ .../main.contribution.i18n.json | 62 +++++++ .../workbench/electron-browser/main.i18n.json | 9 + .../electron-browser/shell.i18n.json | 8 + .../electron-browser/window.i18n.json | 15 ++ .../node/extensionHostMain.i18n.json | 8 + .../workbench/node/extensionPoints.i18n.json | 11 ++ .../cli.contribution.i18n.json | 18 ++ .../inspectKeybindings.i18n.json | 8 + .../toggleRenderControlCharacter.i18n.json | 8 + .../toggleRenderWhitespace.i18n.json | 8 + .../electron-browser/toggleWordWrap.i18n.json | 11 ++ .../wordWrapMigration.i18n.json | 11 ++ .../debug/browser/breakpointWidget.i18n.json | 13 ++ .../debug/browser/debugActionItems.i18n.json | 9 + .../debug/browser/debugActions.i18n.json | 49 ++++++ .../browser/debugActionsWidget.i18n.json | 8 + .../browser/debugContentProvider.i18n.json | 8 + .../browser/debugEditorActions.i18n.json | 15 ++ .../browser/debugEditorModelManager.i18n.json | 11 ++ .../debug/browser/debugQuickOpen.i18n.json | 11 ++ .../debug/browser/exceptionWidget.i18n.json | 11 ++ .../debug/browser/linkDetector.i18n.json | 9 + .../parts/debug/common/debug.i18n.json | 8 + .../parts/debug/common/debugModel.i18n.json | 9 + .../parts/debug/common/debugSource.i18n.json | 8 + .../debug.contribution.i18n.json | 20 +++ .../electron-browser/debugCommands.i18n.json | 8 + .../debugConfigurationManager.i18n.json | 38 ++++ .../debugEditorContribution.i18n.json | 20 +++ .../electron-browser/debugHover.i18n.json | 8 + .../electron-browser/debugService.i18n.json | 25 +++ .../electron-browser/debugViewer.i18n.json | 28 +++ .../electron-browser/debugViews.i18n.json | 20 +++ .../electronDebugActions.i18n.json | 11 ++ .../rawDebugSession.i18n.json | 12 ++ .../debug/electron-browser/repl.i18n.json | 11 ++ .../electron-browser/replViewer.i18n.json | 12 ++ .../statusbarColorProvider.i18n.json | 8 + .../terminalSupport.i18n.json | 9 + .../parts/debug/node/debugAdapter.i18n.json | 20 +++ .../actions/showEmmetCommands.i18n.json | 8 + .../actions/balance.i18n.json | 9 + .../actions/editPoints.i18n.json | 9 + .../actions/evaluateMath.i18n.json | 8 + .../actions/expandAbbreviation.i18n.json | 8 + .../actions/incrementDecrement.i18n.json | 13 ++ .../actions/matchingPair.i18n.json | 8 + .../actions/mergeLines.i18n.json | 8 + .../actions/reflectCssValue.i18n.json | 8 + .../actions/removeTag.i18n.json | 8 + .../actions/selectItem.i18n.json | 9 + .../actions/splitJoinTag.i18n.json | 8 + .../actions/toggleComment.i18n.json | 8 + .../actions/updateImageSize.i18n.json | 8 + .../actions/updateTag.i18n.json | 10 ++ .../actions/wrapWithAbbreviation.i18n.json | 10 ++ .../emmet.contribution.i18n.json | 13 ++ .../terminal.contribution.i18n.json | 15 ++ .../terminalService.i18n.json | 12 ++ .../treeExplorer.contribution.i18n.json | 14 ++ .../browser/treeExplorerActions.i18n.json | 8 + .../browser/treeExplorerService.i18n.json | 8 + .../browser/views/treeExplorerView.i18n.json | 8 + .../browser/dependenciesViewer.i18n.json | 9 + .../browser/extensionEditor.i18n.json | 39 +++++ .../browser/extensionsActions.i18n.json | 55 ++++++ .../browser/extensionsQuickOpen.i18n.json | 10 ++ .../common/extensionsFileTemplate.i18n.json | 10 ++ .../common/extensionsInput.i18n.json | 8 + .../extensionTipsService.i18n.json | 16 ++ .../extensions.contribution.i18n.json | 15 ++ .../extensionsActions.i18n.json | 11 ++ .../extensionsUtils.i18n.json | 10 ++ .../extensionsViewlet.i18n.json | 15 ++ .../node/extensionsWorkbenchService.i18n.json | 17 ++ .../electron-browser/feedback.i18n.json | 25 +++ .../editors/binaryFileEditor.i18n.json | 8 + .../browser/editors/textFileEditor.i18n.json | 11 ++ .../fileActions.contribution.i18n.json | 11 ++ .../parts/files/browser/fileActions.i18n.json | 73 ++++++++ .../files/browser/fileCommands.i18n.json | 9 + .../browser/files.contribution.i18n.json | 40 +++++ .../files/browser/saveErrorHandler.i18n.json | 16 ++ .../files/browser/views/emptyView.i18n.json | 11 ++ .../browser/views/explorerView.i18n.json | 9 + .../browser/views/explorerViewer.i18n.json | 12 ++ .../browser/views/openEditorsView.i18n.json | 11 ++ .../browser/views/openEditorsViewer.i18n.json | 13 ++ .../files/common/dirtyFilesTracker.i18n.json | 8 + .../common/editors/fileEditorInput.i18n.json | 8 + .../html/browser/html.contribution.i18n.json | 8 + .../html/browser/htmlPreviewPart.i18n.json | 8 + .../parts/html/browser/webview.i18n.json | 8 + .../parts/markers/common/messages.i18n.json | 39 +++++ .../markersElectronContributions.i18n.json | 8 + .../nps.contribution.i18n.json | 11 ++ .../browser/output.contribution.i18n.json | 10 ++ .../output/browser/outputActions.i18n.json | 11 ++ .../output/browser/outputPanel.i18n.json | 9 + .../parts/output/common/output.i18n.json | 9 + .../performance.contribution.i18n.json | 15 ++ .../browser/keybindingWidgets.i18n.json | 9 + .../browser/keybindingsEditor.i18n.json | 35 ++++ .../keybindingsEditorContribution.i18n.json | 10 ++ .../preferences.contribution.i18n.json | 10 ++ .../browser/preferencesActions.i18n.json | 14 ++ .../browser/preferencesEditor.i18n.json | 15 ++ .../browser/preferencesRenderers.i18n.json | 13 ++ .../browser/preferencesService.i18n.json | 13 ++ .../browser/preferencesWidgets.i18n.json | 10 ++ .../common/keybindingsEditorModel.i18n.json | 11 ++ .../common/preferencesModels.i18n.json | 9 + .../browser/commandsHandler.i18n.json | 16 ++ .../browser/gotoLineHandler.i18n.json | 14 ++ .../browser/gotoSymbolHandler.i18n.json | 34 ++++ .../quickopen/browser/helpHandler.i18n.json | 10 ++ .../browser/quickopen.contribution.i18n.json | 14 ++ .../browser/viewPickerHandler.i18n.json | 15 ++ .../scm.contribution.i18n.json | 12 ++ .../electron-browser/scmActivity.i18n.json | 8 + .../scm/electron-browser/scmMenus.i18n.json | 9 + .../scm/electron-browser/scmViewlet.i18n.json | 10 ++ .../browser/openAnythingHandler.i18n.json | 9 + .../search/browser/openFileHandler.i18n.json | 9 + .../browser/openSymbolHandler.i18n.json | 11 ++ .../browser/patternInputWidget.i18n.json | 12 ++ .../search/browser/replaceService.i18n.json | 8 + .../browser/search.contribution.i18n.json | 22 +++ .../search/browser/searchActions.i18n.json | 21 +++ .../browser/searchResultsView.i18n.json | 12 ++ .../search/browser/searchViewlet.i18n.json | 50 ++++++ .../search/browser/searchWidget.i18n.json | 15 ++ .../electron-browser/TMSnippets.i18n.json | 13 ++ .../electron-browser/insertSnippet.i18n.json | 8 + .../snippets.contribution.i18n.json | 16 ++ .../snippetsService.i18n.json | 9 + .../electron-browser/tabCompletion.i18n.json | 8 + .../parts/tasks/browser/quickOpen.i18n.json | 10 ++ .../tasks/browser/restartQuickOpen.i18n.json | 10 ++ .../tasks/browser/taskQuickOpen.i18n.json | 10 ++ .../browser/terminateQuickOpen.i18n.json | 10 ++ .../tasks/common/taskConfiguration.i18n.json | 17 ++ .../tasks/common/taskTemplates.i18n.json | 13 ++ .../jsonSchemaCommon.i18n.json | 38 ++++ .../electron-browser/jsonSchema_v1.i18n.json | 12 ++ .../electron-browser/jsonSchema_v2.i18n.json | 14 ++ .../task.contribution.i18n.json | 47 +++++ .../terminalTaskSystem.i18n.json | 11 ++ .../node/processRunnerDetector.i18n.json | 15 ++ .../tasks/node/processTaskSystem.i18n.json | 12 ++ .../terminal.contribution.i18n.json | 30 ++++ .../terminalActions.i18n.json | 32 ++++ .../terminalColorRegistry.i18n.json | 10 ++ .../terminalConfigHelper.i18n.json | 10 ++ .../terminalInstance.i18n.json | 11 ++ .../terminalLinkHandler.i18n.json | 9 + .../electron-browser/terminalPanel.i18n.json | 11 ++ .../terminalService.i18n.json | 15 ++ .../themes.contribution.i18n.json | 19 ++ ...edWorkspaceSettings.contribution.i18n.json | 11 ++ .../releaseNotesInput.i18n.json | 8 + .../update.contribution.i18n.json | 10 ++ .../update/electron-browser/update.i18n.json | 19 ++ .../electron-browser/watermark.i18n.json | 24 +++ .../overlay/browser/welcomeOverlay.i18n.json | 17 ++ .../vs_code_welcome_page.i18n.json | 44 +++++ .../welcomePage.contribution.i18n.json | 10 ++ .../electron-browser/welcomePage.i18n.json | 31 ++++ .../editor/editorWalkThrough.i18n.json | 9 + .../walkThrough.contribution.i18n.json | 10 ++ .../walkThroughActions.i18n.json | 11 ++ .../walkThroughPart.i18n.json | 10 ++ .../configurationEditingService.i18n.json | 17 ++ .../editor/browser/editorService.i18n.json | 8 + .../electron-browser/fileService.i18n.json | 11 ++ .../services/files/node/fileService.i18n.json | 14 ++ .../common/keybindingEditing.i18n.json | 11 ++ .../keybindingService.i18n.json | 26 +++ .../message/browser/messageList.i18n.json | 14 ++ .../electron-browser/messageService.i18n.json | 9 + .../common/workbenchModeService.i18n.json | 16 ++ .../common/textFileEditorModel.i18n.json | 9 + .../textfile/common/textFileService.i18n.json | 8 + .../textFileService.i18n.json | 18 ++ .../themes/common/colorThemeSchema.i18n.json | 11 ++ .../common/fileIconThemeSchema.i18n.json | 37 ++++ .../electron-browser/colorThemeData.i18n.json | 13 ++ .../workbenchThemeService.i18n.json | 32 ++++ .../markdown/out/extension.i18n.json | 6 + .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/rus/extensions/npm/package.i18n.json | 6 + .../resourceviewer/resourceViewer.i18n.json | 2 - .../src/vs/code/electron-main/menus.i18n.json | 2 + .../config/commonEditorConfig.i18n.json | 1 - .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../main.contribution.i18n.json | 1 + .../extensionsUtils.i18n.json | 6 +- .../browser/files.contribution.i18n.json | 1 - .../performance.contribution.i18n.json | 6 +- .../electron-browser/welcomePage.i18n.json | 5 + 587 files changed, 6511 insertions(+), 128 deletions(-) create mode 100644 build/win32/i18n/messages.pt-br.isl create mode 100644 i18n/chs/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/chs/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/chs/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/chs/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/chs/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/chs/extensions/npm/package.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json create mode 100644 i18n/cht/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/cht/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/cht/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/cht/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/cht/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/cht/extensions/npm/package.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json create mode 100644 i18n/deu/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/deu/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/deu/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/deu/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/deu/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/deu/extensions/npm/package.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json create mode 100644 i18n/esn/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/esn/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/esn/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/esn/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/esn/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/esn/extensions/npm/package.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json create mode 100644 i18n/fra/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/fra/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/fra/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/fra/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/fra/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/fra/extensions/npm/package.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json create mode 100644 i18n/ita/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/ita/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/ita/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/ita/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/ita/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/ita/extensions/npm/package.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json create mode 100644 i18n/jpn/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/jpn/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/jpn/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/jpn/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/jpn/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/jpn/extensions/npm/package.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json create mode 100644 i18n/kor/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/kor/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/kor/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/kor/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/kor/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/kor/extensions/npm/package.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json create mode 100644 i18n/ptb/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json create mode 100644 i18n/ptb/extensions/css/client/out/cssMain.i18n.json create mode 100644 i18n/ptb/extensions/css/package.i18n.json create mode 100644 i18n/ptb/extensions/extension-editing/out/packageDocumentHelper.i18n.json create mode 100644 i18n/ptb/extensions/git/out/askpass-main.i18n.json create mode 100644 i18n/ptb/extensions/git/out/commands.i18n.json create mode 100644 i18n/ptb/extensions/git/out/main.i18n.json create mode 100644 i18n/ptb/extensions/git/out/model.i18n.json create mode 100644 i18n/ptb/extensions/git/out/scmProvider.i18n.json create mode 100644 i18n/ptb/extensions/git/out/statusbar.i18n.json create mode 100644 i18n/ptb/extensions/git/package.i18n.json create mode 100644 i18n/ptb/extensions/grunt/out/main.i18n.json create mode 100644 i18n/ptb/extensions/grunt/package.i18n.json create mode 100644 i18n/ptb/extensions/gulp/out/main.i18n.json create mode 100644 i18n/ptb/extensions/gulp/package.i18n.json create mode 100644 i18n/ptb/extensions/html/client/out/htmlMain.i18n.json create mode 100644 i18n/ptb/extensions/html/package.i18n.json create mode 100644 i18n/ptb/extensions/jake/out/main.i18n.json create mode 100644 i18n/ptb/extensions/jake/package.i18n.json create mode 100644 i18n/ptb/extensions/javascript/out/features/bowerJSONContribution.i18n.json create mode 100644 i18n/ptb/extensions/javascript/out/features/packageJSONContribution.i18n.json create mode 100644 i18n/ptb/extensions/json/client/out/jsonMain.i18n.json create mode 100644 i18n/ptb/extensions/json/package.i18n.json create mode 100644 i18n/ptb/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/ptb/extensions/markdown/out/previewContentProvider.i18n.json create mode 100644 i18n/ptb/extensions/markdown/out/security.i18n.json create mode 100644 i18n/ptb/extensions/markdown/package.i18n.json create mode 100644 i18n/ptb/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/ptb/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/ptb/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/ptb/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/ptb/extensions/npm/package.i18n.json create mode 100644 i18n/ptb/extensions/php/out/features/validationProvider.i18n.json create mode 100644 i18n/ptb/extensions/php/package.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/features/bufferSyncSupport.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/features/completionItemProvider.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/features/implementationsCodeLensProvider.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/features/jsDocCompletionProvider.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/features/referencesCodeLensProvider.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/typescriptMain.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/typescriptServiceClient.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/utils/logger.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/utils/projectStatus.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/utils/typingsStatus.i18n.json create mode 100644 i18n/ptb/extensions/typescript/package.i18n.json create mode 100644 i18n/ptb/src/vs/base/browser/ui/actionbar/actionbar.i18n.json create mode 100644 i18n/ptb/src/vs/base/browser/ui/aria/aria.i18n.json create mode 100644 i18n/ptb/src/vs/base/browser/ui/findinput/findInput.i18n.json create mode 100644 i18n/ptb/src/vs/base/browser/ui/findinput/findInputCheckboxes.i18n.json create mode 100644 i18n/ptb/src/vs/base/browser/ui/inputbox/inputBox.i18n.json create mode 100644 i18n/ptb/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json create mode 100644 i18n/ptb/src/vs/base/browser/ui/toolbar/toolbar.i18n.json create mode 100644 i18n/ptb/src/vs/base/common/errorMessage.i18n.json create mode 100644 i18n/ptb/src/vs/base/common/jsonErrorMessages.i18n.json create mode 100644 i18n/ptb/src/vs/base/common/processes.i18n.json create mode 100644 i18n/ptb/src/vs/base/common/severity.i18n.json create mode 100644 i18n/ptb/src/vs/base/node/processes.i18n.json create mode 100644 i18n/ptb/src/vs/base/node/zip.i18n.json create mode 100644 i18n/ptb/src/vs/base/parts/quickopen/browser/quickOpenModel.i18n.json create mode 100644 i18n/ptb/src/vs/base/parts/quickopen/browser/quickOpenWidget.i18n.json create mode 100644 i18n/ptb/src/vs/base/parts/tree/browser/treeDefaults.i18n.json create mode 100644 i18n/ptb/src/vs/code/electron-main/menus.i18n.json create mode 100644 i18n/ptb/src/vs/code/electron-main/window.i18n.json create mode 100644 i18n/ptb/src/vs/code/electron-main/windows.i18n.json create mode 100644 i18n/ptb/src/vs/code/node/cliProcessMain.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/config/editorOptions.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/controller/cursor.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/model/textModelWithTokens.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/modes/modesRegistry.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/services/bulkEdit.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/services/modeServiceImpl.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/services/modelServiceImpl.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/accessibility/browser/accessibility.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/bracketMatching/common/bracketMatching.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/caretOperations/common/caretOperations.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/caretOperations/common/transpose.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/clipboard/browser/clipboard.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/comment/common/comment.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/contextmenu/browser/contextmenu.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/find/browser/findWidget.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/find/common/findController.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/folding/browser/folding.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/format/browser/formatActions.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/hover/browser/hover.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/hover/browser/modesContentHover.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/indentation/common/indentation.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/linesOperations/common/linesOperations.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/links/browser/links.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/multicursor/common/multicursor.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/parameterHints/browser/parameterHints.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/quickFix/browser/quickFixCommands.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referenceSearch.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesController.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/rename/browser/rename.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/rename/browser/renameInputField.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/smartSelect/common/smartSelect.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/suggest/browser/suggestController.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/toggleTabFocusMode/common/toggleTabFocusMode.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/zoneWidget/browser/peekViewWidget.i18n.json create mode 100644 i18n/ptb/src/vs/editor/electron-browser/textMate/TMSyntax.i18n.json create mode 100644 i18n/ptb/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json create mode 100644 i18n/ptb/src/vs/editor/node/textMate/TMGrammars.i18n.json create mode 100644 i18n/ptb/src/vs/platform/actions/browser/menuItemActionItem.i18n.json create mode 100644 i18n/ptb/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json create mode 100644 i18n/ptb/src/vs/platform/configuration/common/configurationRegistry.i18n.json create mode 100644 i18n/ptb/src/vs/platform/environment/node/argv.i18n.json create mode 100644 i18n/ptb/src/vs/platform/extensionManagement/common/extensionEnablementService.i18n.json create mode 100644 i18n/ptb/src/vs/platform/extensionManagement/common/extensionManagement.i18n.json create mode 100644 i18n/ptb/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json create mode 100644 i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json create mode 100644 i18n/ptb/src/vs/platform/extensions/common/abstractExtensionService.i18n.json create mode 100644 i18n/ptb/src/vs/platform/extensions/common/extensionsRegistry.i18n.json create mode 100644 i18n/ptb/src/vs/platform/extensions/node/extensionValidator.i18n.json create mode 100644 i18n/ptb/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json create mode 100644 i18n/ptb/src/vs/platform/jsonschemas/common/jsonValidationExtensionPoint.i18n.json create mode 100644 i18n/ptb/src/vs/platform/keybinding/common/abstractKeybindingService.i18n.json create mode 100644 i18n/ptb/src/vs/platform/keybinding/common/keybindingLabels.i18n.json create mode 100644 i18n/ptb/src/vs/platform/markers/common/problemMatcher.i18n.json create mode 100644 i18n/ptb/src/vs/platform/message/common/message.i18n.json create mode 100644 i18n/ptb/src/vs/platform/request/node/request.i18n.json create mode 100644 i18n/ptb/src/vs/platform/telemetry/common/telemetryService.i18n.json create mode 100644 i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/api/node/extHostDiagnostics.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/api/node/extHostTreeViews.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/actions/configureLocale.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/actions/fileActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/actions/toggleActivityBarVisibility.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/actions/toggleEditorLayout.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/actions/toggleSidebarPosition.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/actions/toggleSidebarVisibility.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/actions/toggleStatusbarVisibility.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/actions/toggleZenMode.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/activitybar/activitybarPart.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/compositePart.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/binaryDiffEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/binaryEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/editor.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/editorActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/editorPart.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/editorPicker.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/tabsTitleControl.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/textDiffEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/textEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/textResourceEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/titleControl.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/panel/panelActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/panel/panelPart.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickopen.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/sidebar/sidebarPart.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/statusbar/statusbarPart.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/titlebar/titlebarPart.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/quickopen.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/viewlet.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/common/theme.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/electron-browser/commands.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/electron-browser/crashReporter.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/electron-browser/extensionHost.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/electron-browser/main.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/electron-browser/shell.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/electron-browser/window.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/node/extensionHostMain.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/node/extensionPoints.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/cli/electron-browser/cli.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/wordWrapMigration.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointWidget.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/debugActionItems.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/debugContentProvider.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorModelManager.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/debugQuickOpen.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/exceptionWidget.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/common/debug.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/common/debugModel.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/common/debugSource.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugHover.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugViewer.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugViews.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/repl.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/browser/actions/showEmmetCommands.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/execution/electron-browser/terminal.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorerActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorerService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/explorers/browser/views/treeExplorerView.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/browser/dependenciesViewer.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/common/extensionsFileTemplate.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/common/extensionsInput.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/feedback/electron-browser/feedback.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/editors/binaryFileEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/fileCommands.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/saveErrorHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/views/emptyView.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/views/explorerView.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/views/explorerViewer.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/views/openEditorsViewer.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/common/editors/fileEditorInput.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/html/browser/html.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/html/browser/htmlPreviewPart.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/html/browser/webview.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/markers/common/messages.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markersElectronContributions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/nps/electron-browser/nps.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/output/browser/output.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/output/browser/outputActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/output/browser/outputPanel.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/output/common/output.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/browser/preferences.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/common/preferencesModels.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/quickopen/browser/helpHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/quickopen/browser/quickopen.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmActivity.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/openAnythingHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/openFileHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/openSymbolHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/replaceService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/search.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/searchActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/searchViewlet.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/searchWidget.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/tabCompletion.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/browser/terminateQuickOpen.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/common/taskConfiguration.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/common/taskTemplates.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v1.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/node/processRunnerDetector.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/editorWalkThrough.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/editor/browser/editorService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/files/electron-browser/fileService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/files/node/fileService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/keybinding/common/keybindingEditing.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/message/browser/messageList.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/message/electron-browser/messageService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/textfile/common/textFileEditorModel.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/textfile/common/textFileService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/textfile/electron-browser/textFileService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json create mode 100644 i18n/rus/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/rus/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/rus/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/rus/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/rus/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/rus/extensions/npm/package.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json diff --git a/build/win32/i18n/messages.pt-br.isl b/build/win32/i18n/messages.pt-br.isl new file mode 100644 index 00000000000..7021e814e8f --- /dev/null +++ b/build/win32/i18n/messages.pt-br.isl @@ -0,0 +1,8 @@ +[CustomMessages] +AddContextMenuFiles=Adicione a ao "Abrir com %1" ao menu de contexto de arquivo do Windows Explorer +AddContextMenuFolders=Adicione a ao "Abrir com %1" ao menu de contexto de diretrio do Windows Explorer +AssociateWithFiles=Registre %1 como um editor para tipos de arquivos suportados +AddToPath=Adicione em PATH (disponvel aps reiniciar) +RunAfter=Executar %1 aps a instalao +Other=Outros: +SourceFile=Arquivo Fonte %1 \ No newline at end of file diff --git a/i18n/chs/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json b/i18n/chs/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json index 6ad910135a0..f40aa81fa48 100644 --- a/i18n/chs/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json +++ b/i18n/chs/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "activeEditorShort": "例如 myFile.txt", - "activeEditorMedium": "e.g. myFolder/myFile.txt", + "activeEditorMedium": "例如 myFolder/myFile.txt", "activeEditorLong": "例如 /Users/Development/myProject/myFolder/myFile.txt", "rootName": "例如 myProject", "rootPath": "例如 /Users/Development/myProject", diff --git a/i18n/chs/extensions/gulp/out/main.i18n.json b/i18n/chs/extensions/gulp/out/main.i18n.json index 500082cf82f..bda8a250c25 100644 --- a/i18n/chs/extensions/gulp/out/main.i18n.json +++ b/i18n/chs/extensions/gulp/out/main.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "execFailed": "自动检测 gulp 失败,错误为: {0}" + "execFailed": "自动检测 gulp 失败,错误:{0}" } \ No newline at end of file diff --git a/i18n/chs/extensions/jake/out/main.i18n.json b/i18n/chs/extensions/jake/out/main.i18n.json index 8b6ad71cd4e..d2f56bdda98 100644 --- a/i18n/chs/extensions/jake/out/main.i18n.json +++ b/i18n/chs/extensions/jake/out/main.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "execFailed": "自动检测 Jake 失败,错误:{0}" +} \ No newline at end of file diff --git a/i18n/chs/extensions/jake/package.i18n.json b/i18n/chs/extensions/jake/package.i18n.json index 8b6ad71cd4e..46f020cf890 100644 --- a/i18n/chs/extensions/jake/package.i18n.json +++ b/i18n/chs/extensions/jake/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.jake.autoDetect": "控制自动检测 Jake 任务是否打开。默认开启。" +} \ No newline at end of file diff --git a/i18n/chs/extensions/markdown/out/extension.i18n.json b/i18n/chs/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/chs/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/chs/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/chs/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/extensions/merge-conflict/package.i18n.json b/i18n/chs/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/extensions/npm/package.i18n.json b/i18n/chs/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/chs/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index 7b395b9c15a..4e5bf82d935 100644 --- a/i18n/chs/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/chs/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,8 +6,6 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "图像太大,无法在编辑器中显示。 ", - "resourceOpenExternalButton": "打开图片", - "resourceOpenExternalText": " 是否使用外部程序?", "nativeBinaryError": "文件将不在编辑器中显示,因为它是二进制文件、非常大或使用不支持的文本编码。", "sizeB": "{0} B", "sizeKB": "{0} KB", diff --git a/i18n/chs/src/vs/code/electron-main/menus.i18n.json b/i18n/chs/src/vs/code/electron-main/menus.i18n.json index 16b5dc1479a..4f7e61e056c 100644 --- a/i18n/chs/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/chs/src/vs/code/electron-main/menus.i18n.json @@ -146,7 +146,7 @@ "miInteractivePlayground": "交互式演练场(&&I)", "miDocumentation": "文档(&&D)", "miReleaseNotes": "发行说明(&&R)", - "miKeyboardShortcuts": "键盘快捷方式参考(&&K)", + "miKeyboardShortcuts": "快捷键参考(&&K)", "miIntroductoryVideos": "介绍性视频(&&V)", "miTwitter": "在 Twitter 上加入我们(&&J)", "miUserVoice": "搜索功能请求(&&S)", @@ -159,6 +159,6 @@ "miDownloadingUpdate": "正在下载更新...", "miInstallingUpdate": "正在安装更新...", "miCheckForUpdates": "检查更新...", - "aboutDetail": "\n版本 {0}\n提交 {1}\n日期 {2}\nShell {3}\n呈现器 {4}\nNode {5}", + "aboutDetail": "\n版本 {0}\n提交 {1}\n日期 {2}\nShell {3}\n渲染器 {4}\nNode {5}", "okButton": "确定" } \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json index ad55e59f4eb..5c4e0b1ea13 100644 --- a/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -14,7 +14,7 @@ "rulers": "显示垂直标尺的列", "wordSeparators": "执行文字相关的导航或操作时将用作文字分隔符的字符", "tabSize": "一个制表符等于的空格数。该设置在 `editor.detectIndentation` 启用时根据文件内容进行重写。", - "tabSize.errorMessage": "应为 \\\\\"number\\\\\"。注意,值\\\\\"auto\\\\\"已由 \\\\\"editor.detectIndentation\\\\\" 设置替换。", + "tabSize.errorMessage": "应为“number”。注意,值“auto”已由“editor.detectIndentation”设置替换。", "insertSpaces": "按 \"Tab\" 时插入空格。该设置在 `editor.detectIndentation` 启用时根据文件内容进行重写。", "insertSpaces.errorMessage": "应为 \"boolean\"。注意,值 \"auto\" 已由 \"editor.detectIndentation\" 设置替换。", "detectIndentation": "当打开文件时,将基于文件内容检测 \"editor.tabSize\" 和 \"editor.insertSpaces\"。", @@ -29,7 +29,7 @@ "wordWrap.bounded": "将在最小视区和 \"editor.wordWrapColumn\" 处换行。", "wordWrap": "控制折行方式。可以选择: - “off” (禁用折行), - “on” (视区折行), - “wordWrapColumn”(在“editor.wordWrapColumn”处折行)或 - “bounded”(在视区与“editor.wordWrapColumn”两者的较小者处折行)。", "wordWrapColumn": "在 \"editor.wordWrap\" 为 \"wordWrapColumn\" 或 \"bounded\" 时控制编辑器列的换行。", - "wrappingIndent": "控制换行的行的缩进。可以是\\\\\"none\\\\\"、 \\\\\"same\\\\\" 或 \\\\\"indent\\\\\"。", + "wrappingIndent": "控制折行的缩进。可以是“none”、“same”或“indent”。", "mouseWheelScrollSensitivity": "要对鼠标滚轮滚动事件的 \"deltaX\" 和 \"deltaY\" 使用的乘数 ", "quickSuggestions.strings": "在字符串内启用快速建议。", "quickSuggestions.comments": "在注释内启用快速建议。", @@ -41,7 +41,6 @@ "formatOnType": "控制编辑器是否应在键入后自动设置行的格式", "formatOnPaste": "控制编辑器是否应自动设置粘贴内容的格式。格式化程序必须可用并且能设置文档中某一范围的格式。", "suggestOnTriggerCharacters": "控制键入触发器字符时是否应自动显示建议", - "acceptSuggestionOnEnter": "控制除了 \"Tab\" 键以外,是否还应在遇到 \"Enter\" 键时接受建议。帮助避免“插入新行”或“接受建议”之间出现歧义。", "acceptSuggestionOnCommitCharacter": "控制是否应在遇到提交字符时接受建议。例如,在 JavaScript 中,分号(\";\")可以为提交字符,可接受建议并键入该字符。", "snippetSuggestions": "控制是否将代码段与其他建议一起显示以及它们的排序方式。", "emptySelectionClipboard": "控制没有选择内容的复制是否复制当前行。", @@ -63,6 +62,7 @@ "renderLineHighlight": "控制编辑器应如何呈现当前行突出显示,可能为“无”、“装订线”、“线”和“全部”。", "codeLens": "控制编辑器是否显示代码滤镜", "folding": "控制编辑器是否启用代码折叠功能", + "showFoldingControls": "控制是否自动隐藏导航线上的折叠控件。", "matchBrackets": "当选择其中一项时,将突出显示匹配的括号。", "glyphMargin": "控制编辑器是否应呈现垂直字形边距。字形边距最常用于调试。", "useTabStops": "在制表位后插入和删除空格", diff --git a/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..e788771d2f2 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "未找到“{0}”的任何定义", + "generic.noResults": "找不到定义", + "meta.title": " – {0} 定义", + "actions.goToDecl.label": "转到定义", + "actions.goToDeclToSide.label": "打开侧边的定义", + "actions.previewDecl.label": "查看定义", + "goToImplementation.noResultWord": "未找到“{0}”的实现", + "goToImplementation.generic.noResults": "未找到实现", + "meta.implementations.title": "– {0} 个实现", + "actions.goToImplementation.label": "转到实现", + "actions.peekImplementation.label": "速览实现", + "goToTypeDefinition.noResultWord": "未找到“{0}”的类型定义", + "goToTypeDefinition.generic.noResults": "未找到类型定义", + "meta.typeDefinitions.title": " – {0} 个类型定义", + "actions.goToTypeDefinition.label": "转到类型定义", + "actions.peekTypeDefinition.label": "快速查看类型定义" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..ab0b4761cf9 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "单击显示 {0} 个定义。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/indentation/common/indentation.i18n.json b/i18n/chs/src/vs/editor/contrib/indentation/common/indentation.i18n.json index 76fa4543d53..5bd5906da32 100644 --- a/i18n/chs/src/vs/editor/contrib/indentation/common/indentation.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/indentation/common/indentation.i18n.json @@ -8,7 +8,7 @@ "indentationToTabs": "将缩进转换为制表符", "configuredTabSize": "已配置制表符大小", "selectTabWidth": "选择当前文件的制表符大小", - "indentUsingTabs": "使用 \\\\\"Tab\\\\\" 缩进", + "indentUsingTabs": "使用“Tab”缩进", "indentUsingSpaces": "使用空格缩进", "detectIndentation": "检查内容中的缩进", "editor.reindentlines": "重新缩进行" diff --git a/i18n/chs/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/chs/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 4e1a0a30e42..ec34ba659f1 100644 --- a/i18n/chs/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,7 +9,7 @@ "editorSuggestWidgetForeground": "建议小组件的前景颜色。", "editorSuggestWidgetSelectedBackground": "建议小组件中被选择条目的背景颜色。", "editorSuggestWidgetHighlightForeground": "建议小组件中匹配内容的高亮颜色。", - "readMore": "阅读更多...{0}", + "readMore": "阅读详细信息...{0}", "suggestionWithDetailsAriaLabel": "{0}(建议)具有详细信息", "suggestionAriaLabel": "{0},建议", "readLess": "阅读简略信息...{0}", diff --git a/i18n/chs/src/vs/platform/configuration/common/configurationRegistry.i18n.json b/i18n/chs/src/vs/platform/configuration/common/configurationRegistry.i18n.json index ea616506b8e..781727fae4d 100644 --- a/i18n/chs/src/vs/platform/configuration/common/configurationRegistry.i18n.json +++ b/i18n/chs/src/vs/platform/configuration/common/configurationRegistry.i18n.json @@ -10,7 +10,7 @@ "vscode.extension.contributes.configuration": "用于配置字符串。", "vscode.extension.contributes.configuration.title": "设置摘要。此标签将在设置文件中用作分隔注释。", "vscode.extension.contributes.configuration.properties": "配置属性的描述。", - "config.property.languageDefault": "无法注册“{0}”。这符合属性模式 \"\\\\[.*\\\\]$\",可用于描述特定语言编辑器设置。请使用 \"configurationDefaults\"。", + "config.property.languageDefault": "无法注册“{0}”。其符合描述特定语言编辑器设置的表达式 \"\\\\[.*\\\\]$\"。请使用 \"configurationDefaults\"。", "config.property.duplicate": "无法注册“{0}”。此属性已注册。", "invalid.properties": "configuration.properties 必须是对象", "invalid.type": "如果进行设置,\"configuration.type\" 必须设置为对象", diff --git a/i18n/chs/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/chs/src/vs/platform/markers/common/problemMatcher.i18n.json index 7dc0d66e0aa..b9fc2ddbbde 100644 --- a/i18n/chs/src/vs/platform/markers/common/problemMatcher.i18n.json +++ b/i18n/chs/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -34,6 +34,7 @@ "ProblemMatcherParser.noValidIdentifier": "错误: 模式属性 {0} 是无效的模式变量名。", "ProblemMatcherParser.problemPattern.watchingMatcher": "问题匹配程序必须定义监视的开始模式和结束模式。", "ProblemMatcherParser.invalidRegexp": "错误: 字符串 {0} 不是有效的正则表达式。\n", + "WatchingPatternSchema.regexp": "用于检测后台任务开始或结束的正则表达式。", "WatchingPatternSchema.file": "文件名的匹配组索引。可以省略。", "PatternTypeSchema.name": "所提供或预定义模式的名称", "PatternTypeSchema.description": "问题模式或者所提供或预定义问题模式的名称。如果已指定基准,则可以省略。", @@ -42,6 +43,12 @@ "ProblemMatcherSchema.severity": "捕获问题的默认严重性。如果模式未定义严重性的匹配组,则使用。", "ProblemMatcherSchema.applyTo": "控制文本文档上报告的问题是否仅应用于打开、关闭或所有文档。", "ProblemMatcherSchema.fileLocation": "定义应如何解释问题模式中报告的文件名。", + "ProblemMatcherSchema.background": "用于跟踪在后台任务上激活的匹配程序的开始和结束的模式。", + "ProblemMatcherSchema.background.activeOnStart": "如果设置为 true,则会在任务开始时激活后台监控。这相当于发出与 beginPattern 匹配的行。", + "ProblemMatcherSchema.background.beginsPattern": "如果在输出内匹配,则会发出后台任务开始的信号。", + "ProblemMatcherSchema.background.endsPattern": "如果在输出内匹配,则会发出后台任务结束的信号。", + "ProblemMatcherSchema.watching.deprecated": "“watching”属性已被弃用。请改用“background”。", + "ProblemMatcherSchema.watching": "用于跟踪监视匹配程序开始和结束的模式。", "ProblemMatcherSchema.watching.activeOnStart": "如果设置为 true,则当任务开始时观察程序处于活动模式。这相当于发出与 beginPattern 匹配的行。", "ProblemMatcherSchema.watching.beginsPattern": "如果在输出内匹配,则在监视任务开始时会发出信号。", "ProblemMatcherSchema.watching.endsPattern": "如果在输出内匹配,则在监视任务结束时会发出信号。", diff --git a/i18n/chs/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/chs/src/vs/workbench/api/node/extHostTreeViews.i18n.json index 8b6ad71cd4e..7bfb0b886de 100644 --- a/i18n/chs/src/vs/workbench/api/node/extHostTreeViews.i18n.json +++ b/i18n/chs/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "treeView.notRegistered": "没有注册 ID 为“{0}”的树形图。", + "treeItem.notFound": "没有在树中找到 ID 为“{0}”的项目。", + "treeView.duplicateElement": "已注册元素 {0}。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/common/theme.i18n.json b/i18n/chs/src/vs/workbench/common/theme.i18n.json index 64c51b8e74c..0f3e7eb1bf9 100644 --- a/i18n/chs/src/vs/workbench/common/theme.i18n.json +++ b/i18n/chs/src/vs/workbench/common/theme.i18n.json @@ -32,6 +32,7 @@ "activityBarBadgeBackground": "活动通知徽章背景色。活动栏显示在最左侧或最右侧,并允许在侧边栏的视图间切换。", "activityBarBadgeForeground": "活动通知徽章前景色。活动栏显示在最左侧或最右侧,并允许在侧边栏的视图间切换。", "sideBarBackground": "侧边栏背景色。侧边栏是资源管理器和搜索等视图的容器。", + "sideBarForeground": "侧边栏前景色。侧边栏是资源管理器和搜索等视图的容器。", "sideBarTitleForeground": "侧边栏标题前景色。侧边栏是资源管理器和搜索等视图的容器。", "sideBarSectionHeaderBackground": "侧边栏节标题的背景颜色。侧边栏是资源管理器和搜索等视图的容器。", "titleBarActiveForeground": "窗口处于活动状态时的标题栏前景色。请注意,该颜色当前仅在 macOS 上受支持。", diff --git a/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json index 375f183373b..6997449c1ce 100644 --- a/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,6 +7,7 @@ "view": "查看", "help": "帮助", "file": "文件", + "developer": "开发者", "showEditorTabs": "控制打开的编辑器是否显示在选项卡中。", "editorTabCloseButton": "控制编辑器的选项卡关闭按钮的位置,或当设置为 \"off\" 时禁用关闭它们。", "showIcons": "控制打开的编辑器是否随图标一起显示。这还需启用图标主题。", diff --git a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json index a188f9c1e90..b163a2de99e 100644 --- a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "workbench.action.inspectKeyMap": "开发者:检查键映射" + "workbench.action.inspectKeyMap": "开发者: 检查键映射" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json index 8d541bedfe0..a7b3e519e7d 100644 --- a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json @@ -6,6 +6,6 @@ { "toggle.wordwrap": "查看: 切换自动换行", "wordWrap.notInDiffEditor": "不能在差异编辑器中切换自动换行。", - "unwrapMinified": "为此文件禁用换行", + "unwrapMinified": "为此文件禁用折行", "wrapMinified": "为此文件启用换行" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index c322b5a660a..54243f83ce3 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,6 +7,7 @@ "debugAdapterBinNotFound": "调试适配器可执行的“{0}”不存在。", "debugAdapterCannotDetermineExecutable": "无法确定调试适配器“{0}”的可执行文件。", "debugType": "配置类型。", + "debugTypeNotRecognised": "无法识别此调试类型。确保已经安装并启用相应的调试扩展。", "node2NotSupported": "不再支持 \"node2\",改用 \"node\",并将 \"protocol\" 属性设为 \"inspector\"。", "debugName": "配置名称;在启动配置下拉菜单中显示。", "debugRequest": "请求配置类型。可以是“启动”或“附加”。", diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json index 0598c67b46e..f4159d50b0e 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "evaluateMathExpression": "Emmet: 评估数学表达式" + "evaluateMathExpression": "Emmet: 求数学表达式的值" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json index 403f855e5eb..81f7dcfcab1 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -4,10 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "incrementNumberByOneTenth": "Emmet: 以 0.1 为增量", - "incrementNumberByOne": "Emmet: 以 1 为增量", - "incrementNumberByTen": "Emmet: 以 10 为增量", - "decrementNumberByOneTenth": "Emmet: 以 0.1 为减量", - "decrementNumberByOne": "Emmet: 以 1 为减量", - "decrementNumberByTen": "Emmet: 以 10 为减量" + "incrementNumberByOneTenth": "Emmet: 增加 0.1", + "incrementNumberByOne": "Emmet: 增加 1", + "incrementNumberByTen": "Emmet: 增加 10", + "decrementNumberByOneTenth": "Emmet: 减少 0.1", + "decrementNumberByOne": "Emmet: 减少 1", + "decrementNumberByTen": "Emmet: 减少 10" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json index b58d42bcafe..545f1c107e7 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "removeTag": "Emmet: 删除标记" + "removeTag": "Emmet: 删除标签" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json index 5796a0dcab8..53e4eaafbd9 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "splitJoinTag": "Emmet: 分离/联接标记" + "splitJoinTag": "Emmet: 分离/联接标签" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json index c5d6fd7b350..d68725525c8 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "updateImageSize": "Emmet: 更新映像大小" + "updateImageSize": "Emmet: 更新图像大小" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json index 486e5397c4b..8bf2821c120 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "updateTag": "Emmet: 更新标记", - "enterTag": "输入标记", - "tag": "标记" + "updateTag": "Emmet: 更新标签", + "enterTag": "输入标签", + "tag": "标签" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json index dbca7bf9016..21f0c06d363 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "wrapWithAbbreviationAction": "Emmet: 使用缩写进行包装", + "wrapWithAbbreviationAction": "Emmet: 使用缩写进行包围", "enterAbbreviation": "输入缩写", "abbreviation": "缩写" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json index 6a402e79e1e..0701c9f4ae6 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -6,8 +6,8 @@ { "emmetConfigurationTitle": "Emmet", "triggerExpansionOnTab": "启用后,按 TAB 键时,将展开 Emmet 缩写。", - "emmetPreferences": "用于修改 Emmet 的某些操作和解决程序的首选项。", + "emmetPreferences": "用于修改 Emmet 某些操作和解析程序的行为的首选项。", "emmetSyntaxProfiles": "为指定的语法定义配置文件或使用带有特定规则的配置文件。", - "emmetExclude": "emmet 缩写不应在其中展开的语言数组。", - "emmetExtensionsPath": "转至包含 Emmet 配置文件、片段和首选项的文件的路径" + "emmetExclude": "不应展开 Emmet 缩写的语言数组。", + "emmetExtensionsPath": "包含 Emmet 配置文件、代码段和首选项的文件夹路径" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json index 5d52f90d627..076eadb1e72 100644 --- a/i18n/chs/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "vscode.extension.contributes.view": "贡献自定义视图", + "vscode.extension.contributes.view": "添加自定义视图", "vscode.extension.contributes.view.id": "用于标识通过 vscode.workspace.createTreeView 创建的视图的唯一 ID", "vscode.extension.contributes.view.label": "用于呈现视图的人类可读的字符串", "vscode.extension.contributes.view.icon": "视图图标的路径", - "vscode.extension.contributes.views": "贡献自定义视图", + "vscode.extension.contributes.views": "添加自定义视图", "showViewlet": "显示 {0}", "view": "查看" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 8b6ad71cd4e..5a4bf096f38 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "disableOtherKeymapsConfirmation": "是否禁用其他键映射以避免键绑定之间的冲突?", + "yes": "是", + "no": "否" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index ba343731820..5813db26a24 100644 --- a/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,7 +16,6 @@ "associations": "配置语言的文件关联(如: \"*.extension\": \"html\")。这些关联的优先级高于已安装语言的默认关联。", "encoding": "读取和编写文件时将使用的默认字符集编码。", "autoGuessEncoding": "启用时,会在打开文件时尝试猜测字符集编码", - "eol": "默认行尾字符。", "trimTrailingWhitespace": "启用后,将在保存文件时剪裁尾随空格。", "insertFinalNewline": "启用后,保存文件时在文件末尾插入一个最终新行。", "files.autoSave.off": "永不自动保存更新后的文件。", diff --git a/i18n/chs/src/vs/workbench/parts/files/common/editors/fileEditorInput.i18n.json b/i18n/chs/src/vs/workbench/parts/files/common/editors/fileEditorInput.i18n.json index f4fa6caa5bc..9745dba4538 100644 --- a/i18n/chs/src/vs/workbench/parts/files/common/editors/fileEditorInput.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/common/editors/fileEditorInput.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "orphanedFile": "{0} (deleted from disk)" + "orphanedFile": "{0} (磁盘上已删除)" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json index dbd6be98f3e..bb7e4ea7afa 100644 --- a/i18n/chs/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -5,5 +5,11 @@ // Do not edit this file. It is machine generated. { "slow": "检测到启动缓慢", - "slow.detail": "抱歉,出现了启动缓慢的情况。请重启“{0}”并启用分析,将分析文件与我们共享,我们会努力提高启动速度。" + "slow.detail": "抱歉,出现了启动缓慢的情况。请重启“{0}”并启用分析,将分析文件与我们共享,我们会努力提高启动速度。", + "prof.message": "已成功创建描述文件。", + "prof.detail": "请创建问题并手动附加以下文件:\n{0}", + "prof.restartAndFileIssue": "创建问题并重启", + "prof.restart": "重启", + "prof.thanks": "感谢您的帮助。", + "prof.detail.restart": "需要重新启动才能继续使用“{0}”。再次感谢您的贡献。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index d4d305eba54..3461ec0a523 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "keybindingsInputName": "键盘快捷键", + "keybindingsInputName": "键盘快捷方式", "SearchKeybindings.AriaLabel": "搜索键绑定", "SearchKeybindings.Placeholder": "搜索键绑定", "sortByPrecedene": "按优先级排序", - "header-message": "用于高级自定义打开和编辑", + "header-message": "高级自定义请打开和编辑", "keybindings-file-name": "keybindings.json", "keybindingsLabel": "键绑定", "changeLabel": "更改键绑定", diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 058e01cd6bf..72a81c0af68 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -6,7 +6,7 @@ { "openGlobalSettings": "打开用户设置", "openGlobalKeybindings": "打开键盘快捷方式", - "openGlobalKeybindingsFile": "打开键盘快捷键文件", + "openGlobalKeybindingsFile": "打开键盘快捷方式文件", "openWorkspaceSettings": "打开工作区设置", "configureLanguageBasedSettings": "配置语言特定的设置...", "languageDescriptionConfigured": "({0})", diff --git a/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json index ab4166d5cd7..8ea8ff4f96e 100644 --- a/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "toggleGitViewlet": "显示 GIT", + "toggleGitViewlet": "显示 Git", + "installAdditionalSCMProviders": "安装其他 SCM 提供程序...", "source control": "源代码管理", "toggleSCMViewlet": "显示 SCM", "view": "查看" diff --git a/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json b/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json index f03d74e8c9d..89c41c7a05b 100644 --- a/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "switch provider": "切换 SCM 提供程序..." + "installAdditionalSCMProviders": "安装其他 SCM 提供程序...", + "switch provider": "切换源代码管理系统..." } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json b/i18n/chs/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json index 0c4154de4e5..340ee7fc03e 100644 --- a/i18n/chs/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "vscode.extension.contributes.snippets": "贡献代码段。", + "vscode.extension.contributes.snippets": "添加代码段。", "vscode.extension.contributes.snippets-language": "此代码片段参与的语言标识符。", "vscode.extension.contributes.snippets-path": "代码片段文件的路径。该路径相对于扩展文件夹,通常以 \"./snippets/\" 开头。", "invalid.language": "“contributes.{0}.language”中存在未知的语言。提供的值: {1}", diff --git a/i18n/chs/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json index bf5eec2631c..48bcbb508c2 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0},任务" + "entryAriaLabel": "{0},任务", + "workspace": "来自工作区", + "extension": "来自扩展" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 2132313f0b6..f5f009904e1 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -6,5 +6,6 @@ { "TerminalTaskSystem.unknownError": "在执行任务时发生未知错误。请参见任务输出日志了解详细信息。", "TerminalTaskSystem.terminalName": "任务 - {0}", - "TerminalTaskSystem": "无法对 UNC 驱动器执行 shell 命令。" + "TerminalTaskSystem": "无法对 UNC 驱动器执行 shell 命令。", + "unkownProblemMatcher": "无法解析问题匹配程序 {0}。此匹配程序将被忽略" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json index aa659de1014..5b8a86d9c21 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json @@ -7,5 +7,6 @@ "TaskRunnerSystem.unknownError": "在执行任务时发生未知错误。请参见任务输出日志了解详细信息。", "TaskRunnerSystem.watchingBuildTaskFinished": "\n监视生成任务已完成", "TaskRunnerSystem.childProcessError": "Failed to launch external program {0} {1}.", - "TaskRunnerSystem.cancelRequested": "\n已根据用户请求终止了任务'{0}' " + "TaskRunnerSystem.cancelRequested": "\n已根据用户请求终止了任务'{0}' ", + "unkownProblemMatcher": "无法解析问题匹配程序 {0}。此匹配程序将被忽略" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json b/i18n/chs/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json index 082e49f08bc..076dd52ebbb 100644 --- a/i18n/chs/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json @@ -17,7 +17,7 @@ "watermark.selectTheme": "更改主题", "watermark.selectKeymap": "更改键映射", "watermark.keybindingsReference": "键盘参考", - "watermark.openGlobalKeybindings": "键盘快捷键", + "watermark.openGlobalKeybindings": "键盘快捷方式(&&K)", "watermark.unboundCommand": "未绑定", "workbenchConfigurationTitle": "工作台", "tips.enabled": "启用后,当没有打开编辑器时将显示水印提示。" diff --git a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 3b9d1ffa9ca..3503db3576a 100644 --- a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -9,18 +9,23 @@ "welcomePage.start": "开始", "welcomePage.newFile": "新建文件", "welcomePage.openFolder": "打开文件夹...", - "welcomePage.cloneGitRepository": "克隆 GIT 存储库...", + "welcomePage.cloneGitRepository": "克隆 Git 存储库...", "welcomePage.recent": "最近", "welcomePage.moreRecent": "更多...", "welcomePage.noRecentFolders": "无最近使用文件夹", "welcomePage.help": "帮助", + "welcomePage.keybindingsCheatsheet": "可打印的键盘速查表", "welcomePage.introductoryVideos": "入门视频", "welcomePage.productDocumentation": "产品文档", "welcomePage.gitHubRepository": "GitHub 存储库", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "启动时显示欢迎页", "welcomePage.customize": "自定义", + "welcomePage.installExtensionPacks": "工具和语言", + "welcomePage.installExtensionPacksDescription": "安装对 {0} 和 {1} 的支持", + "welcomePage.moreExtensions": "更多", "welcomePage.installKeymapDescription": "安装键盘快捷方式", + "welcomePage.installKeymapExtension": "安装 {0} 和 {1} 的键盘快捷方式", "welcomePage.others": "其他", "welcomePage.colorTheme": "颜色主题", "welcomePage.colorThemeDescription": "使编辑器和代码呈现你喜欢的外观", diff --git a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index de7e3aa24d5..07f438f169e 100644 --- a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,11 +5,25 @@ // Do not edit this file. It is machine generated. { "welcomePage": "欢迎使用", + "welcomePage.javaScript": "JavaScript", + "welcomePage.typeScript": "TypeScript", + "welcomePage.python": "Python", + "welcomePage.php": "PHP", + "welcomePage.docker": "Docker", + "welcomePage.vim": "Vim", + "welcomePage.sublime": "Sublime", + "welcomePage.atom": "Atom", + "welcomePage.extensionPackAlreadyInstalled": "已安装对 {0} 的支持。", + "welcomePage.willReloadAfterInstallingExtensionPack": "安装对 {0} 的支持后,将重载窗口。", + "welcomePage.installingExtensionPack": "正在安装对 {0} 的支持...", + "welcomePage.extensionPackNotFound": "找不到对 {0} (ID: {1}) 的支持。", "welcomePage.keymapAlreadyInstalled": "已安装 {0} 键盘快捷方式。", "welcomePage.willReloadAfterInstallingKeymap": "安装 {0} 键盘快捷方式后,将重载窗口。", "welcomePage.installingKeymap": "正在安装 {0} 键盘快捷方式...", "welcomePage.keymapNotFound": "找不到 ID 为 {1} 的 {0} 键盘快捷方式。", "welcome.title": "欢迎使用", + "welcomePage.extensionListSeparator": ",", + "welcomePage.installedExtension": "{0}(已安装)", "ok": "确定", "cancel": "取消", "welcomePage.quickLinkBackground": "欢迎页快速链接的背景颜色。", diff --git a/i18n/chs/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/chs/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index 69e35ac02d6..4abe2dbd4b8 100644 --- a/i18n/chs/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -14,18 +14,18 @@ "vscode.extension.contributes.iconThemes.label": "UI 中显示的图标主题的标签。", "vscode.extension.contributes.iconThemes.path": "图标主题定义文件的路径。该路径相对于扩展文件夹,通常是 \"./icons/awesome-icon-theme.json\"。", "migration.completed": "已向用户设置添加了新的主题设置。{0} 中可备份。", - "error.cannotloadtheme": "Unable to load {0}: {1}", - "reqarray": "Extension point `{0}` must be an array.", + "error.cannotloadtheme": "无法加载 {0}: {1}", + "reqarray": "扩展点“{0}”必须是一个数组。", "reqpath": "“contributes.{0}.path”中应为字符串。提供的值: {1}", "invalid.path.1": "“contributes.{0}.path”({1})应包含在扩展的文件夹({2})内。这可能会使扩展不可移植。", "reqid": "“contributes.{0}.id”中应为字符串。提供的值: {1}", "error.cannotloadicontheme": "Unable to load {0}", "error.cannotparseicontheme": "Problems parsing file icons file: {0}", - "colorTheme": "Specifies the color theme used in the workbench.", - "colorThemeError": "Theme is unknown or not installed.", - "iconTheme": "Specifies the icon theme used in the workbench.", + "colorTheme": "指定工作台中使用的颜色主题。", + "colorThemeError": "主题未知或未安装。", + "iconTheme": "指定在工作台中使用的图标主题。", "noIconThemeDesc": "No file icons", - "iconThemeError": "File icon theme is unknown or not installed.", + "iconThemeError": "文件图标主题未知或未安装。", "workbenchColors": "覆盖当前所选颜色主题的颜色。", "workbenchColors.deprecated": "该设置不再是实验性设置,并已重命名为“workbench.colorCustomizations”", "workbenchColors.deprecatedDescription": "改用“workbench.colorCustomizations”" diff --git a/i18n/cht/extensions/markdown/out/extension.i18n.json b/i18n/cht/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/cht/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/cht/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/cht/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/extensions/merge-conflict/package.i18n.json b/i18n/cht/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/extensions/npm/package.i18n.json b/i18n/cht/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/cht/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index da6b8c6d2c0..c01f13f3bcb 100644 --- a/i18n/cht/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/cht/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,8 +6,6 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "因為影像太大,所以無法在編輯器中顯示。", - "resourceOpenExternalButton": "開啟影像", - "resourceOpenExternalText": " 要使用外部程式嗎?", "nativeBinaryError": "檔案為二進位檔、非常大或使用不支援的文字編碼,因此將不會顯示於編輯器中。", "sizeB": "{0}B", "sizeKB": "{0}KB", diff --git a/i18n/cht/src/vs/code/electron-main/menus.i18n.json b/i18n/cht/src/vs/code/electron-main/menus.i18n.json index a1fa3f356dd..5961aa8e789 100644 --- a/i18n/cht/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/cht/src/vs/code/electron-main/menus.i18n.json @@ -14,6 +14,7 @@ "mHelp": "說明 (&&H)", "miNewWindow": "開新視窗(&&W)", "mAbout": "關於 {0}", + "mServices": "服務", "mHide": "隱藏 {0}", "mHideOthers": "隱藏其他", "mShowAll": "全部顯示", diff --git a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json index ec8f05fe340..f06682edb16 100644 --- a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -40,7 +40,6 @@ "formatOnType": "控制編輯器是否應在輸入一行後自動格式化", "formatOnPaste": "控制編輯器是否應自動設定貼上的內容格式。格式器必須可供使用,而且格式器應該能夠設定文件中一個範圍的格式。", "suggestOnTriggerCharacters": "控制輸入觸發字元時,是否應自動顯示建議", - "acceptSuggestionOnEnter": "控制除了 'Tab' 外,是否也藉由按下 'Enter' 接受建議。如此可避免混淆要插入新行或接受建議。", "acceptSuggestionOnCommitCharacter": "控制認可字元是否應接受建議。例如在 JavaScript 中,分號 (';') 可以是接受建議並鍵入該字元的認可字元。", "snippetSuggestions": "控制程式碼片段是否隨其他建議顯示,以及其排序方式。", "emptySelectionClipboard": "控制複製時不選取任何項目是否會複製目前程式行。", diff --git a/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json index 7b011979df9..b08c173b100 100644 --- a/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -7,6 +7,9 @@ "lineHighlight": "目前游標位置行的反白顯示背景色彩。", "lineHighlightBorderBox": "目前游標位置行之周圍框線的背景色彩。", "rangeHighlight": "反白顯示範圍的背景色彩,例如 Quick Open 與尋找功能。", + "caret": "編輯器游標的色彩。", + "editorWhitespaces": "編輯器中空白字元的色彩。", + "editorIndentGuides": "編輯器縮排輔助線的色彩。", "editorLineNumbers": "編輯器行號的色彩。", "editorRuler": "編輯器尺規的色彩", "editorCodeLensForeground": "編輯器程式碼濾鏡的前景色彩", diff --git a/i18n/cht/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/cht/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..26ea0a1761c --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "找不到 '{0}' 的定義", + "generic.noResults": "找不到任何定義", + "meta.title": " - {0} 個定義", + "actions.goToDecl.label": "移至定義", + "actions.goToDeclToSide.label": "在一側開啟定義", + "actions.previewDecl.label": "預覽定義", + "goToImplementation.noResultWord": "找不到 '{0}' 的任何實作", + "goToImplementation.generic.noResults": "找不到任何實作", + "meta.implementations.title": " – {0} 個實作", + "actions.goToImplementation.label": "前往實作", + "actions.peekImplementation.label": "預覽實作", + "goToTypeDefinition.noResultWord": "找不到 '{0}' 的任何類型定義", + "goToTypeDefinition.generic.noResults": "找不到任何類型定義", + "meta.typeDefinitions.title": " – {0} 個定義", + "actions.goToTypeDefinition.label": "移至類型定義", + "actions.peekTypeDefinition.label": "預覽類型定義" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/cht/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..24cf4f7503f --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "按一下以顯示 {0} 項定義。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/cht/src/vs/workbench/api/node/extHostTreeViews.i18n.json index 8b6ad71cd4e..028bfb1a1d0 100644 --- a/i18n/cht/src/vs/workbench/api/node/extHostTreeViews.i18n.json +++ b/i18n/cht/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "treeView.duplicateElement": "元件{0}已被註冊" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/common/theme.i18n.json b/i18n/cht/src/vs/workbench/common/theme.i18n.json index 2d8bce1a636..72a8d8abb7e 100644 --- a/i18n/cht/src/vs/workbench/common/theme.i18n.json +++ b/i18n/cht/src/vs/workbench/common/theme.i18n.json @@ -29,6 +29,7 @@ "activityBarBadgeBackground": "活動通知徽章的背景色彩。此活動列會顯示在最左側或最右側,讓您可以切換提要欄位的不同檢視。", "activityBarBadgeForeground": "活動通知徽章的前背景色彩。此活動列會顯示在最左側或最右側,讓您可以切換提要欄位的不同檢視。", "sideBarBackground": "提要欄位的背景色彩。提要欄位是檢視 (例如 Explorer 與搜尋) 的容器。", + "sideBarForeground": "側欄的前景顏色.側欄包含Explorer與搜尋.", "sideBarTitleForeground": "提要欄位標題的前景色彩。提要欄位是檢視 (例如 Explorer 與搜尋) 的容器。", "sideBarSectionHeaderBackground": "提要欄位區段標頭的背景色彩。提要欄位是檢視 (例如 Explorer 與搜尋) 的容器。", "titleBarActiveForeground": "作用中視窗之標題列的前景。請注意,目前只有 macOS 支援此色彩。", diff --git a/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json index c1874024aee..bced8b136e5 100644 --- a/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,6 +7,7 @@ "view": "檢視", "help": "說明", "file": "檔案", + "developer": "開發人員", "showEditorTabs": "控制已開啟的編輯器是否應顯示在索引標籤中。", "editorTabCloseButton": "控制編輯器的索引標籤關閉按鈕位置,或在設為 'off' 時將其停用。", "showIcons": "控制開啟的編輯器是否搭配圖示顯示。這需要同時啟用圖示佈景主題。", diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 8b6ad71cd4e..49a87dcf222 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "disableOtherKeymapsConfirmation": "要停用其他按鍵對應,以避免按鍵繫結關係發生衝突嗎?", + "yes": "是", + "no": "否" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 07e8bfd5963..5b044579208 100644 --- a/i18n/cht/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,7 +16,6 @@ "associations": "將檔案關聯設定為語言 (例如 \"*.extension\": \"html\")。這些語言優先於已安裝語言的預設關聯。", "encoding": "讀取與寫入檔案時要使用的預設字元集編碼。", "autoGuessEncoding": "如有啟用,將會在開啟檔案時,嘗試猜測字元集編碼", - "eol": "預設行尾字元。", "trimTrailingWhitespace": "若啟用,將在儲存檔案時修剪尾端空白。", "insertFinalNewline": "啟用時,請在儲存檔案時在其結尾插入最後一個新行。", "files.autoSave.off": "已變更的檔案一律不會自動儲存。", diff --git a/i18n/cht/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json index 1c615781faa..f36b3a04dba 100644 --- a/i18n/cht/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -5,5 +5,9 @@ // Do not edit this file. It is machine generated. { "slow": "偵測到啟動速度慢", - "slow.detail": "抱歉! 先前的啟動速度過慢。請重新啟動 '{0}' 並啟用剖析功能,同時將設定檔提供給我們,我們將努力提升啟動的品質。" + "slow.detail": "抱歉! 先前的啟動速度過慢。請重新啟動 '{0}' 並啟用剖析功能,同時將設定檔提供給我們,我們將努力提升啟動的品質。", + "prof.message": "已成功建立設定檔。", + "prof.detail": "請建立問題,並手動附加下列檔案:\n{0}", + "prof.restartAndFileIssue": "建立問題並重新啟動", + "prof.restart": "重新啟動" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json index c0bccd6864c..cafed393010 100644 --- a/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "toggleGitViewlet": "顯示 Git", + "installAdditionalSCMProviders": "安裝額外SCM提供者...", "source control": "原始檔控制", "toggleSCMViewlet": "顯示 SCM", "view": "檢視" diff --git a/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json b/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json index d1872f571b1..5450727934a 100644 --- a/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "installAdditionalSCMProviders": "安裝額外SCM提供者...", "switch provider": "切換 SCM 提供者..." } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json index e35a0884650..c9f6c178105 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0},工作" + "entryAriaLabel": "{0},工作", + "workspace": "從工作區", + "extension": "從擴充功能" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 877f81d59fd..ae636e70679 100644 --- a/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,6 +6,7 @@ { "selectTheme.label": "色彩佈景主題", "installColorThemes": "安裝其他的色彩佈景主題...", + "themes.selectTheme": "選取色彩主題(上/下鍵預覽)", "selectIconTheme.label": "檔案圖示佈景主題", "installIconThemes": "安裝其他的檔案圖示主題...", "noIconThemeLabel": "無", diff --git a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 00a45ea1dc0..9a00f615c32 100644 --- a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -11,6 +11,7 @@ "welcomePage.openFolder": "開啟資料夾...", "welcomePage.cloneGitRepository": "複製 Git 存放庫...", "welcomePage.recent": "最近使用", + "welcomePage.moreRecent": "更多...", "welcomePage.noRecentFolders": "沒有最近使用的資料夾", "welcomePage.help": "說明", "welcomePage.introductoryVideos": "簡介影片", @@ -19,10 +20,12 @@ "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "啟動時顯示歡迎頁面", "welcomePage.customize": "自訂", + "welcomePage.moreExtensions": "更多", "welcomePage.installKeymapDescription": "安裝鍵盤快速鍵", "welcomePage.others": "其他", "welcomePage.colorTheme": "彩色佈景主題", "welcomePage.colorThemeDescription": "將編輯器及您的程式碼設定成您喜愛的外觀", + "welcomePage.learn": "深入了解", "welcomePage.showCommands": "尋找及執行所有命令", "welcomePage.showCommandsDescription": "從控制台快速存取及搜尋命令 ({0})", "welcomePage.interfaceOverview": "介面概觀", diff --git a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index 02eb36873b6..dfce04ba61a 100644 --- a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,11 +5,22 @@ // Do not edit this file. It is machine generated. { "welcomePage": "歡迎使用", + "welcomePage.javaScript": "JavaScript", + "welcomePage.typeScript": "TypeScript", + "welcomePage.python": "Python", + "welcomePage.php": "PHP", + "welcomePage.docker": "Docker", + "welcomePage.vim": "活力", + "welcomePage.sublime": "壯麗", + "welcomePage.atom": "Atom", "welcomePage.keymapAlreadyInstalled": "已安裝 {0} 鍵盤快速鍵。", "welcomePage.willReloadAfterInstallingKeymap": "{0} 鍵盤快速鍵安裝完成後,將會重新載入此視窗。", "welcomePage.installingKeymap": "正在安裝 {0} 鍵盤快速鍵...", "welcomePage.keymapNotFound": "找不到識別碼為 {1} 的 {0} 鍵盤快速鍵。", "welcome.title": "歡迎使用", + "welcomePage.extensionListSeparator": ",", + "welcomePage.installedExtension": "{0}(已安裝)", "ok": "確定", - "cancel": "取消" + "cancel": "取消", + "welcomePage.quickLinkBackground": "起始頁面連結的背景色彩." } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json b/i18n/cht/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json index 62ddb9869c6..920973ad063 100644 --- a/i18n/cht/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json @@ -5,5 +5,6 @@ // Do not edit this file. It is machine generated. { "walkThrough.unboundCommand": "未繫結", - "walkThrough.gitNotFound": "您的系統上似乎未安裝 Git。" + "walkThrough.gitNotFound": "您的系統上似乎未安裝 Git。", + "walkThrough.embeddedEditorBackground": "編輯器互動區塊的背景色彩." } \ No newline at end of file diff --git a/i18n/deu/extensions/git/out/main.i18n.json b/i18n/deu/extensions/git/out/main.i18n.json index 6cf07d1824f..58ab0b365d0 100644 --- a/i18n/deu/extensions/git/out/main.i18n.json +++ b/i18n/deu/extensions/git/out/main.i18n.json @@ -7,5 +7,5 @@ "using git": "Verwenden von Git {0} von {1}", "updateGit": "Git aktualisieren", "neverShowAgain": "Nicht mehr anzeigen", - "git20": "Sie haben anscheinend Git {0} installiert. Der Code funktioniert am besten mit Git 2 oder älter" + "git20": "Sie haben anscheinend Git {0} installiert. Code funktioniert am besten mit Git 2 oder neuer" } \ No newline at end of file diff --git a/i18n/deu/extensions/markdown/out/extension.i18n.json b/i18n/deu/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/deu/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/deu/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/deu/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/extensions/merge-conflict/package.i18n.json b/i18n/deu/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/extensions/npm/package.i18n.json b/i18n/deu/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/deu/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index a2b0a61e0fa..24c2e906e90 100644 --- a/i18n/deu/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/deu/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,8 +6,6 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "Das Bild ist zu groß für den Editor. ", - "resourceOpenExternalButton": "Bild öffnen", - "resourceOpenExternalText": " mit externem Programm?", "nativeBinaryError": "Die Datei wird nicht im Editor angezeigt, weil sie binär oder sehr groß ist oder eine nicht unterstützte Textcodierung verwendet.", "sizeB": "{0} B", "sizeKB": "{0} KB", diff --git a/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json index 2fe70e62eed..a01ec274ece 100644 --- a/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -40,7 +40,6 @@ "formatOnType": "Steuert, ob der Editor Zeilen automatisch nach der Eingabe formatiert.", "formatOnPaste": "Steuert, ob der Editor den eingefügten Inhalt automatisch formatiert.", "suggestOnTriggerCharacters": "Steuert, ob Vorschläge automatisch bei der Eingabe von Triggerzeichen angezeigt werden.", - "acceptSuggestionOnEnter": "Steuert, ob Vorschläge über die Eingabetaste (zusätzlich zur TAB-Taste) angenommen werden sollen. Vermeidet Mehrdeutigkeit zwischen dem Einfügen neuer Zeilen oder dem Annehmen von Vorschlägen.", "acceptSuggestionOnCommitCharacter": "Steuert, ob Vorschläge über Commitzeichen angenommen werden sollen. In JavaScript kann ein Semikolon (\";\") beispielsweise ein Commitzeichen sein, das einen Vorschlag annimmt und dieses Zeichen eingibt.", "snippetSuggestions": "Steuert, ob Codeausschnitte mit anderen Vorschlägen angezeigt und wie diese sortiert werden.", "emptySelectionClipboard": "Steuert, ob ein Kopiervorgang ohne Auswahl die aktuelle Zeile kopiert.", diff --git a/i18n/deu/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/deu/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..ffee2c2fa36 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "Keine Definition gefunden für \"{0}\".", + "generic.noResults": "Keine Definition gefunden", + "meta.title": " – {0} Definitionen", + "actions.goToDecl.label": "Gehe zu Definition", + "actions.goToDeclToSide.label": "Definition an der Seite öffnen", + "actions.previewDecl.label": "Peek-Definition", + "goToImplementation.noResultWord": "Keine Implementierung gefunden für \"{0}\"", + "goToImplementation.generic.noResults": "Keine Implementierung gefunden", + "meta.implementations.title": "{0} Implementierungen", + "actions.goToImplementation.label": "Zur Implementierung wechseln", + "actions.peekImplementation.label": "Vorschau der Implementierung anzeigen", + "goToTypeDefinition.noResultWord": "Keine Typendefinition gefunden für \"{0}\"", + "goToTypeDefinition.generic.noResults": "Keine Typendefinition gefunden", + "meta.typeDefinitions.title": "{0} Typdefinitionen", + "actions.goToTypeDefinition.label": "Zur Typdefinition wechseln", + "actions.peekTypeDefinition.label": "Vorschau der Typdefinition anzeigen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/deu/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..2d5f00609a8 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Klicken Sie, um {0} Definitionen anzuzeigen." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json index e519ed643e2..15f166829b2 100644 --- a/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,6 +7,7 @@ "view": "Anzeigen", "help": "Hilfe", "file": "Datei", + "developer": "Entwickler", "showEditorTabs": "Steuert, ob geöffnete Editoren auf Registerkarten angezeigt werden sollen.", "editorTabCloseButton": "Steuert die Position der Schließen-Schaltflächen der Editor-Registerkarten oder deaktiviert sie bei der Einstellung \"off\".", "showIcons": "Steuert, ob geöffnete Editoren mit einem Symbol angezeigt werden sollen. Hierzu muss auch ein Symboldesign aktiviert werden.", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 8b6ad71cd4e..5c79e379437 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "disableOtherKeymapsConfirmation": "Andere Tastenzuordnungen deaktivieren, um Konflikte zwischen Tastenzuordnungen zu vermeiden?", + "yes": "Ja", + "no": "Nein" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 8880b15033b..8153f54254b 100644 --- a/i18n/deu/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,7 +16,6 @@ "associations": "Konfigurieren Sie Dateizuordnungen zu Sprachen (beispielsweise \"*.extension\": \"html\"). Diese besitzen Vorrang vor den Standardzuordnungen der installierten Sprachen.", "encoding": "Die Standardzeichensatz-Codierung, die beim Lesen und Schreiben von Dateien verwendet werden soll.", "autoGuessEncoding": "Ist diese Option aktiviert, wird beim Öffnen von Dateien versucht, die Zeichensatzcodierung automatisch zu ermitteln.", - "eol": "Das Zeilenende-Standardzeichen.", "trimTrailingWhitespace": "Bei Aktivierung werden nachgestellte Leerzeichen beim Speichern einer Datei gekürzt.", "insertFinalNewline": "Bei Aktivierung wird beim Speichern einer Datei eine abschließende neue Zeile am Dateiende eingefügt.", "files.autoSave.off": "Eine geänderte Datei wird nie automatisch gespeichert.", diff --git a/i18n/deu/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json index 96d83227f67..687359bd486 100644 --- a/i18n/deu/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -5,5 +5,9 @@ // Do not edit this file. It is machine generated. { "slow": "Langsamer Start erkannt", - "slow.detail": "Es tut uns leid, dass Ihr Start so langsam war. Starten Sie \"{0}\" mit aktivierter Profilerstellung neu, geben Sie die Profile für uns frei, und wir tun unser Bestes, damit der Start bald wieder perfekt funktioniert." + "slow.detail": "Es tut uns leid, dass Ihr Start so langsam war. Starten Sie \"{0}\" mit aktivierter Profilerstellung neu, geben Sie die Profile für uns frei, und wir tun unser Bestes, damit der Start bald wieder perfekt funktioniert.", + "prof.message": "Profile wurden erfolgreich erstellt.", + "prof.detail": "Erstellen Sie ein Problem, und fügen Sie die folgenden Dateien manuell an:\n{0}", + "prof.restartAndFileIssue": "Problem erstellen und neu starten", + "prof.restart": "Neu starten" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index 1bc33347222..5693a1f5b13 100644 --- a/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,6 +5,11 @@ // Do not edit this file. It is machine generated. { "welcomePage": "Willkommen", + "welcomePage.typeScript": "TypeScript", + "welcomePage.php": "PHP", + "welcomePage.vim": "Vim", + "welcomePage.sublime": "Sublime", + "welcomePage.atom": "Atom", "welcomePage.keymapAlreadyInstalled": "Die {0} Tastenkombinationen sind bereits installiert.", "welcomePage.willReloadAfterInstallingKeymap": "Das Fenster wird nach der Installation der {0}-Tastaturbefehle neu geladen.", "welcomePage.installingKeymap": "Die {0}-Tastenkombinationen werden installiert...", diff --git a/i18n/esn/extensions/jake/out/main.i18n.json b/i18n/esn/extensions/jake/out/main.i18n.json index 8b6ad71cd4e..1b387f27070 100644 --- a/i18n/esn/extensions/jake/out/main.i18n.json +++ b/i18n/esn/extensions/jake/out/main.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "execFailed": "La detección automática de Jake falló con el error: {0}" +} \ No newline at end of file diff --git a/i18n/esn/extensions/jake/package.i18n.json b/i18n/esn/extensions/jake/package.i18n.json index 8b6ad71cd4e..c22d4c52c92 100644 --- a/i18n/esn/extensions/jake/package.i18n.json +++ b/i18n/esn/extensions/jake/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.jake.autoDetect": "Controla si la detección automática de tareas Jake estan activada/desactivada. El valor predeterminado es \"activada\"." +} \ No newline at end of file diff --git a/i18n/esn/extensions/markdown/out/extension.i18n.json b/i18n/esn/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/esn/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/esn/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/esn/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/extensions/merge-conflict/package.i18n.json b/i18n/esn/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/extensions/npm/package.i18n.json b/i18n/esn/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/esn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index f7060053115..8029ab0b3bd 100644 --- a/i18n/esn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/esn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,8 +6,6 @@ { "imgMeta": "{0} x {1} {2}", "largeImageError": "La imagen es muy grande para mostrar en el editor", - "resourceOpenExternalButton": "Abrir imagen", - "resourceOpenExternalText": "usar programa externo?", "nativeBinaryError": "El archivo no se mostrará en el editor porque es binario, muy grande o usa una codificación de texto no compatible.", "sizeB": "{0} B", "sizeKB": "{0} KB", diff --git a/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json index deeb605c6a6..8fe058e55ce 100644 --- a/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -9,6 +9,7 @@ "fontWeight": "Controla el grosor de la fuente.", "fontSize": "Controla el tamaño de fuente en píxeles.", "lineHeight": "Controla la altura de línea. Utilice 0 para calcular el valor de lineHeight a partir de fontSize.", + "letterSpacing": "Controla el espacio entre letras en pixels.", "lineNumbers": "Controla la presentación de los números de línea. Los valores posibles son \"on\", \"off\" y \"relative\". \"relative\" muestra el número de líneas desde la posición actual del cursor.", "rulers": "Columnas en las que mostrar reglas verticales", "wordSeparators": "Caracteres que se usarán como separadores de palabras al realizar operaciones o navegaciones relacionadas con palabras.", @@ -40,7 +41,6 @@ "formatOnType": "Controla si el editor debe dar formato automáticamente a la línea después de escribirla", "formatOnPaste": "Controla si el editor debe formatear automáticamente el contenido pegado. Debe haber disponible un formateador capaz de aplicar formato a un intervalo dentro de un documento.", "suggestOnTriggerCharacters": "Controla si las sugerencias deben aparecer de forma automática al escribir caracteres desencadenadores", - "acceptSuggestionOnEnter": "Controla si las sugerencias deben aceptarse en \"Entrar\" (además de \"TAB\"). Ayuda a evitar la ambigüedad entre insertar nuevas líneas o aceptar sugerencias.", "acceptSuggestionOnCommitCharacter": "Controla si se deben aceptar sugerencias en los caracteres de confirmación. Por ejemplo, en Javascript, el punto y coma (\";\") puede ser un carácter de confirmación que acepta una sugerencia y escribe ese carácter.", "snippetSuggestions": "Controla si se muestran los fragmentos de código con otras sugerencias y cómo se ordenan.", "emptySelectionClipboard": "Controla si al copiar sin selección se copia la línea actual.", @@ -62,6 +62,7 @@ "renderLineHighlight": "Controla cómo el editor debe presentar el resaltado de línea. Las posibilidades son \"ninguno\", \"margen\", \"línea\" y \"todo\".", "codeLens": "Controla si el editor muestra lentes de código", "folding": "Controla si el editor tiene habilitado el plegado de código.", + "showFoldingControls": "Controla cuándo los controles de plegado del margen son ocultados automáticamente.", "matchBrackets": "Resaltar corchetes coincidentes cuando se seleccione uno de ellos.", "glyphMargin": "Controla si el editor debe representar el margen de glifo vertical. El margen de glifo se usa, principalmente, para depuración.", "useTabStops": "La inserción y eliminación del espacio en blanco sigue a las tabulaciones.", diff --git a/i18n/esn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/esn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..d9243b76135 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "No se encontró ninguna definición para \"{0}\"", + "generic.noResults": "No se encontró ninguna definición", + "meta.title": " – {0} definiciones", + "actions.goToDecl.label": "Ir a definición", + "actions.goToDeclToSide.label": "Abrir definición en el lateral", + "actions.previewDecl.label": "Ver la definición", + "goToImplementation.noResultWord": "No se encontró ninguna implementación para \"{0}\"", + "goToImplementation.generic.noResults": "No se encontró ninguna implementación", + "meta.implementations.title": "{0} implementaciones", + "actions.goToImplementation.label": "Ir a implementación", + "actions.peekImplementation.label": "Inspeccionar implementación", + "goToTypeDefinition.noResultWord": "No se encontró ninguna definición de tipo para \"{0}\"", + "goToTypeDefinition.generic.noResults": "No se encontró ninguna definición de tipo", + "meta.typeDefinitions.title": " – {0} definiciones de tipo", + "actions.goToTypeDefinition.label": "Ir a la definición de tipo", + "actions.peekTypeDefinition.label": "Inspeccionar definición de tipo" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/esn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..d35f93e7fae --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Haga clic para mostrar {0} definiciones." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index f9d2c2d5f09..bf3d8015426 100644 --- a/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -12,6 +12,7 @@ "readMore": "Leer más...{0}", "suggestionWithDetailsAriaLabel": "{0}, sugerencia, con detalles", "suggestionAriaLabel": "{0}, sugerencia", + "readLess": "Leer menos...{0}", "suggestWidget.loading": "Cargando...", "suggestWidget.noSuggestions": "No hay sugerencias.", "suggestionAriaAccepted": "{0}, aceptada", diff --git a/i18n/esn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json b/i18n/esn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json index df256b0ca88..43ec87cbde1 100644 --- a/i18n/esn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json +++ b/i18n/esn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json @@ -15,5 +15,9 @@ "schema.brackets": "Define los corchetes que aumentan o reducen la sangría.", "schema.autoClosingPairs": "Define el par de corchetes. Cuando se escribe un corchete de apertura, se inserta automáticamente el corchete de cierre.", "schema.autoClosingPairs.notIn": "Define una lista de ámbitos donde los pares automáticos están deshabilitados.", - "schema.surroundingPairs": "Define los pares de corchetes que se pueden usar para encerrar una cadena seleccionada." + "schema.surroundingPairs": "Define los pares de corchetes que se pueden usar para encerrar una cadena seleccionada.", + "schema.wordPattern": " La definición de la palabra en el idioma.", + "schema.wordPattern.pattern": "El patrón de expresión regular utilizado para localizar palabras.", + "schema.wordPattern.flags": "Los flags de expresión regular utilizados para localizar palabras.", + "schema.wordPattern.flags.errorMessage": "Debe coincidir con el patrón `/^([gimuy]+)$/`." } \ No newline at end of file diff --git a/i18n/esn/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/esn/src/vs/platform/markers/common/problemMatcher.i18n.json index 967ffc75983..1c9dfefb5cb 100644 --- a/i18n/esn/src/vs/platform/markers/common/problemMatcher.i18n.json +++ b/i18n/esn/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -34,6 +34,7 @@ "ProblemMatcherParser.noValidIdentifier": "Error: La propiedad pattern {0} no es un nombre de variable de patrón válido.", "ProblemMatcherParser.problemPattern.watchingMatcher": "Un buscador de coincidencias de problemas debe definir tanto un patrón de inicio como un patrón de finalización para la inspección.", "ProblemMatcherParser.invalidRegexp": "Error: La cadena {0} no es una expresión regular válida.\n", + "WatchingPatternSchema.regexp": "Expresión regular para detectar el principio o el final de una tarea en segundo plano.", "WatchingPatternSchema.file": "Índice de grupo de coincidencias del nombre de archivo. Se puede omitir.", "PatternTypeSchema.name": "Nombre de un patrón aportado o predefinido", "PatternTypeSchema.description": "Patrón de problema o nombre de un patrón de problema que se ha aportado o predefinido. Se puede omitir si se especifica la base.", @@ -42,6 +43,12 @@ "ProblemMatcherSchema.severity": "Gravedad predeterminada para los problemas de capturas. Se usa si el patrón no define un grupo de coincidencias para \"severity\".", "ProblemMatcherSchema.applyTo": "Controla si un problema notificado en un documento de texto se aplica solamente a los documentos abiertos, cerrados o a todos los documentos.", "ProblemMatcherSchema.fileLocation": "Define cómo deben interpretarse los nombres de archivo notificados en un patrón de problema.", + "ProblemMatcherSchema.background": "Patrones para hacer seguimiento del comienzo y el final en un comprobador activo de la tarea en segundo plano.", + "ProblemMatcherSchema.background.activeOnStart": "Si se establece en True, el monitor está en modo activo cuando la tarea empieza. Esto es equivalente a emitir una línea que coincide con beginPattern", + "ProblemMatcherSchema.background.beginsPattern": "Si se encuentran coincidencias en la salida, se señala el inicio de una tarea en segundo plano.", + "ProblemMatcherSchema.background.endsPattern": "Si se encuentran coincidencias en la salida, se señala el fin de una tarea en segundo plano.", + "ProblemMatcherSchema.watching.deprecated": "Esta propiedad está en desuso. Use la propiedad en segundo plano.", + "ProblemMatcherSchema.watching": "Patrones para hacer un seguimiento del comienzo y el final de un patrón de supervisión.", "ProblemMatcherSchema.watching.activeOnStart": "Si se establece en true, el monitor está en modo activo cuando la tarea empieza. Esto es equivalente a emitir una línea que coincide con beginPattern", "ProblemMatcherSchema.watching.beginsPattern": "Si se encuentran coincidencias en la salida, se señala el inicio de una tarea de inspección.", "ProblemMatcherSchema.watching.endsPattern": "Si se encuentran coincidencias en la salida, se señala el fin de una tarea de inspección", diff --git a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json index 85f87911be1..889a845a813 100644 --- a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -36,11 +36,13 @@ "dropdownForeground": "Primer plano de lista desplegable.", "dropdownBorder": "Borde de lista desplegable.", "listFocusBackground": "Color de fondo de la lista o el árbol del elemento con el foco cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", + "listFocusForeground": "Color de fondo de la lista o el árbol del elemento con el foco cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", "listActiveSelectionBackground": "Color de fondo de la lista o el árbol del elemento seleccionado cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", "listActiveSelectionForeground": "Color de primer plano de la lista o el árbol del elemento con el foco cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", "listInactiveSelectionBackground": "Color de fondo de la lista o el árbol del elemento seleccionado cuando la lista o el árbol están inactivos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", "listInactiveSelectionForeground": "Color de primer plano de la lista o el árbol del elemento con el foco cuando la lista o el árbol esta inactiva. Una lista o un árbol tiene el foco del teclado cuando está activo, cuando esta inactiva no.", "listHoverBackground": "Fondo de la lista o el árbol al mantener el mouse sobre los elementos.", + "listHoverForeground": "Color de primer plano de la lista o el árbol al pasar por encima de los elementos con el ratón.", "listDropBackground": "Fondo de arrastrar y colocar la lista o el árbol al mover los elementos con el mouse.", "highlight": "Color de primer plano de la lista o el árbol de las coincidencias resaltadas al buscar dentro de la lista o el ábol.", "pickerGroupForeground": "Selector de color rápido para la agrupación de etiquetas.", @@ -58,6 +60,7 @@ "editorBackground": "Color de fondo del editor.", "editorForeground": "Color de primer plano predeterminado del editor.", "editorWidgetBackground": "Color de fondo del editor de widgets como buscar/reemplazar", + "editorWidgetBorder": "Color de borde del editor de widget.", "editorSelection": "Color de la selección del editor.", "editorInactiveSelection": "Color de la selección en un editor inactivo.", "editorSelectionHighlight": "Color de las regiones con el mismo contenido que la selección.", diff --git a/i18n/esn/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/esn/src/vs/workbench/api/node/extHostTreeViews.i18n.json index 8b6ad71cd4e..1127a4ec4f8 100644 --- a/i18n/esn/src/vs/workbench/api/node/extHostTreeViews.i18n.json +++ b/i18n/esn/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "treeView.notRegistered": "No se ha registrado ninga vista del árbol con id '{0}'.", + "treeItem.notFound": "No se encontró ningún item del árbol con id '{0}'.", + "treeView.duplicateElement": "El elemento '{0}' ya está registrado" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/common/theme.i18n.json b/i18n/esn/src/vs/workbench/common/theme.i18n.json index 97f9736e665..40dfe03ebb6 100644 --- a/i18n/esn/src/vs/workbench/common/theme.i18n.json +++ b/i18n/esn/src/vs/workbench/common/theme.i18n.json @@ -32,6 +32,7 @@ "activityBarBadgeBackground": "Color de fondo de distintivo de notificación de actividad. La barra de actividad se muestra en el extremo izquierdo o derecho y permite cambiar entre vistas de la barra lateral.", "activityBarBadgeForeground": "Color de primer plano de distintivo de notificación de actividad. La barra de actividad se muestra en el extremo izquierdo o derecho y permite cambiar entre vistas de la barra lateral.", "sideBarBackground": "Color de fondo de la barra lateral, que es el contenedor de vistas como Explorador y Búsqueda.", + "sideBarForeground": "Color de primer plano de la barra lateral, que es el contenedor de vistas como Explorador y Búsqueda.", "sideBarTitleForeground": "Color de primer plano del título de la barra lateral, que es el contenedor de vistas como Explorador y Búsqueda.", "sideBarSectionHeaderBackground": "Color de fondo del encabezado de sección de la barra lateral, que es el contenedor de vistas como Explorador y Búsqueda.", "titleBarActiveForeground": "Color de primer plano de la barra de título cuando la ventana está activa. Tenga en cuenta que, actualmente, este clor solo se admite en macOS.", diff --git a/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json index cbf9d0deef3..543d5451907 100644 --- a/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,6 +7,7 @@ "view": "Ver", "help": "Ayuda", "file": "Archivo", + "developer": "Desarrollador", "showEditorTabs": "Controla si los editores abiertos se deben mostrar o no en pestañas.", "editorTabCloseButton": "Controla la posición de los botones de cierre de pestañas del editor o los deshabilita si se establece en \"off\".", "showIcons": "Controla si los editores abiertos deben mostrarse o no con un icono. Requiere que también se habilite un tema de icono.", diff --git a/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index cb1c2139583..00a55728fff 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,6 +7,7 @@ "debugAdapterBinNotFound": "El ejecutable del adaptador de depuración \"{0}\" no existe.", "debugAdapterCannotDetermineExecutable": "No se puede determinar el ejecutable para el adaptador de depuración \"{0}\".", "debugType": "Tipo de configuración.", + "debugTypeNotRecognised": "Este tipo de depuración no se reconoce. Compruebe que tiene instalada la correspondiente extensión de depuración y que está habilitada.", "node2NotSupported": "\"node2\" ya no se admite; use \"node\" en su lugar y establezca el atributo \"protocol\" en \"inspector\".", "debugName": "Nombre de la configuración. Aparece en el menú desplegable de la configuración de inicio.", "debugRequest": "Tipo de solicitud de la configuración. Puede ser \"launch\" o \"attach\".", diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 8b6ad71cd4e..2b42d7a0c5b 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "disableOtherKeymapsConfirmation": "¿Quiere deshabilitar otras asignaciones de teclado para evitar conflictos entre los enlaces de teclado?", + "yes": "Sí", + "no": "No" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 9b8bcb5fdf1..ef718dc3ee1 100644 --- a/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,7 +16,6 @@ "associations": "Configure asociaciones de archivo para los lenguajes (por ejemplo, \"*.extension\": \"html\"). Estas asociaciones tienen prioridad sobre las asociaciones predeterminadas de los lenguajes instalados.", "encoding": "La codificación del juego de caracteres predeterminada que debe utilizarse al leer y escribir archivos.", "autoGuessEncoding": "Si está opción está habilitada, se intentará adivinar la codificación del juego de caracteres al abrir los archivos", - "eol": "Carácter predeterminado de final de línea.", "trimTrailingWhitespace": "Si se habilita, se recortará el espacio final cuando se guarde un archivo.", "insertFinalNewline": "Si se habilita, inserte una nueva línea final al final del archivo cuando lo guarde.", "files.autoSave.off": "Un archivo con modificaciones no se guarda nunca automáticamente.", diff --git a/i18n/esn/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json index 712641fcab1..81f5a667ca8 100644 --- a/i18n/esn/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -5,5 +5,11 @@ // Do not edit this file. It is machine generated. { "slow": "Inicio lento detectado", - "slow.detail": "Lamentamos que haya tenido un inicio lento. Reinicie \"{0}\" con la generación de perfiles habilitada, comparta los perfiles con nosotros y trabajaremos a fondo para que vuelva a disfrutar de un inicio increíble." + "slow.detail": "Lamentamos que haya tenido un inicio lento. Reinicie \"{0}\" con la generación de perfiles habilitada, comparta los perfiles con nosotros y trabajaremos a fondo para que vuelva a disfrutar de un inicio increíble.", + "prof.message": "Los perfiles se crearon correctamente.", + "prof.detail": "Cree un problema y asóciele manualmente los siguientes archivos: {0}", + "prof.restartAndFileIssue": "Crear problema y reiniciar", + "prof.restart": "Reiniciar", + "prof.thanks": "Gracias por ayudarnos.", + "prof.detail.restart": "Se necesita un reinicio final para continuar utilizando '{0}'. De nuevo, gracias por su aportación." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json index 2d44f58d514..a77a2211780 100644 --- a/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "toggleGitViewlet": "Mostrar GIT", + "installAdditionalSCMProviders": "Instalar proveedores adicionales de SCM...", "source control": "Control de código fuente", "toggleSCMViewlet": "Mostrar SCM", "view": "Ver" diff --git a/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json b/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json index 58e5c2559c8..048db5a28d0 100644 --- a/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "installAdditionalSCMProviders": "Instalar proveedores adicionales de SCM...", "switch provider": "Cambiar proveedor de SCM..." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json index e5995f59713..30e2262eef7 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}, tareas" + "entryAriaLabel": "{0}, tareas", + "workspace": "De área de trabajo", + "extension": "De extensiones" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 930b60298c1..58c4eca7cfe 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -6,5 +6,6 @@ { "TerminalTaskSystem.unknownError": "Error desconocido durante la ejecución de una tarea. Vea el registro de resultados de la tarea para obtener más detalles.", "TerminalTaskSystem.terminalName": "Tarea - {0}", - "TerminalTaskSystem": "No se puede ejecutar un comando shell en una unidad UNC." + "TerminalTaskSystem": "No se puede ejecutar un comando shell en una unidad UNC.", + "unkownProblemMatcher": "No puede resolver el comprobador de problemas {0}. Será omitido." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json index 651c8b00513..b300e0e061a 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json @@ -7,5 +7,6 @@ "TaskRunnerSystem.unknownError": "Error desconocido durante la ejecución de una tarea. Vea el registro de resultados de la tarea para obtener más detalles.", "TaskRunnerSystem.watchingBuildTaskFinished": "La inspección de las tareas de compilación ha finalizado.", "TaskRunnerSystem.childProcessError": "Failed to launch external program {0} {1}.", - "TaskRunnerSystem.cancelRequested": "La tarea '{0}' se finalizó por solicitud del usuario." + "TaskRunnerSystem.cancelRequested": "La tarea '{0}' se finalizó por solicitud del usuario.", + "unkownProblemMatcher": "No puede resolver el comprobador de problemas {0}. Será omitido" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 9591e0b1673..2438b3e1709 100644 --- a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -14,13 +14,18 @@ "welcomePage.moreRecent": "Más...", "welcomePage.noRecentFolders": "No hay ninguna carpeta reciente", "welcomePage.help": "Ayuda", + "welcomePage.keybindingsCheatsheet": "Hoja imprimible con ayudas de teclado", "welcomePage.introductoryVideos": "Vídeos de introducción", "welcomePage.productDocumentation": "Documentación del producto", "welcomePage.gitHubRepository": "Repositorio de GitHub", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "Mostrar página principal al inicio", "welcomePage.customize": "Personalizar", + "welcomePage.installExtensionPacks": "Herramientas y lenguajes", + "welcomePage.installExtensionPacksDescription": "Instalar soporte para {0} y {1}", + "welcomePage.moreExtensions": "más", "welcomePage.installKeymapDescription": "Instalar los métodos abreviados de teclado", + "welcomePage.installKeymapExtension": "Instalar los métodos abreviados de teclado de {0} y {1}", "welcomePage.others": "otros", "welcomePage.colorTheme": "Tema de color", "welcomePage.colorThemeDescription": "Modifique a su gusto la apariencia del editor y el código", diff --git a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index 28283fba5c3..57b34bdf736 100644 --- a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,11 +5,25 @@ // Do not edit this file. It is machine generated. { "welcomePage": "Bienvenido", + "welcomePage.javaScript": "JavaScript", + "welcomePage.typeScript": "TypeScript", + "welcomePage.python": "Python", + "welcomePage.php": "PHP", + "welcomePage.docker": "Docker", + "welcomePage.vim": "Vim", + "welcomePage.sublime": "Sublime", + "welcomePage.atom": "Atom", + "welcomePage.extensionPackAlreadyInstalled": "El soporte para '{0}' ya está instalado.", + "welcomePage.willReloadAfterInstallingExtensionPack": "La ventana se volverá a cargar después de instalar el soporte para {0}.", + "welcomePage.installingExtensionPack": "Instalando soporte para {0}...", + "welcomePage.extensionPackNotFound": "No se pudo encontrar el soporte para {0} con id {1}.", "welcomePage.keymapAlreadyInstalled": "Los métodos abreviados de teclado {0} ya están instalados.", "welcomePage.willReloadAfterInstallingKeymap": "La ventana se volverá a cargar después de instalar los métodos abreviados de teclado {0}.", "welcomePage.installingKeymap": "Instalando los métodos abreviados de teclado de {0}...", "welcomePage.keymapNotFound": "No se pudieron encontrar los métodos abreviados de teclado {0} con el identificador {1}.", "welcome.title": "Bienvenido", + "welcomePage.extensionListSeparator": ", ", + "welcomePage.installedExtension": "{0} (instalado)", "ok": "Aceptar", "cancel": "Cancelar", "welcomePage.quickLinkBackground": "Color de fondo de los vínculos rápidos en la página principal.", diff --git a/i18n/fra/extensions/markdown/out/extension.i18n.json b/i18n/fra/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/fra/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/fra/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/fra/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/extensions/merge-conflict/package.i18n.json b/i18n/fra/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/extensions/npm/package.i18n.json b/i18n/fra/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/fra/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index d6968482f68..b6faf1c8af7 100644 --- a/i18n/fra/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/fra/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,8 +6,6 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "L'image est trop grande pour être affichée dans l'éditeur. ", - "resourceOpenExternalButton": "Ouvrir l'image", - "resourceOpenExternalText": " en utilisant un programme externe ?", "nativeBinaryError": "Impossible d'afficher le fichier dans l'éditeur : soit il est binaire, soit il est très volumineux, soit il utilise un encodage de texte non pris en charge.", "sizeB": "{0} o", "sizeKB": "{0} Ko", diff --git a/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json index afe0864b817..16acf6481b0 100644 --- a/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -41,7 +41,6 @@ "formatOnType": "Contrôle si l'éditeur doit automatiquement mettre en forme la ligne après la saisie", "formatOnPaste": "Contrôle si l'éditeur doit automatiquement mettre en forme le contenu collé. Un formateur doit être disponible et doit pouvoir mettre en forme une plage dans un document.", "suggestOnTriggerCharacters": "Contrôle si les suggestions doivent s'afficher automatiquement durant la saisie de caractères de déclenchement", - "acceptSuggestionOnEnter": "Contrôle si les suggestions peuvent être acceptées avec Entrée (en plus de Tab). Cela permet d'éviter toute ambiguïté entre l'insertion de nouvelles lignes et l'acceptation de suggestions.", "acceptSuggestionOnCommitCharacter": "Contrôle si les suggestions doivent être acceptées avec des caractères de validation. Par exemple, en JavaScript, le point-virgule (';') peut être un caractère de validation qui permet d'accepter une suggestion et de taper ce caractère.", "snippetSuggestions": "Contrôle si les extraits de code s'affichent en même temps que d'autres suggestions, ainsi que leur mode de tri.", "emptySelectionClipboard": "Contrôle si la copie sans sélection permet de copier la ligne actuelle.", diff --git a/i18n/fra/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/fra/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..0488ff48354 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "Définition introuvable pour '{0}'", + "generic.noResults": "Définition introuvable", + "meta.title": " – {0} définitions", + "actions.goToDecl.label": "Atteindre la définition", + "actions.goToDeclToSide.label": "Ouvrir la définition sur le côté", + "actions.previewDecl.label": "Apercu de définition", + "goToImplementation.noResultWord": "Implémentation introuvable pour '{0}'", + "goToImplementation.generic.noResults": "Implémentation introuvable", + "meta.implementations.title": "– Implémentations {0}", + "actions.goToImplementation.label": "Accéder à l'implémentation", + "actions.peekImplementation.label": "Aperçu de l'implémentation", + "goToTypeDefinition.noResultWord": "Définition de type introuvable pour '{0}'", + "goToTypeDefinition.generic.noResults": "Définition de type introuvable", + "meta.typeDefinitions.title": " – Définitions de type {0}", + "actions.goToTypeDefinition.label": "Atteindre la définition de type", + "actions.peekTypeDefinition.label": "Aperçu de la définition du type" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/fra/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..247bd9d24da --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Cliquez pour afficher {0} définitions." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json index 7d14c23b2b5..d1fbda145ce 100644 --- a/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,6 +7,7 @@ "view": "Affichage", "help": "Aide", "file": "Fichier", + "developer": "Développeur", "showEditorTabs": "Contrôle si les éditeurs ouverts doivent s'afficher ou non sous des onglets.", "editorTabCloseButton": "Contrôle la position des boutons de fermeture des onglets de l'éditeur, ou les désactive quand le paramètre a la valeur 'off'.", "showIcons": "Contrôle si les éditeurs ouverts doivent s'afficher ou non avec une icône. Cela implique notamment l'activation d'un thème d'icône.", diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 8b6ad71cd4e..5ddc77dfc5a 100644 --- a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "disableOtherKeymapsConfirmation": "Désactiver les autres mappages de touches pour éviter les conflits de combinaisons de touches ?", + "yes": "Oui", + "no": "Non" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 8d72ad31935..6f916235625 100644 --- a/i18n/fra/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,7 +16,6 @@ "associations": "Configurez les associations entre les fichiers et les langages (par exemple, \"*.extension\": \"html\"). Celles-ci ont priorité sur les associations par défaut des langages installés.", "encoding": "Encodage du jeu de caractères par défaut à utiliser durant la lecture et l'écriture des fichiers.", "autoGuessEncoding": "Quand cette option est activée, tente de deviner l'encodage du jeu de caractères à l'ouverture des fichiers", - "eol": "Caractère de fin de ligne par défaut.", "trimTrailingWhitespace": "Si l'option est activée, l'espace blanc de fin est supprimé au moment de l'enregistrement d'un fichier.", "insertFinalNewline": "Quand l'option est activée, une nouvelle ligne finale est insérée à la fin du fichier au moment de son enregistrement.", "files.autoSave.off": "Un fichier dont l'intégrité est compromise n'est jamais enregistré automatiquement.", diff --git a/i18n/fra/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json index fb432045fcc..56c9603dba7 100644 --- a/i18n/fra/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -5,5 +5,9 @@ // Do not edit this file. It is machine generated. { "slow": "Démarrage lent détecté", - "slow.detail": "Le démarrage a été très lent. Redémarrez '{0}' en ayant activé le profilage, partagez les profils avec nous, et nous ferons en sorte que le démarrage retrouve sa rapidité d'exécution." + "slow.detail": "Le démarrage a été très lent. Redémarrez '{0}' en ayant activé le profilage, partagez les profils avec nous, et nous ferons en sorte que le démarrage retrouve sa rapidité d'exécution.", + "prof.message": "Création réussie des profils.", + "prof.detail": "Créez un problème et joignez manuellement les fichiers suivants :\n{0}", + "prof.restartAndFileIssue": "Créer le problème et redémarrer", + "prof.restart": "Redémarrer" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index 915c12960a0..66bb9f2ab66 100644 --- a/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,6 +5,11 @@ // Do not edit this file. It is machine generated. { "welcomePage": "Bienvenue", + "welcomePage.typeScript": "TypeScript", + "welcomePage.php": "PHP", + "welcomePage.vim": "Vim", + "welcomePage.sublime": "Sublime", + "welcomePage.atom": "Atom", "welcomePage.keymapAlreadyInstalled": "Les raccourcis clavier {0} sont déjà installés.", "welcomePage.willReloadAfterInstallingKeymap": "La fenêtre se recharge après l'installation des raccourcis clavier {0}.", "welcomePage.installingKeymap": "Installation des raccourcis clavier de {0}...", diff --git a/i18n/ita/extensions/markdown/out/extension.i18n.json b/i18n/ita/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/ita/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/ita/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/ita/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/extensions/merge-conflict/package.i18n.json b/i18n/ita/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/extensions/npm/package.i18n.json b/i18n/ita/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/ita/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index 0ccb13bf8a7..c64a07b4379 100644 --- a/i18n/ita/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/ita/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,8 +6,6 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "L'immagine è troppo grande per essere visualizzata nell'editor", - "resourceOpenExternalButton": "Apri immagine", - "resourceOpenExternalText": " con il programma esterno?", "nativeBinaryError": "Il file non verrà visualizzato nell'editor perché è binario, è molto grande o usa una codifica testo non supportata.", "sizeB": "{0} B", "sizeKB": "{0} KB", diff --git a/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json index 59f730fe1dc..06ec2510c3a 100644 --- a/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -41,7 +41,6 @@ "formatOnType": "Controlla se l'editor deve formattare automaticamente la riga dopo la digitazione", "formatOnPaste": "Controlla se l'editor deve formattare automaticamente il contenuto incollato. Deve essere disponibile un formattatore che deve essere in grado di formattare un intervallo in un documento.", "suggestOnTriggerCharacters": "Controlla se i suggerimenti devono essere visualizzati automaticamente durante la digitazione dei caratteri trigger", - "acceptSuggestionOnEnter": "Controlla se i suggerimenti devono essere accettati con 'INVIO' in aggiunta a 'TAB'. In questo modo è possibile evitare ambiguità tra l'inserimento di nuove righe e l'accettazione di suggerimenti.", "acceptSuggestionOnCommitCharacter": "Controlla se accettare i suggerimenti con i caratteri di commit. Ad esempio, in JavaScript il punto e virgola (';') può essere un carattere di commit che accetta un suggerimento e digita tale carattere.", "snippetSuggestions": "Controlla se i frammenti di codice sono visualizzati con altri suggerimenti e il modo in cui sono ordinati.", "emptySelectionClipboard": "Consente di controllare se, quando si copia senza aver effettuato una selezione, viene copiata la riga corrente.", @@ -63,6 +62,7 @@ "renderLineHighlight": "Consente di controllare in che modo l'editor deve eseguire il rendering dell'evidenziazione di riga corrente. Le opzioni possibili sono 'none', 'gutter', 'line' e 'all'.", "codeLens": "Controlla se nell'editor sono visualizzate le finestre di CodeLens", "folding": "Controlla se per l'editor è abilitata la riduzione del codice", + "showFoldingControls": "Controlla se i controlli di riduzione sul margine della barra di scorrimento sono automaticamente nascosti.", "matchBrackets": "Evidenzia le parentesi corrispondenti quando se ne seleziona una.", "glyphMargin": "Controlla se l'editor deve eseguire il rendering del margine verticale del glifo. Il margine del glifo viene usato principalmente per il debug.", "useTabStops": "Inserimento ed eliminazione dello spazio vuoto dopo le tabulazioni", diff --git a/i18n/ita/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/ita/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..9df481ec1b5 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "Non è stata trovata alcuna definizione per '{0}'", + "generic.noResults": "Non è stata trovata alcuna definizione", + "meta.title": " - Definizioni di {0}", + "actions.goToDecl.label": "Vai alla definizione", + "actions.goToDeclToSide.label": "Apri definizione lateralmente", + "actions.previewDecl.label": "Visualizza la definizione", + "goToImplementation.noResultWord": "Non sono state trovate implementazioni per '{0}'", + "goToImplementation.generic.noResults": "Non sono state trovate implementazioni", + "meta.implementations.title": "- {0} implementazioni", + "actions.goToImplementation.label": "Vai all'implementazione", + "actions.peekImplementation.label": "Anteprima implementazione", + "goToTypeDefinition.noResultWord": "Non sono state trovate definizioni di tipi per '{0}'", + "goToTypeDefinition.generic.noResults": "Non sono state trovate definizioni di tipi", + "meta.typeDefinitions.title": " - {0} definizioni di tipo", + "actions.goToTypeDefinition.label": "Vai alla definizione di tipo", + "actions.peekTypeDefinition.label": "Anteprima definizione di tipo" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/ita/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..fa526a1f9e6 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Fare clic per visualizzare {0} definizioni." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/ita/src/vs/platform/markers/common/problemMatcher.i18n.json index a2611139aec..87b88acd388 100644 --- a/i18n/ita/src/vs/platform/markers/common/problemMatcher.i18n.json +++ b/i18n/ita/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -34,6 +34,7 @@ "ProblemMatcherParser.noValidIdentifier": "Errore: la proprietà {0} del criterio non è un nome di variabile criterio valido.", "ProblemMatcherParser.problemPattern.watchingMatcher": "Un matcher problemi deve definire un criterio di inizio e un criterio di fine per il controllo.", "ProblemMatcherParser.invalidRegexp": "Errore: la stringa {0} non è un'espressione regolare valida.\n", + "WatchingPatternSchema.regexp": "L'espressione regolare per rilevare l'inizio o la fine di un'attività in background.", "WatchingPatternSchema.file": "Indice del gruppo di corrispondenze del nome file. Può essere omesso.", "PatternTypeSchema.name": "Nome di un criterio predefinito o aggiunto come contributo", "PatternTypeSchema.description": "Criterio di problema o nome di un criterio di problema predefinito o aggiunto come contributo. Può essere omesso se si specifica base.", @@ -42,6 +43,12 @@ "ProblemMatcherSchema.severity": "Gravità predefinita per i problemi di acquisizione. Viene usato se il criterio non definisce un gruppo di corrispondenze per la gravità.", "ProblemMatcherSchema.applyTo": "Controlla se un problema segnalato in un documento di testo è valido solo per i documenti aperti o chiusi oppure per tutti i documenti.", "ProblemMatcherSchema.fileLocation": "Consente di definire come interpretare i nomi file indicati in un criterio di problema.", + "ProblemMatcherSchema.background": "Criteri per tenere traccia dell'inizio e della fine di un matcher attivo su un'attività in background.", + "ProblemMatcherSchema.background.activeOnStart": "Se impostato a true, il monitor in backbround è in modalità attiva quando l'attività inizia. Equivale a inviare una riga che corrisponde al beginPattern", + "ProblemMatcherSchema.background.beginsPattern": "Se corrisponde nell'output, viene segnalato l'avvio di un'attività in background.", + "ProblemMatcherSchema.background.endsPattern": "Se corrisponde nell'output, viene segnalata la fine di un'attività in background.", + "ProblemMatcherSchema.watching.deprecated": "La proprietà watching è deprecata. In alternativa, utilizzare background (sfondo).", + "ProblemMatcherSchema.watching": "Criteri per tenere traccia dell'inizio e della fine di un matcher watching.", "ProblemMatcherSchema.watching.activeOnStart": "Se impostato su true, indica che il watcher è in modalità attiva all'avvio dell'attività. Equivale a inviare una riga che corrisponde al criterio di avvio", "ProblemMatcherSchema.watching.beginsPattern": "Se corrisponde nell'output, viene segnalato l'avvio di un'attività di controllo.", "ProblemMatcherSchema.watching.endsPattern": "Se corrisponde nell'output, viene segnalata la fine di un'attività di controllo.", diff --git a/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json index c034a8cc727..b13e3a07bdd 100644 --- a/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,6 +7,7 @@ "view": "Visualizza", "help": "Guida", "file": "File", + "developer": "Sviluppatore", "showEditorTabs": "Controlla se visualizzare o meno gli editor aperti in schede.", "editorTabCloseButton": "Controlla la posizione dei pulsanti di chiusura delle schede dell'editor oppure li disabilita quando è impostata su 'off'.", "showIcons": "Controlla se visualizzare o meno un'icona per gli editor aperti. Richiede l'abilitazione anche di un tema dell'icona.", diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 8b6ad71cd4e..6c3f2e984e8 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "disableOtherKeymapsConfirmation": "Disabilitare altre mappature tastiera per evitare conflitti tra tasti di scelta rapida?", + "yes": "Sì", + "no": "No" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 5f1557087a0..a3c0e1da94b 100644 --- a/i18n/ita/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,7 +16,6 @@ "associations": "Consente di configurare le associazioni tra file e linguaggi, ad esempio \"*.extension\": \"html\". Queste hanno la precedenza sulle associazioni predefinite dei linguaggi installate.", "encoding": "Codifica del set di caratteri predefinita da usare durante la lettura e la scrittura di file.", "autoGuessEncoding": "Quando questa opzione è abilitata, la codifica del set di caratteri viene ipotizzata all'apertura dei file", - "eol": "Carattere di fine riga predefinito.", "trimTrailingWhitespace": "Se è abilitato, taglierà lo spazio vuoto quando si salva un file.", "insertFinalNewline": "Se è abilitato, inserisce un carattere di nuova riga finale alla fine del file durante il salvataggio.", "files.autoSave.off": "Un file dirty non viene mai salvato automaticamente.", diff --git a/i18n/ita/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json index 18ae03ff77a..158ed123e7a 100644 --- a/i18n/ita/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -5,5 +5,9 @@ // Do not edit this file. It is machine generated. { "slow": "È stato rilevato un rallentamento all'avvio", - "slow.detail": "È stato appena rilevato un rallentamento all'avvio. Per consentire a Microsoft di analizzare e risolvere il problema, riavviare '{0}' con la profilatura abilitata e condividere i profili." + "slow.detail": "È stato appena rilevato un rallentamento all'avvio. Per consentire a Microsoft di analizzare e risolvere il problema, riavviare '{0}' con la profilatura abilitata e condividere i profili.", + "prof.message": "I profili sono stati creati.", + "prof.detail": "Creare un problema e allegare manualmente i file seguenti:\n{0}", + "prof.restartAndFileIssue": "Crea problema e riavvia", + "prof.restart": "Riavvia" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index d2d18b208df..01f19048853 100644 --- a/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,6 +5,11 @@ // Do not edit this file. It is machine generated. { "welcomePage": "Benvenuti", + "welcomePage.typeScript": "TypeScript", + "welcomePage.php": "PHP", + "welcomePage.vim": "Vim", + "welcomePage.sublime": "Sublime", + "welcomePage.atom": "Atom", "welcomePage.keymapAlreadyInstalled": "I tasti di scelta rapida di {0} sono già installati.", "welcomePage.willReloadAfterInstallingKeymap": "La finestra verrà ricaricata dopo l'installazione dei tasti di scelta rapida di {0}.", "welcomePage.installingKeymap": "Installazione dei tasti di scelta rapida di {0}...", diff --git a/i18n/jpn/extensions/jake/out/main.i18n.json b/i18n/jpn/extensions/jake/out/main.i18n.json index 8b6ad71cd4e..0f77342ecbc 100644 --- a/i18n/jpn/extensions/jake/out/main.i18n.json +++ b/i18n/jpn/extensions/jake/out/main.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "execFailed": "Jake のエラーによる失敗を自動検出: {0}" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/jake/package.i18n.json b/i18n/jpn/extensions/jake/package.i18n.json index 8b6ad71cd4e..def0eab1b4c 100644 --- a/i18n/jpn/extensions/jake/package.i18n.json +++ b/i18n/jpn/extensions/jake/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.jake.autoDetect": "Jake タスクの自動検出をオンにするかオフにするかを制御します。既定はオンです。" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/markdown/out/extension.i18n.json b/i18n/jpn/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/jpn/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/jpn/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/jpn/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/extensions/merge-conflict/package.i18n.json b/i18n/jpn/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/extensions/npm/package.i18n.json b/i18n/jpn/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript/package.i18n.json b/i18n/jpn/extensions/typescript/package.i18n.json index e30965564d0..d3f776eaa11 100644 --- a/i18n/jpn/extensions/typescript/package.i18n.json +++ b/i18n/jpn/extensions/typescript/package.i18n.json @@ -33,10 +33,13 @@ "javascript.validate.enable": "JavaScript の検証を有効/無効にします。", "typescript.goToProjectConfig.title": "プロジェクト構成に移動", "javascript.goToProjectConfig.title": "プロジェクト構成に移動", + "javascript.referencesCodeLens.enabled": "JavaScript ファイル内で CodeLens の参照を有効/無効にします。", + "typescript.referencesCodeLens.enabled": "TypeScript ファイル内で CodeLens の参照を有効/無効にします。TypeScript 2.0.6 以上が必要です。", "typescript.implementationsCodeLens.enabled": "CodeLens の実装を有効/無効にします。TypeScript 2.2.0 以上が必要です。", "typescript.openTsServerLog.title": "TS サーバーのログを開く", "typescript.selectTypeScriptVersion.title": "TypeScript のバージョンの選択", "jsDocCompletion.enabled": " 自動 JSDoc コメントを有効/無効にします", "javascript.implicitProjectConfig.checkJs": "JavaScript ファイルのセマンティック チェックを有効/無効にします。既存の jsconfi.json や tsconfi.json ファイルの設定はこれより優先されます。TypeScript は 2.3.1 以上である必要があります。", - "typescript.check.npmIsInstalled": "型定義の自動取得に NPM がインストールされているかどうかを確認する" + "typescript.check.npmIsInstalled": "型定義の自動取得に NPM がインストールされているかどうかを確認する", + "javascript.nameSuggestions": "JavaScript の候補リスト内でファイルから一意の名前を含むかどうかを有効/無効にします。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/jpn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index ea2e47d9813..e70844baf7b 100644 --- a/i18n/jpn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/jpn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,8 +6,6 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "イメージが大きすぎてエディターに表示できません。", - "resourceOpenExternalButton": "イメージを開く", - "resourceOpenExternalText": " 外部プログラムを使用していますか?", "nativeBinaryError": "このファイルはバイナリか、非常に大きいか、またはサポートされていないテキスト エンコードを使用しているため、エディターに表示されません。", "sizeB": "{0}B", "sizeKB": "{0}KB", diff --git a/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json index da6b50dacf0..8ce8d297e00 100644 --- a/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -41,7 +41,6 @@ "formatOnType": "エディターで入力後に自動的に行の書式設定を行うかどうかを制御します", "formatOnPaste": "貼り付けた内容がエディターにより自動的にフォーマットされるかどうかを制御します。フォーマッタを使用可能にする必要があります。また、フォーマッタがドキュメント内の範囲をフォーマットできなければなりません。", "suggestOnTriggerCharacters": "トリガー文字の入力時に候補が自動的に表示されるようにするかどうかを制御します", - "acceptSuggestionOnEnter": "'Tab' キーに加えて 'Enter' キーで候補を受け入れるかどうかを制御します。改行の挿入や候補の反映の間であいまいさを解消するのに役立ちます。", "acceptSuggestionOnCommitCharacter": "コミット文字で候補を受け入れるかどうかを制御します。たとえば、JavaScript ではセミコロン (';') をコミット文字にして、候補を受け入れてその文字を入力することができます。", "snippetSuggestions": "他の修正候補と一緒にスニペットを表示するかどうか、およびその並び替えの方法を制御します。", "emptySelectionClipboard": "選択範囲を指定しないでコピーする場合に現在の行をコピーするかどうかを制御します。", @@ -63,6 +62,7 @@ "renderLineHighlight": "エディターが現在の行をどのように強調表示するかを制御します。考えられる値は 'none'、'gutter'、'line'、'all' です。", "codeLens": "エディターで CodeLens を表示するかどうかを制御する", "folding": "エディターでコードの折りたたみを有効にするかどうかを制御します", + "showFoldingControls": "余白上の折りたたみコントロールを自動的に非表示にするかどうかを制御します 。", "matchBrackets": "かっこを選択すると、対応するかっこを強調表示します。", "glyphMargin": "エディターで縦のグリフ余白が表示されるかどうかを制御します。ほとんどの場合、グリフ余白はデバッグに使用されます。", "useTabStops": "空白の挿入や削除はタブ位置に従って行われます", diff --git a/i18n/jpn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/jpn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..624f9b7af70 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "'{0}' の定義は見つかりません", + "generic.noResults": "定義が見つかりません", + "meta.title": " – {0} 個の定義", + "actions.goToDecl.label": "定義へ移動", + "actions.goToDeclToSide.label": "定義を横に開く", + "actions.previewDecl.label": "定義をここに表示", + "goToImplementation.noResultWord": "'{0}' の実装が見つかりません", + "goToImplementation.generic.noResults": "実装が見つかりません", + "meta.implementations.title": "– {0} 個の実装", + "actions.goToImplementation.label": "実装に移動", + "actions.peekImplementation.label": "実装のプレビュー", + "goToTypeDefinition.noResultWord": "'{0}' の型定義が見つかりません", + "goToTypeDefinition.generic.noResults": "型定義が見つかりません", + "meta.typeDefinitions.title": " – {0} 個の型定義", + "actions.goToTypeDefinition.label": "型定義へ移動", + "actions.peekTypeDefinition.label": "型定義を表示" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/jpn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..f918ba9f96d --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "クリックして、{0} の定義を表示します。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index b5c107a4338..65e2583d291 100644 --- a/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -12,6 +12,7 @@ "readMore": "詳細を表示...{0}", "suggestionWithDetailsAriaLabel": "{0}、候補、詳細あり", "suggestionAriaLabel": "{0}、候補", + "readLess": "詳細を隠す...{0}", "suggestWidget.loading": "読み込んでいます...", "suggestWidget.noSuggestions": "候補はありません。", "suggestionAriaAccepted": "{0}、受け入れ済み", diff --git a/i18n/jpn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json b/i18n/jpn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json index 991783c6602..7f3e60f73e4 100644 --- a/i18n/jpn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json +++ b/i18n/jpn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json @@ -16,6 +16,7 @@ "schema.autoClosingPairs": "角かっこのペアを定義します。左角かっこが入力されると、右角かっこが自動的に挿入されます。", "schema.autoClosingPairs.notIn": "自動ペアが無効なスコープの一覧を定義します。", "schema.surroundingPairs": "選択文字列を囲むときに使用できる角かっこのペアを定義します。", + "schema.wordPattern": "言語のための単語の定義。", "schema.wordPattern.pattern": "言葉の照合に使用する正規表現パターン。", "schema.wordPattern.flags": "言葉の照合に使用する正規表現フラグ。", "schema.wordPattern.flags.errorMessage": "`/^([gimuy]+)$/` パターンに一致する必要があります。" diff --git a/i18n/jpn/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/jpn/src/vs/platform/markers/common/problemMatcher.i18n.json index 2bbfe1d0b1d..df4f3d19acd 100644 --- a/i18n/jpn/src/vs/platform/markers/common/problemMatcher.i18n.json +++ b/i18n/jpn/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -34,6 +34,7 @@ "ProblemMatcherParser.noValidIdentifier": "エラー: パターン プロパティ {0} は有効なパターン変数名ではありません。", "ProblemMatcherParser.problemPattern.watchingMatcher": "問題マッチャーは、ウォッチ対象の開始パターンと終了パターンの両方を定義する必要があります。", "ProblemMatcherParser.invalidRegexp": "エラー: 文字列 {0} は、有効な正規表現ではありません。\n", + "WatchingPatternSchema.regexp": "バックグラウンド タスクの開始または終了を検出する正規表現。", "WatchingPatternSchema.file": "ファイル名の一致グループ インデックス。省略できます。", "PatternTypeSchema.name": "提供されたか事前定義された問題パターンの名前", "PatternTypeSchema.description": "A problem pattern or the name of a contributed or predefined problem pattern. Can be omitted if base is specified.", @@ -42,6 +43,12 @@ "ProblemMatcherSchema.severity": "キャプチャされた問題の既定の重大度。パターンが重要度の一致グループを定義していない場合に使用されます。", "ProblemMatcherSchema.applyTo": "テキスト ドキュメントで報告された問題が、開いているドキュメントのみ、閉じられたドキュメントのみ、すべてのドキュメントのいずれに適用されるかを制御します。", "ProblemMatcherSchema.fileLocation": "問題パターンで報告されたファイル名を解釈する方法を定義します。", + "ProblemMatcherSchema.background": "バックグラウンド タスクでアクティブなマッチャーの開始と終了を追跡するパターン。", + "ProblemMatcherSchema.background.activeOnStart": "true に設定すると、タスクの開始時にバックグラウンド モニターがアクティブ モードになります。これは beginPattern と一致する行の発行と同等です。", + "ProblemMatcherSchema.background.beginsPattern": "出力内で一致すると、バックグラウンド タスクの開始が通知されます。", + "ProblemMatcherSchema.background.endsPattern": "出力内で一致すると、バックグラウンド タスクの終了が通知されます。", + "ProblemMatcherSchema.watching.deprecated": "watching プロパティは使用されなくなりました。代わりに background をご使用ください。", + "ProblemMatcherSchema.watching": "監視パターンの開始と終了を追跡するマッチャー。", "ProblemMatcherSchema.watching.activeOnStart": "true に設定すると、タスクの開始時にウォッチャーがアクティブ モードになります。これは beginPattern と一致する行の発行と同等です。", "ProblemMatcherSchema.watching.beginsPattern": "出力内で一致すると、ウォッチ中のタスクの開始が通知されます。", "ProblemMatcherSchema.watching.endsPattern": "出力内で一致すると、ウォッチ中のタスクの終了が通知されます。", diff --git a/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json index 8da89f6115c..9872f49057d 100644 --- a/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -60,6 +60,7 @@ "editorBackground": "エディターの背景色。", "editorForeground": "エディターの既定の前景色。", "editorWidgetBackground": "検索/置換窓など、エディター ウィジェットの背景色。", + "editorWidgetBorder": "エディター ウィジェットの境界線の色。", "editorSelection": "エディターの選択範囲の色。", "editorInactiveSelection": "非アクティブなエディターの選択範囲の色。", "editorSelectionHighlight": "選択範囲と同じコンテンツの領域の色。", diff --git a/i18n/jpn/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/jpn/src/vs/workbench/api/node/extHostTreeViews.i18n.json index 8b6ad71cd4e..74c5f0eabd7 100644 --- a/i18n/jpn/src/vs/workbench/api/node/extHostTreeViews.i18n.json +++ b/i18n/jpn/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "treeView.notRegistered": "ID '{0}' のツリー ビューは登録されていません。", + "treeItem.notFound": "ID '{0}' のツリー項目は見つかりませんでした。", + "treeView.duplicateElement": " {0} 要素は既に登録されています。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/common/theme.i18n.json b/i18n/jpn/src/vs/workbench/common/theme.i18n.json index b361c556bdc..d183c267924 100644 --- a/i18n/jpn/src/vs/workbench/common/theme.i18n.json +++ b/i18n/jpn/src/vs/workbench/common/theme.i18n.json @@ -32,6 +32,7 @@ "activityBarBadgeBackground": "アクティビティ通知バッジの背景色。アクティビティ バーは左端または右端に表示され、サイド バーの表示を切り替えることができます。", "activityBarBadgeForeground": "アクティビティ通知バッジの前景色。アクティビティ バーは左端または右端に表示され、サイド バーの表示を切り替えることができます。", "sideBarBackground": "サイド バーの背景色。サイド バーは、エクスプローラーや検索などのビューが入るコンテナーです。", + "sideBarForeground": "サイド バーの前景色。サイド バーは、エクスプローラーや検索などのビューが入るコンテナーです。", "sideBarTitleForeground": "サイド バーのタイトルの前景色。サイド バーは、エクスプローラーや検索などのビューが入るコンテナーです。", "sideBarSectionHeaderBackground": "サイド バーのセクション ヘッダーの背景色。サイド バーは、エクスプローラーや検索などのビューが入るコンテナーです。", "titleBarActiveForeground": "ウィンドウがアクティブな場合のタイトル バーの前景。現在、この色は macOS でのみサポートされているのでご注意ください。", diff --git a/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json index e69cb0fb627..d813d5f6c23 100644 --- a/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,6 +7,7 @@ "view": "表示", "help": "ヘルプ", "file": "ファイル", + "developer": "開発者", "showEditorTabs": "開いているエディターをタブに表示するかどうかを制御します。", "editorTabCloseButton": "エディター タブの閉じるボタンの位置を制御するか、[off] に設定した場合に無効にします。", "showIcons": "開いているエディターをアイコンで表示するかどうかを制御します。これには、アイコンのテーマを有効にする必要もあります。", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json index e57fd60ee0d..8943a8809bd 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json @@ -6,5 +6,6 @@ { "copyValue": "値のコピー", "copy": "コピー", + "copyAll": "すべてコピー", "copyStackTrace": "呼び出し履歴のコピー" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index af68e40b4ae..d63fe387f50 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,6 +7,7 @@ "debugAdapterBinNotFound": "デバッグ アダプターの実行可能ファイル '{0}' がありません。", "debugAdapterCannotDetermineExecutable": "デバッグ アダプター '{0}' の実行可能ファイルを判別できません。", "debugType": "構成の種類。", + "debugTypeNotRecognised": "デバッグの種類は認識されませんでした。対応するデバッグの拡張機能がインストールされており、有効になっていることを確認してください。", "node2NotSupported": "\"node2\" はサポートされていません。代わりに \"node\" を使用し、\"protocol\" 属性を \"inspector\" に設定してください。", "debugName": "構成の名前。起動構成のドロップダウン メニューに表示されます。", "debugRequest": "構成の要求の種類。\"launch\" または \"attach\" です。", diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 8b6ad71cd4e..e5b2af33ec3 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "disableOtherKeymapsConfirmation": "キーバインド間の競合を回避するために、他のキーマップを無効にしますか?", + "yes": "はい", + "no": "いいえ" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 15c3aee15db..9356fa119aa 100644 --- a/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,7 +16,6 @@ "associations": "言語に対するファイルの関連付け (例 \"*.extension\": \"html\") を構成します。これらの関連付けは、インストールされている言語の既定の関連付けより優先されます。", "encoding": "ファイルの読み取り/書き込みで使用する既定の文字セット エンコーディング。", "autoGuessEncoding": "有効な場合、ファイルを開くときに文字セット エンコードを推測します", - "eol": "既定の改行文字。", "trimTrailingWhitespace": "有効にすると、ファイルの保存時に末尾の空白をトリミングします。", "insertFinalNewline": "有効にすると、ファイルの保存時に最新の行を末尾に挿入します。", "files.autoSave.off": "ダーティ ファイルを自動的に保存することはしません。", @@ -27,6 +26,8 @@ "autoSaveDelay": "ダーティ ファイルの自動保存の遅延をミリ秒単位で制御します。'files.autoSave' が '{0}' に設定されている場合のみ適用されます", "watcherExclude": "ファイル モニタリングから除外するファイル パスの glob パターンを構成します。この設定を変更すると、再起動が必要になります。始動時に Code が消費する CPU 時間が多い場合は、大規模なフォルダーを除外して初期ロードを減らせます。", "hotExit.off": "Hot Exit を無効にします。", + "hotExit.onExit": "アプリケーションが閉じると (Windows/Linux で最後のウィンドウが閉じるとき、または workbench.action.quit コマンドがトリガーされるとき (コマンド パレット、キー バインド、メニュー))、Hot Exit がトリガーされます。バックアップされているすべてのウィンドウは、次の起動時に復元されます。", + "hotExit.onExitAndWindowClose": "アプリケーションが閉じると (Windows/Linux で最後のウィンドウが閉じるとき、または workbench.action.quit コマンドがトリガーするとき (コマンド パレット、キー バインド、メニュー))、Hot Exit がトリガーされます。また、フォルダーが開かれているウィンドウについても、それが最後のウィンドウかどうかに関係なく、Hot Exit がトリガーされます。フォルダーが開かれていないウィンドウはすべて、次回の起動時に復元されます。フォルダーのウィンドウをシャットダウン前と同じ状態に復元するには、\"window.reopenFolders\" を \"all\" に設定します。", "hotExit": "エディターを終了するときに保存を確認するダイアログを省略し、保存されていないファイルをセッション後も保持するかどうかを制御します。", "defaultLanguage": "新しいファイルに割り当てられる既定の言語モード。", "editorConfigurationTitle": "エディター", diff --git a/i18n/jpn/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json index a71fcb6fc94..e14e57a90eb 100644 --- a/i18n/jpn/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -5,5 +5,11 @@ // Do not edit this file. It is machine generated. { "slow": "スタートアップの遅延が検出されました", - "slow.detail": "スタートアップが遅かったとのこと、申し訳ございません。プロファイルを有効にして、'{0}' を再起動し、プロファイルを共有してください。スタートアップの改善のために参考にさせていただきます。" + "slow.detail": "スタートアップが遅かったとのこと、申し訳ございません。プロファイルを有効にして、'{0}' を再起動し、プロファイルを共有してください。スタートアップの改善のために参考にさせていただきます。", + "prof.message": "プロファイルが正常に作成されました。", + "prof.detail": "案件を作成し、手動で次のファイルを添付してください:\\n{0}", + "prof.restartAndFileIssue": "問題を作成して再起動", + "prof.restart": "再起動", + "prof.thanks": "ご協力いただき、ありがとうございます。", + "prof.detail.restart": "'{0}' を引き続き使用するには、最後の再起動が必要です。 改めてあなたの貢献に感謝します。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 0a35cdb1be9..dba4d278b14 100644 --- a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "errorInvalidConfiguration": "設定を書き込めません。ファイル内のエラー/警告を修正してからもう一度お試しください。", "editTtile": "編集", "replaceDefaultValue": "設定を置換", "copyDefaultValue": "設定にコピー", diff --git a/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json index b650b0b0eb3..d45b8437459 100644 --- a/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "toggleGitViewlet": "Git を表示", + "installAdditionalSCMProviders": "その他の SCM プロバイダーをインストール...", "source control": "ソース管理", "toggleSCMViewlet": "SCM を表示", "view": "表示" diff --git a/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json b/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json index d53de2c62b0..d93c7d2fb84 100644 --- a/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "installAdditionalSCMProviders": "その他の SCM プロバイダーをインストール...", "switch provider": "SCM プロバイダーの切り替え..." } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json index c0432625724..f7db07a2e2d 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}, tasks" + "entryAriaLabel": "{0}, tasks", + "workspace": "ワークスペースから", + "extension": "拡張機能から" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json index 37bbf2ce2e0..1e77cbdffdf 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json @@ -5,6 +5,6 @@ // Do not edit this file. It is machine generated. { "tasksAriaLabel": "再開するタスクの名前を入力します", - "noTasksMatching": "No tasks matching", + "noTasksMatching": "一致するタスクがありません", "noTasksFound": "再開するタスクはありません" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json index 99543dd018a..5a397f34e03 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json @@ -5,6 +5,6 @@ // Do not edit this file. It is machine generated. { "tasksAriaLabel": "実行するタスクの名前を入力します", - "noTasksMatching": "No tasks matching", + "noTasksMatching": "一致するタスクがありません", "noTasksFound": "タスクが見つかりません" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 12b9c699bf2..440b92fd91d 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -6,5 +6,6 @@ { "TerminalTaskSystem.unknownError": "タスクの実行中に不明なエラーが発生しました。詳細については、タスク出力ログを参照してください。", "TerminalTaskSystem.terminalName": "タスク - {0}", - "TerminalTaskSystem": "UNC ドライブでシェル コマンドを実行できません。" + "TerminalTaskSystem": "UNC ドライブでシェル コマンドを実行できません。", + "unkownProblemMatcher": "問題マッチャー {0} は解決できませんでした。マッチャーは無視されます" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json index 6f9be6076a6..0cc1f921982 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json @@ -7,5 +7,6 @@ "TaskRunnerSystem.unknownError": "タスクの実行中に不明なエラーが発生しました。詳細については、タスク出力ログを参照してください。", "TaskRunnerSystem.watchingBuildTaskFinished": "\nビルド タスクのウォッチが終了しました。", "TaskRunnerSystem.childProcessError": "Failed to launch external program {0} {1}.", - "TaskRunnerSystem.cancelRequested": "\nユーザー要求ごとにタスク '{0}' が終了しました。" + "TaskRunnerSystem.cancelRequested": "\nユーザー要求ごとにタスク '{0}' が終了しました。", + "unkownProblemMatcher": "問題マッチャー {0} は解決できませんでした。マッチャーは無視されます" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 799b12a797b..e7930c9cd7a 100644 --- a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -26,5 +26,7 @@ "workbench.action.terminal.scrollUp": "上にスクロール (行)", "workbench.action.terminal.scrollUpPage": "スクロール アップ (ページ)", "workbench.action.terminal.scrollToTop": "一番上にスクロール", - "workbench.action.terminal.clear": "クリア" + "workbench.action.terminal.clear": "クリア", + "workbench.action.terminal.allowWorkspaceShell": "ワークスペースでシェルを構成することを許可する", + "workbench.action.terminal.disallowWorkspaceShell": "ワークスペースでシェルを構成することを許可しない" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 89ac9d8c928..7592dde26b5 100644 --- a/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,6 +6,7 @@ { "selectTheme.label": "配色テーマ", "installColorThemes": "その他の配色テーマをインストール...", + "themes.selectTheme": "配色テーマの選択 (上/下キーでプレビュー可能)", "selectIconTheme.label": "ファイル アイコンのテーマ", "installIconThemes": "その他のファイル アイコンのテーマをインストール...", "noIconThemeLabel": "なし", diff --git a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 587eecb5f9d..950f340d9ae 100644 --- a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -11,18 +11,25 @@ "welcomePage.openFolder": "フォルダーを開く...", "welcomePage.cloneGitRepository": "Git リポジトリを複製...", "welcomePage.recent": "最近", + "welcomePage.moreRecent": "その他", "welcomePage.noRecentFolders": "最近使用したフォルダーなし", "welcomePage.help": "ヘルプ", + "welcomePage.keybindingsCheatsheet": "印刷可能なキーボードのチートシート", "welcomePage.introductoryVideos": "紹介ビデオ", "welcomePage.productDocumentation": "製品ドキュメント", "welcomePage.gitHubRepository": "GitHub リポジトリ", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "起動時にウェルカム ページを表示", "welcomePage.customize": "カスタマイズする", + "welcomePage.installExtensionPacks": "ツールと言語", + "welcomePage.installExtensionPacksDescription": "{0} と {1} のサポートをインストールする ", + "welcomePage.moreExtensions": "その他", "welcomePage.installKeymapDescription": "キーボード ショートカットをインストールします", + "welcomePage.installKeymapExtension": "{0} と {1} のキーボード ショートカットをインストール", "welcomePage.others": "その他", "welcomePage.colorTheme": "配色テーマ", "welcomePage.colorThemeDescription": "エディターとコードの外観を自由に設定します", + "welcomePage.learn": "学ぶ", "welcomePage.showCommands": "すべてのコマンドの検索と実行", "welcomePage.showCommandsDescription": "コントロール パネルからコマンドを検索してすばやくアクセスします ({0})", "welcomePage.interfaceOverview": "インターフェイスの概要", diff --git a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index 07b2eb85861..eba406025bb 100644 --- a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,11 +5,27 @@ // Do not edit this file. It is machine generated. { "welcomePage": "ようこそ", + "welcomePage.javaScript": "JavaScript", + "welcomePage.typeScript": "TypeScript", + "welcomePage.python": "Python", + "welcomePage.php": "PHP", + "welcomePage.docker": "Docker", + "welcomePage.vim": "Vim", + "welcomePage.sublime": "Sublime", + "welcomePage.atom": "Atom", + "welcomePage.extensionPackAlreadyInstalled": "{0} のサポートは既にインストールされています。", + "welcomePage.willReloadAfterInstallingExtensionPack": "{0} のサポートをインストールした後、ウィンドウが再度読み込まれます。", + "welcomePage.installingExtensionPack": "{0} のサポートをインストール...", + "welcomePage.extensionPackNotFound": "ID {1} のサポート {0} は見つかりませんでした。", "welcomePage.keymapAlreadyInstalled": "キーボード ショートカット {0} は既にインストールされています。", "welcomePage.willReloadAfterInstallingKeymap": "キーボード ショートカット {0} をインストールした後、ウィンドウが再度読み込まれます。", "welcomePage.installingKeymap": "{0} のキーボード ショートカットをインストールしています...", "welcomePage.keymapNotFound": "ID {1} のキーボード ショートカット {0} は見つかりませんでした。", "welcome.title": "ようこそ", + "welcomePage.extensionListSeparator": ",", + "welcomePage.installedExtension": "{0} (インストール済み) ", "ok": "OK", - "cancel": "キャンセル" + "cancel": "キャンセル", + "welcomePage.quickLinkBackground": "ウェルカム ページのクイック リンクの背景色。", + "welcomePage.quickLinkHoverBackground": "ウェルカム ページのクイック リンクのホバー背景色。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 0c7056bc9fc..81d7a645e32 100644 --- a/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -6,6 +6,7 @@ { "open": "設定を開く", "close": "閉じる", + "saveAndRetry": "設定を保存して再試行", "errorUnknownKey": "構成ファイルに書き込めません (不明なキー)", "errorInvalidTarget": "構成ファイルに書き込めません (無効なターゲット)", "errorNoWorkspaceOpened": "開いているフォルダーがないため、設定を書き込めません。最初にフォルダーを開いてから、もう一度お試しください。", diff --git a/i18n/kor/extensions/markdown/out/extension.i18n.json b/i18n/kor/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/kor/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/kor/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/kor/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/extensions/merge-conflict/package.i18n.json b/i18n/kor/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/extensions/npm/package.i18n.json b/i18n/kor/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/kor/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index def2cd28d67..4266985efc9 100644 --- a/i18n/kor/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/kor/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,8 +6,6 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "이미지가 너무 커서 편집기에 표시할 수 없습니다. ", - "resourceOpenExternalButton": "이미지 열기", - "resourceOpenExternalText": " 외부 프로그램을 사용할까요?", "nativeBinaryError": "파일이 이진이거나 매우 크거나 지원되지 않는 텍스트 인코딩을 사용하기 때문에 편집기에서 표시되지 않습니다.", "sizeB": "{0}B", "sizeKB": "{0}KB", diff --git a/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json index 18538323353..18aff6704be 100644 --- a/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -40,7 +40,6 @@ "formatOnType": "입력 후 편집기에서 자동으로 줄의 서식을 지정할지 여부를 제어합니다.", "formatOnPaste": "붙여넣은 콘텐츠의 서식을 편집기에서 자동으로 지정할지 여부를 제어합니다. 포맷터는 반드시 사용할 수 있어야 하며 문서에서 범위의 서식을 지정할 수 있어야 합니다.", "suggestOnTriggerCharacters": "트리거 문자를 입력할 때 제안을 자동으로 표시할지 여부를 제어합니다.", - "acceptSuggestionOnEnter": "'Tab' 키 외에 'Enter' 키에 대한 제안도 허용할지를 제어합니다. 새 줄을 삽입하는 동작과 제안을 허용하는 동작 간의 모호함을 없앨 수 있습니다.", "acceptSuggestionOnCommitCharacter": "커밋 문자에 대한 제안을 허용할지를 제어합니다. 예를 들어 JavaScript에서는 세미콜론(';')이 제안을 허용하고 해당 문자를 입력하는 커밋 문자일 수 있습니다.", "snippetSuggestions": "코드 조각이 다른 추천과 함께 표시되는지 여부 및 정렬 방법을 제어합니다.", "emptySelectionClipboard": "선택 영역 없이 현재 줄 복사 여부를 제어합니다.", diff --git a/i18n/kor/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/kor/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..eb7148607bd --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "'{0}'에 대한 정의를 찾을 수 없습니다.", + "generic.noResults": "정의를 찾을 수 없음", + "meta.title": "– {0} 정의", + "actions.goToDecl.label": "정의로 이동", + "actions.goToDeclToSide.label": "측면에서 정의 열기", + "actions.previewDecl.label": "정의 피킹(Peeking)", + "goToImplementation.noResultWord": "'{0}'에 대한 구현을 찾을 수 없습니다.", + "goToImplementation.generic.noResults": "구현을 찾을 수 없습니다.", + "meta.implementations.title": " – {0} 개 구현", + "actions.goToImplementation.label": "구현으로 이동", + "actions.peekImplementation.label": "구현 미리 보기", + "goToTypeDefinition.noResultWord": "'{0}'에 대한 형식 정의를 찾을 수 없습니다.", + "goToTypeDefinition.generic.noResults": "형식 정의를 찾을 수 없습니다.", + "meta.typeDefinitions.title": "– {0} 형식 정의", + "actions.goToTypeDefinition.label": "형식 정의로 이동", + "actions.peekTypeDefinition.label": "형식 정의 미리 보기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/kor/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..57b4929798f --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "{0}개 정의를 표시하려면 클릭하세요." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json index 603999dbae9..4c30f4bc75c 100644 --- a/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,6 +7,7 @@ "view": "보기", "help": "도움말", "file": "파일", + "developer": "개발자", "showEditorTabs": "열려 있는 편집기를 탭에서 표시할지 여부를 제어합니다.", "editorTabCloseButton": "편집기의 탭 닫기 단추의 위치를 제어하거나 'off'로 설정된 경우 이 단추를 사용하지 않도록 설정합니다.", "showIcons": "열린 편집기를 아이콘과 함께 표시할지 여부를 제어합니다. 이를 위해서는 아이콘 테마도 사용하도록 설정해야 합니다.", diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 8b6ad71cd4e..86d18d9fce3 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "disableOtherKeymapsConfirmation": "키 바인딩 간 충돌을 피하기 위해 다른 키 맵을 사용하지 않도록 설정할까요?", + "yes": "예", + "no": "아니요" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index f9b799b1655..fe8ef9500ce 100644 --- a/i18n/kor/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,7 +16,6 @@ "associations": "파일과 언어의 연결을 구성하세요(예: \"*.extension\": \"html\"). 이러한 구성은 설치된 언어의 기본 연결보다 우선 순위가 높습니다.", "encoding": "파일을 읽고 쓸 때 사용할 기본 문자 집합 인코딩입니다.", "autoGuessEncoding": "사용하도록 설정하는 경우 파일을 열 때 문자 집합 인코딩을 추측합니다.", - "eol": "줄 바꿈 문자의 기본 끝입니다.", "trimTrailingWhitespace": "사용하도록 설정되면 파일을 저장할 때 후행 공백이 잘립니다.", "insertFinalNewline": "사용하도록 설정되면 저장할 때 파일 끝에 마지막 줄바꿈을 삽입합니다.", "files.autoSave.off": "더티 파일이 자동으로 저장되지 않습니다.", diff --git a/i18n/kor/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json index 4b931297269..ef1cdc9bc09 100644 --- a/i18n/kor/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -5,5 +5,9 @@ // Do not edit this file. It is machine generated. { "slow": "느린 시작 감지됨", - "slow.detail": "방금 느리게 시작되었습니다. 프로파일링을 사용하도록 설정한 상태로 '{0}'을(를) 다시 시작하세요. 프로필을 공유해 주시면 다시 빠르게 시작될 수 있도록 최선을 다하겠습니다." + "slow.detail": "방금 느리게 시작되었습니다. 프로파일링을 사용하도록 설정한 상태로 '{0}'을(를) 다시 시작하세요. 프로필을 공유해 주시면 다시 빠르게 시작될 수 있도록 최선을 다하겠습니다.", + "prof.message": "프로필을 만들었습니다.", + "prof.detail": "문제를 발생시키고 다음 파일을 수동으로 첨부하세요.\n{0}", + "prof.restartAndFileIssue": "문제 만들기 및 다시 시작", + "prof.restart": "다시 시작" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index cb5666d331a..a436e5a707b 100644 --- a/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,6 +5,11 @@ // Do not edit this file. It is machine generated. { "welcomePage": "시작", + "welcomePage.typeScript": "TypeScript", + "welcomePage.php": "PHP", + "welcomePage.vim": "Vim", + "welcomePage.sublime": "Sublime", + "welcomePage.atom": "Atom", "welcomePage.keymapAlreadyInstalled": "{0} 바로 가기 키가 이미 설치되어 있습니다.", "welcomePage.willReloadAfterInstallingKeymap": "{0} 바로 가기 키를 설치한 후 창이 다시 로드됩니다.", "welcomePage.installingKeymap": "{0} 바로 가기 키를 설치하는 중...", diff --git a/i18n/ptb/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json b/i18n/ptb/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json new file mode 100644 index 00000000000..74a80b4280d --- /dev/null +++ b/i18n/ptb/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "activeEditorShort": "e.g. meuArquivo.txt", + "activeEditorMedium": "e.g. minhaPasta/meuArquivo.txt", + "activeEditorLong": "e.g. /Usuarios/Desenvolvimento/meuProjeto/minhaPasta/meuArquivo.txt", + "rootName": "e.g. meuProjeto", + "rootPath": "e.g. /Usuarios/Desenvolvimento/meuProjeto", + "appName": "e.g. VS Code", + "dirty": "Um indicador de alteração se o editor ativo foi alterado", + "separator": "um separador condicional (' - ') que somente é mostrado quando envolvido por variáveis com valores", + "assocLabelFile": "Arquivos com Extensão", + "assocDescriptionFile": "Mapear todos arquivos que correspondem ao padrão global no seu nome de arquivo à linguagem com o identificador dado", + "assocLabelPath": "Arquivos com Caminho", + "assocDescriptionPath": "Mapear todos os arquivos que correspondem ao caminho absoluto global no seu caminho à linguagem com o identificador dado", + "fileLabel": "Arquivos por Extensão", + "fileDescription": "Combina todos os arquivos de uma extensão de arquivo específica.", + "filesLabel": "Arquivos com Várias Extensões", + "filesDescription": "Combina todos os arquivos com qualquer uma das extensões de arquivo.", + "derivedLabel": "Arquivos com Irmãos por Nome", + "derivedDescription": "Combina arquivos que têm irmãos com o mesmo nome, mas uma extensão diferente.", + "topFolderLabel": "Pasta por Nome (Nível Superior)", + "topFolderDescription": "Combina uma pasta de nível superior com um nome específico.", + "topFoldersLabel": "Pastas com Vários Nomes (Nível Superior)", + "topFoldersDescription": "Combina várias pastas de nível superior.", + "folderLabel": "Pasta por Nome (Qualquer Local)", + "folderDescription": "Combina uma pasta com um nome específico em qualquer local.", + "falseDescription": "Desabilita o padrão.", + "trueDescription": "Habilita o padrão.", + "siblingsDescription": "Combina arquivos que têm irmãos com o mesmo nome, mas uma extensão diferente.", + "languageSpecificEditorSettings": "Configurações do editor especificas para a linguagem", + "languageSpecificEditorSettingsDescription": "Sobrescrever as configurações do editor para a linguagem" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/css/client/out/cssMain.i18n.json b/i18n/ptb/extensions/css/client/out/cssMain.i18n.json new file mode 100644 index 00000000000..a649796227b --- /dev/null +++ b/i18n/ptb/extensions/css/client/out/cssMain.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "cssserver.name": "Servidor de linguagem CSS" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/css/package.i18n.json b/i18n/ptb/extensions/css/package.i18n.json new file mode 100644 index 00000000000..de011d44dce --- /dev/null +++ b/i18n/ptb/extensions/css/package.i18n.json @@ -0,0 +1,67 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "css.lint.argumentsInColorFunction.desc": "Número inválido de parâmetros", + "css.lint.boxModel.desc": "Não use largura ou altura ao usar preenchimento ou borda", + "css.lint.compatibleVendorPrefixes.desc": "Ao usar um prefixo específico de fornecedor, certifique-se de também incluir todas as outras propriedades específicas do fornecedor", + "css.lint.duplicateProperties.desc": "Não use as definições de estilo duplicadas", + "css.lint.emptyRules.desc": "Não use conjuntos de regra em branco", + "css.lint.float.desc": "Evite usar 'float'. Floats levam a CSS frágil, que é fácil de quebrar se um aspecto do layout for alterado.", + "css.lint.fontFaceProperties.desc": "A regra @font-face deve definir propriedades 'src' e 'font-family'", + "css.lint.hexColorLength.desc": "Cores hexadecimais devem consistir em três ou seis números hexadecimais", + "css.lint.idSelector.desc": "Seletores não devem conter IDs, pois essas regras estão firmemente acopladas ao HTML.", + "css.lint.ieHack.desc": "IE hacks somente são necessários ao dar suporte ao IE7 e mais antigos", + "css.lint.important.desc": "Evite usar !important. Esta é uma indicação de que a especificidade do CSS inteiro saiu de controle e precisa ser fatorada novamente.", + "css.lint.importStatement.desc": "Instruções de importação não carregam em paralelo", + "css.lint.propertyIgnoredDueToDisplay.desc": "Propriedade ignorada devido à exibição. Por exemplo, com 'display: inline', as propriedades width, height, margin-top, margin-bottom e float não têm efeito", + "css.lint.universalSelector.desc": "O seletor universal (*) é conhecido por ser lento", + "css.lint.unknownProperties.desc": "Propriedade desconhecida.", + "css.lint.unknownVendorSpecificProperties.desc": "Propriedade específica do fornecedor desconhecida.", + "css.lint.vendorPrefix.desc": "Ao usar um prefixo específico do fornecedor, inclua também a propriedade padrão", + "css.lint.zeroUnits.desc": "Nenhuma unidade para zero é necessária", + "css.validate.desc": "Habilita ou desabilita todas as validações", + "less.lint.argumentsInColorFunction.desc": "Número inválido de parâmetros", + "less.lint.boxModel.desc": "Não use largura ou altura ao usar preenchimento ou borda", + "less.lint.compatibleVendorPrefixes.desc": "Ao usar um prefixo específico de fornecedor, certifique-se de também incluir todas as outras propriedades específicas do fornecedor", + "less.lint.duplicateProperties.desc": "Não use as definições de estilo duplicadas", + "less.lint.emptyRules.desc": "Não use conjuntos de regra em branco", + "less.lint.float.desc": "Evite usar 'float'. Floats levam a CSS frágil, que é fácil de quebrar se um aspecto do layout for alterado.", + "less.lint.fontFaceProperties.desc": "A regra @font-face deve definir propriedades 'src' e 'font-family'", + "less.lint.hexColorLength.desc": "Cores hexadecimais devem consistir em três ou seis números hexadecimais", + "less.lint.idSelector.desc": "Seletores não devem conter IDs, pois essas regras estão firmemente acopladas ao HTML.", + "less.lint.ieHack.desc": "IE hacks somente são necessários ao dar suporte ao IE7 e mais antigos", + "less.lint.important.desc": "Evite usar !important. Esta é uma indicação de que a especificidade do CSS inteiro saiu de controle e precisa ser fatorada novamente.", + "less.lint.importStatement.desc": "Instruções de importação não carregam em paralelo", + "less.lint.propertyIgnoredDueToDisplay.desc": "Propriedade ignorada devido à exibição. Por exemplo, com 'display: inline', as propriedades width, height, margin-top, margin-bottom e float não têm efeito", + "less.lint.universalSelector.desc": "O seletor universal (*) é conhecido por ser lento", + "less.lint.unknownProperties.desc": "Propriedade desconhecida.", + "less.lint.unknownVendorSpecificProperties.desc": "Propriedade específica do fornecedor desconhecida.", + "less.lint.vendorPrefix.desc": "Ao usar um prefixo específico do fornecedor, inclua também a propriedade padrão", + "less.lint.zeroUnits.desc": "Nenhuma unidade para zero é necessária", + "less.validate.desc": "Habilita ou desabilita todas as validações", + "scss.lint.argumentsInColorFunction.desc": "Número inválido de parâmetros", + "scss.lint.boxModel.desc": "Não use largura ou altura ao usar preenchimento ou borda", + "scss.lint.compatibleVendorPrefixes.desc": "Ao usar um prefixo específico de fornecedor, certifique-se de também incluir todas as outras propriedades específicas do fornecedor", + "scss.lint.duplicateProperties.desc": "Não use as definições de estilo duplicadas", + "scss.lint.emptyRules.desc": "Não use conjuntos de regra em branco", + "scss.lint.float.desc": "Evite usar 'float'. Floats levam a CSS frágil, que é fácil de quebrar se um aspecto do layout for alterado.", + "scss.lint.fontFaceProperties.desc": "A regra @font-face deve definir propriedades 'src' e 'font-family'", + "scss.lint.hexColorLength.desc": "Cores hexadecimais devem consistir em três ou seis números hexadecimais", + "scss.lint.idSelector.desc": "Seletores não devem conter IDs, pois essas regras estão firmemente acopladas ao HTML.", + "scss.lint.ieHack.desc": "IE hacks somente são necessários ao dar suporte ao IE7 e mais antigos", + "scss.lint.important.desc": "Evite usar !important. Esta é uma indicação de que a especificidade do CSS inteiro saiu de controle e precisa ser fatorada novamente.", + "scss.lint.importStatement.desc": "Instruções de importação não carregam em paralelo", + "scss.lint.propertyIgnoredDueToDisplay.desc": "Propriedade ignorada devido à exibição. Por exemplo, com 'display: inline', as propriedades width, height, margin-top, margin-bottom e float não têm efeito", + "scss.lint.universalSelector.desc": "O seletor universal (*) é conhecido por ser lento", + "scss.lint.unknownProperties.desc": "Propriedade desconhecida.", + "scss.lint.unknownVendorSpecificProperties.desc": "Propriedade específica do fornecedor desconhecida.", + "scss.lint.vendorPrefix.desc": "Ao usar um prefixo específico do fornecedor, inclua também a propriedade padrão", + "scss.lint.zeroUnits.desc": "Nenhuma unidade para zero é necessária", + "scss.validate.desc": "Habilita ou desabilita todas as validações", + "less.colorDecorators.enable.desc": "Habilita ou desabilita decoradores de cores", + "scss.colorDecorators.enable.desc": "Habilita ou desabilita decoradores de cores", + "css.colorDecorators.enable.desc": "Habilita ou desabilita decoradores de cores" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/extension-editing/out/packageDocumentHelper.i18n.json b/i18n/ptb/extensions/extension-editing/out/packageDocumentHelper.i18n.json new file mode 100644 index 00000000000..8505afd6d4a --- /dev/null +++ b/i18n/ptb/extensions/extension-editing/out/packageDocumentHelper.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "languageSpecificEditorSettings": "Configurações do editor especificas para a linguagem", + "languageSpecificEditorSettingsDescription": "Sobrescrever as configurações do editor para a linguagem" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/git/out/askpass-main.i18n.json b/i18n/ptb/extensions/git/out/askpass-main.i18n.json new file mode 100644 index 00000000000..280b14bd0d7 --- /dev/null +++ b/i18n/ptb/extensions/git/out/askpass-main.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "missOrInvalid": "Credenciais ausentes ou inválidas." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/git/out/commands.i18n.json b/i18n/ptb/extensions/git/out/commands.i18n.json new file mode 100644 index 00000000000..ab5667e260b --- /dev/null +++ b/i18n/ptb/extensions/git/out/commands.i18n.json @@ -0,0 +1,43 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "tag at": "Etiqueta em {0}", + "remote branch at": "Ramo remoto em {0}", + "repourl": "URL do repositório", + "parent": "Diretório pai", + "cloning": "Clonando repositório do Git...", + "openrepo": "Abrir Repositório", + "proposeopen": "Gostaria de abrir o repositório clonado?", + "confirm revert": "Tem certeza que deseja reverter as alterações selecionadas em {0}?", + "revert": "Reverter as alterações", + "confirm discard": "Tem certeza que deseja descartar as alterações em {0}?", + "confirm discard multiple": "Tem certeza que deseja descartar as alterações em {0} arquivos?", + "discard": "Descartar alterações", + "confirm discard all": "Tem certeza que deseja descartar TODAS as alterações? Isso é IRREVERSÍVEL!", + "discardAll": "Descartar TODAS as alterações", + "no staged changes": "Não há nenhuma modificação escalonada para confirmar.\n\nGostaria de escalonar automaticamente todas as suas alterações e confirmá-las diretamente?", + "yes": "Sim", + "always": "Sempre", + "no changes": "Não há mudanças para confirmar.", + "commit message": "Confirmar mensagem", + "provide commit message": "Por favor, forneça uma mensagem de commit", + "branch name": "Nome do Ramo", + "provide branch name": "Por favor, forneça um nome de ramo", + "no remotes to pull": "O seu repositório não possui remotos configurados para efetuar pull.", + "no remotes to push": "O seu repositório não possui remotos configurados para efetuar push.", + "nobranch": "Por favor, faça checkout em um ramo para fazer push em um remoto.", + "pick remote": "Pegue um remoto para publicar o ramo '{0}':", + "sync is unpredictable": "Esta ação vai fazer push e pull nos commits de e para '{0}'.", + "ok": "OK", + "never again": "Ok, Nunca Mostrar Novamente", + "no remotes to publish": "Seu repositório não possui remotos configurados para publicação.", + "disabled": "Git está desativado ou não é suportado neste espaço de trabalho", + "clean repo": "Por favor, limpe sua árvore de trabalho do repositório antes de fazer check-out.", + "cant push": "Não pode empurrar referências para remoto. Execute 'Pull' primeiro para integrar suas alterações.", + "git error details": "Git: {0}", + "git error": "Erro de Git", + "open git log": "Abrir Histórico do Git" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/git/out/main.i18n.json b/i18n/ptb/extensions/git/out/main.i18n.json new file mode 100644 index 00000000000..ae1dee26032 --- /dev/null +++ b/i18n/ptb/extensions/git/out/main.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "using git": "Usando git {0} de {1}", + "updateGit": "Atualizar o Git", + "neverShowAgain": "Não mostrar novamente", + "git20": "Você parece ter o git {0} instalado. Code funciona melhor com git > = 2" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/git/out/model.i18n.json b/i18n/ptb/extensions/git/out/model.i18n.json new file mode 100644 index 00000000000..717d2b4364a --- /dev/null +++ b/i18n/ptb/extensions/git/out/model.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "open": "Abrir", + "merge changes": "Mesclar Alterações", + "staged changes": "Alterações em Etapas", + "changes": "Alterações", + "ok": "OK", + "neveragain": "Nunca Mostrar Novamente", + "huge": "O repositório git em '{0}' tem muitas atualizações ativas, somente um subconjunto de funcionalidades do Git será habilitado." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/git/out/scmProvider.i18n.json b/i18n/ptb/extensions/git/out/scmProvider.i18n.json new file mode 100644 index 00000000000..490dda3603e --- /dev/null +++ b/i18n/ptb/extensions/git/out/scmProvider.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "commit": "Confirmar" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/git/out/statusbar.i18n.json b/i18n/ptb/extensions/git/out/statusbar.i18n.json new file mode 100644 index 00000000000..0b6ee800ffa --- /dev/null +++ b/i18n/ptb/extensions/git/out/statusbar.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "checkout": "Checkout...", + "sync changes": "Sincronizar alterações", + "publish changes": "Publicar alterações", + "syncing changes": "Sincronizando alterações..." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/git/package.i18n.json b/i18n/ptb/extensions/git/package.i18n.json new file mode 100644 index 00000000000..0c79f1929bb --- /dev/null +++ b/i18n/ptb/extensions/git/package.i18n.json @@ -0,0 +1,48 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "command.clone": "Clonar", + "command.init": "Inicializar Repositório", + "command.refresh": "Atualizar", + "command.openChange": "Abrir alterações", + "command.openFile": "Abrir Arquivo", + "command.stage": "Estagiar Alterações", + "command.stageAll": "Estagiar Todas Alterações", + "command.stageSelectedRanges": "Estagiar Faixas Selecionadas", + "command.revertSelectedRanges": "Reverter Faixas Selecionadas", + "command.unstage": "Desestagiar Alterações", + "command.unstageAll": "Desestagiar Todas Alterações", + "command.unstageSelectedRanges": "Desestagiar Faixas Selecionadas", + "command.clean": "Descartar Alterações", + "command.cleanAll": "Descartar Todas as Alterações", + "command.commit": "Confirmar", + "command.commitStaged": "Confirmar os preparados", + "command.commitStagedSigned": "Confirmar Estagiados (Desconectado)", + "command.commitAll": "Confirmar tudo", + "command.commitAllSigned": "Confirmar Tudo (Desconectado)", + "command.undoCommit": "Desfazer Ultima Confirmação", + "command.checkout": "Fazer checkout para...", + "command.branch": "Criar Ramificação...", + "command.pull": "Efetuar pull", + "command.pullRebase": "Efetuar pull (Rebase)", + "command.push": "Enviar por push", + "command.pushTo": "Enviar por push para...", + "command.sync": "Sincronizar", + "command.publish": "Publicar", + "command.showOutput": "Mostrar Saída do Git", + "config.enabled": "Se o git estiver habilitado", + "config.path": "Caminho para o executável do git", + "config.autorefresh": "Se a atualização automática estiver habilitada", + "config.autofetch": "Se a recuperação automática estiver habilitada", + "config.enableLongCommitWarning": "Se mensagens longas de confirmação devem ter aviso", + "config.confirmSync": "Confirmar antes de sincronizar repositórios git", + "config.countBadge": "Controla o contador de distintivos do git. 'todos' considera todas as alterações. 'rastreado' considera apenas as alterações controladas. 'desligado' desliga o contador.", + "config.checkoutType": "Controla quais tipos de ramos são listados quando executando `Checkout para... `. `todos` mostra todas as referências, `local` mostra apenas os ramos locais, `etiqueta` mostra apenas etiquetas e `remoto` mostra apenas os ramos remotos.", + "config.ignoreLegacyWarning": "Ignora o aviso de Git legado", + "config.ignoreLimitWarning": "Ignora o aviso quando houver muitas alterações em um repositório", + "config.defaultCloneDirectory": "O local padrão onde clonar um repositório git", + "config.enableSmartCommit": "Confirme todas as alterações quando não há modificações escalonadas." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/grunt/out/main.i18n.json b/i18n/ptb/extensions/grunt/out/main.i18n.json new file mode 100644 index 00000000000..909b68937c6 --- /dev/null +++ b/i18n/ptb/extensions/grunt/out/main.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "execFailed": "Auto detecção de Grunt falhou com erro: {0}" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/grunt/package.i18n.json b/i18n/ptb/extensions/grunt/package.i18n.json new file mode 100644 index 00000000000..d79ce76907e --- /dev/null +++ b/i18n/ptb/extensions/grunt/package.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "config.grunt.autoDetect": "Controla se a deteção automática de tarefas do Grunt está ligado ou desligado. Padrão é ligado." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/gulp/out/main.i18n.json b/i18n/ptb/extensions/gulp/out/main.i18n.json new file mode 100644 index 00000000000..51b05e4013e --- /dev/null +++ b/i18n/ptb/extensions/gulp/out/main.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "execFailed": "Auto detecção de gulp falhou com erro: {0}" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/gulp/package.i18n.json b/i18n/ptb/extensions/gulp/package.i18n.json new file mode 100644 index 00000000000..fae292414c2 --- /dev/null +++ b/i18n/ptb/extensions/gulp/package.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "config.gulp.autoDetect": "Controla se a detecção automática de tarefas Gulp está ativada ou desativada. Por padrão, é ativado." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/html/client/out/htmlMain.i18n.json b/i18n/ptb/extensions/html/client/out/htmlMain.i18n.json new file mode 100644 index 00000000000..314d1e5c58a --- /dev/null +++ b/i18n/ptb/extensions/html/client/out/htmlMain.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "htmlserver.name": "Servidor de Linguagem HTML" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/html/package.i18n.json b/i18n/ptb/extensions/html/package.i18n.json new file mode 100644 index 00000000000..2f255a02e7f --- /dev/null +++ b/i18n/ptb/extensions/html/package.i18n.json @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "html.format.enable.desc": "Ativa/desativa o formatador HTML padrão (requer reinicialização)", + "html.format.wrapLineLength.desc": "Quantidade máxima de caracteres por linha (0 = desativar).", + "html.format.unformatted.desc": "Lista de tags, separados por vírgula, que não deveria ser reformatada. o padrão é 'nulo' para todas as tags listadas em https://www.w3.org/TR/html5/dom.html#phrasing-content.", + "html.format.contentUnformatted.desc": "Lista de tags, separada por vírgula, onde o conteúdo não deve ser reformatado. o padrão é 'nulo' para a tag 'pré'.", + "html.format.indentInnerHtml.desc": "Indentar secões e .", + "html.format.preserveNewLines.desc": "Se quebras de linha existentes antes de elementos deveriam ser preservadas. Só funciona antes de elementos, não dentro de rótulos ou para texto.", + "html.format.maxPreserveNewLines.desc": "Número máximo de quebras de linha a serem preservadas em um bloco. Use 'null' para ilimitado.", + "html.format.indentHandlebars.desc": "Formatar e indentar {{#foo}} e {{/ foo}}.", + "html.format.endWithNewline.desc": "Finalizar com uma nova linha.", + "html.format.extraLiners.desc": "Lista de rótulos, separados por vírgulas, que deveriam ter uma quebra de linha extra antes deles. 'null' admite o padrão \"head, body, /html\".", + "html.format.wrapAttributes.desc": "Agrupar atributos.", + "html.format.wrapAttributes.auto": "Agrupar atributos somente quando o tamanho da linha é excedido.", + "html.format.wrapAttributes.force": "Agrupar cada atributo exceto o primeiro.", + "html.format.wrapAttributes.forcealign": "Agrupar cada atributo, exceto o primeiro e manter alinhado.", + "html.format.wrapAttributes.forcemultiline": "Agrupar cada atributo.", + "html.suggest.angular1.desc": "Configura se o suporte da linguagem HTML interna sugere rótulos e propriedades do Angular V1.", + "html.suggest.ionic.desc": "Configura se o suporte da linguagem HTML interna sugere rótulos, propriedades e valores Ionic.", + "html.suggest.html5.desc": "Configura se o suporte da linguagem HTML interna sugere rótulos, propriedades e valores HTML5.", + "html.validate.scripts": "Configura se o suporte da linguagem HTML interna valida scripts embutidos.", + "html.validate.styles": "Configura se o suporte da linguagem HTML interna valida estilos embutidos." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/jake/out/main.i18n.json b/i18n/ptb/extensions/jake/out/main.i18n.json new file mode 100644 index 00000000000..4cfc54e5fef --- /dev/null +++ b/i18n/ptb/extensions/jake/out/main.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "execFailed": "Auto detecção de Jake falhou com erro: {0}" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/jake/package.i18n.json b/i18n/ptb/extensions/jake/package.i18n.json new file mode 100644 index 00000000000..94c08817c8d --- /dev/null +++ b/i18n/ptb/extensions/jake/package.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "config.jake.autoDetect": "Controla se a detecção automática de tarefas Jake está ativada ou desativada. Por padrão, é ativado." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/javascript/out/features/bowerJSONContribution.i18n.json b/i18n/ptb/extensions/javascript/out/features/bowerJSONContribution.i18n.json new file mode 100644 index 00000000000..84b277202e8 --- /dev/null +++ b/i18n/ptb/extensions/javascript/out/features/bowerJSONContribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "json.bower.default": "Bower.json padrão", + "json.bower.error.repoaccess": "Falha na solicitação ao repositório bower: {0}", + "json.bower.latest.version": "último" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/javascript/out/features/packageJSONContribution.i18n.json b/i18n/ptb/extensions/javascript/out/features/packageJSONContribution.i18n.json new file mode 100644 index 00000000000..9917fa36b2e --- /dev/null +++ b/i18n/ptb/extensions/javascript/out/features/packageJSONContribution.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "json.package.default": "Package.json padrão", + "json.npm.error.repoaccess": "Falha na solicitação ao repositório NPM: {0}", + "json.npm.latestversion": "A versão do pacote mais recente no momento", + "json.npm.majorversion": "Combina com a versão principal mais recente (1.x.x)", + "json.npm.minorversion": "Combina a versão secundária mais recente (1.2.x)", + "json.npm.version.hover": "Última versão: {0}" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/json/client/out/jsonMain.i18n.json b/i18n/ptb/extensions/json/client/out/jsonMain.i18n.json new file mode 100644 index 00000000000..4391c95a2ba --- /dev/null +++ b/i18n/ptb/extensions/json/client/out/jsonMain.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "jsonserver.name": "Servidor de linguagem JSON" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/json/package.i18n.json b/i18n/ptb/extensions/json/package.i18n.json new file mode 100644 index 00000000000..9d812f5b253 --- /dev/null +++ b/i18n/ptb/extensions/json/package.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "json.schemas.desc": "Esquemas associadas a arquivos de JSON no projeto atual", + "json.schemas.url.desc": "Um URL para um esquema ou um caminho relativo a um esquema no diretório atual", + "json.schemas.fileMatch.desc": "Uma matriz de padrões de arquivos para correspondência ao resolver arquivos JSON para esquemas.", + "json.schemas.fileMatch.item.desc": "Um padrão de arquivos que pode conter '*' para fazer a correspondência ao resolver arquivos JSON para esquemas.", + "json.schemas.schema.desc": "A definição de esquema para o URL dado. O esquema precisa ser fornecido apenas para evitar acessos ao URL do esquema.", + "json.format.enable.desc": "Habilitar/desabilitar o formatador JSON padrão (requer reinicialização)", + "json.tracing.desc": "Loga a comunicação entre o VS Code e o servidor de linguagem JSON.", + "json.colorDecorators.enable.desc": "Habilita ou desabilita os decoradores de cor" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/markdown/out/extension.i18n.json b/i18n/ptb/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ptb/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ptb/extensions/markdown/out/previewContentProvider.i18n.json b/i18n/ptb/extensions/markdown/out/previewContentProvider.i18n.json new file mode 100644 index 00000000000..f4e956aa5eb --- /dev/null +++ b/i18n/ptb/extensions/markdown/out/previewContentProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "preview.securityMessage.text": "Scripts foram desabilitados neste documento", + "preview.securityMessage.title": "Scripts são desabilitados na pré-visualização de markdown. Altere a configuração de segurança de pré-visualização do Markdown para habilitar scripts", + "preview.securityMessage.label": "Aviso de segurança de scripts desabilitados" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/markdown/out/security.i18n.json b/i18n/ptb/extensions/markdown/out/security.i18n.json new file mode 100644 index 00000000000..6b83ed6faed --- /dev/null +++ b/i18n/ptb/extensions/markdown/out/security.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "preview.showPreviewSecuritySelector.disallowScriptsForWorkspaceTitle": "Desabilitar a execução de scripts em pré-visualização de markdown para este espaço de trabalho", + "preview.showPreviewSecuritySelector.currentSelection": "Configuração atual", + "preview.showPreviewSecuritySelector.allowScriptsForWorkspaceTitle": "Habilitar a execução de scripts em pré-visualizações de markdown para este espaço de trabalho", + "preview.showPreviewSecuritySelector.title": "Alterar configurações de segurança para a pré-visualização do Markdown" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/markdown/package.i18n.json b/i18n/ptb/extensions/markdown/package.i18n.json new file mode 100644 index 00000000000..83c2f99b160 --- /dev/null +++ b/i18n/ptb/extensions/markdown/package.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "markdown.preview.doubleClickToSwitchToEditor.desc": "Duplo clique na pré-visualização markdown para alternar para o editor.", + "markdown.preview.fontFamily.desc": "Controla a família de fonte usada na pré-visualização de markdown.", + "markdown.preview.fontSize.desc": "Controla o tamanho da fonte em pixels usado na pré-visualização de markdown.", + "markdown.preview.lineHeight.desc": "Controla a altura de linha usada na pré-visualização de markdown. Este número é relativo ao tamanho de fonte.", + "markdown.preview.markEditorSelection.desc": "Marca a seleção atual do editor na pré-visualização de markdown.", + "markdown.preview.scrollEditorWithPreview.desc": "Quando a pré-visualização de markdown é rolada, atualiza a exibição do editor.", + "markdown.preview.scrollPreviewWithEditorSelection.desc": "Rola a pré-visualização do markdown para revelar a linha atualmente selecionada do editor.", + "markdown.preview.title": "Abrir a visualização", + "markdown.previewFrontMatter.dec": "Configura como o frontispicio YAML frente questão devem ser processado na pré-visualização de markdown. 'hide' remove o frontispicio. Caso contrário, o frontispicio é tratado como conteúdo de markdown.", + "markdown.previewSide.title": "Abre pré-visualização ao lado", + "markdown.showSource.title": "Exibir Código-Fonte", + "markdown.styles.dec": "Uma lista de URLs ou caminhos locais para folhas de estilo CSS para usar na pré-visualização do markdown. Caminhos relativos são interpretados em relação à pasta aberta no explorer. Se não houver nenhuma pasta aberta, eles são interpretados em relação ao local do arquivo markdown. Todos os ' \\' precisam ser escritos como ' \\ \\ '.", + "markdown.showPreviewSecuritySelector.title": "Alterar as configurações de segurança de pré-visualização do Markdown", + "markdown.preview.enableExperimentalExtensionApi.desc": "[Experimental] Permitir extensões para ampliar a pré-visualização do markdown.", + "markdown.trace.desc": "Habilitar log de depuração para a extensão do markdown." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/ptb/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ptb/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ptb/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/ptb/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ptb/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ptb/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/ptb/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ptb/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ptb/extensions/merge-conflict/package.i18n.json b/i18n/ptb/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ptb/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ptb/extensions/npm/package.i18n.json b/i18n/ptb/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ptb/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ptb/extensions/php/out/features/validationProvider.i18n.json b/i18n/ptb/extensions/php/out/features/validationProvider.i18n.json new file mode 100644 index 00000000000..9e0ce64f472 --- /dev/null +++ b/i18n/ptb/extensions/php/out/features/validationProvider.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "php.useExecutablePath": "Você permite {0} (definido como uma configuração do espaço de trabalho) a ser executado para lint de arquivos PHP?", + "php.yes": "Permitir", + "php.no": "Não permitir", + "wrongExecutable": "Não é possível validar {0} pois não é um executável php válido. Use a configuração 'php.validate.executablePath' para configurar o executável do PHP.", + "noExecutable": "Não é possível validar porque nenhum executável PHP está definido. Use a configuração 'php.validate.executablePath' para configurar o executável do PHP.", + "unknownReason": "Falha ao executar o php usando o caminho: {0}. O motivo é desconhecido." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/php/package.i18n.json b/i18n/ptb/extensions/php/package.i18n.json new file mode 100644 index 00000000000..7ec916f5dd8 --- /dev/null +++ b/i18n/ptb/extensions/php/package.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "configuration.suggest.basic": "Configura se as sugestões intrínsecas da linguagem PHP estão habilitadas. O suporte sugere globais e variáveis do PHP.", + "configuration.validate.enable": "Habilita/desabilita a validação interna do PHP.", + "configuration.validate.executablePath": "Aponta para o executável do PHP.", + "configuration.validate.run": "Se o linter é executado ao salvar ou ao digitar.", + "configuration.title": "PHP", + "commands.categroy.php": "PHP", + "command.untrustValidationExecutable": "Desabilita a validação de executável do PHP (definida como configuração do espaço de trabalho)" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/features/bufferSyncSupport.i18n.json b/i18n/ptb/extensions/typescript/out/features/bufferSyncSupport.i18n.json new file mode 100644 index 00000000000..1cef0c6e94a --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/features/bufferSyncSupport.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "versionMismatch": "Incompatibilidade de versão! global tsc ({0})! = serviço de linguagem do VS Code ({1}). Erros de compilação inconsistentes podem ocorrer", + "moreInformation": "Mais informações", + "doNotCheckAgain": "Não verificar novamente", + "close": "Fechar", + "updateTscCheck": "Atualizada configuração de usuário 'typescript.check.tscVersion' para false " +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/features/completionItemProvider.i18n.json b/i18n/ptb/extensions/typescript/out/features/completionItemProvider.i18n.json new file mode 100644 index 00000000000..58097d90545 --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/features/completionItemProvider.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "acquiringTypingsLabel": "Adquirindo digitações...", + "acquiringTypingsDetail": "Adquirindo definições de digitações para o Intellisense." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/ptb/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..99716f32145 --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ts-check": "Habilita verificação semântica em um arquivo JavaScript. Deve estar no topo de um arquivo.", + "ts-nocheck": "Desabilita verificação semântica em um arquivo JavaScript. Deve estar no topo de um arquivo.", + "ts-ignore": "Suprime erros de @ts-check na próxima linha de um arquivo." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/features/implementationsCodeLensProvider.i18n.json b/i18n/ptb/extensions/typescript/out/features/implementationsCodeLensProvider.i18n.json new file mode 100644 index 00000000000..ef8dd6423d6 --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/features/implementationsCodeLensProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "oneImplementationLabel": "1 implementação", + "manyImplementationLabel": "{0} implementações", + "implementationsErrorLabel": "Não foi possível determinar implementações" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/features/jsDocCompletionProvider.i18n.json b/i18n/ptb/extensions/typescript/out/features/jsDocCompletionProvider.i18n.json new file mode 100644 index 00000000000..20b08d7679b --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/features/jsDocCompletionProvider.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "typescript.jsDocCompletionItem.documentation": "Comentário JSDoc" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/features/referencesCodeLensProvider.i18n.json b/i18n/ptb/extensions/typescript/out/features/referencesCodeLensProvider.i18n.json new file mode 100644 index 00000000000..1838c3c1621 --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/features/referencesCodeLensProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "oneReferenceLabel": "1 referência", + "manyReferenceLabel": "{0} referências", + "referenceErrorLabel": "Não foi possível determinar as referências" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/typescriptMain.i18n.json b/i18n/ptb/extensions/typescript/out/typescriptMain.i18n.json new file mode 100644 index 00000000000..82e6c288fb1 --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/typescriptMain.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "typescript.projectConfigNoWorkspace": "Favor abrir uma pasta no VS Code para usar um projeto TypeScript ou JavaScript", + "typescript.projectConfigUnsupportedFile": "Não foi possível determinar o projeto TypeScript ou JavaScript. Tipo de arquivo não suportado", + "typescript.projectConfigCouldNotGetInfo": "Não foi possível determinar o projeto TypeScript ou JavaScript", + "typescript.noTypeScriptProjectConfig": "Arquivo não é parte de um projeto TypeScript", + "typescript.noJavaScriptProjectConfig": "Arquivo não é parte de um projeto JavaScript", + "typescript.configureTsconfigQuickPick": "Configurar tsconfig.json", + "typescript.configureJsconfigQuickPick": "Configurar jsconfig.json", + "typescript.projectConfigLearnMore": "Saber Mais" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/ptb/extensions/typescript/out/typescriptServiceClient.i18n.json new file mode 100644 index 00000000000..37527e507b0 --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noServerFound": "O caminho {0} não aponta para uma instalação de tsserver válida. Voltando para a versão do TypeScript empacotada.", + "noBundledServerFound": "O tsserver do VS Code foi excluído por outra aplicação, como por exemplo uma ferramenta de detecção de virus mal-comportada. Favor reinstalar o VS Code.", + "versionNumber.custom": "personalizado", + "serverCouldNotBeStarted": "Servidor de linguagem TypeScript não pôde ser iniciado. Mensagem de erro é: {0}", + "useVSCodeVersionOption": "Usar a Versão do VS Code", + "activeVersion": "Atualmente ativo", + "useWorkspaceVersionOption": "Use a versão de área de trabalho", + "learnMore": "Saiba Mais", + "selectTsVersion": "Selecione a versão do TypeScript usada para os recursos de linguagem JavaScript e TypeScript", + "typescript.openTsServerLog.notSupported": "Logging de TS Server requer TS TS 2.2.2+", + "typescript.openTsServerLog.loggingNotEnabled": "Logging de TS Server está desligado. Por favor configure 'typescript.tsserver.log' e reinicie o TS Server para habilitar o log", + "typescript.openTsServerLog.enableAndReloadOption": "Habilitar logging e reniciar TS server", + "typescript.openTsServerLog.noLogFile": "O TS Server não iniciou o logging.", + "openTsServerLog.openFileFailedFailed": "Não foi possível abrir o arquivo de log do TS Server", + "serverDiedAfterStart": "O serviço de linguagem TypeScript morreu 5 vezes depois que começou. O serviço não será reiniciado.", + "serverDiedReportIssue": "Reportar Problema", + "serverDied": "O serviço TypeScript morreu inesperadamente 5 vezes nos últimos 5 minutos." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/utils/logger.i18n.json b/i18n/ptb/extensions/typescript/out/utils/logger.i18n.json new file mode 100644 index 00000000000..bc738f43d0c --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/utils/logger.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/utils/projectStatus.i18n.json b/i18n/ptb/extensions/typescript/out/utils/projectStatus.i18n.json new file mode 100644 index 00000000000..5cb18373637 --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/utils/projectStatus.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hintExclude": "Para habilitar os recursos de linguagem JavaScript/TypeScipt em todo o projeto, excluir pastas com muitos arquivos, como: {0}", + "hintExclude.generic": "Para habilitar os recursos de linguagem JavaScript/TypeScipt em todo o projeto, excluir pastas grandes com arquivos em que você não trabalha.", + "open": "Configurar exclusões", + "large.label": "Configurar exclusões", + "hintExclude.tooltip": "Para habilitar os recursos de linguagem JavaScript/TypeScipt em todo o projeto, excluir pastas grandes com arquivos em que você não trabalha." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/utils/typingsStatus.i18n.json b/i18n/ptb/extensions/typescript/out/utils/typingsStatus.i18n.json new file mode 100644 index 00000000000..ce050eb3d8e --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/utils/typingsStatus.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "installingPackages": "Buscando dados para melhor IntelliSense do TypeScript", + "typesInstallerInitializationFailed.title": "Não foi possível instalar arquivos de digitação para recursos da linguagem JavaScript. Certifique-se que NPM está instalado e está em seu caminho", + "typesInstallerInitializationFailed.moreInformation": "Mais informações", + "typesInstallerInitializationFailed.doNotCheckAgain": "Não verificar novamente", + "typesInstallerInitializationFailed.close": "Fechar" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/package.i18n.json b/i18n/ptb/extensions/typescript/package.i18n.json new file mode 100644 index 00000000000..5e4125ec050 --- /dev/null +++ b/i18n/ptb/extensions/typescript/package.i18n.json @@ -0,0 +1,45 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "typescript.reloadProjects.title": "Recarregar Projeto", + "javascript.reloadProjects.title": "Recarregar Projeto", + "configuration.typescript": "TypeScript", + "typescript.useCodeSnippetsOnMethodSuggest.dec": "Funções completas com a assinatura do parâmetro.", + "typescript.tsdk.desc": "Especifica o caminho da pasta que contém os arquivos tsserver e lib*.d.ts para usar.", + "typescript.disableAutomaticTypeAcquisition": "Desabilita a aquisição automática de tipo. Requer TypeScript > = 2.0.6 e um reinício depois da alteração.", + "typescript.check.tscVersion": "Verifica se um ima instalação global do compilador TypeScript (por exemplo, tsc) difere do serviço de linguagem TypeScript usado.", + "typescript.tsserver.log": "Habilita o log do servidor TS para um arquivo. Este log pode ser usado para diagnosticar problemas do servidor de TS. O log pode conter caminhos de arquivo, código-fonte e outras informações potencialmente confidenciais do seu projeto.", + "typescript.tsserver.trace": "Habilita o rastreamento de mensagens enviadas para o servidor de TS. Este rastreamento pode ser usado para diagnosticar problemas do servidor de TS. O rastreamento pode conter caminhos de arquivo, código-fonte e outras informações potencialmente confidenciais do seu projeto.", + "typescript.tsserver.experimentalAutoBuild": "Habilita auto build experimental. Requer a versão 1.9 dev ou 2.x do tsserver e o reinício do VS Code depois da alteração.", + "typescript.validate.enable": "Habilita/Desabilita a validação TypeScript.", + "typescript.format.enable": "Habilita/Desabilita o formatador padrão TypeScript.", + "javascript.format.enable": "Habilita/Desabilita o formatador padrão JavaScript.", + "format.insertSpaceAfterCommaDelimiter": "Define o tratamento de espaços após um delimitador vírgula.", + "format.insertSpaceAfterSemicolonInForStatements": "Define o tratamento de espaços após um ponto e vírgula para um comando.", + "format.insertSpaceBeforeAndAfterBinaryOperators": "Define o tratamento de espaços após um operador binário.", + "format.insertSpaceAfterKeywordsInControlFlowStatements": "Define o tratamento de espaços após palavras-chave em um comando de controle de fluxo.", + "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "Define o tratamento de espaços após uma palavra-chave de função para funções anônimas.", + "format.insertSpaceBeforeFunctionParenthesis": "Define a manipulação de espaços antes de parênteses do argumento de função. Requer TypeScript > = 2.1.5.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": "Define a manipulação de espaços após abrir e antes de fechar parênteses não vazios.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": "Define a manipulação de espaços após abrir e antes de fechar colchetes não vazios.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": "Define a manipulação de espaços após abrir e antes de fechar chaves não vazias. Requer TypeScript >= 2.3.0.", + "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "Define a manipulação de espaços após abrir e antes de fechar chaves de cadeias de caracteres de modelos. Requer TypeScript >= 2.0.6.", + "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "Define a manipulação de espaços após abrir e antes de fechar chaves de expressões JSX. Requer TypeScript >= 2.0.6.", + "format.placeOpenBraceOnNewLineForFunctions": "Define-se uma chave de abertura é colocada em uma nova linha para funções ou não.", + "format.placeOpenBraceOnNewLineForControlBlocks": "Define-se uma chave de abertura é colocada em uma nova linha para blocos de controle ou não.", + "javascript.validate.enable": "Habilitar/Desabilitar validação JavaScript.", + "typescript.goToProjectConfig.title": "Ir para a Configuração do Projeto", + "javascript.goToProjectConfig.title": "Ir para a Configuração do Projeto", + "javascript.referencesCodeLens.enabled": "Habilitar/desabilitar referências CodeLens em arquivos JavaScript.", + "typescript.referencesCodeLens.enabled": "Habilitar/desabilitar referências CodeLens em arquivos TypeScript. Requer TypeScript > = 2.0.6.", + "typescript.implementationsCodeLens.enabled": "Habilitar/desabilitar implementações CodeLens. Requer TypeScript > = 2.0.6.", + "typescript.openTsServerLog.title": "Abrir arquivo de log do servidor TS", + "typescript.selectTypeScriptVersion.title": "Selecionar a versão do JavaScript", + "jsDocCompletion.enabled": "Habilitar/Desabilitar comentários JSDoc automáticos.", + "javascript.implicitProjectConfig.checkJs": "Habilitar/desabilitar verificação semântica de arquivos JavaScript. Os arquivos existentes jsconfig.json ou tsconfig.json substituem essa configuração. Requer TypeScript > = 2.3.1.", + "typescript.check.npmIsInstalled": "Verificar se NPM está instalado para aquisição automática de digitação", + "javascript.nameSuggestions": "Habilitar/desabilitar incluindo nomes exclusivos do arquivo nas listas de sugestão de JavaScript." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/browser/ui/actionbar/actionbar.i18n.json b/i18n/ptb/src/vs/base/browser/ui/actionbar/actionbar.i18n.json new file mode 100644 index 00000000000..4ecb2c803f4 --- /dev/null +++ b/i18n/ptb/src/vs/base/browser/ui/actionbar/actionbar.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "titleLabel": "{0} ({1})" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/browser/ui/aria/aria.i18n.json b/i18n/ptb/src/vs/base/browser/ui/aria/aria.i18n.json new file mode 100644 index 00000000000..e558eb6187a --- /dev/null +++ b/i18n/ptb/src/vs/base/browser/ui/aria/aria.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "repeated": "{0} (ocorreu novamente)" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/browser/ui/findinput/findInput.i18n.json b/i18n/ptb/src/vs/base/browser/ui/findinput/findInput.i18n.json new file mode 100644 index 00000000000..524ba7bb4a7 --- /dev/null +++ b/i18n/ptb/src/vs/base/browser/ui/findinput/findInput.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultLabel": "entrada" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/browser/ui/findinput/findInputCheckboxes.i18n.json b/i18n/ptb/src/vs/base/browser/ui/findinput/findInputCheckboxes.i18n.json new file mode 100644 index 00000000000..1a477ef1e6d --- /dev/null +++ b/i18n/ptb/src/vs/base/browser/ui/findinput/findInputCheckboxes.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "caseDescription": "Diferenciar Maiúsculas de Minúsculas", + "wordsDescription": "Coincidir Palavra Inteira", + "regexDescription": "Usar Expressão Regular" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/browser/ui/inputbox/inputBox.i18n.json b/i18n/ptb/src/vs/base/browser/ui/inputbox/inputBox.i18n.json new file mode 100644 index 00000000000..0b282bdee8a --- /dev/null +++ b/i18n/ptb/src/vs/base/browser/ui/inputbox/inputBox.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "alertErrorMessage": "Erro: {0}", + "alertWarningMessage": "Aviso: {0}", + "alertInfoMessage": "Informações: {0}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/ptb/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json new file mode 100644 index 00000000000..d023184ae70 --- /dev/null +++ b/i18n/ptb/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "imgMeta": "{0}x{1} {2}", + "largeImageError": "A imagem é muito grande para ser exibida no editor.", + "nativeBinaryError": "O arquivo não pode ser exibido no editor porque é binário, muito grande ou usa uma codificação de texto sem suporte.", + "sizeB": "{0}B", + "sizeKB": "{0}KB", + "sizeMB": "{0}MB", + "sizeGB": "{0}GB", + "sizeTB": "{0}TB" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/browser/ui/toolbar/toolbar.i18n.json b/i18n/ptb/src/vs/base/browser/ui/toolbar/toolbar.i18n.json new file mode 100644 index 00000000000..4a046b57296 --- /dev/null +++ b/i18n/ptb/src/vs/base/browser/ui/toolbar/toolbar.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "more": "Mais" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/common/errorMessage.i18n.json b/i18n/ptb/src/vs/base/common/errorMessage.i18n.json new file mode 100644 index 00000000000..257ffd9e14c --- /dev/null +++ b/i18n/ptb/src/vs/base/common/errorMessage.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "message": "{0}. Código de erro: {1}", + "error.permission.verbose": "Permissão Negada (HTTP {0})", + "error.permission": "Permissão Negada", + "error.http.verbose": "{0} (HTTP {1}: {2})", + "error.http": "{0} (HTTP {1})", + "error.connection.unknown.verbose": "Erro de Conexão Desconhecido ({0})", + "error.connection.unknown": "Ocorreu um erro de conexão desconhecido. Você não está mais conectado à Internet ou o servidor que você está conectado está offline.", + "stackTrace.format": "{0}: {1}", + "error.defaultMessage": "Ocorreu um erro desconhecido. Consulte o log para obter mais detalhes.", + "nodeExceptionMessage": "Ocorreu um erro de sistema ({0})", + "error.moreErrors": "{0} ({1} erros no total)" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/ptb/src/vs/base/common/jsonErrorMessages.i18n.json new file mode 100644 index 00000000000..d6108586df8 --- /dev/null +++ b/i18n/ptb/src/vs/base/common/jsonErrorMessages.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "error.invalidSymbol": "Símbolo inválido", + "error.invalidNumberFormat": "Formato de número inválido", + "error.propertyNameExpected": "Nome de propriedade esperado", + "error.valueExpected": "Valor esperado", + "error.colonExpected": "Dois-pontos esperados", + "error.commaExpected": "Vírgula esperada", + "error.closeBraceExpected": "Chave de fechamento esperada", + "error.closeBracketExpected": "Colchete de fechamento esperado", + "error.endOfFileExpected": "Fim do arquivo esperado" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/common/processes.i18n.json b/i18n/ptb/src/vs/base/common/processes.i18n.json new file mode 100644 index 00000000000..165322e5952 --- /dev/null +++ b/i18n/ptb/src/vs/base/common/processes.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ExecutableParser.commandMissing": "Erro: informações de executável devem definir um comando do tipo string", + "ExecutableParser.isShellCommand": "Aviso: IsShellCommand deve ser to tipo booleano. Ignorando valor {0}", + "ExecutableParser.args": "Aviso: args deve ser do tipo string[]. Ignorando valor {0}.", + "ExecutableParser.invalidCWD": "Aviso: options.cwd deve ser do tipo string. Ignorando valor {0}." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/common/severity.i18n.json b/i18n/ptb/src/vs/base/common/severity.i18n.json new file mode 100644 index 00000000000..7aff8041180 --- /dev/null +++ b/i18n/ptb/src/vs/base/common/severity.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "sev.error": "Erro", + "sev.warning": "Aviso", + "sev.info": "Informações" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/node/processes.i18n.json b/i18n/ptb/src/vs/base/node/processes.i18n.json new file mode 100644 index 00000000000..3584dc9b15e --- /dev/null +++ b/i18n/ptb/src/vs/base/node/processes.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "TaskRunner.UNC": "Não é possível executar um comando shell em uma unidade UNC." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/node/zip.i18n.json b/i18n/ptb/src/vs/base/node/zip.i18n.json new file mode 100644 index 00000000000..a577f90ea2e --- /dev/null +++ b/i18n/ptb/src/vs/base/node/zip.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "notFound": "{0} não encontrado dentro do zip." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/parts/quickopen/browser/quickOpenModel.i18n.json b/i18n/ptb/src/vs/base/parts/quickopen/browser/quickOpenModel.i18n.json new file mode 100644 index 00000000000..1d0f7ebd47a --- /dev/null +++ b/i18n/ptb/src/vs/base/parts/quickopen/browser/quickOpenModel.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickOpenAriaLabelEntry": "{0}, seletor", + "quickOpenAriaLabel": "seletor" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/parts/quickopen/browser/quickOpenWidget.i18n.json b/i18n/ptb/src/vs/base/parts/quickopen/browser/quickOpenWidget.i18n.json new file mode 100644 index 00000000000..ca3d8a5266a --- /dev/null +++ b/i18n/ptb/src/vs/base/parts/quickopen/browser/quickOpenWidget.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickOpenAriaLabel": "Seletor rápido. Digite para filtrar resultados.", + "treeAriaLabel": "Seletor rápido" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/parts/tree/browser/treeDefaults.i18n.json b/i18n/ptb/src/vs/base/parts/tree/browser/treeDefaults.i18n.json new file mode 100644 index 00000000000..5e72c45050c --- /dev/null +++ b/i18n/ptb/src/vs/base/parts/tree/browser/treeDefaults.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "collapse": "Recolher" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/code/electron-main/menus.i18n.json b/i18n/ptb/src/vs/code/electron-main/menus.i18n.json new file mode 100644 index 00000000000..85312962c12 --- /dev/null +++ b/i18n/ptb/src/vs/code/electron-main/menus.i18n.json @@ -0,0 +1,164 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mFile": "&&Arquivo", + "mEdit": "&&Editar", + "mSelection": "&&Seleção", + "mView": "&&Visualizar", + "mGoto": "&&Ir", + "mDebug": "&&Depurar", + "mWindow": "Janela", + "mHelp": "&&Ajuda", + "miNewWindow": "Nova &&Janela", + "mAbout": "Sobre {0}", + "mServices": "Serviços", + "mHide": "Ocultar {0}", + "mHideOthers": "Ocultar Outros", + "mShowAll": "Mostrar Tudo", + "miQuit": "Sair de {0}", + "miNewFile": "&&Novo Arquivo", + "miOpen": "&&Abrir", + "miOpenFolder": "Abrir &&Pasta", + "miOpenFile": "&&Abrir Arquivo", + "miOpenRecent": "Abrir &&Recente", + "miSave": "&&Salvar", + "miSaveAs": "Salvar &&Como...", + "miSaveAll": "Salvar &&Tudo", + "miAutoSave": "Salvar Automaticamente", + "miRevert": "Re&&verter Arquivo", + "miCloseWindow": "Fe&&char Janela", + "miCloseFolder": "Fechar &&Pasta", + "miCloseEditor": "Fechar &&Editor", + "miExit": "Sai&&r", + "miOpenSettings": "&&Configurações", + "miOpenKeymap": "Atalhos de &&Teclado", + "miOpenKeymapExtensions": "Extensões de &&Mapeamento de Teclado", + "miOpenSnippets": "Trechos de Có&&digo do Usuário", + "miSelectColorTheme": "Cor do T&&ema", + "miSelectIconTheme": "&&Ícone de Arquivo do Tema", + "miPreferences": "&&Preferências", + "miReopenClosedEditor": "&&Reabrir Editor Fechado", + "miClearRecentOpen": "&&Limpar Arquivos Recentes", + "miUndo": "&&Desfazer", + "miRedo": "&&Refazer", + "miCut": "Cor&&tar", + "miCopy": "&&Copiar", + "miPaste": "Co&&lar", + "miFind": "&&Localizar", + "miReplace": "&&Substituir", + "miFindInFiles": "Localizar &&nos Arquivos", + "miReplaceInFiles": "Substituir &&nos Arquivos", + "miEmmetExpandAbbreviation": "Emmet: E&&xpandir Abreviação", + "miShowEmmetCommands": "E&&mmet...", + "miToggleLineComment": "&&Alternar Comentário de Linha", + "miToggleBlockComment": "Alternar Comentário de &&Bloco", + "miInsertCursorAbove": "&&Inserir cursor acima", + "miInsertCursorBelow": "Inserir cursor a&&baixo", + "miInsertCursorAtEndOfEachLineSelected": "Adicionar C&&ursores ao Final das Linhas", + "miAddSelectionToNextFindMatch": "Adicionar &&próxima ocorrência", + "miAddSelectionToPreviousFindMatch": "Adicionar ocorrência a&&nterior ", + "miSelectHighlights": "Selecionar todas as &&ocorrências", + "miCopyLinesUp": "&&Copiar linha acima", + "miCopyLinesDown": "C&&opiar linha abaixo", + "miMoveLinesUp": "Mo&&ver linha para cima", + "miMoveLinesDown": "Mover &&linha para baixo", + "miSelectAll": "&&Selecionar Tudo", + "miSmartSelectGrow": "&&Expandir seleção", + "miSmartSelectShrink": "&&Reduzir seleção", + "miViewExplorer": "&&Explorador", + "miViewSearch": "&&Pesquisar", + "miViewSCM": "S&&CM", + "miViewDebug": "&&Depurar", + "miViewExtensions": "E&&xtensões", + "miToggleOutput": "&&Saída", + "miToggleDebugConsole": "Con&&sole de Depuração", + "miToggleIntegratedTerminal": "Terminal &&Integrado", + "miMarker": "&&Problemas", + "miAdditionalViews": "&&Visualizações Adicionais", + "miCommandPalette": "&&Paleta de comando", + "miToggleFullScreen": "Alternar &&Tela Inteira", + "miToggleZenMode": "Alternar modo Zen", + "miToggleMenuBar": "Alternar &&Barra de Menus", + "miSplitEditor": "Dividir &&editor", + "miToggleEditorLayout": "Alternar &&Layout do Grupo de Editor", + "miToggleSidebar": "&&Alternar Barra Lateral", + "miMoveSidebarRight": "&&Mover a barra lateral para a direita", + "miMoveSidebarLeft": "&&Mover a barra lateral para a esquerda", + "miTogglePanel": "Alternar &&Painel", + "miHideStatusbar": "&&Ocultar Barra de Status", + "miShowStatusbar": "&&Mostrar Barra de Status", + "miHideActivityBar": "Ocultar Barra de &&Atividades", + "miShowActivityBar": "Mostrar Barra de &&Atividades", + "miToggleWordWrap": "Alternar &&Quebra de Linha", + "miToggleRenderWhitespace": "Alternar &&Renderização de Espaços em Branco", + "miToggleRenderControlCharacters": "Alternar &&Caracteres de Controle", + "miZoomIn": "&&Ampliar", + "miZoomOut": "Red&&uzir", + "miZoomReset": "&&Reinicializar Zoom", + "miBack": "&&Voltar", + "miForward": "&&Avançar", + "miNextEditor": "&&Próximo Editor", + "miPreviousEditor": "&&Editor Anterior", + "miNextEditorInGroup": "&&Próximo Editor Usado no Grupo", + "miPreviousEditorInGroup": "&&Editor Anterior Usado no Grupo", + "miSwitchEditor": "Trocar &&Editor", + "miFocusFirstGroup": "&&Primeiro Grupo", + "miFocusSecondGroup": "&&Segundo Grupo", + "miFocusThirdGroup": "&&Terceiro Grupo", + "miNextGroup": "&&Próximo Grupo", + "miPreviousGroup": "&&Grupo Anterior", + "miSwitchGroup": "Trocar &&Grupo", + "miGotoFile": "Ir para &&Arquivo...", + "miGotoSymbolInFile": "Ir para o &&Símbolo no Arquivo...", + "miGotoSymbolInWorkspace": "Ir para o Símbolo em &&Área de Trabalho", + "miGotoDefinition": "Ir para &&Definição", + "miGotoTypeDefinition": "Ir para a &&definição de tipo", + "miGotoImplementation": "Ir para a &&implementação", + "miGotoLine": "Ir para &&Linha...", + "miStartDebugging": "Iniciar Depuração", + "miStartWithoutDebugging": "Iniciar &&Sem Depuração", + "miStopDebugging": "&&Parar Depuração", + "miRestart Debugging": "&&Reiniciar Depuração", + "miOpenConfigurations": "Abrir &&Configurações", + "miAddConfiguration": "Adicionar Configuração...", + "miStepOver": "Pular &&Sobre", + "miStepInto": "Pular &&Dentro", + "miStepOut": "Pular &&Fora", + "miContinue": "&&Continuar", + "miToggleBreakpoint": "Alternar &&Ponto de Parada", + "miConditionalBreakpoint": "Ponto de Parada &&Condicional...", + "miColumnBreakpoint": "Ponto de Parada de C&&oluna", + "miFunctionBreakpoint": "Ponto de Parada de &&Função...", + "miNewBreakpoint": "&&Novo Ponto de Parada", + "miDisableAllBreakpoints": "Desabilitar T&&odos os Pontos de Parada", + "miRemoveAllBreakpoints": "Remover &&Todos os Pontos de Parada", + "miInstallAdditionalDebuggers": "&&Instalar Depuradores Adicionais...", + "mMinimize": "Minimizar", + "mClose": "Fechar", + "mBringToFront": "Trazer Tudo para a Frente", + "miToggleDevTools": "&&Alternar Ferramentas do Desenvolvedor", + "miAccessibilityOptions": "&&Opções de Acessibilidade", + "miReportIssues": "Relatar &&Problemas", + "miWelcome": "&&Bem-vindo", + "miInteractivePlayground": "Playground &&Interativo", + "miDocumentation": "&&Documentação", + "miReleaseNotes": "&&Notas de Versão", + "miKeyboardShortcuts": "Referência de &&Atalhos de Teclado", + "miIntroductoryVideos": "&&Vídeos Introdutórios", + "miTwitter": "&&Junte-se a nós no Twitter", + "miUserVoice": "&&Pesquisar Solicitações de Recursos", + "miLicense": "&&Exibir Licença", + "miPrivacyStatement": "&&Política de Privacidade", + "miAbout": "&&Sobre", + "miRestartToUpdate": "Reinicie para Atualizar...", + "miCheckingForUpdates": "Verificando Atualizações...", + "miDownloadUpdate": "Baixar Atualização Disponível", + "miDownloadingUpdate": "Baixando Atualização...", + "miInstallingUpdate": "Instalando Atualização...", + "miCheckForUpdates": "Verificar Atualizações...", + "aboutDetail": "\\\\nVersão {0}\\\\nConfirmação {1}\\\\nData {2}\\\\nShell {3}\\\\nRenderizador {4}\\\\nNó {5}", + "okButton": "OK" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/code/electron-main/window.i18n.json b/i18n/ptb/src/vs/code/electron-main/window.i18n.json new file mode 100644 index 00000000000..abee584a9c1 --- /dev/null +++ b/i18n/ptb/src/vs/code/electron-main/window.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hiddenMenuBar": "Você ainda pode acessar a barra de menu pressionando a tecla * * Alt * *." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/code/electron-main/windows.i18n.json b/i18n/ptb/src/vs/code/electron-main/windows.i18n.json new file mode 100644 index 00000000000..308aed29538 --- /dev/null +++ b/i18n/ptb/src/vs/code/electron-main/windows.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ok": "OK", + "pathNotExistTitle": "O caminho não existe", + "pathNotExistDetail": "O caminho '{0}' não parece mais existir no disco.", + "accessibilityOptionsWindowTitle": "Opções de Acessibilidade", + "reopen": "Reabrir", + "wait": "Continuar Esperando", + "close": "Fechar", + "appStalled": "A janela não está mais respondendo", + "appStalledDetail": "Você pode reabrir, fechar a janela ou continuar esperando.", + "appCrashed": "A janela foi fechada inesperadamente", + "appCrashedDetail": "Pedimos desculpas pelo inconveniente! Você pode reabrir a janela para continuar de onde parou.", + "newWindow": "Nova Janela", + "newWindowDesc": "Abrir uma nova janela", + "recentFolders": "Pastas Recentes", + "folderDesc": "{0} {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/code/node/cliProcessMain.i18n.json b/i18n/ptb/src/vs/code/node/cliProcessMain.i18n.json new file mode 100644 index 00000000000..ee0b74f6e41 --- /dev/null +++ b/i18n/ptb/src/vs/code/node/cliProcessMain.i18n.json @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "notFound": "Extensão '{0}' não encontrada.", + "notInstalled": "Extensão '{0}' não está instalada.", + "useId": "Certifique-se de usar a ID de extensão completa, incluindo o editor, por exemplo: {0}", + "successVsixInstall": "Extensão '{0}' foi instalada com sucesso!", + "alreadyInstalled": "Extensão '{0}' já está instalada.", + "foundExtension": "Encontrado '{0}' na loja VS Code.", + "installing": "Instalando...", + "successInstall": "Extensão '{0}' v {1} foi instalada com sucesso!", + "uninstalling": "Desinstalando {0}...", + "successUninstall": "Extensão '{0}' foi desinstalada com sucesso!" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json new file mode 100644 index 00000000000..8411a930363 --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -0,0 +1,76 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorConfigurationTitle": "Editor", + "fontFamily": "Controla a família de fontes.", + "fontWeight": "Controla o peso da fonte.", + "fontSize": "Controla o tamanho da fonte em pixels.", + "lineHeight": "Controla a altura da linha. Use 0 para computar a altura da linha a partir do tamanho da fonte.", + "letterSpacing": "Controla o espaçamento da letra em pixels.", + "lineNumbers": "Controla a exibição de números de linha. Valores possíveis são 'on', 'off' e 'relative'. 'relative' mostra a contagem de linhas a partir da posição atual do cursor.", + "rulers": "Colunas nas quais mostrar réguas verticais", + "wordSeparators": "Caracteres que serão usados como separadores de palavras ao fazer navegação relacionada a palavras ou operações", + "tabSize": "O número de espaços equivalentes a uma tabulação. Esta configuração é sobreposta no conteúdo do arquivo quando `editor.detectIndentation` está ligado.", + "tabSize.errorMessage": "Esperado 'número'. Note que o valor \"auto\" foi alterado pela configuração 'editor.detectIndentation'.", + "insertSpaces": "Insere espaços quanto pressionado Tab. Esta configuração é sobrescrita com base no conteúdo do arquivo quando 'editor.detectIndentation' está habilitado.", + "insertSpaces.errorMessage": "Esperado 'booleano'. Note que o valor \"auto\" foi alterado pela configuração 'editor.detectIndentation'.", + "detectIndentation": "Quando um arquivo está sendo aberto, 'editor.tabSize' e 'editor.insertSpace' será detectado com base no conteúdo do arquivo.", + "roundedSelection": "Controla se as seleções têm cantos arredondados", + "scrollBeyondLastLine": "Controla se o editor rolará além da última linha", + "minimap.enabled": "Controla se o mini mapa é exibido", + "minimap.renderCharacters": "Renderizar os caracteres em uma linha (em oposição a blocos de caracteres)", + "minimap.maxColumn": "Limitar o tamanho de um mini-mapa para renderizar no máximo um número determinado de colunas", + "wordWrap.off": "As linhas nunca serão quebradas.", + "wordWrap.on": "As linhas serão quebradas na largura de visualização", + "wordWrap.wordWrapColumn": "As linhas serão quebradas em `editor.wordWrapColumn`.", + "wordWrap.bounded": "As linhas serão quebradas no mínimo entre a largura de visualização e `editor.wordWrapColumn`.", + "wordWrap": "Controla como as linhas devem ser quebradas automaticamente. Pode ser:\n- 'off' (quebra automática de linha desabilitada)\n- 'on' (quebra automática de linha na largura da janela)\n- 'wordWrapColumn' (quebra automática no numero de colunas definido em `editor.wordWrapColumn`) ou\n- 'bounded' (quebra automática em uma dimensão minima da janela e na largura configurada)", + "wordWrapColumn": "Controla a coluna de quebra de linha do editor quando editor.wordWrap` é 'wordWrapColumn' ou 'bounded'.", + "wrappingIndent": "Controla o recuo de linhas quebradas. Pode ser \"none\", \"same\" ou \"indent\".", + "mouseWheelScrollSensitivity": "Um multiplicador a ser usado em \"deltaX\" e \"deltaY\" dos eventos de rolagem do botão de rolagem do mouse", + "quickSuggestions.strings": "Habilitar sugestões rápidas dentro de strings.", + "quickSuggestions.comments": "Habilitar sugestões rápidas dentro de comentários.", + "quickSuggestions.other": "Habilitar sugestões rápidas fora de strings e comentários.", + "quickSuggestions": "Controlar se sugestões devem aparecer automaticamente ao digitar", + "quickSuggestionsDelay": "Controla o atraso em ms após o qual sugestões rápidas serão exibidas", + "parameterHints": "Habilita dicas de parâmetros", + "autoClosingBrackets": "Controla se o editor deve fechar colchetes automaticamente depois de abri-los", + "formatOnType": "Controla se o editor deve formatar automaticamente a linha após a digitação", + "formatOnPaste": "Controla se o editor deve formatar automaticamente o conteúdo colado. Um formatador deve estar disponível e o formatador deve ser capaz de formatar apenas uma parte do documento.", + "suggestOnTriggerCharacters": "Controla se as sugestões devem aparecer automaticamente ao digitar caracteres de gatilho", + "acceptSuggestionOnCommitCharacter": "Controla se as sugestões devem ser aceitas em caracteres de confirmação. Por exemplo, em JavaScript, o ponto-e-vírgula (';') pode ser um caractere de confirmação que aceita uma sugestão e digita esse caractere.", + "snippetSuggestions": "Controla se os snippets são exibidos juntamente com as outras sugestões e como eles são ordenados.", + "emptySelectionClipboard": "Controla se a cópia sem nenhuma seleção copia a linha atual.", + "wordBasedSuggestions": "Controla se o auto-completar deve ser calculado baseado nas palavras no documento.", + "suggestFontSize": "Tamanho da fonte para a ferramenta de sugestão", + "suggestLineHeight": "Altura de linha para a ferramenta de sugestão", + "selectionHighlight": "Controla se o editor deve realçar correspondências semelhantes à seleção", + "occurrencesHighlight": "Controla se o editor deve realçar ocorrências de símbolos semânticos.", + "overviewRulerLanes": "Controla o número de decorações que podem ser exibidas na mesma posição na régua de visão geral", + "overviewRulerBorder": "Controla se deve desenhar uma borda ao redor da régua de visão geral.", + "cursorBlinking": "Controla o estilo de animação do cursor, os valores possíveis são 'blink', 'smooth', 'phase', 'expand' e 'solid'", + "mouseWheelZoom": "Alterar o zoom da fonte editor quando utilizada a roda do mouse e pressionando Ctrl", + "cursorStyle": "Controla o estilo do cursor, os valores aceitos são 'block', 'block-outline', 'line', 'line-thin', 'underline' e 'underline-thin'", + "fontLigatures": "Habilita ligaduras de fontes", + "hideCursorInOverviewRuler": "Controla se o cursor deve ficar oculto na régua de visão geral.", + "renderWhitespace": "Controla como o editor deve rendenizar caracteres de espaços em branco, possibilidades são 'none', 'boundary' e 'all'. A opção 'boundary' não rendeniza espaços simples entre palavras.", + "renderControlCharacters": "Controla se o editor deve renderizar caracteres de controle", + "renderIndentGuides": "Controla se o editor deve renderizar guias de identação", + "renderLineHighlight": "Controla como o editor deve renderizar a linha atual, as possibilidades são 'none', 'gutter', 'line' e 'all'.", + "codeLens": "Controla se o editor exibirá a lente de códigos.", + "folding": "Controla se o editor tem codigo colapsível hablitado", + "showFoldingControls": "Controla se os controles de desdobramento na divisão são ocultas automaticamente.", + "matchBrackets": "Realça colchetes correspondente quando um deles estiver selecionado.", + "glyphMargin": "Controla se o editor deve renderizar a margem vertical de ícones. A margem vertical de ícones é usada primordialmente na depuração", + "useTabStops": "Inserção e deleção de espaço em branco seguem a tabulação", + "trimAutoWhitespace": "Remove espaços em branco inseridos automaticamente no fim da linha", + "stablePeek": "Mantém os editores de visualização abertos mesmo quando clicando seu conteúdo ou teclando Escape.", + "dragAndDrop": "Controla se o editor deve permitir mover seleções via arrastar e soltar.", + "sideBySide": "Controla se o editor de diff mostra as diff lado a lado ou inline.", + "ignoreTrimWhitespace": "Controla se o editor de diff mostra alterações nos espaços iniciais ou finais como diferenças", + "renderIndicators": "Controla se o editor de diff mostra indicadores +/- para alterações adicionadas/removidas", + "selectionClipboard": "Controla se a área primária de transferência Linux deve ser suportada." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/config/editorOptions.i18n.json b/i18n/ptb/src/vs/editor/common/config/editorOptions.i18n.json new file mode 100644 index 00000000000..40fed0886cc --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/config/editorOptions.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorViewAccessibleLabel": "Conteúdo do editor" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/controller/cursor.i18n.json b/i18n/ptb/src/vs/editor/common/controller/cursor.i18n.json new file mode 100644 index 00000000000..60bcb5f5b5a --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/controller/cursor.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "corrupt.commands": "Exceção inesperada ao executar o comando." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/model/textModelWithTokens.i18n.json b/i18n/ptb/src/vs/editor/common/model/textModelWithTokens.i18n.json new file mode 100644 index 00000000000..fc3574b7fde --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/model/textModelWithTokens.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mode.tokenizationSupportFailed": "O modo falhou ao gerar token da entrada." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/modes/modesRegistry.i18n.json b/i18n/ptb/src/vs/editor/common/modes/modesRegistry.i18n.json new file mode 100644 index 00000000000..509203220c8 --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/modes/modesRegistry.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "plainText.alias": "Texto sem formatação" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/services/bulkEdit.i18n.json b/i18n/ptb/src/vs/editor/common/services/bulkEdit.i18n.json new file mode 100644 index 00000000000..3fada6ebf53 --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/services/bulkEdit.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "conflict": "Estes arquivos foram alterados nesse meio tempo: {0}", + "summary.0": "Não foram feitas edições", + "summary.nm": "Feitas {0} edições de texto em {1} arquivos", + "summary.n0": "Feitas {0} edições de texto em um arquivo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/services/modeServiceImpl.i18n.json b/i18n/ptb/src/vs/editor/common/services/modeServiceImpl.i18n.json new file mode 100644 index 00000000000..85f2d2943f6 --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/services/modeServiceImpl.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "vscode.extension.contributes.languages": "Contribui às declarações de linguagem.", + "vscode.extension.contributes.languages.id": "ID da linguagem", + "vscode.extension.contributes.languages.aliases": "Aliases de nome para esta linguagem.", + "vscode.extension.contributes.languages.extensions": "Extensões de arquivos associadas a esta linguagem", + "vscode.extension.contributes.languages.filenames": "Nome dos arquivos associados a esta linguagem", + "vscode.extension.contributes.languages.filenamePatterns": "Padrão glob de nomes de arquivos associados a linguagem.", + "vscode.extension.contributes.languages.mimetypes": "Tipos Mime associados à linguagem.", + "vscode.extension.contributes.languages.firstLine": "Uma expressão regular que coincide com a primeira linha de um arquivo da linguaguem.", + "vscode.extension.contributes.languages.configuration": "Um caminho relativo para um arquivo contendo opções de configuração para a linguagem." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/services/modelServiceImpl.i18n.json b/i18n/ptb/src/vs/editor/common/services/modelServiceImpl.i18n.json new file mode 100644 index 00000000000..b6c528c5a25 --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/services/modelServiceImpl.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "diagAndSourceMultiline": "[{0}] {1}", + "diagAndSource": "[{0}] {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json new file mode 100644 index 00000000000..8d59b0fcb7d --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "lineHighlight": "Cor de fundo para a posição do cursor na seleção de linhas.", + "lineHighlightBorderBox": "Cor de fundo para a borda em volta da linha na posição do cursor", + "rangeHighlight": "Cor de fundo dos ranges selecionados, assim como abertura instantânea e descoberta de recursos ", + "caret": "Cor do cursor no editor.", + "editorWhitespaces": "Cor dos caracteres em branco no editor", + "editorIndentGuides": "Cor das guias de indentação do editor.", + "editorLineNumbers": "Cor dos números de linha do editor.", + "editorRuler": "Cor das réguas do editor.", + "editorCodeLensForeground": "Cor do primeiro plano das lentes de código do editor", + "editorBracketMatchBackground": "Cor de fundo atrás do colchetes correspondentes", + "editorBracketMatchBorder": "Cor para as caixas de colchetes correspondentes", + "editorOverviewRulerBorder": "Cor da borda da régua de visão geral.", + "editorGutter": "Cor de fundo da separação do editor.O separador contém os glifos das margens e os números de linha." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/accessibility/browser/accessibility.i18n.json b/i18n/ptb/src/vs/editor/contrib/accessibility/browser/accessibility.i18n.json new file mode 100644 index 00000000000..e045839f7c6 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/accessibility/browser/accessibility.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "introMsg": "Obrigado por testar a opção de acessibilidade do VS Code.", + "status": "Status", + "tabFocusModeOnMsg": "Pressionando Tab no editor corrente irá mover o foco para o próximo elemento focável. Mude este comportamento ao pressionar {0}.", + "tabFocusModeOnMsgNoKb": "Pressionando Tab no editor corrente irá mover o foco para o próximo elemento focável. O comando {0} não pode ser ativado atualmente por uma tecla.", + "tabFocusModeOffMsg": "Pressionando Tab no editor atual irá inserir um caractere Tab. Mude este comportamente ao pressionar {0}.", + "tabFocusModeOffMsgNoKb": "Pressionando Tab no editor atual irá inserir um caractere Tab. O comando {0} não pode ser ativado atualmente por uma tecla.", + "outroMsg": "Você pode ignorar essa dica e retornar ao editor apertando a tecla ESC", + "ShowAccessibilityHelpAction": "Mostrar ajuda de acessibilidade" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/bracketMatching/common/bracketMatching.i18n.json b/i18n/ptb/src/vs/editor/contrib/bracketMatching/common/bracketMatching.i18n.json new file mode 100644 index 00000000000..4af1753636d --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/bracketMatching/common/bracketMatching.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.jumpBracket": "Ir para colchete" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/caretOperations/common/caretOperations.i18n.json b/i18n/ptb/src/vs/editor/contrib/caretOperations/common/caretOperations.i18n.json new file mode 100644 index 00000000000..157105c4a35 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/caretOperations/common/caretOperations.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "caret.moveLeft": "Mover cursor para a esquerda", + "caret.moveRight": "Mover cursor para a direita" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/caretOperations/common/transpose.i18n.json b/i18n/ptb/src/vs/editor/contrib/caretOperations/common/transpose.i18n.json new file mode 100644 index 00000000000..c1d3083b198 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/caretOperations/common/transpose.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "transposeLetters.label": "Transport letras" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/clipboard/browser/clipboard.i18n.json b/i18n/ptb/src/vs/editor/contrib/clipboard/browser/clipboard.i18n.json new file mode 100644 index 00000000000..903f9fc1086 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/clipboard/browser/clipboard.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "actions.clipboard.cutLabel": "Recortar", + "actions.clipboard.copyLabel": "Copiar", + "actions.clipboard.pasteLabel": "Colar", + "actions.clipboard.copyWithSyntaxHighlightingLabel": "Copiar com realce de sintaxe" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/comment/common/comment.i18n.json b/i18n/ptb/src/vs/editor/contrib/comment/common/comment.i18n.json new file mode 100644 index 00000000000..ff1ba569c0c --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/comment/common/comment.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "comment.line": "Alternar Comentário de Linha", + "comment.line.add": "Adicionar Comentário de Linha", + "comment.line.remove": "Remover Comentário de Linha", + "comment.block": "Alternar Comentário de Bloco" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/contextmenu/browser/contextmenu.i18n.json b/i18n/ptb/src/vs/editor/contrib/contextmenu/browser/contextmenu.i18n.json new file mode 100644 index 00000000000..e2b1d946bee --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/contextmenu/browser/contextmenu.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "action.showContextMenu.label": "Mostrar o menu de contexto do editor" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/find/browser/findWidget.i18n.json b/i18n/ptb/src/vs/editor/contrib/find/browser/findWidget.i18n.json new file mode 100644 index 00000000000..473543c0850 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/find/browser/findWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "Localizar", + "placeholder.find": "Localizar", + "label.previousMatchButton": "Correspondência anterior", + "label.nextMatchButton": "Próxima correspondência", + "label.toggleSelectionFind": "Localizar na seleção", + "label.closeButton": "Fechar", + "label.replace": "Substituir", + "placeholder.replace": "Substituir", + "label.replaceButton": "Substituir", + "label.replaceAllButton": "Substituir Tudo", + "label.toggleReplaceButton": "Ativar/desativar modo Substituir", + "title.matchesCountLimit": "Somente os primeiros 999 resultados são realçados, mas todas as operações de pesquisa funcionam em todo o texto.", + "label.matchesLocation": "{0} de {1}", + "label.noResults": "Nenhum resultado" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/find/common/findController.i18n.json b/i18n/ptb/src/vs/editor/contrib/find/common/findController.i18n.json new file mode 100644 index 00000000000..07397efa5fe --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/find/common/findController.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "startFindAction": "Localizar", + "findNextMatchAction": "Localizar Próximo", + "findPreviousMatchAction": "Localizar anterior", + "nextSelectionMatchFindAction": "Localizar Próxima Seleção", + "previousSelectionMatchFindAction": "Localizar Seleção Anterior", + "startReplace": "Substituir", + "addSelectionToNextFindMatch": "Adicionar Seleção ao Próximo Localizar Correspondência", + "addSelectionToPreviousFindMatch": "Adicionar Seleção à Correspondência de Localização Anterior", + "moveSelectionToNextFindMatch": "Mover Última Seleção para Próximo Localizar Correspondência", + "moveSelectionToPreviousFindMatch": "Mover Última Seleção para Correspondência de Localização Anterior", + "selectAllOccurencesOfFindMatch": "Selecionar Todas as Ocorrências de Localizar Correspondência", + "changeAll.label": "Alterar todas as ocorrências" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/folding/browser/folding.i18n.json b/i18n/ptb/src/vs/editor/contrib/folding/browser/folding.i18n.json new file mode 100644 index 00000000000..c9d6b88a852 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/folding/browser/folding.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unfoldAction.label": "Abrir", + "unFoldRecursivelyAction.label": "Abrir recursivamente", + "foldAction.label": "Colapsar", + "foldRecursivelyAction.label": "Colapsar recursivamente", + "foldAllAction.label": "Colapsar tudo", + "unfoldAllAction.label": "Abrir tudo", + "foldLevelAction.label": "Nível de colapsamento {0}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/format/browser/formatActions.i18n.json b/i18n/ptb/src/vs/editor/contrib/format/browser/formatActions.i18n.json new file mode 100644 index 00000000000..4327e5f6744 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/format/browser/formatActions.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint11": "1 edição de formatação feita na linha {0}", + "hintn1": "{0} edições de formatação feitas na linha {1}", + "hint1n": "Feita 1 edição de formatação entre as linhas {0} e {1}", + "hintnn": "Feitas {0} edições de formatação entre as linhas {1} e {2}", + "formatDocument.label": "Formatar Documento", + "formatSelection.label": "Formatar Seleção" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/ptb/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..01753366bca --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "Não foi encontrada definição para '{0}'", + "generic.noResults": "Nenhuma definição encontrada", + "meta.title": "- {0} definições", + "actions.goToDecl.label": "Ir para Definição", + "actions.goToDeclToSide.label": "Abrir definição ao lado", + "actions.previewDecl.label": "Inspecionar definição", + "goToImplementation.noResultWord": "Nenhuma implementação encontrada para '{0}'", + "goToImplementation.generic.noResults": "Nenhuma implementação encontrada", + "meta.implementations.title": "– {0} implementações", + "actions.goToImplementation.label": "Ir para a implementação", + "actions.peekImplementation.label": "Inspecionar implementação", + "goToTypeDefinition.noResultWord": "Nenhuma definição encontrada para '{0}'", + "goToTypeDefinition.generic.noResults": "Nenhuma definição de tipo encontrada", + "meta.typeDefinitions.title": "– {0} definições de tipos", + "actions.goToTypeDefinition.label": "Ir para a definição de tipo", + "actions.peekTypeDefinition.label": "Inspecionar definição de tipo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/ptb/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..675cbe29ae1 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Clique para mostrar {0} definições." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json b/i18n/ptb/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json new file mode 100644 index 00000000000..0ad65de8863 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "title.wo_source": "({0}/{1})", + "markerAction.next.label": "Ir para o Próximo Erro ou Aviso", + "markerAction.previous.label": "Ir para o Erro ou Aviso Anterior", + "editorMarkerNavigationError": "Ferramenta de marcação de edição apresentando error na cor ", + "editorMarkerNavigationWarning": "Ferramenta de marcação de edição apresentando adventência na cor", + "editorMarkerNavigationBackground": "Cor de fundo da ferramenta de marcação de navegação do editor." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/hover/browser/hover.i18n.json b/i18n/ptb/src/vs/editor/contrib/hover/browser/hover.i18n.json new file mode 100644 index 00000000000..196a8fb2bb0 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/hover/browser/hover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showHover": "Mostrar Item Flutuante" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/hover/browser/modesContentHover.i18n.json b/i18n/ptb/src/vs/editor/contrib/hover/browser/modesContentHover.i18n.json new file mode 100644 index 00000000000..2c74cf6f1ec --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/hover/browser/modesContentHover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "modesContentHover.loading": "Carregando..." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.i18n.json b/i18n/ptb/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.i18n.json new file mode 100644 index 00000000000..fbbfbd02161 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "InPlaceReplaceAction.previous.label": "Substituir pelo valor anterior", + "InPlaceReplaceAction.next.label": "Substituir pelo próximo valor" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/indentation/common/indentation.i18n.json b/i18n/ptb/src/vs/editor/contrib/indentation/common/indentation.i18n.json new file mode 100644 index 00000000000..8edeaaf8104 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/indentation/common/indentation.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "indentationToSpaces": "Converter indentação em espaços.", + "indentationToTabs": "Coverter Indentação a Tabulações.", + "configuredTabSize": "Tamanho de Tabulação Configurado", + "selectTabWidth": "Selecione o Tamanho de Tabulação para o Arquivo Atual", + "indentUsingTabs": "Indentar Usando Tabulações", + "indentUsingSpaces": "Indentar Usando Espaços", + "detectIndentation": "Detectar Indentação a Partir do Conteúdo", + "editor.reindentlines": "Reindentar Linhas" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.i18n.json b/i18n/ptb/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.i18n.json new file mode 100644 index 00000000000..e715c4d667f --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "inspectTMScopes": "Desenvolvedor: Inspecionar escopos TM", + "inspectTMScopesWidget.loading": "Carregando..." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/linesOperations/common/linesOperations.i18n.json b/i18n/ptb/src/vs/editor/contrib/linesOperations/common/linesOperations.i18n.json new file mode 100644 index 00000000000..8a368ab368d --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/linesOperations/common/linesOperations.i18n.json @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "lines.copyUp": "Copiar linha acima", + "lines.copyDown": "Copiar linha abaixo", + "lines.moveUp": "Mover linha para cima", + "lines.moveDown": "Mover linha para baixo", + "lines.sortAscending": "Classificar Linhas Ascendentemente", + "lines.sortDescending": "Classificar Linhas Descendentemente", + "lines.trimTrailingWhitespace": "Cortar Espaço em Branco à Direita", + "lines.delete": "Excluir linha", + "lines.indent": "Recuar linha", + "lines.outdent": "Recuar linha para a esquerda", + "lines.insertBefore": "Inserir linha acima", + "lines.insertAfter": "Inserir linha abaixo", + "lines.deleteAllLeft": "Excluir tudo à Esquerda", + "lines.deleteAllRight": "Excluir Tudo à Direita", + "lines.joinLines": "Unir Linhas", + "editor.transpose": "Transpor caracteres ao redor do cursor", + "editor.transformToUppercase": "Transformar para maiúsculas", + "editor.transformToLowercase": "Transformar para minúsculas" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/links/browser/links.i18n.json b/i18n/ptb/src/vs/editor/contrib/links/browser/links.i18n.json new file mode 100644 index 00000000000..64628273f2a --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/links/browser/links.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "links.navigate.mac": "Cmd + clique para seguir o link", + "links.navigate": "Ctrl + clique para seguir o link", + "invalid.url": "Desculpe, falha ao abrir este link porque ele não está bem formatado: {0}", + "missing.url": "Desculpe, falha ao abrir este link porque seu destino está faltando.", + "label": "Abrir link" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/multicursor/common/multicursor.i18n.json b/i18n/ptb/src/vs/editor/contrib/multicursor/common/multicursor.i18n.json new file mode 100644 index 00000000000..583be5b3e5c --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/multicursor/common/multicursor.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mutlicursor.insertAbove": "Inserir cursor acima", + "mutlicursor.insertBelow": "Inserir cursor abaixo", + "mutlicursor.insertAtEndOfEachLineSelected": "Adicionar Cursores ao Final das Linhas" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/parameterHints/browser/parameterHints.i18n.json b/i18n/ptb/src/vs/editor/contrib/parameterHints/browser/parameterHints.i18n.json new file mode 100644 index 00000000000..f0450d3f4de --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/parameterHints/browser/parameterHints.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "parameterHints.trigger.label": "Dicas de parâmetro de gatilho" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.i18n.json b/i18n/ptb/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.i18n.json new file mode 100644 index 00000000000..0f8237adbb3 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint": "{0}, dica" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/quickFix/browser/quickFixCommands.i18n.json b/i18n/ptb/src/vs/editor/contrib/quickFix/browser/quickFixCommands.i18n.json new file mode 100644 index 00000000000..01ae8d7aff8 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/quickFix/browser/quickFixCommands.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickFixWithKb": "Mostrar correções ({0})", + "quickFix": "Mostrar correções", + "quickfix.trigger.label": "Correção Rápida" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referenceSearch.i18n.json b/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referenceSearch.i18n.json new file mode 100644 index 00000000000..9d557535df6 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referenceSearch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "meta.titleReference": "- {0} referências", + "references.action.label": "Localizar Todas as Referências" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesController.i18n.json b/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesController.i18n.json new file mode 100644 index 00000000000..65217d2ace8 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesController.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "labelLoading": "Carregando..." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json b/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json new file mode 100644 index 00000000000..47c3685850e --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "aria.oneReference": "símbolo em {0} na linha {1} e coluna {2}", + "aria.fileReferences.1": "1 símbolo em {0}", + "aria.fileReferences.N": "{0} símbolos em {1}", + "aria.result.0": "Nenhum resultado encontrado", + "aria.result.1": "Encontrado 1 símbolo em {0}", + "aria.result.n1": "Encontrados {0} símbolos em {1}", + "aria.result.nm": "Encontrados {0} símbolos em {1} arquivos" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json b/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json new file mode 100644 index 00000000000..72f61eeaf83 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "referencesFailre": "Falha ao resolver arquivo.", + "referencesCount": "{0} referências", + "referenceCount": "{0} referência", + "missingPreviewMessage": "nenhuma visualização disponível", + "treeAriaLabel": "Referências", + "noResults": "Nenhum resultado", + "peekView.alternateTitle": "Referências", + "peekViewTitleBackground": "Cor de fundo da área de visualização do título.", + "peekViewTitleForeground": "Cor de visualização do título.", + "peekViewTitleInfoForeground": "Cor da visualização de informações do título.", + "peekViewBorder": "Cor das bordas e seta da área de visualização", + "peekViewResultsBackground": "Cor de fundo da área de visualização da lista de resultados.", + "peekViewResultsMatchForeground": "Cor de primeiro plano para nós de linha na lista de resultados visualizados.", + "peekViewResultsFileForeground": "Cor de primeiro plano para nós de arquivos na lista de resultados visualizados.", + "peekViewResultsSelectionBackground": "Cor de fundo da entrada selecionada na visualização da lista de resultados.", + "peekViewResultsSelectionForeground": "Cor da entrada selecionada na visualização da lista de resultados.", + "peekViewEditorBackground": "Cor de fundo da visualização do editor.", + "peekViewEditorGutterBackground": "Cor de fundo da separação na visualização rápida do editor.", + "peekViewResultsMatchHighlight": "Corresponder cor de realce com visualização da lista de resultados.", + "peekViewEditorMatchHighlight": "Corresponder cor de realce com visualização do editor." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/rename/browser/rename.i18n.json b/i18n/ptb/src/vs/editor/contrib/rename/browser/rename.i18n.json new file mode 100644 index 00000000000..a56535f6241 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/rename/browser/rename.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "no result": "Nenhum resultado.", + "aria": "Renomeado '{0}' para '{1}'com sucesso. Resumo: {2}", + "rename.failed": "Desculpe, falha na execução de renomear.", + "rename.label": "Renomear Símbolo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/rename/browser/renameInputField.i18n.json b/i18n/ptb/src/vs/editor/contrib/rename/browser/renameInputField.i18n.json new file mode 100644 index 00000000000..49eba92fa44 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/rename/browser/renameInputField.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "renameAriaLabel": "Renomear entrada. Digite o novo nome e tecle Enter para gravar." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/smartSelect/common/smartSelect.i18n.json b/i18n/ptb/src/vs/editor/contrib/smartSelect/common/smartSelect.i18n.json new file mode 100644 index 00000000000..89319f9a266 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/smartSelect/common/smartSelect.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.grow": "Expandir seleção", + "smartSelect.shrink": "Reduzir seleção" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/suggest/browser/suggestController.i18n.json b/i18n/ptb/src/vs/editor/contrib/suggest/browser/suggestController.i18n.json new file mode 100644 index 00000000000..b064152c8be --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/suggest/browser/suggestController.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "arai.alert.snippet": "Ao aceitar '{0}' foi inserido o seguinte texto: {1}", + "suggest.trigger.label": "Sugestão de gatilho" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/ptb/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json new file mode 100644 index 00000000000..c9da4793d67 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorSuggestWidgetBackground": "Cor de fundo para a ferramenta de sugestão.", + "editorSuggestWidgetBorder": "Cor da borda para a ferramenta de sugestão.", + "editorSuggestWidgetForeground": "Cor de primeiro plano para a ferramenta de sugestão.", + "editorSuggestWidgetSelectedBackground": "Cor de fundo da entrada selecionada da ferramenta de sugestões.", + "editorSuggestWidgetHighlightForeground": "Cor de realce da correspondência na ferramenta de sugestão.", + "readMore": "Ler Mais...{0}", + "suggestionWithDetailsAriaLabel": "{0}, sugestão, tem detalhes", + "suggestionAriaLabel": "{0}, sugestão", + "readLess": "Ler menos... {0}", + "suggestWidget.loading": "Carregando...", + "suggestWidget.noSuggestions": "Nenhuma sugestão.", + "suggestionAriaAccepted": "{0}, aceito", + "ariaCurrentSuggestionWithDetails": "{0}, sugestão, tem detalhes", + "ariaCurrentSuggestion": "{0}, sugestão" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/toggleTabFocusMode/common/toggleTabFocusMode.i18n.json b/i18n/ptb/src/vs/editor/contrib/toggleTabFocusMode/common/toggleTabFocusMode.i18n.json new file mode 100644 index 00000000000..0f3dd068095 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/toggleTabFocusMode/common/toggleTabFocusMode.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggle.tabMovesFocus": "Alterne o uso da tecla Tab para mover o foco" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.i18n.json b/i18n/ptb/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.i18n.json new file mode 100644 index 00000000000..e8556cb38a8 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "wordHighlight": "Cor de fundo de um símbolo durante acesso de leitura, como ao ler uma variável.", + "wordHighlightStrong": "Cor de fundo de um símbolo durante acesso de escrita, como ao escrever uma variável." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/zoneWidget/browser/peekViewWidget.i18n.json b/i18n/ptb/src/vs/editor/contrib/zoneWidget/browser/peekViewWidget.i18n.json new file mode 100644 index 00000000000..41ad7313b7d --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/zoneWidget/browser/peekViewWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.close": "Fechar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/electron-browser/textMate/TMSyntax.i18n.json b/i18n/ptb/src/vs/editor/electron-browser/textMate/TMSyntax.i18n.json new file mode 100644 index 00000000000..dfef3cc47a5 --- /dev/null +++ b/i18n/ptb/src/vs/editor/electron-browser/textMate/TMSyntax.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid.language": "Linguagem desconhecida em `contributes.{0}.language`. Valor fornecido: {1}", + "invalid.scopeName": "Esperada uma string em 'contributes.{0}.scopeName'. Valor informado: {1}", + "invalid.path.0": "Esperada uma string em `contributes.{0}.path`. Valor informado: {1}", + "invalid.injectTo": "Valor inválido em `contributes.{0}.injectTo`. Deve ser uma matriz de nomes de escopo de idioma. Valor fornecido: {1}", + "invalid.embeddedLanguages": "Valor inválido em `contributes.{0}.embeddedLanguages`. Deve ser um objeto de mapeamento do nome do escopo para a linguagem. Valor informado: {1}", + "invalid.path.1": "É esperado que `contributes.{0}.path` ({1}) seja incluído na pasta da extensão ({2}). Isto pode tornar a extensão não portável.", + "no-tm-grammar": "Nenhuma gramática TM registrada para este idioma." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json b/i18n/ptb/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json new file mode 100644 index 00000000000..04aa2bc703f --- /dev/null +++ b/i18n/ptb/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "parseErrors": "Erros parseando {0}: {1}", + "schema.openBracket": "O colchete de abertura de caractere ou sequência de caracteres.", + "schema.closeBracket": "O colchete de fechamento de caractere ou sequência de caracteres.", + "schema.comments": "Define o símbolo dos comentários", + "schema.blockComments": "Define como comentários em bloco são marcados.", + "schema.blockComment.begin": "A sequência de caracteres que inicia um comentário em bloco.", + "schema.blockComment.end": "A sequência de caracteres que termina um comentário de bloco.", + "schema.lineComment": "A sequência de caracteres que inicia um comentário de linha.", + "schema.brackets": "Define os símbolos de colchetes que aumentam ou diminuem a indentação.", + "schema.autoClosingPairs": "Define os pares de colchetes. Quando é introduzido um colchete de abertura, o colchete de fechamento é inserido automaticamente.", + "schema.autoClosingPairs.notIn": "Define uma lista de escopos onde os auto pares são desativados.", + "schema.surroundingPairs": "Define os pares de colchetes que podem ser usados para cercar uma seqüência selecionada.", + "schema.wordPattern": "A definição da palavra para a linguagem.", + "schema.wordPattern.pattern": "O padrão RegExp usado para coincidir com as palavras.", + "schema.wordPattern.flags": "Os sinalizadores RegExp usados para coincidir com as palavras.", + "schema.wordPattern.flags.errorMessage": "Deve corresponder ao padrão `/^([gimuy]+)$/`." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/node/textMate/TMGrammars.i18n.json b/i18n/ptb/src/vs/editor/node/textMate/TMGrammars.i18n.json new file mode 100644 index 00000000000..7707ea3401f --- /dev/null +++ b/i18n/ptb/src/vs/editor/node/textMate/TMGrammars.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "vscode.extension.contributes.grammars": "Contibui aos toquenizadores textmate", + "vscode.extension.contributes.grammars.language": "Identificador da linguagem para qual a sintaxe contribui.", + "vscode.extension.contributes.grammars.scopeName": "Nome do escopo Textmate usado pelo arquivo tmLanguage.", + "vscode.extension.contributes.grammars.path": "Caminho para o arquivo tmLanguage. O caminho é relativo a pasta da extensão e geralmente começa com './syntaxes/'.", + "vscode.extension.contributes.grammars.embeddedLanguages": "Um mapeamento no nome do escopo para o Id da linguagem se esta gramática contenha linguagens embutidas.", + "vscode.extension.contributes.grammars.injectTo": "Lista de nomes de escopos de linguagem aos quais esta gramática é injetada." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/actions/browser/menuItemActionItem.i18n.json b/i18n/ptb/src/vs/platform/actions/browser/menuItemActionItem.i18n.json new file mode 100644 index 00000000000..e64a7d0ed09 --- /dev/null +++ b/i18n/ptb/src/vs/platform/actions/browser/menuItemActionItem.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "titleAndKb": "{0} ({1})" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/ptb/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json new file mode 100644 index 00000000000..a8ef6175a09 --- /dev/null +++ b/i18n/ptb/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -0,0 +1,41 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "requirearray": "os itens de menu devem ser um array", + "requirestring": "a propriedade `{0}` é obrigatória e deve ser do tipo `string`", + "optstring": "a propriedade `{0}` é opcional ou deve ser do tipo `string`", + "vscode.extension.contributes.menuItem.command": "Identificador do comando para ser executado. O comando deve ser declarado na seção de 'Comandos'", + "vscode.extension.contributes.menuItem.alt": "O identificador de um comando alternativo para executar. O comando deve ser declarado na sessão 'Comandos'", + "vscode.extension.contributes.menuItem.when": "Condição, que deve ser verdadeira, para mostrar esse item", + "vscode.extension.contributes.menuItem.group": "Grupo ao qual pertence este comando", + "vscode.extension.contributes.menus": "Contribui itens de menu ao editor", + "menus.commandPalette": "Paleta de comandos", + "menus.editorTitle": "Meno do título editor", + "menus.editorContext": "Mostrar o menu de contexto do editor", + "menus.explorerContext": "Menu no contexto de explorador de arquivos", + "menus.editorTabContext": "Mostrar o menu de contexto do editor", + "menus.debugCallstackContext": "O menu de contexto de pilha de chamadas de depuração", + "menus.scmTitle": "O menu de título do controle de fonte", + "menus.resourceGroupContext": "O menu de contexto do grupo de recursos de controle de fonte", + "menus.resourceStateContext": "O menu de contexto de estado de recursos do controle de fonte", + "nonempty": "Esperado um valor não vazio", + "opticon": "a propriedade '{0}' é opcional ou pode ser do tipo 'string'", + "requireStringOrObject": "a propriedade '{0}' é obrigatória e deve ser do tipo 'string'", + "requirestrings": "a propriedade `{0}` é obrigatória e deve ser do tipo `string`", + "vscode.extension.contributes.commandType.command": "Indentificador de comando para executar", + "vscode.extension.contributes.commandType.title": "Título para o qual o comando é representado na UI", + "vscode.extension.contributes.commandType.category": "(Opcional) Sequência de categoria será agrupada na interface de usuário", + "vscode.extension.contributes.commandType.icon": "(Opcional) Icone utilizado para representar o comando na interface de usuário. Um arquivo ou configuração do tema.", + "vscode.extension.contributes.commandType.icon.light": "Caminho do Ícone quando o tema light for utilizado", + "vscode.extension.contributes.commandType.icon.dark": "Caminho do ícone quando o tema dark for utilizado", + "vscode.extension.contributes.commands": "Contribui comandos à paleta de comandos", + "dup": "Comando '{0}' aparece multiplas vezes na sessão 'comandos'\n", + "menuId.invalid": "'{0}' nao é um identificador de menu válido ", + "missing.command": "Identificador do comando para ser executado. O comando deve ser declarado na seção de 'Comandos'", + "missing.altCommand": "Referências ao item de menu no alt-command '{0}' qual nao é definido na sessão 'comandos'", + "dupe.command": "Itens de referencias do mesmo comando como padrão e alt-command", + "nosupport.altCommand": "Desculpe, mas atualmente somente o groupo 'navegação' do menu 'editor/título' suporta alt-commands" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/configuration/common/configurationRegistry.i18n.json b/i18n/ptb/src/vs/platform/configuration/common/configurationRegistry.i18n.json new file mode 100644 index 00000000000..928f36b2ee4 --- /dev/null +++ b/i18n/ptb/src/vs/platform/configuration/common/configurationRegistry.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultConfigurations.title": "Sobreposições da Configuração Padrão", + "overrideSettings.description": "Definir que configurações do editor sejam substituídas para idioma {0}.", + "overrideSettings.defaultDescription": "Definir que configurações do editor sejam substituídas para um idioma.", + "vscode.extension.contributes.configuration": "Contribui às definições de configuração.", + "vscode.extension.contributes.configuration.title": "Um resumo das configurações. Este rótulo será usado no arquivo de configurações como um comentário de separação.", + "vscode.extension.contributes.configuration.properties": "Descrição das propriedades de configuração.", + "config.property.languageDefault": "Não é possível registrar '{0}'. Isto corresponde a propriedade padrão '\\\\[.*\\\\]$' para descrever configurações do editor específico de linguagem. Use a contribuição 'configurationDefaults'.", + "config.property.duplicate": "Não é possível registrar '{0}'. Esta propriedade já está registrada.", + "invalid.properties": "'configuration.properties' deve ser um objeto", + "invalid.type": "Se definido, 'configuration.type' deve ser do tipo 'object'", + "invalid.title": "'configuration.title' deve ser um string", + "vscode.extension.contributes.defaultConfiguration": "Contribui às definições de configuração padrão do editor por linguagem." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json b/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json new file mode 100644 index 00000000000..4cec19113d2 --- /dev/null +++ b/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "gotoValidation": "Argumentos no modo '--goto' deve ser no formato de 'Arquivo(:LINHA(:CARACTERE))'.", + "diff": "Abrir um editor de diff. Requer passar dois caminhos de arquivo como argumentos.", + "goto": "Abra o arquivo no caminho, na linha e caractere (addcionar:linha[:caractere] para o caminho).", + "locale": "Para localização utilize (ex. en-US ou zh-TW).", + "newWindow": "Força uma nova instância do Código.", + "performance": "Comece com o 'Desenvolvedor: Desempenho de inicialização' comando habilitado.", + "prof-startup": "Rodar o CPU profiler durante a inicialização", + "reuseWindow": "Forçar a abertura de um arquivo ou pasta na última janela ativa", + "userDataDir": "Especifica o diretório que os dados do usuário serão mantidos, útil quando estiver rodando como root.", + "verbose": "Imprimir a saída detalhada (Implica -- esperar).", + "wait": "Aguarde a janela ser fechada antes de retornar.", + "extensionHomePath": "Defina o caminho raíz para as extensões.", + "listExtensions": "Lista de extensões instaladas", + "showVersions": "Exibir versões de extensões instaladas, quando estiver usando --list-extension", + "installExtension": "Instala uma extensão.", + "uninstallExtension": "Desinstala uma extensão.", + "experimentalApis": "Permite recursos de api propostos para uma extensão.", + "disableExtensions": "Desabilita todas as extensões instaladas.", + "disableGPU": "Desabilita aceleração de hardware da GPU.", + "version": "Versão de impressão", + "help": "Uso de impressão.", + "usage": "Uso", + "options": "opções", + "paths": "caminhos", + "optionsUpperCase": "Opções" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/extensionManagement/common/extensionEnablementService.i18n.json b/i18n/ptb/src/vs/platform/extensionManagement/common/extensionEnablementService.i18n.json new file mode 100644 index 00000000000..52f37b66ccd --- /dev/null +++ b/i18n/ptb/src/vs/platform/extensionManagement/common/extensionEnablementService.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noWorkspace": "Não há espaço de trabalho." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/extensionManagement/common/extensionManagement.i18n.json b/i18n/ptb/src/vs/platform/extensionManagement/common/extensionManagement.i18n.json new file mode 100644 index 00000000000..33ea8261326 --- /dev/null +++ b/i18n/ptb/src/vs/platform/extensionManagement/common/extensionManagement.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "extensions": "Extensões", + "preferences": "Preferências" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json b/i18n/ptb/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json new file mode 100644 index 00000000000..76dc4cf48f3 --- /dev/null +++ b/i18n/ptb/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "notFound": "Extensão não encontrada", + "noCompatible": "Não foi possível econtrar uma versão de {0} com esta versão do Code." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json new file mode 100644 index 00000000000..a6c5a37ab05 --- /dev/null +++ b/i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalidManifest": "Extensão inválida: pacote.json nao é um arquivo JSON válido", + "restartCode": "Por favor reinicie Code antes de reinstalar {0}.", + "installDependeciesConfirmation": "A instalação de '{0}' também inclui suas dependências. Gostaria de continuar?", + "install": "Sim", + "doNotInstall": "Não", + "uninstallDependeciesConfirmation": "Gostaria de desinstalar '{0}' somente, ou suas dependências também?", + "uninstallOnly": "Apenas", + "uninstallAll": "Todos", + "cancel": "Cancelar", + "uninstallConfirmation": "Tem certeza que deseja desinstalar '{0}'?", + "ok": "OK", + "singleDependentError": "Não foi possível desinstalar a extensão '{0}'. A extensão '{1}' depende dela.", + "twoDependentsError": "Não foi possível desinstalar a extensão '{0}'. As extensões '{1}' e '{2}' dependem dela.", + "multipleDependentsError": "Não foi possível desinstalar a extensão '{0}'. As extensões '{1}' e '{2}' e outras dependem dela.", + "notExists": "Não foi possível encontrar a extensão" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/extensions/common/abstractExtensionService.i18n.json b/i18n/ptb/src/vs/platform/extensions/common/abstractExtensionService.i18n.json new file mode 100644 index 00000000000..d521fce97ff --- /dev/null +++ b/i18n/ptb/src/vs/platform/extensions/common/abstractExtensionService.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unknownDep": "Extensão '{1}' falhou ao ativar. Motivo: dependência desconhecida '{0}'.", + "failedDep1": "Extensão '{1}' falhou ao ativar. Motivo: a dependência '{0}' falhou ao ativar.", + "failedDep2": "Extensão '{0}' falhou ao ativar. Motivo: mais de 10 níveis de dependências (provavelmente um laço de dependência).", + "activationError": "Ativação da extensão `{0}` falhou: {1}." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/extensions/common/extensionsRegistry.i18n.json b/i18n/ptb/src/vs/platform/extensions/common/extensionsRegistry.i18n.json new file mode 100644 index 00000000000..649e13b03b1 --- /dev/null +++ b/i18n/ptb/src/vs/platform/extensions/common/extensionsRegistry.i18n.json @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "vscode.extension.engines.vscode": "Para extensões do VS Code, especifica a versão do VS Code que a extensão é compatível. Não pode ser *. Por exemplo: ^0.10.5 indica compatibilidade com uma versão mínima de 0.10.5 para o VS Code.", + "vscode.extension.publisher": "O editor da extensão do VS Code.", + "vscode.extension.displayName": "O nome de exibição para a extensão do VS Code.", + "vscode.extension.categories": "As categorias usadas pela galeria do VS Code para categorizar a extensão.", + "vscode.extension.galleryBanner": "Banner usado na loja VS Code.", + "vscode.extension.galleryBanner.color": "A cor do banner usado no cabeçalho de página da loja VS Code.", + "vscode.extension.galleryBanner.theme": "A cor do tema usada para o fonte usado no banner.", + "vscode.extension.contributes": "Todas as contribuições da extensão VS Code representadas por este pacote.", + "vscode.extension.preview": "Configura a extensão para ser marcada como pré-visualização na Loja.", + "vscode.extension.activationEvents": "Eventos de ativação para a extensão VS Code.", + "vscode.extension.badges": "Matriz de emblemas a mostrar na barra lateral da página da extensão na Loja.", + "vscode.extension.badges.url": "URL da imagem do emblema.", + "vscode.extension.badges.href": "Link do emblema.", + "vscode.extension.badges.description": "Descrição do emblema.", + "vscode.extension.extensionDependencies": "Dependências para outras extensões. O identificador de uma extensão sempre é ${publisher}. ${nome}. Por exemplo: vscode.csharp.", + "vscode.extension.scripts.prepublish": "Script a ser executado antes do pacote ser publicado como uma extensão VS Code.", + "vscode.extension.icon": "O caminho para um ícone de 128x128 pixels." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/extensions/node/extensionValidator.i18n.json b/i18n/ptb/src/vs/platform/extensions/node/extensionValidator.i18n.json new file mode 100644 index 00000000000..fe37dd1820f --- /dev/null +++ b/i18n/ptb/src/vs/platform/extensions/node/extensionValidator.i18n.json @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "versionSyntax": "Não foi possível analisar o valor de 'engines.vscode' {0}. Por favor, utilize, por exemplo: ^ 0.10.0, ^ 1.2.3, ^ 0.11.0, ^ 0.10.x, etc.", + "versionSpecificity1": "Versão especificada em 'engines.vscode' ({0}) não é específica o suficiente. Para versões do vscode anteriores a 1.0.0, por favor defina no mínimo a versão principal e secundária desejada. Por exemplo, ^ 0.10.0, 0.10.x, 0.11.0, etc.", + "versionSpecificity2": "Versão especificada em 'engines.vscode' ({0}) não é específica o suficiente. Para as versões do vscode posteriores a 1.0.0, por favor defina no mínimo a versão principal do desejado. Por exemplo, ^ 1.10.0, 1.10.x 1. XX, 2.x.x, etc.", + "versionMismatch": "Extensão não é compatível com Code {0}. A extensão requer: {1}.", + "extensionDescription.empty": "Descrição de extensão vazia obtida", + "extensionDescription.publisher": "a propriedade `{0}` é obrigatória e deve ser do tipo `string`", + "extensionDescription.name": "a propriedade `{0}` é obrigatória e deve ser do tipo `string`", + "extensionDescription.version": "a propriedade `{0}` é obrigatória e deve ser do tipo `string`", + "extensionDescription.engines": "a propriedade `{0}` é obrigatória e deve ser do tipo `object`", + "extensionDescription.engines.vscode": "a propriedade `{0}` é obrigatória e deve ser do tipo `string`", + "extensionDescription.extensionDependencies": "a propriedade `{0}` pode ser omitida ou deve ser do tipo `string[]`", + "extensionDescription.activationEvents1": "a propriedade `{0}` pode ser omitida ou deve ser do tipo `string[]`", + "extensionDescription.activationEvents2": "Propriedades '{0}' e '{1}' devem ser especificadas ou devem ambas ser omitidas", + "extensionDescription.main1": "a propriedade `{0}` é opcional ou pode ser do tipo `string`", + "extensionDescription.main2": "Esperado 'main' ({0}) ser incluído dentro da pasta da extensão ({1}). Isto pode fazer a extensão não-portável.", + "extensionDescription.main3": "propriedades '{0}' e '{1}' devem ser especificadas ou devem ambas ser omitidas", + "notSemver": "Versão da extensão não é compatível a semver" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json b/i18n/ptb/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json new file mode 100644 index 00000000000..d252527ac15 --- /dev/null +++ b/i18n/ptb/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "integrity.ok": "OK", + "integrity.dontShowAgain": "Não mostrar novamente", + "integrity.moreInfo": "Mais informações", + "integrity.prompt": "Sua instalação de {0} parece estar corrompida. Favor reinstalar." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/jsonschemas/common/jsonValidationExtensionPoint.i18n.json b/i18n/ptb/src/vs/platform/jsonschemas/common/jsonValidationExtensionPoint.i18n.json new file mode 100644 index 00000000000..47ff1ba6bad --- /dev/null +++ b/i18n/ptb/src/vs/platform/jsonschemas/common/jsonValidationExtensionPoint.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "contributes.jsonValidation": "Contribui à configuração do schema json.", + "contributes.jsonValidation.fileMatch": "O padrão de arquivo a corresponder, por exemplo \"package.json\" ou \"*.launch\".", + "contributes.jsonValidation.url": "Um esquema de URL ('http:', 'https:') ou caminho relativo à pasta de extensão('./').", + "invalid.jsonValidation": "'configuration.jsonValidation' deve ser uma matriz", + "invalid.fileMatch": "'configuration.jsonValidation.fileMatch' deve ser definido", + "invalid.url": "'configuration.jsonValidation.url' deve ser uma URL ou caminho relativo", + "invalid.url.fileschema": "'configuration.jsonValidation.url' é uma URL relativa inválida: {0}", + "invalid.url.schema": "'configuration.jsonValidation.url' deve começar com ' http:', ' https: 'ou'. /' para os esquemas de referência localizados na extensão" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/keybinding/common/abstractKeybindingService.i18n.json b/i18n/ptb/src/vs/platform/keybinding/common/abstractKeybindingService.i18n.json new file mode 100644 index 00000000000..59961c4476a --- /dev/null +++ b/i18n/ptb/src/vs/platform/keybinding/common/abstractKeybindingService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "first.chord": "({0}) foi pressionado. Aguardando segunda tecla de pressionamento simultâneo...", + "missing.chord": "A combinação de chave ({0}, {1}) não é um comando." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/keybinding/common/keybindingLabels.i18n.json b/i18n/ptb/src/vs/platform/keybinding/common/keybindingLabels.i18n.json new file mode 100644 index 00000000000..bf2baf83906 --- /dev/null +++ b/i18n/ptb/src/vs/platform/keybinding/common/keybindingLabels.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ctrlKey": "Ctrl", + "shiftKey": "Shift", + "altKey": "Alt", + "windowsKey": "Windows", + "ctrlKey.long": "Controle", + "shiftKey.long": "Shift", + "altKey.long": "Alt", + "cmdKey.long": "Comando", + "windowsKey.long": "Windows" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/ptb/src/vs/platform/markers/common/problemMatcher.i18n.json new file mode 100644 index 00000000000..29df9e58b2b --- /dev/null +++ b/i18n/ptb/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -0,0 +1,61 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ProblemPatternParser.loopProperty.notLast": "A propriedade loop só é suportada na última linha correspondente.", + "ProblemPatternParser.problemPattern.missingRegExp": "Está faltando uma expressão regular a problema padrão.", + "ProblemPatternParser.problemPattern.missingProperty": "O problema padrão é inválido. Ele deve ter ao menos um arquivo, mensagem e linha ou local de grupo de correspondência.", + "ProblemPatternParser.invalidRegexp": "Erro: a cadeia de caracteres {0} não é uma expressão regular válida.\n", + "ProblemPatternSchema.regexp": "A expressão regular para procurar um erro, aviso ou informação na saída.", + "ProblemPatternSchema.file": "O índice do grupo de correspondência do arquivo. Se omitido, será usado 1.", + "ProblemPatternSchema.location": "O índice de grupo de correspondência da localização do problema. Padrões de localização válidos são: (linha), (linha, coluna) e (startLine, startColumn, endLine, endColumn). Se omitido (linha, coluna) é assumido.", + "ProblemPatternSchema.line": "O índice de grupo de correspondência da linha do problema. O padrão é 2", + "ProblemPatternSchema.column": "O índice de grupo de correspondência de caractere da linha do problema. O padrão é 3", + "ProblemPatternSchema.endLine": "O índice de grupo de correspondência de linha final do problema. O padrão é indefinido", + "ProblemPatternSchema.endColumn": "O índice de grupo de correspondência de caráter final de linha do problema. O padrão é indefinido", + "ProblemPatternSchema.severity": "O índice de grupo de correspondência da gravidade do problema. O padrão é indefinido", + "ProblemPatternSchema.code": "O índice de grupo de correspondência do código do problema. O padrão é indefinido", + "ProblemPatternSchema.message": "O índice de grupo de correspondência da mensagem. Se omitido o padrão é 4 se o local for especificado. Caso contrário o padrão é 5.", + "ProblemPatternSchema.loop": "Em um loop de correspondência multi linha indica se este padrão é executado em um loop enquanto houver correspondências. Somente pode ser especificado no último padrão em um padrão de linha múltiplas.", + "NamedProblemPatternSchema.name": "O nome do modelo de problema.", + "NamedMultiLineProblemPatternSchema.name": "O nome do modelo de problema multi-linhas.", + "NamedMultiLineProblemPatternSchema.patterns": "Os padrões atuais.", + "ProblemPatternExtPoint": "Contribui aos modelos de problema", + "ProblemPatternRegistry.error": "Modelo de problema inválido. O modelo será ignorado.", + "ProblemMatcherParser.noProblemMatcher": "Erro: a descrição não pode ser convertida em uma correspondência de problema:\n{0}\n\n", + "ProblemMatcherParser.noProblemPattern": "Erro: a descrição nao define um padrão de problema válido: {0}\n", + "ProblemMatcherParser.noOwner": "Erro: a descriçao não define um proprietário:\n{0}\n", + "ProblemMatcherParser.noFileLocation": "Erro: a descrição não define uma localização de arquivo:\n{0}\n", + "ProblemMatcherParser.unknownSeverity": "Info: severidade {0} desconhecida. Valores válidos são erro, aviso e info.\n", + "ProblemMatcherParser.noDefinedPatter": "Erro: o padrão com o identificador {0} não existe.", + "ProblemMatcherParser.noIdentifier": "Erro: a propriedade padrão se refere a um identificador vazio.", + "ProblemMatcherParser.noValidIdentifier": "Erro: a propriedade padrão {0} não é uma variável de padrões válida.", + "ProblemMatcherParser.problemPattern.watchingMatcher": "Um problema de correspondência deve obrigatoriamente definir padrão inicial e um padrão final para monitoramento.", + "ProblemMatcherParser.invalidRegexp": "Erro: a cadeia de caracteres {0} não é uma expressão regular válida.\n", + "WatchingPatternSchema.regexp": "A expressão regular para detectar o início ou o fim de uma tarefa em segundo plano.", + "WatchingPatternSchema.file": "O índice do grupo de correspondência do arquivo. Pode ser omitido.", + "PatternTypeSchema.name": "O nome de um padrão pré-definido ou contribuído.", + "PatternTypeSchema.description": "Um padrão de problema ou o nome de um padrão de problema pré-definido ou contribuído. Pode ser omitido se base for especificada.", + "ProblemMatcherSchema.base": "O nome de uma correspondência de problema base a ser utilizado.", + "ProblemMatcherSchema.owner": "O proprietário de um problema dentro do código. Pode ser omitido se base for especificada. Default para 'externo' se omitido e base não for especificada.", + "ProblemMatcherSchema.severity": "A severidade padrão para captura de problemas. É utilizada se o padrão não definir um grupo correspondente para severidade.", + "ProblemMatcherSchema.applyTo": "Controla se um problema reportado em um documento de texto é aplicado somente para aberto, fechado ou todos os documentos.", + "ProblemMatcherSchema.fileLocation": "Define como os nomes de arquivos reportados em um padrão de problema devem ser interpretados.", + "ProblemMatcherSchema.background": "Padrões para monitorar o início e o término de um pesquisador ativo em uma tarefa em segundo plano.", + "ProblemMatcherSchema.background.activeOnStart": "Se configurado para verdadeiro, o monitor em segundo plano está em modo ativo quando a tarefa inicia. Isto é igual a emissão de uma linha que corresponde ao beginPattern", + "ProblemMatcherSchema.background.beginsPattern": "Se houver correspondência na saída o início de uma tarefa em segundo plano é sinalizada.", + "ProblemMatcherSchema.background.endsPattern": "Se houver correspondência na saída o final de uma tarefa em segundo plano é sinalizada.", + "ProblemMatcherSchema.watching.deprecated": "A propriedade watching foi descontinuada. Use background no lugar dela.", + "ProblemMatcherSchema.watching": "Padrões para monitorar o início e o término de um pesquisador observando.", + "ProblemMatcherSchema.watching.activeOnStart": "Se configurado para verdadeiro, o monitoramento está em modo ativo quando a tarefa inicia. Isto é igual a emissão de uma linha que corresponde ao beginPattern", + "ProblemMatcherSchema.watching.beginsPattern": "Se houver correspondência na saída o início de uma tarefa observada é sinalizada.", + "ProblemMatcherSchema.watching.endsPattern": "Se houver correspondência na saída o final de uma tarefa observada é sinalizada.", + "LegacyProblemMatcherSchema.watchedBegin.deprecated": "Esta propriedade está descontinuada. Ao invés, use a propriedade de observação.", + "LegacyProblemMatcherSchema.watchedBegin": "Uma expressão regular sinalizando que uma tarefa observada é ativada através da observação.", + "LegacyProblemMatcherSchema.watchedEnd.deprecated": "Esta propriedade está descontinuada. Ao invés, use a propriedade de observação.", + "LegacyProblemMatcherSchema.watchedEnd": "Uma expressão regular sinalizando que uma tarefa observada terminou a execução.", + "NamedProblemMatcherSchema.name": "O nome do correspondente do problema.", + "ProblemMatcherExtPoint": "Contribui aos correspondentes de problema" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/message/common/message.i18n.json b/i18n/ptb/src/vs/platform/message/common/message.i18n.json new file mode 100644 index 00000000000..620c63edd07 --- /dev/null +++ b/i18n/ptb/src/vs/platform/message/common/message.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "close": "Fechar", + "later": "Mais tarde", + "cancel": "Cancelar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/request/node/request.i18n.json b/i18n/ptb/src/vs/platform/request/node/request.i18n.json new file mode 100644 index 00000000000..1f7fd75e5aa --- /dev/null +++ b/i18n/ptb/src/vs/platform/request/node/request.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "httpConfigurationTitle": "HTTP", + "proxy": "As configurações de proxy a usar. Se não forem configuradas, serão obtidas das variáveis de ambiente http_proxy e https_proxy", + "strictSSL": "Se o certificado do servidor de proxy deve ser verificado contra a lista de autoridades de certificação fornecida.", + "proxyAuthorization": "O valor para enviar como o cabeçalho de 'autorização Proxy' para cada solicitação de rede." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/telemetry/common/telemetryService.i18n.json b/i18n/ptb/src/vs/platform/telemetry/common/telemetryService.i18n.json new file mode 100644 index 00000000000..a1d67b82fb7 --- /dev/null +++ b/i18n/ptb/src/vs/platform/telemetry/common/telemetryService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "telemetryConfigurationTitle": "Telemetria", + "telemetry.enableTelemetry": "Permitir que os dados de uso e erros sejam enviados à Microsoft." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json new file mode 100644 index 00000000000..64d68304f98 --- /dev/null +++ b/i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -0,0 +1,78 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid.color": "Formato inválido de cor. Use #RGB, #RGBA, #RRGGBB ou #RRGGBBAA", + "schema.colors": "Cores usadas no workbench.", + "foreground": "Cor de primeiro plano geral. Essa cor é só usada se não for substituída por um componente.", + "errorForeground": "Cor de primeiro plano geral para mensagens de erro. Essa cor é só usada se não for substituída por um componente.", + "descriptionForeground": "Cor de primeiro plano para a descrição do texto provendo informação adicional, por exemplo para uma etiqueta.", + "focusBorder": "Cor geral da borda para elementos focalizados. Essa cor é usada somente se não for substituída por um componente.", + "contrastBorder": "Uma borda extra em torno de elementos para separá-los dos outros de maior contraste.", + "activeContrastBorder": "Uma borda extra em torno de elementos ativos para separá-los dos outros de maior contraste.", + "selectionBackground": "A cor de fundo das seleções de texto na bancada de trabalho (por exemplo, para campos de entrada ou áreas de texto). Note que isto não se aplica a seleções dentro do editor e do terminal.", + "textSeparatorForeground": "Cor para separadores de texto.", + "textLinkForeground": "Cor de primeiro plano para links no texto.", + "textLinkActiveForeground": "Cor de primeiro plano para links ativos no texto.", + "textPreformatForeground": "Cor de primeiro plano para segmentos de texto pré-formatados.", + "textBlockQuoteBackground": "Cor de fundo para blocos de citações no texto.", + "textBlockQuoteBorder": "Cor da borda para blocos de citações no texto.", + "textCodeBlockBackground": "Cor de fundo para blocos de código no texto.", + "widgetShadow": "Cor de sombra ferramentas como localizar/substituir dentro do editor.", + "inputBoxBackground": "Cor de fundo da caixa de entrada.", + "inputBoxForeground": "Cor de primeiro plano da caixa de entrada.", + "inputBoxBorder": "Borda da caixa de entrada.", + "inputBoxActiveOptionBorder": "Cor da borda das opções ativas em campos de entrada.", + "inputPlaceholderForeground": "Cor de primeiro plano da caixa de entrada para o texto de espaço reservado.", + "inputValidationInfoBackground": "Cor de fundo de validação de entrada para a severidade de informações.", + "inputValidationInfoBorder": "Cor da borda de validação de entrada para a severidade de informações.", + "inputValidationWarningBackground": "Cor de fundo de validação de entrada para avisos.", + "inputValidationWarningBorder": "Cor da borda de validação para a severidade de avisos.", + "inputValidationErrorBackground": "Cor de fundo de validação de entrada para a severidade do erro.", + "inputValidationErrorBorder": "Cor da borda de validação de entrada para a severidade do erro.", + "dropdownBackground": "Cor de fundo do menu suspenso.", + "dropdownForeground": "Cor de primeiro plano do menu suspenso.", + "dropdownBorder": "Borda do menu suspenso.", + "listFocusBackground": "Cor de fundo para o item focalizado de Lista/árvore quando a lista/árvore está ativa. Uma árvore/lista de ativa tem o foco do teclado, uma inativa não.", + "listFocusForeground": "Cor de fundo da Lista/árvore para o item focalizado quando a lista/árvore está ativa. Uma árvore/lista ativa tem o foco do teclado, uma inativa não.", + "listActiveSelectionBackground": "Cor de fundo para o item selecionado de Lista/árvore quando a lista/árvore está ativa. Uma lista/árvore ativa tem o foco do teclado, uma inativa não.", + "listActiveSelectionForeground": "Cor de primeiro plano para o item selecionado de Lista/árvore quando a lista/árvore está ativa. Uma lista/árvore ativa tem o foco do teclado, uma inativa não.", + "listInactiveSelectionBackground": "Cor de fundo para o item selecionado de Lista/árvore quando a lista/árvore está inativa. Uma lista/árvore ativa tem o foco do teclado, uma inativa não.", + "listInactiveSelectionForeground": "Cor de primeiro plano para Lista/árvore para o item selecionado quando a lista/árvore está inativa. Uma árvore/lista ativa tem o foco do teclado, um inativo não.", + "listHoverBackground": "Cor de fundo de Lista/árvore quando pairando sobre itens usando o mouse.", + "listHoverForeground": "Primeiro plano da Lista/Árvoce quando passar sobre itens usando o mouse.", + "listDropBackground": "Cor de fundo ao arrastar e soltar de Lista/árvore quando movendo itens usando o mouse.", + "highlight": "Cor de primeiro plano de Lista/árvore de destaques de correspondências ao pesquisar na árvore/lista.", + "pickerGroupForeground": "Seletor rápido de cor para rótulos de agrupamento.", + "pickerGroupBorder": "Seletor rápido de cor para bordas de agrupamentos.", + "buttonForeground": "Cor de primeiro plano do botão.", + "buttonBackground": "Cor de fundo do botão.", + "buttonHoverBackground": "Cor de fundo de botão quando flutuar sobre ele.", + "badgeBackground": "Cor de fundo do distintivo. Distintivos são rótulos de pequenas informações, por exemplo, para a contagem de resultados de pesquisa.", + "badgeForeground": "Cor de primeiro plano do distintivo. Distintivos são rótulos de pequenas informações, por exemplo, para a contagem de resultados de pesquisa.", + "scrollbarShadow": "Sombra da barra de rolagem para indicar que a visualização está sendo rolada.", + "scrollbarSliderBackground": "Cor de fundo do controle deslizante.", + "scrollbarSliderHoverBackground": "Cor de fundo de controle deslizante quando estiver flutuando sobre ele.", + "scrollbarSliderActiveBackground": "Cor de fundo de controle deslizante quando ativo.", + "progressBarBackground": "Cor de fundo da barra de progresso que pode ser mostrada em operações de execução demorada.", + "editorBackground": "Cor de plano de fundo do editor.", + "editorForeground": "Cor de primeiro plano padrão do editor.", + "editorWidgetBackground": "Cor de plano de fundo das ferramentas de edição, como pesquisar/substituir.", + "editorWidgetBorder": "Cor da borda da ferramenta editor.", + "editorSelection": "Cor de seleção do editor.", + "editorInactiveSelection": "Cor de seleção em um editor inativo.", + "editorSelectionHighlight": "Cor de regiões com o mesmo conteúdo da seleção.", + "editorFindMatch": "Cor da correspondência de pesquisa atual.", + "findMatchHighlight": "Cor dos outros resultados de pesquisa.", + "findRangeHighlight": "Cor da faixa que limita a pesquisa.", + "hoverHighlight": "Realçar abaixo da palavra onde é mostrado item flutuante", + "hoverBackground": "Cor de fundo para o item flutuante do editor", + "hoverBorder": "Cor da borda para o item flutuante do editor.", + "activeLinkForeground": "Cor dos links ativos.", + "diffEditorInserted": "Cor de fundo para texto que foi inserido.", + "diffEditorRemoved": "Cor de fundo para texto que foi removido.", + "diffEditorInsertedOutline": "Cor de contorno para o texto que foi inserido.", + "diffEditorRemovedOutline": "Cor de contorno para o texto que foi removido." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json new file mode 100644 index 00000000000..d45294dd317 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "overwritingExtension": "Sobrescrevendo extensão {0} por {1}.", + "extensionUnderDevelopment": "Carregando extensão de desenvolvimento em {0}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json new file mode 100644 index 00000000000..0feb87677bb --- /dev/null +++ b/i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "close": "Fechar", + "cancel": "Cancelar", + "ok": "OK" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/api/node/extHostDiagnostics.i18n.json b/i18n/ptb/src/vs/workbench/api/node/extHostDiagnostics.i18n.json new file mode 100644 index 00000000000..867922ab8d2 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/api/node/extHostDiagnostics.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "limitHit": "Não apresentando {0} erros e avisos a mais." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/ptb/src/vs/workbench/api/node/extHostTreeViews.i18n.json new file mode 100644 index 00000000000..d5ca67a9353 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "treeView.notRegistered": "Nenhuma visualização de árvore com id '{0}' registrado.", + "treeItem.notFound": "Nenhum item de árvore com id '{0}' encontrado.", + "treeView.duplicateElement": "Elemento {0} já está registrado" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/actions/configureLocale.i18n.json b/i18n/ptb/src/vs/workbench/browser/actions/configureLocale.i18n.json new file mode 100644 index 00000000000..80686b2c898 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/actions/configureLocale.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "configureLocale": "Configurar Idioma", + "displayLanguage": "Define o idioma de exibição do VSCode.", + "doc": "Veja {0} para obter uma lista dos idiomas suportados.", + "restart": "Modificar o valor requer reinicialização do VSCode.", + "fail.createSettings": "Não foi possível criar '{0}' ({1}).", + "JsonSchema.locale": "O idioma da interface do usuário a ser usada." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/actions/fileActions.i18n.json b/i18n/ptb/src/vs/workbench/browser/actions/fileActions.i18n.json new file mode 100644 index 00000000000..9da2e4e11c7 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/actions/fileActions.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openFolder": "Abrir Pasta...", + "openFileFolder": "Abrir..." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/actions/toggleActivityBarVisibility.i18n.json b/i18n/ptb/src/vs/workbench/browser/actions/toggleActivityBarVisibility.i18n.json new file mode 100644 index 00000000000..02e74f2918f --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/actions/toggleActivityBarVisibility.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleActivityBar": "Alternar Visibilidade da Barra de Atividades", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/actions/toggleEditorLayout.i18n.json b/i18n/ptb/src/vs/workbench/browser/actions/toggleEditorLayout.i18n.json new file mode 100644 index 00000000000..4cdb847aaca --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/actions/toggleEditorLayout.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleEditorGroupLayout": "Alternar Layout Vertical/Horizontal do Grupo de Editor", + "horizontalLayout": "Layout do Grupo de Editor Horizontal", + "verticalLayout": "Layout do Grupo de Editor Vertical", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/actions/toggleSidebarPosition.i18n.json b/i18n/ptb/src/vs/workbench/browser/actions/toggleSidebarPosition.i18n.json new file mode 100644 index 00000000000..ee4fc530361 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/actions/toggleSidebarPosition.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleLocation": "Alternar Localização da Barra Lateral", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/actions/toggleSidebarVisibility.i18n.json b/i18n/ptb/src/vs/workbench/browser/actions/toggleSidebarVisibility.i18n.json new file mode 100644 index 00000000000..5143e35479c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/actions/toggleSidebarVisibility.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleSidebar": "Alternar Localização da Barra Lateral", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/actions/toggleStatusbarVisibility.i18n.json b/i18n/ptb/src/vs/workbench/browser/actions/toggleStatusbarVisibility.i18n.json new file mode 100644 index 00000000000..5376fb36c3a --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/actions/toggleStatusbarVisibility.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleStatusbar": "Alternar Visibilidade da Barra de Status", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/actions/toggleZenMode.i18n.json b/i18n/ptb/src/vs/workbench/browser/actions/toggleZenMode.i18n.json new file mode 100644 index 00000000000..b0a635982f2 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/actions/toggleZenMode.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleZenMode": "Alternar Modo Zen", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json new file mode 100644 index 00000000000..8dab311a65f --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "removeFromActivityBar": "Remover da Barra de Atividades", + "keepInActivityBar": "Manter na Barra de Atividades", + "titleKeybinding": "{0} ({1})", + "additionalViews": "Visualizações Adicionais", + "numberBadge": "{0} ({1})", + "manageExtension": "Gerenciar Extensão", + "toggle": "Alternar Visualização Fixa" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/activitybar/activitybarPart.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/activitybar/activitybarPart.i18n.json new file mode 100644 index 00000000000..5f8a7bb47de --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/activitybar/activitybarPart.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hideActivitBar": "Ocultar a Barra de Atividades", + "activityBarAriaLabel": "Chave do Modo de exibição Ativo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/compositePart.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/compositePart.i18n.json new file mode 100644 index 00000000000..e12e6d4b90e --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/compositePart.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ariaCompositeToolbarLabel": "{0} ações ", + "titleTooltip": "{0} ({1})" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/binaryDiffEditor.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/binaryDiffEditor.i18n.json new file mode 100644 index 00000000000..a38af02d663 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/binaryDiffEditor.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "metadataDiff": "{0} ↔ {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/binaryEditor.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/binaryEditor.i18n.json new file mode 100644 index 00000000000..53321246ac7 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/binaryEditor.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "binaryEditor": "Visualizador binário" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editor.contribution.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editor.contribution.i18n.json new file mode 100644 index 00000000000..dbfae18a9bf --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editor.contribution.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "textEditor": "Editor de texto", + "textDiffEditor": "Editor de Diferentes Textos", + "binaryDiffEditor": "Editor de Diferença Binária", + "sideBySideEditor": "Editor Lado a lado", + "groupOnePicker": "Mostrar editores no primeiro grupo", + "groupTwoPicker": "Mostrar editores no segundo grupo", + "groupThreePicker": "Mostrar editores no terceiro grupo", + "allEditorsPicker": "Mostrar todos editores abertos", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorActions.i18n.json new file mode 100644 index 00000000000..ae6f9ae84b7 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -0,0 +1,55 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "splitEditor": "Dividir editor", + "joinTwoGroups": "Juntar editores de dois grupos", + "navigateEditorGroups": "Navegar entre grupos de editores", + "focusActiveEditorGroup": "Focalizar grupo de editores ativo", + "focusFirstEditorGroup": "Focalizar o primeiro grupo de editores", + "focusSecondEditorGroup": "Focalizar o segundo grupo de editores", + "focusThirdEditorGroup": "Focalizar o terceiro grupo de editores", + "focusPreviousGroup": "Focalizar grupo anterior", + "focusNextGroup": "Focalizar próximo grupo", + "openToSide": "Aberto para o lado", + "closeEditor": "Fechar editor", + "revertAndCloseActiveEditor": "Reverter e fechar editor", + "closeEditorsToTheLeft": "Fechar editores à esquerda ", + "closeEditorsToTheRight": "Fechar editores à direita", + "closeAllEditors": "Fechar todos editores", + "closeEditorsInOtherGroups": "Fechar editores nos outros grupos", + "closeOtherEditorsInGroup": "Fechar outros editores", + "closeEditorsInGroup": "Fechar todos editores no grupo", + "moveActiveGroupLeft": "Mover grupo de editores para esquerda", + "moveActiveGroupRight": "Mover grupo de editores para direita", + "minimizeOtherEditorGroups": "Minimizar outros grupos de editores", + "evenEditorGroups": "Igualar larguras de grupos de editores", + "maximizeEditor": "Maximizar grupo de editor e ocultar barra lateral", + "keepEditor": "Manter editor", + "openNextEditor": "Abrir próximo editor", + "openPreviousEditor": "Abrir editor anterior", + "nextEditorInGroup": "Abrir próximo editor no grupo", + "openPreviousEditorInGroup": "Abrir editor anterior no grupo", + "navigateNext": "Avançar", + "navigatePrevious": "Voltar", + "reopenClosedEditor": "Reabrir Editor Fechado", + "clearRecentFiles": "Limpar arquivos recentes", + "showEditorsInFirstGroup": "Mostrar editores no primeiro grupo", + "showEditorsInSecondGroup": "Mostrar editores no segundo grupo", + "showEditorsInThirdGroup": "Mostrar editores no terceiro grupo", + "showEditorsInGroup": "Mostrar editores no grupo", + "showAllEditors": "Mostrar todos editores", + "openPreviousRecentlyUsedEditorInGroup": "Abrir o Editor Anterior Recentemente Usado no Grupo", + "openNextRecentlyUsedEditorInGroup": "Abrir o Próximo Editor Recentemente Usado no Grupo", + "navigateEditorHistoryByInput": "Abrir o Editor Anterior do Histórico", + "openNextRecentlyUsedEditor": "Abrir o Próximo Editor Recentemente Utilizado", + "openPreviousRecentlyUsedEditor": "Abrir o Editor Anterior Recentemente Utilizado", + "clearEditorHistory": "Limpar Histórico do Editor", + "focusLastEditorInStack": "Abrir Último Editor do Grupo", + "moveEditorLeft": "Mover Editor para Esquerda", + "moveEditorRight": "Mover Editor para Direita", + "moveEditorToPreviousGroup": "Mover Editor para o Grupo Anterior", + "moveEditorToNextGroup": "Mover o Editor para o Próximo Grupo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json new file mode 100644 index 00000000000..f42c45c02f5 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorCommand.activeEditorMove.description": "Mover o editor ativo por guias ou grupos", + "editorCommand.activeEditorMove.arg.name": "Argumento de movimento do editor ativo", + "editorCommand.activeEditorMove.arg.description": "Propriedades do argumento: \n\t\t\t\t\t\t- 'para': sequência de valor fornecendo para onde mover.\n\t\t\t\t\t\t- 'por': sequência de valor, fornecendo a unidade para o movimento. Por guia ou por grupo.\n\t\t\t\t\t\t- 'valor': valor numérico, fornecendo quantas posições ou uma posição absoluta para mover.\n\t\t\t\t\t", + "commandDeprecated": "Comando **{0}** foi removido. Você pode usar **{1}** em vez disso", + "openKeybindings": "Configurar os atalhos de teclado" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorPart.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorPart.i18n.json new file mode 100644 index 00000000000..c6a90d88542 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorPart.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "groupOneVertical": "Esquerda", + "groupTwoVertical": "Centro", + "groupThreeVertical": "Direita", + "groupOneHorizontal": "Topo", + "groupTwoHorizontal": "Centro", + "groupThreeHorizontal": "Baixo", + "editorOpenError": "Não foi possível abrir '{0}': {1}." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorPicker.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorPicker.i18n.json new file mode 100644 index 00000000000..e17bc940565 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorPicker.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "entryAriaLabel": "{0}, seletor de grupo editor", + "groupLabel": "Grupo: {0}", + "noResultsFoundInGroup": "Não foi encontrado nennhum editor aberto no grupo", + "noOpenedEditors": "Lista de editores abertos está atualmente vazia no grupo", + "noResultsFound": "Não foi encontrado editor correspondente aberto", + "noOpenedEditorsAllGroups": "A lista de editores abertos está atualmente vazia" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json new file mode 100644 index 00000000000..c2057c183a1 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -0,0 +1,49 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "singleSelectionRange": "Ln {0}, {1} Col ({2} selecionado)", + "singleSelection": "Ln {0}, {1} Col", + "multiSelectionRange": "{0} seleções ({1} caracteres selecionados)", + "multiSelection": "{0} seleções", + "endOfLineLineFeed": "LF", + "endOfLineCarriageReturnLineFeed": "CRLF", + "tabFocusModeEnabled": "Tabulação move o foco", + "disableTabMode": "Desativar o modo de acessibilidade", + "gotoLine": "Ir para linha", + "indentation": "Indentação", + "selectEncoding": "Selecionar a codificação", + "selectEOL": "Selecionar a sequência de fim de linha", + "selectLanguageMode": "Selecionar modo de idioma", + "fileInfo": "Informações do arquivo", + "spacesSize": "Espaços: {0}", + "tabSize": "Tamanho de Tabulação: {0}", + "showLanguageExtensions": "Pesquisar extensões na loja para '{0}'...", + "changeMode": "Alterar o modo de linguagem", + "noEditor": "Nenhum editor de texto ativo neste momento", + "languageDescription": "({0}) - linguagem configurada", + "languageDescriptionConfigured": "({0})", + "languagesPicks": "linguagens (identificador)", + "configureModeSettings": "Configurar '{0}' configurações baseadas em linguagem...", + "configureAssociationsExt": "Configurar a associação de arquivo para '{0}'...", + "autoDetect": "Detecção automática", + "pickLanguage": "Selecionar o modo do idioma", + "currentAssociation": "Associação atual", + "pickLanguageToConfigure": "Selecionar o modo de linguagem para associar a '{0}'", + "changeIndentation": "Alterar a indentação", + "noWritableCodeEditor": "O editor de código ativo é somente leitura.", + "indentView": "alterar visualização", + "indentConvert": "converter arquivo", + "pickAction": "Selecionar ação", + "changeEndOfLine": "Alterar sequência de final de linha", + "pickEndOfLine": "Selecionar sequência de final de linha", + "changeEncoding": "Alterar a codificação do arquivo", + "noFileEditor": "Nenhum arquivo ativo neste momento", + "saveWithEncoding": "Salvar com codificação", + "reopenWithEncoding": "Reabrir com codificação", + "guessedEncoding": "Adivinhado a partir do conteúdo", + "pickEncodingForReopen": "Selecione a codificaçãodo arquivo para reabrir o arquivo.", + "pickEncodingForSave": "Selecione a codificação do arquivo para Salvar Com" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/tabsTitleControl.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/tabsTitleControl.i18n.json new file mode 100644 index 00000000000..9001e58fa99 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/tabsTitleControl.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "araLabelTabActions": "Ações de tablulação" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/textDiffEditor.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/textDiffEditor.i18n.json new file mode 100644 index 00000000000..8af2aff62d5 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/textDiffEditor.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "textDiffEditor": "Editor de Diferentes Textos", + "readonlyEditorWithInputAriaLabel": "{0}. Editor de comparação de texto somente leitura.", + "readonlyEditorAriaLabel": "Editor de comparação de texto somente leitura.", + "editableEditorWithInputAriaLabel": "{0}. Editor de comparação de arquivos texto.", + "editableEditorAriaLabel": "Editor de comparação de arquivos texto.", + "navigate.next.label": "Próxima Alteração", + "navigate.prev.label": "Alteração Anterior", + "inlineDiffLabel": "Alternar para exibição embutida", + "sideBySideDiffLabel": "Alternar para exibição lado a lado" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/textEditor.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/textEditor.i18n.json new file mode 100644 index 00000000000..eb58230b854 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/textEditor.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorLabelWithGroup": "{0}, Grupo {1}." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/textResourceEditor.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/textResourceEditor.i18n.json new file mode 100644 index 00000000000..77f89efba5f --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/textResourceEditor.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "textEditor": "Editor de texto", + "readonlyEditorWithInputAriaLabel": "{0}. Editor de texto somente leitura.", + "readonlyEditorAriaLabel": "Editor de texto somente leitura.", + "untitledFileEditorWithInputAriaLabel": "{0}. Editor de texto de arquivo sem nome.", + "untitledFileEditorAriaLabel": "Editor de texto de arquivo sem nome." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/titleControl.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/titleControl.i18n.json new file mode 100644 index 00000000000..bf8307cd384 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/titleControl.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "close": "Fechar", + "closeOthers": "Fechar Outros", + "closeRight": "Fechar à direita", + "closeAll": "Fechar todos", + "keepOpen": "Manter aberto", + "showOpenedEditors": "Mostrar editores abertos", + "araLabelEditorActions": "Ações de editor" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/panel/panelActions.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/panel/panelActions.i18n.json new file mode 100644 index 00000000000..1f98f38c47e --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/panel/panelActions.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "panelActionTooltip": "{0} ({1})", + "closePanel": "Fechar Painel", + "togglePanel": "Alternar Painel", + "focusPanel": "Foco no Painel", + "toggleMaximizedPanel": "Alternar Painel Maximizado", + "maximizePanel": "Maximizar Tamanho do Painel", + "minimizePanel": "Restaurar tamanho do Painel", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/panel/panelPart.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/panel/panelPart.i18n.json new file mode 100644 index 00000000000..48a7b1b2f76 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/panel/panelPart.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "panelSwitcherBarAriaLabel": "Chave do Painel Ativo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json new file mode 100644 index 00000000000..c98dd22d95d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "inputModeEntryDescription": "{0} (Pressione 'Enter' para confirmar ou 'Esc' para cancelar)", + "inputModeEntry": "Pressione 'Enter' para confirmar o texto digitado ou 'Esc' para cancelar", + "emptyPicks": "Não há entradas a serem escolhidas", + "quickOpenInput": "Digite '?' para obter ajuda sobre as ações que você pode realizar a partir daqui", + "historyMatches": "aberto recentemente", + "noResultsFound1": "Nenhum resultado encontrado", + "canNotRunPlaceholder": "Esse manipulador de abertura rápida não pode ser usado no contexto atual", + "entryAriaLabel": "{0}, recentemente aberto", + "removeFromEditorHistory": "Remover do Histórico", + "pickHistory": "Selecionar uma entrada do editor para remover do histórico" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickopen.contribution.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickopen.contribution.i18n.json new file mode 100644 index 00000000000..57f5524e1be --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickopen.contribution.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickOpen": "Ir para o Arquivo...", + "quickNavigateNext": "Navegar ao próximo em modo de abertura rápida", + "quickNavigatePrevious": "Navegar ao anterior em modo de abertura rápida", + "quickSelectNext": "Selecionar próximo em modo de abertura rápida", + "quickSelectPrevious": "Selecionar anterior em modo de abertura rápida" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/sidebar/sidebarPart.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/sidebar/sidebarPart.i18n.json new file mode 100644 index 00000000000..89806e051ea --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/sidebar/sidebarPart.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "focusSideBar": "Foco na Barra Lateral", + "viewCategory": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/statusbar/statusbarPart.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/statusbar/statusbarPart.i18n.json new file mode 100644 index 00000000000..4a2adabf5a6 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/statusbar/statusbarPart.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "canNotRun": "O comando '{0}' não está habilitado e não pode ser executado.", + "manageExtension": "Gerenciar Extensão" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/titlebar/titlebarPart.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/titlebar/titlebarPart.i18n.json new file mode 100644 index 00000000000..1c3db4d572b --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/titlebar/titlebarPart.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "patchedWindowTitle": "[Sem Suporte]", + "devExtensionWindowTitlePrefix": "[Host de Desenvolvimento de Extensão]" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/quickopen.i18n.json b/i18n/ptb/src/vs/workbench/browser/quickopen.i18n.json new file mode 100644 index 00000000000..26c5e14f367 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/quickopen.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultsMatching": "Nenhum resultado encontrado", + "noResultsFound2": "Nenhum resultado encontrado", + "entryAriaLabel": "{0}, comando", + "noCommands": "Não há comandos correspondentes" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/viewlet.i18n.json b/i18n/ptb/src/vs/workbench/browser/viewlet.i18n.json new file mode 100644 index 00000000000..34655b736ba --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/viewlet.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "collapse": "Recolher tudo", + "viewToolbarAriaLabel": "{0} ações " +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/common/theme.i18n.json b/i18n/ptb/src/vs/workbench/common/theme.i18n.json new file mode 100644 index 00000000000..bfe4c0ef017 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/common/theme.i18n.json @@ -0,0 +1,44 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "tabActiveBackground": "Cor de fundo da guia ativa. As guias são os recipientes para editores na área do editor. Várias guias podem ser abertas em um grupo de editores. Podem haver vários grupos de editor.", + "tabInactiveBackground": "Cor de fundo da guia inativa. As guias são os recipientes para editores na área do editor. Várias guias podem ser abertas em um grupo de editores. Podem haver vários grupos de editor.", + "tabBorder": "Borda para separar uma guia das outras. As guias são os recipientes para editores na área do editor. Várias guias podem ser abertas em um grupo de editores. Podem haver vários grupos de editor.", + "tabActiveEditorGroupActiveForeground": "Cor de primeiro plano da guia ativa em um grupo ativo. As guias são os recipientes para editores na área do editor. Várias guias podem ser abertas em um grupo de editores. Podem haver vários grupos de editor.", + "tabInactiveEditorGroupActiveForeground": "Cor de primeiro plano da guia inativa em um grupo ativo. As guias são os recipientes para editores na área do editor. Várias guias podem ser abertas em um grupo de editores. Podem haver vários grupos de editor.", + "editorGroupBackground": "Cor de fundo de um grupo de editor. Grupos de editor são os recipientes dos editores. A cor de fundo é mostrada ao arrastar o editor de grupos ao redor.", + "tabsContainerBackground": "Cor de fundo do cabeçalho do título do grupo de editor quando as guias são habilitadas. Grupos de editor são os recipientes dos editores.", + "editorGroupHeaderBackground": "Cor de fundo do título do cabeçalho do grupo de editor quando as guias são desabilitadas. Grupos de editor são os recipientes dos editores.", + "editorGroupBorder": "Cor para separar múltiplos grupos de editor de outro. Grupos de editor são os recipientes dos editores.", + "editorDragAndDropBackground": "Cor de fundo ao arrastar editores. A cor deve ter transparência para que o conteúdo do editor ainda possa ser visto.", + "panelBackground": "Cor de fundo do painel. Os painéis são mostrados abaixo da área do editor e contém visualizações como saída e terminal integrado.", + "panelBorder": "Cor da borda do painel no topo separando do editor. Os painéis são mostrados abaixo da área do editor e contém visualizações como saída e terminal integrado.", + "panelActiveTitleForeground": "Cor do título para o painel ativo. Os painéis são mostrados abaixo da área do editor e contém visualizações como saída e terminal integrado.", + "panelInactiveTitleForeground": "Cor do título para o painel inativo. Os painéis são mostrados abaixo da área do editor e contém visualizações como saída e terminal integrado.", + "panelActiveTitleBorder": "Cor da borda para o título do painel ativo. Os painéis são mostrados abaixo da área do editor e contém visualizações como saída e terminal integrado.", + "statusBarForeground": "Cor do primeiro plano da barra de status. A barra de status é mostrada na parte inferior da janela.", + "statusBarBackground": "Cor de fundo da barra de status padrão. A barra de status é mostrada na parte inferior da janela.", + "statusBarNoFolderBackground": "Cor de fundo da barra de status quando nenhuma pasta está aberta. A barra de status é mostrada na parte inferior da janela.", + "statusBarItemActiveBackground": "Cor de fundo do item da barra de status quando você clicado. A barra de status é mostrada na parte inferior da janela.", + "statusBarItemHoverBackground": "Cor de fundo do item da barra de status quando estiver passando sobre ele. A barra de status é mostrada na parte inferior da janela.", + "statusBarProminentItemBackground": "Cor de fundo de itens proeminentes da barra de status. Itens proeminentes destacam-se outras entradas da barra de status para indicar a importância. A barra de status é mostrada na parte inferior da janela.", + "statusBarProminentItemHoverBackground": "Cor de fundo dos itens proeminentes de barra de status quando estiver passando sobre eles. Itens proeminentes destacam-se outras entradas de barra de status para indicar a importância. A barra de status é mostrada na parte inferior da janela.", + "activityBarBackground": "Cor de fundo da barra de atividades. Barra de atividade está visível à esquerda ou à direita e permite alternar entre as visualizações da barra lateral.", + "activityBarForeground": "Cor de primeiro plano da barra de atividades (por exemplo, usada para os ícones). A barra de atividades está visível à esquerda ou à direita e permite alternar entre as visualizações da barra lateral.", + "activityBarDragAndDropBackground": "Cor de feedback de arrastar e soltar para os itens da barra de atividades. A cor deve ter transparência para que as entradas de bar de atividade ainda possam brilhar. A barra de atividade está visível à esquerda ou à direita e permite para alternar entre as visualizações da barra lateral.", + "activityBarBadgeBackground": "Cor de fundo da notificação de atividade. A barra de atividade está visível à esquerda ou à direita e permite alternar entre as visualizações da barra lateral.", + "activityBarBadgeForeground": "Cor de primeiro plano da notificação de atividade. A barra de atividade está visível à esquerda ou à direita e permite alternar entre as visualizações da barra lateral.", + "sideBarBackground": "Cor de fundo da barra lateral. A barra lateral é o recipiente para visualizações como explorador e pesquisa.", + "sideBarForeground": "Cor de primeiro plano da barra lateral. A barra lateral é o recipiente para visualizações como o explorador e a busca.", + "sideBarTitleForeground": "Cor de primeiro plano do título da barra lateral. A barra lateral é o recipiente para visualizações como explorador e pesquisa.", + "sideBarSectionHeaderBackground": "Cor de fundo do cabeçalho de seção lateral. A barra lateral é o recipiente para visões como explorador e pesquisa.", + "titleBarActiveForeground": "Cor da barra de título do primeiro plano quando a janela está ativa. Observe que essa cor atualmente somente é suportada no macOS.", + "titleBarInactiveForeground": "Cor de primeiro plano da barra de título quando a janela está inativa. Observe que essa cor atualmente somente é suportada no macOS.", + "titleBarActiveBackground": "Cor de fundo da barra de título quando a janela está ativa. Observe que essa cor atualmente somente é suportada no macOS.", + "titleBarInactiveBackground": "Cor de fundo de barra de título quando a janela está inativa. Observe que essa cor é atualmente somente suportada no macOS.", + "notificationsForeground": "Cor do primeiro plano de notificações. Notificações deslizam na parte superior da janela.", + "notificationsBackground": "Cor de fundo de notificações. Notificações deslizam na parte superior da janela." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json new file mode 100644 index 00000000000..d829a3c8cad --- /dev/null +++ b/i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json @@ -0,0 +1,41 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "closeActiveEditor": "Fechar Editor", + "closeWindow": "Fechar Janela", + "switchWindow": "Alternar Janela", + "switchWindowPlaceHolder": "Selecionar uma janela", + "current": "Janela Atual", + "closeFolder": "Fechar Pasta", + "noFolderOpened": "Não há nenhuma pasta aberta nesta instância para ser fechada.", + "newWindow": "Nova Janela", + "toggleFullScreen": "Alternar Tela Inteira", + "toggleMenuBar": "Alternar Barra de Menus", + "toggleDevTools": "Alternar Ferramentas do Desenvolvedor", + "zoomIn": "Ampliar", + "zoomOut": "Reduzir", + "zoomReset": "Reinicializar Zoom", + "appPerf": "Desempenho de inicialização", + "reloadWindow": "Recarregar Janela", + "openRecent": "Abrir Recente", + "folders": "pastas", + "files": "arquivos", + "openRecentPlaceHolderMac": "Selecionar um caminho (Pressione a tecla Cmd para abrir em uma nova janela)", + "openRecentPlaceHolder": "Selecionar um caminho para abrir (Pressione a tecla Cmd para abrir em uma nova janela)", + "closeMessages": "Fechar mensagens de notificação", + "reportIssues": "Reportar Problemas", + "reportPerformanceIssue": "Reportar Problema de Desempenho", + "keybindingsReference": "Referência de Atalhos de Teclado", + "openDocumentationUrl": "Documentação", + "openIntroductoryVideosUrl": "Vídeos Introdutórios", + "toggleSharedProcess": "Alternar processo compartilhado", + "navigateLeft": "Mover para a Visualizção à Esquerda", + "navigateRight": "Mover para a Visualização à Direita", + "navigateUp": "Mover para a Visualização Acima", + "navigateDown": "Mover para a Visualização Abaixo", + "increaseViewSize": "Aumentar o Tamanho da Visualização Atual", + "decreaseViewSize": "Diminuir o Tamanho da Visualização Atual" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/commands.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/commands.i18n.json new file mode 100644 index 00000000000..3a1051dcfda --- /dev/null +++ b/i18n/ptb/src/vs/workbench/electron-browser/commands.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "diffLeftRightLabel": "{0} ⟷ {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/crashReporter.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/crashReporter.i18n.json new file mode 100644 index 00000000000..10b7a7ff108 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/electron-browser/crashReporter.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "telemetryConfigurationTitle": "Telemetria", + "telemetry.enableCrashReporting": "Ativar o envio de relatórios de incidentes à Microsoft.\nEsta opção requer reinicialização para ser efetivada." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/extensionHost.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/extensionHost.i18n.json new file mode 100644 index 00000000000..e5a7ab81686 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/electron-browser/extensionHost.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "extensionHostProcess.startupFailDebug": "O host de extensão não iniciou em 10 segundos, ele pode ser interrompido na primeira linha e precisa de um depurador para continuar.", + "extensionHostProcess.startupFail": "Host de extensão não começou em 10 segundos, isso pode ser um problema.", + "extensionHostProcess.error": "Erro do host de extensão: {0}", + "extensionHostProcess.crash": "Host de extensão foi encerrado inesperadamente. Por favor recarregar a janela para recuperar." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json new file mode 100644 index 00000000000..3b9050de1af --- /dev/null +++ b/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -0,0 +1,62 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "view": "Exibir", + "help": "Ajuda", + "file": "Arquivo", + "developer": "Desenvolvedor", + "showEditorTabs": "Controla se os editores abertos devem ou não serem exibidos em abas.", + "editorTabCloseButton": "Controla a posição dos botões de fechar das abas do editor ou os desabilita quando configurados para 'desligado'.", + "showIcons": "Controla se os editores abertos devem ou não ser exibidos com um ícone. Requer um tema de ícone para ser habilitado. ", + "enablePreview": "Controla se os editores abertos são exibidos como visualização. Editores de visualização são reutilizados até que eles sejam preservados (por exemplo, através de um duplo clique ou edição).", + "enablePreviewFromQuickOpen": "Controla se os editores abertos da Abertura Rápida são exibidos como visualização. Os editores de visualização são reutilizados até serem preservados (por exemplo, através de um duplo clique ou edição).", + "editorOpenPositioning": "Controla onde os editores serão abertos. Escolha 'esquerda' ou 'direita' para abrir os editores à esquerda ou à direita do \neditor ativo. Selecione 'primeiro' ou 'último' para abrir os editores independentemente do atual.", + "revealIfOpen": "Controla se um editor é exibido em qualquer um dos grupos, se aberto. Se desabilitado, um editor será aberto preferencialmente no grupo de editores ativo. Se habilitado, um editor já aberto será exibido no grupo de editores ativo, ao invés de ser aberto novamente. Note que há alguns casos onde esta configuração é ignorada, por exemplo, quando for forçada a abertura de um editor em um grupo específico ou ao lado do grupo atualmente ativo.", + "closeOnFocusLost": "Controla se Abertura Rápida deve fechar automaticamente caso perca o foco.", + "openDefaultSettings": "Controla se a abertura de configurações também abre um editor mostrando todas as configurações padrão.", + "sideBarLocation": "Controla a localização da barra lateral. Ele pode ser exibido à esquerda ou à direita da área de trabalho.", + "statusBarVisibility": "Controla a visibilidade da barra de status na parte inferior da área de trabalho.", + "activityBarVisibility": "Controla a visibilidade da barra de atividades na área de trabalho.", + "closeOnFileDelete": "Controla se os editores que mostram um arquivo devem fechar automaticamente quanto o arquivo é apagado ou renomeado por algum outro processo. Desativar isso manterá o editor aberto como sujo neste evento. Note que apagar do aplicativo sempre fechará o editor e os arquivos sujos nunca fecharão para preservar seus dados.", + "swipeToNavigate": "Navegue entre arquivos abertos usando o deslizamento horizontal de três dedos.", + "workbenchConfigurationTitle": "Área de Trabalho", + "window.openFilesInNewWindow.on": "Arquivos serão abertos em uma nova janela", + "window.openFilesInNewWindow.off": "Arquivos serão abertos em uma nova janela com a pasta de arquivos aberta ou com a última janela ativa.", + "window.openFilesInNewWindow.default": "Os arquivos serão abertos na janela com a pasta de arquivos aberta ou a última janela ativa, a menos que seja aberto através do dock ou do finder (somente macOS)", + "openFilesInNewWindow": "Controla se os arquivos devem ser abertos em uma nova janela\n- padrão: os arquivos serão abertos em uma nova janela com a pasta de arquivos aberta ou na última janela ativa, a menos que seja aberta através do dock ou do finder (apenas macOS)\n- ligado: os arquivos serão abertos em uma nova janela\n- desligado: os arquivos serão abertos em uma janela com a pasta de arquivos aberta ou a última janela ativa\nNota que ainda podem haver casos em que esta configuração será ignorada (por exemplo, quando estiver usando as opções de linha de comando -new-window ou -reuse-window).", + "window.openFoldersInNewWindow.on": "As pastas serão abertas em uma nova janela", + "window.openFoldersInNewWindow.off": "As pastas substituirão a última janela ativa", + "window.openFoldersInNewWindow.default": "As pastas serão abertas em uma nova janela, a menos que uma pasta seja selecionada dentro do aplicativo (por exemplo, através do menu Arquivo)", + "openFoldersInNewWindow": "Controla se as pastas devem ser abertas em uma nova janela ou substituir a última janela ativa\n- padrão: as pastas serão abertas em uma nova janela, a menos que seja selecionada dentro do aplicativo (por exemplo, através do menu Arquivo)\n- ligado: as pastas serão abertas em uma nova janela\n- desligado: as pastas substituirão a última janela ativa\nNote que ainda podem haver casos em que esta configuração será ignorada (por exemplo, quando estiver usando as opções de linha de comando -new-window ou -reuse-window).", + "window.reopenFolders.none": "Nunca reabra uma pasta.", + "window.reopenFolders.one": "Reabrir a última pasta ativa.", + "window.reopenFolders.all": "Reabrir todas as pastas da última sessão.", + "reopenFolders": "Controla como as pastas são reabertas depois de um reinício. Escolha 'nenhum' para nunca reabrir uma pasta, 'uma' para reabrir a última pasta que você trabalhou ou 'todas' para reabrir todas as pastas da sua última sessão.", + "restoreFullscreen": "Controla se uma janela deve ser restaurada em modo de tela cheia se ela foi finalizada em modo de tela cheia.", + "zoomLevel": "Ajusta o nível de zoom da janela. O tamanho original é 0 e cada aumento (por exemplo, 1) ou redução (por exemplo, -1) representa um zoom 20% maior ou menor. Você também pode digitar decimais para ajustar o nível de zoom com uma granularidade mais fina.", + "title": "Controla o título da janela com base no editor ativo. As variáveis são substituídas com base no contexto:\n$ {ActiveEditorShort}: por exemplo, meuArquivo.txt\n$ {ActiveEditorMedium}: por exemplo, minhaPasta / meuArquivo.txt\n$ {ActiveEditorLong}: por exemplo, /Usuários/Desenvolvimento/meuProjeto/minhaPasta/meuArquivo.txt\n$ {RootName}: por exemplo, meuProjeto\n$ {RootPath}: por exemplo, /Usuários/Desenvolvimento/meuProjeto\n$ {AppName}: por exemplo, VS Code\n$ {Dirty}: um indicador sujo se o editor ativo for sujo\n$ {Separator}: um separador condicional (\"-\") que só aparece quando for rodeado por variáveis com valores", + "window.newWindowDimensions.default": "Abrir novas janelas no centro da tela.", + "window.newWindowDimensions.inherit": "Abrir novas janelas com a mesma dimensão da última janela ativa.", + "window.newWindowDimensions.maximized": "Abrir novas janelas maximizadas.", + "window.newWindowDimensions.fullscreen": "Abrir novas janelas em modo de tela cheia.", + "newWindowDimensions": "Controla as dimensões ao abrir uma nova janela quando pelo menos uma janela já está aberta. Por padrão, uma nova janela será aberta no centro da tela com pequena dimensão. Quando definido como 'inherit', a janela vai ter as mesmas dimensões que a última janela que estava ativa. Quando definido como 'maximized', a janela abrirá maximizada e em tela cheia se configurado para 'fullscreen'. Observe que essa configuração não tem um impacto sobre a primeira janela que é aberta. A primeira janela sempre irá restaurar o tamanho e a localização como você deixou antes de fechar.", + "window.menuBarVisibility.default": "O menu está oculto apenas em modo de tela cheia.", + "window.menuBarVisibility.visible": "O menu está sempre visivel mesmo quando em modo de tela cheia.", + "window.menuBarVisibility.toggle": "O menu está oculto, mas pode ser mostrado através da tecla Alt.", + "window.menuBarVisibility.hidden": "O menu está sempre oculto.", + "menuBarVisibility": "Controla a visibilidade da barra de menu. Uma configuração 'alternar' significa que a barra de menus está oculta e pressionar a tecla Alt irá mostrá-la. Por padrão, a barra de menu será visível, a menos que a janela esteja em modo de tela cheia.", + "enableMenuBarMnemonics": "Se habilitado, os menus principais podem ser abertos através de atalhos de tecla Alt. Desativar mnemônicos permite vincular esses atalhos de tecla Alt para comandos do editor.", + "autoDetectHighContrast": "Se habilitado, irá mudar automaticamente para o tema de alto contraste se o Windows estiver utilizando um tema de alto contraste, e para o tema escuro ao mudar de um tema de alto contraste do Windows.", + "titleBarStyle": "Ajusta a aparência da barra de título da janela. As alterações exigem um reinício completo.", + "window.nativeTabs": "Habilita as abas da janela do macOS Sierra. Note que as alterações exigem um reinício completo e que as abas nativas desabilitarão um estilo de barra de título customizado, se configurado.", + "windowConfigurationTitle": "Janela", + "zenModeConfigurationTitle": "Modo Zen", + "zenMode.fullScreen": "Controla se a ativação do modo Zen também coloca o espaço de trabalho em modo de tela cheia.", + "zenMode.hideTabs": "Controla se a ativação do modo Zen também oculta as abas do espaço de trabalho.", + "zenMode.hideStatusBar": "Controla se a ativação do modo Zen também oculta a barra de status no rodapé do espaço de trabalho.", + "zenMode.hideActivityBar": "Controla se a ativação do modo Zen também oculta a barra de atividades à esquerda do espaço de trabalho.", + "zenMode.restore": "Controla se uma janela deve ser restaurada para o modo zen se ela foi finalizada no modo zen." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/main.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/main.i18n.json new file mode 100644 index 00000000000..056d426d27d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/electron-browser/main.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "loaderError": "Falha ao carregar o arquivo necessário. Você não está mais conectado à Internet ou o servidor que você está conectado está offline. Atualize o navegador e tente novamente.", + "loaderErrorNative": "Falha ao carregar um arquivo necessário. Reinicie o aplicativo para tentar novamente. Detalhes: {0}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/shell.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/shell.i18n.json new file mode 100644 index 00000000000..951a140a2ea --- /dev/null +++ b/i18n/ptb/src/vs/workbench/electron-browser/shell.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "runningAsRoot": "Não é recomendado executar Code como 'root'." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/window.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/window.i18n.json new file mode 100644 index 00000000000..50118b77afe --- /dev/null +++ b/i18n/ptb/src/vs/workbench/electron-browser/window.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "undo": "Desfazer", + "redo": "Refazer", + "cut": "Recortar", + "copy": "Copiar", + "paste": "Colar", + "selectAll": "Selecionar Tudo", + "confirmOpen": "Tem certeza de que deseja abrir '{0}' pastas?", + "confirmOpenButton": "&&Abrir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/node/extensionHostMain.i18n.json b/i18n/ptb/src/vs/workbench/node/extensionHostMain.i18n.json new file mode 100644 index 00000000000..f0596b25871 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/node/extensionHostMain.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "extensionTestError": "Caminho {0} não aponta para um executor de testes com extensão válida." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/node/extensionPoints.i18n.json b/i18n/ptb/src/vs/workbench/node/extensionPoints.i18n.json new file mode 100644 index 00000000000..18d7b3f26c8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/node/extensionPoints.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "jsonParseFail": "Falha ao analisar {0}: {1}.", + "fileReadFail": "Não foi possível ler o arquivo {0}: {1}.", + "jsonsParseFail": "Falha ao analisar {0} ou {1}: {2}.", + "missingNLSKey": "Não foi possível encontrar a mensagem para a chave {0}." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/cli/electron-browser/cli.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/cli/electron-browser/cli.contribution.i18n.json new file mode 100644 index 00000000000..69df9b15d87 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/cli/electron-browser/cli.contribution.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "install": "Instalar o comando '{0}' em PATH", + "not available": "Este comando não está disponível", + "successIn": "Comando shell '{0}' instalado com sucesso em PATH.", + "warnEscalation": "O código solicitará com 'osascript' pelos privilégios de Administrador para instalar o comando shell.", + "ok": "OK", + "cantCreateBinFolder": "Não é possível criar '/usr/local/bin'.", + "cancel2": "Cancelar", + "aborted": "Abortado", + "uninstall": "Desinstalar o comando '{0}' de PATH", + "successFrom": "Comando shell '{0}' desinstalado com sucesso de PATH.", + "shellCommand": "Comando shell" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json new file mode 100644 index 00000000000..18ee740ae31 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "workbench.action.inspectKeyMap": "Desenvolvedor: Inspecionar Mapeamentos de Chave" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.i18n.json b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.i18n.json new file mode 100644 index 00000000000..217bdf1c04e --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleRenderControlCharacters": "Alternar caracteres de controle" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.i18n.json b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.i18n.json new file mode 100644 index 00000000000..453104fcc6d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleRenderWhitespace": "Alternar Espaço em Branco Renderizado" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json new file mode 100644 index 00000000000..058048058af --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggle.wordwrap": "Visualizar: Alternar Quebra de Linha", + "wordWrap.notInDiffEditor": "Não pode alternar quebra de linha em um editor diff.", + "unwrapMinified": "Desabilitar empacotamento para este arquivo", + "wrapMinified": "Habilitar empacotamento para este arquivo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/wordWrapMigration.i18n.json b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/wordWrapMigration.i18n.json new file mode 100644 index 00000000000..12f93be687c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/wordWrapMigration.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "wordWrapMigration.ok": "OK", + "wordWrapMigration.dontShowAgain": "Não mostrar novamente", + "wordWrapMigration.openSettings": "Abrir configurações", + "wordWrapMigration.prompt": "A configuração `editor.wrappingColumn` foi descontinuada e substituída pela configuração `editor.wordWrap`" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointWidget.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointWidget.i18n.json new file mode 100644 index 00000000000..3d748795633 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointWidget.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "breakpointWidgetExpressionPlaceholder": "Parar quando a expressão for avaliada como true. 'Enter' para aceitar, 'esc' para cancelar.", + "breakpointWidgetAriaLabel": "O programa só vai parar aqui se esta condição for verdadeira. Pressione Enter para aceitar ou Escape para cancelar.", + "breakpointWidgetHitCountPlaceholder": "Parar quando contagem de ocorrências condição for alcançada. 'Enter' para aceitar, 'esc' para cancelar.", + "breakpointWidgetHitCountAriaLabel": "O programa só vai parar aqui, se a contagem de ocorrências for alcançada. Pressione Enter para aceitar ou Escape para cancelar.", + "expression": "Expressão", + "hitCount": "Contagem de ocorrências" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActionItems.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActionItems.i18n.json new file mode 100644 index 00000000000..32a88b85efd --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActionItems.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "addConfiguration": "Adicionar Configuração...", + "noConfigurations": "Sem configurações" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json new file mode 100644 index 00000000000..1bc052297a1 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -0,0 +1,49 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openLaunchJson": "Abrir {0}", + "launchJsonNeedsConfigurtion": "Configurar ou corrigir 'launch.json'", + "noFolderDebugConfig": "Primeiro abra uma pasta para fazer uma configuração de depuração avançada.", + "startDebug": "Iniciar Depuração", + "startWithoutDebugging": "Iniciar Sem Depuração", + "selectAndStartDebugging": "Selecionar e Iniciar a Depuração", + "restartDebug": "Reiniciar", + "reconnectDebug": "Reconectar", + "stepOverDebug": "Pular Sobre", + "stepIntoDebug": "Pular Dentro", + "stepOutDebug": "Pular Fora", + "stopDebug": "Parar", + "disconnectDebug": "Desconectar", + "continueDebug": "Continuar", + "pauseDebug": "Pausa", + "restartFrame": "Reiniciar o Frame", + "removeBreakpoint": "Remover Ponto de Parada", + "removeAllBreakpoints": "Remover Todos os Pontos de Parada", + "enableBreakpoint": "Habilitar ponto de Parada", + "disableBreakpoint": "Desativar Ponto de Parada", + "enableAllBreakpoints": "Habilitar Todos os Pontos de Parada", + "disableAllBreakpoints": "Desabilitar Todos Pontos de Parada", + "activateBreakpoints": "Ativar Pontos de Parada", + "deactivateBreakpoints": "Desativar Pontos de Parada", + "reapplyAllBreakpoints": "Reaplicar Todos os Pontos de Parada", + "addFunctionBreakpoint": "Adicionar Ponto de Parada de Função", + "renameFunctionBreakpoint": "Renomeie o Ponto de Parada de Função", + "addConditionalBreakpoint": "Adicionar Ponto de Parada Condicional...", + "editConditionalBreakpoint": "Editar o Ponto de Parada...", + "setValue": "Definir Valor", + "addWatchExpression": "Adicionar Expressão", + "editWatchExpression": "Editar expressão", + "addToWatchExpressions": "Adicionar ao monitoramento", + "removeWatchExpression": "Remover Expressão", + "removeAllWatchExpressions": "Remover Todas as Expressões", + "clearRepl": "Limpar console", + "debugConsoleAction": "Console do Depurador", + "unreadOutput": "Nova Saída no Console de Depuração", + "debugFocusConsole": "Foco no Console de Depuração", + "focusProcess": "Foco no Processo", + "stepBackDebug": "Passo para trás", + "reverseContinue": "Reverter" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json new file mode 100644 index 00000000000..421e5b19c79 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "debugToolBarBackground": "Cor de fundo da barra de ferramentas de depuração." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugContentProvider.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugContentProvider.i18n.json new file mode 100644 index 00000000000..d8aa95c869a --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugContentProvider.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unable": "Não é possível resolver o recurso sem uma sessão de depuração" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json new file mode 100644 index 00000000000..ef74c88413d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleBreakpointAction": "Depurar: Alternar Ponto de Parada", + "columnBreakpointAction": "Depurar: Ponto de Interrupção de Coluna", + "columnBreakpoint": "Adicionar Ponto de Interrupção de Coluna", + "conditionalBreakpointEditorAction": "Depurar: Adicionar Ponto de Interrupção Condicional...", + "runToCursor": "Executar até o Cursor", + "debugEvaluate": "Depurar: Avaliar", + "debugAddToWatch": "Depurar: Adicionar ao monitoramento", + "showDebugHover": "Mostrar Item Flutuante" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorModelManager.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorModelManager.i18n.json new file mode 100644 index 00000000000..f30b378456b --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorModelManager.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "breakpointDisabledHover": "Ponto de Parada Desativado", + "breakpointUnverifieddHover": "Ponto de Parada Não Verificado", + "breakpointDirtydHover": "Ponto de parada não verificado. O arquivo foi modificado, por favor reinicie a sessão de depuração.", + "breakpointUnsupported": "Pontos de parada condicionais não são suportados por esse tipo de depurador" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugQuickOpen.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugQuickOpen.i18n.json new file mode 100644 index 00000000000..01955c44965 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugQuickOpen.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "entryAriaLabel": "depurar {0}", + "debugAriaLabel": "Digite um nome de uma configuração de lançamento para ser executado.", + "noConfigurationsMatching": "Não há configurações de depuração correspondentes", + "noConfigurationsFound": "Configurações de depuração não encontradas. Por favor, crie um arquivo 'launch.json'." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/exceptionWidget.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/exceptionWidget.i18n.json new file mode 100644 index 00000000000..a8802c13164 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/exceptionWidget.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "debugExceptionWidgetBorder": "Cor da borda da ferramenta de exceção.", + "debugExceptionWidgetBackground": "Cor de fundo da ferramenta de exceção.", + "exceptionThrownWithId": "Ocorreu exceção: {0}", + "exceptionThrown": "Ocorreu exceção." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json new file mode 100644 index 00000000000..8c7a8761f41 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileLinkMac": "Clique para seguir (Cmd + clique abre ao lado)", + "fileLink": "Clique para seguir (Cmd + clique abre ao lado)" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/common/debug.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/common/debug.i18n.json new file mode 100644 index 00000000000..3476b79d9e1 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/common/debug.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "internalConsoleOptions": "Controla o comportamento do console depuração interna." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/common/debugModel.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/common/debugModel.i18n.json new file mode 100644 index 00000000000..fa2f5e8ada5 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/common/debugModel.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "notAvailable": "não disponível", + "startDebugFirst": "Por favor, inicie uma sessão de depuração para avaliar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/common/debugSource.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/common/debugSource.i18n.json new file mode 100644 index 00000000000..0e10c85d818 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/common/debugSource.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unknownSource": "Fonte desconhecida" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json new file mode 100644 index 00000000000..05a7ccfe827 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleDebugViewlet": "Visualizar Depurador", + "toggleDebugPanel": "Console do Depurador", + "debug": "Depurar", + "debugPanel": "Console do Depurador", + "view": "Exibir", + "debugCategory": "Depurar", + "debugCommands": "Configuração do Depurador", + "debugConfigurationTitle": "Depurar", + "allowBreakpointsEverywhere": "Permite definir um ponto de interrupção em qualquer arquivo.", + "openExplorerOnEnd": "Automaticamente abre a visualização do explorador no final de uma sessão de depuração", + "inlineValues": "Mostrar valores de variáveis em linha no editor durante a depuração", + "hideActionBar": "Controlar se a barra de ação flutuante do depurador deve ser ocultada", + "launch": "Configuração global do lançamento do depurador. Deve ser usado como uma alternativa para o arquivo 'launch.json' que é compartilhado entre os espaços de trabalho" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json new file mode 100644 index 00000000000..85b353a37fe --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noFolderDebugConfig": "Primeiro abra uma pasta para fazer uma configuração de depuração avançada." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json new file mode 100644 index 00000000000..ada60277e7b --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -0,0 +1,38 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "vscode.extension.contributes.debuggers": "Contribui adaptadores de depuração.", + "vscode.extension.contributes.debuggers.type": "Identificador único para esse adaptador de depuração.", + "vscode.extension.contributes.debuggers.label": "Nome de exibição para esse adaptador de depuração.", + "vscode.extension.contributes.debuggers.program": "Caminho para o programa adaptador de depuração. O caminho pode ser absoluto ou relativo à pasta de extensão.", + "vscode.extension.contributes.debuggers.args": "Argumentos opcionais a serem informados para o adaptador.", + "vscode.extension.contributes.debuggers.runtime": "Runtime opcional no caso do atributo do programa não ser um executável, mas requerer um runtime.", + "vscode.extension.contributes.debuggers.runtimeArgs": "Argumentos opcionais do runtime.", + "vscode.extension.contributes.debuggers.variables": "Mapeamento de variáveis interativas (por exemplo ${action.pickProcess}) em 'launch.json' para um comando.", + "vscode.extension.contributes.debuggers.initialConfigurations": "Configurações para gerar o 'launch.json' inicial.", + "vscode.extension.contributes.debuggers.languages": "Lista de idiomas para os quais a extensão de depuração pode ser considerada o \"depurador padrão\".", + "vscode.extension.contributes.debuggers.adapterExecutableCommand": "Se especificado VS Code chamará este comando para determinar o caminho do executável do adaptador de depuração e os argumentos para passar.", + "vscode.extension.contributes.debuggers.startSessionCommand": "Se especificado VS Code chamará este comando para as ações de \"depurar\" ou \"executar\" direcionadas para esta extensão.", + "vscode.extension.contributes.debuggers.configurationSnippets": "Trechos de código para adicionar novas configurações em 'launch.json'.", + "vscode.extension.contributes.debuggers.configurationAttributes": "Configurações de esquema JSON para validar 'launch.json'.", + "vscode.extension.contributes.debuggers.windows": "Configurações específicas do Windows.", + "vscode.extension.contributes.debuggers.windows.runtime": "Runtime usado para Windows.", + "vscode.extension.contributes.debuggers.osx": "Configurações específicas do OS X.", + "vscode.extension.contributes.debuggers.osx.runtime": "Runtime usado para o OS X.", + "vscode.extension.contributes.debuggers.linux": "Configurações específicas do Linux.", + "vscode.extension.contributes.debuggers.linux.runtime": "Runtime usado para o Linux.", + "vscode.extension.contributes.breakpoints": "Contribui aos pontos de interrupção.", + "vscode.extension.contributes.breakpoints.language": "Permitir pontos de parada para este idioma.", + "app.launch.json.title": "Executar", + "app.launch.json.version": "Versão deste formato de arquivo.", + "app.launch.json.configurations": "Lista de configurações. Adicionar novas configurações ou editar as existentes usando o IntelliSense.", + "app.launch.json.compounds": "Lista de compostos. Cada composto faz referência a várias configurações que vão ser executadas juntas.", + "app.launch.json.compound.name": "Nome do composto. Aparece no menu drop-down da configuração de execução.", + "app.launch.json.compounds.configurations": "Nomes das configurações que serão iniciadas como parte deste composto.", + "debugNoType": "'type' do adaptador de depuração não pode ser omitido e deve ser do tipo 'string'.", + "DebugConfig.failed": "Não é possível criar o arquivo 'launch.json' dentro da pasta '.vscode' ({0}).", + "selectDebug": "Selecione o ambiente" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json new file mode 100644 index 00000000000..1424499bfcc --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "removeBreakpoints": "Remover pontos de interrupção", + "removeBreakpointOnColumn": "Remover ponto de interrupção na coluna {0}", + "removeLineBreakpoint": "Remover ponto de interrupção de linha", + "editBreakpoints": "Editar pontos de interrupção", + "editBreakpointOnColumn": "Editar o ponto de interrupção na coluna {0}", + "editLineBrekapoint": "Editar o ponto de interrupção de linha", + "enableDisableBreakpoints": "Habilitar/Desabilitar pontos de interrupção", + "disableColumnBreakpoint": "Desabilitar ponto de interrupção na coluna {0}", + "disableBreakpointOnLine": "Desabilitar ponto de interrupção de linha", + "enableBreakpoints": "Habilitar o ponto de interrupção na coluna {0}", + "enableBreakpointOnLine": "Habilitar o ponto de interrupção de linha", + "addBreakpoint": "Adicionar ponto de interrupção", + "addConfiguration": "Adicionar Configuração..." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugHover.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugHover.i18n.json new file mode 100644 index 00000000000..1853865a1ec --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugHover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "treeAriaLabel": "Depurar passando o mouse por cima" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json new file mode 100644 index 00000000000..6dc0bc48afb --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "snapshotObj": "Apenas valores primitivos são mostrados para este objeto.", + "debuggingStarted": "Depuração Iniciada.", + "debuggingPaused": "Depuração pausada, razão {0}, {1} {2}", + "debuggingStopped": "Depuração parada.", + "breakpointAdded": "Adicionado ponto de interrupção, linha {0}, arquivo {1}", + "breakpointRemoved": "Ponto de interrupção removido, linha {0}, arquivo {1}", + "compoundMustHaveConfigurations": "Composição deve ter o atributo \"configurations\" definido para iniciar várias configurações.", + "configMissing": "Configuração '{0}' não tem 'launch.json'.", + "debugTypeNotSupported": "Tipo de depuração configurado '{0}' não é suportado.", + "debugTypeMissing": "Falta a propriedade 'type' para a configuração de lançamento escolhida.", + "preLaunchTaskErrors": "Erros de build foram detectados durante a preLaunchTask '{0}'.", + "preLaunchTaskError": "Erro de build foi detectado durante a preLaunchTask '{0}'.", + "preLaunchTaskExitCode": "A preLaunchTask '{0}' encerrada com código de saída {1}.", + "debugAnyway": "Depurar mesmo assim", + "noFolderWorkspaceDebugError": "O arquivo ativo não pode ser depurado. Certifique-se de que ele está salvo no disco e que tem uma extensão de depuração instalada para esse tipo de arquivo.", + "NewLaunchConfig": "Por favor, configure o arquivo de configuração de lançamento para seu aplicativo. {0}", + "DebugTaskNotFound": "Não foi possível encontrar o preLaunchTask '{0}'.", + "differentTaskRunning": "Há uma tarefa {0} sendo executada. Não pode executar a tarefa de pré-lançamento {1}." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugViewer.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugViewer.i18n.json new file mode 100644 index 00000000000..ae47cc6a47d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugViewer.i18n.json @@ -0,0 +1,28 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "process": "Processar", + "paused": "Em pausa", + "running": "Em execução", + "thread": "Thread", + "pausedOn": "Pausado em {0}", + "loadMoreStackFrames": "Carregar mais segmentos de pilha", + "threadAriaLabel": "Thread {0}, pilha de chamadas, depuração", + "stackFrameAriaLabel": "Segmento de Pilha {0} linha {1} {2}, pilha de chamadas, depuração", + "variableValueAriaLabel": "Digite o novo valor da variável", + "variableScopeAriaLabel": "Escopo {0}, variáveis, depuração", + "variableAriaLabel": "{0} valor {1}, variáveis, depuração", + "watchExpressionPlaceholder": "Expressão para monitorar", + "watchExpressionInputAriaLabel": "Digitar expressão a monitorar", + "watchExpressionAriaLabel": "{0} valor {1}, monitorar, depuração", + "watchVariableAriaLabel": "{0} valor {1}, monitorar, depuração", + "functionBreakpointPlaceholder": "Função de parada", + "functionBreakPointInputAriaLabel": "Digitar Ponto de Parada de Função", + "functionBreakpointsNotSupported": "Pontos de parada de função não são suportados por este tipo de depuração", + "breakpointAriaLabel": "Ponto de parada linha {0} {1}, pontos de parada, depuração", + "functionBreakpointAriaLabel": "Ponto de parada de função {0}, pontos de parada, depuração", + "exceptionBreakpointAriaLabel": "Ponto de parada de exceção {0}, pontos de parada, depuração" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugViews.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugViews.i18n.json new file mode 100644 index 00000000000..d14c4338ceb --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugViews.i18n.json @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "variablesSection": "Seção de variáveis", + "variables": "Variáveis", + "variablesAriaTreeLabel": "Variáveis de Depuração", + "expressionsSection": "Seção de Expressões", + "watch": "Monitoramento", + "watchAriaTreeLabel": "Depurar Expressões Monitoradas", + "callstackSection": "Seção de Pilha de Chamada", + "debugStopped": "Pausado em {0}", + "callStack": "Pilha de Chamadas", + "callStackAriaLabel": "Depurar a Pilha de Chamadas", + "breakpointsSection": "Seção de Pontos de Parada", + "breakpoints": "Pontos de Parada", + "breakpointsAriaTreeLabel": "Depurar os Pontos de Parada" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json new file mode 100644 index 00000000000..227ca95927f --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "copyValue": "Copiar valor", + "copy": "Copiar", + "copyAll": "Copiar todos", + "copyStackTrace": "Copiar Pilha de Chamadas" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json new file mode 100644 index 00000000000..0ce97a8f796 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "moreInfo": "Mais Informações", + "unableToLaunchDebugAdapter": "Não é possível executar o adaptador de depuração de '{0}'.", + "unableToLaunchDebugAdapterNoArgs": "Não é possível executar o adaptador de depuração.", + "stoppingDebugAdapter": "{0}. Parando o adaptador de depuração.", + "debugAdapterCrash": "Processo do adaptador de depuração foi finalizado inesperadamente" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/repl.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/repl.i18n.json new file mode 100644 index 00000000000..73f6f0be4c4 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/repl.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "replAriaLabel": "Ler o Painel de Impressão Eval", + "actions.repl.historyPrevious": "História anterior", + "actions.repl.historyNext": "Próxima história", + "actions.repl.acceptInput": "REPL Aceitar Entrada" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json new file mode 100644 index 00000000000..4afd6d64d82 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "stateCapture": "Estado do objeto é capturado na primeira avaliação", + "replVariableAriaLabel": "Variável {0} tem valor {1}, ler a impressão do valor do loop, depurar", + "replExpressionAriaLabel": "Expressão {0} tem valor {1}, ler o laço de avaliação de impressão, depurar", + "replValueOutputAriaLabel": " impressão da avaliação do laço de leitura, depurar", + "replKeyValueOutputAriaLabel": "Variável de saída {0} tem valor {1}, ler o loop de avaliação de impressão, depurar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json new file mode 100644 index 00000000000..b191a0de856 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "statusBarDebuggingBackground": "Cor de fundo da barra de status quando um programa está sendo depurado. A barra de status é mostrada na parte inferior da janela" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json new file mode 100644 index 00000000000..898a18605fb --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "debug.terminal.title": "depurado", + "debug.terminal.not.available.error": "Terminal integrado não disponível" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json new file mode 100644 index 00000000000..f0551dfe57b --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "debugAdapterBinNotFound": "Executável do adaptador de depuração '{0}' não existe.", + "debugAdapterCannotDetermineExecutable": "Não é possível determinar o executável para o adaptador de depuração '{0}'.", + "debugType": "Tipo de configuração.", + "debugTypeNotRecognised": "O tipo de depuração não é reconhecido. Certifique-se de que você tem uma extensão de depuração correspondente instalada e que ela está habilitada.", + "node2NotSupported": "\"node2\" não é mais suportado, use \"node\" ao invés e defina o atributo \"protocol\" para \"inspector\".", + "debugName": "Nome da configuração; aparece no menu drop-down da configuração de lançamento. ", + "debugRequest": "Requer o tipo de configuração. Pode ser \"launch\" ou \"attach\".", + "debugServer": "Somente para o desenvolvimento de extensão de depuração: se uma porta é especificada, o VS Code tenta se conectar a um adaptador de depuração executando em modo de servidor", + "debugPrelaunchTask": "Tarefa para ser executada antes de começar a sessão de depuração.", + "debugWindowsConfiguration": "Atributos de configuração de lançamento específicos do Windows.", + "debugOSXConfiguration": "Atributos de configuração de lançamento específicos do OS X.", + "debugLinuxConfiguration": "Atributos de configuração de lançamento específicos do Linux.", + "deprecatedVariables": "'env.', 'config.' e 'command.' foram descontinuados, use ' env:', ' config:' e ' command:' em vez disso." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/browser/actions/showEmmetCommands.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/browser/actions/showEmmetCommands.i18n.json new file mode 100644 index 00000000000..1e3a1c0f277 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/browser/actions/showEmmetCommands.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showEmmetCommands": "Mostrar Comandos do Emmet" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json new file mode 100644 index 00000000000..1dc5e1e3b69 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "balanceInward": "Emmet: Saldo (interno)", + "balanceOutward": "Emmet: Saldo (externo)" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json new file mode 100644 index 00000000000..cccc82d8a01 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "previousEditPoint": "Emmet: Ponto de edição anterior", + "nextEditPoint": "Emmet: Ponto próxima edição" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json new file mode 100644 index 00000000000..b4a6a03e213 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "evaluateMathExpression": "Emmet: Avaliar a expressão matemática" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json new file mode 100644 index 00000000000..5a5dd3cc3e8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "expandAbbreviationAction": "Emmet: Expandir Abreviação" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json new file mode 100644 index 00000000000..306332a4af2 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "incrementNumberByOneTenth": "Emmet: Incremento de 0.1", + "incrementNumberByOne": "Emmet: Incremento de 1", + "incrementNumberByTen": "Emmet: Incremento de 10", + "decrementNumberByOneTenth": "Emmet: Decréscimo por 0.1", + "decrementNumberByOne": "Emmet: Decréscimo por 1", + "decrementNumberByTen": "Emmet: Decréscimo por 10" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json new file mode 100644 index 00000000000..6a742c4d5f9 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "matchingPair": "Emmet: Ir para o par de correspondência" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json new file mode 100644 index 00000000000..22ed3f5f533 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mergeLines": "Emmet: Mesclar linhas" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json new file mode 100644 index 00000000000..bc0eefc2e00 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "reflectCSSValue": "Emmet: Refletir valor CSS" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json new file mode 100644 index 00000000000..a30414b08d2 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "removeTag": "Emmet: Remover Rótulo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json new file mode 100644 index 00000000000..1343e2d6b36 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "selectPreviousItem": "Emmet: Selecione o Item anterior", + "selectNextItem": "Emmet: Selecione o próximo Item" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json new file mode 100644 index 00000000000..ea04346ea7c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "splitJoinTag": "Emmet: Dividir/Juntar Rótulo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json new file mode 100644 index 00000000000..366cb874a0c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleComment": "Emmet: Alternar Comentário" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json new file mode 100644 index 00000000000..1eff88ade9d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "updateImageSize": "Emmet: Atualizar o Tamanho da Imagem" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json new file mode 100644 index 00000000000..963a85e1671 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "updateTag": "Emmet: Atualizar Rótulo", + "enterTag": "Insira o Rótulo", + "tag": "Rótulo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json new file mode 100644 index 00000000000..501253b7dcb --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "wrapWithAbbreviationAction": "Emmet: Envelope com a abreviatura", + "enterAbbreviation": "Digite a abreviação", + "abbreviation": "Abreviação" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json new file mode 100644 index 00000000000..1caebe040f5 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "emmetConfigurationTitle": "Emmet", + "triggerExpansionOnTab": "Quando habilitado, abreviações emmet são expandidas ao pressionar TAB.", + "emmetPreferences": "Preferências usadas para modificar o comportamento de algumas ações e resolvedores de Emmet.", + "emmetSyntaxProfiles": "Definir o perfil para a sintaxe especificada ou usar seu próprio perfil com regras específicas.", + "emmetExclude": "Uma matriz de línguagens onde abreviaturas emmet não devem ser expandidas.", + "emmetExtensionsPath": "Caminho para uma pasta contendo perfis emmet, trechos e preferências" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/execution/electron-browser/terminal.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/execution/electron-browser/terminal.contribution.i18n.json new file mode 100644 index 00000000000..95274daf750 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/execution/electron-browser/terminal.contribution.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "terminalConfigurationTitle": "Terminal Externo", + "terminal.external.windowsExec": "Personalizar qual terminal executar no Windows.", + "terminal.external.osxExec": "Personalizar qual aplicativo de terminal executar no OS X.", + "terminal.external.linuxExec": "Personalizar qual terminal executar no Linux.", + "globalConsoleActionWin": "Abrir Novo Prompt de Comando", + "globalConsoleActionMacLinux": "Abrir Novo Terminal", + "scopedConsoleActionWin": "Abrir no Prompt de Comando", + "scopedConsoleActionMacLinux": "Abrir no Terminal" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json b/i18n/ptb/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json new file mode 100644 index 00000000000..fde640b09c5 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "console.title": "Console VS Code", + "mac.terminal.script.failed": "Script '{0}' falhou com código de saída {1}", + "mac.terminal.type.not.supported": "'{0}' não suportado", + "press.any.key": "Pressione qualquer tecla para continuar...", + "linux.term.failed": "'{0}' falhou com código de saída {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json new file mode 100644 index 00000000000..d79e3c4ca0a --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "vscode.extension.contributes.view": "Contribui ao modo de exibição personalizado", + "vscode.extension.contributes.view.id": "Identificação única usada para identificar a vista criada por vscode.workspace.createTreeView", + "vscode.extension.contributes.view.label": "Sequência de caracteres legível usada para processar a visualização", + "vscode.extension.contributes.view.icon": "Caminho para o ícone da visualização", + "vscode.extension.contributes.views": "Contribui com visualizações personalizadas", + "showViewlet": "Mostrar {0}", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorerActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorerActions.i18n.json new file mode 100644 index 00000000000..37735d10007 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorerActions.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "refresh": "Atualizar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorerService.i18n.json b/i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorerService.i18n.json new file mode 100644 index 00000000000..7b7f16b3812 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorerService.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "treeExplorer.noMatchingProviderId": "Não há TreeExplorerNodeProvider com id {providerId} registrado." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/explorers/browser/views/treeExplorerView.i18n.json b/i18n/ptb/src/vs/workbench/parts/explorers/browser/views/treeExplorerView.i18n.json new file mode 100644 index 00000000000..0e7f5f9cd92 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/explorers/browser/views/treeExplorerView.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "treeExplorerViewlet.tree": "Seção do Explorador da Árvore" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/browser/dependenciesViewer.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/browser/dependenciesViewer.i18n.json new file mode 100644 index 00000000000..0ebd24a9fd8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/browser/dependenciesViewer.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "error": "Erro", + "Unknown Dependency": "Dependência Desconhecida:" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json new file mode 100644 index 00000000000..1a3b9d4cd09 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json @@ -0,0 +1,39 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "name": "Nome da extensão", + "extension id": "Identificador da extensão", + "publisher": "Nome do editor", + "install count": "Quantidade de Instalações", + "rating": "Avaliação", + "license": "Licença", + "details": "Detalhes", + "contributions": "Contribuições", + "changelog": "Registro de Alterações", + "dependencies": "Dependências", + "noReadme": "README não disponível.", + "noChangelog": "Registro de Alterações não disponível.", + "noContributions": "Sem Contribuições", + "noDependencies": "Sem Dependências", + "settings": "Configurações ({0})", + "setting name": "Nome", + "description": "Descrição", + "default": "Valor padrão", + "debuggers": "Depuradores ({0})", + "debugger name": "Nome", + "themes": "Temas ({0})", + "JSON Validation": "Validação JSON ({0})", + "commands": "Comandos ({0})", + "command name": "Nome", + "keyboard shortcuts": "Atalhos de Teclado", + "menuContexts": "Contextos de Menu", + "languages": "Linguagens ({0})", + "language id": "ID", + "language name": "Nome", + "file extensions": "Extensões de Arquivo", + "grammar": "Gramática", + "snippets": "Trechos" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json new file mode 100644 index 00000000000..e2ff606a7c9 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -0,0 +1,55 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "installAction": "Instalar", + "installing": "Instalando", + "uninstallAction": "Desinstalar", + "Uninstalling": "Desinstalando", + "updateAction": "Atualizar", + "updateTo": "Atualizar para {0}", + "enableForWorkspaceAction.label": "Habilitar (Espaço de Trabalho)", + "enableAlwaysAction.label": "Habilitar (Sempre)", + "disableForWorkspaceAction.label": "Desabilitar (Espaço de Trabalho)", + "disableAlwaysAction.label": "Desabilitar (Sempre)", + "ManageExtensionAction.uninstallingTooltip": "Desinstalando", + "enableForWorkspaceAction": "Espaço de trabalho", + "enableGloballyAction": "Sempre", + "enableAction": "Habilitar", + "disableForWorkspaceAction": "Espaço de trabalho", + "disableGloballyAction": "Sempre", + "disableAction": "Desabilitar", + "checkForUpdates": "Verificar Atualizações", + "updateAll": "Atualizar Todas as Extensões", + "reloadAction": "Recarregar", + "postUpdateTooltip": "Recarregar para atualizar", + "postUpdateMessage": "Recarregar esta janela para ativar a extensão atualizada '{0}'?", + "postEnableTooltip": "Recarregar para ativar", + "postEnableMessage": "Recarregar esta janela para ativar a extensão '{0}'?", + "postDisableTooltip": "Recarregar para desativar", + "postDisableMessage": "Recarregar esta janela para desativar a extensão '{0}'?", + "postUninstallTooltip": "Recarregar para desativar", + "postUninstallMessage": "Recarregar esta janela para desativar a extensão desinstalada '{0}'?", + "reload": "&&Recarregar Janela", + "toggleExtensionsViewlet": "Mostrar Extensões", + "installExtensions": "Instalar Extensões", + "showInstalledExtensions": "Mostrar Extensões Instaladas", + "showDisabledExtensions": "Mostrar Extensões Desabilitadas", + "clearExtensionsInput": "Limpar Entrada de Extensões", + "showOutdatedExtensions": "Mostrar Extensões Desatualizadas", + "showPopularExtensions": "Mostrar Extensões Populares", + "showRecommendedExtensions": "Mostrar Extensões Recomendadas", + "showWorkspaceRecommendedExtensions": "Mostrar Extensões Recomendadas para o Espaço de Trabalho", + "showRecommendedKeymapExtensions": "Mostrar Mapeamentos de Teclado Recomendados", + "showRecommendedKeymapExtensionsShort": "Mapeamentos de Teclado", + "configureWorkspaceRecommendedExtensions": "Configurar Extensões Recomendadas (Espaço de Trabalho)", + "ConfigureWorkspaceRecommendations.noWorkspace": "As recomendações somente estão disponíveis em uma pasta do espaço de trabalho.", + "OpenExtensionsFile.failed": "Não foi possível criar o arquivo 'extensions.json' na pasta '.vscode' ({0}).", + "builtin": "Intrínseco", + "disableAll": "Desabilitar Todas as Extensões Instaladas", + "disableAllWorkspace": "Desabilitar Todas as Extensões Instaladas para este Espaço de Trabalho", + "enableAll": "Habilitar Todas as Extensões Instaladas", + "enableAllWorkspace": "Habilitar Todas as Extensões Instaladas para este Espaço de Trabalho" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.i18n.json new file mode 100644 index 00000000000..666a6692179 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "manage": "Pressione Enter para gerenciar suas extensões.", + "searchFor": "Pressione Enter para pesquisar por '{0}' na Loja.", + "noExtensionsToInstall": "Digite um nome de extensão" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/common/extensionsFileTemplate.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/common/extensionsFileTemplate.i18n.json new file mode 100644 index 00000000000..b90c0d5ac64 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/common/extensionsFileTemplate.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "app.extensions.json.title": "Extensões", + "app.extensions.json.recommendations": "Lista de recomendações de extensões. O identificador de uma extensão é sempre ' ${publisher}. ${nome}'. Por exemplo: 'vscode.csharp'.", + "app.extension.identifier.errorMessage": "Formato esperado '${editor}.${nome}'. Exemplo: 'vscode.csharp'." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/common/extensionsInput.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/common/extensionsInput.i18n.json new file mode 100644 index 00000000000..333627e9619 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/common/extensionsInput.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "extensionsInputName": "Extensão: {0}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json new file mode 100644 index 00000000000..663560d4d78 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "reallyRecommended2": "A extensão {0} é recomendada para este tipo de arquivo.", + "showRecommendations": "Mostrar Recomendações", + "neverShowAgain": "Não mostrar novamente", + "close": "Fechar", + "workspaceRecommended": "Este espaço de trabalho possui recomendações de extensão.", + "ignoreExtensionRecommendations": "Deseja ignorar todas as recomendações de extensão?", + "ignoreAll": "Sim, Ignorar Tudo", + "no": "Não", + "cancel": "Cancelar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json new file mode 100644 index 00000000000..76bf0379481 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "extensionsCommands": "Gerenciar Extensões", + "galleryExtensionsCommands": "Instalar Extensões da Galeria", + "extension": "Extensão", + "extensions": "Extensões", + "view": "Exibir", + "extensionsConfigurationTitle": "Extensões", + "extensionsAutoUpdate": "Atualizar extensões automaticamente", + "extensionsIgnoreRecommendations": "Ignorar recomendações de extensão" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json new file mode 100644 index 00000000000..731e4ef9491 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openExtensionsFolder": "Abrir a Pasta de Extensões", + "installVSIX": "Instalar do VSIX...", + "InstallVSIXAction.success": "A extensão foi instalada com sucesso. Reinicie para habilitá-la.", + "InstallVSIXAction.reloadNow": "Recarregar Agora" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json new file mode 100644 index 00000000000..0cde76b12d8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "disableOtherKeymapsConfirmation": "Desabilitar outros mapeamentos de teclado para evitar conflitos entre mapeamentos de teclado?", + "yes": "Sim", + "no": "Não" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json new file mode 100644 index 00000000000..a35f8bbe6c6 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "searchExtensions": "Pesquisar Extensões na Loja", + "extensions": "Extensões", + "sort by installs": "Ordenar por: Quantidade de Instalações", + "sort by rating": "Ordenar por: Avaliação", + "sort by name": "Ordenar por: Nome", + "no extensions found": "Nenhuma extensão encontrada.", + "suggestProxyError": "A Loja retornou 'ECONNREFUSED'. Por favor, verifique a configuração de 'http.proxy'.", + "outdatedExtensions": "{0} Extensões Desatualizadas" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json new file mode 100644 index 00000000000..f0313c20343 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "enableDependeciesConfirmation": "Habilitando '{0}' também habilita suas dependências. Gostaria de continuar?", + "enable": "Sim", + "doNotEnable": "Não", + "disableDependeciesConfirmation": "Gostaria de desabilitar somente '{0}', ou as suas dependências também?", + "disableOnly": "Apenas", + "disableAll": "Todos", + "cancel": "Cancelar", + "singleDependentError": "Não é possível desabilitar a extensão '{0}'. A extensão '{1}' depende dela.", + "twoDependentsError": "Não é possível desabilitar a extensão '{0}'. As extensões '{1}' e '{2}' dependem dela.", + "multipleDependentsError": "Não é possível desabilitar a extensão '{0}'. As extensões '{1}', '{2}' e outras dependem dela." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/feedback/electron-browser/feedback.i18n.json b/i18n/ptb/src/vs/workbench/parts/feedback/electron-browser/feedback.i18n.json new file mode 100644 index 00000000000..5d3c22c39a8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/feedback/electron-browser/feedback.i18n.json @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "sendFeedback": "Tweetar Feedback", + "label.sendASmile": "Tweete feedback para nós", + "patchedVersion1": "Sua instalação está corrompida.", + "patchedVersion2": "Por favor especificar isso ao enviar um bug.", + "sentiment": "Como foi sua experiência?", + "smileCaption": "Feliz", + "frownCaption": "Triste", + "other ways to contact us": "Outras maneiras de nos contatar", + "submit a bug": "Submeter um bug", + "request a missing feature": "Solicitar um recurso ausente", + "tell us why?": "Diga-nos porquê?", + "commentsHeader": "Comentários", + "tweet": "Tweetar", + "character left": "caractere à esquerda", + "characters left": "caracteres à esquerda", + "feedbackSending": "Enviando", + "feedbackSent": "Obrigado", + "feedbackSendingError": "Tentar novamente" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/editors/binaryFileEditor.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/editors/binaryFileEditor.i18n.json new file mode 100644 index 00000000000..9c33fd25246 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/editors/binaryFileEditor.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "binaryFileEditor": "Visualizador de Arquivo Binário" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json new file mode 100644 index 00000000000..792781bc8c7 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "textFileEditor": "Editor de Arquivo de Texto", + "createFile": "Criar arquivo", + "fileEditorWithInputAriaLabel": "{0}. Editor de Arquivo de Texto.", + "fileEditorAriaLabel": "Editor de Arquivo de Texto" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.contribution.i18n.json new file mode 100644 index 00000000000..f203671c230 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.contribution.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "filesCategory": "Arquivos", + "revealInSideBar": "Revelar na Barra Lateral", + "acceptLocalChanges": "Usar mudanças locais e sobrescrever o conteúdo do disco", + "revertLocalChanges": "Descartar mudanças locais e reverter para conteúdo do disco" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.i18n.json new file mode 100644 index 00000000000..161e7a9a16c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.i18n.json @@ -0,0 +1,73 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "retry": "Tentar novamente", + "rename": "Renomear", + "newFile": "Novo Arquivo", + "newFolder": "Nova Pasta", + "openFolderFirst": "Abrir uma pasta primeiro para criar arquivos ou pastas dentro dele.", + "newUntitledFile": "Novo Arquivo Sem Título", + "createNewFile": "Novo Arquivo", + "createNewFolder": "Nova Pasta", + "deleteButtonLabelRecycleBin": "&&Mover para Lixeira", + "deleteButtonLabelTrash": "&&Mover para o Lixo", + "deleteButtonLabel": "&&Excluir", + "dirtyMessageFolderOneDelete": "Você está excluindo uma pasta com alterações não salvas em 1 arquivo. Você quer continuar?", + "dirtyMessageFolderDelete": "Você está excluindo uma pasta com alterações não salvas em {0} arquivos. Você quer continuar?", + "dirtyMessageFileDelete": "Você está excluindo um arquivo com alterações não salvas. Você quer continuar?", + "dirtyWarning": "Suas alterações serão perdidas se você não salvá-las.", + "confirmMoveTrashMessageFolder": "Tem certeza de que deseja excluir '{0}' e seu conteúdo?", + "confirmMoveTrashMessageFile": "Tem certeza de que deseja excluir '{0}'?", + "undoBin": "Você pode restaurar da lixeira.", + "undoTrash": "Você pode restaurar a partir do lixo.", + "confirmDeleteMessageFolder": "Tem certeza de que deseja excluir permanentemente '{0}' e seu conteúdo?", + "confirmDeleteMessageFile": "Tem certeza de que deseja excluir permanentemente '{0}'?", + "irreversible": "Esta ação é irreversível!", + "permDelete": "Excluir permanentemente", + "delete": "Excluir", + "importFiles": "Importar Arquivos", + "confirmOverwrite": "Um arquivo ou pasta com o mesmo nome já existe na pasta de destino. Você quer substituí-lo?", + "replaceButtonLabel": "&&Substituir", + "copyFile": "Copiar", + "pasteFile": "Colar", + "duplicateFile": "Duplicar", + "openToSide": "Aberto para o lado", + "compareSource": "Selecione para comparar", + "globalCompareFile": "Compare o Arquivo Ativo Com...", + "pickHistory": "Selecione um arquivo previamente aberto para comparar com", + "unableToFileToCompare": "O arquivo selecionado não pode ser comparado com '{0}'.", + "openFileToCompare": "Abrir um arquivo primeiro para compará-lo com outro arquivo.", + "compareWith": "Comparar com '{0}'", + "compareFiles": "Comparar Arquivos", + "refresh": "Atualizar", + "save": "Salvar", + "saveAs": "Salvar como...", + "saveAll": "Salvar Todos", + "saveAllInGroup": "Salvar Todos no Grupo", + "saveFiles": "Salvar Arquivos Sujos", + "revert": "Reverter Arquivo", + "focusOpenEditors": "Foco na Visualização dos Editores Abertos", + "focusFilesExplorer": "Foco no Explorador de Arquivos", + "showInExplorer": "Revelar o Arquivo Ativo na Barra Lateral", + "openFileToShow": "Abrir um arquivo primeiro para mostrá-lo no explorer", + "collapseExplorerFolders": "Esconder Pastas no Explorador", + "refreshExplorer": "Atualizar Explorador", + "openFile": "Abrir arquivo...", + "openFileInNewWindow": "Abrir o Arquivo Ativo em uma Nova Janela", + "openFileToShowInNewWindow": "Abrir um arquivo primeiro para abrir em uma nova janela", + "revealInWindows": "Revelar no Explorer", + "revealInMac": "Revelar no Finder", + "openContainer": "Abrir a Pasta", + "revealActiveFileInWindows": "Revelar Arquivo Ativo no Windows Explorer", + "revealActiveFileInMac": "Revelar Arquivo Ativo no Finder", + "openActiveFileContainer": "Abrir a Pasta do Arquivo Ativo.", + "copyPath": "Copiar Caminho", + "copyPathOfActive": "Copiar Caminho do Arquivo Ativo", + "emptyFileNameError": "Um nome de arquivo ou pasta deve ser fornecido.", + "fileNameExistsError": "Um arquivo ou pasta **{0}** já existe neste local. Escolha um nome diferente.", + "invalidFileNameError": "O nome **{0}** não é válido como um nome de arquivo ou pasta. Por favor, escolha um nome diferente.", + "filePathTooLongError": "O nome **{0}** resulta em um caminho muito longo. Escolha um nome mais curto." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/fileCommands.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/fileCommands.i18n.json new file mode 100644 index 00000000000..2e61a1656c8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/fileCommands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openFileToCopy": "Abrir um arquivo primeiro para copiar seu caminho", + "openFileToReveal": "Abrir um arquivo primeiro para revelar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json new file mode 100644 index 00000000000..ddbc9408f54 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -0,0 +1,40 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showExplorerViewlet": "Mostrar Explorer", + "explore": "Explorador", + "view": "Exibir", + "textFileEditor": "Editor de Arquivo de Texto", + "binaryFileEditor": "Editor de Arquivo Binário", + "filesConfigurationTitle": "Arquivos", + "exclude": "Configure os padrões glob para excluir arquivos e pastas.", + "files.exclude.boolean": "O padrão glob com o qual combinar os caminhos de arquivo. Defina para verdadeiro ou falso para habilitar ou desabilitar o padrão.", + "files.exclude.when": "Verificação adicional nos irmãos de um arquivo correspondente. Use $(basename) como variável para o nome do arquivo correspondente.", + "associations": "Configurar as associações de arquivo para linguagens (por exemplo, \"* Extension\": \"html\"). Estas têm precedência sobre as associações padrão das linguagens instaladas.", + "encoding": "A codificação padrão do conjunto de caracteres para ser usada ao ler e gravar arquivos.", + "autoGuessEncoding": "Quando habilitado, tentará adivinhar a codificação do conjunto de caracteres ao abrir arquivos", + "trimTrailingWhitespace": "Quando habilitado, removerá espaços em branco à direita ao salvar um arquivo.", + "insertFinalNewline": "Quando habilitado, inseririrá uma nova linha no final do arquivo quando salvá-lo.", + "files.autoSave.off": "Um arquivo sujo nunca é automaticamente salvo.", + "files.autoSave.afterDelay": "Um arquivo sujo é salvo automaticamente após configurado em 'files.autoSaveDelay'.", + "files.autoSave.onFocusChange": "Um arquivo sujo é salvo automaticamente quando o editor perde o foco.", + "files.autoSave.onWindowChange": "Um arquivo sujo é salvo automaticamente quando a janela perde o foco.", + "autoSave": "Controla o auto-salvamento de arquivos sujos. Aceita os valores: '{0}', '{1}', '{2}' (editor perde o foco), '{3}' (janela perde o foco). Se definido como '{4}', você pode configurar o atraso em 'files.autoSaveDelay'.", + "autoSaveDelay": "Controla o atraso em milissegundos depois que um arquivo sujo é salvo automaticamente. Só se aplica quando 'files.autoSave' for definida como '{0}'", + "watcherExclude": "Configure padrões glob de caminhos de arquivo para excluir do monitoramento de arquivos. Alterar essa configuração requer uma reinicialização. Quando você tiver consumo Code muito alto de cpu na inicialização, você pode excluir pastas grandes para reduzir a carga inicial.", + "hotExit.off": "Desabilitar a saída à quente.", + "hotExit.onExit": "Saída à quente será acionada quando o aplicativo for fechado, ou seja, quando a última janela é fechada no Windows/Linux ou quando o comando workbench.action.quit é acionado (paleta de comandos, keybinding, menu). Todas as janelas com backups serão restauradas na próxima execução.", + "hotExit.onExitAndWindowClose": "Saída à quente será acionada quando o aplicativo for fechado, ou seja, quando a última janela é fechada no Windows/Linux ou quando o comando workbench.action.quit é acionado (paleta de comando, keybinding, menu), e também para qualquer janela com uma pasta aberta independentemente se é a última janela. Todas as janelas sem pastas abertas serão restauradas na próxima execução. Para restaurar as janelas de pastas como eram antes do desligamento configure \"window.reopenFolders\" para \"todos\".", + "hotExit": "Controla se os arquivos não salvos são lembrados entre as sessões, permitindo salvar alerta ao sair do editor seja ignorada.", + "defaultLanguage": "O modo de linguagem padrão que é atribuída para novos arquivos.", + "editorConfigurationTitle": "Editor", + "formatOnSave": "Formata um arquivo no salvamento. Um formatador deve estar disponível, o arquivo não deve ser salvo automaticamente e editor não deve ser desligado.", + "explorerConfigurationTitle": "Explorador de arquivos", + "openEditorsVisible": "Número de editores mostrado no painel Abrir Editores. Configurá-lo para 0 irá ocultar o painel.", + "dynamicHeight": "Controla se a altura da seção de editores abertos deve adaptar-se dinamicamente para o número de elementos ou não.", + "autoReveal": "Controla se o explorador deve automaticamente revelar e selecionar arquivos ao abri-los.", + "enableDragAndDrop": "Controla se o explorador deve permitir mover arquivos e pastas através de arrastar e soltar." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/saveErrorHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/saveErrorHandler.i18n.json new file mode 100644 index 00000000000..30a0a48f866 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/saveErrorHandler.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "discard": "Descartar", + "overwrite": "Sobrescrever", + "retry": "Tentar novamente", + "readonlySaveError": "Falha ao salvar '{0}': O arquivo está protegido contra gravação. Selecione 'Substituir' para remover a proteção.", + "genericSaveError": "Erro ao salvar '{0}': {1}", + "staleSaveError": "Falha ao salvar '{0}': O conteúdo no disco é mais recente. Clique em **Comparar** para comparar a sua versão com a do disco.", + "compareChanges": "Comparar", + "saveConflictDiffLabel": "{0} (no disco) ↔ {1} (em {2}) - Resolver conflitos de salvamento", + "userGuide": "Use as ações na barra de ferramentas do editor para **desfazer** suas alterações ou **substituir** o conteúdo no disco com as suas alterações" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/views/emptyView.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/views/emptyView.i18n.json new file mode 100644 index 00000000000..58da5446b25 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/views/emptyView.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "explorerSection": "Seção de Explorador de Arquivos", + "noWorkspace": "Nenhuma Pasta Aberta", + "noWorkspaceHelp": "Você ainda não abriu uma pasta.", + "openFolder": "Abrir Pasta" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/views/explorerView.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/views/explorerView.i18n.json new file mode 100644 index 00000000000..4753a88bd4c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/views/explorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "explorerSection": "Seção de Explorador de Arquivos", + "treeAriaLabel": "Explorador de Arquivos" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/views/explorerViewer.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/views/explorerViewer.i18n.json new file mode 100644 index 00000000000..c670883e6ac --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/views/explorerViewer.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileInputAriaLabel": "Digite o Nome do arquivo. Pressione Enter para confirmar ou Escape para cancelar.", + "filesExplorerViewerAriaLabel": "{0}, Explorador de Arquivos", + "confirmOverwriteMessage": "'{0}' já existe na pasta de destino. Deseja substituí-lo?", + "irreversible": "Esta ação é irreversível!", + "replaceButtonLabel": "&&Substituir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json new file mode 100644 index 00000000000..4db9c1f34d8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openEditosrSection": "Abrir Seção de Editores", + "openEditors": "Abrir Editores", + "treeAriaLabel": "Abrir Editores: Lista de Arquivos Ativos", + "dirtyCounter": "{0} não salvos" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/views/openEditorsViewer.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/views/openEditorsViewer.i18n.json new file mode 100644 index 00000000000..dbef8f2ddb5 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/views/openEditorsViewer.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorGroupAriaLabel": "{0}, Agrupar Editor", + "openEditorAriaLabel": "{0}, Abrir Editor", + "saveAll": "Salvar Todos", + "closeAll": "Fechar todos", + "close": "Fechar", + "closeOthers": "Fechar Outros" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json new file mode 100644 index 00000000000..9e75b7b2a89 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "dirtyFiles": "{0} arquivos não salvos" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/common/editors/fileEditorInput.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/common/editors/fileEditorInput.i18n.json new file mode 100644 index 00000000000..f29992f5d95 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/common/editors/fileEditorInput.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "orphanedFile": "{0} (excluído do disco)" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/html/browser/html.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/html/browser/html.contribution.i18n.json new file mode 100644 index 00000000000..f9530b0f6f6 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/html/browser/html.contribution.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "html.editor.label": "Visualização Html" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/html/browser/htmlPreviewPart.i18n.json b/i18n/ptb/src/vs/workbench/parts/html/browser/htmlPreviewPart.i18n.json new file mode 100644 index 00000000000..8df4c48f58c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/html/browser/htmlPreviewPart.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "html.voidInput": "Entrada inválida do editor." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/html/browser/webview.i18n.json b/i18n/ptb/src/vs/workbench/parts/html/browser/webview.i18n.json new file mode 100644 index 00000000000..2ef4463deb9 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/html/browser/webview.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "devtools.webview": "Desenvolvedor: Ferramentas Webview" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/markers/common/messages.i18n.json b/i18n/ptb/src/vs/workbench/parts/markers/common/messages.i18n.json new file mode 100644 index 00000000000..8576955d609 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/markers/common/messages.i18n.json @@ -0,0 +1,39 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "viewCategory": "Exibir", + "problems.view.show.label": "Mostrar Problemas", + "problems.panel.configuration.title": "Visualização de Problemas", + "problems.panel.configuration.autoreveal": "Controla se a visaulização de problemas evela os arquivos automaticamente ao abri-los", + "markers.panel.title.problems": "Problemas", + "markers.panel.aria.label.problems.tree": "Problemas agrupados por arquivos", + "markers.panel.no.problems.build": "Nenhum problema foi detectado na área de trabalho até agora.", + "markers.panel.no.problems.filters": "Nenhum resultado encontrado com os critérios de filtro fornecidos", + "markers.panel.action.filter": "Problemas de Filtro", + "markers.panel.filter.placeholder": "Filtrar por tipo ou texto", + "markers.panel.filter.errors": "erros", + "markers.panel.filter.warnings": "avisos", + "markers.panel.filter.infos": "informações", + "markers.panel.single.error.label": "1 Erro", + "markers.panel.multiple.errors.label": "{0} Erros", + "markers.panel.single.warning.label": "1 Aviso", + "markers.panel.multiple.warnings.label": "{0} Avisos", + "markers.panel.single.info.label": "1 Informação", + "markers.panel.multiple.infos.label": "{0} Informações", + "markers.panel.single.unknown.label": "1 Desconhecido", + "markers.panel.multiple.unknowns.label": "{0} Desconhecidos", + "markers.panel.at.ln.col.number": "({0}, {1})", + "problems.tree.aria.label.resource": "{0} com {1} problemas", + "problems.tree.aria.label.error.marker": "Erro gerado por {0}: {1} na linha {2} e caractere {3}", + "problems.tree.aria.label.error.marker.nosource": "Erro: {0} na linha {1} e caractere {2}", + "problems.tree.aria.label.warning.marker": "Aviso gerado por {0}: {1} na linha {2} e caractere {3}", + "problems.tree.aria.label.warning.marker.nosource": "Aviso: {0} na linha {1} e caractere {2}", + "problems.tree.aria.label.info.marker": "Informação gerada por {0}: {1} na linha {2} e caractere {3}", + "problems.tree.aria.label.info.marker.nosource": "Informação: {0} na linha {1} e caractere {2}", + "problems.tree.aria.label.marker": "Problema gerado por {0}: {1} na linha {2} e caractere {3}", + "problems.tree.aria.label.marker.nosource": "Problema: {0} na linha {1} e caractere {2}", + "errors.warnings.show.label": "Mostrar Erros e Avisos" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markersElectronContributions.i18n.json b/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markersElectronContributions.i18n.json new file mode 100644 index 00000000000..027c80cca30 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markersElectronContributions.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "copyMarker": "Copiar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/nps/electron-browser/nps.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/nps/electron-browser/nps.contribution.i18n.json new file mode 100644 index 00000000000..1ec18c632a4 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/nps/electron-browser/nps.contribution.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "surveyQuestion": "Você deseja responder a uma pequena pesquisa?", + "takeSurvey": "Responder a pesquisa", + "remindLater": "Lembrar mais tarde", + "neverAgain": "Não mostrar novamente" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/output/browser/output.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/output/browser/output.contribution.i18n.json new file mode 100644 index 00000000000..e36bdadf4e9 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/output/browser/output.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "output": "Saída", + "viewCategory": "Exibir", + "clearOutput.label": "Limpar saída" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/output/browser/outputActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/output/browser/outputActions.i18n.json new file mode 100644 index 00000000000..00bca0dc309 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/output/browser/outputActions.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleOutput": "Alternar Saída", + "clearOutput": "Limpar saída", + "toggleOutputScrollLock": "Alternar Scroll Lock de Saída", + "switchToOutput.label": "Mudar para Saída" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/output/browser/outputPanel.i18n.json b/i18n/ptb/src/vs/workbench/parts/output/browser/outputPanel.i18n.json new file mode 100644 index 00000000000..ec28fd7b2a3 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/output/browser/outputPanel.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "outputPanelWithInputAriaLabel": "{0}, Painel de saída", + "outputPanelAriaLabel": "Painel de saída" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/output/common/output.i18n.json b/i18n/ptb/src/vs/workbench/parts/output/common/output.i18n.json new file mode 100644 index 00000000000..a083a6e7d9d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/output/common/output.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "output": "Saída", + "channel": "para '{0}'" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json new file mode 100644 index 00000000000..5fda62eb168 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "slow": "Inicialização lenta detectada", + "slow.detail": "Pena que você teve uma inicialização lenta. Por favor reinicie '{0}' com perfil de desempenho habilitado, compartilhe os perfis conosco e nós trabalharemos duro para fazer com que a inicialização fique perfeita novamente.", + "prof.message": "Perfis criados com sucesso.", + "prof.detail": "Por favor, crie um problema e anexe manualmente os seguintes arquivos:\n{0}", + "prof.restartAndFileIssue": "Criar Problema e Reiniciar", + "prof.restart": "Reiniciar", + "prof.thanks": "Obrigado por nos ajudar.", + "prof.detail.restart": "É necessário um reinício final para continuar a usar '{0}'. Novamente, obrigado pela sua contribuição." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json new file mode 100644 index 00000000000..279307d4b87 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defineKeybinding.initial": "Pressionar a combinação de teclas desejada e ENTER. ESCAPE para cancelar.", + "defineKeybinding.chordsTo": "Acorde para" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json new file mode 100644 index 00000000000..1cb6541687c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -0,0 +1,35 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "keybindingsInputName": "Atalhos de Teclado", + "SearchKeybindings.AriaLabel": "Pesquisar keybindings", + "SearchKeybindings.Placeholder": "Pesquisar keybindings", + "sortByPrecedene": "Ordenar por precedência", + "header-message": "Para personalizações avançadas abrir e editar", + "keybindings-file-name": "keybindings.json", + "keybindingsLabel": "Keybindings", + "changeLabel": "Alterar Keybinding", + "addLabel": "Adicionar Keybinding", + "removeLabel": "Remover Keybinding", + "resetLabel": "Redefinir Keybinding", + "showConflictsLabel": "Mostrar Conflitos", + "copyLabel": "Copiar", + "error": "Erro '{0}' enquanto edita keybinding. Por favor, abra o arquivo 'keybindings.json' e verifique.", + "command": "Comando", + "keybinding": "KeyBinding", + "source": "Fonte", + "when": "Quando", + "editKeybindingLabelWithKey": "Alterar Keybinding {0}", + "editKeybindingLabel": "Alterar Keybinding", + "addKeybindingLabelWithKey": "Adicionar Keybinding {0}", + "addKeybindingLabel": "Adicionar Keybinding", + "commandAriaLabel": "Comando é {0}.", + "keybindingAriaLabel": "KeyBinding é {0}.", + "noKeybinding": "Nenhum Keybinding atribuído.", + "sourceAriaLabel": "Fonte é {0}.", + "whenAriaLabel": "Quando é {0}.", + "noWhen": "Sem contexto Quando." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.i18n.json new file mode 100644 index 00000000000..15fd432f9fa --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defineKeybinding.start": "Definir Keybinding", + "defineKeybinding.kbLayoutInfoMessage": "Para o seu layout de teclado atual pressionar", + "defineKeybinding.kbLayoutErrorMessage": "Você não será capaz de produzir esta combinação de teclas sob seu layout de teclado atual." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferences.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferences.contribution.i18n.json new file mode 100644 index 00000000000..40e6d0841da --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferences.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultPreferencesEditor": "Editor de Preferências Padrão", + "keybindingsEditor": "Editor de Keybindings", + "preferences": "Preferências" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json new file mode 100644 index 00000000000..461e0fb96f7 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openGlobalSettings": "Abra as Configurações de Usuário", + "openGlobalKeybindings": "Abrir Atalhos de Teclado", + "openGlobalKeybindingsFile": "Abrir Arquivo de Atalhos de Teclado", + "openWorkspaceSettings": "Abrir as configurações do espaço de trabalho", + "configureLanguageBasedSettings": "Definir Configurações Específicas de Linguagem...", + "languageDescriptionConfigured": "({0})", + "pickLanguage": "Selecionar Linguagem" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json new file mode 100644 index 00000000000..e3ef1e68a73 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "settingsEditorName": "Configurações Padrão", + "SearchSettingsWidget.AriaLabel": "Configurações de Pesquisa", + "SearchSettingsWidget.Placeholder": "Configurações de Pesquisa", + "totalSettingsMessage": "Total {0} Configurações", + "noSettingsFound": "Nenhum resultado", + "oneSettingFound": "1 Configuração correspondente", + "settingsFound": "{0} Configurações correspondentes", + "preferencesAriaLabel": "Preferências padrão. Editor de texto somente leitura." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json new file mode 100644 index 00000000000..e35427eb2df --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "errorInvalidConfiguration": "Não é possível gravar em configurações. Corrija erros/avisos no arquivo e tente novamente.", + "editTtile": "Editar", + "replaceDefaultValue": "Substituir nas Configurações", + "copyDefaultValue": "Copiar para Configurações", + "unsupportedPHPExecutablePathSetting": "Essa configuração deve ser uma Configuração de Usuário. Para configurar o PHP para o espaço de trabalho, abra um arquivo PHP e clique em 'Caminho do PHP' na barra de status.", + "unsupportedWorkspaceSetting": "Essa configuração deve ser uma Configuração de Usuário." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesService.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesService.i18n.json new file mode 100644 index 00000000000..3d94af63615 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesService.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openFolderFirst": "Abrir uma pasta primeiro para criar configurações de espaço de trabalho", + "emptyKeybindingsHeader": "Coloque suas chaves de ligações neste arquivo para substituir os padrões", + "defaultKeybindings": "Keybindings Padrão", + "emptySettingsHeader": "Colocar suas configurações nesse arquivo para sobrecrever as configurações padrão", + "emptySettingsHeader1": "Colocar as suas configurações nesse arquivo para sobrescrever as configurações e usuário padrão.", + "fail.createSettings": "Não foi possível criar '{0}' ({1})." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json new file mode 100644 index 00000000000..556ef65c079 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "settingsSwitcherBarAriaLabel": "Chave de Configurações", + "userSettings": "Configurações de Usuário", + "workspaceSettings": "Configurações de Espaço de Trabalho" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.i18n.json new file mode 100644 index 00000000000..68e05e00daf --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "default": "Valor padrão", + "user": "Usuário", + "meta": "meta", + "option": "opção" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/common/preferencesModels.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/common/preferencesModels.i18n.json new file mode 100644 index 00000000000..6427118b75b --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/common/preferencesModels.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "commonlyUsed": "Comumente Utilizado", + "defaultKeybindingsHeader": "Substituir as chaves de ligações, colocando-os em seu arquivo de chave ligações." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json new file mode 100644 index 00000000000..7b246da25ad --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showTriggerActions": "Mostrar todos os comandos", + "showCommands.label": "Paleta de comandos...", + "entryAriaLabelWithKey": "{0}, {1}, comandos", + "entryAriaLabel": "{0}, comandos", + "canNotRun": "O comando '{0}' não pode ser executado a partir daqui.", + "actionNotEnabled": "O comando '{0}' não está habilitado no contexto atual.", + "commandLabel": "{0}: {1}", + "cat.title": "{0}: {1}", + "noCommandsMatching": "Não há comandos correspondentes" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json new file mode 100644 index 00000000000..3f922e6deca --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "gotoLine": "Ir para linha...", + "gotoLineLabelEmptyWithLimit": "Digite um número de linha entre 1 e {0} para navegar para lá", + "gotoLineLabelEmpty": "Digite um número de linha para navegar para lá", + "gotoLineColumnLabel": "Ir para linha {0} e caractere {1}", + "gotoLineLabel": "Ir para linha {0}", + "gotoLineHandlerAriaLabel": "Digite um número de linha para navegar.", + "cannotRunGotoLine": "Abrir um arquivo de texto primeiro para ir a uma linha" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.i18n.json new file mode 100644 index 00000000000..5e56bdc5890 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.i18n.json @@ -0,0 +1,34 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "gotoSymbol": "Ir para o Símbolo no Arquivo...", + "symbols": "símbolos ({0})", + "method": "métodos ({0})", + "function": "funções ({0})", + "_constructor": "construtores ({0})", + "variable": "variáveis ({0})", + "class": "classes ({0})", + "interface": "interfaces ({0})", + "namespace": "namespaces ({0})", + "package": "pacotes ({0})", + "modules": "módulos ({0})", + "property": "propriedades ({0})", + "enum": "enumerações ({0})", + "string": "cadeias de caracteres ({0})", + "rule": "regras ({0})", + "file": "arquivos ({0})", + "array": "matrizes ({0})", + "number": "números ({0})", + "boolean": "booleanos ({0})", + "object": "objetos ({0})", + "key": "chaves ({0})", + "entryAriaLabel": "{0}, símbolos", + "noSymbolsMatching": "Não há símbolos correspondentes", + "noSymbolsFound": "Nenhum símbolo encontrado", + "gotoSymbolHandlerAriaLabel": "Tipo para reduzir os símbolos do editor ativo atual.", + "cannotRunGotoSymbolInFile": "Não há informações de símbolo para o arquivo", + "cannotRunGotoSymbol": "Abrir um arquivo de texto primeiro para ir a um símbolo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/quickopen/browser/helpHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/helpHandler.i18n.json new file mode 100644 index 00000000000..0a2fc637f73 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/helpHandler.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "entryAriaLabel": "{0}, ajuda do seletor", + "globalCommands": "comandos globais", + "editorCommands": "comandos do editor" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/quickopen/browser/quickopen.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/quickopen.contribution.i18n.json new file mode 100644 index 00000000000..e3c6204b605 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/quickopen.contribution.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "commandsHandlerDescriptionDefault": "Exibir e executar comandos", + "gotoLineDescriptionMac": "Ir para linha", + "gotoLineDescriptionWin": "Ir para linha", + "gotoSymbolDescription": "Ir para o Símbolo no Arquivo", + "gotoSymbolDescriptionScoped": "Ir para o Símbolo no Arquivo Por Categoria", + "helpDescription": "Mostrar ajuda", + "viewPickerDescription": "Abrir Visualização" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.i18n.json new file mode 100644 index 00000000000..38804354794 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "entryAriaLabel": "{0}, visualizar seletor", + "views": "Modos de exibição", + "panels": "Painéis", + "terminals": "Terminal", + "terminalTitle": "{0}: {1}", + "channels": "Saída", + "openView": "Abrir Visualização", + "quickOpenView": "Abrir Visualização Rápida" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json new file mode 100644 index 00000000000..1b5369ebeea --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleGitViewlet": "Mostrar Git", + "installAdditionalSCMProviders": "Instalar provedores de SCM adicionais...", + "source control": "Controle de código-fonte", + "toggleSCMViewlet": "Mostrar SCM", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmActivity.i18n.json b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmActivity.i18n.json new file mode 100644 index 00000000000..7846e2b872d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmActivity.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "scmPendingChangesBadge": "{0} alterações pendentes" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json new file mode 100644 index 00000000000..5b93869e8d8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "installAdditionalSCMProviders": "Instalar provedores de SCM adicionais...", + "switch provider": "Mudar Provedor SCM..." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json new file mode 100644 index 00000000000..c14da801978 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "commitMessage": "Mensagem (tecle {0} para confirmar)", + "source control": "Controle de código-fonte", + "viewletTitle": "{0}: {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/openAnythingHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/openAnythingHandler.i18n.json new file mode 100644 index 00000000000..8d523511515 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/openAnythingHandler.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileAndTypeResults": "resultados do arquivo e símbolo", + "fileResults": "resultados do arquivo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/openFileHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/openFileHandler.i18n.json new file mode 100644 index 00000000000..016a91f2c32 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/openFileHandler.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "entryAriaLabel": "{0}, seletor de arquivo", + "searchResults": "resultados da pesquisa" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/openSymbolHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/openSymbolHandler.i18n.json new file mode 100644 index 00000000000..ede0a0c718d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/openSymbolHandler.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "entryAriaLabel": "{0}, selecionador de símbolos", + "symbols": "resultados de símbolo", + "noSymbolsMatching": "Não há símbolos correspondentes", + "noSymbolsWithoutInput": "Digitar para pesquisar símbolos" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json new file mode 100644 index 00000000000..68c8c0ad6b7 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultLabel": "entrada", + "patternDescription": "Use Padrões Glob", + "patternHelpInclude": "O padrão para combinações. Por exemplo, **\\*\\*/*.js** para corresponder a todos os arquivos JavaScript ou **myFolder/\\*\\*** para corresponder a essa pasta com todas pastas aninhadas.\n\n**Referência**:\n**\\*** corresponde a 0 ou mais caracteres\n**?** corresponde a 1 caractere\n**\\*\\*** corresponde a zero ou mais diretórios\n**[a-z]** corresponde a um intervalo de caracteres\n**{a, b}** corresponde a qualquer um dos padrões)", + "useIgnoreFilesDescription": "Usar Ignorar Arquivos", + "useExcludeSettingsDescription": "Usar Configurações de Exclusão" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/replaceService.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/replaceService.i18n.json new file mode 100644 index 00000000000..05d7f4e4cd0 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/replaceService.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileReplaceChanges": "{0} ↔ {1} (Substituir Preview)" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/search.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/search.contribution.i18n.json new file mode 100644 index 00000000000..b14e20a1487 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/search.contribution.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showTriggerActions": "Ir para Símbolo no Espaço de Trabalho...", + "name": "Pesquisar", + "showSearchViewlet": "Mostrar Busca", + "view": "Exibir", + "findInFiles": "Localizar nos Arquivos", + "openAnythingHandlerDescription": "Ir para o Arquivo", + "openSymbolDescriptionNormal": "Ir para o Símbolo em Área de Trabalho", + "searchOutputChannelTitle": "Pesquisar", + "searchConfigurationTitle": "Pesquisar", + "exclude": "Configure os padrões glob para excluir arquivos e pastas nas pesquisas. Herda todos os padrões glob da configuração files.exclude.", + "exclude.boolean": "O padrão glob com o qual combinar os caminhos de arquivo. Defina para verdadeiro ou falso para habilitar ou desabilitar o padrão.", + "exclude.when": "Verificação adicional nos irmãos de um arquivo correspondente. Use $(basename) como variável para o nome do arquivo correspondente.", + "useRipgrep": "Controla se deve utilizar ripgrep na pesquisa de texto", + "useIgnoreFilesByDefault": "Controla se deve utilizar arquivos .gitignore e .ignore por padrão ao fazer pesquisas em um novo espaço de trabalho.", + "search.quickOpen.includeSymbols": "Configurar para incluir resultados de uma pesquisa símbolo global nos resultados do arquivo para Abertura Rápida." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/searchActions.i18n.json new file mode 100644 index 00000000000..94f7c40e782 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "nextSearchTerm": "Mostrar o Próximo Termo de Pesquisa", + "previousSearchTerm": "Mostrar Termo de Pesquisa Anterior", + "focusNextInputBox": "Focalizar a Próxima Caixa de Entrada", + "focusPreviousInputBox": "Focalizar a Caixa de Entrada Anterior", + "replaceInFiles": "Substituir nos Arquivos", + "findInFolder": "Encontrar na pasta", + "RefreshAction.label": "Atualizar", + "ClearSearchResultsAction.label": "Limpar os Resultados da Pesquisa", + "FocusNextSearchResult.label": "Focalizar o Próximo Resultado da Pesquisa", + "FocusPreviousSearchResult.label": "Focalizar o Resultado da Pesquisa Anterior", + "RemoveAction.label": "Remover", + "file.replaceAll.label": "Substituir Tudo", + "match.replace.label": "Substituir", + "ConfigureGlobalExclusionsAction.label": "Abrir configurações" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json new file mode 100644 index 00000000000..3edda1861fb --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "searchMatches": "{0} correspondências encontradas", + "searchMatch": "{0} correspondência encontrada", + "fileMatchAriaLabel": "{0} correspondências no arquivo {1} da pasta {2}, Resultado da pesquisa", + "replacePreviewResultAria": "Substitua o termo {0} pelo termo {1} na coluna posição {2} correspondente ao texto {3}", + "searchResultAria": "Encontrado o termo {0} na posição da coluna {1} correspondente ao texto {2}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/searchViewlet.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/searchViewlet.i18n.json new file mode 100644 index 00000000000..4ceea616010 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/searchViewlet.i18n.json @@ -0,0 +1,50 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "moreSearch": "Alternar Detalhes da Pesquisa", + "searchScope.includes": "arquivos a serem incluídos", + "label.includes": "Pesquisa Padrões de Inclusão", + "searchScope.excludes": "arquivos a serem excluídos", + "label.excludes": "Pesquisa de Padrões de Exclusão", + "global.searchScope.folders": "arquivos excluídos pelas configurações", + "label.global.excludes": "Configurado pesquisa padrões de exclusão", + "replaceAll.confirmation.title": "Substituir Tudo", + "replaceAll.confirm.button": "Substituir", + "replaceAll.occurrence.file.message": "Substituída {0} ocorrência no arquivo {1} com '{2}'.", + "removeAll.occurrence.file.message": "Substituída {0} ocorrência no arquivo {1}'.", + "replaceAll.occurrence.files.message": "Substituída {0} ocorrência no arquivo {1} com '{2}'.", + "removeAll.occurrence.files.message": "Substituída {0} ocorrência nos arquivos {1}", + "replaceAll.occurrences.file.message": "Substituídas {0} ocorrências no arquivo {1} com '{2}'.", + "removeAll.occurrences.file.message": "Substituídas {0} ocorrências nos arquivo {1}.", + "replaceAll.occurrences.files.message": "Substituídas {0} ocorrências nos arquivos {1} com '{2}'.", + "removeAll.occurrences.files.message": "Substituídas {0} ocorrências nos arquivos {1}.", + "removeAll.occurrence.file.confirmation.message": "Substituir {0} ocorrências no arquivo {1} com '{2}'?", + "replaceAll.occurrence.file.confirmation.message": "Substituir {0} ocorrência no arquivo {1}?", + "removeAll.occurrence.files.confirmation.message": "Substituir {0} ocorrência nos arquivos {1} com '{2}'?", + "replaceAll.occurrence.files.confirmation.message": "Substituir {0} ocorrência nos arquivos {1}?", + "removeAll.occurrences.file.confirmation.message": "Substituir {0} ocorrências no arquivo {1} com '{2}'?", + "replaceAll.occurrences.file.confirmation.message": "Substituir {0} ocorrências no arquivo {1}?", + "removeAll.occurrences.files.confirmation.message": "Substituir {0} ocorrências nos arquivos {1} com '{2}'?", + "replaceAll.occurrences.files.confirmation.message": "Substituir {0} ocorrências nos arquivos {1}?", + "treeAriaLabel": "Resultados da Pesquisa", + "globLabel": "{0} quando {1}", + "searchMaxResultsWarning": "O conjunto de resultados contém apenas um subconjunto de todas as correspondências. Seja mais específico na sua pesquisa para diminuir o número de resultados.", + "searchCanceled": "Pesquisa foi cancelada antes de qualquer resultado ser encontrado - ", + "noResultsIncludesExcludes": "Nenhum resultado encontrado em '{0}' excluindo '{1}' - ", + "noResultsIncludes": "Nenhum resultado encontrado em '{0}' -", + "noResultsExcludes": "Nenhum resultado encontrado excluindo '{0}' -", + "noResultsFound": "Nenhum resultado encontrado. Analise as configurações para exclusões configuradas - ", + "rerunSearch.message": "Pesquisar novamente", + "rerunSearchInAll.message": "Pesquisar novamente em todos os arquivos", + "openSettings.message": "Abrir configurações", + "ariaSearchResultsStatus": "Pesquisa retornou {0} resultados em {1} arquivos", + "search.file.result": "{0} resultado no arquivo {1}", + "search.files.result": "{0} resultado nos arquivos {1}", + "search.file.results": "{0} resultados no arquivo {1}", + "search.files.results": "{0} resultados nos arquivos {1}", + "searchWithoutFolder": "Você ainda não abriu uma pasta. Somente arquivos abertos são pesquisados - ", + "openFolder": "Abrir Pasta" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/searchWidget.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/searchWidget.i18n.json new file mode 100644 index 00000000000..41178af28cc --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/searchWidget.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "search.action.replaceAll.disabled.label": "Substituir Todos (Submeter Pesquisa para Habilitar)", + "search.action.replaceAll.enabled.label": "Substituir Tudo", + "search.replace.toggle.button.title": "Alternar Substituir", + "label.Search": "Pesquisar: Digite o termo de pesquisa e pressione Enter para pesquisar ou Escape para cancelar", + "search.placeHolder": "Pesquisar", + "label.Replace": "Substituir: Digite o termo a ser substituído e pressione Enter para visualizar ou Escape para cancelar", + "search.replace.placeHolder": "Substituir", + "regexp.validationFailure": "A expressão corresponde a tudo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json new file mode 100644 index 00000000000..0f8e6360187 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "vscode.extension.contributes.snippets": "Contribui aos trechos de código.", + "vscode.extension.contributes.snippets-language": "Identificador de linguagem para o qual este trecho de código contribui.", + "vscode.extension.contributes.snippets-path": "Caminho do arquivo de trechos de código. O caminho é relativo à pasta de extensão e normalmente começa com '. /snippets/'.", + "invalid.language": "Linguagem desconhecida em `contributes.{0}.language`. Valor fornecido: {1}", + "invalid.path.0": "Esperada uma string em `contributes.{0}.path`. Valor informado: {1}", + "invalid.path.1": "É esperado que `contributes.{0}.path` ({1}) seja incluído na pasta da extensão ({2}). Isto pode tornar a extensão não portável." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json new file mode 100644 index 00000000000..6c34a620b89 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "snippet.suggestions.label": "Inserir trecho de código" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.i18n.json new file mode 100644 index 00000000000..05f799f7b6a --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openSnippet.label": "Abrir trechos de código do usuário", + "openSnippet.pickLanguage": "Selecionar Idioma para o Trecho", + "openSnippet.errorOnCreate": "Não é possível criar {0}", + "preferences": "Preferências", + "snippetSchema.json.default": "Trecho de código vazio", + "snippetSchema.json": "Configuração do trecho do usuário", + "snippetSchema.json.prefix": "O prefixo usado ao selecionar o trecho no intelliSense", + "snippetSchema.json.body": "O conteúdo do trecho de código. Use '${id}', '${id: rótulo}', '${1:label}' para variáveis e '$0', '$1' para posições do cursor", + "snippetSchema.json.description": "A descrição do trecho." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json new file mode 100644 index 00000000000..a4a18c1e970 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "detail.userSnippet": "Trecho de código do usuário", + "snippetSuggest.longLabel": "{0}, {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/tabCompletion.i18n.json b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/tabCompletion.i18n.json new file mode 100644 index 00000000000..adfb9a4190d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/tabCompletion.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "tabCompletion": "Inserir trechos de código quando seu prefixo corresponder. Funciona melhor quando 'quickSuggestions' não está habilitado." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json new file mode 100644 index 00000000000..be3fefb5d3d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "entryAriaLabel": "{0}, tarefas", + "workspace": "Do espaço de trabalho", + "extension": "De extensões" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json new file mode 100644 index 00000000000..4009d3b8154 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "tasksAriaLabel": "Digite o nome de uma tarefa para reiniciar", + "noTasksMatching": "Não há tarefas correspondentes", + "noTasksFound": "Não há tarefa para ser reiniciada" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json new file mode 100644 index 00000000000..6b4d6134384 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "tasksAriaLabel": "Digite o nome de uma tarefa para executar", + "noTasksMatching": "Não há tarefas correspondentes", + "noTasksFound": "Não há tarefas encontradas" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/browser/terminateQuickOpen.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/browser/terminateQuickOpen.i18n.json new file mode 100644 index 00000000000..9c5ee4b4b59 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/browser/terminateQuickOpen.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "tasksAriaLabel": "Digite o nome de uma tarefa para finalizar", + "noTasksMatching": "Não há tarefas correspondentes", + "noTasksFound": "Nenhuma tarefa para finalizar encontrada" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/common/taskConfiguration.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/common/taskConfiguration.i18n.json new file mode 100644 index 00000000000..2de0b161ac8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/common/taskConfiguration.i18n.json @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ConfigurationParser.invalidCWD": "Aviso: options.cwd deve ser do tipo string. Ignorando valor {0}\n", + "ConfigurationParser.noShell": "Aviso: A configuração do shell somente é suportada quando estiver executando tarefas no terminal.", + "ConfigurationParser.noargs": "Erro: Argumentos do comando devem ser uma matriz de strings. Valor informado é:\n{0}", + "ConfigurationParser.noName": "Erro: Problem Matcher no escopo declarado deve ter um nome:\n{0}\n", + "ConfigurationParser.unknownMatcherKind": "Aviso: a correspondência de problema definido é desconhecido. Tipos suportados são string | ProblemMatcher | (string | ProblemMatcher)[].\n{0}\n", + "ConfigurationParser.invalidVaraibleReference": "Erro: ProblemMatcher inválido referência: {0}\n", + "ConfigurationParser.noTaskName": "Erro: tarefas devem fornecer uma propriedade taskName. A tarefa será ignorada.\n{0}\n", + "taskConfiguration.shellArgs": "Aviso: a tarefa '{0}' é um comando do shell e o nome de comando ou um dos seus argumentos tem espaços sem escape. Para garantir a linha de comando correta por favor mesclar argumentos no comando.", + "taskConfiguration.noCommandOrDependsOn": "Erro: a tarefa '{0}' também não especifica um comando ou uma propriedade dependsOn. A tarefa será ignorada. Sua definição é: {1}", + "taskConfiguration.noCommand": "Erro: a tarefa '{0}' não define um comando. A tarefa será ignorada. Sua definição é: {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/common/taskTemplates.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/common/taskTemplates.i18n.json new file mode 100644 index 00000000000..268871153e3 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/common/taskTemplates.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "tsc.config": "Compila um projeto TypeScript", + "tsc.watch": "Compila um projeto TypeScript em mode de monitoramento", + "dotnetCore": "Executa comando de compilação do .NET Core", + "msbuild": "Executa a compilação destino", + "externalCommand": "Exemplo para executar um comando externo arbitrário", + "Maven": "Executa comandos comuns específicos" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.i18n.json new file mode 100644 index 00000000000..92ae501cdc8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.i18n.json @@ -0,0 +1,38 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "JsonSchema.options": "Opções de comando adicionais", + "JsonSchema.options.cwd": "O diretório de trabalho atual do programa executado ou do script. Se omitido raiz de espaço de trabalho atual do código é usado.", + "JsonSchema.options.env": "O ambiente do programa executado ou comando shell. Se omitido o ambiente do processo pai é usado.", + "JsonSchema.shell.executable": "O shell a ser usado.", + "JsonSchema.shell.args": "Os argumentos shell.", + "JsonSchema.command": "O comando a ser executado. Pode ser um programa externo ou um comando shell.", + "JsonSchema.tasks.args": "Argumentos passados para o comando quando esta tarefa é invocada.", + "JsonSchema.tasks.taskName": "Nome da tarefa", + "JsonSchema.tasks.windows": "Configuração de comando específica do Windows", + "JsonSchema.tasks.mac": "Configuração de comando específica do Mac", + "JsonSchema.tasks.linux": "Configuração de comando específica do Linux", + "JsonSchema.tasks.suppressTaskName": "Controla se o nome de tarefa é adicionado como um argumento para o comando. Se omitido o valor definido globalmente é usado.", + "JsonSchema.tasks.showOutput": "Controla se a saída da execução de tarefas é mostrada ou não. Se omitido o valor definido globalmente é usado.", + "JsonSchema.echoCommand": "Controla se o comando executado é enviado para a saída. O padrão é false.", + "JsonSchema.tasks.watching.deprecation": "Descontinuado. Use isBackground.", + "JsonSchema.tasks.watching": "Se a tarefa executada é mantida viva e está monitorando o sistema de arquivos.", + "JsonSchema.tasks.background": "Se a tarefa executada é mantida viva e é executado em segundo plano.", + "JsonSchema.tasks.promptOnClose": "Se o usuário é solicitado quando VS Code fecha com uma tarefa sendo executada.", + "JsonSchema.tasks.build": "Esta tarefa é mapeada para o comando de compilação padrão do código.", + "JsonSchema.tasks.test": "Esta tarefa é mapeada para o comando de teste padrão do código.", + "JsonSchema.tasks.matchers": "O problema matcher(s) a seu utilizado. Pode ser uma sequência de caracteres ou uma definição de problem matcher ou uma matriz de sequências de caracteres e problem matchers.", + "JsonSchema.args": "Argumentos adicionais passados para o comando.", + "JsonSchema.showOutput": "Controla se a saída da execução de tarefas é mostrada ou não. Se omitido 'sempre' é usado.", + "JsonSchema.watching.deprecation": "Descontinuado. Use isBackground.", + "JsonSchema.watching": "Se a tarefa executada é mantida viva e está monitorando o sistema de arquivos.", + "JsonSchema.background": "Se a tarefa executada é mantida viva e é executado em segundo plano.", + "JsonSchema.promptOnClose": "Se o usuário é solicitado quando VS Code fecha com uma tarefa de segundo plano em execução.", + "JsonSchema.suppressTaskName": "Controla se o nome de tarefa é adicionado como um argumento para o comando. O padrão é false.", + "JsonSchema.taskSelector": "Prefixo para indicar que um argumento é tarefa.", + "JsonSchema.matchers": "A correspondência de problemas a ser utilizada. Pode ser uma sequência de caracteres ou uma definição de correspondência de problemas ou uma matriz de sequências de caracteres e correspondência de problemas.", + "JsonSchema.tasks": "As configurações de tarefa. Normalmente são ampliações de tarefas já definidas na execução de tarefa externa." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v1.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v1.i18n.json new file mode 100644 index 00000000000..dc0695101b0 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v1.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "JsonSchema.version": "Número da versão do config", + "JsonSchema.windows": "Configuração de comando específica do Windows", + "JsonSchema.mac": "Configuração de comando específica do Mac", + "JsonSchema.linux": "Configuração de comando específica do Linux", + "JsonSchema.shell": "Especifica se o comando é um comando shell ou um programa externo. O padrão é falso se omitido." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json new file mode 100644 index 00000000000..3130e474d7e --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "JsonSchema.version": "Número da versão do config", + "JsonSchema.windows": "Configuração de comando específica do Windows", + "JsonSchema.mac": "Configuração de comando específica do Mac", + "JsonSchema.linux": "Configuração de comando específica do Linux", + "JsonSchema.shell": "Especifica se o comando é um comando shell ou um programa externo. O padrão é falso se omitido.", + "JsonSchema.tasks.dependsOn.string": "Outra tarefa da qual esta tarefa depende.", + "JsonSchema.tasks.dependsOn.array": "A outra tarefa que esta tarefa depende." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json new file mode 100644 index 00000000000..a07be4d2850 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -0,0 +1,47 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "tasksCategory": "Tarefas", + "ConfigureTaskRunnerAction.noWorkspace": "Tarefas somente estão disponíveis em uma pasta da área de trabalho.", + "ConfigureTaskRunnerAction.quickPick.template": "Selecione um gerenciador de tarefa", + "ConfigureTaskRunnerAction.autoDetecting": "Tarefas de auto detecção para {0}", + "ConfigureTaskRunnerAction.autoDetect": "A tarefa de sistema de auto detecção falhou. Usando o modelo padrão. Consulte a saída da tarefa para detalhes.", + "ConfigureTaskRunnerAction.autoDetectError": "A tarefa de sistema de auto detecção produziu erros. Consulte a saída da tarefa para detalhes.", + "ConfigureTaskRunnerAction.failed": "Não é possível criar o arquivo 'tasks.json' na pasta '.vscode'. Consulte a saída da tarefa para detalhes.", + "ConfigureTaskRunnerAction.label": "Configure o gerenciador de tarefas", + "ConfigureBuildTaskAction.label": "Configurar Tarefa de Compilação", + "CloseMessageAction.label": "Fechar", + "ShowTerminalAction.label": "Terminal Visualização", + "problems": "Problemas", + "manyMarkers": "99+", + "tasks": "Tarefas", + "TaskSystem.noHotSwap": "Alterar o mecanismo de execução de tarefa requer reiniciar o VS Code. A alteração será ignorada.", + "TaskService.noBuildTask": "Nenhuma tarefa de compilação definida. Marque uma tarefa com 'isBuildCommand' no arquivo tasks.json.", + "TaskService.noTestTask": "Nenhuma tarefa de teste definida. Marque uma tarefa com 'isTestCommand' no arquivo tasks.json.", + "TaskServer.noTask": "Tarefa {0} requisitada para execução não encontrada.", + "TaskSystem.activeSame": "A tarefa já está ativa e em modo de monitoramento. Para terminar a tarefa, use `F1 > terminar tarefa`", + "TaskSystem.active": "Já existe uma tarefa sendo executada. Finalize-a antes de executar outra tarefa.", + "TaskSystem.restartFailed": "Falha ao finalizar e reiniciar a tarefa {0}", + "TaskSystem.configurationErrors": "Erro: A configuração da tarefa informada possui erros de validação e não pode ser utilizada. Por favor, corrija os erros primeiro.", + "TaskSystem.invalidTaskJson": "Erro: O conteúdo do arquivo tasks.json possui erros de sintaxe. Por favor, corrija-os antes de executar uma tarefa.\n", + "TaskSystem.runningTask": "Há uma tarefa sendo executada. Deseja finalizá-la?", + "TaskSystem.terminateTask": "&&Finalizar Tarefa", + "TaskSystem.noProcess": "A tarefa executada não existe mais. Se a tarefa produziu processos em background, finalizar o VS Code pode resultar em processos órfãos. Para evitar isso inicie o último processo em background com uma flag de espera.", + "TaskSystem.exitAnyways": "&&Sair de qualquer maneira", + "TerminateAction.label": "Finalizar a tarefa sendo executada", + "TaskSystem.unknownError": "Ocorreu um erro enquanto a tarefa estava sendo executada. Verifique o log de tarefas para detalhes.", + "TaskService.noWorkspace": "Tarefas somente estão disponíveis em uma pasta da área de trabalho.", + "TerminateAction.noProcess": "O processo executado não existe mais. Se a tarefa produziu processos em background, finalizar o VS Code pode resultar em processos órfãos.", + "TerminateAction.failed": "Falha ao finalizar a tarefa sendo executada", + "ShowLogAction.label": "Visualizar o Log de Tarefas", + "RunTaskAction.label": "Executar Tarefa", + "RestartTaskAction.label": "Reiniciar Tarefa", + "BuildAction.label": "Executar Tarefa de compilação", + "TestAction.label": "Executar Tarefa de Teste", + "quickOpen.task": "Executar Tarefa", + "quickOpen.terminateTask": "Finalizar Tarefa", + "quickOpen.restartTask": "Reiniciar Tarefa" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json new file mode 100644 index 00000000000..f21b7eebc35 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "TerminalTaskSystem.unknownError": "Um erro desconhecido ocorreu durante a execução de uma tarefa. Consulte o log de saída de tarefa para obter detalhes.", + "TerminalTaskSystem.terminalName": "Tarefa - {0}", + "TerminalTaskSystem": "Não é possível executar um comando shell em uma unidade UNC.", + "unkownProblemMatcher": "Problem matcher {0} não pode ser resolvido. O matcher será ignorado" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/node/processRunnerDetector.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/node/processRunnerDetector.i18n.json new file mode 100644 index 00000000000..a4f13c42f7c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/node/processRunnerDetector.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "TaskSystemDetector.noGulpTasks": "Executando gulp..-tarefas-simples não listam nenhuma tarefa. Você executou a instalação do npm?", + "TaskSystemDetector.noJakeTasks": "Executando jake..-tarefas não listam nenhuma tarefa. Você instalou o npm?", + "TaskSystemDetector.noGulpProgram": "Gulp não está instalado no seu sistema. Execute npm install -g gulp para instalá-lo.", + "TaskSystemDetector.noJakeProgram": "Jake não está instalado no seu sistema. Execute npm install -g jake para instalá-lo.", + "TaskSystemDetector.noGruntProgram": "Grunhido não está instalado no seu sistema. Execute npm install -g grunt para instalá-lo.", + "TaskSystemDetector.noProgram": "Programa {0} não foi encontrado. Mensagem é {1}", + "TaskSystemDetector.buildTaskDetected": "Tarefa de construção chamada '{0}' detectada.", + "TaskSystemDetector.testTaskDetected": "Tarefa de teste chamada '{0}' detectada." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json new file mode 100644 index 00000000000..72848a8cde1 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "TaskRunnerSystem.unknownError": "Um erro desconhecido ocorreu durante a execução de uma tarefa. Consulte o log de saída de tarefa para obter detalhes.", + "TaskRunnerSystem.watchingBuildTaskFinished": "\nTarefas de compilação de monitoramento terminaram.", + "TaskRunnerSystem.childProcessError": "Falha ao iniciar o programa externo {0} {1}.", + "TaskRunnerSystem.cancelRequested": "\nA tarefa '{0}' foi finalizada por solicitação do usuário.", + "unkownProblemMatcher": "Problema matcher {0} não pode ser resolvido. O matcher será ignorado" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json new file mode 100644 index 00000000000..de21ec3dca1 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -0,0 +1,30 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "terminalIntegratedConfigurationTitle": "Terminal Integrado", + "terminal.integrated.shell.linux": "O caminho do shell que o terminal usa no Linux.", + "terminal.integrated.shellArgs.linux": "Os argumentos de linha de comando a serem usados no terminal do Linux.", + "terminal.integrated.shell.osx": "O caminho do shell que o terminal usa no OS X.", + "terminal.integrated.shellArgs.osx": "Os argumentos de linha de comando a serem usados no terminal do OS X.", + "terminal.integrated.shell.windows": "O caminho do shell que o terminal usa no Windows. Quando usar um shell fornecido com o Windows (cmd, PowerShell ou Bash no Ubuntu), prefira utilizar C:\\Windows\\sysnative ao invés de C:\\Windows\\System32 para usar as versões de 64 bits.", + "terminal.integrated.shellArgs.windows": "Os argumentos de linha de comando a serem utilizados no terminal do Windows.", + "terminal.integrated.rightClickCopyPaste": "Quando configurado, isto evitará que o menu de contexto apareça quando pressionado o botão direito do mouse dentro do terminal, em vez disso vai copiar quando há uma seleção e colar quando não há nenhuma seleção.", + "terminal.integrated.fontFamily": "Controla a família de fontes do terminal, este padrão é o valor do editor.fontFamily.", + "terminal.integrated.fontLigatures": "Controla se as ligações de fonte são habilitadas no terminal.", + "terminal.integrated.fontSize": "Controla o tamanho da fonte em pixels do terminal.", + "terminal.integrated.lineHeight": "Controles a altura da linha do terminal, este número é multiplicada pelo tamanho da fonte terminal para obter a altura real da linha em pixels.", + "terminal.integrated.enableBold": "Se habilitar o texto em negrito dentro do terminal requer suporte do terminal shell.", + "terminal.integrated.cursorBlinking": "Controla se o cursor do terminal pisca.", + "terminal.integrated.cursorStyle": "Controla o estilo do cursor do terminal.", + "terminal.integrated.scrollback": "Controla a quantidade máxima de linhas que o terminal mantém em seu buffer.", + "terminal.integrated.setLocaleVariables": "Controla se as variáveis locais são definidas na inicialização do terminal, este padrão é verdadeiro no OS X e falso em outras plataformas.", + "terminal.integrated.cwd": "Um caminho de início explícito onde o terminal será lançado, isso é usado como o diretório de trabalho atual (cwd) para o processo shell. Isto pode ser particularmente útil em configurações de espaço de trabalho se o diretório raiz não é um cwd conveniente.", + "terminal.integrated.confirmOnExit": "Confirmar na saída se ainda houverem sessões de terminal ativas.", + "terminal.integrated.commandsToSkipShell": "Um conjunto de IDs de comando, cujas combinações de teclas não serão enviadas para o shell e sempre serão tratadas por código. Isto permite o uso de combinações de teclas que normalmente seriam consumidas pelo shell para agir da mesma forma quando o terminal não é focado, por exemplo ctrl+p para Execução Rápida.", + "terminal": "Terminal", + "terminalCategory": "Terminal", + "viewCategory": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json new file mode 100644 index 00000000000..e63bd5db0a0 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "workbench.action.terminal.toggleTerminal": "Alternar Terminal Integrado", + "workbench.action.terminal.kill": "Finalizar a Instância de Terminal Ativa", + "workbench.action.terminal.kill.short": "Encerrar Terminal", + "workbench.action.terminal.copySelection": "Copiar Seleção", + "workbench.action.terminal.new": "Criar Novo Terminal Integrado", + "workbench.action.terminal.new.short": "Novo Terminal", + "workbench.action.terminal.focus": "Focalizar Terminal", + "workbench.action.terminal.focusNext": "Focalizar Próximo Terminal", + "workbench.action.terminal.focusAtIndex": "Focalizar Terminal {0}", + "workbench.action.terminal.focusPrevious": "Focalizar Terminal Anterior", + "workbench.action.terminal.paste": "Colar no Terminal Ativo", + "workbench.action.terminal.DefaultShell": "Selecionar Shell Padrão", + "workbench.action.terminal.runSelectedText": "Executar Texto Selecionado no Terminal Ativo", + "workbench.action.terminal.runActiveFile": "Executar Arquivo Ativo no Terminal Ativo", + "workbench.action.terminal.runActiveFile.noFile": "Apenas arquivos em disco podem ser executados no terminal", + "workbench.action.terminal.switchTerminalInstance": "Trocar a instância de Terminal", + "workbench.action.terminal.scrollDown": "Rolar para Baixo (Linha)", + "workbench.action.terminal.scrollDownPage": "Rolar para Baixo (Página)", + "workbench.action.terminal.scrollToBottom": "Rolar para baixo", + "workbench.action.terminal.scrollUp": "Rolar para Cima (Linha)", + "workbench.action.terminal.scrollUpPage": "Rolar para Cima (Página)", + "workbench.action.terminal.scrollToTop": "Rolar para cima", + "workbench.action.terminal.clear": "Limpar", + "workbench.action.terminal.allowWorkspaceShell": "Permitir a Configuração de Shell da Área de Trabalho", + "workbench.action.terminal.disallowWorkspaceShell": "Não Permitir a Configuração de Shell da Área de Trabalho" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json new file mode 100644 index 00000000000..495bd79c4bb --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "terminal.background": "A cor de fundo do terminal, isso permite colorir o terminal com uma cor diferente do painel.", + "terminal.foreground": "A cor de primeiro plano do terminal.", + "terminal.ansiColor": "'{0}' cor ansi no terminal." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.i18n.json new file mode 100644 index 00000000000..b2b9a9a9843 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "terminal.integrated.allowWorkspaceShell": "Você permite {0} (definido como uma configuração de espaço de trabalho) a ser executado no terminal?", + "allow": "Permitir", + "disallow": "Não permitir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json new file mode 100644 index 00000000000..13b6933b1b9 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "terminal.integrated.copySelection.noSelection": "Não é possível copiar seleção do terminal quando o terminal não tem foco", + "terminal.integrated.exitedWithCode": "O processo terminal encerrado com código de saída: {0}", + "terminal.integrated.waitOnExit": "Pressione qualquer tecla para fechar o terminal", + "terminal.integrated.launchFailed": "O comando de processo de terminal '{0}{1}' falhou ao ser iniciado (código de saída: {2})" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.i18n.json new file mode 100644 index 00000000000..fd175c5ad29 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "terminalLinkHandler.followLinkCmd": "Cmd + clique para seguir o link", + "terminalLinkHandler.followLinkCtrl": "Ctrl + clique para seguir o link" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json new file mode 100644 index 00000000000..5e811b86100 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "copy": "Copiar", + "createNewTerminal": "Novo Terminal", + "paste": "Colar", + "clear": "Limpar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalService.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalService.i18n.json new file mode 100644 index 00000000000..08ec4bd9777 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalService.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "terminal.integrated.chooseWindowsShellInfo": "Você pode alterar o terminal shell padrão selecionando o botão Personalizar.", + "customize": "Personalizar", + "cancel": "Cancelar", + "never again": "Ok, Nunca Mostrar Novamente", + "terminal.integrated.chooseWindowsShell": "Selecione o seu terminal shell preferido, você pode alterar isso mais tarde em suas configurações", + "terminalService.terminalCloseConfirmationSingular": "Há uma sessão ativa de terminal, você quer finalizá-la?", + "terminalService.terminalCloseConfirmationPlural": "Existem {0} sessões ativas de terminal, você quer finalizá-las?", + "yes": "Sim" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json new file mode 100644 index 00000000000..9968bf0b9b1 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "selectTheme.label": "Tema de Cores", + "installColorThemes": "Instalar temas de cor adicionais...", + "themes.selectTheme": "Selecione o tema de cor (teclas cima/baixo para visualização)", + "selectIconTheme.label": "Arquivo de Ícone do Tema", + "installIconThemes": "Instalar Temas de Ícones de Arquivos Adicionais...", + "noIconThemeLabel": "Nenhum", + "noIconThemeDesc": "Desabilitar ícones de arquivos", + "problemChangingIconTheme": "Problema configurando tema de ícones: {0}", + "themes.selectIconTheme": "Selecionar Tema de Ícones de Arquivos", + "generateColorTheme.label": "Gerar Tema de Cores a Partir das Configurações Atuais", + "preferences": "Preferências", + "developer": "Desenvolvedor" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json new file mode 100644 index 00000000000..1fc9c8fe3a4 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unsupportedWorkspaceSettings": "Esta área de trabalho contém configurações que só podem ser definidas nas configurações do usuário. ({0})", + "openWorkspaceSettings": "Abrir as configurações do espaço de trabalho", + "openDocumentation": "Saiba Mais", + "ignore": "Ignorar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.i18n.json b/i18n/ptb/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.i18n.json new file mode 100644 index 00000000000..213c54a3d24 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "releaseNotesInputName": "Notas da Versão: {0}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.contribution.i18n.json new file mode 100644 index 00000000000..3634d3c2f2a --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "release notes": "Notas da versão", + "updateConfigurationTitle": "Atualizar", + "updateChannel": "Configurar se você recebe atualizações automáticas de um canal de atualização. Requer uma reinicialização depois da mudança." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json new file mode 100644 index 00000000000..4199be74572 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "updateNow": "Atualizar Agora", + "later": "Mais tarde", + "unassigned": "Não atribuído", + "releaseNotes": "Notas da Versão", + "showReleaseNotes": "Mostrar Notas da Versão", + "downloadNow": "Baixar agora", + "read the release notes": "Bem-vindo a {0} v{1}! Gostaria de ler as Notas da Versão?", + "licenseChanged": "Nossos termos de licença mudaram, favor revisá-los.", + "license": "Ler Licença", + "updateAvailable": "{0} será atualizado após reiniciar.", + "thereIsUpdateAvailable": "Há uma atualização disponível.", + "noUpdatesAvailable": "Não há nenhuma atualização disponível." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json b/i18n/ptb/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json new file mode 100644 index 00000000000..dea49eef8d5 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "watermark.showCommands": "Mostrar todos os comandos", + "watermark.quickOpen": "Ir para o Arquivo", + "watermark.openFile": "Abrir Arquivo", + "watermark.openFolder": "Abrir Pasta", + "watermark.openFileFolder": "Abrir Arquivo ou Pasta", + "watermark.openRecent": "Abrir Recente", + "watermark.newUntitledFile": "Novo Arquivo Sem Título", + "watermark.toggleTerminal": "Alternar Terminal", + "watermark.findInFiles": "Localizar nos Arquivos", + "watermark.startDebugging": "Iniciar Depuração", + "watermark.selectTheme": "Mudar Tema", + "watermark.selectKeymap": "Mudar Mapa de Teclas", + "watermark.keybindingsReference": "Referência de Teclado", + "watermark.openGlobalKeybindings": "Atalhos de Teclado", + "watermark.unboundCommand": "não vinculado", + "workbenchConfigurationTitle": "Área de Trabalho", + "tips.enabled": "Quando habilitado, mostrará as dicas de marca d'água quando nenhum editor estiver aberto." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json new file mode 100644 index 00000000000..93d7a695382 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "welcomeOverlay.explorer": "Explorador de arquivos", + "welcomeOverlay.search": "Pesquisar em arquivos", + "welcomeOverlay.git": "Gerenciamento de código fonte", + "welcomeOverlay.debug": "Executar e depurar", + "welcomeOverlay.extensions": "Gerenciar extensões", + "welcomeOverlay.problems": "Visualizar erros e avisos", + "welcomeOverlay.commandPalette": "Encontrar e executar todos os comandos", + "welcomeOverlay": "Visão geral da Interface do usuário", + "hideWelcomeOverlay": "Esconder a visão geral da Interface", + "help": "Ajuda" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json new file mode 100644 index 00000000000..a0b426025a4 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -0,0 +1,44 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "welcomePage.vscode": "Visual Studio Code", + "welcomePage.editingEvolved": "Edição evoluiu", + "welcomePage.start": "Início", + "welcomePage.newFile": "Novo arquivo", + "welcomePage.openFolder": "Abrir pasta...", + "welcomePage.cloneGitRepository": "Clonar repositório Git...", + "welcomePage.recent": "Recente", + "welcomePage.moreRecent": "Mais...", + "welcomePage.noRecentFolders": "Não há pastas recentes", + "welcomePage.help": "Ajuda", + "welcomePage.keybindingsCheatsheet": "Folha de dicas de teclado para impressão", + "welcomePage.introductoryVideos": "Vídeos introdutórios", + "welcomePage.productDocumentation": "Documentação do produto", + "welcomePage.gitHubRepository": "Repositório GitHub", + "welcomePage.stackOverflow": "Stack Overflow", + "welcomePage.showOnStartup": "Mostrar a página de boas-vindas na inicialização", + "welcomePage.customize": "Personalizar", + "welcomePage.installExtensionPacks": "Ferramentas e linguagens", + "welcomePage.installExtensionPacksDescription": "Instalar o suporte para {0} e {1}", + "welcomePage.moreExtensions": "mais", + "welcomePage.installKeymapDescription": "Instalar atalhos de teclado", + "welcomePage.installKeymapExtension": "Instalar os atalhos de teclado de {0} e {1}", + "welcomePage.others": "outros", + "welcomePage.colorTheme": "Tema de cores", + "welcomePage.colorThemeDescription": "Fazer o editor e seu código parecer do jeito que você gosta", + "welcomePage.learn": "Aprender", + "welcomePage.showCommands": "Encontrar e executar todos os comandos", + "welcomePage.showCommandsDescription": "Comandos de rápido acesso e de pesquisar do painel de controle ({0})", + "welcomePage.interfaceOverview": "Visão geral da interface", + "welcomePage.interfaceOverviewDescription": "Obter uma sobreposição visual, destacando os principais componentes da interface do usuário", + "welcomePage.interactivePlayground": "Playground interativo", + "welcomePage.interactivePlaygroundDescription": "Experimente as características essenciais do editor em um curto passo-a-passo", + "welcomePage.quickLinks": "Links rápidos", + "welcomePage.keybindingsReference": "Referência de atalhos de teclado", + "welcomePage.keybindingsReferenceDescription": "Um PDF para impressão com os atalhos de teclado mais comuns", + "welcomePage.configureSettings": "Configurar definições", + "welcomePage.configureSettingsDescription": "Desbloquear o poder completo do VS Coda ajustando as configurações" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution.i18n.json new file mode 100644 index 00000000000..7012e078815 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "workbenchConfigurationTitle": "Área de Trabalho", + "welcomePage.enabled": "Quando habilitado, irá mostrar a página de boas-vindas na inicialização.", + "help": "Ajuda" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json new file mode 100644 index 00000000000..29755259794 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -0,0 +1,31 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "welcomePage": "Bem-vindo", + "welcomePage.javaScript": "JavaScript", + "welcomePage.typeScript": "TypeScript", + "welcomePage.python": "Python", + "welcomePage.php": "PHP", + "welcomePage.docker": "Docker", + "welcomePage.vim": "Vim", + "welcomePage.sublime": "Sublime", + "welcomePage.atom": "Atom", + "welcomePage.extensionPackAlreadyInstalled": "Suporte para {0} já está instalado.", + "welcomePage.willReloadAfterInstallingExtensionPack": "A janela irá recarregar depois de instalar o suporte para {0}.", + "welcomePage.installingExtensionPack": "Instalar o suporte para {0}...", + "welcomePage.extensionPackNotFound": "Suporte para {0} com o id {1} não pôde ser encontrado.", + "welcomePage.keymapAlreadyInstalled": "Os atalhos de teclado de {0} já estão instalados.", + "welcomePage.willReloadAfterInstallingKeymap": "A janela irá recarregar depois de instalar os {0} atalhos de teclado.", + "welcomePage.installingKeymap": "Instalando os {0} atalhos de teclado...", + "welcomePage.keymapNotFound": "Os {0} atalhos de teclado com o id {1} não podem ser encontrados.", + "welcome.title": "Bem-vindo", + "welcomePage.extensionListSeparator": ", ", + "welcomePage.installedExtension": "{0} (instalado)", + "ok": "OK", + "cancel": "Cancelar", + "welcomePage.quickLinkBackground": "Cor de fundo para as ligações rápidas na página de boas-vindas.", + "welcomePage.quickLinkHoverBackground": "Passar sobre a cor de fundo para as ligações rápidas na página de boas-vindas." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/editorWalkThrough.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/editorWalkThrough.i18n.json new file mode 100644 index 00000000000..9c7c7f681fa --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/editorWalkThrough.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorWalkThrough": "Playground Interativo", + "editorWalkThrough.title": "Playground Interativo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json new file mode 100644 index 00000000000..a789ae1c81f --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "walkThrough.editor.label": "Playground Interativo", + "help": "Ajuda", + "interactivePlayground": "Playground Interativo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughActions.i18n.json new file mode 100644 index 00000000000..697623110b0 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughActions.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorWalkThrough.arrowUp": "Rolar para Cima (Linha)", + "editorWalkThrough.arrowDown": "Rolar para Baixo (Linha)", + "editorWalkThrough.pageUp": "Rolar para Cima (Página)", + "editorWalkThrough.pageDown": "Rolar para Baixo (Página)" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json new file mode 100644 index 00000000000..4131ebae487 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "walkThrough.unboundCommand": "não vinculado", + "walkThrough.gitNotFound": "Parece que o Git não está instalado no seu sistema.", + "walkThrough.embeddedEditorBackground": "Cor de fundo para os editores incorporados no Playground Interativo." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json new file mode 100644 index 00000000000..188ab8da37e --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "open": "Abrir configurações", + "close": "Fechar", + "saveAndRetry": "Salvar as configurações e tentar novamente", + "errorUnknownKey": "Não é possível gravar no arquivo de configuração (chave desconhecida)", + "errorInvalidTarget": "Não é possível gravar no arquivo de configuração (destino inválido)", + "errorNoWorkspaceOpened": "Não é possível gravar em configurações porque nenhuma pasta está aberta. Por favor, abra uma pasta primeiro e tente novamente.", + "errorInvalidConfiguration": "Não é possível gravar em configurações. Por favor abra **User Settings** para corrigir erros/avisos no arquivo e tente novamente.", + "errorInvalidConfigurationWorkspace": "Não é possível gravar em configurações. Por favor abra **Workspace Settings** para corrigir erros/avisos no arquivo e tente novamente.", + "errorConfigurationFileDirty": "Não é possível gravar em configurações, porque o arquivo foi alterado. Por favor, salve o arquivo **User Settings** e tente novamente.", + "errorConfigurationFileDirtyWorkspace": "Não é possível gravar em configurações, porque o arquivo foi alterado. Por favor, salve o arquivo **Workspace Settings** e tente novamente." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/editor/browser/editorService.i18n.json b/i18n/ptb/src/vs/workbench/services/editor/browser/editorService.i18n.json new file mode 100644 index 00000000000..50e968f8ee3 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/editor/browser/editorService.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "compareLabels": "{0} ↔ {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/ptb/src/vs/workbench/services/files/electron-browser/fileService.i18n.json new file mode 100644 index 00000000000..49e9152a1db --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "netVersionError": "O Microsoft .NET Framework 4.5 é necessário. Por favor siga o link para instalá-lo.", + "installNet": "Baixar o .NET Framework 4.5", + "neverShowAgain": "Não mostrar novamente", + "trashFailed": "Falha em mover '{0}' para a lixeira" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/ptb/src/vs/workbench/services/files/node/fileService.i18n.json new file mode 100644 index 00000000000..b84feecdb4f --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/files/node/fileService.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileInvalidPath": "Recurso de arquivo inválido ({0})", + "fileIsDirectoryError": "Arquivo é diretório ({0})", + "fileBinaryError": "Arquivo parece ser binário e não pode ser aberto como texto", + "fileNotFoundError": "Arquivo não encontrado ({0})", + "unableToMoveCopyError": "Não é possível mover/copiar. Arquivo poderia substituir a pasta em que está contida.", + "foldersCopyError": "Pastas não podem ser copiadas para a área de trabalho. Por favor selecione arquivos individuais para serem copiados.", + "fileReadOnlyError": "Arquivo é Somente Leitura" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/keybinding/common/keybindingEditing.i18n.json b/i18n/ptb/src/vs/workbench/services/keybinding/common/keybindingEditing.i18n.json new file mode 100644 index 00000000000..daa32f59ee9 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/keybinding/common/keybindingEditing.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "errorKeybindingsFileDirty": "Não é possível gravar porque o arquivo está sujo. Por favor, salve o arquivo **Keybindings** e tente novamente.", + "parseErrors": "Não é possível gravar as combinações de teclas. Por favor abra o **arquivo Keybindings** para corrigir erros/avisos no arquivo e tente novamente.", + "errorInvalidConfiguration": "Não é possível gravar as combinações de teclas. **Arquivo Keybindings** tem um objeto que não é do tipo Matriz. Por favor, abra o arquivo para limpar e tentar novamente.", + "emptyKeybindingsHeader": "Coloque suas combinações de teclas neste arquivo para substituir os padrões" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/ptb/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json new file mode 100644 index 00000000000..2fac75a5675 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -0,0 +1,26 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "nonempty": "Esperado um valor não vazio", + "requirestring": "a propriedade `{0}` é obrigatória e deve ser do tipo `string`", + "optstring": "a propriedade `{0}` é opcional ou pode ser do tipo `string`", + "vscode.extension.contributes.keybindings.command": "Identificador do comando a ser executado quando keybinding é acionado.", + "vscode.extension.contributes.keybindings.key": "Tecla ou sequência de teclas (teclas separadas com o sinal de adição e sequências com espaço, por exemplo Ctrl+O e Ctrl+L L para um acorde", + "vscode.extension.contributes.keybindings.mac": "Chave específica Mac ou sequência de teclas.", + "vscode.extension.contributes.keybindings.linux": "Chave específica Linux ou sequência de teclas.", + "vscode.extension.contributes.keybindings.win": "Chave específica Windows ou sequência de teclas.", + "vscode.extension.contributes.keybindings.when": "Condição quando a chave está ativa.", + "vscode.extension.contributes.keybindings": "Contribui para Atalhos de Teclado.", + "invalid.keybindings": "Inválido `contributes.{0}`: {1}", + "unboundCommands": "Aqui estão outros comandos disponíveis: ", + "keybindings.json.title": "Configuração de combinações de teclas", + "keybindings.json.key": "Tecla ou sequência de teclas (separados por espaço)", + "keybindings.json.command": "Nome do comando a ser executado", + "keybindings.json.when": "Condição quando a chave está ativa.", + "keybindings.json.args": "Argumentos a serem passados para o comando para executar.", + "keyboardConfigurationTitle": "Teclado", + "dispatch": "Controla a lógica de expedição para pressionamentos de teclas para usar `keydown.code` (recomendado) ou 'keydown.keyCode'." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/message/browser/messageList.i18n.json b/i18n/ptb/src/vs/workbench/services/message/browser/messageList.i18n.json new file mode 100644 index 00000000000..267b62d179d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/message/browser/messageList.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "alertErrorMessage": "Erro: {0}", + "alertWarningMessage": "Aviso: {0}", + "alertInfoMessage": "Informações: {0}", + "error": "Erro", + "warning": "Aviso", + "info": "Informações", + "close": "Fechar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/message/electron-browser/messageService.i18n.json b/i18n/ptb/src/vs/workbench/services/message/electron-browser/messageService.i18n.json new file mode 100644 index 00000000000..cecec4b4c3a --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/message/electron-browser/messageService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "yesButton": "&&Sim", + "cancelButton": "Cancelar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json b/i18n/ptb/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json new file mode 100644 index 00000000000..91df655432d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid": "Inválido 'contributes.{0}`. Matriz esperada.", + "invalid.empty": "Valor em branco para` contributes.{0}`", + "require.id": "a propriedade `{0}` é obrigatória e deve ser do tipo `string`", + "opt.extensions": "a propriedade `{0}` pode ser omitida e deve ser do tipo `string[]`", + "opt.filenames": "a propriedade `{0}` pode ser omitida e deve ser do tipo `string[]`", + "opt.firstLine": "a propriedade `{0}` pode ser omitida e deve ser do tipo `string`", + "opt.configuration": "a propriedade `{0}` pode ser omitida e deve ser do tipo `string`", + "opt.aliases": "a propriedade `{0}` pode ser omitida e deve ser do tipo `string[]`", + "opt.mimetypes": "a propriedade `{0}` pode ser omitida e deve ser do tipo `string[]`" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/textfile/common/textFileEditorModel.i18n.json b/i18n/ptb/src/vs/workbench/services/textfile/common/textFileEditorModel.i18n.json new file mode 100644 index 00000000000..7eed5484379 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/textfile/common/textFileEditorModel.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "saveFileFirst": "O arquivo está alterado. Por favor, salvá-lo primeiro antes reabri-lo com outra codificação.", + "genericSaveError": "Erro ao salvar '{0}': {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/textfile/common/textFileService.i18n.json b/i18n/ptb/src/vs/workbench/services/textfile/common/textFileService.i18n.json new file mode 100644 index 00000000000..9fe74ad26f3 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/textfile/common/textFileService.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "files.backup.failSave": "Arquivos não poderiam ser backupeados (erro: {0}), tente salvar seus arquivos para sair." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/textfile/electron-browser/textFileService.i18n.json b/i18n/ptb/src/vs/workbench/services/textfile/electron-browser/textFileService.i18n.json new file mode 100644 index 00000000000..491b19e87c4 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/textfile/electron-browser/textFileService.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "saveChangesMessage": "Você quer salvar as alterações feitas para {0}?", + "saveChangesMessages": "Você quer salvar as alterações para os seguintes {0} arquivos?", + "moreFile": "... 1 arquivo adicional não está mostrado", + "moreFiles": "... {0} arquivos adicionais não estão mostrados", + "saveAll": "&&Salvar tudo", + "save": "&&Salvar", + "dontSave": "&&Não Salvar", + "cancel": "Cancelar", + "saveChangesDetail": "Suas alterações serão perdidas se você não salvá-las.", + "allFiles": "Todos os arquivos", + "noExt": "Sem extensão" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json b/i18n/ptb/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json new file mode 100644 index 00000000000..02e2bc18273 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "schema.colors": "Cores para o realce de sintaxe", + "schema.properties.name": "Descrição da regra", + "schema.fontStyle": "Estilo da fonte da regra: um estilo ou uma combinação de 'itálico', 'negrito' e 'sublinhado'", + "schema.tokenColors.path": "Caminho para um arquivo tmTheme (relativo ao arquivo atual)" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json b/i18n/ptb/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json new file mode 100644 index 00000000000..3cf20c82de2 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json @@ -0,0 +1,37 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "schema.folderExpanded": "O ícone de pasta para pastas expandidas. O ícone da pasta expandido é opcional. Se não definido, o ícone definido para a pasta será mostrado.", + "schema.folder": "O ícone de pasta para pastas colapsadas, e se folderExpanded não estiver definido, também para pastas expandidas.", + "schema.file": "O ícone de arquivo padrão, indicado para todos os arquivos que não correspondem a qualquer extensão, nome de arquivo ou idioma.", + "schema.folderNames": "Associa os nomes de pasta à ícones. A chave do objeto é o nome da pasta, não incluindo quaisquer segmentos de caminho. Nenhum padrão ou curinga são permitidos. O nome da pasta de correspondência diferencia maiusculas de minúsculas.", + "schema.folderName": "A ID da definição do ícone para associação.", + "schema.folderNamesExpanded": "Associa os nomes de pasta a ícones para pastas expandidas. A chave do objeto é o nome da pasta, não incluindo quaisquer segmentos do caminho. Padrões ou curingas não são permitidas. A correspondência do nome de pastas não diferencia maiusculas de minúsculas.", + "schema.folderNameExpanded": "A ID da definição do ícone para a associação.", + "schema.fileExtensions": "Associa as extensões de arquivo aos ícones. A chave do objeto é o nome da extensão do arquivo. O nome da extensão é o último segmento de um nome de arquivo após o último ponto (não incluindo o ponto). As extensões não diferenciam maiúsculas de minúsculas.", + "schema.fileExtension": "A ID da definição do ícone para a associação.", + "schema.fileNames": "Associa os nomes de arquivo à ícones. A chave do objeto é o nome completo do arquivo, mas não incluindo quaisquer segmentos do caminho. O nome do arquivo pode incluir pontos e uma extensão de arquivo. Nenhum padrão ou curinga é permitido. A correspondência de nome de arquivo não diferencia maiúsculas de minúsculas.", + "schema.fileName": "A ID da definição do ícone para a associação.", + "schema.languageIds": "Associa idiomas a ícones. A chave do objeto é o id de idioma definido no ponto de contribuição de linguagem.", + "schema.languageId": "O ID da definição do ícone para a associação.", + "schema.fonts": "Fontes que são usadas nas definições de ícone.", + "schema.id": "O ID da fonte.", + "schema.src": "A localização da fonte.", + "schema.font-path": "O caminho do fonte, relativo ao arquivo de tema de ícone atual.", + "schema.font-format": "O formato da fonte.", + "schema.font-weight": "O peso da fonte.", + "schema.font-sstyle": "O estilo da fonte.", + "schema.font-size": "O tamanho padrão da fonte.", + "schema.iconDefinitions": "Descrição de todos os ícones que podem ser usados quando associar arquivos de ícones.", + "schema.iconDefinition": "Uma definição de ícone. A chave do objeto é o ID da definição.", + "schema.iconPath": "Ao usar um SVG ou PNG: O caminho para a imagem. O caminho é relativo ao arquivo de configuração do ícone.", + "schema.fontCharacter": "Ao usar uma fonte glyph: O caractere na fonte para usar.", + "schema.fontColor": "Ao usar uma fonte glyph: A cor a ser utilizada.", + "schema.fontSize": "Quando estiver utilizando uma fonte: O tamanho da fonte em porcentagem para a fonte de texto. Se não for definido, o padrão é o tamanho na definição de fonte.", + "schema.fontId": "Quando estiver utilizando uma fonte: A identificação da fonte. Se não for definido, o padrão é a primeira definição de fonte.", + "schema.light": "Associações opcionais para ícones de arquivo em temas de cor clara.", + "schema.highContrast": "Associações opcionais para ícones de arquivo em temas de alto contraste." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json b/i18n/ptb/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json new file mode 100644 index 00000000000..4ef6944ba73 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "error.cannotparsejson": "Problemas ao analisar o arquivo de tema JSON: {0}", + "error.invalidformat.colors": "Problema ao analisar o arquivo de tema de cor: {0}. A propriedade 'colors' não é do tipo 'object'.", + "error.invalidformat.tokenColors": "Problema ao analisar o arquivo de tema de cor: {0}. A propriedade 'tokenColors' deve ser também uma matriz especificando as cores ou um caminho para um arquivo de texto de tema correspondente", + "error.plist.invalidformat": "Problema ao analisar o arquivo tmTheme: {0}. 'settings' não é uma matriz.", + "error.cannotparse": "Problemas ao analisar o arquivo tmTheme: {0}", + "error.cannotload": "Problemas ao carregar o arquivo tmTheme {0}: {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/ptb/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json new file mode 100644 index 00000000000..caeea848338 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "vscode.extension.contributes.themes": "Contribui com temas de cores do textmate.", + "vscode.extension.contributes.themes.id": "ID do tema do ícone conforme usado em configurações do usuário.", + "vscode.extension.contributes.themes.label": "Etiqueta da cor do tema como mostrado na interface do usuário.", + "vscode.extension.contributes.themes.uiTheme": "Tema base de definição das cores do editor: 'vs' é o tema de cor clara, 'vs-dark' é o tema de cor escura. 'hc preto' é o tema escuro de alto contraste.", + "vscode.extension.contributes.themes.path": "Caminho do arquivo tmTheme. O caminho é relativo à pasta de extensão e é normalmente './themes/themeFile.tmTheme'.", + "vscode.extension.contributes.iconThemes": "Contribui com temas de ícones de arquivo.", + "vscode.extension.contributes.iconThemes.id": "ID do tema do ícone como usado em configurações do usuário.", + "vscode.extension.contributes.iconThemes.label": "Etiqueta do tema do ícone como mostrado na interface do usuário.", + "vscode.extension.contributes.iconThemes.path": "Caminho do arquivo de definição do tema do ícone. O caminho é relativo à pasta de extensão e é normalmente './icons/awesome-icon-theme.json'.", + "migration.completed": "Foram adicionadas novas configurações de tema para as configurações de usuário. Backup está disponível em {0}.", + "error.cannotloadtheme": "Não é possível carregar {0}: {1}", + "reqarray": "Ponto de extensão '{0}' deve ser uma matriz.", + "reqpath": "Esperada uma string em `contributes.{0}.path`. Valor informado: {1}", + "invalid.path.1": "É esperado que `contributes.{0}.path` ({1}) seja incluído na pasta da extensão ({2}). Isto pode tornar a extensão não portável.", + "reqid": "Esperada sequência em 'contributes.{0}.ID'. Valor fornecido: {1}", + "error.cannotloadicontheme": "Não é possível carregar {0}", + "error.cannotparseicontheme": "Problemas de análise do arquivo de ícones: {0}", + "colorTheme": "Especifica o tema de cores usado no espaço de trabalho.", + "colorThemeError": "Tema é desconhecido ou não está instalado.", + "iconTheme": "Especifica o tema de ícone usado no espaço de trabalho.", + "noIconThemeDesc": "Nenhum arquivo de ícones", + "iconThemeError": "Arquivo de tema de ícones é desconhecido ou não está instalado.", + "workbenchColors": "Substitui as cores do tema do tema de cores atualmente selecionado.", + "workbenchColors.deprecated": "A configuração não é mais experimental e foi renomeada para 'workbench.colorCustomizations'", + "workbenchColors.deprecatedDescription": "Use 'workbench.colorCustomizations'" +} \ No newline at end of file diff --git a/i18n/rus/extensions/markdown/out/extension.i18n.json b/i18n/rus/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/rus/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/rus/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/rus/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/extensions/merge-conflict/package.i18n.json b/i18n/rus/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/extensions/npm/package.i18n.json b/i18n/rus/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/rus/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index af5b0c29d70..32fb4e4b4cd 100644 --- a/i18n/rus/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/rus/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,8 +6,6 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "Изображение слишком велико для отображения в редакторе. ", - "resourceOpenExternalButton": "Открыть изображение", - "resourceOpenExternalText": " с помощью внешней программы?", "nativeBinaryError": "Файл не будет отображен в редакторе, так как он двоичный, очень большой или использует неподдерживаемую кодировку текста.", "sizeB": "{0} Б", "sizeKB": "{0} КБ", diff --git a/i18n/rus/src/vs/code/electron-main/menus.i18n.json b/i18n/rus/src/vs/code/electron-main/menus.i18n.json index 2caee2db03b..68b593f2118 100644 --- a/i18n/rus/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/rus/src/vs/code/electron-main/menus.i18n.json @@ -14,6 +14,7 @@ "mHelp": "&&Справка", "miNewWindow": "&&Новое окно", "mAbout": "О программе {0}", + "mServices": "Службы", "mHide": "Скрыть {0}", "mHideOthers": "Скрыть другие", "mShowAll": "Показать все", @@ -69,6 +70,7 @@ "miSmartSelectShrink": "&&Сжать выделение", "miViewExplorer": "Проводник", "miViewSearch": "Поиск", + "miViewSCM": "S&&CM", "miViewDebug": "Отладка", "miViewExtensions": "Р&&асширения", "miToggleOutput": "Вывод", diff --git a/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json index 9b6838aa665..53078d0a5b6 100644 --- a/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -40,7 +40,6 @@ "formatOnType": "Управляет параметром, определяющим, должен ли редактор автоматически форматировать строку после ввода.", "formatOnPaste": "Определяет, будет ли редактор автоматически форматировать вставленное содержимое. Модуль форматирования должен быть доступен и иметь возможность форматировать диапазон в документе.", "suggestOnTriggerCharacters": "Определяет, должны ли при вводе триггерных символов автоматически отображаться предложения.", - "acceptSuggestionOnEnter": "Определяет, будут ли предложения приниматься клавишей ВВОД в дополнение к клавише TAB. Это помогает избежать неоднозначности между вставкой новых строк и принятием предложений.", "acceptSuggestionOnCommitCharacter": "Определяет, будут ли предложения приниматься символами фиксации. Например, в JavaScript точка с запятой (\";\") может быть символом фиксации, принимающим предложение и вводящим данный символ.", "snippetSuggestions": "Управляет отображением фрагментов вместе с другими предложениями и их сортировкой.", "emptySelectionClipboard": "Управляет тем, копируется ли текущая строка при копировании без выделения.", diff --git a/i18n/rus/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/rus/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..e61942e5d18 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "Определение для \"{0}\" не найдено.", + "generic.noResults": "Определения не найдены.", + "meta.title": " — определения {0}", + "actions.goToDecl.label": "Перейти к определению", + "actions.goToDeclToSide.label": "Открыть определение сбоку", + "actions.previewDecl.label": "Показать определение", + "goToImplementation.noResultWord": "Не найдена реализация для \"{0}\".", + "goToImplementation.generic.noResults": "Не найдена реализация.", + "meta.implementations.title": "— {0} реализаций", + "actions.goToImplementation.label": "Перейти к реализации", + "actions.peekImplementation.label": "Показать реализацию", + "goToTypeDefinition.noResultWord": "Не найдено определение типа для \"{0}\".", + "goToTypeDefinition.generic.noResults": "Не найдено определение типа.", + "meta.typeDefinitions.title": "— {0} определений типов", + "actions.goToTypeDefinition.label": "Перейти к определению типа", + "actions.peekTypeDefinition.label": "Показать определение типа" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/rus/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..a403ef380f2 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Щелкните, чтобы отобразить определения ({0})." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json index ff2b65c8fab..f2bd599c1b9 100644 --- a/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,6 +7,7 @@ "view": "Просмотреть", "help": "Справка", "file": "Файл", + "developer": "Разработчик", "showEditorTabs": "Определяет, должны ли открытые редакторы отображаться на вкладках или нет.", "editorTabCloseButton": "Определяет положение кнопок закрытия вкладок редактора или отключает их, если задано значение off.", "showIcons": "Определяет, должны ли открытые редакторы отображаться со значком. Требует включить тему значков.", diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 8b6ad71cd4e..906d10fee6b 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "disableOtherKeymapsConfirmation": "Отключить другие раскладки клавиатуры, чтобы избежать конфликта между настраиваемыми сочетаниями клавиш?", + "yes": "Да", + "no": "Нет" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 952d7106938..6c404cd1796 100644 --- a/i18n/rus/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,7 +16,6 @@ "associations": "Настройте сопоставления файлов с языками (например, \"*.extension\": \"html\"). У них будет приоритет перед заданными по умолчанию сопоставлениями установленных языков.", "encoding": "Кодировка набора символов по умолчанию, используемая при чтении и записи файлов", "autoGuessEncoding": "Если параметр включен, производится попытка определить кодировку набора символов при открытии файлов", - "eol": "Символ конца строки по умолчанию.", "trimTrailingWhitespace": "Если этот параметр включен, при сохранении файла будут удалены концевые пробелы.", "insertFinalNewline": "Если этот параметр включен, при сохранении файла в его конец вставляется финальная новая строка.", "files.autoSave.off": "\"Грязный\" файл не сохраняется автоматически.", diff --git a/i18n/rus/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json index ef99a2ea9f3..5ac046256bd 100644 --- a/i18n/rus/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -5,5 +5,9 @@ // Do not edit this file. It is machine generated. { "slow": "Обнаружен замедленный запуск.", - "slow.detail": "Сожалеем, что у вас произошел замедленный запуск. Перезапустите \"{0}\" с включенным профилированием и отправьте профили нам, чтобы мы могли ускорить загрузку." + "slow.detail": "Сожалеем, что у вас произошел замедленный запуск. Перезапустите \"{0}\" с включенным профилированием и отправьте профили нам, чтобы мы могли ускорить загрузку.", + "prof.message": "Профили успешно созданы.", + "prof.detail": "Создайте проблему и вручную вложите следующие файлы:\n{0}", + "prof.restartAndFileIssue": "Создать проблему и выполнить перезапуск", + "prof.restart": "Перезапустить" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index 901720ad5dd..1365e07209b 100644 --- a/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,6 +5,11 @@ // Do not edit this file. It is machine generated. { "welcomePage": "Добро пожаловать", + "welcomePage.typeScript": "TypeScript", + "welcomePage.php": "PHP", + "welcomePage.vim": "Vim", + "welcomePage.sublime": "Sublime", + "welcomePage.atom": "Atom", "welcomePage.keymapAlreadyInstalled": "Сочетания клавиш {0} уже установлены.", "welcomePage.willReloadAfterInstallingKeymap": "Окно перезагрузится после установки сочетаний клавиш {0}.", "welcomePage.installingKeymap": "Устанавливаются сочетания клавиш {0}...", From 84ced6126ea370a757fbff264f106af319029257 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 25 May 2017 08:05:53 +0200 Subject: [PATCH 0933/1164] theming - remove hardcoded list color in keybindings editor --- .../browser/media/keybindingsEditor.css | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css b/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css index 29b4fe0a8d1..9932877ef4d 100644 --- a/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css +++ b/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css @@ -68,20 +68,6 @@ display: flex; } -.keybindings-editor > .keybindings-body .keybindings-list-container .monaco-list-row.keybindings-list-header.focused, -.keybindings-editor > .keybindings-body .keybindings-list-container .monaco-list-row.keybindings-list-header.selected, -.keybindings-editor > .keybindings-body .keybindings-list-container .monaco-list-row.keybindings-list-header:hover, -.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row.keybindings-list-header, -.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row.even:not(.focused):not(.selected):not(:hover), -.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:not(:focus) .monaco-list-row.focused.even:not(.selected):not(:hover), -.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:not(.focused) .monaco-list-row.focused.even:not(.selected):not(:hover) { - background-color: rgba(130, 130, 130, 0.04); -} - -.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row:hover { - background-color: rgba(128, 128, 128, 0.15); -} - .keybindings-editor > .keybindings-body .keybindings-list-container .monaco-list-row > .header { text-align: left; font-weight: bold; From 145310aea5e41c6af8de4aaf7910bdb90f0e4fea Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 08:44:16 +0200 Subject: [PATCH 0934/1164] [lua] update grammar --- extensions/lua/syntaxes/lua.json | 148 ++++++++++++++---- .../lua/test/colorize-results/test_lua.json | 32 +--- 2 files changed, 123 insertions(+), 57 deletions(-) diff --git a/extensions/lua/syntaxes/lua.json b/extensions/lua/syntaxes/lua.json index 0bde9524ea4..a4da3a43c6a 100644 --- a/extensions/lua/syntaxes/lua.json +++ b/extensions/lua/syntaxes/lua.json @@ -1,39 +1,61 @@ { "comment": "Lua Syntax: version 0.8", "fileTypes": [ - "lua" + "lua", + "p8", + "rockspec", + "luacheckrc", + "lakefile" ], - "firstLineMatch": "\\A#!.*?\\blua\\b", + "firstLineMatch": "\\A#!.*?\\blua(\\d+(\\.\\d+)?)?\\b|\\A--\\s+-\\*-\\s*lua\\s*-\\*-", "keyEquivalent": "^~L", "name": "Lua", "patterns": [ { - "captures": { + "begin": "\\b((local\\b)\\s+)?(function)\\s*(\\s+[a-zA-Z_][a-zA-Z0-9_]*(\\.[a-zA-Z_][a-zA-Z0-9_]*)*(:[a-zA-Z_][a-zA-Z0-9_]*)?\\s*)?(\\()", + "beginCaptures": { "1": { - "name": "keyword.control.lua" - }, - "2": { - "name": "entity.name.function.scope.lua" + "name": "storage.modifier.local.lua" }, "3": { - "name": "entity.name.function.lua" + "name": "keyword.control.lua" }, "4": { - "name": "punctuation.definition.parameters.begin.lua" + "name": "entity.name.function.lua" }, "5": { - "name": "variable.parameter.function.lua" - }, - "6": { + "name": "punctuation.definition.parameters.begin.lua" + } + }, + "end": "\\)", + "endCaptures": { + "0": { "name": "punctuation.definition.parameters.end.lua" } }, - "match": "\\b(function)(?:\\s+([a-zA-Z_.:]+[.:])?([a-zA-Z_]\\w*)\\s*)?(\\()([^)]*)(\\))", - "name": "meta.function.lua" + "name": "meta.function.lua", + "patterns": [ + { + "match": "[a-zA-Z_][a-zA-Z0-9_]*", + "name": "variable.parameter.function.lua" + } + ] }, { - "match": "(? Date: Thu, 25 May 2017 09:18:28 +0200 Subject: [PATCH 0935/1164] Allow to contribute actions to other quick open handlers (fixes #27197) --- src/vs/workbench/parts/tasks/browser/quickOpen.ts | 6 +++--- .../tasks/electron-browser/media/configure-inverse.svg | 1 + .../parts/tasks/electron-browser/media/configure.svg | 1 + .../tasks/electron-browser/media/task.contribution.css | 9 +++++++++ 4 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 src/vs/workbench/parts/tasks/electron-browser/media/configure-inverse.svg create mode 100644 src/vs/workbench/parts/tasks/electron-browser/media/configure.svg diff --git a/src/vs/workbench/parts/tasks/browser/quickOpen.ts b/src/vs/workbench/parts/tasks/browser/quickOpen.ts index 754d5756a22..6c9afcd0b74 100644 --- a/src/vs/workbench/parts/tasks/browser/quickOpen.ts +++ b/src/vs/workbench/parts/tasks/browser/quickOpen.ts @@ -15,7 +15,7 @@ import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; import { Task, TaskSourceKind } from 'vs/workbench/parts/tasks/common/tasks'; import { ITaskService } from 'vs/workbench/parts/tasks/common/taskService'; -import { ActionBarContributor } from 'vs/workbench/browser/actionBarRegistry'; +import { ActionBarContributor, ContributableActionProvider } from 'vs/workbench/browser/actionBarRegistry'; export class TaskEntry extends Model.QuickOpenEntry { @@ -105,7 +105,7 @@ export abstract class QuickOpenHandler extends Quickopen.QuickOpenHandler { entries.push(this.createEntry(this.taskService, task, highlights)); } } - return new Model.QuickOpenModel(entries); + return new Model.QuickOpenModel(entries, new ContributableActionProvider()); }); } @@ -131,7 +131,7 @@ class CustomizeTaskAction extends Action { } public updateClass(): void { - this.class = 'quick-open-sidebyside-vertical'; + this.class = 'quick-open-task-configure'; } public run(context: any): TPromise { diff --git a/src/vs/workbench/parts/tasks/electron-browser/media/configure-inverse.svg b/src/vs/workbench/parts/tasks/electron-browser/media/configure-inverse.svg new file mode 100644 index 00000000000..61baaea2b8b --- /dev/null +++ b/src/vs/workbench/parts/tasks/electron-browser/media/configure-inverse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/workbench/parts/tasks/electron-browser/media/configure.svg b/src/vs/workbench/parts/tasks/electron-browser/media/configure.svg new file mode 100644 index 00000000000..3dec2ba50fd --- /dev/null +++ b/src/vs/workbench/parts/tasks/electron-browser/media/configure.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/workbench/parts/tasks/electron-browser/media/task.contribution.css b/src/vs/workbench/parts/tasks/electron-browser/media/task.contribution.css index 6b1d8221b62..f8b7e9e67e5 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/media/task.contribution.css +++ b/src/vs/workbench/parts/tasks/electron-browser/media/task.contribution.css @@ -60,4 +60,13 @@ .task-statusbar-item-label > .task-statusbar-item-label-info { -webkit-mask: url('status-info.svg') no-repeat 50% 50%; -webkit-mask-size: 11px; +} + +.monaco-workbench .quick-open-task-configure { + background-image: url('configure.svg'); +} + +.vs-dark .monaco-workbench .quick-open-task-configure, +.hc-black .monaco-workbench .quick-open-task-configure { + background-image: url('configure-inverse.svg'); } \ No newline at end of file From 561110831b9d64440b27091f996cacd85b009a39 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 25 May 2017 09:44:01 +0200 Subject: [PATCH 0936/1164] How to configure a window (also for reload case)? (fixes #27192) --- src/vs/code/electron-main/menus.ts | 20 +++++- src/vs/code/electron-main/window.ts | 10 +-- src/vs/code/electron-main/windows.ts | 84 +---------------------- src/vs/code/node/keyboard.ts | 70 +++++++++++++++++++ src/vs/workbench/electron-browser/main.ts | 10 ++- 5 files changed, 100 insertions(+), 94 deletions(-) create mode 100644 src/vs/code/node/keyboard.ts diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index 91ccab243c9..249722e754c 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -9,7 +9,7 @@ import * as nls from 'vs/nls'; import { isMacintosh, isLinux, isWindows, language } from 'vs/base/common/platform'; import * as arrays from 'vs/base/common/arrays'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { ipcMain as ipc, app, shell, dialog, Menu, MenuItem } from 'electron'; +import { ipcMain as ipc, app, shell, dialog, Menu, MenuItem, BrowserWindow } from 'electron'; import { OpenContext } from 'vs/code/common/windows'; import { IWindowsMainService } from 'vs/code/electron-main/windows'; import { VSCodeWindow } from 'vs/code/electron-main/window'; @@ -908,7 +908,7 @@ export class VSCodeMenu { label: this.mnemonicLabel(nls.localize({ key: 'miAccessibilityOptions', comment: ['&& denotes a mnemonic'] }, "Accessibility &&Options")), accelerator: null, click: () => { - this.windowsService.openAccessibilityOptions(); + this.openAccessibilityOptions(); } }, false)); @@ -974,6 +974,22 @@ export class VSCodeMenu { } } + private openAccessibilityOptions(): void { + let win = new BrowserWindow({ + alwaysOnTop: true, + skipTaskbar: true, + resizable: false, + width: 450, + height: 300, + show: true, + title: nls.localize('accessibilityOptionsWindowTitle', "Accessibility Options") + }); + + win.setMenuBarVisibility(false); + + win.loadURL('chrome://accessibility'); + } + private getUpdateMenuItems(): Electron.MenuItem[] { switch (this.updateService.state) { case UpdateState.Uninitialized: diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 7cd1f647083..4b1840c8642 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -22,7 +22,7 @@ import product from 'vs/platform/node/product'; import { getCommonHTTPHeaders } from 'vs/platform/environment/node/http'; import { IWindowSettings, MenuBarVisibility } from 'vs/platform/windows/common/windows'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; - +import { KeyboardLayoutMonitor } from "vs/code/node/keyboard"; export interface IWindowState { width?: number; @@ -82,10 +82,7 @@ export interface IWindowConfiguration extends ParsedArgs { * The physical keyboard is of ISO type (on OSX). */ isISOKeyboard?: boolean; - /** - * Accessibility support is enabled. - */ - accessibilitySupportEnabled?: boolean; + zoomLevel?: number; fullscreen?: boolean; highContrast?: boolean; @@ -558,6 +555,9 @@ export class VSCodeWindow { windowConfiguration.highContrast = platform.isWindows && systemPreferences.isInvertedColorScheme() && (!windowConfig || windowConfig.autoDetectHighContrast); windowConfiguration.accessibilitySupport = app.isAccessibilitySupportEnabled(); + // Set Keyboard Config + windowConfiguration.isISOKeyboard = KeyboardLayoutMonitor.INSTANCE.isISOKeyboard(); + // Theme windowConfiguration.baseTheme = this.getBaseTheme(); windowConfiguration.backgroundColor = this.getBackgroundColor(); diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index 72d1091e196..b4324486c62 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -31,8 +31,7 @@ import product from 'vs/platform/node/product'; import { OpenContext } from 'vs/code/common/windows'; import { ITelemetryService, ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; import { isParent, isEqual, isEqualOrParent } from 'vs/platform/files/common/files'; -import * as nativeKeymap from 'native-keymap'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { KeyboardLayoutMonitor } from "vs/code/node/keyboard"; enum WindowError { UNRESPONSIVE, @@ -107,7 +106,6 @@ export interface IWindowsMainService { openFileFolderPicker(forceNewWindow?: boolean, data?: ITelemetryData): void; openFilePicker(forceNewWindow?: boolean, path?: string, window?: VSCodeWindow, data?: ITelemetryData): void; openFolderPicker(forceNewWindow?: boolean, window?: VSCodeWindow, data?: ITelemetryData): void; - openAccessibilityOptions(): void; focusLastActive(cli: ParsedArgs, context: OpenContext): VSCodeWindow; getLastActiveWindow(): VSCodeWindow; findWindow(workspacePath: string, filePath?: string, extensionDevelopmentPath?: string): VSCodeWindow; @@ -343,6 +341,7 @@ export class WindowsManager implements IWindowsMainService { } private onBroadcast(event: string, payload: any): void { + // Theme changes if (event === 'vscode:changeColorTheme' && typeof payload === 'string') { @@ -737,8 +736,6 @@ export class WindowsManager implements IWindowsMainService { configuration.filesToCreate = filesToCreate; configuration.filesToDiff = filesToDiff; configuration.nodeCachedDataDir = this.environmentService.nodeCachedDataDir; - configuration.isISOKeyboard = KeyboardLayoutMonitor.INSTANCE.isISOKeyboard(); - configuration.accessibilitySupportEnabled = app.isAccessibilitySupportEnabled(); return configuration; } @@ -1028,22 +1025,6 @@ export class WindowsManager implements IWindowsMainService { this.doPickAndOpen({ pickFolders: true, forceNewWindow, window }, 'openFolder', data); } - public openAccessibilityOptions(): void { - let win = new BrowserWindow({ - alwaysOnTop: true, - skipTaskbar: true, - resizable: false, - width: 450, - height: 300, - show: true, - title: nls.localize('accessibilityOptionsWindowTitle', "Accessibility Options") - }); - - win.setMenuBarVisibility(false); - - win.loadURL('chrome://accessibility'); - } - private doPickAndOpen(options: INativeOpenDialogOptions, eventName: string, data?: ITelemetryData): void { this.getFileOrFolderPaths(options, (paths: string[]) => { const nOfPaths = paths ? paths.length : 0; @@ -1338,63 +1319,4 @@ export class WindowsManager implements IWindowsMainService { }, 10 /* delay to unwind callback stack (IPC) */); } } -} - -class KeyboardLayoutMonitor { - - public static INSTANCE = new KeyboardLayoutMonitor(); - - private _emitter: Emitter; - private _registered: boolean; - private _isISOKeyboard: boolean; - - private constructor() { - this._emitter = new Emitter(); - this._registered = false; - this._isISOKeyboard = this._readIsISOKeyboard(); - } - - public onDidChangeKeyboardLayout(callback: (isISOKeyboard: boolean) => void): IDisposable { - if (!this._registered) { - this._registered = true; - - nativeKeymap.onDidChangeKeyboardLayout(() => { - this._emitter.fire(this._isISOKeyboard); - }); - - if (platform.isMacintosh) { - // See https://github.com/Microsoft/vscode/issues/24153 - // On OSX, on ISO keyboards, Chromium swaps the scan codes - // of IntlBackslash and Backquote. - // - // The C++ methods can give the current keyboard type (ISO or not) - // only after a NSEvent was handled. - // - // We therefore poll. - setInterval(() => { - let newValue = this._readIsISOKeyboard(); - if (this._isISOKeyboard === newValue) { - // no change - return; - } - - this._isISOKeyboard = newValue; - this._emitter.fire(this._isISOKeyboard); - - }, 3000); - } - } - return this._emitter.event(callback); - } - - private _readIsISOKeyboard(): boolean { - if (platform.isMacintosh) { - return nativeKeymap.isISOKeyboard(); - } - return false; - } - - public isISOKeyboard(): boolean { - return this._isISOKeyboard; - } -} +} \ No newline at end of file diff --git a/src/vs/code/node/keyboard.ts b/src/vs/code/node/keyboard.ts new file mode 100644 index 00000000000..d2f968371ef --- /dev/null +++ b/src/vs/code/node/keyboard.ts @@ -0,0 +1,70 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as nativeKeymap from 'native-keymap'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import { isMacintosh } from "vs/base/common/platform"; +import { Emitter } from "vs/base/common/event"; + +export class KeyboardLayoutMonitor { + + public static readonly INSTANCE = new KeyboardLayoutMonitor(); + + private _emitter: Emitter; + private _registered: boolean; + private _isISOKeyboard: boolean; + + private constructor() { + this._emitter = new Emitter(); + this._registered = false; + this._isISOKeyboard = this._readIsISOKeyboard(); + } + + public onDidChangeKeyboardLayout(callback: (isISOKeyboard: boolean) => void): IDisposable { + if (!this._registered) { + this._registered = true; + + nativeKeymap.onDidChangeKeyboardLayout(() => { + this._emitter.fire(this._isISOKeyboard); + }); + + if (isMacintosh) { + // See https://github.com/Microsoft/vscode/issues/24153 + // On OSX, on ISO keyboards, Chromium swaps the scan codes + // of IntlBackslash and Backquote. + // + // The C++ methods can give the current keyboard type (ISO or not) + // only after a NSEvent was handled. + // + // We therefore poll. + setInterval(() => { + let newValue = this._readIsISOKeyboard(); + if (this._isISOKeyboard === newValue) { + // no change + return; + } + + this._isISOKeyboard = newValue; + this._emitter.fire(this._isISOKeyboard); + + }, 3000); + } + } + return this._emitter.event(callback); + } + + private _readIsISOKeyboard(): boolean { + if (isMacintosh) { + return nativeKeymap.isISOKeyboard(); + } + return false; + } + + public isISOKeyboard(): boolean { + return this._isISOKeyboard; + } +} diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index fb179f3196c..b20a6fd422a 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -42,10 +42,7 @@ export interface IWindowConfiguration extends ParsedArgs, IOpenFileRequest { */ isISOKeyboard?: boolean; - /** - * Accessibility support is enabled. - */ - accessibilitySupportEnabled?: boolean; + accessibilitySupport?: boolean; appRoot: string; execPath: string; @@ -62,15 +59,16 @@ export function startup(configuration: IWindowConfiguration): TPromise { // Ensure others can listen to zoom level changes browser.setZoomFactor(webFrame.getZoomFactor()); + // See https://github.com/Microsoft/vscode/issues/26151 // Can be trusted because we are not setting it ourselves. - browser.setZoomLevel(webFrame.getZoomLevel(), /*isTrusted*/true); + browser.setZoomLevel(webFrame.getZoomLevel(), true /* isTrusted */); browser.setFullscreen(!!configuration.fullscreen); KeyboardMapperFactory.INSTANCE._onKeyboardLayoutChanged(configuration.isISOKeyboard); - browser.setAccessibilitySupport(configuration.accessibilitySupportEnabled ? platform.AccessibilitySupport.Enabled : platform.AccessibilitySupport.Disabled); + browser.setAccessibilitySupport(configuration.accessibilitySupport ? platform.AccessibilitySupport.Enabled : platform.AccessibilitySupport.Disabled); // Setup Intl comparer.setFileNameComparer(new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' })); From 1d0b00c60ebd2e3513332d5abf5d274bef96fa66 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 25 May 2017 09:53:23 +0200 Subject: [PATCH 0937/1164] linting: convert double quote imports to single quote --- extensions/typescript/src/utils/logger.ts | 2 +- extensions/typescript/src/utils/plugins.ts | 2 +- extensions/typescript/src/utils/telemetry.ts | 2 +- src/vs/base/browser/ui/countBadge/countBadge.ts | 4 ++-- .../base/browser/ui/progressbar/progressbar.ts | 4 ++-- src/vs/base/test/common/json.test.ts | 2 +- src/vs/code/electron-main/window.ts | 2 +- src/vs/code/electron-main/windows.ts | 2 +- src/vs/code/node/keyboard.ts | 4 ++-- .../editor/browser/controller/textAreaHandler.ts | 12 ++++++------ .../editor/browser/controller/textAreaInput.ts | 4 ++-- src/vs/editor/browser/view/viewController.ts | 2 +- src/vs/editor/browser/view/viewImpl.ts | 2 +- .../viewParts/editorScrollbar/editorScrollbar.ts | 2 +- .../editor/browser/viewParts/minimap/minimap.ts | 4 ++-- .../scrollDecoration/scrollDecoration.ts | 4 ++-- src/vs/editor/browser/widget/diffEditorWidget.ts | 2 +- src/vs/editor/common/commonCodeEditor.ts | 4 ++-- src/vs/editor/common/config/fontInfo.ts | 2 +- src/vs/editor/common/controller/accGenerator.ts | 2 +- src/vs/editor/common/controller/coreCommands.ts | 6 +++--- src/vs/editor/common/controller/cursor.ts | 2 +- src/vs/editor/common/controller/cursorCommon.ts | 2 +- .../common/controller/cursorDeleteOperations.ts | 2 +- .../common/controller/cursorTypeOperations.ts | 2 +- .../common/controller/cursorWordOperations.ts | 2 +- src/vs/editor/common/model/textModel.ts | 2 +- src/vs/editor/common/model/textModelSearch.ts | 2 +- .../editor/common/services/modelServiceImpl.ts | 2 +- src/vs/editor/common/standalone/themes.ts | 4 ++-- src/vs/editor/common/view/viewEvents.ts | 2 +- src/vs/editor/common/viewLayout/viewLayout.ts | 2 +- .../common/viewModel/splitLinesCollection.ts | 2 +- src/vs/editor/common/viewModel/viewModel.ts | 6 +++--- src/vs/editor/common/viewModel/viewModelImpl.ts | 2 +- .../bracketMatching/common/bracketMatching.ts | 6 +++--- .../editor/contrib/codelens/browser/codelens.ts | 8 ++++---- .../test/common/lineCommentCommand.test.ts | 6 +++--- src/vs/editor/contrib/dnd/browser/dnd.ts | 2 +- .../editor/contrib/find/common/findController.ts | 2 +- .../contrib/find/common/findDecorations.ts | 2 +- .../contrib/folding/common/foldingModel.ts | 2 +- .../browser/goToDeclarationMouse.ts | 2 +- .../contrib/hover/browser/modesContentHover.ts | 2 +- .../inPlaceReplace/common/inPlaceReplace.ts | 2 +- .../linesOperations/common/linesOperations.ts | 2 +- .../test/common/linesOperations.test.ts | 6 +++--- src/vs/editor/contrib/links/browser/links.ts | 4 ++-- .../contrib/quickOpen/browser/editorQuickOpen.ts | 2 +- .../referenceSearch/browser/referencesWidget.ts | 4 ++-- .../contrib/snippet/browser/snippetSession.ts | 2 +- .../test/browser/snippetController2.old.test.ts | 4 ++-- .../test/browser/snippetController2.test.ts | 2 +- .../snippet/test/browser/snippetSession.test.ts | 2 +- .../wordHighlighter/common/wordHighlighter.ts | 2 +- .../wordOperations/common/wordOperations.ts | 6 +++--- .../test/common/wordOperations.test.ts | 2 +- .../contrib/zoneWidget/browser/zoneWidget.ts | 2 +- src/vs/editor/editor.main.ts | 2 +- .../browser/controller/textAreaState.test.ts | 2 +- .../test/common/commands/commandTestUtils.ts | 2 +- .../test/common/commands/sideEditing.test.ts | 2 +- .../common/config/commonEditorConfig.test.ts | 4 ++-- .../editor/test/common/controller/cursor.test.ts | 10 +++++----- .../common/controller/cursorMoveCommand.test.ts | 2 +- .../test/common/mocks/testConfiguration.ts | 2 +- .../test/common/model/textModelSearch.test.ts | 4 ++-- src/vs/workbench/browser/parts/compositePart.ts | 2 +- .../browser/parts/editor/editorGroupsControl.ts | 2 +- .../browser/parts/editor/webviewEditor.ts | 8 ++++---- .../browser/parts/statusbar/statusbarPart.ts | 2 +- .../workbench/common/editor/rangeDecorations.ts | 2 +- src/vs/workbench/electron-browser/workbench.ts | 8 ++++---- src/vs/workbench/node/extensionPoints.ts | 2 +- .../parts/debug/browser/debugActionItems.ts | 2 +- .../parts/debug/browser/exceptionWidget.ts | 6 +++--- .../electron-browser/debugEditorContribution.ts | 2 +- .../parts/debug/electron-browser/debugHover.ts | 2 +- .../electron-browser/statusbarColorProvider.ts | 2 +- .../actions/expandAbbreviation.ts | 2 +- .../emmet/electron-browser/editorAccessor.ts | 2 +- .../extensions/browser/extensionsActions.ts | 6 +++--- .../parts/feedback/electron-browser/feedback.ts | 6 +++--- .../electron-browser/feedbackStatusbarItem.ts | 2 +- .../parts/files/browser/views/openEditorsView.ts | 2 +- .../parts/markers/browser/markersTreeViewer.ts | 6 +++--- .../preferences/browser/keybindingWidgets.ts | 2 +- .../preferences/browser/keybindingsEditor.ts | 2 +- .../preferences/browser/preferencesEditor.ts | 4 ++-- .../preferences/browser/preferencesRenderers.ts | 2 +- .../preferences/browser/preferencesWidgets.ts | 2 +- .../parts/quickopen/browser/commandsHandler.ts | 2 +- .../scm/electron-browser/dirtydiffDecorator.ts | 10 +++++----- .../parts/search/browser/openFileHandler.ts | 2 +- .../parts/search/browser/searchResultsView.ts | 4 ++-- .../parts/search/browser/searchViewlet.ts | 2 +- src/vs/workbench/parts/search/common/search.ts | 8 ++++---- .../workbench/parts/search/common/searchModel.ts | 2 +- .../snippets/electron-browser/TMSnippets.ts | 2 +- .../electron-browser/terminal.contribution.ts | 2 +- .../electron-browser/terminalConfigHelper.ts | 2 +- .../electron-browser/terminalInstance.ts | 4 ++-- .../terminalConfigHelper.test.ts | 2 +- .../electron-browser/releaseNotesEditor.ts | 2 +- .../editor/test/browser/editorService.test.ts | 2 +- .../themes/electron-browser/colorThemeData.ts | 2 +- .../electron-browser/workbenchThemeService.ts | 2 +- .../test/browser/parts/editor/baseEditor.test.ts | 2 +- .../test/common/editor/editorDiffModel.test.ts | 16 ++++++++-------- 109 files changed, 177 insertions(+), 177 deletions(-) diff --git a/extensions/typescript/src/utils/logger.ts b/extensions/typescript/src/utils/logger.ts index 7f82fb28c96..8e31d66d858 100644 --- a/extensions/typescript/src/utils/logger.ts +++ b/extensions/typescript/src/utils/logger.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { OutputChannel, window } from "vscode"; +import { OutputChannel, window } from 'vscode'; import * as is from './is'; import * as nls from 'vscode-nls'; diff --git a/extensions/typescript/src/utils/plugins.ts b/extensions/typescript/src/utils/plugins.ts index 49f0d93b4b6..23342cc8b31 100644 --- a/extensions/typescript/src/utils/plugins.ts +++ b/extensions/typescript/src/utils/plugins.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { extensions } from "vscode"; +import { extensions } from 'vscode'; export interface TypeScriptServerPlugin { diff --git a/extensions/typescript/src/utils/telemetry.ts b/extensions/typescript/src/utils/telemetry.ts index 5162a0c24d5..b687b11b4ac 100644 --- a/extensions/typescript/src/utils/telemetry.ts +++ b/extensions/typescript/src/utils/telemetry.ts @@ -5,7 +5,7 @@ import * as path from 'path'; import VsCodeTelemetryReporter from 'vscode-extension-telemetry'; -import { Disposable } from "vscode"; +import { Disposable } from 'vscode'; interface IPackageInfo { diff --git a/src/vs/base/browser/ui/countBadge/countBadge.ts b/src/vs/base/browser/ui/countBadge/countBadge.ts index a7fa56efce8..8ff58693925 100644 --- a/src/vs/base/browser/ui/countBadge/countBadge.ts +++ b/src/vs/base/browser/ui/countBadge/countBadge.ts @@ -8,8 +8,8 @@ import 'vs/css!./countBadge'; import { $, append } from 'vs/base/browser/dom'; import { format } from 'vs/base/common/strings'; -import { Color } from "vs/base/common/color"; -import { mixin } from "vs/base/common/objects"; +import { Color } from 'vs/base/common/color'; +import { mixin } from 'vs/base/common/objects'; export interface ICountBadgeOptions extends ICountBadgetyles { count?: number; diff --git a/src/vs/base/browser/ui/progressbar/progressbar.ts b/src/vs/base/browser/ui/progressbar/progressbar.ts index 1287112824b..ea34e06e1cb 100644 --- a/src/vs/base/browser/ui/progressbar/progressbar.ts +++ b/src/vs/base/browser/ui/progressbar/progressbar.ts @@ -11,8 +11,8 @@ import assert = require('vs/base/common/assert'); import { Builder, $ } from 'vs/base/browser/builder'; import DOM = require('vs/base/browser/dom'); import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { Color } from "vs/base/common/color"; -import { mixin } from "vs/base/common/objects"; +import { Color } from 'vs/base/common/color'; +import { mixin } from 'vs/base/common/objects'; const css_done = 'done'; const css_active = 'active'; diff --git a/src/vs/base/test/common/json.test.ts b/src/vs/base/test/common/json.test.ts index 42a0804c113..fe129f08808 100644 --- a/src/vs/base/test/common/json.test.ts +++ b/src/vs/base/test/common/json.test.ts @@ -8,7 +8,7 @@ import * as assert from 'assert'; import { SyntaxKind, createScanner, parse, getLocation, Node, ParseError, parseTree, ParseErrorCode, ParseOptions, Segment, findNodeAtLocation, getNodeValue, ScanError } from 'vs/base/common/json'; -import { getParseErrorMessage } from "vs/base/common/jsonErrorMessages"; +import { getParseErrorMessage } from 'vs/base/common/jsonErrorMessages'; function assertKinds(text: string, ...kinds: SyntaxKind[]): void { var scanner = createScanner(text); diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 4b1840c8642..91d560b50fd 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -22,7 +22,7 @@ import product from 'vs/platform/node/product'; import { getCommonHTTPHeaders } from 'vs/platform/environment/node/http'; import { IWindowSettings, MenuBarVisibility } from 'vs/platform/windows/common/windows'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { KeyboardLayoutMonitor } from "vs/code/node/keyboard"; +import { KeyboardLayoutMonitor } from 'vs/code/node/keyboard'; export interface IWindowState { width?: number; diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index b4324486c62..cc0800f25e6 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -31,7 +31,7 @@ import product from 'vs/platform/node/product'; import { OpenContext } from 'vs/code/common/windows'; import { ITelemetryService, ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; import { isParent, isEqual, isEqualOrParent } from 'vs/platform/files/common/files'; -import { KeyboardLayoutMonitor } from "vs/code/node/keyboard"; +import { KeyboardLayoutMonitor } from 'vs/code/node/keyboard'; enum WindowError { UNRESPONSIVE, diff --git a/src/vs/code/node/keyboard.ts b/src/vs/code/node/keyboard.ts index d2f968371ef..16979fc90c0 100644 --- a/src/vs/code/node/keyboard.ts +++ b/src/vs/code/node/keyboard.ts @@ -7,8 +7,8 @@ import * as nativeKeymap from 'native-keymap'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { isMacintosh } from "vs/base/common/platform"; -import { Emitter } from "vs/base/common/event"; +import { isMacintosh } from 'vs/base/common/platform'; +import { Emitter } from 'vs/base/common/event'; export class KeyboardLayoutMonitor { diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index f9ae737307e..e927fcb4ab1 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -18,12 +18,12 @@ import { HorizontalRange, RenderingContext, RestrictedRenderingContext } from 'v import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { ViewController } from 'vs/editor/browser/view/viewController'; -import { EndOfLinePreference } from "vs/editor/common/editorCommon"; -import { IKeyboardEvent } from "vs/base/browser/keyboardEvent"; -import { PartFingerprints, PartFingerprint, ViewPart } from "vs/editor/browser/view/viewPart"; -import { Margin } from "vs/editor/browser/viewParts/margin/margin"; -import { LineNumbersOverlay } from "vs/editor/browser/viewParts/lineNumbers/lineNumbers"; -import { BareFontInfo } from "vs/editor/common/config/fontInfo"; +import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; +import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { PartFingerprints, PartFingerprint, ViewPart } from 'vs/editor/browser/view/viewPart'; +import { Margin } from 'vs/editor/browser/viewParts/margin/margin'; +import { LineNumbersOverlay } from 'vs/editor/browser/viewParts/lineNumbers/lineNumbers'; +import { BareFontInfo } from 'vs/editor/common/config/fontInfo'; export interface ITextAreaHandlerHelper { visibleRangeForPositionRelativeToEditor(lineNumber: number, column: number): HorizontalRange; diff --git a/src/vs/editor/browser/controller/textAreaInput.ts b/src/vs/editor/browser/controller/textAreaInput.ts index 757bbf1dd41..e1f99b036e8 100644 --- a/src/vs/editor/browser/controller/textAreaInput.ts +++ b/src/vs/editor/browser/controller/textAreaInput.ts @@ -13,8 +13,8 @@ import { ITypeData, TextAreaState, ITextAreaWrapper } from 'vs/editor/browser/co import * as browser from 'vs/base/browser/browser'; import * as platform from 'vs/base/common/platform'; import * as dom from 'vs/base/browser/dom'; -import { IKeyboardEvent } from "vs/base/browser/keyboardEvent"; -import { FastDomNode } from "vs/base/browser/fastDomNode"; +import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { FastDomNode } from 'vs/base/browser/fastDomNode'; export interface ICompositionData { data: string; diff --git a/src/vs/editor/browser/view/viewController.ts b/src/vs/editor/browser/view/viewController.ts index e05ca74ea60..51beeeade27 100644 --- a/src/vs/editor/browser/view/viewController.ts +++ b/src/vs/editor/browser/view/viewController.ts @@ -12,7 +12,7 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; import { ViewOutgoingEvents } from 'vs/editor/browser/view/viewOutgoingEvents'; import { CoreNavigationCommands, CoreEditorCommand } from 'vs/editor/common/controller/coreCommands'; -import { Configuration } from "vs/editor/browser/config/configuration"; +import { Configuration } from 'vs/editor/browser/config/configuration'; export interface ExecCoreEditorCommandFunc { (editorCommand: CoreEditorCommand, args: any): void; diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index 927c1d19486..2ac56ac2773 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -48,7 +48,7 @@ import { EditorScrollbar } from 'vs/editor/browser/viewParts/editorScrollbar/edi import { Minimap } from 'vs/editor/browser/viewParts/minimap/minimap'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { IThemeService, getThemeTypeSelector } from 'vs/platform/theme/common/themeService'; -import { Cursor } from "vs/editor/common/controller/cursor"; +import { Cursor } from 'vs/editor/common/controller/cursor'; export interface IContentWidgetData { widget: editorBrowser.IContentWidget; diff --git a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts index 11d53265128..89aee09559d 100644 --- a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts +++ b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts @@ -13,7 +13,7 @@ import { ViewContext } from 'vs/editor/common/view/viewContext'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; -import { getThemeTypeSelector } from "vs/platform/theme/common/themeService"; +import { getThemeTypeSelector } from 'vs/platform/theme/common/themeService'; export class EditorScrollbar extends ViewPart { diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index 9c922137ede..46d8dde55d5 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -25,8 +25,8 @@ import { RGBA } from 'vs/base/common/color'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { GlobalMouseMoveMonitor, IStandardMouseMoveEventData, standardMouseMoveMerger } from 'vs/base/browser/globalMouseMoveMonitor'; import * as platform from 'vs/base/common/platform'; -import { registerThemingParticipant } from "vs/platform/theme/common/themeService"; -import { scrollbarSliderBackground, scrollbarSliderHoverBackground, scrollbarSliderActiveBackground, scrollbarShadow } from "vs/platform/theme/common/colorRegistry"; +import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { scrollbarSliderBackground, scrollbarSliderHoverBackground, scrollbarSliderActiveBackground, scrollbarShadow } from 'vs/platform/theme/common/colorRegistry'; const enum RenderMinimap { None = 0, diff --git a/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts b/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts index 92134f722a1..e4086a1e00a 100644 --- a/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts +++ b/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts @@ -11,8 +11,8 @@ import { ViewPart } from 'vs/editor/browser/view/viewPart'; import { ViewContext } from 'vs/editor/common/view/viewContext'; import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { registerThemingParticipant } from "vs/platform/theme/common/themeService"; -import { scrollbarShadow } from "vs/platform/theme/common/colorRegistry"; +import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { scrollbarShadow } from 'vs/platform/theme/common/colorRegistry'; export class ScrollDecorationViewPart extends ViewPart { diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index c655b958451..556c843ce15 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -36,7 +36,7 @@ import { scrollbarShadow, diffInserted, diffRemoved, defaultInsertColor, default import { Color } from 'vs/base/common/color'; import { OverviewRulerZone } from 'vs/editor/common/view/overviewZoneManager'; import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; interface IEditorDiffDecorations { decorations: editorCommon.IModelDeltaDecoration[]; diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index d8b808d3f06..c5285a83724 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -28,8 +28,8 @@ import { import * as editorOptions from 'vs/editor/common/config/editorOptions'; import { ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { CommonEditorRegistry } from "vs/editor/common/editorCommonExtensions"; -import { VerticalRevealType } from "vs/editor/common/view/viewEvents"; +import { CommonEditorRegistry } from 'vs/editor/common/editorCommonExtensions'; +import { VerticalRevealType } from 'vs/editor/common/view/viewEvents'; let EDITOR_ID = 0; diff --git a/src/vs/editor/common/config/fontInfo.ts b/src/vs/editor/common/config/fontInfo.ts index 7740776bebf..9ab9a11d2a9 100644 --- a/src/vs/editor/common/config/fontInfo.ts +++ b/src/vs/editor/common/config/fontInfo.ts @@ -6,7 +6,7 @@ import * as platform from 'vs/base/common/platform'; import { EditorZoom } from 'vs/editor/common/config/editorZoom'; -import { EDITOR_FONT_DEFAULTS } from "vs/editor/common/config/editorOptions"; +import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; /** * Determined from empirical observations. diff --git a/src/vs/editor/common/controller/accGenerator.ts b/src/vs/editor/common/controller/accGenerator.ts index 6f6bb813e6b..ca556f79d2d 100644 --- a/src/vs/editor/common/controller/accGenerator.ts +++ b/src/vs/editor/common/controller/accGenerator.ts @@ -8,7 +8,7 @@ import { Position } from 'vs/editor/common/core/position'; import * as nls from 'vs/nls'; import { Range } from 'vs/editor/common/core/range'; -import { IModel } from "vs/editor/common/editorCommon"; +import { IModel } from 'vs/editor/common/editorCommon'; import { Selection } from 'vs/editor/common/core/selection'; export class ScreenReaderMessageGenerator { diff --git a/src/vs/editor/common/controller/coreCommands.ts b/src/vs/editor/common/controller/coreCommands.ts index 639022470cd..e0a3cd88f63 100644 --- a/src/vs/editor/common/controller/coreCommands.ts +++ b/src/vs/editor/common/controller/coreCommands.ts @@ -23,9 +23,9 @@ import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import * as types from 'vs/base/common/types'; import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; import { IEditorService } from 'vs/platform/editor/common/editor'; -import { TypeOperations } from "vs/editor/common/controller/cursorTypeOperations"; -import { DeleteOperations } from "vs/editor/common/controller/cursorDeleteOperations"; -import { VerticalRevealType } from "vs/editor/common/view/viewEvents"; +import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations'; +import { DeleteOperations } from 'vs/editor/common/controller/cursorDeleteOperations'; +import { VerticalRevealType } from 'vs/editor/common/view/viewEvents'; const CORE_WEIGHT = KeybindingsRegistry.WEIGHT.editorCore(); diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 305894d79b6..0c203347cce 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -18,7 +18,7 @@ import { DeleteOperations } from 'vs/editor/common/controller/cursorDeleteOperat import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations'; import { TextModelEventType, ModelRawContentChangedEvent, RawContentChangedType } from 'vs/editor/common/model/textModelEvents'; import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; -import { IViewModel } from "vs/editor/common/viewModel/viewModel"; +import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import Event, { Emitter } from 'vs/base/common/event'; // import { ScreenReaderMessageGenerator } from "vs/editor/common/controller/accGenerator"; diff --git a/src/vs/editor/common/controller/cursorCommon.ts b/src/vs/editor/common/controller/cursorCommon.ts index e82708d17da..55e00ad1e43 100644 --- a/src/vs/editor/common/controller/cursorCommon.ts +++ b/src/vs/editor/common/controller/cursorCommon.ts @@ -18,7 +18,7 @@ import { IAutoClosingPair } from 'vs/editor/common/modes/languageConfiguration'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; -import { VerticalRevealType } from "vs/editor/common/view/viewEvents"; +import { VerticalRevealType } from 'vs/editor/common/view/viewEvents'; export interface IColumnSelectData { toViewLineNumber: number; diff --git a/src/vs/editor/common/controller/cursorDeleteOperations.ts b/src/vs/editor/common/controller/cursorDeleteOperations.ts index c968bb49f76..7951ab91b83 100644 --- a/src/vs/editor/common/controller/cursorDeleteOperations.ts +++ b/src/vs/editor/common/controller/cursorDeleteOperations.ts @@ -10,7 +10,7 @@ import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { MoveOperations } from 'vs/editor/common/controller/cursorMoveOperations'; import * as strings from 'vs/base/common/strings'; -import { ICommand } from "vs/editor/common/editorCommon"; +import { ICommand } from 'vs/editor/common/editorCommon'; export class DeleteOperations { diff --git a/src/vs/editor/common/controller/cursorTypeOperations.ts b/src/vs/editor/common/controller/cursorTypeOperations.ts index cb2b2184669..6abac0a543e 100644 --- a/src/vs/editor/common/controller/cursorTypeOperations.ts +++ b/src/vs/editor/common/controller/cursorTypeOperations.ts @@ -16,7 +16,7 @@ import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageCo import { IndentAction } from 'vs/editor/common/modes/languageConfiguration'; import { SurroundSelectionCommand } from 'vs/editor/common/commands/surroundSelectionCommand'; import { IElectricAction } from 'vs/editor/common/modes/supports/electricCharacter'; -import { getMapForWordSeparators, WordCharacterClass } from "vs/editor/common/controller/wordCharacterClassifier"; +import { getMapForWordSeparators, WordCharacterClass } from 'vs/editor/common/controller/wordCharacterClassifier'; export class TypeOperations { diff --git a/src/vs/editor/common/controller/cursorWordOperations.ts b/src/vs/editor/common/controller/cursorWordOperations.ts index 305cfe68392..3666961a2a2 100644 --- a/src/vs/editor/common/controller/cursorWordOperations.ts +++ b/src/vs/editor/common/controller/cursorWordOperations.ts @@ -6,7 +6,7 @@ import { SingleCursorState, CursorConfiguration, ICursorSimpleModel } from 'vs/editor/common/controller/cursorCommon'; import { Position } from 'vs/editor/common/core/position'; -import { WordCharacterClassifier, WordCharacterClass, getMapForWordSeparators } from "vs/editor/common/controller/wordCharacterClassifier"; +import { WordCharacterClassifier, WordCharacterClass, getMapForWordSeparators } from 'vs/editor/common/controller/wordCharacterClassifier'; import * as strings from 'vs/base/common/strings'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 0d7ec1065b4..d15842430f3 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -11,7 +11,7 @@ import { Range, IRange } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { ModelLine } from 'vs/editor/common/model/modelLine'; import { guessIndentation } from 'vs/editor/common/model/indentationGuesser'; -import { EDITOR_MODEL_DEFAULTS } from "vs/editor/common/config/editorOptions"; +import { EDITOR_MODEL_DEFAULTS } from 'vs/editor/common/config/editorOptions'; import { PrefixSumComputer } from 'vs/editor/common/viewModel/prefixSumComputer'; import { IndentRange, computeRanges } from 'vs/editor/common/model/indentRanges'; import { TextModelSearch, SearchParams } from 'vs/editor/common/model/textModelSearch'; diff --git a/src/vs/editor/common/model/textModelSearch.ts b/src/vs/editor/common/model/textModelSearch.ts index d19ad9e608c..af265935776 100644 --- a/src/vs/editor/common/model/textModelSearch.ts +++ b/src/vs/editor/common/model/textModelSearch.ts @@ -10,7 +10,7 @@ import { Range } from 'vs/editor/common/core/range'; import { FindMatch, EndOfLinePreference } from 'vs/editor/common/editorCommon'; import { CharCode } from 'vs/base/common/charCode'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { getMapForWordSeparators, WordCharacterClassifier, WordCharacterClass } from "vs/editor/common/controller/wordCharacterClassifier"; +import { getMapForWordSeparators, WordCharacterClassifier, WordCharacterClass } from 'vs/editor/common/controller/wordCharacterClassifier'; const LIMIT_FIND_COUNT = 999; diff --git a/src/vs/editor/common/services/modelServiceImpl.ts b/src/vs/editor/common/services/modelServiceImpl.ts index 5fee6ded32a..5bcb68eba4b 100644 --- a/src/vs/editor/common/services/modelServiceImpl.ts +++ b/src/vs/editor/common/services/modelServiceImpl.ts @@ -21,7 +21,7 @@ import { IMode, LanguageIdentifier } from 'vs/editor/common/modes'; import { IModelService } from 'vs/editor/common/services/modelService'; import * as platform from 'vs/base/common/platform'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { EDITOR_MODEL_DEFAULTS } from "vs/editor/common/config/editorOptions"; +import { EDITOR_MODEL_DEFAULTS } from 'vs/editor/common/config/editorOptions'; import { PLAINTEXT_LANGUAGE_IDENTIFIER } from 'vs/editor/common/modes/modesRegistry'; import { IRawTextSource, TextSource, RawTextSource } from 'vs/editor/common/model/textSource'; import * as textModelEvents from 'vs/editor/common/model/textModelEvents'; diff --git a/src/vs/editor/common/standalone/themes.ts b/src/vs/editor/common/standalone/themes.ts index a97a9fab1ee..8093472bba8 100644 --- a/src/vs/editor/common/standalone/themes.ts +++ b/src/vs/editor/common/standalone/themes.ts @@ -6,8 +6,8 @@ 'use strict'; import { IStandaloneThemeData } from 'vs/editor/common/services/standaloneThemeService'; -import { editorBackground, editorForeground, editorSelectionHighlight, editorInactiveSelection } from "vs/platform/theme/common/colorRegistry"; -import { editorIndentGuides } from "vs/editor/common/view/editorColorRegistry"; +import { editorBackground, editorForeground, editorSelectionHighlight, editorInactiveSelection } from 'vs/platform/theme/common/colorRegistry'; +import { editorIndentGuides } from 'vs/editor/common/view/editorColorRegistry'; /* -------------------------------- Begin vs theme -------------------------------- */ export const vs: IStandaloneThemeData = { diff --git a/src/vs/editor/common/view/viewEvents.ts b/src/vs/editor/common/view/viewEvents.ts index f6696746fbf..72fc6b41fbe 100644 --- a/src/vs/editor/common/view/viewEvents.ts +++ b/src/vs/editor/common/view/viewEvents.ts @@ -9,7 +9,7 @@ import { Selection } from 'vs/editor/common/core/selection'; import { ScrollEvent } from 'vs/base/common/scrollable'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; import * as errors from 'vs/base/common/errors'; -import { IDisposable, Disposable } from "vs/base/common/lifecycle"; +import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; export const enum ViewEventType { ViewConfigurationChanged = 1, diff --git a/src/vs/editor/common/viewLayout/viewLayout.ts b/src/vs/editor/common/viewLayout/viewLayout.ts index e6a9d763d29..4af8cbd5235 100644 --- a/src/vs/editor/common/viewLayout/viewLayout.ts +++ b/src/vs/editor/common/viewLayout/viewLayout.ts @@ -12,7 +12,7 @@ import { IViewLayout, IViewWhitespaceViewportData, Viewport } from 'vs/editor/co import { IPartialViewLinesViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData'; import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; import Event from 'vs/base/common/event'; -import { IConfigurationChangedEvent } from "vs/editor/common/config/editorOptions"; +import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; export class ViewLayout extends Disposable implements IViewLayout { diff --git a/src/vs/editor/common/viewModel/splitLinesCollection.ts b/src/vs/editor/common/viewModel/splitLinesCollection.ts index 72caeb160e8..7c40b262f09 100644 --- a/src/vs/editor/common/viewModel/splitLinesCollection.ts +++ b/src/vs/editor/common/viewModel/splitLinesCollection.ts @@ -12,7 +12,7 @@ import { PrefixSumComputerWithCache } from 'vs/editor/common/viewModel/prefixSum import { ViewLineData } from 'vs/editor/common/viewModel/viewModel'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { WrappingIndent } from 'vs/editor/common/config/editorOptions'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export class OutputPosition { _outputPositionBrand: void; diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index ffb43fadd6a..6372d3a1415 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -11,9 +11,9 @@ import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ViewEvent, IViewEventListener } from 'vs/editor/common/view/viewEvents'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { Scrollable } from "vs/base/common/scrollable"; -import { IPartialViewLinesViewportData } from "vs/editor/common/viewLayout/viewLinesViewportData"; -import { IEditorWhitespace } from "vs/editor/common/viewLayout/whitespaceComputer"; +import { Scrollable } from 'vs/base/common/scrollable'; +import { IPartialViewLinesViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData'; +import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; export interface IViewWhitespaceViewportData { readonly id: number; diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index be7b24bb828..a7a7297e881 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -19,7 +19,7 @@ import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { MinimapTokensColorTracker } from 'vs/editor/common/view/minimapCharRenderer'; import * as textModelEvents from 'vs/editor/common/model/textModelEvents'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; -import { CharacterHardWrappingLineMapperFactory } from "vs/editor/common/viewModel/characterHardWrappingLineMapper"; +import { CharacterHardWrappingLineMapperFactory } from 'vs/editor/common/viewModel/characterHardWrappingLineMapper'; import { ViewLayout } from 'vs/editor/common/viewLayout/viewLayout'; export class CoordinatesConverter implements ICoordinatesConverter { diff --git a/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts b/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts index a3443fa79fd..7b79df152e7 100644 --- a/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts +++ b/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts @@ -14,9 +14,9 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { editorAction, commonEditorContribution, ServicesAccessor, EditorAction } from 'vs/editor/common/editorCommonExtensions'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { registerThemingParticipant } from "vs/platform/theme/common/themeService"; -import { editorBracketMatchBackground, editorBracketMatchBorder } from "vs/editor/common/view/editorColorRegistry"; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { editorBracketMatchBackground, editorBracketMatchBorder } from 'vs/editor/common/view/editorColorRegistry'; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; @editorAction class SelectBracketAction extends EditorAction { diff --git a/src/vs/editor/contrib/codelens/browser/codelens.ts b/src/vs/editor/contrib/codelens/browser/codelens.ts index 84fcda05eb1..2c7e6ff341c 100644 --- a/src/vs/editor/contrib/codelens/browser/codelens.ts +++ b/src/vs/editor/contrib/codelens/browser/codelens.ts @@ -22,10 +22,10 @@ import * as editorBrowser from 'vs/editor/browser/editorBrowser'; import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; import { ICodeLensData, getCodeLensData } from '../common/codelens'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; -import { editorCodeLensForeground } from "vs/editor/common/view/editorColorRegistry"; -import { registerThemingParticipant } from "vs/platform/theme/common/themeService"; -import { editorActiveLinkForeground } from "vs/platform/theme/common/colorRegistry"; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { editorCodeLensForeground } from 'vs/editor/common/view/editorColorRegistry'; +import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; class CodeLensViewZone implements editorBrowser.IViewZone { diff --git a/src/vs/editor/contrib/comment/test/common/lineCommentCommand.test.ts b/src/vs/editor/contrib/comment/test/common/lineCommentCommand.test.ts index 1326d8bda33..64d900f1dd7 100644 --- a/src/vs/editor/contrib/comment/test/common/lineCommentCommand.test.ts +++ b/src/vs/editor/contrib/comment/test/common/lineCommentCommand.test.ts @@ -12,9 +12,9 @@ import { CommentMode } from 'vs/editor/test/common/commentMode'; import * as modes from 'vs/editor/common/modes'; import { NULL_STATE } from 'vs/editor/common/modes/nullMode'; import { TokenizationResult2 } from 'vs/editor/common/core/token'; -import { MockMode } from "vs/editor/test/common/mocks/mockMode"; -import { CommentRule } from "vs/editor/common/modes/languageConfiguration"; -import { LanguageConfigurationRegistry } from "vs/editor/common/modes/languageConfigurationRegistry"; +import { MockMode } from 'vs/editor/test/common/mocks/mockMode'; +import { CommentRule } from 'vs/editor/common/modes/languageConfiguration'; +import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; suite('Editor Contrib - Line Comment Command', () => { diff --git a/src/vs/editor/contrib/dnd/browser/dnd.ts b/src/vs/editor/contrib/dnd/browser/dnd.ts index e305c8af11a..7628350f4e2 100644 --- a/src/vs/editor/contrib/dnd/browser/dnd.ts +++ b/src/vs/editor/contrib/dnd/browser/dnd.ts @@ -17,7 +17,7 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { DragAndDropCommand } from '../common/dragAndDropCommand'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; @editorContribution export class DragAndDropController implements editorCommon.IEditorContribution { diff --git a/src/vs/editor/contrib/find/common/findController.ts b/src/vs/editor/contrib/find/common/findController.ts index e0657d80c73..4536b2b5b6f 100644 --- a/src/vs/editor/contrib/find/common/findController.ts +++ b/src/vs/editor/contrib/find/common/findController.ts @@ -21,7 +21,7 @@ import { RunOnceScheduler, Delayer } from 'vs/base/common/async'; import { CursorChangeReason, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export const enum FindStartFocusAction { NoFocusChange, diff --git a/src/vs/editor/contrib/find/common/findDecorations.ts b/src/vs/editor/contrib/find/common/findDecorations.ts index 2a80081cf0a..4cf3d631284 100644 --- a/src/vs/editor/contrib/find/common/findDecorations.ts +++ b/src/vs/editor/contrib/find/common/findDecorations.ts @@ -8,7 +8,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export class FindDecorations implements IDisposable { diff --git a/src/vs/editor/contrib/folding/common/foldingModel.ts b/src/vs/editor/contrib/folding/common/foldingModel.ts index 128f450b087..8ebd2424cc7 100644 --- a/src/vs/editor/contrib/folding/common/foldingModel.ts +++ b/src/vs/editor/contrib/folding/common/foldingModel.ts @@ -5,7 +5,7 @@ import * as editorCommon from 'vs/editor/common/editorCommon'; import { Range } from 'vs/editor/common/core/range'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export interface IFoldingRange { startLineNumber: number; diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts index a29f1511b44..124e4229c3d 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts @@ -24,7 +24,7 @@ import { registerThemingParticipant } from 'vs/platform/theme/common/themeServic import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { EditorState, CodeEditorStateFlag } from 'vs/editor/common/core/editorState'; import { DefinitionAction, DefinitionActionConfig } from './goToDeclarationCommands'; -import { ClickLinkGesture, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from "vs/editor/contrib/goToDeclaration/browser/clickLinkGesture"; +import { ClickLinkGesture, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from 'vs/editor/contrib/goToDeclaration/browser/clickLinkGesture'; @editorContribution class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorContribution { diff --git a/src/vs/editor/contrib/hover/browser/modesContentHover.ts b/src/vs/editor/contrib/hover/browser/modesContentHover.ts index 636180c1a66..0814b278789 100644 --- a/src/vs/editor/contrib/hover/browser/modesContentHover.ts +++ b/src/vs/editor/contrib/hover/browser/modesContentHover.ts @@ -22,7 +22,7 @@ import { getHover } from '../common/hover'; import { HoverOperation, IHoverComputer } from './hoverOperation'; import { ContentHoverWidget } from './hoverWidgets'; import { textToMarkedString, MarkedString } from 'vs/base/common/htmlContent'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; class ModesContentComputer implements IHoverComputer { diff --git a/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.ts b/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.ts index 874af70feda..030eff62c25 100644 --- a/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.ts +++ b/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.ts @@ -18,7 +18,7 @@ import { InPlaceReplaceCommand } from './inPlaceReplaceCommand'; import { EditorState, CodeEditorStateFlag } from 'vs/editor/common/core/editorState'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { editorBracketMatchBorder } from 'vs/editor/common/view/editorColorRegistry'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; @commonEditorContribution class InPlaceReplaceController implements IEditorContribution { diff --git a/src/vs/editor/contrib/linesOperations/common/linesOperations.ts b/src/vs/editor/contrib/linesOperations/common/linesOperations.ts index 4bc4b88d0fa..a41829a885b 100644 --- a/src/vs/editor/contrib/linesOperations/common/linesOperations.ts +++ b/src/vs/editor/contrib/linesOperations/common/linesOperations.ts @@ -19,7 +19,7 @@ import { CopyLinesCommand } from './copyLinesCommand'; import { DeleteLinesCommand } from './deleteLinesCommand'; import { MoveLinesCommand } from './moveLinesCommand'; import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations'; -import { CoreEditingCommands } from "vs/editor/common/controller/coreCommands"; +import { CoreEditingCommands } from 'vs/editor/common/controller/coreCommands'; // copy lines diff --git a/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts b/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts index 4a56e203f65..64c67e2cb9a 100644 --- a/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts +++ b/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts @@ -10,9 +10,9 @@ import { Position } from 'vs/editor/common/core/position'; import { Handler, IModel, DefaultEndOfLine } from 'vs/editor/common/editorCommon'; import { withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; import { DeleteAllLeftAction, JoinLinesAction, TransposeAction, UpperCaseAction, LowerCaseAction, DeleteAllRightAction, InsertLineBeforeAction, InsertLineAfterAction, IndentLinesAction } from 'vs/editor/contrib/linesOperations/common/linesOperations'; -import { Cursor } from "vs/editor/common/controller/cursor"; -import { Model } from "vs/editor/common/model/model"; -import { CoreEditingCommands } from "vs/editor/common/controller/coreCommands"; +import { Cursor } from 'vs/editor/common/controller/cursor'; +import { Model } from 'vs/editor/common/model/model'; +import { CoreEditingCommands } from 'vs/editor/common/controller/coreCommands'; suite('Editor Contrib - Line Operations', () => { suite('DeleteAllLeftAction', () => { diff --git a/src/vs/editor/contrib/links/browser/links.ts b/src/vs/editor/contrib/links/browser/links.ts index 356f9bf6843..d25c7a9a3ad 100644 --- a/src/vs/editor/contrib/links/browser/links.ts +++ b/src/vs/editor/contrib/links/browser/links.ts @@ -24,8 +24,8 @@ import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { Position } from 'vs/editor/common/core/position'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; -import { ClickLinkGesture, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from "vs/editor/contrib/goToDeclaration/browser/clickLinkGesture"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; +import { ClickLinkGesture, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from 'vs/editor/contrib/goToDeclaration/browser/clickLinkGesture'; const HOVER_MESSAGE_GENERAL_META = ( platform.isMacintosh diff --git a/src/vs/editor/contrib/quickOpen/browser/editorQuickOpen.ts b/src/vs/editor/contrib/quickOpen/browser/editorQuickOpen.ts index 3b088852ed4..6117ad98768 100644 --- a/src/vs/editor/contrib/quickOpen/browser/editorQuickOpen.ts +++ b/src/vs/editor/contrib/quickOpen/browser/editorQuickOpen.ts @@ -14,7 +14,7 @@ import { Selection } from 'vs/editor/common/core/selection'; import { IActionOptions, EditorAction } from 'vs/editor/common/editorCommonExtensions'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Range } from 'vs/editor/common/core/range'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export interface IQuickOpenControllerOpts { inputAriaLabel: string; diff --git a/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts b/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts index a7175ad5a1f..959c2bc8939 100644 --- a/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts +++ b/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts @@ -43,8 +43,8 @@ import { registerThemingParticipant, ITheme, IThemeService } from 'vs/platform/t import { attachListStyler, attachBadgeStyler } from 'vs/platform/theme/common/styler'; import { IModelDecorationsChangedEvent } from 'vs/editor/common/model/textModelEvents'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; -import { IEnvironmentService } from "vs/platform/environment/common/environment"; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; class DecorationsManager implements IDisposable { diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts index b5938e3c7e4..2a38815488c 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -16,7 +16,7 @@ import { IPosition } from 'vs/editor/common/core/position'; import { groupBy } from 'vs/base/common/arrays'; import { dispose } from 'vs/base/common/lifecycle'; import { EditorSnippetVariableResolver } from "./snippetVariables"; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export class OneSnippet { diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts index 9e15e0bed55..1efa1b1a8c1 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts @@ -10,8 +10,8 @@ import { Selection } from 'vs/editor/common/core/selection'; import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { MockCodeEditor, withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; import { Cursor } from 'vs/editor/common/controller/cursor'; -import { IContextKeyService } from "vs/platform/contextkey/common/contextkey"; -import { ICommonCodeEditor } from "vs/editor/common/editorCommon"; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; class TestSnippetController extends SnippetController2 { diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts index 04a866727d3..6c30a179315 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts @@ -9,7 +9,7 @@ import { Selection } from 'vs/editor/common/core/selection'; import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { mockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; -import { Model } from "vs/editor/common/model/model"; +import { Model } from 'vs/editor/common/model/model'; import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; suite('SnippetController2', function () { diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts index 5eb6c7cba93..100b9c0dbd8 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts @@ -11,7 +11,7 @@ import { IPosition, Position } from 'vs/editor/common/core/position'; import { SnippetSession } from 'vs/editor/contrib/snippet/browser/snippetSession'; import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { mockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; -import { Model } from "vs/editor/common/model/model"; +import { Model } from 'vs/editor/common/model/model'; suite('SnippetSession', function () { diff --git a/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts b/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts index b3fcd42202a..896e593b005 100644 --- a/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts +++ b/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts @@ -18,7 +18,7 @@ import { Position } from 'vs/editor/common/core/position'; import { registerColor, editorSelectionHighlight, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { CursorChangeReason, ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export const editorWordHighlight = registerColor('editor.wordHighlightBackground', { dark: '#575757B8', light: '#57575740', hc: null }, nls.localize('wordHighlight', 'Background color of a symbol during read-access, like reading a variable.')); export const editorWordHighlightStrong = registerColor('editor.wordHighlightStrongBackground', { dark: '#004972B8', light: '#0e639c40', hc: null }, nls.localize('wordHighlightStrong', 'Background color of a symbol during write-access, like writing to a variable.')); diff --git a/src/vs/editor/contrib/wordOperations/common/wordOperations.ts b/src/vs/editor/contrib/wordOperations/common/wordOperations.ts index 469e9446eb2..a2da8517ce5 100644 --- a/src/vs/editor/contrib/wordOperations/common/wordOperations.ts +++ b/src/vs/editor/contrib/wordOperations/common/wordOperations.ts @@ -14,9 +14,9 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { WordNavigationType, WordOperations } from 'vs/editor/common/controller/cursorWordOperations'; import { ReplaceCommand } from 'vs/editor/common/commands/replaceCommand'; -import { getMapForWordSeparators, WordCharacterClassifier } from "vs/editor/common/controller/wordCharacterClassifier"; -import { CursorState } from "vs/editor/common/controller/cursorCommon"; -import { CursorChangeReason } from "vs/editor/common/controller/cursorEvents"; +import { getMapForWordSeparators, WordCharacterClassifier } from 'vs/editor/common/controller/wordCharacterClassifier'; +import { CursorState } from 'vs/editor/common/controller/cursorCommon'; +import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; export interface MoveWordOptions extends ICommandOptions { inSelectionMode: boolean; diff --git a/src/vs/editor/contrib/wordOperations/test/common/wordOperations.test.ts b/src/vs/editor/contrib/wordOperations/test/common/wordOperations.test.ts index d67a436a400..40c303f0bec 100644 --- a/src/vs/editor/contrib/wordOperations/test/common/wordOperations.test.ts +++ b/src/vs/editor/contrib/wordOperations/test/common/wordOperations.test.ts @@ -17,7 +17,7 @@ import { DeleteWordLeft, DeleteWordStartLeft, DeleteWordEndLeft, DeleteWordRight, DeleteWordStartRight, DeleteWordEndRight } from 'vs/editor/contrib/wordOperations/common/wordOperations'; -import { EditorCommand } from "vs/editor/common/editorCommonExtensions"; +import { EditorCommand } from 'vs/editor/common/editorCommonExtensions'; suite('WordOperations', () => { diff --git a/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts b/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts index e0de87646d8..dc599a468bf 100644 --- a/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts +++ b/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts @@ -16,7 +16,7 @@ import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition, IViewZone, IViewZo import { Color, RGBA } from 'vs/base/common/color'; import { EditorLayoutInfo } from 'vs/editor/common/config/editorOptions'; import { Position, IPosition } from 'vs/editor/common/core/position'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export interface IOptions { showFrame?: boolean; diff --git a/src/vs/editor/editor.main.ts b/src/vs/editor/editor.main.ts index 8e3a8c151dd..667a3004499 100644 --- a/src/vs/editor/editor.main.ts +++ b/src/vs/editor/editor.main.ts @@ -14,7 +14,7 @@ import 'vs/editor/contrib/inspectTokens/browser/inspectTokens'; import { createMonacoBaseAPI } from 'vs/editor/common/standalone/standaloneBase'; import { createMonacoEditorAPI } from 'vs/editor/browser/standalone/standaloneEditor'; import { createMonacoLanguagesAPI } from 'vs/editor/browser/standalone/standaloneLanguages'; -import { EDITOR_DEFAULTS, WrappingIndent } from "vs/editor/common/config/editorOptions"; +import { EDITOR_DEFAULTS, WrappingIndent } from 'vs/editor/common/config/editorOptions'; // Set defaults for standalone editor (EDITOR_DEFAULTS).wrappingIndent = WrappingIndent.None; diff --git a/src/vs/editor/test/browser/controller/textAreaState.test.ts b/src/vs/editor/test/browser/controller/textAreaState.test.ts index 9170690d5ec..59552e7542e 100644 --- a/src/vs/editor/test/browser/controller/textAreaState.test.ts +++ b/src/vs/editor/test/browser/controller/textAreaState.test.ts @@ -9,7 +9,7 @@ import { ISimpleModel, TextAreaState, ITextAreaWrapper, PagedScreenReaderStrateg import { Range } from 'vs/editor/common/core/range'; import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; import { Disposable } from 'vs/base/common/lifecycle'; -import { Model } from "vs/editor/common/model/model"; +import { Model } from 'vs/editor/common/model/model'; import { Selection } from 'vs/editor/common/core/selection'; export class MockTextAreaWrapper extends Disposable implements ITextAreaWrapper { diff --git a/src/vs/editor/test/common/commands/commandTestUtils.ts b/src/vs/editor/test/common/commands/commandTestUtils.ts index b753b8a063a..184f5e8d99b 100644 --- a/src/vs/editor/test/common/commands/commandTestUtils.ts +++ b/src/vs/editor/test/common/commands/commandTestUtils.ts @@ -10,7 +10,7 @@ import { Selection } from 'vs/editor/common/core/selection'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { Model } from 'vs/editor/common/model/model'; import { LanguageIdentifier } from 'vs/editor/common/modes'; -import { withMockCodeEditor } from "vs/editor/test/common/mocks/mockCodeEditor"; +import { withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; export function testCommand( lines: string[], diff --git a/src/vs/editor/test/common/commands/sideEditing.test.ts b/src/vs/editor/test/common/commands/sideEditing.test.ts index 2fa3ea6035f..af17bee84a2 100644 --- a/src/vs/editor/test/common/commands/sideEditing.test.ts +++ b/src/vs/editor/test/common/commands/sideEditing.test.ts @@ -11,7 +11,7 @@ import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { IIdentifiedSingleEditOperation } from 'vs/editor/common/editorCommon'; import { ILineEdit, ModelLine, LineMarker, MarkersTracker } from 'vs/editor/common/model/modelLine'; -import { withMockCodeEditor } from "vs/editor/test/common/mocks/mockCodeEditor"; +import { withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; const NO_TAB_SIZE = 0; diff --git a/src/vs/editor/test/common/config/commonEditorConfig.test.ts b/src/vs/editor/test/common/config/commonEditorConfig.test.ts index 6abc5412b03..c07e1240c1f 100644 --- a/src/vs/editor/test/common/config/commonEditorConfig.test.ts +++ b/src/vs/editor/test/common/config/commonEditorConfig.test.ts @@ -7,8 +7,8 @@ import * as assert from 'assert'; import { EditorZoom } from 'vs/editor/common/config/editorZoom'; import { TestConfiguration } from 'vs/editor/test/common/mocks/testConfiguration'; -import { IEnvConfiguration } from "vs/editor/common/config/commonEditorConfig"; -import { AccessibilitySupport } from "vs/base/common/platform"; +import { IEnvConfiguration } from 'vs/editor/common/config/commonEditorConfig'; +import { AccessibilitySupport } from 'vs/base/common/platform'; suite('Common Editor Config', () => { test('Zoom Level', () => { diff --git a/src/vs/editor/test/common/controller/cursor.test.ts b/src/vs/editor/test/common/controller/cursor.test.ts index 833bd813b47..b3d15acc035 100644 --- a/src/vs/editor/test/common/controller/cursor.test.ts +++ b/src/vs/editor/test/common/controller/cursor.test.ts @@ -23,15 +23,15 @@ import { MockMode } from 'vs/editor/test/common/mocks/mockMode'; import { LanguageIdentifier } from 'vs/editor/common/modes'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { CoreNavigationCommands, CoreEditingCommands } from 'vs/editor/common/controller/coreCommands'; -import { withMockCodeEditor, MockCodeEditor } from "vs/editor/test/common/mocks/mockCodeEditor"; -import { TextModel } from "vs/editor/common/model/textModel"; -import { ViewModel } from "vs/editor/common/viewModel/viewModelImpl"; +import { withMockCodeEditor, MockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; +import { TextModel } from 'vs/editor/common/model/textModel'; +import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { ScreenReaderMessageGenerator } from "vs/editor/common/controller/accGenerator"; +import { ScreenReaderMessageGenerator } from 'vs/editor/common/controller/accGenerator'; import { CursorWordLeft, CursorWordLeftSelect, CursorWordRight, CursorWordRightSelect } from 'vs/editor/contrib/wordOperations/common/wordOperations'; -import { EditorCommand } from "vs/editor/common/editorCommonExtensions"; +import { EditorCommand } from 'vs/editor/common/editorCommonExtensions'; let H = Handler; // --------- utils diff --git a/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts b/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts index 1b4ae6b014d..2b9ac20069d 100644 --- a/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts +++ b/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts @@ -13,7 +13,7 @@ import { CursorMove } from 'vs/editor/common/controller/cursorMoveCommands'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { CoreNavigationCommands } from 'vs/editor/common/controller/coreCommands'; -import { ViewModel } from "vs/editor/common/viewModel/viewModelImpl"; +import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl'; suite('Cursor move command test', () => { diff --git a/src/vs/editor/test/common/mocks/testConfiguration.ts b/src/vs/editor/test/common/mocks/testConfiguration.ts index edddfa74fdd..a8778a6f055 100644 --- a/src/vs/editor/test/common/mocks/testConfiguration.ts +++ b/src/vs/editor/test/common/mocks/testConfiguration.ts @@ -7,7 +7,7 @@ import { CommonEditorConfiguration, IEnvConfiguration } from 'vs/editor/common/config/commonEditorConfig'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { FontInfo, BareFontInfo } from 'vs/editor/common/config/fontInfo'; -import { AccessibilitySupport } from "vs/base/common/platform"; +import { AccessibilitySupport } from 'vs/base/common/platform'; export class TestConfiguration extends CommonEditorConfiguration { diff --git a/src/vs/editor/test/common/model/textModelSearch.test.ts b/src/vs/editor/test/common/model/textModelSearch.test.ts index 4102cfad4fe..274ce45b934 100644 --- a/src/vs/editor/test/common/model/textModelSearch.test.ts +++ b/src/vs/editor/test/common/model/textModelSearch.test.ts @@ -10,8 +10,8 @@ import { FindMatch, EndOfLineSequence } from 'vs/editor/common/editorCommon'; import { Range } from 'vs/editor/common/core/range'; import { TextModel } from 'vs/editor/common/model/textModel'; import { TextModelSearch, SearchParams, SearchData } from 'vs/editor/common/model/textModelSearch'; -import { getMapForWordSeparators } from "vs/editor/common/controller/wordCharacterClassifier"; -import { USUAL_WORD_SEPARATORS } from "vs/editor/common/model/wordHelper"; +import { getMapForWordSeparators } from 'vs/editor/common/controller/wordCharacterClassifier'; +import { USUAL_WORD_SEPARATORS } from 'vs/editor/common/model/wordHelper'; // --------- Find suite('TextModelSearch', () => { diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index bb92039a1f0..5c23e84ef0f 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -36,7 +36,7 @@ import { IProgressService } from 'vs/platform/progress/common/progress'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { attachProgressBarStyler } from "vs/platform/theme/common/styler"; +import { attachProgressBarStyler } from 'vs/platform/theme/common/styler'; export interface ICompositeTitleLabel { diff --git a/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts b/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts index 05bf24ac197..4bc4a3b143a 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts @@ -36,7 +36,7 @@ import { getCodeEditor } from 'vs/editor/common/services/codeEditorService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { editorBackground, contrastBorder, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { Themable, EDITOR_GROUP_HEADER_TABS_BACKGROUND, EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND, EDITOR_GROUP_BORDER, EDITOR_DRAG_AND_DROP_BACKGROUND, EDITOR_GROUP_BACKGROUND, EDITOR_GROUP_HEADER_TABS_BORDER } from 'vs/workbench/common/theme'; -import { attachProgressBarStyler } from "vs/platform/theme/common/styler"; +import { attachProgressBarStyler } from 'vs/platform/theme/common/styler'; export enum Rochade { NONE, diff --git a/src/vs/workbench/browser/parts/editor/webviewEditor.ts b/src/vs/workbench/browser/parts/editor/webviewEditor.ts index cf852a3d1a5..50f792c3e9d 100644 --- a/src/vs/workbench/browser/parts/editor/webviewEditor.ts +++ b/src/vs/workbench/browser/parts/editor/webviewEditor.ts @@ -5,10 +5,10 @@ 'use strict'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { BaseEditor } from "vs/workbench/browser/parts/editor/baseEditor"; -import URI from "vs/base/common/uri"; -import { IStorageService } from "vs/platform/storage/common/storage"; -import { Scope } from "vs/workbench/common/memento"; +import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; +import URI from 'vs/base/common/uri'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { Scope } from 'vs/workbench/common/memento'; export interface HtmlPreviewEditorViewState { scrollYPercentage: number; diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index fd2fd574fb4..b7909865487 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -30,7 +30,7 @@ import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } import { STATUS_BAR_BACKGROUND, STATUS_BAR_FOREGROUND, STATUS_BAR_NO_FOLDER_BACKGROUND, STATUS_BAR_ITEM_HOVER_BACKGROUND, STATUS_BAR_ITEM_ACTIVE_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_HOVER_BACKGROUND, STATUS_BAR_BORDER, STATUS_BAR_NO_FOLDER_FOREGROUND } from 'vs/workbench/common/theme'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { contrastBorder } from 'vs/platform/theme/common/colorRegistry'; -import { isThemeColor } from "vs/editor/common/editorCommon"; +import { isThemeColor } from 'vs/editor/common/editorCommon'; import { Color } from 'vs/base/common/color'; export class StatusbarPart extends Part implements IStatusbarService { diff --git a/src/vs/workbench/common/editor/rangeDecorations.ts b/src/vs/workbench/common/editor/rangeDecorations.ts index 7c8678ab24c..70a95b14274 100644 --- a/src/vs/workbench/common/editor/rangeDecorations.ts +++ b/src/vs/workbench/common/editor/rangeDecorations.ts @@ -12,7 +12,7 @@ import { toResource } from 'vs/workbench/common/editor'; import { isEqual } from 'vs/platform/files/common/files'; import { IRange } from 'vs/editor/common/core/range'; import { CursorChangeReason, ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export interface IRangeHighlightDecoration { resource: URI; diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 86c445e811c..5a2a8efaff7 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -7,6 +7,7 @@ import 'vs/css!./media/workbench'; +import { localize } from 'vs/nls'; import { TPromise, ValueCallback } from 'vs/base/common/winjs.base'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import Event, { Emitter, chain } from 'vs/base/common/event'; @@ -91,11 +92,10 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWindowConfiguration } from 'vs/workbench/electron-browser/common'; -import { localize } from "vs/nls"; -import { IWorkbenchActionRegistry, Extensions } from "vs/workbench/common/actionRegistry"; +import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actionRegistry'; import { OpenRecentAction, ToggleDevToolsAction, ReloadWindowAction } from "vs/workbench/electron-browser/actions"; -import { KeyMod } from "vs/base/common/keyCodes"; -import { KeyCode } from "vs/editor/common/standalone/standaloneBase"; +import { KeyMod } from 'vs/base/common/keyCodes'; +import { KeyCode } from 'vs/editor/common/standalone/standaloneBase'; export const MessagesVisibleContext = new RawContextKey('globalMessageVisible', false); export const EditorsVisibleContext = new RawContextKey('editorIsOpen', false); diff --git a/src/vs/workbench/node/extensionPoints.ts b/src/vs/workbench/node/extensionPoints.ts index bcb6fc2206d..c1b76d345ec 100644 --- a/src/vs/workbench/node/extensionPoints.ts +++ b/src/vs/workbench/node/extensionPoints.ts @@ -18,7 +18,7 @@ import Types = require('vs/base/common/types'); import { isValidExtensionDescription } from 'vs/platform/extensions/node/extensionValidator'; import * as semver from 'semver'; import { getIdAndVersionFromLocalExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; -import { getParseErrorMessage } from "vs/base/common/jsonErrorMessages"; +import { getParseErrorMessage } from 'vs/base/common/jsonErrorMessages'; const MANIFEST_FILE = 'package.json'; diff --git a/src/vs/workbench/parts/debug/browser/debugActionItems.ts b/src/vs/workbench/parts/debug/browser/debugActionItems.ts index edb07e3d969..50d19edfefb 100644 --- a/src/vs/workbench/parts/debug/browser/debugActionItems.ts +++ b/src/vs/workbench/parts/debug/browser/debugActionItems.ts @@ -19,7 +19,7 @@ import { IDebugService } from 'vs/workbench/parts/debug/common/debug'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { attachSelectBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; -import { selectBorder } from "vs/platform/theme/common/colorRegistry"; +import { selectBorder } from 'vs/platform/theme/common/colorRegistry'; const $ = dom.$; diff --git a/src/vs/workbench/parts/debug/browser/exceptionWidget.ts b/src/vs/workbench/parts/debug/browser/exceptionWidget.ts index a54e0e1ff20..70004ffb526 100644 --- a/src/vs/workbench/parts/debug/browser/exceptionWidget.ts +++ b/src/vs/workbench/parts/debug/browser/exceptionWidget.ts @@ -11,9 +11,9 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IDebugService, IExceptionInfo } from 'vs/workbench/parts/debug/common/debug'; import { RunOnceScheduler } from 'vs/base/common/async'; -import { IThemeService, ITheme } from "vs/platform/theme/common/themeService"; -import { Color } from "vs/base/common/color"; -import { registerColor } from "vs/platform/theme/common/colorRegistry"; +import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; +import { Color } from 'vs/base/common/color'; +import { registerColor } from 'vs/platform/theme/common/colorRegistry'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { LinkDetector } from 'vs/workbench/parts/debug/browser/linkDetector'; const $ = dom.$; diff --git a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts index f0e0ed7a9bd..95e12911dcf 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts @@ -37,7 +37,7 @@ import { FloatingClickWidget } from 'vs/workbench/parts/preferences/browser/pref import { IListService } from 'vs/platform/list/browser/listService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Position } from 'vs/editor/common/core/position'; -import { CoreEditingCommands } from "vs/editor/common/controller/coreCommands"; +import { CoreEditingCommands } from 'vs/editor/common/controller/coreCommands'; const HOVER_DELAY = 300; const LAUNCH_JSON_REGEX = /launch\.json$/; diff --git a/src/vs/workbench/parts/debug/electron-browser/debugHover.ts b/src/vs/workbench/parts/debug/electron-browser/debugHover.ts index 4e5b9be2e79..ce54f235ae5 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugHover.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugHover.ts @@ -23,7 +23,7 @@ import { VariablesRenderer, renderExpressionValue, VariablesDataSource } from 'v import { IListService } from 'vs/platform/list/browser/listService'; import { attachListStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { editorHoverBackground, editorHoverBorder } from "vs/platform/theme/common/colorRegistry"; +import { editorHoverBackground, editorHoverBorder } from 'vs/platform/theme/common/colorRegistry'; const $ = dom.$; const MAX_ELEMENTS_SHOWN = 18; diff --git a/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.ts b/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.ts index fe69b0ad530..78ba083f9a0 100644 --- a/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.ts +++ b/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.ts @@ -11,7 +11,7 @@ import { IPartService, Parts } from 'vs/workbench/services/part/common/partServi import { IDebugService, State } from 'vs/workbench/parts/debug/common/debug'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { STATUS_BAR_NO_FOLDER_BACKGROUND, STATUS_BAR_NO_FOLDER_FOREGROUND, STATUS_BAR_BACKGROUND, Themable, STATUS_BAR_FOREGROUND } from 'vs/workbench/common/theme'; -import { addClass, removeClass } from "vs/base/browser/dom"; +import { addClass, removeClass } from 'vs/base/browser/dom'; // colors for theming diff --git a/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts index f1db99bf647..f046995c799 100644 --- a/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts @@ -11,7 +11,7 @@ import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browse import { editorAction } from 'vs/editor/common/editorCommonExtensions'; import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { CoreEditingCommands } from "vs/editor/common/controller/coreCommands"; +import { CoreEditingCommands } from 'vs/editor/common/controller/coreCommands'; import { KeyCode } from 'vs/base/common/keyCodes'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; diff --git a/src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts b/src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts index 38cb77ea2fd..26f7cf390e7 100644 --- a/src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts @@ -11,7 +11,7 @@ import { Range } from 'vs/editor/common/core/range'; import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { LanguageId, LanguageIdentifier } from 'vs/editor/common/modes'; import { Position } from 'vs/editor/common/core/position'; -import { CoreEditingCommands } from "vs/editor/common/controller/coreCommands"; +import { CoreEditingCommands } from 'vs/editor/common/controller/coreCommands'; import { SnippetParser, walk, Placeholder, Variable, Text, Marker } from 'vs/editor/contrib/snippet/browser/snippetParser'; import emmet = require('emmet'); diff --git a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts index f2cf8c9cacd..b922ba26c25 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts @@ -32,9 +32,9 @@ import { IExtensionService, IExtensionDescription } from 'vs/platform/extensions import URI from 'vs/base/common/uri'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { registerThemingParticipant, ITheme, ICssStyleCollector } from "vs/platform/theme/common/themeService"; -import { buttonBackground, buttonForeground, buttonHoverBackground, contrastBorder, registerColor, foreground } from "vs/platform/theme/common/colorRegistry"; -import { Color } from "vs/base/common/color"; +import { registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; +import { buttonBackground, buttonForeground, buttonHoverBackground, contrastBorder, registerColor, foreground } from 'vs/platform/theme/common/colorRegistry'; +import { Color } from 'vs/base/common/color'; export class InstallAction extends Action { diff --git a/src/vs/workbench/parts/feedback/electron-browser/feedback.ts b/src/vs/workbench/parts/feedback/electron-browser/feedback.ts index 310eb5f0d97..ec3746121ea 100644 --- a/src/vs/workbench/parts/feedback/electron-browser/feedback.ts +++ b/src/vs/workbench/parts/feedback/electron-browser/feedback.ts @@ -17,9 +17,9 @@ import * as dom from 'vs/base/browser/dom'; import { ICommandService } from 'vs/platform/commands/common/commands'; import * as errors from 'vs/base/common/errors'; import { IIntegrityService } from 'vs/platform/integrity/common/integrity'; -import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from "vs/platform/theme/common/themeService"; -import { attachStylerCallback } from "vs/platform/theme/common/styler"; -import { editorWidgetBackground, widgetShadow, inputBorder, inputForeground, inputBackground, inputActiveOptionBorder, editorBackground, buttonBackground, contrastBorder } from "vs/platform/theme/common/colorRegistry"; +import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; +import { attachStylerCallback } from 'vs/platform/theme/common/styler'; +import { editorWidgetBackground, widgetShadow, inputBorder, inputForeground, inputBackground, inputActiveOptionBorder, editorBackground, buttonBackground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; export interface IFeedback { feedback: string; diff --git a/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts b/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts index b4763f543e6..b124264626e 100644 --- a/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts +++ b/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts @@ -13,7 +13,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import product from 'vs/platform/node/product'; import { Themable, STATUS_BAR_FOREGROUND, STATUS_BAR_NO_FOLDER_FOREGROUND } from 'vs/workbench/common/theme'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { IWorkspaceContextService } from "vs/platform/workspace/common/workspace"; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; class TwitterFeedbackService implements IFeedbackService { diff --git a/src/vs/workbench/parts/files/browser/views/openEditorsView.ts b/src/vs/workbench/parts/files/browser/views/openEditorsView.ts index 4b3e4ee2778..3af3b297057 100644 --- a/src/vs/workbench/parts/files/browser/views/openEditorsView.ts +++ b/src/vs/workbench/parts/files/browser/views/openEditorsView.ts @@ -33,7 +33,7 @@ import { IListService } from 'vs/platform/list/browser/listService'; import { EditorGroup } from 'vs/workbench/common/editor/editorStacksModel'; import { attachListStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { badgeBackground, badgeForeground, contrastBorder } from "vs/platform/theme/common/colorRegistry"; +import { badgeBackground, badgeForeground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; const $ = dom.$; diff --git a/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts b/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts index b0f736e5e51..c78dfb63b68 100644 --- a/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts +++ b/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts @@ -18,9 +18,9 @@ import { IMarker } from 'vs/platform/markers/common/markers'; import { MarkersModel, Resource, Marker } from 'vs/workbench/parts/markers/common/markersModel'; import Messages from 'vs/workbench/parts/markers/common/messages'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { attachBadgeStyler } from "vs/platform/theme/common/styler"; -import { IThemeService } from "vs/platform/theme/common/themeService"; -import { IDisposable } from "vs/base/common/lifecycle"; +import { attachBadgeStyler } from 'vs/platform/theme/common/styler'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IDisposable } from 'vs/base/common/lifecycle'; interface IAnyResourceTemplateData { count: CountBadge; diff --git a/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts b/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts index 67c6fca57ae..65043dc7561 100644 --- a/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts +++ b/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts @@ -23,7 +23,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition } from 'vs/editor/browser/editorBrowser'; import { attachInputBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { editorWidgetBackground, widgetShadow } from "vs/platform/theme/common/colorRegistry"; +import { editorWidgetBackground, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; class KeybindingInputWidget extends Widget { diff --git a/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts index ca94ecd2c2b..16fedab3623 100644 --- a/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts @@ -39,7 +39,7 @@ import { IChoiceService, IMessageService, Severity } from 'vs/platform/message/c import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode, ResolvedKeybinding } from 'vs/base/common/keyCodes'; import { attachListStyler } from 'vs/platform/theme/common/styler'; -import { listHighlightForeground } from "vs/platform/theme/common/colorRegistry"; +import { listHighlightForeground } from 'vs/platform/theme/common/colorRegistry'; let $ = DOM.$; diff --git a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts index 0aae0f5f0ff..ca535cf3de0 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts @@ -53,8 +53,8 @@ import { FindController } from 'vs/editor/contrib/find/browser/find'; import { SelectionHighlighter } from 'vs/editor/contrib/find/common/findController'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { attachStylerCallback } from "vs/platform/theme/common/styler"; -import { scrollbarShadow } from "vs/platform/theme/common/colorRegistry"; +import { attachStylerCallback } from 'vs/platform/theme/common/styler'; +import { scrollbarShadow } from 'vs/platform/theme/common/colorRegistry'; export class PreferencesEditorInput extends SideBySideEditorInput { public static ID: string = 'workbench.editorinputs.preferencesEditorInput'; diff --git a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts index bd29a6a03df..81941633f5d 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts @@ -32,7 +32,7 @@ import { IWorkspaceConfigurationService } from 'vs/workbench/services/configurat import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export interface IPreferencesRenderer extends IDisposable { preferencesModel: IPreferencesEditorModel; diff --git a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts b/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts index 1f802861a31..52f1edebae3 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts @@ -27,7 +27,7 @@ import { attachInputBoxStyler, attachStylerCallback } from 'vs/platform/theme/co import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Position } from 'vs/editor/common/core/position'; import { ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; -import { buttonBackground, buttonForeground, badgeForeground, badgeBackground, contrastBorder, errorForeground } from "vs/platform/theme/common/colorRegistry"; +import { buttonBackground, buttonForeground, badgeForeground, badgeBackground, contrastBorder, errorForeground } from 'vs/platform/theme/common/colorRegistry'; export class SettingsGroupTitleWidget extends Widget implements IViewZone { diff --git a/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts b/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts index 5435cc3a698..260ab6e1a64 100644 --- a/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts +++ b/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts @@ -28,7 +28,7 @@ import { IMessageService, Severity, IMessageWithAction } from 'vs/platform/messa import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; -import { editorAction, EditorAction } from "vs/editor/common/editorCommonExtensions"; +import { editorAction, EditorAction } from 'vs/editor/common/editorCommonExtensions'; export const ALL_COMMANDS_PREFIX = '>'; export const EDITOR_COMMANDS_PREFIX = '$'; diff --git a/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts b/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts index eaca7cc45e5..8561d451305 100644 --- a/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts +++ b/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts @@ -22,11 +22,11 @@ import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerServ import URI from 'vs/base/common/uri'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { ISCMService } from 'vs/workbench/services/scm/common/scm'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; -import { registerThemingParticipant, ITheme, ICssStyleCollector } from "vs/platform/theme/common/themeService"; -import { registerColor } from "vs/platform/theme/common/colorRegistry"; -import { localize } from "vs/nls"; -import { Color } from "vs/base/common/color"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; +import { registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; +import { registerColor } from 'vs/platform/theme/common/colorRegistry'; +import { localize } from 'vs/nls'; +import { Color } from 'vs/base/common/color'; class DirtyDiffModelDecorator { diff --git a/src/vs/workbench/parts/search/browser/openFileHandler.ts b/src/vs/workbench/parts/search/browser/openFileHandler.ts index 28c61bbc3d4..1ff6554fa37 100644 --- a/src/vs/workbench/parts/search/browser/openFileHandler.ts +++ b/src/vs/workbench/parts/search/browser/openFileHandler.ts @@ -31,7 +31,7 @@ import { IQueryOptions, ISearchService, ISearchStats, ISearchQuery } from 'vs/pl import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IRange } from 'vs/editor/common/core/range'; -import { getOutOfWorkspaceEditorResources } from "vs/workbench/parts/search/common/search"; +import { getOutOfWorkspaceEditorResources } from 'vs/workbench/parts/search/common/search'; export class FileQuickOpenModel extends QuickOpenModel { diff --git a/src/vs/workbench/parts/search/browser/searchResultsView.ts b/src/vs/workbench/parts/search/browser/searchResultsView.ts index 48452fee61f..c9d95f8e9ab 100644 --- a/src/vs/workbench/parts/search/browser/searchResultsView.ts +++ b/src/vs/workbench/parts/search/browser/searchResultsView.ts @@ -19,8 +19,8 @@ import { Range } from 'vs/editor/common/core/range'; import { SearchViewlet } from 'vs/workbench/parts/search/browser/searchViewlet'; import { RemoveAction, ReplaceAllAction, ReplaceAction } from 'vs/workbench/parts/search/browser/searchActions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { attachBadgeStyler } from "vs/platform/theme/common/styler"; -import { IThemeService } from "vs/platform/theme/common/themeService"; +import { attachBadgeStyler } from 'vs/platform/theme/common/styler'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; export class SearchDataSource implements IDataSource { diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index ed2a0c9f953..04837eb7f6e 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -60,7 +60,7 @@ import FileResultsNavigation from 'vs/workbench/browser/fileResultsNavigation'; import { attachListStyler } from 'vs/platform/theme/common/styler'; import { IOutputService } from 'vs/workbench/parts/output/common/output'; import { Color } from 'vs/base/common/color'; -import { getOutOfWorkspaceEditorResources } from "vs/workbench/parts/search/common/search"; +import { getOutOfWorkspaceEditorResources } from 'vs/workbench/parts/search/common/search'; export class SearchViewlet extends Viewlet { diff --git a/src/vs/workbench/parts/search/common/search.ts b/src/vs/workbench/parts/search/common/search.ts index 19cd463c846..a6f98af6b22 100644 --- a/src/vs/workbench/parts/search/common/search.ts +++ b/src/vs/workbench/parts/search/common/search.ts @@ -12,10 +12,10 @@ import { CommonEditorRegistry } from 'vs/editor/common/editorCommonExtensions'; import { ISearchConfiguration } from 'vs/platform/search/common/search'; import glob = require('vs/base/common/glob'); import { SymbolInformation } from 'vs/editor/common/modes'; -import { IEditorGroupService } from "vs/workbench/services/group/common/groupService"; -import { IWorkspaceContextService } from "vs/platform/workspace/common/workspace"; -import URI from "vs/base/common/uri"; -import { toResource } from "vs/workbench/common/editor"; +import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import URI from 'vs/base/common/uri'; +import { toResource } from 'vs/workbench/common/editor'; export interface IWorkspaceSymbolProvider { provideWorkspaceSymbols(search: string): TPromise; diff --git a/src/vs/workbench/parts/search/common/searchModel.ts b/src/vs/workbench/parts/search/common/searchModel.ts index 87dae50f90e..114d6657c1a 100644 --- a/src/vs/workbench/parts/search/common/searchModel.ts +++ b/src/vs/workbench/parts/search/common/searchModel.ts @@ -24,7 +24,7 @@ import { IModelService } from 'vs/editor/common/services/modelService'; import { IReplaceService } from 'vs/workbench/parts/search/common/replace'; import { IProgressRunner } from 'vs/platform/progress/common/progress'; import { RangeHighlightDecorations } from 'vs/workbench/common/editor/rangeDecorations'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export class Match { diff --git a/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.ts b/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.ts index ae83175077b..dcdfe17498a 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.ts +++ b/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.ts @@ -16,7 +16,7 @@ import { IModeService } from 'vs/editor/common/services/modeService'; import { languagesExtPoint } from 'vs/editor/common/services/modeServiceImpl'; import { LanguageIdentifier } from 'vs/editor/common/modes'; import { SnippetParser, Marker, Placeholder, Variable, Text, walk } from 'vs/editor/contrib/snippet/browser/snippetParser'; -import { EditorSnippetVariableResolver } from "vs/editor/contrib/snippet/browser/snippetVariables"; +import { EditorSnippetVariableResolver } from 'vs/editor/contrib/snippet/browser/snippetVariables'; interface ISnippetsExtensionPoint { language: string; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts index c4e3fc01471..17e931a643b 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts @@ -27,7 +27,7 @@ import { ToggleTabFocusModeAction } from 'vs/editor/contrib/toggleTabFocusMode/c import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { OpenNextRecentlyUsedEditorInGroupAction, OpenPreviousRecentlyUsedEditorInGroupAction, FocusActiveGroupAction, FocusFirstGroupAction, FocusSecondGroupAction, FocusThirdGroupAction } from 'vs/workbench/browser/parts/editor/editorActions'; -import { EDITOR_FONT_DEFAULTS } from "vs/editor/common/config/editorOptions"; +import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; import { registerColors } from './terminalColorRegistry'; let configurationRegistry = Registry.as(Extensions.Configuration); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts index 236474f7366..fda8ca9b994 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts @@ -5,7 +5,7 @@ import * as nls from 'vs/nls'; import * as platform from 'vs/base/common/platform'; -import { EDITOR_FONT_DEFAULTS, IEditorOptions } from "vs/editor/common/config/editorOptions"; +import { EDITOR_FONT_DEFAULTS, IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; import { IChoiceService } from 'vs/platform/message/common/message'; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 8d7d30b7099..5247bd40e71 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -29,8 +29,8 @@ import { TabFocus } from 'vs/editor/common/config/commonEditorConfig'; import { TerminalConfigHelper } from 'vs/workbench/parts/terminal/electron-browser/terminalConfigHelper'; import { TerminalLinkHandler } from 'vs/workbench/parts/terminal/electron-browser/terminalLinkHandler'; import { TerminalWidgetManager } from 'vs/workbench/parts/terminal/browser/terminalWidgetManager'; -import { registerThemingParticipant, ITheme, ICssStyleCollector } from "vs/platform/theme/common/themeService"; -import { scrollbarSliderBackground, scrollbarSliderHoverBackground, scrollbarSliderActiveBackground } from "vs/platform/theme/common/colorRegistry"; +import { registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; +import { scrollbarSliderBackground, scrollbarSliderHoverBackground, scrollbarSliderActiveBackground } from 'vs/platform/theme/common/colorRegistry'; /** The amount of time to consider terminal errors to be related to the launch */ const LAUNCHING_DURATION = 500; diff --git a/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts b/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts index 285bc9025ad..2e0b9c5831d 100644 --- a/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts +++ b/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts @@ -10,7 +10,7 @@ import { IConfigurationService, getConfigurationValue } from 'vs/platform/config import { Platform } from 'vs/base/common/platform'; import { TPromise } from 'vs/base/common/winjs.base'; import { TerminalConfigHelper } from 'vs/workbench/parts/terminal/electron-browser/terminalConfigHelper'; -import { EDITOR_FONT_DEFAULTS } from "vs/editor/common/config/editorOptions"; +import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; class MockConfigurationService implements IConfigurationService { diff --git a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts b/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts index 466aa77c62d..7f9174f7ca6 100644 --- a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts +++ b/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts @@ -20,7 +20,7 @@ import { IModeService } from 'vs/editor/common/services/modeService'; import { tokenizeToString } from 'vs/editor/common/modes/textToHtmlTokenizer'; import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; import { WebviewEditor } from 'vs/workbench/browser/parts/editor/webviewEditor'; -import { IStorageService } from "vs/platform/storage/common/storage"; +import { IStorageService } from 'vs/platform/storage/common/storage'; function renderBody(body: string): string { return ` diff --git a/src/vs/workbench/services/editor/test/browser/editorService.test.ts b/src/vs/workbench/services/editor/test/browser/editorService.test.ts index e1f4057853f..4dd5a44fe16 100644 --- a/src/vs/workbench/services/editor/test/browser/editorService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorService.test.ts @@ -16,7 +16,7 @@ import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEdi import { workbenchInstantiationService, TestThemeService } from 'vs/workbench/test/workbenchTestServices'; import { DelegatingWorkbenchEditorService, WorkbenchEditorService, IEditorPart } from 'vs/workbench/services/editor/browser/editorService'; import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorInput'; -import { ResourceEditorInput } from "vs/workbench/common/editor/resourceEditorInput"; +import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; let activeEditor: BaseEditor = { getSelection: function () { diff --git a/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts b/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts index aa101644f89..f182c1494c8 100644 --- a/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts +++ b/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts @@ -20,7 +20,7 @@ import { Extensions, IColorRegistry, ColorIdentifier, editorBackground, editorFo import { ThemeType } from 'vs/platform/theme/common/themeService'; import { Registry } from 'vs/platform/platform'; import { WorkbenchThemeService, IColorCustomizations } from "vs/workbench/services/themes/electron-browser/workbenchThemeService"; -import { getParseErrorMessage } from "vs/base/common/jsonErrorMessages"; +import { getParseErrorMessage } from 'vs/base/common/jsonErrorMessages'; let colorRegistry = Registry.as(Extensions.ColorContribution); diff --git a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts index 72ad60ffe23..6e41871b060 100644 --- a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts @@ -39,7 +39,7 @@ import pfs = require('vs/base/node/pfs'); import colorThemeSchema = require('vs/workbench/services/themes/common/colorThemeSchema'); import fileIconThemeSchema = require('vs/workbench/services/themes/common/fileIconThemeSchema'); import { IDisposable } from 'vs/base/common/lifecycle'; -import { getParseErrorMessage } from "vs/base/common/jsonErrorMessages"; +import { getParseErrorMessage } from 'vs/base/common/jsonErrorMessages'; // implementation diff --git a/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts b/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts index cbdc5139462..4050b580de0 100644 --- a/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts @@ -16,7 +16,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { PLAINTEXT_MODE_ID } from 'vs/editor/common/modes/modesRegistry'; import { workbenchInstantiationService, TestThemeService } from 'vs/workbench/test/workbenchTestServices'; -import { ResourceEditorInput } from "vs/workbench/common/editor/resourceEditorInput"; +import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; const NullThemeService = new TestThemeService(); diff --git a/src/vs/workbench/test/common/editor/editorDiffModel.test.ts b/src/vs/workbench/test/common/editor/editorDiffModel.test.ts index 2f5901c6e88..2db61acaf4e 100644 --- a/src/vs/workbench/test/common/editor/editorDiffModel.test.ts +++ b/src/vs/workbench/test/common/editor/editorDiffModel.test.ts @@ -12,15 +12,15 @@ import { TextDiffEditorModel } from 'vs/workbench/common/editor/textDiffEditorMo import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; -import { ResourceEditorInput } from "vs/workbench/common/editor/resourceEditorInput"; -import URI from "vs/base/common/uri"; -import { ITextModelResolverService } from "vs/editor/common/services/resolverService"; -import { ITextFileService } from "vs/workbench/services/textfile/common/textfiles"; -import { IUntitledEditorService } from "vs/workbench/services/untitled/common/untitledEditorService"; -import { TestTextFileService, workbenchInstantiationService } from "vs/workbench/test/workbenchTestServices"; +import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; +import URI from 'vs/base/common/uri'; +import { ITextModelResolverService } from 'vs/editor/common/services/resolverService'; +import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; +import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; +import { TestTextFileService, workbenchInstantiationService } from 'vs/workbench/test/workbenchTestServices'; import { TPromise } from "vs/base/common/winjs.base"; -import { IModel } from "vs/editor/common/editorCommon"; -import { IInstantiationService } from "vs/platform/instantiation/common/instantiation"; +import { IModel } from 'vs/editor/common/editorCommon'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; class MyEditorModel extends EditorModel { } class MyTextEditorModel extends BaseTextEditorModel { } From 5ec01d95545c7ddf236424046477b36ec2511998 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 25 May 2017 10:44:49 +0200 Subject: [PATCH 0938/1164] a18y: avoid duplicate events when navigating trees (for #26730) --- src/vs/base/parts/tree/browser/treeView.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/vs/base/parts/tree/browser/treeView.ts b/src/vs/base/parts/tree/browser/treeView.ts index 117e60db01d..3e27c21e709 100644 --- a/src/vs/base/parts/tree/browser/treeView.ts +++ b/src/vs/base/parts/tree/browser/treeView.ts @@ -197,22 +197,18 @@ export class ViewItem implements IViewItem { // ARIA this.element.setAttribute('role', 'treeitem'); + const ariaLabel = this.context.accessibilityProvider.getAriaLabel(this.context.tree, this.model.getElement()); + if (ariaLabel) { + this.element.setAttribute('aria-label', ariaLabel); + } if (this.model.hasTrait('focused')) { const base64Id = strings.safeBtoa(this.model.id); - const ariaLabel = this.context.accessibilityProvider.getAriaLabel(this.context.tree, this.model.getElement()); this.element.setAttribute('aria-selected', 'true'); this.element.setAttribute('id', base64Id); - if (ariaLabel) { - this.element.setAttribute('aria-label', ariaLabel); - } else { - this.element.setAttribute('aria-labelledby', base64Id); // force screen reader to compute label from children (helps NVDA at least) - } } else { this.element.setAttribute('aria-selected', 'false'); this.element.removeAttribute('id'); - this.element.removeAttribute('aria-label'); - this.element.removeAttribute('aria-labelledby'); } if (this.model.hasChildren()) { this.element.setAttribute('aria-expanded', String(!!this.model.isExpanded())); From 847fde97f99cec8f17c4f7f1f19d1f6f05f2bea7 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 25 May 2017 12:06:05 +0200 Subject: [PATCH 0939/1164] clean up unused code --- src/vs/workbench/electron-browser/shell.ts | 23 +++------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index bec5d37606b..da3ce116627 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -62,7 +62,7 @@ import { IContextViewService } from 'vs/platform/contextview/browser/contextView import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { IMessageService, IChoiceService, Severity, CloseAction } from 'vs/platform/message/common/message'; +import { IMessageService, IChoiceService, Severity } from 'vs/platform/message/common/message'; import { ChoiceChannel } from 'vs/platform/message/common/messageIpc'; import { ISearchService } from 'vs/platform/search/common/search'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; @@ -87,7 +87,6 @@ import { URLChannelClient } from 'vs/platform/url/common/urlIpc'; import { IURLService } from 'vs/platform/url/common/url'; import { IBackupService } from 'vs/platform/backup/common/backup'; import { BackupChannelClient } from 'vs/platform/backup/common/backupIpc'; -import { ReportPerformanceIssueAction } from 'vs/workbench/electron-browser/actions'; import { ExtensionHostProcessWorker } from 'vs/workbench/electron-browser/extensionHost'; import { ITimerService } from 'vs/workbench/services/timer/common/timerService'; import { remote, ipcRenderer as ipc } from 'electron'; @@ -198,7 +197,7 @@ export class WorkbenchShell { onWorkbenchStarted: (info: IWorkbenchStartedInfo) => { // run workbench started logic - this.onWorkbenchStarted(instantiationService, info); + this.onWorkbenchStarted(info); // start cached data manager instantiationService.createInstance(NodeCachedDataManager); @@ -221,7 +220,7 @@ export class WorkbenchShell { return workbenchContainer; } - private onWorkbenchStarted(instantiationService: IInstantiationService, info: IWorkbenchStartedInfo): void { + private onWorkbenchStarted(info: IWorkbenchStartedInfo): void { // Telemetry: workspace info const { filesToOpen, filesToCreate, filesToDiff } = this.options; @@ -248,12 +247,6 @@ export class WorkbenchShell { this.timerService.restoreViewletDuration = info.restoreViewletDuration; this.extensionService.onReady().done(() => { this.telemetryService.publicLog('startupTime', this.timerService.startupMetrics); - - // Check for negative performance numbers (insiders only) - // TODO@Ben remove me - if (product.quality !== 'stable' && this.timerService.startupMetrics.ellapsed < 0) { - this.handleNegativePerformanceNumbers(instantiationService, this.timerService.startupMetrics.ellapsed); - } }); // Telemetry: workspace tags @@ -266,16 +259,6 @@ export class WorkbenchShell { } } - private handleNegativePerformanceNumbers(i: IInstantiationService, time: number): void { - this.messageService.show(Severity.Warning, { - message: `Something went wrong measuring startup performance numbers (ellapsed: ${time}ms). We would like to learn more about this issue.`, - actions: [ - i.createInstance(ReportPerformanceIssueAction, ReportPerformanceIssueAction.ID, ReportPerformanceIssueAction.LABEL), - CloseAction - ] - }); - } - private initServiceCollection(container: HTMLElement): [IInstantiationService, ServiceCollection] { const disposables = new Disposables(); From 4486772abae3463ec6f9ed95556b69e297f00bc1 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 25 May 2017 12:16:33 +0200 Subject: [PATCH 0940/1164] Uncaught TypeError: Cannot read property 'isActive' of undefined (fixes #27257) --- src/vs/workbench/browser/parts/editor/tabsTitleControl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index 39993429952..de3fda8a4d5 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -212,7 +212,7 @@ export class TabsTitleControl extends TitleControl { private updateDropFeedback(element: HTMLElement, isDND: boolean, index?: number): void { const isTab = (typeof index === 'number'); - const isActiveTab = isTab && this.context.isActive(this.context.getEditor(index)); + const isActiveTab = isTab && this.context && this.context.isActive(this.context.getEditor(index)); // Background const noDNDBackgroundColor = isTab ? this.getColor(isActiveTab ? TAB_ACTIVE_BACKGROUND : TAB_INACTIVE_BACKGROUND) : null; From 39e6e908588a83c996d4ae3bfb457e17f87971c3 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 25 May 2017 12:21:18 +0200 Subject: [PATCH 0941/1164] theming - fix color clash when dragging over selected or focused item --- src/vs/base/parts/tree/browser/treeView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/base/parts/tree/browser/treeView.ts b/src/vs/base/parts/tree/browser/treeView.ts index 3e27c21e709..fbbef901f54 100644 --- a/src/vs/base/parts/tree/browser/treeView.ts +++ b/src/vs/base/parts/tree/browser/treeView.ts @@ -602,7 +602,7 @@ export class TreeView extends HeightMap { if (styles.listDropBackground) { content.push(` .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-wrapper.drop-target, - .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row.drop-target { background-color: ${styles.listDropBackground} !important; } + .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row.drop-target { background-color: ${styles.listDropBackground} !important; color: inherit !important; } `); } From 817d11bd5005d8c5d40731229765b4a6c573b793 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 09:24:50 +0200 Subject: [PATCH 0942/1164] [docker] update grammar --- build/npm/update-grammar.js | 30 ++++++++++++------- extensions/docker/package.json | 2 +- .../docker/syntaxes/docker.tmLanguage.json | 7 +++-- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/build/npm/update-grammar.js b/build/npm/update-grammar.js index 4b0408b89b2..dbb12cdcb44 100644 --- a/build/npm/update-grammar.js +++ b/build/npm/update-grammar.js @@ -25,19 +25,28 @@ function getOptions(urlString) { } } -function download(url) { -return new Promise((c, e) => { - var content = ''; - var request = https.get(getOptions(url), function (response) { +function download(url, redirectCount) { + return new Promise((c, e) => { + var content = ''; + https.get(getOptions(url), function (response) { response.on('data', function (data) { content += data.toString(); }).on('end', function () { + let count = redirectCount || 0; + if (count < 5 && response.statusCode >= 300 && response.statusCode <= 303 || response.statusCode === 307) { + let location = response.headers['location']; + if (location) { + console.log("Redirected " + url + " to " + location); + download(location, count+1).then(c, e); + return; + } + } c(content); }); }).on('error', function (err) { e(err.message); }); -}); + }); } function getCommitSha(repoId, repoPath) { @@ -46,14 +55,15 @@ function getCommitSha(repoId, repoPath) { try { let lastCommit = JSON.parse(content)[0]; return Promise.resolve({ - commitSha : lastCommit.sha, - commitDate : lastCommit.commit.author.date + commitSha: lastCommit.sha, + commitDate: lastCommit.commit.author.date }); } catch (e) { + console.error("Failed extracting the SHA: " + content); return Promise.resolve(null); } }, function () { - console.err('Failed loading ' + commitInfo); + console.error('Failed loading ' + commitInfo); return Promise.resolve(null); }); } @@ -97,7 +107,7 @@ exports.update = function (repoId, repoPath, dest, modifyGrammar) { } if (path.basename(process.argv[1]) === 'update-grammar.js') { - for (var i = 3; i < process.argv.length; i+=2) { - exports.update(process.argv[2], process.argv[i], process.argv[i+1]); + for (var i = 3; i < process.argv.length; i += 2) { + exports.update(process.argv[2], process.argv[i], process.argv[i + 1]); } } diff --git a/extensions/docker/package.json b/extensions/docker/package.json index 0da40007bc6..e58f0826419 100644 --- a/extensions/docker/package.json +++ b/extensions/docker/package.json @@ -4,7 +4,7 @@ "publisher": "vscode", "engines": { "vscode": "*" }, "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js docker/docker contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage ./syntaxes/docker.tmLanguage.json" + "update-grammar": "node ../../build/npm/update-grammar.js moby/moby contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage ./syntaxes/docker.tmLanguage.json" }, "contributes": { "languages": [{ diff --git a/extensions/docker/syntaxes/docker.tmLanguage.json b/extensions/docker/syntaxes/docker.tmLanguage.json index caab35092b0..8be1c94055d 100644 --- a/extensions/docker/syntaxes/docker.tmLanguage.json +++ b/extensions/docker/syntaxes/docker.tmLanguage.json @@ -8,9 +8,12 @@ "captures": { "1": { "name": "keyword.other.special-method.dockerfile" + }, + "2": { + "name": "keyword.other.special-method.dockerfile" } }, - "match": "\\s*(?:(FROM|AS))\\s" + "match": "^\\s*\\b(FROM)\\b.*?\\b(AS)\\b" }, { "captures": { @@ -94,5 +97,5 @@ ], "scopeName": "source.dockerfile", "uuid": "a39d8795-59d2-49af-aa00-fe74ee29576e", - "version": "https://github.com/moby/moby/commit/4cb71f80823af345d063cf0ad657e73ce9caa75f" + "version": "https://github.com/moby/moby/commit/8523e9d108a0e98865673701a7bd0a7929c5260b" } \ No newline at end of file From dba4da9cba830bfd8a940829199c22970da40879 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 09:35:58 +0200 Subject: [PATCH 0943/1164] [scss] update grammar --- extensions/scss/syntaxes/scss.json | 29 +- .../test-cssvariables_scss.json | 12 +- .../scss/test/colorize-results/test_scss.json | 536 +++++++++--------- 3 files changed, 277 insertions(+), 300 deletions(-) diff --git a/extensions/scss/syntaxes/scss.json b/extensions/scss/syntaxes/scss.json index 1f09bd75e56..252cb843115 100644 --- a/extensions/scss/syntaxes/scss.json +++ b/extensions/scss/syntaxes/scss.json @@ -890,15 +890,6 @@ } ] }, - "constant_hex": { - "captures": { - "1": { - "name": "punctuation.definition.constant.scss" - } - }, - "match": "(#)([0-9a-fA-F]{3}|[0-9a-fA-F]{6})\\b", - "name": "constant.numeric.color.hex-value.scss" - }, "constant_important": { "match": "!important", "name": "keyword.other.important.scss" @@ -907,10 +898,6 @@ "match": "\\b(\\+|-|\\*|/)\\b", "name": "support.constant.mathematical-symbols.scss" }, - "constant_number": { - "match": "(\\b([0-9]+(\\.[0-9]+)?)|\\B\\.[0-9]+)(?=\\s*(ch|cm|deg|dpi|dpcm|dppx|em|ex|grad|in|mm|mozmm|ms|pc|pt|px|rad|rem|turn|s|vh|vmin|vmax|vw|\\b))", - "name": "constant.numeric.scss" - }, "constant_optional": { "match": "!optional", "name": "keyword.other.optional.scss" @@ -937,10 +924,6 @@ } ] }, - "constant_unit": { - "match": "(?<=[\\d])(ch|cm|deg|dpi|dpcm|dppx|em|ex|grad|in|mm|mozmm|ms|pc|pt|px|rad|rem|turn|s|vh|vmin|vmax|vw)\\b|%", - "name": "keyword.other.unit.scss" - }, "flow_control": { "patterns": [ { @@ -1242,9 +1225,6 @@ { "include": "#constant_sass_functions" }, - { - "include": "#constant_hex" - }, { "include": "#constant_important" }, @@ -1255,10 +1235,7 @@ "include": "#constant_optional" }, { - "include": "#constant_unit" - }, - { - "include": "#constant_number" + "include": "source.css#numeric-values" }, { "include": "source.css#property-keywords" @@ -1543,7 +1520,7 @@ }, { "match": "\\d+", - "name": "constant.numeric.scss" + "name": "constant.numeric.css" }, { "match": "(?<=\\d)n\\b|\\b(n|even|odd)\\b", @@ -1698,5 +1675,5 @@ "name": "variable.scss" } }, - "version": "https://github.com/atom/language-sass/commit/f477576a0ff819657495142f7e64e577a837fadb" + "version": "https://github.com/atom/language-sass/commit/8b8b7b52655ab5cf4dbe597443abe4b078bb6953" } \ No newline at end of file diff --git a/extensions/scss/test/colorize-results/test-cssvariables_scss.json b/extensions/scss/test/colorize-results/test-cssvariables_scss.json index ff30ea6b973..e51a05d345f 100644 --- a/extensions/scss/test/colorize-results/test-cssvariables_scss.json +++ b/extensions/scss/test/colorize-results/test-cssvariables_scss.json @@ -89,7 +89,7 @@ }, { "c": "6", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -100,7 +100,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -177,7 +177,7 @@ }, { "c": "4", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -397,7 +397,7 @@ }, { "c": "4", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -496,7 +496,7 @@ }, { "c": "5", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -507,7 +507,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", diff --git a/extensions/scss/test/colorize-results/test_scss.json b/extensions/scss/test/colorize-results/test_scss.json index 4f699f59ebf..ffcdbc7f034 100644 --- a/extensions/scss/test/colorize-results/test_scss.json +++ b/extensions/scss/test/colorize-results/test_scss.json @@ -287,7 +287,7 @@ }, { "c": "97", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -298,7 +298,7 @@ }, { "c": "%", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -430,7 +430,7 @@ }, { "c": "2", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -441,7 +441,7 @@ }, { "c": "em", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -705,7 +705,7 @@ }, { "c": "3", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -716,7 +716,7 @@ }, { "c": "em", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -1332,7 +1332,7 @@ }, { "c": "2", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1343,7 +1343,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -1365,7 +1365,7 @@ }, { "c": "3", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1376,7 +1376,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -1486,7 +1486,7 @@ }, { "c": "30", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1497,7 +1497,7 @@ }, { "c": "em", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -1849,7 +1849,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1937,7 +1937,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1948,7 +1948,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -2157,7 +2157,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -2278,7 +2278,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -2839,7 +2839,7 @@ }, { "c": "5", - "t": "source.css.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -2850,7 +2850,7 @@ }, { "c": "em", - "t": "source.css.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -3059,7 +3059,7 @@ }, { "c": "6", - "t": "source.css.scss meta.property-list.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -3070,7 +3070,7 @@ }, { "c": "em", - "t": "source.css.scss meta.property-list.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -3202,7 +3202,7 @@ }, { "c": "12", - "t": "source.css.scss meta.property-list.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -3213,7 +3213,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -3279,7 +3279,7 @@ }, { "c": "30", - "t": "source.css.scss meta.property-list.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -3290,7 +3290,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -3862,7 +3862,7 @@ }, { "c": "100", - "t": "source.css.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -3895,7 +3895,7 @@ }, { "c": "100", - "t": "source.css.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -3928,7 +3928,7 @@ }, { "c": "225", - "t": "source.css.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -3961,7 +3961,7 @@ }, { "c": "0.25", - "t": "source.css.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4137,7 +4137,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4148,7 +4148,7 @@ }, { "c": "em", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -4192,7 +4192,7 @@ }, { "c": "2", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4203,7 +4203,7 @@ }, { "c": "em", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -4258,7 +4258,7 @@ }, { "c": "3", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4324,24 +4324,24 @@ }, { "c": "#", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "010203", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -4379,24 +4379,24 @@ }, { "c": "#", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "040506", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -4577,7 +4577,7 @@ }, { "c": "3", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4588,7 +4588,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -4632,7 +4632,7 @@ }, { "c": "4", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4643,7 +4643,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -4764,7 +4764,7 @@ }, { "c": "5", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss string.quoted.double.scss variable.interpolation.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss string.quoted.double.scss variable.interpolation.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4808,7 +4808,7 @@ }, { "c": "10", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss string.quoted.double.scss variable.interpolation.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss string.quoted.double.scss variable.interpolation.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4929,7 +4929,7 @@ }, { "c": "0", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4962,7 +4962,7 @@ }, { "c": "100", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4973,7 +4973,7 @@ }, { "c": "%", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -5006,7 +5006,7 @@ }, { "c": "50", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -5017,7 +5017,7 @@ }, { "c": "%", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -5149,7 +5149,7 @@ }, { "c": "0", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -5215,7 +5215,7 @@ }, { "c": "100", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -5226,7 +5226,7 @@ }, { "c": "%", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -5292,7 +5292,7 @@ }, { "c": "50", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -5303,7 +5303,7 @@ }, { "c": "%", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -5413,7 +5413,7 @@ }, { "c": "40", - "t": "source.css.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -5424,7 +5424,7 @@ }, { "c": "px", - "t": "source.css.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -5479,7 +5479,7 @@ }, { "c": "10", - "t": "source.css.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -5490,7 +5490,7 @@ }, { "c": "px", - "t": "source.css.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -5798,7 +5798,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.at-rule.return.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.at-rule.return.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -5996,7 +5996,7 @@ }, { "c": "5", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -6722,7 +6722,7 @@ }, { "c": "300", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -6733,7 +6733,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -6975,7 +6975,7 @@ }, { "c": "500", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -6986,7 +6986,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -7162,7 +7162,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -7173,7 +7173,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -7195,24 +7195,24 @@ }, { "c": "#", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "f00", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -7272,24 +7272,24 @@ }, { "c": "#", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "fdd", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -7459,7 +7459,7 @@ }, { "c": "3", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -7470,7 +7470,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -7756,7 +7756,7 @@ }, { "c": "2", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -7767,7 +7767,7 @@ }, { "c": "em", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -8438,7 +8438,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -8449,7 +8449,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -8823,7 +8823,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -8834,7 +8834,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -9274,7 +9274,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -9318,7 +9318,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -9362,7 +9362,7 @@ }, { "c": "2", - "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -9439,7 +9439,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -9450,7 +9450,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -9560,7 +9560,7 @@ }, { "c": "5", - "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -9604,7 +9604,7 @@ }, { "c": "3", - "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -9681,7 +9681,7 @@ }, { "c": "2", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -9692,7 +9692,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -9857,7 +9857,7 @@ }, { "c": "3", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -9868,7 +9868,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -10495,7 +10495,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.for.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.for.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -10539,7 +10539,7 @@ }, { "c": "3", - "t": "source.css.scss meta.at-rule.for.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.for.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -10704,7 +10704,7 @@ }, { "c": "2", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -10715,7 +10715,7 @@ }, { "c": "em", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -11298,7 +11298,7 @@ }, { "c": "6", - "t": "source.css.scss meta.at-rule.each.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -11397,7 +11397,7 @@ }, { "c": "0", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -11562,7 +11562,7 @@ }, { "c": "2", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -11573,7 +11573,7 @@ }, { "c": "em", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -11749,7 +11749,7 @@ }, { "c": "2", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -12035,7 +12035,7 @@ }, { "c": "0", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.for.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.for.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -12387,7 +12387,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -12475,7 +12475,7 @@ }, { "c": "100", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -12486,7 +12486,7 @@ }, { "c": "%", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -12970,7 +12970,7 @@ }, { "c": "20", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -12981,7 +12981,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -13135,24 +13135,24 @@ }, { "c": "#", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "ff0000", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -13333,7 +13333,7 @@ }, { "c": "4", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -13344,7 +13344,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -13520,7 +13520,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.at-rule.mixin.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.at-rule.mixin.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -13531,7 +13531,7 @@ }, { "c": "in", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.at-rule.mixin.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.at-rule.mixin.scss constant.numeric.css keyword.other.unit.in.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -14455,7 +14455,7 @@ }, { "c": "0", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -14466,7 +14466,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -14488,7 +14488,7 @@ }, { "c": "4", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -14499,7 +14499,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -14521,7 +14521,7 @@ }, { "c": "5", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -14532,7 +14532,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -14554,24 +14554,24 @@ }, { "c": "#", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "666", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -14587,7 +14587,7 @@ }, { "c": "2", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -14598,7 +14598,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -14620,7 +14620,7 @@ }, { "c": "6", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -14631,7 +14631,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -14653,7 +14653,7 @@ }, { "c": "10", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -14664,7 +14664,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -14686,24 +14686,24 @@ }, { "c": "#", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "999", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -15148,24 +15148,24 @@ }, { "c": "#", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "ff0000", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -15181,24 +15181,24 @@ }, { "c": "#", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "00ff00", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -15214,24 +15214,24 @@ }, { "c": "#", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "0000ff", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -16479,7 +16479,7 @@ }, { "c": "4", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -16490,7 +16490,7 @@ }, { "c": "cm", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.cm.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -16556,7 +16556,7 @@ }, { "c": "3", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -16567,7 +16567,7 @@ }, { "c": "cm", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.cm.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -16798,7 +16798,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -16809,7 +16809,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -17084,7 +17084,7 @@ }, { "c": "0", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -17128,24 +17128,24 @@ }, { "c": "#", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "123", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -17205,7 +17205,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -17656,7 +17656,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -17667,7 +17667,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -17777,7 +17777,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -17788,7 +17788,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -18470,7 +18470,7 @@ }, { "c": "0", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -18569,7 +18569,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -18701,7 +18701,7 @@ }, { "c": "2", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -18811,7 +18811,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -19009,7 +19009,7 @@ }, { "c": "0", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -19141,7 +19141,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -19328,7 +19328,7 @@ }, { "c": "0", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -19460,7 +19460,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -19647,7 +19647,7 @@ }, { "c": "0", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -19757,7 +19757,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -19966,7 +19966,7 @@ }, { "c": "0", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -20098,7 +20098,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", From 175cece493096b00983e88f5c2a7e40220dffd33 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 10:36:09 +0200 Subject: [PATCH 0944/1164] [ini] add update script --- extensions/ini/package.json | 11 +- extensions/ini/syntaxes/ini.tmLanguage.json | 114 +++++++++++ extensions/ini/syntaxes/properties.plist | 181 ------------------ .../ini/test/colorize-results/test_ini.json | 54 +++--- 4 files changed, 148 insertions(+), 212 deletions(-) create mode 100644 extensions/ini/syntaxes/ini.tmLanguage.json delete mode 100644 extensions/ini/syntaxes/properties.plist diff --git a/extensions/ini/package.json b/extensions/ini/package.json index b6a9b6c37d0..bfb7bb52215 100644 --- a/extensions/ini/package.json +++ b/extensions/ini/package.json @@ -3,6 +3,9 @@ "version": "0.1.0", "publisher": "vscode", "engines": { "vscode": "*" }, + "scripts": { + "update-grammar": "node ../../build/npm/update-grammar.js textmate/ini.tmbundle Syntaxes/Ini.plist ./syntaxes/ini.tmLanguage.json" + }, "contributes": { "languages": [{ "id": "ini", @@ -19,12 +22,12 @@ }], "grammars": [{ "language": "ini", - "scopeName": "source.properties", - "path": "./syntaxes/properties.plist" + "scopeName": "source.ini", + "path": "./syntaxes/ini.tmLanguage.json" },{ "language": "properties", - "scopeName": "source.properties", - "path": "./syntaxes/properties.plist" + "scopeName": "source.ini", + "path": "./syntaxes/ini.tmLanguage.json" }] } } diff --git a/extensions/ini/syntaxes/ini.tmLanguage.json b/extensions/ini/syntaxes/ini.tmLanguage.json new file mode 100644 index 00000000000..e8f1a0ef9b3 --- /dev/null +++ b/extensions/ini/syntaxes/ini.tmLanguage.json @@ -0,0 +1,114 @@ +{ + "fileTypes": [ + "ini", + "conf" + ], + "keyEquivalent": "^~I", + "name": "Ini", + "patterns": [ + { + "begin": "(^[ \\t]+)?(?=#)", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.comment.leading.ini" + } + }, + "end": "(?!\\G)", + "patterns": [ + { + "begin": "#", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.ini" + } + }, + "end": "\\n", + "name": "comment.line.number-sign.ini" + } + ] + }, + { + "begin": "(^[ \\t]+)?(?=;)", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.comment.leading.ini" + } + }, + "end": "(?!\\G)", + "patterns": [ + { + "begin": ";", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.ini" + } + }, + "end": "\\n", + "name": "comment.line.semicolon.ini" + } + ] + }, + { + "captures": { + "1": { + "name": "keyword.other.definition.ini" + }, + "2": { + "name": "punctuation.separator.key-value.ini" + } + }, + "match": "\\b([a-zA-Z0-9_.-]+)\\b\\s*(=)" + }, + { + "captures": { + "1": { + "name": "punctuation.definition.entity.ini" + }, + "3": { + "name": "punctuation.definition.entity.ini" + } + }, + "match": "^(\\[)(.*?)(\\])", + "name": "entity.name.section.group-title.ini" + }, + { + "begin": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ini" + } + }, + "end": "'", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ini" + } + }, + "name": "string.quoted.single.ini", + "patterns": [ + { + "match": "\\\\.", + "name": "constant.character.escape.ini" + } + ] + }, + { + "begin": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ini" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ini" + } + }, + "name": "string.quoted.double.ini" + } + ], + "scopeName": "source.ini", + "uuid": "77DC23B6-8A90-11D9-BAA4-000A9584EC8C", + "version": "https://github.com/textmate/ini.tmbundle/commit/2af0cbb0704940f967152616f2f1ff0aae6287a6" +} \ No newline at end of file diff --git a/extensions/ini/syntaxes/properties.plist b/extensions/ini/syntaxes/properties.plist deleted file mode 100644 index 11436566bd5..00000000000 --- a/extensions/ini/syntaxes/properties.plist +++ /dev/null @@ -1,181 +0,0 @@ - - - - - fileTypes - - ini - conf - - keyEquivalent - ^~I - name - Ini - patterns - - - begin - (^[ \t]+)?(?=#) - beginCaptures - - 1 - - name - punctuation.whitespace.comment.leading.ini - - - end - (?!\G) - patterns - - - begin - # - beginCaptures - - 0 - - name - punctuation.definition.comment.ini - - - end - \n - name - comment.line.number-sign.ini - - - - - begin - (^[ \t]+)?(?=;) - beginCaptures - - 1 - - name - punctuation.whitespace.comment.leading.ini - - - end - (?!\G) - patterns - - - begin - ; - beginCaptures - - 0 - - name - punctuation.definition.comment.ini - - - end - \n - name - comment.line.semicolon.ini - - - - - captures - - 1 - - name - keyword.other.definition.ini - - 2 - - name - punctuation.separator.key-value.ini - - - match - \b([a-zA-Z0-9_.-]+)\b\s*(=) - - - captures - - 1 - - name - punctuation.definition.entity.ini - - 3 - - name - punctuation.definition.entity.ini - - - match - ^(\[)(.*?)(\]) - name - entity.name.section.group-title.ini - - - begin - ' - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ini - - - end - ' - endCaptures - - 0 - - name - punctuation.definition.string.end.ini - - - name - string.quoted.single.ini - patterns - - - match - \\. - name - constant.character.escape.ini - - - - - begin - " - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ini - - - end - " - endCaptures - - 0 - - name - punctuation.definition.string.end.ini - - - name - string.quoted.double.ini - - - scopeName - source.properties - uuid - 77DC23B6-8A90-11D9-BAA4-000A9584EC8C - - \ No newline at end of file diff --git a/extensions/ini/test/colorize-results/test_ini.json b/extensions/ini/test/colorize-results/test_ini.json index f30cdc53892..5b001c68246 100644 --- a/extensions/ini/test/colorize-results/test_ini.json +++ b/extensions/ini/test/colorize-results/test_ini.json @@ -1,7 +1,7 @@ [ { "c": ";", - "t": "source.properties comment.line.semicolon.ini punctuation.definition.comment.ini", + "t": "source.ini comment.line.semicolon.ini punctuation.definition.comment.ini", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -12,7 +12,7 @@ }, { "c": " last modified 1 April 2001 by John Doe", - "t": "source.properties comment.line.semicolon.ini", + "t": "source.ini comment.line.semicolon.ini", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -23,7 +23,7 @@ }, { "c": "[", - "t": "source.properties entity.name.section.group-title.ini punctuation.definition.entity.ini", + "t": "source.ini entity.name.section.group-title.ini punctuation.definition.entity.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -34,7 +34,7 @@ }, { "c": "owner", - "t": "source.properties entity.name.section.group-title.ini", + "t": "source.ini entity.name.section.group-title.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -45,7 +45,7 @@ }, { "c": "]", - "t": "source.properties entity.name.section.group-title.ini punctuation.definition.entity.ini", + "t": "source.ini entity.name.section.group-title.ini punctuation.definition.entity.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -56,7 +56,7 @@ }, { "c": "name", - "t": "source.properties keyword.other.definition.ini", + "t": "source.ini keyword.other.definition.ini", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", @@ -67,7 +67,7 @@ }, { "c": "=", - "t": "source.properties punctuation.separator.key-value.ini", + "t": "source.ini punctuation.separator.key-value.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -78,7 +78,7 @@ }, { "c": "John Doe", - "t": "source.properties", + "t": "source.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -89,7 +89,7 @@ }, { "c": "organization", - "t": "source.properties keyword.other.definition.ini", + "t": "source.ini keyword.other.definition.ini", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", @@ -100,7 +100,7 @@ }, { "c": "=", - "t": "source.properties punctuation.separator.key-value.ini", + "t": "source.ini punctuation.separator.key-value.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -111,7 +111,7 @@ }, { "c": "Acme Widgets Inc.", - "t": "source.properties", + "t": "source.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -122,7 +122,7 @@ }, { "c": "[", - "t": "source.properties entity.name.section.group-title.ini punctuation.definition.entity.ini", + "t": "source.ini entity.name.section.group-title.ini punctuation.definition.entity.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -133,7 +133,7 @@ }, { "c": "database", - "t": "source.properties entity.name.section.group-title.ini", + "t": "source.ini entity.name.section.group-title.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -144,7 +144,7 @@ }, { "c": "]", - "t": "source.properties entity.name.section.group-title.ini punctuation.definition.entity.ini", + "t": "source.ini entity.name.section.group-title.ini punctuation.definition.entity.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -155,7 +155,7 @@ }, { "c": ";", - "t": "source.properties comment.line.semicolon.ini punctuation.definition.comment.ini", + "t": "source.ini comment.line.semicolon.ini punctuation.definition.comment.ini", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -166,7 +166,7 @@ }, { "c": " use IP address in case network name resolution is not working", - "t": "source.properties comment.line.semicolon.ini", + "t": "source.ini comment.line.semicolon.ini", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -177,7 +177,7 @@ }, { "c": "server", - "t": "source.properties keyword.other.definition.ini", + "t": "source.ini keyword.other.definition.ini", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", @@ -188,7 +188,7 @@ }, { "c": "=", - "t": "source.properties punctuation.separator.key-value.ini", + "t": "source.ini punctuation.separator.key-value.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -199,7 +199,7 @@ }, { "c": "192.0.2.62", - "t": "source.properties", + "t": "source.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -210,7 +210,7 @@ }, { "c": "port", - "t": "source.properties keyword.other.definition.ini", + "t": "source.ini keyword.other.definition.ini", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", @@ -221,7 +221,7 @@ }, { "c": "=", - "t": "source.properties punctuation.separator.key-value.ini", + "t": "source.ini punctuation.separator.key-value.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -232,7 +232,7 @@ }, { "c": "143", - "t": "source.properties", + "t": "source.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -243,7 +243,7 @@ }, { "c": "file", - "t": "source.properties keyword.other.definition.ini", + "t": "source.ini keyword.other.definition.ini", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", @@ -254,7 +254,7 @@ }, { "c": "=", - "t": "source.properties punctuation.separator.key-value.ini", + "t": "source.ini punctuation.separator.key-value.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -265,7 +265,7 @@ }, { "c": "\"", - "t": "source.properties string.quoted.double.ini punctuation.definition.string.begin.ini", + "t": "source.ini string.quoted.double.ini punctuation.definition.string.begin.ini", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -276,7 +276,7 @@ }, { "c": "payroll.dat", - "t": "source.properties string.quoted.double.ini", + "t": "source.ini string.quoted.double.ini", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -287,7 +287,7 @@ }, { "c": "\"", - "t": "source.properties string.quoted.double.ini punctuation.definition.string.end.ini", + "t": "source.ini string.quoted.double.ini punctuation.definition.string.end.ini", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", From 3cdc7b7472bcdbb0feef079368afba1b238a7750 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 11:27:32 +0200 Subject: [PATCH 0945/1164] update all grammars script --- build/npm/update-all-grammars.js | 74 ++++++++++++++++++++++++++++++ extensions/typescript/package.json | 2 +- package.json | 3 +- 3 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 build/npm/update-all-grammars.js diff --git a/build/npm/update-all-grammars.js b/build/npm/update-all-grammars.js new file mode 100644 index 00000000000..252b0f4edcb --- /dev/null +++ b/build/npm/update-all-grammars.js @@ -0,0 +1,74 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const cp = require('child_process'); +const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm'; +const integrationTests = process.platform === 'win32' ? '.\test-integration.bat' : './test-integration.sh'; + +function updateGrammar(location) { + const result = cp.spawnSync(npm, ['run', 'update-grammar'], { + cwd: location, + stdio: 'inherit' + }); + + if (result.error || result.status !== 0) { + process.exit(1); + } +} + +const extensions = [ + // 'bat' Grammar no longer available + 'clojure', + 'coffeescript', + 'cpp', + 'csharp', + 'css', + 'diff', + 'docker', + 'fsharp', + 'gitsyntax', + 'go', + 'groovy', + 'handlebars', + 'hlsl', + 'html', + 'ini', + 'java', + // 'javascript', updated through JavaScript + // 'json', customized + 'less', + 'lua', + 'make', + 'markdown', + 'objective-c', + 'perl', + 'php', + // 'powershell', grammar not ready yet, @daviwil will ping when ready + 'pug', + 'python', + 'r', + 'razor', + 'ruby', + 'rust', + 'scss', + 'shaderlab', + 'shellscript', + // 'sql', customized, PRs pending + 'swift', + 'typescript', + 'vb', + 'xml', + 'yaml' +]; + +extensions.forEach(extension => updateGrammar(`extensions/${extension}`)); + +// run integration tests + +if (process.platform === 'win32') { + cp.spawn('.\scripts\test-integration.bat', [], { env: process.env, stdio: 'inherit' }); +} else { + cp.spawn('/bin/bash', ['./scripts/test-integration.sh'], { env: process.env, stdio: 'inherit' }); +} \ No newline at end of file diff --git a/extensions/typescript/package.json b/extensions/typescript/package.json index a24c0c10519..461cb773a4d 100644 --- a/extensions/typescript/package.json +++ b/extensions/typescript/package.json @@ -21,7 +21,7 @@ }, "scripts": { "vscode:prepublish": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:typescript ./tsconfig.json", - "update-grammars": "node ./build/update-grammars.js" + "update-grammar": "node ./build/update-grammars.js" }, "activationEvents": [ "onLanguage:javascript", diff --git a/package.json b/package.json index 236e9d787e5..c31f58f40c9 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "monaco-editor-test": "mocha --only-monaco-editor", "precommit": "node build/gulpfile.hygiene.js", "gulp": "gulp --max_old_space_size=4096", - "7z": "7z" + "7z": "7z", + "update-grammars": "node build/npm/update-all-grammars.js" }, "dependencies": { "applicationinsights": "0.17.1", From c96342e995e652d3b6bcc07237ca9c4953ce6a94 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 11:27:46 +0200 Subject: [PATCH 0946/1164] [clojure] update grammar --- .../clojure/syntaxes/clojure.tmLanguage.json | 25 +++++-------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/extensions/clojure/syntaxes/clojure.tmLanguage.json b/extensions/clojure/syntaxes/clojure.tmLanguage.json index 6e2d50b5ea5..881ce191e1c 100644 --- a/extensions/clojure/syntaxes/clojure.tmLanguage.json +++ b/extensions/clojure/syntaxes/clojure.tmLanguage.json @@ -64,14 +64,11 @@ }, { "include": "#symbol" - }, - { - "include": "#whitespace" } ], "repository": { "comment": { - "begin": ";", + "begin": "(? Date: Thu, 25 May 2017 11:27:59 +0200 Subject: [PATCH 0947/1164] [cpp] update grammar --- extensions/cpp/syntaxes/c++.json | 5 +- .../cpp/test/colorize-results/test_cc.json | 118 +++++++++++++++++- 2 files changed, 118 insertions(+), 5 deletions(-) diff --git a/extensions/cpp/syntaxes/c++.json b/extensions/cpp/syntaxes/c++.json index 0d20c95fb60..7ec3054f58b 100644 --- a/extensions/cpp/syntaxes/c++.json +++ b/extensions/cpp/syntaxes/c++.json @@ -425,6 +425,9 @@ { "match": "\\\\x\\h+", "name": "constant.character.escape.cpp" + }, + { + "include": "source.c#string_placeholder" } ] }, @@ -455,5 +458,5 @@ ] } }, - "version": "https://github.com/atom/language-c/commit/a74c2f967d73e802a67fa6e971a8e8dedf076597" + "version": "https://github.com/atom/language-c/commit/3a269f88b12e512fb9495dc006a1dabf325d3d7f" } \ No newline at end of file diff --git a/extensions/cpp/test/colorize-results/test_cc.json b/extensions/cpp/test/colorize-results/test_cc.json index 3f7be3caeb8..845a693b3ab 100644 --- a/extensions/cpp/test/colorize-results/test_cc.json +++ b/extensions/cpp/test/colorize-results/test_cc.json @@ -110,7 +110,29 @@ } }, { - "c": "num_candidate_ret=%d:", + "c": "num_candidate_ret=", + "t": "source.cpp meta.function.c string.quoted.double.cpp", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": "%d", + "t": "source.cpp meta.function.c string.quoted.double.cpp constant.other.placeholder.c", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": ":", "t": "source.cpp meta.function.c string.quoted.double.cpp", "r": { "dark_plus": "string: #CE9178", @@ -407,7 +429,18 @@ } }, { - "c": "%d,", + "c": "%d", + "t": "source.cpp meta.function.c string.quoted.double.cpp constant.other.placeholder.c", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": ",", "t": "source.cpp meta.function.c string.quoted.double.cpp", "r": { "dark_plus": "string: #CE9178", @@ -1375,7 +1408,7 @@ } }, { - "c": "STYLE=Keramik;TITLE=%s;THEME=%s", + "c": "STYLE=Keramik;TITLE=", "t": "source.cpp meta.block.c string.quoted.double.cpp", "r": { "dark_plus": "string: #CE9178", @@ -1385,6 +1418,39 @@ "hc_black": "string: #CE9178" } }, + { + "c": "%s", + "t": "source.cpp meta.block.c string.quoted.double.cpp constant.other.placeholder.c", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": ";THEME=", + "t": "source.cpp meta.block.c string.quoted.double.cpp", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": "%s", + "t": "source.cpp meta.block.c string.quoted.double.cpp constant.other.placeholder.c", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, { "c": "\"", "t": "source.cpp meta.block.c string.quoted.double.cpp punctuation.definition.string.end.cpp", @@ -1705,7 +1771,51 @@ } }, { - "c": "movw $0x38, %ax; ltr %ax", + "c": "movw $0x38, ", + "t": "source.cpp meta.block.c meta.function-call.c string.quoted.double.cpp", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": "%a", + "t": "source.cpp meta.block.c meta.function-call.c string.quoted.double.cpp constant.other.placeholder.c", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": "x; ltr ", + "t": "source.cpp meta.block.c meta.function-call.c string.quoted.double.cpp", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": "%a", + "t": "source.cpp meta.block.c meta.function-call.c string.quoted.double.cpp constant.other.placeholder.c", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": "x", "t": "source.cpp meta.block.c meta.function-call.c string.quoted.double.cpp", "r": { "dark_plus": "string: #CE9178", From 1913a5cebd98a42aa89c5b54ecd2072daea0bb59 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 11:28:13 +0200 Subject: [PATCH 0948/1164] [css] update grammar --- extensions/css/syntaxes/css.tmLanguage.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/css/syntaxes/css.tmLanguage.json b/extensions/css/syntaxes/css.tmLanguage.json index 072b9cd3051..700b6dd3140 100644 --- a/extensions/css/syntaxes/css.tmLanguage.json +++ b/extensions/css/syntaxes/css.tmLanguage.json @@ -1328,7 +1328,7 @@ "name": "keyword.other.unit.${2:/downcase}.css" } }, - "match": "(?xi) (? Date: Thu, 25 May 2017 11:28:39 +0200 Subject: [PATCH 0949/1164] [typescript] update grammar --- .../syntaxes/JavaScript.tmLanguage.json | 181 ++++++++++------- .../test/colorize-results/test_jsx.json | 10 +- .../syntaxes/TypeScript.tmLanguage.json | 183 +++++++++++------- .../syntaxes/TypeScriptReact.tmLanguage.json | 181 ++++++++++------- 4 files changed, 330 insertions(+), 225 deletions(-) diff --git a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json index ec077b65656..d7aabe6479b 100644 --- a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json @@ -74,7 +74,7 @@ "name": "storage.type.js" } }, - "end": "(?=$|;|}|(\\s+(of|in)\\s+))", + "end": "(?=$|^|;|}|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#destructuring-variable" @@ -103,7 +103,7 @@ "name": "meta.definition.variable.js entity.name.function.js" } }, - "end": "(?=$|[;,=}]|(\\s+(of|in)\\s+))", + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#var-single-variable-type-annotation" @@ -118,7 +118,7 @@ "name": "meta.definition.variable.js variable.other.constant.js" } }, - "end": "(?=$|[;,=}]|(\\s+(of|in)\\s+))", + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#var-single-variable-type-annotation" @@ -133,7 +133,7 @@ "name": "meta.definition.variable.js variable.other.readwrite.js" } }, - "end": "(?=$|[;,=}]|(\\s+(of|in)\\s+))", + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#var-single-variable-type-annotation" @@ -160,7 +160,7 @@ { "name": "meta.object-binding-pattern-variable.js", "begin": "(?])|(?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)", + "end": "(?=$|^|[,);\\}\\]]|//)|(?==[^>])|(?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)", "patterns": [ { "include": "#comment" @@ -2019,7 +2062,7 @@ "name": "punctuation.definition.typeparameters.begin.js" } }, - "end": "(?=$)|(>)", + "end": "(>)", "endCaptures": { "1": { "name": "punctuation.definition.typeparameters.end.js" @@ -2054,7 +2097,7 @@ "name": "keyword.operator.assignment.js" } }, - "end": "(?=$|[,);}\\]])", + "end": "(?=$|^|[,);}\\]])", "patterns": [ { "include": "#expression" @@ -2693,7 +2736,7 @@ "name": "keyword.control.as.js" } }, - "end": "(?=$|[;,:})\\]])", + "end": "(?=$|^|[;,:})\\]])", "patterns": [ { "include": "#type" @@ -2778,7 +2821,7 @@ }, { "name": "meta.arrow.js", - "begin": "(?x) (?:\n (? is on new line\n (\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n ) |\n (\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends \n ) |\n # arrow function possible to detect only with => on same line\n (\n (<([^<>=]|=[^<]|\\<([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(([^()]|\\([^()]*\\))*\\) # parameteres\n (\\s*:\\s*(.)*)? # return type\n \\s*=> # arrow operator\n )\n )\n)", + "begin": "(?x) (?:\n (? is on new line\n (\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n ) |\n (\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends \n ) |\n # arrow function possible to detect only with => on same line\n (\n (<([^<>=]|=[^<]|\\<([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(([^()]|\\([^()]*\\))*\\) # parameteres\n (\\s*:\\s*(.)*)? # return type\n \\s*=> # arrow operator\n )\n )\n)", "beginCaptures": { "1": { "name": "storage.modifier.async.js" @@ -3358,25 +3401,17 @@ } }, { - "begin": "(^[ \\t]+)?(?=//)", + "begin": "(^[ \\t]+)?(//)", "beginCaptures": { "1": { "name": "punctuation.whitespace.comment.leading.js" + }, + "2": { + "name": "comment.line.double-slash.js punctuation.definition.comment.js" } }, - "end": "(?=$)", - "patterns": [ - { - "name": "comment.line.double-slash.js", - "begin": "//", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.js" - } - }, - "end": "(?=$)" - } - ] + "end": "(?=^)", + "contentName": "comment.line.double-slash.tsx" } ] }, @@ -3388,7 +3423,7 @@ "name": "punctuation.definition.comment.js" } }, - "end": "(?=$)", + "end": "(?=^)", "patterns": [ { "name": "meta.tag.js", @@ -4188,5 +4223,5 @@ ] } }, - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/cb1af7953db224204607cbe22d3a45aa0f77a4c1" + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/8c967fe7553297bfad672b7417d78e357c8fe724" } \ No newline at end of file diff --git a/extensions/javascript/test/colorize-results/test_jsx.json b/extensions/javascript/test/colorize-results/test_jsx.json index 7a9eb1f5ca0..55e2c440d3b 100644 --- a/extensions/javascript/test/colorize-results/test_jsx.json +++ b/extensions/javascript/test/colorize-results/test_jsx.json @@ -529,7 +529,7 @@ }, { "c": " Prevent following the link.", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.js", + "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.tsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -628,7 +628,7 @@ }, { "c": " Invert the chosen default.", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.js", + "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.tsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -661,7 +661,7 @@ }, { "c": " This will trigger an intelligent re-render of the component.", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.js", + "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.tsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -1046,7 +1046,7 @@ }, { "c": " Default to the default message.", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.js", + "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.tsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -1222,7 +1222,7 @@ }, { "c": " If toggled, show the alternate message.", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.js", + "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.tsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", diff --git a/extensions/typescript/syntaxes/TypeScript.tmLanguage.json b/extensions/typescript/syntaxes/TypeScript.tmLanguage.json index b80d24f1c23..7c581f92aea 100644 --- a/extensions/typescript/syntaxes/TypeScript.tmLanguage.json +++ b/extensions/typescript/syntaxes/TypeScript.tmLanguage.json @@ -71,7 +71,7 @@ "name": "storage.type.ts" } }, - "end": "(?=$|;|}|(\\s+(of|in)\\s+))", + "end": "(?=$|^|;|}|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#destructuring-variable" @@ -100,7 +100,7 @@ "name": "meta.definition.variable.ts entity.name.function.ts" } }, - "end": "(?=$|[;,=}]|(\\s+(of|in)\\s+))", + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#var-single-variable-type-annotation" @@ -115,7 +115,7 @@ "name": "meta.definition.variable.ts variable.other.constant.ts" } }, - "end": "(?=$|[;,=}]|(\\s+(of|in)\\s+))", + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#var-single-variable-type-annotation" @@ -130,7 +130,7 @@ "name": "meta.definition.variable.ts variable.other.readwrite.ts" } }, - "end": "(?=$|[;,=}]|(\\s+(of|in)\\s+))", + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#var-single-variable-type-annotation" @@ -157,7 +157,7 @@ { "name": "meta.object-binding-pattern-variable.ts", "begin": "(?])|(?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)", + "end": "(?=$|^|[,);\\}\\]]|//)|(?==[^>])|(?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)", "patterns": [ { "include": "#comment" @@ -2013,7 +2056,7 @@ "name": "punctuation.definition.typeparameters.begin.ts" } }, - "end": "(?=$)|(>)", + "end": "(>)", "endCaptures": { "1": { "name": "punctuation.definition.typeparameters.end.ts" @@ -2048,7 +2091,7 @@ "name": "keyword.operator.assignment.ts" } }, - "end": "(?=$|[,);}\\]])", + "end": "(?=$|^|[,);}\\]])", "patterns": [ { "include": "#expression" @@ -2487,7 +2530,7 @@ "patterns": [ { "name": "cast.expr.ts", - "begin": "(?:(?<=return|throw|yield|await|default|[=(,:>*]))\\s*(<)(?!*?]))\\s*(<)(?! is on new line\n (\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n ) |\n (\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends \n ) |\n # arrow function possible to detect only with => on same line\n (\n (<([^<>=]|=[^<]|\\<([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(([^()]|\\([^()]*\\))*\\) # parameteres\n (\\s*:\\s*(.)*)? # return type\n \\s*=> # arrow operator\n )\n )\n)", + "begin": "(?x) (?:\n (? is on new line\n (\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n ) |\n (\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends \n ) |\n # arrow function possible to detect only with => on same line\n (\n (<([^<>=]|=[^<]|\\<([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(([^()]|\\([^()]*\\))*\\) # parameteres\n (\\s*:\\s*(.)*)? # return type\n \\s*=> # arrow operator\n )\n )\n)", "beginCaptures": { "1": { "name": "storage.modifier.async.ts" @@ -3389,25 +3432,17 @@ } }, { - "begin": "(^[ \\t]+)?(?=//)", + "begin": "(^[ \\t]+)?(//)", "beginCaptures": { "1": { "name": "punctuation.whitespace.comment.leading.ts" + }, + "2": { + "name": "comment.line.double-slash.ts punctuation.definition.comment.ts" } }, - "end": "(?=$)", - "patterns": [ - { - "name": "comment.line.double-slash.ts", - "begin": "//", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.ts" - } - }, - "end": "(?=$)" - } - ] + "end": "(?=^)", + "contentName": "comment.line.double-slash.ts" } ] }, @@ -3419,7 +3454,7 @@ "name": "punctuation.definition.comment.ts" } }, - "end": "(?=$)", + "end": "(?=^)", "patterns": [ { "name": "meta.tag.ts", @@ -3923,5 +3958,5 @@ ] } }, - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/9f6676aa2ddb75cb5a9dbe1f59024069e839d986" + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/8c967fe7553297bfad672b7417d78e357c8fe724" } \ No newline at end of file diff --git a/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json b/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json index c20889881a1..b2c49cbf7f4 100644 --- a/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json +++ b/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json @@ -71,7 +71,7 @@ "name": "storage.type.tsx" } }, - "end": "(?=$|;|}|(\\s+(of|in)\\s+))", + "end": "(?=$|^|;|}|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#destructuring-variable" @@ -100,7 +100,7 @@ "name": "meta.definition.variable.tsx entity.name.function.tsx" } }, - "end": "(?=$|[;,=}]|(\\s+(of|in)\\s+))", + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#var-single-variable-type-annotation" @@ -115,7 +115,7 @@ "name": "meta.definition.variable.tsx variable.other.constant.tsx" } }, - "end": "(?=$|[;,=}]|(\\s+(of|in)\\s+))", + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#var-single-variable-type-annotation" @@ -130,7 +130,7 @@ "name": "meta.definition.variable.tsx variable.other.readwrite.tsx" } }, - "end": "(?=$|[;,=}]|(\\s+(of|in)\\s+))", + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#var-single-variable-type-annotation" @@ -157,7 +157,7 @@ { "name": "meta.object-binding-pattern-variable.tsx", "begin": "(?])|(?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)", + "end": "(?=$|^|[,);\\}\\]]|//)|(?==[^>])|(?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)", "patterns": [ { "include": "#comment" @@ -2016,7 +2059,7 @@ "name": "punctuation.definition.typeparameters.begin.tsx" } }, - "end": "(?=$)|(>)", + "end": "(>)", "endCaptures": { "1": { "name": "punctuation.definition.typeparameters.end.tsx" @@ -2051,7 +2094,7 @@ "name": "keyword.operator.assignment.tsx" } }, - "end": "(?=$|[,);}\\]])", + "end": "(?=$|^|[,);}\\]])", "patterns": [ { "include": "#expression" @@ -2690,7 +2733,7 @@ "name": "keyword.control.as.tsx" } }, - "end": "(?=$|[;,:})\\]])", + "end": "(?=$|^|[;,:})\\]])", "patterns": [ { "include": "#type" @@ -2775,7 +2818,7 @@ }, { "name": "meta.arrow.tsx", - "begin": "(?x) (?:\n (? is on new line\n (\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n ) |\n (\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends \n ) |\n # arrow function possible to detect only with => on same line\n (\n (<([^<>=]|=[^<]|\\<([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(([^()]|\\([^()]*\\))*\\) # parameteres\n (\\s*:\\s*(.)*)? # return type\n \\s*=> # arrow operator\n )\n )\n)", + "begin": "(?x) (?:\n (? is on new line\n (\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n ) |\n (\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends \n ) |\n # arrow function possible to detect only with => on same line\n (\n (<([^<>=]|=[^<]|\\<([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(([^()]|\\([^()]*\\))*\\) # parameteres\n (\\s*:\\s*(.)*)? # return type\n \\s*=> # arrow operator\n )\n )\n)", "beginCaptures": { "1": { "name": "storage.modifier.async.tsx" @@ -3355,25 +3398,17 @@ } }, { - "begin": "(^[ \\t]+)?(?=//)", + "begin": "(^[ \\t]+)?(//)", "beginCaptures": { "1": { "name": "punctuation.whitespace.comment.leading.tsx" + }, + "2": { + "name": "comment.line.double-slash.tsx punctuation.definition.comment.tsx" } }, - "end": "(?=$)", - "patterns": [ - { - "name": "comment.line.double-slash.tsx", - "begin": "//", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.tsx" - } - }, - "end": "(?=$)" - } - ] + "end": "(?=^)", + "contentName": "comment.line.double-slash.tsx" } ] }, @@ -3385,7 +3420,7 @@ "name": "punctuation.definition.comment.tsx" } }, - "end": "(?=$)", + "end": "(?=^)", "patterns": [ { "name": "meta.tag.tsx", @@ -4185,5 +4220,5 @@ ] } }, - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/cb1af7953db224204607cbe22d3a45aa0f77a4c1" + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/8c967fe7553297bfad672b7417d78e357c8fe724" } \ No newline at end of file From 422ff199cadcb99a60790dc64ce0d64a44090197 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 11:28:58 +0200 Subject: [PATCH 0950/1164] [less] update grammar --- extensions/less/syntaxes/less.tmLanguage.json | 17 +- .../test/colorize-results/14119_less.json | 13 +- .../test-cssvariables_less.json | 28 +- .../less/test/colorize-results/test_less.json | 280 ++++++++++++++++-- 4 files changed, 293 insertions(+), 45 deletions(-) diff --git a/extensions/less/syntaxes/less.tmLanguage.json b/extensions/less/syntaxes/less.tmLanguage.json index 902eb4e8d01..cd25b2a89b5 100644 --- a/extensions/less/syntaxes/less.tmLanguage.json +++ b/extensions/less/syntaxes/less.tmLanguage.json @@ -146,12 +146,7 @@ "name": "comment.block.css" }, { - "match": "[+-]?\\d*\\.?\\d+", - "name": "constant.numeric.css" - }, - { - "match": "(?<=[\\d])(ch|cm|deg|dpi|dpcm|dppx|em|ex|grad|in|mm|ms|pc|pt|px|rad|rem|turn|s|vh|vmin|vw)\\b|%", - "name": "keyword.other.unit.css" + "include": "source.css#numeric-values" }, { "captures": { @@ -281,13 +276,13 @@ ] }, { + "match": "(@|\\-\\-)[\\w-]+(?=\\s*)", + "name": "variable.other.less", "captures": { "1": { "name": "punctuation.definition.variable.less" } - }, - "match": "(?:@|\\-\\-)[a-zA-Z0-9_-][\\w-]*(?=\\s*)", - "name": "variable.other.less" + } }, { "include": "#variable_interpolation" @@ -516,7 +511,7 @@ "include": "#strings" }, { - "match": "(\\b|\\.{0,2}/).*\\b", + "match": "(\\b|\\.{0,2}/)[^)]*\\b", "name": "string.url.css" } ] @@ -546,5 +541,5 @@ "name": "support.function.any-method.builtin.less" } }, - "version": "https://github.com/atom/language-less/commit/7d70b66aa9c853d59e27cce25b5bc25cb067e75a" + "version": "https://github.com/atom/language-less/commit/4661d870784f725599e438bf683553cc6cf0f4ed" } \ No newline at end of file diff --git a/extensions/less/test/colorize-results/14119_less.json b/extensions/less/test/colorize-results/14119_less.json index 6e89b6a4587..0c83af45331 100644 --- a/extensions/less/test/colorize-results/14119_less.json +++ b/extensions/less/test/colorize-results/14119_less.json @@ -33,7 +33,18 @@ } }, { - "c": "@hm", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "hm", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", diff --git a/extensions/less/test/colorize-results/test-cssvariables_less.json b/extensions/less/test/colorize-results/test-cssvariables_less.json index bca9cd3c3a9..1c9b8658a0a 100644 --- a/extensions/less/test/colorize-results/test-cssvariables_less.json +++ b/extensions/less/test/colorize-results/test-cssvariables_less.json @@ -55,7 +55,18 @@ } }, { - "c": "--spacing-unit", + "c": "--", + "t": "source.css.less meta.property-list.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "spacing-unit", "t": "source.css.less meta.property-list.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -100,7 +111,7 @@ }, { "c": "px", - "t": "source.css.less meta.property-list.css meta.property-value.css keyword.other.unit.css", + "t": "source.css.less meta.property-list.css meta.property-value.css constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -132,7 +143,18 @@ } }, { - "c": "--cell-padding", + "c": "--", + "t": "source.css.less meta.property-list.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "cell-padding", "t": "source.css.less meta.property-list.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", diff --git a/extensions/less/test/colorize-results/test_less.json b/extensions/less/test/colorize-results/test_less.json index 4cc47220238..d6b39257feb 100644 --- a/extensions/less/test/colorize-results/test_less.json +++ b/extensions/less/test/colorize-results/test_less.json @@ -308,7 +308,18 @@ } }, { - "c": "@base", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "base", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -385,7 +396,18 @@ } }, { - "c": "@style", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "style", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -418,7 +440,18 @@ } }, { - "c": "@c", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "c", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -506,7 +539,18 @@ } }, { - "c": "@c", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "c", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -594,7 +638,18 @@ } }, { - "c": "@style", + "c": "@", + "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "style", "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -616,7 +671,18 @@ } }, { - "c": "@c", + "c": "@", + "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "c", "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -671,7 +737,18 @@ } }, { - "c": "@style", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "style", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -704,7 +781,18 @@ } }, { - "c": "@alpha", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "alpha", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -749,7 +837,7 @@ }, { "c": "%", - "t": "source.css.less keyword.other.unit.css", + "t": "source.css.less constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -836,7 +924,18 @@ } }, { - "c": "@alpha", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "alpha", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -913,7 +1012,18 @@ } }, { - "c": "@style", + "c": "@", + "t": "source.css.less meta.property-list.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "style", "t": "source.css.less meta.property-list.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -1232,7 +1342,18 @@ } }, { - "c": "@base", + "c": "@", + "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "base", "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -1277,7 +1398,7 @@ }, { "c": "%", - "t": "source.css.less meta.property-list.css meta.property-value.css keyword.other.unit.css", + "t": "source.css.less meta.property-list.css meta.property-value.css constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -1375,7 +1496,18 @@ } }, { - "c": "@base", + "c": "@", + "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "base", "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -1420,7 +1552,7 @@ }, { "c": "%", - "t": "source.css.less meta.property-list.css meta.property-value.css keyword.other.unit.css", + "t": "source.css.less meta.property-list.css meta.property-value.css constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -1585,7 +1717,7 @@ }, { "c": "px", - "t": "source.css.less meta.property-list.css meta.property-list.css keyword.other.unit.css", + "t": "source.css.less meta.property-list.css meta.property-list.css constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -1640,7 +1772,7 @@ }, { "c": "%", - "t": "source.css.less meta.property-list.css meta.property-list.css keyword.other.unit.css", + "t": "source.css.less meta.property-list.css meta.property-list.css constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -1849,7 +1981,7 @@ }, { "c": "px", - "t": "source.css.less meta.property-list.css meta.property-list.css meta.property-value.css keyword.other.unit.css", + "t": "source.css.less meta.property-list.css meta.property-list.css meta.property-value.css constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -2058,7 +2190,7 @@ }, { "c": "px", - "t": "source.css.less meta.property-list.css meta.property-list.css meta.property-value.css keyword.other.unit.css", + "t": "source.css.less meta.property-list.css meta.property-list.css meta.property-value.css constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -2311,7 +2443,7 @@ }, { "c": "px", - "t": "source.css.less meta.property-list.css meta.property-list.css meta.property-list.css meta.property-list.css meta.property-value.css keyword.other.unit.css", + "t": "source.css.less meta.property-list.css meta.property-list.css meta.property-list.css meta.property-list.css meta.property-value.css constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -2398,7 +2530,18 @@ } }, { - "c": "@the-border", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "the-border", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -2443,7 +2586,7 @@ }, { "c": "px", - "t": "source.css.less keyword.other.unit.css", + "t": "source.css.less constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -2464,7 +2607,18 @@ } }, { - "c": "@base-color", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "base-color", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -2519,7 +2673,18 @@ } }, { - "c": "@red", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "red", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -2673,7 +2838,18 @@ } }, { - "c": "@base-color", + "c": "@", + "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "base-color", "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -2794,7 +2970,18 @@ } }, { - "c": "@the-border", + "c": "@", + "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "the-border", "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -2871,7 +3058,18 @@ } }, { - "c": "@the-border", + "c": "@", + "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "the-border", "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -3058,7 +3256,18 @@ } }, { - "c": "@base-color", + "c": "@", + "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "base-color", "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -3201,7 +3410,18 @@ } }, { - "c": "@red", + "c": "@", + "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "red", "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -3246,7 +3466,7 @@ }, { "c": "%", - "t": "source.css.less meta.property-list.css meta.property-value.css keyword.other.unit.css", + "t": "source.css.less meta.property-list.css meta.property-value.css constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", From 567bbbc6add42129df944ba91feac01a86860b54 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 11:29:12 +0200 Subject: [PATCH 0951/1164] [php] update grammar --- extensions/php/syntaxes/php.tmLanguage.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/php/syntaxes/php.tmLanguage.json b/extensions/php/syntaxes/php.tmLanguage.json index d7e3a548ade..8e69579120b 100644 --- a/extensions/php/syntaxes/php.tmLanguage.json +++ b/extensions/php/syntaxes/php.tmLanguage.json @@ -2071,7 +2071,7 @@ "patterns": [ { "comment": "PHPDocumentor only recognises lines with an asterisk as the first non-whitespaces character", - "match": "^(?!\\s*\\*).*$\\n?", + "match": "^(?!\\s*\\*).*?(?:(?=\\*\\/)|$\\n?)", "name": "invalid.illegal.missing-asterisk.phpdoc.php" }, { @@ -2975,5 +2975,5 @@ ] } }, - "version": "https://github.com/atom/language-php/commit/22047c19f52f686de471d0deccae0cb1332997b6" + "version": "https://github.com/atom/language-php/commit/c523a19f849b97f6499eae6accf80564aa190c0e" } \ No newline at end of file From 6f274872ac46a58606eff6a646a98bf91cff6b82 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 12:26:41 +0200 Subject: [PATCH 0952/1164] Add information_for_contributors to grammars --- build/npm/update-all-grammars.js | 1 - build/npm/update-grammar.js | 16 ++++++++++++++-- .../clojure/syntaxes/clojure.tmLanguage.json | 8 ++++++-- .../syntaxes/coffeescript.tmLanguage.json | 8 ++++++-- extensions/cpp/syntaxes/c++.json | 8 ++++++-- extensions/cpp/syntaxes/c.json | 8 ++++++-- .../csharp/syntaxes/csharp.tmLanguage.json | 8 ++++++-- extensions/css/syntaxes/css.tmLanguage.json | 8 ++++++-- extensions/diff/syntaxes/diff.tmLanguage.json | 8 ++++++-- .../docker/syntaxes/docker.tmLanguage.json | 8 ++++++-- extensions/fsharp/syntaxes/fsharp.json | 8 ++++++-- .../syntaxes/git-commit.tmLanguage.json | 8 ++++++-- .../syntaxes/git-rebase.tmLanguage.json | 8 ++++++-- extensions/go/syntaxes/go.json | 8 ++++++-- .../groovy/syntaxes/groovy.tmLanguage.json | 8 ++++++-- .../syntaxes/Handlebars.tmLanguage.json | 8 ++++++-- extensions/hlsl/syntaxes/hlsl.json | 8 ++++++-- extensions/html/syntaxes/html.json | 8 ++++++-- extensions/ini/syntaxes/ini.tmLanguage.json | 8 ++++++-- extensions/java/syntaxes/java.tmLanguage.json | 8 ++++++-- .../syntaxes/JavaScript.tmLanguage.json | 8 ++++++-- extensions/less/syntaxes/less.tmLanguage.json | 8 ++++++-- extensions/lua/syntaxes/lua.json | 8 ++++++-- extensions/make/syntaxes/Makefile.json | 8 ++++++-- .../syntaxes/objective-c++.tmLanguage.json | 5 +++++ .../syntaxes/objective-c.tmLanguage.json | 8 ++++++-- extensions/perl/syntaxes/perl.tmLanguage.json | 8 ++++++-- extensions/perl/syntaxes/perl6.tmLanguage.json | 8 ++++++-- extensions/php/syntaxes/php.tmLanguage.json | 8 ++++++-- extensions/pug/syntaxes/pug.tmLanguage.json | 8 ++++++-- .../python/syntaxes/MagicPython.tmLanguage.json | 8 ++++++-- .../python/syntaxes/MagicRegExp.tmLanguage.json | 8 ++++++-- extensions/r/syntaxes/r.tmLanguage.json | 8 ++++++-- extensions/razor/syntaxes/cshtml.json | 8 ++++++-- extensions/ruby/syntaxes/ruby.tmLanguage.json | 8 ++++++-- extensions/rust/syntaxes/rust.tmLanguage.json | 8 ++++++-- extensions/scss/syntaxes/scss.json | 8 ++++++-- extensions/shaderlab/syntaxes/shaderlab.json | 8 ++++++-- .../syntaxes/Shell-Unix-Bash.tmLanguage.json | 8 ++++++-- extensions/swift/syntaxes/swift.tmLanguage.json | 8 ++++++-- .../syntaxes/TypeScript.tmLanguage.json | 8 ++++++-- .../syntaxes/TypeScriptReact.tmLanguage.json | 8 ++++++-- .../vb/syntaxes/asp-vb-net.tmlanguage.json | 8 ++++++-- extensions/xml/syntaxes/xml.json | 8 ++++++-- extensions/xml/syntaxes/xsl.json | 8 ++++++-- extensions/yaml/syntaxes/yaml.json | 8 ++++++-- 46 files changed, 277 insertions(+), 89 deletions(-) diff --git a/build/npm/update-all-grammars.js b/build/npm/update-all-grammars.js index 252b0f4edcb..88b890af730 100644 --- a/build/npm/update-all-grammars.js +++ b/build/npm/update-all-grammars.js @@ -5,7 +5,6 @@ const cp = require('child_process'); const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm'; -const integrationTests = process.platform === 'win32' ? '.\test-integration.bat' : './test-integration.sh'; function updateGrammar(location) { const result = cp.spawnSync(npm, ['run', 'update-grammar'], { diff --git a/build/npm/update-grammar.js b/build/npm/update-grammar.js index dbb12cdcb44..fca60d83242 100644 --- a/build/npm/update-grammar.js +++ b/build/npm/update-grammar.js @@ -88,11 +88,23 @@ exports.update = function (repoId, repoPath, dest, modifyGrammar) { modifyGrammar(grammar); } return getCommitSha(repoId, repoPath).then(function (info) { + let result = { + information_for_contributors: [ + 'This file has been converted from https://github.com/' + repoId + '/blob/master/' + repoPath, + 'If you want to provide a fix or improvement, please create a pull request against the original repository.', + 'Once accepted there, we are happy to receive an update request.' + ] + }; + if (info) { - grammar.version = 'https://github.com/' + repoId + '/commit/' + info.commitSha; + result.version = 'https://github.com/' + repoId + '/commit/' + info.commitSha; } + for (let key in grammar) { + result[key] = grammar[key]; + } + try { - fs.writeFileSync(dest, JSON.stringify(grammar, null, '\t')); + fs.writeFileSync(dest, JSON.stringify(result, null, '\t')); if (info) { console.log('Updated ' + path.basename(dest) + ' to ' + repoId + '@' + info.commitSha.substr(0, 7) + ' (' + info.commitDate.substr(0, 10) + ')'); } else { diff --git a/extensions/clojure/syntaxes/clojure.tmLanguage.json b/extensions/clojure/syntaxes/clojure.tmLanguage.json index 881ce191e1c..437a0c5b5e1 100644 --- a/extensions/clojure/syntaxes/clojure.tmLanguage.json +++ b/extensions/clojure/syntaxes/clojure.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-clojure/blob/master/grammars/clojure.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.clojure", "fileTypes": [ "boot", @@ -440,6 +445,5 @@ } ] } - }, - "version": "https://github.com/atom/language-clojure/commit/70e83b27444da31d6367a0aa447a216836eafc05" + } } \ No newline at end of file diff --git a/extensions/coffeescript/syntaxes/coffeescript.tmLanguage.json b/extensions/coffeescript/syntaxes/coffeescript.tmLanguage.json index d7c22867d76..dae1d795f45 100644 --- a/extensions/coffeescript/syntaxes/coffeescript.tmLanguage.json +++ b/extensions/coffeescript/syntaxes/coffeescript.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-coffee-script/blob/master/grammars/coffeescript.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.coffee", "name": "CoffeeScript", "fileTypes": [ @@ -686,6 +691,5 @@ } ] } - }, - "version": "https://github.com/atom/language-coffee-script/commit/49c117b24096a369f92dfce180b61bd1f0425a29" + } } \ No newline at end of file diff --git a/extensions/cpp/syntaxes/c++.json b/extensions/cpp/syntaxes/c++.json index 7ec3054f58b..bc627e3a036 100644 --- a/extensions/cpp/syntaxes/c++.json +++ b/extensions/cpp/syntaxes/c++.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-c/blob/master/grammars/c%2B%2B.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.cpp", "fileTypes": [ "cc", @@ -457,6 +462,5 @@ } ] } - }, - "version": "https://github.com/atom/language-c/commit/3a269f88b12e512fb9495dc006a1dabf325d3d7f" + } } \ No newline at end of file diff --git a/extensions/cpp/syntaxes/c.json b/extensions/cpp/syntaxes/c.json index 6cc84cff24d..022f588cf28 100644 --- a/extensions/cpp/syntaxes/c.json +++ b/extensions/cpp/syntaxes/c.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-c/blob/master/grammars/c.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.c", "fileTypes": [ "c", @@ -1950,6 +1955,5 @@ } ] } - }, - "version": "https://github.com/atom/language-c/commit/1d137279178d06e7f7500800ebc36155e130172e" + } } \ No newline at end of file diff --git a/extensions/csharp/syntaxes/csharp.tmLanguage.json b/extensions/csharp/syntaxes/csharp.tmLanguage.json index eae75041576..3f81563c5bb 100644 --- a/extensions/csharp/syntaxes/csharp.tmLanguage.json +++ b/extensions/csharp/syntaxes/csharp.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/dotnet/csharp-tmLanguage/blob/master/grammars/csharp.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "name": "C#", "scopeName": "source.cs", "fileTypes": [ @@ -4186,6 +4191,5 @@ } } } - }, - "version": "https://github.com/dotnet/csharp-tmLanguage/commit/4d0e50c51f336645c98689737db1be321d212d3d" + } } \ No newline at end of file diff --git a/extensions/css/syntaxes/css.tmLanguage.json b/extensions/css/syntaxes/css.tmLanguage.json index 700b6dd3140..dae4475161a 100644 --- a/extensions/css/syntaxes/css.tmLanguage.json +++ b/extensions/css/syntaxes/css.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-css/blob/master/grammars/css.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.css", "name": "CSS", "fileTypes": [ @@ -1796,6 +1801,5 @@ } ] } - }, - "version": "https://github.com/atom/language-css/commit/23dcdee3372050eb3f07374fbe9188884bd545d1" + } } \ No newline at end of file diff --git a/extensions/diff/syntaxes/diff.tmLanguage.json b/extensions/diff/syntaxes/diff.tmLanguage.json index ac16f416a64..e259c46be42 100644 --- a/extensions/diff/syntaxes/diff.tmLanguage.json +++ b/extensions/diff/syntaxes/diff.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/diff.tmbundle/blob/master/Syntaxes/Diff.plist", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "patch", "diff", @@ -158,6 +163,5 @@ } ], "scopeName": "source.diff", - "uuid": "7E848FF4-708E-11D9-97B4-0011242E4184", - "version": "https://github.com/textmate/diff.tmbundle/commit/0593bb775eab1824af97ef2172fd38822abd97d7" + "uuid": "7E848FF4-708E-11D9-97B4-0011242E4184" } \ No newline at end of file diff --git a/extensions/docker/syntaxes/docker.tmLanguage.json b/extensions/docker/syntaxes/docker.tmLanguage.json index 8be1c94055d..d8c2d0fd766 100644 --- a/extensions/docker/syntaxes/docker.tmLanguage.json +++ b/extensions/docker/syntaxes/docker.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/moby/moby/blob/master/contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "Dockerfile" ], @@ -96,6 +101,5 @@ } ], "scopeName": "source.dockerfile", - "uuid": "a39d8795-59d2-49af-aa00-fe74ee29576e", - "version": "https://github.com/moby/moby/commit/8523e9d108a0e98865673701a7bd0a7929c5260b" + "uuid": "a39d8795-59d2-49af-aa00-fe74ee29576e" } \ No newline at end of file diff --git a/extensions/fsharp/syntaxes/fsharp.json b/extensions/fsharp/syntaxes/fsharp.json index 7ef61094dd1..f7abe7e8a52 100644 --- a/extensions/fsharp/syntaxes/fsharp.json +++ b/extensions/fsharp/syntaxes/fsharp.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/ionide/ionide-fsgrammar/blob/master/grammar/fsharp.json", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "name": "fsharp", "scopeName": "source.fsharp", "fileTypes": [ @@ -456,6 +461,5 @@ } ] } - }, - "version": "https://github.com/ionide/ionide-fsgrammar/commit/f2e3c30f0ebfcc89fb78ad908701159f20516812" + } } \ No newline at end of file diff --git a/extensions/gitsyntax/syntaxes/git-commit.tmLanguage.json b/extensions/gitsyntax/syntaxes/git-commit.tmLanguage.json index 5f5db8762fa..ffe1561f727 100644 --- a/extensions/gitsyntax/syntaxes/git-commit.tmLanguage.json +++ b/extensions/gitsyntax/syntaxes/git-commit.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/git.tmbundle/blob/master/Syntaxes/Git%20Commit%20Message.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "COMMIT_EDITMSG", "MERGE_MSG" @@ -138,6 +143,5 @@ } }, "scopeName": "text.git-commit", - "uuid": "BFE83C06-8508-44BE-A975-95A57BF619A7", - "version": "https://github.com/textmate/git.tmbundle/commit/93897a78c6e52bef13dadc0d4091d203c5facb40" + "uuid": "BFE83C06-8508-44BE-A975-95A57BF619A7" } \ No newline at end of file diff --git a/extensions/gitsyntax/syntaxes/git-rebase.tmLanguage.json b/extensions/gitsyntax/syntaxes/git-rebase.tmLanguage.json index c8bf731d9cb..15bac0d8d09 100644 --- a/extensions/gitsyntax/syntaxes/git-rebase.tmLanguage.json +++ b/extensions/gitsyntax/syntaxes/git-rebase.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/git.tmbundle/blob/master/Syntaxes/Git%20Rebase%20Message.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "git-rebase-todo" ], @@ -30,6 +35,5 @@ } ], "scopeName": "text.git-rebase", - "uuid": "7F1CC209-5F6D-486A-8180-09FA282381A1", - "version": "https://github.com/textmate/git.tmbundle/commit/d1db42c2d71948662098183a6df519fb53a7a15b" + "uuid": "7F1CC209-5F6D-486A-8180-09FA282381A1" } \ No newline at end of file diff --git a/extensions/go/syntaxes/go.json b/extensions/go/syntaxes/go.json index 53908a80bac..098c8710482 100644 --- a/extensions/go/syntaxes/go.json +++ b/extensions/go/syntaxes/go.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-go/blob/master/grammars/go.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.go", "name": "Go", "comment": "Go language", @@ -624,6 +629,5 @@ } ] } - }, - "version": "https://github.com/atom/language-go/commit/c1fe618ccf2dcd17118c5600c49b1c539f26d5c5" + } } \ No newline at end of file diff --git a/extensions/groovy/syntaxes/groovy.tmLanguage.json b/extensions/groovy/syntaxes/groovy.tmLanguage.json index 8850454840e..3dc8af7d0a1 100644 --- a/extensions/groovy/syntaxes/groovy.tmLanguage.json +++ b/extensions/groovy/syntaxes/groovy.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/groovy.tmbundle/blob/master/Syntaxes/Groovy.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "groovy", "gvy" @@ -1381,6 +1386,5 @@ } }, "scopeName": "source.groovy", - "uuid": "B3A64888-EBBB-4436-8D9E-F1169C5D7613", - "version": "https://github.com/textmate/groovy.tmbundle/commit/85d8f7c97ae473ccb9473f6c8d27e4ec957f4be1" + "uuid": "B3A64888-EBBB-4436-8D9E-F1169C5D7613" } \ No newline at end of file diff --git a/extensions/handlebars/syntaxes/Handlebars.tmLanguage.json b/extensions/handlebars/syntaxes/Handlebars.tmLanguage.json index 9e3579d90c2..e915b691d7f 100644 --- a/extensions/handlebars/syntaxes/Handlebars.tmLanguage.json +++ b/extensions/handlebars/syntaxes/Handlebars.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/daaain/Handlebars/blob/master/grammars/Handlebars.json", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "name": "Handlebars", "repository": { "html_tags": { @@ -849,6 +854,5 @@ "template", "tmpl" ], - "uuid": "70E91676-DE0A-4266-A2B9-3AD2E535E484", - "version": "https://github.com/daaain/Handlebars/commit/4e8244410815da73f93375532939d48bd5a9bb93" + "uuid": "70E91676-DE0A-4266-A2B9-3AD2E535E484" } \ No newline at end of file diff --git a/extensions/hlsl/syntaxes/hlsl.json b/extensions/hlsl/syntaxes/hlsl.json index 91dcf2b2520..20565922c53 100644 --- a/extensions/hlsl/syntaxes/hlsl.json +++ b/extensions/hlsl/syntaxes/hlsl.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/tgjones/shaders-tmLanguage/blob/master/grammars/hlsl.json", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.hlsl", "name": "HLSL", "fileTypes": [ @@ -213,6 +218,5 @@ } ] } - ], - "version": "https://github.com/tgjones/shaders-tmLanguage/commit/cd1ef40f549f9ce2b9e6b73498688de114a85382" + ] } \ No newline at end of file diff --git a/extensions/html/syntaxes/html.json b/extensions/html/syntaxes/html.json index cc2d9fd17ea..4192c824703 100644 --- a/extensions/html/syntaxes/html.json +++ b/extensions/html/syntaxes/html.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/html.tmbundle/blob/master/Syntaxes/HTML.plist", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "html", "htm", @@ -742,6 +747,5 @@ } }, "scopeName": "text.html.basic", - "uuid": "17994EC8-6B1D-11D9-AC3A-000D93589AF6", - "version": "https://github.com/textmate/html.tmbundle/commit/a723f08ebd49c67c22aca08dd8f17d0bf836ec93" + "uuid": "17994EC8-6B1D-11D9-AC3A-000D93589AF6" } \ No newline at end of file diff --git a/extensions/ini/syntaxes/ini.tmLanguage.json b/extensions/ini/syntaxes/ini.tmLanguage.json index e8f1a0ef9b3..34679c1bee0 100644 --- a/extensions/ini/syntaxes/ini.tmLanguage.json +++ b/extensions/ini/syntaxes/ini.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/ini.tmbundle/blob/master/Syntaxes/Ini.plist", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "ini", "conf" @@ -109,6 +114,5 @@ } ], "scopeName": "source.ini", - "uuid": "77DC23B6-8A90-11D9-BAA4-000A9584EC8C", - "version": "https://github.com/textmate/ini.tmbundle/commit/2af0cbb0704940f967152616f2f1ff0aae6287a6" + "uuid": "77DC23B6-8A90-11D9-BAA4-000A9584EC8C" } \ No newline at end of file diff --git a/extensions/java/syntaxes/java.tmLanguage.json b/extensions/java/syntaxes/java.tmLanguage.json index 5d0513d49b0..654bf8e2ba8 100644 --- a/extensions/java/syntaxes/java.tmLanguage.json +++ b/extensions/java/syntaxes/java.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-java/blob/master/grammars/java.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.java", "name": "Java", "fileTypes": [ @@ -1360,6 +1365,5 @@ } ] } - }, - "version": "https://github.com/atom/language-java/commit/0e0ec7966059e3e363868311b3d855014bca95dd" + } } \ No newline at end of file diff --git a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json index d7aabe6479b..8856e46770c 100644 --- a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/Microsoft/TypeScript-TmLanguage/blob/master/TypeScriptReact.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "name": "JavaScript (with React support)", "scopeName": "source.js", "fileTypes": [ @@ -4222,6 +4227,5 @@ } ] } - }, - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/8c967fe7553297bfad672b7417d78e357c8fe724" + } } \ No newline at end of file diff --git a/extensions/less/syntaxes/less.tmLanguage.json b/extensions/less/syntaxes/less.tmLanguage.json index cd25b2a89b5..cd1543fd7d3 100644 --- a/extensions/less/syntaxes/less.tmLanguage.json +++ b/extensions/less/syntaxes/less.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-less/blob/master/grammars/less.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "name": "Less", "scopeName": "source.css.less", "fileTypes": [ @@ -540,6 +545,5 @@ "match": "\\b(abs|acos|alpha|argb|asin|atan|average|blue|calc|ceil|color|contrast|convert|convert|cos|darken|data-uri|desaturate|difference|e|escape|exclusion|extract|fade|fadein|fadeout|floor|format|green|greyscale|hardlight|hsl|hsla|hsv|hsva|hsvhue|hsvsaturation|hsvvalue|hue|length|lighten|lightness|luma|max|min|mix|mod|multiply|negation|overlay|percentage|pi|pow|red|replace|round|saturate|saturation|screen|sin|softlight|spin|sqrt|tan|unit)\\b", "name": "support.function.any-method.builtin.less" } - }, - "version": "https://github.com/atom/language-less/commit/4661d870784f725599e438bf683553cc6cf0f4ed" + } } \ No newline at end of file diff --git a/extensions/lua/syntaxes/lua.json b/extensions/lua/syntaxes/lua.json index a4da3a43c6a..efea9819bde 100644 --- a/extensions/lua/syntaxes/lua.json +++ b/extensions/lua/syntaxes/lua.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/lua.tmbundle/blob/master/Syntaxes/Lua.plist", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "comment": "Lua Syntax: version 0.8", "fileTypes": [ "lua", @@ -275,6 +280,5 @@ } }, "scopeName": "source.lua", - "uuid": "93E017CC-6F27-11D9-90EB-000D93589AF7", - "version": "https://github.com/textmate/lua.tmbundle/commit/3a97f1b46804a3de99d4d2909e14450299462f2d" + "uuid": "93E017CC-6F27-11D9-90EB-000D93589AF7" } \ No newline at end of file diff --git a/extensions/make/syntaxes/Makefile.json b/extensions/make/syntaxes/Makefile.json index 2264321c9c8..1562efc5c17 100644 --- a/extensions/make/syntaxes/Makefile.json +++ b/extensions/make/syntaxes/Makefile.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/make.tmbundle/blob/master/Syntaxes/Makefile.plist", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "Makefile", "makefile", @@ -470,6 +475,5 @@ } }, "scopeName": "source.makefile", - "uuid": "FF1825E8-6B1C-11D9-B883-000D93589AF6", - "version": "https://github.com/textmate/make.tmbundle/commit/1a1827da81e20fdce56e2658451340c070ca44b7" + "uuid": "FF1825E8-6B1C-11D9-B883-000D93589AF6" } \ No newline at end of file diff --git a/extensions/objective-c/syntaxes/objective-c++.tmLanguage.json b/extensions/objective-c/syntaxes/objective-c++.tmLanguage.json index 26550c61e1b..2b46507a2fb 100644 --- a/extensions/objective-c/syntaxes/objective-c++.tmLanguage.json +++ b/extensions/objective-c/syntaxes/objective-c++.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-objective-c/blob/master/grammars/objective-c++.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.objcpp", "fileTypes": [ "mm", diff --git a/extensions/objective-c/syntaxes/objective-c.tmLanguage.json b/extensions/objective-c/syntaxes/objective-c.tmLanguage.json index 2037028b0c3..a07e0ba7f43 100644 --- a/extensions/objective-c/syntaxes/objective-c.tmLanguage.json +++ b/extensions/objective-c/syntaxes/objective-c.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-objective-c/blob/master/grammars/objective-c.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.objc", "fileTypes": [ "m", @@ -993,6 +998,5 @@ } ] } - }, - "version": "https://github.com/atom/language-objective-c/commit/0727e04544f3414c1c339cf15a39a05ea3938cb4" + } } \ No newline at end of file diff --git a/extensions/perl/syntaxes/perl.tmLanguage.json b/extensions/perl/syntaxes/perl.tmLanguage.json index 612c4796cbe..4c4209c317b 100644 --- a/extensions/perl/syntaxes/perl.tmLanguage.json +++ b/extensions/perl/syntaxes/perl.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/perl.tmbundle/blob/master/Syntaxes/Perl.plist", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "comment": "\n\tTODO:\tInclude RegExp syntax\n", "fileTypes": [ "pl", @@ -2541,6 +2546,5 @@ } }, "scopeName": "source.perl", - "uuid": "EDBFE125-6B1C-11D9-9189-000D93589AF6", - "version": "https://github.com/textmate/perl.tmbundle/commit/c0b7a4bd65882380522d82a60b536479a62b07c3" + "uuid": "EDBFE125-6B1C-11D9-9189-000D93589AF6" } \ No newline at end of file diff --git a/extensions/perl/syntaxes/perl6.tmLanguage.json b/extensions/perl/syntaxes/perl6.tmLanguage.json index a3024a11ae7..9ddfdf42509 100644 --- a/extensions/perl/syntaxes/perl6.tmLanguage.json +++ b/extensions/perl/syntaxes/perl6.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/perl.tmbundle/blob/master/Syntaxes/Perl%206.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "p6", "pl6", @@ -314,6 +319,5 @@ } }, "scopeName": "source.perl.6", - "uuid": "E685440C-0E20-4424-9693-864D5240A269", - "version": "https://github.com/textmate/perl.tmbundle/commit/d9841a0878239fa43f88c640f8d458590f97e8f5" + "uuid": "E685440C-0E20-4424-9693-864D5240A269" } \ No newline at end of file diff --git a/extensions/php/syntaxes/php.tmLanguage.json b/extensions/php/syntaxes/php.tmLanguage.json index 8e69579120b..b815d80e072 100644 --- a/extensions/php/syntaxes/php.tmLanguage.json +++ b/extensions/php/syntaxes/php.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-php/blob/master/grammars/php.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "text.html.php", "name": "PHP", "fileTypes": [ @@ -2974,6 +2979,5 @@ } ] } - }, - "version": "https://github.com/atom/language-php/commit/c523a19f849b97f6499eae6accf80564aa190c0e" + } } \ No newline at end of file diff --git a/extensions/pug/syntaxes/pug.tmLanguage.json b/extensions/pug/syntaxes/pug.tmLanguage.json index 808be9e6db8..8a3d17a81dc 100644 --- a/extensions/pug/syntaxes/pug.tmLanguage.json +++ b/extensions/pug/syntaxes/pug.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/davidrios/jade-tmbundle/blob/master/Syntaxes/Jade.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "jade" ], @@ -981,6 +986,5 @@ } }, "scopeName": "text.jade", - "uuid": "eee6ba25-6ac2-4f7e-9c70-cddf2bd3448b", - "version": "https://github.com/davidrios/jade-tmbundle/commit/f311a516bb29296fcebfdc7da8149b1c79dfb0a1" + "uuid": "eee6ba25-6ac2-4f7e-9c70-cddf2bd3448b" } \ No newline at end of file diff --git a/extensions/python/syntaxes/MagicPython.tmLanguage.json b/extensions/python/syntaxes/MagicPython.tmLanguage.json index f9d673e6273..29e51b920fa 100644 --- a/extensions/python/syntaxes/MagicPython.tmLanguage.json +++ b/extensions/python/syntaxes/MagicPython.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/MagicStack/MagicPython/blob/master/grammars/MagicPython.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "name": "MagicPython", "scopeName": "source.python", "fileTypes": [ @@ -5230,6 +5235,5 @@ } ] } - }, - "version": "https://github.com/MagicStack/MagicPython/commit/976e59dcb78cb577e79c8f2117216c06718337e0" + } } \ No newline at end of file diff --git a/extensions/python/syntaxes/MagicRegExp.tmLanguage.json b/extensions/python/syntaxes/MagicRegExp.tmLanguage.json index b5795a7b89f..34d1a973578 100644 --- a/extensions/python/syntaxes/MagicRegExp.tmLanguage.json +++ b/extensions/python/syntaxes/MagicRegExp.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/MagicStack/MagicPython/blob/master/grammars/MagicRegExp.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "name": "MagicRegExp", "scopeName": "source.regexp.python", "fileTypes": [ @@ -460,6 +465,5 @@ } ] } - }, - "version": "https://github.com/MagicStack/MagicPython/commit/df5bb18c64252f2e7b1aa87e2ed124666d314f1d" + } } \ No newline at end of file diff --git a/extensions/r/syntaxes/r.tmLanguage.json b/extensions/r/syntaxes/r.tmLanguage.json index 829be8d0d2b..025877c7ab4 100644 --- a/extensions/r/syntaxes/r.tmLanguage.json +++ b/extensions/r/syntaxes/r.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/r.tmbundle/blob/master/Syntaxes/R.plist", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "R", "r", @@ -199,6 +204,5 @@ } ], "scopeName": "source.r", - "uuid": "B2E6B78D-6E70-11D9-A369-000D93B3A10E", - "version": "https://github.com/textmate/r.tmbundle/commit/6b04ff3424f3f1cdfe64a9cfb71d8765959be250" + "uuid": "B2E6B78D-6E70-11D9-A369-000D93B3A10E" } \ No newline at end of file diff --git a/extensions/razor/syntaxes/cshtml.json b/extensions/razor/syntaxes/cshtml.json index 402915e8c9f..180ad0e68dd 100644 --- a/extensions/razor/syntaxes/cshtml.json +++ b/extensions/razor/syntaxes/cshtml.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/demyte/language-cshtml/blob/master/grammars/cshtml.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "name": "ASP.NET Razor", "scopeName": "text.html.cshtml", "fileTypes": [ @@ -148,6 +153,5 @@ "end": "\\*@", "name": "comment.block.cshtml" } - }, - "version": "https://github.com/demyte/language-cshtml/commit/a49735dc7aef56ae772a3bcfd8e42c89895dcff4" + } } \ No newline at end of file diff --git a/extensions/ruby/syntaxes/ruby.tmLanguage.json b/extensions/ruby/syntaxes/ruby.tmLanguage.json index dce58f758b1..a6e0c01b7b9 100644 --- a/extensions/ruby/syntaxes/ruby.tmLanguage.json +++ b/extensions/ruby/syntaxes/ruby.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/ruby.tmbundle/blob/master/Syntaxes/Ruby.plist", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "comment": "\n\tTODO: unresolved issues\n\n\ttext:\n\t\"p <", "name": "comment.block.xml" } - }, - "version": "https://github.com/atom/language-xml/commit/ac6bc8ef6a9c79ac3c7e31615bc18436b0c815ab" + } } \ No newline at end of file diff --git a/extensions/xml/syntaxes/xsl.json b/extensions/xml/syntaxes/xsl.json index 8b715b599f9..2193c1a9570 100644 --- a/extensions/xml/syntaxes/xsl.json +++ b/extensions/xml/syntaxes/xsl.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-xml/blob/master/grammars/xsl.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "text.xml.xsl", "name": "XSL", "fileTypes": [ @@ -88,6 +93,5 @@ }, "name": "string.quoted.single.xml" } - }, - "version": "https://github.com/atom/language-xml/commit/507de2ee7daca60cf02e9e21fbeb92bbae73e280" + } } \ No newline at end of file diff --git a/extensions/yaml/syntaxes/yaml.json b/extensions/yaml/syntaxes/yaml.json index 55939b86d8d..82cd7d840db 100644 --- a/extensions/yaml/syntaxes/yaml.json +++ b/extensions/yaml/syntaxes/yaml.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/yaml.tmbundle/blob/master/Syntaxes/YAML.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "yaml", "yml", @@ -624,6 +629,5 @@ } }, "scopeName": "source.yaml", - "uuid": "686AD6AE-33F3-4493-9512-9E9FC1D5417F", - "version": "https://github.com/textmate/yaml.tmbundle/commit/efc96efafe5e48480cf55a2ed124b388cbea4440" + "uuid": "686AD6AE-33F3-4493-9512-9E9FC1D5417F" } \ No newline at end of file From f33b73f8e064df35930bc5be8da658f8570587eb Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 13:03:01 +0200 Subject: [PATCH 0953/1164] Possible bugs around non-invoking usage of `isEmpty`. Fixes #27201 --- src/vs/editor/contrib/folding/browser/folding.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/folding/browser/folding.ts b/src/vs/editor/contrib/folding/browser/folding.ts index 9f644ccd761..74df9c51570 100644 --- a/src/vs/editor/contrib/folding/browser/folding.ts +++ b/src/vs/editor/contrib/folding/browser/folding.ts @@ -287,7 +287,7 @@ export class FoldingController implements IFoldingController { return; } let range = e.target.range; - if (!range || !range.isEmpty) { + if (!range) { return; } if (!e.event.leftButton) { @@ -303,7 +303,7 @@ export class FoldingController implements IFoldingController { break; case MouseTargetType.CONTENT_EMPTY: case MouseTargetType.CONTENT_TEXT: - if (range.isEmpty && range.startColumn === model.getLineMaxColumn(range.startLineNumber)) { + if (range.startColumn === model.getLineMaxColumn(range.startLineNumber)) { break; } return; @@ -322,7 +322,7 @@ export class FoldingController implements IFoldingController { let iconClicked = this.mouseDownInfo.iconClicked; let range = e.target.range; - if (!range || !range.isEmpty || range.startLineNumber !== lineNumber) { + if (!range || range.startLineNumber !== lineNumber) { return; } From 409a694c2def2a0d630b0ecf948bc14bbd42f590 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 25 May 2017 07:03:56 -0700 Subject: [PATCH 0954/1164] Fix failing ripgrep test --- .../services/search/test/node/ripgrepTextSearch.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts b/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts index 2f377d82d27..1ee3f9a6a83 100644 --- a/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts +++ b/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts @@ -70,7 +70,7 @@ suite('RipgrepParser', () => { assert.deepEqual(results[0], { numMatches: 2, - path: path.join(rootFolder, 'a.txt'), + path: path.resolve(rootFolder, 'a.txt'), lineMatches: [ { lineNumber: 0, From 953acb6d7881fdf8b71ffa64ad7a981c68f1931e Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 25 May 2017 17:15:23 +0200 Subject: [PATCH 0955/1164] Fixes Microsoft/monaco-editor#278 --- src/vs/editor/editor.main.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/editor.main.ts b/src/vs/editor/editor.main.ts index 667a3004499..012e073ff51 100644 --- a/src/vs/editor/editor.main.ts +++ b/src/vs/editor/editor.main.ts @@ -21,10 +21,17 @@ import { EDITOR_DEFAULTS, WrappingIndent } from 'vs/editor/common/config/editorO (EDITOR_DEFAULTS.contribInfo).folding = false; (EDITOR_DEFAULTS.viewInfo).glyphMargin = false; +let base = createMonacoBaseAPI(); +for (let prop in base) { + if (base.hasOwnProperty(prop)) { + exports[prop] = base[prop]; + } +} +exports.editor = createMonacoEditorAPI(); +exports.languages = createMonacoLanguagesAPI(); + var global: any = self; -global.monaco = createMonacoBaseAPI(); -global.monaco.editor = createMonacoEditorAPI(); -global.monaco.languages = createMonacoLanguagesAPI(); +global.monaco = exports; if (typeof global.require !== 'undefined' && typeof global.require.config === 'function') { global.require.config({ From fe1d9cb797d644c43935069bdf99bd9f72c6f8f6 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 25 May 2017 08:44:07 -0700 Subject: [PATCH 0956/1164] Move terminal.foreground defaults to JS Fixes #27230 --- .../parts/terminal/electron-browser/media/terminal.css | 3 --- .../terminal/electron-browser/terminalColorRegistry.ts | 6 +++++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css index f35dde259bf..5a7d34f9e18 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css +++ b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css @@ -9,12 +9,9 @@ display: flex; flex-direction: column; background-color: transparent!important; - color: #333; -webkit-user-select: initial; position: relative; } -.vs-dark .monaco-workbench .panel.integrated-terminal { color: #CCC; } -.hc-black .monaco-workbench .panel.integrated-terminal { color: #FFF; } .monaco-workbench .panel.integrated-terminal .terminal-outer-container { height: 100%; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts index 27f3f23c8ba..ae1d524a912 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts @@ -14,7 +14,11 @@ import { registerColor, ColorIdentifier } from 'vs/platform/theme/common/colorRe export const ansiColorIdentifiers: ColorIdentifier[] = []; export const TERMINAL_BACKGROUND_COLOR = registerColor('terminal.background', null, nls.localize('terminal.background', 'The background color of the terminal, this allows coloring the terminal differently to the panel.')); -export const TERMINAL_FOREGROUND_COLOR = registerColor('terminal.foreground', null, nls.localize('terminal.foreground', 'The foreground color of the terminal.')); +export const TERMINAL_FOREGROUND_COLOR = registerColor('terminal.foreground', { + light: '#333333', + dark: '#CCCCCC', + hc: 'FFFFFF' +}, nls.localize('terminal.foreground', 'The foreground color of the terminal.')); const ansiColorMap = { 'terminal.ansiBlack': { From 306de468b0016acde9d86baa6846dbf02e30dcb3 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 25 May 2017 08:44:54 -0700 Subject: [PATCH 0957/1164] Remove deprecated css property --- .../parts/terminal/electron-browser/media/terminal.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css index 5a7d34f9e18..f2cc6747e2c 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css +++ b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css @@ -9,7 +9,7 @@ display: flex; flex-direction: column; background-color: transparent!important; - -webkit-user-select: initial; + user-select: initial; position: relative; } From 4c9e59f6926532b69b7db374c8fcfa4cb05ae1ce Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 25 May 2017 09:09:41 -0700 Subject: [PATCH 0958/1164] More welcome page colors (#25798) --- .../electron-browser/vs_code_welcome_page.ts | 38 +++++----- .../page/electron-browser/welcomePage.css | 69 +------------------ .../page/electron-browser/welcomePage.ts | 26 ++++++- 3 files changed, 47 insertions(+), 86 deletions(-) diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts b/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts index cc27fe4978c..767ee36747a 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts +++ b/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts @@ -14,13 +14,13 @@ export default () => `
    -

    ${escape(localize('welcomePage.vscode', "Visual Studio Code"))}

    -

    ${escape(localize('welcomePage.editingEvolved', "Editing evolved"))}

    +

    ${escape(localize('welcomePage.vscode', "Visual Studio Code"))}

    +

    ${escape(localize('welcomePage.editingEvolved', "Editing evolved"))}

    -

    ${escape(localize('welcomePage.start', "Start"))}

    +

    ${escape(localize('welcomePage.start', "Start"))}

    -

    ${escape(localize('welcomePage.recent', "Recent"))}

    +

    ${escape(localize('welcomePage.recent', "Recent"))}

    -

    ${escape(localize('welcomePage.noRecentFolders', "No recent folders"))}

    +

    ${escape(localize('welcomePage.noRecentFolders', "No recent folders"))}

    -

    +

    -

    ${escape(localize('welcomePage.customize', "Customize"))}

    +

    ${escape(localize('welcomePage.customize', "Customize"))}

      -
    • -
    • -
    • +
    -

    ${escape(localize('welcomePage.learn', "Learn"))}

    +

    ${escape(localize('welcomePage.learn', "Learn"))}

      -
    • -
    • -
    • +
    • +
    • +
    diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css index 982a72d9d1b..a3c2fa3e686 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css +++ b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css @@ -16,9 +16,6 @@ max-width: 1200px; font-size: 10px; } -.vs .monaco-workbench > .part.editor > .content .welcomePage { - color: #6C6C6C; -} .monaco-workbench > .part.editor > .content .welcomePage .row { display: flex; @@ -41,66 +38,36 @@ } .monaco-workbench > .part.editor > .content .welcomePage a { - color: #2e70c0; text-decoration: none; } -.vs-dark .monaco-workbench > .part.editor > .content .welcomePage a { - color: #4080D0; -} - .monaco-workbench > .part.editor > .content .welcomePage a:focus { outline: 1px solid -webkit-focus-ring-color; outline-offset: -1px; } -.monaco-workbench > .part.editor > .content .welcomePage a:hover { - color: #6ea0dc; -} - -.hc-black .monaco-workbench > .part.editor > .content .welcomePage a { - color: #0b9eff; -} - -.hc-black .monaco-workbench > .part.editor > .content .welcomePage a:hover { - color: #f38518; -} - .monaco-workbench > .part.editor > .content .welcomePage h1 { padding: 0; margin: 0; border: none; font-weight: normal; - color: rgba(0,0,0,.8); font-size: 3.6em; white-space: nowrap; } -.vs-dark .monaco-workbench > .part.editor > .content .welcomePage h1 { - color: rgba(255,255,255,.76); -} - -.hc-black .monaco-workbench > .part.editor > .content .welcomePage h1 { - color: white; -} - .monaco-workbench > .part.editor > .content .welcomePage .title { margin-top: 1em; margin-bottom: 1em; flex: 1 100%; } + .monaco-workbench > .part.editor > .content .welcomePage .subtitle { margin-top: .8em; font-size: 2.6em; - color: rgba(0,0,0,.53); display: block; } -.vs-dark .monaco-workbench > .part.editor > .content .welcomePage .subtitle { - color: rgba(255,255,255,.46); -} .hc-black .monaco-workbench > .part.editor > .content .welcomePage .subtitle { - color: white; font-weight: 200; } @@ -150,22 +117,6 @@ } .monaco-workbench > .part.editor > .content .welcomePage .splash .recent .path { padding-left: 1em; - color: rgba(255,255,255,.46); -} - -.monaco-workbench > .part.editor > .content .welcomePage .splash .recent .none, -.monaco-workbench > .part.editor > .content .welcomePage .splash .recent .path { - color: rgba(0,0,0,.53); -} - -.vs-dark .monaco-workbench > .part.editor > .content .welcomePage .splash .recent .none, -.vs-dark .monaco-workbench > .part.editor > .content .welcomePage .splash .recent .path { - color: rgba(255,255,255,.46); -} - -.hc-black .monaco-workbench > .part.editor > .content .welcomePage .splash .recent .none, -.hc-black .monaco-workbench > .part.editor > .content .welcomePage .splash .recent .path { - color: white; } .monaco-workbench > .part.editor > .content .welcomePage .splash .title, @@ -207,41 +158,27 @@ margin-bottom: .25em; } -.vs .monaco-workbench > .part.editor > .content .welcomePage .commands li button h3 { - color: #2c2c2c; -} - .monaco-workbench > .part.editor > .content .welcomePage .commands li button { - color: #6c6c6c; border: none; } -.vs-dark .monaco-workbench > .part.editor > .content .welcomePage .commands li button > h3 { - color: #ccc; -} - .hc-black .monaco-workbench > .part.editor > .content .welcomePage .commands li button > h3 { font-weight: bold; } -.vs-dark .monaco-workbench > .part.editor > .content .welcomePage .commands li button { - color: #828282; -} - .monaco-workbench > .part.editor > .content .welcomePage .commands li button:focus { outline-style: solid; outline-width: 1px; } .hc-black .monaco-workbench > .part.editor > .content .welcomePage .commands li button { - color: white; - border-color: #f38518; border-width: 1px; border-style: solid; } .hc-black .monaco-workbench > .part.editor > .content .welcomePage .commands li button:hover { - outline: 1px dashed #f38518; + outline-width: 1px; + outline-style: dashed; outline-offset: -5px; } diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts index 874bc17d8dd..86dde1dd27d 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts +++ b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts @@ -35,7 +35,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { tildify } from 'vs/base/common/labels'; import { isLinux } from 'vs/base/common/platform'; import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { registerColor } from 'vs/platform/theme/common/colorRegistry'; +import { registerColor, textLinkForeground, foreground, contrastBorder, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { getExtraColor } from 'vs/workbench/parts/welcome/walkThrough/node/walkThroughUtils'; used(); @@ -240,6 +240,7 @@ class WelcomePage { const span = document.createElement('span'); span.classList.add('path'); + span.classList.add('detail'); span.innerText = tildify(parentFolder, this.environmentService.userHome); span.title = folder; li.appendChild(span); @@ -446,10 +447,21 @@ class WelcomePage { // theming +const caption = registerColor('welcomePage.caption', { dark: '#FFFFFFC2', light: '#000000D4', hc: foreground }, localize('welcomePage.caption', 'Caption color on the Welcome page.')); +const detail = registerColor('welcomePage.detail', { dark: '#FFFFFF76', light: '#00000088', hc: foreground }, localize('welcomePage.detail', 'Detail color on the Welcome page.')); + const quickLinkBackground = registerColor('welcomePage.quickLinkBackground', { dark: null, light: null, hc: null }, localize('welcomePage.quickLinkBackground', 'Background color for the quick links on the Welcome page.')); const quickLinkHoverBackground = registerColor('welcomePage.quickLinkHoverBackground', { dark: null, light: null, hc: null }, localize('welcomePage.quickLinkHoverBackground', 'Hover background color for the quick links on the Welcome page.')); registerThemingParticipant((theme, collector) => { + const captionColor = theme.getColor(caption); + if (captionColor) { + collector.addRule(`.monaco-workbench > .part.editor > .content .welcomePage .caption { color: ${captionColor}; }`); + } + const detailColor = theme.getColor(detail); + if (detailColor) { + collector.addRule(`.monaco-workbench > .part.editor > .content .welcomePage .detail { color: ${detailColor}; }`); + } const color = getExtraColor(theme, quickLinkBackground, { dark: 'rgba(0, 0, 0, .2)', extra_dark: 'rgba(200, 235, 255, .042)', light: 'rgba(0,0,0,.04)', hc: 'black' }); if (color) { collector.addRule(`.monaco-workbench > .part.editor > .content .welcomePage .commands li button { background: ${color}; }`); @@ -458,4 +470,16 @@ registerThemingParticipant((theme, collector) => { if (hover) { collector.addRule(`.monaco-workbench > .part.editor > .content .welcomePage .commands li button:hover { background: ${hover}; }`); } + const link = theme.getColor(textLinkForeground); + if (link) { + collector.addRule(`.monaco-workbench > .part.editor > .content .welcomePage a { color: ${link}; }`); + } + const border = theme.getColor(contrastBorder); + if (border) { + collector.addRule(`.monaco-workbench > .part.editor > .content .welcomePage .commands li button { border-color: ${border}; }`); + } + const activeBorder = theme.getColor(activeContrastBorder); + if (activeBorder) { + collector.addRule(`.monaco-workbench > .part.editor > .content .welcomePage .commands li button:hover { outline-color: ${activeBorder}; }`); + } }); From 485629d4163c898324c6ef7434c86097a9d4bfb1 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 25 May 2017 09:49:50 -0700 Subject: [PATCH 0959/1164] Playground colors (#25798) --- .../electron-browser/walkThroughPart.css | 30 ++----------------- .../electron-browser/walkThroughPart.ts | 23 +++++++++++++- 2 files changed, 24 insertions(+), 29 deletions(-) diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css index baaf1f3ceed..305fece6c6b 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css @@ -17,7 +17,6 @@ } .monaco-workbench > .part.editor > .content .walkThroughContent a { - color: #4080D0; text-decoration: none; } @@ -69,7 +68,6 @@ } .monaco-workbench > .part.editor > .content .walkThroughContent a:hover { - color: #4080D0; text-decoration: underline; } @@ -106,36 +104,11 @@ line-height: 19px; } -/*.monaco-workbench.mac > .part.editor > .content .walkThroughContent code, -.monaco-workbench.mac > .part.editor > .content .walkThroughContent .shortcut { - font-size: 12px; - line-height: 18px; -}*/ - -.vs .monaco-workbench > .part.editor > .content .walkThroughContent code, -.vs .monaco-workbench > .part.editor > .content .walkThroughContent .shortcut { - color: #A31515; -} - -.vs-dark .monaco-workbench > .part.editor > .content .walkThroughContent code, -.vs-dark .monaco-workbench > .part.editor > .content .walkThroughContent .shortcut { - color: #D7BA7D; -} - .monaco-workbench > .part.editor > .content .walkThroughContent blockquote { margin: 0 7px 0 5px; padding: 0 16px 0 10px; border-left: 5px solid; } -.vs .monaco-workbench > .part.editor > .content .walkThroughContent blockquote, -.vs-dark .monaco-workbench > .part.editor > .content .walkThroughContent blockquote { - background: rgba(127, 127, 127, 0.1); - border-color: rgba(0, 122, 204, 0.5); -} -.hc-black .monaco-workbench > .part.editor > .content .walkThroughContent blockquote { - background: transparent; - border-color: #fff; -} .monaco-workbench > .part.editor > .content .walkThroughContent .monaco-tokenized-source { white-space: pre; @@ -162,5 +135,6 @@ } .hc-black .monaco-workbench > .part.editor > .content .walkThroughContent .monaco-editor { - border: 1px white solid + border-width: 1px; + border-style: solid; } diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts index 2fcbace413f..f22fa7e0702 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts @@ -38,7 +38,7 @@ import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { registerColor } from 'vs/platform/theme/common/colorRegistry'; +import { registerColor, textLinkForeground, textPreformatForeground, contrastBorder, textBlockQuoteBackground, textBlockQuoteBorder } from 'vs/platform/theme/common/colorRegistry'; import { getExtraColor } from 'vs/workbench/parts/welcome/walkThrough/node/walkThroughUtils'; export const WALK_THROUGH_FOCUS = new RawContextKey('interactivePlaygroundFocus', false); @@ -534,4 +534,25 @@ registerThemingParticipant((theme, collector) => { collector.addRule(`.monaco-workbench > .part.editor > .content .walkThroughContent .monaco-editor-background, .monaco-workbench > .part.editor > .content .walkThroughContent .margin-view-overlays { background: ${color}; }`); } + const link = theme.getColor(textLinkForeground); + if (link) { + collector.addRule(`.monaco-workbench > .part.editor > .content .walkThroughContent a { color: ${link}; }`); + } + const shortcut = theme.getColor(textPreformatForeground); + if (shortcut) { + collector.addRule(`.monaco-workbench > .part.editor > .content .walkThroughContent code, + .monaco-workbench > .part.editor > .content .walkThroughContent .shortcut { color: ${shortcut}; }`); + } + const border = theme.getColor(contrastBorder); + if (border) { + collector.addRule(`.monaco-workbench > .part.editor > .content .walkThroughContent .monaco-editor { border-color: ${border}; }`); + } + const quoteBackground = theme.getColor(textBlockQuoteBackground); + if (quoteBackground) { + collector.addRule(`.monaco-workbench > .part.editor > .content .walkThroughContent blockquote { background: ${quoteBackground}; }`); + } + const quoteBorder = theme.getColor(textBlockQuoteBorder); + if (quoteBorder) { + collector.addRule(`.monaco-workbench > .part.editor > .content .walkThroughContent blockquote { border-color: ${quoteBorder}; }`); + } }); \ No newline at end of file From 9b02670f995e53f6478e4d3a800128f2325dc22d Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 25 May 2017 10:25:46 -0700 Subject: [PATCH 0960/1164] Overlay color (#25798) --- .../overlay/browser/welcomeOverlay.css | 15 ------------- .../welcome/overlay/browser/welcomeOverlay.ts | 22 +++++++++++++++++++ 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.css b/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.css index 6aa8c04e789..50cf77eafad 100644 --- a/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.css +++ b/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.css @@ -10,15 +10,10 @@ height: 100%; width: 100%; z-index: 9999; - background: rgba(0,0,0,0.52); font-size: 10px; transition: font-size .25s; } -.vs .monaco-workbench > .welcomeOverlay { - background: rgba(255,255,255,.52); -} - #workbench\.parts\.editor { transition: filter .25s, opacity .2s; } @@ -40,15 +35,6 @@ font-size: 1.6em; } -.monaco-workbench > .welcomeOverlay > .key { - color: #000; -} - -.vs-dark .monaco-workbench > .welcomeOverlay > .key, -.hc-black .monaco-workbench > .welcomeOverlay > .key { - color: #FFF; -} - .monaco-workbench > .welcomeOverlay > .key > .label { padding: 0 1ex; } @@ -56,7 +42,6 @@ .monaco-workbench > .welcomeOverlay > .key > .shortcut { letter-spacing: 0.15em; font-size: 0.8125em; - color: #d7ba7d; font-family: "Lucida Grande", sans-serif; } diff --git a/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.ts b/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.ts index 8a3bb16246a..d5a435aac22 100644 --- a/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.ts +++ b/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.ts @@ -22,6 +22,8 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { KeyCode } from 'vs/base/common/keyCodes'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { registerColor, textPreformatForeground } from 'vs/platform/theme/common/colorRegistry'; interface Key { id: string; @@ -233,3 +235,23 @@ Registry.as(Extensions.WorkbenchActions) Registry.as(Extensions.WorkbenchActions) .registerWorkbenchAction(new SyncActionDescriptor(HideWelcomeOverlayAction, HideWelcomeOverlayAction.ID, HideWelcomeOverlayAction.LABEL, { primary: KeyCode.Escape }, OVERLAY_VISIBLE), 'Help: Hide Interface Overview', localize('help', "Help")); + +// theming + +const foreground = registerColor('welcomeOverlay.foreground', { dark: '#fff', light: '#000', hc: '#fff' }, localize('welcomeOverlay.foreground', 'Foreground color for the Interface Overview.')); +const background = registerColor('welcomeOverlay.background', { dark: '#00000085', light: '#FFFFFF85', hc: '#00000085' }, localize('welcomeOverlay.background', 'Background color for the Interface Overview.')); + +registerThemingParticipant((theme, collector) => { + const key = theme.getColor(foreground); + if (key) { + collector.addRule(`.monaco-workbench > .welcomeOverlay > .key { color: ${key}; }`); + } + const backgroundColor = theme.getColor(background); + if (backgroundColor) { + collector.addRule(`.monaco-workbench > .welcomeOverlay { background: ${backgroundColor}; }`); + } + const shortcut = theme.getColor(textPreformatForeground); + if (shortcut) { + collector.addRule(`.monaco-workbench > .welcomeOverlay > .key > .shortcut { color: ${shortcut}; }`); + } +}); From f479fcd2e5f39b0706533382e1d96e1bbcede7c3 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 25 May 2017 11:07:55 -0700 Subject: [PATCH 0961/1164] Add null check in terminalPanel click listener Fixes #27256 --- .../parts/terminal/electron-browser/terminalPanel.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index ec880bdd12c..4b5a29f34c4 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -197,11 +197,12 @@ export class TerminalPanel extends Panel { this._cancelContextMenu = false; })); this._register(dom.addDisposableListener(this._parentDomElement, 'click', (event) => { - if (this._terminalService.terminalInstances.length === 0) { + if (event.which === 3) { return; } - if (event.which !== 3) { + const instance = this._terminalService.getActiveInstance(); + if (instance) { this._terminalService.getActiveInstance().focus(); } })); From 796f945a2dd1bdb51846d12dfd2ba0d5f2108caf Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 25 May 2017 11:11:40 -0700 Subject: [PATCH 0962/1164] Add null check to terminal link handler Fixes #27247 --- .../terminal/electron-browser/terminalLinkHandler.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts index 49df15b331a..16047707ea7 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts @@ -226,12 +226,15 @@ export class TerminalLinkHandler { private _resolvePath(link: string): TPromise { link = this._preprocessPath(link); - if (!link) { return TPromise.as(void 0); } const linkUrl = this.extractLinkUrl(link); + if (!linkUrl) { + return TPromise.as(void 0); + } + // Open an editor if the path exists return pfs.fileExists(linkUrl).then(isFile => { if (!isFile) { @@ -292,6 +295,9 @@ export class TerminalLinkHandler { */ public extractLinkUrl(link: string): string { const matches: string[] = this._localLinkRegex.exec(link); + if (!matches) { + return null; + } return matches[1]; } } From d8c1adbd2ef48623709c6c8f227f39f70ba5923e Mon Sep 17 00:00:00 2001 From: rebornix Date: Thu, 25 May 2017 11:25:34 -0700 Subject: [PATCH 0963/1164] Fix #27265. False positve --- src/vs/editor/contrib/find/common/findController.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/contrib/find/common/findController.ts b/src/vs/editor/contrib/find/common/findController.ts index 4536b2b5b6f..a5dae70a8dc 100644 --- a/src/vs/editor/contrib/find/common/findController.ts +++ b/src/vs/editor/contrib/find/common/findController.ts @@ -508,13 +508,13 @@ export class StartFindReplaceAction extends EditorAction { let controller = CommonFindController.get(editor); let currentSelection = editor.getSelection(); // we only seed search string from selection when the current selection is single line and not empty. - let seedSearchStringFromSelection = currentSelection.isEmpty() || - currentSelection.startLineNumber !== currentSelection.endLineNumber; + let seedSearchStringFromSelection = !currentSelection.isEmpty() && + currentSelection.startLineNumber === currentSelection.endLineNumber; let oldSearchString = controller.getState().searchString; // if the existing search string in find widget is empty and we don't seed search string from selection, it means the Find Input // is still empty, so we should focus the Find Input instead of Replace Input. - let shouldFocus = !oldSearchString && seedSearchStringFromSelection ? - FindStartFocusAction.FocusFindInput : FindStartFocusAction.FocusReplaceInput; + let shouldFocus = (!!oldSearchString || seedSearchStringFromSelection) ? + FindStartFocusAction.FocusReplaceInput : FindStartFocusAction.FocusFindInput; if (controller) { controller.start({ From 391f7421450567de4abeb4119b98babd7df41efa Mon Sep 17 00:00:00 2001 From: Ramya Rao Date: Thu, 25 May 2017 13:10:39 -0700 Subject: [PATCH 0964/1164] Start crash reporter inside child processes (#27180) * Use service to get crash reporter start options * some refactorings and fixes * Move crashesDirectory to the main payload from extra bag --- src/bootstrap.js | 12 +++ src/typings/electron.d.ts | 7 ++ .../electron-browser/crashReporter.ts | 71 --------------- .../electron-browser/extensionHost.ts | 12 ++- src/vs/workbench/electron-browser/shell.ts | 32 ++----- .../common/crashReporterService.ts | 43 +++++++++ .../electron-browser/crashReporterService.ts | 91 +++++++++++++++++++ 7 files changed, 171 insertions(+), 97 deletions(-) delete mode 100644 src/vs/workbench/electron-browser/crashReporter.ts create mode 100644 src/vs/workbench/services/crashReporter/common/crashReporterService.ts create mode 100644 src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.ts diff --git a/src/bootstrap.js b/src/bootstrap.js index 022aa50b6a3..3f94abadd31 100644 --- a/src/bootstrap.js +++ b/src/bootstrap.js @@ -126,4 +126,16 @@ if (process.env['VSCODE_PARENT_PID']) { } } +const crashReporterOptionsRaw = process.env['CRASH_REPORTER_START_OPTIONS']; +if (typeof crashReporterOptionsRaw === 'string') { + try { + const crashReporterOptions = JSON.parse(crashReporterOptionsRaw); + if (crashReporterOptions) { + process.crashReporter.start(crashReporterOptions); + } + } catch (error) { + console.error(error); + } +} + require('./bootstrap-amd').bootstrap(process.env['AMD_ENTRYPOINT']); \ No newline at end of file diff --git a/src/typings/electron.d.ts b/src/typings/electron.d.ts index 5a1f5ea3430..05aab3a8161 100644 --- a/src/typings/electron.d.ts +++ b/src/typings/electron.d.ts @@ -2066,6 +2066,13 @@ declare namespace Electron { * Only string properties are sent correctly, nested objects are not supported. */ extra?: { [prop: string]: string }; + + /** + * Path to a folder where the crashes will be temporarily stored by the electron crash reporter + * Applies only to child processes that need crash reporting. + * Electron figures out the crashesDirectory on its own for Main and Renderer process + */ + crashesDirectory?: string; } interface CrashReport { diff --git a/src/vs/workbench/electron-browser/crashReporter.ts b/src/vs/workbench/electron-browser/crashReporter.ts deleted file mode 100644 index 119229bc2d4..00000000000 --- a/src/vs/workbench/electron-browser/crashReporter.ts +++ /dev/null @@ -1,71 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import nls = require('vs/nls'); -import { onUnexpectedError } from 'vs/base/common/errors'; -import { assign, clone } from 'vs/base/common/objects'; -import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IWindowsService } from 'vs/platform/windows/common/windows'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { Registry } from 'vs/platform/platform'; -import { crashReporter } from 'electron'; -import product from 'vs/platform/node/product'; -import pkg from 'vs/platform/node/package'; - -const TELEMETRY_SECTION_ID = 'telemetry'; - -interface ICrashReporterConfig { - enableCrashReporter: boolean; -} - -const configurationRegistry = Registry.as(Extensions.Configuration); -configurationRegistry.registerConfiguration({ - 'id': TELEMETRY_SECTION_ID, - 'order': 110, - title: nls.localize('telemetryConfigurationTitle', "Telemetry"), - 'type': 'object', - 'properties': { - 'telemetry.enableCrashReporter': { - 'type': 'boolean', - 'description': nls.localize('telemetry.enableCrashReporting', "Enable crash reports to be sent to Microsoft.\nThis option requires restart to take effect."), - 'default': true - } - } -}); - -export class CrashReporter { - - constructor( - configuration: Electron.CrashReporterStartOptions, - @ITelemetryService telemetryService: ITelemetryService, - @IWindowsService windowsService: IWindowsService, - @IConfigurationService configurationService: IConfigurationService - ) { - const config = configurationService.getConfiguration(TELEMETRY_SECTION_ID); - - if (!config.enableCrashReporter) { - return; - } - - telemetryService.getTelemetryInfo() - .then(info => ({ - vscode_sessionId: info.sessionId, - vscode_version: pkg.version, - vscode_commit: product.commit, - vscode_machineId: info.machineId - })) - .then(extra => assign(configuration, { extra })) - .then(configuration => { - // start crash reporter right here - crashReporter.start(clone(configuration)); - - // TODO: start crash reporter in the main process - return windowsService.startCrashReporter(configuration); - }) - .done(null, onUnexpectedError); - } -} \ No newline at end of file diff --git a/src/vs/workbench/electron-browser/extensionHost.ts b/src/vs/workbench/electron-browser/extensionHost.ts index e8f82622b43..2431281d98e 100644 --- a/src/vs/workbench/electron-browser/extensionHost.ts +++ b/src/vs/workbench/electron-browser/extensionHost.ts @@ -32,6 +32,7 @@ import Event, { Emitter } from 'vs/base/common/event'; import { IInitData } from 'vs/workbench/api/node/extHost.protocol'; import { MainProcessExtensionService } from 'vs/workbench/api/electron-browser/mainThreadExtensionService'; import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; +import { ICrashReporterService } from 'vs/workbench/services/crashReporter/common/crashReporterService'; export const EXTENSION_LOG_BROADCAST_CHANNEL = 'vscode:extensionLog'; export const EXTENSION_ATTACH_BROADCAST_CHANNEL = 'vscode:extensionAttach'; @@ -92,7 +93,9 @@ export class ExtensionHostProcessWorker { @IInstantiationService private instantiationService: IInstantiationService, @IEnvironmentService private environmentService: IEnvironmentService, @IWorkspaceConfigurationService private configurationService: IWorkspaceConfigurationService, - @ITelemetryService private telemetryService: ITelemetryService + @ITelemetryService private telemetryService: ITelemetryService, + @ICrashReporterService private crashReporterService: ICrashReporterService + ) { // handle extension host lifecycle a bit special when we know we are developing an extension that runs inside this.isExtensionDevelopmentHost = environmentService.isExtensionDevelopment; @@ -111,7 +114,7 @@ export class ExtensionHostProcessWorker { const [server, hook] = <[Server, string]>data[0]; const port = data[1]; - let opts = { + const opts = { env: objects.mixin(objects.clone(process.env), { AMD_ENTRYPOINT: 'vs/workbench/node/extensionHostProcess', PIPE_LOGGING: 'true', @@ -130,6 +133,11 @@ export class ExtensionHostProcessWorker { : undefined }; + const crashReporterOptions = this.crashReporterService.getChildProcessStartOptions('extensionHost'); + if (crashReporterOptions) { + opts.env.CRASH_REPORTER_START_OPTIONS = JSON.stringify(crashReporterOptions); + } + // Run Extension Host as fork of current process this.extensionHostProcess = fork(URI.parse(require.toUrl('bootstrap')).fsPath, ['--type=extensionHost'], opts); diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index da3ce116627..66e974a00c7 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -73,7 +73,8 @@ import { IExtensionService } from 'vs/platform/extensions/common/extensions'; import { WorkbenchModeServiceImpl } from 'vs/workbench/services/mode/common/workbenchModeService'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IUntitledEditorService, UntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; -import { CrashReporter } from 'vs/workbench/electron-browser/crashReporter'; +import { ICrashReporterService, NullCrashReporterService } from 'vs/workbench/services/crashReporter/common/crashReporterService'; +import { CrashReporterService } from 'vs/workbench/services/crashReporter/electron-browser/crashReporterService'; import { NodeCachedDataManager } from 'vs/workbench/electron-browser/nodeCachedDataManager'; import { getDelayedChannel } from 'vs/base/parts/ipc/common/ipc'; import { connect as connectNet } from 'vs/base/parts/ipc/node/ipc.net'; @@ -168,29 +169,6 @@ export class WorkbenchShell { // Instantiation service with services const [instantiationService, serviceCollection] = this.initServiceCollection(parent.getHTMLElement()); - //crash reporting - if (product.crashReporter && product.hockeyApp) { - let submitURL: string; - - if (platform.isWindows) { - submitURL = product.hockeyApp[`win32-${process.arch}`]; - } else if (platform.isMacintosh) { - submitURL = product.hockeyApp.darwin; - } else if (platform.isLinux) { - submitURL = product.hockeyApp[`linux-${process.arch}`]; - } - - if (submitURL) { - const opts: Electron.CrashReporterStartOptions = { - companyName: product.crashReporter.companyName, - productName: product.crashReporter.productName, - submitURL - }; - - instantiationService.createInstance(CrashReporter, opts); - } - } - // Workbench this.workbench = instantiationService.createInstance(Workbench, parent.getHTMLElement(), workbenchContainer.getHTMLElement(), this.options, serviceCollection); this.workbench.startup({ @@ -333,6 +311,12 @@ export class WorkbenchShell { serviceCollection.set(ITelemetryService, this.telemetryService); disposables.add(configurationTelemetry(this.telemetryService, this.configurationService)); + let crashReporterService = NullCrashReporterService; + if (product.crashReporter && product.hockeyApp) { + crashReporterService = instantiationService.createInstance(CrashReporterService); + } + serviceCollection.set(ICrashReporterService, crashReporterService); + this.messageService = instantiationService.createInstance(MessageService, container); serviceCollection.set(IMessageService, this.messageService); serviceCollection.set(IChoiceService, this.messageService); diff --git a/src/vs/workbench/services/crashReporter/common/crashReporterService.ts b/src/vs/workbench/services/crashReporter/common/crashReporterService.ts new file mode 100644 index 00000000000..4ce3933901d --- /dev/null +++ b/src/vs/workbench/services/crashReporter/common/crashReporterService.ts @@ -0,0 +1,43 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import nls = require('vs/nls'); +import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry'; +import { Registry } from 'vs/platform/platform'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; + +export const ICrashReporterService = createDecorator('crashReporterService'); + +export const TELEMETRY_SECTION_ID = 'telemetry'; + +export interface ICrashReporterConfig { + enableCrashReporter: boolean; +} + +const configurationRegistry = Registry.as(Extensions.Configuration); +configurationRegistry.registerConfiguration({ + 'id': TELEMETRY_SECTION_ID, + 'order': 110, + title: nls.localize('telemetryConfigurationTitle', "Telemetry"), + 'type': 'object', + 'properties': { + 'telemetry.enableCrashReporter': { + 'type': 'boolean', + 'description': nls.localize('telemetry.enableCrashReporting', "Enable crash reports to be sent to Microsoft.\nThis option requires restart to take effect."), + 'default': true + } + } +}); + +export interface ICrashReporterService { + _serviceBrand: any; + getChildProcessStartOptions(processName: string): Electron.CrashReporterStartOptions; +} + +export const NullCrashReporterService: ICrashReporterService = { + _serviceBrand: undefined, + getChildProcessStartOptions(processName: string) { return undefined; } +}; \ No newline at end of file diff --git a/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.ts b/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.ts new file mode 100644 index 00000000000..58cca417c6b --- /dev/null +++ b/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.ts @@ -0,0 +1,91 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { onUnexpectedError } from 'vs/base/common/errors'; +import { assign, clone } from 'vs/base/common/objects'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IWindowsService } from 'vs/platform/windows/common/windows'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { crashReporter } from 'electron'; +import product from 'vs/platform/node/product'; +import pkg from 'vs/platform/node/package'; +import * as os from 'os'; +import { ICrashReporterService, TELEMETRY_SECTION_ID, ICrashReporterConfig } from "vs/workbench/services/crashReporter/common/crashReporterService"; +import { isWindows, isMacintosh, isLinux } from "vs/base/common/platform"; + +export class CrashReporterService implements ICrashReporterService { + + public _serviceBrand: any; + + private options: Electron.CrashReporterStartOptions; + + constructor( + @ITelemetryService private telemetryService: ITelemetryService, + @IWindowsService private windowsService: IWindowsService, + @IConfigurationService configurationService: IConfigurationService + ) { + const config = configurationService.getConfiguration(TELEMETRY_SECTION_ID); + if (config.enableCrashReporter) { + this.startCrashReporter(); + } + } + + private startCrashReporter(): void { + + // base options + this.options = { + companyName: product.crashReporter.companyName, + productName: product.crashReporter.productName, + submitURL: this.getSubmitURL() + }; + + // mixin telemetry info and product info + this.telemetryService.getTelemetryInfo() + .then(info => { + assign(this.options, { + extra: { + vscode_sessionId: info.sessionId, + vscode_version: pkg.version, + vscode_commit: product.commit, + vscode_machineId: info.machineId + } + }); + + // start crash reporter right here + crashReporter.start(clone(this.options)); + + // start crash reporter in the main process + return this.windowsService.startCrashReporter(this.options); + }) + .done(null, onUnexpectedError); + } + + private getSubmitURL(): string { + let submitURL: string; + if (isWindows) { + submitURL = product.hockeyApp[`win32-${process.arch}`]; + } else if (isMacintosh) { + submitURL = product.hockeyApp.darwin; + } else if (isLinux) { + submitURL = product.hockeyApp[`linux-${process.arch}`]; + } + + return submitURL; + } + + public getChildProcessStartOptions(name: string): Electron.CrashReporterStartOptions { + + // Experimental attempt on Mac only for now + if (isMacintosh) { + const childProcessOptions = clone(this.options); + childProcessOptions.extra.processName = name; + childProcessOptions.crashesDirectory = os.tmpdir(); + return childProcessOptions; + } + + return void 0; + } +} \ No newline at end of file From 92be0f0723b79f984bf5ad2102fb9dcd074ab894 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Thu, 25 May 2017 13:18:23 -0700 Subject: [PATCH 0965/1164] Fixes #27287 --- .../parts/emmet/electron-browser/actions/expandAbbreviation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts index f046995c799..26125b52a0f 100644 --- a/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts @@ -33,7 +33,7 @@ class ExpandAbbreviationAction extends BasicEmmetEditorAction { EditorContextKeys.hasSingleSelection, EditorContextKeys.tabDoesNotMoveFocus, ContextKeyExpr.has('config.emmet.triggerExpansionOnTab'), - ContextKeyExpr.not('config.emmet.suggestExpandedAbbreviation') + ContextKeyExpr.not('config.emmet.useModules') ) } ); From e129461990c0527125264b0e4c24d97693239fab Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 22:40:41 +0200 Subject: [PATCH 0966/1164] [seti] Update to jesseweed/seti-ui@f78d623 (2017-05-11) --- extensions/theme-seti/icons/seti.woff | Bin 30512 -> 30516 bytes .../theme-seti/icons/vs-seti-icon-theme.json | 500 ++++++++++-------- 2 files changed, 283 insertions(+), 217 deletions(-) diff --git a/extensions/theme-seti/icons/seti.woff b/extensions/theme-seti/icons/seti.woff index d1411ae52218317ccb3d374bfa42e106da8ef2fa..5dd4c46c58c12024e051f21d7b8f946184a7f638 100644 GIT binary patch delta 30249 zcmV)EK)}DS?g6y!0Tg#nMn(Vu00000cQgPC00000wk(kpK7T|YV{Kt@0004m0007_ z000O$@Ff;YXKZ<9000Ci003=_005&b)jrC{Xk}q!0042c0000k0000s4T~ioXlP|& z004310000S0000a2fPI+Xl-0043z0002+0002+ z)}8~*ZDDwD05<@05C8xG9{>OVAOcVd5pH2^WdHzkFaQ7n9smFV=H5yf%y4gWbN~Q! zPyhe|;{X5zF9PoGZIcKAL4SV5IDvtcfr05K(;fx}h8_sb_<+HXkqIcuz{<>k6$GTY zrZ6}>V0=)^`~t|00+T?EAOZkRjSR2=0C=43)CW>jK^R5hGcbTiPLc!x0f_mdU${LsTu0k04YFn&=SNUX@*#MMSpBO+>J%|lert+ zkH^ZQJ#pPn+}z%VYfRVhcRac#g}w1mOeKvwq=$1EWRgWTIpLZ`E_virKp{okqnHv( zDWjbGR8YwSs;H)hhtyIRe(QNe1C2D%9NtAMk7=Ww4xWS)PkF|3I_aXD9$wHJ^wG~i zxDN7?A%+=YlrhGc;C~g9Ofk(2v&`|DH_WrZB1VQ5}yX#T*^yvoqL+R(hl(EOpHd99&& zouPTXq4^_2^9GAvHyYa8WN2@*p}j4J_O=?@``FOlHq&=dqTSHm4nupN7~1>P(B5Z; z_C7bXx6`8kRezVEbKQo{^%y$$!qB;1L+APoo$EJrZotsFK||+WT6BNNP-ECoW5iHn z)S^9OhI-?MdJ~3vuMG7j4fUoB^`;H=W(@Ua4fW;>^w`ZugZ>aaqQ188=-hrXs z2SdG&hI*e2^*$TweKFKKG}QZQsCQ(jcWkJ4VyJg&sCQ=3chtF|_JyJLrJ?qfq4u?* z_BTWA?}pkx47Gn6YX36S{%xpzV_g3QhNxOC004NLl)VX@Bu9BCnh}u^k#}b0Sy^{g zc2#vx_kZ+JXOCv4TQg`hqZu)Sq|t$d#taq+O9sSYFv7yJ#cg9`%a#q63=0p|*j&aB z42z5wY(48)EEv4@^1zFY%|0-;*@quKz*c#`FRHo+_Q89aet*&F_x66qqux<6nvSMBWI8!a22GL< z)8Sy3Oa^I&KOTWg>LgAR{8nscEQzI1KgD=7o$UXl@Z_-YWA1auiX6A*OFuGm7hc@J zjQmKXL1YTXgmKw&9yF~mb%h8_x0W5P7`9QVnmv=5%&2>1oxCxPtA=9)KBH1M
    S zmw%DlgxFkTq#Df3g;vZa%|rY0~&_64keHmNrR)Br$YO(SMnahuL(P6k}QRlaF1ydhJ?vL)tpldiiEG z_M!L8Bx)vpo*(FS4&eEDr}`|^7p`nC5h+HjEmwN}%1w40SIbfCH$6n{p3 zJi=ifPbV;(Nhy|v?Cy;xh{aqErjveeIvJ?(PoQ=Ec<=0J(pP84SPbuw$`~YUU0nqI zu|rbqgp@p~8{)!%u~!A$b?y`Qo1tV5V`NR&%W*^ZT$6KRkqtAt(Q#yA_WZI=$@#JF zJC?5Nq%ggsFn%CHQH|Z$(n}$ifq&2)kLzBndp6}n6Z$nPl=vTXT>TzNEN0G5mN@%n zWFFccbfCX7ht9+Pq<_vr?Hc$ZlXN%*by##7Y83Q9)*y2|7*Bd|Xn!*8gWm1X ztU)i80-;bkH=Tfb?dc8u{4qk0G0Qc=rLC-AakeX~BM?@9+&fT>XnU|3nl)w?rhWKi zEvehQ`fNY-YKiTei5FXC!KLo$&BH5acbi3ZiMd@$YS1>r(w(dsRN;n=!82D&0e8~M za<)`ydMW4}6S=4!@J*w;9)G=hXn>YLrxVA`t64oPj8j)^o*1NM%fqG{b9rKx_EPO< zwBOX8(Ec-tNR9NNH&lZ*NT(-3A{uNuoXgKH>0z_i*;o}&W+&( zta=yg&>u}C8n_`oE`#f#Hhp+7*ti%j@JZ3@57Jn4dLyXIFdL*$*M5=C$E)z5iJ%2& zMWH35-Z)hio>xiz453lk5Cx(?*de`+h|@kaF~fWIdn{mJ#}1rd)nm|rfHJDnwAOP# zxO15usn$If2o`UJd4HN++-cOAewkHsNjKI(xX}gJMc>z1`=B5^&AbZWBz%(w;jAv&jyD|F&ojGCNM-l*o*YDEY? z0{OuH88>ZRXWmo0H*a3N(W^QZbEyffqTCC(W$B!oCV>)^fHU!-y`axwsbVqcRG)#@ z&`Sb*1EXmcrhm7Xggb)hCTcvR?08o7!Fyy*Gk{wV>3|Q3t-v%&cEzM(SPdxAt6-a; zurM7Vp@#Tb+PZb2v)*oRwjLE0^sPa4hq}zPs1Z3Z{2Dkjk0vqb%K+p%Q<|^` z7`lZlrhmnFsQ!jh{UwF^E8=M%j(@4UbFi3hoXJlZfn~*B8m5)7S?Uj>#Ji#n4_Mt; zZTXJjq~wXF({pRh|Mv-NO zXWMZUcrCx|H~Wne0Dj#;lUfyGTw@-KD&yw;ghMQT3x#i z?hEod9dns&q#)#NK4?N@WKclcb^$%7%a+?x0HmV>3X52;IE!2XK-; zV1H%Fy|cT%MuIm3jQUIvr_DyMYyac8^TN+i_VXZ{u1NFhMC!Z-V%ZB&B|+FZ2U*nJ z@&RE`?=YvKZN+9_m$-Zi`IGhyXM-o!@;@oan{#tFFW1WLsBEu1$on_tx^rAwJao5u z2Q5c#GfH#t&2G*(sA^Ja#9dwN{!`P7D1T@mxW}^lZR`rwADi?qwFBBw?FN+EVh>cV z6NHq?3m`bcHUfZLU{5H(3gt5Zcq)jAmb|N=s(_vW)7?O`o(=I1H6rzw}W-Bj`- zK?&Jr>?US0qb4O_MkQjZ9}chsTB6PUVH*dx)IfLFR?e_AVt@$S;QLG9`iE^0!V>Fc zSI%xt#pNDYmh2>XJCF3^=E-U{`+t>6p_7&ulUvFioqp-K$*RX^x2n^NqS5RwC{rnu z+k2sfSM19>JIvO#7JS(uL-eV0JSqhRj|Tm%1_TiPC?yY5PJi~bUNv#bwlD0rCR|oat(|Cm>0i{4si)gg~R}E4m z4P_1IkR4QiRUHe@>L*3 zO9CKU2tI&%nQh8AOqdt+rKAQEZti;tGuwwYPaOC3P8Zk(mCl*r>Ju$6W87=x;EO&* z^@^znR%klXkgfqGJXd#p0xq%SfTPW81|tV`hnaZ^&>2(C3;2wT1AmX0PPxS35T#Ye zVg7T>G{~*c@(nAlHv*FqE(l!;gEjD9QLh~J%u3B^_WX@eT)D=P(n$~cFD23j^j-!xqPyHn3;MPO&({a%Ztp*bzwZ=Gk-(Ahg{P8Kc>G6{-rsW zd;vC1BIMgx^arRKA{yD3efr0QodJ0AYi|(-FLiTivb%5Rl7HRK)<1OpJ1@JQyn?cm zU~qr=mpCsKWzO}N{4m$QOb(@M@4fcn>9v=1{6}Goeh3*|zo$sW99a+N!Vj<%2rA&{ z$sBki+3%?{^M5J<{VTqUx2PW&u8|tO9kkmDt^@id*K#8^tc|#cI(D}9yn9}9vKPrD z3YujbnKA)d&dc0)rQSTwb8a#~NhBH+2P(BZPDE_S<@)ONw`S#99(5}f8xSc^%h00* zfKzz3Q(b+=`qR1o%#H2HN8e)DiB$qcAdHyqsT7VtZ+|;7SoXPBYW3FpqiCG3)H;?M z@y5ZH1ioT>VNF^fBb4lqNf~(BgWB8C7H<&1>m%rm9Wa0E#3!9`4?iG0pUi!b>WGd) z`h6_n0iTGAdDujq$3u#^0A-0qBC!BE>_MW8YldPzr!van4G?4ul}pEmf~ez%>74ke zAGAzpyMN#!L1%^!thg`*tMQUq2;G*<*LCPj({USt69Q=G_A-br^`XG7CArVQ%IE=? zz5}PZV}bGbem4O>1vimFRt>)2O#}dVN1xvWzA*bA4&InVoi+7Jp7;S*xX2sv3QKU) z{-2&JI1m*MSHg3hM(zLQvFavJ(lUhiJvZq{ReyPuu6gC%%AvhV!Rsa5F$3(ntz7}5 z{QnEPCPgw#hU4M5n2s-f0T^}kV6m+rYss`@H;od2tidusR`*1Gxx29jcEWR|o07@e zU;w`#8y`MAK0@`w7mmh34Y+49@o_Qmh_ z%d98=GhKV}%F4=k?{9f|dB08H&@3&4Hh;z7B}xGP0Dg?rrwRSi!@u&@5B}_#UiY52 z?@n&Go_yz(KTW=Mym8Bscg#L=%_ScM#82yLmupX-+qn4;7^cZ^u0KN+m)ZlAU~n_g z%R(8lV!t%v1Yqcyip8mOO7Z6>Krq0@Z(KHTQb)R6w>r`2^4?Q_b)8p&T96fcp&2uLyJ^Hbr0bifVmoX0qnF`%n^SwhuhCf49=wS=I6mz3_RAF%;wax?ttUm*yn{k z`p5fYsF5}h!^K|-{>U51L$lky=YQ|hlaEe6I-PxBy3g_cRQdB;5uYzyc!E(6soYej zzct#2Qj@)~)NmfBQ8umHfx;?OgYk|rVE2XJ$506L<`i-JDo|c@xjfY)#(wx&8(F_~ z8)GRCxno8~sqW>2UK~WR*<7hs!cM7{JKpSXYdOG_jJZir)>+;GZ@kp3Reu{L_7{J? zaZPU(VCydMaSFB~iohuVRHp#l%O$XVUR^R_8%{F=#G@M-pt8vDOzKo~ur}SA6lPlM zGCiNY4?R^>suvw#=4^XgTdD6))u=L9*Om-G1Y-%SMCc)LgcFkf4Cgs+RAjzW*jWsX1BG;f@UL(R1k+cdQ+E z=k<#}{5KZ*x*y1>(NBB}JhofP8s4N;=(JfKt#6hLrkeurJO1bB7buv6RQ zfIW*#IOG`p7p;R{7SvE7!FANeOljLZ8VU^`<11TDuB_>Sm#(?t@Q~~1S(-SG&bKC; zhbPyGZoOvEA4;q`PprV~9S>Lf&3ZT)?i|~k6j89;y*8tIqju%O#?0vFG@*GImrrDt z^tl{^V2-n|KmOo@kAKtn@i)KuahiVgru*)@>7xwZ*nPKrWDgtAPqT9{!pq3q7h{yl zIfUvjBC}X&7)z$iN54U69r~aNX54ml(Q9n>uIrDAwZMzQ<=!*8;EGSJ1R0Yb2*&jN z)q1J56t)`O17}C8X~-OZ>EKnDpFe%})SZ5@wmB=C#A!xBTYvkW`W)BJT&mCauT2JC z4e8Hfb^*i4a?XUtBlLMAoUFN2 zZ66GNe!n@l8vYMzOndcUn_MwzF2#;a{k)b$r(G$YvfW+_+~h#j_h&z|*VH+=SYk`i zVy+nrO-nV+B!BIGHtv!VDYX$JldRn@P21#KvoF(~7u-906yBdX`}(%$ozC-?M_T~G3^50sd`Q#_bG2*@LP4~ZvY`*%{voGIw$$uQAf1|lt3HZ1+orAAL znX?`PUta>R|499^o3dN7dv-TQ`Db6Vv-6#eXZ+041Aj~G@r!4!U1j8!M;@7db!TV) zen-I{aj16*EijAP5$}(uS<+215Ig$r*<0WGR&w!y*+(9G?6KKL?z`_k=FYx4`zp!5 za@UvczWYm$Jb32JgV*fc>l5sQsuxgt2}&=UmbxU#WYQ-e{^A!Oewch^cKC~5B>zf2 z^o1|N`+tWYnmzu|{PVuv9b`w*!vhSJSzk{3Q}V5gpMSXb$xrqk`Y-IrW6cLYf7@-J zf3Ue<{&VbAPrUrn0!>!UY1C2mwdRda!O3l{urWJMys=WmXP zZStNPa%c`7!8C=mTVMM|+ZOl{%;5O8+a6eJlIv$5X|&BC2m}Evjh?fq zLP1b9Gx$XUu-bTt&}|Nm-3Bb|*x-~>(*Sh920&Try^PalNr*9HUd6S#5$ATvt=0an zUjLe@8({Mt9@X66q|zkcFbx4v;$cD$>3nrvjpcx56Ny zY|I4Qld1Ti5yMTtQLFv6$$;{69##C`rV-JxPeix4DEYfiwu7xOqu(Nj(C zFWg)*H}9E>4&ZdlmWpWt&lK}mW;U3Djapc+9SR@}i_SwbM+rQDuF108O{yLPdVio> z2*7NaM@*c)3Yr+1zVC2qnt<;(IB#ctDGyx1Drq?gYCb2xKuoJut_7~y>z?W?>FkOZ zo_N|*Pd`76~kN+y++$8uX!uHQGh(#oAA6-zEl0$(WoZPbbeJKSEwaeuBK7+)v(um{#=*cA!LX+K3CmzBjbC@+qXEaPw(BKgqfp*X%m4fTBx0*x=%@XUF?c26A?B~})UmET*7+SMhXO8E< z?`@6?f+>K%f}9%E^IVZ|mr$w;;Kh#XTGU_?2)b@k*5Rf>0YXtrP=8Vb6vqj7IeC}R z1>@8%$&Ll4A#$W?dPw#Kum#Ho8Qv)Cyj(eZezR#1E2>SsD{AE7}c!? z=Ygqvx*=R4be*s7UUir;P$onFdLW{dCB?cI>%4fqU$2_7S6(U^(hrZg0&F(i!ljny zcs^KU*EVpr(9>N4YJZ7UHaN~P2nTeInjGq1!EW*Gj$q_1^S&^l9EYOpc@{G%4;Wh;)Vl5Lx=8@kNd^4xyd;D7}4b-80YPUJXd6YL#hEVQ`J zbg)w*bOoVO>N@KP)1qKExpbk@1HlbYQ`eycYGr}#*QpaSoPVVwbXH}YbJw%=`j(eC zd3Y*vbSPtiE7@&MRvn$m+{qJ%^Vq0*qGE8%?Y7|Tf$6E9&S;?HBe`JA3=_K(RI_oR zqh&UsNv=TCoAWBrHqI#Zn5;%|%d`C$T6z~hSW8mM8)4t|E-=Ck7<}Ox7EaH=*TfV; zfFn8|(0OG|&wt<&I@)pJ3x;!joFWD4qrXh`l*@4Li(0CKfCYi+qWU(Y4$vMOy81Zu z2eXAvsZ=4bIrpc3%Lc&1tKh*mv{z`a)gI8^t$k3_x|4LcNY>ygYJ%Fjh>&zqag(^{ zO?c-h&J|1>BG%erYY8GIvJ3QW-eKh8jJ{{=_TESfu{^q&2+gn z`-Ba>7soani=Ybe9;ftws1QE zr~nZ{1%HQ4CzP{a&-yDzTQrN`(TK~mb7-~yLsY=k;8#qZ#jeARTsADd;)Aj}l`j$x z{IdM}(+7%=qx+A-0-bc+yyw8XCH$N`H8MehyR~e|l9XAYB?V4dJB_28<>i)d zxV9{ec2j4h8|zCG%QgJyR20{|a)0c_mQ3Et4piC)i$;+~l!i&SQLMMh zE1)+}51)g1fQq;Q52%+=?m2tdm~Dbw)U^Z1ZnGhBdGPWCa0}+E%!%s|aL=?Kd!)0D zu{Cf$tOrXfdi+my5ZbwZnPe64tIu)2D~)sqi;Ta zcYkLooxShvpMJ;r)t^3n!|9U;R!`o2^+t11qB-2h)pr8MT-MHNFGPf?qOXe(^*q8b zZGV?XQBhcMQhOomL@Xp%ktB6Vr$3meNw34CI~>e2*Q9C_crNfmDhxhR_Xb}{zG5<~ zDM8C6Xf)?HXWddv$*0ra)3$VG8=>UB&wo=eNaQDUFf93?MFlgZD0OPS2|$5SHvlWi z=!s>pP}e*eo(1FIKL_?G@_osPzIp%*h{Gj!f@u{fG-)wl(9(>WNuxR}%AIC!ZBSfM zl!x_Bwge*&5(r{e(rr$sp3yIbPU_hVti2ccQB*E5lT}XYUI%SkBAHM4V1QgfKMBW`16OlHDxjo-;0OaS0SB{m)EHr`Zjj8QNApO?-c&afL1ZxA zA#z9`Wiqi`3#6RuUJy6c)RrSdX@4?5i?d1+M7j8C$+hO)_ejP1gp?&s-NS z1RwaFpCw--%#v26EOft`WgU2sC%{936)53QxmJSth2SwG&J1S9VC3CM2Y=seuqcOt z#CTZ31LEaq5#osP#MdJZRc(PswWM9K9LvdzkQpX-@}OL4S8A?Yx0uht(J|cwnK9Qa zEAf*M+`n7O?bJ_|<21tb%~&oH5BeiD zBZ35Foc1R}%z@gQvhVMZ{eP(6FdH<9x`w_)xMpCl+Xb;m&$k%W-Iu->`YdgAwy!*D zV>k+Mi6z;GKkUdGsoRZ+P2QW_lzyeo0rQ984&A8y66nMB?l5TfjtGk}BZw^Da>ouBT7T0C#OiU+fWwiL z(%8?>pkHHG1NW~1cU^&=(LnosDvI$DG6V;t!o&p#I_9VqeTknC#IBMF8*L>}>M+1> z@(uPlN>=AJKm_R%pyHj^Eiw5xVJn0__N+VE?;m?QyZSM~9;ftiMmn#5@^MO@fWP+Z zIvbBaMu`c3&zZf45Px_-e)FYR&!EJZBCGCr-D4MWTI-pcTry%04KmB3q!G zFlt-Cspj*0gJ}j-3*Wa!(=9a9F;Z>iZdI-u4tO@{t2s#JuGI&S0f5J15zs~7OJ4|@ zq4N$x4)Um5ZKokXT&D!a zkC|Z2I&lSo3&Z@JrVZK)py)(Xm$&L=z$=LxQ27wC7)WW}t)F)PMsoq*I2 zvw6t`#%0{bT5xWq<9Eb{_rR7@d?*WO(6|vd(;Z2(@Sz zvppwMkxc>g3OQ%W^Te>Zi<7{hRi2jeh4U;=`YEATgI#7$eq{WtE5L-8>rof%dk~qH z&P#zg7Kgf%o%PYncqwTBsk0_s+npIrLo{V~ttnV!J?jOg?udw;Iehmm9(|V!Zpzwa z34h5}pKJM|UJi2RN0wdkb?e^d^2zquGr#0l64L}H(VO}g%@xzA8Qo${gz}uHJ7yHP z$(`n2UYbY00g|$zU9O$hZpK(&sf`o=*q~8wm2`ZHW)7M<_re$z%`ojs$vMzrbrR>; z)X}s*XU~YvM;&zkLZ*kw0IUmhpZqi({C`~&v>Hq}*N=nOjC9%o#0i91)PRlwbp>+` zm8IlH-AMro(Hc0k#PZ!F@O}pnjAIeD$_eH48&Ce-1Hd*nY>dyG0A*%zZ!OL)X2Aa_ zh$k5LvyqUyrM=hrh@U4E`LsU zwo854m(VN2Qk%XdYqvMr?b+{=FU_{e2k$!Zh8L5;?204gUh}<6^VK(|!djhPduV;|qNg2;FmHJF_^G2u zPMkctd)3L87fbZ2BRhad6*|3`H%%+5J#t&tXstC`G`Q;I)-lgCx379mGaB4@B*E0POh^C`gDFUm2maHem=&}RfGXPPMEO-eeElh)1?0ei zlc#;t6R zdHK)%_(`%BnVn62`_QSEpI0ESSzLA5$)m->CatqWz%zad#|$&{7mGLW2h8O>n3>Fj zoQo51c%E5?juT9+!cT~;_OkvJK9*=f6lY2iNCAY#ly$JVs9=M6%10l`2iz6|X?Tbo zG?U#Z9e*2pMkq|(XRKANH1(ACDxJn!vl0pi{GKkTSgKgzxVP;HwtDVNNw;K~*oN(z zwRNc%CL1-REhEuiMs7>)-Z>fgg26Kkig)E+TMX_KNKQhBMpk&Tcg|C4f?y-<~^V z>3QIlt2k$k%zCN06|I5~fQRaVx&ZnZcpH`|u zl<3g*mKaR>BeG8_fNFG9CXdK)(SS-T9ir93ki>9a2#2OW9%NhT;tA*}F!=}V9}X`l zEPvg=wK6gua|~|c%7$XtpqW|~HB}UIZb2v0WKR@u;#Z}`frvzLApmpklT;L;Ig#Cq zt|R#F?avCcd0O1O253-lIuGxz@`JGv*aX!8XcRIuc-9s;G<>K~m-SQ>7KL*<&yg4w z3IXi*#a=fICIfY&!Gy=1={y5-{}K3rY=5Zuo{IW+RH78dkufklns8Ms>}fR?*x+Ie z-Jxgmn~bDERRwQmZ`8~-U`8J6~|Um$M8#*(J`7q08R!c!fhKgCwHU5XobMlWq)B@ z0r#&NQPb%7xWEFOgz2>WsJVg+5e~YRUO(IkL{0A0+HL9(0KvfF%-l&a8!)ttn$(TJ zdcSazk`tRIt_ou=JjT+QlVrl?hRrO`P_an6-Hg^EF#wVtujw)s&3-$=lm&pz(z7Ku zbRk?&+ktRA6R0WB#6y%}kW&}SvVSIcYUkoSv7AhK=D;~^rCZ<@0sT5| zZMz5qlc#3N;XXW`eH8;*lmZBL0JWV-dOX!x9m>+A2hB@Y>wb_#F4U7^a>fePn{MQo zK!z=Dgp3%v6p<4rmO*sOiR)!=_FwM)CVPc#8=mWI)!}w-FAV%z8kUxG;C~5WGqQzc zNv9T+;vlrZ{ii@$0VAeQo-r`n41>m)p~`e*g<_tb3fx@anm^!bwgIEyGA@XOb4;qG z9s+ngJqs`s!*4LIP*mz3wj4a0qdP#bB?t@>VoIOSgl8MRAw$ctJu8IMURyx*eQA49 zBF)Gbjsz~AR3bAHY}UkCLVrOpaD(X|95{qYBti*YC6-F_{S+n1!m~Kjh`A2|t{kx# zR1)LR41e+TVN8Dqsl?X6_h_$P*jAn5t(h@_n?|M=r(SGf2jICt26kj7vgCW@S7&d& z<(mt<`w#TPS^yRi^GxFT+OVl2bmK*q^GKOIR4_SrNw~lel`UT6w11J?u3u^&_m^xl z%4=TfZDF}uZZvAe?N5Em800dvleAh7oaMnrZ{>8omB;i0-*{@#;`|EJ4-X71X(YYO zS-N_#8=ZjWilk$kK{V+PnuWo^aQn(`pJ2}gHa*c!XxC}CYA?|KoE##j$gSkZ$?M32 zKsffo0rE=X|iMrpx-9^9Rf$Y3in1=}={s_J1(V1w$*-#j40And5}X zrJRnvr5{AhtDwHByQmIRc?wxiCFx_ZOeLJ+;?i`o!Fz;BFqm_mK}Q^4t1 z7jT??vAKmnY@*tmb#S%kbljJsH^zv=WHBIYzOWOg^W(V_+@<3ULSIP$0JaDKcq1!O z)L!_}OThgo2!DqxnSfcS0ouE2_-QK2o^VVTQF&13G?a#p{Ym{Q7rJA|^j_-clF2mk z9b8BysIo<%vivoooX8;P8By#=!ULbM%F5+dT3K6jGLr&q06PL0DK`SpI|~4=yi#Yr zZa8XU$~;;Mb(#{swvquC0F{#-rh`!$gp?XGa#Dkd*?-%?vsjo{3_q^x3vN204YeRT z&X;ghW=e>4AS>-O{gP*bwWh=cW#$<)8H)GEO6e57?c?97L=kcbTS8~ZGkOxd@y<4=M(CR zveAI&5PzEb(qp)&z`X`;rb{lN2Xx;FyrtYSTl4~rG4DYpRb5J`KW98lT$_8yyCl)! zsV=9f0Y=uA(D3InTv!kqWtRAyu2I$yFoMi*L;0)Bj{~AR&!#p5o<_hNfd3}Koc%@& z_Ym?$Wk0Z_FsnDOY!};bb6GXK92|Sq3`$ftO@H36nLy`4Ux&V1h59-&X_eZe6-%!| z@hf#`H<(Xff;D%%7G^wxJD~U!TJ@alGqqF#I>2;rAi7!P1(Z5Eh#Tl?X2+!Lfbr%m zsySekWfBso9W%_pwTy%H?WNo-K|77WsR4)%5*@pW>De7-9+klJq_|oMS##j(Y6YK; zj(@q7)rA>;LkAPi!eXhLLZxs7Un6Yj_9oQjGN_(j_2B4-$W)kc9!TxZ%|KUCUZ}oK zi6wO1sQONckbfq)Fw;rGFbx~6EGadHM~@8UUalIG+7z=ZB9#!+8!3x^m?XtKO>lqa zd>%R%saoZt&SOA+RCGHDPO&Ax6UXQhaDM?RF0ERi;W0W1%)(K*>FPGaueWfbl5P)k z7w3iu4ZKDJyB7K+O5Oaqa!i9UV|M`PiI~23mc@ya54J(=K~#Z3`gUR#QB;zf>xc7P zIKCm=(CWbfBZ#|p=sLd5^Zf9IPPf<)8)jifoeSf9;2KS%8wZ9gMLjEYMX*_Bhkw^M z)%nEsFL6pj{{fgmuJxdIVwG((S|=Xm`=2`=>3{c^ueP_3Z@1M8>0SE#z;_*fetYjz z3qPpOt=9J6wDDDy+RtC4pJ6)YVUZ*njsf|y@f4%OB)@$lzw@DwzUQ6S=Zri!d-+2T zku>cM=USBp;P3Ozin=}P7&{z9A%me?^9zCUBHQ8XL`00&Yuep|U?0;ZAE{ADi zm~|_+ODO|eC_S!Mqm43f*2r>sxC2&nOc}GA*cs{i~!07pkMh>7w2|4w=(8&6Cj!mM$#fUX9~6hScJaZC|`yc_wWf0 zZ>cx~I$mph0;kdmJ&rR8tbd?44Ue&IwJ;m?byKe`A6yxLF$?yOy90Ks)1LAC|jVg3kasutL01}!Ohik2Kr+ecHp?`?Qa1-&DEv3GT=tiaA}xg>sn8 zJ)U49444E3LlBbSa+L9WVb%~p!+csa9!}@xV$QR(e!7ROFu@B&ce+EBp;^#wl>&s5 z4ExiCY1Aulm5`FvRDV&*@pPmfm0?1;DwQmjzD%a-M#aLAkt|UJ6FBc;+YyjgfGLxs zWDqA!(x8KMFElxi%+Lv@tzD3HX=GM>ZR|EcOu&gDIw1l$!Xc^~?YII2tYS0fCem_5 zfb0>9z{^)%6Bn#Feuk@$fB>y-R+b{4Nm~ZO1=mq)Qau7PP=D_(S8CwJeg>VXY35-S z{0K-de6^k6Ag0{-AOOq^OD4-@$lW>1DNGif3OAa#9vvTOLM5csrCSro6LDt>#sSJa zY!t>14--ZrtQiMH18!Qho?md>gh>j~Tt6SSG*Hgw&BN^AofF}TcY%W;=H9c{mvH4Y)*!ESR{ zBP@^o3it`bNSiq6gEU95#KYC=Ca9yBJ@YtXJ4Ndl5YO{zGquupHuH@ZVGd3hfriRl z>;%XC>K#=O)eHNv!mkpLQm|N8lBWSvxQ)Dmyqf$nd4CuA4e}oHzmkuU-zC3CK1KeN z{2BR6@>TM; zd+Gb=`+w<&=!fa=&`0R+(vQF?9W=o9o)^gmIIMI{5ZfNnS$Uq;68d2p1B4igO5 z4lh%4c7Vi(PzV(1C?dp=Kqt0OJxW)g&8&<-qz6Mr?vN2DQVqVA<)7_ny)PHd0d41|k{v<~PmY*jOEd zBE@9>U@Q+L2X2$9+sI6OFIgQI<;!s& z8-LiFf@R1iXs^&Hs2hR>;X^2b8xcW^JEJj4M!js8O!NtASba@ul=|)l~a7lBo@Grz%rp&(eD(TOq0zq zUa~nXhH~*meICGzx~2Mr*B&LC-*XIal7GkorxC|K!6Wm}avMJ#kyy4mXHz?&}v~<{C9Ow)6PUEd{GTl-I_DfUpEvjf78cSwIlB#(VLONhD z3Ltt?n!3uPXfS5NnKht5ktxrB*%B`Vh3vgc=Z`I@;NpkUuQQ-rv#+C_04qiSOMlKD z60Fb}c{flXV>X5doYFD&vx}JwC%{XSQ(#u~BNCjxgIh8IiNf`pc|b`AI02eXsK#4> zNs&*Ycb?sd`Hde$GdUYzHkCZgkvV}$`a1f08JRjT#2Q$roADwSLHswr2@qYM{hiQn zr|O2Uf^VN7+j#rg|E|;D5ibOGd4ERULdnYj)ZY&!IH&YDJnB)dL;cpb+q2_mP5@cp zCr&Z)e%iR_CHOQ#jNONmRKBeAtA)i9VQLhIV}a21GwgXMdxZi%KvQkD63I1V!Nd%Wh;Hu|ZWS zOZsr3-o%2ylcB3qj)uQi(-#u7hzDSsQw-pl3Uu)%>%eh-7?Y~$NybiLU~-46ijc=( zK;-NiDqR~G*RwHsQOen8bAJbiCxXEuXCDOj#=gL39{T3PT;)aT$2qwJhxJ`33%K%K ze+;gGqUNK5iBIA%KPcXU{#K^g9eS=aos6M@v$sop&g_*f5I6%M{Hs77NXi}p$cYj} zyU;Vg2sit$FZeN?epNBLny4{MCwh$PyNZo|3!eCv6I8#3k~8p-m4DgVSr7-fd6O}t zw9D8EV@~A%9bBDYkTbxG)Rhh#XBr=GgISi0(-etUEMip`CC+8cDe zXs>TQa@9S*_{yS3$yG;pAGqf#^4ZPfsz3+M9b4a9Z-ILYIJkdSX;{jJQ+Vx5vU}To zcU^tgeYbsxx%tc?le_Pp{UP~Q{@8+}%~(aPd@K!xBygG9E`MS&rLTS2EgzbF`}xka zHb{Ee2FqrDcVnPNVs4H z_!;?*6L;LG6c~I8<|MmWdhC$pSDmn&-LQNxjiSr1 zNPhGuZok05hJTv7NkYq^;hJ05TA{e@dehv`Q(_0{r?gb7Xbo*uMS%A`;9zp&20)upaq3A^I*`+3cuuFI5yFO$I&KT{-Jym#f5t{8U zau4x}uQKlAo)?xcTD}=tL2zs(XQHt_?3;z@2To#ICT4=WQPKskAv`;3w5!GWL*r&Q zUQVZ*M}KtOAI?fma3W8-j1%c3V0UEh8-Z|m+RcUNbd09qacZZQ!72C*vxQOMBKJ*$ zo1D45if0C9DC1JP6WOlLxvX9qCkcA8r1iDK+9~Zvka=OOwT|)av4UYmX}-UW%DF3z zkY}~CeiAMA$Jn7bv8<-k*nC)lSphv#O0|kBa(~rLaP$uol^tCt@Psj~vj>Fr*%v-C2%WUfimkt?=uuSg&wfi8Tu-&c3i*J={9H3O^C2YFFz z>)T^q;6nTHFjKFoY|p=|Z@fr`_x#B_$xEL6i{+K`@BGa5=idpYtGB$ewtW3}W*=Nx zp|AbU+RBrkefi7Z`OdXZ5AJ$7{CnrxHGkUw*dJYxaBT-!C7sO zCanX`?285IIi1$ZO0)21U+7$lhh4^`_Ve2BA;a&MMtj)_0L$Y-rI*C%-UO`LS${0_x$Xw<{ql)f(CB?qtaAx$`{x2smX8TC~3S1LC%+MDYibqz*DxT)WgAe zos7Fv+;(if1WW}QMW%M+Q7MQMr2fTloQ%LgO_0sQqqAOrR49Ym6AQjSe=ZOjp^{|w z7D;1tfF0EJs;QRB%o3--O+N#}0DstK7+me-8QY3!3j>(ABVAnXVy3<@On&8bacx%BP*%6NeHUsdS>XD`mCcvk$Srs z$Pz{iBnf?+`!x?ES-AZUPFy|=&(Wz>b6gWVYGmRx0`9a(smR@G%XJLT3V$WokSEEz zayL%^?*im7p~6in`Dt$If#l6+n$%_u$$Z1d{S6%EKEWfHAfrO3y?OG1NjvaNl3&*DO z*|O;l1-U}o$~TMQd`fS=FGK{a3gfM#dCvNL75*1NFe)80U88z8;D0_3b%W~(U=3Th z95uBo%xoPxwsX9bM?zYR>q4@CEwvjhc!O^0h3)|1YT7Kyer}`Nyd}(z_ z2xc=~vJ$V&K2Aurf^%Y)p}WZg0K80Gtb))GMw`@JN5WH_NT+9d_NvWR>z$Q2VWtet zz|HGnr(g$$I0pk3+zn@m?Z029o<~ ze^<4fVm^lp3ct78<(`#k!03$&HOY!o7hqg5$h?;mqmGLN?uc4H>M4J@P(m@9UfO>M zj{)F%#|Biqgqdu17Mh+ptY<+_L{`TFgrHX{v2RnyA~cAX;#RwVFcp3(gIY6kq~|-H zB6~EYG#d9osdS5CP&uF+)Y{&#nJY3L9j$_Dgf93{#{o0+hL%DbZJ8)C`%*y_HYsAJ^L;v*F;5pvq6eGF?4@acps-0(k`4#Qam@B zXKogzn0+YhWZP74yNB}L8l}sh;(gr6MliP=h5^+x8H!3qS+lad0_MPMx`3vjF}~?p zyf^zdC#mFlL+}zK&Xb=O=GQo*cUhdQfPv9BmX;5lTJh6d(i|<0ZrLRdtew-TBu#0; zICj9U@l@j0%{qVe9)_{IlTz2WJK4ey9-v>)eo=e3_S^FvoK(;`+uM?4VHQ+W8ja1~ zHe?H6nWcLxjq$?qe79Cy(2&mI{RjhN3(u3pSZbYiltaT66hh_t0Wd@FyEES?7BO#} zsfD@)9-j1Zhu?)$!z)u&cy(=HTBRnER&kTBKNjTS1{c&rLfF^!9W;G z86}eAPB?$evSG-b{NNR*uBbagmJIvAQnfWQIqoNd>mO-k`WATQ_01~{hvN!uoAdg? zr&~TJT)IBPpxMusQymhXrJY?l%Bnh3->9u1xcgBdc+tBEkrNjKPw zxnV+8%!Qrmvse?Fg*oBYss6Ac#ciR7=y;u7!?LTP$QF{!Y zdx(EX5HU5?l6B_kfO{Jr7L(p|o=O6lTZ&ex z9Y--IMW!l?Fd2KKxxcjuY6T`5(!qSq7AnskfW#NPL$^1`=E>f%m~I{-m%faSk|Z8) zCgTbH)EV0-MJ3Z}E~$(It6pp^H7s4N4k>^BlAEH)|=!jICf}>Yl^85U&VhM--<4Ai^V3aMYzxIB{5b0EujR&YNuf{_kVv z9#}NWeT=B+dTC?Q)QP_=XbRBPw+{GDy-K>5``p7tzW(K1QmMJY5*R(n!O1&ZzuKP= zatBs*DF-m2-YXcpp#~x35*N_eo3wvWMF_NL*d&+`(DNy75jO6t9lA>J_m|%$&nCb7 z2xZSA-+uHt&w2FxweXMq+{d5&9il($(eFIxr=Rn#>t^<~dp?FRLp!KV0kypVS6r%C zx=K1#D*}guqbiqOO)5RnN(pAvFDXL?C{uz2^oIr0USv=etVE>KP&RRmMi~vQ8M*VTG=ocv-$4wN{CPot` z{jtg-z`2D{Z?w5e)a?MhjfJ}Nbn%4gsIO=tF6K?fpx5v;c+zk(>JNYEzto1~@zMTf z)%5IYDYOJ(E_ewk-0JncqZQydPksw0K2XmiU=NZH0GL8RCP*bo1+110#lu$m|P78(G+Z@CO_rY66~~ ze*{y<7^o#>A-N7}6X7aDnS9waSqKO+a!E@MI247dd=hFJAq{Yt`B{QQO~4WMW)=yk zDu6(74TARov5Ij8F0CdKcY3)TBfL^77o|4HXB#ZgPHA^)KdyhhL3+cJZ31 zHKIjlFSM{&SvY?WsA8lGK178QIn_Fuc7d&Rry$Bxb+ku6AR1X#jh8aq6Uwh`)`{pv zc^=a=01%DS%|y!8TAqg)fR;h6)y%34U}bG+M`;>4dD!|8w|(iFAd1Xy>Grq=6j*vd zZA{Ox0K3ti zJ@xXkUy(u6JUe@wU=p6to8>rhG9zpWw)AQ@&*FiJS!pCb5Sa!yq_kuXg72O=C2}Ey zAJdJJfk|iGZGHAlc#(ev$6Zk-Z(#iB(PheQtL)3%v4N8Gc1}31lP6mV$fmV_ z(!h?X)O&wHV)A}-V8yO9bHi;fwOzvn`6SdG)O3f|w=4!7QgLnD%i{neg5^Q#oGN9d zeo(UIgS7!;gQjqOvveTvL$k{zC3!EgN`@KLqTFwB(7a};mIPou1G6mBo@xDsuxoA> zXCaUkGnRQzoG67Q>2IZ#01zdU+!T&wld(}VWZ8fHHx1tH=%Dm!rLjD6+=`!d+;r(Qb1~|s{4dU0u`j=$Y=`uAbSM-I?jFRo9{`u$s$o&8B$6b|+8~HR=RipKiUR+#0k*s8HFRdBJ*f#R1 znmbEHTzARwThQuEu)DK*^YWD#v|YJdMu2n53g^;u;6Q|Y;4-fS8QtY_GDieXeyD%u zj@)=NHSHKp10Pr@ZuMlf^R^Dz*d(Zy`Un6e>6X^=*82MPn8fX_iYFv!oAmqWFTKD; z2tGVi%jztUNKS;K!f~(^Y_A+_9bQ}sEw;T$zKzv}c!~Ic_$%>`;$H!(F6(kh7KoL| zhdUCvZKTS`3NTn;%*ZwvwiI+?R)>GqDkHCvR$HfU7sY;HICcxlQI|+%q0W;SBcnoR zEs3D3A{7H7>^e5wu>3IZY~57Fe00 zD~=0}>+X)aoHtVfTkZo;jOj2^aK@;2Gn^na32x$!oDQ+TNe`VIMYJA}lCXbHIwVVe zOcoJ>$tPnDghC+^IzBE}XUk>I!3nt|mL-=~!h&(e=aY?qJq03NV}S6fMrN1GV`XS| zw@gIlMcVvo&S4sl21mIJ%HeW3WwvgEg&0tQXO8H0$~>ddVSxn0Sr7`!l#o@1!0$$h zkBaNDjWZne=sAX0HP;{+kL+KV+0``{+l%H}WuC(Sy#=)XtU>;NC|B<9hG(C$4 z2cZN3!@zUm4lx9$>yU<|ixz*7Bd8JRT?1KOXpcbbfND~supFN<#1Ghlch>2Xxum=r zpju-OLFS02s49O9D)DTr*2uy^FYC*RN}bq07|}y%Aa$)UyU!>m*ENr{>Z(vXB#r~( zFtY{=73@cndM&YB_aACRPpLFeAE{g_>z0r#z?%JF%JQa;ieP2=w|#WwQU`yRxrAMoE$rnmjz}zKNF#kf z%A;fxC;xCQfMH{}Ego3OG@^|{Me@8>jWaUu1Jg{JCbR>OC~Vxsj}}+$(2$?)VCBoP z-DK%RMk<-e9jPEpwQUC>X({4fd)URa`jB1KwuR|UK3;~%kAPhJuoh)aRB=la5(zY2 z4EguQb0U8`iWi&+bhKRZ{#`O9L#)aQ8MsT`fmAbFL4;J@FVl5G z9OgaVeUPFO0r3h}>uh0shHCsRQF3K_efhwa;~Z!my71$hO*bUt ztr;98e>n&@SBVYZdazZsWfFHY08)L)&pT@y2i9%NSha&~uWp>cMZUiD7Fx|X*=QU% zc%n0h5`6Kbc;3of%~*4xVw}0Q@5I%s7rGfqqw#z@Y^DdorZ-@WxOoRaa_W5Es^(Fo zoRxoCnq0vu9aj(lLW-r0Oom}QDyu^#@`o$s z+e)mBGTqk557Fd|$RY}l+%_Oj`SjuL=3KvJ#i%hAwe+Bw98K1)YAL;N*TU(YsvGS7 z7HNg_blM)wt+h!sI5hS11MO4M`BlHB!uyqqIN_A8zh4EGZEWL_P%*!8zxGjkipGD6 zo_;^VbiJA;mGaj6;e^}9ayYg8ek>+?u1}}hdwV~?Fc?%$0QqzTd`@gF$h<^T?*c87 zQ%R7+Tu%BvlA_6$n*Lxe#*=Pz>e6Ioer|XRIUHVw=py+jJ*~;{edb~H{EKOGa&b#v zICRtPH*FrKm&0zc~B%Eih{5j#W1CD+9wqsVaf%$SVAUVATK#{A$3HuKoH zO(%4-axJT{f9QlOhxhL#UOQh%Sq$;=@xWVM^#ZxL`(-ikg5a&q{jYYf3p{@@*!?oT z#W}(5U-5M#lGZ)pe3`xozW?>Wd*~rLH^{1eU2(G#JYx?zKUPlQ)uA#A0I%VDucK;UPb|J-Cm2L>^x_rH|G-QLlo z;;!9CpM6$r?tVpSVELck9BhBCo>@D+c4hssO7o;u*@kbDR>-8fCYpH)s>mmdP|@WoDSYTC#~afj@!ZL(qoOu^XluPQ zx@)+(=8`E^Z#$&?!6tuny_BZ!-P&~%4@QA2_h_H01(H$cDz}!X;Ik;IeZ^C1nZf=h zDz>4@^_`jO*%Y(wbCzH-Z;9D{gS}^~%com@>_)e&Zw>};dY@+>KlZb)z9ZERc1~rU z-9FdJHfl&$PgjS{wf4@nLC{3C536@mzEbbkU$8p2BqF~xNA7?0ORu?p_mggz)Iwi= z>-^EP&wup|Z5ll5({H@(nwzue1&Oqbom-#0{aiiq5<>&7%Wy^QzTkOhUzD`_;Z;2k zNSgLa?bwNC9wNx0xiS3JBn{#QyPtb<>#d|q?!=70vd5h5Em4g%!wc^@#{a)V+TJlZ=R3GZd{W;=eyC$Z!v9H7}j^w_2fy-CE?v7WoctqnQ-j&5Zyl z>Qb8e?vu$uN5Rsg|KyC2^vxCzj%s188jz)_A}^$lgeEeR)#EFO7mk6}g@#O?-5C zust7b9V>P^ZF1bNpH3F$oXpMNe(a1Z<%(tZlvp4yp;mRgKxopNN#{UTx8061YE74=;NLkUi!^aQYskZmE2h z>ck0y9Kuo#LAiU)7CA$b%h|fXqQE-G6&n-Yf0+U{+$-GC;FW$}@?{v0G8<6!M`8oE zLO_3BW{|?gXlS<{EGNMrEE>&V*;*t|&RLAR#x!+7{`aXuT7Xga$YvzR^V)5b*bPo{ zDqQlWMOM^mQA%d2IeFdapmGcMwjJ{IYGF`yauoACc=hwPY&%-4JBtpN4%JORwdKR` zl2Y5(t`i2*C8x_K>!;~@9apV4R)RIUv@m~;){D`yV>hT>fg+Pi*!`;y9@MFqc}a~% zPX~k3aVwr2R*U3Z1Zwk$*N8pDLamdx2(Q~A$4)19VhwIn0Ppn>gCzrdo`&9U*7TzG znpR@##gJ^i{dkNYQ)hpm?n<8ZdnTLWeOY9E@z%?i#h+ci{QcvXFaO)+%kuIo|Kfix z{ED;m@=^M|qLW`NpCrz5E1k;e%1=Qr4SRi)BSw+Tj4={-QRuMWHN$ec9TjPLa7obD z&`q58%L_>TSuv7nx2~t%Y0h`((D<^b37KMK#FKUoymXba9>E-2Tg4O&z@!?JPb#bKSnSr7S z6(pAuRjhe;Cy}kLIpTV8a;JFT>Zwzz(_3Brk`=_K?@pFnl7hQ`a;x-`mT0ed&Vd_V#TL#KL5iqH;sIF3NvZsu|3t zU53I;t63e1OXDi}WbMwZG68R_@7v`l#yd03XLvi}xyO4)jN0sxN4op|&7+5lhPd4g zmGAFu5s1_GIs5BU1*(E4z$CeynNx$2e6tjwNJEwa+$$~@Vz z+m(}*^JK@~L3-^Cm3u4is(iTe>B@hve5>*=!WJDd5!Z?rikFI?68DM!EIuNBSA0=? zT|6WHNgBB=uaTEH-|b=f4*4GWJMszn$MUb`*X1+v@8x&p_elfHsU?5aQGGR0$J9x6 zTAfw5sGnC4s&}YgQ;(?+sE??Rt52yX)ECs()HCYu)xTLSt7ENM*I74OKWV+zy2rZL zdW-d-^$F{@t>3dgV|~GT+WK4T8@6vBw$IrY?2GoV+V8PHVgI)M$M%=)uiAfSf5ZN^ zCYMI9=mUC9U#D->KcRnb*RRy~>9^^}^vCok^k?*+>;I*{WfZBf$Sj$4vuOrqV$Pcv znpd0GoBPaL%!B4(^HK9z^QY$P=5NjaHQ#gQot|^hIp$pJT<_fM+~K^!d4qG0^MLbi z=Y!5~I*&U~IbU-A!uf0G8RuE&ADw@8zU%zEYrBCvPa^4vyW@Y};GTD1vs{TH2S~3as&z>&26LBO46q z^zCAbM`s2YlxQ$b)55@8$Y=NKcj{zX8(fIC(WETsD8hf_^9-SE-ANxM&L(DSGz4J` z2Q4@HlSb)S6X_6549g@37Rs#p$fV$F#xv?s7v->_>j*(aXjaxo_GX_{V0jmMCQ1ZM z^U;*Lg_W3C_Ng7?Dcj9^&@jkI-Xzfc|qO5D*c3>S7u)$MU}4KI!;Hsx|rmXd>dbp7l4X`z|1ijFkq*n zDK(#d8yGcWV7UA`&rqj>|^OU4C?(-~^X zWSN|%TodW2o&5$kZ#14}U7~MR&yci2pYeB&h~NR3FT&P&rzAEO7D|tXuAdG8L{H5d z=7oXaF8Ubb9K5+GaIYyfeLAE*_P6V1Jn9ZJ8c=H31QQI;?QfA5n9{uL66G+a)I%Ou zgrI+;g2bd4W<%<^>7$SZrb(ShMZRF4C_N(Uw_L0nmSz(sHJ3@ll4qyT;GRB_h?rddb#K^U_6rh3vK zKZvAJHXEi%F)fkNVJaF1FzgrGeJ+y8m0E$^pYt*<=L?Wuu!NBVTVR2ggM|;%8{ZAnax#$jsbr7&mrAfka;#LW~^U6_tp)EqNSv8=FZ) zs1c+$L>IUOgMlsP@n}F36OYNMNrv}W$@K1To#62;==M2}4`vUC)sf)d+nM9e5D{rI zW6Ep;rn$dG#HGIW$xx>w9p>HhT`B7lYfDg-w~TS`{hrU@{Dh5?k~HjQsAF=_?Vc$-Lo1_1Mtgzyw& zz;IpE_~|x1bWFFVQ5%pb(wHp#~gn2a&;AZv^U+tCfjBkF!`x+LVOw-A2<(*lByAy4_O zpOgM2BV{nuec(jmK>))UjETRX-nzgWfTr1=5Rd51GUSh@L6?*%4Hz*9FCU{G816xx zDcGLL4cbY~>=Lt2kCICwhagrygvh{Y^RWdh9an#I{;;c<n+dmfR)_ zYbqi{Jhrg4+odyt1bN)3Qy`_n#wl+E(OncDbEFs27mJcX&gi+qLK-&W?IS6w^rR5^ z!*q(}OF(g{5}rh&4iF<9A`+V}M3TP)A4XXc^)#s|M#_x$Z8?n?z>Rk9&~qG1EFsNV z@S2{Bgc)Rw^PYb%K-@A}RzI?_lYb{&D#>EBfNSQX>6Uwg;%dr|=;b4#2aDW^TCr+taBJsA#y`CUBDRFdFcB}zJDI~~J>d@_v(JtD+|Ww*ga zd{5?l>eeaxYLysJbtrh|iTmcI#tqtRa$-{exnbeC1;Y>XRt^wa2}VI%yaW5nu^GFU!$XtSrechHN#Kml)2qWJ}!knj;^svb8qB9C2KwK6j z$by(bn$XK1A#4NrbvAfY{1?y5y)eLF26}&XPsI{Nt0NTM?D49LRCsl z8zaCEQy#(zf2|y6Fv2QdFGP(SO-&M?Q`+)W1UL|-p9ZtB@H1kaqfUhQ@ILT^dYOMv z4%p%C=&Urqh)QlyE>7ZNlr)K6W2-+!dx>7D5Vw(jurc1RFHt76^u-&5ZT|{WxS*!W z1A>$nHLEM$K@V|V(n2owD$JY$(xjz~YaynJ_}yhF%^)SM0_aOSQ?k<)KJj5-JokMF ze)$#ZiDjhcT6T_NZbm)D^Hhp3z!ZO@K0V?>QT!(%+L#qTff!w$Z#~9W5eFFzgPH}# zqf55XNVJ{qWp6{9$uI(~jb%O z+!!G`&Bo*vqLiJG4=z|4W8l@?9+614Hk_#M0p8X1Vpo4Bk+$h_tt|&R zwXW;g4tU7L1GLC37-6jLe6la>$k=*Lff31;3WKDbI8~82y~2q}U>r1&S=FfY2cXa< zF_ISp$XiClatbrdxWsYxbw!V^3=lsiJ1pJk;yAvJRENd$Uz54n(XmGzbZC4L(nf@z zqmLv`G+0$}ogE8k4#+HhvOTu65Q!+l79beo$ZK^l3;{+6R-5HP7?ET*#6+>g?xf|L zfFvrU2{qc2OK2K@X1XX=G#4e%dJumJbY4v+tix?)g=A|I2R0E>a*YDVM#tH zM$tSmzSh2$DvpR$!ofxo=7?*nBu2Ql5Q#=suXO2XwaT^`GDk>1Dia}`+YzP(%sR|) zSa^^U7zE>3#XB|l5=yMp9luHgTxWv-Q^_@`JOeY3T@Nxfjc>C(PZP&hWqa9n2JjJ@nZZ~KiH)>269f_!`xkZ8B9nEXFuFDz7vYixEc z44EL7a7!mH#;itNPHJ01Cu2%MSR3dX6u?q{G@Jnd$OO#|L?j}8!AI2t%yP~1nr0wT zD>4po1&MnDqlubmbA&L1Qn)E~JkRh{IzYFQK+F!vDhxHdF^Dx0=m=zyWG_L&FG3_W zSNLL|&;|u<7V9Fd0dmzLZS62}0r4k2Gm1&7fTGZpFmQqDO>_-xlq;2x^E5{T;RH^9 zjQAN;Cm^nsoKeYxWr6ZG=jy|EGO#yo@`tJAbB>_yb0DE@c_bpN2qr8t`EjjgtBIk_ zFlIJKVS@|VJw!P^00qI4hEf%LBAK>UAas>m<_XZ#2GAUw-DR-?7uA7DE=zl@w3PS! zhrN&Gi?n7g1}t>no12})b4tXHp~r-OC}>yqEdsU3BvLjzWia1J15@`%Rq4`$1oH`A z0pOb>;S~&~SWhy_nkDuf3XC6_oQ&+nPVbNYo5e01kiS!L5Z5QVRr)_}XZfh;@0GMc z+6ZzsyByb0qGOcB1ZEK+(;#YG#o)W0ftqc!3|_`ezk}fNQn@u z1iH4GJIPY0fIKM8LU&$zNv&N4h>Hx@i_Ko~a|fgOV*RFOkkr=fy3uxn5yweXnQ??h}=VLY}fn+TV+w=2DfUP^i$f5{3vqR=$98=6V7FSx#w%o#PhL@ zm@zU_t4`E#>uDIc0jgx!Q84PaEj!wL^XAR1Rcg>}XF928&24N4sTY&W7^P> zuU0H~J<`DL>DZymmD}hv;(A!k@AQHQ-C9rmnkHKyBn!;-_Tpk<6;;wo3utkBL3KMf`LF8xN`3UAeEP;~u040=7Y-D7 zzu`X~D8v_cfBj?X?jzFLd(L}RP}YtUY1j0-ZC`ZBRKEEB3un$;5SKpx`Fq8+^#8k} ze&2n&pAhP7Ajad!3vFKGpp?du%|DFDcmbiI;_qW6?f?niTyWbHD z-|2o;G`4sDhg{kH+UCDriGMt#P|f`pDo-JL3Q(d51MTkD3|be}mJKFh)GjWrgUqaI zKCnyt?k+JCf)HnUI@s($?h<0=QBjApxj34Vt^)KogQ;TKcSoHNBP^nJbg#ZWrfEDZ zk;WJy4C||t8EPtj9sB=$#Z8(H)S<}##yaY1&hX()M zCw>nSjs7k_KVE)*Ldb8BRD0mO7au7RQApwH-I#%qJ)jYPk6CNEO1w&KyeViRUcD@u zzUl>okeu1uRl?|vcaH6bt?FxAO_~VlxfHtO;-(4*`6e`VJEQ zocqoN{&(xG7cP8f_xFYLH~p2KN^~uhqDhXZScFl3sY7qm%TiCJbSISpE((^E6NNBP zmdSY)-Am;^`6s)#l732d1d^XrIe5^Ee@+*}d6QgW+m%N{vW<&zO8*=5+dE2hzu3?_ zC%Gihc!PB1^RWb)-LBHrE}8;d&W4>@z!mjnveH6|loBV$gf|NJNeod=Z(ePj}ERnNe+%WcjA^87b`G4gDm zyjlC*_)t&}x0c-iw0-ulk@HLKlRDy-K31BO?v z0(hKbU}Rum0OBW%TYKX9ZN4&aGrs_eFkJQd;DSsuUuNC}q&OIuKs*3R918sa0C=2Z zU}Rume!&0)EE_;1^JNA`22@ZE06xS5?|7VJU|?WienB2)*+9HJA+_|tw06S^K==`# zodEsjYYCG;av*;P@CbkjatYK51PVS1U<&371`C!9Gz@SIjttffN)3Pws142y@D2zL zA`X-f7!SA-0uv4sR1^Xf^c8*;%oc_g>K8y4To-s3`WSo|t{EyBiW*ED)Ey`v#voK6 zlpwGn=p#TU5+_V2W+#Rx(kLh>rYSrrb}6nY+$%CH5-eKUEnqHYE`Tn$FXAu^Fs3oO zGek4iG%7a^H<~y`IF30GIcz!nIwCrJI^a8OJOn(RJitAoJ;pv@KG013O-ZR-;8T2t8~7Yw z;7fdkukj7O#dr7~Kj26FgrD&Xe#LM29e?0Y{Dr@ARs|#(V>UJ8Ur*&7+5&m zghxO`!h{XBvywZfiSaO&JV|BChBu_k#%{>7Cg^`!EJM$|gD3X>kji4bz1Adh5IOKN%2 z@w_DGN${BWE`@cK%$JcrC8?tIXNPGWD$;7J{JBF~1>u#8jPzKN_tsYwv@)@74AH7oCc$!??<2pPHl2vd&(uI?tu1eNsA&005*My}mhHXk}q!004310000k0000s4Hx7RXlP|& z0043n0000O0000a2fGAZXl-004480002!0002! zo@LC2ZDDwD05<@0C;$Ke9{>OVAOcJZ5pH2^WdHzkNB{r<9smFV=H5yf%y4gWbN~Q! zXaE2L#Q*>U|B8h3s*?x-L4Ur_IDvtcfq_AUX%CR>fzXT(7z`Pi7#NrsSeY5Hf`ByF z6b6R}j1MZAUjVsLU=pYiL;wKFdkWJ40C=43)CW>jK^R5hGce>JlA|C9qU0PUiR7Sy zlB1F{M)u}nW+&M9U6&zK-|ON1-KPfX)c`3#a?l*aA!(9Wct>m`+<%Ql_mjzt?#E;K z(Vn>OCmtRj!!@RB_&pw7lfvG3D5jD|IvL?y7TM&G8|3hWJf4zI0fiJ%ObMlwQBDPw zRPl^zYIsg9b>a1bdK!31Bd>T(Q}`4uw9-a<*xx}XU3Ak!FMaff*8qbIh3hbH7-5t# z#+l$Ple}Y!X=a#Zj(>R;SY(N1-t&Qvtgy-_KC{L;8*H-0HaqOH$36!f@`bM)aU4GV z38$QK&IOlTam@|4+;JcNPLd3*$)@Km5jQGFEBJOG&CoX8P_)v>V#nVQ6osp}k#(_I6wJ|LHMwuGi4H zK11jF4V@b>bboHp(77Q)=Y|cPdt=f25krkpLya**jd6?iOc?6DHPo9l)O%;BH)W_d zZKyY6s5fhYCmsJCdSw`8cdY^e9%Q164G-bX{d6+^vML%mOidY=vT)(rL5 z4fQq*^)?OlwhZ;Q4fS>m^>z*Q_6+s*4fPHT^$rd7zJD0%eKpiOGSoXZ)H^ZMJ2lih zGt@gb)Vna$yEN3hvgkYK+EDw(Q2W+U`_54N-cb9Sq4sw}?H`8PKMl2i8EXGF)P6AT z{{pd~OGS8`l)Vd>B}a88m=Tc?k?+i#&ztxCsC#c!S9MkOeO9ZxtJIB}Zgq=pBw7z7 z)TXgOAb(jPSr{4N#Vs>!0xxIzOT&4%y^tQ=l{<+5z?pz|1rWgwd=JzHI0ZwNFhBU#VYA+ z(0;cgg-^tw+ZptC|0d)95i*{QXWL{pJw%30l7EiU(Qt=MhiQg?9)U~hBu*3j)!ock z5=)`}x|8v2y7!mDlf$kbbDuj_JFM%^pxOaep5}qYYOE6v7ZP5>9*-fEt?Yi#~@<(~2-SC7?nV-6rEuGvo zbxE0~t3F((cW6?xw5j$iO^arutUKt+*=UeWpl_h7CgVYWgQ)JCO-I8lQGFX{X_GWa z5<};7JG03sn~jq0M0N+sC$3q&W-YreZGRnYy?V16`_Ox45;YS)&-e8^`|{AS4Lb@4 z4bRI*y zeC1v5`pO3$`SlMj+OVJgtya^vwHuWzbfCH$6h?kB#$le!rZAjIDVAN?+Z|63i+@56 zX464`HXW+*PoQ;!c=zmhI#6dPSPbuw$`~YUU0nqIu}xC!gp@p^8{+(svDXFMb?z4r znxSM4V`NR&%W*^ZT$6KRkqtAt-f?7N_WiO>$+?N{JC?5Nq-%OdVEjOYq8hutrI$i3 z1ED(}*S%QxY|4oy^s84W@jvXi`hP`9EN0G6lsNlVWFFiacA&p>m%}rUo&Nb(lx)k| z+_$xpQX9FWDoKesNS%VbwU^4B)q3LV@^KP4F4SJ~*2!)z+vnfok-G6yQzi^b$ zqs(%RaOprcs5o1d)iDUGKk4tQMzlTL49yxdyQY2UL@lY?y!v84^=gUjn~4`&Wx=KH z>CHncXLg$1>JoE%l+>VYhNU}MGpNE18^af_mICgimE~-y()3c8b4=u-y3aR_-g@-< zkpZ&=I-NLfUd`%Z*Eo5_=6~^FTDClFx>3jzv$R)fKd1ec_O$jNNknR70KK6av_U$3 z2@=s@vr!>GJEV`zUS|_kK&hdu5REB{*g~CPr)B934>hq%CbKczU@}EvMM;_sK^skH zBP=pKLg3Uo8GtrhXE5v1WE;D^Nj6a?M~hAdQBC0DiRxXf!(cp>sDI!___z$NhuRF_ z!Jy+}xWFgf{$QBKqSGHkT}Ih3g}M&9X)#`151I(G0JSKzWZa*ms=`H;)ZYjim5op! z2E%RA?}#`ZKoc{(=b+C526}AYxm7)e84yrLb(+@t4hVNHv%}T8#{$9P17V(K7q%O9 zre9{&oKhbiNEqWBWPj7qc@$Bd8>aB2MJP9P9pr_Dpkv{F;kqa435;MlrOvNJIiWE8 zgc>^6C1^^%>UJt+!K6+FC_E!DbVu55;#pq6&N({UzXV#B`K*=(HQ|Gn;e=W>ICMVk zv^LtUf15{J93CH=lIh%uphYyUf@0;vr7I2|sIc6M+|ZXxt$#d;V$&6lJk#C})o7jl zJwGCGJ&ts0vjEh%1@|F3r;aOh;#!QFoKoJX=GJOO2tNY(!2X#uZCz*Hb9y&!Ubx)O39X{s3%F(JoSP$lZsI_phT~NZi2$XbcBQ&;&*B5*7?qQyS>?Z zLRiqZ2Gt$vGSi|)M}4Me2jvgjn+YRdw(Qukl}O&Qb}F1^UMS1&+qK) zkjiAaxnW%}#%I@u*AIu+zxamodzL5U;hS$JmHC^=^*8SrO`MHInL;bk(aH z&jxV(%YVJ?{oUEd>HN46SXS(%VOj~BrNJ;tyesPPfYpuFmhTu&N}g^yeYd|Mme<{$ z(}dUZP^=8yo-DOQll;r!o3~@Xm!A`v*yWW6j@eyrX5Ft*YeALbI>?_x-;yY zK3#m!{H^E=1NnAuT-n#jSKY|A{CN5DXB%f%UhyKg9OtQ( zSX8oy&q%R-e#eblwXhYgT>nzZ$w3k}11jZLpvv}&U4Lc6aU#>B-3y>mZ4ogC#DDUd zFo^Ap6VcLL+i#s|y3h@j_9Hg`OA+a25Oz=I08djcZ@Ho5MS>Et#n=tZVn$6$z>G@7 zR6p!v`?N$W>|q-Rx70v$*H*@`G-iMZ+hF@kVERXG5W*7cXV0GBoQlgm&@9;r@@^jK z$IKJeZ2qg2u1;EBOl~T7bo%9ECV#6Qo8PQXFN#LMet!ULNrAxJuWMB^}WoTw?t8b(|(+aCAaat;+ zVcwkojWAhf%a41N-_AshMSra>5D(J_Yq)ZHz4A)WOU&gfL5h|HK(-KU0QEB4lyR6a zFBnKk4JO>&_Y!8d4{jbm=INatunQ`k)1%d=TcF0c*T}&ZeVXbOQxB}rbfh6&14?+V z?)n5wV#xtRo7W6R_UjHa^Aeylri>Tx85sv2F`aUW!68bkj>G(yn15-ITcPC}R$Olc zCM8@Dx)cU$V85b%IqI90n$zt28{@cgwIijIAUc4{9b3ptW9czZn`qD0eiX)XR16RN z#V~!LN3m0p2O$0;Y6ReK+DBNnKtjVQYtU_~&Z*)Vo&uqpOdBX0_z&skXbN|nkgxWQ znz6OfPgYE9oWC<^WPkMg$03}?J{eKwr%;Lpg>AG`04Z9AT!!ZgEX}dV+cUdv5kUPXT3FJbhogp|kl{c5d4tNAEm_ zH>KqA>DD1;>OE9>oS81~W?rrf<7uB6@&n}3eETuzuOC5nHGk+UfM1~8Q6Y!`5rHfM zrkxfb7>RdZohiBts95)VIE4Cxt{bbK+(sR$pfey*at$|P!`g_uQOC~K?zs5M6a7dg zQP3>g$XW?dWM1aJEA{3vo^z7{Vjl?Ov<$85 z0#Jl!JJr<}tbaeB>o45cihR`bhMia?5K6*`>7GpC2(;Xh!LrZ2Qmel{7)O(QrPi_B zh&T4PByb1Y3v1GX@uFl;FP4EbJ*>SO_2LEr>^z3v*alU!PJGgt^zjQqK;Yxg3b*e7;4uPtj0@bSLn86zOF-OnvUBDoDcvsx0gYTs1F5pEXjQaGhPq4 z^c^_O9SbJ%54s8147iC5vTE>yZXy6oJ9=>w_`&Rd+JAi#b=K57dHRQ3;Ub5_D=fiH z`+s<@;D10GI9v(ObsDw*m&dA`KuOCG-uK<4BUR;5x{AuXm4myLg7-@pU=BEPOS=L_ z`TrM=OuES^8BIo$?rd`D2SA!5`@35TK9)>7cGD;U_!uk$d~}c3mwOv)FlRkix+$5i z4TtdW6O%)SCWonh==_m5=p$TYOqh0e3UDzFO@BK)+m1uuYx`xdx%S{>ZEI_dZEsJG z9h)rVl>P<%KeVdWgckfTXgll59nzKLSbpZbfAxj@`uqlXow+f(`eya*qJMorf{Vw_ z9K9F*J9_5W#fuj|dG;(|#X_&z3w-Zu5g<~079jno)Gl$j{cQ1=AN2VpI-D=R>s?>^ zL4W_4^~`^yYj>}#tW0)a%gf7qZThBWX(6;J28~?;AO=uitiDa@mmmGrcYgS-r~AE& z@7|eScP;tuYk!t}`&i?q!|$1Y?CMMQ07#hD(=OMZU+B2v4;0gMRLq}|@)7NVJFwds z%*(D)WZk{eXtRMWXUZ?8&Z&uCoB+W9eSf=g+0aQH>2lrbMB~f*&w1JNV6@HLUAwIA z&HlyaLBsutU!}v!zP4Mowogr-clyZ5%Wa-JN$H7C1T9aB!>1~Z4ZoxbQw&(7aVJ1Pi^UwVAal5VM`Ca$jkn(cKhX(TYciWt%eoDYbAMx( zqtU-(WN!?$s0}1-@hZXV8S>3}_7OavdNX3>g*i>o1A(5k z4d~tj<2_h2-E|R-3ZIG6X}t~8@C{Z)XFJHU-8=!z%;qX4j(0*o$~K=*ld$%Jh<%?!|oZe)OvBEvJOQ_Vr!^lDO= zX|2cfeEvbSR8gtk?Ep(=TU+9MC&Io_K$^XT{`n7>BhLlddnuw3r6AO6@P7k7d-&>i zQJpJh1)U2W+JO#UV3^S^JS=**&v#uuQaPZ~!Z{`S0PG>p88 zG(p|2{_|^I#X*8(d9b?mwxgGghs&wCZ22HT0h?DX-%Wl00XwNVS<~T;4DInt>6f;x zZFl?4ix>Vk5&F6x$fz+$e18ipwp+>?-n7-#X|pbha4 zw#fkpb}#YLXS1nxjrLaU1KNkQKSo}f#e1OQ61M0J3gA2$pa{X#8xO_`sud^=_`*od zRb>#1o;!q^8v)#`zaVXZslh}G{FqD&wl~=IXO5-?omCQ>EJT-$3x6T)cJ{DNqBO^- zK>izKm@25#?XMCA-BF_~{A&|>*35Ng)~u41=3Ct1<%*T;Pf|N72}C}Yh;m_b>7*j@ zK;9e?0aoF<;TeN{5%)RJU@zXNRs_t69YIRjD8_fTqqQAJ$-YaL*B}6bf^B zAeRD|0389E1kI+-UVjVHZsj6?spXj^gV)SbAP?pkd=RwPG>IfHv+NQBjn%2i6ppi6 zt-Y@y$)mckO<}LNwsd`<)ZF8QNnnyXH4R<2Ef!fO*ehxRUDYGLmG7YMj&UJ<4hkZV z0^bURFaim^z#NvoL#?l_W0yWC4!{3lBIBJLOnxYs(8sFvQfnz}HG2Eb zj91f;IsVfAD=$BH>deX8{qEZ4ylfJu83k?a`|5K{JAJ7>Ke#p-$~MrG8+sU)$c^yWbJO8XW3ff>CO- zs2%aaWR@kpBm=Rd@1MW(o$n+U9-4pb$tRzje}C-$`|oG&{A=^Ck^HN7e)-;ezx?>a zr%yk8^)4^l&yFDS0!1XVft(Fy)&X>MQo9PS>@I9` zlYb=Li89|K<*a~Th;as!4GM~8I*Uf=qu^`lhzFI{&q#X}>von^WRO_0u)i1h~tBw?ks z!BU&1kap|q-)!3gzk+$1+;Yo9YfWlXC)?|`E(Wv787B`$lKaANv?Kb6CTexX4^g9LE)h&EY-M(t_U;#f6h-HNr zGtDq0bwK%jf&YubKxV@k=$D1|*?*=0j-ck@bL!=3 z9LKkva$KhCrh>%uEW9*?Vbe6@3h*`jA}!qqCG&an16%4<)U2E z!L0c87`pH<@Lw+*UUB@|6R*C;^Yi@fGtYU>>AQ1od8cC^rgEb6@BhWF1$~rj1MPrz zwRSRRDZ;=+nJ4b$Z*m}>C12qu9I%zmlOzZ0R2t+JIG~*DA*Fy z8rI2Vyv@>tbq6Y#y`#o-jD8Cc+(op1I)Mvk$_c4_tSAx%C|6FdB!#&grx{SASSl+5 z73$*r-c6h+3{ZcA7WD+KgbofVA_a&5k`>~EhZkXGD42E7`;nnPB!3a@dz#{;O{V%LpX=jBF#G3BAT%ztuR*P;fK0hhW-S%;ejKq5jdK}ikJH7DHVwJCZ%0rC7WHR(`1R_dV(p~prop;~t*Q=)NmzPS0^uxoh0Dqkgw{WTDIi3$1*|iOf zsCv3fU|M384UTab;lP}uCWrc0uv>f^&?9+A(HAC^;|S{Ru$W1C;0OmW*#;DN56~b+ z=!YuhN?bCfY{gMkvMtkfLzg)RJa-T_xSpl?y4*G$CvqIK3HpvP7FqyHb-GxsxXj=dn@sM8)8i+iStueY2B&ozXzYM*`qvW|-KWpqfp(I%;MUn&b*p zy*aM}yylEjkI8Bjw>;aAp`~~7{k0^eyb%su?>r;ifPcXku3=#a3w|c15CRO*xqudx zH9dn%=xE1rKsv4M?P^29JOG~j%v+0mrFmuV0)L=vqO)u#t!hQx*&2+gn{{tI(G4v?; zNCf?7`_%C>yJW52{mL~r_wCSR6iVtiJ27lvF@G5A6lP|q8}i40#I}Xo31A8kA(R8% zbV51*x7lFjNQ-9idm3?>b`Gu%egp{>rjeLDi(Q8sxolW^#fQo2RK7$!u+KKk6_)~q z0l30#9Nm8w7R*V<&HD~~0!PWob0Xj}vRBKNEZ}!mXi0%#eW!6`v%K8$4Pa7Tqn%Y_ z3V)(z!~CgKp!SXRrK#l_esnU5YhD>BpCyxbvVE2I{%)h2MwEt0uhCs^l~-WiKs|g8 z>H#X^20Wl%LV^D6;##%|a#7dzq1PcBAwdQ!PXM=IPESFLM}T`~gV-aTb@X|H@ga|Y z_{JC8Hypd-IhSveA_7OX>WB z@BYkt&aM9Jsq0Ri*tdG(-m5m6ixSPz9wxpWFy^v$M!O3Urt*p}LI;KCXV(56i=w>a zV5D~Gej*l5Ya(cAr#j0?P$fT^0$yZHgH6_e)34b%1 z^Bc2XDW>EzY5%zgbY>f&S?6d=r2Iqiz6NlF{SKprNjQ zCOiYme{dG`QRMrQ6Mc0bC=iEB?gXq{aw+sKcc2>J=WU-E;sbg2-U9O@HKwKEY&S zxfVz{*S#Qas_>s9LuoQUi?d1+M7jAG0_IlQhB<*H|u+Gk*qS6{$jkGD!#1 z5$1{QrZo(<$(}cMlnt9iT|-|fTr;rO?Jhc2e2Y=tebsM6pQWwN*0Yb;=q3bQVoCPV zk2>;tDmW(F3ESClEJK=(XG|>Jb02{Q=jWbt)mhTAa`Qq7s2F3eX^DIzw_`_dliyBm zNWWU=fcZl(hi+7UC4cl`duJ3h`-g?am=Q#lZ@Ci(6s_q5V)dA3z~M+rY3%t5>DSp+ zz}suUU00xIG?@K972U~UG6Dmn-1l7&bj;)H4kUg<5W7mIYX+F(D?I!J~i@ZW4oEQcLjYJ0+{Oc;~DhDu03rFMuoSFxKQx$R7 z;Vc8Hg`Wq;vjeE6W2D;3+^T#)9Pn(4{Bz;`QC~m?03M5lqaAH8y$fcB&O1Pz^$OA5 zifuTo2~-kn)_;9RF%J#KiqUr20VxN7gI-ykU3;uK%%fhlorVB$of0TNW`Z{B#1#ZC z40D*8Hq2fCMaP@Eyjd>;UP;`D0!WHP;P@W21b|(g3YaE3p=F{=o!#~@2n!>jWCmDK zYFU6fq4x9>!N0VLXnv$@8!p;#BLK1}4BM+`-UZW?V1MO=kOo0BXBf^pHPhp@(9)%C z2PNAOdwIg2*BaVHyG%O<{a!e4yUM_fH*vl|zhky9W?oKMcY@jpNd0Kx=1pK+W<5}u zqXgswKgr{OCZ{*7zMOf7pc~#5^+Fn8Tex)N6hPE7iS6*gdzf@I=@gRoUuwH`4!dl08ny zNw%2lkApsMX(Me4tyrhs{vt)aTN+Jw=pt5?lt!iT091CO+~T9@aI&qEufUqqU*VO0 zI%srC^^9F$Znf?mU-G-AYo2GlTST=2!+#4!C4Xu}a(?H93v?8>B1}UU=F{^hF)uL@ zNZ04@B{$^ef71{33|kUrb}Y9YJ@e2DFI>tO+RvEsb!k22>5}O7$>@XgryhBPY(4U~ zXV3on*|YyAXe@93k8j5RcIU@8>Hnq)n7!ZYlO0U5?>_#vw>?h2{fP%2_ymm}yZYkA ztA8J3kDa@C@!VsJF;40K4t=w%9n{XDy_=ws5{e8jY*N-K!ge@|b}%D$IuqFpK(CMm zQ!bL{3KJ)RL91LgWeW>WJ^i%MtHBO4r!Skl=n7Eb<$BZu{T@W7rSno?PQ=09bbEb# z4=*JRAa&NXXS;KwX^5umtu+OUtQWn))PEfjvD1g{y~(5RbHPkmJ1imD>PszO)XPE6 z{K&FPzHZ&uTt3l0bNZM4N@AK|B>FS|g1KTEHKW&E6QMlo>5dr%ZgRW18zb@PH$hT1 zw9B(HFSj|YM9YCBwm_-ff7*JPG*HBqXuGgIupb)KrK}#&( zO#<)t0KqsGVXK@_PQUrgKRg6%bHhge%yF2^Ebgzx*@X=FAEg|=+{=j%IEz0GoRG0& z=iSJ6O~;J@APBmZg9gAO{k9WmIa@cVzAM zM!P-#ee&h`7Wwd<$KP@{8P2abOztC}ZNZ6+)^E)(lKYeS2k*Q3p$Ewa=8uuuu3vPM z?E_gGYFBF4C_RpvWVHaLb@DyIIMgZq3F$0SUR1gfI>2Tf6{woP_XK(xpnuaUNk)^w zZf)6qzQ6r~gYEk8#;dMRg|#}n=HUA9$DeyN!rbclQzwrcK7QiJ&Xp%#-Cd$r9^M8- zs?h0$ylGld?eSZ(Mr*CnqQR9X4jlDNbL+~NG^645hp%qM+&XvkCJg;ZbN`7i09CZniSjFd^xBg^3&_5GCrFVwk>e_2h%|AqXomc<-Pk){uYmwR6)VB_v zeD!hihQ(EvojB56=%jUa5O~JV;F#emhDETih}4+PagMR?rs_SmpSfak6Q!B4K z$1Dy!TuP?L(5}50c+6g-ZE3%xJ+1wBvXA^Yc`x~6@-+E0`48kXIA0HR)ry>0WkeO} zc+mM&^!HM4m5UM$+U_!p>0nIuNCi-hj>@nS87{0)skb8);{}W~DhlDy3?{?uK)QGW zS_(|cLj8xs3x5-qZs2+%8BaJmH*xhxchsPnS~)gT6tmEv(^;}B3K)=Ase>RQQQQ@P zIrm5^icmphcfIQfzWaO8dRC+k7BxVHf}uFPyUL-)MyN0~HUJuh3=N)j01O&FRH)1P z$_tCaIV*BkMqPyf_WEMC8-~-Ny3ugTbObFj%jhveOiY!a z#UnknJe?3ae-M~c$m?ax)+NiM6rE+t?U=VhP+HxiE2(4nCClg-%^(0Hg9!?@4KpWq zqpr~kfq$#Zu5kt2zh*>DqvPWu6fhE|)AFO{3Nl1E=vsRHP$v*Ixm|0wsY3t+3k+>L zDP~NDmQjG7H_Q_&o> zBTOX$*epF;asxxzFl~pz@l2qmKobvAhE7ghEPuNR{^(!@=A?Imo|^;b zwAI`Kvk2(dacf)MFfe&)rX23W7>t7ozIoW7MTAONGo8(^qJEJW&xtp7_)epj;v4=DZIeV1+I$(u4WrB z3NGV!(l4jkP9f-ON{kPuV)awa_6@C_MSj_p|? zoc7uRs_#qNixO!@zHlUP@uU)&kzn&CMt=zfLB|cI<#6B-CXomwbd`K7&BrK8l7(k6 z(ug@J0j{pGn8Z{IhDD(vaQYA~5df*g*1+#*w_ey*o#L&TF@>8(rWdDPY+(oBxj+VX zWG1rYd*s*VZ@=kV3%vVJ^rKn;8WHn<;$r>WOcA=tA`^V9R31(+S(qeTgo%?aUVr2o zl3T7_Y9I5LY%|JhUg=$7xms>CYTa9(^Q;NTWoRd9wH`Rj!;SvRsd_7q>4(1goNkNr zD@;G!H?*XY^fPDas^Ly_9GWYVj%^0fbTDjo4Q}q`N-(L-FhUrqpl*MxYITSt-692P zFZxrse?+RX+0}V;Dvi6nPJ(XY1b?v31e=8m&2S0DLZeTxp%_V4d9Ug=qi?j(*-p1c zxr_cyLIbbS@B;isqtwk`Dkn6UFm@YE+=%JBXIY#$`EU!yix@7TAm2{RZWNW|=K7&L z7mjZTH?;b2zzE`=9lDNh^E^LvzSHY&hz+xAMxFDMeCPsn@5O;3OHtnnU4Id5mf4~8 zO?5u8{Y$ur(0>B!mTP_JomfST$LqwSeD8Y)nE3bp_*#4G*j8J;k^ZIc4}H(!m$!Gn zweXAj-fC_AT^rw3sl6O+`dOx977IzD(FC+No6OL|LGoKS^4lNz_y^v5ZO+KU^H&4& zN`vpd<&C@brk`Xl(B7#1k$?85$S2Y5u7Z6@+$4oBb#F~0fV;^UFzW=f$cm&A^zF$a ziigF(G-4)v@o$WySQtgP*HDQwdZUWdXi>KHBKin+v=6r~tZ6hZa%Z71TC<4~kRtl7 z+`?+nq&nRn$cCzEu`IPoQ!r=)wT`=RUd{USq<-aegO%dvH*&q^T7S;b{q?vUrio$J zt=ul9Ou%gPxL%Dm%7D8f%jMxVC?764s8}AO=g!CUDHFJg%`Jyhf>tGRE#bvr3pnGZ zWid0gFytqw2TFy2rUqkG`7syc6P#Na^SB9W#wM7PgnoYmuH(AC+$dj$div0DAWTl9*3Hk07?iC3?ph#p{d!>ZMefdi?TmK6_Newj?UUNKRNiiaEAK_OfIPS$1`|am zQw-*UN>KO+=qiS}r;}m<#t86p;o6T!vqD`ISTP%9`bVluqrXSlKfjQHwiWhwF*!23YB(h6!#s((jd(CWSAN{w>o=a7h-W*$~c zgo5L$&FIXA12^XT4>VjjYME}%B;~+nN+(O{xs*9z zqf1VS>VF}$KCg(D&Z-;h3EU8qKbhk;blrkVY)PFOT;{dqxJRCky5Gzi2Vt66*liAL zgyo4}0XtzBX%iinXsQKEJY1y;gen*F7aoJg1qzxl08i)AW@@GHZRQ&-!W?vZ!VHzU z*ba{Q)!V8ds^|Ck?$-!NDQK)`ljo9~$t~nHeFqY+JMM$0q@_S>XOv`71Nm2T1ry^QYAE9jN<41FHG zfj*z!NPmRBkiM9{gx*f?q<7JK=ugp$^tJS->3#HP=o{&q=+Dy!=r7ZU=_B+}`fmCg z^nbVM2kB$6OFIgQI-+#)< z02|n!fo902sIO2ds2hR?;Ug%58;(GWJL3sS#{FzG=s>-OKEeBmj?B7bk^pBc>N-m0 z0L~>ot~!-tW3Ncuh9p zRI)=hCH#U9JiGS+rF>-kqru|9K&Vd|ADASw1FFDYX-dA0>#nF$mduPKRlYw$I-oGR zOgE%7brlP2FlNG;HA>vbl&3*$iMwDz_TQ)TCy|U?`lIw4z&GUl8>lBhi+>TolJiFd z>*|cWAE<#bpTGl7>d0SqFdBCptTZ_ZYDGUR!RR}<^@ItALRA1j}&ySrx&f)m+ zlZ-q@8y8=RPb1_QTLakP-Y|bZRO>OSH5O64X|@;2<16lzCGLvj$4aNve$Y7DhZ z5Vh#FjO@o{!t{~-H5KUMP1b?q{17Gv(i4oGL~^~&RYk~?Fd%Y% zHI=Td3-V%2z>#wPIe$!0rzC>GB4-{3^Txi&=N{VTLtN$d=*Kv@4Ttr8C=0m4Reut$ zfTHFTf{9PzFh4Bbf%aCW*d2NfY?Dl&f%A7ue9ru}Ef6>ZApGk<9!Sa_0mz9GM0?OP zzXUh?&#(9ioqi3Qpw~o=VMzQ*s_$Sz7Wp_6bhI;EDG6q)5P(gAWAT&l?KS9o`I8HdHfI%FRYgi8AqiZjmVbp$XY`Ht-1L$8cV6zyYD1vm z8!Vgu@y#D40Xb~;!&dIKcRAkM*;#Eru0NN1i*P#|1v#4zCdEqeg?kYQ5++>(KO^6D z;*J}Y0>km@7Bp~_o{GE?;KkrrZ{TDl!*h?=oMbmjj~%r9suPy8>z4PYQFQqg$&dZi zt>+o&P=9kLNoYAVT=T#+Rw!<{)-*4z%h^vqt)*H;YiO&=i?O>2#RxZ{Q2TitA``WM zNiAY(OQ3BFTOFZ!#rzU5*9je!+wF4DkQ>&lTidL`zhC^t4{U6#ZETRc<~QCpnUMDl zF55C|(fp@24_qLxi>u^`_C_lVx~sK~t&Q5oJAa>k|Hh}jaQp4_;PSWnTk{Xb)iY{y7s#MUl1=v(p-t7^Jj#iQUAkSY?#>eQdhV{JQ2zV=Vztp=kw1f1 ze2sA**S1@}X!&Mn1;NpkoQcNzXkd0tKX4M$GBKOcjglT%4dK~Qqh0NuJ2+|f;^lO< zd4E{PeW0w=1S9f{%Q%rv0(wX0z7YtAr@dT=PRD2(9;bF{8JvR6Fk8S(vTp911~)l# z`xVa&%uvRqbUU(LopV{eG)@xc$&xnE4rwQ~mm%{4Bm^)9_YqPstXnGfu~2yKE@OqlLk{&IQc+gq4AtSw*r-T8-CR_GhQ zySDPo=U)Bl_r7=SGs8Py4gbA&?SE?Re|l!Bb(A0J2S1bl@JD|B+H>z?r1Ss%#6q9^ zIsLraH%2NizK{c!MT2RvC7O&tFZJEH{oGFCt=)9jO)F-Sua_fp9EEf7oSAYQLcUAu{}4X>V;D!1B1OLZorJ8$_7lW`7-O7p!7| z&1kl_nkw5}23jmNQDL(NZu6l+tr)hz^(ZQUgB&G|7cR(R`GI2VLv%c4yOVk}oUD^c zZ-(0o70VcuqfumP*A10MGezp(9ZixkD5xp2d3bczAB?+7q4vds?-$PnLL*e5cXt6M zdI#8kU9Xxd-Fu!mUEJI+Fn6A(UYyjKQ(36GRY@qY~QFx9{t(xPSU{NEJ@?u9dN=5EgTdrexR(~i#hde{xm%Dia zco!g-yDXgtB|!kmsqS+4Pf$!@7r>(lwMAfnngd!d0~4T)pVx|PIRqOPw#TI=4=n@$ zCanV=f`>U#z(i`wvIV`Q69v-H<$;^ENrT_WswGndQn!dnBdG2ni(=^1X6U~X$|;Wv zpBZ)Z2~=7-qE(gz1Aj2h2zs5^%t#F^DqRbD67V`R{cv~Q#UQKawHIrz)Lw`CyF|NT zJ>_mv0sKPM1Ia7$p4GC`q}bSPZ*h2G6Fh=JUgbLN7XdUCNK;ul9d)<|$7cP3lI(2? za)r8;Z+1t@%~Wg%G>d>$p}%!pZh&nRn;XSn9X#_ zO1w7zBq7y`>4Nwex|=)%z{|vhYlMa{+N9<>5}x8jIz8RDS8cXh@2tcLGi7K7Ze9;N zUAAuoNKJqScYj1`b99Fy$g{1K;pPRn?Sj6%QZL&e$f5H!XXr+D`7p=^!Lh|S5Wm?? zL?jrPJEuxc)$$0Jff?KhOx@YdGm62ky%xq!>vfA*>IRwYCNrWVd7$=jR4Ktlt}sma z-CgZ=wM+v>Z_-tvW(-|`az!WeZd_L#7YW=EXZ^UZsO&yESAYO`F?ZN(3_^AwP&B&3S?|6#r(Uj6?GJr{? zTNItj0p&2Q?G2l`BID7KDol;g1sm!(poZSkvdX>aaXq5KGh**kYC{>`e(}L2E(8oN z?x&?km49rlTrz!88<&^M4c`nhzcM{s54T3n9dR}2+?UdRvYtk+O*qiil z%Af@(jdwwo$W(e2_U2+YlVZ;V`Q z>TUO6-e041`O|!Wn`8*)mcuZhdL~0r$tY`9mRCR>m`xYZ6g0*+J&X6}|LP=_JZ}hI zV#ImoGs65jXY@{slNC@f`o_}o!ILX~noF9a#?dXi~1%-0G3(0yIKw} zoD{n$_cS2#J_C&eUSFE*_o^rfPY+ zQdD?lip#`in1YnW>1ayc#w%$gObb+kC4WE$aY|+w$}K@R7*w~=BkVRW)A^uOcJiI| zi3^AJH@!frB|I<^p#6_5bLqQEyJT42jK`~KyhO~@QXAPh$ zm6Cl^8w3Rv!~rHY*~uBkVu0G3dgvOKNljsq`&yL8nzPyH3eCV>?_%h9~lt?}!9+ml5@w2*f!a4eo%!3>n6TBaGGS2D_UZCRD{- z>@E6(_D4~BKJ31-#a<7+#c$j-g#=&yDsg|GdTRd3&wS?IM;`fuKOpCBxn+JU931ZK zko*u?IZSpAJ#~2d&>=wGhn_fuk1BxJCjFXrMtiw-k9ME-7LdYsf*gKZdj`zFI{6WD z5BWv%Zt}b2ljINSCOt>b)0fh_=xgX3=mYd&`YZHN`s?)H(D%{bK&G(RwP}Ei66Aji zx1a!V#D#=tC^7qEVK6aNv)COqn-)7Q#G?bqG%!YosZ{Bp*g{xMg2^HRjNxRp4-^LQ zc5~onyI;VD0^2}Q%@!*mr+qm*LU7N)Y*9{PY?)zR&uo+kl@6WacBvT7QTwI>zZ+%? zeP86p@A0_7?hnjkSy%?N&T9R`09AjEr$U{+UL?h+%hbvxT+_5jJ5o?K<%_&Ag%%Mp zz^m{^fEEMfAXM@grWvah!XsRLRjgq_x~10Bs`Rs7hDa9hX;)6w)+b|JjiXY}SlTR} zk7^V8Iue+q23_14fNC6}bGR?3xYoiW(PlD9NL*}?w@PrsBHG8@X9op0&pLmLJm zM-fTQ(qhZlq}TuhTB)+3p}SS*P8Zs1k2YtRHKdMp#@Rr|ic)Wo-Bh4Nu}rnIRUtrN zF&9atshI73lY5)f7GEa)sqBnr2jF)sV=Om<7Kt7@lf`f%WB3^Nvdv`BIWX#G^rOO# z(>n9@N^E-oE-EtwemX9{pk9B*gz_2s5l^@)ZOhbIrztQ-Bw?DP>z986a8m+S(&MPA zfQ54gYThuY#LXl)djhwT)7g9ALx383NH^e<($ASN&tcBLAC6N?|2n9)sE1iUEE2f4 ztOr1PGJ6k@;Z&sa0R*AiCkRG!ch523ouoX*`C97N7QW4 zsUe2zjHUsk0IZLtq?PJoC+=@?{$G$I54`cGE}kBDlE&6bXO2)r4-6=(lEG8R`Y&hi=jkh9%Is#QxA5=;)4X9sp53269ynB2(4@ z9T|@B%e7KFgQ^lMw0f2i;IfOsU?r*r!Uj{ziD_FP<6`CjoihU;+6LAPo?&}o$(z*b zAS%!uz}$e;Qu!84bI)5VNuaYvh8x7_`(N-*V3)n<P@1y&s}pl#?%kbbTyX;B=8C zhAn)|f8c*K5_U;KHSChh9)n?oq0mn*J|p}@)q!i0sh+E?#VK2(nDq8B^ke7BQ+-=R zN*fC-sIdpMPvjX-N-Ub+gd z&i33CYQg^Qeggxrp(-{xR{U0J?QW+|)V4^)u4lV8a)wE0)5U%S*>Fm}zSAC zez5uxKuhFy$!pEv@VFA%(8){f^gb^Re9QLk+AfL$aV?6{+kRM4st?**R==5VuWTAD zz^#89m%FCRELXU;X}fo}m)IvPKL|bQ|IMI%(EJ~Z0>JmUDtcGzQc>tGSNXl3q5oB_ zhd!uXrCqPx0zLN{?ac}w{igP@VpZ1nZCF_+?Sf7gP$kW9p%pGe1!FmbUg-~t@6a=o z1bREk0P+m6|0ZhpG9guFlyVP^2a|qx&`p2wIBtlLHqom(9ZXa<6~)Nig5bvt0O z6QS-rTRZ{qhH{VL!rWv6I0l{uPZ~|fgAx62wb5j9WUyH^J-b>8EkPI>6Di#4wf!R% zP$|!R8B+jMY`UzoE066E+T@VL%@N2DS$Jx}oH$1@L=M~A^lAM_E}F-w1L zz6!`6RCxa~{V1W{yuOSdPr+;ya9GG=-XC}~4PzZ{vht!A1A zxlitMA{fsIa6sFujlM%WT;>Gf`&#X~?^M38u2WE$K6KqYe!eE0N8kqa68gl?3Ks6>BgZ%dzl3*O{k z!*N%X$y*pda%7ou+ba7qcWmyM{q5t9>*UFS1Z2};$J1T~6lq|`U?BQIV)8+AXvMBH zbHi;fwOzvn`6SdG)^vx~4_FL3q~hAPm&XA{M#{s~Ia$g|gP>%~higN|hE3u6W@%sG zhh`7VFvjUkbbC0*?r#@XT1|eQ~@LmZX0m ztpvcVndBy*2AfQbnjy>XziRMlNBgB$D^29#V^;j4W2RdlxjnbIK*t!aSpueBcJpxtE>X>6)A9Z0)_=7fXzQA-EN#a zang)I|#3K!6qp0|NU9rgNc9GneM8ttUTWFpYQ$u_usU7 zITm*&XJs@ur=M_MJO@xk$n7n2M39|bZmV%*^yJ^w7?N9Wp{AW6Ht>OK;#N;rJ8$o# z#VQG^l|F24l5S}&Z*6Ywj!E3kR6HR;+oa#ee*Oh6!s)S6XIY&k63K~hR5%V+g59;l zt)t6pWJ7;dJeF@`wIyC6-Y@=A{Db%xfXK_bT#*H0#>lUf$WtR#Mpl5qMhkgy*|4Rc z6SF$B7B5#b@-VrJ*|L}eF))BnR?fOaS_*ZZ#26M0vX<27cGu`3g1{Loifj=Ei7KPa zy6pXye|H!&tlJrLYF&)s8W-dK2wJbi*d`S!;eUUV{nR-rIA^yz>T(WD2_AX?CNZYN zNT(U2zRz%i5KSzXos!cbHhM~DeL5Nf^$7b#w7&jzNp-v7J2}_2@ZL4>Z-=kD5r!BUluiFU81TCx;>BWJ9HwJ&08-HK!y=9i)jj$!`c; zPN?v#rV8jpy9Nk$`i9}duf!%)|;wf0$Lb^H(u!(`)40yE)pd!$XjO+tuV}q;M95YykPe6R}NN!UW;b(<%+@#9mfGy4%;{;!8Z0 zXkq)c;Mg(182vsYV46^R%^)Mu?>9)L>7-Dz_qd20lg&^HSIE;B>C;&_J{Hn=&a0b~q{vZmMsj1NjaFx=y0$Sv)xisR|hOo|ABhAUO4gG$dWL{DXfKL5)D~ z8pzl}djw*rRFfKoZON43dO#K&VT7fGi^{734mbAL&-6@ORqXaTCRQ8pzv=1q)kLLE z>>rNkp)`@YR+!l{%E@)jBdxkF)F~3j0a2LQfQ1V3BT2oHSg!l`H5yN@X(D8@+LQ9p zO+;K1k;RHrpsre+&Yt=X- z^FA=mq-jDs@UU*>CVsTMZignQ*BtBsIJTRt>}8~qX}BX5gsHaeAS8b+Mbv8#yI`vi z+EoD15_^-6mmvZ!u#E|8SU2%akR~J&h+VL7V>~Caqj<@QFpid63saX&$q>6!LI&i5+ z0gUQ+ezd%a9M*c%TI_$150N{o(`7FW+(y-r;2-O7tLbJYh&Rq&Jafvd>O+e`eOjE~ z1iB1XI+R@7-CRAi<2Z*}M{fDi?WP-&@zxBElfN8<+v`MzZ#&$o+A@i|8Nj8!9M+rAT5uUzV8 zB#p+4?Xa013Y*@5@!l34fWoN@d8?X7k#g2*X>u8NbX-9o94VGI7M_RgsH}#;!$f0< zaBirLb|aggFv-;sTh8v<$TM+o@2B2>{k8ugN){J?^2V!v?sXkg`%*QlRmswseQb+P zI37jft5I$?lG=YYH>InqZ@%%u4d-4{uP$7Fg_X6d3we>$EbAcFM1F{D(xu9XGx1?U z9C+^g`x50#p6!>h!|TB|#dIRN{NZxBx)L{|Or16IgT$N>Sw!Kn+Xv(+pFP^$Ug)>1 z7&Wz`mL4>dISplB(0F1P1}QojW&OY28UQbKh!=GU0C;PDtthx zh?7U@`Ug~C*~T_lB{aYOfc8;qi{^@+{s7VyyqYGJ^0o)ygxkh)I8FQkY^r&#Pp8`Z zd*Hw$7*zIvVmboWCbn4R93Q(26dGMq&?CZn*|-VYo!KX`)8G&XM23Eiw*%PN2De|N&=!w2^guU#ypEQWabSm3R% zdx2b@eOU~=Ab4Bz;H%j+fhPvDFXLOB6U_dSuN#rH?g{71^hNOfuLs`457Qan>@1#I zY`5v9b0PJDQvv;WsTLGG4f@>+FUN%0N)wgC zVvm1N<$!A`23j1MLLjZ_ccQSoi`K_LKgtYBO(>BU$ z)w9{__>;Qe)!Qi<0AEC0Pp7v1$TiphwN8KaiN#H^#aFCXYbxqT&g^x<5}ihD(I+Kt z51N~G@@RUS^<#%?sb9aX-hSQzZ+}{y<2GN-tDD6>m@L=jY#ppv00@Ue7y&wwPZ({Y z%av&O&~eVYphM!h(^W@BZTQgEW@mKwaC^fgQ>@;0NcqRjt#h6${p4W)V5YT=^R9o9 zUi^-fUc_5;a?Oe5jp4CF(>NE+>_yYHcHTQZh&`pAb^I`bP3U?lvF|(WD28r_?fogJ2SD$Cv9nbJepg=3zuE!DQYNbKC%X-&U7TxBS?R zZre|^S+%TzyzWmmOm%=y^cJwAX4U_L_N!V6W!Z@RyP_h#TyF?#q9zw~;Qn z3mktr)+XCuq8e+43f^~)2b}LmLVZ-QfMCQUXq+Fw{|AwbXtd^tSeM0re^ij+9@c7J zI_>YYLJ_;Q$c-)X9o$AUDR!G%0n*K-H1*k2$zeyq(xd<6jF9xrmJg3=VXYdFrKut> zq>h9pGL!X_YlxeZfqD>iej9(sZ@lH@gEc>tGH|N4N7jyIR(DT6fA!|wJ}0-!G_B4) zzY<{?6&r!ditNsn!A+x^cVgojAExLQO`4{gU-!z_+YP^#7=M4fQngNW^m4@26#E<3 zKL|R*Mo2jhWa%itgfZ~u9L;1rCpTm*GWu_c-v{}L^~qrevDriH*fM|2Fc1-zmy6Zn zXMXbPe#7_OZf~pGI&{lUiYAUd>HN@3c=%R0<&6tX6N3 z|K>PLk=IyKo~IU&SRk#)^*m|f4HFOJgSm406GWk`-PD_ZqOVhgrHKwf5mZCu^ZZar8{fVo|5GljGOiSCijNRH>#yC$(4oa|Y+*bmH#S}jV+Of{#k868$`;og3Ve7#y2RGl2f zOAlZ9ydB$)mg|4cvcsiPb<9WcCX}Vs=Rhx~qV1q6#jHC5( zwCdOmYFD7hq!M=j%EO0s>SbP1quJBJ;B4HACr8yXITwN2KIS!I4>6&e*kvc*(;>%B zCw5{DZdU-}^$?3H1ACFC-f!0Qvi6!*V(aCQY`%lIv>$&_*I%w}Bl4`@GuagHt0L=* zw_Um<{`AtN@1MMM>0d8hl9yij=Xc{*Tu(0_q2J3o`Ni@nqAa)4shq9+1oYCd*Ecz0 zwaLsF1Hb@<9s6A~EZOb2NXvsOg1&}sV*CSMKFmUtEZoHd*noWZZrJOxE2~&6q3BCL7rJk z_S~meSDy*i^Y_L_x82vpk(TEMiWn+LE+(qj@a{<>TU~X`_2T3%@xJvlXH=)RzWyaE zh|k`WthgivXMcRF^pfPhB=O`qFYp%b+W6weO-q0E*PJ=i=}GIgXO&U*M$Z}#wzh*xBjV!vF*E!7C(_UrcLbgn96OIPBn=|1)$IlXI+YJ7`s~Q& zaG@sCyA8SOl}oJ5o>VQe(&EY@*|EEo)0GQk$KFYL?G2UtD(|j*sPd`Gf3JM2^3TE+ z9WfDCix-NQik}eoi~lS>EPh9PQG8uIBmRF;8o4X4k{3De_YwI{`Cj?k@=5te@~`CA zmlpo)^AzAYkk`Kg7viZH`X_7-#%)ew{L&3 zZ?k{Ney{y;`?u^rvcGJ9)&5)i8}_#~xiorBAJQB88hwNQF@1-ArM_RkT|cfrsz0tj zt^Z8_Fa0f}NQFga#cY~wGcXf#!MxDC+PvP}Z{BJiGLM*#n9rI&F<&=-WB#xCp0num zoWsru=W6F#=O*V)=M~NyoO_)Io%eq@A8>xddBXXO^CjocoxgIPah`Sl!TBfWyUxG4 zwi~#MB$AG~r`+q@3+{{Dm$|QU?{VMgzQuj3`*!zH_kHfi+^5|C=6==vTlbspKf3?N z{hnt5S?ajh?T!t$#j|e5?9Quc7Y1npjoi$oFC9TiS74Wc?8x*jqkH?~X`g>%hVc=* zW!-6mghxSl%!x(!P!*(a>chqq_vjn0LplZ0U<_aiGM)iKZ%UY_NEY2aIY3)->;QJS zyb!L*OVvEaX3B_<4qMvEyPof+UsqQS(bg@Lz_&+pgo)XB6qxDah4 zrYz_v(uML2A-&y6A7$hwW@j|Sz!*;6X!IwI(y^wYLskVW6FR$J%qxjZ3chAMA3f@# z95!?vq1Xsf&H9Kf?2`&C??TT6-2XHmO{rU0iHRkG6US4wo9AUXa4LVGyQooE%9@O) zbbN(PpKgJ5oQx6KPT~iH&94X(-`SmF%LaEuFyM3qb0}*VU{#P5;`lhu7e~d}aar~c zbW%56fIr}x$+SPnOm{eixlg}+Z2qH?=%~m?#n9BL9izOU?qHRELeDEvD3Gd8*YBL9 zqg`Dfj&c`Ykr#lfjs<`2l>yInI+{}R>9>JdBLarYuk#Ese$=ep>9B4<++3Z5F3P(A zft?KT&v=rjJ#kr^=n z@kQ7=@05d$g@w|iq3fqZfXY+zhIwHixQjmKI0tPm3*2i;O`m@bsgM2Lx*3nU!;B`B z8a4rg;ko@C(gIWB%Px%^=9GHK^NQd~RD+ll!)!=BH+>YP0GrflsK^)W(@2lV`Yjjh zhNamArsh&~Sn})?8r0LLA>y9yj%dEHd&9Gl@r7BJ3%@euOu0-%zd%guDzy@8sJy=k zip(?6QJ;ok%2R(tm-bBoa}M1+A%^sfoQA%ijru%M7-K|RV{eAod_3anG1RMah=~-Y z*=`>kP7SKlWRh!`b#xyCLpI-3Pa5P0ku=KY(=;ijCCWKW#S)CLU+ng|5GhxtMXYMh z%eb63MSj5wW)5V51zrx>JW6j^GU6eiK7o?~+>a8jG_QZ0SIcBN1qSZ4C9^Wf7JPuz z2+ie63*9ZoIcaMys5a??SG!jT#{B`a(VaV}qMd_8R*^QC*RjbpDZ9_bj=2T^iGXqA zlqdjrKvRgBqr0N=aqW*3ml{T&)y>T912bvn{v3eQSYJfHAg(MD=- z87ed$G^WE+>UFYw1o8qO;G{kxh#EAfye|ybU`Y3`=MVuj1yCWlA=*-s$}Ta$2pR^k zh`ThuvBazuJjS~;1ZV*8D@h1XF$Y|Hh#EiLrH6lx>DDxB0}@3V%)(#J4JP4)M^@WgFccF?T-NaFqu*txNmi|l;fcxENGTV z?~Z>E3soQ=E8oe7omK3R(su)cOk*Zu(_wkt?IYob1jAG}CYbpto0r`_ktR6EOi>At z<|pq0DrEruO0t5U(Va9j4a*3WN*afCOF1kgJZOS*%r(i_I>wU31EAYhq2r2t2vs;W z#2^`f8X+bS{Y(msrlLN~&4}h47$%UnIg5W-dOC@gI!-L6{RVZR(*-=sWDLfGtT7s7 zM>iagsQbC;l8~p~LI_L?2s(x@<+pxL`j?E9!BF>s`G^Mr6l^di`ht4v0(S+PW_Lm~ zqPNSCKVpL}DN~v-B9JmDemI!o9@LqF?U~%5oz%=O5&QHwxg>Ik!ODja8JJQg8sdM- z3{cuc)%Co?v^w13B3Y=9H7LW(8$*ardMfj9e@Mhfa$?t@>N&U(-9Z5m5CL#KskMkD z7!zp#0gUJtgq`XBV2JjRRfjB!-2ubSnX$Z2NXK8RMWMplPZ%L=+qU$&(n%tc#FDNC zSdbD3UufCBW!o1K`1=Y(AG?khSP?cc zg+rJ5*n*Xgs~JbZ)qqk!kfim#1V%x$390l@@A}Ol$q!2g?bc*Fma=?TtVVWdr`Y>uCGE(S5#8iJf@L>>I z3`boUBW1?>whX5L5Jo$9=sAuhRsi=Pcumhm;vmp7c+Z!5X=SpkWP~_naTg-6$zrrD zV;dh$x7_O#SKMZg$t|Jd6^5h1nS=C|R|1jrg{+r&97qhj5~tAz-;~kIijiKligp-H zLf94`#TK+K+lIS%p5p!I@(h2C;ZyT3)g03V_u*&($sa8#evhxW`D=^Y@;)IR7oTJ_ zNIb;sBTpzR5#sH1s+H7?6I{WejQqp*`mETH>OJ)5ix8PiGtU4O%J!+dfI*oE(WufF z+`&4UW?3&5;&Vd0M@YJkLnF8V5IRFo{VWTGr+tZWIyw5D>0La* zqa;DSN|fV_?Q~2N@@h36^r#RImE8sv@jaRHsat30kCT#jYHe=5vemn#+@Cy#m48D#W>LVUskf+$WD3^RYYWSC=}oc?yT{0$5^ z8vSMQO)mFLcUfo3#=L<>KZPC|MnsWMa_8u%MML=uC@+9MTaH!s0T*F%cZIkF5~BP5 zJbhf4^NU5D;t>ZKGvJVAYxzms&$v9lLK4ZCOJ7 z%o#-(`9>1v%vyia!y>zj&M1fgaY>Y5Ghz=1FcMP!9nt-r@i65fobZ>+c?N$Wtn>9k)VR^qB=I?=El)*& zMN;}{5E~0WBQ`neM2HU^0N|*Xi89mW9q6nyKZmMpP%cj5VwNr1p9Eq(C@VcWmRBV15ZebdlhDZ=*c1xYg`L4RYdPD z#?%W^(kg!uP?$3%J6+)u9R|j8--qCrU!9YEwa1 zYdfQ_5Lnzn%1DSvCL&57Ty5I{rpB|?ib!ZKqlkYri@^wHDwPSR$nX?`%4I5`KS`l3 zGtMuWl~TJ(yQa+aQDq>JC1NE^iTez~j!5%cOAE+^B5g)zI&nyXUU-cpAYz~~af_51 zWUZ3W&_UA3aJvE`hz8X~I!l&=2&nV!O4Y5!)F|TU;RcZ?Q-ThHv<}(pXMvkAFIukj z=pKI-O9CUSD`pKG9M=6v1>givIaMpJxx}(`%Ie}mU^ykZn=p>7l<2hzb~VxjGEi}7 zka9#sOjHCyRxXc?4@pnM8_@W>bwSh^Av(%gGV2;u`$)>_CJ~Ys1C(1vL~;roW?Z5;`X9<5Ue)KgD@h=Zit9tiQP%dH-U@1Bq#>QlN)Fnf9ARX@EsAY)1q#IHXq~ma# zSs~e)#DR@GO0GBH_$W$c`6x{X;5_0J<7@3}sp5!+N;ud^0*|=1N@9d-3z2A`8%URq zR;z5AA#;TEqcRb~xgB9z!0rTx!@`4*s2sYQNl=7Ex|kO(vI9SmRSF~kUUsm|SUt_zi6j?%k{&`uu#-{qOP3mf8gRYDPBmVE9i)gOea=lEI8^kc2aR= zNoou>DNLymX);k6lVpYsPGK#^Go!Kh90V*?N~;>P>_`OGDg=R6@ks+kQ45zR!vXs{ z0FpP6F8v5pClnB{NMKZJ(l|7lkZYx%0E2@=WwC|sLk&2r-AUpC@|JEy5=yMq9luHw ze_UsS0IcL1RFQ!h$gT&On#Q-;o+rk!RoPy)ok4sI0ZGGQ=^A4R;K3j`tv!e2s0*(N zT#mA#B!`FtJ?L$}5yM&viCln7q5=}_wiT2AXY8e=Dp8Hiu7x2J#1d}l#Kquh)Yzo9 zC3G@a3c}hz*Pxh{qUj6(#3+b25Rr)Ve+3^E48Y}@`Iq+fzf24uss|U z2Ip~8>Uf^vsdRvDMSb^FKvp4fF2@lI0R|)~;#h2jveO|IBB{Ar7yE=ZM$l%lF47vH zrybJP4kNe_ebO_dn4}6u6q*tSZUB%RYPO98QwcdwJQ@fmaAL&Ipwa+QEmSzte^oX7 z1R8mpF-zb(8Q7aP`NP!m1xHZ#Igrq{JQ5LB1QQmBCb(9!)x;2wm@}KButA0F9-_1! z0MlSeL#YZrkxW}F5W31O^907z2H+-~-Bqy$7uA7DE=zl@w3PS#hy9P`3%uPqkRZtv zZ()8C^OT4kLyrkjoUZI!gwZ0Ce@NNvl)-!>4NTo5Ri#T062vEX1%Pi3m`@OxVm--d zla@GeC@_Cyax%gpJH0>rZyvjFNd9)kL0q5cR_Xt^o#iD`0!I@dZ3H=+U5;xgQG&|C z0P_ft>5xMm2Gfc7=Bv)%Emog%j1HW-b5+sV=>7D1@2u<9PpqX*5-gs4e_mQEPMzM^ zw$3%&R<%PG+?!^f7pJbc;u$}2P}D%B%PX7P%gf#NPE_~eg+?vX+IDKw-GzRzyw)49 z!9`B@Yw$g%hLz)$8@LkoFJS-e0Q4jl^MIYG1Ran_&?vzK4x+ja(&&aICIfx3pF@NJ z;85l{R(!dk%mpXQ(B1JVf5C;&aAaEors6ViK_(a1i+G8Y2$4#lYwNj_tb_^(tkNuX z7p0ff+EsvA$#ApS?iD|MI9e<=Z)^rhZNomQpFNn~s&D5`HvIRo2z+7)XE+$q{C9Sl8nzxwSDE(y7J?%a39)#B>!o;&xZ&wpM8_uv2hugLBD@1K1_{7B^> zX5)xDdO2oeUJq_8deu;_1!i45Ft1sf;kt?m_*ZO;K&xAQDC|f%&O)CyR2i-C1OGl;yh0W zn;pnqLd-k>D>$2rqbcbslt5rmX)ODmQhQ>AMbwV&)py6l#={bEk&zOyzB-wsN7J$Y z&sW@}=|CNcfBbK3qQ=UWznN||&#VS27&K9;Vs+bXEDQN8keZa3ePkKl9ElrOr;L=Y zP$d%!YE6v-JS2yD3RVul+|??|x49A-HbOQNh~v}Wdh!Wq@ZWjzcOlW}@AC5#<>x1b z{02$22QPT>u@V`I6t14d3=r=Dm3_=w%T?l4YU|BGe-rWQWdZbcz*3MidxuIG#rCeT z-LO@CW2Z@ske*MWOK#g%;UM3J=F|5IF*|;Y`nDp)atGj8beFYd&gEGy`13Z|J(W4m z&Jndz*{PhZJY0FS^6tv7RDQMcL7=W8#C20}0b7H)s?KXTm6fE_bchHWBCmNw&JX|g zMx3%Yed#QefGN;cq;Ibw*VH2`3zdz@kk#Q`x2n(~B{x{^c3dL2n&ra=wgVH{&RzoO z3pSX z89*7l8XOwl9cCT69!MUD9;6@KAv7fhB|s%wC3+>sCLAW3Com^!C!#0NDJCigD$XlZ zELtpRk}z5@gfSj6GBdn1PBfx7hBy*9zBvXth&kjsbUKufJc6#qU8w4YX6#~q_mVX~Eclj2c zhhbnCc+2c)b~cu?{~wGa2vn%iV2%ZjvBU{3;396oCESRca2Yq_7Tk*4a69h6owy5k z;~w0L`*1%Vz=L=Q591L$ipTIcp1_lM3Qyx1tne(J!+-O50ax%MUc$?G1+U^YypA{U zCf>r^cn9y|J-m+(a240^AwI&#_ynKgGklIO@Fl*&*Z2nC;yZkgAMhi7!q4~xzv4Ii zjz91x{=yo6L!yO(2BAZb0R|h4u$bWB5pW$5j5Mod2$qE8sg_wAU$?R)Tep5kQM7F5 zYQ=+$0e`Aea-_v+Scf58Rs*TA_4`$J|E8oD{~c9o!~0rUug0bFR(F|=ca8F{GrdqD z2*q6H7WzoHb4{JhHeJ#bA}N{5-Iem8(WRf_1=1$@c-~AKZpfOwi5Jh7HLGYs5@e^E zV)U^gw#KD-C%2|FHC+KfvFf}_%ig5**}f_1kbm2w-izK}Y5FL&rPIY&uKSo>s`_lh zVvuUI()HCKCp#Y`k7R8#Q1oLK1MRCJm2=ZOA4#7WYcr=P3*OpHvZuZ7qiv;lgxM=K37o!ezI~YUJ9h!bSw$Re_>C4uemg2OmT+b{?YN zkV+!tz6m)5N=-PVq2N4ICz4dDiN0_RRm|<71WrqqmbfcMQN^;@%WbMzNh=#B8P%|0 zO3ApMYaWV*RdH!*xbR4ahC?ishSQ6hsc&ef^5<)?aUG Date: Thu, 25 May 2017 22:57:35 +0200 Subject: [PATCH 0967/1164] [seti] add information_for_contributors --- extensions/theme-seti/build/update-icon-theme.js | 8 ++++++++ extensions/theme-seti/icons/vs-seti-icon-theme.json | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/extensions/theme-seti/build/update-icon-theme.js b/extensions/theme-seti/build/update-icon-theme.js index 7f44c3ac245..a2a2bbd840c 100644 --- a/extensions/theme-seti/build/update-icon-theme.js +++ b/extensions/theme-seti/build/update-icon-theme.js @@ -212,6 +212,14 @@ exports.update = function () { } var res = { + information_for_contributors: [ + 'This file has been generated from data in https://github.com/jesseweed/seti-ui:', + '- icon definitions: styles/_fonts/seti.less', + '- icon colors: styles/ui-variables.less', + '- file associations: styles/icons/mapping.less', + 'If you want to provide a fix or improvement, please create a pull request against the jesseweed/seti-ui repository.', + 'Once accepted there, we are happy to receive an update request.', + ], fonts: [{ id: "seti", src: [{ "path": "./seti.woff", "format": "woff" }], diff --git a/extensions/theme-seti/icons/vs-seti-icon-theme.json b/extensions/theme-seti/icons/vs-seti-icon-theme.json index b26e557e5d3..46e757af3f6 100644 --- a/extensions/theme-seti/icons/vs-seti-icon-theme.json +++ b/extensions/theme-seti/icons/vs-seti-icon-theme.json @@ -1,4 +1,12 @@ { + "information_for_contributors": [ + "This file has been generated from data in https://github.com/jesseweed/seti-ui:", + "- icon definitions: styles/_fonts/seti.less", + "- icon colors: styles/ui-variables.less", + "- file associations: styles/icons/mapping.less", + "If you want to provide a fix or improvement, please create a pull request against the jesseweed/seti-ui repository.", + "Once accepted there, we are happy to receive an update request." + ], "fonts": [ { "id": "seti", From b6cb1b7a47f1dfbb312445b5ce4868a611b2e7be Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Thu, 25 May 2017 14:32:00 -0700 Subject: [PATCH 0968/1164] Comments --- src/vs/editor/contrib/suggest/browser/suggestWidget.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index c27e0dbaa95..c5559659a7f 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -953,11 +953,14 @@ export class SuggestWidget implements IContentWidget, IDelegate if (hasClass(this.element, 'docs-side')) { if (this.details.element.offsetHeight > this.listElement.offsetHeight) { + + // Fix for #26416 + // Docs is bigger than list and widget is above cursor, apply margin-top so that list appears right above cursor if (hasClass(this.element, 'widget-above')) { - // Docs is bigger than list and widget is above cursor, apply margin-top so that list appears right above cursor this.listElement.style.marginTop = `${this.details.element.offsetHeight - this.listElement.offsetHeight}px`; } + // Fix for #26244 if (hasClass(this.element, 'list-right')) { addClass(this.listElement, 'empty-left-border'); removeClass(this.listElement, 'empty-right-border'); @@ -970,6 +973,7 @@ export class SuggestWidget implements IContentWidget, IDelegate removeClass(this.details.element, 'empty-right-border'); return; } else { + // Fix for #26244 if (hasClass(this.element, 'list-right')) { addClass(this.details.element, 'empty-right-border'); removeClass(this.details.element, 'empty-left-border'); @@ -983,6 +987,7 @@ export class SuggestWidget implements IContentWidget, IDelegate } } + // Reset margin-top that was set as Fix for #26416 this.listElement.style.marginTop = '0px'; } From f17f097cc9e8a158a9d0af02e66a24addf7295e1 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 25 May 2017 14:31:52 -0700 Subject: [PATCH 0969/1164] Extract merge-conflict colors as workbench colors (#27299) --- .../merge-conflict/src/mergeDecorator.ts | 28 ++++++++----------- src/vs/platform/theme/common/colorRegistry.ts | 18 ++++++++++++ 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/extensions/merge-conflict/src/mergeDecorator.ts b/extensions/merge-conflict/src/mergeDecorator.ts index f6d0135aad9..39888f727e6 100644 --- a/extensions/merge-conflict/src/mergeDecorator.ts +++ b/extensions/merge-conflict/src/mergeDecorator.ts @@ -13,9 +13,6 @@ export default class MergeDectorator implements vscode.Disposable { private decorationUsesWholeLine: boolean = true; // Useful for debugging, set to false to see exact match ranges - // TODO: Move to config? - private currentColorRgb = `32,200,94`; - private incomingColorRgb = `24,134,255`; private config: interfaces.IExtensionConfiguration; private tracker: interfaces.IDocumentMergeConflictTracker; @@ -69,21 +66,19 @@ export default class MergeDectorator implements vscode.Disposable { // Create decorators if (config.enableDecorations || config.enableEditorOverview) { this.decorations['current.content'] = vscode.window.createTextEditorDecorationType( - this.generateBlockRenderOptions(this.currentColorRgb, config) + this.generateBlockRenderOptions('merge.currentContentBackground', 'overviewRuler.currentContentForeground', config) ); this.decorations['incoming.content'] = vscode.window.createTextEditorDecorationType( - this.generateBlockRenderOptions(this.incomingColorRgb, config) + this.generateBlockRenderOptions('merge.incomingContentBackground', 'overviewRuler.incomingContentForeground', config) ); } if (config.enableDecorations) { this.decorations['current.header'] = vscode.window.createTextEditorDecorationType({ - // backgroundColor: 'rgba(255, 0, 0, 0.01)', - // border: '2px solid red', isWholeLine: this.decorationUsesWholeLine, - backgroundColor: `rgba(${this.currentColorRgb}, 1.0)`, - color: 'white', + backgroundColor: new vscode.ThemeColor('merge.currentHeaderBackground'), + color: new vscode.ThemeColor('editor.foreground'), after: { contentText: ' ' + localize('currentChange', '(Current change)'), color: 'rgba(0, 0, 0, 0.7)' @@ -91,14 +86,13 @@ export default class MergeDectorator implements vscode.Disposable { }); this.decorations['splitter'] = vscode.window.createTextEditorDecorationType({ - backgroundColor: 'rgba(0, 0, 0, 0.25)', - color: 'white', + color: new vscode.ThemeColor('editor.foreground'), isWholeLine: this.decorationUsesWholeLine, }); this.decorations['incoming.header'] = vscode.window.createTextEditorDecorationType({ - backgroundColor: `rgba(${this.incomingColorRgb}, 1.0)`, - color: 'white', + backgroundColor: new vscode.ThemeColor('merge.incomingHeaderBackground'), + color: new vscode.ThemeColor('editor.foreground'), isWholeLine: this.decorationUsesWholeLine, after: { contentText: ' ' + localize('incomingChange', '(Incoming change)'), @@ -118,17 +112,17 @@ export default class MergeDectorator implements vscode.Disposable { this.decorations = {}; } - private generateBlockRenderOptions(color: string, config: interfaces.IExtensionConfiguration): vscode.DecorationRenderOptions { + private generateBlockRenderOptions(backgroundColor: string, overviewRulerColor: string, config: interfaces.IExtensionConfiguration): vscode.DecorationRenderOptions { - let renderOptions: any = {}; + let renderOptions: vscode.DecorationRenderOptions = {}; if (config.enableDecorations) { - renderOptions.backgroundColor = `rgba(${color}, 0.2)`; + renderOptions.backgroundColor = new vscode.ThemeColor(backgroundColor); renderOptions.isWholeLine = this.decorationUsesWholeLine; } if (config.enableEditorOverview) { - renderOptions.overviewRulerColor = `rgba(${color}, 0.5)`; + renderOptions.overviewRulerColor = new vscode.ThemeColor(overviewRulerColor); renderOptions.overviewRulerLane = vscode.OverviewRulerLane.Full; } diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index bc3da9fed16..b908d663df3 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -254,6 +254,24 @@ export const diffRemoved = registerColor('diffEditor.removedTextBackground', { d export const diffInsertedOutline = registerColor('diffEditor.insertedTextBorder', { dark: null, light: null, hc: '#33ff2eff' }, nls.localize('diffEditorInsertedOutline', 'Outline color for the text that got inserted.')); export const diffRemovedOutline = registerColor('diffEditor.removedTextBorder', { dark: null, light: null, hc: '#FF008F' }, nls.localize('diffEditorRemovedOutline', 'Outline color for text that got removed.')); +/** + * Merge-conflict colors + */ + +const headerTransparency = 1; +const currentBaseColor = Color.fromHex('#20C85E').transparent(headerTransparency); +const incomingBaseColor = Color.fromHex('#1886FF').transparent(headerTransparency); +const contentTransparency = 0.2; +const rulerTransparency = 0.5; + +export const mergeCurrentHeaderBackground = registerColor('merge.currentHeaderBackground', { dark: currentBaseColor, light: currentBaseColor, hc: currentBaseColor }, nls.localize('mergeCurrentHeaderBackground', 'Current header background in inline merge-conflict.')); +export const mergeCurrentContentBackground = registerColor('merge.currentContentBackground', { dark: transparent(mergeCurrentHeaderBackground, contentTransparency), light: transparent(mergeCurrentHeaderBackground, contentTransparency), hc: transparent(mergeCurrentHeaderBackground, contentTransparency) }, nls.localize('mergeCurrentContentBackground', 'Current content background in inline merge-conflict.')); +export const mergeIncomingHeaderBackground = registerColor('merge.incomingHeaderBackground', { dark: incomingBaseColor, light: incomingBaseColor, hc: incomingBaseColor }, nls.localize('mergeIncomingHeaderBackground', 'Incoming header background in inline merge-conflict.')); +export const mergeIncomingContentBackground = registerColor('merge.incomingContentBackground', { dark: transparent(mergeIncomingHeaderBackground, contentTransparency), light: transparent(mergeIncomingHeaderBackground, contentTransparency), hc: transparent(mergeIncomingHeaderBackground, contentTransparency) }, nls.localize('mergeIncomingContentBackground', 'Incoming content background in inline merge-conflict.')); + +export const overviewRulerCurrentContentForeground = registerColor('overviewRuler.currentContentForeground', { dark: transparent(mergeCurrentHeaderBackground, rulerTransparency), light: transparent(mergeCurrentHeaderBackground, rulerTransparency), hc: transparent(mergeCurrentHeaderBackground, rulerTransparency) }, nls.localize('overviewRulerCurrentContentForeground', 'Current overview ruler foreground for inline merge-conflict.')); +export const overviewRulerIncomingContentForeground = registerColor('overviewRuler.incomingContentForeground', { dark: transparent(mergeIncomingHeaderBackground, rulerTransparency), light: transparent(mergeIncomingHeaderBackground, rulerTransparency), hc: transparent(mergeIncomingHeaderBackground, rulerTransparency) }, nls.localize('overviewRulerIncomingContentForeground', 'Incoming overview ruler foreground for inline merge-conflict.')); + // ----- color functions export function darken(colorValue: ColorValue, factor: number): ColorFunction { From 9f48af79ad996dfa6ab3a9ec9b67a79c5919ee8b Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 25 May 2017 14:40:05 -0700 Subject: [PATCH 0970/1164] Tune merge-conflict colors (#27299) --- src/vs/platform/theme/common/colorRegistry.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index b908d663df3..5f3a474f034 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -258,11 +258,11 @@ export const diffRemovedOutline = registerColor('diffEditor.removedTextBorder', * Merge-conflict colors */ -const headerTransparency = 1; -const currentBaseColor = Color.fromHex('#20C85E').transparent(headerTransparency); -const incomingBaseColor = Color.fromHex('#1886FF').transparent(headerTransparency); -const contentTransparency = 0.2; -const rulerTransparency = 0.5; +const headerTransparency = 0.5; +const currentBaseColor = Color.fromHex('#40C8AE').transparent(headerTransparency); +const incomingBaseColor = Color.fromHex('#40A6FF').transparent(headerTransparency); +const contentTransparency = 0.4; +const rulerTransparency = 1; export const mergeCurrentHeaderBackground = registerColor('merge.currentHeaderBackground', { dark: currentBaseColor, light: currentBaseColor, hc: currentBaseColor }, nls.localize('mergeCurrentHeaderBackground', 'Current header background in inline merge-conflict.')); export const mergeCurrentContentBackground = registerColor('merge.currentContentBackground', { dark: transparent(mergeCurrentHeaderBackground, contentTransparency), light: transparent(mergeCurrentHeaderBackground, contentTransparency), hc: transparent(mergeCurrentHeaderBackground, contentTransparency) }, nls.localize('mergeCurrentContentBackground', 'Current content background in inline merge-conflict.')); From 6d00bd977be02b60d2c7f1f333fc7d9270ef3c0b Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 25 May 2017 15:18:05 -0700 Subject: [PATCH 0971/1164] Add TSC Task Provider (#27093) * extract standardLanguageDescriptions to constant * Remove client variable * Move VersionStatus into a class * Add TSC Task Provider Fixes #26079 Adds a task provider for building typescript projects. * Make ts loading lazy --- extensions/typescript/package.json | 5 +- .../src/features/jsDocCompletionProvider.ts | 6 +- .../typescript/src/features/taskProvider.ts | 110 ++++++++++++++++++ extensions/typescript/src/typescriptMain.ts | 109 +++++++++++------ .../typescript/src/typescriptServiceClient.ts | 10 +- .../typescript/src/utils/versionStatus.ts | 69 ++++++----- src/vs/workbench/api/node/extHostTask.ts | 2 +- 7 files changed, 235 insertions(+), 76 deletions(-) create mode 100644 extensions/typescript/src/features/taskProvider.ts diff --git a/extensions/typescript/package.json b/extensions/typescript/package.json index 461cb773a4d..b039fac9631 100644 --- a/extensions/typescript/package.json +++ b/extensions/typescript/package.json @@ -34,7 +34,10 @@ "onCommand:typescript.selectTypeScriptVersion", "onCommand:javascript.goToProjectConfig", "onCommand:typescript.goToProjectConfig", - "onCommand:typescript.openTsServerLog" + "onCommand:typescript.openTsServerLog", + "onCommand:workbench.action.tasks.runTask", + "onCommand:workbench.action.tasks.build", + "onCommand:workbench.action.tasks.test" ], "main": "./out/typescriptMain", "contributes": { diff --git a/extensions/typescript/src/features/jsDocCompletionProvider.ts b/extensions/typescript/src/features/jsDocCompletionProvider.ts index da02e942bfc..502cf89c42c 100644 --- a/extensions/typescript/src/features/jsDocCompletionProvider.ts +++ b/extensions/typescript/src/features/jsDocCompletionProvider.ts @@ -88,7 +88,7 @@ export class TryCompleteJsDocCommand { static COMMAND_NAME = '_typeScript.tryCompleteJsDoc'; constructor( - private client: ITypescriptServiceClient + private lazyClient: () => ITypescriptServiceClient ) { } /** @@ -96,7 +96,7 @@ export class TryCompleteJsDocCommand { * if possible, otherwise falling back to a default comment format. */ public tryCompleteJsDoc(resource: Uri, start: Position, shouldGetJSDocFromTSServer: boolean): Thenable { - const file = this.client.normalizePath(resource); + const file = this.lazyClient().normalizePath(resource); if (!file) { return Promise.resolve(false); } @@ -126,7 +126,7 @@ export class TryCompleteJsDocCommand { offset: position.character + 1 }; return Promise.race([ - this.client.execute('docCommentTemplate', args), + this.lazyClient().execute('docCommentTemplate', args), new Promise((_, reject) => setTimeout(reject, 250)) ]).then((res: DocCommandTemplateResponse) => { if (!res || !res.body) { diff --git a/extensions/typescript/src/features/taskProvider.ts b/extensions/typescript/src/features/taskProvider.ts new file mode 100644 index 00000000000..76528021983 --- /dev/null +++ b/extensions/typescript/src/features/taskProvider.ts @@ -0,0 +1,110 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as fs from 'fs'; +import * as path from 'path'; +import * as vscode from 'vscode'; + +import * as Proto from '../protocol'; +import TypeScriptServiceClient from '../typescriptServiceClient'; + + +const exists = (file: string): Promise => + new Promise((resolve, _reject) => { + fs.exists(file, (value: boolean) => { + resolve(value); + }); + }); + +export default class TypeScriptTaskProvider implements vscode.TaskProvider { + + public constructor( + private readonly lazyClient: () => TypeScriptServiceClient + ) { } + + async provideTasks(token: vscode.CancellationToken): Promise { + const rootPath = vscode.workspace.rootPath; + if (!rootPath) { + return []; + } + + const projects = (await this.getConfigForActiveFile(token)).concat(await this.getConfigsForWorkspace()); + const command = await this.getCommand(); + + return projects + .filter((x, i) => projects.indexOf(x) === i) + .map(configFile => { + const configFileName = path.relative(rootPath, configFile); + const buildTask = new vscode.ShellTask(`tsc: build ${configFileName}`, `${command} -p ${configFile}`, '$tsc'); + buildTask.group = vscode.TaskGroup.Build; + return buildTask; + }); + } + + + private async getConfigForActiveFile(token: vscode.CancellationToken): Promise { + const editor = vscode.window.activeTextEditor; + if (editor) { + if (path.basename(editor.document.fileName).match(/^tsconfig\.(.\.)?json$/)) { + return [editor.document.fileName]; + } + } + + const file = this.getActiveTypeScriptFile(); + if (!file) { + return []; + } + + const res: Proto.ProjectInfoResponse = await this.lazyClient().execute( + 'projectInfo', + { file, needFileNameList: false } as protocol.ProjectInfoRequestArgs, + token); + + if (!res || !res.body) { + return []; + } + + const { configFileName } = res.body; + if (configFileName && configFileName.indexOf('/dev/null/') !== 0) { + return [configFileName]; + } + return []; + } + + private async getConfigsForWorkspace(): Promise { + if (!vscode.workspace.rootPath) { + return []; + } + const rootTsConfig = path.join(vscode.workspace.rootPath, 'tsconfig.json'); + if (!await exists(rootTsConfig)) { + return []; + } + return [rootTsConfig]; + } + + private async getCommand(): Promise { + const platform = process.platform; + if (platform === 'win32' && await exists(path.join(vscode.workspace.rootPath!, 'node_modules', '.bin', 'tsc.cmd'))) { + return path.join('.', 'node_modules', '.bin', 'tsc.cmd'); + } else if ((platform === 'linux' || platform === 'darwin') && await exists(path.join(vscode.workspace.rootPath!, 'node_modules', '.bin', 'tsc'))) { + return path.join('.', 'node_modules', '.bin', 'tsc'); + } else { + return 'tsc'; + } + } + + private getActiveTypeScriptFile(): string | null { + const editor = vscode.window.activeTextEditor; + if (editor) { + const document = editor.document; + if (document && (document.languageId === 'typescript' || document.languageId === 'typescriptreact')) { + return this.lazyClient().normalizePath(document.uri); + } + } + return null; + } +} \ No newline at end of file diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index 9949d0db9d2..07a666936b9 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -41,13 +41,14 @@ import CodeActionProvider from './features/codeActionProvider'; import ReferenceCodeLensProvider from './features/referencesCodeLensProvider'; import { JsDocCompletionProvider, TryCompleteJsDocCommand } from './features/jsDocCompletionProvider'; import { DirectiveCommentCompletionProvider } from './features/directiveCommentCompletionProvider'; +import TypeScriptTaskProvider from './features/taskProvider'; import ImplementationCodeLensProvider from './features/implementationsCodeLensProvider'; import * as BuildStatus from './utils/buildStatus'; import * as ProjectStatus from './utils/projectStatus'; import TypingsStatus, { AtaProgressReporter } from './utils/typingsStatus'; -import * as VersionStatus from './utils/versionStatus'; +import VersionStatus from './utils/versionStatus'; import { getContributedTypeScriptServerPlugins, TypeScriptServerPlugin } from "./utils/plugins"; interface LanguageDescription { @@ -67,72 +68,100 @@ interface ProjectConfigMessageItem extends MessageItem { id: ProjectConfigAction; } +const MODE_ID_TS = 'typescript'; +const MODE_ID_TSX = 'typescriptreact'; +const MODE_ID_JS = 'javascript'; +const MODE_ID_JSX = 'javascriptreact'; + +const standardLanguageDescriptions: LanguageDescription[] = [ + { + id: 'typescript', + diagnosticSource: 'ts', + modeIds: [MODE_ID_TS, MODE_ID_TSX], + configFile: 'tsconfig.json' + }, { + id: 'javascript', + diagnosticSource: 'js', + modeIds: [MODE_ID_JS, MODE_ID_JSX], + configFile: 'jsconfig.json' + } +]; export function activate(context: ExtensionContext): void { - const MODE_ID_TS = 'typescript'; - const MODE_ID_TSX = 'typescriptreact'; - const MODE_ID_JS = 'javascript'; - const MODE_ID_JSX = 'javascriptreact'; - const plugins = getContributedTypeScriptServerPlugins(); - const clientHost = new TypeScriptServiceClientHost([ - { - id: 'typescript', - diagnosticSource: 'ts', - modeIds: [MODE_ID_TS, MODE_ID_TSX], - configFile: 'tsconfig.json' - }, - { - id: 'javascript', - diagnosticSource: 'js', - modeIds: [MODE_ID_JS, MODE_ID_JSX], - configFile: 'jsconfig.json' - } - ], context.storagePath, context.globalState, context.workspaceState, plugins); - context.subscriptions.push(clientHost); - const client = clientHost.serviceClient; + const lazyClientHost = (() => { + let clientHost: TypeScriptServiceClientHost | undefined; + return () => { + if (!clientHost) { + clientHost = new TypeScriptServiceClientHost(standardLanguageDescriptions, context.storagePath, context.globalState, context.workspaceState, plugins); + context.subscriptions.push(clientHost); + + const host = clientHost; + clientHost.serviceClient.onReady().then(() => { + context.subscriptions.push(ProjectStatus.create(host.serviceClient, + path => new Promise(resolve => setTimeout(() => resolve(host.handles(path)), 750)), + context.workspaceState)); + }, () => { + // Nothing to do here. The client did show a message; + }); + } + return clientHost; + }; + })(); + context.subscriptions.push(commands.registerCommand('typescript.reloadProjects', () => { - clientHost.reloadProjects(); + lazyClientHost().reloadProjects(); })); context.subscriptions.push(commands.registerCommand('javascript.reloadProjects', () => { - clientHost.reloadProjects(); + lazyClientHost().reloadProjects(); })); context.subscriptions.push(commands.registerCommand('typescript.selectTypeScriptVersion', () => { - client.onVersionStatusClicked(); + lazyClientHost().serviceClient.onVersionStatusClicked(); })); context.subscriptions.push(commands.registerCommand('typescript.openTsServerLog', () => { - client.openTsServerLogFile(); + lazyClientHost().serviceClient.openTsServerLogFile(); })); context.subscriptions.push(commands.registerCommand('typescript.restartTsServer', () => { - client.restartTsServer(); + lazyClientHost().serviceClient.restartTsServer(); })); + context.subscriptions.push(workspace.registerTaskProvider(new TypeScriptTaskProvider(() => lazyClientHost().serviceClient))); + const goToProjectConfig = (isTypeScript: boolean) => { const editor = window.activeTextEditor; if (editor) { - clientHost.goToProjectConfig(isTypeScript, editor.document.uri); + lazyClientHost().goToProjectConfig(isTypeScript, editor.document.uri); } }; context.subscriptions.push(commands.registerCommand('typescript.goToProjectConfig', goToProjectConfig.bind(null, true))); context.subscriptions.push(commands.registerCommand('javascript.goToProjectConfig', goToProjectConfig.bind(null, false))); - const jsDocCompletionCommand = new TryCompleteJsDocCommand(client); + const jsDocCompletionCommand = new TryCompleteJsDocCommand(() => lazyClientHost().serviceClient); context.subscriptions.push(commands.registerCommand(TryCompleteJsDocCommand.COMMAND_NAME, jsDocCompletionCommand.tryCompleteJsDoc, jsDocCompletionCommand)); - window.onDidChangeActiveTextEditor(VersionStatus.showHideStatus, null, context.subscriptions); - client.onReady().then(() => { - context.subscriptions.push(ProjectStatus.create(client, - path => new Promise(resolve => setTimeout(() => resolve(clientHost.handles(path)), 750)), - context.workspaceState)); - }, () => { - // Nothing to do here. The client did show a message; - }); + const supportedLanguage = [].concat.apply([], standardLanguageDescriptions.map(x => x.modeIds).concat(plugins.map(x => x.languages))); + function didOpenTextDocument(textDocument: TextDocument): boolean { + if (supportedLanguage.indexOf(textDocument.languageId) >= 0) { + openListener.dispose(); + // Force activation + void lazyClientHost(); + return true; + } + return false; + }; + const openListener = workspace.onDidOpenTextDocument(didOpenTextDocument); + for (let textDocument of workspace.textDocuments) { + if (didOpenTextDocument(textDocument)) { + break; + } + } + BuildStatus.update({ queueLength: 0 }); } @@ -423,6 +452,7 @@ class TypeScriptServiceClientHost implements ITypescriptServiceClientHost { private languages: LanguageProvider[] = []; private languagePerId: ObjectMap; private readonly disposables: Disposable[] = []; + private readonly versionStatus: VersionStatus; constructor( descriptions: LanguageDescription[], @@ -446,7 +476,10 @@ class TypeScriptServiceClientHost implements ITypescriptServiceClientHost { configFileWatcher.onDidDelete(handleProjectCreateOrDelete, this, this.disposables); configFileWatcher.onDidChange(handleProjectChange, this, this.disposables); - this.client = new TypeScriptServiceClient(this, storagePath, globalState, workspaceState, plugins, this.disposables); + this.versionStatus = new VersionStatus(); + this.disposables.push(this.versionStatus); + + this.client = new TypeScriptServiceClient(this, storagePath, globalState, workspaceState, this.versionStatus, plugins, this.disposables); this.languagePerId = Object.create(null); for (const description of descriptions) { const manager = new LanguageProvider(this.client, description); diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index cf2b7c3be6f..5e22350feb0 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -18,7 +18,7 @@ import { ITypescriptServiceClient, ITypescriptServiceClientHost, API } from './t import { TypeScriptServerPlugin } from './utils/plugins'; import Logger from './utils/logger'; -import * as VersionStatus from './utils/versionStatus'; +import VersionStatus from './utils/versionStatus'; import * as is from './utils/is'; import * as nls from 'vscode-nls'; @@ -141,7 +141,9 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient host: ITypescriptServiceClientHost, storagePath: string | undefined, globalState: Memento, - private workspaceState: Memento, + private readonly workspaceState: Memento, + private readonly versionStatus: VersionStatus, + private plugins: TypeScriptServerPlugin[], disposables: Disposable[] ) { @@ -404,8 +406,8 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient const label = version || localize('versionNumber.custom', 'custom'); const tooltip = modulePath; this.modulePath = modulePath; - VersionStatus.showHideStatus(); - VersionStatus.setInfo(label, tooltip); + this.versionStatus.showHideStatus(); + this.versionStatus.setInfo(label, tooltip); // This is backwards compatibility code to move the setting from the local // store into the workspace setting file. diff --git a/extensions/typescript/src/utils/versionStatus.ts b/extensions/typescript/src/utils/versionStatus.ts index e92b87d0f24..21f3a1c34f1 100644 --- a/extensions/typescript/src/utils/versionStatus.ts +++ b/extensions/typescript/src/utils/versionStatus.ts @@ -3,42 +3,53 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import vscode = require('vscode'); +import * as vscode from 'vscode'; -const versionBarEntry = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, Number.MIN_VALUE); -export function showHideStatus() { - if (!versionBarEntry) { - return; - } - if (!vscode.window.activeTextEditor) { - versionBarEntry.hide(); - return; +export default class VersionStatus extends vscode.Disposable { + onChangeEditorSub: any; + private versionBarEntry: vscode.StatusBarItem; + + constructor() { + super(() => this.dispose()); + + this.versionBarEntry = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, Number.MIN_VALUE); + + this.onChangeEditorSub = vscode.window.onDidChangeActiveTextEditor(this.showHideStatus, this); } - let doc = vscode.window.activeTextEditor.document; - if (vscode.languages.match('typescript', doc) || vscode.languages.match('typescriptreact', doc)) { - versionBarEntry.show(); - return; + dispose() { + this.versionBarEntry.dispose(); + this.onChangeEditorSub.dispose(); } - if (!vscode.window.activeTextEditor.viewColumn) { - // viewColumn is undefined for the debug/output panel, but we still want - // to show the version info - return; + showHideStatus() { + if (!this.versionBarEntry) { + return; + } + if (!vscode.window.activeTextEditor) { + this.versionBarEntry.hide(); + return; + } + + let doc = vscode.window.activeTextEditor.document; + if (vscode.languages.match('typescript', doc) || vscode.languages.match('typescriptreact', doc)) { + this.versionBarEntry.show(); + return; + } + + if (!vscode.window.activeTextEditor.viewColumn) { + // viewColumn is undefined for the debug/output panel, but we still want + // to show the version info + return; + } + + this.versionBarEntry.hide(); } - versionBarEntry.hide(); -} - -export function disposeStatus() { - if (versionBarEntry) { - versionBarEntry.dispose(); + public setInfo(message: string, tooltip: string) { + this.versionBarEntry.text = message; + this.versionBarEntry.tooltip = tooltip; + this.versionBarEntry.command = 'typescript.selectTypeScriptVersion'; } } - -export function setInfo(message: string, tooltip: string) { - versionBarEntry.text = message; - versionBarEntry.tooltip = tooltip; - versionBarEntry.command = 'typescript.selectTypeScriptVersion'; -} diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index f1c5a8065b8..65e818dafc3 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -163,7 +163,7 @@ namespace ProblemMatcher { if (values === void 0 || values === null) { return undefined; } - let result: (string | Problems.ProblemMatcher)[]; + let result: (string | Problems.ProblemMatcher)[] = []; for (let value of values) { let converted = typeof value === 'string' ? value : fromSingle(value); if (converted) { From 3dfc44a3fa8a3a2b5fa0500fe8075bf66bae6b21 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 26 May 2017 00:18:20 +0200 Subject: [PATCH 0972/1164] Decoration text after decoration wrongly positioned. Fixes #27288 --- src/vs/editor/browser/services/codeEditorServiceImpl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index 26bc62e9e6a..d824627e4ec 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -151,7 +151,7 @@ class DecorationTypeOptionsProvider implements IModelDecorationOptionsProvider { this.className = createCSSRules(ModelDecorationCSSRuleType.ClassName); this.inlineClassName = createCSSRules(ModelDecorationCSSRuleType.InlineClassName); this.beforeContentClassName = createCSSRules(ModelDecorationCSSRuleType.BeforeContentClassName); - this.beforeContentClassName = createCSSRules(ModelDecorationCSSRuleType.AfterContentClassName); + this.afterContentClassName = createCSSRules(ModelDecorationCSSRuleType.AfterContentClassName); this.glyphMarginClassName = createCSSRules(ModelDecorationCSSRuleType.GlyphMarginClassName); let options = providerArgs.options; From 4ce3a1e6ac1ea6a00ddaff5c8ffdfd25e30f4f03 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 24 May 2017 15:27:48 -0700 Subject: [PATCH 0973/1164] Move VersionStatus into a class --- extensions/typescript/src/typescriptMain.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index 07a666936b9..18bc57678ff 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -90,6 +90,7 @@ const standardLanguageDescriptions: LanguageDescription[] = [ export function activate(context: ExtensionContext): void { const plugins = getContributedTypeScriptServerPlugins(); +<<<<<<< HEAD const lazyClientHost = (() => { let clientHost: TypeScriptServiceClientHost | undefined; return () => { @@ -110,6 +111,10 @@ export function activate(context: ExtensionContext): void { }; })(); +======= + const clientHost = new TypeScriptServiceClientHost(standardLanguageDescriptions, context.storagePath, context.globalState, context.workspaceState, plugins); + context.subscriptions.push(clientHost); +>>>>>>> a0b779f... Move VersionStatus into a class context.subscriptions.push(commands.registerCommand('typescript.reloadProjects', () => { lazyClientHost().reloadProjects(); @@ -145,6 +150,7 @@ export function activate(context: ExtensionContext): void { const jsDocCompletionCommand = new TryCompleteJsDocCommand(() => lazyClientHost().serviceClient); context.subscriptions.push(commands.registerCommand(TryCompleteJsDocCommand.COMMAND_NAME, jsDocCompletionCommand.tryCompleteJsDoc, jsDocCompletionCommand)); +<<<<<<< HEAD const supportedLanguage = [].concat.apply([], standardLanguageDescriptions.map(x => x.modeIds).concat(plugins.map(x => x.languages))); function didOpenTextDocument(textDocument: TextDocument): boolean { if (supportedLanguage.indexOf(textDocument.languageId) >= 0) { @@ -162,6 +168,15 @@ export function activate(context: ExtensionContext): void { } } +======= + clientHost.serviceClient.onReady().then(() => { + context.subscriptions.push(ProjectStatus.create(clientHost.serviceClient, + path => new Promise(resolve => setTimeout(() => resolve(clientHost.handles(path)), 750)), + context.workspaceState)); + }, () => { + // Nothing to do here. The client did show a message; + }); +>>>>>>> a0b779f... Move VersionStatus into a class BuildStatus.update({ queueLength: 0 }); } From fe69f9ac3b5d2f476a08275884d9c12b05859bb6 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 25 May 2017 15:30:19 -0700 Subject: [PATCH 0974/1164] Actually save the file this time :'( --- extensions/typescript/src/typescriptMain.ts | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index 18bc57678ff..07a666936b9 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -90,7 +90,6 @@ const standardLanguageDescriptions: LanguageDescription[] = [ export function activate(context: ExtensionContext): void { const plugins = getContributedTypeScriptServerPlugins(); -<<<<<<< HEAD const lazyClientHost = (() => { let clientHost: TypeScriptServiceClientHost | undefined; return () => { @@ -111,10 +110,6 @@ export function activate(context: ExtensionContext): void { }; })(); -======= - const clientHost = new TypeScriptServiceClientHost(standardLanguageDescriptions, context.storagePath, context.globalState, context.workspaceState, plugins); - context.subscriptions.push(clientHost); ->>>>>>> a0b779f... Move VersionStatus into a class context.subscriptions.push(commands.registerCommand('typescript.reloadProjects', () => { lazyClientHost().reloadProjects(); @@ -150,7 +145,6 @@ export function activate(context: ExtensionContext): void { const jsDocCompletionCommand = new TryCompleteJsDocCommand(() => lazyClientHost().serviceClient); context.subscriptions.push(commands.registerCommand(TryCompleteJsDocCommand.COMMAND_NAME, jsDocCompletionCommand.tryCompleteJsDoc, jsDocCompletionCommand)); -<<<<<<< HEAD const supportedLanguage = [].concat.apply([], standardLanguageDescriptions.map(x => x.modeIds).concat(plugins.map(x => x.languages))); function didOpenTextDocument(textDocument: TextDocument): boolean { if (supportedLanguage.indexOf(textDocument.languageId) >= 0) { @@ -168,15 +162,6 @@ export function activate(context: ExtensionContext): void { } } -======= - clientHost.serviceClient.onReady().then(() => { - context.subscriptions.push(ProjectStatus.create(clientHost.serviceClient, - path => new Promise(resolve => setTimeout(() => resolve(clientHost.handles(path)), 750)), - context.workspaceState)); - }, () => { - // Nothing to do here. The client did show a message; - }); ->>>>>>> a0b779f... Move VersionStatus into a class BuildStatus.update({ queueLength: 0 }); } From 042217fcbadfb003e04b3076e0e43e051f65bcac Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 25 May 2017 16:03:38 -0700 Subject: [PATCH 0975/1164] Fix #26708 - use StringDecoder to handle data chunks that split multibyte characters --- .../services/search/node/ripgrepTextSearch.ts | 16 +++++++-- .../test/node/ripgrepTextSearch.test.ts | 36 +++++++++++++++---- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/services/search/node/ripgrepTextSearch.ts b/src/vs/workbench/services/search/node/ripgrepTextSearch.ts index 829406f52fe..03aaa15bb75 100644 --- a/src/vs/workbench/services/search/node/ripgrepTextSearch.ts +++ b/src/vs/workbench/services/search/node/ripgrepTextSearch.ts @@ -6,6 +6,7 @@ import { EventEmitter } from 'events'; import * as path from 'path'; +import { StringDecoder, NodeStringDecoder } from 'string_decoder'; import * as cp from 'child_process'; import { rgPath } from 'vscode-ripgrep'; @@ -174,11 +175,13 @@ export class RipgrepParser extends EventEmitter { private fileMatch: FileMatch; private remainder: string; private isDone: boolean; + private stringDecoder: NodeStringDecoder; private numResults = 0; constructor(private maxResults: number, private rootFolder: string) { super(); + this.stringDecoder = new StringDecoder(); } public cancel(): void { @@ -186,16 +189,23 @@ export class RipgrepParser extends EventEmitter { } public flush(): void { + this.handleDecodedData(this.stringDecoder.end()); + if (this.fileMatch) { this.onResult(); } } - public handleData(data: string | Buffer): void { + public handleData(data: Buffer | string): void { + const dataStr = typeof data === 'string' ? data : this.stringDecoder.write(data); + this.handleDecodedData(dataStr); + } + + private handleDecodedData(decodedData: string): void { // If the previous data chunk didn't end in a newline, prepend it to this chunk const dataStr = this.remainder ? - this.remainder + data.toString() : - data.toString(); + this.remainder + decodedData : + decodedData; const dataLines: string[] = dataStr.split(/\r\n|\n/); this.remainder = dataLines[dataLines.length - 1] ? dataLines.pop() : null; diff --git a/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts b/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts index 1ee3f9a6a83..9ff4208d109 100644 --- a/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts +++ b/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts @@ -33,7 +33,11 @@ suite('RipgrepParser', () => { return matchLine; } - function parseInput(inputChunks: string[]): ISerializedFileMatch[] { + function parseInputStrings(inputChunks: string[]): ISerializedFileMatch[] { + return parseInput(inputChunks.map(chunk => new Buffer(chunk))); + } + + function parseInput(inputChunks: Buffer[]): ISerializedFileMatch[] { const matches: ISerializedFileMatch[] = []; const rgp = new RipgrepParser(1e6, rootFolder); rgp.on('result', (match: ISerializedFileMatch) => { @@ -65,7 +69,7 @@ suite('RipgrepParser', () => { [getFileLine('a.txt'), getMatchLine(1, ['before', 'match', 'after']), getMatchLine(2, ['before', 'match', 'after']), fileSectionEnd].join('\n') ]; - const results = parseInput(input); + const results = parseInputStrings(input); assert.equal(results.length, 1); assert.deepEqual(results[0], { @@ -93,7 +97,7 @@ suite('RipgrepParser', () => { [getFileLine('c.txt'), getMatchLine(1, ['before', 'match', 'after']), getMatchLine(2, ['before', 'match', 'after']), fileSectionEnd].join('\n') ]; - const results = parseInput(input); + const results = parseInputStrings(input); assert.equal(results.length, 3); results.forEach(fileResult => assert.equal(fileResult.numMatches, 2)); }); @@ -116,7 +120,7 @@ suite('RipgrepParser', () => { test('Parses multiple chunks broken at each line', () => { const input = singleLineChunks.map(chunk => chunk + '\n'); - const results = parseInput(input); + const results = parseInputStrings(input); assert.equal(results.length, 3); results.forEach(fileResult => assert.equal(fileResult.numMatches, 2)); }); @@ -126,7 +130,7 @@ suite('RipgrepParser', () => { .map(chunk => chunk + '\n') .map(halve)); - const results = parseInput(input); + const results = parseInputStrings(input); assert.equal(results.length, 3); results.forEach(fileResult => assert.equal(fileResult.numMatches, 2)); }); @@ -136,7 +140,7 @@ suite('RipgrepParser', () => { .map(chunk => chunk + '\n') .map(arrayOfChars)); - const results = parseInput(input); + const results = parseInputStrings(input); assert.equal(results.length, 3); results.forEach(fileResult => assert.equal(fileResult.numMatches, 2)); }); @@ -145,8 +149,26 @@ suite('RipgrepParser', () => { const input = singleLineChunks .map(chunk => '\n' + chunk); - const results = parseInput(input); + const results = parseInputStrings(input); assert.equal(results.length, 3); results.forEach(fileResult => assert.equal(fileResult.numMatches, 2)); }); + + test('Parses chunks broken in the middle of a multibyte character', () => { + const multibyteStr = '漢'; + const multibyteBuf = new Buffer(multibyteStr); + const text = getFileLine('foo/bar') + '\n' + getMatchLine(0, ['before', 'match', 'after']) + '\n'; + + // Split the multibyte char into two pieces and divide between the two buffers + const beforeIndex = 24; + const inputBufs = [ + Buffer.concat([new Buffer(text.substr(0, beforeIndex)), multibyteBuf.slice(0, 2)]), + Buffer.concat([multibyteBuf.slice(2), new Buffer(text.substr(beforeIndex))]) + ]; + + const results = parseInput(inputBufs); + assert.equal(results.length, 1); + assert.equal(results[0].lineMatches.length, 1); + assert.deepEqual(results[0].lineMatches[0].offsetAndLengths, [[7, 5]]); + }); }); \ No newline at end of file From 1119064b34f376a7560a3a1ccfe43d8d156bf2e1 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 25 May 2017 16:15:19 -0700 Subject: [PATCH 0976/1164] Add Unit Test launch config (not sure why it was deleted?) --- .vscode/launch.json | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/.vscode/launch.json b/.vscode/launch.json index d56ca22e59d..fa30207ce2b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -146,6 +146,32 @@ "outFiles": [ "${workspaceRoot}/extensions/node_modules/typescript/lib/**/*.js" ] + }, + { + "type": "node", + "request": "launch", + "name": "Unit Tests", + "protocol": "legacy", + "program": "${workspaceRoot}/node_modules/mocha/bin/_mocha", + "runtimeExecutable": "${workspaceRoot}/.build/electron/Code - OSS.app/Contents/MacOS/Electron", + "windows": { + "runtimeExecutable": "${workspaceRoot}/.build/electron/Code - OSS.exe" + }, + "linux": { + "runtimeExecutable": "${workspaceRoot}/.build/electron/code-oss" + }, + "stopOnEntry": false, + "args": [ + "--timeout", + "2000" + ], + "cwd": "${workspaceRoot}", + "env": { + "ELECTRON_RUN_AS_NODE": "true" + }, + "outFiles": [ + "${workspaceRoot}/out/**/*.js" + ] } ], "compounds": [ From 3b48123e2e3183ce64041e050f777e543961798c Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 25 May 2017 16:17:37 -0700 Subject: [PATCH 0977/1164] sourceMaps is enabled by default, remove from launch configs --- .vscode/launch.json | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index fa30207ce2b..39b72b995a8 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -18,7 +18,6 @@ "name": "Attach to Extension Host", "protocol": "legacy", "port": 5870, - "sourceMaps": true, "restart": true, "outFiles": [ "${workspaceRoot}/out/**/*.js" @@ -30,7 +29,6 @@ "name": "Attach to Shared Process", "protocol": "legacy", "port": 5871, - "sourceMaps": true, "outFiles": [ "${workspaceRoot}/out/**/*.js" ] @@ -41,7 +39,6 @@ "protocol": "legacy", "name": "Attach to Search process", "port": 7890, - "sourceMaps": true, "outFiles": [ "${workspaceRoot}/out/**/*.js" ] @@ -52,7 +49,6 @@ "name": "Attach to CLI Process", "protocol": "legacy", "port": 5874, - "sourceMaps": true, "outFiles": [ "${workspaceRoot}/out/**/*.js" ] @@ -63,7 +59,6 @@ "name": "Attach to Main Process", "protocol": "legacy", "port": 5875, - "sourceMaps": true, "outFiles": [ "${workspaceRoot}/out/**/*.js" ] @@ -78,7 +73,6 @@ "--extensionDevelopmentPath=${workspaceRoot}/extensions/vscode-api-tests", "--extensionTestsPath=${workspaceRoot}/extensions/vscode-api-tests/out" ], - "sourceMaps": true, "outFiles": [ "${workspaceRoot}/out/**/*.js" ] @@ -93,7 +87,6 @@ "--extensionDevelopmentPath=${workspaceRoot}/extensions/vscode-colorize-tests", "--extensionTestsPath=${workspaceRoot}/extensions/vscode-colorize-tests/out" ], - "sourceMaps": true, "outFiles": [ "${workspaceRoot}/out/**/*.js" ] @@ -131,7 +124,6 @@ "program": "${workspaceRoot}/extensions/git/node_modules/mocha/bin/_mocha", "stopOnEntry": false, "cwd": "${workspaceRoot}/extensions/git", - "sourceMaps": true, "outFiles": [ "${workspaceRoot}/extensions/git/out/**/*.js" ] @@ -141,7 +133,6 @@ "type": "node", "request": "attach", "port": 5859, - "sourceMaps": true, "protocol": "legacy", "outFiles": [ "${workspaceRoot}/extensions/node_modules/typescript/lib/**/*.js" From 867468a559f55277b443f66a28fe5317f9b76652 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 25 May 2017 16:17:21 -0700 Subject: [PATCH 0978/1164] Use 'descriptionForeground' (#27289) --- extensions/merge-conflict/src/mergeDecorator.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/merge-conflict/src/mergeDecorator.ts b/extensions/merge-conflict/src/mergeDecorator.ts index 39888f727e6..be9e733a562 100644 --- a/extensions/merge-conflict/src/mergeDecorator.ts +++ b/extensions/merge-conflict/src/mergeDecorator.ts @@ -81,7 +81,7 @@ export default class MergeDectorator implements vscode.Disposable { color: new vscode.ThemeColor('editor.foreground'), after: { contentText: ' ' + localize('currentChange', '(Current change)'), - color: 'rgba(0, 0, 0, 0.7)' + color: new vscode.ThemeColor('descriptionForeground') } }); @@ -96,7 +96,7 @@ export default class MergeDectorator implements vscode.Disposable { isWholeLine: this.decorationUsesWholeLine, after: { contentText: ' ' + localize('incomingChange', '(Incoming change)'), - color: 'rgba(0, 0, 0, 0.7)' + color: new vscode.ThemeColor('descriptionForeground') } }); } From ce18dd018de6f920c1d11fef76deb9e217e60b3e Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 25 May 2017 16:27:55 -0700 Subject: [PATCH 0979/1164] Safer change for #25422 --- src/vs/workbench/services/search/node/ripgrepTextSearch.ts | 2 +- .../services/search/test/node/ripgrepTextSearch.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/search/node/ripgrepTextSearch.ts b/src/vs/workbench/services/search/node/ripgrepTextSearch.ts index 03aaa15bb75..b7f3b7ad4dc 100644 --- a/src/vs/workbench/services/search/node/ripgrepTextSearch.ts +++ b/src/vs/workbench/services/search/node/ripgrepTextSearch.ts @@ -235,7 +235,7 @@ export class RipgrepParser extends EventEmitter { this.onResult(); } - this.fileMatch = new FileMatch(path.resolve(this.rootFolder, r[1])); + this.fileMatch = new FileMatch(path.isAbsolute(r[1]) ? r[1] : path.join(this.rootFolder, r[1])); } else { // Line is empty (or malformed) } diff --git a/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts b/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts index 9ff4208d109..87a27629eaf 100644 --- a/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts +++ b/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts @@ -74,7 +74,7 @@ suite('RipgrepParser', () => { assert.deepEqual(results[0], { numMatches: 2, - path: path.resolve(rootFolder, 'a.txt'), + path: path.join(rootFolder, 'a.txt'), lineMatches: [ { lineNumber: 0, From 370049325180aff3a4ec3b1f2f44aca4d22add03 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 25 May 2017 17:47:01 -0700 Subject: [PATCH 0980/1164] node-debug2@1.13.0 --- build/gulpfile.vscode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 15d2edd0323..cf894772b6a 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -43,7 +43,7 @@ const nodeModules = ['electron', 'original-fs'] const builtInExtensions = [ { name: 'ms-vscode.node-debug', version: '1.13.6' }, - { name: 'ms-vscode.node-debug2', version: '1.12.4' } + { name: 'ms-vscode.node-debug2', version: '1.13.0' } ]; const vscodeEntryPoints = _.flatten([ From 770206ab9c6357943a2145bd3ea49b667f3ff539 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 25 May 2017 21:23:47 -0700 Subject: [PATCH 0981/1164] Pickup all TSConfigs in Workspace for TSC Build Task (#27306) Follow up on #26079 Allows us to pick up all tsconfig files in a workspace for the build tasks --- .../typescript/src/features/taskProvider.ts | 51 +++++++++------- .../typescript/src/utils/tsconfigProvider.ts | 58 +++++++++++++++++++ 2 files changed, 88 insertions(+), 21 deletions(-) create mode 100644 extensions/typescript/src/utils/tsconfigProvider.ts diff --git a/extensions/typescript/src/features/taskProvider.ts b/extensions/typescript/src/features/taskProvider.ts index 76528021983..ba53903e447 100644 --- a/extensions/typescript/src/features/taskProvider.ts +++ b/extensions/typescript/src/features/taskProvider.ts @@ -11,6 +11,7 @@ import * as vscode from 'vscode'; import * as Proto from '../protocol'; import TypeScriptServiceClient from '../typescriptServiceClient'; +import TsConfigProvider from "../utils/tsconfigProvider"; const exists = (file: string): Promise => @@ -21,32 +22,47 @@ const exists = (file: string): Promise => }); export default class TypeScriptTaskProvider implements vscode.TaskProvider { + private readonly tsconfigProvider: TsConfigProvider; public constructor( private readonly lazyClient: () => TypeScriptServiceClient - ) { } + ) { + this.tsconfigProvider = new TsConfigProvider(); + } - async provideTasks(token: vscode.CancellationToken): Promise { + dispose() { + this.tsconfigProvider.dispose(); + } + + public async provideTasks(token: vscode.CancellationToken): Promise { const rootPath = vscode.workspace.rootPath; if (!rootPath) { return []; } - const projects = (await this.getConfigForActiveFile(token)).concat(await this.getConfigsForWorkspace()); const command = await this.getCommand(); + const projects = await this.getAllTsConfigs(token); - return projects - .filter((x, i) => projects.indexOf(x) === i) - .map(configFile => { - const configFileName = path.relative(rootPath, configFile); - const buildTask = new vscode.ShellTask(`tsc: build ${configFileName}`, `${command} -p ${configFile}`, '$tsc'); - buildTask.group = vscode.TaskGroup.Build; - return buildTask; - }); + return projects.map(configFile => { + const configFileName = path.relative(rootPath, configFile); + const buildTask = new vscode.ShellTask(`tsc: build ${configFileName}`, `${command} -p ${configFile}`, '$tsc'); + buildTask.group = vscode.TaskGroup.Build; + return buildTask; + }); } + private async getAllTsConfigs(token: vscode.CancellationToken): Promise { + const out: string[] = []; + const configs = (await this.getTsConfigForActiveFile(token)).concat(await this.getTsConfigsInWorkspace()); + for (const config of configs) { + if (await exists(config)) { + out.push(config); + } + } + return out; + } - private async getConfigForActiveFile(token: vscode.CancellationToken): Promise { + private async getTsConfigForActiveFile(token: vscode.CancellationToken): Promise { const editor = vscode.window.activeTextEditor; if (editor) { if (path.basename(editor.document.fileName).match(/^tsconfig\.(.\.)?json$/)) { @@ -75,15 +91,8 @@ export default class TypeScriptTaskProvider implements vscode.TaskProvider { return []; } - private async getConfigsForWorkspace(): Promise { - if (!vscode.workspace.rootPath) { - return []; - } - const rootTsConfig = path.join(vscode.workspace.rootPath, 'tsconfig.json'); - if (!await exists(rootTsConfig)) { - return []; - } - return [rootTsConfig]; + private async getTsConfigsInWorkspace(): Promise { + return Array.from(await this.tsconfigProvider.getConfigsForWorkspace()); } private async getCommand(): Promise { diff --git a/extensions/typescript/src/utils/tsconfigProvider.ts b/extensions/typescript/src/utils/tsconfigProvider.ts new file mode 100644 index 00000000000..e85ca24bbff --- /dev/null +++ b/extensions/typescript/src/utils/tsconfigProvider.ts @@ -0,0 +1,58 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import * as vscode from 'vscode'; + +export default class TsConfigProvider extends vscode.Disposable { + private readonly tsconfigs = new Set(); + + private activated: boolean = false; + private disposables: vscode.Disposable[] = []; + + constructor() { + super(() => this.dispose()); + } + + dispose(): void { + this.disposables.forEach(d => d.dispose()); + } + + public async getConfigsForWorkspace(): Promise> { + if (!vscode.workspace.rootPath) { + return []; + } + await this.ensureActivated(); + return this.tsconfigs; + } + + private async ensureActivated() { + if (this.activated) { + return this; + } + this.activated = true; + + for (const config of await TsConfigProvider.loadWorkspaceTsconfigs()) { + this.tsconfigs.add(config.fsPath); + } + + const configFileWatcher = vscode.workspace.createFileSystemWatcher('**/tsconfig*.json'); + this.disposables.push(configFileWatcher); + configFileWatcher.onDidCreate(this.handleProjectCreate, this, this.disposables); + configFileWatcher.onDidDelete(this.handleProjectDelete, this, this.disposables); + + return this; + } + + private static loadWorkspaceTsconfigs() { + return vscode.workspace.findFiles('**/tsconfig*.json', '**/node_modules/**'); + } + + private handleProjectCreate(e: vscode.Uri) { + this.tsconfigs.add(e.fsPath); + } + + private handleProjectDelete(e: vscode.Uri) { + this.tsconfigs.delete(e.fsPath); + } +} From 01e289eac392c7a2e45da386e3ce3333db327916 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Thu, 25 May 2017 23:50:49 -0700 Subject: [PATCH 0982/1164] Select single words in property value --- extensions/emmet/src/selectItemHTML.ts | 65 +++++++++++++++-- extensions/emmet/src/selectItemStylesheet.ts | 75 ++++++++++++++++--- extensions/emmet/src/util.ts | 76 ++++++++++++++++++++ 3 files changed, 200 insertions(+), 16 deletions(-) diff --git a/extensions/emmet/src/selectItemHTML.ts b/extensions/emmet/src/selectItemHTML.ts index 79d0a585e0a..2c0be704ead 100644 --- a/extensions/emmet/src/selectItemHTML.ts +++ b/extensions/emmet/src/selectItemHTML.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import { getNode, getDeepestNode } from './util'; +import { getNode, getDeepestNode, findNextWord, findPrevWord } from './util'; import Node from '@emmetio/node'; export function nextItemHTML(selection: vscode.Selection, editor: vscode.TextEditor, rootNode: Node): vscode.Selection { @@ -99,10 +99,40 @@ function getNextAttribute(selection: vscode.Selection, document: vscode.TextDocu return new vscode.Selection(document.positionAt(attr.start), document.positionAt(attr.end)); } - if ((attr.value.start !== attr.value.end) && ((selectionStart === attr.start && selectionEnd === attr.end) || selectionEnd < attr.end - 1)) { - // select attr value + if (attr.value.start === attr.value.end) { + // No attr value to select + continue; + } + + if ((selectionStart === attr.start && selectionEnd === attr.end) || selectionEnd < attr.value.start) { + // cursor is in attr name, so select full attr value return new vscode.Selection(document.positionAt(attr.value.start), document.positionAt(attr.value.end)); } + + // Fetch the next word in the attr value + + if (attr.value.toString().indexOf(' ') === -1) { + // attr value does not have space, so no next word to find + continue; + } + + let pos = undefined; + if (selectionStart === attr.value.start && selectionEnd === attr.value.end) { + pos = -1; + } + if (pos === undefined && selectionEnd < attr.end) { + pos = selectionEnd - attr.value.start - 1; + } + + if (pos !== undefined) { + let [newSelectionStart, newSelectionEnd] = findNextWord(attr.value.toString(), pos); + if (newSelectionStart >= 0 && newSelectionEnd >= 0) { + newSelectionStart += attr.value.start; + newSelectionEnd += attr.value.start; + return new vscode.Selection(document.positionAt(newSelectionStart), document.positionAt(newSelectionEnd)); + } + } + } } @@ -113,18 +143,39 @@ function getPrevAttribute(selection: vscode.Selection, document: vscode.TextDocu } let selectionStart = document.offsetAt(selection.anchor); + let selectionEnd = document.offsetAt(selection.active); for (let i = node.attributes.length - 1; i >= 0; i--) { let attr = node.attributes[i]; - if (selectionStart > attr.value.start) { + if (selectionStart <= attr.start) { + continue; + } + + if (attr.value.start === attr.value.end || selectionStart < attr.value.start) { + // select full attr + return new vscode.Selection(document.positionAt(attr.start), document.positionAt(attr.end)); + } + + if (selectionStart === attr.value.start) { + if (selectionEnd >= attr.value.end) { + // select full attr + return new vscode.Selection(document.positionAt(attr.start), document.positionAt(attr.end)); + } // select attr value return new vscode.Selection(document.positionAt(attr.value.start), document.positionAt(attr.value.end)); } - if (selectionStart > attr.start) { - // select full attr - return new vscode.Selection(document.positionAt(attr.start), document.positionAt(attr.end)); + // Fetch the prev word in the attr value + + let pos = selectionStart > attr.value.end ? attr.value.toString().length : selectionStart - attr.value.start; + let [newSelectionStart, newSelectionEnd] = findPrevWord(attr.value.toString(), pos); + if (newSelectionStart >= 0 && newSelectionEnd >= 0) { + newSelectionStart += attr.value.start; + newSelectionEnd += attr.value.start; + return new vscode.Selection(document.positionAt(newSelectionStart), document.positionAt(newSelectionEnd)); } + + } } \ No newline at end of file diff --git a/extensions/emmet/src/selectItemStylesheet.ts b/extensions/emmet/src/selectItemStylesheet.ts index d0167a2d8b9..e3144cbf666 100644 --- a/extensions/emmet/src/selectItemStylesheet.ts +++ b/extensions/emmet/src/selectItemStylesheet.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import { getNode, getDeepestNode } from './util'; +import { getNode, getDeepestNode, findNextWord, findPrevWord } from './util'; import Node from '@emmetio/node'; export function nextItemStylesheet(selection: vscode.Selection, editor: vscode.TextEditor, rootNode: Node): vscode.Selection { @@ -12,9 +12,17 @@ export function nextItemStylesheet(selection: vscode.Selection, editor: vscode.T let endOffset = editor.document.offsetAt(selection.active); let currentNode = getNode(rootNode, endOffset, true); - // Full property is selected, so select property value next + // Full property is selected, so select full property value next if (currentNode.type === 'property' && startOffset === currentNode.start && endOffset === currentNode.end) { - return getSelectionFromNode(currentNode, editor.document, true); + return getSelectionFromProperty(currentNode, editor.document, startOffset, endOffset, true, 'next'); + } + + // Part or whole of propertyValue is selected, so select the next word in the propertyValue + if (currentNode.type === 'property' && startOffset >= currentNode.valueToken.start && endOffset <= currentNode.valueToken.end) { + let singlePropertyValue = getSelectionFromProperty(currentNode, editor.document, startOffset, endOffset, false, 'next'); + if (singlePropertyValue) { + return singlePropertyValue; + } } // Cursor is in the selector or in a property @@ -41,13 +49,27 @@ export function nextItemStylesheet(selection: vscode.Selection, editor: vscode.T export function prevItemStylesheet(selection: vscode.Selection, editor: vscode.TextEditor, rootNode: Node): vscode.Selection { let startOffset = editor.document.offsetAt(selection.anchor); + let endOffset = editor.document.offsetAt(selection.active); let currentNode = getNode(rootNode, startOffset); if (!currentNode) { currentNode = rootNode; } + // Full property value is selected, so select the whole property next + if (currentNode.type === 'property' && startOffset === currentNode.valueToken.start && endOffset === currentNode.valueToken.end) { + return getSelectionFromNode(currentNode, editor.document); + } + + // Part of propertyValue is selected, so select the prev word in the propertyValue + if (currentNode.type === 'property' && startOffset >= currentNode.valueToken.start && endOffset <= currentNode.valueToken.end) { + let singlePropertyValue = getSelectionFromProperty(currentNode, editor.document, startOffset, endOffset, false, 'prev'); + if (singlePropertyValue) { + return singlePropertyValue; + } + } + if (currentNode.type === 'property' || !currentNode.firstChild || (currentNode.type === 'rule' && startOffset <= currentNode.firstChild.start)) { - return getSelectionFromNode(currentNode, editor.document);; + return getSelectionFromNode(currentNode, editor.document); } // Select the child that appears just before the cursor @@ -57,23 +79,58 @@ export function prevItemStylesheet(selection: vscode.Selection, editor: vscode.T } prevNode = getDeepestNode(prevNode); - return getSelectionFromNode(prevNode, editor.document, true); + return getSelectionFromProperty(prevNode, editor.document, startOffset, endOffset, false, 'prev'); } -function getSelectionFromNode(node: Node, document: vscode.TextDocument, selectPropertyValue: boolean = false): vscode.Selection { +function getSelectionFromNode(node: Node, document: vscode.TextDocument): vscode.Selection { if (!node) { return; } let nodeToSelect = node.type === 'rule' ? node.selectorToken : node; + return new vscode.Selection(document.positionAt(nodeToSelect.start), document.positionAt(nodeToSelect.end)); +} - let selectionStart = (node.type === 'property' && selectPropertyValue) ? node.valueToken.start : nodeToSelect.start; - let selectionEnd = (node.type === 'property' && selectPropertyValue) ? node.valueToken.end : nodeToSelect.end; - return new vscode.Selection(document.positionAt(selectionStart), document.positionAt(selectionEnd)); +function getSelectionFromProperty(node: Node, document: vscode.TextDocument, selectionStart: number, selectionEnd: number, selectFullValue: boolean, direction: string): vscode.Selection { + if (!node || node.type !== 'property') { + return; + } + let propertyValue = node.valueToken.stream.substring(node.valueToken.start, node.valueToken.end); + selectFullValue = selectFullValue || (direction === 'prev' && selectionStart === node.valueToken.start && selectionEnd < node.valueToken.end); + + if (selectFullValue) { + return new vscode.Selection(document.positionAt(node.valueToken.start), document.positionAt(node.valueToken.end)); + } + + let pos; + if (direction === 'prev') { + if (selectionStart === node.valueToken.start) { + return; + } + pos = selectionStart > node.valueToken.end ? propertyValue.length : selectionStart - node.valueToken.start; + } + + if (direction === 'next') { + if (selectionEnd === node.valueToken.end && (selectionStart > node.valueToken.start || propertyValue.indexOf(' ') === -1)) { + return; + } + pos = selectionEnd === node.valueToken.end ? -1 : selectionEnd - node.valueToken.start - 1; + } + + + let [newSelectionStart, newSelectionEnd] = direction === 'prev' ? findPrevWord(propertyValue, pos) : findNextWord(propertyValue, pos); + if (!newSelectionStart && !newSelectionEnd) { + return; + } + + newSelectionStart += node.valueToken.start; + newSelectionEnd += node.valueToken.start; + + return new vscode.Selection(document.positionAt(newSelectionStart), document.positionAt(newSelectionEnd)); } diff --git a/extensions/emmet/src/util.ts b/extensions/emmet/src/util.ts index 3b495069d1e..81085e5b6d6 100644 --- a/extensions/emmet/src/util.ts +++ b/extensions/emmet/src/util.ts @@ -136,4 +136,80 @@ export function getDeepestNode(node: Node): Node { } return getDeepestNode(node.children[node.children.length - 1]); +} + +export function findNextWord(propertyValue: string, pos: number): [number, number] { + + let foundSpace = pos === -1; + let foundStart = false; + let foundEnd = false; + + let newSelectionStart; + let newSelectionEnd; + while (pos < propertyValue.length - 1) { + pos++; + if (!foundSpace) { + if (propertyValue[pos] === ' ') { + foundSpace = true; + } + continue; + } + if (foundSpace && !foundStart && propertyValue[pos] === ' ') { + continue; + } + if (!foundStart) { + newSelectionStart = pos; + foundStart = true; + continue; + } + if (propertyValue[pos] === ' ') { + newSelectionEnd = pos; + foundEnd = true; + break; + } + } + + if (foundStart && !foundEnd) { + newSelectionEnd = propertyValue.length; + } + + return [newSelectionStart, newSelectionEnd]; +} + +export function findPrevWord(propertyValue: string, pos: number): [number, number] { + + let foundSpace = pos === propertyValue.length; + let foundStart = false; + let foundEnd = false; + + let newSelectionStart; + let newSelectionEnd; + while (pos > -1) { + pos--; + if (!foundSpace) { + if (propertyValue[pos] === ' ') { + foundSpace = true; + } + continue; + } + if (foundSpace && !foundEnd && propertyValue[pos] === ' ') { + continue; + } + if (!foundEnd) { + newSelectionEnd = pos + 1; + foundEnd = true; + continue; + } + if (propertyValue[pos] === ' ') { + newSelectionStart = pos + 1; + foundStart = true; + break; + } + } + + if (foundEnd && !foundStart) { + newSelectionStart = 0; + } + + return [newSelectionStart, newSelectionEnd]; } \ No newline at end of file From b96478ebcc790c03c27e1ee36ee6dbc23c882231 Mon Sep 17 00:00:00 2001 From: Maik Riechert Date: Wed, 3 May 2017 22:53:26 +0100 Subject: [PATCH 0983/1164] add git delete branch command --- extensions/git/package.json | 9 ++++++++ extensions/git/package.nls.json | 1 + extensions/git/src/commands.ts | 39 +++++++++++++++++++++++++++++++++ extensions/git/src/git.ts | 5 +++++ extensions/git/src/model.ts | 7 +++++- 5 files changed, 60 insertions(+), 1 deletion(-) diff --git a/extensions/git/package.json b/extensions/git/package.json index 2a47e2dc209..0ea489cc812 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -172,6 +172,11 @@ "title": "%command.branch%", "category": "Git" }, + { + "command": "git.deleteBranch", + "title": "%command.deleteBranch%", + "category": "Git" + }, { "command": "git.pull", "title": "%command.pull%", @@ -298,6 +303,10 @@ "command": "git.branch", "when": "config.git.enabled && scmProvider == git && gitState == idle" }, + { + "command": "git.deleteBranch", + "when": "config.git.enabled && scmProvider == git && gitState == idle" + }, { "command": "git.pull", "when": "config.git.enabled && scmProvider == git && gitState == idle" diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index efdde34dd7a..e02a5ed2310 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -21,6 +21,7 @@ "command.undoCommit": "Undo Last Commit", "command.checkout": "Checkout to...", "command.branch": "Create Branch...", + "command.deleteBranch": "Delete Branch...", "command.pull": "Pull", "command.pullRebase": "Pull (Rebase)", "command.push": "Push", diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 24f9c35129a..15532bfc28b 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -60,6 +60,26 @@ class CheckoutRemoteHeadItem extends CheckoutItem { } } +class BranchDeleteItem implements QuickPickItem { + + protected get shortCommit(): string { return (this.ref.commit || '').substr(0, 8); } + protected get treeish(): string | undefined { return this.ref.name; } + get label(): string { return this.ref.name || this.shortCommit; } + get description(): string { return this.shortCommit; } + + constructor(protected ref: Ref) { } + + async run(model: Model): Promise { + const ref = this.treeish; + + if (!ref) { + return; + } + + await model.deleteBranch(ref); + } +} + interface Command { commandId: string; key: string; @@ -699,6 +719,25 @@ export class CommandCenter { await this.model.branch(name); } + @command('git.deleteBranch') + async deleteBranch(branchName: string): Promise { + if (typeof branchName === 'string') { + return await this.model.deleteBranch(branchName); + } + const currentHead = this.model.HEAD && this.model.HEAD.name; + const heads = this.model.refs.filter(ref => ref.type === RefType.Head && ref.name !== currentHead) + .map(ref => new BranchDeleteItem(ref)); + + const placeHolder = 'Select a branch to delete'; + const choice = await window.showQuickPick(heads, { placeHolder }); + + if (!choice) { + return; + } + + await choice.run(this.model); + } + @command('git.pull') async pull(): Promise { const remotes = this.model.remotes; diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 751fbccc15e..edba69ad2ed 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -650,6 +650,11 @@ export class Repository { await this.run(args); } + async deleteBranch(name: string): Promise { + const args = ['branch', '-d', name]; + await this.run(args); + } + async clean(paths: string[]): Promise { const pathsByGroup = groupBy(paths, p => path.dirname(p)); const groups = Object.keys(pathsByGroup).map(k => pathsByGroup[k]); diff --git a/extensions/git/src/model.ts b/extensions/git/src/model.ts index 3e8377e93eb..1ce7f8287a9 100644 --- a/extensions/git/src/model.ts +++ b/extensions/git/src/model.ts @@ -210,7 +210,8 @@ export enum Operation { Init = 1 << 12, Show = 1 << 13, Stage = 1 << 14, - GetCommitTemplate = 1 << 15 + GetCommitTemplate = 1 << 15, + DeleteBranch = 1 << 16 } // function getOperationName(operation: Operation): string { @@ -453,6 +454,10 @@ export class Model implements Disposable { await this.run(Operation.Branch, () => this.repository.branch(name, true)); } + async deleteBranch(name: string): Promise { + await this.run(Operation.DeleteBranch, () => this.repository.deleteBranch(name)); + } + async checkout(treeish: string): Promise { await this.run(Operation.Checkout, () => this.repository.checkout(treeish, [])); } From b348a0b780bb1879db84022fc58875000e12bc89 Mon Sep 17 00:00:00 2001 From: Maik Riechert Date: Sat, 6 May 2017 16:23:50 +0100 Subject: [PATCH 0984/1164] handle git branch delete error ("not fully merged") --- extensions/git/src/commands.ts | 59 +++++++++++++++++++++------------- extensions/git/src/git.ts | 9 ++++-- extensions/git/src/model.ts | 4 +-- 3 files changed, 45 insertions(+), 27 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 15532bfc28b..e8c155102a3 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -62,21 +62,18 @@ class CheckoutRemoteHeadItem extends CheckoutItem { class BranchDeleteItem implements QuickPickItem { - protected get shortCommit(): string { return (this.ref.commit || '').substr(0, 8); } - protected get treeish(): string | undefined { return this.ref.name; } - get label(): string { return this.ref.name || this.shortCommit; } + private get shortCommit(): string { return (this.ref.commit || '').substr(0, 8); } + get branchName(): string | undefined { return this.ref.name; } + get label(): string { return this.branchName || ''; } get description(): string { return this.shortCommit; } - constructor(protected ref: Ref) { } + constructor(private ref: Ref) { } - async run(model: Model): Promise { - const ref = this.treeish; - - if (!ref) { + async run(model: Model, force?: boolean): Promise { + if (!this.branchName) { return; } - - await model.deleteBranch(ref); + await model.deleteBranch(this.branchName, force); } } @@ -720,22 +717,40 @@ export class CommandCenter { } @command('git.deleteBranch') - async deleteBranch(branchName: string): Promise { - if (typeof branchName === 'string') { - return await this.model.deleteBranch(branchName); - } - const currentHead = this.model.HEAD && this.model.HEAD.name; - const heads = this.model.refs.filter(ref => ref.type === RefType.Head && ref.name !== currentHead) - .map(ref => new BranchDeleteItem(ref)); + async deleteBranch(name: string, force?: boolean): Promise { + let run: (force?: boolean) => Promise; + if (typeof name === 'string') { + run = force => this.model.deleteBranch(name, force); + } else { + const currentHead = this.model.HEAD && this.model.HEAD.name; + const heads = this.model.refs.filter(ref => ref.type === RefType.Head && ref.name !== currentHead) + .map(ref => new BranchDeleteItem(ref)); - const placeHolder = 'Select a branch to delete'; - const choice = await window.showQuickPick(heads, { placeHolder }); + const placeHolder = 'Select a branch to delete'; + const choice = await window.showQuickPick(heads, { placeHolder }); - if (!choice) { - return; + if (!choice) { + return; + } + name = choice.branchName || ''; + run = force => choice.run(this.model, force); } - await choice.run(this.model); + try { + await run(force); + } catch (err) { + if (err.gitErrorCode !== GitErrorCodes.BranchNotFullyMerged) { + throw err; + } + + const message = localize('confirm force delete branch', "The branch '{0}' is not fully merged. Delete anyway?", name); + const yes = localize('delete branch', "Delete Branch"); + const pick = await window.showWarningMessage(message, yes); + + if (pick === yes) { + await run(true); + } + } } @command('git.pull') diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index edba69ad2ed..9ef482def93 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -273,7 +273,8 @@ export const GitErrorCodes = { CantCreatePipe: 'CantCreatePipe', CantAccessRemote: 'CantAccessRemote', RepositoryNotFound: 'RepositoryNotFound', - RepositoryIsLocked: 'RepositoryIsLocked' + RepositoryIsLocked: 'RepositoryIsLocked', + BranchNotFullyMerged: 'BranchNotFullyMerged' }; function getGitErrorCode(stderr: string): string | undefined { @@ -291,6 +292,8 @@ function getGitErrorCode(stderr: string): string | undefined { return GitErrorCodes.RepositoryNotFound; } else if (/unable to access/.test(stderr)) { return GitErrorCodes.CantAccessRemote; + } else if (/branch '.+' is not fully merged/.test(stderr)) { + return GitErrorCodes.BranchNotFullyMerged; } return void 0; @@ -650,8 +653,8 @@ export class Repository { await this.run(args); } - async deleteBranch(name: string): Promise { - const args = ['branch', '-d', name]; + async deleteBranch(name: string, force?: boolean): Promise { + const args = ['branch', force ? '-D' : '-d', name]; await this.run(args); } diff --git a/extensions/git/src/model.ts b/extensions/git/src/model.ts index 1ce7f8287a9..aba4a4251d6 100644 --- a/extensions/git/src/model.ts +++ b/extensions/git/src/model.ts @@ -454,8 +454,8 @@ export class Model implements Disposable { await this.run(Operation.Branch, () => this.repository.branch(name, true)); } - async deleteBranch(name: string): Promise { - await this.run(Operation.DeleteBranch, () => this.repository.deleteBranch(name)); + async deleteBranch(name: string, force?: boolean): Promise { + await this.run(Operation.DeleteBranch, () => this.repository.deleteBranch(name, force)); } async checkout(treeish: string): Promise { From 3df1eca296aa247dd5687f352df0cf6478a3b94c Mon Sep 17 00:00:00 2001 From: Maik Riechert Date: Sat, 6 May 2017 16:55:38 +0100 Subject: [PATCH 0985/1164] localize --- extensions/git/src/commands.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index e8c155102a3..3ede435fff3 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -726,13 +726,13 @@ export class CommandCenter { const heads = this.model.refs.filter(ref => ref.type === RefType.Head && ref.name !== currentHead) .map(ref => new BranchDeleteItem(ref)); - const placeHolder = 'Select a branch to delete'; + const placeHolder = localize('select branch to delete', 'Select a branch to delete'); const choice = await window.showQuickPick(heads, { placeHolder }); - if (!choice) { + if (!choice || !choice.branchName) { return; } - name = choice.branchName || ''; + name = choice.branchName; run = force => choice.run(this.model, force); } From 4fc88f02f0ec346215dca2fea3eb8d3ea10f3a78 Mon Sep 17 00:00:00 2001 From: Amy Qiu Date: Thu, 18 May 2017 13:00:04 -0700 Subject: [PATCH 0986/1164] Fix #26821 Memento - Search now remembers if you cleared your input before shutdown --- src/vs/workbench/parts/search/browser/searchViewlet.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index 8b693080d26..1010cbcaf5b 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -1348,6 +1348,13 @@ export class SearchViewlet extends Viewlet { ]; } + public shutdown(): void { + this.viewletSettings['query.contentPattern'] = this.searchWidget.searchInput.getValue(); + this.saveMemento(); + + super.shutdown(); + } + public dispose(): void { this.isDisposed = true; From 41320ccf9e1d473fa26d39a13ee7508918817442 Mon Sep 17 00:00:00 2001 From: Amy Qiu Date: Thu, 18 May 2017 14:09:32 -0700 Subject: [PATCH 0987/1164] Fix saveMemento --- src/vs/workbench/parts/search/browser/searchViewlet.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index 1010cbcaf5b..deb804b45b1 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -1350,7 +1350,6 @@ export class SearchViewlet extends Viewlet { public shutdown(): void { this.viewletSettings['query.contentPattern'] = this.searchWidget.searchInput.getValue(); - this.saveMemento(); super.shutdown(); } From d82706abf28670120a85e5c64cbda9a65939bf1b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 24 May 2017 13:02:51 +0200 Subject: [PATCH 0988/1164] theming: extension buttons --- .../extensions/browser/extensionsActions.ts | 66 +++++++++++++++++-- .../browser/media/extensionActions.css | 59 ----------------- 2 files changed, 62 insertions(+), 63 deletions(-) diff --git a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts index 47ccf37113e..3b557abaf33 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts @@ -32,13 +32,16 @@ import { IExtensionService, IExtensionDescription } from 'vs/platform/extensions import URI from 'vs/base/common/uri'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { registerThemingParticipant, ITheme, ICssStyleCollector } from "vs/platform/theme/common/themeService"; +import { buttonBackground, buttonForeground, buttonHoverBackground, contrastBorder, registerColor } from "vs/platform/theme/common/colorRegistry"; +import { Color } from "vs/base/common/color"; export class InstallAction extends Action { private static InstallLabel = localize('installAction', "Install"); private static InstallingLabel = localize('installing', "Installing"); - private static Class = 'extension-action install'; + private static Class = 'extension-action prominent install'; private static InstallingClass = 'extension-action install installing'; private disposables: IDisposable[] = []; @@ -153,7 +156,7 @@ export class UninstallAction extends Action { export class CombinedInstallAction extends Action { - private static NoExtensionClass = 'extension-action install no-extension'; + private static NoExtensionClass = 'extension-action prominent install no-extension'; private installAction: InstallAction; private uninstallAction: UninstallAction; private disposables: IDisposable[] = []; @@ -224,7 +227,7 @@ export class CombinedInstallAction extends Action { export class UpdateAction extends Action { - private static EnabledClass = 'extension-action update'; + private static EnabledClass = 'extension-action prominent update'; private static DisabledClass = `${UpdateAction.EnabledClass} disabled`; private static Label = localize('updateAction', "Update"); @@ -477,7 +480,7 @@ export class EnableGloballyAction extends Action implements IExtensionAction { export class EnableAction extends Action { static ID = 'extensions.enable'; - private static EnabledClass = 'extension-action enable'; + private static EnabledClass = 'extension-action prominent enable'; private static DisabledClass = `${EnableAction.EnabledClass} disabled`; private disposables: IDisposable[] = []; @@ -1385,3 +1388,58 @@ CommandsRegistry.registerCommand('workbench.extensions.action.showLanguageExtens viewlet.focus(); }); }); + +export const extensionButtonProminentBackground = registerColor('extensionButton.prominentBackground', { + dark: '#327e36', + light: '#327e36', + hc: null +}, localize('extensionButtonProminentBackground', "Button background color for actions extension that stand out (e.g. install button).")); + +export const extensionButtonProminentForeground = registerColor('extensionButton.prominentForeground', { + dark: Color.white, + light: Color.white, + hc: null +}, localize('extensionButtonProminentForeground', "Button foreground color for actions extension that stand out (e.g. install button).")); + +export const extensionButtonProminentHoverBackground = registerColor('extensionButton.prominentHoverBackground', { + dark: '#28632b', + light: '#28632b', + hc: null +}, localize('extensionButtonProminentHoverBackground', "Button background hover color for actions extension that stand out (e.g. install button).")); + +registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { + const buttonBackgroundColor = theme.getColor(buttonBackground); + if (buttonBackgroundColor) { + collector.addRule(`.monaco-action-bar .action-item .action-label.extension-action { background-color: ${buttonBackgroundColor}; }`); + } + + const buttonForegroundColor = theme.getColor(buttonForeground); + if (buttonForegroundColor) { + collector.addRule(`.monaco-action-bar .action-item .action-label.extension-action { color: ${buttonForegroundColor}; }`); + } + + const buttonHoverBackgroundColor = theme.getColor(buttonHoverBackground); + if (buttonHoverBackgroundColor) { + collector.addRule(`.monaco-action-bar .action-item:hover .action-label.extension-action { background-color: ${buttonHoverBackgroundColor}; }`); + } + + const contrastBorderColor = theme.getColor(contrastBorder); + if (contrastBorderColor) { + collector.addRule(`.monaco-action-bar .action-item .action-label.extension-action { border: 1px solid ${contrastBorderColor}; }`); + } + + const extensionButtonProminentBackgroundColor = theme.getColor(extensionButtonProminentBackground); + if (extensionButtonProminentBackground) { + collector.addRule(`.monaco-action-bar .action-item .action-label.extension-action.prominent { background-color: ${extensionButtonProminentBackgroundColor}; }`); + } + + const extensionButtonProminentForegroundColor = theme.getColor(extensionButtonProminentForeground); + if (extensionButtonProminentForeground) { + collector.addRule(`.monaco-action-bar .action-item .action-label.extension-action.prominent { color: ${extensionButtonProminentForegroundColor}; }`); + } + + const extensionButtonProminentHoverBackgroundColor = theme.getColor(extensionButtonProminentHoverBackground); + if (extensionButtonProminentHoverBackground) { + collector.addRule(`.monaco-action-bar .action-item:hover .action-label.extension-action.prominent { background-color: ${extensionButtonProminentHoverBackgroundColor}; }`); + } +}); \ No newline at end of file diff --git a/src/vs/workbench/parts/extensions/browser/media/extensionActions.css b/src/vs/workbench/parts/extensions/browser/media/extensionActions.css index 5a51986dce8..e80db60cdef 100644 --- a/src/vs/workbench/parts/extensions/browser/media/extensionActions.css +++ b/src/vs/workbench/parts/extensions/browser/media/extensionActions.css @@ -4,69 +4,10 @@ *--------------------------------------------------------------------------------------------*/ .monaco-action-bar .action-item .action-label.extension-action { - border: 1px solid #CCC; - color: #6C6C6C; - background-color: #E2E2E2; padding: 0 5px; line-height: initial; } -.monaco-action-bar .action-item:not(.disabled):hover .action-label.extension-action { - background-color: #D9D9D9; -} - -.monaco-action-bar .action-item:not(.disabled):active .action-label.extension-action { - background-color: #C9C9C9; -} - -.vs-dark .monaco-action-bar .action-item .action-label.extension-action { - border: 1px solid #545454; - color: #CCC; - background-color: #3A3A3A; -} - -.vs-dark .monaco-action-bar .action-item:not(.disabled):hover .action-label.extension-action { - background-color: #464646; -} - -.vs-dark .monaco-action-bar .action-item:not(.disabled):active .action-label.extension-action { - background-color: #505050; -} - -.monaco-action-bar .action-item .action-label.extension-action.install, -.monaco-action-bar .action-item .action-label.extension-action.enable, -.monaco-action-bar .action-item .action-label.extension-action.update { - color: white; - background-color: #327e36; - border-color: #519A55; -} - -.monaco-action-bar .action-item:not(.disabled):hover .action-label.extension-action.install, -.monaco-action-bar .action-item:not(.disabled):hover .action-label.extension-action.enable, -.monaco-action-bar .action-item:not(.disabled):hover .action-label.extension-action.update { - background-color: #478E4B; -} - -.monaco-action-bar .action-item:not(.disabled):active .action-label.extension-action.install, -.monaco-action-bar .action-item:not(.disabled):active .action-label.extension-action.enable, -.monaco-action-bar .action-item:not(.disabled):active .action-label.extension-action.update { - background-color: #6DA770; -} - -.monaco-action-bar .action-item .action-label.extension-action.reload { - color: white; - background-color: #007ACC; - border-color: #3F8BCE; -} - -.monaco-action-bar .action-item:not(.disabled):hover .action-label.extension-action.reload { - background-color: #2584C4; -} - -.monaco-action-bar .action-item:not(.disabled):active .action-label.extension-action.reload { - background-color: #4294CC -} - .monaco-action-bar .action-item .action-label.clear-extensions { background: url('clear.svg') center center no-repeat; } From 9e0a6c00cdd8e6bf2ce298adc2b154a8fcefcfce Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 24 May 2017 13:12:13 +0200 Subject: [PATCH 0989/1164] Add tests for PagedScreenReaderStrategy --- .../browser/controller/textAreaState.test.ts | 87 ++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/test/browser/controller/textAreaState.test.ts b/src/vs/editor/test/browser/controller/textAreaState.test.ts index 2423f8d3836..1d2c76be87d 100644 --- a/src/vs/editor/test/browser/controller/textAreaState.test.ts +++ b/src/vs/editor/test/browser/controller/textAreaState.test.ts @@ -5,10 +5,12 @@ 'use strict'; import * as assert from 'assert'; -import { ISimpleModel, TextAreaState, ITextAreaWrapper } from 'vs/editor/browser/controller/textAreaState'; +import { ISimpleModel, TextAreaState, ITextAreaWrapper, PagedScreenReaderStrategy } from 'vs/editor/browser/controller/textAreaState'; import { Range } from 'vs/editor/common/core/range'; import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; import { Disposable } from 'vs/base/common/lifecycle'; +import { Model } from "vs/editor/common/model/model"; +import { Selection } from 'vs/editor/common/core/selection'; export class MockTextAreaWrapper extends Disposable implements ITextAreaWrapper { @@ -488,6 +490,89 @@ suite('TextAreaState', () => { '⌨️', 0 ); }); + + suite('PagedScreenReaderStrategy', () => { + + function testPagedScreenReaderStrategy(lines: string[], selection: Selection, expected: TextAreaState): void { + const model = Model.createFromString(lines.join('\n')); + const actual = PagedScreenReaderStrategy.fromEditorSelection(TextAreaState.EMPTY, model, selection); + assert.ok(actual.equals(expected), actual); + model.dispose(); + } + + test('simple', () => { + testPagedScreenReaderStrategy( + [ + 'Hello world!' + ], + new Selection(1, 13, 1, 13), + new TextAreaState('Hello world!', 12, 12) + ); + + testPagedScreenReaderStrategy( + [ + 'Hello world!' + ], + new Selection(1, 1, 1, 1), + new TextAreaState('Hello world!', 0, 0) + ); + + testPagedScreenReaderStrategy( + [ + 'Hello world!' + ], + new Selection(1, 1, 1, 6), + new TextAreaState('Hello world!', 0, 5) + ); + }); + + test('multiline', () => { + testPagedScreenReaderStrategy( + [ + 'Hello world!', + 'How are you?' + ], + new Selection(1, 1, 1, 1), + new TextAreaState('Hello world!\nHow are you?', 0, 0) + ); + + testPagedScreenReaderStrategy( + [ + 'Hello world!', + 'How are you?' + ], + new Selection(2, 1, 2, 1), + new TextAreaState('Hello world!\nHow are you?', 13, 13) + ); + }); + + test('page', () => { + testPagedScreenReaderStrategy( + [ + 'L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10\nL11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20\nL21' + ], + new Selection(1, 1, 1, 1), + new TextAreaState('L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10', 0, 0) + ); + + testPagedScreenReaderStrategy( + [ + 'L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10\nL11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20\nL21' + ], + new Selection(11, 1, 11, 1), + new TextAreaState('L11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20', 0, 0) + ); + + testPagedScreenReaderStrategy( + [ + 'L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10\nL11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20\nL21' + ], + new Selection(12, 1, 12, 1), + new TextAreaState('L11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20', 4, 4) + ); + }); + + }); }); class SimpleModel implements ISimpleModel { From 7a0fec4abf7da4182333f6e769e80587593cc672 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 24 May 2017 13:14:25 +0200 Subject: [PATCH 0990/1164] Add trailing new line to current page (if there is one) --- .../editor/browser/controller/textAreaState.ts | 3 +-- .../browser/controller/textAreaState.test.ts | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/vs/editor/browser/controller/textAreaState.ts b/src/vs/editor/browser/controller/textAreaState.ts index 41581a76cda..d398f510147 100644 --- a/src/vs/editor/browser/controller/textAreaState.ts +++ b/src/vs/editor/browser/controller/textAreaState.ts @@ -6,7 +6,6 @@ import { Range } from 'vs/editor/common/core/range'; import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; -import { Constants } from 'vs/editor/common/core/uint'; import * as strings from 'vs/base/common/strings'; export interface ITextAreaWrapper { @@ -206,7 +205,7 @@ export class PagedScreenReaderStrategy { let offset = page * PagedScreenReaderStrategy._LINES_PER_PAGE; let startLineNumber = offset + 1; let endLineNumber = offset + PagedScreenReaderStrategy._LINES_PER_PAGE; - return new Range(startLineNumber, 1, endLineNumber, Constants.MAX_SAFE_SMALL_INTEGER); + return new Range(startLineNumber, 1, endLineNumber + 1, 1); } public static fromEditorSelection(previousState: TextAreaState, model: ISimpleModel, selection: Range): TextAreaState { diff --git a/src/vs/editor/test/browser/controller/textAreaState.test.ts b/src/vs/editor/test/browser/controller/textAreaState.test.ts index 1d2c76be87d..9170690d5ec 100644 --- a/src/vs/editor/test/browser/controller/textAreaState.test.ts +++ b/src/vs/editor/test/browser/controller/textAreaState.test.ts @@ -496,7 +496,7 @@ suite('TextAreaState', () => { function testPagedScreenReaderStrategy(lines: string[], selection: Selection, expected: TextAreaState): void { const model = Model.createFromString(lines.join('\n')); const actual = PagedScreenReaderStrategy.fromEditorSelection(TextAreaState.EMPTY, model, selection); - assert.ok(actual.equals(expected), actual); + assert.ok(actual.equals(expected)); model.dispose(); } @@ -552,7 +552,7 @@ suite('TextAreaState', () => { 'L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10\nL11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20\nL21' ], new Selection(1, 1, 1, 1), - new TextAreaState('L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10', 0, 0) + new TextAreaState('L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10\n', 0, 0) ); testPagedScreenReaderStrategy( @@ -560,7 +560,7 @@ suite('TextAreaState', () => { 'L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10\nL11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20\nL21' ], new Selection(11, 1, 11, 1), - new TextAreaState('L11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20', 0, 0) + new TextAreaState('L11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20\n', 0, 0) ); testPagedScreenReaderStrategy( @@ -568,7 +568,15 @@ suite('TextAreaState', () => { 'L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10\nL11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20\nL21' ], new Selection(12, 1, 12, 1), - new TextAreaState('L11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20', 4, 4) + new TextAreaState('L11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20\n', 4, 4) + ); + + testPagedScreenReaderStrategy( + [ + 'L1\nL2\nL3\nL4\nL5\nL6\nL7\nL8\nL9\nL10\nL11\nL12\nL13\nL14\nL15\nL16\nL17\nL18\nL19\nL20\nL21' + ], + new Selection(21, 1, 21, 1), + new TextAreaState('L21', 0, 0) ); }); From 6cf1e118ae2722785ace9b192f4222ecb0857cec Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 24 May 2017 13:19:01 +0200 Subject: [PATCH 0991/1164] use process.hrtime for tick timers --- src/vs/base/node/startupTimers.d.ts | 6 +++--- src/vs/base/node/startupTimers.js | 16 +++++----------- .../electron-browser/bootstrap/index.js | 2 -- src/vs/workbench/electron-browser/shell.ts | 7 +------ 4 files changed, 9 insertions(+), 22 deletions(-) diff --git a/src/vs/base/node/startupTimers.d.ts b/src/vs/base/node/startupTimers.d.ts index c91175b0262..5a04270f4b6 100644 --- a/src/vs/base/node/startupTimers.d.ts +++ b/src/vs/base/node/startupTimers.d.ts @@ -26,13 +26,13 @@ declare interface TickController { stop(stopped?: number): void; } -export function startTimer(name: string, started?: number): TickController; +export function startTimer(name: string): TickController; -export function stopTimer(name: string, stopped?: number); +export function stopTimer(name: string); export function ticks(): Tick[]; -export function tick(name:string):Tick; +export function tick(name: string): Tick; export function setProfileList(names: string[]): void; diff --git a/src/vs/base/node/startupTimers.js b/src/vs/base/node/startupTimers.js index 45637a77b58..7fc81812efc 100644 --- a/src/vs/base/node/startupTimers.js +++ b/src/vs/base/node/startupTimers.js @@ -31,7 +31,7 @@ define([], function () { this.name = name; this.started = started; this.stopped = stopped; - this.duration = stopped - started; + this.duration = Math.round(((stopped[0] * 1.e9 + stopped[1]) - (started[0] * 1e9 + started[1])) / 1.e6); this.profile = profile; } Tick.compareByStart = function (a, b) { @@ -55,17 +55,14 @@ define([], function () { var _ticks = global._perfTicks; var _toBeProfiled = global._perfToBeProfiled; - function startTimer(name, started) { - if (typeof started !== 'number') { - started = Date.now(); - } + function startTimer(name) { if (_starts.has(name)) { throw new Error("${name}" + " already exists"); } if (_toBeProfiled.has(name)) { requireProfiler().startProfiling(name, true); } - _starts.set(name, { name: name, started: started }); + _starts.set(name, { name: name, started: process.hrtime() }); var stop = stopTimer.bind(undefined, name); return { stop: stop, @@ -76,14 +73,11 @@ define([], function () { }; } - function stopTimer(name, stopped) { - if (typeof stopped !== 'number') { - stopped = Date.now(); - } + function stopTimer(name) { var profile = _toBeProfiled.has(name) ? requireProfiler().stopProfiling(name) : undefined; var start = _starts.get(name); if (start !== undefined) { - var tick = new Tick(start.name, start.started, stopped, profile); + var tick = new Tick(start.name, start.started, process.hrtime(), profile); _ticks.set(name, tick); _starts.delete(name); } diff --git a/src/vs/workbench/electron-browser/bootstrap/index.js b/src/vs/workbench/electron-browser/bootstrap/index.js index 2b20efb7bbc..c01da62847a 100644 --- a/src/vs/workbench/electron-browser/bootstrap/index.js +++ b/src/vs/workbench/electron-browser/bootstrap/index.js @@ -192,8 +192,6 @@ function main() { beforeLoadWorkbenchMain: Date.now() }; - startTimer('elapsed:overall', configuration.perfStartTime); - const workbenchMainTimer = startTimer('load:workbench.main') require([ 'vs/workbench/electron-browser/workbench.main', diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index ac4b1759dde..bec5d37606b 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -59,7 +59,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; -import { ILifecycleService, StartupKind } from 'vs/platform/lifecycle/common/lifecycle'; +import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IMessageService, IChoiceService, Severity, CloseAction } from 'vs/platform/message/common/message'; @@ -101,7 +101,6 @@ import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/work import { WorkbenchThemeService } from 'vs/workbench/services/themes/electron-browser/workbenchThemeService'; import { registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; import { foreground, selectionBackground, focusBorder, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, listHighlightForeground, inputPlaceholderForeground } from 'vs/platform/theme/common/colorRegistry'; -import { stopTimer } from 'vs/base/node/startupTimers'; /** * Services that we require for the Shell @@ -243,10 +242,6 @@ export class WorkbenchShell { startupKind: this.lifecycleService.startupKind }); - if (this.lifecycleService.startupKind === StartupKind.NewWindow) { - stopTimer('elapsed:overall'); - } - // Telemetry: startup metrics this.timerService.workbenchStarted = Date.now(); this.timerService.restoreEditorsDuration = info.restoreEditorsDuration; From 77b02e2c8101611c0299bf901a7e8644d06bf7b9 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 24 May 2017 15:27:05 +0200 Subject: [PATCH 0992/1164] use getAccessibilitySupport for F8, fixes #18366 --- src/vs/editor/contrib/gotoError/browser/gotoError.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/gotoError/browser/gotoError.ts b/src/vs/editor/contrib/gotoError/browser/gotoError.ts index 89fb5203c60..cf7c1658777 100644 --- a/src/vs/editor/contrib/gotoError/browser/gotoError.ts +++ b/src/vs/editor/contrib/gotoError/browser/gotoError.ts @@ -27,6 +27,8 @@ import { registerColor } from 'vs/platform/theme/common/colorRegistry'; import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; import { Color } from 'vs/base/common/color'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; +import { getAccessibilitySupport } from 'vs/base/browser/browser'; +import { AccessibilitySupport } from 'vs/base/common/platform'; class MarkerModel { @@ -276,7 +278,9 @@ class MarkerNavigationWidget extends ZoneWidget { public show(where: Position, heightInLines: number): void { super.show(where, heightInLines); - this.focus(); + if (getAccessibilitySupport() !== AccessibilitySupport.Disabled) { + this.focus(); + } } private _wireModelAndView(): void { From fff0136ca6ef81de2bb5b1d96d7735bb1c837579 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 24 May 2017 15:36:37 +0200 Subject: [PATCH 0993/1164] don't double print messages from the extension service --- .../workbench/api/electron-browser/mainThreadExtensionService.ts | 1 - src/vs/workbench/api/node/extHost.protocol.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts b/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts index 4bbea670cc2..14b8d69f5dc 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts @@ -135,7 +135,6 @@ export class MainProcessExtensionService extends AbstractExtensionService { throw ni(); } } From a0a1b9e0d606a2b20844a32e73899bfc340b562c Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 24 May 2017 15:54:47 +0200 Subject: [PATCH 0994/1164] fixes #26184 --- extensions/git/src/commands.ts | 2 +- src/vs/base/browser/ui/list/listWidget.ts | 23 +++++++++++++++++++ .../parts/scm/electron-browser/scmViewlet.ts | 17 +++++++++++++- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 3ede435fff3..eed354dd8a4 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -149,7 +149,7 @@ export class CommandCenter { return await commands.executeCommand('vscode.open', right); } - return await commands.executeCommand('vscode.diff', left, right, title); + return await commands.executeCommand('vscode.diff', left, right, title, { preview: true }); } private getLeftResource(resource: Resource): Uri | undefined { diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index 5643cc768a9..d8f833da540 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -321,6 +321,7 @@ class MouseController implements IDisposable { this.disposables = []; this.disposables.push(view.addListener('mousedown', e => this.onMouseDown(e))); this.disposables.push(view.addListener('click', e => this.onPointer(e))); + this.disposables.push(view.addListener('dblclick', e => this.onDoubleClick(e))); this.disposables.push(view.addListener(TouchEventType.Tap, e => this.onPointer(e))); } @@ -362,6 +363,19 @@ class MouseController implements IDisposable { this.list.open(focus); } + private onDoubleClick(e: IListMouseEvent): void { + e.preventDefault(); + e.stopPropagation(); + + if (isSelectionChangeEvent(e)) { + return; + } + + const focus = this.list.getFocus(); + this.list.setSelection(focus); + this.list.pin(focus); + } + private changeSelection(e: IListMouseEvent, reference: number | undefined): void { const focus = e.index; @@ -574,6 +588,11 @@ export class List implements ISpliceable, IDisposable { return mapEvent(this._onOpen.event, indexes => this.toListEvent({ indexes })); } + private _onPin = new Emitter(); + @memoize get onPin(): Event> { + return mapEvent(this._onPin.event, indexes => this.toListEvent({ indexes })); + } + private _onDOMFocus = new Emitter(); get onDOMFocus(): Event { return this._onDOMFocus.event; } @@ -813,6 +832,10 @@ export class List implements ISpliceable, IDisposable { this._onOpen.fire(indexes); } + pin(indexes: number[]): void { + this._onPin.fire(indexes); + } + style(styles: IListStyles): void { const content: string[] = []; diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index f395ebd5eed..1d4064b4fb3 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -25,6 +25,8 @@ import { VIEWLET_ID } from 'vs/workbench/parts/scm/common/scm'; import { FileLabel } from 'vs/workbench/browser/labels'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { ISCMService, ISCMProvider, ISCMResourceGroup, ISCMResource } from 'vs/workbench/services/scm/common/scm'; +import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; +import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -243,7 +245,9 @@ export class SCMViewlet extends Viewlet { @IThemeService protected themeService: IThemeService, @IMenuService private menuService: IMenuService, @IModelService private modelService: IModelService, - @ICommandService private commandService: ICommandService + @ICommandService private commandService: ICommandService, + @IEditorGroupService private groupService: IEditorGroupService, + @IWorkbenchEditorService private editorService: IWorkbenchEditorService ) { super(VIEWLET_ID, telemetryService, themeService); @@ -320,6 +324,11 @@ export class SCMViewlet extends Viewlet { .filter(e => !!e && isSCMResource(e)) .on(this.open, this, this.disposables); + chain(this.list.onPin) + .map(e => e.elements[0]) + .filter(e => !!e && isSCMResource(e)) + .on(this.pin, this, this.disposables); + this.list.onContextMenu(this.onListContextMenu, this, this.disposables); this.disposables.push(this.list); @@ -406,6 +415,12 @@ export class SCMViewlet extends Viewlet { .done(undefined, onUnexpectedError); } + private pin(): void { + const activeEditor = this.editorService.getActiveEditor(); + const activeEditorInput = this.editorService.getActiveEditorInput(); + this.groupService.pinEditor(activeEditor.position, activeEditorInput); + } + getTitle(): string { const title = localize('source control', "Source Control"); const providerLabel = this.scmService.activeProvider && this.scmService.activeProvider.label; From 7131a14238e363ce2df6e60e6a0f02c0543a2487 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 24 May 2017 17:06:53 +0200 Subject: [PATCH 0995/1164] Revert "allow offsets for fuzzyScore, towards #26096" This reverts commit 093eac502f5546171f0f57aecfc9aa1c28bfa413. --- src/vs/base/common/filters.ts | 74 ++++++++++++------------- src/vs/base/test/common/filters.test.ts | 7 --- 2 files changed, 37 insertions(+), 44 deletions(-) diff --git a/src/vs/base/common/filters.ts b/src/vs/base/common/filters.ts index 8719c8c662a..19056d36a50 100644 --- a/src/vs/base/common/filters.ts +++ b/src/vs/base/common/filters.ts @@ -450,7 +450,7 @@ _seps[':'] = true; const enum Arrow { Top = 0b1, Diag = 0b10, Left = 0b100 } -export function fuzzyScore(pattern: string, word: string, patternOffset: number = 0, wordOffset: number = 0): [number, number[]] { +export function fuzzyScore(pattern: string, word: string): [number, number[]] { const patternLen = pattern.length > 100 ? 100 : pattern.length; const wordLen = word.length > 100 ? 100 : word.length; @@ -465,16 +465,16 @@ export function fuzzyScore(pattern: string, word: string, patternOffset: number const lowPattern = pattern.toLowerCase(); const lowWord = word.toLowerCase(); - let patternPos = patternOffset; - let wordPos = wordOffset; + let i = 0; + let j = 0; - while (patternPos < patternLen && wordPos < wordLen) { - if (lowPattern[patternPos] === lowWord[wordPos]) { - patternPos += 1; + while (i < patternLen && j < wordLen) { + if (lowPattern[i] === lowWord[j]) { + i += 1; } - wordPos += 1; + j += 1; } - if (patternPos !== patternLen) { + if (i !== patternLen) { // no simple matches found -> return early return undefined; } @@ -482,24 +482,24 @@ export function fuzzyScore(pattern: string, word: string, patternOffset: number // keep track of the maximum score let maxScore = -1; - for (patternPos = patternOffset + 1; patternPos <= patternLen; patternPos++) { + for (i = 1; i <= patternLen; i++) { let lastLowWordChar = ''; - for (wordPos = wordOffset + 1; wordPos <= wordLen; wordPos++) { + for (j = 1; j <= wordLen; j++) { let score = -1; - let lowWordChar = lowWord[wordPos - 1]; - if (lowPattern[patternPos - 1] === lowWordChar) { + let lowWordChar = lowWord[j - 1]; + if (lowPattern[i - 1] === lowWordChar) { - if (wordPos === wordOffset + 1) { - if (pattern[patternPos - 1] === word[wordPos - 1]) { + if (j === 1) { + if (pattern[i - 1] === word[j - 1]) { score = 7; } else { score = 5; } - } else if (lowWordChar !== word[wordPos - 1]) { - if (pattern[patternPos - 1] === word[wordPos - 1]) { + } else if (lowWordChar !== word[j - 1]) { + if (pattern[i - 1] === word[j - 1]) { score = 7; } else { score = 5; @@ -512,38 +512,38 @@ export function fuzzyScore(pattern: string, word: string, patternOffset: number } } - _scores[patternPos][wordPos] = score; + _scores[i][j] = score; if (score > maxScore) { maxScore = score; } - let diag = _table[patternPos - 1][wordPos - 1] + (score > 1 ? 1 : score); - let top = _table[patternPos - 1][wordPos] + -1; - let left = _table[patternPos][wordPos - 1] + -1; + let diag = _table[i - 1][j - 1] + (score > 1 ? 1 : score); + let top = _table[i - 1][j] + -1; + let left = _table[i][j - 1] + -1; if (left >= top) { // left or diag if (left > diag) { - _table[patternPos][wordPos] = left; - _arrows[patternPos][wordPos] = Arrow.Left; + _table[i][j] = left; + _arrows[i][j] = Arrow.Left; } else if (left === diag) { - _table[patternPos][wordPos] = left; - _arrows[patternPos][wordPos] = Arrow.Left | Arrow.Diag; + _table[i][j] = left; + _arrows[i][j] = Arrow.Left | Arrow.Diag; } else { - _table[patternPos][wordPos] = diag; - _arrows[patternPos][wordPos] = Arrow.Diag; + _table[i][j] = diag; + _arrows[i][j] = Arrow.Diag; } } else { // top or diag if (top > diag) { - _table[patternPos][wordPos] = top; - _arrows[patternPos][wordPos] = Arrow.Top; + _table[i][j] = top; + _arrows[i][j] = Arrow.Top; } else if (top === diag) { - _table[patternPos][wordPos] = top; - _arrows[patternPos][wordPos] = Arrow.Top | Arrow.Diag; + _table[i][j] = top; + _arrows[i][j] = Arrow.Top | Arrow.Diag; } else { - _table[patternPos][wordPos] = diag; - _arrows[patternPos][wordPos] = Arrow.Diag; + _table[i][j] = diag; + _arrows[i][j] = Arrow.Diag; } } @@ -562,7 +562,7 @@ export function fuzzyScore(pattern: string, word: string, patternOffset: number } let bucket: [number, number[]][] = []; - findAllMatches(patternLen, patternLen, patternOffset, wordLen, wordOffset, 0, [], bucket, false); + findAllMatches(patternLen, patternLen, wordLen, 0, [], bucket, false); if (bucket.length === 0) { return undefined; @@ -580,7 +580,7 @@ export function fuzzyScore(pattern: string, word: string, patternOffset: number return topMatch; } -function findAllMatches(patternLen: number, patternPos: number, patternOffset: number, wordPos: number, wordOffset: number, total: number, matches: number[], bucket: [number, number[]][], lastMatched: boolean): void { +function findAllMatches(patternLen: number, patternPos: number, wordPos: number, total: number, matches: number[], bucket: [number, number[]][], lastMatched: boolean): void { if (bucket.length >= 10) { return; @@ -588,7 +588,7 @@ function findAllMatches(patternLen: number, patternPos: number, patternOffset: n let simpleMatchCount = 0; - while (patternPos > patternOffset && wordPos > wordOffset) { + while (patternPos > 0 && wordPos > 0) { let score = _scores[patternPos][wordPos]; let arrow = _arrows[patternPos][wordPos]; @@ -609,8 +609,8 @@ function findAllMatches(patternLen: number, patternPos: number, patternOffset: n if (arrow & Arrow.Left) { // left findAllMatches( - patternLen, patternPos, patternOffset, - wordPos - 1, wordOffset, + patternLen, patternPos, + wordPos - 1, matches.length !== 0 ? total - 1 : total, matches.slice(0), bucket, lastMatched ); diff --git a/src/vs/base/test/common/filters.test.ts b/src/vs/base/test/common/filters.test.ts index 797df43d1a2..ed8f708e757 100644 --- a/src/vs/base/test/common/filters.test.ts +++ b/src/vs/base/test/common/filters.test.ts @@ -325,13 +325,6 @@ suite('Filters', () => { assertMatches('f', ':foo', ':^foo', fuzzyScore); }); - test('fuzzyScore with offset', function () { - const matches = fuzzyScore('bc', 'abc', 0, 1); - assert.ok(matches); - const [, range] = matches; - assert.deepEqual(range, [1, 2]); - }); - function assertTopScore(filter: typeof fuzzyScore, pattern: string, expected: number, ...words: string[]) { let topScore = -(100 * 10); let topIdx = 0; From 16ece8e0c977b4c1d4e78d008c138eb91119f6c1 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 24 May 2017 17:31:02 +0200 Subject: [PATCH 0996/1164] make fuzzy match skip leading whitespace in pattern, fixes #26096 --- src/vs/base/common/filters.ts | 92 +++++++++++++++---------- src/vs/base/test/common/filters.test.ts | 14 +++- 2 files changed, 68 insertions(+), 38 deletions(-) diff --git a/src/vs/base/common/filters.ts b/src/vs/base/common/filters.ts index 19056d36a50..cb219b5c31b 100644 --- a/src/vs/base/common/filters.ts +++ b/src/vs/base/common/filters.ts @@ -448,6 +448,10 @@ _seps['\''] = true; _seps['"'] = true; _seps[':'] = true; +const _ws: { [ch: string]: boolean } = Object.create(null); +_ws[' '] = true; +_ws['\t'] = true; + const enum Arrow { Top = 0b1, Diag = 0b10, Left = 0b100 } export function fuzzyScore(pattern: string, word: string): [number, number[]] { @@ -455,7 +459,20 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { const patternLen = pattern.length > 100 ? 100 : pattern.length; const wordLen = word.length > 100 ? 100 : word.length; - if (patternLen === 0) { + // Check for leading whitespace in the pattern and + // start matching just after that position. This is + // like `pattern = pattern.rtrim()` but doesn't create + // a new string + let patternStartPos = 0; + for (const ch of pattern) { + if (_ws[ch]) { + patternStartPos += 1; + } else { + break; + } + } + + if (patternLen === patternStartPos) { return [-1, []]; } @@ -465,16 +482,17 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { const lowPattern = pattern.toLowerCase(); const lowWord = word.toLowerCase(); - let i = 0; - let j = 0; - while (i < patternLen && j < wordLen) { - if (lowPattern[i] === lowWord[j]) { - i += 1; + let patternPos = patternStartPos; + let wordPos = 0; + + while (patternPos < patternLen && wordPos < wordLen) { + if (lowPattern[patternPos] === lowWord[wordPos]) { + patternPos += 1; } - j += 1; + wordPos += 1; } - if (i !== patternLen) { + if (patternPos !== patternLen) { // no simple matches found -> return early return undefined; } @@ -482,24 +500,24 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { // keep track of the maximum score let maxScore = -1; - for (i = 1; i <= patternLen; i++) { + for (patternPos = patternStartPos + 1; patternPos <= patternLen; patternPos++) { let lastLowWordChar = ''; - for (j = 1; j <= wordLen; j++) { + for (wordPos = 1; wordPos <= wordLen; wordPos++) { let score = -1; - let lowWordChar = lowWord[j - 1]; - if (lowPattern[i - 1] === lowWordChar) { + let lowWordChar = lowWord[wordPos - 1]; + if (lowPattern[patternPos - 1] === lowWordChar) { - if (j === 1) { - if (pattern[i - 1] === word[j - 1]) { + if (wordPos === 1) { + if (pattern[patternPos - 1] === word[wordPos - 1]) { score = 7; } else { score = 5; } - } else if (lowWordChar !== word[j - 1]) { - if (pattern[i - 1] === word[j - 1]) { + } else if (lowWordChar !== word[wordPos - 1]) { + if (pattern[patternPos - 1] === word[wordPos - 1]) { score = 7; } else { score = 5; @@ -512,38 +530,38 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { } } - _scores[i][j] = score; + _scores[patternPos][wordPos] = score; if (score > maxScore) { maxScore = score; } - let diag = _table[i - 1][j - 1] + (score > 1 ? 1 : score); - let top = _table[i - 1][j] + -1; - let left = _table[i][j - 1] + -1; + let diag = _table[patternPos - 1][wordPos - 1] + (score > 1 ? 1 : score); + let top = _table[patternPos - 1][wordPos] + -1; + let left = _table[patternPos][wordPos - 1] + -1; if (left >= top) { // left or diag if (left > diag) { - _table[i][j] = left; - _arrows[i][j] = Arrow.Left; + _table[patternPos][wordPos] = left; + _arrows[patternPos][wordPos] = Arrow.Left; } else if (left === diag) { - _table[i][j] = left; - _arrows[i][j] = Arrow.Left | Arrow.Diag; + _table[patternPos][wordPos] = left; + _arrows[patternPos][wordPos] = Arrow.Left | Arrow.Diag; } else { - _table[i][j] = diag; - _arrows[i][j] = Arrow.Diag; + _table[patternPos][wordPos] = diag; + _arrows[patternPos][wordPos] = Arrow.Diag; } } else { // top or diag if (top > diag) { - _table[i][j] = top; - _arrows[i][j] = Arrow.Top; + _table[patternPos][wordPos] = top; + _arrows[patternPos][wordPos] = Arrow.Top; } else if (top === diag) { - _table[i][j] = top; - _arrows[i][j] = Arrow.Top | Arrow.Diag; + _table[patternPos][wordPos] = top; + _arrows[patternPos][wordPos] = Arrow.Top | Arrow.Diag; } else { - _table[i][j] = diag; - _arrows[i][j] = Arrow.Diag; + _table[patternPos][wordPos] = diag; + _arrows[patternPos][wordPos] = Arrow.Diag; } } @@ -562,7 +580,7 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { } let bucket: [number, number[]][] = []; - findAllMatches(patternLen, patternLen, wordLen, 0, [], bucket, false); + findAllMatches(patternLen, patternLen, patternStartPos, wordLen, 0, [], bucket, false); if (bucket.length === 0) { return undefined; @@ -580,7 +598,7 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { return topMatch; } -function findAllMatches(patternLen: number, patternPos: number, wordPos: number, total: number, matches: number[], bucket: [number, number[]][], lastMatched: boolean): void { +function findAllMatches(patternLen: number, patternPos: number, patternStartPos: number, wordPos: number, total: number, matches: number[], bucket: [number, number[]][], lastMatched: boolean): void { if (bucket.length >= 10) { return; @@ -588,7 +606,7 @@ function findAllMatches(patternLen: number, patternPos: number, wordPos: number, let simpleMatchCount = 0; - while (patternPos > 0 && wordPos > 0) { + while (patternPos > patternStartPos && wordPos > 0) { let score = _scores[patternPos][wordPos]; let arrow = _arrows[patternPos][wordPos]; @@ -609,7 +627,7 @@ function findAllMatches(patternLen: number, patternPos: number, wordPos: number, if (arrow & Arrow.Left) { // left findAllMatches( - patternLen, patternPos, + patternLen, patternPos, patternStartPos, wordPos - 1, matches.length !== 0 ? total - 1 : total, matches.slice(0), bucket, lastMatched @@ -635,7 +653,7 @@ function findAllMatches(patternLen: number, patternPos: number, wordPos: number, } } - if (matches.length !== patternLen) { + if (matches.length !== patternLen - patternStartPos) { // doesn't cover whole pattern return undefined; } diff --git a/src/vs/base/test/common/filters.test.ts b/src/vs/base/test/common/filters.test.ts index ed8f708e757..4753059f57c 100644 --- a/src/vs/base/test/common/filters.test.ts +++ b/src/vs/base/test/common/filters.test.ts @@ -195,7 +195,7 @@ suite('Filters', () => { function assertMatches(pattern: string, word: string, decoratedWord: string, filter: typeof fuzzyScore) { let r = filter(pattern, word); - assert.ok(Boolean(r) === Boolean(decoratedWord)); + assert.ok(!decoratedWord === (!r || r[1].length === 0)); if (r) { const [, matches] = r; let pos = 0; @@ -325,6 +325,18 @@ suite('Filters', () => { assertMatches('f', ':foo', ':^foo', fuzzyScore); }); + test('Vscode 1.12 no longer obeys \'sortText\' in completion items (from language server), #26096', function () { + assertMatches(' ', ' group', undefined, fuzzyScore); + assertMatches(' g', ' group', ' ^group', fuzzyScore); + assertMatches('g', ' group', ' ^group', fuzzyScore); + assertMatches('g g', ' groupGroup', undefined, fuzzyScore); + assertMatches('g g', ' group Group', ' ^group^ ^Group', fuzzyScore); + assertMatches(' g g', ' group Group', ' ^group^ ^Group', fuzzyScore); + assertMatches('zz', 'zzGroup', '^z^zGroup', fuzzyScore); + assertMatches('zzg', 'zzGroup', '^z^z^Group', fuzzyScore); + assertMatches('g', 'zzGroup', 'zz^Group', fuzzyScore); + }); + function assertTopScore(filter: typeof fuzzyScore, pattern: string, expected: number, ...words: string[]) { let topScore = -(100 * 10); let topIdx = 0; From fb0c96d37b281e0d86305148ce8f490e2f2e9187 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 24 May 2017 17:59:05 +0200 Subject: [PATCH 0997/1164] don't score when the word is the empty word, #26096 --- src/vs/base/common/filters.ts | 2 +- .../suggest/browser/completionModel.ts | 10 ++++++- .../test/browser/completionModel.test.ts | 28 ++++++++++++++++++- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/vs/base/common/filters.ts b/src/vs/base/common/filters.ts index cb219b5c31b..d4b186650cc 100644 --- a/src/vs/base/common/filters.ts +++ b/src/vs/base/common/filters.ts @@ -473,7 +473,7 @@ export function fuzzyScore(pattern: string, word: string): [number, number[]] { } if (patternLen === patternStartPos) { - return [-1, []]; + return [-100, []]; } if (patternLen > wordLen) { diff --git a/src/vs/editor/contrib/suggest/browser/completionModel.ts b/src/vs/editor/contrib/suggest/browser/completionModel.ts index e3bc875458f..7bae1f39781 100644 --- a/src/vs/editor/contrib/suggest/browser/completionModel.ts +++ b/src/vs/editor/contrib/suggest/browser/completionModel.ts @@ -124,7 +124,15 @@ export class CompletionModel { word = wordLen === 0 ? '' : leadingLineContent.slice(-wordLen); } - if (typeof suggestion.filterText === 'string') { + if (wordLen === 0) { + // when there is nothing to score against, don't + // event try to do. Use a const rank and rely on + // the fallback-sort using the initial sort order. + // use a score of `-100` because that is out of the + // bound of values `fuzzyScore` will return + item.score = -100; + + } else if (typeof suggestion.filterText === 'string') { // when there is a `filterText` it must match the `word`. // if it matches we check with the label to compute highlights // and if that doesn't yield a result we have no highlights, diff --git a/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts b/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts index af82d02dca0..fd3f85b3235 100644 --- a/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts +++ b/src/vs/editor/contrib/suggest/test/browser/completionModel.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { ISuggestion, ISuggestResult, ISuggestSupport, SuggestionType } from 'vs/editor/common/modes'; -import { ISuggestionItem } from 'vs/editor/contrib/suggest/browser/suggest'; +import { ISuggestionItem, getSuggestionComparator } from 'vs/editor/contrib/suggest/browser/suggest'; import { CompletionModel } from 'vs/editor/contrib/suggest/browser/completionModel'; import { IPosition } from 'vs/editor/common/core/position'; import { TPromise } from "vs/base/common/winjs.base"; @@ -202,4 +202,30 @@ suite('CompletionModel', function () { }; assert.equal(model.items.length, 1); }); + + test('Vscode 1.12 no longer obeys \'sortText\' in completion items (from language server), #26096', function () { + + const item1 = createSuggestItem('<- groups', 2, 'property', false, { lineNumber: 1, column: 3 }); + item1.suggestion.filterText = ' groups'; + item1.suggestion.sortText = '00002'; + + const item2 = createSuggestItem('source', 0, 'property', false, { lineNumber: 1, column: 3 }); + item2.suggestion.filterText = 'source'; + item2.suggestion.sortText = '00001'; + + const items = [item1, item2].sort(getSuggestionComparator('inline')); + + model = new CompletionModel(items, 3, { + leadingLineContent: ' ', + characterCountDelta: 0 + }); + + assert.equal(model.items.length, 2); + + const [first, second] = model.items; + assert.equal(first.suggestion.label, 'source'); + assert.equal(second.suggestion.label, '<- groups'); + + }); + }); From 76a5c5249f29e0d29898b3f0900147afe6449b2f Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Wed, 24 May 2017 18:02:57 +0200 Subject: [PATCH 0998/1164] Fix extension actions tests --- .../test/electron-browser/extensionsActions.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts index f0ae1aaabe1..0f50eb3a0e5 100644 --- a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts +++ b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts @@ -99,7 +99,7 @@ suite('ExtensionsActions Test', () => { testObject.extension = paged.firstPage[0]; assert.ok(!testObject.enabled); assert.equal('Install', testObject.label); - assert.equal('extension-action install', testObject.class); + assert.equal('extension-action prominent install', testObject.class); done(); }); }); @@ -233,7 +233,7 @@ suite('ExtensionsActions Test', () => { const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction); assert.ok(!testObject.enabled); - assert.equal('extension-action install no-extension', testObject.class); + assert.equal('extension-action prominent install no-extension', testObject.class); }); test('Test CombinedInstallAction when extension is system extension', (done) => { @@ -244,7 +244,7 @@ suite('ExtensionsActions Test', () => { instantiationService.get(IExtensionsWorkbenchService).queryLocal().done(extensions => { testObject.extension = extensions[0]; assert.ok(!testObject.enabled); - assert.equal('extension-action install no-extension', testObject.class); + assert.equal('extension-action prominent install no-extension', testObject.class); done(); }); }); @@ -259,7 +259,7 @@ suite('ExtensionsActions Test', () => { testObject.extension = paged.firstPage[0]; assert.ok(testObject.enabled); assert.equal('Install', testObject.label); - assert.equal('extension-action install', testObject.class); + assert.equal('extension-action prominent install', testObject.class); done(); }); }); From d0e70aca3eef34037fdec72440c3f46f6a089043 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 24 May 2017 11:04:57 -0700 Subject: [PATCH 0999/1164] Tweak error message for extension table in github issues --- src/vs/workbench/electron-browser/actions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/electron-browser/actions.ts b/src/vs/workbench/electron-browser/actions.ts index b5b380afb6a..98e0d84f20c 100644 --- a/src/vs/workbench/electron-browser/actions.ts +++ b/src/vs/workbench/electron-browser/actions.ts @@ -739,7 +739,7 @@ ${tableHeader}\n${table}; // 2000 chars is browsers de-facto limit for URLs, 400 chars are allowed for other string parts of the issue URL // http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers if (encodeURIComponent(extensionTable).length > 1600) { - return 'the listing exceeds the lower minimum of browsers\' URL characters limit'; + return 'the listing length exceeds browsers\' URL characters limit'; } return extensionTable; From a6b7efe17f56ae26076cd7b7ee95830d5b24d3d2 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 24 May 2017 20:18:03 +0200 Subject: [PATCH 1000/1164] theming :lipstick: --- .../base/browser/ui/findinput/findInput.css | 26 ------------------- .../parts/debug/browser/debugActionItems.ts | 4 +-- .../debug/browser/media/breakpointWidget.css | 4 --- .../debug/browser/media/debugViewlet.css | 15 ----------- .../extensions/browser/extensionsActions.ts | 7 ++++- .../browser/media/extensionActions.css | 1 - .../preferences/browser/keybindingsEditor.ts | 12 +++++++-- .../browser/media/keybindingsEditor.css | 10 ------- 8 files changed, 18 insertions(+), 61 deletions(-) diff --git a/src/vs/base/browser/ui/findinput/findInput.css b/src/vs/base/browser/ui/findinput/findInput.css index 413c2dcafb3..b785b4fa4cc 100644 --- a/src/vs/base/browser/ui/findinput/findInput.css +++ b/src/vs/base/browser/ui/findinput/findInput.css @@ -28,28 +28,6 @@ right: 2px; } -.monaco-findInput > .controls > .matchCount { - margin-left: 2px; - float: left; - overflow: hidden; - max-width: 30px; - min-width: 20px; - text-align: center; - - border-radius: 5px; - padding: 0 4px; - - -webkit-box-sizing: border-box; - -o-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} - -.vs .monaco-findInput > .controls > .matchCount { - background: #ddd; -} - .vs .monaco-findInput.disabled { background-color: #E1E1E1; } @@ -59,10 +37,6 @@ background-color: #333; } -.vs-dark .monaco-findInput > .controls > .matchCount { - background: #555; -} - /* Highlighting */ .monaco-findInput.highlight-0 .controls { animation: monaco-findInput-highlight-0 100ms linear 0s; diff --git a/src/vs/workbench/parts/debug/browser/debugActionItems.ts b/src/vs/workbench/parts/debug/browser/debugActionItems.ts index 8f83bebe2da..edb07e3d969 100644 --- a/src/vs/workbench/parts/debug/browser/debugActionItems.ts +++ b/src/vs/workbench/parts/debug/browser/debugActionItems.ts @@ -117,8 +117,8 @@ export class StartDebugActionItem extends EventEmitter implements IActionItem { } })); this.toDispose.push(attachStylerCallback(this.themeService, { selectBorder }, colors => { - this.container.style.borderColor = colors.selectBorder; - selectBoxContainer.style.borderLeftColor = colors.selectBorder; + this.container.style.border = colors.selectBorder ? `1px solid ${colors.selectBorder}` : null; + selectBoxContainer.style.borderLeft = colors.selectBorder ? `1px solid ${colors.selectBorder}` : null; })); this.updateOptions(); diff --git a/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css b/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css index ad120c2ab7f..8d190b91ca0 100644 --- a/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css +++ b/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css @@ -16,10 +16,6 @@ padding: 0 10px; } -.monaco-editor .zone-widget .zone-widget-container.breakpoint-widget .breakpoint-select-container .select-box { - border-color: rgba(128, 128, 128, 0.35); -} - .monaco-editor .zone-widget .zone-widget-container.breakpoint-widget .inputBoxContainer { flex: 1; } diff --git a/src/vs/workbench/parts/debug/browser/media/debugViewlet.css b/src/vs/workbench/parts/debug/browser/media/debugViewlet.css index feff9b7cff6..b0d6b4510a1 100644 --- a/src/vs/workbench/parts/debug/browser/media/debugViewlet.css +++ b/src/vs/workbench/parts/debug/browser/media/debugViewlet.css @@ -57,7 +57,6 @@ margin-right: 0.3em; height: 20px; flex-shrink: 1; - border: 1px solid #dddddd; margin-top: 7px; } @@ -65,11 +64,6 @@ border-radius: 4px; } -.vs-dark .monaco-workbench > .part > .title > .title-actions .start-debug-action-item, -.hc-black .monaco-workbench > .part > .title > .title-actions .start-debug-action-item { - border-color: #3c3c3c; -} - .monaco-workbench > .part > .title > .title-actions .start-debug-action-item .icon { height: 20px; width: 20px; @@ -84,15 +78,6 @@ background: url('continue-inverse.svg') center center no-repeat; } -.monaco-workbench > .part > .title > .title-actions .start-debug-action-item .configuration { - border-left: 1px solid #dddddd; -} - -.vs-dark .monaco-workbench > .part > .title > .title-actions .start-debug-action-item .configuration, -.hc-black .monaco-workbench > .part > .title > .title-actions .start-debug-action-item .configuration { - border-color: #3c3c3c; -} - .monaco-workbench .monaco-action-bar .start-debug-action-item .configuration .select-box { border: none; margin-top: 0px; diff --git a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts index 3b557abaf33..f2cf8c9cacd 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts @@ -33,7 +33,7 @@ import URI from 'vs/base/common/uri'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { registerThemingParticipant, ITheme, ICssStyleCollector } from "vs/platform/theme/common/themeService"; -import { buttonBackground, buttonForeground, buttonHoverBackground, contrastBorder, registerColor } from "vs/platform/theme/common/colorRegistry"; +import { buttonBackground, buttonForeground, buttonHoverBackground, contrastBorder, registerColor, foreground } from "vs/platform/theme/common/colorRegistry"; import { Color } from "vs/base/common/color"; export class InstallAction extends Action { @@ -1408,6 +1408,11 @@ export const extensionButtonProminentHoverBackground = registerColor('extensionB }, localize('extensionButtonProminentHoverBackground', "Button background hover color for actions extension that stand out (e.g. install button).")); registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { + const foregroundColor = theme.getColor(foreground); + if (foregroundColor) { + collector.addRule(`.monaco-action-bar .action-item .action-label.extension-action.built-in-status { border-color: ${foregroundColor}; }`); + } + const buttonBackgroundColor = theme.getColor(buttonBackground); if (buttonBackgroundColor) { collector.addRule(`.monaco-action-bar .action-item .action-label.extension-action { background-color: ${buttonBackgroundColor}; }`); diff --git a/src/vs/workbench/parts/extensions/browser/media/extensionActions.css b/src/vs/workbench/parts/extensions/browser/media/extensionActions.css index e80db60cdef..c9b9d8508a2 100644 --- a/src/vs/workbench/parts/extensions/browser/media/extensionActions.css +++ b/src/vs/workbench/parts/extensions/browser/media/extensionActions.css @@ -36,7 +36,6 @@ .monaco-action-bar .action-item .action-label.extension-action.built-in-status { border-radius: 4px; - border-color: #c1c1c1; color: inherit; background-color: transparent; opacity: 0.9; diff --git a/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts index 2b8adf6502f..ca94ecd2c2b 100644 --- a/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts @@ -33,12 +33,13 @@ import { IKeybindingEditingService } from 'vs/workbench/services/keybinding/comm import { IListService } from 'vs/platform/list/browser/listService'; import { List } from 'vs/base/browser/ui/list/listWidget'; import { IDelegate, IRenderer, IListContextMenuEvent, IListEvent } from 'vs/base/browser/ui/list/list'; -import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IChoiceService, IMessageService, Severity } from 'vs/platform/message/common/message'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode, ResolvedKeybinding } from 'vs/base/common/keyCodes'; import { attachListStyler } from 'vs/platform/theme/common/styler'; +import { listHighlightForeground } from "vs/platform/theme/common/colorRegistry"; let $ = DOM.$; @@ -797,4 +798,11 @@ class WhenColumn extends Column { private getAriaLabel(keybindingItemEntry: IKeybindingItemEntry): string { return keybindingItemEntry.keybindingItem.when ? localize('whenAriaLabel', "When is {0}.", keybindingItemEntry.keybindingItem.when) : localize('noWhen', "No when context."); } -} \ No newline at end of file +} + +registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { + const listHighlightForegroundColor = theme.getColor(listHighlightForeground); + if (listHighlightForegroundColor) { + collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row > .column .highlight { color: ${listHighlightForegroundColor}; }`); + } +}); \ No newline at end of file diff --git a/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css b/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css index 27a753c86bd..29b4fe0a8d1 100644 --- a/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css +++ b/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css @@ -148,19 +148,9 @@ } .keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row > .column .highlight { - color: #007ACC; font-weight: bold; } -.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:focus .monaco-list-row.selected > .column .highlight { - color: #1b3c53; -} - -.vs-dark .keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:focus .monaco-list-row.selected > .column .highlight, -.hc-black .keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:focus .monaco-list-row.selected > .column .highlight { - color: #049aff; -} - .keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row > .column .monaco-action-bar { display: none; flex: 1; From b648308eb340729c76fa570a857488ad4e1baeee Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 24 May 2017 11:25:31 -0700 Subject: [PATCH 1001/1164] Fixes #26886 --- .../editor/contrib/suggest/browser/media/suggest.css | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index fe64def759b..08b4e45593d 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -34,12 +34,18 @@ .monaco-editor .suggest-widget.docs-side > .tree, .monaco-editor .suggest-widget.docs-side > .details { - width: 328px; + /* subtract 2px for border, and another 2 for the Chromium zoom issue + where the children get slightly bigger width than what is set + which makes the docs go below the list */ + width: calc(50% - 4px); } .monaco-editor.hc-black .suggest-widget.docs-side > .tree, .monaco-editor.hc-black .suggest-widget.docs-side > .details { - width: 326px; + /* subtract 4px for border, and another 2 for the Chromium zoom issue + where the children get slightly bigger width than what is set + which makes the docs go below the list */ + width: calc(50% - 6px); } /* Styles for Message element for when widget is loading or is empty */ From e4e9bf96216f0166758b7d062a8b9bd99d1a0909 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Wed, 24 May 2017 11:39:04 -0700 Subject: [PATCH 1002/1164] Enable needs-more-info bot plugin --- .github/needs_more_info.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/needs_more_info.yml b/.github/needs_more_info.yml index 0e246fd554a..934e98898d4 100644 --- a/.github/needs_more_info.yml +++ b/.github/needs_more_info.yml @@ -1,6 +1,6 @@ { daysUntilClose: 7, needsMoreInfoLabel: 'needs more info', - perform: false, + perform: true, closeComment: 'This issue has been closed automatically because it needs more information and has not had recent activity. Please refer to our [guidelines](https://github.com/Microsoft/vscode/blob/master/CONTRIBUTING.md) for filing issues. Thank you for your contributions.' } From 06fdcf1962924c3a6e00f531d8004cdaeb13f5d5 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 24 May 2017 11:56:54 -0700 Subject: [PATCH 1003/1164] Fixes #27169 --- src/vs/editor/contrib/suggest/browser/suggestWidget.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 168d22bc846..56871ef9504 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -599,12 +599,14 @@ export class SuggestWidget implements IContentWidget, IDelegate this.messageElement.textContent = SuggestWidget.LOADING_MESSAGE; hide(this.listElement, this.details.element); show(this.messageElement); + removeClass(this.element, 'docs-side'); this.show(); break; case State.Empty: this.messageElement.textContent = SuggestWidget.NO_SUGGESTIONS_MESSAGE; hide(this.listElement, this.details.element); show(this.messageElement); + removeClass(this.element, 'docs-side'); this.show(); break; case State.Open: From 26aaf73ff9604d3e303c8ef401fe46bb7f463049 Mon Sep 17 00:00:00 2001 From: Amy Qiu Date: Wed, 24 May 2017 12:49:23 -0700 Subject: [PATCH 1004/1164] Add mementos to shutdown --- .../parts/search/browser/searchViewlet.ts | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index deb804b45b1..ed2a0c9f953 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -903,23 +903,10 @@ export class SearchViewlet extends Viewlet { const isCaseSensitive = this.searchWidget.searchInput.getCaseSensitive(); const contentPattern = this.searchWidget.searchInput.getValue(); const patternExcludes = this.inputPatternExclusions.getValue().trim(); - const exclusionsUsePattern = this.inputPatternExclusions.isGlobPattern(); const patternIncludes = this.inputPatternIncludes.getValue().trim(); - const includesUsePattern = this.inputPatternIncludes.isGlobPattern(); const useIgnoreFiles = this.inputPatternExclusions.useIgnoreFiles(); const useExcludeSettings = this.inputPatternExclusions.useExcludeSettings(); - // store memento - this.viewletSettings['query.contentPattern'] = contentPattern; - this.viewletSettings['query.regex'] = isRegex; - this.viewletSettings['query.wholeWords'] = isWholeWords; - this.viewletSettings['query.caseSensitive'] = isCaseSensitive; - this.viewletSettings['query.folderExclusions'] = patternExcludes; - this.viewletSettings['query.exclusionsUsePattern'] = exclusionsUsePattern; - this.viewletSettings['query.folderIncludes'] = patternIncludes; - this.viewletSettings['query.includesUsePattern'] = includesUsePattern; - this.viewletSettings['query.useIgnoreFiles'] = useIgnoreFiles; - if (!rerunQuery) { return; } @@ -1349,7 +1336,27 @@ export class SearchViewlet extends Viewlet { } public shutdown(): void { - this.viewletSettings['query.contentPattern'] = this.searchWidget.searchInput.getValue(); + const isRegex = this.searchWidget.searchInput.getRegex(); + const isWholeWords = this.searchWidget.searchInput.getWholeWords(); + const isCaseSensitive = this.searchWidget.searchInput.getCaseSensitive(); + const contentPattern = this.searchWidget.searchInput.getValue(); + const patternExcludes = this.inputPatternExclusions.getValue().trim(); + const exclusionsUsePattern = this.inputPatternExclusions.isGlobPattern(); + const patternIncludes = this.inputPatternIncludes.getValue().trim(); + const includesUsePattern = this.inputPatternIncludes.isGlobPattern(); + const useIgnoreFiles = this.inputPatternExclusions.useIgnoreFiles(); + + // store memento + this.viewletSettings['query.contentPattern'] = contentPattern; + this.viewletSettings['query.regex'] = isRegex; + this.viewletSettings['query.wholeWords'] = isWholeWords; + this.viewletSettings['query.caseSensitive'] = isCaseSensitive; + this.viewletSettings['query.folderExclusions'] = patternExcludes; + this.viewletSettings['query.exclusionsUsePattern'] = exclusionsUsePattern; + this.viewletSettings['query.folderIncludes'] = patternIncludes; + this.viewletSettings['query.includesUsePattern'] = includesUsePattern; + this.viewletSettings['query.useIgnoreFiles'] = useIgnoreFiles; + this.viewletSettings['query.contentPattern'] = contentPattern; super.shutdown(); } From d3cf7e5fd8cd4db834e1ea19dc0ceee80cded539 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 24 May 2017 10:50:28 -0700 Subject: [PATCH 1005/1164] Move terminalProcess to node/ Part of #27182 --- .../parts/terminal/electron-browser/terminalInstance.ts | 4 ++-- .../terminal/{electron-browser => node}/terminalProcess.js | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename src/vs/workbench/parts/terminal/{electron-browser => node}/terminalProcess.js (100%) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index fe48ea264ff..c7bb9a07131 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -473,9 +473,9 @@ export class TerminalInstance implements ITerminalInstance { } const env = TerminalInstance.createTerminalEnv(process.env, shell, this._getCwd(shell, workspace), locale, this._cols, this._rows); this._title = shell.name || ''; - this._process = cp.fork('./terminalProcess', [], { + this._process = cp.fork('../node/terminalProcess', [], { env: env, - cwd: URI.parse(path.dirname(require.toUrl('./terminalProcess'))).fsPath + cwd: URI.parse(path.dirname(require.toUrl('../node/terminalProcess'))).fsPath }); if (!shell.name) { // Only listen for process title changes when a name is not provided diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalProcess.js b/src/vs/workbench/parts/terminal/node/terminalProcess.js similarity index 100% rename from src/vs/workbench/parts/terminal/electron-browser/terminalProcess.js rename to src/vs/workbench/parts/terminal/node/terminalProcess.js From e0277260b09596f086158bfe91d942137f700390 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 24 May 2017 13:34:44 -0700 Subject: [PATCH 1006/1164] Add node-pty typings back --- src/typings/node-pty.d.ts | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/typings/node-pty.d.ts diff --git a/src/typings/node-pty.d.ts b/src/typings/node-pty.d.ts new file mode 100644 index 00000000000..e09b1eb47e5 --- /dev/null +++ b/src/typings/node-pty.d.ts @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module 'node-pty' { + export function fork(file: string, args: string[], options: any): Terminal; + export function spawn(file: string, args: string[], options: any): Terminal; + export function createTerminal(file: string, args: string[], options: any): Terminal; + + export interface Terminal { + pid: number; + + /** + * The title of the active process. + */ + process: string; + + on(event: string, callback: (data: any) => void): void; + + resize(columns: number, rows: number): void; + + write(data: string): void; + + kill(): void; + } +} \ No newline at end of file From ed9cdf55b0c9e327ab634cc3e09c97b63671af03 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 24 May 2017 13:37:43 -0700 Subject: [PATCH 1007/1164] Fork terminalProcess using amd, convert to TS Fixes #27182 --- src/vs/workbench/buildfile.js | 4 ++- .../electron-browser/terminalInstance.ts | 5 +-- ...{terminalProcess.js => terminalProcess.ts} | 35 +++++++++++++------ 3 files changed, 30 insertions(+), 14 deletions(-) rename src/vs/workbench/parts/terminal/node/{terminalProcess.js => terminalProcess.ts} (83%) diff --git a/src/vs/workbench/buildfile.js b/src/vs/workbench/buildfile.js index dfb1ee2b600..b4102009d69 100644 --- a/src/vs/workbench/buildfile.js +++ b/src/vs/workbench/buildfile.js @@ -25,7 +25,9 @@ exports.collectModules = function (excludes) { createModuleDescription('vs/workbench/services/search/node/worker/searchWorkerApp', []), createModuleDescription('vs/workbench/services/files/node/watcher/unix/watcherApp', []), - createModuleDescription('vs/workbench/node/extensionHostProcess', []) + createModuleDescription('vs/workbench/node/extensionHostProcess', []), + + createModuleDescription('vs/workbench/parts/terminal/node/terminalProcess', []) ]; return modules; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index c7bb9a07131..07f8b6b53cb 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -473,8 +473,8 @@ export class TerminalInstance implements ITerminalInstance { } const env = TerminalInstance.createTerminalEnv(process.env, shell, this._getCwd(shell, workspace), locale, this._cols, this._rows); this._title = shell.name || ''; - this._process = cp.fork('../node/terminalProcess', [], { - env: env, + this._process = cp.fork(URI.parse(require.toUrl('bootstrap')).fsPath, ['--type=terminal'], { + env, cwd: URI.parse(path.dirname(require.toUrl('../node/terminalProcess'))).fsPath }); if (!shell.name) { @@ -622,6 +622,7 @@ export class TerminalInstance implements ITerminalInstance { env['PTYCOLS'] = cols.toString(); env['PTYROWS'] = rows.toString(); } + env['AMD_ENTRYPOINT'] = 'vs/workbench/parts/terminal/node/terminalProcess'; return env; } diff --git a/src/vs/workbench/parts/terminal/node/terminalProcess.js b/src/vs/workbench/parts/terminal/node/terminalProcess.ts similarity index 83% rename from src/vs/workbench/parts/terminal/node/terminalProcess.js rename to src/vs/workbench/parts/terminal/node/terminalProcess.ts index 8cfea5673f1..12642b21a41 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcess.js +++ b/src/vs/workbench/parts/terminal/node/terminalProcess.ts @@ -3,21 +3,23 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -var fs = require('fs'); -var os = require('os'); -var path = require('path'); -var ptyJs = require('node-pty'); +import * as fs from 'fs'; +fs.writeFileSync('/home/daniel/testing-terminal-1', 'foo'); +import * as os from 'os'; +import * as path from 'path'; +import * as ptyJs from 'node-pty'; + +fs.writeFileSync('/home/daniel/testing-terminal-2', 'foo'); // The pty process needs to be run in its own child process to get around maxing out CPU on Mac, // see https://github.com/electron/electron/issues/38 - -var name; +var shellName: string; if (os.platform() === 'win32') { - name = path.basename(process.env.PTYSHELL); + shellName = path.basename(process.env.PTYSHELL); } else { // Using 'xterm-256color' here helps ensure that the majority of Linux distributions will use a // color prompt as defined in the default ~/.bashrc file. - name = 'xterm-256color'; + shellName = 'xterm-256color'; } var shell = process.env.PTYSHELL; var args = getArgs(); @@ -29,16 +31,26 @@ var currentTitle = ''; setupPlanB(process.env.PTYPID); cleanEnv(); -var options = { - name: name, - cwd: cwd +interface IOptions { + name: string; + cwd: string; + cols?: number; + rows?: number; +} + +var options: IOptions = { + name: shellName, + cwd }; if (cols && rows) { options.cols = parseInt(cols, 10); options.rows = parseInt(rows, 10); } +fs.writeFileSync('/home/daniel/testing-terminal-3', 'foo'); var ptyProcess = ptyJs.fork(shell, args, options); + +fs.writeFileSync('/home/daniel/testing-terminal-4', 'foo'); var closeTimeout; var exitCode; @@ -93,6 +105,7 @@ function getArgs() { function cleanEnv() { var keys = [ + 'AMD_ENTRYPOINT', 'ELECTRON_RUN_AS_NODE', 'PTYCWD', 'PTYPID', From 8178df7a1f82013ba0b61d9bfd5cf5686e918435 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 24 May 2017 13:39:32 -0700 Subject: [PATCH 1008/1164] Fix ts/js code lens for trailing special character. Fixes #27211 --- extensions/typescript/src/features/baseCodeLensProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/typescript/src/features/baseCodeLensProvider.ts b/extensions/typescript/src/features/baseCodeLensProvider.ts index 9d2c4bfb768..98e4de9cc1c 100644 --- a/extensions/typescript/src/features/baseCodeLensProvider.ts +++ b/extensions/typescript/src/features/baseCodeLensProvider.ts @@ -108,7 +108,7 @@ export abstract class TypeScriptBaseCodeLensProvider implements CodeLensProvider const text = document.getText(range); - const identifierMatch = new RegExp(`^(.*?(\\b|\\W))${(item.text || '').replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')}\\b`, 'gm'); + const identifierMatch = new RegExp(`^(.*?(\\b|\\W))${(item.text || '').replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')}(\\b|\\W)`, 'gm'); const match = identifierMatch.exec(text); const prefixLength = match ? match.index + match[1].length : 0; const startOffset = document.offsetAt(new Position(range.start.line, range.start.character)) + prefixLength; From 84f154b7945b0430ea2ae68e844b554b8df16383 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 24 May 2017 13:54:05 -0700 Subject: [PATCH 1009/1164] Fix 27195 Make sure we handle the case of `/**/` properly in json files --- extensions/json/syntaxes/JSON.tmLanguage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/json/syntaxes/JSON.tmLanguage b/extensions/json/syntaxes/JSON.tmLanguage index 9d6a24cc16a..507eb03ec93 100644 --- a/extensions/json/syntaxes/JSON.tmLanguage +++ b/extensions/json/syntaxes/JSON.tmLanguage @@ -98,7 +98,7 @@ begin - /\*\* + /\*\*(?!/) captures 0 From b14bde0c6aaa8ccf3f925542f3a18d55c5a9e3df Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 24 May 2017 13:55:34 -0700 Subject: [PATCH 1010/1164] Remove debug logs --- src/vs/workbench/parts/terminal/node/terminalProcess.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/vs/workbench/parts/terminal/node/terminalProcess.ts b/src/vs/workbench/parts/terminal/node/terminalProcess.ts index 12642b21a41..3a2b00a4a70 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcess.ts +++ b/src/vs/workbench/parts/terminal/node/terminalProcess.ts @@ -3,14 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as fs from 'fs'; -fs.writeFileSync('/home/daniel/testing-terminal-1', 'foo'); - import * as os from 'os'; import * as path from 'path'; import * as ptyJs from 'node-pty'; -fs.writeFileSync('/home/daniel/testing-terminal-2', 'foo'); // The pty process needs to be run in its own child process to get around maxing out CPU on Mac, // see https://github.com/electron/electron/issues/38 var shellName: string; @@ -47,10 +43,8 @@ if (cols && rows) { options.rows = parseInt(rows, 10); } -fs.writeFileSync('/home/daniel/testing-terminal-3', 'foo'); var ptyProcess = ptyJs.fork(shell, args, options); -fs.writeFileSync('/home/daniel/testing-terminal-4', 'foo'); var closeTimeout; var exitCode; From 64e1c20856ca08c8b754d0675692e70c7ea2edf0 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Tue, 23 May 2017 21:00:41 +0200 Subject: [PATCH 1011/1164] Kimbie builtin theme has dark curly braces. Fixes #27121 --- .../theme-kimbie-dark/themes/kimbie-dark-color-theme.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json b/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json index 2d5e0fadb31..7de6b3fd42e 100644 --- a/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json +++ b/extensions/theme-kimbie-dark/themes/kimbie-dark-color-theme.json @@ -369,7 +369,7 @@ "variable.interpolation" ], "settings": { - "foreground": "#18401e" + "foreground": "#088649" } }, { From e1e5bf41b35614c0c536878db951af70eb9c7d56 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 24 May 2017 22:56:13 +0200 Subject: [PATCH 1012/1164] Allow decorations to use theme colors. For #26974 --- src/vs/base/browser/dom.ts | 5 +- .../browser/services/codeEditorServiceImpl.ts | 468 +++++++++--------- .../browser/standalone/standaloneServices.ts | 5 +- .../overviewRuler/decorationsOverviewRuler.ts | 15 +- src/vs/editor/common/editorCommon.ts | 38 +- .../common/model/textModelWithDecorations.ts | 6 +- .../services/decorationRenderOptions.test.ts | 84 +++- src/vs/monaco.d.ts | 16 +- src/vs/platform/theme/common/themeService.ts | 6 +- src/vs/vscode.d.ts | 32 +- src/vs/workbench/api/node/extHost.api.impl.ts | 1 + src/vs/workbench/api/node/extHostTypes.ts | 7 + .../workbench/test/workbenchTestServices.ts | 36 +- 13 files changed, 436 insertions(+), 283 deletions(-) diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 21698e938db..228550b57af 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -710,7 +710,7 @@ export function createCSSRule(selector: string, cssText: string, style: HTMLStyl return; } - (style.sheet).insertRule(selector + '{' + cssText + '}', 0); + (style.sheet).insertRule(selector + '{' + cssText + '}', 0); } export function getCSSRule(selector: string, style: HTMLStyleElement = sharedStyle): any { @@ -739,8 +739,7 @@ export function removeCSSRulesContainingSelector(ruleName: string, style = share let toDelete: number[] = []; for (let i = 0; i < rules.length; i++) { let rule = rules[i]; - let normalizedSelectorText = rule.selectorText.replace(/::/gi, ':'); - if (normalizedSelectorText.indexOf(ruleName) !== -1) { + if (rule.selectorText.indexOf(ruleName) !== -1) { toDelete.push(i); } } diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index fa45f009cf8..703e6e4f0ee 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -4,36 +4,43 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import * as objects from 'vs/base/common/objects'; -import { parse, stringify } from 'vs/base/common/marshalling'; import * as strings from 'vs/base/common/strings'; import URI from 'vs/base/common/uri'; import * as dom from 'vs/base/browser/dom'; import { IDecorationRenderOptions, IModelDecorationOptions, IModelDecorationOverviewRulerOptions, IThemeDecorationRenderOptions, - IContentDecorationRenderOptions, OverviewRulerLane, TrackedRangeStickiness + IContentDecorationRenderOptions, OverviewRulerLane, TrackedRangeStickiness, ThemeColor, isThemeColor } from 'vs/editor/common/editorCommon'; import { AbstractCodeEditorService } from 'vs/editor/common/services/abstractCodeEditorService'; -import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose as disposeAll } from 'vs/base/common/lifecycle'; +import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; export class CodeEditorServiceImpl extends AbstractCodeEditorService { private _styleSheet: HTMLStyleElement; private _decorationOptionProviders: { [key: string]: IModelDecorationOptionsProvider }; + private _themeService: IThemeService; - constructor(styleSheet = dom.createStyleSheet()) { + constructor( @IThemeService themeService: IThemeService, styleSheet = dom.createStyleSheet()) { super(); this._styleSheet = styleSheet; this._decorationOptionProviders = Object.create(null); + this._themeService = themeService; } public registerDecorationType(key: string, options: IDecorationRenderOptions, parentTypeKey?: string): void { let provider = this._decorationOptionProviders[key]; if (!provider) { + let providerArgs: ProviderArguments = { + styleSheet: this._styleSheet, + key: key, + parentTypeKey: parentTypeKey, + options: options + }; if (!parentTypeKey) { - provider = new DecorationTypeOptionsProvider(this._styleSheet, key, options); + provider = new DecorationTypeOptionsProvider(this._themeService, providerArgs); } else { - provider = new DecorationSubTypeOptionsProvider(this._styleSheet, key, parentTypeKey, options); + provider = new DecorationSubTypeOptionsProvider(this._themeService, providerArgs); } this._decorationOptionProviders[key] = provider; } @@ -71,67 +78,52 @@ class DecorationSubTypeOptionsProvider implements IModelDecorationOptionsProvide public refCount: number; - private _disposable: IDisposable; private _parentTypeKey: string; - private _beforeContentClassName: string; - private _afterContentClassName: string; + private _beforeContentRules: DecorationCSSRules; + private _afterContentRules: DecorationCSSRules; - constructor(styleSheet: HTMLStyleElement, key: string, parentTypeKey: string, options: IDecorationRenderOptions) { - this._parentTypeKey = parentTypeKey; + constructor(themeService: IThemeService, providerArgs: ProviderArguments) { + this._parentTypeKey = providerArgs.parentTypeKey; this.refCount = 0; - let themedOpts = getThemedRenderOptions(options); - - this._beforeContentClassName = DecorationRenderHelper.createCSSRules( - styleSheet, - key, - parentTypeKey, - ModelDecorationCSSRuleType.BeforeContentClassName, - { - light: DecorationRenderHelper.getCSSTextForModelDecorationContentClassName(themedOpts.light.before), - dark: DecorationRenderHelper.getCSSTextForModelDecorationContentClassName(themedOpts.dark.before) - } - ); - - this._afterContentClassName = DecorationRenderHelper.createCSSRules( - styleSheet, - key, - parentTypeKey, - ModelDecorationCSSRuleType.AfterContentClassName, - { - light: DecorationRenderHelper.getCSSTextForModelDecorationContentClassName(themedOpts.light.after), - dark: DecorationRenderHelper.getCSSTextForModelDecorationContentClassName(themedOpts.dark.after) - } - ); - if (this._beforeContentClassName || this._afterContentClassName) { - this._disposable = toDisposable(() => { - dom.removeCSSRulesContainingSelector(CSSNameHelper.getDeletionSubstring(key), styleSheet); - }); - } + this._beforeContentRules = new DecorationCSSRules(ModelDecorationCSSRuleType.BeforeContentClassName, providerArgs, themeService); + this._afterContentRules = new DecorationCSSRules(ModelDecorationCSSRuleType.AfterContentClassName, providerArgs, themeService); } public getOptions(codeEditorService: AbstractCodeEditorService, writable: boolean): IModelDecorationOptions { let options = codeEditorService.resolveDecorationOptions(this._parentTypeKey, true); - if (this._beforeContentClassName) { - options.beforeContentClassName = this._beforeContentClassName; + if (this._beforeContentRules) { + options.beforeContentClassName = this._beforeContentRules.className; } - if (this._afterContentClassName) { - options.afterContentClassName = this._afterContentClassName; + if (this._afterContentRules) { + options.afterContentClassName = this._afterContentRules.className; } return options; } public dispose(): void { - if (this._disposable) { - this._disposable.dispose(); - delete this._disposable; + if (this._beforeContentRules) { + this._beforeContentRules.dispose(); + this._beforeContentRules = null; + } + if (this._afterContentRules) { + this._afterContentRules.dispose(); + this._afterContentRules = null; } } } +interface ProviderArguments { + styleSheet: HTMLStyleElement; + key: string; + parentTypeKey?: string; + options: IDecorationRenderOptions; +} + + class DecorationTypeOptionsProvider implements IModelDecorationOptionsProvider { - private _disposable: IDisposable; + private _disposables: IDisposable[]; public refCount: number; public className: string; @@ -143,82 +135,40 @@ class DecorationTypeOptionsProvider implements IModelDecorationOptionsProvider { public overviewRuler: IModelDecorationOverviewRulerOptions; public stickiness: TrackedRangeStickiness; - constructor(styleSheet: HTMLStyleElement, key: string, options: IDecorationRenderOptions) { + constructor(themeService: IThemeService, providerArgs: ProviderArguments) { this.refCount = 0; + this._disposables = []; - let themedOpts = getThemedRenderOptions(options); - - this.className = DecorationRenderHelper.createCSSRules( - styleSheet, - key, - null, - ModelDecorationCSSRuleType.ClassName, - { - light: DecorationRenderHelper.getCSSTextForModelDecorationClassName(themedOpts.light), - dark: DecorationRenderHelper.getCSSTextForModelDecorationClassName(themedOpts.dark) + let createCSSRules = (type: ModelDecorationCSSRuleType) => { + let rules = new DecorationCSSRules(type, providerArgs, themeService); + if (rules.hasContent) { + this._disposables.push(rules); + return rules.className; } - ); + return void 0; + }; - this.inlineClassName = DecorationRenderHelper.createCSSRules( - styleSheet, - key, - null, - ModelDecorationCSSRuleType.InlineClassName, - { - light: DecorationRenderHelper.getCSSTextForModelDecorationInlineClassName(themedOpts.light), - dark: DecorationRenderHelper.getCSSTextForModelDecorationInlineClassName(themedOpts.dark) - } - ); - - this.beforeContentClassName = DecorationRenderHelper.createCSSRules( - styleSheet, - key, - null, - ModelDecorationCSSRuleType.BeforeContentClassName, - { - light: DecorationRenderHelper.getCSSTextForModelDecorationContentClassName(themedOpts.light.before), - dark: DecorationRenderHelper.getCSSTextForModelDecorationContentClassName(themedOpts.dark.before) - } - ); - - this.afterContentClassName = DecorationRenderHelper.createCSSRules( - styleSheet, - key, - null, - ModelDecorationCSSRuleType.AfterContentClassName, - { - light: DecorationRenderHelper.getCSSTextForModelDecorationContentClassName(themedOpts.light.after), - dark: DecorationRenderHelper.getCSSTextForModelDecorationContentClassName(themedOpts.dark.after) - } - ); - - this.glyphMarginClassName = DecorationRenderHelper.createCSSRules( - styleSheet, - key, - null, - ModelDecorationCSSRuleType.GlyphMarginClassName, - { - light: DecorationRenderHelper.getCSSTextForModelDecorationGlyphMarginClassName(themedOpts.light), - dark: DecorationRenderHelper.getCSSTextForModelDecorationGlyphMarginClassName(themedOpts.dark) - } - ); + this.className = createCSSRules(ModelDecorationCSSRuleType.ClassName); + this.inlineClassName = createCSSRules(ModelDecorationCSSRuleType.InlineClassName); + this.beforeContentClassName = createCSSRules(ModelDecorationCSSRuleType.BeforeContentClassName); + this.beforeContentClassName = createCSSRules(ModelDecorationCSSRuleType.AfterContentClassName); + this.glyphMarginClassName = createCSSRules(ModelDecorationCSSRuleType.GlyphMarginClassName); + let options = providerArgs.options; this.isWholeLine = Boolean(options.isWholeLine); + let lightOverviewRulerColor = options.light && options.light.overviewRulerColor || options.overviewRulerColor; + let darkOverviewRulerColor = options.dark && options.dark.overviewRulerColor || options.overviewRulerColor; if ( - typeof themedOpts.light.overviewRulerColor !== 'undefined' - || typeof themedOpts.dark.overviewRulerColor !== 'undefined' + typeof lightOverviewRulerColor !== 'undefined' + || typeof darkOverviewRulerColor !== 'undefined' ) { this.overviewRuler = { - color: themedOpts.light.overviewRulerColor || themedOpts.dark.overviewRulerColor, - darkColor: themedOpts.dark.overviewRulerColor || themedOpts.light.overviewRulerColor, + color: lightOverviewRulerColor || darkOverviewRulerColor, + darkColor: darkOverviewRulerColor || lightOverviewRulerColor, position: options.overviewRulerLane || OverviewRulerLane.Center }; } - - this._disposable = toDisposable(() => { - dom.removeCSSRulesContainingSelector(CSSNameHelper.getDeletionSubstring(key), styleSheet); - }); } public getOptions(codeEditorService: AbstractCodeEditorService, writable: boolean): IModelDecorationOptions { @@ -238,51 +188,162 @@ class DecorationTypeOptionsProvider implements IModelDecorationOptionsProvider { } public dispose(): void { - if (this._disposable) { - this._disposable.dispose(); - delete this._disposable; - } + this._disposables = disposeAll(this._disposables); } } -class DecorationRenderHelper { - private static _CSS_MAP = { - color: 'color:{0} !important;', - backgroundColor: 'background-color:{0};', - outline: 'outline:{0};', - outlineColor: 'outline-color:{0};', - outlineStyle: 'outline-style:{0};', - outlineWidth: 'outline-width:{0};', +const _CSS_MAP = { + color: 'color:{0} !important;', + backgroundColor: 'background-color:{0};', - border: 'border:{0};', - borderColor: 'border-color:{0};', - borderRadius: 'border-radius:{0};', - borderSpacing: 'border-spacing:{0};', - borderStyle: 'border-style:{0};', - borderWidth: 'border-width:{0};', + outline: 'outline:{0};', + outlineColor: 'outline-color:{0};', + outlineStyle: 'outline-style:{0};', + outlineWidth: 'outline-width:{0};', - textDecoration: 'text-decoration:{0};', - cursor: 'cursor:{0};', - letterSpacing: 'letter-spacing:{0};', + border: 'border:{0};', + borderColor: 'border-color:{0};', + borderRadius: 'border-radius:{0};', + borderSpacing: 'border-spacing:{0};', + borderStyle: 'border-style:{0};', + borderWidth: 'border-width:{0};', - gutterIconPath: 'background:url(\'{0}\') center center no-repeat;', - gutterIconSize: 'background-size:{0};', + textDecoration: 'text-decoration:{0};', + cursor: 'cursor:{0};', + letterSpacing: 'letter-spacing:{0};', - contentText: 'content:\'{0}\';', - contentIconPath: 'content:url(\'{0}\');', - margin: 'margin:{0};', - width: 'width:{0};', - height: 'height:{0};' - }; + gutterIconPath: 'background:url(\'{0}\') center center no-repeat;', + gutterIconSize: 'background-size:{0};', + + contentText: 'content:\'{0}\';', + contentIconPath: 'content:url(\'{0}\');', + margin: 'margin:{0};', + width: 'width:{0};', + height: 'height:{0};' +}; + + +class DecorationCSSRules { + + private _theme: ITheme; + private _className: string; + private _unThemedSelector: string; + private _hasContent: boolean; + private _ruleType: ModelDecorationCSSRuleType; + private _themeListener: IDisposable; + private _providerArgs: ProviderArguments; + private _usesThemeColors: boolean; + + public constructor(ruleType: ModelDecorationCSSRuleType, providerArgs: ProviderArguments, themeService: IThemeService) { + this._theme = themeService.getTheme(); + this._ruleType = ruleType; + this._providerArgs = providerArgs; + this._usesThemeColors = false; + this._hasContent = false; + + let className = CSSNameHelper.getClassName(this._providerArgs.key, ruleType); + if (this._providerArgs.parentTypeKey) { + className = className + ' ' + CSSNameHelper.getClassName(this._providerArgs.parentTypeKey, ruleType); + } + this._className = className; + + this._unThemedSelector = CSSNameHelper.getSelector(this._providerArgs.key, this._providerArgs.parentTypeKey, ruleType); + + this._buildCSS(); + + if (this._usesThemeColors) { + this._themeListener = themeService.onThemeChange(theme => { + this._theme = themeService.getTheme(); + this._removeCSS(); + this._buildCSS(); + }); + } + } + + public dispose() { + if (this._hasContent) { + this._removeCSS(); + this._hasContent = false; + } + if (this._themeListener) { + this._themeListener.dispose(); + this._themeListener = null; + } + } + + public get hasContent(): boolean { + return this._hasContent; + } + + public get className(): string { + return this._className; + } + + private _buildCSS(): void { + let options = this._providerArgs.options; + let unthemedCSS, lightCSS, darkCSS: string; + switch (this._ruleType) { + case ModelDecorationCSSRuleType.ClassName: + unthemedCSS = this.getCSSTextForModelDecorationClassName(options); + lightCSS = this.getCSSTextForModelDecorationClassName(options.light); + darkCSS = this.getCSSTextForModelDecorationClassName(options.dark); + break; + case ModelDecorationCSSRuleType.InlineClassName: + unthemedCSS = this.getCSSTextForModelDecorationInlineClassName(options); + lightCSS = this.getCSSTextForModelDecorationInlineClassName(options.light); + darkCSS = this.getCSSTextForModelDecorationInlineClassName(options.dark); + break; + case ModelDecorationCSSRuleType.GlyphMarginClassName: + unthemedCSS = this.getCSSTextForModelDecorationGlyphMarginClassName(options); + lightCSS = this.getCSSTextForModelDecorationGlyphMarginClassName(options.light); + darkCSS = this.getCSSTextForModelDecorationGlyphMarginClassName(options.dark); + break; + case ModelDecorationCSSRuleType.BeforeContentClassName: + unthemedCSS = this.getCSSTextForModelDecorationContentClassName(options.before); + lightCSS = this.getCSSTextForModelDecorationContentClassName(options.light && options.light.before); + darkCSS = this.getCSSTextForModelDecorationContentClassName(options.dark && options.dark.before); + break; + case ModelDecorationCSSRuleType.AfterContentClassName: + unthemedCSS = this.getCSSTextForModelDecorationContentClassName(options.after); + lightCSS = this.getCSSTextForModelDecorationContentClassName(options.light && options.light.after); + darkCSS = this.getCSSTextForModelDecorationContentClassName(options.dark && options.dark.after); + break; + default: + throw new Error('Unknown rule type: ' + this._ruleType); + } + let sheet = this._providerArgs.styleSheet.sheet; + + let hasContent = false; + if (unthemedCSS.length > 0) { + sheet.insertRule(`${this._unThemedSelector} {${unthemedCSS}}`); + hasContent = true; + } + if (lightCSS.length > 0) { + sheet.insertRule(`.vs${this._unThemedSelector} {${lightCSS}}`); + hasContent = true; + } + if (darkCSS.length > 0) { + sheet.insertRule(`.vs-dark${this._unThemedSelector}, .hc-black${this._unThemedSelector} {${darkCSS}}`); + hasContent = true; + } + this._hasContent = hasContent; + } + + private _removeCSS(): void { + dom.removeCSSRulesContainingSelector(this._unThemedSelector, this._providerArgs.styleSheet); + } /** * Build the CSS for decorations styled via `className`. */ - public static getCSSTextForModelDecorationClassName(opts: IThemeDecorationRenderOptions): string { + private getCSSTextForModelDecorationClassName(opts: IThemeDecorationRenderOptions): string { + if (!opts) { + return ''; + } let cssTextArr: string[] = []; - DecorationRenderHelper.collectCSSText(opts, ['backgroundColor', 'outline', 'outlineColor', 'outlineStyle', 'outlineWidth'], cssTextArr); - DecorationRenderHelper.collectBorderSettingsCSSText(opts, cssTextArr); + this.collectCSSText(opts, ['backgroundColor', 'outline', 'outlineColor', 'outlineStyle', 'outlineWidth'], cssTextArr); + this.collectBorderSettingsCSSText(opts, cssTextArr); return cssTextArr.join(''); } @@ -290,33 +351,39 @@ class DecorationRenderHelper { /** * Build the CSS for decorations styled via `inlineClassName`. */ - public static getCSSTextForModelDecorationInlineClassName(opts: IThemeDecorationRenderOptions): string { + private getCSSTextForModelDecorationInlineClassName(opts: IThemeDecorationRenderOptions): string { + if (!opts) { + return ''; + } let cssTextArr: string[] = []; - DecorationRenderHelper.collectCSSText(opts, ['textDecoration', 'cursor', 'color', 'letterSpacing'], cssTextArr); + this.collectCSSText(opts, ['textDecoration', 'cursor', 'color', 'letterSpacing'], cssTextArr); return cssTextArr.join(''); } /** * Build the CSS for decorations styled before or after content. */ - public static getCSSTextForModelDecorationContentClassName(opts: IContentDecorationRenderOptions): string { + private getCSSTextForModelDecorationContentClassName(opts: IContentDecorationRenderOptions): string { + if (!opts) { + return ''; + } let cssTextArr: string[] = []; if (typeof opts !== 'undefined') { - DecorationRenderHelper.collectBorderSettingsCSSText(opts, cssTextArr); + this.collectBorderSettingsCSSText(opts, cssTextArr); if (typeof opts.contentIconPath === 'string') { - cssTextArr.push(strings.format(this._CSS_MAP.contentIconPath, URI.file(opts.contentIconPath).toString().replace(/'/g, '%27'))); + cssTextArr.push(strings.format(_CSS_MAP.contentIconPath, URI.file(opts.contentIconPath).toString().replace(/'/g, '%27'))); } else if (opts.contentIconPath instanceof URI) { - cssTextArr.push(strings.format(this._CSS_MAP.contentIconPath, opts.contentIconPath.toString(true).replace(/'/g, '%27'))); + cssTextArr.push(strings.format(_CSS_MAP.contentIconPath, opts.contentIconPath.toString(true).replace(/'/g, '%27'))); } if (typeof opts.contentText === 'string') { const truncated = opts.contentText.match(/^.*$/m)[0]; // only take first line const escaped = truncated.replace(/['\\]/g, '\\$&'); - cssTextArr.push(strings.format(this._CSS_MAP.contentText, escaped)); + cssTextArr.push(strings.format(_CSS_MAP.contentText, escaped)); } - DecorationRenderHelper.collectCSSText(opts, ['textDecoration', 'color', 'backgroundColor', 'margin'], cssTextArr); - if (DecorationRenderHelper.collectCSSText(opts, ['width', 'height'], cssTextArr)) { + this.collectCSSText(opts, ['textDecoration', 'color', 'backgroundColor', 'margin'], cssTextArr); + if (this.collectCSSText(opts, ['width', 'height'], cssTextArr)) { cssTextArr.push('display:inline-block;'); } } @@ -327,17 +394,20 @@ class DecorationRenderHelper { /** * Build the CSS for decorations styled via `glpyhMarginClassName`. */ - public static getCSSTextForModelDecorationGlyphMarginClassName(opts: IThemeDecorationRenderOptions): string { + private getCSSTextForModelDecorationGlyphMarginClassName(opts: IThemeDecorationRenderOptions): string { + if (!opts) { + return ''; + } let cssTextArr = []; if (typeof opts.gutterIconPath !== 'undefined') { if (typeof opts.gutterIconPath === 'string') { - cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, URI.file(opts.gutterIconPath).toString())); + cssTextArr.push(strings.format(_CSS_MAP.gutterIconPath, URI.file(opts.gutterIconPath).toString())); } else { - cssTextArr.push(strings.format(this._CSS_MAP.gutterIconPath, opts.gutterIconPath.toString(true).replace(/'/g, '%27'))); + cssTextArr.push(strings.format(_CSS_MAP.gutterIconPath, opts.gutterIconPath.toString(true).replace(/'/g, '%27'))); } if (typeof opts.gutterIconSize !== 'undefined') { - cssTextArr.push(strings.format(this._CSS_MAP.gutterIconSize, opts.gutterIconSize)); + cssTextArr.push(strings.format(_CSS_MAP.gutterIconSize, opts.gutterIconSize)); } } @@ -346,59 +416,38 @@ class DecorationRenderHelper { private static border_rules = ['border', 'borderRadius', 'borderColor', 'borderSpacing', 'borderStyle', 'borderWidth']; - public static collectBorderSettingsCSSText(opts: any, cssTextArr: string[]): boolean { - if (DecorationRenderHelper.collectCSSText(opts, DecorationRenderHelper.border_rules, cssTextArr)) { + private collectBorderSettingsCSSText(opts: any, cssTextArr: string[]): boolean { + if (this.collectCSSText(opts, DecorationCSSRules.border_rules, cssTextArr)) { cssTextArr.push(strings.format('box-sizing: border-box;')); return true; } return false; } - private static collectCSSText(opts: any, properties: string[], cssTextArr: string[]): boolean { + private collectCSSText(opts: any, properties: string[], cssTextArr: string[]): boolean { let lenBefore = cssTextArr.length; for (let property of properties) { - if (typeof opts[property] !== 'undefined') { - cssTextArr.push(strings.format(this._CSS_MAP[property], opts[property])); + let value = this.resolveValue(opts[property]); + if (typeof value === 'string') { + cssTextArr.push(strings.format(_CSS_MAP[property], value)); } } return cssTextArr.length !== lenBefore; } - /** - * Create CSS rules for `cssTexts` with the generated class names from `ruleType` - */ - public static createCSSRules(styleSheet: HTMLStyleElement, key: string, parentKey: string, ruleType: ModelDecorationCSSRuleType, cssTexts: { light: string, dark: string }): string { - function createCSSSelector(themeType: ThemeType, cssText: string) { - let selector = CSSNameHelper.getSelector(themeType, key, parentKey, ruleType); - dom.createCSSRule(selector, cssText, styleSheet); - } - - let hasContent = false; - if (cssTexts.light.length > 0) { - createCSSSelector(ThemeType.Light, cssTexts.light); - hasContent = true; - } - if (cssTexts.dark.length > 0) { - createCSSSelector(ThemeType.Dark, cssTexts.dark); - createCSSSelector(ThemeType.HighContrastBlack, cssTexts.dark); - hasContent = true; - } - if (hasContent) { - let className = CSSNameHelper.getClassName(key, ruleType); - if (parentKey) { - className = className + ' ' + CSSNameHelper.getClassName(parentKey, ruleType); + private resolveValue(value: string | ThemeColor): string { + if (isThemeColor(value)) { + this._usesThemeColors = true; + let color = this._theme.getColor(value.id); + if (color) { + return color.toString(); } - return className; + return void 0; } - return void 0; + return value; } } -const enum ThemeType { - Light = 0, - Dark = 1, - HighContrastBlack = 2 -} const enum ModelDecorationCSSRuleType { ClassName = 0, InlineClassName = 1, @@ -409,22 +458,12 @@ const enum ModelDecorationCSSRuleType { class CSSNameHelper { - private static _getSelectorPrefixOf(theme: ThemeType): string { - if (theme === ThemeType.Light) { - return '.monaco-editor.vs'; - } - if (theme === ThemeType.Dark) { - return '.monaco-editor.vs-dark'; - } - return '.monaco-editor.hc-black'; - } - public static getClassName(key: string, type: ModelDecorationCSSRuleType): string { return 'ced-' + key + '-' + type; } - public static getSelector(themeType: ThemeType, key: string, parentKey: string, ruleType: ModelDecorationCSSRuleType): string { - let selector = this._getSelectorPrefixOf(themeType) + ' .' + this.getClassName(key, ruleType); + public static getSelector(key: string, parentKey: string, ruleType: ModelDecorationCSSRuleType): string { + let selector = '.monaco-editor .' + this.getClassName(key, ruleType); if (parentKey) { selector = selector + '.' + this.getClassName(parentKey, ruleType); } @@ -435,27 +474,4 @@ class CSSNameHelper { } return selector; } - - public static getDeletionSubstring(key: string): string { - return '.ced-' + key + '-'; - } -} - -// ---- Normalize decoration render options per theme -function getThemedRenderOptions(opts: { light?: T, dark?: T }): { light?: T, dark?: T } { - // TODO@alex,joh - not really how/what deep clone is being used - // for here but it will break the URI TODO@martin - - // let light = objects.deepClone(opts); - let light = parse(stringify(opts)); - objects.mixin(light, opts.light); - - // let dark = objects.deepClone(opts); - let dark = parse(stringify(opts)); - objects.mixin(dark, opts.dark); - - return { - light: light, - dark: dark - }; } diff --git a/src/vs/editor/browser/standalone/standaloneServices.ts b/src/vs/editor/browser/standalone/standaloneServices.ts index 1ce2c0d30b3..550b5294605 100644 --- a/src/vs/editor/browser/standalone/standaloneServices.ts +++ b/src/vs/editor/browser/standalone/standaloneServices.ts @@ -133,13 +133,14 @@ export module StaticServices { export const editorWorkerService = define(IEditorWorkerService, (o) => new EditorWorkerServiceImpl(modelService.get(o), configurationService.get(o), modeService.get(o))); - export const codeEditorService = define(ICodeEditorService, () => new CodeEditorServiceImpl()); + export const standaloneThemeService = define(IStandaloneThemeService, () => new StandaloneThemeServiceImpl()); + + export const codeEditorService = define(ICodeEditorService, (o) => new CodeEditorServiceImpl(standaloneThemeService.get(o))); export const progressService = define(IProgressService, () => new SimpleProgressService()); export const storageService = define(IStorageService, () => NullStorageService); - export const standaloneThemeService = define(IStandaloneThemeService, () => new StandaloneThemeServiceImpl()); } export class DynamicStandaloneServices extends Disposable { diff --git a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts index 6f9f3e03b55..46c6d71d941 100644 --- a/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts +++ b/src/vs/editor/browser/viewParts/overviewRuler/decorationsOverviewRuler.ts @@ -15,6 +15,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { OverviewRulerZone } from 'vs/editor/common/view/overviewZoneManager'; import { editorOverviewRulerBorder, editorCursor } from 'vs/editor/common/view/editorColorRegistry'; +import { Color } from 'vs/base/common/color'; export class DecorationsOverviewRuler extends ViewPart { @@ -186,15 +187,23 @@ export class DecorationsOverviewRuler extends ViewPart { dec.range.endLineNumber, overviewRuler.position, 0, - overviewRuler.color, - overviewRuler.darkColor, - overviewRuler.hcColor + this.resolveRulerColor(overviewRuler.color), + this.resolveRulerColor(overviewRuler.darkColor), + this.resolveRulerColor(overviewRuler.hcColor) )); } return zones; } + private resolveRulerColor(color: string | editorCommon.ThemeColor): string { + if (editorCommon.isThemeColor(color)) { + let c = this._context.theme.getColor(color.id) || Color.transparent; + return c.toString(); + } + return color; + } + private _createZonesFromCursors(): OverviewRulerZone[] { let zones: OverviewRulerZone[] = []; diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index 9a0674a5f28..058ea7e3653 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -41,19 +41,19 @@ export enum OverviewRulerLane { export interface IModelDecorationOverviewRulerOptions { /** * CSS color to render in the overview ruler. - * e.g.: rgba(100, 100, 100, 0.5) + * e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry */ - color: string; + color: string | ThemeColor; /** * CSS color to render in the overview ruler. - * e.g.: rgba(100, 100, 100, 0.5) + * e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry */ - darkColor: string; + darkColor: string | ThemeColor; /** * CSS color to render in the overview ruler. - * e.g.: rgba(100, 100, 100, 0.5) + * e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry */ - hcColor?: string; + hcColor?: string | ThemeColor; /** * The position in the overview ruler. */ @@ -1621,19 +1621,30 @@ export interface IEditorContribution { restoreViewState?(state: any): void; } +export interface ThemeColor { + id: string; +} + +/** + * @internal + */ +export function isThemeColor(o): o is ThemeColor { + return o && typeof o.id === 'string'; +} + /** * @internal */ export interface IThemeDecorationRenderOptions { - backgroundColor?: string; + backgroundColor?: string | ThemeColor; outline?: string; - outlineColor?: string; + outlineColor?: string | ThemeColor; outlineStyle?: string; outlineWidth?: string; border?: string; - borderColor?: string; + borderColor?: string | ThemeColor; borderRadius?: string; borderSpacing?: string; borderStyle?: string; @@ -1641,13 +1652,13 @@ export interface IThemeDecorationRenderOptions { textDecoration?: string; cursor?: string; - color?: string; + color?: string | ThemeColor; letterSpacing?: string; gutterIconPath?: string | URI; gutterIconSize?: string; - overviewRulerColor?: string; + overviewRulerColor?: string | ThemeColor; before?: IContentDecorationRenderOptions; after?: IContentDecorationRenderOptions; @@ -1661,9 +1672,10 @@ export interface IContentDecorationRenderOptions { contentIconPath?: string | URI; border?: string; + borderColor?: string | ThemeColor; textDecoration?: string; - color?: string; - backgroundColor?: string; + color?: string | ThemeColor; + backgroundColor?: string | ThemeColor; margin?: string; width?: string; diff --git a/src/vs/editor/common/model/textModelWithDecorations.ts b/src/vs/editor/common/model/textModelWithDecorations.ts index 3e36eeedda6..84380b69ef3 100644 --- a/src/vs/editor/common/model/textModelWithDecorations.ts +++ b/src/vs/editor/common/model/textModelWithDecorations.ts @@ -840,9 +840,9 @@ function cleanClassName(className: string): string { } export class ModelDecorationOverviewRulerOptions implements editorCommon.IModelDecorationOverviewRulerOptions { - readonly color: string; - readonly darkColor: string; - readonly hcColor: string; + readonly color: string | editorCommon.ThemeColor; + readonly darkColor: string | editorCommon.ThemeColor; + readonly hcColor: string | editorCommon.ThemeColor; readonly position: editorCommon.OverviewRulerLane; constructor(options: editorCommon.IModelDecorationOverviewRulerOptions) { diff --git a/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts b/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts index 2dbd09ac1c0..d68266803a7 100644 --- a/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts +++ b/src/vs/editor/test/browser/services/decorationRenderOptions.test.ts @@ -9,6 +9,9 @@ import URI from 'vs/base/common/uri'; import * as dom from 'vs/base/browser/dom'; import { CodeEditorServiceImpl } from 'vs/editor/browser/services/codeEditorServiceImpl'; import { IDecorationRenderOptions } from 'vs/editor/common/editorCommon'; +import { TestThemeService, TestTheme } from 'vs/workbench/test/workbenchTestServices'; + +const themeServiceMock = new TestThemeService(); suite('Decoration Render Options', () => { var options: IDecorationRenderOptions = { @@ -18,12 +21,12 @@ suite('Decoration Render Options', () => { borderColor: 'yellow' }; test('register and resolve decoration type', () => { - var s = new CodeEditorServiceImpl(); + var s = new CodeEditorServiceImpl(themeServiceMock); s.registerDecorationType('example', options); assert.notEqual(s.resolveDecorationOptions('example', false), undefined); }); test('remove decoration type', () => { - var s = new CodeEditorServiceImpl(); + var s = new CodeEditorServiceImpl(themeServiceMock); s.registerDecorationType('example', options); assert.notEqual(s.resolveDecorationOptions('example', false), undefined); s.removeDecorationType('example'); @@ -39,7 +42,7 @@ suite('Decoration Render Options', () => { test('css properties', () => { var styleSheet = dom.createStyleSheet(); - var s = new CodeEditorServiceImpl(styleSheet); + var s = new CodeEditorServiceImpl(themeServiceMock, styleSheet); s.registerDecorationType('example', options); var sheet = readStyleSheet(styleSheet); assert( @@ -50,11 +53,76 @@ suite('Decoration Render Options', () => { assert(sheet.indexOf('background-color: red;') > 0); }); + test('theme color', () => { + var options: IDecorationRenderOptions = { + backgroundColor: { id: 'editorBackground' }, + borderColor: { id: 'editorBorder' }, + }; + var colors: { [key: string]: string } = { + editorBackground: '#FF0000' + }; + + var styleSheet = dom.createStyleSheet(); + let themeService = new TestThemeService(new TestTheme(colors)); + var s = new CodeEditorServiceImpl(themeService, styleSheet); + s.registerDecorationType('example', options); + var sheet = readStyleSheet(styleSheet); + assert.equal(sheet, '.monaco-editor .ced-example-0 { background-color: rgb(255, 0, 0); }'); + + colors = { + editorBackground: '#EE0000', + editorBorder: '#00FFFF' + }; + themeService.setTheme(new TestTheme(colors)); + sheet = readStyleSheet(styleSheet); + assert.equal(sheet, '.monaco-editor .ced-example-0 { background-color: rgb(238, 0, 0); border-color: rgb(0, 255, 255); box-sizing: border-box; }'); + + s.removeDecorationType('example'); + sheet = readStyleSheet(styleSheet); + assert.equal(sheet, ''); + + }); + + test('theme overrides', () => { + var options: IDecorationRenderOptions = { + color: { id: 'editorBackground' }, + light: { + color: '#FF00FF' + }, + dark: { + color: '#000000', + after: { + color: { id: 'infoForeground' } + } + } + }; + var colors: { [key: string]: string } = { + editorBackground: '#FF0000', + infoForeground: '#444444' + }; + + var styleSheet = dom.createStyleSheet(); + let themeService = new TestThemeService(new TestTheme(colors)); + var s = new CodeEditorServiceImpl(themeService, styleSheet); + s.registerDecorationType('example', options); + var sheet = readStyleSheet(styleSheet); + let expected = + '.vs-dark.monaco-editor .ced-example-4::after, .hc-black.monaco-editor .ced-example-4::after { color: rgb(68, 68, 68) !important; }\n' + + '.vs-dark.monaco-editor .ced-example-1, .hc-black.monaco-editor .ced-example-1 { color: rgb(0, 0, 0) !important; }\n' + + '.vs.monaco-editor .ced-example-1 { color: rgb(255, 0, 255) !important; }\n' + + '.monaco-editor .ced-example-1 { color: rgb(255, 0, 0) !important; }'; + assert.equal(sheet, expected); + + s.removeDecorationType('example'); + sheet = readStyleSheet(styleSheet); + assert.equal(sheet, ''); + }); + test('css properties, gutterIconPaths', () => { var styleSheet = dom.createStyleSheet(); // unix file path (used as string) - var s = new CodeEditorServiceImpl(styleSheet); + var s = new CodeEditorServiceImpl(themeServiceMock, styleSheet); s.registerDecorationType('example', { gutterIconPath: '/Users/foo/bar.png' }); var sheet = readStyleSheet(styleSheet);//.innerHTML || styleSheet.sheet.toString(); assert( @@ -63,7 +131,7 @@ suite('Decoration Render Options', () => { ); // windows file path (used as string) - s = new CodeEditorServiceImpl(styleSheet); + s = new CodeEditorServiceImpl(themeServiceMock, styleSheet); s.registerDecorationType('example', { gutterIconPath: 'c:\\files\\miles\\more.png' }); sheet = readStyleSheet(styleSheet); // TODO@Alex test fails @@ -73,7 +141,7 @@ suite('Decoration Render Options', () => { // ); // URI, only minimal encoding - s = new CodeEditorServiceImpl(styleSheet); + s = new CodeEditorServiceImpl(themeServiceMock, styleSheet); s.registerDecorationType('example', { gutterIconPath: URI.parse('data:image/svg+xml;base64,PHN2ZyB4b+') }); sheet = readStyleSheet(styleSheet); assert( @@ -82,7 +150,7 @@ suite('Decoration Render Options', () => { ); // single quote must always be escaped/encoded - s = new CodeEditorServiceImpl(styleSheet); + s = new CodeEditorServiceImpl(themeServiceMock, styleSheet); s.registerDecorationType('example', { gutterIconPath: '/Users/foo/b\'ar.png' }); sheet = readStyleSheet(styleSheet); assert( @@ -90,7 +158,7 @@ suite('Decoration Render Options', () => { || sheet.indexOf('background: url("file:///Users/foo/b%27ar.png") center center no-repeat;') > 0 ); - s = new CodeEditorServiceImpl(styleSheet); + s = new CodeEditorServiceImpl(themeServiceMock, styleSheet); s.registerDecorationType('example', { gutterIconPath: URI.parse('http://test/pa\'th') }); sheet = readStyleSheet(styleSheet); assert( diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index cee64b0706f..707cb1047fa 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -1068,19 +1068,19 @@ declare module monaco.editor { export interface IModelDecorationOverviewRulerOptions { /** * CSS color to render in the overview ruler. - * e.g.: rgba(100, 100, 100, 0.5) + * e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry */ - color: string; + color: string | ThemeColor; /** * CSS color to render in the overview ruler. - * e.g.: rgba(100, 100, 100, 0.5) + * e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry */ - darkColor: string; + darkColor: string | ThemeColor; /** * CSS color to render in the overview ruler. - * e.g.: rgba(100, 100, 100, 0.5) + * e.g.: rgba(100, 100, 100, 0.5) or a color from the color registry */ - hcColor?: string; + hcColor?: string | ThemeColor; /** * The position in the overview ruler. */ @@ -2158,6 +2158,10 @@ declare module monaco.editor { restoreViewState?(state: any): void; } + export interface ThemeColor { + id: string; + } + export interface ICommonCodeEditor extends IEditor { /** * An event emitted when the content of the current model has changed. diff --git a/src/vs/platform/theme/common/themeService.ts b/src/vs/platform/theme/common/themeService.ts index 64e028e6215..10305538863 100644 --- a/src/vs/platform/theme/common/themeService.ts +++ b/src/vs/platform/theme/common/themeService.ts @@ -14,9 +14,9 @@ import Event, { Emitter } from 'vs/base/common/event'; export let IThemeService = createDecorator('themeService'); // base themes -export const DARK = 'dark'; -export const LIGHT = 'light'; -export const HIGH_CONTRAST = 'hc'; +export const DARK: ThemeType = 'dark'; +export const LIGHT: ThemeType = 'light'; +export const HIGH_CONTRAST: ThemeType = 'hc'; export type ThemeType = 'light' | 'dark' | 'hc'; export function getThemeTypeSelector(type: ThemeType): string { diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 190042afeea..4850740fec1 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -721,14 +721,28 @@ declare module 'vscode' { preview?: boolean; } + /** + * A reference to one of the workbench colors as defined in https://code.visualstudio.com/docs/getstarted/theme-color-reference. + * Using a theme color is preferred over a custom color as it gives theme authors and users the possibility to change the color. + */ + export class ThemeColor { + + /** + * Creates a reference to a theme color. + * @param id of the color. The available colors are listed in https://code.visualstudio.com/docs/getstarted/theme-color-reference. + */ + constructor(id: string); + } + /** * Represents theme specific rendering styles for a [text editor decoration](#TextEditorDecorationType). */ export interface ThemableDecorationRenderOptions { /** * Background color of the decoration. Use rgba() and define transparent background colors to play well with other decorations. + * Alternativly a color from the color registry an be [referenced](#ColorIdentifier). */ - backgroundColor?: string; + backgroundColor?: string | ThemeColor; /** * CSS styling property that will be applied to text enclosed by a decoration. @@ -739,7 +753,7 @@ declare module 'vscode' { * CSS styling property that will be applied to text enclosed by a decoration. * Better use 'outline' for setting one or more of the individual outline properties. */ - outlineColor?: string; + outlineColor?: string | ThemeColor; /** * CSS styling property that will be applied to text enclosed by a decoration. @@ -762,7 +776,7 @@ declare module 'vscode' { * CSS styling property that will be applied to text enclosed by a decoration. * Better use 'border' for setting one or more of the individual border properties. */ - borderColor?: string; + borderColor?: string | ThemeColor; /** * CSS styling property that will be applied to text enclosed by a decoration. @@ -801,7 +815,7 @@ declare module 'vscode' { /** * CSS styling property that will be applied to text enclosed by a decoration. */ - color?: string; + color?: string | ThemeColor; /** * CSS styling property that will be applied to text enclosed by a decoration. @@ -823,7 +837,7 @@ declare module 'vscode' { /** * The color of the decoration in the overview ruler. Use rgba() and define transparent colors to play well with other decorations. */ - overviewRulerColor?: string; + overviewRulerColor?: string | ThemeColor; /** * Defines the rendering options of the attachment that is inserted before the decorated text @@ -850,6 +864,10 @@ declare module 'vscode' { * CSS styling property that will be applied to the decoration attachment. */ border?: string; + /** + * CSS styling property that will be applied to text enclosed by a decoration. + */ + borderColor?: string | ThemeColor; /** * CSS styling property that will be applied to the decoration attachment. */ @@ -857,11 +875,11 @@ declare module 'vscode' { /** * CSS styling property that will be applied to the decoration attachment. */ - color?: string; + color?: string | ThemeColor; /** * CSS styling property that will be applied to the decoration attachment. */ - backgroundColor?: string; + backgroundColor?: string | ThemeColor; /** * CSS styling property that will be applied to the decoration attachment. */ diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 6aebd241572..eb5b38f2391 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -534,6 +534,7 @@ export function createApiFactory( WorkspaceEdit: extHostTypes.WorkspaceEdit, ProgressLocation: extHostTypes.ProgressLocation, TreeItemCollapsibleState: extHostTypes.TreeItemCollapsibleState, + ThemeColor: extHostTypes.ThemeColor, // functions FileLocationKind: extHostTypes.FileLocationKind, ApplyToKind: extHostTypes.ApplyToKind, diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index 1c10cc26251..20b0d2a1aff 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1270,3 +1270,10 @@ export enum TreeItemCollapsibleState { Collapsed = 1, Expanded = 2 } + +export class ThemeColor { + id: string; + constructor(id: string) { + this.id = id; + } +} \ No newline at end of file diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index bc6e0f5e11d..899b03112be 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -50,8 +50,7 @@ import { IWindowsService, IWindowService } from 'vs/platform/windows/common/wind import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { RawTextSource, IRawTextSource } from 'vs/editor/common/model/textSource'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { IThemeService, ITheme, IThemingParticipant, ThemeType } from 'vs/platform/theme/common/themeService'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { IThemeService, ITheme, DARK } from 'vs/platform/theme/common/themeService'; import { Color } from 'vs/base/common/color'; import { isLinux } from 'vs/base/common/platform'; @@ -1000,10 +999,16 @@ export class TestWindowsService implements IWindowsService { } export class TestTheme implements ITheme { - type: ThemeType; + + constructor(private colors: { [id: string]: string; } = {}, public type = DARK) { + } getColor(color: string, useDefault?: boolean): Color { - throw new Error('Method not implemented.'); + let value = this.colors[color]; + if (value) { + return Color.fromHex(value); + } + return void 0; } defines(color: string): boolean { @@ -1011,17 +1016,30 @@ export class TestTheme implements ITheme { } } -const testTheme = new TestTheme(); - export class TestThemeService implements IThemeService { _serviceBrand: any; + _theme: ITheme; + _onThemeChange = new Emitter(); + + constructor(theme = new TestTheme()) { + this._theme = theme; + } getTheme(): ITheme { - return testTheme; + return this._theme; } - onThemeChange(participant: IThemingParticipant): IDisposable { - return { dispose: () => { } }; + setTheme(theme: ITheme) { + this._theme = theme; + this.fireThemeChange(); + } + + fireThemeChange() { + this._onThemeChange.fire(this._theme); + } + + public get onThemeChange(): Event { + return this._onThemeChange.event; } } From 55de700961a17cb052553a4dada4d45aa80fec7a Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 24 May 2017 13:59:47 -0700 Subject: [PATCH 1013/1164] Fix #25422 - also search external files --- src/vs/workbench/services/search/node/ripgrepTextSearch.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/services/search/node/ripgrepTextSearch.ts b/src/vs/workbench/services/search/node/ripgrepTextSearch.ts index 50cd95218a9..829406f52fe 100644 --- a/src/vs/workbench/services/search/node/ripgrepTextSearch.ts +++ b/src/vs/workbench/services/search/node/ripgrepTextSearch.ts @@ -225,7 +225,7 @@ export class RipgrepParser extends EventEmitter { this.onResult(); } - this.fileMatch = new FileMatch(path.join(this.rootFolder, r[1])); + this.fileMatch = new FileMatch(path.resolve(this.rootFolder, r[1])); } else { // Line is empty (or malformed) } @@ -461,6 +461,8 @@ function getRgArgs(config: IRawSearch): { args: string[], siblingClauses: glob.I args.push('./'); } + args.push(...config.extraFiles); + return { args, siblingClauses }; } From fab8dabc0dbfcef191291b9648fda27d9c2afdcf Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 24 May 2017 14:00:58 -0700 Subject: [PATCH 1014/1164] Clean up var name --- src/vs/workbench/parts/terminal/node/terminalProcess.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/node/terminalProcess.ts b/src/vs/workbench/parts/terminal/node/terminalProcess.ts index 3a2b00a4a70..ab1589b4dcf 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcess.ts +++ b/src/vs/workbench/parts/terminal/node/terminalProcess.ts @@ -5,7 +5,7 @@ import * as os from 'os'; import * as path from 'path'; -import * as ptyJs from 'node-pty'; +import * as pty from 'node-pty'; // The pty process needs to be run in its own child process to get around maxing out CPU on Mac, // see https://github.com/electron/electron/issues/38 @@ -43,7 +43,7 @@ if (cols && rows) { options.rows = parseInt(rows, 10); } -var ptyProcess = ptyJs.fork(shell, args, options); +var ptyProcess = pty.fork(shell, args, options); var closeTimeout; var exitCode; From 3c52e0de45d83440a06a042a28b611bd3478a50a Mon Sep 17 00:00:00 2001 From: rebornix Date: Wed, 10 May 2017 14:57:21 -0700 Subject: [PATCH 1015/1164] draft version --- .../contrib/find/browser/findWidget.css | 34 ++++++++---- .../editor/contrib/find/browser/findWidget.ts | 53 +++++++++++++++++-- 2 files changed, 73 insertions(+), 14 deletions(-) diff --git a/src/vs/editor/contrib/find/browser/findWidget.css b/src/vs/editor/contrib/find/browser/findWidget.css index 74d52635a45..f5b3f333204 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.css +++ b/src/vs/editor/contrib/find/browser/findWidget.css @@ -51,7 +51,9 @@ height: 64px; /* find input height + replace input height */ } .monaco-editor .find-widget.replaceToggled > .replace-part { - display: inline-block; + display: flex; + display: -webkit-flex; + align-items: center; } .monaco-editor .find-widget.visible, @@ -81,6 +83,9 @@ .monaco-editor .find-widget > .replace-part { margin: 4px 0 0 17px; font-size: 12px; + display: flex; + display: -webkit-flex; + align-items: center; } .monaco-editor .find-widget > .find-part .monaco-inputbox, @@ -95,8 +100,9 @@ } .monaco-editor .find-widget .monaco-findInput { - display: inline-block; vertical-align: middle; + display: flex; + flex:1; } .monaco-editor .find-widget .matchesCount { @@ -111,6 +117,7 @@ } .monaco-editor .find-widget .button { + min-width: 20px; width: 20px; height: 20px; display: inline-block; @@ -227,7 +234,8 @@ } .monaco-editor .find-widget > .replace-part > .replace-input { - display: inline-block; + display: flex; + flex:1; vertical-align: middle; } @@ -242,12 +250,9 @@ } /* NARROW (SMALLER THAN REDUCED) */ -.monaco-editor .find-widget.narrow-find-widget > .find-part .monaco-findInput, -.monaco-editor .find-widget.narrow-find-widget > .replace-part .replace-input { - width: 171px !important; -} -.monaco-editor .find-widget.narrow-find-widget > .find-part .monaco-inputbox > .wrapper > .input { - width: 105px !important; +.monaco-editor .find-widget.narrow-find-widget > .find-part, +.monaco-editor .find-widget.narrow-find-widget > .replace-part { + width: 240px !important; } /* COLLAPSED (SMALLER THAN NARROW) */ @@ -258,10 +263,14 @@ .monaco-editor .find-widget.collapsed-find-widget > .find-part .monaco-findInput .controls { display:none; } +.monaco-editor .find-widget.collapsed-find-widget > .find-part, +.monaco-editor .find-widget.collapsed-find-widget > .replace-part { + max-width: 94px !important; +} .monaco-editor .find-widget.collapsed-find-widget > .find-part .monaco-findInput, .monaco-editor .find-widget.collapsed-find-widget > .replace-part .replace-input, .monaco-editor .find-widget.collapsed-find-widget > .find-part .monaco-inputbox > .wrapper > .input { - width: 71px !important; + max-width: 71px !important; } .monaco-editor .findMatch { @@ -275,6 +284,11 @@ animation-name: inherit !important; } +.monaco-editor .find-widget .monaco-sash { + background: grey; + margin-left: -4px; +} + .monaco-editor.hc-black .find-widget .previous, .monaco-editor.vs-dark .find-widget .previous { background-image: url('images/previous-inverse.svg'); diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index 145453e625e..a36edf38b05 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -16,6 +16,7 @@ import { IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview import { FindInput, IFindInputStyles } from 'vs/base/browser/ui/findinput/findInput'; import { IMessage as InputBoxMessage, InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { Widget } from 'vs/base/browser/ui/widget'; +import { Sash, IHorizontalSashLayoutProvider, ISashEvent } from 'vs/base/browser/ui/sash/sash'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition, IViewZone, OverlayWidgetPositionPreference } from 'vs/editor/browser/editorBrowser'; import { FIND_IDS, MATCHES_LIMIT } from 'vs/editor/contrib/find/common/findModel'; @@ -68,7 +69,9 @@ export class FindWidgetViewZone implements IViewZone { } } -export class FindWidget extends Widget implements IOverlayWidget { + +export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSashLayoutProvider { + private static ID = 'editor.contrib.findWidget'; private static PART_WIDTH = 275; @@ -104,6 +107,8 @@ export class FindWidget extends Widget implements IOverlayWidget { private _viewZone: FindWidgetViewZone; private _viewZoneId: number; + private _resizeSash: Sash; + constructor( codeEditor: ICodeEditor, controller: IFindController, @@ -126,6 +131,26 @@ export class FindWidget extends Widget implements IOverlayWidget { this._register(this._state.addChangeListener((e) => this._onStateChanged(e))); this._buildDomNode(); + this._resizeSash = new Sash(this._domNode, this, { orientation: 0}); + let data: { startX: number; }; + let originalWidth = 411; + this._register(this._resizeSash.addListener('start', (e: ISashEvent) => { + data = { + startX: e.startX, + }; + originalWidth = dom.getTotalWidth(this._domNode); + })); + + this._register(this._resizeSash.addListener('end', () => { + data = undefined; + })); + + this._register(this._resizeSash.addListener('change', (evt: ISashEvent) => { + if (data) { + this._domNode.style.width = `${originalWidth + data.startX - evt.currentX}px`; + this._findInput.setWidth(FindWidget.FIND_INPUT_AREA_WIDTH + Math.max(0, data.startX - evt.currentX)); + } + })); this._updateButtons(); let checkEditorWidth = () => { @@ -134,18 +159,27 @@ export class FindWidget extends Widget implements IOverlayWidget { let collapsedFindWidget = false; let reducedFindWidget = false; let narrowFindWidget = false; - if (WIDGET_FIXED_WIDTH + 28 >= editorWidth + 50) { + let widgetWidth = Math.max(411, dom.getTotalWidth(this._domNode)) - 69; + if (widgetWidth + 28 >= editorWidth + 50) { collapsedFindWidget = true; } - if (WIDGET_FIXED_WIDTH + 28 >= editorWidth) { + if (widgetWidth + 28 >= editorWidth) { narrowFindWidget = true; } - if (WIDGET_FIXED_WIDTH + MAX_MATCHES_COUNT_WIDTH + 28 + minimapWidth >= editorWidth) { + if (widgetWidth + MAX_MATCHES_COUNT_WIDTH + 28 + minimapWidth >= editorWidth) { reducedFindWidget = true; } dom.toggleClass(this._domNode, 'collapsed-find-widget', collapsedFindWidget); dom.toggleClass(this._domNode, 'reduced-find-widget', reducedFindWidget); dom.toggleClass(this._domNode, 'narrow-find-widget', narrowFindWidget); + if (collapsedFindWidget) { + this._domNode.style.maxWidth = '111px'; + } else if (narrowFindWidget) { + this._domNode.style.maxWidth = '257px'; + } else { + this._domNode.style.maxWidth = `${editorWidth - 28 - minimapWidth - 15}px`; + } + }; checkEditorWidth(); @@ -552,6 +586,17 @@ export class FindWidget extends Widget implements IOverlayWidget { } } + // ----- sash + public getHorizontalSashTop(sash: Sash): number { + return 0; + } + public getHorizontalSashLeft?(sash: Sash): number { + return 0; + } + public getHorizontalSashWidth?(sash: Sash): number { + return 500; + } + // ----- initialization private _keybindingLabelFor(actionId: string): string { From df32b3f94785e2c0ecaa26063bac9ff3b0076eb2 Mon Sep 17 00:00:00 2001 From: rebornix Date: Thu, 11 May 2017 15:11:28 -0700 Subject: [PATCH 1016/1164] Flex Box --- .../contrib/find/browser/findWidget.css | 27 +++++++++++++------ .../editor/contrib/find/browser/findWidget.ts | 25 +++++++++++++---- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/vs/editor/contrib/find/browser/findWidget.css b/src/vs/editor/contrib/find/browser/findWidget.css index f5b3f333204..e974c6a83c7 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.css +++ b/src/vs/editor/contrib/find/browser/findWidget.css @@ -93,6 +93,10 @@ height: 25px; } +.monaco-editor .find-widget > .find-part .monaco-inputbox > .wrapper > .input { + width: 100% !important; + padding-right: 66px; +} .monaco-editor .find-widget > .find-part .monaco-inputbox > .wrapper > .input, .monaco-editor .find-widget > .replace-part .monaco-inputbox > .wrapper > .input { padding-top: 2px; @@ -106,7 +110,9 @@ } .monaco-editor .find-widget .matchesCount { - display: inline-block; + display: flex; + display: -webkit-flex; + flex: initial; margin: 0 1px 0 3px; padding: 2px 2px 0 2px; height: 25px; @@ -120,8 +126,9 @@ min-width: 20px; width: 20px; height: 20px; - display: inline-block; - vertical-align: middle; + display: flex; + display: -webkit-flex; + flex: initial; margin-left: 3px; background-position: center center; background-repeat: no-repeat; @@ -250,10 +257,10 @@ } /* NARROW (SMALLER THAN REDUCED) */ -.monaco-editor .find-widget.narrow-find-widget > .find-part, +/*.monaco-editor .find-widget.narrow-find-widget > .find-part, .monaco-editor .find-widget.narrow-find-widget > .replace-part { width: 240px !important; -} +}*/ /* COLLAPSED (SMALLER THAN NARROW) */ .monaco-editor .find-widget.collapsed-find-widget .button.previous, @@ -263,7 +270,11 @@ .monaco-editor .find-widget.collapsed-find-widget > .find-part .monaco-findInput .controls { display:none; } -.monaco-editor .find-widget.collapsed-find-widget > .find-part, + +.monaco-editor .find-widget.collapsed-find-widget > .find-part .monaco-inputbox > .wrapper > .input { + padding-right: 0px; +} +/*.monaco-editor .find-widget.collapsed-find-widget > .find-part, .monaco-editor .find-widget.collapsed-find-widget > .replace-part { max-width: 94px !important; } @@ -271,7 +282,7 @@ .monaco-editor .find-widget.collapsed-find-widget > .replace-part .replace-input, .monaco-editor .find-widget.collapsed-find-widget > .find-part .monaco-inputbox > .wrapper > .input { max-width: 71px !important; -} +}*/ .monaco-editor .findMatch { -webkit-animation-duration: 0; @@ -286,7 +297,7 @@ .monaco-editor .find-widget .monaco-sash { background: grey; - margin-left: -4px; + margin-left: -4px; } .monaco-editor.hc-black .find-widget .previous, diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index a36edf38b05..297d4fe6155 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -50,7 +50,6 @@ const NLS_MATCHES_LOCATION = nls.localize('label.matchesLocation', "{0} of {1}") const NLS_NO_RESULTS = nls.localize('label.noResults', "No Results"); let MAX_MATCHES_COUNT_WIDTH = 69; -const WIDGET_FIXED_WIDTH = 411 - 69; export class FindWidgetViewZone implements IViewZone { @@ -131,7 +130,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas this._register(this._state.addChangeListener((e) => this._onStateChanged(e))); this._buildDomNode(); - this._resizeSash = new Sash(this._domNode, this, { orientation: 0}); + this._resizeSash = new Sash(this._domNode, this, { orientation: 0 }); let data: { startX: number; }; let originalWidth = 411; this._register(this._resizeSash.addListener('start', (e: ISashEvent) => { @@ -147,8 +146,24 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas this._register(this._resizeSash.addListener('change', (evt: ISashEvent) => { if (data) { - this._domNode.style.width = `${originalWidth + data.startX - evt.currentX}px`; - this._findInput.setWidth(FindWidget.FIND_INPUT_AREA_WIDTH + Math.max(0, data.startX - evt.currentX)); + let reducedFindWidget = false; + let narrowFindWidget = false; + let collapsedFindWidget = false; + let width = originalWidth + data.startX - evt.currentX; + if (width < 411) { + reducedFindWidget = true; + } + if (width < 411 - 69) { + narrowFindWidget = true; + } + if (width < 265) { + collapsedFindWidget = true; + } + dom.toggleClass(this._domNode, 'collapsed-find-widget', collapsedFindWidget); + dom.toggleClass(this._domNode, 'narrow-find-widget', narrowFindWidget); + dom.toggleClass(this._domNode, 'reduced-find-widget', reducedFindWidget); + this._domNode.style.width = `${width}px`; + // this._findInput.setWidth(FindWidget.FIND_INPUT_AREA_WIDTH + Math.max(0, data.startX - evt.currentX)); } })); this._updateButtons(); @@ -170,8 +185,8 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas reducedFindWidget = true; } dom.toggleClass(this._domNode, 'collapsed-find-widget', collapsedFindWidget); - dom.toggleClass(this._domNode, 'reduced-find-widget', reducedFindWidget); dom.toggleClass(this._domNode, 'narrow-find-widget', narrowFindWidget); + dom.toggleClass(this._domNode, 'reduced-find-widget', reducedFindWidget); if (collapsedFindWidget) { this._domNode.style.maxWidth = '111px'; } else if (narrowFindWidget) { From 0ca5f1c77ac526476f6f13309a45a3ff885a5bc0 Mon Sep 17 00:00:00 2001 From: rebornix Date: Wed, 24 May 2017 14:44:40 -0700 Subject: [PATCH 1017/1164] make input box responsive when widget or editor resizes --- .../contrib/find/browser/findWidget.css | 30 ++-- .../editor/contrib/find/browser/findWidget.ts | 155 ++++++++++-------- 2 files changed, 95 insertions(+), 90 deletions(-) diff --git a/src/vs/editor/contrib/find/browser/findWidget.css b/src/vs/editor/contrib/find/browser/findWidget.css index e974c6a83c7..0fdd4694549 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.css +++ b/src/vs/editor/contrib/find/browser/findWidget.css @@ -106,6 +106,7 @@ .monaco-editor .find-widget .monaco-findInput { vertical-align: middle; display: flex; + display: -webkit-flex; flex:1; } @@ -242,12 +243,9 @@ .monaco-editor .find-widget > .replace-part > .replace-input { display: flex; - flex:1; + display: -webkit-flex; vertical-align: middle; -} - -.monaco-editor .find-widget > .replace-part > .replace-input > .monaco-inputbox { - width: 100%; + width: auto !important; } /* REDUCED */ @@ -257,12 +255,15 @@ } /* NARROW (SMALLER THAN REDUCED) */ -/*.monaco-editor .find-widget.narrow-find-widget > .find-part, -.monaco-editor .find-widget.narrow-find-widget > .replace-part { - width: 240px !important; -}*/ +.monaco-editor .find-widget.narrow-find-widget { + max-width: 257px !important; +} /* COLLAPSED (SMALLER THAN NARROW) */ +.monaco-editor .find-widget.collapsed-find-widget { + max-width: 111px !important; +} + .monaco-editor .find-widget.collapsed-find-widget .button.previous, .monaco-editor .find-widget.collapsed-find-widget .button.next, .monaco-editor .find-widget.collapsed-find-widget .button.replace, @@ -274,15 +275,6 @@ .monaco-editor .find-widget.collapsed-find-widget > .find-part .monaco-inputbox > .wrapper > .input { padding-right: 0px; } -/*.monaco-editor .find-widget.collapsed-find-widget > .find-part, -.monaco-editor .find-widget.collapsed-find-widget > .replace-part { - max-width: 94px !important; -} -.monaco-editor .find-widget.collapsed-find-widget > .find-part .monaco-findInput, -.monaco-editor .find-widget.collapsed-find-widget > .replace-part .replace-input, -.monaco-editor .find-widget.collapsed-find-widget > .find-part .monaco-inputbox > .wrapper > .input { - max-width: 71px !important; -}*/ .monaco-editor .findMatch { -webkit-animation-duration: 0; @@ -296,7 +288,7 @@ } .monaco-editor .find-widget .monaco-sash { - background: grey; + width: 2px !important; margin-left: -4px; } diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index 297d4fe6155..74454a278ec 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -16,7 +16,7 @@ import { IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview import { FindInput, IFindInputStyles } from 'vs/base/browser/ui/findinput/findInput'; import { IMessage as InputBoxMessage, InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { Widget } from 'vs/base/browser/ui/widget'; -import { Sash, IHorizontalSashLayoutProvider, ISashEvent } from 'vs/base/browser/ui/sash/sash'; +import { Sash, IHorizontalSashLayoutProvider, ISashEvent, Orientation } from 'vs/base/browser/ui/sash/sash'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition, IViewZone, OverlayWidgetPositionPreference } from 'vs/editor/browser/editorBrowser'; import { FIND_IDS, MATCHES_LIMIT } from 'vs/editor/contrib/find/common/findModel'; @@ -29,6 +29,7 @@ import { Color } from 'vs/base/common/color'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; import { editorFindRangeHighlight, editorFindMatch, editorFindMatchHighlight, activeContrastBorder, contrastBorder, inputBackground, editorWidgetBackground, inputActiveOptionBorder, widgetShadow, inputForeground, inputBorder, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationErrorBackground, inputValidationErrorBorder, errorForeground } from 'vs/platform/theme/common/colorRegistry'; + export interface IFindController { replace(): void; replaceAll(): void; @@ -49,10 +50,19 @@ const NLS_MATCHES_COUNT_LIMIT_TITLE = nls.localize('title.matchesCountLimit', "O const NLS_MATCHES_LOCATION = nls.localize('label.matchesLocation', "{0} of {1}"); const NLS_NO_RESULTS = nls.localize('label.noResults', "No Results"); +const FIND_WIDGET_INITIAL_WIDTH = 411; +const PART_WIDTH = 275; +const FIND_INPUT_AREA_WIDTH = PART_WIDTH - 54; +const REPLACE_INPUT_AREA_WIDTH = FIND_INPUT_AREA_WIDTH; + let MAX_MATCHES_COUNT_WIDTH = 69; +let FIND_ALL_CONTROLS_WIDTH = 17/** Find Input margin-left */ + (MAX_MATCHES_COUNT_WIDTH + 3 + 1) /** Match Results */ + 23 /** Button */ * 4 + 2/** sash */; + +const FIND_INPUT_AREA_HEIGHT = 34; // The height of Find Widget when Replace Input is not visible. +const FIND_REPLACE_AREA_HEIGHT = 64; // The height of Find Widget when Replace Input is visible. + export class FindWidgetViewZone implements IViewZone { - public afterLineNumber: number; public heightInPx: number; public suppressMouseDown: boolean; @@ -61,24 +71,15 @@ export class FindWidgetViewZone implements IViewZone { constructor(afterLineNumber: number) { this.afterLineNumber = afterLineNumber; - this.heightInPx = 34; + this.heightInPx = FIND_INPUT_AREA_HEIGHT; this.suppressMouseDown = false; this.domNode = document.createElement('div'); this.domNode.className = 'dock-find-viewzone'; } } - export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSashLayoutProvider { - - - private static ID = 'editor.contrib.findWidget'; - private static PART_WIDTH = 275; - private static FIND_INPUT_AREA_WIDTH = FindWidget.PART_WIDTH - 54; - private static REPLACE_INPUT_AREA_WIDTH = FindWidget.FIND_INPUT_AREA_WIDTH; - private static FIND_INPUT_AREA_HEIGHT = 34; // The height of Find Widget when Replace Input is not visible. - private static FIND_REPLACE_AREA_HEIGHT = 64; // The height of Find Widget when Replace Input is visible. - + private static ID = 'editor.contrib.findWidget';; private _codeEditor: ICodeEditor; private _state: FindReplaceState; private _controller: IFindController; @@ -128,44 +129,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas this._isReplaceVisible = false; this._register(this._state.addChangeListener((e) => this._onStateChanged(e))); - this._buildDomNode(); - this._resizeSash = new Sash(this._domNode, this, { orientation: 0 }); - let data: { startX: number; }; - let originalWidth = 411; - this._register(this._resizeSash.addListener('start', (e: ISashEvent) => { - data = { - startX: e.startX, - }; - originalWidth = dom.getTotalWidth(this._domNode); - })); - - this._register(this._resizeSash.addListener('end', () => { - data = undefined; - })); - - this._register(this._resizeSash.addListener('change', (evt: ISashEvent) => { - if (data) { - let reducedFindWidget = false; - let narrowFindWidget = false; - let collapsedFindWidget = false; - let width = originalWidth + data.startX - evt.currentX; - if (width < 411) { - reducedFindWidget = true; - } - if (width < 411 - 69) { - narrowFindWidget = true; - } - if (width < 265) { - collapsedFindWidget = true; - } - dom.toggleClass(this._domNode, 'collapsed-find-widget', collapsedFindWidget); - dom.toggleClass(this._domNode, 'narrow-find-widget', narrowFindWidget); - dom.toggleClass(this._domNode, 'reduced-find-widget', reducedFindWidget); - this._domNode.style.width = `${width}px`; - // this._findInput.setWidth(FindWidget.FIND_INPUT_AREA_WIDTH + Math.max(0, data.startX - evt.currentX)); - } - })); this._updateButtons(); let checkEditorWidth = () => { @@ -174,27 +138,38 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas let collapsedFindWidget = false; let reducedFindWidget = false; let narrowFindWidget = false; - let widgetWidth = Math.max(411, dom.getTotalWidth(this._domNode)) - 69; - if (widgetWidth + 28 >= editorWidth + 50) { - collapsedFindWidget = true; + let widgetWidth = dom.getTotalWidth(this._domNode); + + if (widgetWidth > FIND_WIDGET_INITIAL_WIDTH) { + // as the widget is resized by users, we may need to change the max width of the widget as the editor width changes. + this._domNode.style.maxWidth = `${editorWidth - 28 - minimapWidth - 15}px`; + this._replaceInputBox.inputElement.style.width = `${dom.getTotalWidth(this._findInput.inputBox.inputElement)}px`; + return; } - if (widgetWidth + 28 >= editorWidth) { + + if (FIND_WIDGET_INITIAL_WIDTH + 28 + minimapWidth >= editorWidth) { + reducedFindWidget = true; + } + if (FIND_WIDGET_INITIAL_WIDTH + 28 + minimapWidth - MAX_MATCHES_COUNT_WIDTH >= editorWidth) { narrowFindWidget = true; } - if (widgetWidth + MAX_MATCHES_COUNT_WIDTH + 28 + minimapWidth >= editorWidth) { - reducedFindWidget = true; + if (FIND_WIDGET_INITIAL_WIDTH + 28 + minimapWidth - MAX_MATCHES_COUNT_WIDTH >= editorWidth + 50) { + collapsedFindWidget = true; } dom.toggleClass(this._domNode, 'collapsed-find-widget', collapsedFindWidget); dom.toggleClass(this._domNode, 'narrow-find-widget', narrowFindWidget); dom.toggleClass(this._domNode, 'reduced-find-widget', reducedFindWidget); - if (collapsedFindWidget) { - this._domNode.style.maxWidth = '111px'; - } else if (narrowFindWidget) { - this._domNode.style.maxWidth = '257px'; - } else { + + if (!narrowFindWidget && !collapsedFindWidget) { + // the minimal left offset of findwidget is 15px. this._domNode.style.maxWidth = `${editorWidth - 28 - minimapWidth - 15}px`; } + let findInputWidth = dom.getTotalWidth(this._findInput.inputBox.inputElement); + if (findInputWidth > 0) { + this._replaceInputBox.inputElement.style.width = `${findInputWidth}px`; + } + }; checkEditorWidth(); @@ -467,9 +442,9 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas this._codeEditor.changeViewZones((accessor) => { if (this._state.isReplaceRevealed) { - this._viewZone.heightInPx = FindWidget.FIND_REPLACE_AREA_HEIGHT; + this._viewZone.heightInPx = FIND_REPLACE_AREA_HEIGHT; } else { - this._viewZone.heightInPx = FindWidget.FIND_INPUT_AREA_HEIGHT; + this._viewZone.heightInPx = FIND_INPUT_AREA_HEIGHT; } this._viewZoneId = accessor.addZone(this._viewZone); @@ -483,19 +458,19 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas } this._codeEditor.changeViewZones((accessor) => { - let scrollAdjustment = FindWidget.FIND_INPUT_AREA_HEIGHT; + let scrollAdjustment = FIND_INPUT_AREA_HEIGHT; if (this._viewZoneId !== undefined) { if (this._state.isReplaceRevealed) { - this._viewZone.heightInPx = FindWidget.FIND_REPLACE_AREA_HEIGHT; - scrollAdjustment = FindWidget.FIND_REPLACE_AREA_HEIGHT - FindWidget.FIND_INPUT_AREA_HEIGHT; + this._viewZone.heightInPx = FIND_REPLACE_AREA_HEIGHT; + scrollAdjustment = FIND_REPLACE_AREA_HEIGHT - FIND_INPUT_AREA_HEIGHT; } else { - this._viewZone.heightInPx = FindWidget.FIND_INPUT_AREA_HEIGHT; - scrollAdjustment = FindWidget.FIND_INPUT_AREA_HEIGHT - FindWidget.FIND_REPLACE_AREA_HEIGHT; + this._viewZone.heightInPx = FIND_INPUT_AREA_HEIGHT; + scrollAdjustment = FIND_INPUT_AREA_HEIGHT - FIND_REPLACE_AREA_HEIGHT; } accessor.removeZone(this._viewZoneId); } else { - this._viewZone.heightInPx = FindWidget.FIND_INPUT_AREA_HEIGHT; + this._viewZone.heightInPx = FIND_INPUT_AREA_HEIGHT; } this._viewZoneId = accessor.addZone(this._viewZone); this._codeEditor.setScrollTop(this._codeEditor.getScrollTop() + scrollAdjustment); @@ -625,7 +600,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas private _buildFindPart(): HTMLElement { // Find input this._findInput = this._register(new FindInput(null, this._contextViewProvider, { - width: FindWidget.FIND_INPUT_AREA_WIDTH, + width: FIND_INPUT_AREA_WIDTH, label: NLS_FIND_INPUT_LABEL, placeholder: NLS_FIND_INPUT_PLACEHOLDER, appendCaseSensitiveLabel: this._keybindingLabelFor(FIND_IDS.ToggleCaseSensitiveCommand), @@ -751,7 +726,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas // Replace input let replaceInput = document.createElement('div'); replaceInput.className = 'replace-input'; - replaceInput.style.width = FindWidget.REPLACE_INPUT_AREA_WIDTH + 'px'; + replaceInput.style.width = REPLACE_INPUT_AREA_WIDTH + 'px'; this._replaceInputBox = this._register(new InputBox(replaceInput, null, { ariaLabel: NLS_REPLACE_INPUT_LABEL, placeholder: NLS_REPLACE_INPUT_PLACEHOLDER @@ -809,6 +784,9 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas className: 'toggle left', onTrigger: () => { this._state.change({ isReplaceRevealed: !this._isReplaceVisible }, false); + if (this._isReplaceVisible) { + this._replaceInputBox.width = this._findInput.inputBox.width; + } this._showViewZone(); }, onKeyDown: (e) => { } @@ -825,6 +803,36 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas this._domNode.appendChild(this._toggleReplaceBtn.domNode); this._domNode.appendChild(findPart); this._domNode.appendChild(replacePart); + + this._buildSash(); + } + + private _buildSash() { + this._resizeSash = new Sash(this._domNode, this, { orientation: Orientation.VERTICAL }); + let originalWidth = FIND_WIDGET_INITIAL_WIDTH; + + this._register(this._resizeSash.addListener('start', (e: ISashEvent) => { + originalWidth = dom.getTotalWidth(this._domNode); + })); + + this._register(this._resizeSash.addListener('change', (evt: ISashEvent) => { + let width = originalWidth + evt.startX - evt.currentX; + + if (width < FIND_WIDGET_INITIAL_WIDTH) { + // narrow down the find widget should be handled by CSS. + return; + } + + let inputBoxWidth = width - FIND_ALL_CONTROLS_WIDTH; + let maxWidth = parseFloat(dom.getComputedStyle(this._domNode).maxWidth) || 0; + if (width > maxWidth) { + return; + } + this._domNode.style.width = `${width}px`; + if (this._isReplaceVisible) { + this._replaceInputBox.width = inputBoxWidth; + } + })); } } @@ -1009,5 +1017,10 @@ registerThemingParticipant((theme, collector) => { if (error) { collector.addRule(`.monaco-editor .find-widget.no-results .matchesCount { color: ${error}; }`); } + + let border = theme.getColor('panel.border'); + if (border) { + collector.addRule(`.monaco-editor .find-widget .monaco-sash { background-color: ${border}; width: 2px !important; margin-left: -4px;}`); + } }); From 3ef1b64d4b49cd9f9b59bc7fafd95053baeab51f Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 24 May 2017 23:49:51 +0200 Subject: [PATCH 1018/1164] Allow extensions to use theme colors in status bar --- src/vs/platform/statusbar/common/statusbar.ts | 3 ++- src/vs/vscode.d.ts | 2 +- .../electron-browser/mainThreadStatusBar.ts | 3 ++- src/vs/workbench/api/node/extHost.protocol.ts | 2 +- src/vs/workbench/api/node/extHostStatusBar.ts | 8 ++++---- .../browser/parts/statusbar/statusbarPart.ts | 18 +++++++++++++++--- 6 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/vs/platform/statusbar/common/statusbar.ts b/src/vs/platform/statusbar/common/statusbar.ts index 6e45f806115..d42f792b801 100644 --- a/src/vs/platform/statusbar/common/statusbar.ts +++ b/src/vs/platform/statusbar/common/statusbar.ts @@ -7,6 +7,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IDisposable } from 'vs/base/common/lifecycle'; +import { ThemeColor } from 'vs/editor/common/editorCommon'; export var IStatusbarService = createDecorator('statusbarService'); @@ -34,7 +35,7 @@ export interface IStatusbarEntry { /** * An optional color to use for the entry */ - color?: string; + color?: string | ThemeColor; /** * An optional id of a command that is known to the workbench to execute on click diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 4850740fec1..35a6a58cc03 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3301,7 +3301,7 @@ declare module 'vscode' { /** * The foreground color for this entry. */ - color: string | undefined; + color: string | ThemeColor | undefined; /** * The identifier of a command to run on click. The command must be diff --git a/src/vs/workbench/api/electron-browser/mainThreadStatusBar.ts b/src/vs/workbench/api/electron-browser/mainThreadStatusBar.ts index d64d9d3ac2b..d16e17cda09 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadStatusBar.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadStatusBar.ts @@ -7,6 +7,7 @@ import { IStatusbarService, StatusbarAlignment as MainThreadStatusBarAlignment } from 'vs/platform/statusbar/common/statusbar'; import { IDisposable } from 'vs/base/common/lifecycle'; import { MainThreadStatusBarShape } from '../node/extHost.protocol'; +import { ThemeColor } from 'vs/editor/common/editorCommon'; export class MainThreadStatusBar extends MainThreadStatusBarShape { private mapIdToDisposable: { [id: number]: IDisposable }; @@ -18,7 +19,7 @@ export class MainThreadStatusBar extends MainThreadStatusBarShape { this.mapIdToDisposable = Object.create(null); } - $setEntry(id: number, extensionId: string, text: string, tooltip: string, command: string, color: string, alignment: MainThreadStatusBarAlignment, priority: number): void { + $setEntry(id: number, extensionId: string, text: string, tooltip: string, command: string, color: string | ThemeColor, alignment: MainThreadStatusBarAlignment, priority: number): void { // Dispose any old this.$dispose(id); diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 1dbe9058048..f9c02d01d8c 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -277,7 +277,7 @@ export abstract class MainThreadQuickOpenShape { } export abstract class MainThreadStatusBarShape { - $setEntry(id: number, extensionId: string, text: string, tooltip: string, command: string, color: string, alignment: MainThreadStatusBarAlignment, priority: number): void { throw ni(); } + $setEntry(id: number, extensionId: string, text: string, tooltip: string, command: string, color: string | editorCommon.ThemeColor, alignment: MainThreadStatusBarAlignment, priority: number): void { throw ni(); } $dispose(id: number) { throw ni(); } } diff --git a/src/vs/workbench/api/node/extHostStatusBar.ts b/src/vs/workbench/api/node/extHostStatusBar.ts index 97c917caf51..6e91e7dbf9a 100644 --- a/src/vs/workbench/api/node/extHostStatusBar.ts +++ b/src/vs/workbench/api/node/extHostStatusBar.ts @@ -6,7 +6,7 @@ import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; import { StatusbarAlignment as MainThreadStatusBarAlignment } from 'vs/platform/statusbar/common/statusbar'; -import { StatusBarAlignment as ExtHostStatusBarAlignment, Disposable } from './extHostTypes'; +import { StatusBarAlignment as ExtHostStatusBarAlignment, Disposable, ThemeColor } from './extHostTypes'; import { StatusBarItem, StatusBarAlignment } from 'vscode'; import { MainContext, MainThreadStatusBarShape } from './extHost.protocol'; @@ -21,7 +21,7 @@ export class ExtHostStatusBarEntry implements StatusBarItem { private _text: string; private _tooltip: string; - private _color: string; + private _color: string | ThemeColor; private _command: string; private _timeoutHandle: number; @@ -57,7 +57,7 @@ export class ExtHostStatusBarEntry implements StatusBarItem { return this._tooltip; } - public get color(): string { + public get color(): string | ThemeColor { return this._color; } @@ -75,7 +75,7 @@ export class ExtHostStatusBarEntry implements StatusBarItem { this.update(); } - public set color(color: string) { + public set color(color: string | ThemeColor) { this._color = color; this.update(); } diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index 123f0f5d26e..fd2fd574fb4 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -30,6 +30,8 @@ import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } import { STATUS_BAR_BACKGROUND, STATUS_BAR_FOREGROUND, STATUS_BAR_NO_FOLDER_BACKGROUND, STATUS_BAR_ITEM_HOVER_BACKGROUND, STATUS_BAR_ITEM_ACTIVE_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_HOVER_BACKGROUND, STATUS_BAR_BORDER, STATUS_BAR_NO_FOLDER_FOREGROUND } from 'vs/workbench/common/theme'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { contrastBorder } from 'vs/platform/theme/common/colorRegistry'; +import { isThemeColor } from "vs/editor/common/editorCommon"; +import { Color } from 'vs/base/common/color'; export class StatusbarPart extends Part implements IStatusbarService { @@ -217,7 +219,8 @@ class StatusBarEntryItem implements IStatusbarItem { @IMessageService private messageService: IMessageService, @ITelemetryService private telemetryService: ITelemetryService, @IContextMenuService private contextMenuService: IContextMenuService, - @IWorkbenchEditorService private editorService: IWorkbenchEditorService + @IWorkbenchEditorService private editorService: IWorkbenchEditorService, + @IThemeService private themeService: IThemeService ) { this.entry = entry; @@ -249,8 +252,17 @@ class StatusBarEntryItem implements IStatusbarItem { } // Color - if (this.entry.color) { - $(textContainer).color(this.entry.color); + let color = this.entry.color; + if (color) { + if (isThemeColor(color)) { + let colorId = color.id; + color = (this.themeService.getTheme().getColor(colorId) || Color.transparent).toString(); + toDispose.push(this.themeService.onThemeChange(theme => { + let colorValue = (this.themeService.getTheme().getColor(colorId) || Color.transparent).toString(); + $(textContainer).color(colorValue); + })); + } + $(textContainer).color(color); } // Context Menu From 43003d7ff65cdf8a5de2d69360c69d61d9ef96d7 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Wed, 24 May 2017 23:50:40 +0200 Subject: [PATCH 1019/1164] Fix deprecation warning on StyleSheet.insertRule --- src/vs/editor/browser/services/codeEditorServiceImpl.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index 703e6e4f0ee..26bc62e9e6a 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -316,15 +316,15 @@ class DecorationCSSRules { let hasContent = false; if (unthemedCSS.length > 0) { - sheet.insertRule(`${this._unThemedSelector} {${unthemedCSS}}`); + sheet.insertRule(`${this._unThemedSelector} {${unthemedCSS}}`, 0); hasContent = true; } if (lightCSS.length > 0) { - sheet.insertRule(`.vs${this._unThemedSelector} {${lightCSS}}`); + sheet.insertRule(`.vs${this._unThemedSelector} {${lightCSS}}`, 0); hasContent = true; } if (darkCSS.length > 0) { - sheet.insertRule(`.vs-dark${this._unThemedSelector}, .hc-black${this._unThemedSelector} {${darkCSS}}`); + sheet.insertRule(`.vs-dark${this._unThemedSelector}, .hc-black${this._unThemedSelector} {${darkCSS}}`, 0); hasContent = true; } this._hasContent = hasContent; From 59e7fbc25eabf4143c29d9df575fce1875e10e70 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 24 May 2017 15:03:40 -0700 Subject: [PATCH 1020/1164] use alwaysStrict in TS extension --- extensions/typescript/src/features/baseCodeLensProvider.ts | 2 -- extensions/typescript/src/features/bufferSyncSupport.ts | 1 - extensions/typescript/src/features/codeActionProvider.ts | 2 -- extensions/typescript/src/features/completionItemProvider.ts | 2 -- extensions/typescript/src/features/definitionProvider.ts | 2 -- extensions/typescript/src/features/definitionProviderBase.ts | 2 -- .../src/features/directiveCommentCompletionProvider.ts | 2 -- .../typescript/src/features/documentHighlightProvider.ts | 2 -- extensions/typescript/src/features/documentSymbolProvider.ts | 2 -- extensions/typescript/src/features/formattingProvider.ts | 2 -- extensions/typescript/src/features/hoverProvider.ts | 2 -- extensions/typescript/src/features/implementationProvider.ts | 2 -- .../src/features/implementationsCodeLensProvider.ts | 2 -- extensions/typescript/src/features/jsDocCompletionProvider.ts | 2 -- extensions/typescript/src/features/previewer.ts | 2 -- extensions/typescript/src/features/referenceProvider.ts | 2 -- .../typescript/src/features/referencesCodeLensProvider.ts | 2 -- extensions/typescript/src/features/renameProvider.ts | 2 -- extensions/typescript/src/features/signatureHelpProvider.ts | 2 -- extensions/typescript/src/features/typeDefinitionProvider.ts | 2 -- extensions/typescript/src/features/workspaceSymbolProvider.ts | 2 -- extensions/typescript/src/protocol.const.ts | 2 -- extensions/typescript/src/typescriptMain.ts | 1 - extensions/typescript/src/typescriptService.ts | 1 - extensions/typescript/src/typescriptServiceClient.ts | 2 -- extensions/typescript/src/utils/async.ts | 2 -- extensions/typescript/src/utils/buildStatus.ts | 2 -- extensions/typescript/src/utils/electron.ts | 2 -- extensions/typescript/src/utils/is.ts | 2 -- extensions/typescript/src/utils/logger.ts | 2 -- extensions/typescript/src/utils/plugins.ts | 1 - extensions/typescript/src/utils/projectStatus.ts | 2 -- extensions/typescript/src/utils/telemetry.ts | 2 -- extensions/typescript/src/utils/tracer.ts | 2 -- extensions/typescript/src/utils/typingsStatus.ts | 2 -- extensions/typescript/src/utils/versionStatus.ts | 2 -- extensions/typescript/src/utils/wireProtocol.ts | 2 -- extensions/typescript/tsconfig.json | 4 +++- 38 files changed, 3 insertions(+), 71 deletions(-) diff --git a/extensions/typescript/src/features/baseCodeLensProvider.ts b/extensions/typescript/src/features/baseCodeLensProvider.ts index 98e4de9cc1c..20952150c4b 100644 --- a/extensions/typescript/src/features/baseCodeLensProvider.ts +++ b/extensions/typescript/src/features/baseCodeLensProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { CodeLensProvider, CodeLens, CancellationToken, TextDocument, Range, Uri, Position, Event, EventEmitter, ProviderResult, } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/features/bufferSyncSupport.ts b/extensions/typescript/src/features/bufferSyncSupport.ts index dfb32d759da..f2b11faebef 100644 --- a/extensions/typescript/src/features/bufferSyncSupport.ts +++ b/extensions/typescript/src/features/bufferSyncSupport.ts @@ -2,7 +2,6 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; import * as cp from 'child_process'; import * as fs from 'fs'; diff --git a/extensions/typescript/src/features/codeActionProvider.ts b/extensions/typescript/src/features/codeActionProvider.ts index 0a9d297987c..8f0dd56f01d 100644 --- a/extensions/typescript/src/features/codeActionProvider.ts +++ b/extensions/typescript/src/features/codeActionProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { CodeActionProvider, TextDocument, Range, CancellationToken, CodeActionContext, Command, commands, Uri, workspace, WorkspaceEdit, TextEdit, FormattingOptions, window, ProviderResult } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/features/completionItemProvider.ts b/extensions/typescript/src/features/completionItemProvider.ts index 618c84174bc..5f0740be10c 100644 --- a/extensions/typescript/src/features/completionItemProvider.ts +++ b/extensions/typescript/src/features/completionItemProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { CompletionItem, TextDocument, Position, CompletionItemKind, CompletionItemProvider, CancellationToken, TextEdit, Range, SnippetString, workspace, ProviderResult } from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; diff --git a/extensions/typescript/src/features/definitionProvider.ts b/extensions/typescript/src/features/definitionProvider.ts index ee364a63614..2713fc603db 100644 --- a/extensions/typescript/src/features/definitionProvider.ts +++ b/extensions/typescript/src/features/definitionProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { DefinitionProvider, TextDocument, Position, CancellationToken, Definition } from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; diff --git a/extensions/typescript/src/features/definitionProviderBase.ts b/extensions/typescript/src/features/definitionProviderBase.ts index 3cf66901015..b405d28fbaf 100644 --- a/extensions/typescript/src/features/definitionProviderBase.ts +++ b/extensions/typescript/src/features/definitionProviderBase.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { TextDocument, Position, Range, CancellationToken, Location } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/features/directiveCommentCompletionProvider.ts b/extensions/typescript/src/features/directiveCommentCompletionProvider.ts index a334e8c2f7b..6dd8aa8418d 100644 --- a/extensions/typescript/src/features/directiveCommentCompletionProvider.ts +++ b/extensions/typescript/src/features/directiveCommentCompletionProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { Position, CompletionItemProvider, CompletionItemKind, TextDocument, CancellationToken, CompletionItem, ProviderResult, Range } from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; diff --git a/extensions/typescript/src/features/documentHighlightProvider.ts b/extensions/typescript/src/features/documentHighlightProvider.ts index afffc9fa60c..f0140953d92 100644 --- a/extensions/typescript/src/features/documentHighlightProvider.ts +++ b/extensions/typescript/src/features/documentHighlightProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { DocumentHighlightProvider, DocumentHighlight, DocumentHighlightKind, TextDocument, Position, Range, CancellationToken } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/features/documentSymbolProvider.ts b/extensions/typescript/src/features/documentSymbolProvider.ts index 5d4a8595a37..aa6a4e5ab7f 100644 --- a/extensions/typescript/src/features/documentSymbolProvider.ts +++ b/extensions/typescript/src/features/documentSymbolProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { DocumentSymbolProvider, SymbolInformation, SymbolKind, TextDocument, Range, Location, CancellationToken, Uri } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/features/formattingProvider.ts b/extensions/typescript/src/features/formattingProvider.ts index 77f6971201e..40b5522d0fa 100644 --- a/extensions/typescript/src/features/formattingProvider.ts +++ b/extensions/typescript/src/features/formattingProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { workspace as Workspace, DocumentRangeFormattingEditProvider, OnTypeFormattingEditProvider, FormattingOptions, TextDocument, Position, Range, CancellationToken, TextEdit, WorkspaceConfiguration } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/features/hoverProvider.ts b/extensions/typescript/src/features/hoverProvider.ts index 75d36131baf..e726ff1dc34 100644 --- a/extensions/typescript/src/features/hoverProvider.ts +++ b/extensions/typescript/src/features/hoverProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { HoverProvider, Hover, TextDocument, Position, Range, CancellationToken } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/features/implementationProvider.ts b/extensions/typescript/src/features/implementationProvider.ts index 452afad1033..ab4d5b8c45b 100644 --- a/extensions/typescript/src/features/implementationProvider.ts +++ b/extensions/typescript/src/features/implementationProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { ImplementationProvider, TextDocument, Position, CancellationToken, Definition } from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; diff --git a/extensions/typescript/src/features/implementationsCodeLensProvider.ts b/extensions/typescript/src/features/implementationsCodeLensProvider.ts index 793176bb4f6..30daa644a4e 100644 --- a/extensions/typescript/src/features/implementationsCodeLensProvider.ts +++ b/extensions/typescript/src/features/implementationsCodeLensProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { CodeLens, CancellationToken, TextDocument, Range, Location, ProviderResult, workspace } from 'vscode'; import * as Proto from '../protocol'; import * as PConst from '../protocol.const'; diff --git a/extensions/typescript/src/features/jsDocCompletionProvider.ts b/extensions/typescript/src/features/jsDocCompletionProvider.ts index fc8e88d5df2..da02e942bfc 100644 --- a/extensions/typescript/src/features/jsDocCompletionProvider.ts +++ b/extensions/typescript/src/features/jsDocCompletionProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { Position, Range, CompletionItemProvider, CompletionItemKind, TextDocument, CancellationToken, CompletionItem, window, Uri, ProviderResult, TextEditor, SnippetString, workspace } from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; diff --git a/extensions/typescript/src/features/previewer.ts b/extensions/typescript/src/features/previewer.ts index d02ab69550b..c418e92d59a 100644 --- a/extensions/typescript/src/features/previewer.ts +++ b/extensions/typescript/src/features/previewer.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import * as Proto from '../protocol'; export function plain(parts: Proto.SymbolDisplayPart[]): string { diff --git a/extensions/typescript/src/features/referenceProvider.ts b/extensions/typescript/src/features/referenceProvider.ts index 56aac3a0cd8..47921d128ea 100644 --- a/extensions/typescript/src/features/referenceProvider.ts +++ b/extensions/typescript/src/features/referenceProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { ReferenceProvider, Location, TextDocument, Position, Range, CancellationToken } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/features/referencesCodeLensProvider.ts b/extensions/typescript/src/features/referencesCodeLensProvider.ts index 46ecf347e72..5576bfc4825 100644 --- a/extensions/typescript/src/features/referencesCodeLensProvider.ts +++ b/extensions/typescript/src/features/referencesCodeLensProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { CodeLens, CancellationToken, TextDocument, Range, Location, ProviderResult, workspace } from 'vscode'; import * as Proto from '../protocol'; import * as PConst from '../protocol.const'; diff --git a/extensions/typescript/src/features/renameProvider.ts b/extensions/typescript/src/features/renameProvider.ts index da279ab5596..39c85f307a7 100644 --- a/extensions/typescript/src/features/renameProvider.ts +++ b/extensions/typescript/src/features/renameProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { RenameProvider, WorkspaceEdit, TextDocument, Position, Range, CancellationToken } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/features/signatureHelpProvider.ts b/extensions/typescript/src/features/signatureHelpProvider.ts index b8247e03154..0a794878624 100644 --- a/extensions/typescript/src/features/signatureHelpProvider.ts +++ b/extensions/typescript/src/features/signatureHelpProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { SignatureHelpProvider, SignatureHelp, SignatureInformation, ParameterInformation, TextDocument, Position, CancellationToken } from 'vscode'; import * as Previewer from './previewer'; diff --git a/extensions/typescript/src/features/typeDefinitionProvider.ts b/extensions/typescript/src/features/typeDefinitionProvider.ts index edaccf0bf33..d107f67580a 100644 --- a/extensions/typescript/src/features/typeDefinitionProvider.ts +++ b/extensions/typescript/src/features/typeDefinitionProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { TypeDefinitionProvider, TextDocument, Position, CancellationToken, Definition } from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; diff --git a/extensions/typescript/src/features/workspaceSymbolProvider.ts b/extensions/typescript/src/features/workspaceSymbolProvider.ts index 8593c4a8955..016ac8726b3 100644 --- a/extensions/typescript/src/features/workspaceSymbolProvider.ts +++ b/extensions/typescript/src/features/workspaceSymbolProvider.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { workspace, window, Uri, WorkspaceSymbolProvider, SymbolInformation, SymbolKind, Range, Location, CancellationToken } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/protocol.const.ts b/extensions/typescript/src/protocol.const.ts index 6990868683d..822e05d2b21 100644 --- a/extensions/typescript/src/protocol.const.ts +++ b/extensions/typescript/src/protocol.const.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - export class Kind { public static readonly alias = 'alias'; public static readonly callSignature = 'call'; diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index 037ae6f8464..45ba3a85290 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -7,7 +7,6 @@ * Includes code from typescript-sublime-plugin project, obtained from * https://github.com/Microsoft/TypeScript-Sublime-Plugin/blob/master/TypeScript%20Indent.tmPreferences * ------------------------------------------------------------------------------------------ */ -'use strict'; import { env, languages, commands, workspace, window, ExtensionContext, Memento, IndentAction, Diagnostic, DiagnosticCollection, Range, Disposable, Uri, MessageItem, TextEditor, DiagnosticSeverity, TextDocument, SnippetString } from 'vscode'; diff --git a/extensions/typescript/src/typescriptService.ts b/extensions/typescript/src/typescriptService.ts index bfc410c6cba..8b15cc79f7b 100644 --- a/extensions/typescript/src/typescriptService.ts +++ b/extensions/typescript/src/typescriptService.ts @@ -3,7 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; import { CancellationToken, Uri, Event } from 'vscode'; import * as Proto from './protocol'; diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index f5a92dbd4cd..cf2b7c3be6f 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import * as cp from 'child_process'; import * as path from 'path'; import * as fs from 'fs'; diff --git a/extensions/typescript/src/utils/async.ts b/extensions/typescript/src/utils/async.ts index fb260bde50b..f87754e69e8 100644 --- a/extensions/typescript/src/utils/async.ts +++ b/extensions/typescript/src/utils/async.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - export interface ITask { (): T; } diff --git a/extensions/typescript/src/utils/buildStatus.ts b/extensions/typescript/src/utils/buildStatus.ts index cf640508af3..ced56fd43b9 100644 --- a/extensions/typescript/src/utils/buildStatus.ts +++ b/extensions/typescript/src/utils/buildStatus.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import vscode = require('vscode'); const statusItem: vscode.StatusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, Number.MIN_VALUE); diff --git a/extensions/typescript/src/utils/electron.ts b/extensions/typescript/src/utils/electron.ts index 51c44519891..4418ca51dbd 100644 --- a/extensions/typescript/src/utils/electron.ts +++ b/extensions/typescript/src/utils/electron.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import path = require('path'); import os = require('os'); import net = require('net'); diff --git a/extensions/typescript/src/utils/is.ts b/extensions/typescript/src/utils/is.ts index 78ef8c734cd..fc6fd6ad286 100644 --- a/extensions/typescript/src/utils/is.ts +++ b/extensions/typescript/src/utils/is.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - const toString = Object.prototype.toString; export function defined(value: any): boolean { diff --git a/extensions/typescript/src/utils/logger.ts b/extensions/typescript/src/utils/logger.ts index 577314c351d..7f82fb28c96 100644 --- a/extensions/typescript/src/utils/logger.ts +++ b/extensions/typescript/src/utils/logger.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { OutputChannel, window } from "vscode"; import * as is from './is'; diff --git a/extensions/typescript/src/utils/plugins.ts b/extensions/typescript/src/utils/plugins.ts index 24fb56e99b7..49f0d93b4b6 100644 --- a/extensions/typescript/src/utils/plugins.ts +++ b/extensions/typescript/src/utils/plugins.ts @@ -2,7 +2,6 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; import { extensions } from "vscode"; diff --git a/extensions/typescript/src/utils/projectStatus.ts b/extensions/typescript/src/utils/projectStatus.ts index f6042d29449..8c9911531eb 100644 --- a/extensions/typescript/src/utils/projectStatus.ts +++ b/extensions/typescript/src/utils/projectStatus.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import * as vscode from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; import { loadMessageBundle } from 'vscode-nls'; diff --git a/extensions/typescript/src/utils/telemetry.ts b/extensions/typescript/src/utils/telemetry.ts index 17c43339a9e..5162a0c24d5 100644 --- a/extensions/typescript/src/utils/telemetry.ts +++ b/extensions/typescript/src/utils/telemetry.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import * as path from 'path'; import VsCodeTelemetryReporter from 'vscode-extension-telemetry'; import { Disposable } from "vscode"; diff --git a/extensions/typescript/src/utils/tracer.ts b/extensions/typescript/src/utils/tracer.ts index 078d2e6f45a..fe16a13d61a 100644 --- a/extensions/typescript/src/utils/tracer.ts +++ b/extensions/typescript/src/utils/tracer.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { workspace } from 'vscode'; import * as Proto from '../protocol'; diff --git a/extensions/typescript/src/utils/typingsStatus.ts b/extensions/typescript/src/utils/typingsStatus.ts index 4798046abf6..44f90ec15c1 100644 --- a/extensions/typescript/src/utils/typingsStatus.ts +++ b/extensions/typescript/src/utils/typingsStatus.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import { MessageItem, workspace, Disposable, ProgressLocation, window, commands, Uri } from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; import { loadMessageBundle } from 'vscode-nls'; diff --git a/extensions/typescript/src/utils/versionStatus.ts b/extensions/typescript/src/utils/versionStatus.ts index 358d3a9b103..e92b87d0f24 100644 --- a/extensions/typescript/src/utils/versionStatus.ts +++ b/extensions/typescript/src/utils/versionStatus.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import vscode = require('vscode'); const versionBarEntry = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, Number.MIN_VALUE); diff --git a/extensions/typescript/src/utils/wireProtocol.ts b/extensions/typescript/src/utils/wireProtocol.ts index 218d461f853..ad5d464304d 100644 --- a/extensions/typescript/src/utils/wireProtocol.ts +++ b/extensions/typescript/src/utils/wireProtocol.ts @@ -3,8 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; - import stream = require('stream'); const DefaultSize: number = 8192; diff --git a/extensions/typescript/tsconfig.json b/extensions/typescript/tsconfig.json index 3112725c103..da4f1bb399b 100644 --- a/extensions/typescript/tsconfig.json +++ b/extensions/typescript/tsconfig.json @@ -11,7 +11,9 @@ "noImplicitAny": true, "noImplicitReturns": true, "noUnusedLocals": true, - "noUnusedParameters": true + "noUnusedParameters": true, + "strict": true, + "alwaysStrict": true }, "include": [ "src/**/*" From 2890b5d8ab3d3a9fe9dd3401ebc9f14c9fa89319 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 24 May 2017 15:07:43 -0700 Subject: [PATCH 1021/1164] Add restart TSServer command. Fixes #22335 --- extensions/typescript/package.json | 5 +++++ extensions/typescript/package.nls.json | 1 + extensions/typescript/src/typescriptMain.ts | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/extensions/typescript/package.json b/extensions/typescript/package.json index cb4fa518bf0..a24c0c10519 100644 --- a/extensions/typescript/package.json +++ b/extensions/typescript/package.json @@ -345,6 +345,11 @@ "command": "typescript.openTsServerLog", "title": "%typescript.openTsServerLog.title%", "category": "TypeScript" + }, + { + "command": "typescript.restartTsServer", + "title": "%typescript.restartTsServer%", + "category": "TypeScript" } ], "menus": { diff --git a/extensions/typescript/package.nls.json b/extensions/typescript/package.nls.json index faa59a26d7f..821257b38a1 100644 --- a/extensions/typescript/package.nls.json +++ b/extensions/typescript/package.nls.json @@ -32,6 +32,7 @@ "typescript.referencesCodeLens.enabled": "Enable/disable references CodeLens in TypeScript files. Requires TypeScript >= 2.0.6.", "typescript.implementationsCodeLens.enabled": "Enable/disable implementations CodeLens. Requires TypeScript >= 2.2.0.", "typescript.openTsServerLog.title": "Open TS Server log", + "typescript.restartTsServer": "Restart TS server", "typescript.selectTypeScriptVersion.title": "Select TypeScript Version", "jsDocCompletion.enabled": "Enable/disable auto JSDoc comments", "javascript.implicitProjectConfig.checkJs": "Enable/disable semantic checking of JavaScript files. Existing jsconfig.json or tsconfig.json files override this setting. Requires TypeScript >=2.3.1.", diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index 45ba3a85290..9949d0db9d2 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -109,6 +109,10 @@ export function activate(context: ExtensionContext): void { client.openTsServerLogFile(); })); + context.subscriptions.push(commands.registerCommand('typescript.restartTsServer', () => { + client.restartTsServer(); + })); + const goToProjectConfig = (isTypeScript: boolean) => { const editor = window.activeTextEditor; if (editor) { From d21ff22a1fbceae4b04c517e0cb49c679242154b Mon Sep 17 00:00:00 2001 From: rebornix Date: Wed, 24 May 2017 15:11:57 -0700 Subject: [PATCH 1022/1164] Fix #27144. We just need to listen to scrollTop change for FindWidget --- src/vs/editor/contrib/find/browser/findWidget.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index 74454a278ec..78e442c6992 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -235,7 +235,9 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas })); this._register(this._codeEditor.onDidScrollChange((e) => { - this._layoutViewZone(); + if (e.scrollTopChanged) { + this._layoutViewZone(); + } })); } From 3aade944ae7ff0bc62183614f547477fa1722d8c Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 24 May 2017 16:43:49 +0200 Subject: [PATCH 1023/1164] Introduce `multicursorModifier` editor options --- .../common/config/commonEditorConfig.ts | 6 ++++ src/vs/editor/common/config/editorOptions.ts | 34 +++++++++++++++++++ src/vs/monaco.d.ts | 7 ++++ 3 files changed, 47 insertions(+) diff --git a/src/vs/editor/common/config/commonEditorConfig.ts b/src/vs/editor/common/config/commonEditorConfig.ts index 6fca4c237d0..bf24f6608be 100644 --- a/src/vs/editor/common/config/commonEditorConfig.ts +++ b/src/vs/editor/common/config/commonEditorConfig.ts @@ -321,6 +321,12 @@ const editorConfiguration: IConfigurationNode = { 'default': EDITOR_DEFAULTS.viewInfo.scrollbar.mouseWheelScrollSensitivity, 'description': nls.localize('mouseWheelScrollSensitivity', "A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events") }, + 'editor.multicursorModifier': { + 'type': 'string', + 'enum': (platform.isMacintosh ? ['cmd', 'alt'] : ['ctrl', 'alt']), + 'default': 'alt', + 'description': nls.localize('multicursorModifier', "The modifier to be used to add multiple cursors with the mouse.") + }, 'editor.quickSuggestions': { 'anyOf': [ { diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 59056ff8227..720302d227e 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -331,6 +331,11 @@ export interface IEditorOptions { * Defaults to 1. */ mouseWheelScrollSensitivity?: number; + /** + * The modifier to be used to add multiple cursors with the mouse. + * Defaults to 'alt' + */ + multicursorModifier?: 'cmd' | 'ctrl' | 'alt'; /** * Enable quick suggestions (shadow suggestions) * Defaults to true. @@ -783,6 +788,7 @@ export interface IValidatedEditorOptions { readonly dragAndDrop: boolean; readonly emptySelectionClipboard: boolean; readonly useTabStops: boolean; + readonly multicursorModifier: 'altKey' | 'ctrlKey' | 'metaKey'; readonly viewInfo: InternalEditorViewOptions; readonly contribInfo: EditorContribOptions; @@ -803,6 +809,7 @@ export class InternalEditorOptions { * @internal */ readonly accessibilitySupport: platform.AccessibilitySupport; + readonly multicursorModifier: 'altKey' | 'ctrlKey' | 'metaKey'; // ---- cursor options readonly wordSeparators: string; @@ -829,6 +836,7 @@ export class InternalEditorOptions { lineHeight: number; readOnly: boolean; accessibilitySupport: platform.AccessibilitySupport; + multicursorModifier: 'altKey' | 'ctrlKey' | 'metaKey'; wordSeparators: string; autoClosingBrackets: boolean; useTabStops: boolean; @@ -847,6 +855,7 @@ export class InternalEditorOptions { this.lineHeight = source.lineHeight | 0; this.readOnly = source.readOnly; this.accessibilitySupport = source.accessibilitySupport; + this.multicursorModifier = source.multicursorModifier; this.wordSeparators = source.wordSeparators; this.autoClosingBrackets = source.autoClosingBrackets; this.useTabStops = source.useTabStops; @@ -871,6 +880,7 @@ export class InternalEditorOptions { && this.lineHeight === other.lineHeight && this.readOnly === other.readOnly && this.accessibilitySupport === other.accessibilitySupport + && this.multicursorModifier === other.multicursorModifier && this.wordSeparators === other.wordSeparators && this.autoClosingBrackets === other.autoClosingBrackets && this.useTabStops === other.useTabStops @@ -896,6 +906,7 @@ export class InternalEditorOptions { lineHeight: (this.lineHeight !== newOpts.lineHeight), readOnly: (this.readOnly !== newOpts.readOnly), accessibilitySupport: (this.accessibilitySupport !== newOpts.accessibilitySupport), + multicursorModifier: (this.multicursorModifier !== newOpts.multicursorModifier), wordSeparators: (this.wordSeparators !== newOpts.wordSeparators), autoClosingBrackets: (this.autoClosingBrackets !== newOpts.autoClosingBrackets), useTabStops: (this.useTabStops !== newOpts.useTabStops), @@ -1233,6 +1244,7 @@ export interface IConfigurationChangedEvent { readonly lineHeight: boolean; readonly readOnly: boolean; readonly accessibilitySupport: boolean; + readonly multicursorModifier: boolean; readonly wordSeparators: boolean; readonly autoClosingBrackets: boolean; readonly useTabStops: boolean; @@ -1386,6 +1398,24 @@ export class EditorOptionsValidator { const viewInfo = this._sanitizeViewInfo(opts, defaults.viewInfo); const contribInfo = this._sanitizeContribInfo(opts, defaults.contribInfo); + let configuredMulticursorModifier: 'altKey' | 'metaKey' | 'ctrlKey'; + if (typeof opts.multicursorModifier === 'string') { + if (platform.isMacintosh) { + if (opts.multicursorModifier === 'cmd') { + configuredMulticursorModifier = 'metaKey'; + } else { + configuredMulticursorModifier = 'altKey'; + } + } else { + if (opts.multicursorModifier === 'ctrl') { + configuredMulticursorModifier = 'ctrlKey'; + } else { + configuredMulticursorModifier = 'altKey'; + } + } + } + const multicursorModifier = _stringSet<'altKey' | 'metaKey' | 'ctrlKey'>(configuredMulticursorModifier, defaults.multicursorModifier, ['altKey', 'metaKey', 'ctrlKey']); + return { inDiffEditor: _boolean(opts.inDiffEditor, defaults.inDiffEditor), wordSeparators: _string(opts.wordSeparators, defaults.wordSeparators), @@ -1406,6 +1436,7 @@ export class EditorOptionsValidator { dragAndDrop: _boolean(opts.dragAndDrop, defaults.dragAndDrop), emptySelectionClipboard: _boolean(opts.emptySelectionClipboard, defaults.emptySelectionClipboard), useTabStops: _boolean(opts.useTabStops, defaults.useTabStops), + multicursorModifier: multicursorModifier, viewInfo: viewInfo, contribInfo: contribInfo, }; @@ -1629,6 +1660,7 @@ export class InternalEditorOptionsFactory { dragAndDrop: opts.dragAndDrop, emptySelectionClipboard: opts.emptySelectionClipboard, useTabStops: opts.useTabStops, + multicursorModifier: opts.multicursorModifier, viewInfo: { extraEditorClassName: opts.viewInfo.extraEditorClassName, @@ -1805,6 +1837,7 @@ export class InternalEditorOptionsFactory { lineHeight: env.fontInfo.lineHeight, readOnly: opts.readOnly, accessibilitySupport: env.accessibilitySupport, + multicursorModifier: opts.multicursorModifier, wordSeparators: opts.wordSeparators, autoClosingBrackets: opts.autoClosingBrackets, useTabStops: opts.useTabStops, @@ -2023,6 +2056,7 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { dragAndDrop: false, emptySelectionClipboard: true, useTabStops: true, + multicursorModifier: 'altKey', viewInfo: { extraEditorClassName: '', diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 707cb1047fa..7f3c80b83fa 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -2876,6 +2876,11 @@ declare module monaco.editor { * Defaults to 1. */ mouseWheelScrollSensitivity?: number; + /** + * The modifier to be used to add multiple cursors with the mouse. + * Defaults to 'alt' + */ + multicursorModifier?: 'cmd' | 'ctrl' | 'alt'; /** * Enable quick suggestions (shadow suggestions) * Defaults to true. @@ -3257,6 +3262,7 @@ declare module monaco.editor { readonly editorClassName: string; readonly lineHeight: number; readonly readOnly: boolean; + readonly multicursorModifier: 'altKey' | 'ctrlKey' | 'metaKey'; readonly wordSeparators: string; readonly autoClosingBrackets: boolean; readonly useTabStops: boolean; @@ -3388,6 +3394,7 @@ declare module monaco.editor { readonly lineHeight: boolean; readonly readOnly: boolean; readonly accessibilitySupport: boolean; + readonly multicursorModifier: boolean; readonly wordSeparators: boolean; readonly autoClosingBrackets: boolean; readonly useTabStops: boolean; From 434d941e639acab3e0c6f867cb144d69dc2dd980 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 24 May 2017 17:35:55 +0200 Subject: [PATCH 1024/1164] Encapsulate trigger modifier logic in goToDeclarationMouse --- .../browser/goToDeclarationMouse.ts | 81 +++++++++++++------ 1 file changed, 58 insertions(+), 23 deletions(-) diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts index 05aecd1ec0f..15ccefb5d73 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts @@ -30,6 +30,40 @@ import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegist import { EditorState, CodeEditorStateFlag } from 'vs/editor/common/core/editorState'; import { DefinitionAction, DefinitionActionConfig } from './goToDeclarationCommands'; +/** + * An event that encapsulates the various trigger modifiers logic needed for go to definition. + */ +class MyMouseEvent { + + public readonly target: IMouseTarget; + public readonly hasTriggerModifier: boolean; + public readonly hasSideBySideModifier: boolean; + public readonly isSingleMouseDown: boolean; + + constructor(source: IEditorMouseEvent) { + this.target = source.target; + this.hasTriggerModifier = !!source.event[GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER]; + this.hasSideBySideModifier = source.event.altKey; + this.isSingleMouseDown = (browser.isIE || source.event.detail <= 1); // IE does not support event.detail properly + } +} + +/** + * An event that encapsulates the various trigger modifiers logic needed for go to definition. + */ +class MyKeyboardEvent { + + public readonly keyCodeIsTriggerKey: boolean; + public readonly keyCodeIsSideBySideKey: boolean; + public readonly hasTriggerModifier: boolean; + + constructor(source: IKeyboardEvent) { + this.keyCodeIsTriggerKey = (source.keyCode === GotoDefinitionWithMouseEditorContribution.TRIGGER_KEY_VALUE); + this.keyCodeIsSideBySideKey = (source.keyCode === GotoDefinitionWithMouseEditorContribution.TRIGGER_SIDEBYSIDE_KEY_VALUE); + this.hasTriggerModifier = !!source[GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER]; + } +} + @editorContribution class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorContribution { @@ -44,7 +78,7 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC private decorations: string[]; private currentWordUnderMouse: editorCommon.IWordAtPosition; private throttler: Throttler; - private lastMouseMoveEvent: IEditorMouseEvent; + private lastMouseMoveEvent: MyMouseEvent; private hasTriggerKeyOnMouseDown: boolean; constructor( @@ -57,12 +91,12 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC this.editor = editor; this.throttler = new Throttler(); - this.toUnhook.push(this.editor.onMouseDown((e: IEditorMouseEvent) => this.onEditorMouseDown(e))); - this.toUnhook.push(this.editor.onMouseUp((e: IEditorMouseEvent) => this.onEditorMouseUp(e))); - this.toUnhook.push(this.editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(e))); + this.toUnhook.push(this.editor.onMouseDown((e: IEditorMouseEvent) => this.onEditorMouseDown(new MyMouseEvent(e)))); + this.toUnhook.push(this.editor.onMouseUp((e: IEditorMouseEvent) => this.onEditorMouseUp(new MyMouseEvent(e)))); + this.toUnhook.push(this.editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(new MyMouseEvent(e)))); this.toUnhook.push(this.editor.onMouseDrag(() => this.resetHandler())); - this.toUnhook.push(this.editor.onKeyDown((e: IKeyboardEvent) => this.onEditorKeyDown(e))); - this.toUnhook.push(this.editor.onKeyUp((e: IKeyboardEvent) => this.onEditorKeyUp(e))); + this.toUnhook.push(this.editor.onKeyDown((e: IKeyboardEvent) => this.onEditorKeyDown(new MyKeyboardEvent(e)))); + this.toUnhook.push(this.editor.onKeyUp((e: IKeyboardEvent) => this.onEditorKeyUp(new MyKeyboardEvent(e)))); this.toUnhook.push(this.editor.onDidChangeCursorSelection((e) => this.onDidChangeCursorSelection(e))); this.toUnhook.push(this.editor.onDidChangeModel((e) => this.resetHandler())); @@ -80,13 +114,13 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } - private onEditorMouseMove(mouseEvent: IEditorMouseEvent, withKey?: IKeyboardEvent): void { + private onEditorMouseMove(mouseEvent: MyMouseEvent): void { this.lastMouseMoveEvent = mouseEvent; - this.startFindDefinition(mouseEvent, withKey); + this.startFindDefinition(mouseEvent); } - private startFindDefinition(mouseEvent: IEditorMouseEvent, withKey?: IKeyboardEvent): void { + private startFindDefinition(mouseEvent: MyMouseEvent, withKey?: MyKeyboardEvent): void { if (!this.isEnabled(mouseEvent, withKey)) { this.currentWordUnderMouse = null; this.removeDecorations(); @@ -196,15 +230,16 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } - private onEditorKeyDown(e: IKeyboardEvent): void { + private onEditorKeyDown(e: MyKeyboardEvent): void { if ( - this.lastMouseMoveEvent && ( - e.keyCode === GotoDefinitionWithMouseEditorContribution.TRIGGER_KEY_VALUE || // User just pressed Ctrl/Cmd (normal goto definition) - e.keyCode === GotoDefinitionWithMouseEditorContribution.TRIGGER_SIDEBYSIDE_KEY_VALUE && e[GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER] // User pressed Ctrl/Cmd+Alt (goto definition to the side) + this.lastMouseMoveEvent + && ( + e.keyCodeIsTriggerKey // User just pressed Ctrl/Cmd (normal goto definition) + || (e.keyCodeIsSideBySideKey && e.hasTriggerModifier) // User pressed Ctrl/Cmd+Alt (goto definition to the side) ) ) { this.startFindDefinition(this.lastMouseMoveEvent, e); - } else if (e[GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER]) { + } else if (e.hasTriggerModifier) { this.removeDecorations(); // remove decorations if user holds another key with ctrl/cmd to prevent accident goto declaration } } @@ -215,17 +250,17 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC this.removeDecorations(); } - private onEditorMouseDown(mouseEvent: IEditorMouseEvent): void { + private onEditorMouseDown(mouseEvent: MyMouseEvent): void { // We need to record if we had the trigger key on mouse down because someone might select something in the editor // holding the mouse down and then while mouse is down start to press Ctrl/Cmd to start a copy operation and then // release the mouse button without wanting to do the navigation. // With this flag we prevent goto definition if the mouse was down before the trigger key was pressed. - this.hasTriggerKeyOnMouseDown = !!mouseEvent.event[GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER]; + this.hasTriggerKeyOnMouseDown = mouseEvent.hasTriggerModifier; } - private onEditorMouseUp(mouseEvent: IEditorMouseEvent): void { + private onEditorMouseUp(mouseEvent: MyMouseEvent): void { if (this.isEnabled(mouseEvent) && this.hasTriggerKeyOnMouseDown) { - this.gotoDefinition(mouseEvent.target, mouseEvent.event.altKey).done(() => { + this.gotoDefinition(mouseEvent.target, mouseEvent.hasSideBySideModifier).done(() => { this.removeDecorations(); }, (error: Error) => { this.removeDecorations(); @@ -234,18 +269,18 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } - private onEditorKeyUp(e: IKeyboardEvent): void { - if (e.keyCode === GotoDefinitionWithMouseEditorContribution.TRIGGER_KEY_VALUE) { + private onEditorKeyUp(e: MyKeyboardEvent): void { + if (e.keyCodeIsTriggerKey) { this.removeDecorations(); this.currentWordUnderMouse = null; } } - private isEnabled(mouseEvent: IEditorMouseEvent, withKey?: IKeyboardEvent): boolean { + private isEnabled(mouseEvent: MyMouseEvent, withKey?: MyKeyboardEvent): boolean { return this.editor.getModel() && - (browser.isIE || mouseEvent.event.detail <= 1) && // IE does not support event.detail properly + mouseEvent.isSingleMouseDown && mouseEvent.target.type === MouseTargetType.CONTENT_TEXT && - (mouseEvent.event[GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER] || (withKey && withKey.keyCode === GotoDefinitionWithMouseEditorContribution.TRIGGER_KEY_VALUE)) && + (mouseEvent.hasTriggerModifier || (withKey && withKey.keyCodeIsTriggerKey)) && DefinitionProviderRegistry.has(this.editor.getModel()); } From 7bb5e4a68200b70e6ea7e259fff907b9d9fd9944 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 24 May 2017 17:40:31 +0200 Subject: [PATCH 1025/1164] Group method logically --- .../browser/goToDeclarationMouse.ts | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts index 15ccefb5d73..e4d9aa7b6f4 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts @@ -91,12 +91,12 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC this.editor = editor; this.throttler = new Throttler(); + this.toUnhook.push(this.editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(new MyMouseEvent(e)))); this.toUnhook.push(this.editor.onMouseDown((e: IEditorMouseEvent) => this.onEditorMouseDown(new MyMouseEvent(e)))); this.toUnhook.push(this.editor.onMouseUp((e: IEditorMouseEvent) => this.onEditorMouseUp(new MyMouseEvent(e)))); - this.toUnhook.push(this.editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(new MyMouseEvent(e)))); - this.toUnhook.push(this.editor.onMouseDrag(() => this.resetHandler())); this.toUnhook.push(this.editor.onKeyDown((e: IKeyboardEvent) => this.onEditorKeyDown(new MyKeyboardEvent(e)))); this.toUnhook.push(this.editor.onKeyUp((e: IKeyboardEvent) => this.onEditorKeyUp(new MyKeyboardEvent(e)))); + this.toUnhook.push(this.editor.onMouseDrag(() => this.resetHandler())); this.toUnhook.push(this.editor.onDidChangeCursorSelection((e) => this.onDidChangeCursorSelection(e))); this.toUnhook.push(this.editor.onDidChangeModel((e) => this.resetHandler())); @@ -114,12 +114,6 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } - private onEditorMouseMove(mouseEvent: MyMouseEvent): void { - this.lastMouseMoveEvent = mouseEvent; - - this.startFindDefinition(mouseEvent); - } - private startFindDefinition(mouseEvent: MyMouseEvent, withKey?: MyKeyboardEvent): void { if (!this.isEnabled(mouseEvent, withKey)) { this.currentWordUnderMouse = null; @@ -230,24 +224,10 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } - private onEditorKeyDown(e: MyKeyboardEvent): void { - if ( - this.lastMouseMoveEvent - && ( - e.keyCodeIsTriggerKey // User just pressed Ctrl/Cmd (normal goto definition) - || (e.keyCodeIsSideBySideKey && e.hasTriggerModifier) // User pressed Ctrl/Cmd+Alt (goto definition to the side) - ) - ) { - this.startFindDefinition(this.lastMouseMoveEvent, e); - } else if (e.hasTriggerModifier) { - this.removeDecorations(); // remove decorations if user holds another key with ctrl/cmd to prevent accident goto declaration - } - } + private onEditorMouseMove(mouseEvent: MyMouseEvent): void { + this.lastMouseMoveEvent = mouseEvent; - private resetHandler(): void { - this.lastMouseMoveEvent = null; - this.hasTriggerKeyOnMouseDown = false; - this.removeDecorations(); + this.startFindDefinition(mouseEvent); } private onEditorMouseDown(mouseEvent: MyMouseEvent): void { @@ -269,6 +249,20 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } + private onEditorKeyDown(e: MyKeyboardEvent): void { + if ( + this.lastMouseMoveEvent + && ( + e.keyCodeIsTriggerKey // User just pressed Ctrl/Cmd (normal goto definition) + || (e.keyCodeIsSideBySideKey && e.hasTriggerModifier) // User pressed Ctrl/Cmd+Alt (goto definition to the side) + ) + ) { + this.startFindDefinition(this.lastMouseMoveEvent, e); + } else if (e.hasTriggerModifier) { + this.removeDecorations(); // remove decorations if user holds another key with ctrl/cmd to prevent accident goto declaration + } + } + private onEditorKeyUp(e: MyKeyboardEvent): void { if (e.keyCodeIsTriggerKey) { this.removeDecorations(); @@ -276,6 +270,12 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } + private resetHandler(): void { + this.lastMouseMoveEvent = null; + this.hasTriggerKeyOnMouseDown = false; + this.removeDecorations(); + } + private isEnabled(mouseEvent: MyMouseEvent, withKey?: MyKeyboardEvent): boolean { return this.editor.getModel() && mouseEvent.isSingleMouseDown && From cc270a155da6278f971881d584ee173cef824d4c Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 24 May 2017 19:36:56 +0200 Subject: [PATCH 1026/1164] Encapsulate opening a link gesture in LinkGesture --- .../browser/goToDeclarationMouse.ts | 192 +++++++++++------- 1 file changed, 117 insertions(+), 75 deletions(-) diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts index e4d9aa7b6f4..9bc13d23c2b 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts @@ -22,13 +22,14 @@ import { Location, DefinitionProviderRegistry } from 'vs/editor/common/modes'; import { ICodeEditor, IEditorMouseEvent, IMouseTarget, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; import { getDefinitionsAtPosition } from './goToDeclaration'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; import { ITextModelResolverService } from 'vs/editor/common/services/resolverService'; import { ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { EditorState, CodeEditorStateFlag } from 'vs/editor/common/core/editorState'; import { DefinitionAction, DefinitionActionConfig } from './goToDeclarationCommands'; +import Event, { Emitter } from 'vs/base/common/event'; /** * An event that encapsulates the various trigger modifiers logic needed for go to definition. @@ -38,13 +39,13 @@ class MyMouseEvent { public readonly target: IMouseTarget; public readonly hasTriggerModifier: boolean; public readonly hasSideBySideModifier: boolean; - public readonly isSingleMouseDown: boolean; + public readonly isNoneOrSingleMouseDown: boolean; constructor(source: IEditorMouseEvent) { this.target = source.target; this.hasTriggerModifier = !!source.event[GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER]; this.hasSideBySideModifier = source.event.altKey; - this.isSingleMouseDown = (browser.isIE || source.event.detail <= 1); // IE does not support event.detail properly + this.isNoneOrSingleMouseDown = (browser.isIE || source.event.detail <= 1); // IE does not support event.detail properly } } @@ -64,6 +65,99 @@ class MyKeyboardEvent { } } +class LinkGesture extends Disposable { + + private readonly editor: ICodeEditor; + + private lastMouseMoveEvent: MyMouseEvent; + private hasTriggerKeyOnMouseDown: boolean; + + private readonly _onMouseMoveOrRelevantKeyDown: Emitter<[MyMouseEvent, MyKeyboardEvent]> = this._register(new Emitter<[MyMouseEvent, MyKeyboardEvent]>()); + public readonly onMouseMoveOrRelevantKeyDown: Event<[MyMouseEvent, MyKeyboardEvent]> = this._onMouseMoveOrRelevantKeyDown.event; + + private readonly _onExecute: Emitter = this._register(new Emitter()); + public readonly onExecute: Event = this._onExecute.event; + + private readonly _onCancel: Emitter = this._register(new Emitter()); + public readonly onCancel: Event = this._onCancel.event; + + constructor(editor: ICodeEditor) { + super(); + + this.editor = editor; + this.lastMouseMoveEvent = null; + this.hasTriggerKeyOnMouseDown = false; + + this._register(this.editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(new MyMouseEvent(e)))); + this._register(this.editor.onMouseDown((e: IEditorMouseEvent) => this.onEditorMouseDown(new MyMouseEvent(e)))); + this._register(this.editor.onMouseUp((e: IEditorMouseEvent) => this.onEditorMouseUp(new MyMouseEvent(e)))); + this._register(this.editor.onKeyDown((e: IKeyboardEvent) => this.onEditorKeyDown(new MyKeyboardEvent(e)))); + this._register(this.editor.onKeyUp((e: IKeyboardEvent) => this.onEditorKeyUp(new MyKeyboardEvent(e)))); + this._register(this.editor.onMouseDrag(() => this.resetHandler())); + + this._register(this.editor.onDidChangeCursorSelection((e) => this.onDidChangeCursorSelection(e))); + this._register(this.editor.onDidChangeModel((e) => this.resetHandler())); + this._register(this.editor.onDidChangeModelContent(() => this.resetHandler())); + this._register(this.editor.onDidScrollChange((e) => { + if (e.scrollTopChanged || e.scrollLeftChanged) { + this.resetHandler(); + } + })); + } + + private onDidChangeCursorSelection(e: ICursorSelectionChangedEvent): void { + if (e.selection && e.selection.startColumn !== e.selection.endColumn) { + this.resetHandler(); // immediately stop this feature if the user starts to select (https://github.com/Microsoft/vscode/issues/7827) + } + } + + private onEditorMouseMove(mouseEvent: MyMouseEvent): void { + this.lastMouseMoveEvent = mouseEvent; + + this._onMouseMoveOrRelevantKeyDown.fire([mouseEvent, null]); + } + + private onEditorMouseDown(mouseEvent: MyMouseEvent): void { + // We need to record if we had the trigger key on mouse down because someone might select something in the editor + // holding the mouse down and then while mouse is down start to press Ctrl/Cmd to start a copy operation and then + // release the mouse button without wanting to do the navigation. + // With this flag we prevent goto definition if the mouse was down before the trigger key was pressed. + this.hasTriggerKeyOnMouseDown = mouseEvent.hasTriggerModifier; + } + + private onEditorMouseUp(mouseEvent: MyMouseEvent): void { + if (this.hasTriggerKeyOnMouseDown) { + this._onExecute.fire(mouseEvent); + } + } + + private onEditorKeyDown(e: MyKeyboardEvent): void { + if ( + this.lastMouseMoveEvent + && ( + e.keyCodeIsTriggerKey // User just pressed Ctrl/Cmd (normal goto definition) + || (e.keyCodeIsSideBySideKey && e.hasTriggerModifier) // User pressed Ctrl/Cmd+Alt (goto definition to the side) + ) + ) { + this._onMouseMoveOrRelevantKeyDown.fire([this.lastMouseMoveEvent, e]); + } else if (e.hasTriggerModifier) { + this._onCancel.fire(); // remove decorations if user holds another key with ctrl/cmd to prevent accident goto declaration + } + } + + private onEditorKeyUp(e: MyKeyboardEvent): void { + if (e.keyCodeIsTriggerKey) { + this._onCancel.fire(); + } + } + + private resetHandler(): void { + this.lastMouseMoveEvent = null; + this.hasTriggerKeyOnMouseDown = false; + this._onCancel.fire(); + } +} + @editorContribution class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorContribution { @@ -78,8 +172,6 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC private decorations: string[]; private currentWordUnderMouse: editorCommon.IWordAtPosition; private throttler: Throttler; - private lastMouseMoveEvent: MyMouseEvent; - private hasTriggerKeyOnMouseDown: boolean; constructor( editor: ICodeEditor, @@ -91,27 +183,29 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC this.editor = editor; this.throttler = new Throttler(); - this.toUnhook.push(this.editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(new MyMouseEvent(e)))); - this.toUnhook.push(this.editor.onMouseDown((e: IEditorMouseEvent) => this.onEditorMouseDown(new MyMouseEvent(e)))); - this.toUnhook.push(this.editor.onMouseUp((e: IEditorMouseEvent) => this.onEditorMouseUp(new MyMouseEvent(e)))); - this.toUnhook.push(this.editor.onKeyDown((e: IKeyboardEvent) => this.onEditorKeyDown(new MyKeyboardEvent(e)))); - this.toUnhook.push(this.editor.onKeyUp((e: IKeyboardEvent) => this.onEditorKeyUp(new MyKeyboardEvent(e)))); - this.toUnhook.push(this.editor.onMouseDrag(() => this.resetHandler())); + let linkGesture = new LinkGesture(editor); + this.toUnhook.push(linkGesture); - this.toUnhook.push(this.editor.onDidChangeCursorSelection((e) => this.onDidChangeCursorSelection(e))); - this.toUnhook.push(this.editor.onDidChangeModel((e) => this.resetHandler())); - this.toUnhook.push(this.editor.onDidChangeModelContent(() => this.resetHandler())); - this.toUnhook.push(this.editor.onDidScrollChange((e) => { - if (e.scrollTopChanged || e.scrollLeftChanged) { - this.resetHandler(); + this.toUnhook.push(linkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => { + this.startFindDefinition(mouseEvent, keyboardEvent); + })); + + this.toUnhook.push(linkGesture.onExecute((mouseEvent: MyMouseEvent) => { + if (this.isEnabled(mouseEvent)) { + this.gotoDefinition(mouseEvent.target, mouseEvent.hasSideBySideModifier).done(() => { + this.removeDecorations(); + }, (error: Error) => { + this.removeDecorations(); + onUnexpectedError(error); + }); } })); - } - private onDidChangeCursorSelection(e: ICursorSelectionChangedEvent): void { - if (e.selection && e.selection.startColumn !== e.selection.endColumn) { - this.resetHandler(); // immediately stop this feature if the user starts to select (https://github.com/Microsoft/vscode/issues/7827) - } + this.toUnhook.push(linkGesture.onCancel(() => { + this.removeDecorations(); + this.currentWordUnderMouse = null; + })); + } private startFindDefinition(mouseEvent: MyMouseEvent, withKey?: MyKeyboardEvent): void { @@ -224,61 +318,9 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } - private onEditorMouseMove(mouseEvent: MyMouseEvent): void { - this.lastMouseMoveEvent = mouseEvent; - - this.startFindDefinition(mouseEvent); - } - - private onEditorMouseDown(mouseEvent: MyMouseEvent): void { - // We need to record if we had the trigger key on mouse down because someone might select something in the editor - // holding the mouse down and then while mouse is down start to press Ctrl/Cmd to start a copy operation and then - // release the mouse button without wanting to do the navigation. - // With this flag we prevent goto definition if the mouse was down before the trigger key was pressed. - this.hasTriggerKeyOnMouseDown = mouseEvent.hasTriggerModifier; - } - - private onEditorMouseUp(mouseEvent: MyMouseEvent): void { - if (this.isEnabled(mouseEvent) && this.hasTriggerKeyOnMouseDown) { - this.gotoDefinition(mouseEvent.target, mouseEvent.hasSideBySideModifier).done(() => { - this.removeDecorations(); - }, (error: Error) => { - this.removeDecorations(); - onUnexpectedError(error); - }); - } - } - - private onEditorKeyDown(e: MyKeyboardEvent): void { - if ( - this.lastMouseMoveEvent - && ( - e.keyCodeIsTriggerKey // User just pressed Ctrl/Cmd (normal goto definition) - || (e.keyCodeIsSideBySideKey && e.hasTriggerModifier) // User pressed Ctrl/Cmd+Alt (goto definition to the side) - ) - ) { - this.startFindDefinition(this.lastMouseMoveEvent, e); - } else if (e.hasTriggerModifier) { - this.removeDecorations(); // remove decorations if user holds another key with ctrl/cmd to prevent accident goto declaration - } - } - - private onEditorKeyUp(e: MyKeyboardEvent): void { - if (e.keyCodeIsTriggerKey) { - this.removeDecorations(); - this.currentWordUnderMouse = null; - } - } - - private resetHandler(): void { - this.lastMouseMoveEvent = null; - this.hasTriggerKeyOnMouseDown = false; - this.removeDecorations(); - } - private isEnabled(mouseEvent: MyMouseEvent, withKey?: MyKeyboardEvent): boolean { return this.editor.getModel() && - mouseEvent.isSingleMouseDown && + mouseEvent.isNoneOrSingleMouseDown && mouseEvent.target.type === MouseTargetType.CONTENT_TEXT && (mouseEvent.hasTriggerModifier || (withKey && withKey.keyCodeIsTriggerKey)) && DefinitionProviderRegistry.has(this.editor.getModel()); From 647f1d5fc9be786719e723abf4f34c82bcaf4087 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 24 May 2017 20:34:46 +0200 Subject: [PATCH 1027/1164] Extract clicking link logic to its own file --- .../browser/clickLinkGesture.ts | 158 ++++++++++++++++++ .../browser/goToDeclarationMouse.ts | 150 ++--------------- 2 files changed, 170 insertions(+), 138 deletions(-) create mode 100644 src/vs/editor/contrib/goToDeclaration/browser/clickLinkGesture.ts diff --git a/src/vs/editor/contrib/goToDeclaration/browser/clickLinkGesture.ts b/src/vs/editor/contrib/goToDeclaration/browser/clickLinkGesture.ts new file mode 100644 index 00000000000..bec68dcf19a --- /dev/null +++ b/src/vs/editor/contrib/goToDeclaration/browser/clickLinkGesture.ts @@ -0,0 +1,158 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import 'vs/css!./goToDeclarationMouse'; +import { KeyCode } from 'vs/base/common/keyCodes'; +import * as browser from 'vs/base/browser/browser'; +import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { ICodeEditor, IEditorMouseEvent, IMouseTarget } from 'vs/editor/browser/editorBrowser'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; +import Event, { Emitter } from 'vs/base/common/event'; + +/** + * An event that encapsulates the various trigger modifiers logic needed for go to definition. + */ +export class ClickLinkMouseEvent { + + public readonly target: IMouseTarget; + public readonly hasTriggerModifier: boolean; + public readonly hasSideBySideModifier: boolean; + public readonly isNoneOrSingleMouseDown: boolean; + + constructor(source: IEditorMouseEvent, opts: ClickLinkOptions) { + this.target = source.target; + this.hasTriggerModifier = !!source.event[opts.triggerModifier]; + this.hasSideBySideModifier = source.event.altKey; + this.isNoneOrSingleMouseDown = (browser.isIE || source.event.detail <= 1); // IE does not support event.detail properly + } +} + +/** + * An event that encapsulates the various trigger modifiers logic needed for go to definition. + */ +export class ClickLinkKeyboardEvent { + + public readonly keyCodeIsTriggerKey: boolean; + public readonly keyCodeIsSideBySideKey: boolean; + public readonly hasTriggerModifier: boolean; + + constructor(source: IKeyboardEvent, opts: ClickLinkOptions) { + this.keyCodeIsTriggerKey = (source.keyCode === opts.triggerKey); + this.keyCodeIsSideBySideKey = (source.keyCode === opts.triggerSideBySideKey); + this.hasTriggerModifier = !!source[opts.triggerModifier]; + } +} + +export class ClickLinkOptions { + + public readonly triggerKey: KeyCode; + public readonly triggerModifier: 'ctrlKey' | 'shiftKey' | 'altKey' | 'metaKey'; + public readonly triggerSideBySideKey: KeyCode; + + constructor(triggerKey: KeyCode, triggerModifier: 'ctrlKey' | 'shiftKey' | 'altKey' | 'metaKey', triggerSideBySideKey: KeyCode) { + this.triggerKey = triggerKey; + this.triggerModifier = triggerModifier; + this.triggerSideBySideKey = triggerSideBySideKey; + } +} + +export class ClickLinkGesture extends Disposable { + + private readonly _onMouseMoveOrRelevantKeyDown: Emitter<[ClickLinkMouseEvent, ClickLinkKeyboardEvent]> = this._register(new Emitter<[ClickLinkMouseEvent, ClickLinkKeyboardEvent]>()); + public readonly onMouseMoveOrRelevantKeyDown: Event<[ClickLinkMouseEvent, ClickLinkKeyboardEvent]> = this._onMouseMoveOrRelevantKeyDown.event; + + private readonly _onExecute: Emitter = this._register(new Emitter()); + public readonly onExecute: Event = this._onExecute.event; + + private readonly _onCancel: Emitter = this._register(new Emitter()); + public readonly onCancel: Event = this._onCancel.event; + + private readonly _editor: ICodeEditor; + private readonly _opts: ClickLinkOptions; + + private lastMouseMoveEvent: ClickLinkMouseEvent; + private hasTriggerKeyOnMouseDown: boolean; + + constructor(editor: ICodeEditor, opts: ClickLinkOptions) { + super(); + + this._editor = editor; + this._opts = opts; + + this.lastMouseMoveEvent = null; + this.hasTriggerKeyOnMouseDown = false; + + this._register(this._editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(new ClickLinkMouseEvent(e, this._opts)))); + this._register(this._editor.onMouseDown((e: IEditorMouseEvent) => this.onEditorMouseDown(new ClickLinkMouseEvent(e, this._opts)))); + this._register(this._editor.onMouseUp((e: IEditorMouseEvent) => this.onEditorMouseUp(new ClickLinkMouseEvent(e, this._opts)))); + this._register(this._editor.onKeyDown((e: IKeyboardEvent) => this.onEditorKeyDown(new ClickLinkKeyboardEvent(e, this._opts)))); + this._register(this._editor.onKeyUp((e: IKeyboardEvent) => this.onEditorKeyUp(new ClickLinkKeyboardEvent(e, this._opts)))); + this._register(this._editor.onMouseDrag(() => this.resetHandler())); + + this._register(this._editor.onDidChangeCursorSelection((e) => this.onDidChangeCursorSelection(e))); + this._register(this._editor.onDidChangeModel((e) => this.resetHandler())); + this._register(this._editor.onDidChangeModelContent(() => this.resetHandler())); + this._register(this._editor.onDidScrollChange((e) => { + if (e.scrollTopChanged || e.scrollLeftChanged) { + this.resetHandler(); + } + })); + } + + private onDidChangeCursorSelection(e: ICursorSelectionChangedEvent): void { + if (e.selection && e.selection.startColumn !== e.selection.endColumn) { + this.resetHandler(); // immediately stop this feature if the user starts to select (https://github.com/Microsoft/vscode/issues/7827) + } + } + + private onEditorMouseMove(mouseEvent: ClickLinkMouseEvent): void { + this.lastMouseMoveEvent = mouseEvent; + + this._onMouseMoveOrRelevantKeyDown.fire([mouseEvent, null]); + } + + private onEditorMouseDown(mouseEvent: ClickLinkMouseEvent): void { + // We need to record if we had the trigger key on mouse down because someone might select something in the editor + // holding the mouse down and then while mouse is down start to press Ctrl/Cmd to start a copy operation and then + // release the mouse button without wanting to do the navigation. + // With this flag we prevent goto definition if the mouse was down before the trigger key was pressed. + this.hasTriggerKeyOnMouseDown = mouseEvent.hasTriggerModifier; + } + + private onEditorMouseUp(mouseEvent: ClickLinkMouseEvent): void { + if (this.hasTriggerKeyOnMouseDown) { + this._onExecute.fire(mouseEvent); + } + } + + private onEditorKeyDown(e: ClickLinkKeyboardEvent): void { + if ( + this.lastMouseMoveEvent + && ( + e.keyCodeIsTriggerKey // User just pressed Ctrl/Cmd (normal goto definition) + || (e.keyCodeIsSideBySideKey && e.hasTriggerModifier) // User pressed Ctrl/Cmd+Alt (goto definition to the side) + ) + ) { + this._onMouseMoveOrRelevantKeyDown.fire([this.lastMouseMoveEvent, e]); + } else if (e.hasTriggerModifier) { + this._onCancel.fire(); // remove decorations if user holds another key with ctrl/cmd to prevent accident goto declaration + } + } + + private onEditorKeyUp(e: ClickLinkKeyboardEvent): void { + if (e.keyCodeIsTriggerKey) { + this._onCancel.fire(); + } + } + + private resetHandler(): void { + this.lastMouseMoveEvent = null; + this.hasTriggerKeyOnMouseDown = false; + this._onCancel.fire(); + } +} diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts index 9bc13d23c2b..e063801f2d9 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts @@ -13,156 +13,26 @@ import { MarkedString } from 'vs/base/common/htmlContent'; import { KeyCode } from 'vs/base/common/keyCodes'; import * as platform from 'vs/base/common/platform'; import { TPromise } from 'vs/base/common/winjs.base'; -import * as browser from 'vs/base/browser/browser'; -import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { IModeService } from 'vs/editor/common/services/modeService'; import { Range } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { Location, DefinitionProviderRegistry } from 'vs/editor/common/modes'; -import { ICodeEditor, IEditorMouseEvent, IMouseTarget, MouseTargetType } from 'vs/editor/browser/editorBrowser'; +import { ICodeEditor, IMouseTarget, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; import { getDefinitionsAtPosition } from './goToDeclaration'; -import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ITextModelResolverService } from 'vs/editor/common/services/resolverService'; -import { ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { EditorState, CodeEditorStateFlag } from 'vs/editor/common/core/editorState'; import { DefinitionAction, DefinitionActionConfig } from './goToDeclarationCommands'; -import Event, { Emitter } from 'vs/base/common/event'; - -/** - * An event that encapsulates the various trigger modifiers logic needed for go to definition. - */ -class MyMouseEvent { - - public readonly target: IMouseTarget; - public readonly hasTriggerModifier: boolean; - public readonly hasSideBySideModifier: boolean; - public readonly isNoneOrSingleMouseDown: boolean; - - constructor(source: IEditorMouseEvent) { - this.target = source.target; - this.hasTriggerModifier = !!source.event[GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER]; - this.hasSideBySideModifier = source.event.altKey; - this.isNoneOrSingleMouseDown = (browser.isIE || source.event.detail <= 1); // IE does not support event.detail properly - } -} - -/** - * An event that encapsulates the various trigger modifiers logic needed for go to definition. - */ -class MyKeyboardEvent { - - public readonly keyCodeIsTriggerKey: boolean; - public readonly keyCodeIsSideBySideKey: boolean; - public readonly hasTriggerModifier: boolean; - - constructor(source: IKeyboardEvent) { - this.keyCodeIsTriggerKey = (source.keyCode === GotoDefinitionWithMouseEditorContribution.TRIGGER_KEY_VALUE); - this.keyCodeIsSideBySideKey = (source.keyCode === GotoDefinitionWithMouseEditorContribution.TRIGGER_SIDEBYSIDE_KEY_VALUE); - this.hasTriggerModifier = !!source[GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER]; - } -} - -class LinkGesture extends Disposable { - - private readonly editor: ICodeEditor; - - private lastMouseMoveEvent: MyMouseEvent; - private hasTriggerKeyOnMouseDown: boolean; - - private readonly _onMouseMoveOrRelevantKeyDown: Emitter<[MyMouseEvent, MyKeyboardEvent]> = this._register(new Emitter<[MyMouseEvent, MyKeyboardEvent]>()); - public readonly onMouseMoveOrRelevantKeyDown: Event<[MyMouseEvent, MyKeyboardEvent]> = this._onMouseMoveOrRelevantKeyDown.event; - - private readonly _onExecute: Emitter = this._register(new Emitter()); - public readonly onExecute: Event = this._onExecute.event; - - private readonly _onCancel: Emitter = this._register(new Emitter()); - public readonly onCancel: Event = this._onCancel.event; - - constructor(editor: ICodeEditor) { - super(); - - this.editor = editor; - this.lastMouseMoveEvent = null; - this.hasTriggerKeyOnMouseDown = false; - - this._register(this.editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(new MyMouseEvent(e)))); - this._register(this.editor.onMouseDown((e: IEditorMouseEvent) => this.onEditorMouseDown(new MyMouseEvent(e)))); - this._register(this.editor.onMouseUp((e: IEditorMouseEvent) => this.onEditorMouseUp(new MyMouseEvent(e)))); - this._register(this.editor.onKeyDown((e: IKeyboardEvent) => this.onEditorKeyDown(new MyKeyboardEvent(e)))); - this._register(this.editor.onKeyUp((e: IKeyboardEvent) => this.onEditorKeyUp(new MyKeyboardEvent(e)))); - this._register(this.editor.onMouseDrag(() => this.resetHandler())); - - this._register(this.editor.onDidChangeCursorSelection((e) => this.onDidChangeCursorSelection(e))); - this._register(this.editor.onDidChangeModel((e) => this.resetHandler())); - this._register(this.editor.onDidChangeModelContent(() => this.resetHandler())); - this._register(this.editor.onDidScrollChange((e) => { - if (e.scrollTopChanged || e.scrollLeftChanged) { - this.resetHandler(); - } - })); - } - - private onDidChangeCursorSelection(e: ICursorSelectionChangedEvent): void { - if (e.selection && e.selection.startColumn !== e.selection.endColumn) { - this.resetHandler(); // immediately stop this feature if the user starts to select (https://github.com/Microsoft/vscode/issues/7827) - } - } - - private onEditorMouseMove(mouseEvent: MyMouseEvent): void { - this.lastMouseMoveEvent = mouseEvent; - - this._onMouseMoveOrRelevantKeyDown.fire([mouseEvent, null]); - } - - private onEditorMouseDown(mouseEvent: MyMouseEvent): void { - // We need to record if we had the trigger key on mouse down because someone might select something in the editor - // holding the mouse down and then while mouse is down start to press Ctrl/Cmd to start a copy operation and then - // release the mouse button without wanting to do the navigation. - // With this flag we prevent goto definition if the mouse was down before the trigger key was pressed. - this.hasTriggerKeyOnMouseDown = mouseEvent.hasTriggerModifier; - } - - private onEditorMouseUp(mouseEvent: MyMouseEvent): void { - if (this.hasTriggerKeyOnMouseDown) { - this._onExecute.fire(mouseEvent); - } - } - - private onEditorKeyDown(e: MyKeyboardEvent): void { - if ( - this.lastMouseMoveEvent - && ( - e.keyCodeIsTriggerKey // User just pressed Ctrl/Cmd (normal goto definition) - || (e.keyCodeIsSideBySideKey && e.hasTriggerModifier) // User pressed Ctrl/Cmd+Alt (goto definition to the side) - ) - ) { - this._onMouseMoveOrRelevantKeyDown.fire([this.lastMouseMoveEvent, e]); - } else if (e.hasTriggerModifier) { - this._onCancel.fire(); // remove decorations if user holds another key with ctrl/cmd to prevent accident goto declaration - } - } - - private onEditorKeyUp(e: MyKeyboardEvent): void { - if (e.keyCodeIsTriggerKey) { - this._onCancel.fire(); - } - } - - private resetHandler(): void { - this.lastMouseMoveEvent = null; - this.hasTriggerKeyOnMouseDown = false; - this._onCancel.fire(); - } -} +import { ClickLinkGesture, ClickLinkOptions, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from "vs/editor/contrib/goToDeclaration/browser/clickLinkGesture"; @editorContribution class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorContribution { private static ID = 'editor.contrib.gotodefinitionwithmouse'; - static TRIGGER_MODIFIER = platform.isMacintosh ? 'metaKey' : 'ctrlKey'; + static TRIGGER_MODIFIER: 'metaKey' | 'ctrlKey' = platform.isMacintosh ? 'metaKey' : 'ctrlKey'; static TRIGGER_SIDEBYSIDE_KEY_VALUE = KeyCode.Alt; static TRIGGER_KEY_VALUE = platform.isMacintosh ? KeyCode.Meta : KeyCode.Ctrl; static MAX_SOURCE_PREVIEW_LINES = 8; @@ -183,14 +53,18 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC this.editor = editor; this.throttler = new Throttler(); - let linkGesture = new LinkGesture(editor); + let linkGesture = new ClickLinkGesture(editor, new ClickLinkOptions( + GotoDefinitionWithMouseEditorContribution.TRIGGER_KEY_VALUE, + GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER, + GotoDefinitionWithMouseEditorContribution.TRIGGER_SIDEBYSIDE_KEY_VALUE + )); this.toUnhook.push(linkGesture); this.toUnhook.push(linkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => { this.startFindDefinition(mouseEvent, keyboardEvent); })); - this.toUnhook.push(linkGesture.onExecute((mouseEvent: MyMouseEvent) => { + this.toUnhook.push(linkGesture.onExecute((mouseEvent: ClickLinkMouseEvent) => { if (this.isEnabled(mouseEvent)) { this.gotoDefinition(mouseEvent.target, mouseEvent.hasSideBySideModifier).done(() => { this.removeDecorations(); @@ -208,7 +82,7 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } - private startFindDefinition(mouseEvent: MyMouseEvent, withKey?: MyKeyboardEvent): void { + private startFindDefinition(mouseEvent: ClickLinkMouseEvent, withKey?: ClickLinkKeyboardEvent): void { if (!this.isEnabled(mouseEvent, withKey)) { this.currentWordUnderMouse = null; this.removeDecorations(); @@ -318,7 +192,7 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } } - private isEnabled(mouseEvent: MyMouseEvent, withKey?: MyKeyboardEvent): boolean { + private isEnabled(mouseEvent: ClickLinkMouseEvent, withKey?: ClickLinkKeyboardEvent): boolean { return this.editor.getModel() && mouseEvent.isNoneOrSingleMouseDown && mouseEvent.target.type === MouseTargetType.CONTENT_TEXT && From bf4d419b797f2783578bc793f50a2c2caa508cfb Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Wed, 24 May 2017 22:32:38 +0200 Subject: [PATCH 1028/1164] Fixes #6910: Left mouse button up when selecting text with CTRL pressed causes to follow link --- src/vs/editor/contrib/links/browser/links.ts | 60 ++++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/vs/editor/contrib/links/browser/links.ts b/src/vs/editor/contrib/links/browser/links.ts index 44f1d2fb3bd..c14eaf2d911 100644 --- a/src/vs/editor/contrib/links/browser/links.ts +++ b/src/vs/editor/contrib/links/browser/links.ts @@ -12,14 +12,13 @@ import { KeyCode } from 'vs/base/common/keyCodes'; import * as platform from 'vs/base/common/platform'; import Severity from 'vs/base/common/severity'; import { TPromise } from 'vs/base/common/winjs.base'; -import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { IMessageService } from 'vs/platform/message/common/message'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { editorAction, ServicesAccessor, EditorAction } from 'vs/editor/common/editorCommonExtensions'; import { LinkProviderRegistry } from 'vs/editor/common/modes'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; -import { IEditorMouseEvent, ICodeEditor, MouseTargetType } from 'vs/editor/browser/editorBrowser'; +import { ICodeEditor, MouseTargetType } from 'vs/editor/browser/editorBrowser'; import { getLinks, Link } from 'vs/editor/contrib/links/common/links'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; @@ -27,6 +26,7 @@ import { registerThemingParticipant } from 'vs/platform/theme/common/themeServic import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { Position } from 'vs/editor/common/core/position'; import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ClickLinkGesture, ClickLinkOptions, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from "vs/editor/contrib/goToDeclaration/browser/clickLinkGesture"; const HOVER_MESSAGE_GENERAL = ( platform.isMacintosh @@ -67,7 +67,7 @@ class LinkOccurence { public decorationId: string; public link: Link; - constructor(link: Link, decorationId: string/*, changeAccessor:editorCommon.IModelDecorationsChangeAccessor*/) { + constructor(link: Link, decorationId: string) { this.link = link; this.decorationId = decorationId; } @@ -92,14 +92,13 @@ class LinkDetector implements editorCommon.IEditorContribution { static RECOMPUTE_TIME = 1000; // ms static TRIGGER_KEY_VALUE = platform.isMacintosh ? KeyCode.Meta : KeyCode.Ctrl; - static TRIGGER_MODIFIER = platform.isMacintosh ? 'metaKey' : 'ctrlKey'; + static TRIGGER_MODIFIER: 'metaKey' | 'ctrlKey' = platform.isMacintosh ? 'metaKey' : 'ctrlKey'; private editor: ICodeEditor; private listenersToRemove: IDisposable[]; private timeoutPromise: TPromise; private computePromise: TPromise; private activeLinkDecorationId: string; - private lastMouseEvent: IEditorMouseEvent; private openerService: IOpenerService; private messageService: IMessageService; private editorWorkerService: IEditorWorkerService; @@ -116,14 +115,28 @@ class LinkDetector implements editorCommon.IEditorContribution { this.messageService = messageService; this.editorWorkerService = editorWorkerService; this.listenersToRemove = []; + + let clickLinkGesture = new ClickLinkGesture(editor, new ClickLinkOptions( + LinkDetector.TRIGGER_KEY_VALUE, + LinkDetector.TRIGGER_MODIFIER, + KeyCode.Alt + )); + this.listenersToRemove.push(clickLinkGesture); + this.listenersToRemove.push(clickLinkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => { + this._onEditorMouseMove(mouseEvent, keyboardEvent); + })); + this.listenersToRemove.push(clickLinkGesture.onExecute((e) => { + this.onEditorMouseUp(e); + })); + this.listenersToRemove.push(clickLinkGesture.onCancel((e) => { + this.cleanUpActiveLinkDecoration(); + })); + this.listenersToRemove.push(editor.onDidChangeModelContent((e) => this.onChange())); this.listenersToRemove.push(editor.onDidChangeModel((e) => this.onModelChanged())); this.listenersToRemove.push(editor.onDidChangeModelLanguage((e) => this.onModelModeChanged())); this.listenersToRemove.push(LinkProviderRegistry.onDidChange((e) => this.onModelModeChanged())); - this.listenersToRemove.push(this.editor.onMouseUp((e: IEditorMouseEvent) => this.onEditorMouseUp(e))); - this.listenersToRemove.push(this.editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(e))); - this.listenersToRemove.push(this.editor.onKeyDown((e: IKeyboardEvent) => this.onEditorKeyDown(e))); - this.listenersToRemove.push(this.editor.onKeyUp((e: IKeyboardEvent) => this.onEditorKeyUp(e))); + this.timeoutPromise = null; this.computePromise = null; this.currentOccurences = {}; @@ -140,7 +153,6 @@ class LinkDetector implements editorCommon.IEditorContribution { } private onModelChanged(): void { - this.lastMouseEvent = null; this.currentOccurences = {}; this.activeLinkDecorationId = null; this.stop(); @@ -206,21 +218,7 @@ class LinkDetector implements editorCommon.IEditorContribution { }); } - private onEditorKeyDown(e: IKeyboardEvent): void { - if (e.keyCode === LinkDetector.TRIGGER_KEY_VALUE && this.lastMouseEvent) { - this.onEditorMouseMove(this.lastMouseEvent, e); - } - } - - private onEditorKeyUp(e: IKeyboardEvent): void { - if (e.keyCode === LinkDetector.TRIGGER_KEY_VALUE) { - this.cleanUpActiveLinkDecoration(); - } - } - - private onEditorMouseMove(mouseEvent: IEditorMouseEvent, withKey?: IKeyboardEvent): void { - this.lastMouseEvent = mouseEvent; - + private _onEditorMouseMove(mouseEvent: ClickLinkMouseEvent, withKey?: ClickLinkKeyboardEvent): void { if (this.isEnabled(mouseEvent, withKey)) { this.cleanUpActiveLinkDecoration(); // always remove previous link decoration as their can only be one var occurence = this.getLinkOccurence(mouseEvent.target.position); @@ -248,7 +246,7 @@ class LinkDetector implements editorCommon.IEditorContribution { } } - private onEditorMouseUp(mouseEvent: IEditorMouseEvent): void { + private onEditorMouseUp(mouseEvent: ClickLinkMouseEvent): void { if (!this.isEnabled(mouseEvent)) { return; } @@ -256,7 +254,7 @@ class LinkDetector implements editorCommon.IEditorContribution { if (!occurence) { return; } - this.openLinkOccurence(occurence, mouseEvent.event.altKey); + this.openLinkOccurence(occurence, mouseEvent.hasSideBySideModifier); } public openLinkOccurence(occurence: LinkOccurence, openToSide: boolean): void { @@ -302,9 +300,11 @@ class LinkDetector implements editorCommon.IEditorContribution { return null; } - private isEnabled(mouseEvent: IEditorMouseEvent, withKey?: IKeyboardEvent): boolean { - return mouseEvent.target.type === MouseTargetType.CONTENT_TEXT && - (mouseEvent.event[LinkDetector.TRIGGER_MODIFIER] || (withKey && withKey.keyCode === LinkDetector.TRIGGER_KEY_VALUE)); + private isEnabled(mouseEvent: ClickLinkMouseEvent, withKey?: ClickLinkKeyboardEvent): boolean { + return ( + mouseEvent.target.type === MouseTargetType.CONTENT_TEXT + && (mouseEvent.hasTriggerModifier || (withKey && withKey.keyCodeIsTriggerKey)) + ); } private stop(): void { From 17ea00ea442b951f9b1b6bd910d4dd70a2b7022d Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 25 May 2017 00:00:54 +0200 Subject: [PATCH 1029/1164] Implement editor.multicursorModifier --- src/vs/editor/browser/view/viewController.ts | 99 +++++++++---------- src/vs/editor/browser/view/viewImpl.ts | 2 +- .../browser/clickLinkGesture.ts | 61 ++++++++++-- .../browser/goToDeclarationMouse.ts | 13 +-- src/vs/editor/contrib/hover/browser/hover.ts | 3 +- src/vs/editor/contrib/links/browser/links.ts | 11 +-- 6 files changed, 109 insertions(+), 80 deletions(-) diff --git a/src/vs/editor/browser/view/viewController.ts b/src/vs/editor/browser/view/viewController.ts index f37a97d9344..e05ca74ea60 100644 --- a/src/vs/editor/browser/view/viewController.ts +++ b/src/vs/editor/browser/view/viewController.ts @@ -12,6 +12,7 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; import { ViewOutgoingEvents } from 'vs/editor/browser/view/viewOutgoingEvents'; import { CoreNavigationCommands, CoreEditorCommand } from 'vs/editor/common/controller/coreCommands'; +import { Configuration } from "vs/editor/browser/config/configuration"; export interface ExecCoreEditorCommandFunc { (editorCommand: CoreEditorCommand, args: any): void; @@ -35,17 +36,20 @@ export interface IMouseDispatchData { export class ViewController { + private readonly configuration: Configuration; private readonly viewModel: IViewModel; private readonly _execCoreEditorCommandFunc: ExecCoreEditorCommandFunc; private readonly outgoingEvents: ViewOutgoingEvents; private readonly commandService: ICommandService; constructor( + configuration: Configuration, viewModel: IViewModel, execCommandFunc: ExecCoreEditorCommandFunc, outgoingEvents: ViewOutgoingEvents, commandService: ICommandService ) { + this.configuration = configuration; this.viewModel = viewModel; this._execCoreEditorCommandFunc = execCommandFunc; this.outgoingEvents = outgoingEvents; @@ -97,10 +101,34 @@ export class ViewController { return viewPosition; } + private _hasMulticursorModifier(data: IMouseDispatchData): boolean { + switch (this.configuration.editor.multicursorModifier) { + case 'altKey': + return data.altKey; + case 'ctrlKey': + return data.ctrlKey; + case 'metaKey': + return data.metaKey; + } + return false; + } + + private _hasNonMulticursorModifier(data: IMouseDispatchData): boolean { + switch (this.configuration.editor.multicursorModifier) { + case 'altKey': + return data.ctrlKey || data.metaKey; + case 'ctrlKey': + return data.altKey || data.metaKey; + case 'metaKey': + return data.ctrlKey || data.altKey; + } + return false; + } + public dispatchMouse(data: IMouseDispatchData): void { if (data.startedOnLineNumbers) { // If the dragging started on the gutter, then have operations work on the entire line - if (data.altKey) { + if (this._hasMulticursorModifier(data)) { if (data.inSelectionMode) { this.lastCursorLineSelect(data.position); } else { @@ -116,7 +144,7 @@ export class ViewController { } else if (data.mouseDownCount >= 4) { this.selectAll(); } else if (data.mouseDownCount === 3) { - if (data.altKey) { + if (this._hasMulticursorModifier(data)) { if (data.inSelectionMode) { this.lastCursorLineSelectDrag(data.position); } else { @@ -130,7 +158,7 @@ export class ViewController { } } } else if (data.mouseDownCount === 2) { - if (data.altKey) { + if (this._hasMulticursorModifier(data)) { this.lastCursorWordSelect(data.position); } else { if (data.inSelectionMode) { @@ -140,8 +168,8 @@ export class ViewController { } } } else { - if (data.altKey) { - if (!data.ctrlKey && !data.metaKey) { + if (this._hasMulticursorModifier(data)) { + if (!this._hasNonMulticursorModifier(data)) { if (data.shiftKey) { this.columnSelect(data.position, data.mouseColumn); } else { @@ -163,20 +191,20 @@ export class ViewController { } } - public moveTo(viewPosition: Position): void { + private _usualArgs(viewPosition: Position) { viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.MoveTo, { + return { position: this.convertViewToModelPosition(viewPosition), viewPosition: viewPosition - }); + }; + } + + public moveTo(viewPosition: Position): void { + this._execMouseCommand(CoreNavigationCommands.MoveTo, this._usualArgs(viewPosition)); } private moveToSelect(viewPosition: Position): void { - viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.MoveToSelect, { - position: this.convertViewToModelPosition(viewPosition), - viewPosition: viewPosition - }); + this._execMouseCommand(CoreNavigationCommands.MoveToSelect, this._usualArgs(viewPosition)); } private columnSelect(viewPosition: Position, mouseColumn: number): void { @@ -198,64 +226,35 @@ export class ViewController { } private lastCursorMoveToSelect(viewPosition: Position): void { - viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.LastCursorMoveToSelect, { - position: this.convertViewToModelPosition(viewPosition), - viewPosition: viewPosition - }); + this._execMouseCommand(CoreNavigationCommands.LastCursorMoveToSelect, this._usualArgs(viewPosition)); } private wordSelect(viewPosition: Position): void { - viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.WordSelect, { - position: this.convertViewToModelPosition(viewPosition) - }); + this._execMouseCommand(CoreNavigationCommands.WordSelect, this._usualArgs(viewPosition)); } private wordSelectDrag(viewPosition: Position): void { - viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.WordSelectDrag, { - position: this.convertViewToModelPosition(viewPosition) - }); + this._execMouseCommand(CoreNavigationCommands.WordSelectDrag, this._usualArgs(viewPosition)); } private lastCursorWordSelect(viewPosition: Position): void { - viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.LastCursorWordSelect, { - position: this.convertViewToModelPosition(viewPosition) - }); + this._execMouseCommand(CoreNavigationCommands.LastCursorWordSelect, this._usualArgs(viewPosition)); } private lineSelect(viewPosition: Position): void { - viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.LineSelect, { - position: this.convertViewToModelPosition(viewPosition), - viewPosition: viewPosition - }); + this._execMouseCommand(CoreNavigationCommands.LineSelect, this._usualArgs(viewPosition)); } private lineSelectDrag(viewPosition: Position): void { - viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.LineSelectDrag, { - position: this.convertViewToModelPosition(viewPosition), - viewPosition: viewPosition - }); + this._execMouseCommand(CoreNavigationCommands.LineSelectDrag, this._usualArgs(viewPosition)); } private lastCursorLineSelect(viewPosition: Position): void { - viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.LastCursorLineSelect, { - position: this.convertViewToModelPosition(viewPosition), - viewPosition: viewPosition - }); + this._execMouseCommand(CoreNavigationCommands.LastCursorLineSelect, this._usualArgs(viewPosition)); } private lastCursorLineSelectDrag(viewPosition: Position): void { - viewPosition = this._validateViewColumn(viewPosition); - this._execMouseCommand(CoreNavigationCommands.LastCursorLineSelectDrag, { - position: this.convertViewToModelPosition(viewPosition), - viewPosition: viewPosition - }); + this._execMouseCommand(CoreNavigationCommands.LastCursorLineSelectDrag, this._usualArgs(viewPosition)); } private selectAll(): void { diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index 321c4719a6d..927c1d19486 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -105,7 +105,7 @@ export class View extends ViewEventHandler { this._renderAnimationFrame = null; this.outgoingEvents = new ViewOutgoingEvents(model); - let viewController = new ViewController(model, execCoreEditorCommandFunc, this.outgoingEvents, commandService); + let viewController = new ViewController(configuration, model, execCoreEditorCommandFunc, this.outgoingEvents, commandService); // The event dispatcher will always go through _renderOnce before dispatching any events this.eventDispatcher = new ViewEventDispatcher((callback: () => void) => this._renderOnce(callback)); diff --git a/src/vs/editor/contrib/goToDeclaration/browser/clickLinkGesture.ts b/src/vs/editor/contrib/goToDeclaration/browser/clickLinkGesture.ts index bec68dcf19a..79d1043cf50 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/clickLinkGesture.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/clickLinkGesture.ts @@ -13,6 +13,11 @@ import { ICodeEditor, IEditorMouseEvent, IMouseTarget } from 'vs/editor/browser/ import { Disposable } from 'vs/base/common/lifecycle'; import { ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import Event, { Emitter } from 'vs/base/common/event'; +import * as platform from 'vs/base/common/platform'; + +function hasModifier(e: { ctrlKey: boolean; shiftKey: boolean; altKey: boolean; metaKey: boolean }, modifier: 'ctrlKey' | 'shiftKey' | 'altKey' | 'metaKey'): boolean { + return !!e[modifier]; +} /** * An event that encapsulates the various trigger modifiers logic needed for go to definition. @@ -26,8 +31,8 @@ export class ClickLinkMouseEvent { constructor(source: IEditorMouseEvent, opts: ClickLinkOptions) { this.target = source.target; - this.hasTriggerModifier = !!source.event[opts.triggerModifier]; - this.hasSideBySideModifier = source.event.altKey; + this.hasTriggerModifier = hasModifier(source.event, opts.triggerModifier); + this.hasSideBySideModifier = hasModifier(source.event, opts.triggerSideBySideModifier); this.isNoneOrSingleMouseDown = (browser.isIE || source.event.detail <= 1); // IE does not support event.detail properly } } @@ -44,7 +49,7 @@ export class ClickLinkKeyboardEvent { constructor(source: IKeyboardEvent, opts: ClickLinkOptions) { this.keyCodeIsTriggerKey = (source.keyCode === opts.triggerKey); this.keyCodeIsSideBySideKey = (source.keyCode === opts.triggerSideBySideKey); - this.hasTriggerModifier = !!source[opts.triggerModifier]; + this.hasTriggerModifier = hasModifier(source, opts.triggerModifier); } } @@ -53,12 +58,42 @@ export class ClickLinkOptions { public readonly triggerKey: KeyCode; public readonly triggerModifier: 'ctrlKey' | 'shiftKey' | 'altKey' | 'metaKey'; public readonly triggerSideBySideKey: KeyCode; + public readonly triggerSideBySideModifier: 'ctrlKey' | 'shiftKey' | 'altKey' | 'metaKey'; - constructor(triggerKey: KeyCode, triggerModifier: 'ctrlKey' | 'shiftKey' | 'altKey' | 'metaKey', triggerSideBySideKey: KeyCode) { + constructor( + triggerKey: KeyCode, + triggerModifier: 'ctrlKey' | 'shiftKey' | 'altKey' | 'metaKey', + triggerSideBySideKey: KeyCode, + triggerSideBySideModifier: 'ctrlKey' | 'shiftKey' | 'altKey' | 'metaKey' + ) { this.triggerKey = triggerKey; this.triggerModifier = triggerModifier; this.triggerSideBySideKey = triggerSideBySideKey; + this.triggerSideBySideModifier = triggerSideBySideModifier; } + + public equals(other: ClickLinkOptions): boolean { + return ( + this.triggerKey === other.triggerKey + && this.triggerModifier === other.triggerModifier + && this.triggerSideBySideKey === other.triggerSideBySideKey + && this.triggerSideBySideModifier === other.triggerSideBySideModifier + ); + } +} + +function createOptions(multicursorModifier: 'altKey' | 'ctrlKey' | 'metaKey'): ClickLinkOptions { + if (multicursorModifier === 'altKey') { + if (platform.isMacintosh) { + return new ClickLinkOptions(KeyCode.Meta, 'metaKey', KeyCode.Alt, 'altKey'); + } + return new ClickLinkOptions(KeyCode.Ctrl, 'ctrlKey', KeyCode.Alt, 'altKey'); + } + + if (platform.isMacintosh) { + return new ClickLinkOptions(KeyCode.Alt, 'altKey', KeyCode.Meta, 'metaKey'); + } + return new ClickLinkOptions(KeyCode.Alt, 'altKey', KeyCode.Ctrl, 'ctrlKey'); } export class ClickLinkGesture extends Disposable { @@ -73,20 +108,32 @@ export class ClickLinkGesture extends Disposable { public readonly onCancel: Event = this._onCancel.event; private readonly _editor: ICodeEditor; - private readonly _opts: ClickLinkOptions; + private _opts: ClickLinkOptions; private lastMouseMoveEvent: ClickLinkMouseEvent; private hasTriggerKeyOnMouseDown: boolean; - constructor(editor: ICodeEditor, opts: ClickLinkOptions) { + constructor(editor: ICodeEditor) { super(); this._editor = editor; - this._opts = opts; + this._opts = createOptions(this._editor.getConfiguration().multicursorModifier); this.lastMouseMoveEvent = null; this.hasTriggerKeyOnMouseDown = false; + this._register(this._editor.onDidChangeConfiguration((e) => { + if (e.multicursorModifier) { + const newOpts = createOptions(this._editor.getConfiguration().multicursorModifier); + if (this._opts.equals(newOpts)) { + return; + } + this._opts = newOpts; + this.lastMouseMoveEvent = null; + this.hasTriggerKeyOnMouseDown = false; + this._onCancel.fire(); + } + })); this._register(this._editor.onMouseMove((e: IEditorMouseEvent) => this.onEditorMouseMove(new ClickLinkMouseEvent(e, this._opts)))); this._register(this._editor.onMouseDown((e: IEditorMouseEvent) => this.onEditorMouseDown(new ClickLinkMouseEvent(e, this._opts)))); this._register(this._editor.onMouseUp((e: IEditorMouseEvent) => this.onEditorMouseUp(new ClickLinkMouseEvent(e, this._opts)))); diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts index e063801f2d9..a29f1511b44 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts @@ -10,8 +10,6 @@ import * as nls from 'vs/nls'; import { Throttler } from 'vs/base/common/async'; import { onUnexpectedError } from 'vs/base/common/errors'; import { MarkedString } from 'vs/base/common/htmlContent'; -import { KeyCode } from 'vs/base/common/keyCodes'; -import * as platform from 'vs/base/common/platform'; import { TPromise } from 'vs/base/common/winjs.base'; import { IModeService } from 'vs/editor/common/services/modeService'; import { Range } from 'vs/editor/common/core/range'; @@ -26,15 +24,12 @@ import { registerThemingParticipant } from 'vs/platform/theme/common/themeServic import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { EditorState, CodeEditorStateFlag } from 'vs/editor/common/core/editorState'; import { DefinitionAction, DefinitionActionConfig } from './goToDeclarationCommands'; -import { ClickLinkGesture, ClickLinkOptions, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from "vs/editor/contrib/goToDeclaration/browser/clickLinkGesture"; +import { ClickLinkGesture, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from "vs/editor/contrib/goToDeclaration/browser/clickLinkGesture"; @editorContribution class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorContribution { private static ID = 'editor.contrib.gotodefinitionwithmouse'; - static TRIGGER_MODIFIER: 'metaKey' | 'ctrlKey' = platform.isMacintosh ? 'metaKey' : 'ctrlKey'; - static TRIGGER_SIDEBYSIDE_KEY_VALUE = KeyCode.Alt; - static TRIGGER_KEY_VALUE = platform.isMacintosh ? KeyCode.Meta : KeyCode.Ctrl; static MAX_SOURCE_PREVIEW_LINES = 8; private editor: ICodeEditor; @@ -53,11 +48,7 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC this.editor = editor; this.throttler = new Throttler(); - let linkGesture = new ClickLinkGesture(editor, new ClickLinkOptions( - GotoDefinitionWithMouseEditorContribution.TRIGGER_KEY_VALUE, - GotoDefinitionWithMouseEditorContribution.TRIGGER_MODIFIER, - GotoDefinitionWithMouseEditorContribution.TRIGGER_SIDEBYSIDE_KEY_VALUE - )); + let linkGesture = new ClickLinkGesture(editor); this.toUnhook.push(linkGesture); this.toUnhook.push(linkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => { diff --git a/src/vs/editor/contrib/hover/browser/hover.ts b/src/vs/editor/contrib/hover/browser/hover.ts index 7660cff426e..b0229e73f1b 100644 --- a/src/vs/editor/contrib/hover/browser/hover.ts +++ b/src/vs/editor/contrib/hover/browser/hover.ts @@ -112,8 +112,7 @@ export class ModesHoverController implements editorCommon.IEditorContribution { } private _onKeyDown(e: IKeyboardEvent): void { - var stopKey = platform.isMacintosh ? KeyCode.Meta : KeyCode.Ctrl; - if (e.keyCode !== stopKey) { + if (e.keyCode !== KeyCode.Ctrl && e.keyCode !== KeyCode.Alt && e.keyCode !== KeyCode.Meta) { // Do not hide hover when Ctrl/Meta is pressed this._hideWidgets(); } diff --git a/src/vs/editor/contrib/links/browser/links.ts b/src/vs/editor/contrib/links/browser/links.ts index c14eaf2d911..58808a66a34 100644 --- a/src/vs/editor/contrib/links/browser/links.ts +++ b/src/vs/editor/contrib/links/browser/links.ts @@ -8,7 +8,6 @@ import 'vs/css!./links'; import * as nls from 'vs/nls'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { KeyCode } from 'vs/base/common/keyCodes'; import * as platform from 'vs/base/common/platform'; import Severity from 'vs/base/common/severity'; import { TPromise } from 'vs/base/common/winjs.base'; @@ -26,7 +25,7 @@ import { registerThemingParticipant } from 'vs/platform/theme/common/themeServic import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { Position } from 'vs/editor/common/core/position'; import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; -import { ClickLinkGesture, ClickLinkOptions, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from "vs/editor/contrib/goToDeclaration/browser/clickLinkGesture"; +import { ClickLinkGesture, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from "vs/editor/contrib/goToDeclaration/browser/clickLinkGesture"; const HOVER_MESSAGE_GENERAL = ( platform.isMacintosh @@ -91,8 +90,6 @@ class LinkDetector implements editorCommon.IEditorContribution { } static RECOMPUTE_TIME = 1000; // ms - static TRIGGER_KEY_VALUE = platform.isMacintosh ? KeyCode.Meta : KeyCode.Ctrl; - static TRIGGER_MODIFIER: 'metaKey' | 'ctrlKey' = platform.isMacintosh ? 'metaKey' : 'ctrlKey'; private editor: ICodeEditor; private listenersToRemove: IDisposable[]; @@ -116,11 +113,7 @@ class LinkDetector implements editorCommon.IEditorContribution { this.editorWorkerService = editorWorkerService; this.listenersToRemove = []; - let clickLinkGesture = new ClickLinkGesture(editor, new ClickLinkOptions( - LinkDetector.TRIGGER_KEY_VALUE, - LinkDetector.TRIGGER_MODIFIER, - KeyCode.Alt - )); + let clickLinkGesture = new ClickLinkGesture(editor); this.listenersToRemove.push(clickLinkGesture); this.listenersToRemove.push(clickLinkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => { this._onEditorMouseMove(mouseEvent, keyboardEvent); From eae2a774cca75fc73e7b57f886d946ad79d37315 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 25 May 2017 00:27:30 +0200 Subject: [PATCH 1030/1164] Show correct link hover when links open with Alt --- src/vs/editor/contrib/links/browser/links.ts | 67 +++++++++++++------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/src/vs/editor/contrib/links/browser/links.ts b/src/vs/editor/contrib/links/browser/links.ts index 58808a66a34..356f9bf6843 100644 --- a/src/vs/editor/contrib/links/browser/links.ts +++ b/src/vs/editor/contrib/links/browser/links.ts @@ -27,15 +27,40 @@ import { Position } from 'vs/editor/common/core/position'; import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; import { ClickLinkGesture, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from "vs/editor/contrib/goToDeclaration/browser/clickLinkGesture"; -const HOVER_MESSAGE_GENERAL = ( +const HOVER_MESSAGE_GENERAL_META = ( platform.isMacintosh ? nls.localize('links.navigate.mac', "Cmd + click to follow link") : nls.localize('links.navigate', "Ctrl + click to follow link") ); +const HOVER_MESSAGE_GENERAL_ALT = nls.localize('links.navigate.al', "Alt + click to follow link"); + +const decoration = { + meta: ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + inlineClassName: 'detected-link', + hoverMessage: HOVER_MESSAGE_GENERAL_META + }), + metaActive: ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + inlineClassName: 'detected-link-active', + hoverMessage: HOVER_MESSAGE_GENERAL_META + }), + alt: ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + inlineClassName: 'detected-link', + hoverMessage: HOVER_MESSAGE_GENERAL_ALT + }), + altActive: ModelDecorationOptions.register({ + stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + inlineClassName: 'detected-link-active', + hoverMessage: HOVER_MESSAGE_GENERAL_ALT + }), +}; + class LinkOccurence { - public static decoration(link: Link): editorCommon.IModelDeltaDecoration { + public static decoration(link: Link, useMetaKey: boolean): editorCommon.IModelDeltaDecoration { return { range: { startLineNumber: link.range.startLineNumber, @@ -43,24 +68,15 @@ class LinkOccurence { endLineNumber: link.range.endLineNumber, endColumn: link.range.endColumn }, - options: LinkOccurence._getOptions(false) + options: LinkOccurence._getOptions(useMetaKey, false) }; } - private static _LINK_DECORATION = ModelDecorationOptions.register({ - stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, - inlineClassName: 'detected-link', - hoverMessage: HOVER_MESSAGE_GENERAL - }); - - private static _ACTIVE_LINK_DECORATION = ModelDecorationOptions.register({ - stickiness: editorCommon.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, - inlineClassName: 'detected-link-active', - hoverMessage: HOVER_MESSAGE_GENERAL - }); - - private static _getOptions(isActive: boolean): ModelDecorationOptions { - return (isActive ? this._ACTIVE_LINK_DECORATION : this._LINK_DECORATION); + private static _getOptions(useMetaKey: boolean, isActive: boolean): ModelDecorationOptions { + if (useMetaKey) { + return (isActive ? decoration.metaActive : decoration.meta); + } + return (isActive ? decoration.altActive : decoration.alt); } public decorationId: string; @@ -71,12 +87,12 @@ class LinkOccurence { this.decorationId = decorationId; } - public activate(changeAccessor: editorCommon.IModelDecorationsChangeAccessor): void { - changeAccessor.changeDecorationOptions(this.decorationId, LinkOccurence._getOptions(true)); + public activate(changeAccessor: editorCommon.IModelDecorationsChangeAccessor, useMetaKey: boolean): void { + changeAccessor.changeDecorationOptions(this.decorationId, LinkOccurence._getOptions(useMetaKey, true)); } - public deactivate(changeAccessor: editorCommon.IModelDecorationsChangeAccessor): void { - changeAccessor.changeDecorationOptions(this.decorationId, LinkOccurence._getOptions(false)); + public deactivate(changeAccessor: editorCommon.IModelDecorationsChangeAccessor, useMetaKey: boolean): void { + changeAccessor.changeDecorationOptions(this.decorationId, LinkOccurence._getOptions(useMetaKey, false)); } } @@ -183,6 +199,7 @@ class LinkDetector implements editorCommon.IEditorContribution { } private updateDecorations(links: Link[]): void { + const useMetaKey = (this.editor.getConfiguration().multicursorModifier === 'altKey'); this.editor.changeDecorations((changeAccessor: editorCommon.IModelDecorationsChangeAccessor) => { var oldDecorations: string[] = []; let keys = Object.keys(this.currentOccurences); @@ -196,7 +213,7 @@ class LinkDetector implements editorCommon.IEditorContribution { if (links) { // Not sure why this is sometimes null for (var i = 0; i < links.length; i++) { - newDecorations.push(LinkOccurence.decoration(links[i])); + newDecorations.push(LinkOccurence.decoration(links[i], useMetaKey)); } } @@ -212,12 +229,13 @@ class LinkDetector implements editorCommon.IEditorContribution { } private _onEditorMouseMove(mouseEvent: ClickLinkMouseEvent, withKey?: ClickLinkKeyboardEvent): void { + const useMetaKey = (this.editor.getConfiguration().multicursorModifier === 'altKey'); if (this.isEnabled(mouseEvent, withKey)) { this.cleanUpActiveLinkDecoration(); // always remove previous link decoration as their can only be one var occurence = this.getLinkOccurence(mouseEvent.target.position); if (occurence) { this.editor.changeDecorations((changeAccessor) => { - occurence.activate(changeAccessor); + occurence.activate(changeAccessor, useMetaKey); this.activeLinkDecorationId = occurence.decorationId; }); } @@ -227,11 +245,12 @@ class LinkDetector implements editorCommon.IEditorContribution { } private cleanUpActiveLinkDecoration(): void { + const useMetaKey = (this.editor.getConfiguration().multicursorModifier === 'altKey'); if (this.activeLinkDecorationId) { var occurence = this.currentOccurences[this.activeLinkDecorationId]; if (occurence) { this.editor.changeDecorations((changeAccessor) => { - occurence.deactivate(changeAccessor); + occurence.deactivate(changeAccessor, useMetaKey); }); } From dfff4c5e8e461d48c57a6ce380de8bd72fae1eb6 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 24 May 2017 15:46:59 -0700 Subject: [PATCH 1031/1164] Fix #26634 - if a `./` include pattern contains glob characters, ignore the `./` --- .../search/browser/patternInputWidget.ts | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/patternInputWidget.ts b/src/vs/workbench/parts/search/browser/patternInputWidget.ts index 75bef0a6f43..0657073ca2f 100644 --- a/src/vs/workbench/parts/search/browser/patternInputWidget.ts +++ b/src/vs/workbench/parts/search/browser/patternInputWidget.ts @@ -110,8 +110,6 @@ export class PatternInputWidget extends Widget { return {}; } - const isSearchPath = segment => segment.match(/^\.\//); - let exprSegments: string[]; let searchPaths: string[]; if (isGlobPattern) { @@ -119,21 +117,17 @@ export class PatternInputWidget extends Widget { .map(s => s.trim()) .filter(s => !!s.length); - const groups = collections.groupBy(segments, - segment => isSearchPath(segment) ? 'searchPaths' : 'exprSegments'); - searchPaths = groups.searchPaths || []; - exprSegments = groups.exprSegments || []; + const groups = this.groupByPathsAndExprSegments(segments); + searchPaths = groups.searchPaths; + exprSegments = groups.exprSegments; } else { const segments = pattern.split(',') .map(s => strings.trim(s.trim(), '/')) .filter(s => !!s.length); - const groups = collections.groupBy(segments, - segment => isSearchPath(segment) ? 'searchPaths' : 'exprSegments'); - searchPaths = groups.searchPaths || []; - exprSegments = groups.exprSegments || []; - - exprSegments = exprSegments + const groups = this.groupByPathsAndExprSegments(segments); + searchPaths = groups.searchPaths; + exprSegments = groups.exprSegments .map(p => { if (p[0] === '.') { p = '*' + p; // convert ".js" to "*.js" @@ -147,6 +141,27 @@ export class PatternInputWidget extends Widget { return { expression, searchPaths }; } + private groupByPathsAndExprSegments(segments: string[]) { + const isSearchPath = segment => segment.match(/^\.\//); + + const groups = collections.groupBy(segments, + segment => isSearchPath(segment) ? 'searchPaths' : 'exprSegments'); + groups.searchPaths = groups.searchPaths || []; + groups.exprSegments = groups.exprSegments || []; + + // If a ./searchPath has a glob character, remove ./ and use it as an expression segment + groups.searchPaths = groups.searchPaths.filter(searchPath => { + if (searchPath.match(/[\*\{\}\(\)\[\]\?]/)) { + groups.exprSegments.push(strings.ltrim(searchPath, './')); + return false; + } + + return true; + }); + + return groups; + } + public select(): void { this.inputBox.select(); } From 2dcccf7cc8f730c0a31ddf7114923adb44bf07d2 Mon Sep 17 00:00:00 2001 From: rebornix Date: Wed, 24 May 2017 16:17:47 -0700 Subject: [PATCH 1032/1164] Fix #25783. Middle click pastes in Find Widget on Linux --- src/vs/base/browser/ui/findinput/findInput.ts | 5 +++++ src/vs/editor/contrib/find/browser/findWidget.ts | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/vs/base/browser/ui/findinput/findInput.ts b/src/vs/base/browser/ui/findinput/findInput.ts index 2d38be64dc9..2d447646974 100644 --- a/src/vs/base/browser/ui/findinput/findInput.ts +++ b/src/vs/base/browser/ui/findinput/findInput.ts @@ -13,6 +13,7 @@ import { IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview import { Widget } from 'vs/base/browser/ui/widget'; import Event, { Emitter } from 'vs/base/common/event'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { IMouseEvent } from 'vs/base/browser/mouseEvent'; import { KeyCode } from 'vs/base/common/keyCodes'; import { CaseSensitiveCheckbox, WholeWordsCheckbox, RegexCheckbox } from 'vs/base/browser/ui/findinput/findInputCheckboxes'; import { Color } from 'vs/base/common/color'; @@ -69,6 +70,9 @@ export class FindInput extends Widget { private _onKeyDown = this._register(new Emitter()); public onKeyDown: Event = this._onKeyDown.event; + private _onMouseDown = this._register(new Emitter()); + public onMouseDown: Event = this._onMouseDown.event; + private _onInput = this._register(new Emitter()); public onInput: Event = this._onInput.event; @@ -113,6 +117,7 @@ export class FindInput extends Widget { this.onkeydown(this.inputBox.inputElement, (e) => this._onKeyDown.fire(e)); this.onkeyup(this.inputBox.inputElement, (e) => this._onKeyUp.fire(e)); this.oninput(this.inputBox.inputElement, (e) => this._onInput.fire()); + this.onmousedown(this.inputBox.inputElement, (e) => this._onMouseDown.fire(e)); } public enable(): void { diff --git a/src/vs/editor/contrib/find/browser/findWidget.ts b/src/vs/editor/contrib/find/browser/findWidget.ts index 78e442c6992..409caf8fb73 100644 --- a/src/vs/editor/contrib/find/browser/findWidget.ts +++ b/src/vs/editor/contrib/find/browser/findWidget.ts @@ -9,9 +9,11 @@ import 'vs/css!./findWidget'; import * as nls from 'vs/nls'; import { onUnexpectedError } from 'vs/base/common/errors'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import * as platform from 'vs/base/common/platform'; import * as strings from 'vs/base/common/strings'; import * as dom from 'vs/base/browser/dom'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { IMouseEvent } from 'vs/base/browser/mouseEvent'; import { IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview'; import { FindInput, IFindInputStyles } from 'vs/base/browser/ui/findinput/findInput'; import { IMessage as InputBoxMessage, InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; @@ -514,6 +516,13 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas this._findInput.highlightFindOptions(); } + private _onFindInputMouseDown(e: IMouseEvent): void { + // on linux, middle key does pasting. + if (e.middleButton) { + e.stopPropagation(); + } + } + private _onFindInputKeyDown(e: IKeyboardEvent): void { if (e.equals(KeyCode.Enter)) { @@ -647,6 +656,9 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas } } })); + if (platform.isLinux) { + this._register(this._findInput.onMouseDown((e) => this._onFindInputMouseDown(e))); + } this._matchesCount = document.createElement('div'); this._matchesCount.className = 'matchesCount'; From 6d3e6cd313040668e136b6088a4e6133d0ada861 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Wed, 24 May 2017 20:04:00 -0700 Subject: [PATCH 1033/1164] Clean up termianl imports --- .../electron-browser/terminal.contribution.ts | 4 +- .../electron-browser/terminalActions.ts | 4 +- .../electron-browser/terminalColorRegistry.ts | 2 +- .../electron-browser/terminalInstance.ts | 46 +++++++++---------- .../electron-browser/terminalPanel.ts | 26 +++++------ 5 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts index 6becf5badb0..c4e3fc01471 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts @@ -7,9 +7,10 @@ import 'vs/css!./media/scrollbar'; import 'vs/css!./media/terminal'; import 'vs/css!./media/xterm'; import 'vs/css!./media/widgets'; +import * as debugActions from 'vs/workbench/parts/debug/browser/debugActions'; +import * as nls from 'vs/nls'; import * as panel from 'vs/workbench/browser/panel'; import * as platform from 'vs/base/common/platform'; -import nls = require('vs/nls'); import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { GlobalQuickOpenAction } from 'vs/workbench/browser/parts/quickopen/quickopen.contribution'; import { ITerminalService, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_PANEL_ID, TERMINAL_DEFAULT_RIGHT_CLICK_COPY_PASTE, TerminalCursorStyle } from 'vs/workbench/parts/terminal/common/terminal'; @@ -24,7 +25,6 @@ import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { TerminalService } from 'vs/workbench/parts/terminal/electron-browser/terminalService'; import { ToggleTabFocusModeAction } from 'vs/editor/contrib/toggleTabFocusMode/common/toggleTabFocusMode'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import debugActions = require('vs/workbench/parts/debug/browser/debugActions'); import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { OpenNextRecentlyUsedEditorInGroupAction, OpenPreviousRecentlyUsedEditorInGroupAction, FocusActiveGroupAction, FocusFirstGroupAction, FocusSecondGroupAction, FocusThirdGroupAction } from 'vs/workbench/browser/parts/editor/editorActions'; import { EDITOR_FONT_DEFAULTS } from "vs/editor/common/config/editorOptions"; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts index 58cd361fd34..3b62f9642ed 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import nls = require('vs/nls'); -import os = require('os'); +import * as nls from 'vs/nls'; +import * as os from 'os'; import { Action, IAction } from 'vs/base/common/actions'; import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; import { ICodeEditorService } from 'vs/editor/common/services/codeEditorService'; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts index 727078be3bc..27f3f23c8ba 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import nls = require('vs/nls'); +import * as nls from 'vs/nls'; import { registerColor, ColorIdentifier } from 'vs/platform/theme/common/colorRegistry'; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 07f8b6b53cb..8d7d30b7099 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -3,15 +3,15 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as cp from 'child_process'; +import * as os from 'os'; import * as path from 'path'; -import DOM = require('vs/base/browser/dom'); +import * as lifecycle from 'vs/base/common/lifecycle'; +import * as nls from 'vs/nls'; +import * as platform from 'vs/base/common/platform'; +import * as dom from 'vs/base/browser/dom'; import Event, { Emitter } from 'vs/base/common/event'; -import URI from 'vs/base/common/uri'; -import cp = require('child_process'); -import lifecycle = require('vs/base/common/lifecycle'); -import nls = require('vs/nls'); -import os = require('os'); -import platform = require('vs/base/common/platform'); +import Uri from 'vs/base/common/uri'; import xterm = require('xterm'); import { Dimension } from 'vs/base/browser/builder'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; @@ -39,7 +39,7 @@ class StandardTerminalProcessFactory implements ITerminalProcessFactory { public create(env: { [key: string]: string }): cp.ChildProcess { return cp.fork('./terminalProcess', [], { env, - cwd: URI.parse(path.dirname(require.toUrl('./terminalProcess'))).fsPath + cwd: Uri.parse(path.dirname(require.toUrl('./terminalProcess'))).fsPath }); } } @@ -217,7 +217,7 @@ export class TerminalInstance implements ITerminalInstance { this._container = container; this._wrapperElement = document.createElement('div'); - DOM.addClass(this._wrapperElement, 'terminal-wrapper'); + dom.addClass(this._wrapperElement, 'terminal-wrapper'); this._xtermElement = document.createElement('div'); this._xterm.open(this._xtermElement, false); @@ -242,7 +242,7 @@ export class TerminalInstance implements ITerminalInstance { } return undefined; }); - this._instanceDisposables.push(DOM.addDisposableListener(this._xterm.element, 'mouseup', (event: KeyboardEvent) => { + this._instanceDisposables.push(dom.addDisposableListener(this._xterm.element, 'mouseup', (event: KeyboardEvent) => { // Wait until mouseup has propogated through the DOM before evaluating the new selection // state. setTimeout(() => { @@ -251,7 +251,7 @@ export class TerminalInstance implements ITerminalInstance { })); // xterm.js currently drops selection on keyup as we need to handle this case. - this._instanceDisposables.push(DOM.addDisposableListener(this._xterm.element, 'keyup', (event: KeyboardEvent) => { + this._instanceDisposables.push(dom.addDisposableListener(this._xterm.element, 'keyup', (event: KeyboardEvent) => { // Wait until keyup has propogated through the DOM before evaluating the new selection // state. setTimeout(() => { @@ -262,10 +262,10 @@ export class TerminalInstance implements ITerminalInstance { const xtermHelper: HTMLElement = this._xterm.element.querySelector('.xterm-helpers'); const focusTrap: HTMLElement = document.createElement('div'); focusTrap.setAttribute('tabindex', '0'); - DOM.addClass(focusTrap, 'focus-trap'); - this._instanceDisposables.push(DOM.addDisposableListener(focusTrap, 'focus', (event: FocusEvent) => { + dom.addClass(focusTrap, 'focus-trap'); + this._instanceDisposables.push(dom.addDisposableListener(focusTrap, 'focus', (event: FocusEvent) => { let currentElement = focusTrap; - while (!DOM.hasClass(currentElement, 'part')) { + while (!dom.hasClass(currentElement, 'part')) { currentElement = currentElement.parentElement; } const hidePanelElement = currentElement.querySelector('.hide-panel-action'); @@ -273,17 +273,17 @@ export class TerminalInstance implements ITerminalInstance { })); xtermHelper.insertBefore(focusTrap, this._xterm.textarea); - this._instanceDisposables.push(DOM.addDisposableListener(this._xterm.textarea, 'focus', (event: KeyboardEvent) => { + this._instanceDisposables.push(dom.addDisposableListener(this._xterm.textarea, 'focus', (event: KeyboardEvent) => { this._terminalFocusContextKey.set(true); })); - this._instanceDisposables.push(DOM.addDisposableListener(this._xterm.textarea, 'blur', (event: KeyboardEvent) => { + this._instanceDisposables.push(dom.addDisposableListener(this._xterm.textarea, 'blur', (event: KeyboardEvent) => { this._terminalFocusContextKey.reset(); this._refreshSelectionContextKey(); })); - this._instanceDisposables.push(DOM.addDisposableListener(this._xterm.element, 'focus', (event: KeyboardEvent) => { + this._instanceDisposables.push(dom.addDisposableListener(this._xterm.element, 'focus', (event: KeyboardEvent) => { this._terminalFocusContextKey.set(true); })); - this._instanceDisposables.push(DOM.addDisposableListener(this._xterm.element, 'blur', (event: KeyboardEvent) => { + this._instanceDisposables.push(dom.addDisposableListener(this._xterm.element, 'blur', (event: KeyboardEvent) => { this._terminalFocusContextKey.reset(); this._refreshSelectionContextKey(); })); @@ -336,7 +336,7 @@ export class TerminalInstance implements ITerminalInstance { this._linkHandler.dispose(); } if (this._xterm && this._xterm.element) { - this._hadFocusOnExit = DOM.hasClass(this._xterm.element, 'focus'); + this._hadFocusOnExit = dom.hasClass(this._xterm.element, 'focus'); } if (this._wrapperElement) { this._container.removeChild(this._wrapperElement); @@ -389,7 +389,7 @@ export class TerminalInstance implements ITerminalInstance { public setVisible(visible: boolean): void { this._isVisible = visible; if (this._wrapperElement) { - DOM.toggleClass(this._wrapperElement, 'active', visible); + dom.toggleClass(this._wrapperElement, 'active', visible); } if (visible && this._xterm) { // Trigger a manual scroll event which will sync the viewport and scroll bar. This is @@ -473,9 +473,9 @@ export class TerminalInstance implements ITerminalInstance { } const env = TerminalInstance.createTerminalEnv(process.env, shell, this._getCwd(shell, workspace), locale, this._cols, this._rows); this._title = shell.name || ''; - this._process = cp.fork(URI.parse(require.toUrl('bootstrap')).fsPath, ['--type=terminal'], { + this._process = cp.fork(Uri.parse(require.toUrl('bootstrap')).fsPath, ['--type=terminal'], { env, - cwd: URI.parse(path.dirname(require.toUrl('../node/terminalProcess'))).fsPath + cwd: Uri.parse(path.dirname(require.toUrl('../node/terminalProcess'))).fsPath }); if (!shell.name) { // Only listen for process title changes when a name is not provided @@ -559,7 +559,7 @@ export class TerminalInstance implements ITerminalInstance { } private _attachPressAnyKeyToCloseListener() { - this._processDisposables.push(DOM.addDisposableListener(this._xterm.textarea, 'keypress', (event: KeyboardEvent) => { + this._processDisposables.push(dom.addDisposableListener(this._xterm.textarea, 'keypress', (event: KeyboardEvent) => { this.dispose(); event.preventDefault(); })); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index 81ed253bd42..ec880bdd12c 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -3,9 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import DOM = require('vs/base/browser/dom'); -import nls = require('vs/nls'); -import platform = require('vs/base/common/platform'); +import * as dom from 'vs/base/browser/dom'; +import * as nls from 'vs/nls'; +import * as platform from 'vs/base/common/platform'; import { Action, IAction } from 'vs/base/common/actions'; import { Builder, Dimension } from 'vs/base/browser/builder'; import { IActionItem, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; @@ -51,12 +51,12 @@ export class TerminalPanel extends Panel { public create(parent: Builder): TPromise { super.create(parent); this._parentDomElement = parent.getHTMLElement(); - DOM.addClass(this._parentDomElement, 'integrated-terminal'); + dom.addClass(this._parentDomElement, 'integrated-terminal'); this._themeStyleElement = document.createElement('style'); this._fontStyleElement = document.createElement('style'); this._terminalContainer = document.createElement('div'); - DOM.addClass(this._terminalContainer, 'terminal-outer-container'); + dom.addClass(this._terminalContainer, 'terminal-outer-container'); this._parentDomElement.appendChild(this._themeStyleElement); this._parentDomElement.appendChild(this._fontStyleElement); this._parentDomElement.appendChild(this._terminalContainer); @@ -152,7 +152,7 @@ export class TerminalPanel extends Panel { } private _attachEventListeners(): void { - this._register(DOM.addDisposableListener(this._parentDomElement, 'mousedown', (event: MouseEvent) => { + this._register(dom.addDisposableListener(this._parentDomElement, 'mousedown', (event: MouseEvent) => { if (this._terminalService.terminalInstances.length === 0) { return; } @@ -183,7 +183,7 @@ export class TerminalPanel extends Panel { } } })); - this._register(DOM.addDisposableListener(this._parentDomElement, 'contextmenu', (event: MouseEvent) => { + this._register(dom.addDisposableListener(this._parentDomElement, 'contextmenu', (event: MouseEvent) => { if (!this._cancelContextMenu) { const standardEvent = new StandardMouseEvent(event); let anchor: { x: number, y: number } = { x: standardEvent.posx, y: standardEvent.posy }; @@ -196,7 +196,7 @@ export class TerminalPanel extends Panel { } this._cancelContextMenu = false; })); - this._register(DOM.addDisposableListener(this._parentDomElement, 'click', (event) => { + this._register(dom.addDisposableListener(this._parentDomElement, 'click', (event) => { if (this._terminalService.terminalInstances.length === 0) { return; } @@ -205,14 +205,14 @@ export class TerminalPanel extends Panel { this._terminalService.getActiveInstance().focus(); } })); - this._register(DOM.addDisposableListener(this._parentDomElement, 'keyup', (event: KeyboardEvent) => { + this._register(dom.addDisposableListener(this._parentDomElement, 'keyup', (event: KeyboardEvent) => { if (event.keyCode === 27) { // Keep terminal open on escape event.stopPropagation(); } })); - this._register(DOM.addDisposableListener(this._parentDomElement, DOM.EventType.DROP, (e: DragEvent) => { - if (e.target === this._parentDomElement || DOM.isAncestor(e.target as HTMLElement, this._parentDomElement)) { + this._register(dom.addDisposableListener(this._parentDomElement, dom.EventType.DROP, (e: DragEvent) => { + if (e.target === this._parentDomElement || dom.isAncestor(e.target as HTMLElement, this._parentDomElement)) { if (!e.dataTransfer) { return; } @@ -269,8 +269,8 @@ export class TerminalPanel extends Panel { return; } let newFont = this._terminalService.configHelper.getFont(); - DOM.toggleClass(this._parentDomElement, 'enable-ligatures', this._terminalService.configHelper.config.fontLigatures); - DOM.toggleClass(this._parentDomElement, 'disable-bold', !this._terminalService.configHelper.config.enableBold); + dom.toggleClass(this._parentDomElement, 'enable-ligatures', this._terminalService.configHelper.config.fontLigatures); + dom.toggleClass(this._parentDomElement, 'disable-bold', !this._terminalService.configHelper.config.enableBold); if (!this._font || this._fontsDiffer(this._font, newFont)) { this._fontStyleElement.innerHTML = '.monaco-workbench .panel.integrated-terminal .xterm {' + `font-family: ${newFont.fontFamily};` + From 31875b67cc33f19b1b1ff8a8a1ced71c325e1684 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 24 May 2017 22:33:35 -0700 Subject: [PATCH 1034/1164] Reverting prev fix as it adds gap between docs and list --- .../editor/contrib/suggest/browser/media/suggest.css | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index 08b4e45593d..fe64def759b 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -34,18 +34,12 @@ .monaco-editor .suggest-widget.docs-side > .tree, .monaco-editor .suggest-widget.docs-side > .details { - /* subtract 2px for border, and another 2 for the Chromium zoom issue - where the children get slightly bigger width than what is set - which makes the docs go below the list */ - width: calc(50% - 4px); + width: 328px; } .monaco-editor.hc-black .suggest-widget.docs-side > .tree, .monaco-editor.hc-black .suggest-widget.docs-side > .details { - /* subtract 4px for border, and another 2 for the Chromium zoom issue - where the children get slightly bigger width than what is set - which makes the docs go below the list */ - width: calc(50% - 6px); + width: 326px; } /* Styles for Message element for when widget is loading or is empty */ From c96f85a6d22fc33cf86ac17ed4ba2f79b98ece53 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Wed, 24 May 2017 22:48:10 -0700 Subject: [PATCH 1035/1164] Fixes #26244 prevent double border --- .../contrib/suggest/browser/media/suggest.css | 30 +++++++++---- .../contrib/suggest/browser/suggestWidget.ts | 42 +++++++++++++++---- 2 files changed, 58 insertions(+), 14 deletions(-) diff --git a/src/vs/editor/contrib/suggest/browser/media/suggest.css b/src/vs/editor/contrib/suggest/browser/media/suggest.css index fe64def759b..7ca54b83969 100644 --- a/src/vs/editor/contrib/suggest/browser/media/suggest.css +++ b/src/vs/editor/contrib/suggest/browser/media/suggest.css @@ -34,7 +34,17 @@ .monaco-editor .suggest-widget.docs-side > .tree, .monaco-editor .suggest-widget.docs-side > .details { - width: 328px; + /* subtract 2px for border, and another 2 for the Chromium zoom issue + where the children get slightly bigger width than what is set + which makes the docs go below the list */ + width: calc(50% - 4px); + float: left; + +} + +.monaco-editor .suggest-widget.docs-side.list-right > .tree, +.monaco-editor .suggest-widget.docs-side.list-right > .details { + float: right; } .monaco-editor.hc-black .suggest-widget.docs-side > .tree, @@ -42,6 +52,14 @@ width: 326px; } +.monaco-editor .suggest-widget.docs-side .empty-left-border { + border-left-width: 0px; +} + +.monaco-editor .suggest-widget.docs-side .empty-right-border { + border-right-width: 0px; +} + /* Styles for Message element for when widget is loading or is empty */ .monaco-editor .suggest-widget > .message { padding-left: 22px; @@ -58,13 +76,7 @@ height: 100%; } -.monaco-editor .suggest-widget.docs-side > .tree { - float: left; -} -.monaco-editor .suggest-widget.docs-side.list-right > .tree { - float: right -} /** Styles for each row in the list element **/ @@ -207,6 +219,10 @@ display: none; } +.monaco-editor .suggest-widget.docs-below .details { + border-top-width: 0px; +} + .monaco-editor .suggest-widget .details > .monaco-scrollable-element { flex: 1; } diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 56871ef9504..c27e0dbaa95 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -948,14 +948,42 @@ export class SuggestWidget implements IContentWidget, IDelegate } private adjustListPosition(): void { - if (hasClass(this.element, 'widget-above') - && hasClass(this.element, 'docs-side') - && this.details.element.offsetHeight > this.listElement.offsetHeight) { - // Docs is bigger than list and widget is above cursor, apply margin-top so that list appears right above cursor - this.listElement.style.marginTop = `${this.details.element.offsetHeight - this.listElement.offsetHeight}px`; - } else { - this.listElement.style.marginTop = '0px'; + + + if (hasClass(this.element, 'docs-side')) { + + if (this.details.element.offsetHeight > this.listElement.offsetHeight) { + if (hasClass(this.element, 'widget-above')) { + // Docs is bigger than list and widget is above cursor, apply margin-top so that list appears right above cursor + this.listElement.style.marginTop = `${this.details.element.offsetHeight - this.listElement.offsetHeight}px`; + } + + if (hasClass(this.element, 'list-right')) { + addClass(this.listElement, 'empty-left-border'); + removeClass(this.listElement, 'empty-right-border'); + } else { + addClass(this.listElement, 'empty-right-border'); + removeClass(this.listElement, 'empty-left-border'); + } + + removeClass(this.details.element, 'empty-left-border'); + removeClass(this.details.element, 'empty-right-border'); + return; + } else { + if (hasClass(this.element, 'list-right')) { + addClass(this.details.element, 'empty-right-border'); + removeClass(this.details.element, 'empty-left-border'); + } else { + addClass(this.details.element, 'empty-left-border'); + removeClass(this.details.element, 'empty-right-border'); + } + + removeClass(this.listElement, 'empty-right-border'); + removeClass(this.listElement, 'empty-left-border'); + } } + + this.listElement.style.marginTop = '0px'; } private renderDetails(): void { From 819467443ca071ace3a0e1036bb67e10b9f68488 Mon Sep 17 00:00:00 2001 From: Daniel Ye Date: Wed, 24 May 2017 22:56:48 -0700 Subject: [PATCH 1036/1164] 2017-05-24. Merged in translations from transifex. --- build/win32/i18n/messages.pt-br.isl | 8 + .../out/settingsDocumentHelper.i18n.json | 2 +- i18n/chs/extensions/gulp/out/main.i18n.json | 2 +- i18n/chs/extensions/jake/out/main.i18n.json | 4 +- i18n/chs/extensions/jake/package.i18n.json | 4 +- .../markdown/out/extension.i18n.json | 6 + .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/chs/extensions/npm/package.i18n.json | 6 + .../resourceviewer/resourceViewer.i18n.json | 2 - .../src/vs/code/electron-main/menus.i18n.json | 4 +- .../config/commonEditorConfig.i18n.json | 6 +- .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../indentation/common/indentation.i18n.json | 2 +- .../suggest/browser/suggestWidget.i18n.json | 2 +- .../common/configurationRegistry.i18n.json | 2 +- .../markers/common/problemMatcher.i18n.json | 7 + .../api/node/extHostTreeViews.i18n.json | 6 +- .../src/vs/workbench/common/theme.i18n.json | 1 + .../main.contribution.i18n.json | 1 + .../inspectKeybindings.i18n.json | 2 +- .../electron-browser/toggleWordWrap.i18n.json | 2 +- .../parts/debug/node/debugAdapter.i18n.json | 1 + .../actions/evaluateMath.i18n.json | 2 +- .../actions/incrementDecrement.i18n.json | 12 +- .../actions/removeTag.i18n.json | 2 +- .../actions/splitJoinTag.i18n.json | 2 +- .../actions/updateImageSize.i18n.json | 2 +- .../actions/updateTag.i18n.json | 6 +- .../actions/wrapWithAbbreviation.i18n.json | 2 +- .../emmet.contribution.i18n.json | 6 +- .../treeExplorer.contribution.i18n.json | 4 +- .../extensionsUtils.i18n.json | 6 +- .../browser/files.contribution.i18n.json | 1 - .../common/editors/fileEditorInput.i18n.json | 2 +- .../performance.contribution.i18n.json | 8 +- .../browser/keybindingsEditor.i18n.json | 4 +- .../browser/preferencesActions.i18n.json | 2 +- .../scm.contribution.i18n.json | 3 +- .../scm/electron-browser/scmMenus.i18n.json | 3 +- .../electron-browser/TMSnippets.i18n.json | 2 +- .../parts/tasks/browser/quickOpen.i18n.json | 4 +- .../terminalTaskSystem.i18n.json | 3 +- .../tasks/node/processTaskSystem.i18n.json | 3 +- .../electron-browser/watermark.i18n.json | 2 +- .../vs_code_welcome_page.i18n.json | 7 +- .../electron-browser/welcomePage.i18n.json | 14 ++ .../workbenchThemeService.i18n.json | 12 +- .../markdown/out/extension.i18n.json | 6 + .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/cht/extensions/npm/package.i18n.json | 6 + .../resourceviewer/resourceViewer.i18n.json | 2 - .../src/vs/code/electron-main/menus.i18n.json | 1 + .../config/commonEditorConfig.i18n.json | 1 - .../common/view/editorColorRegistry.i18n.json | 3 + .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../api/node/extHostTreeViews.i18n.json | 4 +- .../src/vs/workbench/common/theme.i18n.json | 1 + .../main.contribution.i18n.json | 1 + .../extensionsUtils.i18n.json | 6 +- .../browser/files.contribution.i18n.json | 1 - .../performance.contribution.i18n.json | 6 +- .../scm.contribution.i18n.json | 1 + .../scm/electron-browser/scmMenus.i18n.json | 1 + .../parts/tasks/browser/quickOpen.i18n.json | 4 +- .../themes.contribution.i18n.json | 1 + .../vs_code_welcome_page.i18n.json | 3 + .../electron-browser/welcomePage.i18n.json | 13 +- .../walkThroughPart.i18n.json | 3 +- i18n/deu/extensions/git/out/main.i18n.json | 2 +- .../markdown/out/extension.i18n.json | 6 + .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/deu/extensions/npm/package.i18n.json | 6 + .../resourceviewer/resourceViewer.i18n.json | 2 - .../config/commonEditorConfig.i18n.json | 1 - .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../main.contribution.i18n.json | 1 + .../extensionsUtils.i18n.json | 6 +- .../browser/files.contribution.i18n.json | 1 - .../performance.contribution.i18n.json | 6 +- .../electron-browser/welcomePage.i18n.json | 5 + i18n/esn/extensions/jake/out/main.i18n.json | 4 +- i18n/esn/extensions/jake/package.i18n.json | 4 +- .../markdown/out/extension.i18n.json | 6 + .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/esn/extensions/npm/package.i18n.json | 6 + .../resourceviewer/resourceViewer.i18n.json | 2 - .../config/commonEditorConfig.i18n.json | 3 +- .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../suggest/browser/suggestWidget.i18n.json | 1 + ...guageConfigurationExtensionPoint.i18n.json | 6 +- .../markers/common/problemMatcher.i18n.json | 7 + .../theme/common/colorRegistry.i18n.json | 3 + .../api/node/extHostTreeViews.i18n.json | 6 +- .../src/vs/workbench/common/theme.i18n.json | 1 + .../main.contribution.i18n.json | 1 + .../parts/debug/node/debugAdapter.i18n.json | 1 + .../extensionsUtils.i18n.json | 6 +- .../browser/files.contribution.i18n.json | 1 - .../performance.contribution.i18n.json | 8 +- .../scm.contribution.i18n.json | 1 + .../scm/electron-browser/scmMenus.i18n.json | 1 + .../parts/tasks/browser/quickOpen.i18n.json | 4 +- .../terminalTaskSystem.i18n.json | 3 +- .../tasks/node/processTaskSystem.i18n.json | 3 +- .../vs_code_welcome_page.i18n.json | 5 + .../electron-browser/welcomePage.i18n.json | 14 ++ .../markdown/out/extension.i18n.json | 6 + .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/fra/extensions/npm/package.i18n.json | 6 + .../resourceviewer/resourceViewer.i18n.json | 2 - .../config/commonEditorConfig.i18n.json | 1 - .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../main.contribution.i18n.json | 1 + .../extensionsUtils.i18n.json | 6 +- .../browser/files.contribution.i18n.json | 1 - .../performance.contribution.i18n.json | 6 +- .../electron-browser/welcomePage.i18n.json | 5 + .../markdown/out/extension.i18n.json | 6 + .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/ita/extensions/npm/package.i18n.json | 6 + .../resourceviewer/resourceViewer.i18n.json | 2 - .../config/commonEditorConfig.i18n.json | 2 +- .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../markers/common/problemMatcher.i18n.json | 7 + .../main.contribution.i18n.json | 1 + .../extensionsUtils.i18n.json | 6 +- .../browser/files.contribution.i18n.json | 1 - .../performance.contribution.i18n.json | 6 +- .../electron-browser/welcomePage.i18n.json | 5 + i18n/jpn/extensions/jake/out/main.i18n.json | 4 +- i18n/jpn/extensions/jake/package.i18n.json | 4 +- .../markdown/out/extension.i18n.json | 6 + .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/jpn/extensions/npm/package.i18n.json | 6 + .../extensions/typescript/package.i18n.json | 5 +- .../resourceviewer/resourceViewer.i18n.json | 2 - .../config/commonEditorConfig.i18n.json | 2 +- .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../suggest/browser/suggestWidget.i18n.json | 1 + ...guageConfigurationExtensionPoint.i18n.json | 1 + .../markers/common/problemMatcher.i18n.json | 7 + .../theme/common/colorRegistry.i18n.json | 1 + .../api/node/extHostTreeViews.i18n.json | 6 +- .../src/vs/workbench/common/theme.i18n.json | 1 + .../main.contribution.i18n.json | 1 + .../electronDebugActions.i18n.json | 1 + .../parts/debug/node/debugAdapter.i18n.json | 1 + .../extensionsUtils.i18n.json | 6 +- .../browser/files.contribution.i18n.json | 3 +- .../performance.contribution.i18n.json | 8 +- .../browser/preferencesRenderers.i18n.json | 1 + .../scm.contribution.i18n.json | 1 + .../scm/electron-browser/scmMenus.i18n.json | 1 + .../parts/tasks/browser/quickOpen.i18n.json | 4 +- .../tasks/browser/restartQuickOpen.i18n.json | 2 +- .../tasks/browser/taskQuickOpen.i18n.json | 2 +- .../terminalTaskSystem.i18n.json | 3 +- .../tasks/node/processTaskSystem.i18n.json | 3 +- .../terminalActions.i18n.json | 4 +- .../themes.contribution.i18n.json | 1 + .../vs_code_welcome_page.i18n.json | 7 + .../electron-browser/welcomePage.i18n.json | 18 +- .../configurationEditingService.i18n.json | 1 + .../markdown/out/extension.i18n.json | 6 + .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/kor/extensions/npm/package.i18n.json | 6 + .../resourceviewer/resourceViewer.i18n.json | 2 - .../config/commonEditorConfig.i18n.json | 1 - .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../main.contribution.i18n.json | 1 + .../extensionsUtils.i18n.json | 6 +- .../browser/files.contribution.i18n.json | 1 - .../performance.contribution.i18n.json | 6 +- .../electron-browser/welcomePage.i18n.json | 5 + .../out/settingsDocumentHelper.i18n.json | 36 ++++ .../css/client/out/cssMain.i18n.json | 8 + i18n/ptb/extensions/css/package.i18n.json | 67 +++++++ .../out/packageDocumentHelper.i18n.json | 9 + .../extensions/git/out/askpass-main.i18n.json | 8 + .../ptb/extensions/git/out/commands.i18n.json | 43 +++++ i18n/ptb/extensions/git/out/main.i18n.json | 11 ++ i18n/ptb/extensions/git/out/model.i18n.json | 14 ++ .../extensions/git/out/scmProvider.i18n.json | 8 + .../extensions/git/out/statusbar.i18n.json | 11 ++ i18n/ptb/extensions/git/package.i18n.json | 48 +++++ i18n/ptb/extensions/grunt/out/main.i18n.json | 8 + i18n/ptb/extensions/grunt/package.i18n.json | 8 + i18n/ptb/extensions/gulp/out/main.i18n.json | 8 + i18n/ptb/extensions/gulp/package.i18n.json | 8 + .../html/client/out/htmlMain.i18n.json | 8 + i18n/ptb/extensions/html/package.i18n.json | 27 +++ i18n/ptb/extensions/jake/out/main.i18n.json | 8 + i18n/ptb/extensions/jake/package.i18n.json | 8 + .../features/bowerJSONContribution.i18n.json | 10 ++ .../packageJSONContribution.i18n.json | 13 ++ .../json/client/out/jsonMain.i18n.json | 8 + i18n/ptb/extensions/json/package.i18n.json | 15 ++ .../markdown/out/extension.i18n.json | 6 + .../out/previewContentProvider.i18n.json | 10 ++ .../markdown/out/security.i18n.json | 11 ++ .../ptb/extensions/markdown/package.i18n.json | 22 +++ .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/ptb/extensions/npm/package.i18n.json | 6 + .../out/features/validationProvider.i18n.json | 13 ++ i18n/ptb/extensions/php/package.i18n.json | 14 ++ .../out/features/bufferSyncSupport.i18n.json | 12 ++ .../features/completionItemProvider.i18n.json | 9 + ...rectiveCommentCompletionProvider.i18n.json | 10 ++ .../implementationsCodeLensProvider.i18n.json | 10 ++ .../jsDocCompletionProvider.i18n.json | 8 + .../referencesCodeLensProvider.i18n.json | 10 ++ .../typescript/out/typescriptMain.i18n.json | 15 ++ .../out/typescriptServiceClient.i18n.json | 24 +++ .../typescript/out/utils/logger.i18n.json | 8 + .../out/utils/projectStatus.i18n.json | 12 ++ .../out/utils/typingsStatus.i18n.json | 12 ++ .../extensions/typescript/package.i18n.json | 45 +++++ .../browser/ui/actionbar/actionbar.i18n.json | 8 + .../vs/base/browser/ui/aria/aria.i18n.json | 8 + .../browser/ui/findinput/findInput.i18n.json | 8 + .../findinput/findInputCheckboxes.i18n.json | 10 ++ .../browser/ui/inputbox/inputBox.i18n.json | 10 ++ .../resourceviewer/resourceViewer.i18n.json | 15 ++ .../base/browser/ui/toolbar/toolbar.i18n.json | 8 + .../src/vs/base/common/errorMessage.i18n.json | 18 ++ .../base/common/jsonErrorMessages.i18n.json | 16 ++ .../src/vs/base/common/processes.i18n.json | 11 ++ .../ptb/src/vs/base/common/severity.i18n.json | 10 ++ i18n/ptb/src/vs/base/node/processes.i18n.json | 8 + i18n/ptb/src/vs/base/node/zip.i18n.json | 8 + .../browser/quickOpenModel.i18n.json | 9 + .../browser/quickOpenWidget.i18n.json | 9 + .../parts/tree/browser/treeDefaults.i18n.json | 8 + .../src/vs/code/electron-main/menus.i18n.json | 164 ++++++++++++++++++ .../vs/code/electron-main/window.i18n.json | 8 + .../vs/code/electron-main/windows.i18n.json | 22 +++ .../src/vs/code/node/cliProcessMain.i18n.json | 17 ++ .../config/commonEditorConfig.i18n.json | 76 ++++++++ .../common/config/editorOptions.i18n.json | 8 + .../editor/common/controller/cursor.i18n.json | 8 + .../model/textModelWithTokens.i18n.json | 8 + .../common/modes/modesRegistry.i18n.json | 8 + .../editor/common/services/bulkEdit.i18n.json | 11 ++ .../common/services/modeServiceImpl.i18n.json | 16 ++ .../services/modelServiceImpl.i18n.json | 9 + .../common/view/editorColorRegistry.i18n.json | 20 +++ .../browser/accessibility.i18n.json | 15 ++ .../common/bracketMatching.i18n.json | 8 + .../common/caretOperations.i18n.json | 9 + .../common/transpose.i18n.json | 8 + .../clipboard/browser/clipboard.i18n.json | 11 ++ .../contrib/comment/common/comment.i18n.json | 11 ++ .../contextmenu/browser/contextmenu.i18n.json | 8 + .../contrib/find/browser/findWidget.i18n.json | 21 +++ .../find/common/findController.i18n.json | 19 ++ .../contrib/folding/browser/folding.i18n.json | 14 ++ .../format/browser/formatActions.i18n.json | 13 ++ .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../gotoError/browser/gotoError.i18n.json | 13 ++ .../contrib/hover/browser/hover.i18n.json | 8 + .../hover/browser/modesContentHover.i18n.json | 8 + .../common/inPlaceReplace.i18n.json | 9 + .../indentation/common/indentation.i18n.json | 15 ++ .../inspectTMScopes.i18n.json | 9 + .../common/linesOperations.i18n.json | 25 +++ .../contrib/links/browser/links.i18n.json | 12 ++ .../multicursor/common/multicursor.i18n.json | 10 ++ .../browser/parameterHints.i18n.json | 8 + .../browser/parameterHintsWidget.i18n.json | 8 + .../browser/quickFixCommands.i18n.json | 10 ++ .../browser/referenceSearch.i18n.json | 9 + .../browser/referencesController.i18n.json | 8 + .../browser/referencesModel.i18n.json | 14 ++ .../browser/referencesWidget.i18n.json | 27 +++ .../contrib/rename/browser/rename.i18n.json | 11 ++ .../rename/browser/renameInputField.i18n.json | 8 + .../smartSelect/common/smartSelect.i18n.json | 9 + .../browser/suggestController.i18n.json | 9 + .../suggest/browser/suggestWidget.i18n.json | 21 +++ .../common/toggleTabFocusMode.i18n.json | 8 + .../common/wordHighlighter.i18n.json | 9 + .../browser/peekViewWidget.i18n.json | 8 + .../textMate/TMSyntax.i18n.json | 14 ++ ...guageConfigurationExtensionPoint.i18n.json | 23 +++ .../editor/node/textMate/TMGrammars.i18n.json | 13 ++ .../browser/menuItemActionItem.i18n.json | 8 + .../menusExtensionPoint.i18n.json | 41 +++++ .../common/configurationRegistry.i18n.json | 19 ++ .../platform/environment/node/argv.i18n.json | 32 ++++ .../extensionEnablementService.i18n.json | 8 + .../common/extensionManagement.i18n.json | 9 + .../node/extensionGalleryService.i18n.json | 9 + .../node/extensionManagementService.i18n.json | 22 +++ .../common/abstractExtensionService.i18n.json | 11 ++ .../common/extensionsRegistry.i18n.json | 24 +++ .../node/extensionValidator.i18n.json | 24 +++ .../node/integrityServiceImpl.i18n.json | 11 ++ .../jsonValidationExtensionPoint.i18n.json | 15 ++ .../abstractKeybindingService.i18n.json | 9 + .../common/keybindingLabels.i18n.json | 16 ++ .../markers/common/problemMatcher.i18n.json | 61 +++++++ .../platform/message/common/message.i18n.json | 10 ++ .../platform/request/node/request.i18n.json | 11 ++ .../common/telemetryService.i18n.json | 9 + .../theme/common/colorRegistry.i18n.json | 78 +++++++++ .../mainThreadExtensionService.i18n.json | 9 + .../mainThreadMessageService.i18n.json | 10 ++ .../api/node/extHostDiagnostics.i18n.json | 8 + .../api/node/extHostTreeViews.i18n.json | 10 ++ .../browser/actions/configureLocale.i18n.json | 13 ++ .../browser/actions/fileActions.i18n.json | 9 + .../toggleActivityBarVisibility.i18n.json | 9 + .../actions/toggleEditorLayout.i18n.json | 11 ++ .../actions/toggleSidebarPosition.i18n.json | 9 + .../actions/toggleSidebarVisibility.i18n.json | 9 + .../toggleStatusbarVisibility.i18n.json | 9 + .../browser/actions/toggleZenMode.i18n.json | 9 + .../activitybar/activitybarActions.i18n.json | 14 ++ .../activitybar/activitybarPart.i18n.json | 9 + .../browser/parts/compositePart.i18n.json | 9 + .../parts/editor/binaryDiffEditor.i18n.json | 8 + .../parts/editor/binaryEditor.i18n.json | 8 + .../editor/editor.contribution.i18n.json | 16 ++ .../parts/editor/editorActions.i18n.json | 55 ++++++ .../parts/editor/editorCommands.i18n.json | 12 ++ .../browser/parts/editor/editorPart.i18n.json | 14 ++ .../parts/editor/editorPicker.i18n.json | 13 ++ .../parts/editor/editorStatus.i18n.json | 49 ++++++ .../parts/editor/tabsTitleControl.i18n.json | 8 + .../parts/editor/textDiffEditor.i18n.json | 16 ++ .../browser/parts/editor/textEditor.i18n.json | 8 + .../parts/editor/textResourceEditor.i18n.json | 12 ++ .../parts/editor/titleControl.i18n.json | 14 ++ .../parts/panel/panelActions.i18n.json | 15 ++ .../browser/parts/panel/panelPart.i18n.json | 8 + .../quickopen/quickOpenController.i18n.json | 17 ++ .../quickopen.contribution.i18n.json | 12 ++ .../parts/sidebar/sidebarPart.i18n.json | 9 + .../parts/statusbar/statusbarPart.i18n.json | 9 + .../parts/titlebar/titlebarPart.i18n.json | 9 + .../vs/workbench/browser/quickopen.i18n.json | 11 ++ .../vs/workbench/browser/viewlet.i18n.json | 9 + .../src/vs/workbench/common/theme.i18n.json | 44 +++++ .../electron-browser/actions.i18n.json | 41 +++++ .../electron-browser/commands.i18n.json | 8 + .../electron-browser/crashReporter.i18n.json | 9 + .../electron-browser/extensionHost.i18n.json | 11 ++ .../main.contribution.i18n.json | 62 +++++++ .../workbench/electron-browser/main.i18n.json | 9 + .../electron-browser/shell.i18n.json | 8 + .../electron-browser/window.i18n.json | 15 ++ .../node/extensionHostMain.i18n.json | 8 + .../workbench/node/extensionPoints.i18n.json | 11 ++ .../cli.contribution.i18n.json | 18 ++ .../inspectKeybindings.i18n.json | 8 + .../toggleRenderControlCharacter.i18n.json | 8 + .../toggleRenderWhitespace.i18n.json | 8 + .../electron-browser/toggleWordWrap.i18n.json | 11 ++ .../wordWrapMigration.i18n.json | 11 ++ .../debug/browser/breakpointWidget.i18n.json | 13 ++ .../debug/browser/debugActionItems.i18n.json | 9 + .../debug/browser/debugActions.i18n.json | 49 ++++++ .../browser/debugActionsWidget.i18n.json | 8 + .../browser/debugContentProvider.i18n.json | 8 + .../browser/debugEditorActions.i18n.json | 15 ++ .../browser/debugEditorModelManager.i18n.json | 11 ++ .../debug/browser/debugQuickOpen.i18n.json | 11 ++ .../debug/browser/exceptionWidget.i18n.json | 11 ++ .../debug/browser/linkDetector.i18n.json | 9 + .../parts/debug/common/debug.i18n.json | 8 + .../parts/debug/common/debugModel.i18n.json | 9 + .../parts/debug/common/debugSource.i18n.json | 8 + .../debug.contribution.i18n.json | 20 +++ .../electron-browser/debugCommands.i18n.json | 8 + .../debugConfigurationManager.i18n.json | 38 ++++ .../debugEditorContribution.i18n.json | 20 +++ .../electron-browser/debugHover.i18n.json | 8 + .../electron-browser/debugService.i18n.json | 25 +++ .../electron-browser/debugViewer.i18n.json | 28 +++ .../electron-browser/debugViews.i18n.json | 20 +++ .../electronDebugActions.i18n.json | 11 ++ .../rawDebugSession.i18n.json | 12 ++ .../debug/electron-browser/repl.i18n.json | 11 ++ .../electron-browser/replViewer.i18n.json | 12 ++ .../statusbarColorProvider.i18n.json | 8 + .../terminalSupport.i18n.json | 9 + .../parts/debug/node/debugAdapter.i18n.json | 20 +++ .../actions/showEmmetCommands.i18n.json | 8 + .../actions/balance.i18n.json | 9 + .../actions/editPoints.i18n.json | 9 + .../actions/evaluateMath.i18n.json | 8 + .../actions/expandAbbreviation.i18n.json | 8 + .../actions/incrementDecrement.i18n.json | 13 ++ .../actions/matchingPair.i18n.json | 8 + .../actions/mergeLines.i18n.json | 8 + .../actions/reflectCssValue.i18n.json | 8 + .../actions/removeTag.i18n.json | 8 + .../actions/selectItem.i18n.json | 9 + .../actions/splitJoinTag.i18n.json | 8 + .../actions/toggleComment.i18n.json | 8 + .../actions/updateImageSize.i18n.json | 8 + .../actions/updateTag.i18n.json | 10 ++ .../actions/wrapWithAbbreviation.i18n.json | 10 ++ .../emmet.contribution.i18n.json | 13 ++ .../terminal.contribution.i18n.json | 15 ++ .../terminalService.i18n.json | 12 ++ .../treeExplorer.contribution.i18n.json | 14 ++ .../browser/treeExplorerActions.i18n.json | 8 + .../browser/treeExplorerService.i18n.json | 8 + .../browser/views/treeExplorerView.i18n.json | 8 + .../browser/dependenciesViewer.i18n.json | 9 + .../browser/extensionEditor.i18n.json | 39 +++++ .../browser/extensionsActions.i18n.json | 55 ++++++ .../browser/extensionsQuickOpen.i18n.json | 10 ++ .../common/extensionsFileTemplate.i18n.json | 10 ++ .../common/extensionsInput.i18n.json | 8 + .../extensionTipsService.i18n.json | 16 ++ .../extensions.contribution.i18n.json | 15 ++ .../extensionsActions.i18n.json | 11 ++ .../extensionsUtils.i18n.json | 10 ++ .../extensionsViewlet.i18n.json | 15 ++ .../node/extensionsWorkbenchService.i18n.json | 17 ++ .../electron-browser/feedback.i18n.json | 25 +++ .../editors/binaryFileEditor.i18n.json | 8 + .../browser/editors/textFileEditor.i18n.json | 11 ++ .../fileActions.contribution.i18n.json | 11 ++ .../parts/files/browser/fileActions.i18n.json | 73 ++++++++ .../files/browser/fileCommands.i18n.json | 9 + .../browser/files.contribution.i18n.json | 40 +++++ .../files/browser/saveErrorHandler.i18n.json | 16 ++ .../files/browser/views/emptyView.i18n.json | 11 ++ .../browser/views/explorerView.i18n.json | 9 + .../browser/views/explorerViewer.i18n.json | 12 ++ .../browser/views/openEditorsView.i18n.json | 11 ++ .../browser/views/openEditorsViewer.i18n.json | 13 ++ .../files/common/dirtyFilesTracker.i18n.json | 8 + .../common/editors/fileEditorInput.i18n.json | 8 + .../html/browser/html.contribution.i18n.json | 8 + .../html/browser/htmlPreviewPart.i18n.json | 8 + .../parts/html/browser/webview.i18n.json | 8 + .../parts/markers/common/messages.i18n.json | 39 +++++ .../markersElectronContributions.i18n.json | 8 + .../nps.contribution.i18n.json | 11 ++ .../browser/output.contribution.i18n.json | 10 ++ .../output/browser/outputActions.i18n.json | 11 ++ .../output/browser/outputPanel.i18n.json | 9 + .../parts/output/common/output.i18n.json | 9 + .../performance.contribution.i18n.json | 15 ++ .../browser/keybindingWidgets.i18n.json | 9 + .../browser/keybindingsEditor.i18n.json | 35 ++++ .../keybindingsEditorContribution.i18n.json | 10 ++ .../preferences.contribution.i18n.json | 10 ++ .../browser/preferencesActions.i18n.json | 14 ++ .../browser/preferencesEditor.i18n.json | 15 ++ .../browser/preferencesRenderers.i18n.json | 13 ++ .../browser/preferencesService.i18n.json | 13 ++ .../browser/preferencesWidgets.i18n.json | 10 ++ .../common/keybindingsEditorModel.i18n.json | 11 ++ .../common/preferencesModels.i18n.json | 9 + .../browser/commandsHandler.i18n.json | 16 ++ .../browser/gotoLineHandler.i18n.json | 14 ++ .../browser/gotoSymbolHandler.i18n.json | 34 ++++ .../quickopen/browser/helpHandler.i18n.json | 10 ++ .../browser/quickopen.contribution.i18n.json | 14 ++ .../browser/viewPickerHandler.i18n.json | 15 ++ .../scm.contribution.i18n.json | 12 ++ .../electron-browser/scmActivity.i18n.json | 8 + .../scm/electron-browser/scmMenus.i18n.json | 9 + .../scm/electron-browser/scmViewlet.i18n.json | 10 ++ .../browser/openAnythingHandler.i18n.json | 9 + .../search/browser/openFileHandler.i18n.json | 9 + .../browser/openSymbolHandler.i18n.json | 11 ++ .../browser/patternInputWidget.i18n.json | 12 ++ .../search/browser/replaceService.i18n.json | 8 + .../browser/search.contribution.i18n.json | 22 +++ .../search/browser/searchActions.i18n.json | 21 +++ .../browser/searchResultsView.i18n.json | 12 ++ .../search/browser/searchViewlet.i18n.json | 50 ++++++ .../search/browser/searchWidget.i18n.json | 15 ++ .../electron-browser/TMSnippets.i18n.json | 13 ++ .../electron-browser/insertSnippet.i18n.json | 8 + .../snippets.contribution.i18n.json | 16 ++ .../snippetsService.i18n.json | 9 + .../electron-browser/tabCompletion.i18n.json | 8 + .../parts/tasks/browser/quickOpen.i18n.json | 10 ++ .../tasks/browser/restartQuickOpen.i18n.json | 10 ++ .../tasks/browser/taskQuickOpen.i18n.json | 10 ++ .../browser/terminateQuickOpen.i18n.json | 10 ++ .../tasks/common/taskConfiguration.i18n.json | 17 ++ .../tasks/common/taskTemplates.i18n.json | 13 ++ .../jsonSchemaCommon.i18n.json | 38 ++++ .../electron-browser/jsonSchema_v1.i18n.json | 12 ++ .../electron-browser/jsonSchema_v2.i18n.json | 14 ++ .../task.contribution.i18n.json | 47 +++++ .../terminalTaskSystem.i18n.json | 11 ++ .../node/processRunnerDetector.i18n.json | 15 ++ .../tasks/node/processTaskSystem.i18n.json | 12 ++ .../terminal.contribution.i18n.json | 30 ++++ .../terminalActions.i18n.json | 32 ++++ .../terminalColorRegistry.i18n.json | 10 ++ .../terminalConfigHelper.i18n.json | 10 ++ .../terminalInstance.i18n.json | 11 ++ .../terminalLinkHandler.i18n.json | 9 + .../electron-browser/terminalPanel.i18n.json | 11 ++ .../terminalService.i18n.json | 15 ++ .../themes.contribution.i18n.json | 19 ++ ...edWorkspaceSettings.contribution.i18n.json | 11 ++ .../releaseNotesInput.i18n.json | 8 + .../update.contribution.i18n.json | 10 ++ .../update/electron-browser/update.i18n.json | 19 ++ .../electron-browser/watermark.i18n.json | 24 +++ .../overlay/browser/welcomeOverlay.i18n.json | 17 ++ .../vs_code_welcome_page.i18n.json | 44 +++++ .../welcomePage.contribution.i18n.json | 10 ++ .../electron-browser/welcomePage.i18n.json | 31 ++++ .../editor/editorWalkThrough.i18n.json | 9 + .../walkThrough.contribution.i18n.json | 10 ++ .../walkThroughActions.i18n.json | 11 ++ .../walkThroughPart.i18n.json | 10 ++ .../configurationEditingService.i18n.json | 17 ++ .../editor/browser/editorService.i18n.json | 8 + .../electron-browser/fileService.i18n.json | 11 ++ .../services/files/node/fileService.i18n.json | 14 ++ .../common/keybindingEditing.i18n.json | 11 ++ .../keybindingService.i18n.json | 26 +++ .../message/browser/messageList.i18n.json | 14 ++ .../electron-browser/messageService.i18n.json | 9 + .../common/workbenchModeService.i18n.json | 16 ++ .../common/textFileEditorModel.i18n.json | 9 + .../textfile/common/textFileService.i18n.json | 8 + .../textFileService.i18n.json | 18 ++ .../themes/common/colorThemeSchema.i18n.json | 11 ++ .../common/fileIconThemeSchema.i18n.json | 37 ++++ .../electron-browser/colorThemeData.i18n.json | 13 ++ .../workbenchThemeService.i18n.json | 32 ++++ .../markdown/out/extension.i18n.json | 6 + .../out/codelensProvider.i18n.json | 6 + .../out/commandHandler.i18n.json | 6 + .../out/mergeDecorator.i18n.json | 6 + .../merge-conflict/package.i18n.json | 6 + i18n/rus/extensions/npm/package.i18n.json | 6 + .../resourceviewer/resourceViewer.i18n.json | 2 - .../src/vs/code/electron-main/menus.i18n.json | 2 + .../config/commonEditorConfig.i18n.json | 1 - .../browser/goToDeclarationCommands.i18n.json | 23 +++ .../browser/goToDeclarationMouse.i18n.json | 8 + .../main.contribution.i18n.json | 1 + .../extensionsUtils.i18n.json | 6 +- .../browser/files.contribution.i18n.json | 1 - .../performance.contribution.i18n.json | 6 +- .../electron-browser/welcomePage.i18n.json | 5 + 587 files changed, 6511 insertions(+), 128 deletions(-) create mode 100644 build/win32/i18n/messages.pt-br.isl create mode 100644 i18n/chs/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/chs/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/chs/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/chs/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/chs/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/chs/extensions/npm/package.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json create mode 100644 i18n/cht/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/cht/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/cht/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/cht/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/cht/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/cht/extensions/npm/package.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/cht/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json create mode 100644 i18n/deu/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/deu/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/deu/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/deu/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/deu/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/deu/extensions/npm/package.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/deu/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json create mode 100644 i18n/esn/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/esn/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/esn/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/esn/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/esn/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/esn/extensions/npm/package.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/esn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json create mode 100644 i18n/fra/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/fra/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/fra/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/fra/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/fra/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/fra/extensions/npm/package.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/fra/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json create mode 100644 i18n/ita/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/ita/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/ita/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/ita/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/ita/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/ita/extensions/npm/package.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/ita/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json create mode 100644 i18n/jpn/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/jpn/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/jpn/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/jpn/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/jpn/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/jpn/extensions/npm/package.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/jpn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json create mode 100644 i18n/kor/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/kor/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/kor/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/kor/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/kor/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/kor/extensions/npm/package.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/kor/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json create mode 100644 i18n/ptb/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json create mode 100644 i18n/ptb/extensions/css/client/out/cssMain.i18n.json create mode 100644 i18n/ptb/extensions/css/package.i18n.json create mode 100644 i18n/ptb/extensions/extension-editing/out/packageDocumentHelper.i18n.json create mode 100644 i18n/ptb/extensions/git/out/askpass-main.i18n.json create mode 100644 i18n/ptb/extensions/git/out/commands.i18n.json create mode 100644 i18n/ptb/extensions/git/out/main.i18n.json create mode 100644 i18n/ptb/extensions/git/out/model.i18n.json create mode 100644 i18n/ptb/extensions/git/out/scmProvider.i18n.json create mode 100644 i18n/ptb/extensions/git/out/statusbar.i18n.json create mode 100644 i18n/ptb/extensions/git/package.i18n.json create mode 100644 i18n/ptb/extensions/grunt/out/main.i18n.json create mode 100644 i18n/ptb/extensions/grunt/package.i18n.json create mode 100644 i18n/ptb/extensions/gulp/out/main.i18n.json create mode 100644 i18n/ptb/extensions/gulp/package.i18n.json create mode 100644 i18n/ptb/extensions/html/client/out/htmlMain.i18n.json create mode 100644 i18n/ptb/extensions/html/package.i18n.json create mode 100644 i18n/ptb/extensions/jake/out/main.i18n.json create mode 100644 i18n/ptb/extensions/jake/package.i18n.json create mode 100644 i18n/ptb/extensions/javascript/out/features/bowerJSONContribution.i18n.json create mode 100644 i18n/ptb/extensions/javascript/out/features/packageJSONContribution.i18n.json create mode 100644 i18n/ptb/extensions/json/client/out/jsonMain.i18n.json create mode 100644 i18n/ptb/extensions/json/package.i18n.json create mode 100644 i18n/ptb/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/ptb/extensions/markdown/out/previewContentProvider.i18n.json create mode 100644 i18n/ptb/extensions/markdown/out/security.i18n.json create mode 100644 i18n/ptb/extensions/markdown/package.i18n.json create mode 100644 i18n/ptb/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/ptb/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/ptb/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/ptb/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/ptb/extensions/npm/package.i18n.json create mode 100644 i18n/ptb/extensions/php/out/features/validationProvider.i18n.json create mode 100644 i18n/ptb/extensions/php/package.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/features/bufferSyncSupport.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/features/completionItemProvider.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/features/implementationsCodeLensProvider.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/features/jsDocCompletionProvider.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/features/referencesCodeLensProvider.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/typescriptMain.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/typescriptServiceClient.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/utils/logger.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/utils/projectStatus.i18n.json create mode 100644 i18n/ptb/extensions/typescript/out/utils/typingsStatus.i18n.json create mode 100644 i18n/ptb/extensions/typescript/package.i18n.json create mode 100644 i18n/ptb/src/vs/base/browser/ui/actionbar/actionbar.i18n.json create mode 100644 i18n/ptb/src/vs/base/browser/ui/aria/aria.i18n.json create mode 100644 i18n/ptb/src/vs/base/browser/ui/findinput/findInput.i18n.json create mode 100644 i18n/ptb/src/vs/base/browser/ui/findinput/findInputCheckboxes.i18n.json create mode 100644 i18n/ptb/src/vs/base/browser/ui/inputbox/inputBox.i18n.json create mode 100644 i18n/ptb/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json create mode 100644 i18n/ptb/src/vs/base/browser/ui/toolbar/toolbar.i18n.json create mode 100644 i18n/ptb/src/vs/base/common/errorMessage.i18n.json create mode 100644 i18n/ptb/src/vs/base/common/jsonErrorMessages.i18n.json create mode 100644 i18n/ptb/src/vs/base/common/processes.i18n.json create mode 100644 i18n/ptb/src/vs/base/common/severity.i18n.json create mode 100644 i18n/ptb/src/vs/base/node/processes.i18n.json create mode 100644 i18n/ptb/src/vs/base/node/zip.i18n.json create mode 100644 i18n/ptb/src/vs/base/parts/quickopen/browser/quickOpenModel.i18n.json create mode 100644 i18n/ptb/src/vs/base/parts/quickopen/browser/quickOpenWidget.i18n.json create mode 100644 i18n/ptb/src/vs/base/parts/tree/browser/treeDefaults.i18n.json create mode 100644 i18n/ptb/src/vs/code/electron-main/menus.i18n.json create mode 100644 i18n/ptb/src/vs/code/electron-main/window.i18n.json create mode 100644 i18n/ptb/src/vs/code/electron-main/windows.i18n.json create mode 100644 i18n/ptb/src/vs/code/node/cliProcessMain.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/config/editorOptions.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/controller/cursor.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/model/textModelWithTokens.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/modes/modesRegistry.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/services/bulkEdit.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/services/modeServiceImpl.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/services/modelServiceImpl.i18n.json create mode 100644 i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/accessibility/browser/accessibility.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/bracketMatching/common/bracketMatching.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/caretOperations/common/caretOperations.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/caretOperations/common/transpose.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/clipboard/browser/clipboard.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/comment/common/comment.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/contextmenu/browser/contextmenu.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/find/browser/findWidget.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/find/common/findController.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/folding/browser/folding.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/format/browser/formatActions.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/hover/browser/hover.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/hover/browser/modesContentHover.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/indentation/common/indentation.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/linesOperations/common/linesOperations.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/links/browser/links.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/multicursor/common/multicursor.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/parameterHints/browser/parameterHints.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/quickFix/browser/quickFixCommands.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referenceSearch.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesController.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/rename/browser/rename.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/rename/browser/renameInputField.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/smartSelect/common/smartSelect.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/suggest/browser/suggestController.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/toggleTabFocusMode/common/toggleTabFocusMode.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.i18n.json create mode 100644 i18n/ptb/src/vs/editor/contrib/zoneWidget/browser/peekViewWidget.i18n.json create mode 100644 i18n/ptb/src/vs/editor/electron-browser/textMate/TMSyntax.i18n.json create mode 100644 i18n/ptb/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json create mode 100644 i18n/ptb/src/vs/editor/node/textMate/TMGrammars.i18n.json create mode 100644 i18n/ptb/src/vs/platform/actions/browser/menuItemActionItem.i18n.json create mode 100644 i18n/ptb/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json create mode 100644 i18n/ptb/src/vs/platform/configuration/common/configurationRegistry.i18n.json create mode 100644 i18n/ptb/src/vs/platform/environment/node/argv.i18n.json create mode 100644 i18n/ptb/src/vs/platform/extensionManagement/common/extensionEnablementService.i18n.json create mode 100644 i18n/ptb/src/vs/platform/extensionManagement/common/extensionManagement.i18n.json create mode 100644 i18n/ptb/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json create mode 100644 i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json create mode 100644 i18n/ptb/src/vs/platform/extensions/common/abstractExtensionService.i18n.json create mode 100644 i18n/ptb/src/vs/platform/extensions/common/extensionsRegistry.i18n.json create mode 100644 i18n/ptb/src/vs/platform/extensions/node/extensionValidator.i18n.json create mode 100644 i18n/ptb/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json create mode 100644 i18n/ptb/src/vs/platform/jsonschemas/common/jsonValidationExtensionPoint.i18n.json create mode 100644 i18n/ptb/src/vs/platform/keybinding/common/abstractKeybindingService.i18n.json create mode 100644 i18n/ptb/src/vs/platform/keybinding/common/keybindingLabels.i18n.json create mode 100644 i18n/ptb/src/vs/platform/markers/common/problemMatcher.i18n.json create mode 100644 i18n/ptb/src/vs/platform/message/common/message.i18n.json create mode 100644 i18n/ptb/src/vs/platform/request/node/request.i18n.json create mode 100644 i18n/ptb/src/vs/platform/telemetry/common/telemetryService.i18n.json create mode 100644 i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/api/node/extHostDiagnostics.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/api/node/extHostTreeViews.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/actions/configureLocale.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/actions/fileActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/actions/toggleActivityBarVisibility.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/actions/toggleEditorLayout.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/actions/toggleSidebarPosition.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/actions/toggleSidebarVisibility.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/actions/toggleStatusbarVisibility.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/actions/toggleZenMode.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/activitybar/activitybarPart.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/compositePart.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/binaryDiffEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/binaryEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/editor.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/editorActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/editorPart.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/editorPicker.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/tabsTitleControl.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/textDiffEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/textEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/textResourceEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/editor/titleControl.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/panel/panelActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/panel/panelPart.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickopen.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/sidebar/sidebarPart.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/statusbar/statusbarPart.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/parts/titlebar/titlebarPart.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/quickopen.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/browser/viewlet.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/common/theme.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/electron-browser/commands.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/electron-browser/crashReporter.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/electron-browser/extensionHost.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/electron-browser/main.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/electron-browser/shell.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/electron-browser/window.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/node/extensionHostMain.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/node/extensionPoints.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/cli/electron-browser/cli.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/wordWrapMigration.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointWidget.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/debugActionItems.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/debugContentProvider.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorModelManager.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/debugQuickOpen.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/exceptionWidget.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/common/debug.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/common/debugModel.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/common/debugSource.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugHover.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugViewer.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugViews.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/repl.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/browser/actions/showEmmetCommands.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/execution/electron-browser/terminal.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorerActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorerService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/explorers/browser/views/treeExplorerView.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/browser/dependenciesViewer.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/common/extensionsFileTemplate.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/common/extensionsInput.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/feedback/electron-browser/feedback.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/editors/binaryFileEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/fileCommands.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/saveErrorHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/views/emptyView.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/views/explorerView.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/views/explorerViewer.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/browser/views/openEditorsViewer.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/files/common/editors/fileEditorInput.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/html/browser/html.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/html/browser/htmlPreviewPart.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/html/browser/webview.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/markers/common/messages.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markersElectronContributions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/nps/electron-browser/nps.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/output/browser/output.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/output/browser/outputActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/output/browser/outputPanel.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/output/common/output.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/browser/preferences.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/preferences/common/preferencesModels.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/quickopen/browser/helpHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/quickopen/browser/quickopen.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmActivity.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/openAnythingHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/openFileHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/openSymbolHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/replaceService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/search.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/searchActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/searchViewlet.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/search/browser/searchWidget.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/tabCompletion.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/browser/terminateQuickOpen.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/common/taskConfiguration.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/common/taskTemplates.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v1.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/node/processRunnerDetector.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/editorWalkThrough.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughActions.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/editor/browser/editorService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/files/electron-browser/fileService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/files/node/fileService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/keybinding/common/keybindingEditing.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/message/browser/messageList.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/message/electron-browser/messageService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/textfile/common/textFileEditorModel.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/textfile/common/textFileService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/textfile/electron-browser/textFileService.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json create mode 100644 i18n/rus/extensions/markdown/out/extension.i18n.json create mode 100644 i18n/rus/extensions/merge-conflict/out/codelensProvider.i18n.json create mode 100644 i18n/rus/extensions/merge-conflict/out/commandHandler.i18n.json create mode 100644 i18n/rus/extensions/merge-conflict/out/mergeDecorator.i18n.json create mode 100644 i18n/rus/extensions/merge-conflict/package.i18n.json create mode 100644 i18n/rus/extensions/npm/package.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json create mode 100644 i18n/rus/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json diff --git a/build/win32/i18n/messages.pt-br.isl b/build/win32/i18n/messages.pt-br.isl new file mode 100644 index 00000000000..7021e814e8f --- /dev/null +++ b/build/win32/i18n/messages.pt-br.isl @@ -0,0 +1,8 @@ +[CustomMessages] +AddContextMenuFiles=Adicione a ao "Abrir com %1" ao menu de contexto de arquivo do Windows Explorer +AddContextMenuFolders=Adicione a ao "Abrir com %1" ao menu de contexto de diretrio do Windows Explorer +AssociateWithFiles=Registre %1 como um editor para tipos de arquivos suportados +AddToPath=Adicione em PATH (disponvel aps reiniciar) +RunAfter=Executar %1 aps a instalao +Other=Outros: +SourceFile=Arquivo Fonte %1 \ No newline at end of file diff --git a/i18n/chs/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json b/i18n/chs/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json index 6ad910135a0..f40aa81fa48 100644 --- a/i18n/chs/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json +++ b/i18n/chs/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json @@ -5,7 +5,7 @@ // Do not edit this file. It is machine generated. { "activeEditorShort": "例如 myFile.txt", - "activeEditorMedium": "e.g. myFolder/myFile.txt", + "activeEditorMedium": "例如 myFolder/myFile.txt", "activeEditorLong": "例如 /Users/Development/myProject/myFolder/myFile.txt", "rootName": "例如 myProject", "rootPath": "例如 /Users/Development/myProject", diff --git a/i18n/chs/extensions/gulp/out/main.i18n.json b/i18n/chs/extensions/gulp/out/main.i18n.json index 500082cf82f..bda8a250c25 100644 --- a/i18n/chs/extensions/gulp/out/main.i18n.json +++ b/i18n/chs/extensions/gulp/out/main.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "execFailed": "自动检测 gulp 失败,错误为: {0}" + "execFailed": "自动检测 gulp 失败,错误:{0}" } \ No newline at end of file diff --git a/i18n/chs/extensions/jake/out/main.i18n.json b/i18n/chs/extensions/jake/out/main.i18n.json index 8b6ad71cd4e..d2f56bdda98 100644 --- a/i18n/chs/extensions/jake/out/main.i18n.json +++ b/i18n/chs/extensions/jake/out/main.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "execFailed": "自动检测 Jake 失败,错误:{0}" +} \ No newline at end of file diff --git a/i18n/chs/extensions/jake/package.i18n.json b/i18n/chs/extensions/jake/package.i18n.json index 8b6ad71cd4e..46f020cf890 100644 --- a/i18n/chs/extensions/jake/package.i18n.json +++ b/i18n/chs/extensions/jake/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.jake.autoDetect": "控制自动检测 Jake 任务是否打开。默认开启。" +} \ No newline at end of file diff --git a/i18n/chs/extensions/markdown/out/extension.i18n.json b/i18n/chs/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/chs/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/chs/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/chs/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/extensions/merge-conflict/package.i18n.json b/i18n/chs/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/extensions/npm/package.i18n.json b/i18n/chs/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/chs/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index 7b395b9c15a..4e5bf82d935 100644 --- a/i18n/chs/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/chs/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,8 +6,6 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "图像太大,无法在编辑器中显示。 ", - "resourceOpenExternalButton": "打开图片", - "resourceOpenExternalText": " 是否使用外部程序?", "nativeBinaryError": "文件将不在编辑器中显示,因为它是二进制文件、非常大或使用不支持的文本编码。", "sizeB": "{0} B", "sizeKB": "{0} KB", diff --git a/i18n/chs/src/vs/code/electron-main/menus.i18n.json b/i18n/chs/src/vs/code/electron-main/menus.i18n.json index 16b5dc1479a..4f7e61e056c 100644 --- a/i18n/chs/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/chs/src/vs/code/electron-main/menus.i18n.json @@ -146,7 +146,7 @@ "miInteractivePlayground": "交互式演练场(&&I)", "miDocumentation": "文档(&&D)", "miReleaseNotes": "发行说明(&&R)", - "miKeyboardShortcuts": "键盘快捷方式参考(&&K)", + "miKeyboardShortcuts": "快捷键参考(&&K)", "miIntroductoryVideos": "介绍性视频(&&V)", "miTwitter": "在 Twitter 上加入我们(&&J)", "miUserVoice": "搜索功能请求(&&S)", @@ -159,6 +159,6 @@ "miDownloadingUpdate": "正在下载更新...", "miInstallingUpdate": "正在安装更新...", "miCheckForUpdates": "检查更新...", - "aboutDetail": "\n版本 {0}\n提交 {1}\n日期 {2}\nShell {3}\n呈现器 {4}\nNode {5}", + "aboutDetail": "\n版本 {0}\n提交 {1}\n日期 {2}\nShell {3}\n渲染器 {4}\nNode {5}", "okButton": "确定" } \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json index ad55e59f4eb..5c4e0b1ea13 100644 --- a/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/chs/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -14,7 +14,7 @@ "rulers": "显示垂直标尺的列", "wordSeparators": "执行文字相关的导航或操作时将用作文字分隔符的字符", "tabSize": "一个制表符等于的空格数。该设置在 `editor.detectIndentation` 启用时根据文件内容进行重写。", - "tabSize.errorMessage": "应为 \\\\\"number\\\\\"。注意,值\\\\\"auto\\\\\"已由 \\\\\"editor.detectIndentation\\\\\" 设置替换。", + "tabSize.errorMessage": "应为“number”。注意,值“auto”已由“editor.detectIndentation”设置替换。", "insertSpaces": "按 \"Tab\" 时插入空格。该设置在 `editor.detectIndentation` 启用时根据文件内容进行重写。", "insertSpaces.errorMessage": "应为 \"boolean\"。注意,值 \"auto\" 已由 \"editor.detectIndentation\" 设置替换。", "detectIndentation": "当打开文件时,将基于文件内容检测 \"editor.tabSize\" 和 \"editor.insertSpaces\"。", @@ -29,7 +29,7 @@ "wordWrap.bounded": "将在最小视区和 \"editor.wordWrapColumn\" 处换行。", "wordWrap": "控制折行方式。可以选择: - “off” (禁用折行), - “on” (视区折行), - “wordWrapColumn”(在“editor.wordWrapColumn”处折行)或 - “bounded”(在视区与“editor.wordWrapColumn”两者的较小者处折行)。", "wordWrapColumn": "在 \"editor.wordWrap\" 为 \"wordWrapColumn\" 或 \"bounded\" 时控制编辑器列的换行。", - "wrappingIndent": "控制换行的行的缩进。可以是\\\\\"none\\\\\"、 \\\\\"same\\\\\" 或 \\\\\"indent\\\\\"。", + "wrappingIndent": "控制折行的缩进。可以是“none”、“same”或“indent”。", "mouseWheelScrollSensitivity": "要对鼠标滚轮滚动事件的 \"deltaX\" 和 \"deltaY\" 使用的乘数 ", "quickSuggestions.strings": "在字符串内启用快速建议。", "quickSuggestions.comments": "在注释内启用快速建议。", @@ -41,7 +41,6 @@ "formatOnType": "控制编辑器是否应在键入后自动设置行的格式", "formatOnPaste": "控制编辑器是否应自动设置粘贴内容的格式。格式化程序必须可用并且能设置文档中某一范围的格式。", "suggestOnTriggerCharacters": "控制键入触发器字符时是否应自动显示建议", - "acceptSuggestionOnEnter": "控制除了 \"Tab\" 键以外,是否还应在遇到 \"Enter\" 键时接受建议。帮助避免“插入新行”或“接受建议”之间出现歧义。", "acceptSuggestionOnCommitCharacter": "控制是否应在遇到提交字符时接受建议。例如,在 JavaScript 中,分号(\";\")可以为提交字符,可接受建议并键入该字符。", "snippetSuggestions": "控制是否将代码段与其他建议一起显示以及它们的排序方式。", "emptySelectionClipboard": "控制没有选择内容的复制是否复制当前行。", @@ -63,6 +62,7 @@ "renderLineHighlight": "控制编辑器应如何呈现当前行突出显示,可能为“无”、“装订线”、“线”和“全部”。", "codeLens": "控制编辑器是否显示代码滤镜", "folding": "控制编辑器是否启用代码折叠功能", + "showFoldingControls": "控制是否自动隐藏导航线上的折叠控件。", "matchBrackets": "当选择其中一项时,将突出显示匹配的括号。", "glyphMargin": "控制编辑器是否应呈现垂直字形边距。字形边距最常用于调试。", "useTabStops": "在制表位后插入和删除空格", diff --git a/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..e788771d2f2 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "未找到“{0}”的任何定义", + "generic.noResults": "找不到定义", + "meta.title": " – {0} 定义", + "actions.goToDecl.label": "转到定义", + "actions.goToDeclToSide.label": "打开侧边的定义", + "actions.previewDecl.label": "查看定义", + "goToImplementation.noResultWord": "未找到“{0}”的实现", + "goToImplementation.generic.noResults": "未找到实现", + "meta.implementations.title": "– {0} 个实现", + "actions.goToImplementation.label": "转到实现", + "actions.peekImplementation.label": "速览实现", + "goToTypeDefinition.noResultWord": "未找到“{0}”的类型定义", + "goToTypeDefinition.generic.noResults": "未找到类型定义", + "meta.typeDefinitions.title": " – {0} 个类型定义", + "actions.goToTypeDefinition.label": "转到类型定义", + "actions.peekTypeDefinition.label": "快速查看类型定义" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..ab0b4761cf9 --- /dev/null +++ b/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "单击显示 {0} 个定义。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/indentation/common/indentation.i18n.json b/i18n/chs/src/vs/editor/contrib/indentation/common/indentation.i18n.json index 76fa4543d53..5bd5906da32 100644 --- a/i18n/chs/src/vs/editor/contrib/indentation/common/indentation.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/indentation/common/indentation.i18n.json @@ -8,7 +8,7 @@ "indentationToTabs": "将缩进转换为制表符", "configuredTabSize": "已配置制表符大小", "selectTabWidth": "选择当前文件的制表符大小", - "indentUsingTabs": "使用 \\\\\"Tab\\\\\" 缩进", + "indentUsingTabs": "使用“Tab”缩进", "indentUsingSpaces": "使用空格缩进", "detectIndentation": "检查内容中的缩进", "editor.reindentlines": "重新缩进行" diff --git a/i18n/chs/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/chs/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index 4e1a0a30e42..ec34ba659f1 100644 --- a/i18n/chs/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -9,7 +9,7 @@ "editorSuggestWidgetForeground": "建议小组件的前景颜色。", "editorSuggestWidgetSelectedBackground": "建议小组件中被选择条目的背景颜色。", "editorSuggestWidgetHighlightForeground": "建议小组件中匹配内容的高亮颜色。", - "readMore": "阅读更多...{0}", + "readMore": "阅读详细信息...{0}", "suggestionWithDetailsAriaLabel": "{0}(建议)具有详细信息", "suggestionAriaLabel": "{0},建议", "readLess": "阅读简略信息...{0}", diff --git a/i18n/chs/src/vs/platform/configuration/common/configurationRegistry.i18n.json b/i18n/chs/src/vs/platform/configuration/common/configurationRegistry.i18n.json index ea616506b8e..781727fae4d 100644 --- a/i18n/chs/src/vs/platform/configuration/common/configurationRegistry.i18n.json +++ b/i18n/chs/src/vs/platform/configuration/common/configurationRegistry.i18n.json @@ -10,7 +10,7 @@ "vscode.extension.contributes.configuration": "用于配置字符串。", "vscode.extension.contributes.configuration.title": "设置摘要。此标签将在设置文件中用作分隔注释。", "vscode.extension.contributes.configuration.properties": "配置属性的描述。", - "config.property.languageDefault": "无法注册“{0}”。这符合属性模式 \"\\\\[.*\\\\]$\",可用于描述特定语言编辑器设置。请使用 \"configurationDefaults\"。", + "config.property.languageDefault": "无法注册“{0}”。其符合描述特定语言编辑器设置的表达式 \"\\\\[.*\\\\]$\"。请使用 \"configurationDefaults\"。", "config.property.duplicate": "无法注册“{0}”。此属性已注册。", "invalid.properties": "configuration.properties 必须是对象", "invalid.type": "如果进行设置,\"configuration.type\" 必须设置为对象", diff --git a/i18n/chs/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/chs/src/vs/platform/markers/common/problemMatcher.i18n.json index 7dc0d66e0aa..b9fc2ddbbde 100644 --- a/i18n/chs/src/vs/platform/markers/common/problemMatcher.i18n.json +++ b/i18n/chs/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -34,6 +34,7 @@ "ProblemMatcherParser.noValidIdentifier": "错误: 模式属性 {0} 是无效的模式变量名。", "ProblemMatcherParser.problemPattern.watchingMatcher": "问题匹配程序必须定义监视的开始模式和结束模式。", "ProblemMatcherParser.invalidRegexp": "错误: 字符串 {0} 不是有效的正则表达式。\n", + "WatchingPatternSchema.regexp": "用于检测后台任务开始或结束的正则表达式。", "WatchingPatternSchema.file": "文件名的匹配组索引。可以省略。", "PatternTypeSchema.name": "所提供或预定义模式的名称", "PatternTypeSchema.description": "问题模式或者所提供或预定义问题模式的名称。如果已指定基准,则可以省略。", @@ -42,6 +43,12 @@ "ProblemMatcherSchema.severity": "捕获问题的默认严重性。如果模式未定义严重性的匹配组,则使用。", "ProblemMatcherSchema.applyTo": "控制文本文档上报告的问题是否仅应用于打开、关闭或所有文档。", "ProblemMatcherSchema.fileLocation": "定义应如何解释问题模式中报告的文件名。", + "ProblemMatcherSchema.background": "用于跟踪在后台任务上激活的匹配程序的开始和结束的模式。", + "ProblemMatcherSchema.background.activeOnStart": "如果设置为 true,则会在任务开始时激活后台监控。这相当于发出与 beginPattern 匹配的行。", + "ProblemMatcherSchema.background.beginsPattern": "如果在输出内匹配,则会发出后台任务开始的信号。", + "ProblemMatcherSchema.background.endsPattern": "如果在输出内匹配,则会发出后台任务结束的信号。", + "ProblemMatcherSchema.watching.deprecated": "“watching”属性已被弃用。请改用“background”。", + "ProblemMatcherSchema.watching": "用于跟踪监视匹配程序开始和结束的模式。", "ProblemMatcherSchema.watching.activeOnStart": "如果设置为 true,则当任务开始时观察程序处于活动模式。这相当于发出与 beginPattern 匹配的行。", "ProblemMatcherSchema.watching.beginsPattern": "如果在输出内匹配,则在监视任务开始时会发出信号。", "ProblemMatcherSchema.watching.endsPattern": "如果在输出内匹配,则在监视任务结束时会发出信号。", diff --git a/i18n/chs/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/chs/src/vs/workbench/api/node/extHostTreeViews.i18n.json index 8b6ad71cd4e..7bfb0b886de 100644 --- a/i18n/chs/src/vs/workbench/api/node/extHostTreeViews.i18n.json +++ b/i18n/chs/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "treeView.notRegistered": "没有注册 ID 为“{0}”的树形图。", + "treeItem.notFound": "没有在树中找到 ID 为“{0}”的项目。", + "treeView.duplicateElement": "已注册元素 {0}。" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/common/theme.i18n.json b/i18n/chs/src/vs/workbench/common/theme.i18n.json index 64c51b8e74c..0f3e7eb1bf9 100644 --- a/i18n/chs/src/vs/workbench/common/theme.i18n.json +++ b/i18n/chs/src/vs/workbench/common/theme.i18n.json @@ -32,6 +32,7 @@ "activityBarBadgeBackground": "活动通知徽章背景色。活动栏显示在最左侧或最右侧,并允许在侧边栏的视图间切换。", "activityBarBadgeForeground": "活动通知徽章前景色。活动栏显示在最左侧或最右侧,并允许在侧边栏的视图间切换。", "sideBarBackground": "侧边栏背景色。侧边栏是资源管理器和搜索等视图的容器。", + "sideBarForeground": "侧边栏前景色。侧边栏是资源管理器和搜索等视图的容器。", "sideBarTitleForeground": "侧边栏标题前景色。侧边栏是资源管理器和搜索等视图的容器。", "sideBarSectionHeaderBackground": "侧边栏节标题的背景颜色。侧边栏是资源管理器和搜索等视图的容器。", "titleBarActiveForeground": "窗口处于活动状态时的标题栏前景色。请注意,该颜色当前仅在 macOS 上受支持。", diff --git a/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json index 375f183373b..6997449c1ce 100644 --- a/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,6 +7,7 @@ "view": "查看", "help": "帮助", "file": "文件", + "developer": "开发者", "showEditorTabs": "控制打开的编辑器是否显示在选项卡中。", "editorTabCloseButton": "控制编辑器的选项卡关闭按钮的位置,或当设置为 \"off\" 时禁用关闭它们。", "showIcons": "控制打开的编辑器是否随图标一起显示。这还需启用图标主题。", diff --git a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json index a188f9c1e90..b163a2de99e 100644 --- a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "workbench.action.inspectKeyMap": "开发者:检查键映射" + "workbench.action.inspectKeyMap": "开发者: 检查键映射" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json index 8d541bedfe0..a7b3e519e7d 100644 --- a/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json @@ -6,6 +6,6 @@ { "toggle.wordwrap": "查看: 切换自动换行", "wordWrap.notInDiffEditor": "不能在差异编辑器中切换自动换行。", - "unwrapMinified": "为此文件禁用换行", + "unwrapMinified": "为此文件禁用折行", "wrapMinified": "为此文件启用换行" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index c322b5a660a..54243f83ce3 100644 --- a/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,6 +7,7 @@ "debugAdapterBinNotFound": "调试适配器可执行的“{0}”不存在。", "debugAdapterCannotDetermineExecutable": "无法确定调试适配器“{0}”的可执行文件。", "debugType": "配置类型。", + "debugTypeNotRecognised": "无法识别此调试类型。确保已经安装并启用相应的调试扩展。", "node2NotSupported": "不再支持 \"node2\",改用 \"node\",并将 \"protocol\" 属性设为 \"inspector\"。", "debugName": "配置名称;在启动配置下拉菜单中显示。", "debugRequest": "请求配置类型。可以是“启动”或“附加”。", diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json index 0598c67b46e..f4159d50b0e 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "evaluateMathExpression": "Emmet: 评估数学表达式" + "evaluateMathExpression": "Emmet: 求数学表达式的值" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json index 403f855e5eb..81f7dcfcab1 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -4,10 +4,10 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "incrementNumberByOneTenth": "Emmet: 以 0.1 为增量", - "incrementNumberByOne": "Emmet: 以 1 为增量", - "incrementNumberByTen": "Emmet: 以 10 为增量", - "decrementNumberByOneTenth": "Emmet: 以 0.1 为减量", - "decrementNumberByOne": "Emmet: 以 1 为减量", - "decrementNumberByTen": "Emmet: 以 10 为减量" + "incrementNumberByOneTenth": "Emmet: 增加 0.1", + "incrementNumberByOne": "Emmet: 增加 1", + "incrementNumberByTen": "Emmet: 增加 10", + "decrementNumberByOneTenth": "Emmet: 减少 0.1", + "decrementNumberByOne": "Emmet: 减少 1", + "decrementNumberByTen": "Emmet: 减少 10" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json index b58d42bcafe..545f1c107e7 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "removeTag": "Emmet: 删除标记" + "removeTag": "Emmet: 删除标签" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json index 5796a0dcab8..53e4eaafbd9 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "splitJoinTag": "Emmet: 分离/联接标记" + "splitJoinTag": "Emmet: 分离/联接标签" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json index c5d6fd7b350..d68725525c8 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "updateImageSize": "Emmet: 更新映像大小" + "updateImageSize": "Emmet: 更新图像大小" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json index 486e5397c4b..8bf2821c120 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "updateTag": "Emmet: 更新标记", - "enterTag": "输入标记", - "tag": "标记" + "updateTag": "Emmet: 更新标签", + "enterTag": "输入标签", + "tag": "标签" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json index dbca7bf9016..21f0c06d363 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "wrapWithAbbreviationAction": "Emmet: 使用缩写进行包装", + "wrapWithAbbreviationAction": "Emmet: 使用缩写进行包围", "enterAbbreviation": "输入缩写", "abbreviation": "缩写" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json index 6a402e79e1e..0701c9f4ae6 100644 --- a/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -6,8 +6,8 @@ { "emmetConfigurationTitle": "Emmet", "triggerExpansionOnTab": "启用后,按 TAB 键时,将展开 Emmet 缩写。", - "emmetPreferences": "用于修改 Emmet 的某些操作和解决程序的首选项。", + "emmetPreferences": "用于修改 Emmet 某些操作和解析程序的行为的首选项。", "emmetSyntaxProfiles": "为指定的语法定义配置文件或使用带有特定规则的配置文件。", - "emmetExclude": "emmet 缩写不应在其中展开的语言数组。", - "emmetExtensionsPath": "转至包含 Emmet 配置文件、片段和首选项的文件的路径" + "emmetExclude": "不应展开 Emmet 缩写的语言数组。", + "emmetExtensionsPath": "包含 Emmet 配置文件、代码段和首选项的文件夹路径" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json index 5d52f90d627..076eadb1e72 100644 --- a/i18n/chs/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "vscode.extension.contributes.view": "贡献自定义视图", + "vscode.extension.contributes.view": "添加自定义视图", "vscode.extension.contributes.view.id": "用于标识通过 vscode.workspace.createTreeView 创建的视图的唯一 ID", "vscode.extension.contributes.view.label": "用于呈现视图的人类可读的字符串", "vscode.extension.contributes.view.icon": "视图图标的路径", - "vscode.extension.contributes.views": "贡献自定义视图", + "vscode.extension.contributes.views": "添加自定义视图", "showViewlet": "显示 {0}", "view": "查看" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 8b6ad71cd4e..5a4bf096f38 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "disableOtherKeymapsConfirmation": "是否禁用其他键映射以避免键绑定之间的冲突?", + "yes": "是", + "no": "否" +} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index ba343731820..5813db26a24 100644 --- a/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,7 +16,6 @@ "associations": "配置语言的文件关联(如: \"*.extension\": \"html\")。这些关联的优先级高于已安装语言的默认关联。", "encoding": "读取和编写文件时将使用的默认字符集编码。", "autoGuessEncoding": "启用时,会在打开文件时尝试猜测字符集编码", - "eol": "默认行尾字符。", "trimTrailingWhitespace": "启用后,将在保存文件时剪裁尾随空格。", "insertFinalNewline": "启用后,保存文件时在文件末尾插入一个最终新行。", "files.autoSave.off": "永不自动保存更新后的文件。", diff --git a/i18n/chs/src/vs/workbench/parts/files/common/editors/fileEditorInput.i18n.json b/i18n/chs/src/vs/workbench/parts/files/common/editors/fileEditorInput.i18n.json index f4fa6caa5bc..9745dba4538 100644 --- a/i18n/chs/src/vs/workbench/parts/files/common/editors/fileEditorInput.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/files/common/editors/fileEditorInput.i18n.json @@ -4,5 +4,5 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "orphanedFile": "{0} (deleted from disk)" + "orphanedFile": "{0} (磁盘上已删除)" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json index dbd6be98f3e..bb7e4ea7afa 100644 --- a/i18n/chs/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -5,5 +5,11 @@ // Do not edit this file. It is machine generated. { "slow": "检测到启动缓慢", - "slow.detail": "抱歉,出现了启动缓慢的情况。请重启“{0}”并启用分析,将分析文件与我们共享,我们会努力提高启动速度。" + "slow.detail": "抱歉,出现了启动缓慢的情况。请重启“{0}”并启用分析,将分析文件与我们共享,我们会努力提高启动速度。", + "prof.message": "已成功创建描述文件。", + "prof.detail": "请创建问题并手动附加以下文件:\n{0}", + "prof.restartAndFileIssue": "创建问题并重启", + "prof.restart": "重启", + "prof.thanks": "感谢您的帮助。", + "prof.detail.restart": "需要重新启动才能继续使用“{0}”。再次感谢您的贡献。" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json index d4d305eba54..3461ec0a523 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "keybindingsInputName": "键盘快捷键", + "keybindingsInputName": "键盘快捷方式", "SearchKeybindings.AriaLabel": "搜索键绑定", "SearchKeybindings.Placeholder": "搜索键绑定", "sortByPrecedene": "按优先级排序", - "header-message": "用于高级自定义打开和编辑", + "header-message": "高级自定义请打开和编辑", "keybindings-file-name": "keybindings.json", "keybindingsLabel": "键绑定", "changeLabel": "更改键绑定", diff --git a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json index 058e01cd6bf..72a81c0af68 100644 --- a/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -6,7 +6,7 @@ { "openGlobalSettings": "打开用户设置", "openGlobalKeybindings": "打开键盘快捷方式", - "openGlobalKeybindingsFile": "打开键盘快捷键文件", + "openGlobalKeybindingsFile": "打开键盘快捷方式文件", "openWorkspaceSettings": "打开工作区设置", "configureLanguageBasedSettings": "配置语言特定的设置...", "languageDescriptionConfigured": "({0})", diff --git a/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json b/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json index ab4166d5cd7..8ea8ff4f96e 100644 --- a/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "toggleGitViewlet": "显示 GIT", + "toggleGitViewlet": "显示 Git", + "installAdditionalSCMProviders": "安装其他 SCM 提供程序...", "source control": "源代码管理", "toggleSCMViewlet": "显示 SCM", "view": "查看" diff --git a/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json b/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json index f03d74e8c9d..89c41c7a05b 100644 --- a/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "switch provider": "切换 SCM 提供程序..." + "installAdditionalSCMProviders": "安装其他 SCM 提供程序...", + "switch provider": "切换源代码管理系统..." } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json b/i18n/chs/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json index 0c4154de4e5..340ee7fc03e 100644 --- a/i18n/chs/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "vscode.extension.contributes.snippets": "贡献代码段。", + "vscode.extension.contributes.snippets": "添加代码段。", "vscode.extension.contributes.snippets-language": "此代码片段参与的语言标识符。", "vscode.extension.contributes.snippets-path": "代码片段文件的路径。该路径相对于扩展文件夹,通常以 \"./snippets/\" 开头。", "invalid.language": "“contributes.{0}.language”中存在未知的语言。提供的值: {1}", diff --git a/i18n/chs/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json index bf5eec2631c..48bcbb508c2 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0},任务" + "entryAriaLabel": "{0},任务", + "workspace": "来自工作区", + "extension": "来自扩展" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 2132313f0b6..f5f009904e1 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -6,5 +6,6 @@ { "TerminalTaskSystem.unknownError": "在执行任务时发生未知错误。请参见任务输出日志了解详细信息。", "TerminalTaskSystem.terminalName": "任务 - {0}", - "TerminalTaskSystem": "无法对 UNC 驱动器执行 shell 命令。" + "TerminalTaskSystem": "无法对 UNC 驱动器执行 shell 命令。", + "unkownProblemMatcher": "无法解析问题匹配程序 {0}。此匹配程序将被忽略" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json b/i18n/chs/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json index aa659de1014..5b8a86d9c21 100644 --- a/i18n/chs/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json @@ -7,5 +7,6 @@ "TaskRunnerSystem.unknownError": "在执行任务时发生未知错误。请参见任务输出日志了解详细信息。", "TaskRunnerSystem.watchingBuildTaskFinished": "\n监视生成任务已完成", "TaskRunnerSystem.childProcessError": "Failed to launch external program {0} {1}.", - "TaskRunnerSystem.cancelRequested": "\n已根据用户请求终止了任务'{0}' " + "TaskRunnerSystem.cancelRequested": "\n已根据用户请求终止了任务'{0}' ", + "unkownProblemMatcher": "无法解析问题匹配程序 {0}。此匹配程序将被忽略" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json b/i18n/chs/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json index 082e49f08bc..076dd52ebbb 100644 --- a/i18n/chs/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json @@ -17,7 +17,7 @@ "watermark.selectTheme": "更改主题", "watermark.selectKeymap": "更改键映射", "watermark.keybindingsReference": "键盘参考", - "watermark.openGlobalKeybindings": "键盘快捷键", + "watermark.openGlobalKeybindings": "键盘快捷方式(&&K)", "watermark.unboundCommand": "未绑定", "workbenchConfigurationTitle": "工作台", "tips.enabled": "启用后,当没有打开编辑器时将显示水印提示。" diff --git a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 3b9d1ffa9ca..3503db3576a 100644 --- a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -9,18 +9,23 @@ "welcomePage.start": "开始", "welcomePage.newFile": "新建文件", "welcomePage.openFolder": "打开文件夹...", - "welcomePage.cloneGitRepository": "克隆 GIT 存储库...", + "welcomePage.cloneGitRepository": "克隆 Git 存储库...", "welcomePage.recent": "最近", "welcomePage.moreRecent": "更多...", "welcomePage.noRecentFolders": "无最近使用文件夹", "welcomePage.help": "帮助", + "welcomePage.keybindingsCheatsheet": "可打印的键盘速查表", "welcomePage.introductoryVideos": "入门视频", "welcomePage.productDocumentation": "产品文档", "welcomePage.gitHubRepository": "GitHub 存储库", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "启动时显示欢迎页", "welcomePage.customize": "自定义", + "welcomePage.installExtensionPacks": "工具和语言", + "welcomePage.installExtensionPacksDescription": "安装对 {0} 和 {1} 的支持", + "welcomePage.moreExtensions": "更多", "welcomePage.installKeymapDescription": "安装键盘快捷方式", + "welcomePage.installKeymapExtension": "安装 {0} 和 {1} 的键盘快捷方式", "welcomePage.others": "其他", "welcomePage.colorTheme": "颜色主题", "welcomePage.colorThemeDescription": "使编辑器和代码呈现你喜欢的外观", diff --git a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index de7e3aa24d5..07f438f169e 100644 --- a/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,11 +5,25 @@ // Do not edit this file. It is machine generated. { "welcomePage": "欢迎使用", + "welcomePage.javaScript": "JavaScript", + "welcomePage.typeScript": "TypeScript", + "welcomePage.python": "Python", + "welcomePage.php": "PHP", + "welcomePage.docker": "Docker", + "welcomePage.vim": "Vim", + "welcomePage.sublime": "Sublime", + "welcomePage.atom": "Atom", + "welcomePage.extensionPackAlreadyInstalled": "已安装对 {0} 的支持。", + "welcomePage.willReloadAfterInstallingExtensionPack": "安装对 {0} 的支持后,将重载窗口。", + "welcomePage.installingExtensionPack": "正在安装对 {0} 的支持...", + "welcomePage.extensionPackNotFound": "找不到对 {0} (ID: {1}) 的支持。", "welcomePage.keymapAlreadyInstalled": "已安装 {0} 键盘快捷方式。", "welcomePage.willReloadAfterInstallingKeymap": "安装 {0} 键盘快捷方式后,将重载窗口。", "welcomePage.installingKeymap": "正在安装 {0} 键盘快捷方式...", "welcomePage.keymapNotFound": "找不到 ID 为 {1} 的 {0} 键盘快捷方式。", "welcome.title": "欢迎使用", + "welcomePage.extensionListSeparator": ",", + "welcomePage.installedExtension": "{0}(已安装)", "ok": "确定", "cancel": "取消", "welcomePage.quickLinkBackground": "欢迎页快速链接的背景颜色。", diff --git a/i18n/chs/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/chs/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json index 69e35ac02d6..4abe2dbd4b8 100644 --- a/i18n/chs/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json +++ b/i18n/chs/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -14,18 +14,18 @@ "vscode.extension.contributes.iconThemes.label": "UI 中显示的图标主题的标签。", "vscode.extension.contributes.iconThemes.path": "图标主题定义文件的路径。该路径相对于扩展文件夹,通常是 \"./icons/awesome-icon-theme.json\"。", "migration.completed": "已向用户设置添加了新的主题设置。{0} 中可备份。", - "error.cannotloadtheme": "Unable to load {0}: {1}", - "reqarray": "Extension point `{0}` must be an array.", + "error.cannotloadtheme": "无法加载 {0}: {1}", + "reqarray": "扩展点“{0}”必须是一个数组。", "reqpath": "“contributes.{0}.path”中应为字符串。提供的值: {1}", "invalid.path.1": "“contributes.{0}.path”({1})应包含在扩展的文件夹({2})内。这可能会使扩展不可移植。", "reqid": "“contributes.{0}.id”中应为字符串。提供的值: {1}", "error.cannotloadicontheme": "Unable to load {0}", "error.cannotparseicontheme": "Problems parsing file icons file: {0}", - "colorTheme": "Specifies the color theme used in the workbench.", - "colorThemeError": "Theme is unknown or not installed.", - "iconTheme": "Specifies the icon theme used in the workbench.", + "colorTheme": "指定工作台中使用的颜色主题。", + "colorThemeError": "主题未知或未安装。", + "iconTheme": "指定在工作台中使用的图标主题。", "noIconThemeDesc": "No file icons", - "iconThemeError": "File icon theme is unknown or not installed.", + "iconThemeError": "文件图标主题未知或未安装。", "workbenchColors": "覆盖当前所选颜色主题的颜色。", "workbenchColors.deprecated": "该设置不再是实验性设置,并已重命名为“workbench.colorCustomizations”", "workbenchColors.deprecatedDescription": "改用“workbench.colorCustomizations”" diff --git a/i18n/cht/extensions/markdown/out/extension.i18n.json b/i18n/cht/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/cht/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/cht/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/cht/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/extensions/merge-conflict/package.i18n.json b/i18n/cht/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/extensions/npm/package.i18n.json b/i18n/cht/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/cht/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index da6b8c6d2c0..c01f13f3bcb 100644 --- a/i18n/cht/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/cht/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,8 +6,6 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "因為影像太大,所以無法在編輯器中顯示。", - "resourceOpenExternalButton": "開啟影像", - "resourceOpenExternalText": " 要使用外部程式嗎?", "nativeBinaryError": "檔案為二進位檔、非常大或使用不支援的文字編碼,因此將不會顯示於編輯器中。", "sizeB": "{0}B", "sizeKB": "{0}KB", diff --git a/i18n/cht/src/vs/code/electron-main/menus.i18n.json b/i18n/cht/src/vs/code/electron-main/menus.i18n.json index a1fa3f356dd..5961aa8e789 100644 --- a/i18n/cht/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/cht/src/vs/code/electron-main/menus.i18n.json @@ -14,6 +14,7 @@ "mHelp": "說明 (&&H)", "miNewWindow": "開新視窗(&&W)", "mAbout": "關於 {0}", + "mServices": "服務", "mHide": "隱藏 {0}", "mHideOthers": "隱藏其他", "mShowAll": "全部顯示", diff --git a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json index ec8f05fe340..f06682edb16 100644 --- a/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/cht/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -40,7 +40,6 @@ "formatOnType": "控制編輯器是否應在輸入一行後自動格式化", "formatOnPaste": "控制編輯器是否應自動設定貼上的內容格式。格式器必須可供使用,而且格式器應該能夠設定文件中一個範圍的格式。", "suggestOnTriggerCharacters": "控制輸入觸發字元時,是否應自動顯示建議", - "acceptSuggestionOnEnter": "控制除了 'Tab' 外,是否也藉由按下 'Enter' 接受建議。如此可避免混淆要插入新行或接受建議。", "acceptSuggestionOnCommitCharacter": "控制認可字元是否應接受建議。例如在 JavaScript 中,分號 (';') 可以是接受建議並鍵入該字元的認可字元。", "snippetSuggestions": "控制程式碼片段是否隨其他建議顯示,以及其排序方式。", "emptySelectionClipboard": "控制複製時不選取任何項目是否會複製目前程式行。", diff --git a/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json index 7b011979df9..b08c173b100 100644 --- a/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/cht/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -7,6 +7,9 @@ "lineHighlight": "目前游標位置行的反白顯示背景色彩。", "lineHighlightBorderBox": "目前游標位置行之周圍框線的背景色彩。", "rangeHighlight": "反白顯示範圍的背景色彩,例如 Quick Open 與尋找功能。", + "caret": "編輯器游標的色彩。", + "editorWhitespaces": "編輯器中空白字元的色彩。", + "editorIndentGuides": "編輯器縮排輔助線的色彩。", "editorLineNumbers": "編輯器行號的色彩。", "editorRuler": "編輯器尺規的色彩", "editorCodeLensForeground": "編輯器程式碼濾鏡的前景色彩", diff --git a/i18n/cht/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/cht/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..26ea0a1761c --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "找不到 '{0}' 的定義", + "generic.noResults": "找不到任何定義", + "meta.title": " - {0} 個定義", + "actions.goToDecl.label": "移至定義", + "actions.goToDeclToSide.label": "在一側開啟定義", + "actions.previewDecl.label": "預覽定義", + "goToImplementation.noResultWord": "找不到 '{0}' 的任何實作", + "goToImplementation.generic.noResults": "找不到任何實作", + "meta.implementations.title": " – {0} 個實作", + "actions.goToImplementation.label": "前往實作", + "actions.peekImplementation.label": "預覽實作", + "goToTypeDefinition.noResultWord": "找不到 '{0}' 的任何類型定義", + "goToTypeDefinition.generic.noResults": "找不到任何類型定義", + "meta.typeDefinitions.title": " – {0} 個定義", + "actions.goToTypeDefinition.label": "移至類型定義", + "actions.peekTypeDefinition.label": "預覽類型定義" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/cht/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..24cf4f7503f --- /dev/null +++ b/i18n/cht/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "按一下以顯示 {0} 項定義。" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/cht/src/vs/workbench/api/node/extHostTreeViews.i18n.json index 8b6ad71cd4e..028bfb1a1d0 100644 --- a/i18n/cht/src/vs/workbench/api/node/extHostTreeViews.i18n.json +++ b/i18n/cht/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "treeView.duplicateElement": "元件{0}已被註冊" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/common/theme.i18n.json b/i18n/cht/src/vs/workbench/common/theme.i18n.json index 2d8bce1a636..72a8d8abb7e 100644 --- a/i18n/cht/src/vs/workbench/common/theme.i18n.json +++ b/i18n/cht/src/vs/workbench/common/theme.i18n.json @@ -29,6 +29,7 @@ "activityBarBadgeBackground": "活動通知徽章的背景色彩。此活動列會顯示在最左側或最右側,讓您可以切換提要欄位的不同檢視。", "activityBarBadgeForeground": "活動通知徽章的前背景色彩。此活動列會顯示在最左側或最右側,讓您可以切換提要欄位的不同檢視。", "sideBarBackground": "提要欄位的背景色彩。提要欄位是檢視 (例如 Explorer 與搜尋) 的容器。", + "sideBarForeground": "側欄的前景顏色.側欄包含Explorer與搜尋.", "sideBarTitleForeground": "提要欄位標題的前景色彩。提要欄位是檢視 (例如 Explorer 與搜尋) 的容器。", "sideBarSectionHeaderBackground": "提要欄位區段標頭的背景色彩。提要欄位是檢視 (例如 Explorer 與搜尋) 的容器。", "titleBarActiveForeground": "作用中視窗之標題列的前景。請注意,目前只有 macOS 支援此色彩。", diff --git a/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json index c1874024aee..bced8b136e5 100644 --- a/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,6 +7,7 @@ "view": "檢視", "help": "說明", "file": "檔案", + "developer": "開發人員", "showEditorTabs": "控制已開啟的編輯器是否應顯示在索引標籤中。", "editorTabCloseButton": "控制編輯器的索引標籤關閉按鈕位置,或在設為 'off' 時將其停用。", "showIcons": "控制開啟的編輯器是否搭配圖示顯示。這需要同時啟用圖示佈景主題。", diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 8b6ad71cd4e..49a87dcf222 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "disableOtherKeymapsConfirmation": "要停用其他按鍵對應,以避免按鍵繫結關係發生衝突嗎?", + "yes": "是", + "no": "否" +} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 07e8bfd5963..5b044579208 100644 --- a/i18n/cht/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,7 +16,6 @@ "associations": "將檔案關聯設定為語言 (例如 \"*.extension\": \"html\")。這些語言優先於已安裝語言的預設關聯。", "encoding": "讀取與寫入檔案時要使用的預設字元集編碼。", "autoGuessEncoding": "如有啟用,將會在開啟檔案時,嘗試猜測字元集編碼", - "eol": "預設行尾字元。", "trimTrailingWhitespace": "若啟用,將在儲存檔案時修剪尾端空白。", "insertFinalNewline": "啟用時,請在儲存檔案時在其結尾插入最後一個新行。", "files.autoSave.off": "已變更的檔案一律不會自動儲存。", diff --git a/i18n/cht/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json index 1c615781faa..f36b3a04dba 100644 --- a/i18n/cht/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -5,5 +5,9 @@ // Do not edit this file. It is machine generated. { "slow": "偵測到啟動速度慢", - "slow.detail": "抱歉! 先前的啟動速度過慢。請重新啟動 '{0}' 並啟用剖析功能,同時將設定檔提供給我們,我們將努力提升啟動的品質。" + "slow.detail": "抱歉! 先前的啟動速度過慢。請重新啟動 '{0}' 並啟用剖析功能,同時將設定檔提供給我們,我們將努力提升啟動的品質。", + "prof.message": "已成功建立設定檔。", + "prof.detail": "請建立問題,並手動附加下列檔案:\n{0}", + "prof.restartAndFileIssue": "建立問題並重新啟動", + "prof.restart": "重新啟動" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json index c0bccd6864c..cafed393010 100644 --- a/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "toggleGitViewlet": "顯示 Git", + "installAdditionalSCMProviders": "安裝額外SCM提供者...", "source control": "原始檔控制", "toggleSCMViewlet": "顯示 SCM", "view": "檢視" diff --git a/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json b/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json index d1872f571b1..5450727934a 100644 --- a/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "installAdditionalSCMProviders": "安裝額外SCM提供者...", "switch provider": "切換 SCM 提供者..." } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json b/i18n/cht/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json index e35a0884650..c9f6c178105 100644 --- a/i18n/cht/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0},工作" + "entryAriaLabel": "{0},工作", + "workspace": "從工作區", + "extension": "從擴充功能" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 877f81d59fd..ae636e70679 100644 --- a/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,6 +6,7 @@ { "selectTheme.label": "色彩佈景主題", "installColorThemes": "安裝其他的色彩佈景主題...", + "themes.selectTheme": "選取色彩主題(上/下鍵預覽)", "selectIconTheme.label": "檔案圖示佈景主題", "installIconThemes": "安裝其他的檔案圖示主題...", "noIconThemeLabel": "無", diff --git a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 00a45ea1dc0..9a00f615c32 100644 --- a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -11,6 +11,7 @@ "welcomePage.openFolder": "開啟資料夾...", "welcomePage.cloneGitRepository": "複製 Git 存放庫...", "welcomePage.recent": "最近使用", + "welcomePage.moreRecent": "更多...", "welcomePage.noRecentFolders": "沒有最近使用的資料夾", "welcomePage.help": "說明", "welcomePage.introductoryVideos": "簡介影片", @@ -19,10 +20,12 @@ "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "啟動時顯示歡迎頁面", "welcomePage.customize": "自訂", + "welcomePage.moreExtensions": "更多", "welcomePage.installKeymapDescription": "安裝鍵盤快速鍵", "welcomePage.others": "其他", "welcomePage.colorTheme": "彩色佈景主題", "welcomePage.colorThemeDescription": "將編輯器及您的程式碼設定成您喜愛的外觀", + "welcomePage.learn": "深入了解", "welcomePage.showCommands": "尋找及執行所有命令", "welcomePage.showCommandsDescription": "從控制台快速存取及搜尋命令 ({0})", "welcomePage.interfaceOverview": "介面概觀", diff --git a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index 02eb36873b6..dfce04ba61a 100644 --- a/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,11 +5,22 @@ // Do not edit this file. It is machine generated. { "welcomePage": "歡迎使用", + "welcomePage.javaScript": "JavaScript", + "welcomePage.typeScript": "TypeScript", + "welcomePage.python": "Python", + "welcomePage.php": "PHP", + "welcomePage.docker": "Docker", + "welcomePage.vim": "活力", + "welcomePage.sublime": "壯麗", + "welcomePage.atom": "Atom", "welcomePage.keymapAlreadyInstalled": "已安裝 {0} 鍵盤快速鍵。", "welcomePage.willReloadAfterInstallingKeymap": "{0} 鍵盤快速鍵安裝完成後,將會重新載入此視窗。", "welcomePage.installingKeymap": "正在安裝 {0} 鍵盤快速鍵...", "welcomePage.keymapNotFound": "找不到識別碼為 {1} 的 {0} 鍵盤快速鍵。", "welcome.title": "歡迎使用", + "welcomePage.extensionListSeparator": ",", + "welcomePage.installedExtension": "{0}(已安裝)", "ok": "確定", - "cancel": "取消" + "cancel": "取消", + "welcomePage.quickLinkBackground": "起始頁面連結的背景色彩." } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json b/i18n/cht/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json index 62ddb9869c6..920973ad063 100644 --- a/i18n/cht/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json @@ -5,5 +5,6 @@ // Do not edit this file. It is machine generated. { "walkThrough.unboundCommand": "未繫結", - "walkThrough.gitNotFound": "您的系統上似乎未安裝 Git。" + "walkThrough.gitNotFound": "您的系統上似乎未安裝 Git。", + "walkThrough.embeddedEditorBackground": "編輯器互動區塊的背景色彩." } \ No newline at end of file diff --git a/i18n/deu/extensions/git/out/main.i18n.json b/i18n/deu/extensions/git/out/main.i18n.json index 6cf07d1824f..58ab0b365d0 100644 --- a/i18n/deu/extensions/git/out/main.i18n.json +++ b/i18n/deu/extensions/git/out/main.i18n.json @@ -7,5 +7,5 @@ "using git": "Verwenden von Git {0} von {1}", "updateGit": "Git aktualisieren", "neverShowAgain": "Nicht mehr anzeigen", - "git20": "Sie haben anscheinend Git {0} installiert. Der Code funktioniert am besten mit Git 2 oder älter" + "git20": "Sie haben anscheinend Git {0} installiert. Code funktioniert am besten mit Git 2 oder neuer" } \ No newline at end of file diff --git a/i18n/deu/extensions/markdown/out/extension.i18n.json b/i18n/deu/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/deu/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/deu/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/deu/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/extensions/merge-conflict/package.i18n.json b/i18n/deu/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/extensions/npm/package.i18n.json b/i18n/deu/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/deu/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index a2b0a61e0fa..24c2e906e90 100644 --- a/i18n/deu/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/deu/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,8 +6,6 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "Das Bild ist zu groß für den Editor. ", - "resourceOpenExternalButton": "Bild öffnen", - "resourceOpenExternalText": " mit externem Programm?", "nativeBinaryError": "Die Datei wird nicht im Editor angezeigt, weil sie binär oder sehr groß ist oder eine nicht unterstützte Textcodierung verwendet.", "sizeB": "{0} B", "sizeKB": "{0} KB", diff --git a/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json index 2fe70e62eed..a01ec274ece 100644 --- a/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/deu/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -40,7 +40,6 @@ "formatOnType": "Steuert, ob der Editor Zeilen automatisch nach der Eingabe formatiert.", "formatOnPaste": "Steuert, ob der Editor den eingefügten Inhalt automatisch formatiert.", "suggestOnTriggerCharacters": "Steuert, ob Vorschläge automatisch bei der Eingabe von Triggerzeichen angezeigt werden.", - "acceptSuggestionOnEnter": "Steuert, ob Vorschläge über die Eingabetaste (zusätzlich zur TAB-Taste) angenommen werden sollen. Vermeidet Mehrdeutigkeit zwischen dem Einfügen neuer Zeilen oder dem Annehmen von Vorschlägen.", "acceptSuggestionOnCommitCharacter": "Steuert, ob Vorschläge über Commitzeichen angenommen werden sollen. In JavaScript kann ein Semikolon (\";\") beispielsweise ein Commitzeichen sein, das einen Vorschlag annimmt und dieses Zeichen eingibt.", "snippetSuggestions": "Steuert, ob Codeausschnitte mit anderen Vorschlägen angezeigt und wie diese sortiert werden.", "emptySelectionClipboard": "Steuert, ob ein Kopiervorgang ohne Auswahl die aktuelle Zeile kopiert.", diff --git a/i18n/deu/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/deu/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..ffee2c2fa36 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "Keine Definition gefunden für \"{0}\".", + "generic.noResults": "Keine Definition gefunden", + "meta.title": " – {0} Definitionen", + "actions.goToDecl.label": "Gehe zu Definition", + "actions.goToDeclToSide.label": "Definition an der Seite öffnen", + "actions.previewDecl.label": "Peek-Definition", + "goToImplementation.noResultWord": "Keine Implementierung gefunden für \"{0}\"", + "goToImplementation.generic.noResults": "Keine Implementierung gefunden", + "meta.implementations.title": "{0} Implementierungen", + "actions.goToImplementation.label": "Zur Implementierung wechseln", + "actions.peekImplementation.label": "Vorschau der Implementierung anzeigen", + "goToTypeDefinition.noResultWord": "Keine Typendefinition gefunden für \"{0}\"", + "goToTypeDefinition.generic.noResults": "Keine Typendefinition gefunden", + "meta.typeDefinitions.title": "{0} Typdefinitionen", + "actions.goToTypeDefinition.label": "Zur Typdefinition wechseln", + "actions.peekTypeDefinition.label": "Vorschau der Typdefinition anzeigen" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/deu/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..2d5f00609a8 --- /dev/null +++ b/i18n/deu/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Klicken Sie, um {0} Definitionen anzuzeigen." +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json index e519ed643e2..15f166829b2 100644 --- a/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,6 +7,7 @@ "view": "Anzeigen", "help": "Hilfe", "file": "Datei", + "developer": "Entwickler", "showEditorTabs": "Steuert, ob geöffnete Editoren auf Registerkarten angezeigt werden sollen.", "editorTabCloseButton": "Steuert die Position der Schließen-Schaltflächen der Editor-Registerkarten oder deaktiviert sie bei der Einstellung \"off\".", "showIcons": "Steuert, ob geöffnete Editoren mit einem Symbol angezeigt werden sollen. Hierzu muss auch ein Symboldesign aktiviert werden.", diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 8b6ad71cd4e..5c79e379437 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "disableOtherKeymapsConfirmation": "Andere Tastenzuordnungen deaktivieren, um Konflikte zwischen Tastenzuordnungen zu vermeiden?", + "yes": "Ja", + "no": "Nein" +} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 8880b15033b..8153f54254b 100644 --- a/i18n/deu/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,7 +16,6 @@ "associations": "Konfigurieren Sie Dateizuordnungen zu Sprachen (beispielsweise \"*.extension\": \"html\"). Diese besitzen Vorrang vor den Standardzuordnungen der installierten Sprachen.", "encoding": "Die Standardzeichensatz-Codierung, die beim Lesen und Schreiben von Dateien verwendet werden soll.", "autoGuessEncoding": "Ist diese Option aktiviert, wird beim Öffnen von Dateien versucht, die Zeichensatzcodierung automatisch zu ermitteln.", - "eol": "Das Zeilenende-Standardzeichen.", "trimTrailingWhitespace": "Bei Aktivierung werden nachgestellte Leerzeichen beim Speichern einer Datei gekürzt.", "insertFinalNewline": "Bei Aktivierung wird beim Speichern einer Datei eine abschließende neue Zeile am Dateiende eingefügt.", "files.autoSave.off": "Eine geänderte Datei wird nie automatisch gespeichert.", diff --git a/i18n/deu/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/deu/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json index 96d83227f67..687359bd486 100644 --- a/i18n/deu/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -5,5 +5,9 @@ // Do not edit this file. It is machine generated. { "slow": "Langsamer Start erkannt", - "slow.detail": "Es tut uns leid, dass Ihr Start so langsam war. Starten Sie \"{0}\" mit aktivierter Profilerstellung neu, geben Sie die Profile für uns frei, und wir tun unser Bestes, damit der Start bald wieder perfekt funktioniert." + "slow.detail": "Es tut uns leid, dass Ihr Start so langsam war. Starten Sie \"{0}\" mit aktivierter Profilerstellung neu, geben Sie die Profile für uns frei, und wir tun unser Bestes, damit der Start bald wieder perfekt funktioniert.", + "prof.message": "Profile wurden erfolgreich erstellt.", + "prof.detail": "Erstellen Sie ein Problem, und fügen Sie die folgenden Dateien manuell an:\n{0}", + "prof.restartAndFileIssue": "Problem erstellen und neu starten", + "prof.restart": "Neu starten" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index 1bc33347222..5693a1f5b13 100644 --- a/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,6 +5,11 @@ // Do not edit this file. It is machine generated. { "welcomePage": "Willkommen", + "welcomePage.typeScript": "TypeScript", + "welcomePage.php": "PHP", + "welcomePage.vim": "Vim", + "welcomePage.sublime": "Sublime", + "welcomePage.atom": "Atom", "welcomePage.keymapAlreadyInstalled": "Die {0} Tastenkombinationen sind bereits installiert.", "welcomePage.willReloadAfterInstallingKeymap": "Das Fenster wird nach der Installation der {0}-Tastaturbefehle neu geladen.", "welcomePage.installingKeymap": "Die {0}-Tastenkombinationen werden installiert...", diff --git a/i18n/esn/extensions/jake/out/main.i18n.json b/i18n/esn/extensions/jake/out/main.i18n.json index 8b6ad71cd4e..1b387f27070 100644 --- a/i18n/esn/extensions/jake/out/main.i18n.json +++ b/i18n/esn/extensions/jake/out/main.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "execFailed": "La detección automática de Jake falló con el error: {0}" +} \ No newline at end of file diff --git a/i18n/esn/extensions/jake/package.i18n.json b/i18n/esn/extensions/jake/package.i18n.json index 8b6ad71cd4e..c22d4c52c92 100644 --- a/i18n/esn/extensions/jake/package.i18n.json +++ b/i18n/esn/extensions/jake/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.jake.autoDetect": "Controla si la detección automática de tareas Jake estan activada/desactivada. El valor predeterminado es \"activada\"." +} \ No newline at end of file diff --git a/i18n/esn/extensions/markdown/out/extension.i18n.json b/i18n/esn/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/esn/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/esn/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/esn/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/extensions/merge-conflict/package.i18n.json b/i18n/esn/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/extensions/npm/package.i18n.json b/i18n/esn/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/esn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index f7060053115..8029ab0b3bd 100644 --- a/i18n/esn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/esn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,8 +6,6 @@ { "imgMeta": "{0} x {1} {2}", "largeImageError": "La imagen es muy grande para mostrar en el editor", - "resourceOpenExternalButton": "Abrir imagen", - "resourceOpenExternalText": "usar programa externo?", "nativeBinaryError": "El archivo no se mostrará en el editor porque es binario, muy grande o usa una codificación de texto no compatible.", "sizeB": "{0} B", "sizeKB": "{0} KB", diff --git a/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json index deeb605c6a6..8fe058e55ce 100644 --- a/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/esn/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -9,6 +9,7 @@ "fontWeight": "Controla el grosor de la fuente.", "fontSize": "Controla el tamaño de fuente en píxeles.", "lineHeight": "Controla la altura de línea. Utilice 0 para calcular el valor de lineHeight a partir de fontSize.", + "letterSpacing": "Controla el espacio entre letras en pixels.", "lineNumbers": "Controla la presentación de los números de línea. Los valores posibles son \"on\", \"off\" y \"relative\". \"relative\" muestra el número de líneas desde la posición actual del cursor.", "rulers": "Columnas en las que mostrar reglas verticales", "wordSeparators": "Caracteres que se usarán como separadores de palabras al realizar operaciones o navegaciones relacionadas con palabras.", @@ -40,7 +41,6 @@ "formatOnType": "Controla si el editor debe dar formato automáticamente a la línea después de escribirla", "formatOnPaste": "Controla si el editor debe formatear automáticamente el contenido pegado. Debe haber disponible un formateador capaz de aplicar formato a un intervalo dentro de un documento.", "suggestOnTriggerCharacters": "Controla si las sugerencias deben aparecer de forma automática al escribir caracteres desencadenadores", - "acceptSuggestionOnEnter": "Controla si las sugerencias deben aceptarse en \"Entrar\" (además de \"TAB\"). Ayuda a evitar la ambigüedad entre insertar nuevas líneas o aceptar sugerencias.", "acceptSuggestionOnCommitCharacter": "Controla si se deben aceptar sugerencias en los caracteres de confirmación. Por ejemplo, en Javascript, el punto y coma (\";\") puede ser un carácter de confirmación que acepta una sugerencia y escribe ese carácter.", "snippetSuggestions": "Controla si se muestran los fragmentos de código con otras sugerencias y cómo se ordenan.", "emptySelectionClipboard": "Controla si al copiar sin selección se copia la línea actual.", @@ -62,6 +62,7 @@ "renderLineHighlight": "Controla cómo el editor debe presentar el resaltado de línea. Las posibilidades son \"ninguno\", \"margen\", \"línea\" y \"todo\".", "codeLens": "Controla si el editor muestra lentes de código", "folding": "Controla si el editor tiene habilitado el plegado de código.", + "showFoldingControls": "Controla cuándo los controles de plegado del margen son ocultados automáticamente.", "matchBrackets": "Resaltar corchetes coincidentes cuando se seleccione uno de ellos.", "glyphMargin": "Controla si el editor debe representar el margen de glifo vertical. El margen de glifo se usa, principalmente, para depuración.", "useTabStops": "La inserción y eliminación del espacio en blanco sigue a las tabulaciones.", diff --git a/i18n/esn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/esn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..d9243b76135 --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "No se encontró ninguna definición para \"{0}\"", + "generic.noResults": "No se encontró ninguna definición", + "meta.title": " – {0} definiciones", + "actions.goToDecl.label": "Ir a definición", + "actions.goToDeclToSide.label": "Abrir definición en el lateral", + "actions.previewDecl.label": "Ver la definición", + "goToImplementation.noResultWord": "No se encontró ninguna implementación para \"{0}\"", + "goToImplementation.generic.noResults": "No se encontró ninguna implementación", + "meta.implementations.title": "{0} implementaciones", + "actions.goToImplementation.label": "Ir a implementación", + "actions.peekImplementation.label": "Inspeccionar implementación", + "goToTypeDefinition.noResultWord": "No se encontró ninguna definición de tipo para \"{0}\"", + "goToTypeDefinition.generic.noResults": "No se encontró ninguna definición de tipo", + "meta.typeDefinitions.title": " – {0} definiciones de tipo", + "actions.goToTypeDefinition.label": "Ir a la definición de tipo", + "actions.peekTypeDefinition.label": "Inspeccionar definición de tipo" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/esn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..d35f93e7fae --- /dev/null +++ b/i18n/esn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Haga clic para mostrar {0} definiciones." +} \ No newline at end of file diff --git a/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index f9d2c2d5f09..bf3d8015426 100644 --- a/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/esn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -12,6 +12,7 @@ "readMore": "Leer más...{0}", "suggestionWithDetailsAriaLabel": "{0}, sugerencia, con detalles", "suggestionAriaLabel": "{0}, sugerencia", + "readLess": "Leer menos...{0}", "suggestWidget.loading": "Cargando...", "suggestWidget.noSuggestions": "No hay sugerencias.", "suggestionAriaAccepted": "{0}, aceptada", diff --git a/i18n/esn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json b/i18n/esn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json index df256b0ca88..43ec87cbde1 100644 --- a/i18n/esn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json +++ b/i18n/esn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json @@ -15,5 +15,9 @@ "schema.brackets": "Define los corchetes que aumentan o reducen la sangría.", "schema.autoClosingPairs": "Define el par de corchetes. Cuando se escribe un corchete de apertura, se inserta automáticamente el corchete de cierre.", "schema.autoClosingPairs.notIn": "Define una lista de ámbitos donde los pares automáticos están deshabilitados.", - "schema.surroundingPairs": "Define los pares de corchetes que se pueden usar para encerrar una cadena seleccionada." + "schema.surroundingPairs": "Define los pares de corchetes que se pueden usar para encerrar una cadena seleccionada.", + "schema.wordPattern": " La definición de la palabra en el idioma.", + "schema.wordPattern.pattern": "El patrón de expresión regular utilizado para localizar palabras.", + "schema.wordPattern.flags": "Los flags de expresión regular utilizados para localizar palabras.", + "schema.wordPattern.flags.errorMessage": "Debe coincidir con el patrón `/^([gimuy]+)$/`." } \ No newline at end of file diff --git a/i18n/esn/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/esn/src/vs/platform/markers/common/problemMatcher.i18n.json index 967ffc75983..1c9dfefb5cb 100644 --- a/i18n/esn/src/vs/platform/markers/common/problemMatcher.i18n.json +++ b/i18n/esn/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -34,6 +34,7 @@ "ProblemMatcherParser.noValidIdentifier": "Error: La propiedad pattern {0} no es un nombre de variable de patrón válido.", "ProblemMatcherParser.problemPattern.watchingMatcher": "Un buscador de coincidencias de problemas debe definir tanto un patrón de inicio como un patrón de finalización para la inspección.", "ProblemMatcherParser.invalidRegexp": "Error: La cadena {0} no es una expresión regular válida.\n", + "WatchingPatternSchema.regexp": "Expresión regular para detectar el principio o el final de una tarea en segundo plano.", "WatchingPatternSchema.file": "Índice de grupo de coincidencias del nombre de archivo. Se puede omitir.", "PatternTypeSchema.name": "Nombre de un patrón aportado o predefinido", "PatternTypeSchema.description": "Patrón de problema o nombre de un patrón de problema que se ha aportado o predefinido. Se puede omitir si se especifica la base.", @@ -42,6 +43,12 @@ "ProblemMatcherSchema.severity": "Gravedad predeterminada para los problemas de capturas. Se usa si el patrón no define un grupo de coincidencias para \"severity\".", "ProblemMatcherSchema.applyTo": "Controla si un problema notificado en un documento de texto se aplica solamente a los documentos abiertos, cerrados o a todos los documentos.", "ProblemMatcherSchema.fileLocation": "Define cómo deben interpretarse los nombres de archivo notificados en un patrón de problema.", + "ProblemMatcherSchema.background": "Patrones para hacer seguimiento del comienzo y el final en un comprobador activo de la tarea en segundo plano.", + "ProblemMatcherSchema.background.activeOnStart": "Si se establece en True, el monitor está en modo activo cuando la tarea empieza. Esto es equivalente a emitir una línea que coincide con beginPattern", + "ProblemMatcherSchema.background.beginsPattern": "Si se encuentran coincidencias en la salida, se señala el inicio de una tarea en segundo plano.", + "ProblemMatcherSchema.background.endsPattern": "Si se encuentran coincidencias en la salida, se señala el fin de una tarea en segundo plano.", + "ProblemMatcherSchema.watching.deprecated": "Esta propiedad está en desuso. Use la propiedad en segundo plano.", + "ProblemMatcherSchema.watching": "Patrones para hacer un seguimiento del comienzo y el final de un patrón de supervisión.", "ProblemMatcherSchema.watching.activeOnStart": "Si se establece en true, el monitor está en modo activo cuando la tarea empieza. Esto es equivalente a emitir una línea que coincide con beginPattern", "ProblemMatcherSchema.watching.beginsPattern": "Si se encuentran coincidencias en la salida, se señala el inicio de una tarea de inspección.", "ProblemMatcherSchema.watching.endsPattern": "Si se encuentran coincidencias en la salida, se señala el fin de una tarea de inspección", diff --git a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json index 85f87911be1..889a845a813 100644 --- a/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/esn/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -36,11 +36,13 @@ "dropdownForeground": "Primer plano de lista desplegable.", "dropdownBorder": "Borde de lista desplegable.", "listFocusBackground": "Color de fondo de la lista o el árbol del elemento con el foco cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", + "listFocusForeground": "Color de fondo de la lista o el árbol del elemento con el foco cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", "listActiveSelectionBackground": "Color de fondo de la lista o el árbol del elemento seleccionado cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", "listActiveSelectionForeground": "Color de primer plano de la lista o el árbol del elemento con el foco cuando la lista o el árbol están activos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", "listInactiveSelectionBackground": "Color de fondo de la lista o el árbol del elemento seleccionado cuando la lista o el árbol están inactivos. Una lista o un árbol tienen el foco del teclado cuando están activos, cuando están inactivos no.", "listInactiveSelectionForeground": "Color de primer plano de la lista o el árbol del elemento con el foco cuando la lista o el árbol esta inactiva. Una lista o un árbol tiene el foco del teclado cuando está activo, cuando esta inactiva no.", "listHoverBackground": "Fondo de la lista o el árbol al mantener el mouse sobre los elementos.", + "listHoverForeground": "Color de primer plano de la lista o el árbol al pasar por encima de los elementos con el ratón.", "listDropBackground": "Fondo de arrastrar y colocar la lista o el árbol al mover los elementos con el mouse.", "highlight": "Color de primer plano de la lista o el árbol de las coincidencias resaltadas al buscar dentro de la lista o el ábol.", "pickerGroupForeground": "Selector de color rápido para la agrupación de etiquetas.", @@ -58,6 +60,7 @@ "editorBackground": "Color de fondo del editor.", "editorForeground": "Color de primer plano predeterminado del editor.", "editorWidgetBackground": "Color de fondo del editor de widgets como buscar/reemplazar", + "editorWidgetBorder": "Color de borde del editor de widget.", "editorSelection": "Color de la selección del editor.", "editorInactiveSelection": "Color de la selección en un editor inactivo.", "editorSelectionHighlight": "Color de las regiones con el mismo contenido que la selección.", diff --git a/i18n/esn/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/esn/src/vs/workbench/api/node/extHostTreeViews.i18n.json index 8b6ad71cd4e..1127a4ec4f8 100644 --- a/i18n/esn/src/vs/workbench/api/node/extHostTreeViews.i18n.json +++ b/i18n/esn/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "treeView.notRegistered": "No se ha registrado ninga vista del árbol con id '{0}'.", + "treeItem.notFound": "No se encontró ningún item del árbol con id '{0}'.", + "treeView.duplicateElement": "El elemento '{0}' ya está registrado" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/common/theme.i18n.json b/i18n/esn/src/vs/workbench/common/theme.i18n.json index 97f9736e665..40dfe03ebb6 100644 --- a/i18n/esn/src/vs/workbench/common/theme.i18n.json +++ b/i18n/esn/src/vs/workbench/common/theme.i18n.json @@ -32,6 +32,7 @@ "activityBarBadgeBackground": "Color de fondo de distintivo de notificación de actividad. La barra de actividad se muestra en el extremo izquierdo o derecho y permite cambiar entre vistas de la barra lateral.", "activityBarBadgeForeground": "Color de primer plano de distintivo de notificación de actividad. La barra de actividad se muestra en el extremo izquierdo o derecho y permite cambiar entre vistas de la barra lateral.", "sideBarBackground": "Color de fondo de la barra lateral, que es el contenedor de vistas como Explorador y Búsqueda.", + "sideBarForeground": "Color de primer plano de la barra lateral, que es el contenedor de vistas como Explorador y Búsqueda.", "sideBarTitleForeground": "Color de primer plano del título de la barra lateral, que es el contenedor de vistas como Explorador y Búsqueda.", "sideBarSectionHeaderBackground": "Color de fondo del encabezado de sección de la barra lateral, que es el contenedor de vistas como Explorador y Búsqueda.", "titleBarActiveForeground": "Color de primer plano de la barra de título cuando la ventana está activa. Tenga en cuenta que, actualmente, este clor solo se admite en macOS.", diff --git a/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json index cbf9d0deef3..543d5451907 100644 --- a/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,6 +7,7 @@ "view": "Ver", "help": "Ayuda", "file": "Archivo", + "developer": "Desarrollador", "showEditorTabs": "Controla si los editores abiertos se deben mostrar o no en pestañas.", "editorTabCloseButton": "Controla la posición de los botones de cierre de pestañas del editor o los deshabilita si se establece en \"off\".", "showIcons": "Controla si los editores abiertos deben mostrarse o no con un icono. Requiere que también se habilite un tema de icono.", diff --git a/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index cb1c2139583..00a55728fff 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,6 +7,7 @@ "debugAdapterBinNotFound": "El ejecutable del adaptador de depuración \"{0}\" no existe.", "debugAdapterCannotDetermineExecutable": "No se puede determinar el ejecutable para el adaptador de depuración \"{0}\".", "debugType": "Tipo de configuración.", + "debugTypeNotRecognised": "Este tipo de depuración no se reconoce. Compruebe que tiene instalada la correspondiente extensión de depuración y que está habilitada.", "node2NotSupported": "\"node2\" ya no se admite; use \"node\" en su lugar y establezca el atributo \"protocol\" en \"inspector\".", "debugName": "Nombre de la configuración. Aparece en el menú desplegable de la configuración de inicio.", "debugRequest": "Tipo de solicitud de la configuración. Puede ser \"launch\" o \"attach\".", diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 8b6ad71cd4e..2b42d7a0c5b 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "disableOtherKeymapsConfirmation": "¿Quiere deshabilitar otras asignaciones de teclado para evitar conflictos entre los enlaces de teclado?", + "yes": "Sí", + "no": "No" +} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 9b8bcb5fdf1..ef718dc3ee1 100644 --- a/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,7 +16,6 @@ "associations": "Configure asociaciones de archivo para los lenguajes (por ejemplo, \"*.extension\": \"html\"). Estas asociaciones tienen prioridad sobre las asociaciones predeterminadas de los lenguajes instalados.", "encoding": "La codificación del juego de caracteres predeterminada que debe utilizarse al leer y escribir archivos.", "autoGuessEncoding": "Si está opción está habilitada, se intentará adivinar la codificación del juego de caracteres al abrir los archivos", - "eol": "Carácter predeterminado de final de línea.", "trimTrailingWhitespace": "Si se habilita, se recortará el espacio final cuando se guarde un archivo.", "insertFinalNewline": "Si se habilita, inserte una nueva línea final al final del archivo cuando lo guarde.", "files.autoSave.off": "Un archivo con modificaciones no se guarda nunca automáticamente.", diff --git a/i18n/esn/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json index 712641fcab1..81f5a667ca8 100644 --- a/i18n/esn/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -5,5 +5,11 @@ // Do not edit this file. It is machine generated. { "slow": "Inicio lento detectado", - "slow.detail": "Lamentamos que haya tenido un inicio lento. Reinicie \"{0}\" con la generación de perfiles habilitada, comparta los perfiles con nosotros y trabajaremos a fondo para que vuelva a disfrutar de un inicio increíble." + "slow.detail": "Lamentamos que haya tenido un inicio lento. Reinicie \"{0}\" con la generación de perfiles habilitada, comparta los perfiles con nosotros y trabajaremos a fondo para que vuelva a disfrutar de un inicio increíble.", + "prof.message": "Los perfiles se crearon correctamente.", + "prof.detail": "Cree un problema y asóciele manualmente los siguientes archivos: {0}", + "prof.restartAndFileIssue": "Crear problema y reiniciar", + "prof.restart": "Reiniciar", + "prof.thanks": "Gracias por ayudarnos.", + "prof.detail.restart": "Se necesita un reinicio final para continuar utilizando '{0}'. De nuevo, gracias por su aportación." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json index 2d44f58d514..a77a2211780 100644 --- a/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "toggleGitViewlet": "Mostrar GIT", + "installAdditionalSCMProviders": "Instalar proveedores adicionales de SCM...", "source control": "Control de código fuente", "toggleSCMViewlet": "Mostrar SCM", "view": "Ver" diff --git a/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json b/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json index 58e5c2559c8..048db5a28d0 100644 --- a/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "installAdditionalSCMProviders": "Instalar proveedores adicionales de SCM...", "switch provider": "Cambiar proveedor de SCM..." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json index e5995f59713..30e2262eef7 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}, tareas" + "entryAriaLabel": "{0}, tareas", + "workspace": "De área de trabajo", + "extension": "De extensiones" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 930b60298c1..58c4eca7cfe 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -6,5 +6,6 @@ { "TerminalTaskSystem.unknownError": "Error desconocido durante la ejecución de una tarea. Vea el registro de resultados de la tarea para obtener más detalles.", "TerminalTaskSystem.terminalName": "Tarea - {0}", - "TerminalTaskSystem": "No se puede ejecutar un comando shell en una unidad UNC." + "TerminalTaskSystem": "No se puede ejecutar un comando shell en una unidad UNC.", + "unkownProblemMatcher": "No puede resolver el comprobador de problemas {0}. Será omitido." } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json b/i18n/esn/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json index 651c8b00513..b300e0e061a 100644 --- a/i18n/esn/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json @@ -7,5 +7,6 @@ "TaskRunnerSystem.unknownError": "Error desconocido durante la ejecución de una tarea. Vea el registro de resultados de la tarea para obtener más detalles.", "TaskRunnerSystem.watchingBuildTaskFinished": "La inspección de las tareas de compilación ha finalizado.", "TaskRunnerSystem.childProcessError": "Failed to launch external program {0} {1}.", - "TaskRunnerSystem.cancelRequested": "La tarea '{0}' se finalizó por solicitud del usuario." + "TaskRunnerSystem.cancelRequested": "La tarea '{0}' se finalizó por solicitud del usuario.", + "unkownProblemMatcher": "No puede resolver el comprobador de problemas {0}. Será omitido" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 9591e0b1673..2438b3e1709 100644 --- a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -14,13 +14,18 @@ "welcomePage.moreRecent": "Más...", "welcomePage.noRecentFolders": "No hay ninguna carpeta reciente", "welcomePage.help": "Ayuda", + "welcomePage.keybindingsCheatsheet": "Hoja imprimible con ayudas de teclado", "welcomePage.introductoryVideos": "Vídeos de introducción", "welcomePage.productDocumentation": "Documentación del producto", "welcomePage.gitHubRepository": "Repositorio de GitHub", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "Mostrar página principal al inicio", "welcomePage.customize": "Personalizar", + "welcomePage.installExtensionPacks": "Herramientas y lenguajes", + "welcomePage.installExtensionPacksDescription": "Instalar soporte para {0} y {1}", + "welcomePage.moreExtensions": "más", "welcomePage.installKeymapDescription": "Instalar los métodos abreviados de teclado", + "welcomePage.installKeymapExtension": "Instalar los métodos abreviados de teclado de {0} y {1}", "welcomePage.others": "otros", "welcomePage.colorTheme": "Tema de color", "welcomePage.colorThemeDescription": "Modifique a su gusto la apariencia del editor y el código", diff --git a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index 28283fba5c3..57b34bdf736 100644 --- a/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,11 +5,25 @@ // Do not edit this file. It is machine generated. { "welcomePage": "Bienvenido", + "welcomePage.javaScript": "JavaScript", + "welcomePage.typeScript": "TypeScript", + "welcomePage.python": "Python", + "welcomePage.php": "PHP", + "welcomePage.docker": "Docker", + "welcomePage.vim": "Vim", + "welcomePage.sublime": "Sublime", + "welcomePage.atom": "Atom", + "welcomePage.extensionPackAlreadyInstalled": "El soporte para '{0}' ya está instalado.", + "welcomePage.willReloadAfterInstallingExtensionPack": "La ventana se volverá a cargar después de instalar el soporte para {0}.", + "welcomePage.installingExtensionPack": "Instalando soporte para {0}...", + "welcomePage.extensionPackNotFound": "No se pudo encontrar el soporte para {0} con id {1}.", "welcomePage.keymapAlreadyInstalled": "Los métodos abreviados de teclado {0} ya están instalados.", "welcomePage.willReloadAfterInstallingKeymap": "La ventana se volverá a cargar después de instalar los métodos abreviados de teclado {0}.", "welcomePage.installingKeymap": "Instalando los métodos abreviados de teclado de {0}...", "welcomePage.keymapNotFound": "No se pudieron encontrar los métodos abreviados de teclado {0} con el identificador {1}.", "welcome.title": "Bienvenido", + "welcomePage.extensionListSeparator": ", ", + "welcomePage.installedExtension": "{0} (instalado)", "ok": "Aceptar", "cancel": "Cancelar", "welcomePage.quickLinkBackground": "Color de fondo de los vínculos rápidos en la página principal.", diff --git a/i18n/fra/extensions/markdown/out/extension.i18n.json b/i18n/fra/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/fra/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/fra/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/fra/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/extensions/merge-conflict/package.i18n.json b/i18n/fra/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/extensions/npm/package.i18n.json b/i18n/fra/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/fra/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index d6968482f68..b6faf1c8af7 100644 --- a/i18n/fra/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/fra/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,8 +6,6 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "L'image est trop grande pour être affichée dans l'éditeur. ", - "resourceOpenExternalButton": "Ouvrir l'image", - "resourceOpenExternalText": " en utilisant un programme externe ?", "nativeBinaryError": "Impossible d'afficher le fichier dans l'éditeur : soit il est binaire, soit il est très volumineux, soit il utilise un encodage de texte non pris en charge.", "sizeB": "{0} o", "sizeKB": "{0} Ko", diff --git a/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json index afe0864b817..16acf6481b0 100644 --- a/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/fra/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -41,7 +41,6 @@ "formatOnType": "Contrôle si l'éditeur doit automatiquement mettre en forme la ligne après la saisie", "formatOnPaste": "Contrôle si l'éditeur doit automatiquement mettre en forme le contenu collé. Un formateur doit être disponible et doit pouvoir mettre en forme une plage dans un document.", "suggestOnTriggerCharacters": "Contrôle si les suggestions doivent s'afficher automatiquement durant la saisie de caractères de déclenchement", - "acceptSuggestionOnEnter": "Contrôle si les suggestions peuvent être acceptées avec Entrée (en plus de Tab). Cela permet d'éviter toute ambiguïté entre l'insertion de nouvelles lignes et l'acceptation de suggestions.", "acceptSuggestionOnCommitCharacter": "Contrôle si les suggestions doivent être acceptées avec des caractères de validation. Par exemple, en JavaScript, le point-virgule (';') peut être un caractère de validation qui permet d'accepter une suggestion et de taper ce caractère.", "snippetSuggestions": "Contrôle si les extraits de code s'affichent en même temps que d'autres suggestions, ainsi que leur mode de tri.", "emptySelectionClipboard": "Contrôle si la copie sans sélection permet de copier la ligne actuelle.", diff --git a/i18n/fra/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/fra/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..0488ff48354 --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "Définition introuvable pour '{0}'", + "generic.noResults": "Définition introuvable", + "meta.title": " – {0} définitions", + "actions.goToDecl.label": "Atteindre la définition", + "actions.goToDeclToSide.label": "Ouvrir la définition sur le côté", + "actions.previewDecl.label": "Apercu de définition", + "goToImplementation.noResultWord": "Implémentation introuvable pour '{0}'", + "goToImplementation.generic.noResults": "Implémentation introuvable", + "meta.implementations.title": "– Implémentations {0}", + "actions.goToImplementation.label": "Accéder à l'implémentation", + "actions.peekImplementation.label": "Aperçu de l'implémentation", + "goToTypeDefinition.noResultWord": "Définition de type introuvable pour '{0}'", + "goToTypeDefinition.generic.noResults": "Définition de type introuvable", + "meta.typeDefinitions.title": " – Définitions de type {0}", + "actions.goToTypeDefinition.label": "Atteindre la définition de type", + "actions.peekTypeDefinition.label": "Aperçu de la définition du type" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/fra/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..247bd9d24da --- /dev/null +++ b/i18n/fra/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Cliquez pour afficher {0} définitions." +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json index 7d14c23b2b5..d1fbda145ce 100644 --- a/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,6 +7,7 @@ "view": "Affichage", "help": "Aide", "file": "Fichier", + "developer": "Développeur", "showEditorTabs": "Contrôle si les éditeurs ouverts doivent s'afficher ou non sous des onglets.", "editorTabCloseButton": "Contrôle la position des boutons de fermeture des onglets de l'éditeur, ou les désactive quand le paramètre a la valeur 'off'.", "showIcons": "Contrôle si les éditeurs ouverts doivent s'afficher ou non avec une icône. Cela implique notamment l'activation d'un thème d'icône.", diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 8b6ad71cd4e..5ddc77dfc5a 100644 --- a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "disableOtherKeymapsConfirmation": "Désactiver les autres mappages de touches pour éviter les conflits de combinaisons de touches ?", + "yes": "Oui", + "no": "Non" +} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 8d72ad31935..6f916235625 100644 --- a/i18n/fra/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,7 +16,6 @@ "associations": "Configurez les associations entre les fichiers et les langages (par exemple, \"*.extension\": \"html\"). Celles-ci ont priorité sur les associations par défaut des langages installés.", "encoding": "Encodage du jeu de caractères par défaut à utiliser durant la lecture et l'écriture des fichiers.", "autoGuessEncoding": "Quand cette option est activée, tente de deviner l'encodage du jeu de caractères à l'ouverture des fichiers", - "eol": "Caractère de fin de ligne par défaut.", "trimTrailingWhitespace": "Si l'option est activée, l'espace blanc de fin est supprimé au moment de l'enregistrement d'un fichier.", "insertFinalNewline": "Quand l'option est activée, une nouvelle ligne finale est insérée à la fin du fichier au moment de son enregistrement.", "files.autoSave.off": "Un fichier dont l'intégrité est compromise n'est jamais enregistré automatiquement.", diff --git a/i18n/fra/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/fra/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json index fb432045fcc..56c9603dba7 100644 --- a/i18n/fra/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -5,5 +5,9 @@ // Do not edit this file. It is machine generated. { "slow": "Démarrage lent détecté", - "slow.detail": "Le démarrage a été très lent. Redémarrez '{0}' en ayant activé le profilage, partagez les profils avec nous, et nous ferons en sorte que le démarrage retrouve sa rapidité d'exécution." + "slow.detail": "Le démarrage a été très lent. Redémarrez '{0}' en ayant activé le profilage, partagez les profils avec nous, et nous ferons en sorte que le démarrage retrouve sa rapidité d'exécution.", + "prof.message": "Création réussie des profils.", + "prof.detail": "Créez un problème et joignez manuellement les fichiers suivants :\n{0}", + "prof.restartAndFileIssue": "Créer le problème et redémarrer", + "prof.restart": "Redémarrer" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index 915c12960a0..66bb9f2ab66 100644 --- a/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,6 +5,11 @@ // Do not edit this file. It is machine generated. { "welcomePage": "Bienvenue", + "welcomePage.typeScript": "TypeScript", + "welcomePage.php": "PHP", + "welcomePage.vim": "Vim", + "welcomePage.sublime": "Sublime", + "welcomePage.atom": "Atom", "welcomePage.keymapAlreadyInstalled": "Les raccourcis clavier {0} sont déjà installés.", "welcomePage.willReloadAfterInstallingKeymap": "La fenêtre se recharge après l'installation des raccourcis clavier {0}.", "welcomePage.installingKeymap": "Installation des raccourcis clavier de {0}...", diff --git a/i18n/ita/extensions/markdown/out/extension.i18n.json b/i18n/ita/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/ita/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/ita/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/ita/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/extensions/merge-conflict/package.i18n.json b/i18n/ita/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/extensions/npm/package.i18n.json b/i18n/ita/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/ita/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index 0ccb13bf8a7..c64a07b4379 100644 --- a/i18n/ita/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/ita/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,8 +6,6 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "L'immagine è troppo grande per essere visualizzata nell'editor", - "resourceOpenExternalButton": "Apri immagine", - "resourceOpenExternalText": " con il programma esterno?", "nativeBinaryError": "Il file non verrà visualizzato nell'editor perché è binario, è molto grande o usa una codifica testo non supportata.", "sizeB": "{0} B", "sizeKB": "{0} KB", diff --git a/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json index 59f730fe1dc..06ec2510c3a 100644 --- a/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/ita/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -41,7 +41,6 @@ "formatOnType": "Controlla se l'editor deve formattare automaticamente la riga dopo la digitazione", "formatOnPaste": "Controlla se l'editor deve formattare automaticamente il contenuto incollato. Deve essere disponibile un formattatore che deve essere in grado di formattare un intervallo in un documento.", "suggestOnTriggerCharacters": "Controlla se i suggerimenti devono essere visualizzati automaticamente durante la digitazione dei caratteri trigger", - "acceptSuggestionOnEnter": "Controlla se i suggerimenti devono essere accettati con 'INVIO' in aggiunta a 'TAB'. In questo modo è possibile evitare ambiguità tra l'inserimento di nuove righe e l'accettazione di suggerimenti.", "acceptSuggestionOnCommitCharacter": "Controlla se accettare i suggerimenti con i caratteri di commit. Ad esempio, in JavaScript il punto e virgola (';') può essere un carattere di commit che accetta un suggerimento e digita tale carattere.", "snippetSuggestions": "Controlla se i frammenti di codice sono visualizzati con altri suggerimenti e il modo in cui sono ordinati.", "emptySelectionClipboard": "Consente di controllare se, quando si copia senza aver effettuato una selezione, viene copiata la riga corrente.", @@ -63,6 +62,7 @@ "renderLineHighlight": "Consente di controllare in che modo l'editor deve eseguire il rendering dell'evidenziazione di riga corrente. Le opzioni possibili sono 'none', 'gutter', 'line' e 'all'.", "codeLens": "Controlla se nell'editor sono visualizzate le finestre di CodeLens", "folding": "Controlla se per l'editor è abilitata la riduzione del codice", + "showFoldingControls": "Controlla se i controlli di riduzione sul margine della barra di scorrimento sono automaticamente nascosti.", "matchBrackets": "Evidenzia le parentesi corrispondenti quando se ne seleziona una.", "glyphMargin": "Controlla se l'editor deve eseguire il rendering del margine verticale del glifo. Il margine del glifo viene usato principalmente per il debug.", "useTabStops": "Inserimento ed eliminazione dello spazio vuoto dopo le tabulazioni", diff --git a/i18n/ita/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/ita/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..9df481ec1b5 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "Non è stata trovata alcuna definizione per '{0}'", + "generic.noResults": "Non è stata trovata alcuna definizione", + "meta.title": " - Definizioni di {0}", + "actions.goToDecl.label": "Vai alla definizione", + "actions.goToDeclToSide.label": "Apri definizione lateralmente", + "actions.previewDecl.label": "Visualizza la definizione", + "goToImplementation.noResultWord": "Non sono state trovate implementazioni per '{0}'", + "goToImplementation.generic.noResults": "Non sono state trovate implementazioni", + "meta.implementations.title": "- {0} implementazioni", + "actions.goToImplementation.label": "Vai all'implementazione", + "actions.peekImplementation.label": "Anteprima implementazione", + "goToTypeDefinition.noResultWord": "Non sono state trovate definizioni di tipi per '{0}'", + "goToTypeDefinition.generic.noResults": "Non sono state trovate definizioni di tipi", + "meta.typeDefinitions.title": " - {0} definizioni di tipo", + "actions.goToTypeDefinition.label": "Vai alla definizione di tipo", + "actions.peekTypeDefinition.label": "Anteprima definizione di tipo" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/ita/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..fa526a1f9e6 --- /dev/null +++ b/i18n/ita/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Fare clic per visualizzare {0} definizioni." +} \ No newline at end of file diff --git a/i18n/ita/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/ita/src/vs/platform/markers/common/problemMatcher.i18n.json index a2611139aec..87b88acd388 100644 --- a/i18n/ita/src/vs/platform/markers/common/problemMatcher.i18n.json +++ b/i18n/ita/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -34,6 +34,7 @@ "ProblemMatcherParser.noValidIdentifier": "Errore: la proprietà {0} del criterio non è un nome di variabile criterio valido.", "ProblemMatcherParser.problemPattern.watchingMatcher": "Un matcher problemi deve definire un criterio di inizio e un criterio di fine per il controllo.", "ProblemMatcherParser.invalidRegexp": "Errore: la stringa {0} non è un'espressione regolare valida.\n", + "WatchingPatternSchema.regexp": "L'espressione regolare per rilevare l'inizio o la fine di un'attività in background.", "WatchingPatternSchema.file": "Indice del gruppo di corrispondenze del nome file. Può essere omesso.", "PatternTypeSchema.name": "Nome di un criterio predefinito o aggiunto come contributo", "PatternTypeSchema.description": "Criterio di problema o nome di un criterio di problema predefinito o aggiunto come contributo. Può essere omesso se si specifica base.", @@ -42,6 +43,12 @@ "ProblemMatcherSchema.severity": "Gravità predefinita per i problemi di acquisizione. Viene usato se il criterio non definisce un gruppo di corrispondenze per la gravità.", "ProblemMatcherSchema.applyTo": "Controlla se un problema segnalato in un documento di testo è valido solo per i documenti aperti o chiusi oppure per tutti i documenti.", "ProblemMatcherSchema.fileLocation": "Consente di definire come interpretare i nomi file indicati in un criterio di problema.", + "ProblemMatcherSchema.background": "Criteri per tenere traccia dell'inizio e della fine di un matcher attivo su un'attività in background.", + "ProblemMatcherSchema.background.activeOnStart": "Se impostato a true, il monitor in backbround è in modalità attiva quando l'attività inizia. Equivale a inviare una riga che corrisponde al beginPattern", + "ProblemMatcherSchema.background.beginsPattern": "Se corrisponde nell'output, viene segnalato l'avvio di un'attività in background.", + "ProblemMatcherSchema.background.endsPattern": "Se corrisponde nell'output, viene segnalata la fine di un'attività in background.", + "ProblemMatcherSchema.watching.deprecated": "La proprietà watching è deprecata. In alternativa, utilizzare background (sfondo).", + "ProblemMatcherSchema.watching": "Criteri per tenere traccia dell'inizio e della fine di un matcher watching.", "ProblemMatcherSchema.watching.activeOnStart": "Se impostato su true, indica che il watcher è in modalità attiva all'avvio dell'attività. Equivale a inviare una riga che corrisponde al criterio di avvio", "ProblemMatcherSchema.watching.beginsPattern": "Se corrisponde nell'output, viene segnalato l'avvio di un'attività di controllo.", "ProblemMatcherSchema.watching.endsPattern": "Se corrisponde nell'output, viene segnalata la fine di un'attività di controllo.", diff --git a/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json index c034a8cc727..b13e3a07bdd 100644 --- a/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,6 +7,7 @@ "view": "Visualizza", "help": "Guida", "file": "File", + "developer": "Sviluppatore", "showEditorTabs": "Controlla se visualizzare o meno gli editor aperti in schede.", "editorTabCloseButton": "Controlla la posizione dei pulsanti di chiusura delle schede dell'editor oppure li disabilita quando è impostata su 'off'.", "showIcons": "Controlla se visualizzare o meno un'icona per gli editor aperti. Richiede l'abilitazione anche di un tema dell'icona.", diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 8b6ad71cd4e..6c3f2e984e8 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "disableOtherKeymapsConfirmation": "Disabilitare altre mappature tastiera per evitare conflitti tra tasti di scelta rapida?", + "yes": "Sì", + "no": "No" +} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 5f1557087a0..a3c0e1da94b 100644 --- a/i18n/ita/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,7 +16,6 @@ "associations": "Consente di configurare le associazioni tra file e linguaggi, ad esempio \"*.extension\": \"html\". Queste hanno la precedenza sulle associazioni predefinite dei linguaggi installate.", "encoding": "Codifica del set di caratteri predefinita da usare durante la lettura e la scrittura di file.", "autoGuessEncoding": "Quando questa opzione è abilitata, la codifica del set di caratteri viene ipotizzata all'apertura dei file", - "eol": "Carattere di fine riga predefinito.", "trimTrailingWhitespace": "Se è abilitato, taglierà lo spazio vuoto quando si salva un file.", "insertFinalNewline": "Se è abilitato, inserisce un carattere di nuova riga finale alla fine del file durante il salvataggio.", "files.autoSave.off": "Un file dirty non viene mai salvato automaticamente.", diff --git a/i18n/ita/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/ita/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json index 18ae03ff77a..158ed123e7a 100644 --- a/i18n/ita/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -5,5 +5,9 @@ // Do not edit this file. It is machine generated. { "slow": "È stato rilevato un rallentamento all'avvio", - "slow.detail": "È stato appena rilevato un rallentamento all'avvio. Per consentire a Microsoft di analizzare e risolvere il problema, riavviare '{0}' con la profilatura abilitata e condividere i profili." + "slow.detail": "È stato appena rilevato un rallentamento all'avvio. Per consentire a Microsoft di analizzare e risolvere il problema, riavviare '{0}' con la profilatura abilitata e condividere i profili.", + "prof.message": "I profili sono stati creati.", + "prof.detail": "Creare un problema e allegare manualmente i file seguenti:\n{0}", + "prof.restartAndFileIssue": "Crea problema e riavvia", + "prof.restart": "Riavvia" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index d2d18b208df..01f19048853 100644 --- a/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,6 +5,11 @@ // Do not edit this file. It is machine generated. { "welcomePage": "Benvenuti", + "welcomePage.typeScript": "TypeScript", + "welcomePage.php": "PHP", + "welcomePage.vim": "Vim", + "welcomePage.sublime": "Sublime", + "welcomePage.atom": "Atom", "welcomePage.keymapAlreadyInstalled": "I tasti di scelta rapida di {0} sono già installati.", "welcomePage.willReloadAfterInstallingKeymap": "La finestra verrà ricaricata dopo l'installazione dei tasti di scelta rapida di {0}.", "welcomePage.installingKeymap": "Installazione dei tasti di scelta rapida di {0}...", diff --git a/i18n/jpn/extensions/jake/out/main.i18n.json b/i18n/jpn/extensions/jake/out/main.i18n.json index 8b6ad71cd4e..0f77342ecbc 100644 --- a/i18n/jpn/extensions/jake/out/main.i18n.json +++ b/i18n/jpn/extensions/jake/out/main.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "execFailed": "Jake のエラーによる失敗を自動検出: {0}" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/jake/package.i18n.json b/i18n/jpn/extensions/jake/package.i18n.json index 8b6ad71cd4e..def0eab1b4c 100644 --- a/i18n/jpn/extensions/jake/package.i18n.json +++ b/i18n/jpn/extensions/jake/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.jake.autoDetect": "Jake タスクの自動検出をオンにするかオフにするかを制御します。既定はオンです。" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/markdown/out/extension.i18n.json b/i18n/jpn/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/jpn/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/jpn/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/jpn/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/extensions/merge-conflict/package.i18n.json b/i18n/jpn/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/extensions/npm/package.i18n.json b/i18n/jpn/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript/package.i18n.json b/i18n/jpn/extensions/typescript/package.i18n.json index e30965564d0..d3f776eaa11 100644 --- a/i18n/jpn/extensions/typescript/package.i18n.json +++ b/i18n/jpn/extensions/typescript/package.i18n.json @@ -33,10 +33,13 @@ "javascript.validate.enable": "JavaScript の検証を有効/無効にします。", "typescript.goToProjectConfig.title": "プロジェクト構成に移動", "javascript.goToProjectConfig.title": "プロジェクト構成に移動", + "javascript.referencesCodeLens.enabled": "JavaScript ファイル内で CodeLens の参照を有効/無効にします。", + "typescript.referencesCodeLens.enabled": "TypeScript ファイル内で CodeLens の参照を有効/無効にします。TypeScript 2.0.6 以上が必要です。", "typescript.implementationsCodeLens.enabled": "CodeLens の実装を有効/無効にします。TypeScript 2.2.0 以上が必要です。", "typescript.openTsServerLog.title": "TS サーバーのログを開く", "typescript.selectTypeScriptVersion.title": "TypeScript のバージョンの選択", "jsDocCompletion.enabled": " 自動 JSDoc コメントを有効/無効にします", "javascript.implicitProjectConfig.checkJs": "JavaScript ファイルのセマンティック チェックを有効/無効にします。既存の jsconfi.json や tsconfi.json ファイルの設定はこれより優先されます。TypeScript は 2.3.1 以上である必要があります。", - "typescript.check.npmIsInstalled": "型定義の自動取得に NPM がインストールされているかどうかを確認する" + "typescript.check.npmIsInstalled": "型定義の自動取得に NPM がインストールされているかどうかを確認する", + "javascript.nameSuggestions": "JavaScript の候補リスト内でファイルから一意の名前を含むかどうかを有効/無効にします。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/jpn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index ea2e47d9813..e70844baf7b 100644 --- a/i18n/jpn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/jpn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,8 +6,6 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "イメージが大きすぎてエディターに表示できません。", - "resourceOpenExternalButton": "イメージを開く", - "resourceOpenExternalText": " 外部プログラムを使用していますか?", "nativeBinaryError": "このファイルはバイナリか、非常に大きいか、またはサポートされていないテキスト エンコードを使用しているため、エディターに表示されません。", "sizeB": "{0}B", "sizeKB": "{0}KB", diff --git a/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json index da6b50dacf0..8ce8d297e00 100644 --- a/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/jpn/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -41,7 +41,6 @@ "formatOnType": "エディターで入力後に自動的に行の書式設定を行うかどうかを制御します", "formatOnPaste": "貼り付けた内容がエディターにより自動的にフォーマットされるかどうかを制御します。フォーマッタを使用可能にする必要があります。また、フォーマッタがドキュメント内の範囲をフォーマットできなければなりません。", "suggestOnTriggerCharacters": "トリガー文字の入力時に候補が自動的に表示されるようにするかどうかを制御します", - "acceptSuggestionOnEnter": "'Tab' キーに加えて 'Enter' キーで候補を受け入れるかどうかを制御します。改行の挿入や候補の反映の間であいまいさを解消するのに役立ちます。", "acceptSuggestionOnCommitCharacter": "コミット文字で候補を受け入れるかどうかを制御します。たとえば、JavaScript ではセミコロン (';') をコミット文字にして、候補を受け入れてその文字を入力することができます。", "snippetSuggestions": "他の修正候補と一緒にスニペットを表示するかどうか、およびその並び替えの方法を制御します。", "emptySelectionClipboard": "選択範囲を指定しないでコピーする場合に現在の行をコピーするかどうかを制御します。", @@ -63,6 +62,7 @@ "renderLineHighlight": "エディターが現在の行をどのように強調表示するかを制御します。考えられる値は 'none'、'gutter'、'line'、'all' です。", "codeLens": "エディターで CodeLens を表示するかどうかを制御する", "folding": "エディターでコードの折りたたみを有効にするかどうかを制御します", + "showFoldingControls": "余白上の折りたたみコントロールを自動的に非表示にするかどうかを制御します 。", "matchBrackets": "かっこを選択すると、対応するかっこを強調表示します。", "glyphMargin": "エディターで縦のグリフ余白が表示されるかどうかを制御します。ほとんどの場合、グリフ余白はデバッグに使用されます。", "useTabStops": "空白の挿入や削除はタブ位置に従って行われます", diff --git a/i18n/jpn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/jpn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..624f9b7af70 --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "'{0}' の定義は見つかりません", + "generic.noResults": "定義が見つかりません", + "meta.title": " – {0} 個の定義", + "actions.goToDecl.label": "定義へ移動", + "actions.goToDeclToSide.label": "定義を横に開く", + "actions.previewDecl.label": "定義をここに表示", + "goToImplementation.noResultWord": "'{0}' の実装が見つかりません", + "goToImplementation.generic.noResults": "実装が見つかりません", + "meta.implementations.title": "– {0} 個の実装", + "actions.goToImplementation.label": "実装に移動", + "actions.peekImplementation.label": "実装のプレビュー", + "goToTypeDefinition.noResultWord": "'{0}' の型定義が見つかりません", + "goToTypeDefinition.generic.noResults": "型定義が見つかりません", + "meta.typeDefinitions.title": " – {0} 個の型定義", + "actions.goToTypeDefinition.label": "型定義へ移動", + "actions.peekTypeDefinition.label": "型定義を表示" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/jpn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..f918ba9f96d --- /dev/null +++ b/i18n/jpn/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "クリックして、{0} の定義を表示します。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json index b5c107a4338..65e2583d291 100644 --- a/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -12,6 +12,7 @@ "readMore": "詳細を表示...{0}", "suggestionWithDetailsAriaLabel": "{0}、候補、詳細あり", "suggestionAriaLabel": "{0}、候補", + "readLess": "詳細を隠す...{0}", "suggestWidget.loading": "読み込んでいます...", "suggestWidget.noSuggestions": "候補はありません。", "suggestionAriaAccepted": "{0}、受け入れ済み", diff --git a/i18n/jpn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json b/i18n/jpn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json index 991783c6602..7f3e60f73e4 100644 --- a/i18n/jpn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json +++ b/i18n/jpn/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json @@ -16,6 +16,7 @@ "schema.autoClosingPairs": "角かっこのペアを定義します。左角かっこが入力されると、右角かっこが自動的に挿入されます。", "schema.autoClosingPairs.notIn": "自動ペアが無効なスコープの一覧を定義します。", "schema.surroundingPairs": "選択文字列を囲むときに使用できる角かっこのペアを定義します。", + "schema.wordPattern": "言語のための単語の定義。", "schema.wordPattern.pattern": "言葉の照合に使用する正規表現パターン。", "schema.wordPattern.flags": "言葉の照合に使用する正規表現フラグ。", "schema.wordPattern.flags.errorMessage": "`/^([gimuy]+)$/` パターンに一致する必要があります。" diff --git a/i18n/jpn/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/jpn/src/vs/platform/markers/common/problemMatcher.i18n.json index 2bbfe1d0b1d..df4f3d19acd 100644 --- a/i18n/jpn/src/vs/platform/markers/common/problemMatcher.i18n.json +++ b/i18n/jpn/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -34,6 +34,7 @@ "ProblemMatcherParser.noValidIdentifier": "エラー: パターン プロパティ {0} は有効なパターン変数名ではありません。", "ProblemMatcherParser.problemPattern.watchingMatcher": "問題マッチャーは、ウォッチ対象の開始パターンと終了パターンの両方を定義する必要があります。", "ProblemMatcherParser.invalidRegexp": "エラー: 文字列 {0} は、有効な正規表現ではありません。\n", + "WatchingPatternSchema.regexp": "バックグラウンド タスクの開始または終了を検出する正規表現。", "WatchingPatternSchema.file": "ファイル名の一致グループ インデックス。省略できます。", "PatternTypeSchema.name": "提供されたか事前定義された問題パターンの名前", "PatternTypeSchema.description": "A problem pattern or the name of a contributed or predefined problem pattern. Can be omitted if base is specified.", @@ -42,6 +43,12 @@ "ProblemMatcherSchema.severity": "キャプチャされた問題の既定の重大度。パターンが重要度の一致グループを定義していない場合に使用されます。", "ProblemMatcherSchema.applyTo": "テキスト ドキュメントで報告された問題が、開いているドキュメントのみ、閉じられたドキュメントのみ、すべてのドキュメントのいずれに適用されるかを制御します。", "ProblemMatcherSchema.fileLocation": "問題パターンで報告されたファイル名を解釈する方法を定義します。", + "ProblemMatcherSchema.background": "バックグラウンド タスクでアクティブなマッチャーの開始と終了を追跡するパターン。", + "ProblemMatcherSchema.background.activeOnStart": "true に設定すると、タスクの開始時にバックグラウンド モニターがアクティブ モードになります。これは beginPattern と一致する行の発行と同等です。", + "ProblemMatcherSchema.background.beginsPattern": "出力内で一致すると、バックグラウンド タスクの開始が通知されます。", + "ProblemMatcherSchema.background.endsPattern": "出力内で一致すると、バックグラウンド タスクの終了が通知されます。", + "ProblemMatcherSchema.watching.deprecated": "watching プロパティは使用されなくなりました。代わりに background をご使用ください。", + "ProblemMatcherSchema.watching": "監視パターンの開始と終了を追跡するマッチャー。", "ProblemMatcherSchema.watching.activeOnStart": "true に設定すると、タスクの開始時にウォッチャーがアクティブ モードになります。これは beginPattern と一致する行の発行と同等です。", "ProblemMatcherSchema.watching.beginsPattern": "出力内で一致すると、ウォッチ中のタスクの開始が通知されます。", "ProblemMatcherSchema.watching.endsPattern": "出力内で一致すると、ウォッチ中のタスクの終了が通知されます。", diff --git a/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json index 8da89f6115c..9872f49057d 100644 --- a/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json +++ b/i18n/jpn/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -60,6 +60,7 @@ "editorBackground": "エディターの背景色。", "editorForeground": "エディターの既定の前景色。", "editorWidgetBackground": "検索/置換窓など、エディター ウィジェットの背景色。", + "editorWidgetBorder": "エディター ウィジェットの境界線の色。", "editorSelection": "エディターの選択範囲の色。", "editorInactiveSelection": "非アクティブなエディターの選択範囲の色。", "editorSelectionHighlight": "選択範囲と同じコンテンツの領域の色。", diff --git a/i18n/jpn/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/jpn/src/vs/workbench/api/node/extHostTreeViews.i18n.json index 8b6ad71cd4e..74c5f0eabd7 100644 --- a/i18n/jpn/src/vs/workbench/api/node/extHostTreeViews.i18n.json +++ b/i18n/jpn/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "treeView.notRegistered": "ID '{0}' のツリー ビューは登録されていません。", + "treeItem.notFound": "ID '{0}' のツリー項目は見つかりませんでした。", + "treeView.duplicateElement": " {0} 要素は既に登録されています。" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/common/theme.i18n.json b/i18n/jpn/src/vs/workbench/common/theme.i18n.json index b361c556bdc..d183c267924 100644 --- a/i18n/jpn/src/vs/workbench/common/theme.i18n.json +++ b/i18n/jpn/src/vs/workbench/common/theme.i18n.json @@ -32,6 +32,7 @@ "activityBarBadgeBackground": "アクティビティ通知バッジの背景色。アクティビティ バーは左端または右端に表示され、サイド バーの表示を切り替えることができます。", "activityBarBadgeForeground": "アクティビティ通知バッジの前景色。アクティビティ バーは左端または右端に表示され、サイド バーの表示を切り替えることができます。", "sideBarBackground": "サイド バーの背景色。サイド バーは、エクスプローラーや検索などのビューが入るコンテナーです。", + "sideBarForeground": "サイド バーの前景色。サイド バーは、エクスプローラーや検索などのビューが入るコンテナーです。", "sideBarTitleForeground": "サイド バーのタイトルの前景色。サイド バーは、エクスプローラーや検索などのビューが入るコンテナーです。", "sideBarSectionHeaderBackground": "サイド バーのセクション ヘッダーの背景色。サイド バーは、エクスプローラーや検索などのビューが入るコンテナーです。", "titleBarActiveForeground": "ウィンドウがアクティブな場合のタイトル バーの前景。現在、この色は macOS でのみサポートされているのでご注意ください。", diff --git a/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json index e69cb0fb627..d813d5f6c23 100644 --- a/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,6 +7,7 @@ "view": "表示", "help": "ヘルプ", "file": "ファイル", + "developer": "開発者", "showEditorTabs": "開いているエディターをタブに表示するかどうかを制御します。", "editorTabCloseButton": "エディター タブの閉じるボタンの位置を制御するか、[off] に設定した場合に無効にします。", "showIcons": "開いているエディターをアイコンで表示するかどうかを制御します。これには、アイコンのテーマを有効にする必要もあります。", diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json index e57fd60ee0d..8943a8809bd 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json @@ -6,5 +6,6 @@ { "copyValue": "値のコピー", "copy": "コピー", + "copyAll": "すべてコピー", "copyStackTrace": "呼び出し履歴のコピー" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json index af68e40b4ae..d63fe387f50 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -7,6 +7,7 @@ "debugAdapterBinNotFound": "デバッグ アダプターの実行可能ファイル '{0}' がありません。", "debugAdapterCannotDetermineExecutable": "デバッグ アダプター '{0}' の実行可能ファイルを判別できません。", "debugType": "構成の種類。", + "debugTypeNotRecognised": "デバッグの種類は認識されませんでした。対応するデバッグの拡張機能がインストールされており、有効になっていることを確認してください。", "node2NotSupported": "\"node2\" はサポートされていません。代わりに \"node\" を使用し、\"protocol\" 属性を \"inspector\" に設定してください。", "debugName": "構成の名前。起動構成のドロップダウン メニューに表示されます。", "debugRequest": "構成の要求の種類。\"launch\" または \"attach\" です。", diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 8b6ad71cd4e..e5b2af33ec3 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "disableOtherKeymapsConfirmation": "キーバインド間の競合を回避するために、他のキーマップを無効にしますか?", + "yes": "はい", + "no": "いいえ" +} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 15c3aee15db..9356fa119aa 100644 --- a/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,7 +16,6 @@ "associations": "言語に対するファイルの関連付け (例 \"*.extension\": \"html\") を構成します。これらの関連付けは、インストールされている言語の既定の関連付けより優先されます。", "encoding": "ファイルの読み取り/書き込みで使用する既定の文字セット エンコーディング。", "autoGuessEncoding": "有効な場合、ファイルを開くときに文字セット エンコードを推測します", - "eol": "既定の改行文字。", "trimTrailingWhitespace": "有効にすると、ファイルの保存時に末尾の空白をトリミングします。", "insertFinalNewline": "有効にすると、ファイルの保存時に最新の行を末尾に挿入します。", "files.autoSave.off": "ダーティ ファイルを自動的に保存することはしません。", @@ -27,6 +26,8 @@ "autoSaveDelay": "ダーティ ファイルの自動保存の遅延をミリ秒単位で制御します。'files.autoSave' が '{0}' に設定されている場合のみ適用されます", "watcherExclude": "ファイル モニタリングから除外するファイル パスの glob パターンを構成します。この設定を変更すると、再起動が必要になります。始動時に Code が消費する CPU 時間が多い場合は、大規模なフォルダーを除外して初期ロードを減らせます。", "hotExit.off": "Hot Exit を無効にします。", + "hotExit.onExit": "アプリケーションが閉じると (Windows/Linux で最後のウィンドウが閉じるとき、または workbench.action.quit コマンドがトリガーされるとき (コマンド パレット、キー バインド、メニュー))、Hot Exit がトリガーされます。バックアップされているすべてのウィンドウは、次の起動時に復元されます。", + "hotExit.onExitAndWindowClose": "アプリケーションが閉じると (Windows/Linux で最後のウィンドウが閉じるとき、または workbench.action.quit コマンドがトリガーするとき (コマンド パレット、キー バインド、メニュー))、Hot Exit がトリガーされます。また、フォルダーが開かれているウィンドウについても、それが最後のウィンドウかどうかに関係なく、Hot Exit がトリガーされます。フォルダーが開かれていないウィンドウはすべて、次回の起動時に復元されます。フォルダーのウィンドウをシャットダウン前と同じ状態に復元するには、\"window.reopenFolders\" を \"all\" に設定します。", "hotExit": "エディターを終了するときに保存を確認するダイアログを省略し、保存されていないファイルをセッション後も保持するかどうかを制御します。", "defaultLanguage": "新しいファイルに割り当てられる既定の言語モード。", "editorConfigurationTitle": "エディター", diff --git a/i18n/jpn/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json index a71fcb6fc94..e14e57a90eb 100644 --- a/i18n/jpn/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -5,5 +5,11 @@ // Do not edit this file. It is machine generated. { "slow": "スタートアップの遅延が検出されました", - "slow.detail": "スタートアップが遅かったとのこと、申し訳ございません。プロファイルを有効にして、'{0}' を再起動し、プロファイルを共有してください。スタートアップの改善のために参考にさせていただきます。" + "slow.detail": "スタートアップが遅かったとのこと、申し訳ございません。プロファイルを有効にして、'{0}' を再起動し、プロファイルを共有してください。スタートアップの改善のために参考にさせていただきます。", + "prof.message": "プロファイルが正常に作成されました。", + "prof.detail": "案件を作成し、手動で次のファイルを添付してください:\\n{0}", + "prof.restartAndFileIssue": "問題を作成して再起動", + "prof.restart": "再起動", + "prof.thanks": "ご協力いただき、ありがとうございます。", + "prof.detail.restart": "'{0}' を引き続き使用するには、最後の再起動が必要です。 改めてあなたの貢献に感謝します。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json index 0a35cdb1be9..dba4d278b14 100644 --- a/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "errorInvalidConfiguration": "設定を書き込めません。ファイル内のエラー/警告を修正してからもう一度お試しください。", "editTtile": "編集", "replaceDefaultValue": "設定を置換", "copyDefaultValue": "設定にコピー", diff --git a/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json index b650b0b0eb3..d45b8437459 100644 --- a/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json @@ -5,6 +5,7 @@ // Do not edit this file. It is machine generated. { "toggleGitViewlet": "Git を表示", + "installAdditionalSCMProviders": "その他の SCM プロバイダーをインストール...", "source control": "ソース管理", "toggleSCMViewlet": "SCM を表示", "view": "表示" diff --git a/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json b/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json index d53de2c62b0..d93c7d2fb84 100644 --- a/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { + "installAdditionalSCMProviders": "その他の SCM プロバイダーをインストール...", "switch provider": "SCM プロバイダーの切り替え..." } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json index c0432625724..f7db07a2e2d 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json @@ -4,5 +4,7 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "entryAriaLabel": "{0}, tasks" + "entryAriaLabel": "{0}, tasks", + "workspace": "ワークスペースから", + "extension": "拡張機能から" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json index 37bbf2ce2e0..1e77cbdffdf 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json @@ -5,6 +5,6 @@ // Do not edit this file. It is machine generated. { "tasksAriaLabel": "再開するタスクの名前を入力します", - "noTasksMatching": "No tasks matching", + "noTasksMatching": "一致するタスクがありません", "noTasksFound": "再開するタスクはありません" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json index 99543dd018a..5a397f34e03 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json @@ -5,6 +5,6 @@ // Do not edit this file. It is machine generated. { "tasksAriaLabel": "実行するタスクの名前を入力します", - "noTasksMatching": "No tasks matching", + "noTasksMatching": "一致するタスクがありません", "noTasksFound": "タスクが見つかりません" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json index 12b9c699bf2..440b92fd91d 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -6,5 +6,6 @@ { "TerminalTaskSystem.unknownError": "タスクの実行中に不明なエラーが発生しました。詳細については、タスク出力ログを参照してください。", "TerminalTaskSystem.terminalName": "タスク - {0}", - "TerminalTaskSystem": "UNC ドライブでシェル コマンドを実行できません。" + "TerminalTaskSystem": "UNC ドライブでシェル コマンドを実行できません。", + "unkownProblemMatcher": "問題マッチャー {0} は解決できませんでした。マッチャーは無視されます" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json b/i18n/jpn/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json index 6f9be6076a6..0cc1f921982 100644 --- a/i18n/jpn/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json @@ -7,5 +7,6 @@ "TaskRunnerSystem.unknownError": "タスクの実行中に不明なエラーが発生しました。詳細については、タスク出力ログを参照してください。", "TaskRunnerSystem.watchingBuildTaskFinished": "\nビルド タスクのウォッチが終了しました。", "TaskRunnerSystem.childProcessError": "Failed to launch external program {0} {1}.", - "TaskRunnerSystem.cancelRequested": "\nユーザー要求ごとにタスク '{0}' が終了しました。" + "TaskRunnerSystem.cancelRequested": "\nユーザー要求ごとにタスク '{0}' が終了しました。", + "unkownProblemMatcher": "問題マッチャー {0} は解決できませんでした。マッチャーは無視されます" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json index 799b12a797b..e7930c9cd7a 100644 --- a/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -26,5 +26,7 @@ "workbench.action.terminal.scrollUp": "上にスクロール (行)", "workbench.action.terminal.scrollUpPage": "スクロール アップ (ページ)", "workbench.action.terminal.scrollToTop": "一番上にスクロール", - "workbench.action.terminal.clear": "クリア" + "workbench.action.terminal.clear": "クリア", + "workbench.action.terminal.allowWorkspaceShell": "ワークスペースでシェルを構成することを許可する", + "workbench.action.terminal.disallowWorkspaceShell": "ワークスペースでシェルを構成することを許可しない" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json index 89ac9d8c928..7592dde26b5 100644 --- a/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -6,6 +6,7 @@ { "selectTheme.label": "配色テーマ", "installColorThemes": "その他の配色テーマをインストール...", + "themes.selectTheme": "配色テーマの選択 (上/下キーでプレビュー可能)", "selectIconTheme.label": "ファイル アイコンのテーマ", "installIconThemes": "その他のファイル アイコンのテーマをインストール...", "noIconThemeLabel": "なし", diff --git a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json index 587eecb5f9d..950f340d9ae 100644 --- a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -11,18 +11,25 @@ "welcomePage.openFolder": "フォルダーを開く...", "welcomePage.cloneGitRepository": "Git リポジトリを複製...", "welcomePage.recent": "最近", + "welcomePage.moreRecent": "その他", "welcomePage.noRecentFolders": "最近使用したフォルダーなし", "welcomePage.help": "ヘルプ", + "welcomePage.keybindingsCheatsheet": "印刷可能なキーボードのチートシート", "welcomePage.introductoryVideos": "紹介ビデオ", "welcomePage.productDocumentation": "製品ドキュメント", "welcomePage.gitHubRepository": "GitHub リポジトリ", "welcomePage.stackOverflow": "Stack Overflow", "welcomePage.showOnStartup": "起動時にウェルカム ページを表示", "welcomePage.customize": "カスタマイズする", + "welcomePage.installExtensionPacks": "ツールと言語", + "welcomePage.installExtensionPacksDescription": "{0} と {1} のサポートをインストールする ", + "welcomePage.moreExtensions": "その他", "welcomePage.installKeymapDescription": "キーボード ショートカットをインストールします", + "welcomePage.installKeymapExtension": "{0} と {1} のキーボード ショートカットをインストール", "welcomePage.others": "その他", "welcomePage.colorTheme": "配色テーマ", "welcomePage.colorThemeDescription": "エディターとコードの外観を自由に設定します", + "welcomePage.learn": "学ぶ", "welcomePage.showCommands": "すべてのコマンドの検索と実行", "welcomePage.showCommandsDescription": "コントロール パネルからコマンドを検索してすばやくアクセスします ({0})", "welcomePage.interfaceOverview": "インターフェイスの概要", diff --git a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index 07b2eb85861..eba406025bb 100644 --- a/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,11 +5,27 @@ // Do not edit this file. It is machine generated. { "welcomePage": "ようこそ", + "welcomePage.javaScript": "JavaScript", + "welcomePage.typeScript": "TypeScript", + "welcomePage.python": "Python", + "welcomePage.php": "PHP", + "welcomePage.docker": "Docker", + "welcomePage.vim": "Vim", + "welcomePage.sublime": "Sublime", + "welcomePage.atom": "Atom", + "welcomePage.extensionPackAlreadyInstalled": "{0} のサポートは既にインストールされています。", + "welcomePage.willReloadAfterInstallingExtensionPack": "{0} のサポートをインストールした後、ウィンドウが再度読み込まれます。", + "welcomePage.installingExtensionPack": "{0} のサポートをインストール...", + "welcomePage.extensionPackNotFound": "ID {1} のサポート {0} は見つかりませんでした。", "welcomePage.keymapAlreadyInstalled": "キーボード ショートカット {0} は既にインストールされています。", "welcomePage.willReloadAfterInstallingKeymap": "キーボード ショートカット {0} をインストールした後、ウィンドウが再度読み込まれます。", "welcomePage.installingKeymap": "{0} のキーボード ショートカットをインストールしています...", "welcomePage.keymapNotFound": "ID {1} のキーボード ショートカット {0} は見つかりませんでした。", "welcome.title": "ようこそ", + "welcomePage.extensionListSeparator": ",", + "welcomePage.installedExtension": "{0} (インストール済み) ", "ok": "OK", - "cancel": "キャンセル" + "cancel": "キャンセル", + "welcomePage.quickLinkBackground": "ウェルカム ページのクイック リンクの背景色。", + "welcomePage.quickLinkHoverBackground": "ウェルカム ページのクイック リンクのホバー背景色。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json index 0c7056bc9fc..81d7a645e32 100644 --- a/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json +++ b/i18n/jpn/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -6,6 +6,7 @@ { "open": "設定を開く", "close": "閉じる", + "saveAndRetry": "設定を保存して再試行", "errorUnknownKey": "構成ファイルに書き込めません (不明なキー)", "errorInvalidTarget": "構成ファイルに書き込めません (無効なターゲット)", "errorNoWorkspaceOpened": "開いているフォルダーがないため、設定を書き込めません。最初にフォルダーを開いてから、もう一度お試しください。", diff --git a/i18n/kor/extensions/markdown/out/extension.i18n.json b/i18n/kor/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/kor/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/kor/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/kor/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/extensions/merge-conflict/package.i18n.json b/i18n/kor/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/extensions/npm/package.i18n.json b/i18n/kor/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/kor/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index def2cd28d67..4266985efc9 100644 --- a/i18n/kor/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/kor/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,8 +6,6 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "이미지가 너무 커서 편집기에 표시할 수 없습니다. ", - "resourceOpenExternalButton": "이미지 열기", - "resourceOpenExternalText": " 외부 프로그램을 사용할까요?", "nativeBinaryError": "파일이 이진이거나 매우 크거나 지원되지 않는 텍스트 인코딩을 사용하기 때문에 편집기에서 표시되지 않습니다.", "sizeB": "{0}B", "sizeKB": "{0}KB", diff --git a/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json index 18538323353..18aff6704be 100644 --- a/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/kor/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -40,7 +40,6 @@ "formatOnType": "입력 후 편집기에서 자동으로 줄의 서식을 지정할지 여부를 제어합니다.", "formatOnPaste": "붙여넣은 콘텐츠의 서식을 편집기에서 자동으로 지정할지 여부를 제어합니다. 포맷터는 반드시 사용할 수 있어야 하며 문서에서 범위의 서식을 지정할 수 있어야 합니다.", "suggestOnTriggerCharacters": "트리거 문자를 입력할 때 제안을 자동으로 표시할지 여부를 제어합니다.", - "acceptSuggestionOnEnter": "'Tab' 키 외에 'Enter' 키에 대한 제안도 허용할지를 제어합니다. 새 줄을 삽입하는 동작과 제안을 허용하는 동작 간의 모호함을 없앨 수 있습니다.", "acceptSuggestionOnCommitCharacter": "커밋 문자에 대한 제안을 허용할지를 제어합니다. 예를 들어 JavaScript에서는 세미콜론(';')이 제안을 허용하고 해당 문자를 입력하는 커밋 문자일 수 있습니다.", "snippetSuggestions": "코드 조각이 다른 추천과 함께 표시되는지 여부 및 정렬 방법을 제어합니다.", "emptySelectionClipboard": "선택 영역 없이 현재 줄 복사 여부를 제어합니다.", diff --git a/i18n/kor/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/kor/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..eb7148607bd --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "'{0}'에 대한 정의를 찾을 수 없습니다.", + "generic.noResults": "정의를 찾을 수 없음", + "meta.title": "– {0} 정의", + "actions.goToDecl.label": "정의로 이동", + "actions.goToDeclToSide.label": "측면에서 정의 열기", + "actions.previewDecl.label": "정의 피킹(Peeking)", + "goToImplementation.noResultWord": "'{0}'에 대한 구현을 찾을 수 없습니다.", + "goToImplementation.generic.noResults": "구현을 찾을 수 없습니다.", + "meta.implementations.title": " – {0} 개 구현", + "actions.goToImplementation.label": "구현으로 이동", + "actions.peekImplementation.label": "구현 미리 보기", + "goToTypeDefinition.noResultWord": "'{0}'에 대한 형식 정의를 찾을 수 없습니다.", + "goToTypeDefinition.generic.noResults": "형식 정의를 찾을 수 없습니다.", + "meta.typeDefinitions.title": "– {0} 형식 정의", + "actions.goToTypeDefinition.label": "형식 정의로 이동", + "actions.peekTypeDefinition.label": "형식 정의 미리 보기" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/kor/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..57b4929798f --- /dev/null +++ b/i18n/kor/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "{0}개 정의를 표시하려면 클릭하세요." +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json index 603999dbae9..4c30f4bc75c 100644 --- a/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,6 +7,7 @@ "view": "보기", "help": "도움말", "file": "파일", + "developer": "개발자", "showEditorTabs": "열려 있는 편집기를 탭에서 표시할지 여부를 제어합니다.", "editorTabCloseButton": "편집기의 탭 닫기 단추의 위치를 제어하거나 'off'로 설정된 경우 이 단추를 사용하지 않도록 설정합니다.", "showIcons": "열린 편집기를 아이콘과 함께 표시할지 여부를 제어합니다. 이를 위해서는 아이콘 테마도 사용하도록 설정해야 합니다.", diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 8b6ad71cd4e..86d18d9fce3 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "disableOtherKeymapsConfirmation": "키 바인딩 간 충돌을 피하기 위해 다른 키 맵을 사용하지 않도록 설정할까요?", + "yes": "예", + "no": "아니요" +} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index f9b799b1655..fe8ef9500ce 100644 --- a/i18n/kor/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,7 +16,6 @@ "associations": "파일과 언어의 연결을 구성하세요(예: \"*.extension\": \"html\"). 이러한 구성은 설치된 언어의 기본 연결보다 우선 순위가 높습니다.", "encoding": "파일을 읽고 쓸 때 사용할 기본 문자 집합 인코딩입니다.", "autoGuessEncoding": "사용하도록 설정하는 경우 파일을 열 때 문자 집합 인코딩을 추측합니다.", - "eol": "줄 바꿈 문자의 기본 끝입니다.", "trimTrailingWhitespace": "사용하도록 설정되면 파일을 저장할 때 후행 공백이 잘립니다.", "insertFinalNewline": "사용하도록 설정되면 저장할 때 파일 끝에 마지막 줄바꿈을 삽입합니다.", "files.autoSave.off": "더티 파일이 자동으로 저장되지 않습니다.", diff --git a/i18n/kor/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/kor/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json index 4b931297269..ef1cdc9bc09 100644 --- a/i18n/kor/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -5,5 +5,9 @@ // Do not edit this file. It is machine generated. { "slow": "느린 시작 감지됨", - "slow.detail": "방금 느리게 시작되었습니다. 프로파일링을 사용하도록 설정한 상태로 '{0}'을(를) 다시 시작하세요. 프로필을 공유해 주시면 다시 빠르게 시작될 수 있도록 최선을 다하겠습니다." + "slow.detail": "방금 느리게 시작되었습니다. 프로파일링을 사용하도록 설정한 상태로 '{0}'을(를) 다시 시작하세요. 프로필을 공유해 주시면 다시 빠르게 시작될 수 있도록 최선을 다하겠습니다.", + "prof.message": "프로필을 만들었습니다.", + "prof.detail": "문제를 발생시키고 다음 파일을 수동으로 첨부하세요.\n{0}", + "prof.restartAndFileIssue": "문제 만들기 및 다시 시작", + "prof.restart": "다시 시작" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index cb5666d331a..a436e5a707b 100644 --- a/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,6 +5,11 @@ // Do not edit this file. It is machine generated. { "welcomePage": "시작", + "welcomePage.typeScript": "TypeScript", + "welcomePage.php": "PHP", + "welcomePage.vim": "Vim", + "welcomePage.sublime": "Sublime", + "welcomePage.atom": "Atom", "welcomePage.keymapAlreadyInstalled": "{0} 바로 가기 키가 이미 설치되어 있습니다.", "welcomePage.willReloadAfterInstallingKeymap": "{0} 바로 가기 키를 설치한 후 창이 다시 로드됩니다.", "welcomePage.installingKeymap": "{0} 바로 가기 키를 설치하는 중...", diff --git a/i18n/ptb/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json b/i18n/ptb/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json new file mode 100644 index 00000000000..74a80b4280d --- /dev/null +++ b/i18n/ptb/extensions/configuration-editing/out/settingsDocumentHelper.i18n.json @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "activeEditorShort": "e.g. meuArquivo.txt", + "activeEditorMedium": "e.g. minhaPasta/meuArquivo.txt", + "activeEditorLong": "e.g. /Usuarios/Desenvolvimento/meuProjeto/minhaPasta/meuArquivo.txt", + "rootName": "e.g. meuProjeto", + "rootPath": "e.g. /Usuarios/Desenvolvimento/meuProjeto", + "appName": "e.g. VS Code", + "dirty": "Um indicador de alteração se o editor ativo foi alterado", + "separator": "um separador condicional (' - ') que somente é mostrado quando envolvido por variáveis com valores", + "assocLabelFile": "Arquivos com Extensão", + "assocDescriptionFile": "Mapear todos arquivos que correspondem ao padrão global no seu nome de arquivo à linguagem com o identificador dado", + "assocLabelPath": "Arquivos com Caminho", + "assocDescriptionPath": "Mapear todos os arquivos que correspondem ao caminho absoluto global no seu caminho à linguagem com o identificador dado", + "fileLabel": "Arquivos por Extensão", + "fileDescription": "Combina todos os arquivos de uma extensão de arquivo específica.", + "filesLabel": "Arquivos com Várias Extensões", + "filesDescription": "Combina todos os arquivos com qualquer uma das extensões de arquivo.", + "derivedLabel": "Arquivos com Irmãos por Nome", + "derivedDescription": "Combina arquivos que têm irmãos com o mesmo nome, mas uma extensão diferente.", + "topFolderLabel": "Pasta por Nome (Nível Superior)", + "topFolderDescription": "Combina uma pasta de nível superior com um nome específico.", + "topFoldersLabel": "Pastas com Vários Nomes (Nível Superior)", + "topFoldersDescription": "Combina várias pastas de nível superior.", + "folderLabel": "Pasta por Nome (Qualquer Local)", + "folderDescription": "Combina uma pasta com um nome específico em qualquer local.", + "falseDescription": "Desabilita o padrão.", + "trueDescription": "Habilita o padrão.", + "siblingsDescription": "Combina arquivos que têm irmãos com o mesmo nome, mas uma extensão diferente.", + "languageSpecificEditorSettings": "Configurações do editor especificas para a linguagem", + "languageSpecificEditorSettingsDescription": "Sobrescrever as configurações do editor para a linguagem" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/css/client/out/cssMain.i18n.json b/i18n/ptb/extensions/css/client/out/cssMain.i18n.json new file mode 100644 index 00000000000..a649796227b --- /dev/null +++ b/i18n/ptb/extensions/css/client/out/cssMain.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "cssserver.name": "Servidor de linguagem CSS" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/css/package.i18n.json b/i18n/ptb/extensions/css/package.i18n.json new file mode 100644 index 00000000000..de011d44dce --- /dev/null +++ b/i18n/ptb/extensions/css/package.i18n.json @@ -0,0 +1,67 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "css.lint.argumentsInColorFunction.desc": "Número inválido de parâmetros", + "css.lint.boxModel.desc": "Não use largura ou altura ao usar preenchimento ou borda", + "css.lint.compatibleVendorPrefixes.desc": "Ao usar um prefixo específico de fornecedor, certifique-se de também incluir todas as outras propriedades específicas do fornecedor", + "css.lint.duplicateProperties.desc": "Não use as definições de estilo duplicadas", + "css.lint.emptyRules.desc": "Não use conjuntos de regra em branco", + "css.lint.float.desc": "Evite usar 'float'. Floats levam a CSS frágil, que é fácil de quebrar se um aspecto do layout for alterado.", + "css.lint.fontFaceProperties.desc": "A regra @font-face deve definir propriedades 'src' e 'font-family'", + "css.lint.hexColorLength.desc": "Cores hexadecimais devem consistir em três ou seis números hexadecimais", + "css.lint.idSelector.desc": "Seletores não devem conter IDs, pois essas regras estão firmemente acopladas ao HTML.", + "css.lint.ieHack.desc": "IE hacks somente são necessários ao dar suporte ao IE7 e mais antigos", + "css.lint.important.desc": "Evite usar !important. Esta é uma indicação de que a especificidade do CSS inteiro saiu de controle e precisa ser fatorada novamente.", + "css.lint.importStatement.desc": "Instruções de importação não carregam em paralelo", + "css.lint.propertyIgnoredDueToDisplay.desc": "Propriedade ignorada devido à exibição. Por exemplo, com 'display: inline', as propriedades width, height, margin-top, margin-bottom e float não têm efeito", + "css.lint.universalSelector.desc": "O seletor universal (*) é conhecido por ser lento", + "css.lint.unknownProperties.desc": "Propriedade desconhecida.", + "css.lint.unknownVendorSpecificProperties.desc": "Propriedade específica do fornecedor desconhecida.", + "css.lint.vendorPrefix.desc": "Ao usar um prefixo específico do fornecedor, inclua também a propriedade padrão", + "css.lint.zeroUnits.desc": "Nenhuma unidade para zero é necessária", + "css.validate.desc": "Habilita ou desabilita todas as validações", + "less.lint.argumentsInColorFunction.desc": "Número inválido de parâmetros", + "less.lint.boxModel.desc": "Não use largura ou altura ao usar preenchimento ou borda", + "less.lint.compatibleVendorPrefixes.desc": "Ao usar um prefixo específico de fornecedor, certifique-se de também incluir todas as outras propriedades específicas do fornecedor", + "less.lint.duplicateProperties.desc": "Não use as definições de estilo duplicadas", + "less.lint.emptyRules.desc": "Não use conjuntos de regra em branco", + "less.lint.float.desc": "Evite usar 'float'. Floats levam a CSS frágil, que é fácil de quebrar se um aspecto do layout for alterado.", + "less.lint.fontFaceProperties.desc": "A regra @font-face deve definir propriedades 'src' e 'font-family'", + "less.lint.hexColorLength.desc": "Cores hexadecimais devem consistir em três ou seis números hexadecimais", + "less.lint.idSelector.desc": "Seletores não devem conter IDs, pois essas regras estão firmemente acopladas ao HTML.", + "less.lint.ieHack.desc": "IE hacks somente são necessários ao dar suporte ao IE7 e mais antigos", + "less.lint.important.desc": "Evite usar !important. Esta é uma indicação de que a especificidade do CSS inteiro saiu de controle e precisa ser fatorada novamente.", + "less.lint.importStatement.desc": "Instruções de importação não carregam em paralelo", + "less.lint.propertyIgnoredDueToDisplay.desc": "Propriedade ignorada devido à exibição. Por exemplo, com 'display: inline', as propriedades width, height, margin-top, margin-bottom e float não têm efeito", + "less.lint.universalSelector.desc": "O seletor universal (*) é conhecido por ser lento", + "less.lint.unknownProperties.desc": "Propriedade desconhecida.", + "less.lint.unknownVendorSpecificProperties.desc": "Propriedade específica do fornecedor desconhecida.", + "less.lint.vendorPrefix.desc": "Ao usar um prefixo específico do fornecedor, inclua também a propriedade padrão", + "less.lint.zeroUnits.desc": "Nenhuma unidade para zero é necessária", + "less.validate.desc": "Habilita ou desabilita todas as validações", + "scss.lint.argumentsInColorFunction.desc": "Número inválido de parâmetros", + "scss.lint.boxModel.desc": "Não use largura ou altura ao usar preenchimento ou borda", + "scss.lint.compatibleVendorPrefixes.desc": "Ao usar um prefixo específico de fornecedor, certifique-se de também incluir todas as outras propriedades específicas do fornecedor", + "scss.lint.duplicateProperties.desc": "Não use as definições de estilo duplicadas", + "scss.lint.emptyRules.desc": "Não use conjuntos de regra em branco", + "scss.lint.float.desc": "Evite usar 'float'. Floats levam a CSS frágil, que é fácil de quebrar se um aspecto do layout for alterado.", + "scss.lint.fontFaceProperties.desc": "A regra @font-face deve definir propriedades 'src' e 'font-family'", + "scss.lint.hexColorLength.desc": "Cores hexadecimais devem consistir em três ou seis números hexadecimais", + "scss.lint.idSelector.desc": "Seletores não devem conter IDs, pois essas regras estão firmemente acopladas ao HTML.", + "scss.lint.ieHack.desc": "IE hacks somente são necessários ao dar suporte ao IE7 e mais antigos", + "scss.lint.important.desc": "Evite usar !important. Esta é uma indicação de que a especificidade do CSS inteiro saiu de controle e precisa ser fatorada novamente.", + "scss.lint.importStatement.desc": "Instruções de importação não carregam em paralelo", + "scss.lint.propertyIgnoredDueToDisplay.desc": "Propriedade ignorada devido à exibição. Por exemplo, com 'display: inline', as propriedades width, height, margin-top, margin-bottom e float não têm efeito", + "scss.lint.universalSelector.desc": "O seletor universal (*) é conhecido por ser lento", + "scss.lint.unknownProperties.desc": "Propriedade desconhecida.", + "scss.lint.unknownVendorSpecificProperties.desc": "Propriedade específica do fornecedor desconhecida.", + "scss.lint.vendorPrefix.desc": "Ao usar um prefixo específico do fornecedor, inclua também a propriedade padrão", + "scss.lint.zeroUnits.desc": "Nenhuma unidade para zero é necessária", + "scss.validate.desc": "Habilita ou desabilita todas as validações", + "less.colorDecorators.enable.desc": "Habilita ou desabilita decoradores de cores", + "scss.colorDecorators.enable.desc": "Habilita ou desabilita decoradores de cores", + "css.colorDecorators.enable.desc": "Habilita ou desabilita decoradores de cores" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/extension-editing/out/packageDocumentHelper.i18n.json b/i18n/ptb/extensions/extension-editing/out/packageDocumentHelper.i18n.json new file mode 100644 index 00000000000..8505afd6d4a --- /dev/null +++ b/i18n/ptb/extensions/extension-editing/out/packageDocumentHelper.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "languageSpecificEditorSettings": "Configurações do editor especificas para a linguagem", + "languageSpecificEditorSettingsDescription": "Sobrescrever as configurações do editor para a linguagem" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/git/out/askpass-main.i18n.json b/i18n/ptb/extensions/git/out/askpass-main.i18n.json new file mode 100644 index 00000000000..280b14bd0d7 --- /dev/null +++ b/i18n/ptb/extensions/git/out/askpass-main.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "missOrInvalid": "Credenciais ausentes ou inválidas." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/git/out/commands.i18n.json b/i18n/ptb/extensions/git/out/commands.i18n.json new file mode 100644 index 00000000000..ab5667e260b --- /dev/null +++ b/i18n/ptb/extensions/git/out/commands.i18n.json @@ -0,0 +1,43 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "tag at": "Etiqueta em {0}", + "remote branch at": "Ramo remoto em {0}", + "repourl": "URL do repositório", + "parent": "Diretório pai", + "cloning": "Clonando repositório do Git...", + "openrepo": "Abrir Repositório", + "proposeopen": "Gostaria de abrir o repositório clonado?", + "confirm revert": "Tem certeza que deseja reverter as alterações selecionadas em {0}?", + "revert": "Reverter as alterações", + "confirm discard": "Tem certeza que deseja descartar as alterações em {0}?", + "confirm discard multiple": "Tem certeza que deseja descartar as alterações em {0} arquivos?", + "discard": "Descartar alterações", + "confirm discard all": "Tem certeza que deseja descartar TODAS as alterações? Isso é IRREVERSÍVEL!", + "discardAll": "Descartar TODAS as alterações", + "no staged changes": "Não há nenhuma modificação escalonada para confirmar.\n\nGostaria de escalonar automaticamente todas as suas alterações e confirmá-las diretamente?", + "yes": "Sim", + "always": "Sempre", + "no changes": "Não há mudanças para confirmar.", + "commit message": "Confirmar mensagem", + "provide commit message": "Por favor, forneça uma mensagem de commit", + "branch name": "Nome do Ramo", + "provide branch name": "Por favor, forneça um nome de ramo", + "no remotes to pull": "O seu repositório não possui remotos configurados para efetuar pull.", + "no remotes to push": "O seu repositório não possui remotos configurados para efetuar push.", + "nobranch": "Por favor, faça checkout em um ramo para fazer push em um remoto.", + "pick remote": "Pegue um remoto para publicar o ramo '{0}':", + "sync is unpredictable": "Esta ação vai fazer push e pull nos commits de e para '{0}'.", + "ok": "OK", + "never again": "Ok, Nunca Mostrar Novamente", + "no remotes to publish": "Seu repositório não possui remotos configurados para publicação.", + "disabled": "Git está desativado ou não é suportado neste espaço de trabalho", + "clean repo": "Por favor, limpe sua árvore de trabalho do repositório antes de fazer check-out.", + "cant push": "Não pode empurrar referências para remoto. Execute 'Pull' primeiro para integrar suas alterações.", + "git error details": "Git: {0}", + "git error": "Erro de Git", + "open git log": "Abrir Histórico do Git" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/git/out/main.i18n.json b/i18n/ptb/extensions/git/out/main.i18n.json new file mode 100644 index 00000000000..ae1dee26032 --- /dev/null +++ b/i18n/ptb/extensions/git/out/main.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "using git": "Usando git {0} de {1}", + "updateGit": "Atualizar o Git", + "neverShowAgain": "Não mostrar novamente", + "git20": "Você parece ter o git {0} instalado. Code funciona melhor com git > = 2" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/git/out/model.i18n.json b/i18n/ptb/extensions/git/out/model.i18n.json new file mode 100644 index 00000000000..717d2b4364a --- /dev/null +++ b/i18n/ptb/extensions/git/out/model.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "open": "Abrir", + "merge changes": "Mesclar Alterações", + "staged changes": "Alterações em Etapas", + "changes": "Alterações", + "ok": "OK", + "neveragain": "Nunca Mostrar Novamente", + "huge": "O repositório git em '{0}' tem muitas atualizações ativas, somente um subconjunto de funcionalidades do Git será habilitado." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/git/out/scmProvider.i18n.json b/i18n/ptb/extensions/git/out/scmProvider.i18n.json new file mode 100644 index 00000000000..490dda3603e --- /dev/null +++ b/i18n/ptb/extensions/git/out/scmProvider.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "commit": "Confirmar" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/git/out/statusbar.i18n.json b/i18n/ptb/extensions/git/out/statusbar.i18n.json new file mode 100644 index 00000000000..0b6ee800ffa --- /dev/null +++ b/i18n/ptb/extensions/git/out/statusbar.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "checkout": "Checkout...", + "sync changes": "Sincronizar alterações", + "publish changes": "Publicar alterações", + "syncing changes": "Sincronizando alterações..." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/git/package.i18n.json b/i18n/ptb/extensions/git/package.i18n.json new file mode 100644 index 00000000000..0c79f1929bb --- /dev/null +++ b/i18n/ptb/extensions/git/package.i18n.json @@ -0,0 +1,48 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "command.clone": "Clonar", + "command.init": "Inicializar Repositório", + "command.refresh": "Atualizar", + "command.openChange": "Abrir alterações", + "command.openFile": "Abrir Arquivo", + "command.stage": "Estagiar Alterações", + "command.stageAll": "Estagiar Todas Alterações", + "command.stageSelectedRanges": "Estagiar Faixas Selecionadas", + "command.revertSelectedRanges": "Reverter Faixas Selecionadas", + "command.unstage": "Desestagiar Alterações", + "command.unstageAll": "Desestagiar Todas Alterações", + "command.unstageSelectedRanges": "Desestagiar Faixas Selecionadas", + "command.clean": "Descartar Alterações", + "command.cleanAll": "Descartar Todas as Alterações", + "command.commit": "Confirmar", + "command.commitStaged": "Confirmar os preparados", + "command.commitStagedSigned": "Confirmar Estagiados (Desconectado)", + "command.commitAll": "Confirmar tudo", + "command.commitAllSigned": "Confirmar Tudo (Desconectado)", + "command.undoCommit": "Desfazer Ultima Confirmação", + "command.checkout": "Fazer checkout para...", + "command.branch": "Criar Ramificação...", + "command.pull": "Efetuar pull", + "command.pullRebase": "Efetuar pull (Rebase)", + "command.push": "Enviar por push", + "command.pushTo": "Enviar por push para...", + "command.sync": "Sincronizar", + "command.publish": "Publicar", + "command.showOutput": "Mostrar Saída do Git", + "config.enabled": "Se o git estiver habilitado", + "config.path": "Caminho para o executável do git", + "config.autorefresh": "Se a atualização automática estiver habilitada", + "config.autofetch": "Se a recuperação automática estiver habilitada", + "config.enableLongCommitWarning": "Se mensagens longas de confirmação devem ter aviso", + "config.confirmSync": "Confirmar antes de sincronizar repositórios git", + "config.countBadge": "Controla o contador de distintivos do git. 'todos' considera todas as alterações. 'rastreado' considera apenas as alterações controladas. 'desligado' desliga o contador.", + "config.checkoutType": "Controla quais tipos de ramos são listados quando executando `Checkout para... `. `todos` mostra todas as referências, `local` mostra apenas os ramos locais, `etiqueta` mostra apenas etiquetas e `remoto` mostra apenas os ramos remotos.", + "config.ignoreLegacyWarning": "Ignora o aviso de Git legado", + "config.ignoreLimitWarning": "Ignora o aviso quando houver muitas alterações em um repositório", + "config.defaultCloneDirectory": "O local padrão onde clonar um repositório git", + "config.enableSmartCommit": "Confirme todas as alterações quando não há modificações escalonadas." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/grunt/out/main.i18n.json b/i18n/ptb/extensions/grunt/out/main.i18n.json new file mode 100644 index 00000000000..909b68937c6 --- /dev/null +++ b/i18n/ptb/extensions/grunt/out/main.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "execFailed": "Auto detecção de Grunt falhou com erro: {0}" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/grunt/package.i18n.json b/i18n/ptb/extensions/grunt/package.i18n.json new file mode 100644 index 00000000000..d79ce76907e --- /dev/null +++ b/i18n/ptb/extensions/grunt/package.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "config.grunt.autoDetect": "Controla se a deteção automática de tarefas do Grunt está ligado ou desligado. Padrão é ligado." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/gulp/out/main.i18n.json b/i18n/ptb/extensions/gulp/out/main.i18n.json new file mode 100644 index 00000000000..51b05e4013e --- /dev/null +++ b/i18n/ptb/extensions/gulp/out/main.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "execFailed": "Auto detecção de gulp falhou com erro: {0}" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/gulp/package.i18n.json b/i18n/ptb/extensions/gulp/package.i18n.json new file mode 100644 index 00000000000..fae292414c2 --- /dev/null +++ b/i18n/ptb/extensions/gulp/package.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "config.gulp.autoDetect": "Controla se a detecção automática de tarefas Gulp está ativada ou desativada. Por padrão, é ativado." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/html/client/out/htmlMain.i18n.json b/i18n/ptb/extensions/html/client/out/htmlMain.i18n.json new file mode 100644 index 00000000000..314d1e5c58a --- /dev/null +++ b/i18n/ptb/extensions/html/client/out/htmlMain.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "htmlserver.name": "Servidor de Linguagem HTML" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/html/package.i18n.json b/i18n/ptb/extensions/html/package.i18n.json new file mode 100644 index 00000000000..2f255a02e7f --- /dev/null +++ b/i18n/ptb/extensions/html/package.i18n.json @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "html.format.enable.desc": "Ativa/desativa o formatador HTML padrão (requer reinicialização)", + "html.format.wrapLineLength.desc": "Quantidade máxima de caracteres por linha (0 = desativar).", + "html.format.unformatted.desc": "Lista de tags, separados por vírgula, que não deveria ser reformatada. o padrão é 'nulo' para todas as tags listadas em https://www.w3.org/TR/html5/dom.html#phrasing-content.", + "html.format.contentUnformatted.desc": "Lista de tags, separada por vírgula, onde o conteúdo não deve ser reformatado. o padrão é 'nulo' para a tag 'pré'.", + "html.format.indentInnerHtml.desc": "Indentar secões e .", + "html.format.preserveNewLines.desc": "Se quebras de linha existentes antes de elementos deveriam ser preservadas. Só funciona antes de elementos, não dentro de rótulos ou para texto.", + "html.format.maxPreserveNewLines.desc": "Número máximo de quebras de linha a serem preservadas em um bloco. Use 'null' para ilimitado.", + "html.format.indentHandlebars.desc": "Formatar e indentar {{#foo}} e {{/ foo}}.", + "html.format.endWithNewline.desc": "Finalizar com uma nova linha.", + "html.format.extraLiners.desc": "Lista de rótulos, separados por vírgulas, que deveriam ter uma quebra de linha extra antes deles. 'null' admite o padrão \"head, body, /html\".", + "html.format.wrapAttributes.desc": "Agrupar atributos.", + "html.format.wrapAttributes.auto": "Agrupar atributos somente quando o tamanho da linha é excedido.", + "html.format.wrapAttributes.force": "Agrupar cada atributo exceto o primeiro.", + "html.format.wrapAttributes.forcealign": "Agrupar cada atributo, exceto o primeiro e manter alinhado.", + "html.format.wrapAttributes.forcemultiline": "Agrupar cada atributo.", + "html.suggest.angular1.desc": "Configura se o suporte da linguagem HTML interna sugere rótulos e propriedades do Angular V1.", + "html.suggest.ionic.desc": "Configura se o suporte da linguagem HTML interna sugere rótulos, propriedades e valores Ionic.", + "html.suggest.html5.desc": "Configura se o suporte da linguagem HTML interna sugere rótulos, propriedades e valores HTML5.", + "html.validate.scripts": "Configura se o suporte da linguagem HTML interna valida scripts embutidos.", + "html.validate.styles": "Configura se o suporte da linguagem HTML interna valida estilos embutidos." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/jake/out/main.i18n.json b/i18n/ptb/extensions/jake/out/main.i18n.json new file mode 100644 index 00000000000..4cfc54e5fef --- /dev/null +++ b/i18n/ptb/extensions/jake/out/main.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "execFailed": "Auto detecção de Jake falhou com erro: {0}" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/jake/package.i18n.json b/i18n/ptb/extensions/jake/package.i18n.json new file mode 100644 index 00000000000..94c08817c8d --- /dev/null +++ b/i18n/ptb/extensions/jake/package.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "config.jake.autoDetect": "Controla se a detecção automática de tarefas Jake está ativada ou desativada. Por padrão, é ativado." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/javascript/out/features/bowerJSONContribution.i18n.json b/i18n/ptb/extensions/javascript/out/features/bowerJSONContribution.i18n.json new file mode 100644 index 00000000000..84b277202e8 --- /dev/null +++ b/i18n/ptb/extensions/javascript/out/features/bowerJSONContribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "json.bower.default": "Bower.json padrão", + "json.bower.error.repoaccess": "Falha na solicitação ao repositório bower: {0}", + "json.bower.latest.version": "último" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/javascript/out/features/packageJSONContribution.i18n.json b/i18n/ptb/extensions/javascript/out/features/packageJSONContribution.i18n.json new file mode 100644 index 00000000000..9917fa36b2e --- /dev/null +++ b/i18n/ptb/extensions/javascript/out/features/packageJSONContribution.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "json.package.default": "Package.json padrão", + "json.npm.error.repoaccess": "Falha na solicitação ao repositório NPM: {0}", + "json.npm.latestversion": "A versão do pacote mais recente no momento", + "json.npm.majorversion": "Combina com a versão principal mais recente (1.x.x)", + "json.npm.minorversion": "Combina a versão secundária mais recente (1.2.x)", + "json.npm.version.hover": "Última versão: {0}" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/json/client/out/jsonMain.i18n.json b/i18n/ptb/extensions/json/client/out/jsonMain.i18n.json new file mode 100644 index 00000000000..4391c95a2ba --- /dev/null +++ b/i18n/ptb/extensions/json/client/out/jsonMain.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "jsonserver.name": "Servidor de linguagem JSON" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/json/package.i18n.json b/i18n/ptb/extensions/json/package.i18n.json new file mode 100644 index 00000000000..9d812f5b253 --- /dev/null +++ b/i18n/ptb/extensions/json/package.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "json.schemas.desc": "Esquemas associadas a arquivos de JSON no projeto atual", + "json.schemas.url.desc": "Um URL para um esquema ou um caminho relativo a um esquema no diretório atual", + "json.schemas.fileMatch.desc": "Uma matriz de padrões de arquivos para correspondência ao resolver arquivos JSON para esquemas.", + "json.schemas.fileMatch.item.desc": "Um padrão de arquivos que pode conter '*' para fazer a correspondência ao resolver arquivos JSON para esquemas.", + "json.schemas.schema.desc": "A definição de esquema para o URL dado. O esquema precisa ser fornecido apenas para evitar acessos ao URL do esquema.", + "json.format.enable.desc": "Habilitar/desabilitar o formatador JSON padrão (requer reinicialização)", + "json.tracing.desc": "Loga a comunicação entre o VS Code e o servidor de linguagem JSON.", + "json.colorDecorators.enable.desc": "Habilita ou desabilita os decoradores de cor" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/markdown/out/extension.i18n.json b/i18n/ptb/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ptb/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ptb/extensions/markdown/out/previewContentProvider.i18n.json b/i18n/ptb/extensions/markdown/out/previewContentProvider.i18n.json new file mode 100644 index 00000000000..f4e956aa5eb --- /dev/null +++ b/i18n/ptb/extensions/markdown/out/previewContentProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "preview.securityMessage.text": "Scripts foram desabilitados neste documento", + "preview.securityMessage.title": "Scripts são desabilitados na pré-visualização de markdown. Altere a configuração de segurança de pré-visualização do Markdown para habilitar scripts", + "preview.securityMessage.label": "Aviso de segurança de scripts desabilitados" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/markdown/out/security.i18n.json b/i18n/ptb/extensions/markdown/out/security.i18n.json new file mode 100644 index 00000000000..6b83ed6faed --- /dev/null +++ b/i18n/ptb/extensions/markdown/out/security.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "preview.showPreviewSecuritySelector.disallowScriptsForWorkspaceTitle": "Desabilitar a execução de scripts em pré-visualização de markdown para este espaço de trabalho", + "preview.showPreviewSecuritySelector.currentSelection": "Configuração atual", + "preview.showPreviewSecuritySelector.allowScriptsForWorkspaceTitle": "Habilitar a execução de scripts em pré-visualizações de markdown para este espaço de trabalho", + "preview.showPreviewSecuritySelector.title": "Alterar configurações de segurança para a pré-visualização do Markdown" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/markdown/package.i18n.json b/i18n/ptb/extensions/markdown/package.i18n.json new file mode 100644 index 00000000000..83c2f99b160 --- /dev/null +++ b/i18n/ptb/extensions/markdown/package.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "markdown.preview.doubleClickToSwitchToEditor.desc": "Duplo clique na pré-visualização markdown para alternar para o editor.", + "markdown.preview.fontFamily.desc": "Controla a família de fonte usada na pré-visualização de markdown.", + "markdown.preview.fontSize.desc": "Controla o tamanho da fonte em pixels usado na pré-visualização de markdown.", + "markdown.preview.lineHeight.desc": "Controla a altura de linha usada na pré-visualização de markdown. Este número é relativo ao tamanho de fonte.", + "markdown.preview.markEditorSelection.desc": "Marca a seleção atual do editor na pré-visualização de markdown.", + "markdown.preview.scrollEditorWithPreview.desc": "Quando a pré-visualização de markdown é rolada, atualiza a exibição do editor.", + "markdown.preview.scrollPreviewWithEditorSelection.desc": "Rola a pré-visualização do markdown para revelar a linha atualmente selecionada do editor.", + "markdown.preview.title": "Abrir a visualização", + "markdown.previewFrontMatter.dec": "Configura como o frontispicio YAML frente questão devem ser processado na pré-visualização de markdown. 'hide' remove o frontispicio. Caso contrário, o frontispicio é tratado como conteúdo de markdown.", + "markdown.previewSide.title": "Abre pré-visualização ao lado", + "markdown.showSource.title": "Exibir Código-Fonte", + "markdown.styles.dec": "Uma lista de URLs ou caminhos locais para folhas de estilo CSS para usar na pré-visualização do markdown. Caminhos relativos são interpretados em relação à pasta aberta no explorer. Se não houver nenhuma pasta aberta, eles são interpretados em relação ao local do arquivo markdown. Todos os ' \\' precisam ser escritos como ' \\ \\ '.", + "markdown.showPreviewSecuritySelector.title": "Alterar as configurações de segurança de pré-visualização do Markdown", + "markdown.preview.enableExperimentalExtensionApi.desc": "[Experimental] Permitir extensões para ampliar a pré-visualização do markdown.", + "markdown.trace.desc": "Habilitar log de depuração para a extensão do markdown." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/ptb/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ptb/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ptb/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/ptb/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ptb/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ptb/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/ptb/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ptb/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ptb/extensions/merge-conflict/package.i18n.json b/i18n/ptb/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ptb/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ptb/extensions/npm/package.i18n.json b/i18n/ptb/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ptb/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ptb/extensions/php/out/features/validationProvider.i18n.json b/i18n/ptb/extensions/php/out/features/validationProvider.i18n.json new file mode 100644 index 00000000000..9e0ce64f472 --- /dev/null +++ b/i18n/ptb/extensions/php/out/features/validationProvider.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "php.useExecutablePath": "Você permite {0} (definido como uma configuração do espaço de trabalho) a ser executado para lint de arquivos PHP?", + "php.yes": "Permitir", + "php.no": "Não permitir", + "wrongExecutable": "Não é possível validar {0} pois não é um executável php válido. Use a configuração 'php.validate.executablePath' para configurar o executável do PHP.", + "noExecutable": "Não é possível validar porque nenhum executável PHP está definido. Use a configuração 'php.validate.executablePath' para configurar o executável do PHP.", + "unknownReason": "Falha ao executar o php usando o caminho: {0}. O motivo é desconhecido." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/php/package.i18n.json b/i18n/ptb/extensions/php/package.i18n.json new file mode 100644 index 00000000000..7ec916f5dd8 --- /dev/null +++ b/i18n/ptb/extensions/php/package.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "configuration.suggest.basic": "Configura se as sugestões intrínsecas da linguagem PHP estão habilitadas. O suporte sugere globais e variáveis do PHP.", + "configuration.validate.enable": "Habilita/desabilita a validação interna do PHP.", + "configuration.validate.executablePath": "Aponta para o executável do PHP.", + "configuration.validate.run": "Se o linter é executado ao salvar ou ao digitar.", + "configuration.title": "PHP", + "commands.categroy.php": "PHP", + "command.untrustValidationExecutable": "Desabilita a validação de executável do PHP (definida como configuração do espaço de trabalho)" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/features/bufferSyncSupport.i18n.json b/i18n/ptb/extensions/typescript/out/features/bufferSyncSupport.i18n.json new file mode 100644 index 00000000000..1cef0c6e94a --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/features/bufferSyncSupport.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "versionMismatch": "Incompatibilidade de versão! global tsc ({0})! = serviço de linguagem do VS Code ({1}). Erros de compilação inconsistentes podem ocorrer", + "moreInformation": "Mais informações", + "doNotCheckAgain": "Não verificar novamente", + "close": "Fechar", + "updateTscCheck": "Atualizada configuração de usuário 'typescript.check.tscVersion' para false " +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/features/completionItemProvider.i18n.json b/i18n/ptb/extensions/typescript/out/features/completionItemProvider.i18n.json new file mode 100644 index 00000000000..58097d90545 --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/features/completionItemProvider.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "acquiringTypingsLabel": "Adquirindo digitações...", + "acquiringTypingsDetail": "Adquirindo definições de digitações para o Intellisense." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json b/i18n/ptb/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json new file mode 100644 index 00000000000..99716f32145 --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/features/directiveCommentCompletionProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ts-check": "Habilita verificação semântica em um arquivo JavaScript. Deve estar no topo de um arquivo.", + "ts-nocheck": "Desabilita verificação semântica em um arquivo JavaScript. Deve estar no topo de um arquivo.", + "ts-ignore": "Suprime erros de @ts-check na próxima linha de um arquivo." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/features/implementationsCodeLensProvider.i18n.json b/i18n/ptb/extensions/typescript/out/features/implementationsCodeLensProvider.i18n.json new file mode 100644 index 00000000000..ef8dd6423d6 --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/features/implementationsCodeLensProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "oneImplementationLabel": "1 implementação", + "manyImplementationLabel": "{0} implementações", + "implementationsErrorLabel": "Não foi possível determinar implementações" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/features/jsDocCompletionProvider.i18n.json b/i18n/ptb/extensions/typescript/out/features/jsDocCompletionProvider.i18n.json new file mode 100644 index 00000000000..20b08d7679b --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/features/jsDocCompletionProvider.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "typescript.jsDocCompletionItem.documentation": "Comentário JSDoc" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/features/referencesCodeLensProvider.i18n.json b/i18n/ptb/extensions/typescript/out/features/referencesCodeLensProvider.i18n.json new file mode 100644 index 00000000000..1838c3c1621 --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/features/referencesCodeLensProvider.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "oneReferenceLabel": "1 referência", + "manyReferenceLabel": "{0} referências", + "referenceErrorLabel": "Não foi possível determinar as referências" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/typescriptMain.i18n.json b/i18n/ptb/extensions/typescript/out/typescriptMain.i18n.json new file mode 100644 index 00000000000..82e6c288fb1 --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/typescriptMain.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "typescript.projectConfigNoWorkspace": "Favor abrir uma pasta no VS Code para usar um projeto TypeScript ou JavaScript", + "typescript.projectConfigUnsupportedFile": "Não foi possível determinar o projeto TypeScript ou JavaScript. Tipo de arquivo não suportado", + "typescript.projectConfigCouldNotGetInfo": "Não foi possível determinar o projeto TypeScript ou JavaScript", + "typescript.noTypeScriptProjectConfig": "Arquivo não é parte de um projeto TypeScript", + "typescript.noJavaScriptProjectConfig": "Arquivo não é parte de um projeto JavaScript", + "typescript.configureTsconfigQuickPick": "Configurar tsconfig.json", + "typescript.configureJsconfigQuickPick": "Configurar jsconfig.json", + "typescript.projectConfigLearnMore": "Saber Mais" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/typescriptServiceClient.i18n.json b/i18n/ptb/extensions/typescript/out/typescriptServiceClient.i18n.json new file mode 100644 index 00000000000..37527e507b0 --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/typescriptServiceClient.i18n.json @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noServerFound": "O caminho {0} não aponta para uma instalação de tsserver válida. Voltando para a versão do TypeScript empacotada.", + "noBundledServerFound": "O tsserver do VS Code foi excluído por outra aplicação, como por exemplo uma ferramenta de detecção de virus mal-comportada. Favor reinstalar o VS Code.", + "versionNumber.custom": "personalizado", + "serverCouldNotBeStarted": "Servidor de linguagem TypeScript não pôde ser iniciado. Mensagem de erro é: {0}", + "useVSCodeVersionOption": "Usar a Versão do VS Code", + "activeVersion": "Atualmente ativo", + "useWorkspaceVersionOption": "Use a versão de área de trabalho", + "learnMore": "Saiba Mais", + "selectTsVersion": "Selecione a versão do TypeScript usada para os recursos de linguagem JavaScript e TypeScript", + "typescript.openTsServerLog.notSupported": "Logging de TS Server requer TS TS 2.2.2+", + "typescript.openTsServerLog.loggingNotEnabled": "Logging de TS Server está desligado. Por favor configure 'typescript.tsserver.log' e reinicie o TS Server para habilitar o log", + "typescript.openTsServerLog.enableAndReloadOption": "Habilitar logging e reniciar TS server", + "typescript.openTsServerLog.noLogFile": "O TS Server não iniciou o logging.", + "openTsServerLog.openFileFailedFailed": "Não foi possível abrir o arquivo de log do TS Server", + "serverDiedAfterStart": "O serviço de linguagem TypeScript morreu 5 vezes depois que começou. O serviço não será reiniciado.", + "serverDiedReportIssue": "Reportar Problema", + "serverDied": "O serviço TypeScript morreu inesperadamente 5 vezes nos últimos 5 minutos." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/utils/logger.i18n.json b/i18n/ptb/extensions/typescript/out/utils/logger.i18n.json new file mode 100644 index 00000000000..bc738f43d0c --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/utils/logger.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "channelName": "TypeScript" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/utils/projectStatus.i18n.json b/i18n/ptb/extensions/typescript/out/utils/projectStatus.i18n.json new file mode 100644 index 00000000000..5cb18373637 --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/utils/projectStatus.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hintExclude": "Para habilitar os recursos de linguagem JavaScript/TypeScipt em todo o projeto, excluir pastas com muitos arquivos, como: {0}", + "hintExclude.generic": "Para habilitar os recursos de linguagem JavaScript/TypeScipt em todo o projeto, excluir pastas grandes com arquivos em que você não trabalha.", + "open": "Configurar exclusões", + "large.label": "Configurar exclusões", + "hintExclude.tooltip": "Para habilitar os recursos de linguagem JavaScript/TypeScipt em todo o projeto, excluir pastas grandes com arquivos em que você não trabalha." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/out/utils/typingsStatus.i18n.json b/i18n/ptb/extensions/typescript/out/utils/typingsStatus.i18n.json new file mode 100644 index 00000000000..ce050eb3d8e --- /dev/null +++ b/i18n/ptb/extensions/typescript/out/utils/typingsStatus.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "installingPackages": "Buscando dados para melhor IntelliSense do TypeScript", + "typesInstallerInitializationFailed.title": "Não foi possível instalar arquivos de digitação para recursos da linguagem JavaScript. Certifique-se que NPM está instalado e está em seu caminho", + "typesInstallerInitializationFailed.moreInformation": "Mais informações", + "typesInstallerInitializationFailed.doNotCheckAgain": "Não verificar novamente", + "typesInstallerInitializationFailed.close": "Fechar" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/package.i18n.json b/i18n/ptb/extensions/typescript/package.i18n.json new file mode 100644 index 00000000000..5e4125ec050 --- /dev/null +++ b/i18n/ptb/extensions/typescript/package.i18n.json @@ -0,0 +1,45 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "typescript.reloadProjects.title": "Recarregar Projeto", + "javascript.reloadProjects.title": "Recarregar Projeto", + "configuration.typescript": "TypeScript", + "typescript.useCodeSnippetsOnMethodSuggest.dec": "Funções completas com a assinatura do parâmetro.", + "typescript.tsdk.desc": "Especifica o caminho da pasta que contém os arquivos tsserver e lib*.d.ts para usar.", + "typescript.disableAutomaticTypeAcquisition": "Desabilita a aquisição automática de tipo. Requer TypeScript > = 2.0.6 e um reinício depois da alteração.", + "typescript.check.tscVersion": "Verifica se um ima instalação global do compilador TypeScript (por exemplo, tsc) difere do serviço de linguagem TypeScript usado.", + "typescript.tsserver.log": "Habilita o log do servidor TS para um arquivo. Este log pode ser usado para diagnosticar problemas do servidor de TS. O log pode conter caminhos de arquivo, código-fonte e outras informações potencialmente confidenciais do seu projeto.", + "typescript.tsserver.trace": "Habilita o rastreamento de mensagens enviadas para o servidor de TS. Este rastreamento pode ser usado para diagnosticar problemas do servidor de TS. O rastreamento pode conter caminhos de arquivo, código-fonte e outras informações potencialmente confidenciais do seu projeto.", + "typescript.tsserver.experimentalAutoBuild": "Habilita auto build experimental. Requer a versão 1.9 dev ou 2.x do tsserver e o reinício do VS Code depois da alteração.", + "typescript.validate.enable": "Habilita/Desabilita a validação TypeScript.", + "typescript.format.enable": "Habilita/Desabilita o formatador padrão TypeScript.", + "javascript.format.enable": "Habilita/Desabilita o formatador padrão JavaScript.", + "format.insertSpaceAfterCommaDelimiter": "Define o tratamento de espaços após um delimitador vírgula.", + "format.insertSpaceAfterSemicolonInForStatements": "Define o tratamento de espaços após um ponto e vírgula para um comando.", + "format.insertSpaceBeforeAndAfterBinaryOperators": "Define o tratamento de espaços após um operador binário.", + "format.insertSpaceAfterKeywordsInControlFlowStatements": "Define o tratamento de espaços após palavras-chave em um comando de controle de fluxo.", + "format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": "Define o tratamento de espaços após uma palavra-chave de função para funções anônimas.", + "format.insertSpaceBeforeFunctionParenthesis": "Define a manipulação de espaços antes de parênteses do argumento de função. Requer TypeScript > = 2.1.5.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis": "Define a manipulação de espaços após abrir e antes de fechar parênteses não vazios.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets": "Define a manipulação de espaços após abrir e antes de fechar colchetes não vazios.", + "format.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces": "Define a manipulação de espaços após abrir e antes de fechar chaves não vazias. Requer TypeScript >= 2.3.0.", + "format.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces": "Define a manipulação de espaços após abrir e antes de fechar chaves de cadeias de caracteres de modelos. Requer TypeScript >= 2.0.6.", + "format.insertSpaceAfterOpeningAndBeforeClosingJsxExpressionBraces": "Define a manipulação de espaços após abrir e antes de fechar chaves de expressões JSX. Requer TypeScript >= 2.0.6.", + "format.placeOpenBraceOnNewLineForFunctions": "Define-se uma chave de abertura é colocada em uma nova linha para funções ou não.", + "format.placeOpenBraceOnNewLineForControlBlocks": "Define-se uma chave de abertura é colocada em uma nova linha para blocos de controle ou não.", + "javascript.validate.enable": "Habilitar/Desabilitar validação JavaScript.", + "typescript.goToProjectConfig.title": "Ir para a Configuração do Projeto", + "javascript.goToProjectConfig.title": "Ir para a Configuração do Projeto", + "javascript.referencesCodeLens.enabled": "Habilitar/desabilitar referências CodeLens em arquivos JavaScript.", + "typescript.referencesCodeLens.enabled": "Habilitar/desabilitar referências CodeLens em arquivos TypeScript. Requer TypeScript > = 2.0.6.", + "typescript.implementationsCodeLens.enabled": "Habilitar/desabilitar implementações CodeLens. Requer TypeScript > = 2.0.6.", + "typescript.openTsServerLog.title": "Abrir arquivo de log do servidor TS", + "typescript.selectTypeScriptVersion.title": "Selecionar a versão do JavaScript", + "jsDocCompletion.enabled": "Habilitar/Desabilitar comentários JSDoc automáticos.", + "javascript.implicitProjectConfig.checkJs": "Habilitar/desabilitar verificação semântica de arquivos JavaScript. Os arquivos existentes jsconfig.json ou tsconfig.json substituem essa configuração. Requer TypeScript > = 2.3.1.", + "typescript.check.npmIsInstalled": "Verificar se NPM está instalado para aquisição automática de digitação", + "javascript.nameSuggestions": "Habilitar/desabilitar incluindo nomes exclusivos do arquivo nas listas de sugestão de JavaScript." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/browser/ui/actionbar/actionbar.i18n.json b/i18n/ptb/src/vs/base/browser/ui/actionbar/actionbar.i18n.json new file mode 100644 index 00000000000..4ecb2c803f4 --- /dev/null +++ b/i18n/ptb/src/vs/base/browser/ui/actionbar/actionbar.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "titleLabel": "{0} ({1})" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/browser/ui/aria/aria.i18n.json b/i18n/ptb/src/vs/base/browser/ui/aria/aria.i18n.json new file mode 100644 index 00000000000..e558eb6187a --- /dev/null +++ b/i18n/ptb/src/vs/base/browser/ui/aria/aria.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "repeated": "{0} (ocorreu novamente)" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/browser/ui/findinput/findInput.i18n.json b/i18n/ptb/src/vs/base/browser/ui/findinput/findInput.i18n.json new file mode 100644 index 00000000000..524ba7bb4a7 --- /dev/null +++ b/i18n/ptb/src/vs/base/browser/ui/findinput/findInput.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultLabel": "entrada" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/browser/ui/findinput/findInputCheckboxes.i18n.json b/i18n/ptb/src/vs/base/browser/ui/findinput/findInputCheckboxes.i18n.json new file mode 100644 index 00000000000..1a477ef1e6d --- /dev/null +++ b/i18n/ptb/src/vs/base/browser/ui/findinput/findInputCheckboxes.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "caseDescription": "Diferenciar Maiúsculas de Minúsculas", + "wordsDescription": "Coincidir Palavra Inteira", + "regexDescription": "Usar Expressão Regular" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/browser/ui/inputbox/inputBox.i18n.json b/i18n/ptb/src/vs/base/browser/ui/inputbox/inputBox.i18n.json new file mode 100644 index 00000000000..0b282bdee8a --- /dev/null +++ b/i18n/ptb/src/vs/base/browser/ui/inputbox/inputBox.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "alertErrorMessage": "Erro: {0}", + "alertWarningMessage": "Aviso: {0}", + "alertInfoMessage": "Informações: {0}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/ptb/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json new file mode 100644 index 00000000000..d023184ae70 --- /dev/null +++ b/i18n/ptb/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "imgMeta": "{0}x{1} {2}", + "largeImageError": "A imagem é muito grande para ser exibida no editor.", + "nativeBinaryError": "O arquivo não pode ser exibido no editor porque é binário, muito grande ou usa uma codificação de texto sem suporte.", + "sizeB": "{0}B", + "sizeKB": "{0}KB", + "sizeMB": "{0}MB", + "sizeGB": "{0}GB", + "sizeTB": "{0}TB" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/browser/ui/toolbar/toolbar.i18n.json b/i18n/ptb/src/vs/base/browser/ui/toolbar/toolbar.i18n.json new file mode 100644 index 00000000000..4a046b57296 --- /dev/null +++ b/i18n/ptb/src/vs/base/browser/ui/toolbar/toolbar.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "more": "Mais" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/common/errorMessage.i18n.json b/i18n/ptb/src/vs/base/common/errorMessage.i18n.json new file mode 100644 index 00000000000..257ffd9e14c --- /dev/null +++ b/i18n/ptb/src/vs/base/common/errorMessage.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "message": "{0}. Código de erro: {1}", + "error.permission.verbose": "Permissão Negada (HTTP {0})", + "error.permission": "Permissão Negada", + "error.http.verbose": "{0} (HTTP {1}: {2})", + "error.http": "{0} (HTTP {1})", + "error.connection.unknown.verbose": "Erro de Conexão Desconhecido ({0})", + "error.connection.unknown": "Ocorreu um erro de conexão desconhecido. Você não está mais conectado à Internet ou o servidor que você está conectado está offline.", + "stackTrace.format": "{0}: {1}", + "error.defaultMessage": "Ocorreu um erro desconhecido. Consulte o log para obter mais detalhes.", + "nodeExceptionMessage": "Ocorreu um erro de sistema ({0})", + "error.moreErrors": "{0} ({1} erros no total)" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/common/jsonErrorMessages.i18n.json b/i18n/ptb/src/vs/base/common/jsonErrorMessages.i18n.json new file mode 100644 index 00000000000..d6108586df8 --- /dev/null +++ b/i18n/ptb/src/vs/base/common/jsonErrorMessages.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "error.invalidSymbol": "Símbolo inválido", + "error.invalidNumberFormat": "Formato de número inválido", + "error.propertyNameExpected": "Nome de propriedade esperado", + "error.valueExpected": "Valor esperado", + "error.colonExpected": "Dois-pontos esperados", + "error.commaExpected": "Vírgula esperada", + "error.closeBraceExpected": "Chave de fechamento esperada", + "error.closeBracketExpected": "Colchete de fechamento esperado", + "error.endOfFileExpected": "Fim do arquivo esperado" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/common/processes.i18n.json b/i18n/ptb/src/vs/base/common/processes.i18n.json new file mode 100644 index 00000000000..165322e5952 --- /dev/null +++ b/i18n/ptb/src/vs/base/common/processes.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ExecutableParser.commandMissing": "Erro: informações de executável devem definir um comando do tipo string", + "ExecutableParser.isShellCommand": "Aviso: IsShellCommand deve ser to tipo booleano. Ignorando valor {0}", + "ExecutableParser.args": "Aviso: args deve ser do tipo string[]. Ignorando valor {0}.", + "ExecutableParser.invalidCWD": "Aviso: options.cwd deve ser do tipo string. Ignorando valor {0}." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/common/severity.i18n.json b/i18n/ptb/src/vs/base/common/severity.i18n.json new file mode 100644 index 00000000000..7aff8041180 --- /dev/null +++ b/i18n/ptb/src/vs/base/common/severity.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "sev.error": "Erro", + "sev.warning": "Aviso", + "sev.info": "Informações" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/node/processes.i18n.json b/i18n/ptb/src/vs/base/node/processes.i18n.json new file mode 100644 index 00000000000..3584dc9b15e --- /dev/null +++ b/i18n/ptb/src/vs/base/node/processes.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "TaskRunner.UNC": "Não é possível executar um comando shell em uma unidade UNC." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/node/zip.i18n.json b/i18n/ptb/src/vs/base/node/zip.i18n.json new file mode 100644 index 00000000000..a577f90ea2e --- /dev/null +++ b/i18n/ptb/src/vs/base/node/zip.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "notFound": "{0} não encontrado dentro do zip." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/parts/quickopen/browser/quickOpenModel.i18n.json b/i18n/ptb/src/vs/base/parts/quickopen/browser/quickOpenModel.i18n.json new file mode 100644 index 00000000000..1d0f7ebd47a --- /dev/null +++ b/i18n/ptb/src/vs/base/parts/quickopen/browser/quickOpenModel.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickOpenAriaLabelEntry": "{0}, seletor", + "quickOpenAriaLabel": "seletor" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/parts/quickopen/browser/quickOpenWidget.i18n.json b/i18n/ptb/src/vs/base/parts/quickopen/browser/quickOpenWidget.i18n.json new file mode 100644 index 00000000000..ca3d8a5266a --- /dev/null +++ b/i18n/ptb/src/vs/base/parts/quickopen/browser/quickOpenWidget.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickOpenAriaLabel": "Seletor rápido. Digite para filtrar resultados.", + "treeAriaLabel": "Seletor rápido" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/base/parts/tree/browser/treeDefaults.i18n.json b/i18n/ptb/src/vs/base/parts/tree/browser/treeDefaults.i18n.json new file mode 100644 index 00000000000..5e72c45050c --- /dev/null +++ b/i18n/ptb/src/vs/base/parts/tree/browser/treeDefaults.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "collapse": "Recolher" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/code/electron-main/menus.i18n.json b/i18n/ptb/src/vs/code/electron-main/menus.i18n.json new file mode 100644 index 00000000000..85312962c12 --- /dev/null +++ b/i18n/ptb/src/vs/code/electron-main/menus.i18n.json @@ -0,0 +1,164 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mFile": "&&Arquivo", + "mEdit": "&&Editar", + "mSelection": "&&Seleção", + "mView": "&&Visualizar", + "mGoto": "&&Ir", + "mDebug": "&&Depurar", + "mWindow": "Janela", + "mHelp": "&&Ajuda", + "miNewWindow": "Nova &&Janela", + "mAbout": "Sobre {0}", + "mServices": "Serviços", + "mHide": "Ocultar {0}", + "mHideOthers": "Ocultar Outros", + "mShowAll": "Mostrar Tudo", + "miQuit": "Sair de {0}", + "miNewFile": "&&Novo Arquivo", + "miOpen": "&&Abrir", + "miOpenFolder": "Abrir &&Pasta", + "miOpenFile": "&&Abrir Arquivo", + "miOpenRecent": "Abrir &&Recente", + "miSave": "&&Salvar", + "miSaveAs": "Salvar &&Como...", + "miSaveAll": "Salvar &&Tudo", + "miAutoSave": "Salvar Automaticamente", + "miRevert": "Re&&verter Arquivo", + "miCloseWindow": "Fe&&char Janela", + "miCloseFolder": "Fechar &&Pasta", + "miCloseEditor": "Fechar &&Editor", + "miExit": "Sai&&r", + "miOpenSettings": "&&Configurações", + "miOpenKeymap": "Atalhos de &&Teclado", + "miOpenKeymapExtensions": "Extensões de &&Mapeamento de Teclado", + "miOpenSnippets": "Trechos de Có&&digo do Usuário", + "miSelectColorTheme": "Cor do T&&ema", + "miSelectIconTheme": "&&Ícone de Arquivo do Tema", + "miPreferences": "&&Preferências", + "miReopenClosedEditor": "&&Reabrir Editor Fechado", + "miClearRecentOpen": "&&Limpar Arquivos Recentes", + "miUndo": "&&Desfazer", + "miRedo": "&&Refazer", + "miCut": "Cor&&tar", + "miCopy": "&&Copiar", + "miPaste": "Co&&lar", + "miFind": "&&Localizar", + "miReplace": "&&Substituir", + "miFindInFiles": "Localizar &&nos Arquivos", + "miReplaceInFiles": "Substituir &&nos Arquivos", + "miEmmetExpandAbbreviation": "Emmet: E&&xpandir Abreviação", + "miShowEmmetCommands": "E&&mmet...", + "miToggleLineComment": "&&Alternar Comentário de Linha", + "miToggleBlockComment": "Alternar Comentário de &&Bloco", + "miInsertCursorAbove": "&&Inserir cursor acima", + "miInsertCursorBelow": "Inserir cursor a&&baixo", + "miInsertCursorAtEndOfEachLineSelected": "Adicionar C&&ursores ao Final das Linhas", + "miAddSelectionToNextFindMatch": "Adicionar &&próxima ocorrência", + "miAddSelectionToPreviousFindMatch": "Adicionar ocorrência a&&nterior ", + "miSelectHighlights": "Selecionar todas as &&ocorrências", + "miCopyLinesUp": "&&Copiar linha acima", + "miCopyLinesDown": "C&&opiar linha abaixo", + "miMoveLinesUp": "Mo&&ver linha para cima", + "miMoveLinesDown": "Mover &&linha para baixo", + "miSelectAll": "&&Selecionar Tudo", + "miSmartSelectGrow": "&&Expandir seleção", + "miSmartSelectShrink": "&&Reduzir seleção", + "miViewExplorer": "&&Explorador", + "miViewSearch": "&&Pesquisar", + "miViewSCM": "S&&CM", + "miViewDebug": "&&Depurar", + "miViewExtensions": "E&&xtensões", + "miToggleOutput": "&&Saída", + "miToggleDebugConsole": "Con&&sole de Depuração", + "miToggleIntegratedTerminal": "Terminal &&Integrado", + "miMarker": "&&Problemas", + "miAdditionalViews": "&&Visualizações Adicionais", + "miCommandPalette": "&&Paleta de comando", + "miToggleFullScreen": "Alternar &&Tela Inteira", + "miToggleZenMode": "Alternar modo Zen", + "miToggleMenuBar": "Alternar &&Barra de Menus", + "miSplitEditor": "Dividir &&editor", + "miToggleEditorLayout": "Alternar &&Layout do Grupo de Editor", + "miToggleSidebar": "&&Alternar Barra Lateral", + "miMoveSidebarRight": "&&Mover a barra lateral para a direita", + "miMoveSidebarLeft": "&&Mover a barra lateral para a esquerda", + "miTogglePanel": "Alternar &&Painel", + "miHideStatusbar": "&&Ocultar Barra de Status", + "miShowStatusbar": "&&Mostrar Barra de Status", + "miHideActivityBar": "Ocultar Barra de &&Atividades", + "miShowActivityBar": "Mostrar Barra de &&Atividades", + "miToggleWordWrap": "Alternar &&Quebra de Linha", + "miToggleRenderWhitespace": "Alternar &&Renderização de Espaços em Branco", + "miToggleRenderControlCharacters": "Alternar &&Caracteres de Controle", + "miZoomIn": "&&Ampliar", + "miZoomOut": "Red&&uzir", + "miZoomReset": "&&Reinicializar Zoom", + "miBack": "&&Voltar", + "miForward": "&&Avançar", + "miNextEditor": "&&Próximo Editor", + "miPreviousEditor": "&&Editor Anterior", + "miNextEditorInGroup": "&&Próximo Editor Usado no Grupo", + "miPreviousEditorInGroup": "&&Editor Anterior Usado no Grupo", + "miSwitchEditor": "Trocar &&Editor", + "miFocusFirstGroup": "&&Primeiro Grupo", + "miFocusSecondGroup": "&&Segundo Grupo", + "miFocusThirdGroup": "&&Terceiro Grupo", + "miNextGroup": "&&Próximo Grupo", + "miPreviousGroup": "&&Grupo Anterior", + "miSwitchGroup": "Trocar &&Grupo", + "miGotoFile": "Ir para &&Arquivo...", + "miGotoSymbolInFile": "Ir para o &&Símbolo no Arquivo...", + "miGotoSymbolInWorkspace": "Ir para o Símbolo em &&Área de Trabalho", + "miGotoDefinition": "Ir para &&Definição", + "miGotoTypeDefinition": "Ir para a &&definição de tipo", + "miGotoImplementation": "Ir para a &&implementação", + "miGotoLine": "Ir para &&Linha...", + "miStartDebugging": "Iniciar Depuração", + "miStartWithoutDebugging": "Iniciar &&Sem Depuração", + "miStopDebugging": "&&Parar Depuração", + "miRestart Debugging": "&&Reiniciar Depuração", + "miOpenConfigurations": "Abrir &&Configurações", + "miAddConfiguration": "Adicionar Configuração...", + "miStepOver": "Pular &&Sobre", + "miStepInto": "Pular &&Dentro", + "miStepOut": "Pular &&Fora", + "miContinue": "&&Continuar", + "miToggleBreakpoint": "Alternar &&Ponto de Parada", + "miConditionalBreakpoint": "Ponto de Parada &&Condicional...", + "miColumnBreakpoint": "Ponto de Parada de C&&oluna", + "miFunctionBreakpoint": "Ponto de Parada de &&Função...", + "miNewBreakpoint": "&&Novo Ponto de Parada", + "miDisableAllBreakpoints": "Desabilitar T&&odos os Pontos de Parada", + "miRemoveAllBreakpoints": "Remover &&Todos os Pontos de Parada", + "miInstallAdditionalDebuggers": "&&Instalar Depuradores Adicionais...", + "mMinimize": "Minimizar", + "mClose": "Fechar", + "mBringToFront": "Trazer Tudo para a Frente", + "miToggleDevTools": "&&Alternar Ferramentas do Desenvolvedor", + "miAccessibilityOptions": "&&Opções de Acessibilidade", + "miReportIssues": "Relatar &&Problemas", + "miWelcome": "&&Bem-vindo", + "miInteractivePlayground": "Playground &&Interativo", + "miDocumentation": "&&Documentação", + "miReleaseNotes": "&&Notas de Versão", + "miKeyboardShortcuts": "Referência de &&Atalhos de Teclado", + "miIntroductoryVideos": "&&Vídeos Introdutórios", + "miTwitter": "&&Junte-se a nós no Twitter", + "miUserVoice": "&&Pesquisar Solicitações de Recursos", + "miLicense": "&&Exibir Licença", + "miPrivacyStatement": "&&Política de Privacidade", + "miAbout": "&&Sobre", + "miRestartToUpdate": "Reinicie para Atualizar...", + "miCheckingForUpdates": "Verificando Atualizações...", + "miDownloadUpdate": "Baixar Atualização Disponível", + "miDownloadingUpdate": "Baixando Atualização...", + "miInstallingUpdate": "Instalando Atualização...", + "miCheckForUpdates": "Verificar Atualizações...", + "aboutDetail": "\\\\nVersão {0}\\\\nConfirmação {1}\\\\nData {2}\\\\nShell {3}\\\\nRenderizador {4}\\\\nNó {5}", + "okButton": "OK" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/code/electron-main/window.i18n.json b/i18n/ptb/src/vs/code/electron-main/window.i18n.json new file mode 100644 index 00000000000..abee584a9c1 --- /dev/null +++ b/i18n/ptb/src/vs/code/electron-main/window.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hiddenMenuBar": "Você ainda pode acessar a barra de menu pressionando a tecla * * Alt * *." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/code/electron-main/windows.i18n.json b/i18n/ptb/src/vs/code/electron-main/windows.i18n.json new file mode 100644 index 00000000000..308aed29538 --- /dev/null +++ b/i18n/ptb/src/vs/code/electron-main/windows.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ok": "OK", + "pathNotExistTitle": "O caminho não existe", + "pathNotExistDetail": "O caminho '{0}' não parece mais existir no disco.", + "accessibilityOptionsWindowTitle": "Opções de Acessibilidade", + "reopen": "Reabrir", + "wait": "Continuar Esperando", + "close": "Fechar", + "appStalled": "A janela não está mais respondendo", + "appStalledDetail": "Você pode reabrir, fechar a janela ou continuar esperando.", + "appCrashed": "A janela foi fechada inesperadamente", + "appCrashedDetail": "Pedimos desculpas pelo inconveniente! Você pode reabrir a janela para continuar de onde parou.", + "newWindow": "Nova Janela", + "newWindowDesc": "Abrir uma nova janela", + "recentFolders": "Pastas Recentes", + "folderDesc": "{0} {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/code/node/cliProcessMain.i18n.json b/i18n/ptb/src/vs/code/node/cliProcessMain.i18n.json new file mode 100644 index 00000000000..ee0b74f6e41 --- /dev/null +++ b/i18n/ptb/src/vs/code/node/cliProcessMain.i18n.json @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "notFound": "Extensão '{0}' não encontrada.", + "notInstalled": "Extensão '{0}' não está instalada.", + "useId": "Certifique-se de usar a ID de extensão completa, incluindo o editor, por exemplo: {0}", + "successVsixInstall": "Extensão '{0}' foi instalada com sucesso!", + "alreadyInstalled": "Extensão '{0}' já está instalada.", + "foundExtension": "Encontrado '{0}' na loja VS Code.", + "installing": "Instalando...", + "successInstall": "Extensão '{0}' v {1} foi instalada com sucesso!", + "uninstalling": "Desinstalando {0}...", + "successUninstall": "Extensão '{0}' foi desinstalada com sucesso!" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json new file mode 100644 index 00000000000..8411a930363 --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -0,0 +1,76 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorConfigurationTitle": "Editor", + "fontFamily": "Controla a família de fontes.", + "fontWeight": "Controla o peso da fonte.", + "fontSize": "Controla o tamanho da fonte em pixels.", + "lineHeight": "Controla a altura da linha. Use 0 para computar a altura da linha a partir do tamanho da fonte.", + "letterSpacing": "Controla o espaçamento da letra em pixels.", + "lineNumbers": "Controla a exibição de números de linha. Valores possíveis são 'on', 'off' e 'relative'. 'relative' mostra a contagem de linhas a partir da posição atual do cursor.", + "rulers": "Colunas nas quais mostrar réguas verticais", + "wordSeparators": "Caracteres que serão usados como separadores de palavras ao fazer navegação relacionada a palavras ou operações", + "tabSize": "O número de espaços equivalentes a uma tabulação. Esta configuração é sobreposta no conteúdo do arquivo quando `editor.detectIndentation` está ligado.", + "tabSize.errorMessage": "Esperado 'número'. Note que o valor \"auto\" foi alterado pela configuração 'editor.detectIndentation'.", + "insertSpaces": "Insere espaços quanto pressionado Tab. Esta configuração é sobrescrita com base no conteúdo do arquivo quando 'editor.detectIndentation' está habilitado.", + "insertSpaces.errorMessage": "Esperado 'booleano'. Note que o valor \"auto\" foi alterado pela configuração 'editor.detectIndentation'.", + "detectIndentation": "Quando um arquivo está sendo aberto, 'editor.tabSize' e 'editor.insertSpace' será detectado com base no conteúdo do arquivo.", + "roundedSelection": "Controla se as seleções têm cantos arredondados", + "scrollBeyondLastLine": "Controla se o editor rolará além da última linha", + "minimap.enabled": "Controla se o mini mapa é exibido", + "minimap.renderCharacters": "Renderizar os caracteres em uma linha (em oposição a blocos de caracteres)", + "minimap.maxColumn": "Limitar o tamanho de um mini-mapa para renderizar no máximo um número determinado de colunas", + "wordWrap.off": "As linhas nunca serão quebradas.", + "wordWrap.on": "As linhas serão quebradas na largura de visualização", + "wordWrap.wordWrapColumn": "As linhas serão quebradas em `editor.wordWrapColumn`.", + "wordWrap.bounded": "As linhas serão quebradas no mínimo entre a largura de visualização e `editor.wordWrapColumn`.", + "wordWrap": "Controla como as linhas devem ser quebradas automaticamente. Pode ser:\n- 'off' (quebra automática de linha desabilitada)\n- 'on' (quebra automática de linha na largura da janela)\n- 'wordWrapColumn' (quebra automática no numero de colunas definido em `editor.wordWrapColumn`) ou\n- 'bounded' (quebra automática em uma dimensão minima da janela e na largura configurada)", + "wordWrapColumn": "Controla a coluna de quebra de linha do editor quando editor.wordWrap` é 'wordWrapColumn' ou 'bounded'.", + "wrappingIndent": "Controla o recuo de linhas quebradas. Pode ser \"none\", \"same\" ou \"indent\".", + "mouseWheelScrollSensitivity": "Um multiplicador a ser usado em \"deltaX\" e \"deltaY\" dos eventos de rolagem do botão de rolagem do mouse", + "quickSuggestions.strings": "Habilitar sugestões rápidas dentro de strings.", + "quickSuggestions.comments": "Habilitar sugestões rápidas dentro de comentários.", + "quickSuggestions.other": "Habilitar sugestões rápidas fora de strings e comentários.", + "quickSuggestions": "Controlar se sugestões devem aparecer automaticamente ao digitar", + "quickSuggestionsDelay": "Controla o atraso em ms após o qual sugestões rápidas serão exibidas", + "parameterHints": "Habilita dicas de parâmetros", + "autoClosingBrackets": "Controla se o editor deve fechar colchetes automaticamente depois de abri-los", + "formatOnType": "Controla se o editor deve formatar automaticamente a linha após a digitação", + "formatOnPaste": "Controla se o editor deve formatar automaticamente o conteúdo colado. Um formatador deve estar disponível e o formatador deve ser capaz de formatar apenas uma parte do documento.", + "suggestOnTriggerCharacters": "Controla se as sugestões devem aparecer automaticamente ao digitar caracteres de gatilho", + "acceptSuggestionOnCommitCharacter": "Controla se as sugestões devem ser aceitas em caracteres de confirmação. Por exemplo, em JavaScript, o ponto-e-vírgula (';') pode ser um caractere de confirmação que aceita uma sugestão e digita esse caractere.", + "snippetSuggestions": "Controla se os snippets são exibidos juntamente com as outras sugestões e como eles são ordenados.", + "emptySelectionClipboard": "Controla se a cópia sem nenhuma seleção copia a linha atual.", + "wordBasedSuggestions": "Controla se o auto-completar deve ser calculado baseado nas palavras no documento.", + "suggestFontSize": "Tamanho da fonte para a ferramenta de sugestão", + "suggestLineHeight": "Altura de linha para a ferramenta de sugestão", + "selectionHighlight": "Controla se o editor deve realçar correspondências semelhantes à seleção", + "occurrencesHighlight": "Controla se o editor deve realçar ocorrências de símbolos semânticos.", + "overviewRulerLanes": "Controla o número de decorações que podem ser exibidas na mesma posição na régua de visão geral", + "overviewRulerBorder": "Controla se deve desenhar uma borda ao redor da régua de visão geral.", + "cursorBlinking": "Controla o estilo de animação do cursor, os valores possíveis são 'blink', 'smooth', 'phase', 'expand' e 'solid'", + "mouseWheelZoom": "Alterar o zoom da fonte editor quando utilizada a roda do mouse e pressionando Ctrl", + "cursorStyle": "Controla o estilo do cursor, os valores aceitos são 'block', 'block-outline', 'line', 'line-thin', 'underline' e 'underline-thin'", + "fontLigatures": "Habilita ligaduras de fontes", + "hideCursorInOverviewRuler": "Controla se o cursor deve ficar oculto na régua de visão geral.", + "renderWhitespace": "Controla como o editor deve rendenizar caracteres de espaços em branco, possibilidades são 'none', 'boundary' e 'all'. A opção 'boundary' não rendeniza espaços simples entre palavras.", + "renderControlCharacters": "Controla se o editor deve renderizar caracteres de controle", + "renderIndentGuides": "Controla se o editor deve renderizar guias de identação", + "renderLineHighlight": "Controla como o editor deve renderizar a linha atual, as possibilidades são 'none', 'gutter', 'line' e 'all'.", + "codeLens": "Controla se o editor exibirá a lente de códigos.", + "folding": "Controla se o editor tem codigo colapsível hablitado", + "showFoldingControls": "Controla se os controles de desdobramento na divisão são ocultas automaticamente.", + "matchBrackets": "Realça colchetes correspondente quando um deles estiver selecionado.", + "glyphMargin": "Controla se o editor deve renderizar a margem vertical de ícones. A margem vertical de ícones é usada primordialmente na depuração", + "useTabStops": "Inserção e deleção de espaço em branco seguem a tabulação", + "trimAutoWhitespace": "Remove espaços em branco inseridos automaticamente no fim da linha", + "stablePeek": "Mantém os editores de visualização abertos mesmo quando clicando seu conteúdo ou teclando Escape.", + "dragAndDrop": "Controla se o editor deve permitir mover seleções via arrastar e soltar.", + "sideBySide": "Controla se o editor de diff mostra as diff lado a lado ou inline.", + "ignoreTrimWhitespace": "Controla se o editor de diff mostra alterações nos espaços iniciais ou finais como diferenças", + "renderIndicators": "Controla se o editor de diff mostra indicadores +/- para alterações adicionadas/removidas", + "selectionClipboard": "Controla se a área primária de transferência Linux deve ser suportada." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/config/editorOptions.i18n.json b/i18n/ptb/src/vs/editor/common/config/editorOptions.i18n.json new file mode 100644 index 00000000000..40fed0886cc --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/config/editorOptions.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorViewAccessibleLabel": "Conteúdo do editor" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/controller/cursor.i18n.json b/i18n/ptb/src/vs/editor/common/controller/cursor.i18n.json new file mode 100644 index 00000000000..60bcb5f5b5a --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/controller/cursor.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "corrupt.commands": "Exceção inesperada ao executar o comando." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/model/textModelWithTokens.i18n.json b/i18n/ptb/src/vs/editor/common/model/textModelWithTokens.i18n.json new file mode 100644 index 00000000000..fc3574b7fde --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/model/textModelWithTokens.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mode.tokenizationSupportFailed": "O modo falhou ao gerar token da entrada." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/modes/modesRegistry.i18n.json b/i18n/ptb/src/vs/editor/common/modes/modesRegistry.i18n.json new file mode 100644 index 00000000000..509203220c8 --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/modes/modesRegistry.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "plainText.alias": "Texto sem formatação" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/services/bulkEdit.i18n.json b/i18n/ptb/src/vs/editor/common/services/bulkEdit.i18n.json new file mode 100644 index 00000000000..3fada6ebf53 --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/services/bulkEdit.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "conflict": "Estes arquivos foram alterados nesse meio tempo: {0}", + "summary.0": "Não foram feitas edições", + "summary.nm": "Feitas {0} edições de texto em {1} arquivos", + "summary.n0": "Feitas {0} edições de texto em um arquivo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/services/modeServiceImpl.i18n.json b/i18n/ptb/src/vs/editor/common/services/modeServiceImpl.i18n.json new file mode 100644 index 00000000000..85f2d2943f6 --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/services/modeServiceImpl.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "vscode.extension.contributes.languages": "Contribui às declarações de linguagem.", + "vscode.extension.contributes.languages.id": "ID da linguagem", + "vscode.extension.contributes.languages.aliases": "Aliases de nome para esta linguagem.", + "vscode.extension.contributes.languages.extensions": "Extensões de arquivos associadas a esta linguagem", + "vscode.extension.contributes.languages.filenames": "Nome dos arquivos associados a esta linguagem", + "vscode.extension.contributes.languages.filenamePatterns": "Padrão glob de nomes de arquivos associados a linguagem.", + "vscode.extension.contributes.languages.mimetypes": "Tipos Mime associados à linguagem.", + "vscode.extension.contributes.languages.firstLine": "Uma expressão regular que coincide com a primeira linha de um arquivo da linguaguem.", + "vscode.extension.contributes.languages.configuration": "Um caminho relativo para um arquivo contendo opções de configuração para a linguagem." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/services/modelServiceImpl.i18n.json b/i18n/ptb/src/vs/editor/common/services/modelServiceImpl.i18n.json new file mode 100644 index 00000000000..b6c528c5a25 --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/services/modelServiceImpl.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "diagAndSourceMultiline": "[{0}] {1}", + "diagAndSource": "[{0}] {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json new file mode 100644 index 00000000000..8d59b0fcb7d --- /dev/null +++ b/i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "lineHighlight": "Cor de fundo para a posição do cursor na seleção de linhas.", + "lineHighlightBorderBox": "Cor de fundo para a borda em volta da linha na posição do cursor", + "rangeHighlight": "Cor de fundo dos ranges selecionados, assim como abertura instantânea e descoberta de recursos ", + "caret": "Cor do cursor no editor.", + "editorWhitespaces": "Cor dos caracteres em branco no editor", + "editorIndentGuides": "Cor das guias de indentação do editor.", + "editorLineNumbers": "Cor dos números de linha do editor.", + "editorRuler": "Cor das réguas do editor.", + "editorCodeLensForeground": "Cor do primeiro plano das lentes de código do editor", + "editorBracketMatchBackground": "Cor de fundo atrás do colchetes correspondentes", + "editorBracketMatchBorder": "Cor para as caixas de colchetes correspondentes", + "editorOverviewRulerBorder": "Cor da borda da régua de visão geral.", + "editorGutter": "Cor de fundo da separação do editor.O separador contém os glifos das margens e os números de linha." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/accessibility/browser/accessibility.i18n.json b/i18n/ptb/src/vs/editor/contrib/accessibility/browser/accessibility.i18n.json new file mode 100644 index 00000000000..e045839f7c6 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/accessibility/browser/accessibility.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "introMsg": "Obrigado por testar a opção de acessibilidade do VS Code.", + "status": "Status", + "tabFocusModeOnMsg": "Pressionando Tab no editor corrente irá mover o foco para o próximo elemento focável. Mude este comportamento ao pressionar {0}.", + "tabFocusModeOnMsgNoKb": "Pressionando Tab no editor corrente irá mover o foco para o próximo elemento focável. O comando {0} não pode ser ativado atualmente por uma tecla.", + "tabFocusModeOffMsg": "Pressionando Tab no editor atual irá inserir um caractere Tab. Mude este comportamente ao pressionar {0}.", + "tabFocusModeOffMsgNoKb": "Pressionando Tab no editor atual irá inserir um caractere Tab. O comando {0} não pode ser ativado atualmente por uma tecla.", + "outroMsg": "Você pode ignorar essa dica e retornar ao editor apertando a tecla ESC", + "ShowAccessibilityHelpAction": "Mostrar ajuda de acessibilidade" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/bracketMatching/common/bracketMatching.i18n.json b/i18n/ptb/src/vs/editor/contrib/bracketMatching/common/bracketMatching.i18n.json new file mode 100644 index 00000000000..4af1753636d --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/bracketMatching/common/bracketMatching.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.jumpBracket": "Ir para colchete" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/caretOperations/common/caretOperations.i18n.json b/i18n/ptb/src/vs/editor/contrib/caretOperations/common/caretOperations.i18n.json new file mode 100644 index 00000000000..157105c4a35 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/caretOperations/common/caretOperations.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "caret.moveLeft": "Mover cursor para a esquerda", + "caret.moveRight": "Mover cursor para a direita" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/caretOperations/common/transpose.i18n.json b/i18n/ptb/src/vs/editor/contrib/caretOperations/common/transpose.i18n.json new file mode 100644 index 00000000000..c1d3083b198 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/caretOperations/common/transpose.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "transposeLetters.label": "Transport letras" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/clipboard/browser/clipboard.i18n.json b/i18n/ptb/src/vs/editor/contrib/clipboard/browser/clipboard.i18n.json new file mode 100644 index 00000000000..903f9fc1086 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/clipboard/browser/clipboard.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "actions.clipboard.cutLabel": "Recortar", + "actions.clipboard.copyLabel": "Copiar", + "actions.clipboard.pasteLabel": "Colar", + "actions.clipboard.copyWithSyntaxHighlightingLabel": "Copiar com realce de sintaxe" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/comment/common/comment.i18n.json b/i18n/ptb/src/vs/editor/contrib/comment/common/comment.i18n.json new file mode 100644 index 00000000000..ff1ba569c0c --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/comment/common/comment.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "comment.line": "Alternar Comentário de Linha", + "comment.line.add": "Adicionar Comentário de Linha", + "comment.line.remove": "Remover Comentário de Linha", + "comment.block": "Alternar Comentário de Bloco" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/contextmenu/browser/contextmenu.i18n.json b/i18n/ptb/src/vs/editor/contrib/contextmenu/browser/contextmenu.i18n.json new file mode 100644 index 00000000000..e2b1d946bee --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/contextmenu/browser/contextmenu.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "action.showContextMenu.label": "Mostrar o menu de contexto do editor" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/find/browser/findWidget.i18n.json b/i18n/ptb/src/vs/editor/contrib/find/browser/findWidget.i18n.json new file mode 100644 index 00000000000..473543c0850 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/find/browser/findWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.find": "Localizar", + "placeholder.find": "Localizar", + "label.previousMatchButton": "Correspondência anterior", + "label.nextMatchButton": "Próxima correspondência", + "label.toggleSelectionFind": "Localizar na seleção", + "label.closeButton": "Fechar", + "label.replace": "Substituir", + "placeholder.replace": "Substituir", + "label.replaceButton": "Substituir", + "label.replaceAllButton": "Substituir Tudo", + "label.toggleReplaceButton": "Ativar/desativar modo Substituir", + "title.matchesCountLimit": "Somente os primeiros 999 resultados são realçados, mas todas as operações de pesquisa funcionam em todo o texto.", + "label.matchesLocation": "{0} de {1}", + "label.noResults": "Nenhum resultado" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/find/common/findController.i18n.json b/i18n/ptb/src/vs/editor/contrib/find/common/findController.i18n.json new file mode 100644 index 00000000000..07397efa5fe --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/find/common/findController.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "startFindAction": "Localizar", + "findNextMatchAction": "Localizar Próximo", + "findPreviousMatchAction": "Localizar anterior", + "nextSelectionMatchFindAction": "Localizar Próxima Seleção", + "previousSelectionMatchFindAction": "Localizar Seleção Anterior", + "startReplace": "Substituir", + "addSelectionToNextFindMatch": "Adicionar Seleção ao Próximo Localizar Correspondência", + "addSelectionToPreviousFindMatch": "Adicionar Seleção à Correspondência de Localização Anterior", + "moveSelectionToNextFindMatch": "Mover Última Seleção para Próximo Localizar Correspondência", + "moveSelectionToPreviousFindMatch": "Mover Última Seleção para Correspondência de Localização Anterior", + "selectAllOccurencesOfFindMatch": "Selecionar Todas as Ocorrências de Localizar Correspondência", + "changeAll.label": "Alterar todas as ocorrências" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/folding/browser/folding.i18n.json b/i18n/ptb/src/vs/editor/contrib/folding/browser/folding.i18n.json new file mode 100644 index 00000000000..c9d6b88a852 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/folding/browser/folding.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unfoldAction.label": "Abrir", + "unFoldRecursivelyAction.label": "Abrir recursivamente", + "foldAction.label": "Colapsar", + "foldRecursivelyAction.label": "Colapsar recursivamente", + "foldAllAction.label": "Colapsar tudo", + "unfoldAllAction.label": "Abrir tudo", + "foldLevelAction.label": "Nível de colapsamento {0}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/format/browser/formatActions.i18n.json b/i18n/ptb/src/vs/editor/contrib/format/browser/formatActions.i18n.json new file mode 100644 index 00000000000..4327e5f6744 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/format/browser/formatActions.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint11": "1 edição de formatação feita na linha {0}", + "hintn1": "{0} edições de formatação feitas na linha {1}", + "hint1n": "Feita 1 edição de formatação entre as linhas {0} e {1}", + "hintnn": "Feitas {0} edições de formatação entre as linhas {1} e {2}", + "formatDocument.label": "Formatar Documento", + "formatSelection.label": "Formatar Seleção" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/ptb/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..01753366bca --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "Não foi encontrada definição para '{0}'", + "generic.noResults": "Nenhuma definição encontrada", + "meta.title": "- {0} definições", + "actions.goToDecl.label": "Ir para Definição", + "actions.goToDeclToSide.label": "Abrir definição ao lado", + "actions.previewDecl.label": "Inspecionar definição", + "goToImplementation.noResultWord": "Nenhuma implementação encontrada para '{0}'", + "goToImplementation.generic.noResults": "Nenhuma implementação encontrada", + "meta.implementations.title": "– {0} implementações", + "actions.goToImplementation.label": "Ir para a implementação", + "actions.peekImplementation.label": "Inspecionar implementação", + "goToTypeDefinition.noResultWord": "Nenhuma definição encontrada para '{0}'", + "goToTypeDefinition.generic.noResults": "Nenhuma definição de tipo encontrada", + "meta.typeDefinitions.title": "– {0} definições de tipos", + "actions.goToTypeDefinition.label": "Ir para a definição de tipo", + "actions.peekTypeDefinition.label": "Inspecionar definição de tipo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/ptb/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..675cbe29ae1 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Clique para mostrar {0} definições." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json b/i18n/ptb/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json new file mode 100644 index 00000000000..0ad65de8863 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/gotoError/browser/gotoError.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "title.wo_source": "({0}/{1})", + "markerAction.next.label": "Ir para o Próximo Erro ou Aviso", + "markerAction.previous.label": "Ir para o Erro ou Aviso Anterior", + "editorMarkerNavigationError": "Ferramenta de marcação de edição apresentando error na cor ", + "editorMarkerNavigationWarning": "Ferramenta de marcação de edição apresentando adventência na cor", + "editorMarkerNavigationBackground": "Cor de fundo da ferramenta de marcação de navegação do editor." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/hover/browser/hover.i18n.json b/i18n/ptb/src/vs/editor/contrib/hover/browser/hover.i18n.json new file mode 100644 index 00000000000..196a8fb2bb0 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/hover/browser/hover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showHover": "Mostrar Item Flutuante" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/hover/browser/modesContentHover.i18n.json b/i18n/ptb/src/vs/editor/contrib/hover/browser/modesContentHover.i18n.json new file mode 100644 index 00000000000..2c74cf6f1ec --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/hover/browser/modesContentHover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "modesContentHover.loading": "Carregando..." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.i18n.json b/i18n/ptb/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.i18n.json new file mode 100644 index 00000000000..fbbfbd02161 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "InPlaceReplaceAction.previous.label": "Substituir pelo valor anterior", + "InPlaceReplaceAction.next.label": "Substituir pelo próximo valor" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/indentation/common/indentation.i18n.json b/i18n/ptb/src/vs/editor/contrib/indentation/common/indentation.i18n.json new file mode 100644 index 00000000000..8edeaaf8104 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/indentation/common/indentation.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "indentationToSpaces": "Converter indentação em espaços.", + "indentationToTabs": "Coverter Indentação a Tabulações.", + "configuredTabSize": "Tamanho de Tabulação Configurado", + "selectTabWidth": "Selecione o Tamanho de Tabulação para o Arquivo Atual", + "indentUsingTabs": "Indentar Usando Tabulações", + "indentUsingSpaces": "Indentar Usando Espaços", + "detectIndentation": "Detectar Indentação a Partir do Conteúdo", + "editor.reindentlines": "Reindentar Linhas" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.i18n.json b/i18n/ptb/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.i18n.json new file mode 100644 index 00000000000..e715c4d667f --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/inspectTMScopes/electron-browser/inspectTMScopes.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "inspectTMScopes": "Desenvolvedor: Inspecionar escopos TM", + "inspectTMScopesWidget.loading": "Carregando..." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/linesOperations/common/linesOperations.i18n.json b/i18n/ptb/src/vs/editor/contrib/linesOperations/common/linesOperations.i18n.json new file mode 100644 index 00000000000..8a368ab368d --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/linesOperations/common/linesOperations.i18n.json @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "lines.copyUp": "Copiar linha acima", + "lines.copyDown": "Copiar linha abaixo", + "lines.moveUp": "Mover linha para cima", + "lines.moveDown": "Mover linha para baixo", + "lines.sortAscending": "Classificar Linhas Ascendentemente", + "lines.sortDescending": "Classificar Linhas Descendentemente", + "lines.trimTrailingWhitespace": "Cortar Espaço em Branco à Direita", + "lines.delete": "Excluir linha", + "lines.indent": "Recuar linha", + "lines.outdent": "Recuar linha para a esquerda", + "lines.insertBefore": "Inserir linha acima", + "lines.insertAfter": "Inserir linha abaixo", + "lines.deleteAllLeft": "Excluir tudo à Esquerda", + "lines.deleteAllRight": "Excluir Tudo à Direita", + "lines.joinLines": "Unir Linhas", + "editor.transpose": "Transpor caracteres ao redor do cursor", + "editor.transformToUppercase": "Transformar para maiúsculas", + "editor.transformToLowercase": "Transformar para minúsculas" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/links/browser/links.i18n.json b/i18n/ptb/src/vs/editor/contrib/links/browser/links.i18n.json new file mode 100644 index 00000000000..64628273f2a --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/links/browser/links.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "links.navigate.mac": "Cmd + clique para seguir o link", + "links.navigate": "Ctrl + clique para seguir o link", + "invalid.url": "Desculpe, falha ao abrir este link porque ele não está bem formatado: {0}", + "missing.url": "Desculpe, falha ao abrir este link porque seu destino está faltando.", + "label": "Abrir link" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/multicursor/common/multicursor.i18n.json b/i18n/ptb/src/vs/editor/contrib/multicursor/common/multicursor.i18n.json new file mode 100644 index 00000000000..583be5b3e5c --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/multicursor/common/multicursor.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mutlicursor.insertAbove": "Inserir cursor acima", + "mutlicursor.insertBelow": "Inserir cursor abaixo", + "mutlicursor.insertAtEndOfEachLineSelected": "Adicionar Cursores ao Final das Linhas" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/parameterHints/browser/parameterHints.i18n.json b/i18n/ptb/src/vs/editor/contrib/parameterHints/browser/parameterHints.i18n.json new file mode 100644 index 00000000000..f0450d3f4de --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/parameterHints/browser/parameterHints.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "parameterHints.trigger.label": "Dicas de parâmetro de gatilho" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.i18n.json b/i18n/ptb/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.i18n.json new file mode 100644 index 00000000000..0f8237adbb3 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hint": "{0}, dica" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/quickFix/browser/quickFixCommands.i18n.json b/i18n/ptb/src/vs/editor/contrib/quickFix/browser/quickFixCommands.i18n.json new file mode 100644 index 00000000000..01ae8d7aff8 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/quickFix/browser/quickFixCommands.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickFixWithKb": "Mostrar correções ({0})", + "quickFix": "Mostrar correções", + "quickfix.trigger.label": "Correção Rápida" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referenceSearch.i18n.json b/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referenceSearch.i18n.json new file mode 100644 index 00000000000..9d557535df6 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referenceSearch.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "meta.titleReference": "- {0} referências", + "references.action.label": "Localizar Todas as Referências" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesController.i18n.json b/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesController.i18n.json new file mode 100644 index 00000000000..65217d2ace8 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesController.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "labelLoading": "Carregando..." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json b/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json new file mode 100644 index 00000000000..47c3685850e --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesModel.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "aria.oneReference": "símbolo em {0} na linha {1} e coluna {2}", + "aria.fileReferences.1": "1 símbolo em {0}", + "aria.fileReferences.N": "{0} símbolos em {1}", + "aria.result.0": "Nenhum resultado encontrado", + "aria.result.1": "Encontrado 1 símbolo em {0}", + "aria.result.n1": "Encontrados {0} símbolos em {1}", + "aria.result.nm": "Encontrados {0} símbolos em {1} arquivos" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json b/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json new file mode 100644 index 00000000000..72f61eeaf83 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.i18n.json @@ -0,0 +1,27 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "referencesFailre": "Falha ao resolver arquivo.", + "referencesCount": "{0} referências", + "referenceCount": "{0} referência", + "missingPreviewMessage": "nenhuma visualização disponível", + "treeAriaLabel": "Referências", + "noResults": "Nenhum resultado", + "peekView.alternateTitle": "Referências", + "peekViewTitleBackground": "Cor de fundo da área de visualização do título.", + "peekViewTitleForeground": "Cor de visualização do título.", + "peekViewTitleInfoForeground": "Cor da visualização de informações do título.", + "peekViewBorder": "Cor das bordas e seta da área de visualização", + "peekViewResultsBackground": "Cor de fundo da área de visualização da lista de resultados.", + "peekViewResultsMatchForeground": "Cor de primeiro plano para nós de linha na lista de resultados visualizados.", + "peekViewResultsFileForeground": "Cor de primeiro plano para nós de arquivos na lista de resultados visualizados.", + "peekViewResultsSelectionBackground": "Cor de fundo da entrada selecionada na visualização da lista de resultados.", + "peekViewResultsSelectionForeground": "Cor da entrada selecionada na visualização da lista de resultados.", + "peekViewEditorBackground": "Cor de fundo da visualização do editor.", + "peekViewEditorGutterBackground": "Cor de fundo da separação na visualização rápida do editor.", + "peekViewResultsMatchHighlight": "Corresponder cor de realce com visualização da lista de resultados.", + "peekViewEditorMatchHighlight": "Corresponder cor de realce com visualização do editor." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/rename/browser/rename.i18n.json b/i18n/ptb/src/vs/editor/contrib/rename/browser/rename.i18n.json new file mode 100644 index 00000000000..a56535f6241 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/rename/browser/rename.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "no result": "Nenhum resultado.", + "aria": "Renomeado '{0}' para '{1}'com sucesso. Resumo: {2}", + "rename.failed": "Desculpe, falha na execução de renomear.", + "rename.label": "Renomear Símbolo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/rename/browser/renameInputField.i18n.json b/i18n/ptb/src/vs/editor/contrib/rename/browser/renameInputField.i18n.json new file mode 100644 index 00000000000..49eba92fa44 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/rename/browser/renameInputField.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "renameAriaLabel": "Renomear entrada. Digite o novo nome e tecle Enter para gravar." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/smartSelect/common/smartSelect.i18n.json b/i18n/ptb/src/vs/editor/contrib/smartSelect/common/smartSelect.i18n.json new file mode 100644 index 00000000000..89319f9a266 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/smartSelect/common/smartSelect.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "smartSelect.grow": "Expandir seleção", + "smartSelect.shrink": "Reduzir seleção" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/suggest/browser/suggestController.i18n.json b/i18n/ptb/src/vs/editor/contrib/suggest/browser/suggestController.i18n.json new file mode 100644 index 00000000000..b064152c8be --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/suggest/browser/suggestController.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "arai.alert.snippet": "Ao aceitar '{0}' foi inserido o seguinte texto: {1}", + "suggest.trigger.label": "Sugestão de gatilho" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json b/i18n/ptb/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json new file mode 100644 index 00000000000..c9da4793d67 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/suggest/browser/suggestWidget.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorSuggestWidgetBackground": "Cor de fundo para a ferramenta de sugestão.", + "editorSuggestWidgetBorder": "Cor da borda para a ferramenta de sugestão.", + "editorSuggestWidgetForeground": "Cor de primeiro plano para a ferramenta de sugestão.", + "editorSuggestWidgetSelectedBackground": "Cor de fundo da entrada selecionada da ferramenta de sugestões.", + "editorSuggestWidgetHighlightForeground": "Cor de realce da correspondência na ferramenta de sugestão.", + "readMore": "Ler Mais...{0}", + "suggestionWithDetailsAriaLabel": "{0}, sugestão, tem detalhes", + "suggestionAriaLabel": "{0}, sugestão", + "readLess": "Ler menos... {0}", + "suggestWidget.loading": "Carregando...", + "suggestWidget.noSuggestions": "Nenhuma sugestão.", + "suggestionAriaAccepted": "{0}, aceito", + "ariaCurrentSuggestionWithDetails": "{0}, sugestão, tem detalhes", + "ariaCurrentSuggestion": "{0}, sugestão" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/toggleTabFocusMode/common/toggleTabFocusMode.i18n.json b/i18n/ptb/src/vs/editor/contrib/toggleTabFocusMode/common/toggleTabFocusMode.i18n.json new file mode 100644 index 00000000000..0f3dd068095 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/toggleTabFocusMode/common/toggleTabFocusMode.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggle.tabMovesFocus": "Alterne o uso da tecla Tab para mover o foco" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.i18n.json b/i18n/ptb/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.i18n.json new file mode 100644 index 00000000000..e8556cb38a8 --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "wordHighlight": "Cor de fundo de um símbolo durante acesso de leitura, como ao ler uma variável.", + "wordHighlightStrong": "Cor de fundo de um símbolo durante acesso de escrita, como ao escrever uma variável." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/zoneWidget/browser/peekViewWidget.i18n.json b/i18n/ptb/src/vs/editor/contrib/zoneWidget/browser/peekViewWidget.i18n.json new file mode 100644 index 00000000000..41ad7313b7d --- /dev/null +++ b/i18n/ptb/src/vs/editor/contrib/zoneWidget/browser/peekViewWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "label.close": "Fechar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/electron-browser/textMate/TMSyntax.i18n.json b/i18n/ptb/src/vs/editor/electron-browser/textMate/TMSyntax.i18n.json new file mode 100644 index 00000000000..dfef3cc47a5 --- /dev/null +++ b/i18n/ptb/src/vs/editor/electron-browser/textMate/TMSyntax.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid.language": "Linguagem desconhecida em `contributes.{0}.language`. Valor fornecido: {1}", + "invalid.scopeName": "Esperada uma string em 'contributes.{0}.scopeName'. Valor informado: {1}", + "invalid.path.0": "Esperada uma string em `contributes.{0}.path`. Valor informado: {1}", + "invalid.injectTo": "Valor inválido em `contributes.{0}.injectTo`. Deve ser uma matriz de nomes de escopo de idioma. Valor fornecido: {1}", + "invalid.embeddedLanguages": "Valor inválido em `contributes.{0}.embeddedLanguages`. Deve ser um objeto de mapeamento do nome do escopo para a linguagem. Valor informado: {1}", + "invalid.path.1": "É esperado que `contributes.{0}.path` ({1}) seja incluído na pasta da extensão ({2}). Isto pode tornar a extensão não portável.", + "no-tm-grammar": "Nenhuma gramática TM registrada para este idioma." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json b/i18n/ptb/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json new file mode 100644 index 00000000000..04aa2bc703f --- /dev/null +++ b/i18n/ptb/src/vs/editor/node/languageConfigurationExtensionPoint.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "parseErrors": "Erros parseando {0}: {1}", + "schema.openBracket": "O colchete de abertura de caractere ou sequência de caracteres.", + "schema.closeBracket": "O colchete de fechamento de caractere ou sequência de caracteres.", + "schema.comments": "Define o símbolo dos comentários", + "schema.blockComments": "Define como comentários em bloco são marcados.", + "schema.blockComment.begin": "A sequência de caracteres que inicia um comentário em bloco.", + "schema.blockComment.end": "A sequência de caracteres que termina um comentário de bloco.", + "schema.lineComment": "A sequência de caracteres que inicia um comentário de linha.", + "schema.brackets": "Define os símbolos de colchetes que aumentam ou diminuem a indentação.", + "schema.autoClosingPairs": "Define os pares de colchetes. Quando é introduzido um colchete de abertura, o colchete de fechamento é inserido automaticamente.", + "schema.autoClosingPairs.notIn": "Define uma lista de escopos onde os auto pares são desativados.", + "schema.surroundingPairs": "Define os pares de colchetes que podem ser usados para cercar uma seqüência selecionada.", + "schema.wordPattern": "A definição da palavra para a linguagem.", + "schema.wordPattern.pattern": "O padrão RegExp usado para coincidir com as palavras.", + "schema.wordPattern.flags": "Os sinalizadores RegExp usados para coincidir com as palavras.", + "schema.wordPattern.flags.errorMessage": "Deve corresponder ao padrão `/^([gimuy]+)$/`." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/node/textMate/TMGrammars.i18n.json b/i18n/ptb/src/vs/editor/node/textMate/TMGrammars.i18n.json new file mode 100644 index 00000000000..7707ea3401f --- /dev/null +++ b/i18n/ptb/src/vs/editor/node/textMate/TMGrammars.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "vscode.extension.contributes.grammars": "Contibui aos toquenizadores textmate", + "vscode.extension.contributes.grammars.language": "Identificador da linguagem para qual a sintaxe contribui.", + "vscode.extension.contributes.grammars.scopeName": "Nome do escopo Textmate usado pelo arquivo tmLanguage.", + "vscode.extension.contributes.grammars.path": "Caminho para o arquivo tmLanguage. O caminho é relativo a pasta da extensão e geralmente começa com './syntaxes/'.", + "vscode.extension.contributes.grammars.embeddedLanguages": "Um mapeamento no nome do escopo para o Id da linguagem se esta gramática contenha linguagens embutidas.", + "vscode.extension.contributes.grammars.injectTo": "Lista de nomes de escopos de linguagem aos quais esta gramática é injetada." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/actions/browser/menuItemActionItem.i18n.json b/i18n/ptb/src/vs/platform/actions/browser/menuItemActionItem.i18n.json new file mode 100644 index 00000000000..e64a7d0ed09 --- /dev/null +++ b/i18n/ptb/src/vs/platform/actions/browser/menuItemActionItem.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "titleAndKb": "{0} ({1})" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json b/i18n/ptb/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json new file mode 100644 index 00000000000..a8ef6175a09 --- /dev/null +++ b/i18n/ptb/src/vs/platform/actions/electron-browser/menusExtensionPoint.i18n.json @@ -0,0 +1,41 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "requirearray": "os itens de menu devem ser um array", + "requirestring": "a propriedade `{0}` é obrigatória e deve ser do tipo `string`", + "optstring": "a propriedade `{0}` é opcional ou deve ser do tipo `string`", + "vscode.extension.contributes.menuItem.command": "Identificador do comando para ser executado. O comando deve ser declarado na seção de 'Comandos'", + "vscode.extension.contributes.menuItem.alt": "O identificador de um comando alternativo para executar. O comando deve ser declarado na sessão 'Comandos'", + "vscode.extension.contributes.menuItem.when": "Condição, que deve ser verdadeira, para mostrar esse item", + "vscode.extension.contributes.menuItem.group": "Grupo ao qual pertence este comando", + "vscode.extension.contributes.menus": "Contribui itens de menu ao editor", + "menus.commandPalette": "Paleta de comandos", + "menus.editorTitle": "Meno do título editor", + "menus.editorContext": "Mostrar o menu de contexto do editor", + "menus.explorerContext": "Menu no contexto de explorador de arquivos", + "menus.editorTabContext": "Mostrar o menu de contexto do editor", + "menus.debugCallstackContext": "O menu de contexto de pilha de chamadas de depuração", + "menus.scmTitle": "O menu de título do controle de fonte", + "menus.resourceGroupContext": "O menu de contexto do grupo de recursos de controle de fonte", + "menus.resourceStateContext": "O menu de contexto de estado de recursos do controle de fonte", + "nonempty": "Esperado um valor não vazio", + "opticon": "a propriedade '{0}' é opcional ou pode ser do tipo 'string'", + "requireStringOrObject": "a propriedade '{0}' é obrigatória e deve ser do tipo 'string'", + "requirestrings": "a propriedade `{0}` é obrigatória e deve ser do tipo `string`", + "vscode.extension.contributes.commandType.command": "Indentificador de comando para executar", + "vscode.extension.contributes.commandType.title": "Título para o qual o comando é representado na UI", + "vscode.extension.contributes.commandType.category": "(Opcional) Sequência de categoria será agrupada na interface de usuário", + "vscode.extension.contributes.commandType.icon": "(Opcional) Icone utilizado para representar o comando na interface de usuário. Um arquivo ou configuração do tema.", + "vscode.extension.contributes.commandType.icon.light": "Caminho do Ícone quando o tema light for utilizado", + "vscode.extension.contributes.commandType.icon.dark": "Caminho do ícone quando o tema dark for utilizado", + "vscode.extension.contributes.commands": "Contribui comandos à paleta de comandos", + "dup": "Comando '{0}' aparece multiplas vezes na sessão 'comandos'\n", + "menuId.invalid": "'{0}' nao é um identificador de menu válido ", + "missing.command": "Identificador do comando para ser executado. O comando deve ser declarado na seção de 'Comandos'", + "missing.altCommand": "Referências ao item de menu no alt-command '{0}' qual nao é definido na sessão 'comandos'", + "dupe.command": "Itens de referencias do mesmo comando como padrão e alt-command", + "nosupport.altCommand": "Desculpe, mas atualmente somente o groupo 'navegação' do menu 'editor/título' suporta alt-commands" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/configuration/common/configurationRegistry.i18n.json b/i18n/ptb/src/vs/platform/configuration/common/configurationRegistry.i18n.json new file mode 100644 index 00000000000..928f36b2ee4 --- /dev/null +++ b/i18n/ptb/src/vs/platform/configuration/common/configurationRegistry.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultConfigurations.title": "Sobreposições da Configuração Padrão", + "overrideSettings.description": "Definir que configurações do editor sejam substituídas para idioma {0}.", + "overrideSettings.defaultDescription": "Definir que configurações do editor sejam substituídas para um idioma.", + "vscode.extension.contributes.configuration": "Contribui às definições de configuração.", + "vscode.extension.contributes.configuration.title": "Um resumo das configurações. Este rótulo será usado no arquivo de configurações como um comentário de separação.", + "vscode.extension.contributes.configuration.properties": "Descrição das propriedades de configuração.", + "config.property.languageDefault": "Não é possível registrar '{0}'. Isto corresponde a propriedade padrão '\\\\[.*\\\\]$' para descrever configurações do editor específico de linguagem. Use a contribuição 'configurationDefaults'.", + "config.property.duplicate": "Não é possível registrar '{0}'. Esta propriedade já está registrada.", + "invalid.properties": "'configuration.properties' deve ser um objeto", + "invalid.type": "Se definido, 'configuration.type' deve ser do tipo 'object'", + "invalid.title": "'configuration.title' deve ser um string", + "vscode.extension.contributes.defaultConfiguration": "Contribui às definições de configuração padrão do editor por linguagem." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json b/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json new file mode 100644 index 00000000000..4cec19113d2 --- /dev/null +++ b/i18n/ptb/src/vs/platform/environment/node/argv.i18n.json @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "gotoValidation": "Argumentos no modo '--goto' deve ser no formato de 'Arquivo(:LINHA(:CARACTERE))'.", + "diff": "Abrir um editor de diff. Requer passar dois caminhos de arquivo como argumentos.", + "goto": "Abra o arquivo no caminho, na linha e caractere (addcionar:linha[:caractere] para o caminho).", + "locale": "Para localização utilize (ex. en-US ou zh-TW).", + "newWindow": "Força uma nova instância do Código.", + "performance": "Comece com o 'Desenvolvedor: Desempenho de inicialização' comando habilitado.", + "prof-startup": "Rodar o CPU profiler durante a inicialização", + "reuseWindow": "Forçar a abertura de um arquivo ou pasta na última janela ativa", + "userDataDir": "Especifica o diretório que os dados do usuário serão mantidos, útil quando estiver rodando como root.", + "verbose": "Imprimir a saída detalhada (Implica -- esperar).", + "wait": "Aguarde a janela ser fechada antes de retornar.", + "extensionHomePath": "Defina o caminho raíz para as extensões.", + "listExtensions": "Lista de extensões instaladas", + "showVersions": "Exibir versões de extensões instaladas, quando estiver usando --list-extension", + "installExtension": "Instala uma extensão.", + "uninstallExtension": "Desinstala uma extensão.", + "experimentalApis": "Permite recursos de api propostos para uma extensão.", + "disableExtensions": "Desabilita todas as extensões instaladas.", + "disableGPU": "Desabilita aceleração de hardware da GPU.", + "version": "Versão de impressão", + "help": "Uso de impressão.", + "usage": "Uso", + "options": "opções", + "paths": "caminhos", + "optionsUpperCase": "Opções" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/extensionManagement/common/extensionEnablementService.i18n.json b/i18n/ptb/src/vs/platform/extensionManagement/common/extensionEnablementService.i18n.json new file mode 100644 index 00000000000..52f37b66ccd --- /dev/null +++ b/i18n/ptb/src/vs/platform/extensionManagement/common/extensionEnablementService.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noWorkspace": "Não há espaço de trabalho." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/extensionManagement/common/extensionManagement.i18n.json b/i18n/ptb/src/vs/platform/extensionManagement/common/extensionManagement.i18n.json new file mode 100644 index 00000000000..33ea8261326 --- /dev/null +++ b/i18n/ptb/src/vs/platform/extensionManagement/common/extensionManagement.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "extensions": "Extensões", + "preferences": "Preferências" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json b/i18n/ptb/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json new file mode 100644 index 00000000000..76dc4cf48f3 --- /dev/null +++ b/i18n/ptb/src/vs/platform/extensionManagement/node/extensionGalleryService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "notFound": "Extensão não encontrada", + "noCompatible": "Não foi possível econtrar uma versão de {0} com esta versão do Code." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json b/i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json new file mode 100644 index 00000000000..a6c5a37ab05 --- /dev/null +++ b/i18n/ptb/src/vs/platform/extensionManagement/node/extensionManagementService.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalidManifest": "Extensão inválida: pacote.json nao é um arquivo JSON válido", + "restartCode": "Por favor reinicie Code antes de reinstalar {0}.", + "installDependeciesConfirmation": "A instalação de '{0}' também inclui suas dependências. Gostaria de continuar?", + "install": "Sim", + "doNotInstall": "Não", + "uninstallDependeciesConfirmation": "Gostaria de desinstalar '{0}' somente, ou suas dependências também?", + "uninstallOnly": "Apenas", + "uninstallAll": "Todos", + "cancel": "Cancelar", + "uninstallConfirmation": "Tem certeza que deseja desinstalar '{0}'?", + "ok": "OK", + "singleDependentError": "Não foi possível desinstalar a extensão '{0}'. A extensão '{1}' depende dela.", + "twoDependentsError": "Não foi possível desinstalar a extensão '{0}'. As extensões '{1}' e '{2}' dependem dela.", + "multipleDependentsError": "Não foi possível desinstalar a extensão '{0}'. As extensões '{1}' e '{2}' e outras dependem dela.", + "notExists": "Não foi possível encontrar a extensão" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/extensions/common/abstractExtensionService.i18n.json b/i18n/ptb/src/vs/platform/extensions/common/abstractExtensionService.i18n.json new file mode 100644 index 00000000000..d521fce97ff --- /dev/null +++ b/i18n/ptb/src/vs/platform/extensions/common/abstractExtensionService.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unknownDep": "Extensão '{1}' falhou ao ativar. Motivo: dependência desconhecida '{0}'.", + "failedDep1": "Extensão '{1}' falhou ao ativar. Motivo: a dependência '{0}' falhou ao ativar.", + "failedDep2": "Extensão '{0}' falhou ao ativar. Motivo: mais de 10 níveis de dependências (provavelmente um laço de dependência).", + "activationError": "Ativação da extensão `{0}` falhou: {1}." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/extensions/common/extensionsRegistry.i18n.json b/i18n/ptb/src/vs/platform/extensions/common/extensionsRegistry.i18n.json new file mode 100644 index 00000000000..649e13b03b1 --- /dev/null +++ b/i18n/ptb/src/vs/platform/extensions/common/extensionsRegistry.i18n.json @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "vscode.extension.engines.vscode": "Para extensões do VS Code, especifica a versão do VS Code que a extensão é compatível. Não pode ser *. Por exemplo: ^0.10.5 indica compatibilidade com uma versão mínima de 0.10.5 para o VS Code.", + "vscode.extension.publisher": "O editor da extensão do VS Code.", + "vscode.extension.displayName": "O nome de exibição para a extensão do VS Code.", + "vscode.extension.categories": "As categorias usadas pela galeria do VS Code para categorizar a extensão.", + "vscode.extension.galleryBanner": "Banner usado na loja VS Code.", + "vscode.extension.galleryBanner.color": "A cor do banner usado no cabeçalho de página da loja VS Code.", + "vscode.extension.galleryBanner.theme": "A cor do tema usada para o fonte usado no banner.", + "vscode.extension.contributes": "Todas as contribuições da extensão VS Code representadas por este pacote.", + "vscode.extension.preview": "Configura a extensão para ser marcada como pré-visualização na Loja.", + "vscode.extension.activationEvents": "Eventos de ativação para a extensão VS Code.", + "vscode.extension.badges": "Matriz de emblemas a mostrar na barra lateral da página da extensão na Loja.", + "vscode.extension.badges.url": "URL da imagem do emblema.", + "vscode.extension.badges.href": "Link do emblema.", + "vscode.extension.badges.description": "Descrição do emblema.", + "vscode.extension.extensionDependencies": "Dependências para outras extensões. O identificador de uma extensão sempre é ${publisher}. ${nome}. Por exemplo: vscode.csharp.", + "vscode.extension.scripts.prepublish": "Script a ser executado antes do pacote ser publicado como uma extensão VS Code.", + "vscode.extension.icon": "O caminho para um ícone de 128x128 pixels." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/extensions/node/extensionValidator.i18n.json b/i18n/ptb/src/vs/platform/extensions/node/extensionValidator.i18n.json new file mode 100644 index 00000000000..fe37dd1820f --- /dev/null +++ b/i18n/ptb/src/vs/platform/extensions/node/extensionValidator.i18n.json @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "versionSyntax": "Não foi possível analisar o valor de 'engines.vscode' {0}. Por favor, utilize, por exemplo: ^ 0.10.0, ^ 1.2.3, ^ 0.11.0, ^ 0.10.x, etc.", + "versionSpecificity1": "Versão especificada em 'engines.vscode' ({0}) não é específica o suficiente. Para versões do vscode anteriores a 1.0.0, por favor defina no mínimo a versão principal e secundária desejada. Por exemplo, ^ 0.10.0, 0.10.x, 0.11.0, etc.", + "versionSpecificity2": "Versão especificada em 'engines.vscode' ({0}) não é específica o suficiente. Para as versões do vscode posteriores a 1.0.0, por favor defina no mínimo a versão principal do desejado. Por exemplo, ^ 1.10.0, 1.10.x 1. XX, 2.x.x, etc.", + "versionMismatch": "Extensão não é compatível com Code {0}. A extensão requer: {1}.", + "extensionDescription.empty": "Descrição de extensão vazia obtida", + "extensionDescription.publisher": "a propriedade `{0}` é obrigatória e deve ser do tipo `string`", + "extensionDescription.name": "a propriedade `{0}` é obrigatória e deve ser do tipo `string`", + "extensionDescription.version": "a propriedade `{0}` é obrigatória e deve ser do tipo `string`", + "extensionDescription.engines": "a propriedade `{0}` é obrigatória e deve ser do tipo `object`", + "extensionDescription.engines.vscode": "a propriedade `{0}` é obrigatória e deve ser do tipo `string`", + "extensionDescription.extensionDependencies": "a propriedade `{0}` pode ser omitida ou deve ser do tipo `string[]`", + "extensionDescription.activationEvents1": "a propriedade `{0}` pode ser omitida ou deve ser do tipo `string[]`", + "extensionDescription.activationEvents2": "Propriedades '{0}' e '{1}' devem ser especificadas ou devem ambas ser omitidas", + "extensionDescription.main1": "a propriedade `{0}` é opcional ou pode ser do tipo `string`", + "extensionDescription.main2": "Esperado 'main' ({0}) ser incluído dentro da pasta da extensão ({1}). Isto pode fazer a extensão não-portável.", + "extensionDescription.main3": "propriedades '{0}' e '{1}' devem ser especificadas ou devem ambas ser omitidas", + "notSemver": "Versão da extensão não é compatível a semver" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json b/i18n/ptb/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json new file mode 100644 index 00000000000..d252527ac15 --- /dev/null +++ b/i18n/ptb/src/vs/platform/integrity/node/integrityServiceImpl.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "integrity.ok": "OK", + "integrity.dontShowAgain": "Não mostrar novamente", + "integrity.moreInfo": "Mais informações", + "integrity.prompt": "Sua instalação de {0} parece estar corrompida. Favor reinstalar." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/jsonschemas/common/jsonValidationExtensionPoint.i18n.json b/i18n/ptb/src/vs/platform/jsonschemas/common/jsonValidationExtensionPoint.i18n.json new file mode 100644 index 00000000000..47ff1ba6bad --- /dev/null +++ b/i18n/ptb/src/vs/platform/jsonschemas/common/jsonValidationExtensionPoint.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "contributes.jsonValidation": "Contribui à configuração do schema json.", + "contributes.jsonValidation.fileMatch": "O padrão de arquivo a corresponder, por exemplo \"package.json\" ou \"*.launch\".", + "contributes.jsonValidation.url": "Um esquema de URL ('http:', 'https:') ou caminho relativo à pasta de extensão('./').", + "invalid.jsonValidation": "'configuration.jsonValidation' deve ser uma matriz", + "invalid.fileMatch": "'configuration.jsonValidation.fileMatch' deve ser definido", + "invalid.url": "'configuration.jsonValidation.url' deve ser uma URL ou caminho relativo", + "invalid.url.fileschema": "'configuration.jsonValidation.url' é uma URL relativa inválida: {0}", + "invalid.url.schema": "'configuration.jsonValidation.url' deve começar com ' http:', ' https: 'ou'. /' para os esquemas de referência localizados na extensão" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/keybinding/common/abstractKeybindingService.i18n.json b/i18n/ptb/src/vs/platform/keybinding/common/abstractKeybindingService.i18n.json new file mode 100644 index 00000000000..59961c4476a --- /dev/null +++ b/i18n/ptb/src/vs/platform/keybinding/common/abstractKeybindingService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "first.chord": "({0}) foi pressionado. Aguardando segunda tecla de pressionamento simultâneo...", + "missing.chord": "A combinação de chave ({0}, {1}) não é um comando." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/keybinding/common/keybindingLabels.i18n.json b/i18n/ptb/src/vs/platform/keybinding/common/keybindingLabels.i18n.json new file mode 100644 index 00000000000..bf2baf83906 --- /dev/null +++ b/i18n/ptb/src/vs/platform/keybinding/common/keybindingLabels.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ctrlKey": "Ctrl", + "shiftKey": "Shift", + "altKey": "Alt", + "windowsKey": "Windows", + "ctrlKey.long": "Controle", + "shiftKey.long": "Shift", + "altKey.long": "Alt", + "cmdKey.long": "Comando", + "windowsKey.long": "Windows" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/markers/common/problemMatcher.i18n.json b/i18n/ptb/src/vs/platform/markers/common/problemMatcher.i18n.json new file mode 100644 index 00000000000..29df9e58b2b --- /dev/null +++ b/i18n/ptb/src/vs/platform/markers/common/problemMatcher.i18n.json @@ -0,0 +1,61 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ProblemPatternParser.loopProperty.notLast": "A propriedade loop só é suportada na última linha correspondente.", + "ProblemPatternParser.problemPattern.missingRegExp": "Está faltando uma expressão regular a problema padrão.", + "ProblemPatternParser.problemPattern.missingProperty": "O problema padrão é inválido. Ele deve ter ao menos um arquivo, mensagem e linha ou local de grupo de correspondência.", + "ProblemPatternParser.invalidRegexp": "Erro: a cadeia de caracteres {0} não é uma expressão regular válida.\n", + "ProblemPatternSchema.regexp": "A expressão regular para procurar um erro, aviso ou informação na saída.", + "ProblemPatternSchema.file": "O índice do grupo de correspondência do arquivo. Se omitido, será usado 1.", + "ProblemPatternSchema.location": "O índice de grupo de correspondência da localização do problema. Padrões de localização válidos são: (linha), (linha, coluna) e (startLine, startColumn, endLine, endColumn). Se omitido (linha, coluna) é assumido.", + "ProblemPatternSchema.line": "O índice de grupo de correspondência da linha do problema. O padrão é 2", + "ProblemPatternSchema.column": "O índice de grupo de correspondência de caractere da linha do problema. O padrão é 3", + "ProblemPatternSchema.endLine": "O índice de grupo de correspondência de linha final do problema. O padrão é indefinido", + "ProblemPatternSchema.endColumn": "O índice de grupo de correspondência de caráter final de linha do problema. O padrão é indefinido", + "ProblemPatternSchema.severity": "O índice de grupo de correspondência da gravidade do problema. O padrão é indefinido", + "ProblemPatternSchema.code": "O índice de grupo de correspondência do código do problema. O padrão é indefinido", + "ProblemPatternSchema.message": "O índice de grupo de correspondência da mensagem. Se omitido o padrão é 4 se o local for especificado. Caso contrário o padrão é 5.", + "ProblemPatternSchema.loop": "Em um loop de correspondência multi linha indica se este padrão é executado em um loop enquanto houver correspondências. Somente pode ser especificado no último padrão em um padrão de linha múltiplas.", + "NamedProblemPatternSchema.name": "O nome do modelo de problema.", + "NamedMultiLineProblemPatternSchema.name": "O nome do modelo de problema multi-linhas.", + "NamedMultiLineProblemPatternSchema.patterns": "Os padrões atuais.", + "ProblemPatternExtPoint": "Contribui aos modelos de problema", + "ProblemPatternRegistry.error": "Modelo de problema inválido. O modelo será ignorado.", + "ProblemMatcherParser.noProblemMatcher": "Erro: a descrição não pode ser convertida em uma correspondência de problema:\n{0}\n\n", + "ProblemMatcherParser.noProblemPattern": "Erro: a descrição nao define um padrão de problema válido: {0}\n", + "ProblemMatcherParser.noOwner": "Erro: a descriçao não define um proprietário:\n{0}\n", + "ProblemMatcherParser.noFileLocation": "Erro: a descrição não define uma localização de arquivo:\n{0}\n", + "ProblemMatcherParser.unknownSeverity": "Info: severidade {0} desconhecida. Valores válidos são erro, aviso e info.\n", + "ProblemMatcherParser.noDefinedPatter": "Erro: o padrão com o identificador {0} não existe.", + "ProblemMatcherParser.noIdentifier": "Erro: a propriedade padrão se refere a um identificador vazio.", + "ProblemMatcherParser.noValidIdentifier": "Erro: a propriedade padrão {0} não é uma variável de padrões válida.", + "ProblemMatcherParser.problemPattern.watchingMatcher": "Um problema de correspondência deve obrigatoriamente definir padrão inicial e um padrão final para monitoramento.", + "ProblemMatcherParser.invalidRegexp": "Erro: a cadeia de caracteres {0} não é uma expressão regular válida.\n", + "WatchingPatternSchema.regexp": "A expressão regular para detectar o início ou o fim de uma tarefa em segundo plano.", + "WatchingPatternSchema.file": "O índice do grupo de correspondência do arquivo. Pode ser omitido.", + "PatternTypeSchema.name": "O nome de um padrão pré-definido ou contribuído.", + "PatternTypeSchema.description": "Um padrão de problema ou o nome de um padrão de problema pré-definido ou contribuído. Pode ser omitido se base for especificada.", + "ProblemMatcherSchema.base": "O nome de uma correspondência de problema base a ser utilizado.", + "ProblemMatcherSchema.owner": "O proprietário de um problema dentro do código. Pode ser omitido se base for especificada. Default para 'externo' se omitido e base não for especificada.", + "ProblemMatcherSchema.severity": "A severidade padrão para captura de problemas. É utilizada se o padrão não definir um grupo correspondente para severidade.", + "ProblemMatcherSchema.applyTo": "Controla se um problema reportado em um documento de texto é aplicado somente para aberto, fechado ou todos os documentos.", + "ProblemMatcherSchema.fileLocation": "Define como os nomes de arquivos reportados em um padrão de problema devem ser interpretados.", + "ProblemMatcherSchema.background": "Padrões para monitorar o início e o término de um pesquisador ativo em uma tarefa em segundo plano.", + "ProblemMatcherSchema.background.activeOnStart": "Se configurado para verdadeiro, o monitor em segundo plano está em modo ativo quando a tarefa inicia. Isto é igual a emissão de uma linha que corresponde ao beginPattern", + "ProblemMatcherSchema.background.beginsPattern": "Se houver correspondência na saída o início de uma tarefa em segundo plano é sinalizada.", + "ProblemMatcherSchema.background.endsPattern": "Se houver correspondência na saída o final de uma tarefa em segundo plano é sinalizada.", + "ProblemMatcherSchema.watching.deprecated": "A propriedade watching foi descontinuada. Use background no lugar dela.", + "ProblemMatcherSchema.watching": "Padrões para monitorar o início e o término de um pesquisador observando.", + "ProblemMatcherSchema.watching.activeOnStart": "Se configurado para verdadeiro, o monitoramento está em modo ativo quando a tarefa inicia. Isto é igual a emissão de uma linha que corresponde ao beginPattern", + "ProblemMatcherSchema.watching.beginsPattern": "Se houver correspondência na saída o início de uma tarefa observada é sinalizada.", + "ProblemMatcherSchema.watching.endsPattern": "Se houver correspondência na saída o final de uma tarefa observada é sinalizada.", + "LegacyProblemMatcherSchema.watchedBegin.deprecated": "Esta propriedade está descontinuada. Ao invés, use a propriedade de observação.", + "LegacyProblemMatcherSchema.watchedBegin": "Uma expressão regular sinalizando que uma tarefa observada é ativada através da observação.", + "LegacyProblemMatcherSchema.watchedEnd.deprecated": "Esta propriedade está descontinuada. Ao invés, use a propriedade de observação.", + "LegacyProblemMatcherSchema.watchedEnd": "Uma expressão regular sinalizando que uma tarefa observada terminou a execução.", + "NamedProblemMatcherSchema.name": "O nome do correspondente do problema.", + "ProblemMatcherExtPoint": "Contribui aos correspondentes de problema" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/message/common/message.i18n.json b/i18n/ptb/src/vs/platform/message/common/message.i18n.json new file mode 100644 index 00000000000..620c63edd07 --- /dev/null +++ b/i18n/ptb/src/vs/platform/message/common/message.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "close": "Fechar", + "later": "Mais tarde", + "cancel": "Cancelar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/request/node/request.i18n.json b/i18n/ptb/src/vs/platform/request/node/request.i18n.json new file mode 100644 index 00000000000..1f7fd75e5aa --- /dev/null +++ b/i18n/ptb/src/vs/platform/request/node/request.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "httpConfigurationTitle": "HTTP", + "proxy": "As configurações de proxy a usar. Se não forem configuradas, serão obtidas das variáveis de ambiente http_proxy e https_proxy", + "strictSSL": "Se o certificado do servidor de proxy deve ser verificado contra a lista de autoridades de certificação fornecida.", + "proxyAuthorization": "O valor para enviar como o cabeçalho de 'autorização Proxy' para cada solicitação de rede." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/telemetry/common/telemetryService.i18n.json b/i18n/ptb/src/vs/platform/telemetry/common/telemetryService.i18n.json new file mode 100644 index 00000000000..a1d67b82fb7 --- /dev/null +++ b/i18n/ptb/src/vs/platform/telemetry/common/telemetryService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "telemetryConfigurationTitle": "Telemetria", + "telemetry.enableTelemetry": "Permitir que os dados de uso e erros sejam enviados à Microsoft." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json b/i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json new file mode 100644 index 00000000000..64d68304f98 --- /dev/null +++ b/i18n/ptb/src/vs/platform/theme/common/colorRegistry.i18n.json @@ -0,0 +1,78 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid.color": "Formato inválido de cor. Use #RGB, #RGBA, #RRGGBB ou #RRGGBBAA", + "schema.colors": "Cores usadas no workbench.", + "foreground": "Cor de primeiro plano geral. Essa cor é só usada se não for substituída por um componente.", + "errorForeground": "Cor de primeiro plano geral para mensagens de erro. Essa cor é só usada se não for substituída por um componente.", + "descriptionForeground": "Cor de primeiro plano para a descrição do texto provendo informação adicional, por exemplo para uma etiqueta.", + "focusBorder": "Cor geral da borda para elementos focalizados. Essa cor é usada somente se não for substituída por um componente.", + "contrastBorder": "Uma borda extra em torno de elementos para separá-los dos outros de maior contraste.", + "activeContrastBorder": "Uma borda extra em torno de elementos ativos para separá-los dos outros de maior contraste.", + "selectionBackground": "A cor de fundo das seleções de texto na bancada de trabalho (por exemplo, para campos de entrada ou áreas de texto). Note que isto não se aplica a seleções dentro do editor e do terminal.", + "textSeparatorForeground": "Cor para separadores de texto.", + "textLinkForeground": "Cor de primeiro plano para links no texto.", + "textLinkActiveForeground": "Cor de primeiro plano para links ativos no texto.", + "textPreformatForeground": "Cor de primeiro plano para segmentos de texto pré-formatados.", + "textBlockQuoteBackground": "Cor de fundo para blocos de citações no texto.", + "textBlockQuoteBorder": "Cor da borda para blocos de citações no texto.", + "textCodeBlockBackground": "Cor de fundo para blocos de código no texto.", + "widgetShadow": "Cor de sombra ferramentas como localizar/substituir dentro do editor.", + "inputBoxBackground": "Cor de fundo da caixa de entrada.", + "inputBoxForeground": "Cor de primeiro plano da caixa de entrada.", + "inputBoxBorder": "Borda da caixa de entrada.", + "inputBoxActiveOptionBorder": "Cor da borda das opções ativas em campos de entrada.", + "inputPlaceholderForeground": "Cor de primeiro plano da caixa de entrada para o texto de espaço reservado.", + "inputValidationInfoBackground": "Cor de fundo de validação de entrada para a severidade de informações.", + "inputValidationInfoBorder": "Cor da borda de validação de entrada para a severidade de informações.", + "inputValidationWarningBackground": "Cor de fundo de validação de entrada para avisos.", + "inputValidationWarningBorder": "Cor da borda de validação para a severidade de avisos.", + "inputValidationErrorBackground": "Cor de fundo de validação de entrada para a severidade do erro.", + "inputValidationErrorBorder": "Cor da borda de validação de entrada para a severidade do erro.", + "dropdownBackground": "Cor de fundo do menu suspenso.", + "dropdownForeground": "Cor de primeiro plano do menu suspenso.", + "dropdownBorder": "Borda do menu suspenso.", + "listFocusBackground": "Cor de fundo para o item focalizado de Lista/árvore quando a lista/árvore está ativa. Uma árvore/lista de ativa tem o foco do teclado, uma inativa não.", + "listFocusForeground": "Cor de fundo da Lista/árvore para o item focalizado quando a lista/árvore está ativa. Uma árvore/lista ativa tem o foco do teclado, uma inativa não.", + "listActiveSelectionBackground": "Cor de fundo para o item selecionado de Lista/árvore quando a lista/árvore está ativa. Uma lista/árvore ativa tem o foco do teclado, uma inativa não.", + "listActiveSelectionForeground": "Cor de primeiro plano para o item selecionado de Lista/árvore quando a lista/árvore está ativa. Uma lista/árvore ativa tem o foco do teclado, uma inativa não.", + "listInactiveSelectionBackground": "Cor de fundo para o item selecionado de Lista/árvore quando a lista/árvore está inativa. Uma lista/árvore ativa tem o foco do teclado, uma inativa não.", + "listInactiveSelectionForeground": "Cor de primeiro plano para Lista/árvore para o item selecionado quando a lista/árvore está inativa. Uma árvore/lista ativa tem o foco do teclado, um inativo não.", + "listHoverBackground": "Cor de fundo de Lista/árvore quando pairando sobre itens usando o mouse.", + "listHoverForeground": "Primeiro plano da Lista/Árvoce quando passar sobre itens usando o mouse.", + "listDropBackground": "Cor de fundo ao arrastar e soltar de Lista/árvore quando movendo itens usando o mouse.", + "highlight": "Cor de primeiro plano de Lista/árvore de destaques de correspondências ao pesquisar na árvore/lista.", + "pickerGroupForeground": "Seletor rápido de cor para rótulos de agrupamento.", + "pickerGroupBorder": "Seletor rápido de cor para bordas de agrupamentos.", + "buttonForeground": "Cor de primeiro plano do botão.", + "buttonBackground": "Cor de fundo do botão.", + "buttonHoverBackground": "Cor de fundo de botão quando flutuar sobre ele.", + "badgeBackground": "Cor de fundo do distintivo. Distintivos são rótulos de pequenas informações, por exemplo, para a contagem de resultados de pesquisa.", + "badgeForeground": "Cor de primeiro plano do distintivo. Distintivos são rótulos de pequenas informações, por exemplo, para a contagem de resultados de pesquisa.", + "scrollbarShadow": "Sombra da barra de rolagem para indicar que a visualização está sendo rolada.", + "scrollbarSliderBackground": "Cor de fundo do controle deslizante.", + "scrollbarSliderHoverBackground": "Cor de fundo de controle deslizante quando estiver flutuando sobre ele.", + "scrollbarSliderActiveBackground": "Cor de fundo de controle deslizante quando ativo.", + "progressBarBackground": "Cor de fundo da barra de progresso que pode ser mostrada em operações de execução demorada.", + "editorBackground": "Cor de plano de fundo do editor.", + "editorForeground": "Cor de primeiro plano padrão do editor.", + "editorWidgetBackground": "Cor de plano de fundo das ferramentas de edição, como pesquisar/substituir.", + "editorWidgetBorder": "Cor da borda da ferramenta editor.", + "editorSelection": "Cor de seleção do editor.", + "editorInactiveSelection": "Cor de seleção em um editor inativo.", + "editorSelectionHighlight": "Cor de regiões com o mesmo conteúdo da seleção.", + "editorFindMatch": "Cor da correspondência de pesquisa atual.", + "findMatchHighlight": "Cor dos outros resultados de pesquisa.", + "findRangeHighlight": "Cor da faixa que limita a pesquisa.", + "hoverHighlight": "Realçar abaixo da palavra onde é mostrado item flutuante", + "hoverBackground": "Cor de fundo para o item flutuante do editor", + "hoverBorder": "Cor da borda para o item flutuante do editor.", + "activeLinkForeground": "Cor dos links ativos.", + "diffEditorInserted": "Cor de fundo para texto que foi inserido.", + "diffEditorRemoved": "Cor de fundo para texto que foi removido.", + "diffEditorInsertedOutline": "Cor de contorno para o texto que foi inserido.", + "diffEditorRemovedOutline": "Cor de contorno para o texto que foi removido." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json b/i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json new file mode 100644 index 00000000000..d45294dd317 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadExtensionService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "overwritingExtension": "Sobrescrevendo extensão {0} por {1}.", + "extensionUnderDevelopment": "Carregando extensão de desenvolvimento em {0}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json b/i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json new file mode 100644 index 00000000000..0feb87677bb --- /dev/null +++ b/i18n/ptb/src/vs/workbench/api/electron-browser/mainThreadMessageService.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "close": "Fechar", + "cancel": "Cancelar", + "ok": "OK" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/api/node/extHostDiagnostics.i18n.json b/i18n/ptb/src/vs/workbench/api/node/extHostDiagnostics.i18n.json new file mode 100644 index 00000000000..867922ab8d2 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/api/node/extHostDiagnostics.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "limitHit": "Não apresentando {0} erros e avisos a mais." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/api/node/extHostTreeViews.i18n.json b/i18n/ptb/src/vs/workbench/api/node/extHostTreeViews.i18n.json new file mode 100644 index 00000000000..d5ca67a9353 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/api/node/extHostTreeViews.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "treeView.notRegistered": "Nenhuma visualização de árvore com id '{0}' registrado.", + "treeItem.notFound": "Nenhum item de árvore com id '{0}' encontrado.", + "treeView.duplicateElement": "Elemento {0} já está registrado" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/actions/configureLocale.i18n.json b/i18n/ptb/src/vs/workbench/browser/actions/configureLocale.i18n.json new file mode 100644 index 00000000000..80686b2c898 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/actions/configureLocale.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "configureLocale": "Configurar Idioma", + "displayLanguage": "Define o idioma de exibição do VSCode.", + "doc": "Veja {0} para obter uma lista dos idiomas suportados.", + "restart": "Modificar o valor requer reinicialização do VSCode.", + "fail.createSettings": "Não foi possível criar '{0}' ({1}).", + "JsonSchema.locale": "O idioma da interface do usuário a ser usada." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/actions/fileActions.i18n.json b/i18n/ptb/src/vs/workbench/browser/actions/fileActions.i18n.json new file mode 100644 index 00000000000..9da2e4e11c7 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/actions/fileActions.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openFolder": "Abrir Pasta...", + "openFileFolder": "Abrir..." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/actions/toggleActivityBarVisibility.i18n.json b/i18n/ptb/src/vs/workbench/browser/actions/toggleActivityBarVisibility.i18n.json new file mode 100644 index 00000000000..02e74f2918f --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/actions/toggleActivityBarVisibility.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleActivityBar": "Alternar Visibilidade da Barra de Atividades", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/actions/toggleEditorLayout.i18n.json b/i18n/ptb/src/vs/workbench/browser/actions/toggleEditorLayout.i18n.json new file mode 100644 index 00000000000..4cdb847aaca --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/actions/toggleEditorLayout.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleEditorGroupLayout": "Alternar Layout Vertical/Horizontal do Grupo de Editor", + "horizontalLayout": "Layout do Grupo de Editor Horizontal", + "verticalLayout": "Layout do Grupo de Editor Vertical", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/actions/toggleSidebarPosition.i18n.json b/i18n/ptb/src/vs/workbench/browser/actions/toggleSidebarPosition.i18n.json new file mode 100644 index 00000000000..ee4fc530361 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/actions/toggleSidebarPosition.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleLocation": "Alternar Localização da Barra Lateral", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/actions/toggleSidebarVisibility.i18n.json b/i18n/ptb/src/vs/workbench/browser/actions/toggleSidebarVisibility.i18n.json new file mode 100644 index 00000000000..5143e35479c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/actions/toggleSidebarVisibility.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleSidebar": "Alternar Localização da Barra Lateral", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/actions/toggleStatusbarVisibility.i18n.json b/i18n/ptb/src/vs/workbench/browser/actions/toggleStatusbarVisibility.i18n.json new file mode 100644 index 00000000000..5376fb36c3a --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/actions/toggleStatusbarVisibility.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleStatusbar": "Alternar Visibilidade da Barra de Status", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/actions/toggleZenMode.i18n.json b/i18n/ptb/src/vs/workbench/browser/actions/toggleZenMode.i18n.json new file mode 100644 index 00000000000..b0a635982f2 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/actions/toggleZenMode.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleZenMode": "Alternar Modo Zen", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json new file mode 100644 index 00000000000..8dab311a65f --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/activitybar/activitybarActions.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "removeFromActivityBar": "Remover da Barra de Atividades", + "keepInActivityBar": "Manter na Barra de Atividades", + "titleKeybinding": "{0} ({1})", + "additionalViews": "Visualizações Adicionais", + "numberBadge": "{0} ({1})", + "manageExtension": "Gerenciar Extensão", + "toggle": "Alternar Visualização Fixa" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/activitybar/activitybarPart.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/activitybar/activitybarPart.i18n.json new file mode 100644 index 00000000000..5f8a7bb47de --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/activitybar/activitybarPart.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "hideActivitBar": "Ocultar a Barra de Atividades", + "activityBarAriaLabel": "Chave do Modo de exibição Ativo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/compositePart.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/compositePart.i18n.json new file mode 100644 index 00000000000..e12e6d4b90e --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/compositePart.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ariaCompositeToolbarLabel": "{0} ações ", + "titleTooltip": "{0} ({1})" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/binaryDiffEditor.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/binaryDiffEditor.i18n.json new file mode 100644 index 00000000000..a38af02d663 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/binaryDiffEditor.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "metadataDiff": "{0} ↔ {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/binaryEditor.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/binaryEditor.i18n.json new file mode 100644 index 00000000000..53321246ac7 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/binaryEditor.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "binaryEditor": "Visualizador binário" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editor.contribution.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editor.contribution.i18n.json new file mode 100644 index 00000000000..dbfae18a9bf --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editor.contribution.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "textEditor": "Editor de texto", + "textDiffEditor": "Editor de Diferentes Textos", + "binaryDiffEditor": "Editor de Diferença Binária", + "sideBySideEditor": "Editor Lado a lado", + "groupOnePicker": "Mostrar editores no primeiro grupo", + "groupTwoPicker": "Mostrar editores no segundo grupo", + "groupThreePicker": "Mostrar editores no terceiro grupo", + "allEditorsPicker": "Mostrar todos editores abertos", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorActions.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorActions.i18n.json new file mode 100644 index 00000000000..ae6f9ae84b7 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorActions.i18n.json @@ -0,0 +1,55 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "splitEditor": "Dividir editor", + "joinTwoGroups": "Juntar editores de dois grupos", + "navigateEditorGroups": "Navegar entre grupos de editores", + "focusActiveEditorGroup": "Focalizar grupo de editores ativo", + "focusFirstEditorGroup": "Focalizar o primeiro grupo de editores", + "focusSecondEditorGroup": "Focalizar o segundo grupo de editores", + "focusThirdEditorGroup": "Focalizar o terceiro grupo de editores", + "focusPreviousGroup": "Focalizar grupo anterior", + "focusNextGroup": "Focalizar próximo grupo", + "openToSide": "Aberto para o lado", + "closeEditor": "Fechar editor", + "revertAndCloseActiveEditor": "Reverter e fechar editor", + "closeEditorsToTheLeft": "Fechar editores à esquerda ", + "closeEditorsToTheRight": "Fechar editores à direita", + "closeAllEditors": "Fechar todos editores", + "closeEditorsInOtherGroups": "Fechar editores nos outros grupos", + "closeOtherEditorsInGroup": "Fechar outros editores", + "closeEditorsInGroup": "Fechar todos editores no grupo", + "moveActiveGroupLeft": "Mover grupo de editores para esquerda", + "moveActiveGroupRight": "Mover grupo de editores para direita", + "minimizeOtherEditorGroups": "Minimizar outros grupos de editores", + "evenEditorGroups": "Igualar larguras de grupos de editores", + "maximizeEditor": "Maximizar grupo de editor e ocultar barra lateral", + "keepEditor": "Manter editor", + "openNextEditor": "Abrir próximo editor", + "openPreviousEditor": "Abrir editor anterior", + "nextEditorInGroup": "Abrir próximo editor no grupo", + "openPreviousEditorInGroup": "Abrir editor anterior no grupo", + "navigateNext": "Avançar", + "navigatePrevious": "Voltar", + "reopenClosedEditor": "Reabrir Editor Fechado", + "clearRecentFiles": "Limpar arquivos recentes", + "showEditorsInFirstGroup": "Mostrar editores no primeiro grupo", + "showEditorsInSecondGroup": "Mostrar editores no segundo grupo", + "showEditorsInThirdGroup": "Mostrar editores no terceiro grupo", + "showEditorsInGroup": "Mostrar editores no grupo", + "showAllEditors": "Mostrar todos editores", + "openPreviousRecentlyUsedEditorInGroup": "Abrir o Editor Anterior Recentemente Usado no Grupo", + "openNextRecentlyUsedEditorInGroup": "Abrir o Próximo Editor Recentemente Usado no Grupo", + "navigateEditorHistoryByInput": "Abrir o Editor Anterior do Histórico", + "openNextRecentlyUsedEditor": "Abrir o Próximo Editor Recentemente Utilizado", + "openPreviousRecentlyUsedEditor": "Abrir o Editor Anterior Recentemente Utilizado", + "clearEditorHistory": "Limpar Histórico do Editor", + "focusLastEditorInStack": "Abrir Último Editor do Grupo", + "moveEditorLeft": "Mover Editor para Esquerda", + "moveEditorRight": "Mover Editor para Direita", + "moveEditorToPreviousGroup": "Mover Editor para o Grupo Anterior", + "moveEditorToNextGroup": "Mover o Editor para o Próximo Grupo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json new file mode 100644 index 00000000000..f42c45c02f5 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorCommands.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorCommand.activeEditorMove.description": "Mover o editor ativo por guias ou grupos", + "editorCommand.activeEditorMove.arg.name": "Argumento de movimento do editor ativo", + "editorCommand.activeEditorMove.arg.description": "Propriedades do argumento: \n\t\t\t\t\t\t- 'para': sequência de valor fornecendo para onde mover.\n\t\t\t\t\t\t- 'por': sequência de valor, fornecendo a unidade para o movimento. Por guia ou por grupo.\n\t\t\t\t\t\t- 'valor': valor numérico, fornecendo quantas posições ou uma posição absoluta para mover.\n\t\t\t\t\t", + "commandDeprecated": "Comando **{0}** foi removido. Você pode usar **{1}** em vez disso", + "openKeybindings": "Configurar os atalhos de teclado" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorPart.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorPart.i18n.json new file mode 100644 index 00000000000..c6a90d88542 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorPart.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "groupOneVertical": "Esquerda", + "groupTwoVertical": "Centro", + "groupThreeVertical": "Direita", + "groupOneHorizontal": "Topo", + "groupTwoHorizontal": "Centro", + "groupThreeHorizontal": "Baixo", + "editorOpenError": "Não foi possível abrir '{0}': {1}." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorPicker.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorPicker.i18n.json new file mode 100644 index 00000000000..e17bc940565 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorPicker.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "entryAriaLabel": "{0}, seletor de grupo editor", + "groupLabel": "Grupo: {0}", + "noResultsFoundInGroup": "Não foi encontrado nennhum editor aberto no grupo", + "noOpenedEditors": "Lista de editores abertos está atualmente vazia no grupo", + "noResultsFound": "Não foi encontrado editor correspondente aberto", + "noOpenedEditorsAllGroups": "A lista de editores abertos está atualmente vazia" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json new file mode 100644 index 00000000000..c2057c183a1 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -0,0 +1,49 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "singleSelectionRange": "Ln {0}, {1} Col ({2} selecionado)", + "singleSelection": "Ln {0}, {1} Col", + "multiSelectionRange": "{0} seleções ({1} caracteres selecionados)", + "multiSelection": "{0} seleções", + "endOfLineLineFeed": "LF", + "endOfLineCarriageReturnLineFeed": "CRLF", + "tabFocusModeEnabled": "Tabulação move o foco", + "disableTabMode": "Desativar o modo de acessibilidade", + "gotoLine": "Ir para linha", + "indentation": "Indentação", + "selectEncoding": "Selecionar a codificação", + "selectEOL": "Selecionar a sequência de fim de linha", + "selectLanguageMode": "Selecionar modo de idioma", + "fileInfo": "Informações do arquivo", + "spacesSize": "Espaços: {0}", + "tabSize": "Tamanho de Tabulação: {0}", + "showLanguageExtensions": "Pesquisar extensões na loja para '{0}'...", + "changeMode": "Alterar o modo de linguagem", + "noEditor": "Nenhum editor de texto ativo neste momento", + "languageDescription": "({0}) - linguagem configurada", + "languageDescriptionConfigured": "({0})", + "languagesPicks": "linguagens (identificador)", + "configureModeSettings": "Configurar '{0}' configurações baseadas em linguagem...", + "configureAssociationsExt": "Configurar a associação de arquivo para '{0}'...", + "autoDetect": "Detecção automática", + "pickLanguage": "Selecionar o modo do idioma", + "currentAssociation": "Associação atual", + "pickLanguageToConfigure": "Selecionar o modo de linguagem para associar a '{0}'", + "changeIndentation": "Alterar a indentação", + "noWritableCodeEditor": "O editor de código ativo é somente leitura.", + "indentView": "alterar visualização", + "indentConvert": "converter arquivo", + "pickAction": "Selecionar ação", + "changeEndOfLine": "Alterar sequência de final de linha", + "pickEndOfLine": "Selecionar sequência de final de linha", + "changeEncoding": "Alterar a codificação do arquivo", + "noFileEditor": "Nenhum arquivo ativo neste momento", + "saveWithEncoding": "Salvar com codificação", + "reopenWithEncoding": "Reabrir com codificação", + "guessedEncoding": "Adivinhado a partir do conteúdo", + "pickEncodingForReopen": "Selecione a codificaçãodo arquivo para reabrir o arquivo.", + "pickEncodingForSave": "Selecione a codificação do arquivo para Salvar Com" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/tabsTitleControl.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/tabsTitleControl.i18n.json new file mode 100644 index 00000000000..9001e58fa99 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/tabsTitleControl.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "araLabelTabActions": "Ações de tablulação" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/textDiffEditor.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/textDiffEditor.i18n.json new file mode 100644 index 00000000000..8af2aff62d5 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/textDiffEditor.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "textDiffEditor": "Editor de Diferentes Textos", + "readonlyEditorWithInputAriaLabel": "{0}. Editor de comparação de texto somente leitura.", + "readonlyEditorAriaLabel": "Editor de comparação de texto somente leitura.", + "editableEditorWithInputAriaLabel": "{0}. Editor de comparação de arquivos texto.", + "editableEditorAriaLabel": "Editor de comparação de arquivos texto.", + "navigate.next.label": "Próxima Alteração", + "navigate.prev.label": "Alteração Anterior", + "inlineDiffLabel": "Alternar para exibição embutida", + "sideBySideDiffLabel": "Alternar para exibição lado a lado" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/textEditor.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/textEditor.i18n.json new file mode 100644 index 00000000000..eb58230b854 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/textEditor.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorLabelWithGroup": "{0}, Grupo {1}." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/textResourceEditor.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/textResourceEditor.i18n.json new file mode 100644 index 00000000000..77f89efba5f --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/textResourceEditor.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "textEditor": "Editor de texto", + "readonlyEditorWithInputAriaLabel": "{0}. Editor de texto somente leitura.", + "readonlyEditorAriaLabel": "Editor de texto somente leitura.", + "untitledFileEditorWithInputAriaLabel": "{0}. Editor de texto de arquivo sem nome.", + "untitledFileEditorAriaLabel": "Editor de texto de arquivo sem nome." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/titleControl.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/titleControl.i18n.json new file mode 100644 index 00000000000..bf8307cd384 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/titleControl.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "close": "Fechar", + "closeOthers": "Fechar Outros", + "closeRight": "Fechar à direita", + "closeAll": "Fechar todos", + "keepOpen": "Manter aberto", + "showOpenedEditors": "Mostrar editores abertos", + "araLabelEditorActions": "Ações de editor" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/panel/panelActions.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/panel/panelActions.i18n.json new file mode 100644 index 00000000000..1f98f38c47e --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/panel/panelActions.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "panelActionTooltip": "{0} ({1})", + "closePanel": "Fechar Painel", + "togglePanel": "Alternar Painel", + "focusPanel": "Foco no Painel", + "toggleMaximizedPanel": "Alternar Painel Maximizado", + "maximizePanel": "Maximizar Tamanho do Painel", + "minimizePanel": "Restaurar tamanho do Painel", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/panel/panelPart.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/panel/panelPart.i18n.json new file mode 100644 index 00000000000..48a7b1b2f76 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/panel/panelPart.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "panelSwitcherBarAriaLabel": "Chave do Painel Ativo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json new file mode 100644 index 00000000000..c98dd22d95d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickOpenController.i18n.json @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "inputModeEntryDescription": "{0} (Pressione 'Enter' para confirmar ou 'Esc' para cancelar)", + "inputModeEntry": "Pressione 'Enter' para confirmar o texto digitado ou 'Esc' para cancelar", + "emptyPicks": "Não há entradas a serem escolhidas", + "quickOpenInput": "Digite '?' para obter ajuda sobre as ações que você pode realizar a partir daqui", + "historyMatches": "aberto recentemente", + "noResultsFound1": "Nenhum resultado encontrado", + "canNotRunPlaceholder": "Esse manipulador de abertura rápida não pode ser usado no contexto atual", + "entryAriaLabel": "{0}, recentemente aberto", + "removeFromEditorHistory": "Remover do Histórico", + "pickHistory": "Selecionar uma entrada do editor para remover do histórico" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickopen.contribution.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickopen.contribution.i18n.json new file mode 100644 index 00000000000..57f5524e1be --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/quickopen/quickopen.contribution.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "quickOpen": "Ir para o Arquivo...", + "quickNavigateNext": "Navegar ao próximo em modo de abertura rápida", + "quickNavigatePrevious": "Navegar ao anterior em modo de abertura rápida", + "quickSelectNext": "Selecionar próximo em modo de abertura rápida", + "quickSelectPrevious": "Selecionar anterior em modo de abertura rápida" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/sidebar/sidebarPart.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/sidebar/sidebarPart.i18n.json new file mode 100644 index 00000000000..89806e051ea --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/sidebar/sidebarPart.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "focusSideBar": "Foco na Barra Lateral", + "viewCategory": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/statusbar/statusbarPart.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/statusbar/statusbarPart.i18n.json new file mode 100644 index 00000000000..4a2adabf5a6 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/statusbar/statusbarPart.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "canNotRun": "O comando '{0}' não está habilitado e não pode ser executado.", + "manageExtension": "Gerenciar Extensão" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/parts/titlebar/titlebarPart.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/titlebar/titlebarPart.i18n.json new file mode 100644 index 00000000000..1c3db4d572b --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/parts/titlebar/titlebarPart.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "patchedWindowTitle": "[Sem Suporte]", + "devExtensionWindowTitlePrefix": "[Host de Desenvolvimento de Extensão]" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/quickopen.i18n.json b/i18n/ptb/src/vs/workbench/browser/quickopen.i18n.json new file mode 100644 index 00000000000..26c5e14f367 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/quickopen.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultsMatching": "Nenhum resultado encontrado", + "noResultsFound2": "Nenhum resultado encontrado", + "entryAriaLabel": "{0}, comando", + "noCommands": "Não há comandos correspondentes" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/browser/viewlet.i18n.json b/i18n/ptb/src/vs/workbench/browser/viewlet.i18n.json new file mode 100644 index 00000000000..34655b736ba --- /dev/null +++ b/i18n/ptb/src/vs/workbench/browser/viewlet.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "collapse": "Recolher tudo", + "viewToolbarAriaLabel": "{0} ações " +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/common/theme.i18n.json b/i18n/ptb/src/vs/workbench/common/theme.i18n.json new file mode 100644 index 00000000000..bfe4c0ef017 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/common/theme.i18n.json @@ -0,0 +1,44 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "tabActiveBackground": "Cor de fundo da guia ativa. As guias são os recipientes para editores na área do editor. Várias guias podem ser abertas em um grupo de editores. Podem haver vários grupos de editor.", + "tabInactiveBackground": "Cor de fundo da guia inativa. As guias são os recipientes para editores na área do editor. Várias guias podem ser abertas em um grupo de editores. Podem haver vários grupos de editor.", + "tabBorder": "Borda para separar uma guia das outras. As guias são os recipientes para editores na área do editor. Várias guias podem ser abertas em um grupo de editores. Podem haver vários grupos de editor.", + "tabActiveEditorGroupActiveForeground": "Cor de primeiro plano da guia ativa em um grupo ativo. As guias são os recipientes para editores na área do editor. Várias guias podem ser abertas em um grupo de editores. Podem haver vários grupos de editor.", + "tabInactiveEditorGroupActiveForeground": "Cor de primeiro plano da guia inativa em um grupo ativo. As guias são os recipientes para editores na área do editor. Várias guias podem ser abertas em um grupo de editores. Podem haver vários grupos de editor.", + "editorGroupBackground": "Cor de fundo de um grupo de editor. Grupos de editor são os recipientes dos editores. A cor de fundo é mostrada ao arrastar o editor de grupos ao redor.", + "tabsContainerBackground": "Cor de fundo do cabeçalho do título do grupo de editor quando as guias são habilitadas. Grupos de editor são os recipientes dos editores.", + "editorGroupHeaderBackground": "Cor de fundo do título do cabeçalho do grupo de editor quando as guias são desabilitadas. Grupos de editor são os recipientes dos editores.", + "editorGroupBorder": "Cor para separar múltiplos grupos de editor de outro. Grupos de editor são os recipientes dos editores.", + "editorDragAndDropBackground": "Cor de fundo ao arrastar editores. A cor deve ter transparência para que o conteúdo do editor ainda possa ser visto.", + "panelBackground": "Cor de fundo do painel. Os painéis são mostrados abaixo da área do editor e contém visualizações como saída e terminal integrado.", + "panelBorder": "Cor da borda do painel no topo separando do editor. Os painéis são mostrados abaixo da área do editor e contém visualizações como saída e terminal integrado.", + "panelActiveTitleForeground": "Cor do título para o painel ativo. Os painéis são mostrados abaixo da área do editor e contém visualizações como saída e terminal integrado.", + "panelInactiveTitleForeground": "Cor do título para o painel inativo. Os painéis são mostrados abaixo da área do editor e contém visualizações como saída e terminal integrado.", + "panelActiveTitleBorder": "Cor da borda para o título do painel ativo. Os painéis são mostrados abaixo da área do editor e contém visualizações como saída e terminal integrado.", + "statusBarForeground": "Cor do primeiro plano da barra de status. A barra de status é mostrada na parte inferior da janela.", + "statusBarBackground": "Cor de fundo da barra de status padrão. A barra de status é mostrada na parte inferior da janela.", + "statusBarNoFolderBackground": "Cor de fundo da barra de status quando nenhuma pasta está aberta. A barra de status é mostrada na parte inferior da janela.", + "statusBarItemActiveBackground": "Cor de fundo do item da barra de status quando você clicado. A barra de status é mostrada na parte inferior da janela.", + "statusBarItemHoverBackground": "Cor de fundo do item da barra de status quando estiver passando sobre ele. A barra de status é mostrada na parte inferior da janela.", + "statusBarProminentItemBackground": "Cor de fundo de itens proeminentes da barra de status. Itens proeminentes destacam-se outras entradas da barra de status para indicar a importância. A barra de status é mostrada na parte inferior da janela.", + "statusBarProminentItemHoverBackground": "Cor de fundo dos itens proeminentes de barra de status quando estiver passando sobre eles. Itens proeminentes destacam-se outras entradas de barra de status para indicar a importância. A barra de status é mostrada na parte inferior da janela.", + "activityBarBackground": "Cor de fundo da barra de atividades. Barra de atividade está visível à esquerda ou à direita e permite alternar entre as visualizações da barra lateral.", + "activityBarForeground": "Cor de primeiro plano da barra de atividades (por exemplo, usada para os ícones). A barra de atividades está visível à esquerda ou à direita e permite alternar entre as visualizações da barra lateral.", + "activityBarDragAndDropBackground": "Cor de feedback de arrastar e soltar para os itens da barra de atividades. A cor deve ter transparência para que as entradas de bar de atividade ainda possam brilhar. A barra de atividade está visível à esquerda ou à direita e permite para alternar entre as visualizações da barra lateral.", + "activityBarBadgeBackground": "Cor de fundo da notificação de atividade. A barra de atividade está visível à esquerda ou à direita e permite alternar entre as visualizações da barra lateral.", + "activityBarBadgeForeground": "Cor de primeiro plano da notificação de atividade. A barra de atividade está visível à esquerda ou à direita e permite alternar entre as visualizações da barra lateral.", + "sideBarBackground": "Cor de fundo da barra lateral. A barra lateral é o recipiente para visualizações como explorador e pesquisa.", + "sideBarForeground": "Cor de primeiro plano da barra lateral. A barra lateral é o recipiente para visualizações como o explorador e a busca.", + "sideBarTitleForeground": "Cor de primeiro plano do título da barra lateral. A barra lateral é o recipiente para visualizações como explorador e pesquisa.", + "sideBarSectionHeaderBackground": "Cor de fundo do cabeçalho de seção lateral. A barra lateral é o recipiente para visões como explorador e pesquisa.", + "titleBarActiveForeground": "Cor da barra de título do primeiro plano quando a janela está ativa. Observe que essa cor atualmente somente é suportada no macOS.", + "titleBarInactiveForeground": "Cor de primeiro plano da barra de título quando a janela está inativa. Observe que essa cor atualmente somente é suportada no macOS.", + "titleBarActiveBackground": "Cor de fundo da barra de título quando a janela está ativa. Observe que essa cor atualmente somente é suportada no macOS.", + "titleBarInactiveBackground": "Cor de fundo de barra de título quando a janela está inativa. Observe que essa cor é atualmente somente suportada no macOS.", + "notificationsForeground": "Cor do primeiro plano de notificações. Notificações deslizam na parte superior da janela.", + "notificationsBackground": "Cor de fundo de notificações. Notificações deslizam na parte superior da janela." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json new file mode 100644 index 00000000000..d829a3c8cad --- /dev/null +++ b/i18n/ptb/src/vs/workbench/electron-browser/actions.i18n.json @@ -0,0 +1,41 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "closeActiveEditor": "Fechar Editor", + "closeWindow": "Fechar Janela", + "switchWindow": "Alternar Janela", + "switchWindowPlaceHolder": "Selecionar uma janela", + "current": "Janela Atual", + "closeFolder": "Fechar Pasta", + "noFolderOpened": "Não há nenhuma pasta aberta nesta instância para ser fechada.", + "newWindow": "Nova Janela", + "toggleFullScreen": "Alternar Tela Inteira", + "toggleMenuBar": "Alternar Barra de Menus", + "toggleDevTools": "Alternar Ferramentas do Desenvolvedor", + "zoomIn": "Ampliar", + "zoomOut": "Reduzir", + "zoomReset": "Reinicializar Zoom", + "appPerf": "Desempenho de inicialização", + "reloadWindow": "Recarregar Janela", + "openRecent": "Abrir Recente", + "folders": "pastas", + "files": "arquivos", + "openRecentPlaceHolderMac": "Selecionar um caminho (Pressione a tecla Cmd para abrir em uma nova janela)", + "openRecentPlaceHolder": "Selecionar um caminho para abrir (Pressione a tecla Cmd para abrir em uma nova janela)", + "closeMessages": "Fechar mensagens de notificação", + "reportIssues": "Reportar Problemas", + "reportPerformanceIssue": "Reportar Problema de Desempenho", + "keybindingsReference": "Referência de Atalhos de Teclado", + "openDocumentationUrl": "Documentação", + "openIntroductoryVideosUrl": "Vídeos Introdutórios", + "toggleSharedProcess": "Alternar processo compartilhado", + "navigateLeft": "Mover para a Visualizção à Esquerda", + "navigateRight": "Mover para a Visualização à Direita", + "navigateUp": "Mover para a Visualização Acima", + "navigateDown": "Mover para a Visualização Abaixo", + "increaseViewSize": "Aumentar o Tamanho da Visualização Atual", + "decreaseViewSize": "Diminuir o Tamanho da Visualização Atual" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/commands.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/commands.i18n.json new file mode 100644 index 00000000000..3a1051dcfda --- /dev/null +++ b/i18n/ptb/src/vs/workbench/electron-browser/commands.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "diffLeftRightLabel": "{0} ⟷ {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/crashReporter.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/crashReporter.i18n.json new file mode 100644 index 00000000000..10b7a7ff108 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/electron-browser/crashReporter.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "telemetryConfigurationTitle": "Telemetria", + "telemetry.enableCrashReporting": "Ativar o envio de relatórios de incidentes à Microsoft.\nEsta opção requer reinicialização para ser efetivada." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/extensionHost.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/extensionHost.i18n.json new file mode 100644 index 00000000000..e5a7ab81686 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/electron-browser/extensionHost.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "extensionHostProcess.startupFailDebug": "O host de extensão não iniciou em 10 segundos, ele pode ser interrompido na primeira linha e precisa de um depurador para continuar.", + "extensionHostProcess.startupFail": "Host de extensão não começou em 10 segundos, isso pode ser um problema.", + "extensionHostProcess.error": "Erro do host de extensão: {0}", + "extensionHostProcess.crash": "Host de extensão foi encerrado inesperadamente. Por favor recarregar a janela para recuperar." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json new file mode 100644 index 00000000000..3b9050de1af --- /dev/null +++ b/i18n/ptb/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -0,0 +1,62 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "view": "Exibir", + "help": "Ajuda", + "file": "Arquivo", + "developer": "Desenvolvedor", + "showEditorTabs": "Controla se os editores abertos devem ou não serem exibidos em abas.", + "editorTabCloseButton": "Controla a posição dos botões de fechar das abas do editor ou os desabilita quando configurados para 'desligado'.", + "showIcons": "Controla se os editores abertos devem ou não ser exibidos com um ícone. Requer um tema de ícone para ser habilitado. ", + "enablePreview": "Controla se os editores abertos são exibidos como visualização. Editores de visualização são reutilizados até que eles sejam preservados (por exemplo, através de um duplo clique ou edição).", + "enablePreviewFromQuickOpen": "Controla se os editores abertos da Abertura Rápida são exibidos como visualização. Os editores de visualização são reutilizados até serem preservados (por exemplo, através de um duplo clique ou edição).", + "editorOpenPositioning": "Controla onde os editores serão abertos. Escolha 'esquerda' ou 'direita' para abrir os editores à esquerda ou à direita do \neditor ativo. Selecione 'primeiro' ou 'último' para abrir os editores independentemente do atual.", + "revealIfOpen": "Controla se um editor é exibido em qualquer um dos grupos, se aberto. Se desabilitado, um editor será aberto preferencialmente no grupo de editores ativo. Se habilitado, um editor já aberto será exibido no grupo de editores ativo, ao invés de ser aberto novamente. Note que há alguns casos onde esta configuração é ignorada, por exemplo, quando for forçada a abertura de um editor em um grupo específico ou ao lado do grupo atualmente ativo.", + "closeOnFocusLost": "Controla se Abertura Rápida deve fechar automaticamente caso perca o foco.", + "openDefaultSettings": "Controla se a abertura de configurações também abre um editor mostrando todas as configurações padrão.", + "sideBarLocation": "Controla a localização da barra lateral. Ele pode ser exibido à esquerda ou à direita da área de trabalho.", + "statusBarVisibility": "Controla a visibilidade da barra de status na parte inferior da área de trabalho.", + "activityBarVisibility": "Controla a visibilidade da barra de atividades na área de trabalho.", + "closeOnFileDelete": "Controla se os editores que mostram um arquivo devem fechar automaticamente quanto o arquivo é apagado ou renomeado por algum outro processo. Desativar isso manterá o editor aberto como sujo neste evento. Note que apagar do aplicativo sempre fechará o editor e os arquivos sujos nunca fecharão para preservar seus dados.", + "swipeToNavigate": "Navegue entre arquivos abertos usando o deslizamento horizontal de três dedos.", + "workbenchConfigurationTitle": "Área de Trabalho", + "window.openFilesInNewWindow.on": "Arquivos serão abertos em uma nova janela", + "window.openFilesInNewWindow.off": "Arquivos serão abertos em uma nova janela com a pasta de arquivos aberta ou com a última janela ativa.", + "window.openFilesInNewWindow.default": "Os arquivos serão abertos na janela com a pasta de arquivos aberta ou a última janela ativa, a menos que seja aberto através do dock ou do finder (somente macOS)", + "openFilesInNewWindow": "Controla se os arquivos devem ser abertos em uma nova janela\n- padrão: os arquivos serão abertos em uma nova janela com a pasta de arquivos aberta ou na última janela ativa, a menos que seja aberta através do dock ou do finder (apenas macOS)\n- ligado: os arquivos serão abertos em uma nova janela\n- desligado: os arquivos serão abertos em uma janela com a pasta de arquivos aberta ou a última janela ativa\nNota que ainda podem haver casos em que esta configuração será ignorada (por exemplo, quando estiver usando as opções de linha de comando -new-window ou -reuse-window).", + "window.openFoldersInNewWindow.on": "As pastas serão abertas em uma nova janela", + "window.openFoldersInNewWindow.off": "As pastas substituirão a última janela ativa", + "window.openFoldersInNewWindow.default": "As pastas serão abertas em uma nova janela, a menos que uma pasta seja selecionada dentro do aplicativo (por exemplo, através do menu Arquivo)", + "openFoldersInNewWindow": "Controla se as pastas devem ser abertas em uma nova janela ou substituir a última janela ativa\n- padrão: as pastas serão abertas em uma nova janela, a menos que seja selecionada dentro do aplicativo (por exemplo, através do menu Arquivo)\n- ligado: as pastas serão abertas em uma nova janela\n- desligado: as pastas substituirão a última janela ativa\nNote que ainda podem haver casos em que esta configuração será ignorada (por exemplo, quando estiver usando as opções de linha de comando -new-window ou -reuse-window).", + "window.reopenFolders.none": "Nunca reabra uma pasta.", + "window.reopenFolders.one": "Reabrir a última pasta ativa.", + "window.reopenFolders.all": "Reabrir todas as pastas da última sessão.", + "reopenFolders": "Controla como as pastas são reabertas depois de um reinício. Escolha 'nenhum' para nunca reabrir uma pasta, 'uma' para reabrir a última pasta que você trabalhou ou 'todas' para reabrir todas as pastas da sua última sessão.", + "restoreFullscreen": "Controla se uma janela deve ser restaurada em modo de tela cheia se ela foi finalizada em modo de tela cheia.", + "zoomLevel": "Ajusta o nível de zoom da janela. O tamanho original é 0 e cada aumento (por exemplo, 1) ou redução (por exemplo, -1) representa um zoom 20% maior ou menor. Você também pode digitar decimais para ajustar o nível de zoom com uma granularidade mais fina.", + "title": "Controla o título da janela com base no editor ativo. As variáveis são substituídas com base no contexto:\n$ {ActiveEditorShort}: por exemplo, meuArquivo.txt\n$ {ActiveEditorMedium}: por exemplo, minhaPasta / meuArquivo.txt\n$ {ActiveEditorLong}: por exemplo, /Usuários/Desenvolvimento/meuProjeto/minhaPasta/meuArquivo.txt\n$ {RootName}: por exemplo, meuProjeto\n$ {RootPath}: por exemplo, /Usuários/Desenvolvimento/meuProjeto\n$ {AppName}: por exemplo, VS Code\n$ {Dirty}: um indicador sujo se o editor ativo for sujo\n$ {Separator}: um separador condicional (\"-\") que só aparece quando for rodeado por variáveis com valores", + "window.newWindowDimensions.default": "Abrir novas janelas no centro da tela.", + "window.newWindowDimensions.inherit": "Abrir novas janelas com a mesma dimensão da última janela ativa.", + "window.newWindowDimensions.maximized": "Abrir novas janelas maximizadas.", + "window.newWindowDimensions.fullscreen": "Abrir novas janelas em modo de tela cheia.", + "newWindowDimensions": "Controla as dimensões ao abrir uma nova janela quando pelo menos uma janela já está aberta. Por padrão, uma nova janela será aberta no centro da tela com pequena dimensão. Quando definido como 'inherit', a janela vai ter as mesmas dimensões que a última janela que estava ativa. Quando definido como 'maximized', a janela abrirá maximizada e em tela cheia se configurado para 'fullscreen'. Observe que essa configuração não tem um impacto sobre a primeira janela que é aberta. A primeira janela sempre irá restaurar o tamanho e a localização como você deixou antes de fechar.", + "window.menuBarVisibility.default": "O menu está oculto apenas em modo de tela cheia.", + "window.menuBarVisibility.visible": "O menu está sempre visivel mesmo quando em modo de tela cheia.", + "window.menuBarVisibility.toggle": "O menu está oculto, mas pode ser mostrado através da tecla Alt.", + "window.menuBarVisibility.hidden": "O menu está sempre oculto.", + "menuBarVisibility": "Controla a visibilidade da barra de menu. Uma configuração 'alternar' significa que a barra de menus está oculta e pressionar a tecla Alt irá mostrá-la. Por padrão, a barra de menu será visível, a menos que a janela esteja em modo de tela cheia.", + "enableMenuBarMnemonics": "Se habilitado, os menus principais podem ser abertos através de atalhos de tecla Alt. Desativar mnemônicos permite vincular esses atalhos de tecla Alt para comandos do editor.", + "autoDetectHighContrast": "Se habilitado, irá mudar automaticamente para o tema de alto contraste se o Windows estiver utilizando um tema de alto contraste, e para o tema escuro ao mudar de um tema de alto contraste do Windows.", + "titleBarStyle": "Ajusta a aparência da barra de título da janela. As alterações exigem um reinício completo.", + "window.nativeTabs": "Habilita as abas da janela do macOS Sierra. Note que as alterações exigem um reinício completo e que as abas nativas desabilitarão um estilo de barra de título customizado, se configurado.", + "windowConfigurationTitle": "Janela", + "zenModeConfigurationTitle": "Modo Zen", + "zenMode.fullScreen": "Controla se a ativação do modo Zen também coloca o espaço de trabalho em modo de tela cheia.", + "zenMode.hideTabs": "Controla se a ativação do modo Zen também oculta as abas do espaço de trabalho.", + "zenMode.hideStatusBar": "Controla se a ativação do modo Zen também oculta a barra de status no rodapé do espaço de trabalho.", + "zenMode.hideActivityBar": "Controla se a ativação do modo Zen também oculta a barra de atividades à esquerda do espaço de trabalho.", + "zenMode.restore": "Controla se uma janela deve ser restaurada para o modo zen se ela foi finalizada no modo zen." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/main.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/main.i18n.json new file mode 100644 index 00000000000..056d426d27d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/electron-browser/main.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "loaderError": "Falha ao carregar o arquivo necessário. Você não está mais conectado à Internet ou o servidor que você está conectado está offline. Atualize o navegador e tente novamente.", + "loaderErrorNative": "Falha ao carregar um arquivo necessário. Reinicie o aplicativo para tentar novamente. Detalhes: {0}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/shell.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/shell.i18n.json new file mode 100644 index 00000000000..951a140a2ea --- /dev/null +++ b/i18n/ptb/src/vs/workbench/electron-browser/shell.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "runningAsRoot": "Não é recomendado executar Code como 'root'." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/electron-browser/window.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/window.i18n.json new file mode 100644 index 00000000000..50118b77afe --- /dev/null +++ b/i18n/ptb/src/vs/workbench/electron-browser/window.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "undo": "Desfazer", + "redo": "Refazer", + "cut": "Recortar", + "copy": "Copiar", + "paste": "Colar", + "selectAll": "Selecionar Tudo", + "confirmOpen": "Tem certeza de que deseja abrir '{0}' pastas?", + "confirmOpenButton": "&&Abrir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/node/extensionHostMain.i18n.json b/i18n/ptb/src/vs/workbench/node/extensionHostMain.i18n.json new file mode 100644 index 00000000000..f0596b25871 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/node/extensionHostMain.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "extensionTestError": "Caminho {0} não aponta para um executor de testes com extensão válida." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/node/extensionPoints.i18n.json b/i18n/ptb/src/vs/workbench/node/extensionPoints.i18n.json new file mode 100644 index 00000000000..18d7b3f26c8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/node/extensionPoints.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "jsonParseFail": "Falha ao analisar {0}: {1}.", + "fileReadFail": "Não foi possível ler o arquivo {0}: {1}.", + "jsonsParseFail": "Falha ao analisar {0} ou {1}: {2}.", + "missingNLSKey": "Não foi possível encontrar a mensagem para a chave {0}." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/cli/electron-browser/cli.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/cli/electron-browser/cli.contribution.i18n.json new file mode 100644 index 00000000000..69df9b15d87 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/cli/electron-browser/cli.contribution.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "install": "Instalar o comando '{0}' em PATH", + "not available": "Este comando não está disponível", + "successIn": "Comando shell '{0}' instalado com sucesso em PATH.", + "warnEscalation": "O código solicitará com 'osascript' pelos privilégios de Administrador para instalar o comando shell.", + "ok": "OK", + "cantCreateBinFolder": "Não é possível criar '/usr/local/bin'.", + "cancel2": "Cancelar", + "aborted": "Abortado", + "uninstall": "Desinstalar o comando '{0}' de PATH", + "successFrom": "Comando shell '{0}' desinstalado com sucesso de PATH.", + "shellCommand": "Comando shell" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json new file mode 100644 index 00000000000..18ee740ae31 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "workbench.action.inspectKeyMap": "Desenvolvedor: Inspecionar Mapeamentos de Chave" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.i18n.json b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.i18n.json new file mode 100644 index 00000000000..217bdf1c04e --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleRenderControlCharacters": "Alternar caracteres de controle" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.i18n.json b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.i18n.json new file mode 100644 index 00000000000..453104fcc6d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleRenderWhitespace": "Alternar Espaço em Branco Renderizado" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json new file mode 100644 index 00000000000..058048058af --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggle.wordwrap": "Visualizar: Alternar Quebra de Linha", + "wordWrap.notInDiffEditor": "Não pode alternar quebra de linha em um editor diff.", + "unwrapMinified": "Desabilitar empacotamento para este arquivo", + "wrapMinified": "Habilitar empacotamento para este arquivo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/wordWrapMigration.i18n.json b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/wordWrapMigration.i18n.json new file mode 100644 index 00000000000..12f93be687c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/codeEditor/electron-browser/wordWrapMigration.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "wordWrapMigration.ok": "OK", + "wordWrapMigration.dontShowAgain": "Não mostrar novamente", + "wordWrapMigration.openSettings": "Abrir configurações", + "wordWrapMigration.prompt": "A configuração `editor.wrappingColumn` foi descontinuada e substituída pela configuração `editor.wordWrap`" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointWidget.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointWidget.i18n.json new file mode 100644 index 00000000000..3d748795633 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/breakpointWidget.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "breakpointWidgetExpressionPlaceholder": "Parar quando a expressão for avaliada como true. 'Enter' para aceitar, 'esc' para cancelar.", + "breakpointWidgetAriaLabel": "O programa só vai parar aqui se esta condição for verdadeira. Pressione Enter para aceitar ou Escape para cancelar.", + "breakpointWidgetHitCountPlaceholder": "Parar quando contagem de ocorrências condição for alcançada. 'Enter' para aceitar, 'esc' para cancelar.", + "breakpointWidgetHitCountAriaLabel": "O programa só vai parar aqui, se a contagem de ocorrências for alcançada. Pressione Enter para aceitar ou Escape para cancelar.", + "expression": "Expressão", + "hitCount": "Contagem de ocorrências" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActionItems.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActionItems.i18n.json new file mode 100644 index 00000000000..32a88b85efd --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActionItems.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "addConfiguration": "Adicionar Configuração...", + "noConfigurations": "Sem configurações" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json new file mode 100644 index 00000000000..1bc052297a1 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActions.i18n.json @@ -0,0 +1,49 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openLaunchJson": "Abrir {0}", + "launchJsonNeedsConfigurtion": "Configurar ou corrigir 'launch.json'", + "noFolderDebugConfig": "Primeiro abra uma pasta para fazer uma configuração de depuração avançada.", + "startDebug": "Iniciar Depuração", + "startWithoutDebugging": "Iniciar Sem Depuração", + "selectAndStartDebugging": "Selecionar e Iniciar a Depuração", + "restartDebug": "Reiniciar", + "reconnectDebug": "Reconectar", + "stepOverDebug": "Pular Sobre", + "stepIntoDebug": "Pular Dentro", + "stepOutDebug": "Pular Fora", + "stopDebug": "Parar", + "disconnectDebug": "Desconectar", + "continueDebug": "Continuar", + "pauseDebug": "Pausa", + "restartFrame": "Reiniciar o Frame", + "removeBreakpoint": "Remover Ponto de Parada", + "removeAllBreakpoints": "Remover Todos os Pontos de Parada", + "enableBreakpoint": "Habilitar ponto de Parada", + "disableBreakpoint": "Desativar Ponto de Parada", + "enableAllBreakpoints": "Habilitar Todos os Pontos de Parada", + "disableAllBreakpoints": "Desabilitar Todos Pontos de Parada", + "activateBreakpoints": "Ativar Pontos de Parada", + "deactivateBreakpoints": "Desativar Pontos de Parada", + "reapplyAllBreakpoints": "Reaplicar Todos os Pontos de Parada", + "addFunctionBreakpoint": "Adicionar Ponto de Parada de Função", + "renameFunctionBreakpoint": "Renomeie o Ponto de Parada de Função", + "addConditionalBreakpoint": "Adicionar Ponto de Parada Condicional...", + "editConditionalBreakpoint": "Editar o Ponto de Parada...", + "setValue": "Definir Valor", + "addWatchExpression": "Adicionar Expressão", + "editWatchExpression": "Editar expressão", + "addToWatchExpressions": "Adicionar ao monitoramento", + "removeWatchExpression": "Remover Expressão", + "removeAllWatchExpressions": "Remover Todas as Expressões", + "clearRepl": "Limpar console", + "debugConsoleAction": "Console do Depurador", + "unreadOutput": "Nova Saída no Console de Depuração", + "debugFocusConsole": "Foco no Console de Depuração", + "focusProcess": "Foco no Processo", + "stepBackDebug": "Passo para trás", + "reverseContinue": "Reverter" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json new file mode 100644 index 00000000000..421e5b19c79 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugActionsWidget.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "debugToolBarBackground": "Cor de fundo da barra de ferramentas de depuração." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugContentProvider.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugContentProvider.i18n.json new file mode 100644 index 00000000000..d8aa95c869a --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugContentProvider.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unable": "Não é possível resolver o recurso sem uma sessão de depuração" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json new file mode 100644 index 00000000000..ef74c88413d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorActions.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleBreakpointAction": "Depurar: Alternar Ponto de Parada", + "columnBreakpointAction": "Depurar: Ponto de Interrupção de Coluna", + "columnBreakpoint": "Adicionar Ponto de Interrupção de Coluna", + "conditionalBreakpointEditorAction": "Depurar: Adicionar Ponto de Interrupção Condicional...", + "runToCursor": "Executar até o Cursor", + "debugEvaluate": "Depurar: Avaliar", + "debugAddToWatch": "Depurar: Adicionar ao monitoramento", + "showDebugHover": "Mostrar Item Flutuante" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorModelManager.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorModelManager.i18n.json new file mode 100644 index 00000000000..f30b378456b --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugEditorModelManager.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "breakpointDisabledHover": "Ponto de Parada Desativado", + "breakpointUnverifieddHover": "Ponto de Parada Não Verificado", + "breakpointDirtydHover": "Ponto de parada não verificado. O arquivo foi modificado, por favor reinicie a sessão de depuração.", + "breakpointUnsupported": "Pontos de parada condicionais não são suportados por esse tipo de depurador" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/debugQuickOpen.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugQuickOpen.i18n.json new file mode 100644 index 00000000000..01955c44965 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/debugQuickOpen.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "entryAriaLabel": "depurar {0}", + "debugAriaLabel": "Digite um nome de uma configuração de lançamento para ser executado.", + "noConfigurationsMatching": "Não há configurações de depuração correspondentes", + "noConfigurationsFound": "Configurações de depuração não encontradas. Por favor, crie um arquivo 'launch.json'." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/exceptionWidget.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/exceptionWidget.i18n.json new file mode 100644 index 00000000000..a8802c13164 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/exceptionWidget.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "debugExceptionWidgetBorder": "Cor da borda da ferramenta de exceção.", + "debugExceptionWidgetBackground": "Cor de fundo da ferramenta de exceção.", + "exceptionThrownWithId": "Ocorreu exceção: {0}", + "exceptionThrown": "Ocorreu exceção." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json new file mode 100644 index 00000000000..8c7a8761f41 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/browser/linkDetector.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileLinkMac": "Clique para seguir (Cmd + clique abre ao lado)", + "fileLink": "Clique para seguir (Cmd + clique abre ao lado)" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/common/debug.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/common/debug.i18n.json new file mode 100644 index 00000000000..3476b79d9e1 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/common/debug.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "internalConsoleOptions": "Controla o comportamento do console depuração interna." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/common/debugModel.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/common/debugModel.i18n.json new file mode 100644 index 00000000000..fa2f5e8ada5 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/common/debugModel.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "notAvailable": "não disponível", + "startDebugFirst": "Por favor, inicie uma sessão de depuração para avaliar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/common/debugSource.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/common/debugSource.i18n.json new file mode 100644 index 00000000000..0e10c85d818 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/common/debugSource.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unknownSource": "Fonte desconhecida" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json new file mode 100644 index 00000000000..05a7ccfe827 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debug.contribution.i18n.json @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleDebugViewlet": "Visualizar Depurador", + "toggleDebugPanel": "Console do Depurador", + "debug": "Depurar", + "debugPanel": "Console do Depurador", + "view": "Exibir", + "debugCategory": "Depurar", + "debugCommands": "Configuração do Depurador", + "debugConfigurationTitle": "Depurar", + "allowBreakpointsEverywhere": "Permite definir um ponto de interrupção em qualquer arquivo.", + "openExplorerOnEnd": "Automaticamente abre a visualização do explorador no final de uma sessão de depuração", + "inlineValues": "Mostrar valores de variáveis em linha no editor durante a depuração", + "hideActionBar": "Controlar se a barra de ação flutuante do depurador deve ser ocultada", + "launch": "Configuração global do lançamento do depurador. Deve ser usado como uma alternativa para o arquivo 'launch.json' que é compartilhado entre os espaços de trabalho" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json new file mode 100644 index 00000000000..85b353a37fe --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugCommands.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noFolderDebugConfig": "Primeiro abra uma pasta para fazer uma configuração de depuração avançada." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json new file mode 100644 index 00000000000..ada60277e7b --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.i18n.json @@ -0,0 +1,38 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "vscode.extension.contributes.debuggers": "Contribui adaptadores de depuração.", + "vscode.extension.contributes.debuggers.type": "Identificador único para esse adaptador de depuração.", + "vscode.extension.contributes.debuggers.label": "Nome de exibição para esse adaptador de depuração.", + "vscode.extension.contributes.debuggers.program": "Caminho para o programa adaptador de depuração. O caminho pode ser absoluto ou relativo à pasta de extensão.", + "vscode.extension.contributes.debuggers.args": "Argumentos opcionais a serem informados para o adaptador.", + "vscode.extension.contributes.debuggers.runtime": "Runtime opcional no caso do atributo do programa não ser um executável, mas requerer um runtime.", + "vscode.extension.contributes.debuggers.runtimeArgs": "Argumentos opcionais do runtime.", + "vscode.extension.contributes.debuggers.variables": "Mapeamento de variáveis interativas (por exemplo ${action.pickProcess}) em 'launch.json' para um comando.", + "vscode.extension.contributes.debuggers.initialConfigurations": "Configurações para gerar o 'launch.json' inicial.", + "vscode.extension.contributes.debuggers.languages": "Lista de idiomas para os quais a extensão de depuração pode ser considerada o \"depurador padrão\".", + "vscode.extension.contributes.debuggers.adapterExecutableCommand": "Se especificado VS Code chamará este comando para determinar o caminho do executável do adaptador de depuração e os argumentos para passar.", + "vscode.extension.contributes.debuggers.startSessionCommand": "Se especificado VS Code chamará este comando para as ações de \"depurar\" ou \"executar\" direcionadas para esta extensão.", + "vscode.extension.contributes.debuggers.configurationSnippets": "Trechos de código para adicionar novas configurações em 'launch.json'.", + "vscode.extension.contributes.debuggers.configurationAttributes": "Configurações de esquema JSON para validar 'launch.json'.", + "vscode.extension.contributes.debuggers.windows": "Configurações específicas do Windows.", + "vscode.extension.contributes.debuggers.windows.runtime": "Runtime usado para Windows.", + "vscode.extension.contributes.debuggers.osx": "Configurações específicas do OS X.", + "vscode.extension.contributes.debuggers.osx.runtime": "Runtime usado para o OS X.", + "vscode.extension.contributes.debuggers.linux": "Configurações específicas do Linux.", + "vscode.extension.contributes.debuggers.linux.runtime": "Runtime usado para o Linux.", + "vscode.extension.contributes.breakpoints": "Contribui aos pontos de interrupção.", + "vscode.extension.contributes.breakpoints.language": "Permitir pontos de parada para este idioma.", + "app.launch.json.title": "Executar", + "app.launch.json.version": "Versão deste formato de arquivo.", + "app.launch.json.configurations": "Lista de configurações. Adicionar novas configurações ou editar as existentes usando o IntelliSense.", + "app.launch.json.compounds": "Lista de compostos. Cada composto faz referência a várias configurações que vão ser executadas juntas.", + "app.launch.json.compound.name": "Nome do composto. Aparece no menu drop-down da configuração de execução.", + "app.launch.json.compounds.configurations": "Nomes das configurações que serão iniciadas como parte deste composto.", + "debugNoType": "'type' do adaptador de depuração não pode ser omitido e deve ser do tipo 'string'.", + "DebugConfig.failed": "Não é possível criar o arquivo 'launch.json' dentro da pasta '.vscode' ({0}).", + "selectDebug": "Selecione o ambiente" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json new file mode 100644 index 00000000000..1424499bfcc --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.i18n.json @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "removeBreakpoints": "Remover pontos de interrupção", + "removeBreakpointOnColumn": "Remover ponto de interrupção na coluna {0}", + "removeLineBreakpoint": "Remover ponto de interrupção de linha", + "editBreakpoints": "Editar pontos de interrupção", + "editBreakpointOnColumn": "Editar o ponto de interrupção na coluna {0}", + "editLineBrekapoint": "Editar o ponto de interrupção de linha", + "enableDisableBreakpoints": "Habilitar/Desabilitar pontos de interrupção", + "disableColumnBreakpoint": "Desabilitar ponto de interrupção na coluna {0}", + "disableBreakpointOnLine": "Desabilitar ponto de interrupção de linha", + "enableBreakpoints": "Habilitar o ponto de interrupção na coluna {0}", + "enableBreakpointOnLine": "Habilitar o ponto de interrupção de linha", + "addBreakpoint": "Adicionar ponto de interrupção", + "addConfiguration": "Adicionar Configuração..." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugHover.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugHover.i18n.json new file mode 100644 index 00000000000..1853865a1ec --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugHover.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "treeAriaLabel": "Depurar passando o mouse por cima" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json new file mode 100644 index 00000000000..6dc0bc48afb --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugService.i18n.json @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "snapshotObj": "Apenas valores primitivos são mostrados para este objeto.", + "debuggingStarted": "Depuração Iniciada.", + "debuggingPaused": "Depuração pausada, razão {0}, {1} {2}", + "debuggingStopped": "Depuração parada.", + "breakpointAdded": "Adicionado ponto de interrupção, linha {0}, arquivo {1}", + "breakpointRemoved": "Ponto de interrupção removido, linha {0}, arquivo {1}", + "compoundMustHaveConfigurations": "Composição deve ter o atributo \"configurations\" definido para iniciar várias configurações.", + "configMissing": "Configuração '{0}' não tem 'launch.json'.", + "debugTypeNotSupported": "Tipo de depuração configurado '{0}' não é suportado.", + "debugTypeMissing": "Falta a propriedade 'type' para a configuração de lançamento escolhida.", + "preLaunchTaskErrors": "Erros de build foram detectados durante a preLaunchTask '{0}'.", + "preLaunchTaskError": "Erro de build foi detectado durante a preLaunchTask '{0}'.", + "preLaunchTaskExitCode": "A preLaunchTask '{0}' encerrada com código de saída {1}.", + "debugAnyway": "Depurar mesmo assim", + "noFolderWorkspaceDebugError": "O arquivo ativo não pode ser depurado. Certifique-se de que ele está salvo no disco e que tem uma extensão de depuração instalada para esse tipo de arquivo.", + "NewLaunchConfig": "Por favor, configure o arquivo de configuração de lançamento para seu aplicativo. {0}", + "DebugTaskNotFound": "Não foi possível encontrar o preLaunchTask '{0}'.", + "differentTaskRunning": "Há uma tarefa {0} sendo executada. Não pode executar a tarefa de pré-lançamento {1}." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugViewer.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugViewer.i18n.json new file mode 100644 index 00000000000..ae47cc6a47d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugViewer.i18n.json @@ -0,0 +1,28 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "process": "Processar", + "paused": "Em pausa", + "running": "Em execução", + "thread": "Thread", + "pausedOn": "Pausado em {0}", + "loadMoreStackFrames": "Carregar mais segmentos de pilha", + "threadAriaLabel": "Thread {0}, pilha de chamadas, depuração", + "stackFrameAriaLabel": "Segmento de Pilha {0} linha {1} {2}, pilha de chamadas, depuração", + "variableValueAriaLabel": "Digite o novo valor da variável", + "variableScopeAriaLabel": "Escopo {0}, variáveis, depuração", + "variableAriaLabel": "{0} valor {1}, variáveis, depuração", + "watchExpressionPlaceholder": "Expressão para monitorar", + "watchExpressionInputAriaLabel": "Digitar expressão a monitorar", + "watchExpressionAriaLabel": "{0} valor {1}, monitorar, depuração", + "watchVariableAriaLabel": "{0} valor {1}, monitorar, depuração", + "functionBreakpointPlaceholder": "Função de parada", + "functionBreakPointInputAriaLabel": "Digitar Ponto de Parada de Função", + "functionBreakpointsNotSupported": "Pontos de parada de função não são suportados por este tipo de depuração", + "breakpointAriaLabel": "Ponto de parada linha {0} {1}, pontos de parada, depuração", + "functionBreakpointAriaLabel": "Ponto de parada de função {0}, pontos de parada, depuração", + "exceptionBreakpointAriaLabel": "Ponto de parada de exceção {0}, pontos de parada, depuração" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugViews.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugViews.i18n.json new file mode 100644 index 00000000000..d14c4338ceb --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/debugViews.i18n.json @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "variablesSection": "Seção de variáveis", + "variables": "Variáveis", + "variablesAriaTreeLabel": "Variáveis de Depuração", + "expressionsSection": "Seção de Expressões", + "watch": "Monitoramento", + "watchAriaTreeLabel": "Depurar Expressões Monitoradas", + "callstackSection": "Seção de Pilha de Chamada", + "debugStopped": "Pausado em {0}", + "callStack": "Pilha de Chamadas", + "callStackAriaLabel": "Depurar a Pilha de Chamadas", + "breakpointsSection": "Seção de Pontos de Parada", + "breakpoints": "Pontos de Parada", + "breakpointsAriaTreeLabel": "Depurar os Pontos de Parada" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json new file mode 100644 index 00000000000..227ca95927f --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "copyValue": "Copiar valor", + "copy": "Copiar", + "copyAll": "Copiar todos", + "copyStackTrace": "Copiar Pilha de Chamadas" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json new file mode 100644 index 00000000000..0ce97a8f796 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "moreInfo": "Mais Informações", + "unableToLaunchDebugAdapter": "Não é possível executar o adaptador de depuração de '{0}'.", + "unableToLaunchDebugAdapterNoArgs": "Não é possível executar o adaptador de depuração.", + "stoppingDebugAdapter": "{0}. Parando o adaptador de depuração.", + "debugAdapterCrash": "Processo do adaptador de depuração foi finalizado inesperadamente" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/repl.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/repl.i18n.json new file mode 100644 index 00000000000..73f6f0be4c4 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/repl.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "replAriaLabel": "Ler o Painel de Impressão Eval", + "actions.repl.historyPrevious": "História anterior", + "actions.repl.historyNext": "Próxima história", + "actions.repl.acceptInput": "REPL Aceitar Entrada" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json new file mode 100644 index 00000000000..4afd6d64d82 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/replViewer.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "stateCapture": "Estado do objeto é capturado na primeira avaliação", + "replVariableAriaLabel": "Variável {0} tem valor {1}, ler a impressão do valor do loop, depurar", + "replExpressionAriaLabel": "Expressão {0} tem valor {1}, ler o laço de avaliação de impressão, depurar", + "replValueOutputAriaLabel": " impressão da avaliação do laço de leitura, depurar", + "replKeyValueOutputAriaLabel": "Variável de saída {0} tem valor {1}, ler o loop de avaliação de impressão, depurar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json new file mode 100644 index 00000000000..b191a0de856 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "statusBarDebuggingBackground": "Cor de fundo da barra de status quando um programa está sendo depurado. A barra de status é mostrada na parte inferior da janela" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json new file mode 100644 index 00000000000..898a18605fb --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/terminalSupport.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "debug.terminal.title": "depurado", + "debug.terminal.not.available.error": "Terminal integrado não disponível" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json new file mode 100644 index 00000000000..f0551dfe57b --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/debug/node/debugAdapter.i18n.json @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "debugAdapterBinNotFound": "Executável do adaptador de depuração '{0}' não existe.", + "debugAdapterCannotDetermineExecutable": "Não é possível determinar o executável para o adaptador de depuração '{0}'.", + "debugType": "Tipo de configuração.", + "debugTypeNotRecognised": "O tipo de depuração não é reconhecido. Certifique-se de que você tem uma extensão de depuração correspondente instalada e que ela está habilitada.", + "node2NotSupported": "\"node2\" não é mais suportado, use \"node\" ao invés e defina o atributo \"protocol\" para \"inspector\".", + "debugName": "Nome da configuração; aparece no menu drop-down da configuração de lançamento. ", + "debugRequest": "Requer o tipo de configuração. Pode ser \"launch\" ou \"attach\".", + "debugServer": "Somente para o desenvolvimento de extensão de depuração: se uma porta é especificada, o VS Code tenta se conectar a um adaptador de depuração executando em modo de servidor", + "debugPrelaunchTask": "Tarefa para ser executada antes de começar a sessão de depuração.", + "debugWindowsConfiguration": "Atributos de configuração de lançamento específicos do Windows.", + "debugOSXConfiguration": "Atributos de configuração de lançamento específicos do OS X.", + "debugLinuxConfiguration": "Atributos de configuração de lançamento específicos do Linux.", + "deprecatedVariables": "'env.', 'config.' e 'command.' foram descontinuados, use ' env:', ' config:' e ' command:' em vez disso." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/browser/actions/showEmmetCommands.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/browser/actions/showEmmetCommands.i18n.json new file mode 100644 index 00000000000..1e3a1c0f277 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/browser/actions/showEmmetCommands.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showEmmetCommands": "Mostrar Comandos do Emmet" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json new file mode 100644 index 00000000000..1dc5e1e3b69 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/balance.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "balanceInward": "Emmet: Saldo (interno)", + "balanceOutward": "Emmet: Saldo (externo)" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json new file mode 100644 index 00000000000..cccc82d8a01 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/editPoints.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "previousEditPoint": "Emmet: Ponto de edição anterior", + "nextEditPoint": "Emmet: Ponto próxima edição" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json new file mode 100644 index 00000000000..b4a6a03e213 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/evaluateMath.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "evaluateMathExpression": "Emmet: Avaliar a expressão matemática" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json new file mode 100644 index 00000000000..5a5dd3cc3e8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "expandAbbreviationAction": "Emmet: Expandir Abreviação" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json new file mode 100644 index 00000000000..306332a4af2 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/incrementDecrement.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "incrementNumberByOneTenth": "Emmet: Incremento de 0.1", + "incrementNumberByOne": "Emmet: Incremento de 1", + "incrementNumberByTen": "Emmet: Incremento de 10", + "decrementNumberByOneTenth": "Emmet: Decréscimo por 0.1", + "decrementNumberByOne": "Emmet: Decréscimo por 1", + "decrementNumberByTen": "Emmet: Decréscimo por 10" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json new file mode 100644 index 00000000000..6a742c4d5f9 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/matchingPair.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "matchingPair": "Emmet: Ir para o par de correspondência" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json new file mode 100644 index 00000000000..22ed3f5f533 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/mergeLines.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "mergeLines": "Emmet: Mesclar linhas" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json new file mode 100644 index 00000000000..bc0eefc2e00 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/reflectCssValue.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "reflectCSSValue": "Emmet: Refletir valor CSS" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json new file mode 100644 index 00000000000..a30414b08d2 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/removeTag.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "removeTag": "Emmet: Remover Rótulo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json new file mode 100644 index 00000000000..1343e2d6b36 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/selectItem.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "selectPreviousItem": "Emmet: Selecione o Item anterior", + "selectNextItem": "Emmet: Selecione o próximo Item" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json new file mode 100644 index 00000000000..ea04346ea7c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/splitJoinTag.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "splitJoinTag": "Emmet: Dividir/Juntar Rótulo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json new file mode 100644 index 00000000000..366cb874a0c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/toggleComment.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleComment": "Emmet: Alternar Comentário" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json new file mode 100644 index 00000000000..1eff88ade9d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/updateImageSize.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "updateImageSize": "Emmet: Atualizar o Tamanho da Imagem" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json new file mode 100644 index 00000000000..963a85e1671 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/updateTag.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "updateTag": "Emmet: Atualizar Rótulo", + "enterTag": "Insira o Rótulo", + "tag": "Rótulo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json new file mode 100644 index 00000000000..501253b7dcb --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/actions/wrapWithAbbreviation.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "wrapWithAbbreviationAction": "Emmet: Envelope com a abreviatura", + "enterAbbreviation": "Digite a abreviação", + "abbreviation": "Abreviação" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json new file mode 100644 index 00000000000..1caebe040f5 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "emmetConfigurationTitle": "Emmet", + "triggerExpansionOnTab": "Quando habilitado, abreviações emmet são expandidas ao pressionar TAB.", + "emmetPreferences": "Preferências usadas para modificar o comportamento de algumas ações e resolvedores de Emmet.", + "emmetSyntaxProfiles": "Definir o perfil para a sintaxe especificada ou usar seu próprio perfil com regras específicas.", + "emmetExclude": "Uma matriz de línguagens onde abreviaturas emmet não devem ser expandidas.", + "emmetExtensionsPath": "Caminho para uma pasta contendo perfis emmet, trechos e preferências" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/execution/electron-browser/terminal.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/execution/electron-browser/terminal.contribution.i18n.json new file mode 100644 index 00000000000..95274daf750 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/execution/electron-browser/terminal.contribution.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "terminalConfigurationTitle": "Terminal Externo", + "terminal.external.windowsExec": "Personalizar qual terminal executar no Windows.", + "terminal.external.osxExec": "Personalizar qual aplicativo de terminal executar no OS X.", + "terminal.external.linuxExec": "Personalizar qual terminal executar no Linux.", + "globalConsoleActionWin": "Abrir Novo Prompt de Comando", + "globalConsoleActionMacLinux": "Abrir Novo Terminal", + "scopedConsoleActionWin": "Abrir no Prompt de Comando", + "scopedConsoleActionMacLinux": "Abrir no Terminal" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json b/i18n/ptb/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json new file mode 100644 index 00000000000..fde640b09c5 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/execution/electron-browser/terminalService.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "console.title": "Console VS Code", + "mac.terminal.script.failed": "Script '{0}' falhou com código de saída {1}", + "mac.terminal.type.not.supported": "'{0}' não suportado", + "press.any.key": "Pressione qualquer tecla para continuar...", + "linux.term.failed": "'{0}' falhou com código de saída {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json new file mode 100644 index 00000000000..d79e3c4ca0a --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorer.contribution.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "vscode.extension.contributes.view": "Contribui ao modo de exibição personalizado", + "vscode.extension.contributes.view.id": "Identificação única usada para identificar a vista criada por vscode.workspace.createTreeView", + "vscode.extension.contributes.view.label": "Sequência de caracteres legível usada para processar a visualização", + "vscode.extension.contributes.view.icon": "Caminho para o ícone da visualização", + "vscode.extension.contributes.views": "Contribui com visualizações personalizadas", + "showViewlet": "Mostrar {0}", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorerActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorerActions.i18n.json new file mode 100644 index 00000000000..37735d10007 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorerActions.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "refresh": "Atualizar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorerService.i18n.json b/i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorerService.i18n.json new file mode 100644 index 00000000000..7b7f16b3812 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/explorers/browser/treeExplorerService.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "treeExplorer.noMatchingProviderId": "Não há TreeExplorerNodeProvider com id {providerId} registrado." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/explorers/browser/views/treeExplorerView.i18n.json b/i18n/ptb/src/vs/workbench/parts/explorers/browser/views/treeExplorerView.i18n.json new file mode 100644 index 00000000000..0e7f5f9cd92 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/explorers/browser/views/treeExplorerView.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "treeExplorerViewlet.tree": "Seção do Explorador da Árvore" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/browser/dependenciesViewer.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/browser/dependenciesViewer.i18n.json new file mode 100644 index 00000000000..0ebd24a9fd8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/browser/dependenciesViewer.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "error": "Erro", + "Unknown Dependency": "Dependência Desconhecida:" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json new file mode 100644 index 00000000000..1a3b9d4cd09 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionEditor.i18n.json @@ -0,0 +1,39 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "name": "Nome da extensão", + "extension id": "Identificador da extensão", + "publisher": "Nome do editor", + "install count": "Quantidade de Instalações", + "rating": "Avaliação", + "license": "Licença", + "details": "Detalhes", + "contributions": "Contribuições", + "changelog": "Registro de Alterações", + "dependencies": "Dependências", + "noReadme": "README não disponível.", + "noChangelog": "Registro de Alterações não disponível.", + "noContributions": "Sem Contribuições", + "noDependencies": "Sem Dependências", + "settings": "Configurações ({0})", + "setting name": "Nome", + "description": "Descrição", + "default": "Valor padrão", + "debuggers": "Depuradores ({0})", + "debugger name": "Nome", + "themes": "Temas ({0})", + "JSON Validation": "Validação JSON ({0})", + "commands": "Comandos ({0})", + "command name": "Nome", + "keyboard shortcuts": "Atalhos de Teclado", + "menuContexts": "Contextos de Menu", + "languages": "Linguagens ({0})", + "language id": "ID", + "language name": "Nome", + "file extensions": "Extensões de Arquivo", + "grammar": "Gramática", + "snippets": "Trechos" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json new file mode 100644 index 00000000000..e2ff606a7c9 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -0,0 +1,55 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "installAction": "Instalar", + "installing": "Instalando", + "uninstallAction": "Desinstalar", + "Uninstalling": "Desinstalando", + "updateAction": "Atualizar", + "updateTo": "Atualizar para {0}", + "enableForWorkspaceAction.label": "Habilitar (Espaço de Trabalho)", + "enableAlwaysAction.label": "Habilitar (Sempre)", + "disableForWorkspaceAction.label": "Desabilitar (Espaço de Trabalho)", + "disableAlwaysAction.label": "Desabilitar (Sempre)", + "ManageExtensionAction.uninstallingTooltip": "Desinstalando", + "enableForWorkspaceAction": "Espaço de trabalho", + "enableGloballyAction": "Sempre", + "enableAction": "Habilitar", + "disableForWorkspaceAction": "Espaço de trabalho", + "disableGloballyAction": "Sempre", + "disableAction": "Desabilitar", + "checkForUpdates": "Verificar Atualizações", + "updateAll": "Atualizar Todas as Extensões", + "reloadAction": "Recarregar", + "postUpdateTooltip": "Recarregar para atualizar", + "postUpdateMessage": "Recarregar esta janela para ativar a extensão atualizada '{0}'?", + "postEnableTooltip": "Recarregar para ativar", + "postEnableMessage": "Recarregar esta janela para ativar a extensão '{0}'?", + "postDisableTooltip": "Recarregar para desativar", + "postDisableMessage": "Recarregar esta janela para desativar a extensão '{0}'?", + "postUninstallTooltip": "Recarregar para desativar", + "postUninstallMessage": "Recarregar esta janela para desativar a extensão desinstalada '{0}'?", + "reload": "&&Recarregar Janela", + "toggleExtensionsViewlet": "Mostrar Extensões", + "installExtensions": "Instalar Extensões", + "showInstalledExtensions": "Mostrar Extensões Instaladas", + "showDisabledExtensions": "Mostrar Extensões Desabilitadas", + "clearExtensionsInput": "Limpar Entrada de Extensões", + "showOutdatedExtensions": "Mostrar Extensões Desatualizadas", + "showPopularExtensions": "Mostrar Extensões Populares", + "showRecommendedExtensions": "Mostrar Extensões Recomendadas", + "showWorkspaceRecommendedExtensions": "Mostrar Extensões Recomendadas para o Espaço de Trabalho", + "showRecommendedKeymapExtensions": "Mostrar Mapeamentos de Teclado Recomendados", + "showRecommendedKeymapExtensionsShort": "Mapeamentos de Teclado", + "configureWorkspaceRecommendedExtensions": "Configurar Extensões Recomendadas (Espaço de Trabalho)", + "ConfigureWorkspaceRecommendations.noWorkspace": "As recomendações somente estão disponíveis em uma pasta do espaço de trabalho.", + "OpenExtensionsFile.failed": "Não foi possível criar o arquivo 'extensions.json' na pasta '.vscode' ({0}).", + "builtin": "Intrínseco", + "disableAll": "Desabilitar Todas as Extensões Instaladas", + "disableAllWorkspace": "Desabilitar Todas as Extensões Instaladas para este Espaço de Trabalho", + "enableAll": "Habilitar Todas as Extensões Instaladas", + "enableAllWorkspace": "Habilitar Todas as Extensões Instaladas para este Espaço de Trabalho" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.i18n.json new file mode 100644 index 00000000000..666a6692179 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "manage": "Pressione Enter para gerenciar suas extensões.", + "searchFor": "Pressione Enter para pesquisar por '{0}' na Loja.", + "noExtensionsToInstall": "Digite um nome de extensão" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/common/extensionsFileTemplate.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/common/extensionsFileTemplate.i18n.json new file mode 100644 index 00000000000..b90c0d5ac64 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/common/extensionsFileTemplate.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "app.extensions.json.title": "Extensões", + "app.extensions.json.recommendations": "Lista de recomendações de extensões. O identificador de uma extensão é sempre ' ${publisher}. ${nome}'. Por exemplo: 'vscode.csharp'.", + "app.extension.identifier.errorMessage": "Formato esperado '${editor}.${nome}'. Exemplo: 'vscode.csharp'." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/common/extensionsInput.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/common/extensionsInput.i18n.json new file mode 100644 index 00000000000..333627e9619 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/common/extensionsInput.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "extensionsInputName": "Extensão: {0}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json new file mode 100644 index 00000000000..663560d4d78 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "reallyRecommended2": "A extensão {0} é recomendada para este tipo de arquivo.", + "showRecommendations": "Mostrar Recomendações", + "neverShowAgain": "Não mostrar novamente", + "close": "Fechar", + "workspaceRecommended": "Este espaço de trabalho possui recomendações de extensão.", + "ignoreExtensionRecommendations": "Deseja ignorar todas as recomendações de extensão?", + "ignoreAll": "Sim, Ignorar Tudo", + "no": "Não", + "cancel": "Cancelar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json new file mode 100644 index 00000000000..76bf0379481 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "extensionsCommands": "Gerenciar Extensões", + "galleryExtensionsCommands": "Instalar Extensões da Galeria", + "extension": "Extensão", + "extensions": "Extensões", + "view": "Exibir", + "extensionsConfigurationTitle": "Extensões", + "extensionsAutoUpdate": "Atualizar extensões automaticamente", + "extensionsIgnoreRecommendations": "Ignorar recomendações de extensão" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json new file mode 100644 index 00000000000..731e4ef9491 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openExtensionsFolder": "Abrir a Pasta de Extensões", + "installVSIX": "Instalar do VSIX...", + "InstallVSIXAction.success": "A extensão foi instalada com sucesso. Reinicie para habilitá-la.", + "InstallVSIXAction.reloadNow": "Recarregar Agora" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json new file mode 100644 index 00000000000..0cde76b12d8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "disableOtherKeymapsConfirmation": "Desabilitar outros mapeamentos de teclado para evitar conflitos entre mapeamentos de teclado?", + "yes": "Sim", + "no": "Não" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json new file mode 100644 index 00000000000..a35f8bbe6c6 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "searchExtensions": "Pesquisar Extensões na Loja", + "extensions": "Extensões", + "sort by installs": "Ordenar por: Quantidade de Instalações", + "sort by rating": "Ordenar por: Avaliação", + "sort by name": "Ordenar por: Nome", + "no extensions found": "Nenhuma extensão encontrada.", + "suggestProxyError": "A Loja retornou 'ECONNREFUSED'. Por favor, verifique a configuração de 'http.proxy'.", + "outdatedExtensions": "{0} Extensões Desatualizadas" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json new file mode 100644 index 00000000000..f0313c20343 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.i18n.json @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "enableDependeciesConfirmation": "Habilitando '{0}' também habilita suas dependências. Gostaria de continuar?", + "enable": "Sim", + "doNotEnable": "Não", + "disableDependeciesConfirmation": "Gostaria de desabilitar somente '{0}', ou as suas dependências também?", + "disableOnly": "Apenas", + "disableAll": "Todos", + "cancel": "Cancelar", + "singleDependentError": "Não é possível desabilitar a extensão '{0}'. A extensão '{1}' depende dela.", + "twoDependentsError": "Não é possível desabilitar a extensão '{0}'. As extensões '{1}' e '{2}' dependem dela.", + "multipleDependentsError": "Não é possível desabilitar a extensão '{0}'. As extensões '{1}', '{2}' e outras dependem dela." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/feedback/electron-browser/feedback.i18n.json b/i18n/ptb/src/vs/workbench/parts/feedback/electron-browser/feedback.i18n.json new file mode 100644 index 00000000000..5d3c22c39a8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/feedback/electron-browser/feedback.i18n.json @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "sendFeedback": "Tweetar Feedback", + "label.sendASmile": "Tweete feedback para nós", + "patchedVersion1": "Sua instalação está corrompida.", + "patchedVersion2": "Por favor especificar isso ao enviar um bug.", + "sentiment": "Como foi sua experiência?", + "smileCaption": "Feliz", + "frownCaption": "Triste", + "other ways to contact us": "Outras maneiras de nos contatar", + "submit a bug": "Submeter um bug", + "request a missing feature": "Solicitar um recurso ausente", + "tell us why?": "Diga-nos porquê?", + "commentsHeader": "Comentários", + "tweet": "Tweetar", + "character left": "caractere à esquerda", + "characters left": "caracteres à esquerda", + "feedbackSending": "Enviando", + "feedbackSent": "Obrigado", + "feedbackSendingError": "Tentar novamente" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/editors/binaryFileEditor.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/editors/binaryFileEditor.i18n.json new file mode 100644 index 00000000000..9c33fd25246 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/editors/binaryFileEditor.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "binaryFileEditor": "Visualizador de Arquivo Binário" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json new file mode 100644 index 00000000000..792781bc8c7 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/editors/textFileEditor.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "textFileEditor": "Editor de Arquivo de Texto", + "createFile": "Criar arquivo", + "fileEditorWithInputAriaLabel": "{0}. Editor de Arquivo de Texto.", + "fileEditorAriaLabel": "Editor de Arquivo de Texto" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.contribution.i18n.json new file mode 100644 index 00000000000..f203671c230 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.contribution.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "filesCategory": "Arquivos", + "revealInSideBar": "Revelar na Barra Lateral", + "acceptLocalChanges": "Usar mudanças locais e sobrescrever o conteúdo do disco", + "revertLocalChanges": "Descartar mudanças locais e reverter para conteúdo do disco" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.i18n.json new file mode 100644 index 00000000000..161e7a9a16c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/fileActions.i18n.json @@ -0,0 +1,73 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "retry": "Tentar novamente", + "rename": "Renomear", + "newFile": "Novo Arquivo", + "newFolder": "Nova Pasta", + "openFolderFirst": "Abrir uma pasta primeiro para criar arquivos ou pastas dentro dele.", + "newUntitledFile": "Novo Arquivo Sem Título", + "createNewFile": "Novo Arquivo", + "createNewFolder": "Nova Pasta", + "deleteButtonLabelRecycleBin": "&&Mover para Lixeira", + "deleteButtonLabelTrash": "&&Mover para o Lixo", + "deleteButtonLabel": "&&Excluir", + "dirtyMessageFolderOneDelete": "Você está excluindo uma pasta com alterações não salvas em 1 arquivo. Você quer continuar?", + "dirtyMessageFolderDelete": "Você está excluindo uma pasta com alterações não salvas em {0} arquivos. Você quer continuar?", + "dirtyMessageFileDelete": "Você está excluindo um arquivo com alterações não salvas. Você quer continuar?", + "dirtyWarning": "Suas alterações serão perdidas se você não salvá-las.", + "confirmMoveTrashMessageFolder": "Tem certeza de que deseja excluir '{0}' e seu conteúdo?", + "confirmMoveTrashMessageFile": "Tem certeza de que deseja excluir '{0}'?", + "undoBin": "Você pode restaurar da lixeira.", + "undoTrash": "Você pode restaurar a partir do lixo.", + "confirmDeleteMessageFolder": "Tem certeza de que deseja excluir permanentemente '{0}' e seu conteúdo?", + "confirmDeleteMessageFile": "Tem certeza de que deseja excluir permanentemente '{0}'?", + "irreversible": "Esta ação é irreversível!", + "permDelete": "Excluir permanentemente", + "delete": "Excluir", + "importFiles": "Importar Arquivos", + "confirmOverwrite": "Um arquivo ou pasta com o mesmo nome já existe na pasta de destino. Você quer substituí-lo?", + "replaceButtonLabel": "&&Substituir", + "copyFile": "Copiar", + "pasteFile": "Colar", + "duplicateFile": "Duplicar", + "openToSide": "Aberto para o lado", + "compareSource": "Selecione para comparar", + "globalCompareFile": "Compare o Arquivo Ativo Com...", + "pickHistory": "Selecione um arquivo previamente aberto para comparar com", + "unableToFileToCompare": "O arquivo selecionado não pode ser comparado com '{0}'.", + "openFileToCompare": "Abrir um arquivo primeiro para compará-lo com outro arquivo.", + "compareWith": "Comparar com '{0}'", + "compareFiles": "Comparar Arquivos", + "refresh": "Atualizar", + "save": "Salvar", + "saveAs": "Salvar como...", + "saveAll": "Salvar Todos", + "saveAllInGroup": "Salvar Todos no Grupo", + "saveFiles": "Salvar Arquivos Sujos", + "revert": "Reverter Arquivo", + "focusOpenEditors": "Foco na Visualização dos Editores Abertos", + "focusFilesExplorer": "Foco no Explorador de Arquivos", + "showInExplorer": "Revelar o Arquivo Ativo na Barra Lateral", + "openFileToShow": "Abrir um arquivo primeiro para mostrá-lo no explorer", + "collapseExplorerFolders": "Esconder Pastas no Explorador", + "refreshExplorer": "Atualizar Explorador", + "openFile": "Abrir arquivo...", + "openFileInNewWindow": "Abrir o Arquivo Ativo em uma Nova Janela", + "openFileToShowInNewWindow": "Abrir um arquivo primeiro para abrir em uma nova janela", + "revealInWindows": "Revelar no Explorer", + "revealInMac": "Revelar no Finder", + "openContainer": "Abrir a Pasta", + "revealActiveFileInWindows": "Revelar Arquivo Ativo no Windows Explorer", + "revealActiveFileInMac": "Revelar Arquivo Ativo no Finder", + "openActiveFileContainer": "Abrir a Pasta do Arquivo Ativo.", + "copyPath": "Copiar Caminho", + "copyPathOfActive": "Copiar Caminho do Arquivo Ativo", + "emptyFileNameError": "Um nome de arquivo ou pasta deve ser fornecido.", + "fileNameExistsError": "Um arquivo ou pasta **{0}** já existe neste local. Escolha um nome diferente.", + "invalidFileNameError": "O nome **{0}** não é válido como um nome de arquivo ou pasta. Por favor, escolha um nome diferente.", + "filePathTooLongError": "O nome **{0}** resulta em um caminho muito longo. Escolha um nome mais curto." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/fileCommands.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/fileCommands.i18n.json new file mode 100644 index 00000000000..2e61a1656c8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/fileCommands.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openFileToCopy": "Abrir um arquivo primeiro para copiar seu caminho", + "openFileToReveal": "Abrir um arquivo primeiro para revelar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json new file mode 100644 index 00000000000..ddbc9408f54 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -0,0 +1,40 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showExplorerViewlet": "Mostrar Explorer", + "explore": "Explorador", + "view": "Exibir", + "textFileEditor": "Editor de Arquivo de Texto", + "binaryFileEditor": "Editor de Arquivo Binário", + "filesConfigurationTitle": "Arquivos", + "exclude": "Configure os padrões glob para excluir arquivos e pastas.", + "files.exclude.boolean": "O padrão glob com o qual combinar os caminhos de arquivo. Defina para verdadeiro ou falso para habilitar ou desabilitar o padrão.", + "files.exclude.when": "Verificação adicional nos irmãos de um arquivo correspondente. Use $(basename) como variável para o nome do arquivo correspondente.", + "associations": "Configurar as associações de arquivo para linguagens (por exemplo, \"* Extension\": \"html\"). Estas têm precedência sobre as associações padrão das linguagens instaladas.", + "encoding": "A codificação padrão do conjunto de caracteres para ser usada ao ler e gravar arquivos.", + "autoGuessEncoding": "Quando habilitado, tentará adivinhar a codificação do conjunto de caracteres ao abrir arquivos", + "trimTrailingWhitespace": "Quando habilitado, removerá espaços em branco à direita ao salvar um arquivo.", + "insertFinalNewline": "Quando habilitado, inseririrá uma nova linha no final do arquivo quando salvá-lo.", + "files.autoSave.off": "Um arquivo sujo nunca é automaticamente salvo.", + "files.autoSave.afterDelay": "Um arquivo sujo é salvo automaticamente após configurado em 'files.autoSaveDelay'.", + "files.autoSave.onFocusChange": "Um arquivo sujo é salvo automaticamente quando o editor perde o foco.", + "files.autoSave.onWindowChange": "Um arquivo sujo é salvo automaticamente quando a janela perde o foco.", + "autoSave": "Controla o auto-salvamento de arquivos sujos. Aceita os valores: '{0}', '{1}', '{2}' (editor perde o foco), '{3}' (janela perde o foco). Se definido como '{4}', você pode configurar o atraso em 'files.autoSaveDelay'.", + "autoSaveDelay": "Controla o atraso em milissegundos depois que um arquivo sujo é salvo automaticamente. Só se aplica quando 'files.autoSave' for definida como '{0}'", + "watcherExclude": "Configure padrões glob de caminhos de arquivo para excluir do monitoramento de arquivos. Alterar essa configuração requer uma reinicialização. Quando você tiver consumo Code muito alto de cpu na inicialização, você pode excluir pastas grandes para reduzir a carga inicial.", + "hotExit.off": "Desabilitar a saída à quente.", + "hotExit.onExit": "Saída à quente será acionada quando o aplicativo for fechado, ou seja, quando a última janela é fechada no Windows/Linux ou quando o comando workbench.action.quit é acionado (paleta de comandos, keybinding, menu). Todas as janelas com backups serão restauradas na próxima execução.", + "hotExit.onExitAndWindowClose": "Saída à quente será acionada quando o aplicativo for fechado, ou seja, quando a última janela é fechada no Windows/Linux ou quando o comando workbench.action.quit é acionado (paleta de comando, keybinding, menu), e também para qualquer janela com uma pasta aberta independentemente se é a última janela. Todas as janelas sem pastas abertas serão restauradas na próxima execução. Para restaurar as janelas de pastas como eram antes do desligamento configure \"window.reopenFolders\" para \"todos\".", + "hotExit": "Controla se os arquivos não salvos são lembrados entre as sessões, permitindo salvar alerta ao sair do editor seja ignorada.", + "defaultLanguage": "O modo de linguagem padrão que é atribuída para novos arquivos.", + "editorConfigurationTitle": "Editor", + "formatOnSave": "Formata um arquivo no salvamento. Um formatador deve estar disponível, o arquivo não deve ser salvo automaticamente e editor não deve ser desligado.", + "explorerConfigurationTitle": "Explorador de arquivos", + "openEditorsVisible": "Número de editores mostrado no painel Abrir Editores. Configurá-lo para 0 irá ocultar o painel.", + "dynamicHeight": "Controla se a altura da seção de editores abertos deve adaptar-se dinamicamente para o número de elementos ou não.", + "autoReveal": "Controla se o explorador deve automaticamente revelar e selecionar arquivos ao abri-los.", + "enableDragAndDrop": "Controla se o explorador deve permitir mover arquivos e pastas através de arrastar e soltar." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/saveErrorHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/saveErrorHandler.i18n.json new file mode 100644 index 00000000000..30a0a48f866 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/saveErrorHandler.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "discard": "Descartar", + "overwrite": "Sobrescrever", + "retry": "Tentar novamente", + "readonlySaveError": "Falha ao salvar '{0}': O arquivo está protegido contra gravação. Selecione 'Substituir' para remover a proteção.", + "genericSaveError": "Erro ao salvar '{0}': {1}", + "staleSaveError": "Falha ao salvar '{0}': O conteúdo no disco é mais recente. Clique em **Comparar** para comparar a sua versão com a do disco.", + "compareChanges": "Comparar", + "saveConflictDiffLabel": "{0} (no disco) ↔ {1} (em {2}) - Resolver conflitos de salvamento", + "userGuide": "Use as ações na barra de ferramentas do editor para **desfazer** suas alterações ou **substituir** o conteúdo no disco com as suas alterações" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/views/emptyView.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/views/emptyView.i18n.json new file mode 100644 index 00000000000..58da5446b25 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/views/emptyView.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "explorerSection": "Seção de Explorador de Arquivos", + "noWorkspace": "Nenhuma Pasta Aberta", + "noWorkspaceHelp": "Você ainda não abriu uma pasta.", + "openFolder": "Abrir Pasta" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/views/explorerView.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/views/explorerView.i18n.json new file mode 100644 index 00000000000..4753a88bd4c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/views/explorerView.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "explorerSection": "Seção de Explorador de Arquivos", + "treeAriaLabel": "Explorador de Arquivos" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/views/explorerViewer.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/views/explorerViewer.i18n.json new file mode 100644 index 00000000000..c670883e6ac --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/views/explorerViewer.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileInputAriaLabel": "Digite o Nome do arquivo. Pressione Enter para confirmar ou Escape para cancelar.", + "filesExplorerViewerAriaLabel": "{0}, Explorador de Arquivos", + "confirmOverwriteMessage": "'{0}' já existe na pasta de destino. Deseja substituí-lo?", + "irreversible": "Esta ação é irreversível!", + "replaceButtonLabel": "&&Substituir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json new file mode 100644 index 00000000000..4db9c1f34d8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/views/openEditorsView.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openEditosrSection": "Abrir Seção de Editores", + "openEditors": "Abrir Editores", + "treeAriaLabel": "Abrir Editores: Lista de Arquivos Ativos", + "dirtyCounter": "{0} não salvos" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/views/openEditorsViewer.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/views/openEditorsViewer.i18n.json new file mode 100644 index 00000000000..dbef8f2ddb5 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/views/openEditorsViewer.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorGroupAriaLabel": "{0}, Agrupar Editor", + "openEditorAriaLabel": "{0}, Abrir Editor", + "saveAll": "Salvar Todos", + "closeAll": "Fechar todos", + "close": "Fechar", + "closeOthers": "Fechar Outros" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json new file mode 100644 index 00000000000..9e75b7b2a89 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/common/dirtyFilesTracker.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "dirtyFiles": "{0} arquivos não salvos" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/common/editors/fileEditorInput.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/common/editors/fileEditorInput.i18n.json new file mode 100644 index 00000000000..f29992f5d95 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/files/common/editors/fileEditorInput.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "orphanedFile": "{0} (excluído do disco)" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/html/browser/html.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/html/browser/html.contribution.i18n.json new file mode 100644 index 00000000000..f9530b0f6f6 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/html/browser/html.contribution.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "html.editor.label": "Visualização Html" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/html/browser/htmlPreviewPart.i18n.json b/i18n/ptb/src/vs/workbench/parts/html/browser/htmlPreviewPart.i18n.json new file mode 100644 index 00000000000..8df4c48f58c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/html/browser/htmlPreviewPart.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "html.voidInput": "Entrada inválida do editor." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/html/browser/webview.i18n.json b/i18n/ptb/src/vs/workbench/parts/html/browser/webview.i18n.json new file mode 100644 index 00000000000..2ef4463deb9 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/html/browser/webview.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "devtools.webview": "Desenvolvedor: Ferramentas Webview" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/markers/common/messages.i18n.json b/i18n/ptb/src/vs/workbench/parts/markers/common/messages.i18n.json new file mode 100644 index 00000000000..8576955d609 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/markers/common/messages.i18n.json @@ -0,0 +1,39 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "viewCategory": "Exibir", + "problems.view.show.label": "Mostrar Problemas", + "problems.panel.configuration.title": "Visualização de Problemas", + "problems.panel.configuration.autoreveal": "Controla se a visaulização de problemas evela os arquivos automaticamente ao abri-los", + "markers.panel.title.problems": "Problemas", + "markers.panel.aria.label.problems.tree": "Problemas agrupados por arquivos", + "markers.panel.no.problems.build": "Nenhum problema foi detectado na área de trabalho até agora.", + "markers.panel.no.problems.filters": "Nenhum resultado encontrado com os critérios de filtro fornecidos", + "markers.panel.action.filter": "Problemas de Filtro", + "markers.panel.filter.placeholder": "Filtrar por tipo ou texto", + "markers.panel.filter.errors": "erros", + "markers.panel.filter.warnings": "avisos", + "markers.panel.filter.infos": "informações", + "markers.panel.single.error.label": "1 Erro", + "markers.panel.multiple.errors.label": "{0} Erros", + "markers.panel.single.warning.label": "1 Aviso", + "markers.panel.multiple.warnings.label": "{0} Avisos", + "markers.panel.single.info.label": "1 Informação", + "markers.panel.multiple.infos.label": "{0} Informações", + "markers.panel.single.unknown.label": "1 Desconhecido", + "markers.panel.multiple.unknowns.label": "{0} Desconhecidos", + "markers.panel.at.ln.col.number": "({0}, {1})", + "problems.tree.aria.label.resource": "{0} com {1} problemas", + "problems.tree.aria.label.error.marker": "Erro gerado por {0}: {1} na linha {2} e caractere {3}", + "problems.tree.aria.label.error.marker.nosource": "Erro: {0} na linha {1} e caractere {2}", + "problems.tree.aria.label.warning.marker": "Aviso gerado por {0}: {1} na linha {2} e caractere {3}", + "problems.tree.aria.label.warning.marker.nosource": "Aviso: {0} na linha {1} e caractere {2}", + "problems.tree.aria.label.info.marker": "Informação gerada por {0}: {1} na linha {2} e caractere {3}", + "problems.tree.aria.label.info.marker.nosource": "Informação: {0} na linha {1} e caractere {2}", + "problems.tree.aria.label.marker": "Problema gerado por {0}: {1} na linha {2} e caractere {3}", + "problems.tree.aria.label.marker.nosource": "Problema: {0} na linha {1} e caractere {2}", + "errors.warnings.show.label": "Mostrar Erros e Avisos" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markersElectronContributions.i18n.json b/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markersElectronContributions.i18n.json new file mode 100644 index 00000000000..027c80cca30 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/markers/electron-browser/markersElectronContributions.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "copyMarker": "Copiar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/nps/electron-browser/nps.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/nps/electron-browser/nps.contribution.i18n.json new file mode 100644 index 00000000000..1ec18c632a4 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/nps/electron-browser/nps.contribution.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "surveyQuestion": "Você deseja responder a uma pequena pesquisa?", + "takeSurvey": "Responder a pesquisa", + "remindLater": "Lembrar mais tarde", + "neverAgain": "Não mostrar novamente" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/output/browser/output.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/output/browser/output.contribution.i18n.json new file mode 100644 index 00000000000..e36bdadf4e9 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/output/browser/output.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "output": "Saída", + "viewCategory": "Exibir", + "clearOutput.label": "Limpar saída" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/output/browser/outputActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/output/browser/outputActions.i18n.json new file mode 100644 index 00000000000..00bca0dc309 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/output/browser/outputActions.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleOutput": "Alternar Saída", + "clearOutput": "Limpar saída", + "toggleOutputScrollLock": "Alternar Scroll Lock de Saída", + "switchToOutput.label": "Mudar para Saída" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/output/browser/outputPanel.i18n.json b/i18n/ptb/src/vs/workbench/parts/output/browser/outputPanel.i18n.json new file mode 100644 index 00000000000..ec28fd7b2a3 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/output/browser/outputPanel.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "outputPanelWithInputAriaLabel": "{0}, Painel de saída", + "outputPanelAriaLabel": "Painel de saída" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/output/common/output.i18n.json b/i18n/ptb/src/vs/workbench/parts/output/common/output.i18n.json new file mode 100644 index 00000000000..a083a6e7d9d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/output/common/output.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "output": "Saída", + "channel": "para '{0}'" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json new file mode 100644 index 00000000000..5fda62eb168 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "slow": "Inicialização lenta detectada", + "slow.detail": "Pena que você teve uma inicialização lenta. Por favor reinicie '{0}' com perfil de desempenho habilitado, compartilhe os perfis conosco e nós trabalharemos duro para fazer com que a inicialização fique perfeita novamente.", + "prof.message": "Perfis criados com sucesso.", + "prof.detail": "Por favor, crie um problema e anexe manualmente os seguintes arquivos:\n{0}", + "prof.restartAndFileIssue": "Criar Problema e Reiniciar", + "prof.restart": "Reiniciar", + "prof.thanks": "Obrigado por nos ajudar.", + "prof.detail.restart": "É necessário um reinício final para continuar a usar '{0}'. Novamente, obrigado pela sua contribuição." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json new file mode 100644 index 00000000000..279307d4b87 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingWidgets.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defineKeybinding.initial": "Pressionar a combinação de teclas desejada e ENTER. ESCAPE para cancelar.", + "defineKeybinding.chordsTo": "Acorde para" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json new file mode 100644 index 00000000000..1cb6541687c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditor.i18n.json @@ -0,0 +1,35 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "keybindingsInputName": "Atalhos de Teclado", + "SearchKeybindings.AriaLabel": "Pesquisar keybindings", + "SearchKeybindings.Placeholder": "Pesquisar keybindings", + "sortByPrecedene": "Ordenar por precedência", + "header-message": "Para personalizações avançadas abrir e editar", + "keybindings-file-name": "keybindings.json", + "keybindingsLabel": "Keybindings", + "changeLabel": "Alterar Keybinding", + "addLabel": "Adicionar Keybinding", + "removeLabel": "Remover Keybinding", + "resetLabel": "Redefinir Keybinding", + "showConflictsLabel": "Mostrar Conflitos", + "copyLabel": "Copiar", + "error": "Erro '{0}' enquanto edita keybinding. Por favor, abra o arquivo 'keybindings.json' e verifique.", + "command": "Comando", + "keybinding": "KeyBinding", + "source": "Fonte", + "when": "Quando", + "editKeybindingLabelWithKey": "Alterar Keybinding {0}", + "editKeybindingLabel": "Alterar Keybinding", + "addKeybindingLabelWithKey": "Adicionar Keybinding {0}", + "addKeybindingLabel": "Adicionar Keybinding", + "commandAriaLabel": "Comando é {0}.", + "keybindingAriaLabel": "KeyBinding é {0}.", + "noKeybinding": "Nenhum Keybinding atribuído.", + "sourceAriaLabel": "Fonte é {0}.", + "whenAriaLabel": "Quando é {0}.", + "noWhen": "Sem contexto Quando." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.i18n.json new file mode 100644 index 00000000000..15fd432f9fa --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defineKeybinding.start": "Definir Keybinding", + "defineKeybinding.kbLayoutInfoMessage": "Para o seu layout de teclado atual pressionar", + "defineKeybinding.kbLayoutErrorMessage": "Você não será capaz de produzir esta combinação de teclas sob seu layout de teclado atual." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferences.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferences.contribution.i18n.json new file mode 100644 index 00000000000..40e6d0841da --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferences.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultPreferencesEditor": "Editor de Preferências Padrão", + "keybindingsEditor": "Editor de Keybindings", + "preferences": "Preferências" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json new file mode 100644 index 00000000000..461e0fb96f7 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesActions.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openGlobalSettings": "Abra as Configurações de Usuário", + "openGlobalKeybindings": "Abrir Atalhos de Teclado", + "openGlobalKeybindingsFile": "Abrir Arquivo de Atalhos de Teclado", + "openWorkspaceSettings": "Abrir as configurações do espaço de trabalho", + "configureLanguageBasedSettings": "Definir Configurações Específicas de Linguagem...", + "languageDescriptionConfigured": "({0})", + "pickLanguage": "Selecionar Linguagem" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json new file mode 100644 index 00000000000..e3ef1e68a73 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesEditor.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "settingsEditorName": "Configurações Padrão", + "SearchSettingsWidget.AriaLabel": "Configurações de Pesquisa", + "SearchSettingsWidget.Placeholder": "Configurações de Pesquisa", + "totalSettingsMessage": "Total {0} Configurações", + "noSettingsFound": "Nenhum resultado", + "oneSettingFound": "1 Configuração correspondente", + "settingsFound": "{0} Configurações correspondentes", + "preferencesAriaLabel": "Preferências padrão. Editor de texto somente leitura." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json new file mode 100644 index 00000000000..e35427eb2df --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesRenderers.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "errorInvalidConfiguration": "Não é possível gravar em configurações. Corrija erros/avisos no arquivo e tente novamente.", + "editTtile": "Editar", + "replaceDefaultValue": "Substituir nas Configurações", + "copyDefaultValue": "Copiar para Configurações", + "unsupportedPHPExecutablePathSetting": "Essa configuração deve ser uma Configuração de Usuário. Para configurar o PHP para o espaço de trabalho, abra um arquivo PHP e clique em 'Caminho do PHP' na barra de status.", + "unsupportedWorkspaceSetting": "Essa configuração deve ser uma Configuração de Usuário." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesService.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesService.i18n.json new file mode 100644 index 00000000000..3d94af63615 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesService.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openFolderFirst": "Abrir uma pasta primeiro para criar configurações de espaço de trabalho", + "emptyKeybindingsHeader": "Coloque suas chaves de ligações neste arquivo para substituir os padrões", + "defaultKeybindings": "Keybindings Padrão", + "emptySettingsHeader": "Colocar suas configurações nesse arquivo para sobrecrever as configurações padrão", + "emptySettingsHeader1": "Colocar as suas configurações nesse arquivo para sobrescrever as configurações e usuário padrão.", + "fail.createSettings": "Não foi possível criar '{0}' ({1})." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json new file mode 100644 index 00000000000..556ef65c079 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/browser/preferencesWidgets.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "settingsSwitcherBarAriaLabel": "Chave de Configurações", + "userSettings": "Configurações de Usuário", + "workspaceSettings": "Configurações de Espaço de Trabalho" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.i18n.json new file mode 100644 index 00000000000..68e05e00daf --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/common/keybindingsEditorModel.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "default": "Valor padrão", + "user": "Usuário", + "meta": "meta", + "option": "opção" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/preferences/common/preferencesModels.i18n.json b/i18n/ptb/src/vs/workbench/parts/preferences/common/preferencesModels.i18n.json new file mode 100644 index 00000000000..6427118b75b --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/preferences/common/preferencesModels.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "commonlyUsed": "Comumente Utilizado", + "defaultKeybindingsHeader": "Substituir as chaves de ligações, colocando-os em seu arquivo de chave ligações." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json new file mode 100644 index 00000000000..7b246da25ad --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/commandsHandler.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showTriggerActions": "Mostrar todos os comandos", + "showCommands.label": "Paleta de comandos...", + "entryAriaLabelWithKey": "{0}, {1}, comandos", + "entryAriaLabel": "{0}, comandos", + "canNotRun": "O comando '{0}' não pode ser executado a partir daqui.", + "actionNotEnabled": "O comando '{0}' não está habilitado no contexto atual.", + "commandLabel": "{0}: {1}", + "cat.title": "{0}: {1}", + "noCommandsMatching": "Não há comandos correspondentes" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json new file mode 100644 index 00000000000..3f922e6deca --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "gotoLine": "Ir para linha...", + "gotoLineLabelEmptyWithLimit": "Digite um número de linha entre 1 e {0} para navegar para lá", + "gotoLineLabelEmpty": "Digite um número de linha para navegar para lá", + "gotoLineColumnLabel": "Ir para linha {0} e caractere {1}", + "gotoLineLabel": "Ir para linha {0}", + "gotoLineHandlerAriaLabel": "Digite um número de linha para navegar.", + "cannotRunGotoLine": "Abrir um arquivo de texto primeiro para ir a uma linha" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.i18n.json new file mode 100644 index 00000000000..5e56bdc5890 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.i18n.json @@ -0,0 +1,34 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "gotoSymbol": "Ir para o Símbolo no Arquivo...", + "symbols": "símbolos ({0})", + "method": "métodos ({0})", + "function": "funções ({0})", + "_constructor": "construtores ({0})", + "variable": "variáveis ({0})", + "class": "classes ({0})", + "interface": "interfaces ({0})", + "namespace": "namespaces ({0})", + "package": "pacotes ({0})", + "modules": "módulos ({0})", + "property": "propriedades ({0})", + "enum": "enumerações ({0})", + "string": "cadeias de caracteres ({0})", + "rule": "regras ({0})", + "file": "arquivos ({0})", + "array": "matrizes ({0})", + "number": "números ({0})", + "boolean": "booleanos ({0})", + "object": "objetos ({0})", + "key": "chaves ({0})", + "entryAriaLabel": "{0}, símbolos", + "noSymbolsMatching": "Não há símbolos correspondentes", + "noSymbolsFound": "Nenhum símbolo encontrado", + "gotoSymbolHandlerAriaLabel": "Tipo para reduzir os símbolos do editor ativo atual.", + "cannotRunGotoSymbolInFile": "Não há informações de símbolo para o arquivo", + "cannotRunGotoSymbol": "Abrir um arquivo de texto primeiro para ir a um símbolo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/quickopen/browser/helpHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/helpHandler.i18n.json new file mode 100644 index 00000000000..0a2fc637f73 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/helpHandler.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "entryAriaLabel": "{0}, ajuda do seletor", + "globalCommands": "comandos globais", + "editorCommands": "comandos do editor" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/quickopen/browser/quickopen.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/quickopen.contribution.i18n.json new file mode 100644 index 00000000000..e3c6204b605 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/quickopen.contribution.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "commandsHandlerDescriptionDefault": "Exibir e executar comandos", + "gotoLineDescriptionMac": "Ir para linha", + "gotoLineDescriptionWin": "Ir para linha", + "gotoSymbolDescription": "Ir para o Símbolo no Arquivo", + "gotoSymbolDescriptionScoped": "Ir para o Símbolo no Arquivo Por Categoria", + "helpDescription": "Mostrar ajuda", + "viewPickerDescription": "Abrir Visualização" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.i18n.json new file mode 100644 index 00000000000..38804354794 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "entryAriaLabel": "{0}, visualizar seletor", + "views": "Modos de exibição", + "panels": "Painéis", + "terminals": "Terminal", + "terminalTitle": "{0}: {1}", + "channels": "Saída", + "openView": "Abrir Visualização", + "quickOpenView": "Abrir Visualização Rápida" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json new file mode 100644 index 00000000000..1b5369ebeea --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scm.contribution.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "toggleGitViewlet": "Mostrar Git", + "installAdditionalSCMProviders": "Instalar provedores de SCM adicionais...", + "source control": "Controle de código-fonte", + "toggleSCMViewlet": "Mostrar SCM", + "view": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmActivity.i18n.json b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmActivity.i18n.json new file mode 100644 index 00000000000..7846e2b872d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmActivity.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "scmPendingChangesBadge": "{0} alterações pendentes" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json new file mode 100644 index 00000000000..5b93869e8d8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmMenus.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "installAdditionalSCMProviders": "Instalar provedores de SCM adicionais...", + "switch provider": "Mudar Provedor SCM..." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json new file mode 100644 index 00000000000..c14da801978 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/scmViewlet.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "commitMessage": "Mensagem (tecle {0} para confirmar)", + "source control": "Controle de código-fonte", + "viewletTitle": "{0}: {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/openAnythingHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/openAnythingHandler.i18n.json new file mode 100644 index 00000000000..8d523511515 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/openAnythingHandler.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileAndTypeResults": "resultados do arquivo e símbolo", + "fileResults": "resultados do arquivo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/openFileHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/openFileHandler.i18n.json new file mode 100644 index 00000000000..016a91f2c32 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/openFileHandler.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "entryAriaLabel": "{0}, seletor de arquivo", + "searchResults": "resultados da pesquisa" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/openSymbolHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/openSymbolHandler.i18n.json new file mode 100644 index 00000000000..ede0a0c718d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/openSymbolHandler.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "entryAriaLabel": "{0}, selecionador de símbolos", + "symbols": "resultados de símbolo", + "noSymbolsMatching": "Não há símbolos correspondentes", + "noSymbolsWithoutInput": "Digitar para pesquisar símbolos" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json new file mode 100644 index 00000000000..68c8c0ad6b7 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/patternInputWidget.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "defaultLabel": "entrada", + "patternDescription": "Use Padrões Glob", + "patternHelpInclude": "O padrão para combinações. Por exemplo, **\\*\\*/*.js** para corresponder a todos os arquivos JavaScript ou **myFolder/\\*\\*** para corresponder a essa pasta com todas pastas aninhadas.\n\n**Referência**:\n**\\*** corresponde a 0 ou mais caracteres\n**?** corresponde a 1 caractere\n**\\*\\*** corresponde a zero ou mais diretórios\n**[a-z]** corresponde a um intervalo de caracteres\n**{a, b}** corresponde a qualquer um dos padrões)", + "useIgnoreFilesDescription": "Usar Ignorar Arquivos", + "useExcludeSettingsDescription": "Usar Configurações de Exclusão" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/replaceService.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/replaceService.i18n.json new file mode 100644 index 00000000000..05d7f4e4cd0 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/replaceService.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileReplaceChanges": "{0} ↔ {1} (Substituir Preview)" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/search.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/search.contribution.i18n.json new file mode 100644 index 00000000000..b14e20a1487 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/search.contribution.i18n.json @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "showTriggerActions": "Ir para Símbolo no Espaço de Trabalho...", + "name": "Pesquisar", + "showSearchViewlet": "Mostrar Busca", + "view": "Exibir", + "findInFiles": "Localizar nos Arquivos", + "openAnythingHandlerDescription": "Ir para o Arquivo", + "openSymbolDescriptionNormal": "Ir para o Símbolo em Área de Trabalho", + "searchOutputChannelTitle": "Pesquisar", + "searchConfigurationTitle": "Pesquisar", + "exclude": "Configure os padrões glob para excluir arquivos e pastas nas pesquisas. Herda todos os padrões glob da configuração files.exclude.", + "exclude.boolean": "O padrão glob com o qual combinar os caminhos de arquivo. Defina para verdadeiro ou falso para habilitar ou desabilitar o padrão.", + "exclude.when": "Verificação adicional nos irmãos de um arquivo correspondente. Use $(basename) como variável para o nome do arquivo correspondente.", + "useRipgrep": "Controla se deve utilizar ripgrep na pesquisa de texto", + "useIgnoreFilesByDefault": "Controla se deve utilizar arquivos .gitignore e .ignore por padrão ao fazer pesquisas em um novo espaço de trabalho.", + "search.quickOpen.includeSymbols": "Configurar para incluir resultados de uma pesquisa símbolo global nos resultados do arquivo para Abertura Rápida." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/searchActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/searchActions.i18n.json new file mode 100644 index 00000000000..94f7c40e782 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/searchActions.i18n.json @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "nextSearchTerm": "Mostrar o Próximo Termo de Pesquisa", + "previousSearchTerm": "Mostrar Termo de Pesquisa Anterior", + "focusNextInputBox": "Focalizar a Próxima Caixa de Entrada", + "focusPreviousInputBox": "Focalizar a Caixa de Entrada Anterior", + "replaceInFiles": "Substituir nos Arquivos", + "findInFolder": "Encontrar na pasta", + "RefreshAction.label": "Atualizar", + "ClearSearchResultsAction.label": "Limpar os Resultados da Pesquisa", + "FocusNextSearchResult.label": "Focalizar o Próximo Resultado da Pesquisa", + "FocusPreviousSearchResult.label": "Focalizar o Resultado da Pesquisa Anterior", + "RemoveAction.label": "Remover", + "file.replaceAll.label": "Substituir Tudo", + "match.replace.label": "Substituir", + "ConfigureGlobalExclusionsAction.label": "Abrir configurações" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json new file mode 100644 index 00000000000..3edda1861fb --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/searchResultsView.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "searchMatches": "{0} correspondências encontradas", + "searchMatch": "{0} correspondência encontrada", + "fileMatchAriaLabel": "{0} correspondências no arquivo {1} da pasta {2}, Resultado da pesquisa", + "replacePreviewResultAria": "Substitua o termo {0} pelo termo {1} na coluna posição {2} correspondente ao texto {3}", + "searchResultAria": "Encontrado o termo {0} na posição da coluna {1} correspondente ao texto {2}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/searchViewlet.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/searchViewlet.i18n.json new file mode 100644 index 00000000000..4ceea616010 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/searchViewlet.i18n.json @@ -0,0 +1,50 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "moreSearch": "Alternar Detalhes da Pesquisa", + "searchScope.includes": "arquivos a serem incluídos", + "label.includes": "Pesquisa Padrões de Inclusão", + "searchScope.excludes": "arquivos a serem excluídos", + "label.excludes": "Pesquisa de Padrões de Exclusão", + "global.searchScope.folders": "arquivos excluídos pelas configurações", + "label.global.excludes": "Configurado pesquisa padrões de exclusão", + "replaceAll.confirmation.title": "Substituir Tudo", + "replaceAll.confirm.button": "Substituir", + "replaceAll.occurrence.file.message": "Substituída {0} ocorrência no arquivo {1} com '{2}'.", + "removeAll.occurrence.file.message": "Substituída {0} ocorrência no arquivo {1}'.", + "replaceAll.occurrence.files.message": "Substituída {0} ocorrência no arquivo {1} com '{2}'.", + "removeAll.occurrence.files.message": "Substituída {0} ocorrência nos arquivos {1}", + "replaceAll.occurrences.file.message": "Substituídas {0} ocorrências no arquivo {1} com '{2}'.", + "removeAll.occurrences.file.message": "Substituídas {0} ocorrências nos arquivo {1}.", + "replaceAll.occurrences.files.message": "Substituídas {0} ocorrências nos arquivos {1} com '{2}'.", + "removeAll.occurrences.files.message": "Substituídas {0} ocorrências nos arquivos {1}.", + "removeAll.occurrence.file.confirmation.message": "Substituir {0} ocorrências no arquivo {1} com '{2}'?", + "replaceAll.occurrence.file.confirmation.message": "Substituir {0} ocorrência no arquivo {1}?", + "removeAll.occurrence.files.confirmation.message": "Substituir {0} ocorrência nos arquivos {1} com '{2}'?", + "replaceAll.occurrence.files.confirmation.message": "Substituir {0} ocorrência nos arquivos {1}?", + "removeAll.occurrences.file.confirmation.message": "Substituir {0} ocorrências no arquivo {1} com '{2}'?", + "replaceAll.occurrences.file.confirmation.message": "Substituir {0} ocorrências no arquivo {1}?", + "removeAll.occurrences.files.confirmation.message": "Substituir {0} ocorrências nos arquivos {1} com '{2}'?", + "replaceAll.occurrences.files.confirmation.message": "Substituir {0} ocorrências nos arquivos {1}?", + "treeAriaLabel": "Resultados da Pesquisa", + "globLabel": "{0} quando {1}", + "searchMaxResultsWarning": "O conjunto de resultados contém apenas um subconjunto de todas as correspondências. Seja mais específico na sua pesquisa para diminuir o número de resultados.", + "searchCanceled": "Pesquisa foi cancelada antes de qualquer resultado ser encontrado - ", + "noResultsIncludesExcludes": "Nenhum resultado encontrado em '{0}' excluindo '{1}' - ", + "noResultsIncludes": "Nenhum resultado encontrado em '{0}' -", + "noResultsExcludes": "Nenhum resultado encontrado excluindo '{0}' -", + "noResultsFound": "Nenhum resultado encontrado. Analise as configurações para exclusões configuradas - ", + "rerunSearch.message": "Pesquisar novamente", + "rerunSearchInAll.message": "Pesquisar novamente em todos os arquivos", + "openSettings.message": "Abrir configurações", + "ariaSearchResultsStatus": "Pesquisa retornou {0} resultados em {1} arquivos", + "search.file.result": "{0} resultado no arquivo {1}", + "search.files.result": "{0} resultado nos arquivos {1}", + "search.file.results": "{0} resultados no arquivo {1}", + "search.files.results": "{0} resultados nos arquivos {1}", + "searchWithoutFolder": "Você ainda não abriu uma pasta. Somente arquivos abertos são pesquisados - ", + "openFolder": "Abrir Pasta" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/search/browser/searchWidget.i18n.json b/i18n/ptb/src/vs/workbench/parts/search/browser/searchWidget.i18n.json new file mode 100644 index 00000000000..41178af28cc --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/search/browser/searchWidget.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "search.action.replaceAll.disabled.label": "Substituir Todos (Submeter Pesquisa para Habilitar)", + "search.action.replaceAll.enabled.label": "Substituir Tudo", + "search.replace.toggle.button.title": "Alternar Substituir", + "label.Search": "Pesquisar: Digite o termo de pesquisa e pressione Enter para pesquisar ou Escape para cancelar", + "search.placeHolder": "Pesquisar", + "label.Replace": "Substituir: Digite o termo a ser substituído e pressione Enter para visualizar ou Escape para cancelar", + "search.replace.placeHolder": "Substituir", + "regexp.validationFailure": "A expressão corresponde a tudo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json new file mode 100644 index 00000000000..0f8e6360187 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "vscode.extension.contributes.snippets": "Contribui aos trechos de código.", + "vscode.extension.contributes.snippets-language": "Identificador de linguagem para o qual este trecho de código contribui.", + "vscode.extension.contributes.snippets-path": "Caminho do arquivo de trechos de código. O caminho é relativo à pasta de extensão e normalmente começa com '. /snippets/'.", + "invalid.language": "Linguagem desconhecida em `contributes.{0}.language`. Valor fornecido: {1}", + "invalid.path.0": "Esperada uma string em `contributes.{0}.path`. Valor informado: {1}", + "invalid.path.1": "É esperado que `contributes.{0}.path` ({1}) seja incluído na pasta da extensão ({2}). Isto pode tornar a extensão não portável." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json new file mode 100644 index 00000000000..6c34a620b89 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "snippet.suggestions.label": "Inserir trecho de código" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.i18n.json new file mode 100644 index 00000000000..05f799f7b6a --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "openSnippet.label": "Abrir trechos de código do usuário", + "openSnippet.pickLanguage": "Selecionar Idioma para o Trecho", + "openSnippet.errorOnCreate": "Não é possível criar {0}", + "preferences": "Preferências", + "snippetSchema.json.default": "Trecho de código vazio", + "snippetSchema.json": "Configuração do trecho do usuário", + "snippetSchema.json.prefix": "O prefixo usado ao selecionar o trecho no intelliSense", + "snippetSchema.json.body": "O conteúdo do trecho de código. Use '${id}', '${id: rótulo}', '${1:label}' para variáveis e '$0', '$1' para posições do cursor", + "snippetSchema.json.description": "A descrição do trecho." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json new file mode 100644 index 00000000000..a4a18c1e970 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/snippetsService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "detail.userSnippet": "Trecho de código do usuário", + "snippetSuggest.longLabel": "{0}, {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/tabCompletion.i18n.json b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/tabCompletion.i18n.json new file mode 100644 index 00000000000..adfb9a4190d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/tabCompletion.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "tabCompletion": "Inserir trechos de código quando seu prefixo corresponder. Funciona melhor quando 'quickSuggestions' não está habilitado." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json new file mode 100644 index 00000000000..be3fefb5d3d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/browser/quickOpen.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "entryAriaLabel": "{0}, tarefas", + "workspace": "Do espaço de trabalho", + "extension": "De extensões" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json new file mode 100644 index 00000000000..4009d3b8154 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/browser/restartQuickOpen.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "tasksAriaLabel": "Digite o nome de uma tarefa para reiniciar", + "noTasksMatching": "Não há tarefas correspondentes", + "noTasksFound": "Não há tarefa para ser reiniciada" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json new file mode 100644 index 00000000000..6b4d6134384 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/browser/taskQuickOpen.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "tasksAriaLabel": "Digite o nome de uma tarefa para executar", + "noTasksMatching": "Não há tarefas correspondentes", + "noTasksFound": "Não há tarefas encontradas" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/browser/terminateQuickOpen.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/browser/terminateQuickOpen.i18n.json new file mode 100644 index 00000000000..9c5ee4b4b59 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/browser/terminateQuickOpen.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "tasksAriaLabel": "Digite o nome de uma tarefa para finalizar", + "noTasksMatching": "Não há tarefas correspondentes", + "noTasksFound": "Nenhuma tarefa para finalizar encontrada" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/common/taskConfiguration.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/common/taskConfiguration.i18n.json new file mode 100644 index 00000000000..2de0b161ac8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/common/taskConfiguration.i18n.json @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "ConfigurationParser.invalidCWD": "Aviso: options.cwd deve ser do tipo string. Ignorando valor {0}\n", + "ConfigurationParser.noShell": "Aviso: A configuração do shell somente é suportada quando estiver executando tarefas no terminal.", + "ConfigurationParser.noargs": "Erro: Argumentos do comando devem ser uma matriz de strings. Valor informado é:\n{0}", + "ConfigurationParser.noName": "Erro: Problem Matcher no escopo declarado deve ter um nome:\n{0}\n", + "ConfigurationParser.unknownMatcherKind": "Aviso: a correspondência de problema definido é desconhecido. Tipos suportados são string | ProblemMatcher | (string | ProblemMatcher)[].\n{0}\n", + "ConfigurationParser.invalidVaraibleReference": "Erro: ProblemMatcher inválido referência: {0}\n", + "ConfigurationParser.noTaskName": "Erro: tarefas devem fornecer uma propriedade taskName. A tarefa será ignorada.\n{0}\n", + "taskConfiguration.shellArgs": "Aviso: a tarefa '{0}' é um comando do shell e o nome de comando ou um dos seus argumentos tem espaços sem escape. Para garantir a linha de comando correta por favor mesclar argumentos no comando.", + "taskConfiguration.noCommandOrDependsOn": "Erro: a tarefa '{0}' também não especifica um comando ou uma propriedade dependsOn. A tarefa será ignorada. Sua definição é: {1}", + "taskConfiguration.noCommand": "Erro: a tarefa '{0}' não define um comando. A tarefa será ignorada. Sua definição é: {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/common/taskTemplates.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/common/taskTemplates.i18n.json new file mode 100644 index 00000000000..268871153e3 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/common/taskTemplates.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "tsc.config": "Compila um projeto TypeScript", + "tsc.watch": "Compila um projeto TypeScript em mode de monitoramento", + "dotnetCore": "Executa comando de compilação do .NET Core", + "msbuild": "Executa a compilação destino", + "externalCommand": "Exemplo para executar um comando externo arbitrário", + "Maven": "Executa comandos comuns específicos" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.i18n.json new file mode 100644 index 00000000000..92ae501cdc8 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.i18n.json @@ -0,0 +1,38 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "JsonSchema.options": "Opções de comando adicionais", + "JsonSchema.options.cwd": "O diretório de trabalho atual do programa executado ou do script. Se omitido raiz de espaço de trabalho atual do código é usado.", + "JsonSchema.options.env": "O ambiente do programa executado ou comando shell. Se omitido o ambiente do processo pai é usado.", + "JsonSchema.shell.executable": "O shell a ser usado.", + "JsonSchema.shell.args": "Os argumentos shell.", + "JsonSchema.command": "O comando a ser executado. Pode ser um programa externo ou um comando shell.", + "JsonSchema.tasks.args": "Argumentos passados para o comando quando esta tarefa é invocada.", + "JsonSchema.tasks.taskName": "Nome da tarefa", + "JsonSchema.tasks.windows": "Configuração de comando específica do Windows", + "JsonSchema.tasks.mac": "Configuração de comando específica do Mac", + "JsonSchema.tasks.linux": "Configuração de comando específica do Linux", + "JsonSchema.tasks.suppressTaskName": "Controla se o nome de tarefa é adicionado como um argumento para o comando. Se omitido o valor definido globalmente é usado.", + "JsonSchema.tasks.showOutput": "Controla se a saída da execução de tarefas é mostrada ou não. Se omitido o valor definido globalmente é usado.", + "JsonSchema.echoCommand": "Controla se o comando executado é enviado para a saída. O padrão é false.", + "JsonSchema.tasks.watching.deprecation": "Descontinuado. Use isBackground.", + "JsonSchema.tasks.watching": "Se a tarefa executada é mantida viva e está monitorando o sistema de arquivos.", + "JsonSchema.tasks.background": "Se a tarefa executada é mantida viva e é executado em segundo plano.", + "JsonSchema.tasks.promptOnClose": "Se o usuário é solicitado quando VS Code fecha com uma tarefa sendo executada.", + "JsonSchema.tasks.build": "Esta tarefa é mapeada para o comando de compilação padrão do código.", + "JsonSchema.tasks.test": "Esta tarefa é mapeada para o comando de teste padrão do código.", + "JsonSchema.tasks.matchers": "O problema matcher(s) a seu utilizado. Pode ser uma sequência de caracteres ou uma definição de problem matcher ou uma matriz de sequências de caracteres e problem matchers.", + "JsonSchema.args": "Argumentos adicionais passados para o comando.", + "JsonSchema.showOutput": "Controla se a saída da execução de tarefas é mostrada ou não. Se omitido 'sempre' é usado.", + "JsonSchema.watching.deprecation": "Descontinuado. Use isBackground.", + "JsonSchema.watching": "Se a tarefa executada é mantida viva e está monitorando o sistema de arquivos.", + "JsonSchema.background": "Se a tarefa executada é mantida viva e é executado em segundo plano.", + "JsonSchema.promptOnClose": "Se o usuário é solicitado quando VS Code fecha com uma tarefa de segundo plano em execução.", + "JsonSchema.suppressTaskName": "Controla se o nome de tarefa é adicionado como um argumento para o comando. O padrão é false.", + "JsonSchema.taskSelector": "Prefixo para indicar que um argumento é tarefa.", + "JsonSchema.matchers": "A correspondência de problemas a ser utilizada. Pode ser uma sequência de caracteres ou uma definição de correspondência de problemas ou uma matriz de sequências de caracteres e correspondência de problemas.", + "JsonSchema.tasks": "As configurações de tarefa. Normalmente são ampliações de tarefas já definidas na execução de tarefa externa." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v1.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v1.i18n.json new file mode 100644 index 00000000000..dc0695101b0 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v1.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "JsonSchema.version": "Número da versão do config", + "JsonSchema.windows": "Configuração de comando específica do Windows", + "JsonSchema.mac": "Configuração de comando específica do Mac", + "JsonSchema.linux": "Configuração de comando específica do Linux", + "JsonSchema.shell": "Especifica se o comando é um comando shell ou um programa externo. O padrão é falso se omitido." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json new file mode 100644 index 00000000000..3130e474d7e --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "JsonSchema.version": "Número da versão do config", + "JsonSchema.windows": "Configuração de comando específica do Windows", + "JsonSchema.mac": "Configuração de comando específica do Mac", + "JsonSchema.linux": "Configuração de comando específica do Linux", + "JsonSchema.shell": "Especifica se o comando é um comando shell ou um programa externo. O padrão é falso se omitido.", + "JsonSchema.tasks.dependsOn.string": "Outra tarefa da qual esta tarefa depende.", + "JsonSchema.tasks.dependsOn.array": "A outra tarefa que esta tarefa depende." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json new file mode 100644 index 00000000000..a07be4d2850 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/task.contribution.i18n.json @@ -0,0 +1,47 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "tasksCategory": "Tarefas", + "ConfigureTaskRunnerAction.noWorkspace": "Tarefas somente estão disponíveis em uma pasta da área de trabalho.", + "ConfigureTaskRunnerAction.quickPick.template": "Selecione um gerenciador de tarefa", + "ConfigureTaskRunnerAction.autoDetecting": "Tarefas de auto detecção para {0}", + "ConfigureTaskRunnerAction.autoDetect": "A tarefa de sistema de auto detecção falhou. Usando o modelo padrão. Consulte a saída da tarefa para detalhes.", + "ConfigureTaskRunnerAction.autoDetectError": "A tarefa de sistema de auto detecção produziu erros. Consulte a saída da tarefa para detalhes.", + "ConfigureTaskRunnerAction.failed": "Não é possível criar o arquivo 'tasks.json' na pasta '.vscode'. Consulte a saída da tarefa para detalhes.", + "ConfigureTaskRunnerAction.label": "Configure o gerenciador de tarefas", + "ConfigureBuildTaskAction.label": "Configurar Tarefa de Compilação", + "CloseMessageAction.label": "Fechar", + "ShowTerminalAction.label": "Terminal Visualização", + "problems": "Problemas", + "manyMarkers": "99+", + "tasks": "Tarefas", + "TaskSystem.noHotSwap": "Alterar o mecanismo de execução de tarefa requer reiniciar o VS Code. A alteração será ignorada.", + "TaskService.noBuildTask": "Nenhuma tarefa de compilação definida. Marque uma tarefa com 'isBuildCommand' no arquivo tasks.json.", + "TaskService.noTestTask": "Nenhuma tarefa de teste definida. Marque uma tarefa com 'isTestCommand' no arquivo tasks.json.", + "TaskServer.noTask": "Tarefa {0} requisitada para execução não encontrada.", + "TaskSystem.activeSame": "A tarefa já está ativa e em modo de monitoramento. Para terminar a tarefa, use `F1 > terminar tarefa`", + "TaskSystem.active": "Já existe uma tarefa sendo executada. Finalize-a antes de executar outra tarefa.", + "TaskSystem.restartFailed": "Falha ao finalizar e reiniciar a tarefa {0}", + "TaskSystem.configurationErrors": "Erro: A configuração da tarefa informada possui erros de validação e não pode ser utilizada. Por favor, corrija os erros primeiro.", + "TaskSystem.invalidTaskJson": "Erro: O conteúdo do arquivo tasks.json possui erros de sintaxe. Por favor, corrija-os antes de executar uma tarefa.\n", + "TaskSystem.runningTask": "Há uma tarefa sendo executada. Deseja finalizá-la?", + "TaskSystem.terminateTask": "&&Finalizar Tarefa", + "TaskSystem.noProcess": "A tarefa executada não existe mais. Se a tarefa produziu processos em background, finalizar o VS Code pode resultar em processos órfãos. Para evitar isso inicie o último processo em background com uma flag de espera.", + "TaskSystem.exitAnyways": "&&Sair de qualquer maneira", + "TerminateAction.label": "Finalizar a tarefa sendo executada", + "TaskSystem.unknownError": "Ocorreu um erro enquanto a tarefa estava sendo executada. Verifique o log de tarefas para detalhes.", + "TaskService.noWorkspace": "Tarefas somente estão disponíveis em uma pasta da área de trabalho.", + "TerminateAction.noProcess": "O processo executado não existe mais. Se a tarefa produziu processos em background, finalizar o VS Code pode resultar em processos órfãos.", + "TerminateAction.failed": "Falha ao finalizar a tarefa sendo executada", + "ShowLogAction.label": "Visualizar o Log de Tarefas", + "RunTaskAction.label": "Executar Tarefa", + "RestartTaskAction.label": "Reiniciar Tarefa", + "BuildAction.label": "Executar Tarefa de compilação", + "TestAction.label": "Executar Tarefa de Teste", + "quickOpen.task": "Executar Tarefa", + "quickOpen.terminateTask": "Finalizar Tarefa", + "quickOpen.restartTask": "Reiniciar Tarefa" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json new file mode 100644 index 00000000000..f21b7eebc35 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "TerminalTaskSystem.unknownError": "Um erro desconhecido ocorreu durante a execução de uma tarefa. Consulte o log de saída de tarefa para obter detalhes.", + "TerminalTaskSystem.terminalName": "Tarefa - {0}", + "TerminalTaskSystem": "Não é possível executar um comando shell em uma unidade UNC.", + "unkownProblemMatcher": "Problem matcher {0} não pode ser resolvido. O matcher será ignorado" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/node/processRunnerDetector.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/node/processRunnerDetector.i18n.json new file mode 100644 index 00000000000..a4f13c42f7c --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/node/processRunnerDetector.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "TaskSystemDetector.noGulpTasks": "Executando gulp..-tarefas-simples não listam nenhuma tarefa. Você executou a instalação do npm?", + "TaskSystemDetector.noJakeTasks": "Executando jake..-tarefas não listam nenhuma tarefa. Você instalou o npm?", + "TaskSystemDetector.noGulpProgram": "Gulp não está instalado no seu sistema. Execute npm install -g gulp para instalá-lo.", + "TaskSystemDetector.noJakeProgram": "Jake não está instalado no seu sistema. Execute npm install -g jake para instalá-lo.", + "TaskSystemDetector.noGruntProgram": "Grunhido não está instalado no seu sistema. Execute npm install -g grunt para instalá-lo.", + "TaskSystemDetector.noProgram": "Programa {0} não foi encontrado. Mensagem é {1}", + "TaskSystemDetector.buildTaskDetected": "Tarefa de construção chamada '{0}' detectada.", + "TaskSystemDetector.testTaskDetected": "Tarefa de teste chamada '{0}' detectada." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json b/i18n/ptb/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json new file mode 100644 index 00000000000..72848a8cde1 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/tasks/node/processTaskSystem.i18n.json @@ -0,0 +1,12 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "TaskRunnerSystem.unknownError": "Um erro desconhecido ocorreu durante a execução de uma tarefa. Consulte o log de saída de tarefa para obter detalhes.", + "TaskRunnerSystem.watchingBuildTaskFinished": "\nTarefas de compilação de monitoramento terminaram.", + "TaskRunnerSystem.childProcessError": "Falha ao iniciar o programa externo {0} {1}.", + "TaskRunnerSystem.cancelRequested": "\nA tarefa '{0}' foi finalizada por solicitação do usuário.", + "unkownProblemMatcher": "Problema matcher {0} não pode ser resolvido. O matcher será ignorado" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json new file mode 100644 index 00000000000..de21ec3dca1 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.i18n.json @@ -0,0 +1,30 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "terminalIntegratedConfigurationTitle": "Terminal Integrado", + "terminal.integrated.shell.linux": "O caminho do shell que o terminal usa no Linux.", + "terminal.integrated.shellArgs.linux": "Os argumentos de linha de comando a serem usados no terminal do Linux.", + "terminal.integrated.shell.osx": "O caminho do shell que o terminal usa no OS X.", + "terminal.integrated.shellArgs.osx": "Os argumentos de linha de comando a serem usados no terminal do OS X.", + "terminal.integrated.shell.windows": "O caminho do shell que o terminal usa no Windows. Quando usar um shell fornecido com o Windows (cmd, PowerShell ou Bash no Ubuntu), prefira utilizar C:\\Windows\\sysnative ao invés de C:\\Windows\\System32 para usar as versões de 64 bits.", + "terminal.integrated.shellArgs.windows": "Os argumentos de linha de comando a serem utilizados no terminal do Windows.", + "terminal.integrated.rightClickCopyPaste": "Quando configurado, isto evitará que o menu de contexto apareça quando pressionado o botão direito do mouse dentro do terminal, em vez disso vai copiar quando há uma seleção e colar quando não há nenhuma seleção.", + "terminal.integrated.fontFamily": "Controla a família de fontes do terminal, este padrão é o valor do editor.fontFamily.", + "terminal.integrated.fontLigatures": "Controla se as ligações de fonte são habilitadas no terminal.", + "terminal.integrated.fontSize": "Controla o tamanho da fonte em pixels do terminal.", + "terminal.integrated.lineHeight": "Controles a altura da linha do terminal, este número é multiplicada pelo tamanho da fonte terminal para obter a altura real da linha em pixels.", + "terminal.integrated.enableBold": "Se habilitar o texto em negrito dentro do terminal requer suporte do terminal shell.", + "terminal.integrated.cursorBlinking": "Controla se o cursor do terminal pisca.", + "terminal.integrated.cursorStyle": "Controla o estilo do cursor do terminal.", + "terminal.integrated.scrollback": "Controla a quantidade máxima de linhas que o terminal mantém em seu buffer.", + "terminal.integrated.setLocaleVariables": "Controla se as variáveis locais são definidas na inicialização do terminal, este padrão é verdadeiro no OS X e falso em outras plataformas.", + "terminal.integrated.cwd": "Um caminho de início explícito onde o terminal será lançado, isso é usado como o diretório de trabalho atual (cwd) para o processo shell. Isto pode ser particularmente útil em configurações de espaço de trabalho se o diretório raiz não é um cwd conveniente.", + "terminal.integrated.confirmOnExit": "Confirmar na saída se ainda houverem sessões de terminal ativas.", + "terminal.integrated.commandsToSkipShell": "Um conjunto de IDs de comando, cujas combinações de teclas não serão enviadas para o shell e sempre serão tratadas por código. Isto permite o uso de combinações de teclas que normalmente seriam consumidas pelo shell para agir da mesma forma quando o terminal não é focado, por exemplo ctrl+p para Execução Rápida.", + "terminal": "Terminal", + "terminalCategory": "Terminal", + "viewCategory": "Exibir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json new file mode 100644 index 00000000000..e63bd5db0a0 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalActions.i18n.json @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "workbench.action.terminal.toggleTerminal": "Alternar Terminal Integrado", + "workbench.action.terminal.kill": "Finalizar a Instância de Terminal Ativa", + "workbench.action.terminal.kill.short": "Encerrar Terminal", + "workbench.action.terminal.copySelection": "Copiar Seleção", + "workbench.action.terminal.new": "Criar Novo Terminal Integrado", + "workbench.action.terminal.new.short": "Novo Terminal", + "workbench.action.terminal.focus": "Focalizar Terminal", + "workbench.action.terminal.focusNext": "Focalizar Próximo Terminal", + "workbench.action.terminal.focusAtIndex": "Focalizar Terminal {0}", + "workbench.action.terminal.focusPrevious": "Focalizar Terminal Anterior", + "workbench.action.terminal.paste": "Colar no Terminal Ativo", + "workbench.action.terminal.DefaultShell": "Selecionar Shell Padrão", + "workbench.action.terminal.runSelectedText": "Executar Texto Selecionado no Terminal Ativo", + "workbench.action.terminal.runActiveFile": "Executar Arquivo Ativo no Terminal Ativo", + "workbench.action.terminal.runActiveFile.noFile": "Apenas arquivos em disco podem ser executados no terminal", + "workbench.action.terminal.switchTerminalInstance": "Trocar a instância de Terminal", + "workbench.action.terminal.scrollDown": "Rolar para Baixo (Linha)", + "workbench.action.terminal.scrollDownPage": "Rolar para Baixo (Página)", + "workbench.action.terminal.scrollToBottom": "Rolar para baixo", + "workbench.action.terminal.scrollUp": "Rolar para Cima (Linha)", + "workbench.action.terminal.scrollUpPage": "Rolar para Cima (Página)", + "workbench.action.terminal.scrollToTop": "Rolar para cima", + "workbench.action.terminal.clear": "Limpar", + "workbench.action.terminal.allowWorkspaceShell": "Permitir a Configuração de Shell da Área de Trabalho", + "workbench.action.terminal.disallowWorkspaceShell": "Não Permitir a Configuração de Shell da Área de Trabalho" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json new file mode 100644 index 00000000000..495bd79c4bb --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "terminal.background": "A cor de fundo do terminal, isso permite colorir o terminal com uma cor diferente do painel.", + "terminal.foreground": "A cor de primeiro plano do terminal.", + "terminal.ansiColor": "'{0}' cor ansi no terminal." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.i18n.json new file mode 100644 index 00000000000..b2b9a9a9843 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "terminal.integrated.allowWorkspaceShell": "Você permite {0} (definido como uma configuração de espaço de trabalho) a ser executado no terminal?", + "allow": "Permitir", + "disallow": "Não permitir" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json new file mode 100644 index 00000000000..13b6933b1b9 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "terminal.integrated.copySelection.noSelection": "Não é possível copiar seleção do terminal quando o terminal não tem foco", + "terminal.integrated.exitedWithCode": "O processo terminal encerrado com código de saída: {0}", + "terminal.integrated.waitOnExit": "Pressione qualquer tecla para fechar o terminal", + "terminal.integrated.launchFailed": "O comando de processo de terminal '{0}{1}' falhou ao ser iniciado (código de saída: {2})" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.i18n.json new file mode 100644 index 00000000000..fd175c5ad29 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "terminalLinkHandler.followLinkCmd": "Cmd + clique para seguir o link", + "terminalLinkHandler.followLinkCtrl": "Ctrl + clique para seguir o link" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json new file mode 100644 index 00000000000..5e811b86100 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "copy": "Copiar", + "createNewTerminal": "Novo Terminal", + "paste": "Colar", + "clear": "Limpar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalService.i18n.json b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalService.i18n.json new file mode 100644 index 00000000000..08ec4bd9777 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/terminal/electron-browser/terminalService.i18n.json @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "terminal.integrated.chooseWindowsShellInfo": "Você pode alterar o terminal shell padrão selecionando o botão Personalizar.", + "customize": "Personalizar", + "cancel": "Cancelar", + "never again": "Ok, Nunca Mostrar Novamente", + "terminal.integrated.chooseWindowsShell": "Selecione o seu terminal shell preferido, você pode alterar isso mais tarde em suas configurações", + "terminalService.terminalCloseConfirmationSingular": "Há uma sessão ativa de terminal, você quer finalizá-la?", + "terminalService.terminalCloseConfirmationPlural": "Existem {0} sessões ativas de terminal, você quer finalizá-las?", + "yes": "Sim" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json new file mode 100644 index 00000000000..9968bf0b9b1 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/themes/electron-browser/themes.contribution.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "selectTheme.label": "Tema de Cores", + "installColorThemes": "Instalar temas de cor adicionais...", + "themes.selectTheme": "Selecione o tema de cor (teclas cima/baixo para visualização)", + "selectIconTheme.label": "Arquivo de Ícone do Tema", + "installIconThemes": "Instalar Temas de Ícones de Arquivos Adicionais...", + "noIconThemeLabel": "Nenhum", + "noIconThemeDesc": "Desabilitar ícones de arquivos", + "problemChangingIconTheme": "Problema configurando tema de ícones: {0}", + "themes.selectIconTheme": "Selecionar Tema de Ícones de Arquivos", + "generateColorTheme.label": "Gerar Tema de Cores a Partir das Configurações Atuais", + "preferences": "Preferências", + "developer": "Desenvolvedor" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json new file mode 100644 index 00000000000..1fc9c8fe3a4 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/trust/electron-browser/unsupportedWorkspaceSettings.contribution.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "unsupportedWorkspaceSettings": "Esta área de trabalho contém configurações que só podem ser definidas nas configurações do usuário. ({0})", + "openWorkspaceSettings": "Abrir as configurações do espaço de trabalho", + "openDocumentation": "Saiba Mais", + "ignore": "Ignorar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.i18n.json b/i18n/ptb/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.i18n.json new file mode 100644 index 00000000000..213c54a3d24 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/update/electron-browser/releaseNotesInput.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "releaseNotesInputName": "Notas da Versão: {0}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.contribution.i18n.json new file mode 100644 index 00000000000..3634d3c2f2a --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "release notes": "Notas da versão", + "updateConfigurationTitle": "Atualizar", + "updateChannel": "Configurar se você recebe atualizações automáticas de um canal de atualização. Requer uma reinicialização depois da mudança." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json b/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json new file mode 100644 index 00000000000..4199be74572 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/update/electron-browser/update.i18n.json @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "updateNow": "Atualizar Agora", + "later": "Mais tarde", + "unassigned": "Não atribuído", + "releaseNotes": "Notas da Versão", + "showReleaseNotes": "Mostrar Notas da Versão", + "downloadNow": "Baixar agora", + "read the release notes": "Bem-vindo a {0} v{1}! Gostaria de ler as Notas da Versão?", + "licenseChanged": "Nossos termos de licença mudaram, favor revisá-los.", + "license": "Ler Licença", + "updateAvailable": "{0} será atualizado após reiniciar.", + "thereIsUpdateAvailable": "Há uma atualização disponível.", + "noUpdatesAvailable": "Não há nenhuma atualização disponível." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json b/i18n/ptb/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json new file mode 100644 index 00000000000..dea49eef8d5 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/watermark/electron-browser/watermark.i18n.json @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "watermark.showCommands": "Mostrar todos os comandos", + "watermark.quickOpen": "Ir para o Arquivo", + "watermark.openFile": "Abrir Arquivo", + "watermark.openFolder": "Abrir Pasta", + "watermark.openFileFolder": "Abrir Arquivo ou Pasta", + "watermark.openRecent": "Abrir Recente", + "watermark.newUntitledFile": "Novo Arquivo Sem Título", + "watermark.toggleTerminal": "Alternar Terminal", + "watermark.findInFiles": "Localizar nos Arquivos", + "watermark.startDebugging": "Iniciar Depuração", + "watermark.selectTheme": "Mudar Tema", + "watermark.selectKeymap": "Mudar Mapa de Teclas", + "watermark.keybindingsReference": "Referência de Teclado", + "watermark.openGlobalKeybindings": "Atalhos de Teclado", + "watermark.unboundCommand": "não vinculado", + "workbenchConfigurationTitle": "Área de Trabalho", + "tips.enabled": "Quando habilitado, mostrará as dicas de marca d'água quando nenhum editor estiver aberto." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json new file mode 100644 index 00000000000..93d7a695382 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.i18n.json @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "welcomeOverlay.explorer": "Explorador de arquivos", + "welcomeOverlay.search": "Pesquisar em arquivos", + "welcomeOverlay.git": "Gerenciamento de código fonte", + "welcomeOverlay.debug": "Executar e depurar", + "welcomeOverlay.extensions": "Gerenciar extensões", + "welcomeOverlay.problems": "Visualizar erros e avisos", + "welcomeOverlay.commandPalette": "Encontrar e executar todos os comandos", + "welcomeOverlay": "Visão geral da Interface do usuário", + "hideWelcomeOverlay": "Esconder a visão geral da Interface", + "help": "Ajuda" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json new file mode 100644 index 00000000000..a0b426025a4 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.i18n.json @@ -0,0 +1,44 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "welcomePage.vscode": "Visual Studio Code", + "welcomePage.editingEvolved": "Edição evoluiu", + "welcomePage.start": "Início", + "welcomePage.newFile": "Novo arquivo", + "welcomePage.openFolder": "Abrir pasta...", + "welcomePage.cloneGitRepository": "Clonar repositório Git...", + "welcomePage.recent": "Recente", + "welcomePage.moreRecent": "Mais...", + "welcomePage.noRecentFolders": "Não há pastas recentes", + "welcomePage.help": "Ajuda", + "welcomePage.keybindingsCheatsheet": "Folha de dicas de teclado para impressão", + "welcomePage.introductoryVideos": "Vídeos introdutórios", + "welcomePage.productDocumentation": "Documentação do produto", + "welcomePage.gitHubRepository": "Repositório GitHub", + "welcomePage.stackOverflow": "Stack Overflow", + "welcomePage.showOnStartup": "Mostrar a página de boas-vindas na inicialização", + "welcomePage.customize": "Personalizar", + "welcomePage.installExtensionPacks": "Ferramentas e linguagens", + "welcomePage.installExtensionPacksDescription": "Instalar o suporte para {0} e {1}", + "welcomePage.moreExtensions": "mais", + "welcomePage.installKeymapDescription": "Instalar atalhos de teclado", + "welcomePage.installKeymapExtension": "Instalar os atalhos de teclado de {0} e {1}", + "welcomePage.others": "outros", + "welcomePage.colorTheme": "Tema de cores", + "welcomePage.colorThemeDescription": "Fazer o editor e seu código parecer do jeito que você gosta", + "welcomePage.learn": "Aprender", + "welcomePage.showCommands": "Encontrar e executar todos os comandos", + "welcomePage.showCommandsDescription": "Comandos de rápido acesso e de pesquisar do painel de controle ({0})", + "welcomePage.interfaceOverview": "Visão geral da interface", + "welcomePage.interfaceOverviewDescription": "Obter uma sobreposição visual, destacando os principais componentes da interface do usuário", + "welcomePage.interactivePlayground": "Playground interativo", + "welcomePage.interactivePlaygroundDescription": "Experimente as características essenciais do editor em um curto passo-a-passo", + "welcomePage.quickLinks": "Links rápidos", + "welcomePage.keybindingsReference": "Referência de atalhos de teclado", + "welcomePage.keybindingsReferenceDescription": "Um PDF para impressão com os atalhos de teclado mais comuns", + "welcomePage.configureSettings": "Configurar definições", + "welcomePage.configureSettingsDescription": "Desbloquear o poder completo do VS Coda ajustando as configurações" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution.i18n.json new file mode 100644 index 00000000000..7012e078815 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "workbenchConfigurationTitle": "Área de Trabalho", + "welcomePage.enabled": "Quando habilitado, irá mostrar a página de boas-vindas na inicialização.", + "help": "Ajuda" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json new file mode 100644 index 00000000000..29755259794 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -0,0 +1,31 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "welcomePage": "Bem-vindo", + "welcomePage.javaScript": "JavaScript", + "welcomePage.typeScript": "TypeScript", + "welcomePage.python": "Python", + "welcomePage.php": "PHP", + "welcomePage.docker": "Docker", + "welcomePage.vim": "Vim", + "welcomePage.sublime": "Sublime", + "welcomePage.atom": "Atom", + "welcomePage.extensionPackAlreadyInstalled": "Suporte para {0} já está instalado.", + "welcomePage.willReloadAfterInstallingExtensionPack": "A janela irá recarregar depois de instalar o suporte para {0}.", + "welcomePage.installingExtensionPack": "Instalar o suporte para {0}...", + "welcomePage.extensionPackNotFound": "Suporte para {0} com o id {1} não pôde ser encontrado.", + "welcomePage.keymapAlreadyInstalled": "Os atalhos de teclado de {0} já estão instalados.", + "welcomePage.willReloadAfterInstallingKeymap": "A janela irá recarregar depois de instalar os {0} atalhos de teclado.", + "welcomePage.installingKeymap": "Instalando os {0} atalhos de teclado...", + "welcomePage.keymapNotFound": "Os {0} atalhos de teclado com o id {1} não podem ser encontrados.", + "welcome.title": "Bem-vindo", + "welcomePage.extensionListSeparator": ", ", + "welcomePage.installedExtension": "{0} (instalado)", + "ok": "OK", + "cancel": "Cancelar", + "welcomePage.quickLinkBackground": "Cor de fundo para as ligações rápidas na página de boas-vindas.", + "welcomePage.quickLinkHoverBackground": "Passar sobre a cor de fundo para as ligações rápidas na página de boas-vindas." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/editorWalkThrough.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/editorWalkThrough.i18n.json new file mode 100644 index 00000000000..9c7c7f681fa --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/editorWalkThrough.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorWalkThrough": "Playground Interativo", + "editorWalkThrough.title": "Playground Interativo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json new file mode 100644 index 00000000000..a789ae1c81f --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "walkThrough.editor.label": "Playground Interativo", + "help": "Ajuda", + "interactivePlayground": "Playground Interativo" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughActions.i18n.json new file mode 100644 index 00000000000..697623110b0 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughActions.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "editorWalkThrough.arrowUp": "Rolar para Cima (Linha)", + "editorWalkThrough.arrowDown": "Rolar para Baixo (Linha)", + "editorWalkThrough.pageUp": "Rolar para Cima (Página)", + "editorWalkThrough.pageDown": "Rolar para Baixo (Página)" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json b/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json new file mode 100644 index 00000000000..4131ebae487 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.i18n.json @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "walkThrough.unboundCommand": "não vinculado", + "walkThrough.gitNotFound": "Parece que o Git não está instalado no seu sistema.", + "walkThrough.embeddedEditorBackground": "Cor de fundo para os editores incorporados no Playground Interativo." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json b/i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json new file mode 100644 index 00000000000..188ab8da37e --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/configuration/node/configurationEditingService.i18n.json @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "open": "Abrir configurações", + "close": "Fechar", + "saveAndRetry": "Salvar as configurações e tentar novamente", + "errorUnknownKey": "Não é possível gravar no arquivo de configuração (chave desconhecida)", + "errorInvalidTarget": "Não é possível gravar no arquivo de configuração (destino inválido)", + "errorNoWorkspaceOpened": "Não é possível gravar em configurações porque nenhuma pasta está aberta. Por favor, abra uma pasta primeiro e tente novamente.", + "errorInvalidConfiguration": "Não é possível gravar em configurações. Por favor abra **User Settings** para corrigir erros/avisos no arquivo e tente novamente.", + "errorInvalidConfigurationWorkspace": "Não é possível gravar em configurações. Por favor abra **Workspace Settings** para corrigir erros/avisos no arquivo e tente novamente.", + "errorConfigurationFileDirty": "Não é possível gravar em configurações, porque o arquivo foi alterado. Por favor, salve o arquivo **User Settings** e tente novamente.", + "errorConfigurationFileDirtyWorkspace": "Não é possível gravar em configurações, porque o arquivo foi alterado. Por favor, salve o arquivo **Workspace Settings** e tente novamente." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/editor/browser/editorService.i18n.json b/i18n/ptb/src/vs/workbench/services/editor/browser/editorService.i18n.json new file mode 100644 index 00000000000..50e968f8ee3 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/editor/browser/editorService.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "compareLabels": "{0} ↔ {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/files/electron-browser/fileService.i18n.json b/i18n/ptb/src/vs/workbench/services/files/electron-browser/fileService.i18n.json new file mode 100644 index 00000000000..49e9152a1db --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/files/electron-browser/fileService.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "netVersionError": "O Microsoft .NET Framework 4.5 é necessário. Por favor siga o link para instalá-lo.", + "installNet": "Baixar o .NET Framework 4.5", + "neverShowAgain": "Não mostrar novamente", + "trashFailed": "Falha em mover '{0}' para a lixeira" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/files/node/fileService.i18n.json b/i18n/ptb/src/vs/workbench/services/files/node/fileService.i18n.json new file mode 100644 index 00000000000..b84feecdb4f --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/files/node/fileService.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "fileInvalidPath": "Recurso de arquivo inválido ({0})", + "fileIsDirectoryError": "Arquivo é diretório ({0})", + "fileBinaryError": "Arquivo parece ser binário e não pode ser aberto como texto", + "fileNotFoundError": "Arquivo não encontrado ({0})", + "unableToMoveCopyError": "Não é possível mover/copiar. Arquivo poderia substituir a pasta em que está contida.", + "foldersCopyError": "Pastas não podem ser copiadas para a área de trabalho. Por favor selecione arquivos individuais para serem copiados.", + "fileReadOnlyError": "Arquivo é Somente Leitura" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/keybinding/common/keybindingEditing.i18n.json b/i18n/ptb/src/vs/workbench/services/keybinding/common/keybindingEditing.i18n.json new file mode 100644 index 00000000000..daa32f59ee9 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/keybinding/common/keybindingEditing.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "errorKeybindingsFileDirty": "Não é possível gravar porque o arquivo está sujo. Por favor, salve o arquivo **Keybindings** e tente novamente.", + "parseErrors": "Não é possível gravar as combinações de teclas. Por favor abra o **arquivo Keybindings** para corrigir erros/avisos no arquivo e tente novamente.", + "errorInvalidConfiguration": "Não é possível gravar as combinações de teclas. **Arquivo Keybindings** tem um objeto que não é do tipo Matriz. Por favor, abra o arquivo para limpar e tentar novamente.", + "emptyKeybindingsHeader": "Coloque suas combinações de teclas neste arquivo para substituir os padrões" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json b/i18n/ptb/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json new file mode 100644 index 00000000000..2fac75a5675 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/keybinding/electron-browser/keybindingService.i18n.json @@ -0,0 +1,26 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "nonempty": "Esperado um valor não vazio", + "requirestring": "a propriedade `{0}` é obrigatória e deve ser do tipo `string`", + "optstring": "a propriedade `{0}` é opcional ou pode ser do tipo `string`", + "vscode.extension.contributes.keybindings.command": "Identificador do comando a ser executado quando keybinding é acionado.", + "vscode.extension.contributes.keybindings.key": "Tecla ou sequência de teclas (teclas separadas com o sinal de adição e sequências com espaço, por exemplo Ctrl+O e Ctrl+L L para um acorde", + "vscode.extension.contributes.keybindings.mac": "Chave específica Mac ou sequência de teclas.", + "vscode.extension.contributes.keybindings.linux": "Chave específica Linux ou sequência de teclas.", + "vscode.extension.contributes.keybindings.win": "Chave específica Windows ou sequência de teclas.", + "vscode.extension.contributes.keybindings.when": "Condição quando a chave está ativa.", + "vscode.extension.contributes.keybindings": "Contribui para Atalhos de Teclado.", + "invalid.keybindings": "Inválido `contributes.{0}`: {1}", + "unboundCommands": "Aqui estão outros comandos disponíveis: ", + "keybindings.json.title": "Configuração de combinações de teclas", + "keybindings.json.key": "Tecla ou sequência de teclas (separados por espaço)", + "keybindings.json.command": "Nome do comando a ser executado", + "keybindings.json.when": "Condição quando a chave está ativa.", + "keybindings.json.args": "Argumentos a serem passados para o comando para executar.", + "keyboardConfigurationTitle": "Teclado", + "dispatch": "Controla a lógica de expedição para pressionamentos de teclas para usar `keydown.code` (recomendado) ou 'keydown.keyCode'." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/message/browser/messageList.i18n.json b/i18n/ptb/src/vs/workbench/services/message/browser/messageList.i18n.json new file mode 100644 index 00000000000..267b62d179d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/message/browser/messageList.i18n.json @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "alertErrorMessage": "Erro: {0}", + "alertWarningMessage": "Aviso: {0}", + "alertInfoMessage": "Informações: {0}", + "error": "Erro", + "warning": "Aviso", + "info": "Informações", + "close": "Fechar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/message/electron-browser/messageService.i18n.json b/i18n/ptb/src/vs/workbench/services/message/electron-browser/messageService.i18n.json new file mode 100644 index 00000000000..cecec4b4c3a --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/message/electron-browser/messageService.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "yesButton": "&&Sim", + "cancelButton": "Cancelar" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json b/i18n/ptb/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json new file mode 100644 index 00000000000..91df655432d --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/mode/common/workbenchModeService.i18n.json @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "invalid": "Inválido 'contributes.{0}`. Matriz esperada.", + "invalid.empty": "Valor em branco para` contributes.{0}`", + "require.id": "a propriedade `{0}` é obrigatória e deve ser do tipo `string`", + "opt.extensions": "a propriedade `{0}` pode ser omitida e deve ser do tipo `string[]`", + "opt.filenames": "a propriedade `{0}` pode ser omitida e deve ser do tipo `string[]`", + "opt.firstLine": "a propriedade `{0}` pode ser omitida e deve ser do tipo `string`", + "opt.configuration": "a propriedade `{0}` pode ser omitida e deve ser do tipo `string`", + "opt.aliases": "a propriedade `{0}` pode ser omitida e deve ser do tipo `string[]`", + "opt.mimetypes": "a propriedade `{0}` pode ser omitida e deve ser do tipo `string[]`" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/textfile/common/textFileEditorModel.i18n.json b/i18n/ptb/src/vs/workbench/services/textfile/common/textFileEditorModel.i18n.json new file mode 100644 index 00000000000..7eed5484379 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/textfile/common/textFileEditorModel.i18n.json @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "saveFileFirst": "O arquivo está alterado. Por favor, salvá-lo primeiro antes reabri-lo com outra codificação.", + "genericSaveError": "Erro ao salvar '{0}': {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/textfile/common/textFileService.i18n.json b/i18n/ptb/src/vs/workbench/services/textfile/common/textFileService.i18n.json new file mode 100644 index 00000000000..9fe74ad26f3 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/textfile/common/textFileService.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "files.backup.failSave": "Arquivos não poderiam ser backupeados (erro: {0}), tente salvar seus arquivos para sair." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/textfile/electron-browser/textFileService.i18n.json b/i18n/ptb/src/vs/workbench/services/textfile/electron-browser/textFileService.i18n.json new file mode 100644 index 00000000000..491b19e87c4 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/textfile/electron-browser/textFileService.i18n.json @@ -0,0 +1,18 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "saveChangesMessage": "Você quer salvar as alterações feitas para {0}?", + "saveChangesMessages": "Você quer salvar as alterações para os seguintes {0} arquivos?", + "moreFile": "... 1 arquivo adicional não está mostrado", + "moreFiles": "... {0} arquivos adicionais não estão mostrados", + "saveAll": "&&Salvar tudo", + "save": "&&Salvar", + "dontSave": "&&Não Salvar", + "cancel": "Cancelar", + "saveChangesDetail": "Suas alterações serão perdidas se você não salvá-las.", + "allFiles": "Todos os arquivos", + "noExt": "Sem extensão" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json b/i18n/ptb/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json new file mode 100644 index 00000000000..02e2bc18273 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/themes/common/colorThemeSchema.i18n.json @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "schema.colors": "Cores para o realce de sintaxe", + "schema.properties.name": "Descrição da regra", + "schema.fontStyle": "Estilo da fonte da regra: um estilo ou uma combinação de 'itálico', 'negrito' e 'sublinhado'", + "schema.tokenColors.path": "Caminho para um arquivo tmTheme (relativo ao arquivo atual)" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json b/i18n/ptb/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json new file mode 100644 index 00000000000..3cf20c82de2 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/themes/common/fileIconThemeSchema.i18n.json @@ -0,0 +1,37 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "schema.folderExpanded": "O ícone de pasta para pastas expandidas. O ícone da pasta expandido é opcional. Se não definido, o ícone definido para a pasta será mostrado.", + "schema.folder": "O ícone de pasta para pastas colapsadas, e se folderExpanded não estiver definido, também para pastas expandidas.", + "schema.file": "O ícone de arquivo padrão, indicado para todos os arquivos que não correspondem a qualquer extensão, nome de arquivo ou idioma.", + "schema.folderNames": "Associa os nomes de pasta à ícones. A chave do objeto é o nome da pasta, não incluindo quaisquer segmentos de caminho. Nenhum padrão ou curinga são permitidos. O nome da pasta de correspondência diferencia maiusculas de minúsculas.", + "schema.folderName": "A ID da definição do ícone para associação.", + "schema.folderNamesExpanded": "Associa os nomes de pasta a ícones para pastas expandidas. A chave do objeto é o nome da pasta, não incluindo quaisquer segmentos do caminho. Padrões ou curingas não são permitidas. A correspondência do nome de pastas não diferencia maiusculas de minúsculas.", + "schema.folderNameExpanded": "A ID da definição do ícone para a associação.", + "schema.fileExtensions": "Associa as extensões de arquivo aos ícones. A chave do objeto é o nome da extensão do arquivo. O nome da extensão é o último segmento de um nome de arquivo após o último ponto (não incluindo o ponto). As extensões não diferenciam maiúsculas de minúsculas.", + "schema.fileExtension": "A ID da definição do ícone para a associação.", + "schema.fileNames": "Associa os nomes de arquivo à ícones. A chave do objeto é o nome completo do arquivo, mas não incluindo quaisquer segmentos do caminho. O nome do arquivo pode incluir pontos e uma extensão de arquivo. Nenhum padrão ou curinga é permitido. A correspondência de nome de arquivo não diferencia maiúsculas de minúsculas.", + "schema.fileName": "A ID da definição do ícone para a associação.", + "schema.languageIds": "Associa idiomas a ícones. A chave do objeto é o id de idioma definido no ponto de contribuição de linguagem.", + "schema.languageId": "O ID da definição do ícone para a associação.", + "schema.fonts": "Fontes que são usadas nas definições de ícone.", + "schema.id": "O ID da fonte.", + "schema.src": "A localização da fonte.", + "schema.font-path": "O caminho do fonte, relativo ao arquivo de tema de ícone atual.", + "schema.font-format": "O formato da fonte.", + "schema.font-weight": "O peso da fonte.", + "schema.font-sstyle": "O estilo da fonte.", + "schema.font-size": "O tamanho padrão da fonte.", + "schema.iconDefinitions": "Descrição de todos os ícones que podem ser usados quando associar arquivos de ícones.", + "schema.iconDefinition": "Uma definição de ícone. A chave do objeto é o ID da definição.", + "schema.iconPath": "Ao usar um SVG ou PNG: O caminho para a imagem. O caminho é relativo ao arquivo de configuração do ícone.", + "schema.fontCharacter": "Ao usar uma fonte glyph: O caractere na fonte para usar.", + "schema.fontColor": "Ao usar uma fonte glyph: A cor a ser utilizada.", + "schema.fontSize": "Quando estiver utilizando uma fonte: O tamanho da fonte em porcentagem para a fonte de texto. Se não for definido, o padrão é o tamanho na definição de fonte.", + "schema.fontId": "Quando estiver utilizando uma fonte: A identificação da fonte. Se não for definido, o padrão é a primeira definição de fonte.", + "schema.light": "Associações opcionais para ícones de arquivo em temas de cor clara.", + "schema.highContrast": "Associações opcionais para ícones de arquivo em temas de alto contraste." +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json b/i18n/ptb/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json new file mode 100644 index 00000000000..4ef6944ba73 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/themes/electron-browser/colorThemeData.i18n.json @@ -0,0 +1,13 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "error.cannotparsejson": "Problemas ao analisar o arquivo de tema JSON: {0}", + "error.invalidformat.colors": "Problema ao analisar o arquivo de tema de cor: {0}. A propriedade 'colors' não é do tipo 'object'.", + "error.invalidformat.tokenColors": "Problema ao analisar o arquivo de tema de cor: {0}. A propriedade 'tokenColors' deve ser também uma matriz especificando as cores ou um caminho para um arquivo de texto de tema correspondente", + "error.plist.invalidformat": "Problema ao analisar o arquivo tmTheme: {0}. 'settings' não é uma matriz.", + "error.cannotparse": "Problemas ao analisar o arquivo tmTheme: {0}", + "error.cannotload": "Problemas ao carregar o arquivo tmTheme {0}: {1}" +} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json b/i18n/ptb/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json new file mode 100644 index 00000000000..caeea848338 --- /dev/null +++ b/i18n/ptb/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.i18n.json @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "vscode.extension.contributes.themes": "Contribui com temas de cores do textmate.", + "vscode.extension.contributes.themes.id": "ID do tema do ícone conforme usado em configurações do usuário.", + "vscode.extension.contributes.themes.label": "Etiqueta da cor do tema como mostrado na interface do usuário.", + "vscode.extension.contributes.themes.uiTheme": "Tema base de definição das cores do editor: 'vs' é o tema de cor clara, 'vs-dark' é o tema de cor escura. 'hc preto' é o tema escuro de alto contraste.", + "vscode.extension.contributes.themes.path": "Caminho do arquivo tmTheme. O caminho é relativo à pasta de extensão e é normalmente './themes/themeFile.tmTheme'.", + "vscode.extension.contributes.iconThemes": "Contribui com temas de ícones de arquivo.", + "vscode.extension.contributes.iconThemes.id": "ID do tema do ícone como usado em configurações do usuário.", + "vscode.extension.contributes.iconThemes.label": "Etiqueta do tema do ícone como mostrado na interface do usuário.", + "vscode.extension.contributes.iconThemes.path": "Caminho do arquivo de definição do tema do ícone. O caminho é relativo à pasta de extensão e é normalmente './icons/awesome-icon-theme.json'.", + "migration.completed": "Foram adicionadas novas configurações de tema para as configurações de usuário. Backup está disponível em {0}.", + "error.cannotloadtheme": "Não é possível carregar {0}: {1}", + "reqarray": "Ponto de extensão '{0}' deve ser uma matriz.", + "reqpath": "Esperada uma string em `contributes.{0}.path`. Valor informado: {1}", + "invalid.path.1": "É esperado que `contributes.{0}.path` ({1}) seja incluído na pasta da extensão ({2}). Isto pode tornar a extensão não portável.", + "reqid": "Esperada sequência em 'contributes.{0}.ID'. Valor fornecido: {1}", + "error.cannotloadicontheme": "Não é possível carregar {0}", + "error.cannotparseicontheme": "Problemas de análise do arquivo de ícones: {0}", + "colorTheme": "Especifica o tema de cores usado no espaço de trabalho.", + "colorThemeError": "Tema é desconhecido ou não está instalado.", + "iconTheme": "Especifica o tema de ícone usado no espaço de trabalho.", + "noIconThemeDesc": "Nenhum arquivo de ícones", + "iconThemeError": "Arquivo de tema de ícones é desconhecido ou não está instalado.", + "workbenchColors": "Substitui as cores do tema do tema de cores atualmente selecionado.", + "workbenchColors.deprecated": "A configuração não é mais experimental e foi renomeada para 'workbench.colorCustomizations'", + "workbenchColors.deprecatedDescription": "Use 'workbench.colorCustomizations'" +} \ No newline at end of file diff --git a/i18n/rus/extensions/markdown/out/extension.i18n.json b/i18n/rus/extensions/markdown/out/extension.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/extensions/markdown/out/extension.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/rus/extensions/merge-conflict/out/codelensProvider.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/rus/extensions/merge-conflict/out/commandHandler.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/extensions/merge-conflict/out/commandHandler.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/rus/extensions/merge-conflict/out/mergeDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/extensions/merge-conflict/package.i18n.json b/i18n/rus/extensions/merge-conflict/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/extensions/merge-conflict/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/extensions/npm/package.i18n.json b/i18n/rus/extensions/npm/package.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/extensions/npm/package.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/rus/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index af5b0c29d70..32fb4e4b4cd 100644 --- a/i18n/rus/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/rus/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,8 +6,6 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "Изображение слишком велико для отображения в редакторе. ", - "resourceOpenExternalButton": "Открыть изображение", - "resourceOpenExternalText": " с помощью внешней программы?", "nativeBinaryError": "Файл не будет отображен в редакторе, так как он двоичный, очень большой или использует неподдерживаемую кодировку текста.", "sizeB": "{0} Б", "sizeKB": "{0} КБ", diff --git a/i18n/rus/src/vs/code/electron-main/menus.i18n.json b/i18n/rus/src/vs/code/electron-main/menus.i18n.json index 2caee2db03b..68b593f2118 100644 --- a/i18n/rus/src/vs/code/electron-main/menus.i18n.json +++ b/i18n/rus/src/vs/code/electron-main/menus.i18n.json @@ -14,6 +14,7 @@ "mHelp": "&&Справка", "miNewWindow": "&&Новое окно", "mAbout": "О программе {0}", + "mServices": "Службы", "mHide": "Скрыть {0}", "mHideOthers": "Скрыть другие", "mShowAll": "Показать все", @@ -69,6 +70,7 @@ "miSmartSelectShrink": "&&Сжать выделение", "miViewExplorer": "Проводник", "miViewSearch": "Поиск", + "miViewSCM": "S&&CM", "miViewDebug": "Отладка", "miViewExtensions": "Р&&асширения", "miToggleOutput": "Вывод", diff --git a/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json index 9b6838aa665..53078d0a5b6 100644 --- a/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/rus/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -40,7 +40,6 @@ "formatOnType": "Управляет параметром, определяющим, должен ли редактор автоматически форматировать строку после ввода.", "formatOnPaste": "Определяет, будет ли редактор автоматически форматировать вставленное содержимое. Модуль форматирования должен быть доступен и иметь возможность форматировать диапазон в документе.", "suggestOnTriggerCharacters": "Определяет, должны ли при вводе триггерных символов автоматически отображаться предложения.", - "acceptSuggestionOnEnter": "Определяет, будут ли предложения приниматься клавишей ВВОД в дополнение к клавише TAB. Это помогает избежать неоднозначности между вставкой новых строк и принятием предложений.", "acceptSuggestionOnCommitCharacter": "Определяет, будут ли предложения приниматься символами фиксации. Например, в JavaScript точка с запятой (\";\") может быть символом фиксации, принимающим предложение и вводящим данный символ.", "snippetSuggestions": "Управляет отображением фрагментов вместе с другими предложениями и их сортировкой.", "emptySelectionClipboard": "Управляет тем, копируется ли текущая строка при копировании без выделения.", diff --git a/i18n/rus/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/rus/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json new file mode 100644 index 00000000000..e61942e5d18 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "noResultWord": "Определение для \"{0}\" не найдено.", + "generic.noResults": "Определения не найдены.", + "meta.title": " — определения {0}", + "actions.goToDecl.label": "Перейти к определению", + "actions.goToDeclToSide.label": "Открыть определение сбоку", + "actions.previewDecl.label": "Показать определение", + "goToImplementation.noResultWord": "Не найдена реализация для \"{0}\".", + "goToImplementation.generic.noResults": "Не найдена реализация.", + "meta.implementations.title": "— {0} реализаций", + "actions.goToImplementation.label": "Перейти к реализации", + "actions.peekImplementation.label": "Показать реализацию", + "goToTypeDefinition.noResultWord": "Не найдено определение типа для \"{0}\".", + "goToTypeDefinition.generic.noResults": "Не найдено определение типа.", + "meta.typeDefinitions.title": "— {0} определений типов", + "actions.goToTypeDefinition.label": "Перейти к определению типа", + "actions.peekTypeDefinition.label": "Показать определение типа" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/rus/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json new file mode 100644 index 00000000000..a403ef380f2 --- /dev/null +++ b/i18n/rus/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{ + "multipleResults": "Щелкните, чтобы отобразить определения ({0})." +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json b/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json index ff2b65c8fab..f2bd599c1b9 100644 --- a/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/electron-browser/main.contribution.i18n.json @@ -7,6 +7,7 @@ "view": "Просмотреть", "help": "Справка", "file": "Файл", + "developer": "Разработчик", "showEditorTabs": "Определяет, должны ли открытые редакторы отображаться на вкладках или нет.", "editorTabCloseButton": "Определяет положение кнопок закрытия вкладок редактора или отключает их, если задано значение off.", "showIcons": "Определяет, должны ли открытые редакторы отображаться со значком. Требует включить тему значков.", diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 8b6ad71cd4e..906d10fee6b 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "disableOtherKeymapsConfirmation": "Отключить другие раскладки клавиатуры, чтобы избежать конфликта между настраиваемыми сочетаниями клавиш?", + "yes": "Да", + "no": "Нет" +} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 952d7106938..6c404cd1796 100644 --- a/i18n/rus/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,7 +16,6 @@ "associations": "Настройте сопоставления файлов с языками (например, \"*.extension\": \"html\"). У них будет приоритет перед заданными по умолчанию сопоставлениями установленных языков.", "encoding": "Кодировка набора символов по умолчанию, используемая при чтении и записи файлов", "autoGuessEncoding": "Если параметр включен, производится попытка определить кодировку набора символов при открытии файлов", - "eol": "Символ конца строки по умолчанию.", "trimTrailingWhitespace": "Если этот параметр включен, при сохранении файла будут удалены концевые пробелы.", "insertFinalNewline": "Если этот параметр включен, при сохранении файла в его конец вставляется финальная новая строка.", "files.autoSave.off": "\"Грязный\" файл не сохраняется автоматически.", diff --git a/i18n/rus/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json b/i18n/rus/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json index ef99a2ea9f3..5ac046256bd 100644 --- a/i18n/rus/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/performance/electron-browser/performance.contribution.i18n.json @@ -5,5 +5,9 @@ // Do not edit this file. It is machine generated. { "slow": "Обнаружен замедленный запуск.", - "slow.detail": "Сожалеем, что у вас произошел замедленный запуск. Перезапустите \"{0}\" с включенным профилированием и отправьте профили нам, чтобы мы могли ускорить загрузку." + "slow.detail": "Сожалеем, что у вас произошел замедленный запуск. Перезапустите \"{0}\" с включенным профилированием и отправьте профили нам, чтобы мы могли ускорить загрузку.", + "prof.message": "Профили успешно созданы.", + "prof.detail": "Создайте проблему и вручную вложите следующие файлы:\n{0}", + "prof.restartAndFileIssue": "Создать проблему и выполнить перезапуск", + "prof.restart": "Перезапустить" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json b/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json index 901720ad5dd..1365e07209b 100644 --- a/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.i18n.json @@ -5,6 +5,11 @@ // Do not edit this file. It is machine generated. { "welcomePage": "Добро пожаловать", + "welcomePage.typeScript": "TypeScript", + "welcomePage.php": "PHP", + "welcomePage.vim": "Vim", + "welcomePage.sublime": "Sublime", + "welcomePage.atom": "Atom", "welcomePage.keymapAlreadyInstalled": "Сочетания клавиш {0} уже установлены.", "welcomePage.willReloadAfterInstallingKeymap": "Окно перезагрузится после установки сочетаний клавиш {0}.", "welcomePage.installingKeymap": "Устанавливаются сочетания клавиш {0}...", From fc59debe991a0d6ed546d02a47a97d1a312ccc47 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 25 May 2017 08:05:53 +0200 Subject: [PATCH 1037/1164] theming - remove hardcoded list color in keybindings editor --- .../browser/media/keybindingsEditor.css | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css b/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css index 29b4fe0a8d1..9932877ef4d 100644 --- a/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css +++ b/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css @@ -68,20 +68,6 @@ display: flex; } -.keybindings-editor > .keybindings-body .keybindings-list-container .monaco-list-row.keybindings-list-header.focused, -.keybindings-editor > .keybindings-body .keybindings-list-container .monaco-list-row.keybindings-list-header.selected, -.keybindings-editor > .keybindings-body .keybindings-list-container .monaco-list-row.keybindings-list-header:hover, -.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row.keybindings-list-header, -.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row.even:not(.focused):not(.selected):not(:hover), -.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:not(:focus) .monaco-list-row.focused.even:not(.selected):not(:hover), -.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:not(.focused) .monaco-list-row.focused.even:not(.selected):not(:hover) { - background-color: rgba(130, 130, 130, 0.04); -} - -.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row:hover { - background-color: rgba(128, 128, 128, 0.15); -} - .keybindings-editor > .keybindings-body .keybindings-list-container .monaco-list-row > .header { text-align: left; font-weight: bold; From 27625c21a2036f243ffcb1bc74f080513c9f4341 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 08:44:16 +0200 Subject: [PATCH 1038/1164] [lua] update grammar --- extensions/lua/syntaxes/lua.json | 148 ++++++++++++++---- .../lua/test/colorize-results/test_lua.json | 32 +--- 2 files changed, 123 insertions(+), 57 deletions(-) diff --git a/extensions/lua/syntaxes/lua.json b/extensions/lua/syntaxes/lua.json index 0bde9524ea4..a4da3a43c6a 100644 --- a/extensions/lua/syntaxes/lua.json +++ b/extensions/lua/syntaxes/lua.json @@ -1,39 +1,61 @@ { "comment": "Lua Syntax: version 0.8", "fileTypes": [ - "lua" + "lua", + "p8", + "rockspec", + "luacheckrc", + "lakefile" ], - "firstLineMatch": "\\A#!.*?\\blua\\b", + "firstLineMatch": "\\A#!.*?\\blua(\\d+(\\.\\d+)?)?\\b|\\A--\\s+-\\*-\\s*lua\\s*-\\*-", "keyEquivalent": "^~L", "name": "Lua", "patterns": [ { - "captures": { + "begin": "\\b((local\\b)\\s+)?(function)\\s*(\\s+[a-zA-Z_][a-zA-Z0-9_]*(\\.[a-zA-Z_][a-zA-Z0-9_]*)*(:[a-zA-Z_][a-zA-Z0-9_]*)?\\s*)?(\\()", + "beginCaptures": { "1": { - "name": "keyword.control.lua" - }, - "2": { - "name": "entity.name.function.scope.lua" + "name": "storage.modifier.local.lua" }, "3": { - "name": "entity.name.function.lua" + "name": "keyword.control.lua" }, "4": { - "name": "punctuation.definition.parameters.begin.lua" + "name": "entity.name.function.lua" }, "5": { - "name": "variable.parameter.function.lua" - }, - "6": { + "name": "punctuation.definition.parameters.begin.lua" + } + }, + "end": "\\)", + "endCaptures": { + "0": { "name": "punctuation.definition.parameters.end.lua" } }, - "match": "\\b(function)(?:\\s+([a-zA-Z_.:]+[.:])?([a-zA-Z_]\\w*)\\s*)?(\\()([^)]*)(\\))", - "name": "meta.function.lua" + "name": "meta.function.lua", + "patterns": [ + { + "match": "[a-zA-Z_][a-zA-Z0-9_]*", + "name": "variable.parameter.function.lua" + } + ] }, { - "match": "(? Date: Thu, 25 May 2017 09:44:01 +0200 Subject: [PATCH 1039/1164] How to configure a window (also for reload case)? (fixes #27192) --- src/vs/code/electron-main/menus.ts | 20 +++++- src/vs/code/electron-main/window.ts | 10 +-- src/vs/code/electron-main/windows.ts | 84 +---------------------- src/vs/code/node/keyboard.ts | 70 +++++++++++++++++++ src/vs/workbench/electron-browser/main.ts | 10 ++- 5 files changed, 100 insertions(+), 94 deletions(-) create mode 100644 src/vs/code/node/keyboard.ts diff --git a/src/vs/code/electron-main/menus.ts b/src/vs/code/electron-main/menus.ts index 91ccab243c9..249722e754c 100644 --- a/src/vs/code/electron-main/menus.ts +++ b/src/vs/code/electron-main/menus.ts @@ -9,7 +9,7 @@ import * as nls from 'vs/nls'; import { isMacintosh, isLinux, isWindows, language } from 'vs/base/common/platform'; import * as arrays from 'vs/base/common/arrays'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { ipcMain as ipc, app, shell, dialog, Menu, MenuItem } from 'electron'; +import { ipcMain as ipc, app, shell, dialog, Menu, MenuItem, BrowserWindow } from 'electron'; import { OpenContext } from 'vs/code/common/windows'; import { IWindowsMainService } from 'vs/code/electron-main/windows'; import { VSCodeWindow } from 'vs/code/electron-main/window'; @@ -908,7 +908,7 @@ export class VSCodeMenu { label: this.mnemonicLabel(nls.localize({ key: 'miAccessibilityOptions', comment: ['&& denotes a mnemonic'] }, "Accessibility &&Options")), accelerator: null, click: () => { - this.windowsService.openAccessibilityOptions(); + this.openAccessibilityOptions(); } }, false)); @@ -974,6 +974,22 @@ export class VSCodeMenu { } } + private openAccessibilityOptions(): void { + let win = new BrowserWindow({ + alwaysOnTop: true, + skipTaskbar: true, + resizable: false, + width: 450, + height: 300, + show: true, + title: nls.localize('accessibilityOptionsWindowTitle', "Accessibility Options") + }); + + win.setMenuBarVisibility(false); + + win.loadURL('chrome://accessibility'); + } + private getUpdateMenuItems(): Electron.MenuItem[] { switch (this.updateService.state) { case UpdateState.Uninitialized: diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 7cd1f647083..4b1840c8642 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -22,7 +22,7 @@ import product from 'vs/platform/node/product'; import { getCommonHTTPHeaders } from 'vs/platform/environment/node/http'; import { IWindowSettings, MenuBarVisibility } from 'vs/platform/windows/common/windows'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; - +import { KeyboardLayoutMonitor } from "vs/code/node/keyboard"; export interface IWindowState { width?: number; @@ -82,10 +82,7 @@ export interface IWindowConfiguration extends ParsedArgs { * The physical keyboard is of ISO type (on OSX). */ isISOKeyboard?: boolean; - /** - * Accessibility support is enabled. - */ - accessibilitySupportEnabled?: boolean; + zoomLevel?: number; fullscreen?: boolean; highContrast?: boolean; @@ -558,6 +555,9 @@ export class VSCodeWindow { windowConfiguration.highContrast = platform.isWindows && systemPreferences.isInvertedColorScheme() && (!windowConfig || windowConfig.autoDetectHighContrast); windowConfiguration.accessibilitySupport = app.isAccessibilitySupportEnabled(); + // Set Keyboard Config + windowConfiguration.isISOKeyboard = KeyboardLayoutMonitor.INSTANCE.isISOKeyboard(); + // Theme windowConfiguration.baseTheme = this.getBaseTheme(); windowConfiguration.backgroundColor = this.getBackgroundColor(); diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index 72d1091e196..b4324486c62 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -31,8 +31,7 @@ import product from 'vs/platform/node/product'; import { OpenContext } from 'vs/code/common/windows'; import { ITelemetryService, ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; import { isParent, isEqual, isEqualOrParent } from 'vs/platform/files/common/files'; -import * as nativeKeymap from 'native-keymap'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { KeyboardLayoutMonitor } from "vs/code/node/keyboard"; enum WindowError { UNRESPONSIVE, @@ -107,7 +106,6 @@ export interface IWindowsMainService { openFileFolderPicker(forceNewWindow?: boolean, data?: ITelemetryData): void; openFilePicker(forceNewWindow?: boolean, path?: string, window?: VSCodeWindow, data?: ITelemetryData): void; openFolderPicker(forceNewWindow?: boolean, window?: VSCodeWindow, data?: ITelemetryData): void; - openAccessibilityOptions(): void; focusLastActive(cli: ParsedArgs, context: OpenContext): VSCodeWindow; getLastActiveWindow(): VSCodeWindow; findWindow(workspacePath: string, filePath?: string, extensionDevelopmentPath?: string): VSCodeWindow; @@ -343,6 +341,7 @@ export class WindowsManager implements IWindowsMainService { } private onBroadcast(event: string, payload: any): void { + // Theme changes if (event === 'vscode:changeColorTheme' && typeof payload === 'string') { @@ -737,8 +736,6 @@ export class WindowsManager implements IWindowsMainService { configuration.filesToCreate = filesToCreate; configuration.filesToDiff = filesToDiff; configuration.nodeCachedDataDir = this.environmentService.nodeCachedDataDir; - configuration.isISOKeyboard = KeyboardLayoutMonitor.INSTANCE.isISOKeyboard(); - configuration.accessibilitySupportEnabled = app.isAccessibilitySupportEnabled(); return configuration; } @@ -1028,22 +1025,6 @@ export class WindowsManager implements IWindowsMainService { this.doPickAndOpen({ pickFolders: true, forceNewWindow, window }, 'openFolder', data); } - public openAccessibilityOptions(): void { - let win = new BrowserWindow({ - alwaysOnTop: true, - skipTaskbar: true, - resizable: false, - width: 450, - height: 300, - show: true, - title: nls.localize('accessibilityOptionsWindowTitle', "Accessibility Options") - }); - - win.setMenuBarVisibility(false); - - win.loadURL('chrome://accessibility'); - } - private doPickAndOpen(options: INativeOpenDialogOptions, eventName: string, data?: ITelemetryData): void { this.getFileOrFolderPaths(options, (paths: string[]) => { const nOfPaths = paths ? paths.length : 0; @@ -1338,63 +1319,4 @@ export class WindowsManager implements IWindowsMainService { }, 10 /* delay to unwind callback stack (IPC) */); } } -} - -class KeyboardLayoutMonitor { - - public static INSTANCE = new KeyboardLayoutMonitor(); - - private _emitter: Emitter; - private _registered: boolean; - private _isISOKeyboard: boolean; - - private constructor() { - this._emitter = new Emitter(); - this._registered = false; - this._isISOKeyboard = this._readIsISOKeyboard(); - } - - public onDidChangeKeyboardLayout(callback: (isISOKeyboard: boolean) => void): IDisposable { - if (!this._registered) { - this._registered = true; - - nativeKeymap.onDidChangeKeyboardLayout(() => { - this._emitter.fire(this._isISOKeyboard); - }); - - if (platform.isMacintosh) { - // See https://github.com/Microsoft/vscode/issues/24153 - // On OSX, on ISO keyboards, Chromium swaps the scan codes - // of IntlBackslash and Backquote. - // - // The C++ methods can give the current keyboard type (ISO or not) - // only after a NSEvent was handled. - // - // We therefore poll. - setInterval(() => { - let newValue = this._readIsISOKeyboard(); - if (this._isISOKeyboard === newValue) { - // no change - return; - } - - this._isISOKeyboard = newValue; - this._emitter.fire(this._isISOKeyboard); - - }, 3000); - } - } - return this._emitter.event(callback); - } - - private _readIsISOKeyboard(): boolean { - if (platform.isMacintosh) { - return nativeKeymap.isISOKeyboard(); - } - return false; - } - - public isISOKeyboard(): boolean { - return this._isISOKeyboard; - } -} +} \ No newline at end of file diff --git a/src/vs/code/node/keyboard.ts b/src/vs/code/node/keyboard.ts new file mode 100644 index 00000000000..d2f968371ef --- /dev/null +++ b/src/vs/code/node/keyboard.ts @@ -0,0 +1,70 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as nativeKeymap from 'native-keymap'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import { isMacintosh } from "vs/base/common/platform"; +import { Emitter } from "vs/base/common/event"; + +export class KeyboardLayoutMonitor { + + public static readonly INSTANCE = new KeyboardLayoutMonitor(); + + private _emitter: Emitter; + private _registered: boolean; + private _isISOKeyboard: boolean; + + private constructor() { + this._emitter = new Emitter(); + this._registered = false; + this._isISOKeyboard = this._readIsISOKeyboard(); + } + + public onDidChangeKeyboardLayout(callback: (isISOKeyboard: boolean) => void): IDisposable { + if (!this._registered) { + this._registered = true; + + nativeKeymap.onDidChangeKeyboardLayout(() => { + this._emitter.fire(this._isISOKeyboard); + }); + + if (isMacintosh) { + // See https://github.com/Microsoft/vscode/issues/24153 + // On OSX, on ISO keyboards, Chromium swaps the scan codes + // of IntlBackslash and Backquote. + // + // The C++ methods can give the current keyboard type (ISO or not) + // only after a NSEvent was handled. + // + // We therefore poll. + setInterval(() => { + let newValue = this._readIsISOKeyboard(); + if (this._isISOKeyboard === newValue) { + // no change + return; + } + + this._isISOKeyboard = newValue; + this._emitter.fire(this._isISOKeyboard); + + }, 3000); + } + } + return this._emitter.event(callback); + } + + private _readIsISOKeyboard(): boolean { + if (isMacintosh) { + return nativeKeymap.isISOKeyboard(); + } + return false; + } + + public isISOKeyboard(): boolean { + return this._isISOKeyboard; + } +} diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index fb179f3196c..b20a6fd422a 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -42,10 +42,7 @@ export interface IWindowConfiguration extends ParsedArgs, IOpenFileRequest { */ isISOKeyboard?: boolean; - /** - * Accessibility support is enabled. - */ - accessibilitySupportEnabled?: boolean; + accessibilitySupport?: boolean; appRoot: string; execPath: string; @@ -62,15 +59,16 @@ export function startup(configuration: IWindowConfiguration): TPromise { // Ensure others can listen to zoom level changes browser.setZoomFactor(webFrame.getZoomFactor()); + // See https://github.com/Microsoft/vscode/issues/26151 // Can be trusted because we are not setting it ourselves. - browser.setZoomLevel(webFrame.getZoomLevel(), /*isTrusted*/true); + browser.setZoomLevel(webFrame.getZoomLevel(), true /* isTrusted */); browser.setFullscreen(!!configuration.fullscreen); KeyboardMapperFactory.INSTANCE._onKeyboardLayoutChanged(configuration.isISOKeyboard); - browser.setAccessibilitySupport(configuration.accessibilitySupportEnabled ? platform.AccessibilitySupport.Enabled : platform.AccessibilitySupport.Disabled); + browser.setAccessibilitySupport(configuration.accessibilitySupport ? platform.AccessibilitySupport.Enabled : platform.AccessibilitySupport.Disabled); // Setup Intl comparer.setFileNameComparer(new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' })); From a9486e406f22836b9ca6fac6c113ea9116f70cbc Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 25 May 2017 09:53:23 +0200 Subject: [PATCH 1040/1164] linting: convert double quote imports to single quote --- extensions/typescript/src/utils/logger.ts | 2 +- extensions/typescript/src/utils/plugins.ts | 2 +- extensions/typescript/src/utils/telemetry.ts | 2 +- src/vs/base/browser/ui/countBadge/countBadge.ts | 4 ++-- .../base/browser/ui/progressbar/progressbar.ts | 4 ++-- src/vs/base/test/common/json.test.ts | 2 +- src/vs/code/electron-main/window.ts | 2 +- src/vs/code/electron-main/windows.ts | 2 +- src/vs/code/node/keyboard.ts | 4 ++-- .../editor/browser/controller/textAreaHandler.ts | 12 ++++++------ .../editor/browser/controller/textAreaInput.ts | 4 ++-- src/vs/editor/browser/view/viewController.ts | 2 +- src/vs/editor/browser/view/viewImpl.ts | 2 +- .../viewParts/editorScrollbar/editorScrollbar.ts | 2 +- .../editor/browser/viewParts/minimap/minimap.ts | 4 ++-- .../scrollDecoration/scrollDecoration.ts | 4 ++-- src/vs/editor/browser/widget/diffEditorWidget.ts | 2 +- src/vs/editor/common/commonCodeEditor.ts | 4 ++-- src/vs/editor/common/config/fontInfo.ts | 2 +- src/vs/editor/common/controller/accGenerator.ts | 2 +- src/vs/editor/common/controller/coreCommands.ts | 6 +++--- src/vs/editor/common/controller/cursor.ts | 2 +- src/vs/editor/common/controller/cursorCommon.ts | 2 +- .../common/controller/cursorDeleteOperations.ts | 2 +- .../common/controller/cursorTypeOperations.ts | 2 +- .../common/controller/cursorWordOperations.ts | 2 +- src/vs/editor/common/model/textModel.ts | 2 +- src/vs/editor/common/model/textModelSearch.ts | 2 +- .../editor/common/services/modelServiceImpl.ts | 2 +- src/vs/editor/common/standalone/themes.ts | 4 ++-- src/vs/editor/common/view/viewEvents.ts | 2 +- src/vs/editor/common/viewLayout/viewLayout.ts | 2 +- .../common/viewModel/splitLinesCollection.ts | 2 +- src/vs/editor/common/viewModel/viewModel.ts | 6 +++--- src/vs/editor/common/viewModel/viewModelImpl.ts | 2 +- .../bracketMatching/common/bracketMatching.ts | 6 +++--- .../editor/contrib/codelens/browser/codelens.ts | 8 ++++---- .../test/common/lineCommentCommand.test.ts | 6 +++--- src/vs/editor/contrib/dnd/browser/dnd.ts | 2 +- .../editor/contrib/find/common/findController.ts | 2 +- .../contrib/find/common/findDecorations.ts | 2 +- .../contrib/folding/common/foldingModel.ts | 2 +- .../browser/goToDeclarationMouse.ts | 2 +- .../contrib/hover/browser/modesContentHover.ts | 2 +- .../inPlaceReplace/common/inPlaceReplace.ts | 2 +- .../linesOperations/common/linesOperations.ts | 2 +- .../test/common/linesOperations.test.ts | 6 +++--- src/vs/editor/contrib/links/browser/links.ts | 4 ++-- .../contrib/quickOpen/browser/editorQuickOpen.ts | 2 +- .../referenceSearch/browser/referencesWidget.ts | 4 ++-- .../contrib/snippet/browser/snippetSession.ts | 2 +- .../test/browser/snippetController2.old.test.ts | 4 ++-- .../test/browser/snippetController2.test.ts | 2 +- .../snippet/test/browser/snippetSession.test.ts | 2 +- .../wordHighlighter/common/wordHighlighter.ts | 2 +- .../wordOperations/common/wordOperations.ts | 6 +++--- .../test/common/wordOperations.test.ts | 2 +- .../contrib/zoneWidget/browser/zoneWidget.ts | 2 +- src/vs/editor/editor.main.ts | 2 +- .../browser/controller/textAreaState.test.ts | 2 +- .../test/common/commands/commandTestUtils.ts | 2 +- .../test/common/commands/sideEditing.test.ts | 2 +- .../common/config/commonEditorConfig.test.ts | 4 ++-- .../editor/test/common/controller/cursor.test.ts | 10 +++++----- .../common/controller/cursorMoveCommand.test.ts | 2 +- .../test/common/mocks/testConfiguration.ts | 2 +- .../test/common/model/textModelSearch.test.ts | 4 ++-- src/vs/workbench/browser/parts/compositePart.ts | 2 +- .../browser/parts/editor/editorGroupsControl.ts | 2 +- .../browser/parts/editor/webviewEditor.ts | 8 ++++---- .../browser/parts/statusbar/statusbarPart.ts | 2 +- .../workbench/common/editor/rangeDecorations.ts | 2 +- src/vs/workbench/electron-browser/workbench.ts | 8 ++++---- src/vs/workbench/node/extensionPoints.ts | 2 +- .../parts/debug/browser/debugActionItems.ts | 2 +- .../parts/debug/browser/exceptionWidget.ts | 6 +++--- .../electron-browser/debugEditorContribution.ts | 2 +- .../parts/debug/electron-browser/debugHover.ts | 2 +- .../electron-browser/statusbarColorProvider.ts | 2 +- .../actions/expandAbbreviation.ts | 2 +- .../emmet/electron-browser/editorAccessor.ts | 2 +- .../extensions/browser/extensionsActions.ts | 6 +++--- .../parts/feedback/electron-browser/feedback.ts | 6 +++--- .../electron-browser/feedbackStatusbarItem.ts | 2 +- .../parts/files/browser/views/openEditorsView.ts | 2 +- .../parts/markers/browser/markersTreeViewer.ts | 6 +++--- .../preferences/browser/keybindingWidgets.ts | 2 +- .../preferences/browser/keybindingsEditor.ts | 2 +- .../preferences/browser/preferencesEditor.ts | 4 ++-- .../preferences/browser/preferencesRenderers.ts | 2 +- .../preferences/browser/preferencesWidgets.ts | 2 +- .../parts/quickopen/browser/commandsHandler.ts | 2 +- .../scm/electron-browser/dirtydiffDecorator.ts | 10 +++++----- .../parts/search/browser/openFileHandler.ts | 2 +- .../parts/search/browser/searchResultsView.ts | 4 ++-- .../parts/search/browser/searchViewlet.ts | 2 +- src/vs/workbench/parts/search/common/search.ts | 8 ++++---- .../workbench/parts/search/common/searchModel.ts | 2 +- .../snippets/electron-browser/TMSnippets.ts | 2 +- .../electron-browser/terminal.contribution.ts | 2 +- .../electron-browser/terminalConfigHelper.ts | 2 +- .../electron-browser/terminalInstance.ts | 4 ++-- .../terminalConfigHelper.test.ts | 2 +- .../electron-browser/releaseNotesEditor.ts | 2 +- .../editor/test/browser/editorService.test.ts | 2 +- .../themes/electron-browser/colorThemeData.ts | 2 +- .../electron-browser/workbenchThemeService.ts | 2 +- .../test/browser/parts/editor/baseEditor.test.ts | 2 +- .../test/common/editor/editorDiffModel.test.ts | 16 ++++++++-------- 109 files changed, 177 insertions(+), 177 deletions(-) diff --git a/extensions/typescript/src/utils/logger.ts b/extensions/typescript/src/utils/logger.ts index 7f82fb28c96..8e31d66d858 100644 --- a/extensions/typescript/src/utils/logger.ts +++ b/extensions/typescript/src/utils/logger.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { OutputChannel, window } from "vscode"; +import { OutputChannel, window } from 'vscode'; import * as is from './is'; import * as nls from 'vscode-nls'; diff --git a/extensions/typescript/src/utils/plugins.ts b/extensions/typescript/src/utils/plugins.ts index 49f0d93b4b6..23342cc8b31 100644 --- a/extensions/typescript/src/utils/plugins.ts +++ b/extensions/typescript/src/utils/plugins.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { extensions } from "vscode"; +import { extensions } from 'vscode'; export interface TypeScriptServerPlugin { diff --git a/extensions/typescript/src/utils/telemetry.ts b/extensions/typescript/src/utils/telemetry.ts index 5162a0c24d5..b687b11b4ac 100644 --- a/extensions/typescript/src/utils/telemetry.ts +++ b/extensions/typescript/src/utils/telemetry.ts @@ -5,7 +5,7 @@ import * as path from 'path'; import VsCodeTelemetryReporter from 'vscode-extension-telemetry'; -import { Disposable } from "vscode"; +import { Disposable } from 'vscode'; interface IPackageInfo { diff --git a/src/vs/base/browser/ui/countBadge/countBadge.ts b/src/vs/base/browser/ui/countBadge/countBadge.ts index a7fa56efce8..8ff58693925 100644 --- a/src/vs/base/browser/ui/countBadge/countBadge.ts +++ b/src/vs/base/browser/ui/countBadge/countBadge.ts @@ -8,8 +8,8 @@ import 'vs/css!./countBadge'; import { $, append } from 'vs/base/browser/dom'; import { format } from 'vs/base/common/strings'; -import { Color } from "vs/base/common/color"; -import { mixin } from "vs/base/common/objects"; +import { Color } from 'vs/base/common/color'; +import { mixin } from 'vs/base/common/objects'; export interface ICountBadgeOptions extends ICountBadgetyles { count?: number; diff --git a/src/vs/base/browser/ui/progressbar/progressbar.ts b/src/vs/base/browser/ui/progressbar/progressbar.ts index 1287112824b..ea34e06e1cb 100644 --- a/src/vs/base/browser/ui/progressbar/progressbar.ts +++ b/src/vs/base/browser/ui/progressbar/progressbar.ts @@ -11,8 +11,8 @@ import assert = require('vs/base/common/assert'); import { Builder, $ } from 'vs/base/browser/builder'; import DOM = require('vs/base/browser/dom'); import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { Color } from "vs/base/common/color"; -import { mixin } from "vs/base/common/objects"; +import { Color } from 'vs/base/common/color'; +import { mixin } from 'vs/base/common/objects'; const css_done = 'done'; const css_active = 'active'; diff --git a/src/vs/base/test/common/json.test.ts b/src/vs/base/test/common/json.test.ts index 42a0804c113..fe129f08808 100644 --- a/src/vs/base/test/common/json.test.ts +++ b/src/vs/base/test/common/json.test.ts @@ -8,7 +8,7 @@ import * as assert from 'assert'; import { SyntaxKind, createScanner, parse, getLocation, Node, ParseError, parseTree, ParseErrorCode, ParseOptions, Segment, findNodeAtLocation, getNodeValue, ScanError } from 'vs/base/common/json'; -import { getParseErrorMessage } from "vs/base/common/jsonErrorMessages"; +import { getParseErrorMessage } from 'vs/base/common/jsonErrorMessages'; function assertKinds(text: string, ...kinds: SyntaxKind[]): void { var scanner = createScanner(text); diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 4b1840c8642..91d560b50fd 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -22,7 +22,7 @@ import product from 'vs/platform/node/product'; import { getCommonHTTPHeaders } from 'vs/platform/environment/node/http'; import { IWindowSettings, MenuBarVisibility } from 'vs/platform/windows/common/windows'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { KeyboardLayoutMonitor } from "vs/code/node/keyboard"; +import { KeyboardLayoutMonitor } from 'vs/code/node/keyboard'; export interface IWindowState { width?: number; diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index b4324486c62..cc0800f25e6 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -31,7 +31,7 @@ import product from 'vs/platform/node/product'; import { OpenContext } from 'vs/code/common/windows'; import { ITelemetryService, ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; import { isParent, isEqual, isEqualOrParent } from 'vs/platform/files/common/files'; -import { KeyboardLayoutMonitor } from "vs/code/node/keyboard"; +import { KeyboardLayoutMonitor } from 'vs/code/node/keyboard'; enum WindowError { UNRESPONSIVE, diff --git a/src/vs/code/node/keyboard.ts b/src/vs/code/node/keyboard.ts index d2f968371ef..16979fc90c0 100644 --- a/src/vs/code/node/keyboard.ts +++ b/src/vs/code/node/keyboard.ts @@ -7,8 +7,8 @@ import * as nativeKeymap from 'native-keymap'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { isMacintosh } from "vs/base/common/platform"; -import { Emitter } from "vs/base/common/event"; +import { isMacintosh } from 'vs/base/common/platform'; +import { Emitter } from 'vs/base/common/event'; export class KeyboardLayoutMonitor { diff --git a/src/vs/editor/browser/controller/textAreaHandler.ts b/src/vs/editor/browser/controller/textAreaHandler.ts index f9ae737307e..e927fcb4ab1 100644 --- a/src/vs/editor/browser/controller/textAreaHandler.ts +++ b/src/vs/editor/browser/controller/textAreaHandler.ts @@ -18,12 +18,12 @@ import { HorizontalRange, RenderingContext, RestrictedRenderingContext } from 'v import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; import { ViewController } from 'vs/editor/browser/view/viewController'; -import { EndOfLinePreference } from "vs/editor/common/editorCommon"; -import { IKeyboardEvent } from "vs/base/browser/keyboardEvent"; -import { PartFingerprints, PartFingerprint, ViewPart } from "vs/editor/browser/view/viewPart"; -import { Margin } from "vs/editor/browser/viewParts/margin/margin"; -import { LineNumbersOverlay } from "vs/editor/browser/viewParts/lineNumbers/lineNumbers"; -import { BareFontInfo } from "vs/editor/common/config/fontInfo"; +import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; +import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { PartFingerprints, PartFingerprint, ViewPart } from 'vs/editor/browser/view/viewPart'; +import { Margin } from 'vs/editor/browser/viewParts/margin/margin'; +import { LineNumbersOverlay } from 'vs/editor/browser/viewParts/lineNumbers/lineNumbers'; +import { BareFontInfo } from 'vs/editor/common/config/fontInfo'; export interface ITextAreaHandlerHelper { visibleRangeForPositionRelativeToEditor(lineNumber: number, column: number): HorizontalRange; diff --git a/src/vs/editor/browser/controller/textAreaInput.ts b/src/vs/editor/browser/controller/textAreaInput.ts index 757bbf1dd41..e1f99b036e8 100644 --- a/src/vs/editor/browser/controller/textAreaInput.ts +++ b/src/vs/editor/browser/controller/textAreaInput.ts @@ -13,8 +13,8 @@ import { ITypeData, TextAreaState, ITextAreaWrapper } from 'vs/editor/browser/co import * as browser from 'vs/base/browser/browser'; import * as platform from 'vs/base/common/platform'; import * as dom from 'vs/base/browser/dom'; -import { IKeyboardEvent } from "vs/base/browser/keyboardEvent"; -import { FastDomNode } from "vs/base/browser/fastDomNode"; +import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { FastDomNode } from 'vs/base/browser/fastDomNode'; export interface ICompositionData { data: string; diff --git a/src/vs/editor/browser/view/viewController.ts b/src/vs/editor/browser/view/viewController.ts index e05ca74ea60..51beeeade27 100644 --- a/src/vs/editor/browser/view/viewController.ts +++ b/src/vs/editor/browser/view/viewController.ts @@ -12,7 +12,7 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; import { ViewOutgoingEvents } from 'vs/editor/browser/view/viewOutgoingEvents'; import { CoreNavigationCommands, CoreEditorCommand } from 'vs/editor/common/controller/coreCommands'; -import { Configuration } from "vs/editor/browser/config/configuration"; +import { Configuration } from 'vs/editor/browser/config/configuration'; export interface ExecCoreEditorCommandFunc { (editorCommand: CoreEditorCommand, args: any): void; diff --git a/src/vs/editor/browser/view/viewImpl.ts b/src/vs/editor/browser/view/viewImpl.ts index 927c1d19486..2ac56ac2773 100644 --- a/src/vs/editor/browser/view/viewImpl.ts +++ b/src/vs/editor/browser/view/viewImpl.ts @@ -48,7 +48,7 @@ import { EditorScrollbar } from 'vs/editor/browser/viewParts/editorScrollbar/edi import { Minimap } from 'vs/editor/browser/viewParts/minimap/minimap'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { IThemeService, getThemeTypeSelector } from 'vs/platform/theme/common/themeService'; -import { Cursor } from "vs/editor/common/controller/cursor"; +import { Cursor } from 'vs/editor/common/controller/cursor'; export interface IContentWidgetData { widget: editorBrowser.IContentWidget; diff --git a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts index 11d53265128..89aee09559d 100644 --- a/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts +++ b/src/vs/editor/browser/viewParts/editorScrollbar/editorScrollbar.ts @@ -13,7 +13,7 @@ import { ViewContext } from 'vs/editor/common/view/viewContext'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; import { FastDomNode, createFastDomNode } from 'vs/base/browser/fastDomNode'; -import { getThemeTypeSelector } from "vs/platform/theme/common/themeService"; +import { getThemeTypeSelector } from 'vs/platform/theme/common/themeService'; export class EditorScrollbar extends ViewPart { diff --git a/src/vs/editor/browser/viewParts/minimap/minimap.ts b/src/vs/editor/browser/viewParts/minimap/minimap.ts index 9c922137ede..46d8dde55d5 100644 --- a/src/vs/editor/browser/viewParts/minimap/minimap.ts +++ b/src/vs/editor/browser/viewParts/minimap/minimap.ts @@ -25,8 +25,8 @@ import { RGBA } from 'vs/base/common/color'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { GlobalMouseMoveMonitor, IStandardMouseMoveEventData, standardMouseMoveMerger } from 'vs/base/browser/globalMouseMoveMonitor'; import * as platform from 'vs/base/common/platform'; -import { registerThemingParticipant } from "vs/platform/theme/common/themeService"; -import { scrollbarSliderBackground, scrollbarSliderHoverBackground, scrollbarSliderActiveBackground, scrollbarShadow } from "vs/platform/theme/common/colorRegistry"; +import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { scrollbarSliderBackground, scrollbarSliderHoverBackground, scrollbarSliderActiveBackground, scrollbarShadow } from 'vs/platform/theme/common/colorRegistry'; const enum RenderMinimap { None = 0, diff --git a/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts b/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts index 92134f722a1..e4086a1e00a 100644 --- a/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts +++ b/src/vs/editor/browser/viewParts/scrollDecoration/scrollDecoration.ts @@ -11,8 +11,8 @@ import { ViewPart } from 'vs/editor/browser/view/viewPart'; import { ViewContext } from 'vs/editor/common/view/viewContext'; import { RenderingContext, RestrictedRenderingContext } from 'vs/editor/common/view/renderingContext'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { registerThemingParticipant } from "vs/platform/theme/common/themeService"; -import { scrollbarShadow } from "vs/platform/theme/common/colorRegistry"; +import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { scrollbarShadow } from 'vs/platform/theme/common/colorRegistry'; export class ScrollDecorationViewPart extends ViewPart { diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index c655b958451..556c843ce15 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -36,7 +36,7 @@ import { scrollbarShadow, diffInserted, diffRemoved, defaultInsertColor, default import { Color } from 'vs/base/common/color'; import { OverviewRulerZone } from 'vs/editor/common/view/overviewZoneManager'; import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; interface IEditorDiffDecorations { decorations: editorCommon.IModelDeltaDecoration[]; diff --git a/src/vs/editor/common/commonCodeEditor.ts b/src/vs/editor/common/commonCodeEditor.ts index d8b808d3f06..c5285a83724 100644 --- a/src/vs/editor/common/commonCodeEditor.ts +++ b/src/vs/editor/common/commonCodeEditor.ts @@ -28,8 +28,8 @@ import { import * as editorOptions from 'vs/editor/common/config/editorOptions'; import { ICursorPositionChangedEvent, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { CommonEditorRegistry } from "vs/editor/common/editorCommonExtensions"; -import { VerticalRevealType } from "vs/editor/common/view/viewEvents"; +import { CommonEditorRegistry } from 'vs/editor/common/editorCommonExtensions'; +import { VerticalRevealType } from 'vs/editor/common/view/viewEvents'; let EDITOR_ID = 0; diff --git a/src/vs/editor/common/config/fontInfo.ts b/src/vs/editor/common/config/fontInfo.ts index 7740776bebf..9ab9a11d2a9 100644 --- a/src/vs/editor/common/config/fontInfo.ts +++ b/src/vs/editor/common/config/fontInfo.ts @@ -6,7 +6,7 @@ import * as platform from 'vs/base/common/platform'; import { EditorZoom } from 'vs/editor/common/config/editorZoom'; -import { EDITOR_FONT_DEFAULTS } from "vs/editor/common/config/editorOptions"; +import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; /** * Determined from empirical observations. diff --git a/src/vs/editor/common/controller/accGenerator.ts b/src/vs/editor/common/controller/accGenerator.ts index 6f6bb813e6b..ca556f79d2d 100644 --- a/src/vs/editor/common/controller/accGenerator.ts +++ b/src/vs/editor/common/controller/accGenerator.ts @@ -8,7 +8,7 @@ import { Position } from 'vs/editor/common/core/position'; import * as nls from 'vs/nls'; import { Range } from 'vs/editor/common/core/range'; -import { IModel } from "vs/editor/common/editorCommon"; +import { IModel } from 'vs/editor/common/editorCommon'; import { Selection } from 'vs/editor/common/core/selection'; export class ScreenReaderMessageGenerator { diff --git a/src/vs/editor/common/controller/coreCommands.ts b/src/vs/editor/common/controller/coreCommands.ts index 639022470cd..e0a3cd88f63 100644 --- a/src/vs/editor/common/controller/coreCommands.ts +++ b/src/vs/editor/common/controller/coreCommands.ts @@ -23,9 +23,9 @@ import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import * as types from 'vs/base/common/types'; import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; import { IEditorService } from 'vs/platform/editor/common/editor'; -import { TypeOperations } from "vs/editor/common/controller/cursorTypeOperations"; -import { DeleteOperations } from "vs/editor/common/controller/cursorDeleteOperations"; -import { VerticalRevealType } from "vs/editor/common/view/viewEvents"; +import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations'; +import { DeleteOperations } from 'vs/editor/common/controller/cursorDeleteOperations'; +import { VerticalRevealType } from 'vs/editor/common/view/viewEvents'; const CORE_WEIGHT = KeybindingsRegistry.WEIGHT.editorCore(); diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index 305894d79b6..0c203347cce 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -18,7 +18,7 @@ import { DeleteOperations } from 'vs/editor/common/controller/cursorDeleteOperat import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations'; import { TextModelEventType, ModelRawContentChangedEvent, RawContentChangedType } from 'vs/editor/common/model/textModelEvents'; import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; -import { IViewModel } from "vs/editor/common/viewModel/viewModel"; +import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import Event, { Emitter } from 'vs/base/common/event'; // import { ScreenReaderMessageGenerator } from "vs/editor/common/controller/accGenerator"; diff --git a/src/vs/editor/common/controller/cursorCommon.ts b/src/vs/editor/common/controller/cursorCommon.ts index e82708d17da..55e00ad1e43 100644 --- a/src/vs/editor/common/controller/cursorCommon.ts +++ b/src/vs/editor/common/controller/cursorCommon.ts @@ -18,7 +18,7 @@ import { IAutoClosingPair } from 'vs/editor/common/modes/languageConfiguration'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; import { IViewModel } from 'vs/editor/common/viewModel/viewModel'; import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; -import { VerticalRevealType } from "vs/editor/common/view/viewEvents"; +import { VerticalRevealType } from 'vs/editor/common/view/viewEvents'; export interface IColumnSelectData { toViewLineNumber: number; diff --git a/src/vs/editor/common/controller/cursorDeleteOperations.ts b/src/vs/editor/common/controller/cursorDeleteOperations.ts index c968bb49f76..7951ab91b83 100644 --- a/src/vs/editor/common/controller/cursorDeleteOperations.ts +++ b/src/vs/editor/common/controller/cursorDeleteOperations.ts @@ -10,7 +10,7 @@ import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { MoveOperations } from 'vs/editor/common/controller/cursorMoveOperations'; import * as strings from 'vs/base/common/strings'; -import { ICommand } from "vs/editor/common/editorCommon"; +import { ICommand } from 'vs/editor/common/editorCommon'; export class DeleteOperations { diff --git a/src/vs/editor/common/controller/cursorTypeOperations.ts b/src/vs/editor/common/controller/cursorTypeOperations.ts index cb2b2184669..6abac0a543e 100644 --- a/src/vs/editor/common/controller/cursorTypeOperations.ts +++ b/src/vs/editor/common/controller/cursorTypeOperations.ts @@ -16,7 +16,7 @@ import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageCo import { IndentAction } from 'vs/editor/common/modes/languageConfiguration'; import { SurroundSelectionCommand } from 'vs/editor/common/commands/surroundSelectionCommand'; import { IElectricAction } from 'vs/editor/common/modes/supports/electricCharacter'; -import { getMapForWordSeparators, WordCharacterClass } from "vs/editor/common/controller/wordCharacterClassifier"; +import { getMapForWordSeparators, WordCharacterClass } from 'vs/editor/common/controller/wordCharacterClassifier'; export class TypeOperations { diff --git a/src/vs/editor/common/controller/cursorWordOperations.ts b/src/vs/editor/common/controller/cursorWordOperations.ts index 305cfe68392..3666961a2a2 100644 --- a/src/vs/editor/common/controller/cursorWordOperations.ts +++ b/src/vs/editor/common/controller/cursorWordOperations.ts @@ -6,7 +6,7 @@ import { SingleCursorState, CursorConfiguration, ICursorSimpleModel } from 'vs/editor/common/controller/cursorCommon'; import { Position } from 'vs/editor/common/core/position'; -import { WordCharacterClassifier, WordCharacterClass, getMapForWordSeparators } from "vs/editor/common/controller/wordCharacterClassifier"; +import { WordCharacterClassifier, WordCharacterClass, getMapForWordSeparators } from 'vs/editor/common/controller/wordCharacterClassifier'; import * as strings from 'vs/base/common/strings'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 0d7ec1065b4..d15842430f3 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -11,7 +11,7 @@ import { Range, IRange } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { ModelLine } from 'vs/editor/common/model/modelLine'; import { guessIndentation } from 'vs/editor/common/model/indentationGuesser'; -import { EDITOR_MODEL_DEFAULTS } from "vs/editor/common/config/editorOptions"; +import { EDITOR_MODEL_DEFAULTS } from 'vs/editor/common/config/editorOptions'; import { PrefixSumComputer } from 'vs/editor/common/viewModel/prefixSumComputer'; import { IndentRange, computeRanges } from 'vs/editor/common/model/indentRanges'; import { TextModelSearch, SearchParams } from 'vs/editor/common/model/textModelSearch'; diff --git a/src/vs/editor/common/model/textModelSearch.ts b/src/vs/editor/common/model/textModelSearch.ts index d19ad9e608c..af265935776 100644 --- a/src/vs/editor/common/model/textModelSearch.ts +++ b/src/vs/editor/common/model/textModelSearch.ts @@ -10,7 +10,7 @@ import { Range } from 'vs/editor/common/core/range'; import { FindMatch, EndOfLinePreference } from 'vs/editor/common/editorCommon'; import { CharCode } from 'vs/base/common/charCode'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { getMapForWordSeparators, WordCharacterClassifier, WordCharacterClass } from "vs/editor/common/controller/wordCharacterClassifier"; +import { getMapForWordSeparators, WordCharacterClassifier, WordCharacterClass } from 'vs/editor/common/controller/wordCharacterClassifier'; const LIMIT_FIND_COUNT = 999; diff --git a/src/vs/editor/common/services/modelServiceImpl.ts b/src/vs/editor/common/services/modelServiceImpl.ts index 5fee6ded32a..5bcb68eba4b 100644 --- a/src/vs/editor/common/services/modelServiceImpl.ts +++ b/src/vs/editor/common/services/modelServiceImpl.ts @@ -21,7 +21,7 @@ import { IMode, LanguageIdentifier } from 'vs/editor/common/modes'; import { IModelService } from 'vs/editor/common/services/modelService'; import * as platform from 'vs/base/common/platform'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { EDITOR_MODEL_DEFAULTS } from "vs/editor/common/config/editorOptions"; +import { EDITOR_MODEL_DEFAULTS } from 'vs/editor/common/config/editorOptions'; import { PLAINTEXT_LANGUAGE_IDENTIFIER } from 'vs/editor/common/modes/modesRegistry'; import { IRawTextSource, TextSource, RawTextSource } from 'vs/editor/common/model/textSource'; import * as textModelEvents from 'vs/editor/common/model/textModelEvents'; diff --git a/src/vs/editor/common/standalone/themes.ts b/src/vs/editor/common/standalone/themes.ts index a97a9fab1ee..8093472bba8 100644 --- a/src/vs/editor/common/standalone/themes.ts +++ b/src/vs/editor/common/standalone/themes.ts @@ -6,8 +6,8 @@ 'use strict'; import { IStandaloneThemeData } from 'vs/editor/common/services/standaloneThemeService'; -import { editorBackground, editorForeground, editorSelectionHighlight, editorInactiveSelection } from "vs/platform/theme/common/colorRegistry"; -import { editorIndentGuides } from "vs/editor/common/view/editorColorRegistry"; +import { editorBackground, editorForeground, editorSelectionHighlight, editorInactiveSelection } from 'vs/platform/theme/common/colorRegistry'; +import { editorIndentGuides } from 'vs/editor/common/view/editorColorRegistry'; /* -------------------------------- Begin vs theme -------------------------------- */ export const vs: IStandaloneThemeData = { diff --git a/src/vs/editor/common/view/viewEvents.ts b/src/vs/editor/common/view/viewEvents.ts index f6696746fbf..72fc6b41fbe 100644 --- a/src/vs/editor/common/view/viewEvents.ts +++ b/src/vs/editor/common/view/viewEvents.ts @@ -9,7 +9,7 @@ import { Selection } from 'vs/editor/common/core/selection'; import { ScrollEvent } from 'vs/base/common/scrollable'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; import * as errors from 'vs/base/common/errors'; -import { IDisposable, Disposable } from "vs/base/common/lifecycle"; +import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; export const enum ViewEventType { ViewConfigurationChanged = 1, diff --git a/src/vs/editor/common/viewLayout/viewLayout.ts b/src/vs/editor/common/viewLayout/viewLayout.ts index e6a9d763d29..4af8cbd5235 100644 --- a/src/vs/editor/common/viewLayout/viewLayout.ts +++ b/src/vs/editor/common/viewLayout/viewLayout.ts @@ -12,7 +12,7 @@ import { IViewLayout, IViewWhitespaceViewportData, Viewport } from 'vs/editor/co import { IPartialViewLinesViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData'; import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; import Event from 'vs/base/common/event'; -import { IConfigurationChangedEvent } from "vs/editor/common/config/editorOptions"; +import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; export class ViewLayout extends Disposable implements IViewLayout { diff --git a/src/vs/editor/common/viewModel/splitLinesCollection.ts b/src/vs/editor/common/viewModel/splitLinesCollection.ts index 72caeb160e8..7c40b262f09 100644 --- a/src/vs/editor/common/viewModel/splitLinesCollection.ts +++ b/src/vs/editor/common/viewModel/splitLinesCollection.ts @@ -12,7 +12,7 @@ import { PrefixSumComputerWithCache } from 'vs/editor/common/viewModel/prefixSum import { ViewLineData } from 'vs/editor/common/viewModel/viewModel'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { WrappingIndent } from 'vs/editor/common/config/editorOptions'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export class OutputPosition { _outputPositionBrand: void; diff --git a/src/vs/editor/common/viewModel/viewModel.ts b/src/vs/editor/common/viewModel/viewModel.ts index ffb43fadd6a..6372d3a1415 100644 --- a/src/vs/editor/common/viewModel/viewModel.ts +++ b/src/vs/editor/common/viewModel/viewModel.ts @@ -11,9 +11,9 @@ import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ViewEvent, IViewEventListener } from 'vs/editor/common/view/viewEvents'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { Scrollable } from "vs/base/common/scrollable"; -import { IPartialViewLinesViewportData } from "vs/editor/common/viewLayout/viewLinesViewportData"; -import { IEditorWhitespace } from "vs/editor/common/viewLayout/whitespaceComputer"; +import { Scrollable } from 'vs/base/common/scrollable'; +import { IPartialViewLinesViewportData } from 'vs/editor/common/viewLayout/viewLinesViewportData'; +import { IEditorWhitespace } from 'vs/editor/common/viewLayout/whitespaceComputer'; export interface IViewWhitespaceViewportData { readonly id: number; diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index be7b24bb828..a7a7297e881 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -19,7 +19,7 @@ import * as viewEvents from 'vs/editor/common/view/viewEvents'; import { MinimapTokensColorTracker } from 'vs/editor/common/view/minimapCharRenderer'; import * as textModelEvents from 'vs/editor/common/model/textModelEvents'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; -import { CharacterHardWrappingLineMapperFactory } from "vs/editor/common/viewModel/characterHardWrappingLineMapper"; +import { CharacterHardWrappingLineMapperFactory } from 'vs/editor/common/viewModel/characterHardWrappingLineMapper'; import { ViewLayout } from 'vs/editor/common/viewLayout/viewLayout'; export class CoordinatesConverter implements ICoordinatesConverter { diff --git a/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts b/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts index a3443fa79fd..7b79df152e7 100644 --- a/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts +++ b/src/vs/editor/contrib/bracketMatching/common/bracketMatching.ts @@ -14,9 +14,9 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { editorAction, commonEditorContribution, ServicesAccessor, EditorAction } from 'vs/editor/common/editorCommonExtensions'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { registerThemingParticipant } from "vs/platform/theme/common/themeService"; -import { editorBracketMatchBackground, editorBracketMatchBorder } from "vs/editor/common/view/editorColorRegistry"; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { editorBracketMatchBackground, editorBracketMatchBorder } from 'vs/editor/common/view/editorColorRegistry'; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; @editorAction class SelectBracketAction extends EditorAction { diff --git a/src/vs/editor/contrib/codelens/browser/codelens.ts b/src/vs/editor/contrib/codelens/browser/codelens.ts index 84fcda05eb1..2c7e6ff341c 100644 --- a/src/vs/editor/contrib/codelens/browser/codelens.ts +++ b/src/vs/editor/contrib/codelens/browser/codelens.ts @@ -22,10 +22,10 @@ import * as editorBrowser from 'vs/editor/browser/editorBrowser'; import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; import { ICodeLensData, getCodeLensData } from '../common/codelens'; import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions'; -import { editorCodeLensForeground } from "vs/editor/common/view/editorColorRegistry"; -import { registerThemingParticipant } from "vs/platform/theme/common/themeService"; -import { editorActiveLinkForeground } from "vs/platform/theme/common/colorRegistry"; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { editorCodeLensForeground } from 'vs/editor/common/view/editorColorRegistry'; +import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; class CodeLensViewZone implements editorBrowser.IViewZone { diff --git a/src/vs/editor/contrib/comment/test/common/lineCommentCommand.test.ts b/src/vs/editor/contrib/comment/test/common/lineCommentCommand.test.ts index 1326d8bda33..64d900f1dd7 100644 --- a/src/vs/editor/contrib/comment/test/common/lineCommentCommand.test.ts +++ b/src/vs/editor/contrib/comment/test/common/lineCommentCommand.test.ts @@ -12,9 +12,9 @@ import { CommentMode } from 'vs/editor/test/common/commentMode'; import * as modes from 'vs/editor/common/modes'; import { NULL_STATE } from 'vs/editor/common/modes/nullMode'; import { TokenizationResult2 } from 'vs/editor/common/core/token'; -import { MockMode } from "vs/editor/test/common/mocks/mockMode"; -import { CommentRule } from "vs/editor/common/modes/languageConfiguration"; -import { LanguageConfigurationRegistry } from "vs/editor/common/modes/languageConfigurationRegistry"; +import { MockMode } from 'vs/editor/test/common/mocks/mockMode'; +import { CommentRule } from 'vs/editor/common/modes/languageConfiguration'; +import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; suite('Editor Contrib - Line Comment Command', () => { diff --git a/src/vs/editor/contrib/dnd/browser/dnd.ts b/src/vs/editor/contrib/dnd/browser/dnd.ts index e305c8af11a..7628350f4e2 100644 --- a/src/vs/editor/contrib/dnd/browser/dnd.ts +++ b/src/vs/editor/contrib/dnd/browser/dnd.ts @@ -17,7 +17,7 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { DragAndDropCommand } from '../common/dragAndDropCommand'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; @editorContribution export class DragAndDropController implements editorCommon.IEditorContribution { diff --git a/src/vs/editor/contrib/find/common/findController.ts b/src/vs/editor/contrib/find/common/findController.ts index e0657d80c73..4536b2b5b6f 100644 --- a/src/vs/editor/contrib/find/common/findController.ts +++ b/src/vs/editor/contrib/find/common/findController.ts @@ -21,7 +21,7 @@ import { RunOnceScheduler, Delayer } from 'vs/base/common/async'; import { CursorChangeReason, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export const enum FindStartFocusAction { NoFocusChange, diff --git a/src/vs/editor/contrib/find/common/findDecorations.ts b/src/vs/editor/contrib/find/common/findDecorations.ts index 2a80081cf0a..4cf3d631284 100644 --- a/src/vs/editor/contrib/find/common/findDecorations.ts +++ b/src/vs/editor/contrib/find/common/findDecorations.ts @@ -8,7 +8,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export class FindDecorations implements IDisposable { diff --git a/src/vs/editor/contrib/folding/common/foldingModel.ts b/src/vs/editor/contrib/folding/common/foldingModel.ts index 128f450b087..8ebd2424cc7 100644 --- a/src/vs/editor/contrib/folding/common/foldingModel.ts +++ b/src/vs/editor/contrib/folding/common/foldingModel.ts @@ -5,7 +5,7 @@ import * as editorCommon from 'vs/editor/common/editorCommon'; import { Range } from 'vs/editor/common/core/range'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export interface IFoldingRange { startLineNumber: number; diff --git a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts index a29f1511b44..124e4229c3d 100644 --- a/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts +++ b/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.ts @@ -24,7 +24,7 @@ import { registerThemingParticipant } from 'vs/platform/theme/common/themeServic import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { EditorState, CodeEditorStateFlag } from 'vs/editor/common/core/editorState'; import { DefinitionAction, DefinitionActionConfig } from './goToDeclarationCommands'; -import { ClickLinkGesture, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from "vs/editor/contrib/goToDeclaration/browser/clickLinkGesture"; +import { ClickLinkGesture, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from 'vs/editor/contrib/goToDeclaration/browser/clickLinkGesture'; @editorContribution class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorContribution { diff --git a/src/vs/editor/contrib/hover/browser/modesContentHover.ts b/src/vs/editor/contrib/hover/browser/modesContentHover.ts index 636180c1a66..0814b278789 100644 --- a/src/vs/editor/contrib/hover/browser/modesContentHover.ts +++ b/src/vs/editor/contrib/hover/browser/modesContentHover.ts @@ -22,7 +22,7 @@ import { getHover } from '../common/hover'; import { HoverOperation, IHoverComputer } from './hoverOperation'; import { ContentHoverWidget } from './hoverWidgets'; import { textToMarkedString, MarkedString } from 'vs/base/common/htmlContent'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; class ModesContentComputer implements IHoverComputer { diff --git a/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.ts b/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.ts index 874af70feda..030eff62c25 100644 --- a/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.ts +++ b/src/vs/editor/contrib/inPlaceReplace/common/inPlaceReplace.ts @@ -18,7 +18,7 @@ import { InPlaceReplaceCommand } from './inPlaceReplaceCommand'; import { EditorState, CodeEditorStateFlag } from 'vs/editor/common/core/editorState'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { editorBracketMatchBorder } from 'vs/editor/common/view/editorColorRegistry'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; @commonEditorContribution class InPlaceReplaceController implements IEditorContribution { diff --git a/src/vs/editor/contrib/linesOperations/common/linesOperations.ts b/src/vs/editor/contrib/linesOperations/common/linesOperations.ts index 4bc4b88d0fa..a41829a885b 100644 --- a/src/vs/editor/contrib/linesOperations/common/linesOperations.ts +++ b/src/vs/editor/contrib/linesOperations/common/linesOperations.ts @@ -19,7 +19,7 @@ import { CopyLinesCommand } from './copyLinesCommand'; import { DeleteLinesCommand } from './deleteLinesCommand'; import { MoveLinesCommand } from './moveLinesCommand'; import { TypeOperations } from 'vs/editor/common/controller/cursorTypeOperations'; -import { CoreEditingCommands } from "vs/editor/common/controller/coreCommands"; +import { CoreEditingCommands } from 'vs/editor/common/controller/coreCommands'; // copy lines diff --git a/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts b/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts index 4a56e203f65..64c67e2cb9a 100644 --- a/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts +++ b/src/vs/editor/contrib/linesOperations/test/common/linesOperations.test.ts @@ -10,9 +10,9 @@ import { Position } from 'vs/editor/common/core/position'; import { Handler, IModel, DefaultEndOfLine } from 'vs/editor/common/editorCommon'; import { withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; import { DeleteAllLeftAction, JoinLinesAction, TransposeAction, UpperCaseAction, LowerCaseAction, DeleteAllRightAction, InsertLineBeforeAction, InsertLineAfterAction, IndentLinesAction } from 'vs/editor/contrib/linesOperations/common/linesOperations'; -import { Cursor } from "vs/editor/common/controller/cursor"; -import { Model } from "vs/editor/common/model/model"; -import { CoreEditingCommands } from "vs/editor/common/controller/coreCommands"; +import { Cursor } from 'vs/editor/common/controller/cursor'; +import { Model } from 'vs/editor/common/model/model'; +import { CoreEditingCommands } from 'vs/editor/common/controller/coreCommands'; suite('Editor Contrib - Line Operations', () => { suite('DeleteAllLeftAction', () => { diff --git a/src/vs/editor/contrib/links/browser/links.ts b/src/vs/editor/contrib/links/browser/links.ts index 356f9bf6843..d25c7a9a3ad 100644 --- a/src/vs/editor/contrib/links/browser/links.ts +++ b/src/vs/editor/contrib/links/browser/links.ts @@ -24,8 +24,8 @@ import { editorContribution } from 'vs/editor/browser/editorBrowserExtensions'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { editorActiveLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { Position } from 'vs/editor/common/core/position'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; -import { ClickLinkGesture, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from "vs/editor/contrib/goToDeclaration/browser/clickLinkGesture"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; +import { ClickLinkGesture, ClickLinkMouseEvent, ClickLinkKeyboardEvent } from 'vs/editor/contrib/goToDeclaration/browser/clickLinkGesture'; const HOVER_MESSAGE_GENERAL_META = ( platform.isMacintosh diff --git a/src/vs/editor/contrib/quickOpen/browser/editorQuickOpen.ts b/src/vs/editor/contrib/quickOpen/browser/editorQuickOpen.ts index 3b088852ed4..6117ad98768 100644 --- a/src/vs/editor/contrib/quickOpen/browser/editorQuickOpen.ts +++ b/src/vs/editor/contrib/quickOpen/browser/editorQuickOpen.ts @@ -14,7 +14,7 @@ import { Selection } from 'vs/editor/common/core/selection'; import { IActionOptions, EditorAction } from 'vs/editor/common/editorCommonExtensions'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Range } from 'vs/editor/common/core/range'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export interface IQuickOpenControllerOpts { inputAriaLabel: string; diff --git a/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts b/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts index a7175ad5a1f..959c2bc8939 100644 --- a/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts +++ b/src/vs/editor/contrib/referenceSearch/browser/referencesWidget.ts @@ -43,8 +43,8 @@ import { registerThemingParticipant, ITheme, IThemeService } from 'vs/platform/t import { attachListStyler, attachBadgeStyler } from 'vs/platform/theme/common/styler'; import { IModelDecorationsChangedEvent } from 'vs/editor/common/model/textModelEvents'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; -import { IEnvironmentService } from "vs/platform/environment/common/environment"; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; class DecorationsManager implements IDisposable { diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts index b5938e3c7e4..2a38815488c 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -16,7 +16,7 @@ import { IPosition } from 'vs/editor/common/core/position'; import { groupBy } from 'vs/base/common/arrays'; import { dispose } from 'vs/base/common/lifecycle'; import { EditorSnippetVariableResolver } from "./snippetVariables"; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export class OneSnippet { diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts index 9e15e0bed55..1efa1b1a8c1 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetController2.old.test.ts @@ -10,8 +10,8 @@ import { Selection } from 'vs/editor/common/core/selection'; import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { MockCodeEditor, withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; import { Cursor } from 'vs/editor/common/controller/cursor'; -import { IContextKeyService } from "vs/platform/contextkey/common/contextkey"; -import { ICommonCodeEditor } from "vs/editor/common/editorCommon"; +import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; class TestSnippetController extends SnippetController2 { diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts index 04a866727d3..6c30a179315 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts @@ -9,7 +9,7 @@ import { Selection } from 'vs/editor/common/core/selection'; import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { mockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; -import { Model } from "vs/editor/common/model/model"; +import { Model } from 'vs/editor/common/model/model'; import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; suite('SnippetController2', function () { diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts index 5eb6c7cba93..100b9c0dbd8 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts @@ -11,7 +11,7 @@ import { IPosition, Position } from 'vs/editor/common/core/position'; import { SnippetSession } from 'vs/editor/contrib/snippet/browser/snippetSession'; import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { mockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; -import { Model } from "vs/editor/common/model/model"; +import { Model } from 'vs/editor/common/model/model'; suite('SnippetSession', function () { diff --git a/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts b/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts index b3fcd42202a..896e593b005 100644 --- a/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts +++ b/src/vs/editor/contrib/wordHighlighter/common/wordHighlighter.ts @@ -18,7 +18,7 @@ import { Position } from 'vs/editor/common/core/position'; import { registerColor, editorSelectionHighlight, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { CursorChangeReason, ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export const editorWordHighlight = registerColor('editor.wordHighlightBackground', { dark: '#575757B8', light: '#57575740', hc: null }, nls.localize('wordHighlight', 'Background color of a symbol during read-access, like reading a variable.')); export const editorWordHighlightStrong = registerColor('editor.wordHighlightStrongBackground', { dark: '#004972B8', light: '#0e639c40', hc: null }, nls.localize('wordHighlightStrong', 'Background color of a symbol during write-access, like writing to a variable.')); diff --git a/src/vs/editor/contrib/wordOperations/common/wordOperations.ts b/src/vs/editor/contrib/wordOperations/common/wordOperations.ts index 469e9446eb2..a2da8517ce5 100644 --- a/src/vs/editor/contrib/wordOperations/common/wordOperations.ts +++ b/src/vs/editor/contrib/wordOperations/common/wordOperations.ts @@ -14,9 +14,9 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { WordNavigationType, WordOperations } from 'vs/editor/common/controller/cursorWordOperations'; import { ReplaceCommand } from 'vs/editor/common/commands/replaceCommand'; -import { getMapForWordSeparators, WordCharacterClassifier } from "vs/editor/common/controller/wordCharacterClassifier"; -import { CursorState } from "vs/editor/common/controller/cursorCommon"; -import { CursorChangeReason } from "vs/editor/common/controller/cursorEvents"; +import { getMapForWordSeparators, WordCharacterClassifier } from 'vs/editor/common/controller/wordCharacterClassifier'; +import { CursorState } from 'vs/editor/common/controller/cursorCommon'; +import { CursorChangeReason } from 'vs/editor/common/controller/cursorEvents'; export interface MoveWordOptions extends ICommandOptions { inSelectionMode: boolean; diff --git a/src/vs/editor/contrib/wordOperations/test/common/wordOperations.test.ts b/src/vs/editor/contrib/wordOperations/test/common/wordOperations.test.ts index d67a436a400..40c303f0bec 100644 --- a/src/vs/editor/contrib/wordOperations/test/common/wordOperations.test.ts +++ b/src/vs/editor/contrib/wordOperations/test/common/wordOperations.test.ts @@ -17,7 +17,7 @@ import { DeleteWordLeft, DeleteWordStartLeft, DeleteWordEndLeft, DeleteWordRight, DeleteWordStartRight, DeleteWordEndRight } from 'vs/editor/contrib/wordOperations/common/wordOperations'; -import { EditorCommand } from "vs/editor/common/editorCommonExtensions"; +import { EditorCommand } from 'vs/editor/common/editorCommonExtensions'; suite('WordOperations', () => { diff --git a/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts b/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts index e0de87646d8..dc599a468bf 100644 --- a/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts +++ b/src/vs/editor/contrib/zoneWidget/browser/zoneWidget.ts @@ -16,7 +16,7 @@ import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition, IViewZone, IViewZo import { Color, RGBA } from 'vs/base/common/color'; import { EditorLayoutInfo } from 'vs/editor/common/config/editorOptions'; import { Position, IPosition } from 'vs/editor/common/core/position'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export interface IOptions { showFrame?: boolean; diff --git a/src/vs/editor/editor.main.ts b/src/vs/editor/editor.main.ts index 8e3a8c151dd..667a3004499 100644 --- a/src/vs/editor/editor.main.ts +++ b/src/vs/editor/editor.main.ts @@ -14,7 +14,7 @@ import 'vs/editor/contrib/inspectTokens/browser/inspectTokens'; import { createMonacoBaseAPI } from 'vs/editor/common/standalone/standaloneBase'; import { createMonacoEditorAPI } from 'vs/editor/browser/standalone/standaloneEditor'; import { createMonacoLanguagesAPI } from 'vs/editor/browser/standalone/standaloneLanguages'; -import { EDITOR_DEFAULTS, WrappingIndent } from "vs/editor/common/config/editorOptions"; +import { EDITOR_DEFAULTS, WrappingIndent } from 'vs/editor/common/config/editorOptions'; // Set defaults for standalone editor (EDITOR_DEFAULTS).wrappingIndent = WrappingIndent.None; diff --git a/src/vs/editor/test/browser/controller/textAreaState.test.ts b/src/vs/editor/test/browser/controller/textAreaState.test.ts index 9170690d5ec..59552e7542e 100644 --- a/src/vs/editor/test/browser/controller/textAreaState.test.ts +++ b/src/vs/editor/test/browser/controller/textAreaState.test.ts @@ -9,7 +9,7 @@ import { ISimpleModel, TextAreaState, ITextAreaWrapper, PagedScreenReaderStrateg import { Range } from 'vs/editor/common/core/range'; import { EndOfLinePreference } from 'vs/editor/common/editorCommon'; import { Disposable } from 'vs/base/common/lifecycle'; -import { Model } from "vs/editor/common/model/model"; +import { Model } from 'vs/editor/common/model/model'; import { Selection } from 'vs/editor/common/core/selection'; export class MockTextAreaWrapper extends Disposable implements ITextAreaWrapper { diff --git a/src/vs/editor/test/common/commands/commandTestUtils.ts b/src/vs/editor/test/common/commands/commandTestUtils.ts index b753b8a063a..184f5e8d99b 100644 --- a/src/vs/editor/test/common/commands/commandTestUtils.ts +++ b/src/vs/editor/test/common/commands/commandTestUtils.ts @@ -10,7 +10,7 @@ import { Selection } from 'vs/editor/common/core/selection'; import * as editorCommon from 'vs/editor/common/editorCommon'; import { Model } from 'vs/editor/common/model/model'; import { LanguageIdentifier } from 'vs/editor/common/modes'; -import { withMockCodeEditor } from "vs/editor/test/common/mocks/mockCodeEditor"; +import { withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; export function testCommand( lines: string[], diff --git a/src/vs/editor/test/common/commands/sideEditing.test.ts b/src/vs/editor/test/common/commands/sideEditing.test.ts index 2fa3ea6035f..af17bee84a2 100644 --- a/src/vs/editor/test/common/commands/sideEditing.test.ts +++ b/src/vs/editor/test/common/commands/sideEditing.test.ts @@ -11,7 +11,7 @@ import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { IIdentifiedSingleEditOperation } from 'vs/editor/common/editorCommon'; import { ILineEdit, ModelLine, LineMarker, MarkersTracker } from 'vs/editor/common/model/modelLine'; -import { withMockCodeEditor } from "vs/editor/test/common/mocks/mockCodeEditor"; +import { withMockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; const NO_TAB_SIZE = 0; diff --git a/src/vs/editor/test/common/config/commonEditorConfig.test.ts b/src/vs/editor/test/common/config/commonEditorConfig.test.ts index 6abc5412b03..c07e1240c1f 100644 --- a/src/vs/editor/test/common/config/commonEditorConfig.test.ts +++ b/src/vs/editor/test/common/config/commonEditorConfig.test.ts @@ -7,8 +7,8 @@ import * as assert from 'assert'; import { EditorZoom } from 'vs/editor/common/config/editorZoom'; import { TestConfiguration } from 'vs/editor/test/common/mocks/testConfiguration'; -import { IEnvConfiguration } from "vs/editor/common/config/commonEditorConfig"; -import { AccessibilitySupport } from "vs/base/common/platform"; +import { IEnvConfiguration } from 'vs/editor/common/config/commonEditorConfig'; +import { AccessibilitySupport } from 'vs/base/common/platform'; suite('Common Editor Config', () => { test('Zoom Level', () => { diff --git a/src/vs/editor/test/common/controller/cursor.test.ts b/src/vs/editor/test/common/controller/cursor.test.ts index 833bd813b47..b3d15acc035 100644 --- a/src/vs/editor/test/common/controller/cursor.test.ts +++ b/src/vs/editor/test/common/controller/cursor.test.ts @@ -23,15 +23,15 @@ import { MockMode } from 'vs/editor/test/common/mocks/mockMode'; import { LanguageIdentifier } from 'vs/editor/common/modes'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { CoreNavigationCommands, CoreEditingCommands } from 'vs/editor/common/controller/coreCommands'; -import { withMockCodeEditor, MockCodeEditor } from "vs/editor/test/common/mocks/mockCodeEditor"; -import { TextModel } from "vs/editor/common/model/textModel"; -import { ViewModel } from "vs/editor/common/viewModel/viewModelImpl"; +import { withMockCodeEditor, MockCodeEditor } from 'vs/editor/test/common/mocks/mockCodeEditor'; +import { TextModel } from 'vs/editor/common/model/textModel'; +import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl'; import * as viewEvents from 'vs/editor/common/view/viewEvents'; -import { ScreenReaderMessageGenerator } from "vs/editor/common/controller/accGenerator"; +import { ScreenReaderMessageGenerator } from 'vs/editor/common/controller/accGenerator'; import { CursorWordLeft, CursorWordLeftSelect, CursorWordRight, CursorWordRightSelect } from 'vs/editor/contrib/wordOperations/common/wordOperations'; -import { EditorCommand } from "vs/editor/common/editorCommonExtensions"; +import { EditorCommand } from 'vs/editor/common/editorCommonExtensions'; let H = Handler; // --------- utils diff --git a/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts b/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts index 1b4ae6b014d..2b9ac20069d 100644 --- a/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts +++ b/src/vs/editor/test/common/controller/cursorMoveCommand.test.ts @@ -13,7 +13,7 @@ import { CursorMove } from 'vs/editor/common/controller/cursorMoveCommands'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { CoreNavigationCommands } from 'vs/editor/common/controller/coreCommands'; -import { ViewModel } from "vs/editor/common/viewModel/viewModelImpl"; +import { ViewModel } from 'vs/editor/common/viewModel/viewModelImpl'; suite('Cursor move command test', () => { diff --git a/src/vs/editor/test/common/mocks/testConfiguration.ts b/src/vs/editor/test/common/mocks/testConfiguration.ts index edddfa74fdd..a8778a6f055 100644 --- a/src/vs/editor/test/common/mocks/testConfiguration.ts +++ b/src/vs/editor/test/common/mocks/testConfiguration.ts @@ -7,7 +7,7 @@ import { CommonEditorConfiguration, IEnvConfiguration } from 'vs/editor/common/config/commonEditorConfig'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { FontInfo, BareFontInfo } from 'vs/editor/common/config/fontInfo'; -import { AccessibilitySupport } from "vs/base/common/platform"; +import { AccessibilitySupport } from 'vs/base/common/platform'; export class TestConfiguration extends CommonEditorConfiguration { diff --git a/src/vs/editor/test/common/model/textModelSearch.test.ts b/src/vs/editor/test/common/model/textModelSearch.test.ts index 4102cfad4fe..274ce45b934 100644 --- a/src/vs/editor/test/common/model/textModelSearch.test.ts +++ b/src/vs/editor/test/common/model/textModelSearch.test.ts @@ -10,8 +10,8 @@ import { FindMatch, EndOfLineSequence } from 'vs/editor/common/editorCommon'; import { Range } from 'vs/editor/common/core/range'; import { TextModel } from 'vs/editor/common/model/textModel'; import { TextModelSearch, SearchParams, SearchData } from 'vs/editor/common/model/textModelSearch'; -import { getMapForWordSeparators } from "vs/editor/common/controller/wordCharacterClassifier"; -import { USUAL_WORD_SEPARATORS } from "vs/editor/common/model/wordHelper"; +import { getMapForWordSeparators } from 'vs/editor/common/controller/wordCharacterClassifier'; +import { USUAL_WORD_SEPARATORS } from 'vs/editor/common/model/wordHelper'; // --------- Find suite('TextModelSearch', () => { diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index bb92039a1f0..5c23e84ef0f 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -36,7 +36,7 @@ import { IProgressService } from 'vs/platform/progress/common/progress'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { attachProgressBarStyler } from "vs/platform/theme/common/styler"; +import { attachProgressBarStyler } from 'vs/platform/theme/common/styler'; export interface ICompositeTitleLabel { diff --git a/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts b/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts index 05bf24ac197..4bc4a3b143a 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupsControl.ts @@ -36,7 +36,7 @@ import { getCodeEditor } from 'vs/editor/common/services/codeEditorService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { editorBackground, contrastBorder, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { Themable, EDITOR_GROUP_HEADER_TABS_BACKGROUND, EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND, EDITOR_GROUP_BORDER, EDITOR_DRAG_AND_DROP_BACKGROUND, EDITOR_GROUP_BACKGROUND, EDITOR_GROUP_HEADER_TABS_BORDER } from 'vs/workbench/common/theme'; -import { attachProgressBarStyler } from "vs/platform/theme/common/styler"; +import { attachProgressBarStyler } from 'vs/platform/theme/common/styler'; export enum Rochade { NONE, diff --git a/src/vs/workbench/browser/parts/editor/webviewEditor.ts b/src/vs/workbench/browser/parts/editor/webviewEditor.ts index cf852a3d1a5..50f792c3e9d 100644 --- a/src/vs/workbench/browser/parts/editor/webviewEditor.ts +++ b/src/vs/workbench/browser/parts/editor/webviewEditor.ts @@ -5,10 +5,10 @@ 'use strict'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { BaseEditor } from "vs/workbench/browser/parts/editor/baseEditor"; -import URI from "vs/base/common/uri"; -import { IStorageService } from "vs/platform/storage/common/storage"; -import { Scope } from "vs/workbench/common/memento"; +import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; +import URI from 'vs/base/common/uri'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { Scope } from 'vs/workbench/common/memento'; export interface HtmlPreviewEditorViewState { scrollYPercentage: number; diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index fd2fd574fb4..b7909865487 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -30,7 +30,7 @@ import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } import { STATUS_BAR_BACKGROUND, STATUS_BAR_FOREGROUND, STATUS_BAR_NO_FOLDER_BACKGROUND, STATUS_BAR_ITEM_HOVER_BACKGROUND, STATUS_BAR_ITEM_ACTIVE_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_HOVER_BACKGROUND, STATUS_BAR_BORDER, STATUS_BAR_NO_FOLDER_FOREGROUND } from 'vs/workbench/common/theme'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { contrastBorder } from 'vs/platform/theme/common/colorRegistry'; -import { isThemeColor } from "vs/editor/common/editorCommon"; +import { isThemeColor } from 'vs/editor/common/editorCommon'; import { Color } from 'vs/base/common/color'; export class StatusbarPart extends Part implements IStatusbarService { diff --git a/src/vs/workbench/common/editor/rangeDecorations.ts b/src/vs/workbench/common/editor/rangeDecorations.ts index 7c8678ab24c..70a95b14274 100644 --- a/src/vs/workbench/common/editor/rangeDecorations.ts +++ b/src/vs/workbench/common/editor/rangeDecorations.ts @@ -12,7 +12,7 @@ import { toResource } from 'vs/workbench/common/editor'; import { isEqual } from 'vs/platform/files/common/files'; import { IRange } from 'vs/editor/common/core/range'; import { CursorChangeReason, ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export interface IRangeHighlightDecoration { resource: URI; diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 86c445e811c..5a2a8efaff7 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -7,6 +7,7 @@ import 'vs/css!./media/workbench'; +import { localize } from 'vs/nls'; import { TPromise, ValueCallback } from 'vs/base/common/winjs.base'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import Event, { Emitter, chain } from 'vs/base/common/event'; @@ -91,11 +92,10 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWindowConfiguration } from 'vs/workbench/electron-browser/common'; -import { localize } from "vs/nls"; -import { IWorkbenchActionRegistry, Extensions } from "vs/workbench/common/actionRegistry"; +import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actionRegistry'; import { OpenRecentAction, ToggleDevToolsAction, ReloadWindowAction } from "vs/workbench/electron-browser/actions"; -import { KeyMod } from "vs/base/common/keyCodes"; -import { KeyCode } from "vs/editor/common/standalone/standaloneBase"; +import { KeyMod } from 'vs/base/common/keyCodes'; +import { KeyCode } from 'vs/editor/common/standalone/standaloneBase'; export const MessagesVisibleContext = new RawContextKey('globalMessageVisible', false); export const EditorsVisibleContext = new RawContextKey('editorIsOpen', false); diff --git a/src/vs/workbench/node/extensionPoints.ts b/src/vs/workbench/node/extensionPoints.ts index bcb6fc2206d..c1b76d345ec 100644 --- a/src/vs/workbench/node/extensionPoints.ts +++ b/src/vs/workbench/node/extensionPoints.ts @@ -18,7 +18,7 @@ import Types = require('vs/base/common/types'); import { isValidExtensionDescription } from 'vs/platform/extensions/node/extensionValidator'; import * as semver from 'semver'; import { getIdAndVersionFromLocalExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; -import { getParseErrorMessage } from "vs/base/common/jsonErrorMessages"; +import { getParseErrorMessage } from 'vs/base/common/jsonErrorMessages'; const MANIFEST_FILE = 'package.json'; diff --git a/src/vs/workbench/parts/debug/browser/debugActionItems.ts b/src/vs/workbench/parts/debug/browser/debugActionItems.ts index edb07e3d969..50d19edfefb 100644 --- a/src/vs/workbench/parts/debug/browser/debugActionItems.ts +++ b/src/vs/workbench/parts/debug/browser/debugActionItems.ts @@ -19,7 +19,7 @@ import { IDebugService } from 'vs/workbench/parts/debug/common/debug'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { attachSelectBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; -import { selectBorder } from "vs/platform/theme/common/colorRegistry"; +import { selectBorder } from 'vs/platform/theme/common/colorRegistry'; const $ = dom.$; diff --git a/src/vs/workbench/parts/debug/browser/exceptionWidget.ts b/src/vs/workbench/parts/debug/browser/exceptionWidget.ts index a54e0e1ff20..70004ffb526 100644 --- a/src/vs/workbench/parts/debug/browser/exceptionWidget.ts +++ b/src/vs/workbench/parts/debug/browser/exceptionWidget.ts @@ -11,9 +11,9 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IDebugService, IExceptionInfo } from 'vs/workbench/parts/debug/common/debug'; import { RunOnceScheduler } from 'vs/base/common/async'; -import { IThemeService, ITheme } from "vs/platform/theme/common/themeService"; -import { Color } from "vs/base/common/color"; -import { registerColor } from "vs/platform/theme/common/colorRegistry"; +import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; +import { Color } from 'vs/base/common/color'; +import { registerColor } from 'vs/platform/theme/common/colorRegistry'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { LinkDetector } from 'vs/workbench/parts/debug/browser/linkDetector'; const $ = dom.$; diff --git a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts index f0e0ed7a9bd..95e12911dcf 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts @@ -37,7 +37,7 @@ import { FloatingClickWidget } from 'vs/workbench/parts/preferences/browser/pref import { IListService } from 'vs/platform/list/browser/listService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Position } from 'vs/editor/common/core/position'; -import { CoreEditingCommands } from "vs/editor/common/controller/coreCommands"; +import { CoreEditingCommands } from 'vs/editor/common/controller/coreCommands'; const HOVER_DELAY = 300; const LAUNCH_JSON_REGEX = /launch\.json$/; diff --git a/src/vs/workbench/parts/debug/electron-browser/debugHover.ts b/src/vs/workbench/parts/debug/electron-browser/debugHover.ts index 4e5b9be2e79..ce54f235ae5 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugHover.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugHover.ts @@ -23,7 +23,7 @@ import { VariablesRenderer, renderExpressionValue, VariablesDataSource } from 'v import { IListService } from 'vs/platform/list/browser/listService'; import { attachListStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { editorHoverBackground, editorHoverBorder } from "vs/platform/theme/common/colorRegistry"; +import { editorHoverBackground, editorHoverBorder } from 'vs/platform/theme/common/colorRegistry'; const $ = dom.$; const MAX_ELEMENTS_SHOWN = 18; diff --git a/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.ts b/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.ts index fe69b0ad530..78ba083f9a0 100644 --- a/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.ts +++ b/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.ts @@ -11,7 +11,7 @@ import { IPartService, Parts } from 'vs/workbench/services/part/common/partServi import { IDebugService, State } from 'vs/workbench/parts/debug/common/debug'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { STATUS_BAR_NO_FOLDER_BACKGROUND, STATUS_BAR_NO_FOLDER_FOREGROUND, STATUS_BAR_BACKGROUND, Themable, STATUS_BAR_FOREGROUND } from 'vs/workbench/common/theme'; -import { addClass, removeClass } from "vs/base/browser/dom"; +import { addClass, removeClass } from 'vs/base/browser/dom'; // colors for theming diff --git a/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts index f1db99bf647..f046995c799 100644 --- a/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts @@ -11,7 +11,7 @@ import { BasicEmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browse import { editorAction } from 'vs/editor/common/editorCommonExtensions'; import { ICommonCodeEditor } from 'vs/editor/common/editorCommon'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; -import { CoreEditingCommands } from "vs/editor/common/controller/coreCommands"; +import { CoreEditingCommands } from 'vs/editor/common/controller/coreCommands'; import { KeyCode } from 'vs/base/common/keyCodes'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; diff --git a/src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts b/src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts index 38cb77ea2fd..26f7cf390e7 100644 --- a/src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/editorAccessor.ts @@ -11,7 +11,7 @@ import { Range } from 'vs/editor/common/core/range'; import { SnippetController2 } from 'vs/editor/contrib/snippet/browser/snippetController2'; import { LanguageId, LanguageIdentifier } from 'vs/editor/common/modes'; import { Position } from 'vs/editor/common/core/position'; -import { CoreEditingCommands } from "vs/editor/common/controller/coreCommands"; +import { CoreEditingCommands } from 'vs/editor/common/controller/coreCommands'; import { SnippetParser, walk, Placeholder, Variable, Text, Marker } from 'vs/editor/contrib/snippet/browser/snippetParser'; import emmet = require('emmet'); diff --git a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts index f2cf8c9cacd..b922ba26c25 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionsActions.ts @@ -32,9 +32,9 @@ import { IExtensionService, IExtensionDescription } from 'vs/platform/extensions import URI from 'vs/base/common/uri'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { registerThemingParticipant, ITheme, ICssStyleCollector } from "vs/platform/theme/common/themeService"; -import { buttonBackground, buttonForeground, buttonHoverBackground, contrastBorder, registerColor, foreground } from "vs/platform/theme/common/colorRegistry"; -import { Color } from "vs/base/common/color"; +import { registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; +import { buttonBackground, buttonForeground, buttonHoverBackground, contrastBorder, registerColor, foreground } from 'vs/platform/theme/common/colorRegistry'; +import { Color } from 'vs/base/common/color'; export class InstallAction extends Action { diff --git a/src/vs/workbench/parts/feedback/electron-browser/feedback.ts b/src/vs/workbench/parts/feedback/electron-browser/feedback.ts index 310eb5f0d97..ec3746121ea 100644 --- a/src/vs/workbench/parts/feedback/electron-browser/feedback.ts +++ b/src/vs/workbench/parts/feedback/electron-browser/feedback.ts @@ -17,9 +17,9 @@ import * as dom from 'vs/base/browser/dom'; import { ICommandService } from 'vs/platform/commands/common/commands'; import * as errors from 'vs/base/common/errors'; import { IIntegrityService } from 'vs/platform/integrity/common/integrity'; -import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from "vs/platform/theme/common/themeService"; -import { attachStylerCallback } from "vs/platform/theme/common/styler"; -import { editorWidgetBackground, widgetShadow, inputBorder, inputForeground, inputBackground, inputActiveOptionBorder, editorBackground, buttonBackground, contrastBorder } from "vs/platform/theme/common/colorRegistry"; +import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; +import { attachStylerCallback } from 'vs/platform/theme/common/styler'; +import { editorWidgetBackground, widgetShadow, inputBorder, inputForeground, inputBackground, inputActiveOptionBorder, editorBackground, buttonBackground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; export interface IFeedback { feedback: string; diff --git a/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts b/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts index b4763f543e6..b124264626e 100644 --- a/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts +++ b/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts @@ -13,7 +13,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import product from 'vs/platform/node/product'; import { Themable, STATUS_BAR_FOREGROUND, STATUS_BAR_NO_FOLDER_FOREGROUND } from 'vs/workbench/common/theme'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { IWorkspaceContextService } from "vs/platform/workspace/common/workspace"; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; class TwitterFeedbackService implements IFeedbackService { diff --git a/src/vs/workbench/parts/files/browser/views/openEditorsView.ts b/src/vs/workbench/parts/files/browser/views/openEditorsView.ts index 4b3e4ee2778..3af3b297057 100644 --- a/src/vs/workbench/parts/files/browser/views/openEditorsView.ts +++ b/src/vs/workbench/parts/files/browser/views/openEditorsView.ts @@ -33,7 +33,7 @@ import { IListService } from 'vs/platform/list/browser/listService'; import { EditorGroup } from 'vs/workbench/common/editor/editorStacksModel'; import { attachListStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { badgeBackground, badgeForeground, contrastBorder } from "vs/platform/theme/common/colorRegistry"; +import { badgeBackground, badgeForeground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; const $ = dom.$; diff --git a/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts b/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts index b0f736e5e51..c78dfb63b68 100644 --- a/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts +++ b/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts @@ -18,9 +18,9 @@ import { IMarker } from 'vs/platform/markers/common/markers'; import { MarkersModel, Resource, Marker } from 'vs/workbench/parts/markers/common/markersModel'; import Messages from 'vs/workbench/parts/markers/common/messages'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { attachBadgeStyler } from "vs/platform/theme/common/styler"; -import { IThemeService } from "vs/platform/theme/common/themeService"; -import { IDisposable } from "vs/base/common/lifecycle"; +import { attachBadgeStyler } from 'vs/platform/theme/common/styler'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { IDisposable } from 'vs/base/common/lifecycle'; interface IAnyResourceTemplateData { count: CountBadge; diff --git a/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts b/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts index 67c6fca57ae..65043dc7561 100644 --- a/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts +++ b/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts @@ -23,7 +23,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition } from 'vs/editor/browser/editorBrowser'; import { attachInputBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { editorWidgetBackground, widgetShadow } from "vs/platform/theme/common/colorRegistry"; +import { editorWidgetBackground, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; class KeybindingInputWidget extends Widget { diff --git a/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts index ca94ecd2c2b..16fedab3623 100644 --- a/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts @@ -39,7 +39,7 @@ import { IChoiceService, IMessageService, Severity } from 'vs/platform/message/c import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode, ResolvedKeybinding } from 'vs/base/common/keyCodes'; import { attachListStyler } from 'vs/platform/theme/common/styler'; -import { listHighlightForeground } from "vs/platform/theme/common/colorRegistry"; +import { listHighlightForeground } from 'vs/platform/theme/common/colorRegistry'; let $ = DOM.$; diff --git a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts index 0aae0f5f0ff..ca535cf3de0 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts @@ -53,8 +53,8 @@ import { FindController } from 'vs/editor/contrib/find/browser/find'; import { SelectionHighlighter } from 'vs/editor/contrib/find/common/findController'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { attachStylerCallback } from "vs/platform/theme/common/styler"; -import { scrollbarShadow } from "vs/platform/theme/common/colorRegistry"; +import { attachStylerCallback } from 'vs/platform/theme/common/styler'; +import { scrollbarShadow } from 'vs/platform/theme/common/colorRegistry'; export class PreferencesEditorInput extends SideBySideEditorInput { public static ID: string = 'workbench.editorinputs.preferencesEditorInput'; diff --git a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts index bd29a6a03df..81941633f5d 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts @@ -32,7 +32,7 @@ import { IWorkspaceConfigurationService } from 'vs/workbench/services/configurat import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export interface IPreferencesRenderer extends IDisposable { preferencesModel: IPreferencesEditorModel; diff --git a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts b/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts index 1f802861a31..52f1edebae3 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts +++ b/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts @@ -27,7 +27,7 @@ import { attachInputBoxStyler, attachStylerCallback } from 'vs/platform/theme/co import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Position } from 'vs/editor/common/core/position'; import { ICursorPositionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; -import { buttonBackground, buttonForeground, badgeForeground, badgeBackground, contrastBorder, errorForeground } from "vs/platform/theme/common/colorRegistry"; +import { buttonBackground, buttonForeground, badgeForeground, badgeBackground, contrastBorder, errorForeground } from 'vs/platform/theme/common/colorRegistry'; export class SettingsGroupTitleWidget extends Widget implements IViewZone { diff --git a/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts b/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts index 5435cc3a698..260ab6e1a64 100644 --- a/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts +++ b/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts @@ -28,7 +28,7 @@ import { IMessageService, Severity, IMessageWithAction } from 'vs/platform/messa import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; -import { editorAction, EditorAction } from "vs/editor/common/editorCommonExtensions"; +import { editorAction, EditorAction } from 'vs/editor/common/editorCommonExtensions'; export const ALL_COMMANDS_PREFIX = '>'; export const EDITOR_COMMANDS_PREFIX = '$'; diff --git a/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts b/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts index eaca7cc45e5..8561d451305 100644 --- a/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts +++ b/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts @@ -22,11 +22,11 @@ import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerServ import URI from 'vs/base/common/uri'; import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { ISCMService } from 'vs/workbench/services/scm/common/scm'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; -import { registerThemingParticipant, ITheme, ICssStyleCollector } from "vs/platform/theme/common/themeService"; -import { registerColor } from "vs/platform/theme/common/colorRegistry"; -import { localize } from "vs/nls"; -import { Color } from "vs/base/common/color"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; +import { registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; +import { registerColor } from 'vs/platform/theme/common/colorRegistry'; +import { localize } from 'vs/nls'; +import { Color } from 'vs/base/common/color'; class DirtyDiffModelDecorator { diff --git a/src/vs/workbench/parts/search/browser/openFileHandler.ts b/src/vs/workbench/parts/search/browser/openFileHandler.ts index 28c61bbc3d4..1ff6554fa37 100644 --- a/src/vs/workbench/parts/search/browser/openFileHandler.ts +++ b/src/vs/workbench/parts/search/browser/openFileHandler.ts @@ -31,7 +31,7 @@ import { IQueryOptions, ISearchService, ISearchStats, ISearchQuery } from 'vs/pl import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IRange } from 'vs/editor/common/core/range'; -import { getOutOfWorkspaceEditorResources } from "vs/workbench/parts/search/common/search"; +import { getOutOfWorkspaceEditorResources } from 'vs/workbench/parts/search/common/search'; export class FileQuickOpenModel extends QuickOpenModel { diff --git a/src/vs/workbench/parts/search/browser/searchResultsView.ts b/src/vs/workbench/parts/search/browser/searchResultsView.ts index 48452fee61f..c9d95f8e9ab 100644 --- a/src/vs/workbench/parts/search/browser/searchResultsView.ts +++ b/src/vs/workbench/parts/search/browser/searchResultsView.ts @@ -19,8 +19,8 @@ import { Range } from 'vs/editor/common/core/range'; import { SearchViewlet } from 'vs/workbench/parts/search/browser/searchViewlet'; import { RemoveAction, ReplaceAllAction, ReplaceAction } from 'vs/workbench/parts/search/browser/searchActions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { attachBadgeStyler } from "vs/platform/theme/common/styler"; -import { IThemeService } from "vs/platform/theme/common/themeService"; +import { attachBadgeStyler } from 'vs/platform/theme/common/styler'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; export class SearchDataSource implements IDataSource { diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index ed2a0c9f953..04837eb7f6e 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -60,7 +60,7 @@ import FileResultsNavigation from 'vs/workbench/browser/fileResultsNavigation'; import { attachListStyler } from 'vs/platform/theme/common/styler'; import { IOutputService } from 'vs/workbench/parts/output/common/output'; import { Color } from 'vs/base/common/color'; -import { getOutOfWorkspaceEditorResources } from "vs/workbench/parts/search/common/search"; +import { getOutOfWorkspaceEditorResources } from 'vs/workbench/parts/search/common/search'; export class SearchViewlet extends Viewlet { diff --git a/src/vs/workbench/parts/search/common/search.ts b/src/vs/workbench/parts/search/common/search.ts index 19cd463c846..a6f98af6b22 100644 --- a/src/vs/workbench/parts/search/common/search.ts +++ b/src/vs/workbench/parts/search/common/search.ts @@ -12,10 +12,10 @@ import { CommonEditorRegistry } from 'vs/editor/common/editorCommonExtensions'; import { ISearchConfiguration } from 'vs/platform/search/common/search'; import glob = require('vs/base/common/glob'); import { SymbolInformation } from 'vs/editor/common/modes'; -import { IEditorGroupService } from "vs/workbench/services/group/common/groupService"; -import { IWorkspaceContextService } from "vs/platform/workspace/common/workspace"; -import URI from "vs/base/common/uri"; -import { toResource } from "vs/workbench/common/editor"; +import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import URI from 'vs/base/common/uri'; +import { toResource } from 'vs/workbench/common/editor'; export interface IWorkspaceSymbolProvider { provideWorkspaceSymbols(search: string): TPromise; diff --git a/src/vs/workbench/parts/search/common/searchModel.ts b/src/vs/workbench/parts/search/common/searchModel.ts index 87dae50f90e..114d6657c1a 100644 --- a/src/vs/workbench/parts/search/common/searchModel.ts +++ b/src/vs/workbench/parts/search/common/searchModel.ts @@ -24,7 +24,7 @@ import { IModelService } from 'vs/editor/common/services/modelService'; import { IReplaceService } from 'vs/workbench/parts/search/common/replace'; import { IProgressRunner } from 'vs/platform/progress/common/progress'; import { RangeHighlightDecorations } from 'vs/workbench/common/editor/rangeDecorations'; -import { ModelDecorationOptions } from "vs/editor/common/model/textModelWithDecorations"; +import { ModelDecorationOptions } from 'vs/editor/common/model/textModelWithDecorations'; export class Match { diff --git a/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.ts b/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.ts index ae83175077b..dcdfe17498a 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.ts +++ b/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.ts @@ -16,7 +16,7 @@ import { IModeService } from 'vs/editor/common/services/modeService'; import { languagesExtPoint } from 'vs/editor/common/services/modeServiceImpl'; import { LanguageIdentifier } from 'vs/editor/common/modes'; import { SnippetParser, Marker, Placeholder, Variable, Text, walk } from 'vs/editor/contrib/snippet/browser/snippetParser'; -import { EditorSnippetVariableResolver } from "vs/editor/contrib/snippet/browser/snippetVariables"; +import { EditorSnippetVariableResolver } from 'vs/editor/contrib/snippet/browser/snippetVariables'; interface ISnippetsExtensionPoint { language: string; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts index c4e3fc01471..17e931a643b 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts @@ -27,7 +27,7 @@ import { ToggleTabFocusModeAction } from 'vs/editor/contrib/toggleTabFocusMode/c import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { OpenNextRecentlyUsedEditorInGroupAction, OpenPreviousRecentlyUsedEditorInGroupAction, FocusActiveGroupAction, FocusFirstGroupAction, FocusSecondGroupAction, FocusThirdGroupAction } from 'vs/workbench/browser/parts/editor/editorActions'; -import { EDITOR_FONT_DEFAULTS } from "vs/editor/common/config/editorOptions"; +import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; import { registerColors } from './terminalColorRegistry'; let configurationRegistry = Registry.as(Extensions.Configuration); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts index 236474f7366..fda8ca9b994 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts @@ -5,7 +5,7 @@ import * as nls from 'vs/nls'; import * as platform from 'vs/base/common/platform'; -import { EDITOR_FONT_DEFAULTS, IEditorOptions } from "vs/editor/common/config/editorOptions"; +import { EDITOR_FONT_DEFAULTS, IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; import { IChoiceService } from 'vs/platform/message/common/message'; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 8d7d30b7099..5247bd40e71 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -29,8 +29,8 @@ import { TabFocus } from 'vs/editor/common/config/commonEditorConfig'; import { TerminalConfigHelper } from 'vs/workbench/parts/terminal/electron-browser/terminalConfigHelper'; import { TerminalLinkHandler } from 'vs/workbench/parts/terminal/electron-browser/terminalLinkHandler'; import { TerminalWidgetManager } from 'vs/workbench/parts/terminal/browser/terminalWidgetManager'; -import { registerThemingParticipant, ITheme, ICssStyleCollector } from "vs/platform/theme/common/themeService"; -import { scrollbarSliderBackground, scrollbarSliderHoverBackground, scrollbarSliderActiveBackground } from "vs/platform/theme/common/colorRegistry"; +import { registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; +import { scrollbarSliderBackground, scrollbarSliderHoverBackground, scrollbarSliderActiveBackground } from 'vs/platform/theme/common/colorRegistry'; /** The amount of time to consider terminal errors to be related to the launch */ const LAUNCHING_DURATION = 500; diff --git a/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts b/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts index 285bc9025ad..2e0b9c5831d 100644 --- a/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts +++ b/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts @@ -10,7 +10,7 @@ import { IConfigurationService, getConfigurationValue } from 'vs/platform/config import { Platform } from 'vs/base/common/platform'; import { TPromise } from 'vs/base/common/winjs.base'; import { TerminalConfigHelper } from 'vs/workbench/parts/terminal/electron-browser/terminalConfigHelper'; -import { EDITOR_FONT_DEFAULTS } from "vs/editor/common/config/editorOptions"; +import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; class MockConfigurationService implements IConfigurationService { diff --git a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts b/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts index 466aa77c62d..7f9174f7ca6 100644 --- a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts +++ b/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts @@ -20,7 +20,7 @@ import { IModeService } from 'vs/editor/common/services/modeService'; import { tokenizeToString } from 'vs/editor/common/modes/textToHtmlTokenizer'; import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; import { WebviewEditor } from 'vs/workbench/browser/parts/editor/webviewEditor'; -import { IStorageService } from "vs/platform/storage/common/storage"; +import { IStorageService } from 'vs/platform/storage/common/storage'; function renderBody(body: string): string { return ` diff --git a/src/vs/workbench/services/editor/test/browser/editorService.test.ts b/src/vs/workbench/services/editor/test/browser/editorService.test.ts index e1f4057853f..4dd5a44fe16 100644 --- a/src/vs/workbench/services/editor/test/browser/editorService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorService.test.ts @@ -16,7 +16,7 @@ import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEdi import { workbenchInstantiationService, TestThemeService } from 'vs/workbench/test/workbenchTestServices'; import { DelegatingWorkbenchEditorService, WorkbenchEditorService, IEditorPart } from 'vs/workbench/services/editor/browser/editorService'; import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorInput'; -import { ResourceEditorInput } from "vs/workbench/common/editor/resourceEditorInput"; +import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; let activeEditor: BaseEditor = { getSelection: function () { diff --git a/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts b/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts index aa101644f89..f182c1494c8 100644 --- a/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts +++ b/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts @@ -20,7 +20,7 @@ import { Extensions, IColorRegistry, ColorIdentifier, editorBackground, editorFo import { ThemeType } from 'vs/platform/theme/common/themeService'; import { Registry } from 'vs/platform/platform'; import { WorkbenchThemeService, IColorCustomizations } from "vs/workbench/services/themes/electron-browser/workbenchThemeService"; -import { getParseErrorMessage } from "vs/base/common/jsonErrorMessages"; +import { getParseErrorMessage } from 'vs/base/common/jsonErrorMessages'; let colorRegistry = Registry.as(Extensions.ColorContribution); diff --git a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts index 72ad60ffe23..6e41871b060 100644 --- a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts @@ -39,7 +39,7 @@ import pfs = require('vs/base/node/pfs'); import colorThemeSchema = require('vs/workbench/services/themes/common/colorThemeSchema'); import fileIconThemeSchema = require('vs/workbench/services/themes/common/fileIconThemeSchema'); import { IDisposable } from 'vs/base/common/lifecycle'; -import { getParseErrorMessage } from "vs/base/common/jsonErrorMessages"; +import { getParseErrorMessage } from 'vs/base/common/jsonErrorMessages'; // implementation diff --git a/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts b/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts index cbdc5139462..4050b580de0 100644 --- a/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts @@ -16,7 +16,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; import { PLAINTEXT_MODE_ID } from 'vs/editor/common/modes/modesRegistry'; import { workbenchInstantiationService, TestThemeService } from 'vs/workbench/test/workbenchTestServices'; -import { ResourceEditorInput } from "vs/workbench/common/editor/resourceEditorInput"; +import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; const NullThemeService = new TestThemeService(); diff --git a/src/vs/workbench/test/common/editor/editorDiffModel.test.ts b/src/vs/workbench/test/common/editor/editorDiffModel.test.ts index 2f5901c6e88..2db61acaf4e 100644 --- a/src/vs/workbench/test/common/editor/editorDiffModel.test.ts +++ b/src/vs/workbench/test/common/editor/editorDiffModel.test.ts @@ -12,15 +12,15 @@ import { TextDiffEditorModel } from 'vs/workbench/common/editor/textDiffEditorMo import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; -import { ResourceEditorInput } from "vs/workbench/common/editor/resourceEditorInput"; -import URI from "vs/base/common/uri"; -import { ITextModelResolverService } from "vs/editor/common/services/resolverService"; -import { ITextFileService } from "vs/workbench/services/textfile/common/textfiles"; -import { IUntitledEditorService } from "vs/workbench/services/untitled/common/untitledEditorService"; -import { TestTextFileService, workbenchInstantiationService } from "vs/workbench/test/workbenchTestServices"; +import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; +import URI from 'vs/base/common/uri'; +import { ITextModelResolverService } from 'vs/editor/common/services/resolverService'; +import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; +import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; +import { TestTextFileService, workbenchInstantiationService } from 'vs/workbench/test/workbenchTestServices'; import { TPromise } from "vs/base/common/winjs.base"; -import { IModel } from "vs/editor/common/editorCommon"; -import { IInstantiationService } from "vs/platform/instantiation/common/instantiation"; +import { IModel } from 'vs/editor/common/editorCommon'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; class MyEditorModel extends EditorModel { } class MyTextEditorModel extends BaseTextEditorModel { } From 03284d80534cf2bc57b777f47783a1475608cd6b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 25 May 2017 10:44:49 +0200 Subject: [PATCH 1041/1164] a18y: avoid duplicate events when navigating trees (for #26730) --- src/vs/base/parts/tree/browser/treeView.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/vs/base/parts/tree/browser/treeView.ts b/src/vs/base/parts/tree/browser/treeView.ts index 117e60db01d..3e27c21e709 100644 --- a/src/vs/base/parts/tree/browser/treeView.ts +++ b/src/vs/base/parts/tree/browser/treeView.ts @@ -197,22 +197,18 @@ export class ViewItem implements IViewItem { // ARIA this.element.setAttribute('role', 'treeitem'); + const ariaLabel = this.context.accessibilityProvider.getAriaLabel(this.context.tree, this.model.getElement()); + if (ariaLabel) { + this.element.setAttribute('aria-label', ariaLabel); + } if (this.model.hasTrait('focused')) { const base64Id = strings.safeBtoa(this.model.id); - const ariaLabel = this.context.accessibilityProvider.getAriaLabel(this.context.tree, this.model.getElement()); this.element.setAttribute('aria-selected', 'true'); this.element.setAttribute('id', base64Id); - if (ariaLabel) { - this.element.setAttribute('aria-label', ariaLabel); - } else { - this.element.setAttribute('aria-labelledby', base64Id); // force screen reader to compute label from children (helps NVDA at least) - } } else { this.element.setAttribute('aria-selected', 'false'); this.element.removeAttribute('id'); - this.element.removeAttribute('aria-label'); - this.element.removeAttribute('aria-labelledby'); } if (this.model.hasChildren()) { this.element.setAttribute('aria-expanded', String(!!this.model.isExpanded())); From e4d9b4d9ed6959c200e464f33cb9b6c00cda52f8 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 25 May 2017 12:06:05 +0200 Subject: [PATCH 1042/1164] clean up unused code --- src/vs/workbench/electron-browser/shell.ts | 23 +++------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index bec5d37606b..da3ce116627 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -62,7 +62,7 @@ import { IContextViewService } from 'vs/platform/contextview/browser/contextView import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { IMessageService, IChoiceService, Severity, CloseAction } from 'vs/platform/message/common/message'; +import { IMessageService, IChoiceService, Severity } from 'vs/platform/message/common/message'; import { ChoiceChannel } from 'vs/platform/message/common/messageIpc'; import { ISearchService } from 'vs/platform/search/common/search'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; @@ -87,7 +87,6 @@ import { URLChannelClient } from 'vs/platform/url/common/urlIpc'; import { IURLService } from 'vs/platform/url/common/url'; import { IBackupService } from 'vs/platform/backup/common/backup'; import { BackupChannelClient } from 'vs/platform/backup/common/backupIpc'; -import { ReportPerformanceIssueAction } from 'vs/workbench/electron-browser/actions'; import { ExtensionHostProcessWorker } from 'vs/workbench/electron-browser/extensionHost'; import { ITimerService } from 'vs/workbench/services/timer/common/timerService'; import { remote, ipcRenderer as ipc } from 'electron'; @@ -198,7 +197,7 @@ export class WorkbenchShell { onWorkbenchStarted: (info: IWorkbenchStartedInfo) => { // run workbench started logic - this.onWorkbenchStarted(instantiationService, info); + this.onWorkbenchStarted(info); // start cached data manager instantiationService.createInstance(NodeCachedDataManager); @@ -221,7 +220,7 @@ export class WorkbenchShell { return workbenchContainer; } - private onWorkbenchStarted(instantiationService: IInstantiationService, info: IWorkbenchStartedInfo): void { + private onWorkbenchStarted(info: IWorkbenchStartedInfo): void { // Telemetry: workspace info const { filesToOpen, filesToCreate, filesToDiff } = this.options; @@ -248,12 +247,6 @@ export class WorkbenchShell { this.timerService.restoreViewletDuration = info.restoreViewletDuration; this.extensionService.onReady().done(() => { this.telemetryService.publicLog('startupTime', this.timerService.startupMetrics); - - // Check for negative performance numbers (insiders only) - // TODO@Ben remove me - if (product.quality !== 'stable' && this.timerService.startupMetrics.ellapsed < 0) { - this.handleNegativePerformanceNumbers(instantiationService, this.timerService.startupMetrics.ellapsed); - } }); // Telemetry: workspace tags @@ -266,16 +259,6 @@ export class WorkbenchShell { } } - private handleNegativePerformanceNumbers(i: IInstantiationService, time: number): void { - this.messageService.show(Severity.Warning, { - message: `Something went wrong measuring startup performance numbers (ellapsed: ${time}ms). We would like to learn more about this issue.`, - actions: [ - i.createInstance(ReportPerformanceIssueAction, ReportPerformanceIssueAction.ID, ReportPerformanceIssueAction.LABEL), - CloseAction - ] - }); - } - private initServiceCollection(container: HTMLElement): [IInstantiationService, ServiceCollection] { const disposables = new Disposables(); From 8ee8d60b837b978c807a06a3800bfacd4fba53b0 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 25 May 2017 12:16:33 +0200 Subject: [PATCH 1043/1164] Uncaught TypeError: Cannot read property 'isActive' of undefined (fixes #27257) --- src/vs/workbench/browser/parts/editor/tabsTitleControl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index 39993429952..de3fda8a4d5 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -212,7 +212,7 @@ export class TabsTitleControl extends TitleControl { private updateDropFeedback(element: HTMLElement, isDND: boolean, index?: number): void { const isTab = (typeof index === 'number'); - const isActiveTab = isTab && this.context.isActive(this.context.getEditor(index)); + const isActiveTab = isTab && this.context && this.context.isActive(this.context.getEditor(index)); // Background const noDNDBackgroundColor = isTab ? this.getColor(isActiveTab ? TAB_ACTIVE_BACKGROUND : TAB_INACTIVE_BACKGROUND) : null; From 51a10b5ebe173ff28ef55f4dde9579778dc42295 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Thu, 25 May 2017 12:21:18 +0200 Subject: [PATCH 1044/1164] theming - fix color clash when dragging over selected or focused item --- src/vs/base/parts/tree/browser/treeView.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/base/parts/tree/browser/treeView.ts b/src/vs/base/parts/tree/browser/treeView.ts index 3e27c21e709..fbbef901f54 100644 --- a/src/vs/base/parts/tree/browser/treeView.ts +++ b/src/vs/base/parts/tree/browser/treeView.ts @@ -602,7 +602,7 @@ export class TreeView extends HeightMap { if (styles.listDropBackground) { content.push(` .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-wrapper.drop-target, - .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row.drop-target { background-color: ${styles.listDropBackground} !important; } + .monaco-tree.monaco-tree-instance-${this.instance} .monaco-tree-rows > .monaco-tree-row.drop-target { background-color: ${styles.listDropBackground} !important; color: inherit !important; } `); } From d264b70f2015d7469385bd156a57dd8663921dbb Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 09:24:50 +0200 Subject: [PATCH 1045/1164] [docker] update grammar --- build/npm/update-grammar.js | 30 ++++++++++++------- extensions/docker/package.json | 2 +- .../docker/syntaxes/docker.tmLanguage.json | 7 +++-- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/build/npm/update-grammar.js b/build/npm/update-grammar.js index 4b0408b89b2..dbb12cdcb44 100644 --- a/build/npm/update-grammar.js +++ b/build/npm/update-grammar.js @@ -25,19 +25,28 @@ function getOptions(urlString) { } } -function download(url) { -return new Promise((c, e) => { - var content = ''; - var request = https.get(getOptions(url), function (response) { +function download(url, redirectCount) { + return new Promise((c, e) => { + var content = ''; + https.get(getOptions(url), function (response) { response.on('data', function (data) { content += data.toString(); }).on('end', function () { + let count = redirectCount || 0; + if (count < 5 && response.statusCode >= 300 && response.statusCode <= 303 || response.statusCode === 307) { + let location = response.headers['location']; + if (location) { + console.log("Redirected " + url + " to " + location); + download(location, count+1).then(c, e); + return; + } + } c(content); }); }).on('error', function (err) { e(err.message); }); -}); + }); } function getCommitSha(repoId, repoPath) { @@ -46,14 +55,15 @@ function getCommitSha(repoId, repoPath) { try { let lastCommit = JSON.parse(content)[0]; return Promise.resolve({ - commitSha : lastCommit.sha, - commitDate : lastCommit.commit.author.date + commitSha: lastCommit.sha, + commitDate: lastCommit.commit.author.date }); } catch (e) { + console.error("Failed extracting the SHA: " + content); return Promise.resolve(null); } }, function () { - console.err('Failed loading ' + commitInfo); + console.error('Failed loading ' + commitInfo); return Promise.resolve(null); }); } @@ -97,7 +107,7 @@ exports.update = function (repoId, repoPath, dest, modifyGrammar) { } if (path.basename(process.argv[1]) === 'update-grammar.js') { - for (var i = 3; i < process.argv.length; i+=2) { - exports.update(process.argv[2], process.argv[i], process.argv[i+1]); + for (var i = 3; i < process.argv.length; i += 2) { + exports.update(process.argv[2], process.argv[i], process.argv[i + 1]); } } diff --git a/extensions/docker/package.json b/extensions/docker/package.json index 0da40007bc6..e58f0826419 100644 --- a/extensions/docker/package.json +++ b/extensions/docker/package.json @@ -4,7 +4,7 @@ "publisher": "vscode", "engines": { "vscode": "*" }, "scripts": { - "update-grammar": "node ../../build/npm/update-grammar.js docker/docker contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage ./syntaxes/docker.tmLanguage.json" + "update-grammar": "node ../../build/npm/update-grammar.js moby/moby contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage ./syntaxes/docker.tmLanguage.json" }, "contributes": { "languages": [{ diff --git a/extensions/docker/syntaxes/docker.tmLanguage.json b/extensions/docker/syntaxes/docker.tmLanguage.json index caab35092b0..8be1c94055d 100644 --- a/extensions/docker/syntaxes/docker.tmLanguage.json +++ b/extensions/docker/syntaxes/docker.tmLanguage.json @@ -8,9 +8,12 @@ "captures": { "1": { "name": "keyword.other.special-method.dockerfile" + }, + "2": { + "name": "keyword.other.special-method.dockerfile" } }, - "match": "\\s*(?:(FROM|AS))\\s" + "match": "^\\s*\\b(FROM)\\b.*?\\b(AS)\\b" }, { "captures": { @@ -94,5 +97,5 @@ ], "scopeName": "source.dockerfile", "uuid": "a39d8795-59d2-49af-aa00-fe74ee29576e", - "version": "https://github.com/moby/moby/commit/4cb71f80823af345d063cf0ad657e73ce9caa75f" + "version": "https://github.com/moby/moby/commit/8523e9d108a0e98865673701a7bd0a7929c5260b" } \ No newline at end of file From 2d811977f822871792e603718edd5f34f2fde4f7 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 09:35:58 +0200 Subject: [PATCH 1046/1164] [scss] update grammar --- extensions/scss/syntaxes/scss.json | 29 +- .../test-cssvariables_scss.json | 12 +- .../scss/test/colorize-results/test_scss.json | 536 +++++++++--------- 3 files changed, 277 insertions(+), 300 deletions(-) diff --git a/extensions/scss/syntaxes/scss.json b/extensions/scss/syntaxes/scss.json index 1f09bd75e56..252cb843115 100644 --- a/extensions/scss/syntaxes/scss.json +++ b/extensions/scss/syntaxes/scss.json @@ -890,15 +890,6 @@ } ] }, - "constant_hex": { - "captures": { - "1": { - "name": "punctuation.definition.constant.scss" - } - }, - "match": "(#)([0-9a-fA-F]{3}|[0-9a-fA-F]{6})\\b", - "name": "constant.numeric.color.hex-value.scss" - }, "constant_important": { "match": "!important", "name": "keyword.other.important.scss" @@ -907,10 +898,6 @@ "match": "\\b(\\+|-|\\*|/)\\b", "name": "support.constant.mathematical-symbols.scss" }, - "constant_number": { - "match": "(\\b([0-9]+(\\.[0-9]+)?)|\\B\\.[0-9]+)(?=\\s*(ch|cm|deg|dpi|dpcm|dppx|em|ex|grad|in|mm|mozmm|ms|pc|pt|px|rad|rem|turn|s|vh|vmin|vmax|vw|\\b))", - "name": "constant.numeric.scss" - }, "constant_optional": { "match": "!optional", "name": "keyword.other.optional.scss" @@ -937,10 +924,6 @@ } ] }, - "constant_unit": { - "match": "(?<=[\\d])(ch|cm|deg|dpi|dpcm|dppx|em|ex|grad|in|mm|mozmm|ms|pc|pt|px|rad|rem|turn|s|vh|vmin|vmax|vw)\\b|%", - "name": "keyword.other.unit.scss" - }, "flow_control": { "patterns": [ { @@ -1242,9 +1225,6 @@ { "include": "#constant_sass_functions" }, - { - "include": "#constant_hex" - }, { "include": "#constant_important" }, @@ -1255,10 +1235,7 @@ "include": "#constant_optional" }, { - "include": "#constant_unit" - }, - { - "include": "#constant_number" + "include": "source.css#numeric-values" }, { "include": "source.css#property-keywords" @@ -1543,7 +1520,7 @@ }, { "match": "\\d+", - "name": "constant.numeric.scss" + "name": "constant.numeric.css" }, { "match": "(?<=\\d)n\\b|\\b(n|even|odd)\\b", @@ -1698,5 +1675,5 @@ "name": "variable.scss" } }, - "version": "https://github.com/atom/language-sass/commit/f477576a0ff819657495142f7e64e577a837fadb" + "version": "https://github.com/atom/language-sass/commit/8b8b7b52655ab5cf4dbe597443abe4b078bb6953" } \ No newline at end of file diff --git a/extensions/scss/test/colorize-results/test-cssvariables_scss.json b/extensions/scss/test/colorize-results/test-cssvariables_scss.json index ff30ea6b973..e51a05d345f 100644 --- a/extensions/scss/test/colorize-results/test-cssvariables_scss.json +++ b/extensions/scss/test/colorize-results/test-cssvariables_scss.json @@ -89,7 +89,7 @@ }, { "c": "6", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -100,7 +100,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -177,7 +177,7 @@ }, { "c": "4", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -397,7 +397,7 @@ }, { "c": "4", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -496,7 +496,7 @@ }, { "c": "5", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -507,7 +507,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", diff --git a/extensions/scss/test/colorize-results/test_scss.json b/extensions/scss/test/colorize-results/test_scss.json index 4f699f59ebf..ffcdbc7f034 100644 --- a/extensions/scss/test/colorize-results/test_scss.json +++ b/extensions/scss/test/colorize-results/test_scss.json @@ -287,7 +287,7 @@ }, { "c": "97", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -298,7 +298,7 @@ }, { "c": "%", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -430,7 +430,7 @@ }, { "c": "2", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -441,7 +441,7 @@ }, { "c": "em", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -705,7 +705,7 @@ }, { "c": "3", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -716,7 +716,7 @@ }, { "c": "em", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -1332,7 +1332,7 @@ }, { "c": "2", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1343,7 +1343,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -1365,7 +1365,7 @@ }, { "c": "3", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1376,7 +1376,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -1486,7 +1486,7 @@ }, { "c": "30", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1497,7 +1497,7 @@ }, { "c": "em", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -1849,7 +1849,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1937,7 +1937,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -1948,7 +1948,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -2157,7 +2157,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -2278,7 +2278,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -2839,7 +2839,7 @@ }, { "c": "5", - "t": "source.css.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -2850,7 +2850,7 @@ }, { "c": "em", - "t": "source.css.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -3059,7 +3059,7 @@ }, { "c": "6", - "t": "source.css.scss meta.property-list.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -3070,7 +3070,7 @@ }, { "c": "em", - "t": "source.css.scss meta.property-list.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -3202,7 +3202,7 @@ }, { "c": "12", - "t": "source.css.scss meta.property-list.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -3213,7 +3213,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -3279,7 +3279,7 @@ }, { "c": "30", - "t": "source.css.scss meta.property-list.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -3290,7 +3290,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -3862,7 +3862,7 @@ }, { "c": "100", - "t": "source.css.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -3895,7 +3895,7 @@ }, { "c": "100", - "t": "source.css.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -3928,7 +3928,7 @@ }, { "c": "225", - "t": "source.css.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -3961,7 +3961,7 @@ }, { "c": "0.25", - "t": "source.css.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4137,7 +4137,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4148,7 +4148,7 @@ }, { "c": "em", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -4192,7 +4192,7 @@ }, { "c": "2", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4203,7 +4203,7 @@ }, { "c": "em", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -4258,7 +4258,7 @@ }, { "c": "3", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4324,24 +4324,24 @@ }, { "c": "#", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "010203", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -4379,24 +4379,24 @@ }, { "c": "#", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "040506", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -4577,7 +4577,7 @@ }, { "c": "3", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4588,7 +4588,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -4632,7 +4632,7 @@ }, { "c": "4", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4643,7 +4643,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -4764,7 +4764,7 @@ }, { "c": "5", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss string.quoted.double.scss variable.interpolation.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss string.quoted.double.scss variable.interpolation.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4808,7 +4808,7 @@ }, { "c": "10", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss string.quoted.double.scss variable.interpolation.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss string.quoted.double.scss variable.interpolation.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4929,7 +4929,7 @@ }, { "c": "0", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4962,7 +4962,7 @@ }, { "c": "100", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -4973,7 +4973,7 @@ }, { "c": "%", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -5006,7 +5006,7 @@ }, { "c": "50", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -5017,7 +5017,7 @@ }, { "c": "%", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -5149,7 +5149,7 @@ }, { "c": "0", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -5215,7 +5215,7 @@ }, { "c": "100", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -5226,7 +5226,7 @@ }, { "c": "%", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -5292,7 +5292,7 @@ }, { "c": "50", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -5303,7 +5303,7 @@ }, { "c": "%", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -5413,7 +5413,7 @@ }, { "c": "40", - "t": "source.css.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -5424,7 +5424,7 @@ }, { "c": "px", - "t": "source.css.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -5479,7 +5479,7 @@ }, { "c": "10", - "t": "source.css.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -5490,7 +5490,7 @@ }, { "c": "px", - "t": "source.css.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -5798,7 +5798,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.at-rule.return.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.at-rule.return.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -5996,7 +5996,7 @@ }, { "c": "5", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -6722,7 +6722,7 @@ }, { "c": "300", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -6733,7 +6733,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -6975,7 +6975,7 @@ }, { "c": "500", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -6986,7 +6986,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -7162,7 +7162,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -7173,7 +7173,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -7195,24 +7195,24 @@ }, { "c": "#", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "f00", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -7272,24 +7272,24 @@ }, { "c": "#", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "fdd", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -7459,7 +7459,7 @@ }, { "c": "3", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -7470,7 +7470,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -7756,7 +7756,7 @@ }, { "c": "2", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -7767,7 +7767,7 @@ }, { "c": "em", - "t": "source.css.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -8438,7 +8438,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -8449,7 +8449,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -8823,7 +8823,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -8834,7 +8834,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -9274,7 +9274,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -9318,7 +9318,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -9362,7 +9362,7 @@ }, { "c": "2", - "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -9439,7 +9439,7 @@ }, { "c": "1", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -9450,7 +9450,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -9560,7 +9560,7 @@ }, { "c": "5", - "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -9604,7 +9604,7 @@ }, { "c": "3", - "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -9681,7 +9681,7 @@ }, { "c": "2", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -9692,7 +9692,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -9857,7 +9857,7 @@ }, { "c": "3", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -9868,7 +9868,7 @@ }, { "c": "px", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -10495,7 +10495,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.for.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.for.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -10539,7 +10539,7 @@ }, { "c": "3", - "t": "source.css.scss meta.at-rule.for.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.for.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -10704,7 +10704,7 @@ }, { "c": "2", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -10715,7 +10715,7 @@ }, { "c": "em", - "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -11298,7 +11298,7 @@ }, { "c": "6", - "t": "source.css.scss meta.at-rule.each.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -11397,7 +11397,7 @@ }, { "c": "0", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -11562,7 +11562,7 @@ }, { "c": "2", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -11573,7 +11573,7 @@ }, { "c": "em", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.em.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -11749,7 +11749,7 @@ }, { "c": "2", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -12035,7 +12035,7 @@ }, { "c": "0", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.for.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.for.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -12387,7 +12387,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.at-rule.if.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -12475,7 +12475,7 @@ }, { "c": "100", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -12486,7 +12486,7 @@ }, { "c": "%", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -12970,7 +12970,7 @@ }, { "c": "20", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -12981,7 +12981,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -13135,24 +13135,24 @@ }, { "c": "#", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "ff0000", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -13333,7 +13333,7 @@ }, { "c": "4", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -13344,7 +13344,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -13520,7 +13520,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.at-rule.mixin.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.at-rule.mixin.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -13531,7 +13531,7 @@ }, { "c": "in", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.at-rule.mixin.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.at-rule.mixin.scss constant.numeric.css keyword.other.unit.in.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -14455,7 +14455,7 @@ }, { "c": "0", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -14466,7 +14466,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -14488,7 +14488,7 @@ }, { "c": "4", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -14499,7 +14499,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -14521,7 +14521,7 @@ }, { "c": "5", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -14532,7 +14532,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -14554,24 +14554,24 @@ }, { "c": "#", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "666", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -14587,7 +14587,7 @@ }, { "c": "2", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -14598,7 +14598,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -14620,7 +14620,7 @@ }, { "c": "6", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -14631,7 +14631,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -14653,7 +14653,7 @@ }, { "c": "10", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -14664,7 +14664,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -14686,24 +14686,24 @@ }, { "c": "#", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "999", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.include.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -15148,24 +15148,24 @@ }, { "c": "#", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "ff0000", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -15181,24 +15181,24 @@ }, { "c": "#", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "00ff00", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -15214,24 +15214,24 @@ }, { "c": "#", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "0000ff", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -16479,7 +16479,7 @@ }, { "c": "4", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -16490,7 +16490,7 @@ }, { "c": "cm", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.cm.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -16556,7 +16556,7 @@ }, { "c": "3", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -16567,7 +16567,7 @@ }, { "c": "cm", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.cm.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -16798,7 +16798,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -16809,7 +16809,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -17084,7 +17084,7 @@ }, { "c": "0", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.set.variable.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -17128,24 +17128,24 @@ }, { "c": "#", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss punctuation.definition.constant.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css punctuation.definition.constant.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { "c": "123", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.color.hex-value.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.other.color.rgb-value.hex.css", "r": { - "dark_plus": "constant.numeric: #B5CEA8", - "light_plus": "constant.numeric: #09885A", - "dark_vs": "constant.numeric: #B5CEA8", - "light_vs": "constant.numeric: #09885A", - "hc_black": "constant.numeric: #B5CEA8" + "dark_plus": "constant.other.color.rgb-value: #CE9178", + "light_plus": "constant.other.color.rgb-value: #0451A5", + "dark_vs": "default: #D4D4D4", + "light_vs": "constant.other.color.rgb-value: #0451A5", + "hc_black": "constant.other.color.rgb-value: #CE9178" } }, { @@ -17205,7 +17205,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -17656,7 +17656,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -17667,7 +17667,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -17777,7 +17777,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -17788,7 +17788,7 @@ }, { "c": "px", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss keyword.other.unit.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -18470,7 +18470,7 @@ }, { "c": "0", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -18569,7 +18569,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -18701,7 +18701,7 @@ }, { "c": "2", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -18811,7 +18811,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -19009,7 +19009,7 @@ }, { "c": "0", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -19141,7 +19141,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -19328,7 +19328,7 @@ }, { "c": "0", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -19460,7 +19460,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -19647,7 +19647,7 @@ }, { "c": "0", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -19757,7 +19757,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.property-list.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -19966,7 +19966,7 @@ }, { "c": "0", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", @@ -20098,7 +20098,7 @@ }, { "c": "1", - "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.scss", + "t": "source.css.scss meta.at-rule.each.scss meta.at-rule.while.scss meta.property-list.scss meta.at-rule.keyframes.scss meta.property-list.scss meta.property-value.scss constant.numeric.css", "r": { "dark_plus": "constant.numeric: #B5CEA8", "light_plus": "constant.numeric: #09885A", From d57a3ab57e274b315b16545bae70da5db37c1ce2 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 10:36:09 +0200 Subject: [PATCH 1047/1164] [ini] add update script --- extensions/ini/package.json | 11 +- extensions/ini/syntaxes/ini.tmLanguage.json | 114 +++++++++++ extensions/ini/syntaxes/properties.plist | 181 ------------------ .../ini/test/colorize-results/test_ini.json | 54 +++--- 4 files changed, 148 insertions(+), 212 deletions(-) create mode 100644 extensions/ini/syntaxes/ini.tmLanguage.json delete mode 100644 extensions/ini/syntaxes/properties.plist diff --git a/extensions/ini/package.json b/extensions/ini/package.json index b6a9b6c37d0..bfb7bb52215 100644 --- a/extensions/ini/package.json +++ b/extensions/ini/package.json @@ -3,6 +3,9 @@ "version": "0.1.0", "publisher": "vscode", "engines": { "vscode": "*" }, + "scripts": { + "update-grammar": "node ../../build/npm/update-grammar.js textmate/ini.tmbundle Syntaxes/Ini.plist ./syntaxes/ini.tmLanguage.json" + }, "contributes": { "languages": [{ "id": "ini", @@ -19,12 +22,12 @@ }], "grammars": [{ "language": "ini", - "scopeName": "source.properties", - "path": "./syntaxes/properties.plist" + "scopeName": "source.ini", + "path": "./syntaxes/ini.tmLanguage.json" },{ "language": "properties", - "scopeName": "source.properties", - "path": "./syntaxes/properties.plist" + "scopeName": "source.ini", + "path": "./syntaxes/ini.tmLanguage.json" }] } } diff --git a/extensions/ini/syntaxes/ini.tmLanguage.json b/extensions/ini/syntaxes/ini.tmLanguage.json new file mode 100644 index 00000000000..e8f1a0ef9b3 --- /dev/null +++ b/extensions/ini/syntaxes/ini.tmLanguage.json @@ -0,0 +1,114 @@ +{ + "fileTypes": [ + "ini", + "conf" + ], + "keyEquivalent": "^~I", + "name": "Ini", + "patterns": [ + { + "begin": "(^[ \\t]+)?(?=#)", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.comment.leading.ini" + } + }, + "end": "(?!\\G)", + "patterns": [ + { + "begin": "#", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.ini" + } + }, + "end": "\\n", + "name": "comment.line.number-sign.ini" + } + ] + }, + { + "begin": "(^[ \\t]+)?(?=;)", + "beginCaptures": { + "1": { + "name": "punctuation.whitespace.comment.leading.ini" + } + }, + "end": "(?!\\G)", + "patterns": [ + { + "begin": ";", + "beginCaptures": { + "0": { + "name": "punctuation.definition.comment.ini" + } + }, + "end": "\\n", + "name": "comment.line.semicolon.ini" + } + ] + }, + { + "captures": { + "1": { + "name": "keyword.other.definition.ini" + }, + "2": { + "name": "punctuation.separator.key-value.ini" + } + }, + "match": "\\b([a-zA-Z0-9_.-]+)\\b\\s*(=)" + }, + { + "captures": { + "1": { + "name": "punctuation.definition.entity.ini" + }, + "3": { + "name": "punctuation.definition.entity.ini" + } + }, + "match": "^(\\[)(.*?)(\\])", + "name": "entity.name.section.group-title.ini" + }, + { + "begin": "'", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ini" + } + }, + "end": "'", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ini" + } + }, + "name": "string.quoted.single.ini", + "patterns": [ + { + "match": "\\\\.", + "name": "constant.character.escape.ini" + } + ] + }, + { + "begin": "\"", + "beginCaptures": { + "0": { + "name": "punctuation.definition.string.begin.ini" + } + }, + "end": "\"", + "endCaptures": { + "0": { + "name": "punctuation.definition.string.end.ini" + } + }, + "name": "string.quoted.double.ini" + } + ], + "scopeName": "source.ini", + "uuid": "77DC23B6-8A90-11D9-BAA4-000A9584EC8C", + "version": "https://github.com/textmate/ini.tmbundle/commit/2af0cbb0704940f967152616f2f1ff0aae6287a6" +} \ No newline at end of file diff --git a/extensions/ini/syntaxes/properties.plist b/extensions/ini/syntaxes/properties.plist deleted file mode 100644 index 11436566bd5..00000000000 --- a/extensions/ini/syntaxes/properties.plist +++ /dev/null @@ -1,181 +0,0 @@ - - - - - fileTypes - - ini - conf - - keyEquivalent - ^~I - name - Ini - patterns - - - begin - (^[ \t]+)?(?=#) - beginCaptures - - 1 - - name - punctuation.whitespace.comment.leading.ini - - - end - (?!\G) - patterns - - - begin - # - beginCaptures - - 0 - - name - punctuation.definition.comment.ini - - - end - \n - name - comment.line.number-sign.ini - - - - - begin - (^[ \t]+)?(?=;) - beginCaptures - - 1 - - name - punctuation.whitespace.comment.leading.ini - - - end - (?!\G) - patterns - - - begin - ; - beginCaptures - - 0 - - name - punctuation.definition.comment.ini - - - end - \n - name - comment.line.semicolon.ini - - - - - captures - - 1 - - name - keyword.other.definition.ini - - 2 - - name - punctuation.separator.key-value.ini - - - match - \b([a-zA-Z0-9_.-]+)\b\s*(=) - - - captures - - 1 - - name - punctuation.definition.entity.ini - - 3 - - name - punctuation.definition.entity.ini - - - match - ^(\[)(.*?)(\]) - name - entity.name.section.group-title.ini - - - begin - ' - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ini - - - end - ' - endCaptures - - 0 - - name - punctuation.definition.string.end.ini - - - name - string.quoted.single.ini - patterns - - - match - \\. - name - constant.character.escape.ini - - - - - begin - " - beginCaptures - - 0 - - name - punctuation.definition.string.begin.ini - - - end - " - endCaptures - - 0 - - name - punctuation.definition.string.end.ini - - - name - string.quoted.double.ini - - - scopeName - source.properties - uuid - 77DC23B6-8A90-11D9-BAA4-000A9584EC8C - - \ No newline at end of file diff --git a/extensions/ini/test/colorize-results/test_ini.json b/extensions/ini/test/colorize-results/test_ini.json index f30cdc53892..5b001c68246 100644 --- a/extensions/ini/test/colorize-results/test_ini.json +++ b/extensions/ini/test/colorize-results/test_ini.json @@ -1,7 +1,7 @@ [ { "c": ";", - "t": "source.properties comment.line.semicolon.ini punctuation.definition.comment.ini", + "t": "source.ini comment.line.semicolon.ini punctuation.definition.comment.ini", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -12,7 +12,7 @@ }, { "c": " last modified 1 April 2001 by John Doe", - "t": "source.properties comment.line.semicolon.ini", + "t": "source.ini comment.line.semicolon.ini", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -23,7 +23,7 @@ }, { "c": "[", - "t": "source.properties entity.name.section.group-title.ini punctuation.definition.entity.ini", + "t": "source.ini entity.name.section.group-title.ini punctuation.definition.entity.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -34,7 +34,7 @@ }, { "c": "owner", - "t": "source.properties entity.name.section.group-title.ini", + "t": "source.ini entity.name.section.group-title.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -45,7 +45,7 @@ }, { "c": "]", - "t": "source.properties entity.name.section.group-title.ini punctuation.definition.entity.ini", + "t": "source.ini entity.name.section.group-title.ini punctuation.definition.entity.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -56,7 +56,7 @@ }, { "c": "name", - "t": "source.properties keyword.other.definition.ini", + "t": "source.ini keyword.other.definition.ini", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", @@ -67,7 +67,7 @@ }, { "c": "=", - "t": "source.properties punctuation.separator.key-value.ini", + "t": "source.ini punctuation.separator.key-value.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -78,7 +78,7 @@ }, { "c": "John Doe", - "t": "source.properties", + "t": "source.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -89,7 +89,7 @@ }, { "c": "organization", - "t": "source.properties keyword.other.definition.ini", + "t": "source.ini keyword.other.definition.ini", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", @@ -100,7 +100,7 @@ }, { "c": "=", - "t": "source.properties punctuation.separator.key-value.ini", + "t": "source.ini punctuation.separator.key-value.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -111,7 +111,7 @@ }, { "c": "Acme Widgets Inc.", - "t": "source.properties", + "t": "source.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -122,7 +122,7 @@ }, { "c": "[", - "t": "source.properties entity.name.section.group-title.ini punctuation.definition.entity.ini", + "t": "source.ini entity.name.section.group-title.ini punctuation.definition.entity.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -133,7 +133,7 @@ }, { "c": "database", - "t": "source.properties entity.name.section.group-title.ini", + "t": "source.ini entity.name.section.group-title.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -144,7 +144,7 @@ }, { "c": "]", - "t": "source.properties entity.name.section.group-title.ini punctuation.definition.entity.ini", + "t": "source.ini entity.name.section.group-title.ini punctuation.definition.entity.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -155,7 +155,7 @@ }, { "c": ";", - "t": "source.properties comment.line.semicolon.ini punctuation.definition.comment.ini", + "t": "source.ini comment.line.semicolon.ini punctuation.definition.comment.ini", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -166,7 +166,7 @@ }, { "c": " use IP address in case network name resolution is not working", - "t": "source.properties comment.line.semicolon.ini", + "t": "source.ini comment.line.semicolon.ini", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -177,7 +177,7 @@ }, { "c": "server", - "t": "source.properties keyword.other.definition.ini", + "t": "source.ini keyword.other.definition.ini", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", @@ -188,7 +188,7 @@ }, { "c": "=", - "t": "source.properties punctuation.separator.key-value.ini", + "t": "source.ini punctuation.separator.key-value.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -199,7 +199,7 @@ }, { "c": "192.0.2.62", - "t": "source.properties", + "t": "source.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -210,7 +210,7 @@ }, { "c": "port", - "t": "source.properties keyword.other.definition.ini", + "t": "source.ini keyword.other.definition.ini", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", @@ -221,7 +221,7 @@ }, { "c": "=", - "t": "source.properties punctuation.separator.key-value.ini", + "t": "source.ini punctuation.separator.key-value.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -232,7 +232,7 @@ }, { "c": "143", - "t": "source.properties", + "t": "source.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -243,7 +243,7 @@ }, { "c": "file", - "t": "source.properties keyword.other.definition.ini", + "t": "source.ini keyword.other.definition.ini", "r": { "dark_plus": "keyword: #569CD6", "light_plus": "keyword: #0000FF", @@ -254,7 +254,7 @@ }, { "c": "=", - "t": "source.properties punctuation.separator.key-value.ini", + "t": "source.ini punctuation.separator.key-value.ini", "r": { "dark_plus": "default: #D4D4D4", "light_plus": "default: #000000", @@ -265,7 +265,7 @@ }, { "c": "\"", - "t": "source.properties string.quoted.double.ini punctuation.definition.string.begin.ini", + "t": "source.ini string.quoted.double.ini punctuation.definition.string.begin.ini", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -276,7 +276,7 @@ }, { "c": "payroll.dat", - "t": "source.properties string.quoted.double.ini", + "t": "source.ini string.quoted.double.ini", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", @@ -287,7 +287,7 @@ }, { "c": "\"", - "t": "source.properties string.quoted.double.ini punctuation.definition.string.end.ini", + "t": "source.ini string.quoted.double.ini punctuation.definition.string.end.ini", "r": { "dark_plus": "string: #CE9178", "light_plus": "string: #A31515", From 984750930c8623f1a31c653495919a66cde5f216 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 11:27:32 +0200 Subject: [PATCH 1048/1164] update all grammars script --- build/npm/update-all-grammars.js | 74 ++++++++++++++++++++++++++++++ extensions/typescript/package.json | 2 +- package.json | 3 +- 3 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 build/npm/update-all-grammars.js diff --git a/build/npm/update-all-grammars.js b/build/npm/update-all-grammars.js new file mode 100644 index 00000000000..252b0f4edcb --- /dev/null +++ b/build/npm/update-all-grammars.js @@ -0,0 +1,74 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +const cp = require('child_process'); +const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm'; +const integrationTests = process.platform === 'win32' ? '.\test-integration.bat' : './test-integration.sh'; + +function updateGrammar(location) { + const result = cp.spawnSync(npm, ['run', 'update-grammar'], { + cwd: location, + stdio: 'inherit' + }); + + if (result.error || result.status !== 0) { + process.exit(1); + } +} + +const extensions = [ + // 'bat' Grammar no longer available + 'clojure', + 'coffeescript', + 'cpp', + 'csharp', + 'css', + 'diff', + 'docker', + 'fsharp', + 'gitsyntax', + 'go', + 'groovy', + 'handlebars', + 'hlsl', + 'html', + 'ini', + 'java', + // 'javascript', updated through JavaScript + // 'json', customized + 'less', + 'lua', + 'make', + 'markdown', + 'objective-c', + 'perl', + 'php', + // 'powershell', grammar not ready yet, @daviwil will ping when ready + 'pug', + 'python', + 'r', + 'razor', + 'ruby', + 'rust', + 'scss', + 'shaderlab', + 'shellscript', + // 'sql', customized, PRs pending + 'swift', + 'typescript', + 'vb', + 'xml', + 'yaml' +]; + +extensions.forEach(extension => updateGrammar(`extensions/${extension}`)); + +// run integration tests + +if (process.platform === 'win32') { + cp.spawn('.\scripts\test-integration.bat', [], { env: process.env, stdio: 'inherit' }); +} else { + cp.spawn('/bin/bash', ['./scripts/test-integration.sh'], { env: process.env, stdio: 'inherit' }); +} \ No newline at end of file diff --git a/extensions/typescript/package.json b/extensions/typescript/package.json index a24c0c10519..461cb773a4d 100644 --- a/extensions/typescript/package.json +++ b/extensions/typescript/package.json @@ -21,7 +21,7 @@ }, "scripts": { "vscode:prepublish": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:typescript ./tsconfig.json", - "update-grammars": "node ./build/update-grammars.js" + "update-grammar": "node ./build/update-grammars.js" }, "activationEvents": [ "onLanguage:javascript", diff --git a/package.json b/package.json index 236e9d787e5..c31f58f40c9 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "monaco-editor-test": "mocha --only-monaco-editor", "precommit": "node build/gulpfile.hygiene.js", "gulp": "gulp --max_old_space_size=4096", - "7z": "7z" + "7z": "7z", + "update-grammars": "node build/npm/update-all-grammars.js" }, "dependencies": { "applicationinsights": "0.17.1", From b135eef9926bcac95f84c1b63ac43e9ff6038918 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 11:27:46 +0200 Subject: [PATCH 1049/1164] [clojure] update grammar --- .../clojure/syntaxes/clojure.tmLanguage.json | 25 +++++-------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/extensions/clojure/syntaxes/clojure.tmLanguage.json b/extensions/clojure/syntaxes/clojure.tmLanguage.json index 6e2d50b5ea5..881ce191e1c 100644 --- a/extensions/clojure/syntaxes/clojure.tmLanguage.json +++ b/extensions/clojure/syntaxes/clojure.tmLanguage.json @@ -64,14 +64,11 @@ }, { "include": "#symbol" - }, - { - "include": "#whitespace" } ], "repository": { "comment": { - "begin": ";", + "begin": "(? Date: Thu, 25 May 2017 11:27:59 +0200 Subject: [PATCH 1050/1164] [cpp] update grammar --- extensions/cpp/syntaxes/c++.json | 5 +- .../cpp/test/colorize-results/test_cc.json | 118 +++++++++++++++++- 2 files changed, 118 insertions(+), 5 deletions(-) diff --git a/extensions/cpp/syntaxes/c++.json b/extensions/cpp/syntaxes/c++.json index 0d20c95fb60..7ec3054f58b 100644 --- a/extensions/cpp/syntaxes/c++.json +++ b/extensions/cpp/syntaxes/c++.json @@ -425,6 +425,9 @@ { "match": "\\\\x\\h+", "name": "constant.character.escape.cpp" + }, + { + "include": "source.c#string_placeholder" } ] }, @@ -455,5 +458,5 @@ ] } }, - "version": "https://github.com/atom/language-c/commit/a74c2f967d73e802a67fa6e971a8e8dedf076597" + "version": "https://github.com/atom/language-c/commit/3a269f88b12e512fb9495dc006a1dabf325d3d7f" } \ No newline at end of file diff --git a/extensions/cpp/test/colorize-results/test_cc.json b/extensions/cpp/test/colorize-results/test_cc.json index 3f7be3caeb8..845a693b3ab 100644 --- a/extensions/cpp/test/colorize-results/test_cc.json +++ b/extensions/cpp/test/colorize-results/test_cc.json @@ -110,7 +110,29 @@ } }, { - "c": "num_candidate_ret=%d:", + "c": "num_candidate_ret=", + "t": "source.cpp meta.function.c string.quoted.double.cpp", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": "%d", + "t": "source.cpp meta.function.c string.quoted.double.cpp constant.other.placeholder.c", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": ":", "t": "source.cpp meta.function.c string.quoted.double.cpp", "r": { "dark_plus": "string: #CE9178", @@ -407,7 +429,18 @@ } }, { - "c": "%d,", + "c": "%d", + "t": "source.cpp meta.function.c string.quoted.double.cpp constant.other.placeholder.c", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": ",", "t": "source.cpp meta.function.c string.quoted.double.cpp", "r": { "dark_plus": "string: #CE9178", @@ -1375,7 +1408,7 @@ } }, { - "c": "STYLE=Keramik;TITLE=%s;THEME=%s", + "c": "STYLE=Keramik;TITLE=", "t": "source.cpp meta.block.c string.quoted.double.cpp", "r": { "dark_plus": "string: #CE9178", @@ -1385,6 +1418,39 @@ "hc_black": "string: #CE9178" } }, + { + "c": "%s", + "t": "source.cpp meta.block.c string.quoted.double.cpp constant.other.placeholder.c", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": ";THEME=", + "t": "source.cpp meta.block.c string.quoted.double.cpp", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": "%s", + "t": "source.cpp meta.block.c string.quoted.double.cpp constant.other.placeholder.c", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, { "c": "\"", "t": "source.cpp meta.block.c string.quoted.double.cpp punctuation.definition.string.end.cpp", @@ -1705,7 +1771,51 @@ } }, { - "c": "movw $0x38, %ax; ltr %ax", + "c": "movw $0x38, ", + "t": "source.cpp meta.block.c meta.function-call.c string.quoted.double.cpp", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": "%a", + "t": "source.cpp meta.block.c meta.function-call.c string.quoted.double.cpp constant.other.placeholder.c", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": "x; ltr ", + "t": "source.cpp meta.block.c meta.function-call.c string.quoted.double.cpp", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": "%a", + "t": "source.cpp meta.block.c meta.function-call.c string.quoted.double.cpp constant.other.placeholder.c", + "r": { + "dark_plus": "string: #CE9178", + "light_plus": "string: #A31515", + "dark_vs": "string: #CE9178", + "light_vs": "string: #A31515", + "hc_black": "string: #CE9178" + } + }, + { + "c": "x", "t": "source.cpp meta.block.c meta.function-call.c string.quoted.double.cpp", "r": { "dark_plus": "string: #CE9178", From 3785324cc135d0fb4738f88d0840770d7cc931b0 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 11:28:13 +0200 Subject: [PATCH 1051/1164] [css] update grammar --- extensions/css/syntaxes/css.tmLanguage.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/css/syntaxes/css.tmLanguage.json b/extensions/css/syntaxes/css.tmLanguage.json index 072b9cd3051..700b6dd3140 100644 --- a/extensions/css/syntaxes/css.tmLanguage.json +++ b/extensions/css/syntaxes/css.tmLanguage.json @@ -1328,7 +1328,7 @@ "name": "keyword.other.unit.${2:/downcase}.css" } }, - "match": "(?xi) (? Date: Thu, 25 May 2017 11:28:39 +0200 Subject: [PATCH 1052/1164] [typescript] update grammar --- .../syntaxes/JavaScript.tmLanguage.json | 181 ++++++++++------- .../test/colorize-results/test_jsx.json | 10 +- .../syntaxes/TypeScript.tmLanguage.json | 183 +++++++++++------- .../syntaxes/TypeScriptReact.tmLanguage.json | 181 ++++++++++------- 4 files changed, 330 insertions(+), 225 deletions(-) diff --git a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json index ec077b65656..d7aabe6479b 100644 --- a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json @@ -74,7 +74,7 @@ "name": "storage.type.js" } }, - "end": "(?=$|;|}|(\\s+(of|in)\\s+))", + "end": "(?=$|^|;|}|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#destructuring-variable" @@ -103,7 +103,7 @@ "name": "meta.definition.variable.js entity.name.function.js" } }, - "end": "(?=$|[;,=}]|(\\s+(of|in)\\s+))", + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#var-single-variable-type-annotation" @@ -118,7 +118,7 @@ "name": "meta.definition.variable.js variable.other.constant.js" } }, - "end": "(?=$|[;,=}]|(\\s+(of|in)\\s+))", + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#var-single-variable-type-annotation" @@ -133,7 +133,7 @@ "name": "meta.definition.variable.js variable.other.readwrite.js" } }, - "end": "(?=$|[;,=}]|(\\s+(of|in)\\s+))", + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#var-single-variable-type-annotation" @@ -160,7 +160,7 @@ { "name": "meta.object-binding-pattern-variable.js", "begin": "(?])|(?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)", + "end": "(?=$|^|[,);\\}\\]]|//)|(?==[^>])|(?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)", "patterns": [ { "include": "#comment" @@ -2019,7 +2062,7 @@ "name": "punctuation.definition.typeparameters.begin.js" } }, - "end": "(?=$)|(>)", + "end": "(>)", "endCaptures": { "1": { "name": "punctuation.definition.typeparameters.end.js" @@ -2054,7 +2097,7 @@ "name": "keyword.operator.assignment.js" } }, - "end": "(?=$|[,);}\\]])", + "end": "(?=$|^|[,);}\\]])", "patterns": [ { "include": "#expression" @@ -2693,7 +2736,7 @@ "name": "keyword.control.as.js" } }, - "end": "(?=$|[;,:})\\]])", + "end": "(?=$|^|[;,:})\\]])", "patterns": [ { "include": "#type" @@ -2778,7 +2821,7 @@ }, { "name": "meta.arrow.js", - "begin": "(?x) (?:\n (? is on new line\n (\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n ) |\n (\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends \n ) |\n # arrow function possible to detect only with => on same line\n (\n (<([^<>=]|=[^<]|\\<([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(([^()]|\\([^()]*\\))*\\) # parameteres\n (\\s*:\\s*(.)*)? # return type\n \\s*=> # arrow operator\n )\n )\n)", + "begin": "(?x) (?:\n (? is on new line\n (\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n ) |\n (\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends \n ) |\n # arrow function possible to detect only with => on same line\n (\n (<([^<>=]|=[^<]|\\<([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(([^()]|\\([^()]*\\))*\\) # parameteres\n (\\s*:\\s*(.)*)? # return type\n \\s*=> # arrow operator\n )\n )\n)", "beginCaptures": { "1": { "name": "storage.modifier.async.js" @@ -3358,25 +3401,17 @@ } }, { - "begin": "(^[ \\t]+)?(?=//)", + "begin": "(^[ \\t]+)?(//)", "beginCaptures": { "1": { "name": "punctuation.whitespace.comment.leading.js" + }, + "2": { + "name": "comment.line.double-slash.js punctuation.definition.comment.js" } }, - "end": "(?=$)", - "patterns": [ - { - "name": "comment.line.double-slash.js", - "begin": "//", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.js" - } - }, - "end": "(?=$)" - } - ] + "end": "(?=^)", + "contentName": "comment.line.double-slash.tsx" } ] }, @@ -3388,7 +3423,7 @@ "name": "punctuation.definition.comment.js" } }, - "end": "(?=$)", + "end": "(?=^)", "patterns": [ { "name": "meta.tag.js", @@ -4188,5 +4223,5 @@ ] } }, - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/cb1af7953db224204607cbe22d3a45aa0f77a4c1" + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/8c967fe7553297bfad672b7417d78e357c8fe724" } \ No newline at end of file diff --git a/extensions/javascript/test/colorize-results/test_jsx.json b/extensions/javascript/test/colorize-results/test_jsx.json index 7a9eb1f5ca0..55e2c440d3b 100644 --- a/extensions/javascript/test/colorize-results/test_jsx.json +++ b/extensions/javascript/test/colorize-results/test_jsx.json @@ -529,7 +529,7 @@ }, { "c": " Prevent following the link.", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.js", + "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.tsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -628,7 +628,7 @@ }, { "c": " Invert the chosen default.", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.js", + "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.tsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -661,7 +661,7 @@ }, { "c": " This will trigger an intelligent re-render of the component.", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.js", + "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.tsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -1046,7 +1046,7 @@ }, { "c": " Default to the default message.", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.js", + "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.tsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", @@ -1222,7 +1222,7 @@ }, { "c": " If toggled, show the alternate message.", - "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.js", + "t": "source.js meta.var.expr.js meta.objectliteral.js meta.object.member.js meta.function.expression.js meta.block.js comment.line.double-slash.tsx", "r": { "dark_plus": "comment: #608B4E", "light_plus": "comment: #008000", diff --git a/extensions/typescript/syntaxes/TypeScript.tmLanguage.json b/extensions/typescript/syntaxes/TypeScript.tmLanguage.json index b80d24f1c23..7c581f92aea 100644 --- a/extensions/typescript/syntaxes/TypeScript.tmLanguage.json +++ b/extensions/typescript/syntaxes/TypeScript.tmLanguage.json @@ -71,7 +71,7 @@ "name": "storage.type.ts" } }, - "end": "(?=$|;|}|(\\s+(of|in)\\s+))", + "end": "(?=$|^|;|}|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#destructuring-variable" @@ -100,7 +100,7 @@ "name": "meta.definition.variable.ts entity.name.function.ts" } }, - "end": "(?=$|[;,=}]|(\\s+(of|in)\\s+))", + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#var-single-variable-type-annotation" @@ -115,7 +115,7 @@ "name": "meta.definition.variable.ts variable.other.constant.ts" } }, - "end": "(?=$|[;,=}]|(\\s+(of|in)\\s+))", + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#var-single-variable-type-annotation" @@ -130,7 +130,7 @@ "name": "meta.definition.variable.ts variable.other.readwrite.ts" } }, - "end": "(?=$|[;,=}]|(\\s+(of|in)\\s+))", + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#var-single-variable-type-annotation" @@ -157,7 +157,7 @@ { "name": "meta.object-binding-pattern-variable.ts", "begin": "(?])|(?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)", + "end": "(?=$|^|[,);\\}\\]]|//)|(?==[^>])|(?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)", "patterns": [ { "include": "#comment" @@ -2013,7 +2056,7 @@ "name": "punctuation.definition.typeparameters.begin.ts" } }, - "end": "(?=$)|(>)", + "end": "(>)", "endCaptures": { "1": { "name": "punctuation.definition.typeparameters.end.ts" @@ -2048,7 +2091,7 @@ "name": "keyword.operator.assignment.ts" } }, - "end": "(?=$|[,);}\\]])", + "end": "(?=$|^|[,);}\\]])", "patterns": [ { "include": "#expression" @@ -2487,7 +2530,7 @@ "patterns": [ { "name": "cast.expr.ts", - "begin": "(?:(?<=return|throw|yield|await|default|[=(,:>*]))\\s*(<)(?!*?]))\\s*(<)(?! is on new line\n (\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n ) |\n (\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends \n ) |\n # arrow function possible to detect only with => on same line\n (\n (<([^<>=]|=[^<]|\\<([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(([^()]|\\([^()]*\\))*\\) # parameteres\n (\\s*:\\s*(.)*)? # return type\n \\s*=> # arrow operator\n )\n )\n)", + "begin": "(?x) (?:\n (? is on new line\n (\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n ) |\n (\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends \n ) |\n # arrow function possible to detect only with => on same line\n (\n (<([^<>=]|=[^<]|\\<([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(([^()]|\\([^()]*\\))*\\) # parameteres\n (\\s*:\\s*(.)*)? # return type\n \\s*=> # arrow operator\n )\n )\n)", "beginCaptures": { "1": { "name": "storage.modifier.async.ts" @@ -3389,25 +3432,17 @@ } }, { - "begin": "(^[ \\t]+)?(?=//)", + "begin": "(^[ \\t]+)?(//)", "beginCaptures": { "1": { "name": "punctuation.whitespace.comment.leading.ts" + }, + "2": { + "name": "comment.line.double-slash.ts punctuation.definition.comment.ts" } }, - "end": "(?=$)", - "patterns": [ - { - "name": "comment.line.double-slash.ts", - "begin": "//", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.ts" - } - }, - "end": "(?=$)" - } - ] + "end": "(?=^)", + "contentName": "comment.line.double-slash.ts" } ] }, @@ -3419,7 +3454,7 @@ "name": "punctuation.definition.comment.ts" } }, - "end": "(?=$)", + "end": "(?=^)", "patterns": [ { "name": "meta.tag.ts", @@ -3923,5 +3958,5 @@ ] } }, - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/9f6676aa2ddb75cb5a9dbe1f59024069e839d986" + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/8c967fe7553297bfad672b7417d78e357c8fe724" } \ No newline at end of file diff --git a/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json b/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json index c20889881a1..b2c49cbf7f4 100644 --- a/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json +++ b/extensions/typescript/syntaxes/TypeScriptReact.tmLanguage.json @@ -71,7 +71,7 @@ "name": "storage.type.tsx" } }, - "end": "(?=$|;|}|(\\s+(of|in)\\s+))", + "end": "(?=$|^|;|}|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#destructuring-variable" @@ -100,7 +100,7 @@ "name": "meta.definition.variable.tsx entity.name.function.tsx" } }, - "end": "(?=$|[;,=}]|(\\s+(of|in)\\s+))", + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#var-single-variable-type-annotation" @@ -115,7 +115,7 @@ "name": "meta.definition.variable.tsx variable.other.constant.tsx" } }, - "end": "(?=$|[;,=}]|(\\s+(of|in)\\s+))", + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#var-single-variable-type-annotation" @@ -130,7 +130,7 @@ "name": "meta.definition.variable.tsx variable.other.readwrite.tsx" } }, - "end": "(?=$|[;,=}]|(\\s+(of|in)\\s+))", + "end": "(?=$|^|[;,=}]|(\\s+(of|in)\\s+))", "patterns": [ { "include": "#var-single-variable-type-annotation" @@ -157,7 +157,7 @@ { "name": "meta.object-binding-pattern-variable.tsx", "begin": "(?])|(?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)", + "end": "(?=$|^|[,);\\}\\]]|//)|(?==[^>])|(?<=[\\}>\\]\\)]|[_$[:alpha:]])\\s*(?=\\{)", "patterns": [ { "include": "#comment" @@ -2016,7 +2059,7 @@ "name": "punctuation.definition.typeparameters.begin.tsx" } }, - "end": "(?=$)|(>)", + "end": "(>)", "endCaptures": { "1": { "name": "punctuation.definition.typeparameters.end.tsx" @@ -2051,7 +2094,7 @@ "name": "keyword.operator.assignment.tsx" } }, - "end": "(?=$|[,);}\\]])", + "end": "(?=$|^|[,);}\\]])", "patterns": [ { "include": "#expression" @@ -2690,7 +2733,7 @@ "name": "keyword.control.as.tsx" } }, - "end": "(?=$|[;,:})\\]])", + "end": "(?=$|^|[;,:})\\]])", "patterns": [ { "include": "#type" @@ -2775,7 +2818,7 @@ }, { "name": "meta.arrow.tsx", - "begin": "(?x) (?:\n (? is on new line\n (\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n ) |\n (\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends \n ) |\n # arrow function possible to detect only with => on same line\n (\n (<([^<>=]|=[^<]|\\<([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(([^()]|\\([^()]*\\))*\\) # parameteres\n (\\s*:\\s*(.)*)? # return type\n \\s*=> # arrow operator\n )\n )\n)", + "begin": "(?x) (?:\n (? is on new line\n (\n [(]\\s*\n (\n ([)]\\s*:) | # ():\n ((\\.\\.\\.\\s*)?[_$[:alpha:]][_$[:alnum:]]*\\s*:) # [(]param: | [(]...param:\n )\n ) |\n (\n [<]\\s*[_$[:alpha:]][_$[:alnum:]]*\\s+extends\\s*[^=>] # < typeparam extends \n ) |\n # arrow function possible to detect only with => on same line\n (\n (<([^<>=]|=[^<]|\\<([^=<>]|=[^<])+\\>)+>\\s*)? # typeparameters\n \\(([^()]|\\([^()]*\\))*\\) # parameteres\n (\\s*:\\s*(.)*)? # return type\n \\s*=> # arrow operator\n )\n )\n)", "beginCaptures": { "1": { "name": "storage.modifier.async.tsx" @@ -3355,25 +3398,17 @@ } }, { - "begin": "(^[ \\t]+)?(?=//)", + "begin": "(^[ \\t]+)?(//)", "beginCaptures": { "1": { "name": "punctuation.whitespace.comment.leading.tsx" + }, + "2": { + "name": "comment.line.double-slash.tsx punctuation.definition.comment.tsx" } }, - "end": "(?=$)", - "patterns": [ - { - "name": "comment.line.double-slash.tsx", - "begin": "//", - "beginCaptures": { - "0": { - "name": "punctuation.definition.comment.tsx" - } - }, - "end": "(?=$)" - } - ] + "end": "(?=^)", + "contentName": "comment.line.double-slash.tsx" } ] }, @@ -3385,7 +3420,7 @@ "name": "punctuation.definition.comment.tsx" } }, - "end": "(?=$)", + "end": "(?=^)", "patterns": [ { "name": "meta.tag.tsx", @@ -4185,5 +4220,5 @@ ] } }, - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/cb1af7953db224204607cbe22d3a45aa0f77a4c1" + "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/8c967fe7553297bfad672b7417d78e357c8fe724" } \ No newline at end of file From 7c55d50e827d57fc421ab0940bf9cc32852167c5 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 11:28:58 +0200 Subject: [PATCH 1053/1164] [less] update grammar --- extensions/less/syntaxes/less.tmLanguage.json | 17 +- .../test/colorize-results/14119_less.json | 13 +- .../test-cssvariables_less.json | 28 +- .../less/test/colorize-results/test_less.json | 280 ++++++++++++++++-- 4 files changed, 293 insertions(+), 45 deletions(-) diff --git a/extensions/less/syntaxes/less.tmLanguage.json b/extensions/less/syntaxes/less.tmLanguage.json index 902eb4e8d01..cd25b2a89b5 100644 --- a/extensions/less/syntaxes/less.tmLanguage.json +++ b/extensions/less/syntaxes/less.tmLanguage.json @@ -146,12 +146,7 @@ "name": "comment.block.css" }, { - "match": "[+-]?\\d*\\.?\\d+", - "name": "constant.numeric.css" - }, - { - "match": "(?<=[\\d])(ch|cm|deg|dpi|dpcm|dppx|em|ex|grad|in|mm|ms|pc|pt|px|rad|rem|turn|s|vh|vmin|vw)\\b|%", - "name": "keyword.other.unit.css" + "include": "source.css#numeric-values" }, { "captures": { @@ -281,13 +276,13 @@ ] }, { + "match": "(@|\\-\\-)[\\w-]+(?=\\s*)", + "name": "variable.other.less", "captures": { "1": { "name": "punctuation.definition.variable.less" } - }, - "match": "(?:@|\\-\\-)[a-zA-Z0-9_-][\\w-]*(?=\\s*)", - "name": "variable.other.less" + } }, { "include": "#variable_interpolation" @@ -516,7 +511,7 @@ "include": "#strings" }, { - "match": "(\\b|\\.{0,2}/).*\\b", + "match": "(\\b|\\.{0,2}/)[^)]*\\b", "name": "string.url.css" } ] @@ -546,5 +541,5 @@ "name": "support.function.any-method.builtin.less" } }, - "version": "https://github.com/atom/language-less/commit/7d70b66aa9c853d59e27cce25b5bc25cb067e75a" + "version": "https://github.com/atom/language-less/commit/4661d870784f725599e438bf683553cc6cf0f4ed" } \ No newline at end of file diff --git a/extensions/less/test/colorize-results/14119_less.json b/extensions/less/test/colorize-results/14119_less.json index 6e89b6a4587..0c83af45331 100644 --- a/extensions/less/test/colorize-results/14119_less.json +++ b/extensions/less/test/colorize-results/14119_less.json @@ -33,7 +33,18 @@ } }, { - "c": "@hm", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "hm", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", diff --git a/extensions/less/test/colorize-results/test-cssvariables_less.json b/extensions/less/test/colorize-results/test-cssvariables_less.json index bca9cd3c3a9..1c9b8658a0a 100644 --- a/extensions/less/test/colorize-results/test-cssvariables_less.json +++ b/extensions/less/test/colorize-results/test-cssvariables_less.json @@ -55,7 +55,18 @@ } }, { - "c": "--spacing-unit", + "c": "--", + "t": "source.css.less meta.property-list.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "spacing-unit", "t": "source.css.less meta.property-list.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -100,7 +111,7 @@ }, { "c": "px", - "t": "source.css.less meta.property-list.css meta.property-value.css keyword.other.unit.css", + "t": "source.css.less meta.property-list.css meta.property-value.css constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -132,7 +143,18 @@ } }, { - "c": "--cell-padding", + "c": "--", + "t": "source.css.less meta.property-list.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "cell-padding", "t": "source.css.less meta.property-list.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", diff --git a/extensions/less/test/colorize-results/test_less.json b/extensions/less/test/colorize-results/test_less.json index 4cc47220238..d6b39257feb 100644 --- a/extensions/less/test/colorize-results/test_less.json +++ b/extensions/less/test/colorize-results/test_less.json @@ -308,7 +308,18 @@ } }, { - "c": "@base", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "base", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -385,7 +396,18 @@ } }, { - "c": "@style", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "style", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -418,7 +440,18 @@ } }, { - "c": "@c", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "c", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -506,7 +539,18 @@ } }, { - "c": "@c", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "c", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -594,7 +638,18 @@ } }, { - "c": "@style", + "c": "@", + "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "style", "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -616,7 +671,18 @@ } }, { - "c": "@c", + "c": "@", + "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "c", "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -671,7 +737,18 @@ } }, { - "c": "@style", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "style", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -704,7 +781,18 @@ } }, { - "c": "@alpha", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "alpha", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -749,7 +837,7 @@ }, { "c": "%", - "t": "source.css.less keyword.other.unit.css", + "t": "source.css.less constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -836,7 +924,18 @@ } }, { - "c": "@alpha", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "alpha", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -913,7 +1012,18 @@ } }, { - "c": "@style", + "c": "@", + "t": "source.css.less meta.property-list.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "style", "t": "source.css.less meta.property-list.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -1232,7 +1342,18 @@ } }, { - "c": "@base", + "c": "@", + "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "base", "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -1277,7 +1398,7 @@ }, { "c": "%", - "t": "source.css.less meta.property-list.css meta.property-value.css keyword.other.unit.css", + "t": "source.css.less meta.property-list.css meta.property-value.css constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -1375,7 +1496,18 @@ } }, { - "c": "@base", + "c": "@", + "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "base", "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -1420,7 +1552,7 @@ }, { "c": "%", - "t": "source.css.less meta.property-list.css meta.property-value.css keyword.other.unit.css", + "t": "source.css.less meta.property-list.css meta.property-value.css constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -1585,7 +1717,7 @@ }, { "c": "px", - "t": "source.css.less meta.property-list.css meta.property-list.css keyword.other.unit.css", + "t": "source.css.less meta.property-list.css meta.property-list.css constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -1640,7 +1772,7 @@ }, { "c": "%", - "t": "source.css.less meta.property-list.css meta.property-list.css keyword.other.unit.css", + "t": "source.css.less meta.property-list.css meta.property-list.css constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -1849,7 +1981,7 @@ }, { "c": "px", - "t": "source.css.less meta.property-list.css meta.property-list.css meta.property-value.css keyword.other.unit.css", + "t": "source.css.less meta.property-list.css meta.property-list.css meta.property-value.css constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -2058,7 +2190,7 @@ }, { "c": "px", - "t": "source.css.less meta.property-list.css meta.property-list.css meta.property-value.css keyword.other.unit.css", + "t": "source.css.less meta.property-list.css meta.property-list.css meta.property-value.css constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -2311,7 +2443,7 @@ }, { "c": "px", - "t": "source.css.less meta.property-list.css meta.property-list.css meta.property-list.css meta.property-list.css meta.property-value.css keyword.other.unit.css", + "t": "source.css.less meta.property-list.css meta.property-list.css meta.property-list.css meta.property-list.css meta.property-value.css constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -2398,7 +2530,18 @@ } }, { - "c": "@the-border", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "the-border", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -2443,7 +2586,7 @@ }, { "c": "px", - "t": "source.css.less keyword.other.unit.css", + "t": "source.css.less constant.numeric.css keyword.other.unit.px.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", @@ -2464,7 +2607,18 @@ } }, { - "c": "@base-color", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "base-color", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -2519,7 +2673,18 @@ } }, { - "c": "@red", + "c": "@", + "t": "source.css.less variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "red", "t": "source.css.less variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -2673,7 +2838,18 @@ } }, { - "c": "@base-color", + "c": "@", + "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "base-color", "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -2794,7 +2970,18 @@ } }, { - "c": "@the-border", + "c": "@", + "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "the-border", "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -2871,7 +3058,18 @@ } }, { - "c": "@the-border", + "c": "@", + "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "the-border", "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -3058,7 +3256,18 @@ } }, { - "c": "@base-color", + "c": "@", + "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "base-color", "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -3201,7 +3410,18 @@ } }, { - "c": "@red", + "c": "@", + "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less punctuation.definition.variable.less", + "r": { + "dark_plus": "variable.other.less: #9CDCFE", + "light_plus": "variable.other.less: #FF0000", + "dark_vs": "variable.other.less: #9CDCFE", + "light_vs": "variable.other.less: #FF0000", + "hc_black": "variable.other.less: #D4D4D4" + } + }, + { + "c": "red", "t": "source.css.less meta.property-list.css meta.property-value.css variable.other.less", "r": { "dark_plus": "variable.other.less: #9CDCFE", @@ -3246,7 +3466,7 @@ }, { "c": "%", - "t": "source.css.less meta.property-list.css meta.property-value.css keyword.other.unit.css", + "t": "source.css.less meta.property-list.css meta.property-value.css constant.numeric.css keyword.other.unit.percentage.css", "r": { "dark_plus": "keyword.other.unit: #B5CEA8", "light_plus": "keyword.other.unit: #09885A", From a90342f431ec777932e5ea9665da3a8efc47c055 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 11:29:12 +0200 Subject: [PATCH 1054/1164] [php] update grammar --- extensions/php/syntaxes/php.tmLanguage.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/php/syntaxes/php.tmLanguage.json b/extensions/php/syntaxes/php.tmLanguage.json index d7e3a548ade..8e69579120b 100644 --- a/extensions/php/syntaxes/php.tmLanguage.json +++ b/extensions/php/syntaxes/php.tmLanguage.json @@ -2071,7 +2071,7 @@ "patterns": [ { "comment": "PHPDocumentor only recognises lines with an asterisk as the first non-whitespaces character", - "match": "^(?!\\s*\\*).*$\\n?", + "match": "^(?!\\s*\\*).*?(?:(?=\\*\\/)|$\\n?)", "name": "invalid.illegal.missing-asterisk.phpdoc.php" }, { @@ -2975,5 +2975,5 @@ ] } }, - "version": "https://github.com/atom/language-php/commit/22047c19f52f686de471d0deccae0cb1332997b6" + "version": "https://github.com/atom/language-php/commit/c523a19f849b97f6499eae6accf80564aa190c0e" } \ No newline at end of file From f9084bb2446eb5c42289dd64d4b3b6f92c4d9228 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 12:26:41 +0200 Subject: [PATCH 1055/1164] Add information_for_contributors to grammars --- build/npm/update-all-grammars.js | 1 - build/npm/update-grammar.js | 16 ++++++++++++++-- .../clojure/syntaxes/clojure.tmLanguage.json | 8 ++++++-- .../syntaxes/coffeescript.tmLanguage.json | 8 ++++++-- extensions/cpp/syntaxes/c++.json | 8 ++++++-- extensions/cpp/syntaxes/c.json | 8 ++++++-- .../csharp/syntaxes/csharp.tmLanguage.json | 8 ++++++-- extensions/css/syntaxes/css.tmLanguage.json | 8 ++++++-- extensions/diff/syntaxes/diff.tmLanguage.json | 8 ++++++-- .../docker/syntaxes/docker.tmLanguage.json | 8 ++++++-- extensions/fsharp/syntaxes/fsharp.json | 8 ++++++-- .../syntaxes/git-commit.tmLanguage.json | 8 ++++++-- .../syntaxes/git-rebase.tmLanguage.json | 8 ++++++-- extensions/go/syntaxes/go.json | 8 ++++++-- .../groovy/syntaxes/groovy.tmLanguage.json | 8 ++++++-- .../syntaxes/Handlebars.tmLanguage.json | 8 ++++++-- extensions/hlsl/syntaxes/hlsl.json | 8 ++++++-- extensions/html/syntaxes/html.json | 8 ++++++-- extensions/ini/syntaxes/ini.tmLanguage.json | 8 ++++++-- extensions/java/syntaxes/java.tmLanguage.json | 8 ++++++-- .../syntaxes/JavaScript.tmLanguage.json | 8 ++++++-- extensions/less/syntaxes/less.tmLanguage.json | 8 ++++++-- extensions/lua/syntaxes/lua.json | 8 ++++++-- extensions/make/syntaxes/Makefile.json | 8 ++++++-- .../syntaxes/objective-c++.tmLanguage.json | 5 +++++ .../syntaxes/objective-c.tmLanguage.json | 8 ++++++-- extensions/perl/syntaxes/perl.tmLanguage.json | 8 ++++++-- extensions/perl/syntaxes/perl6.tmLanguage.json | 8 ++++++-- extensions/php/syntaxes/php.tmLanguage.json | 8 ++++++-- extensions/pug/syntaxes/pug.tmLanguage.json | 8 ++++++-- .../python/syntaxes/MagicPython.tmLanguage.json | 8 ++++++-- .../python/syntaxes/MagicRegExp.tmLanguage.json | 8 ++++++-- extensions/r/syntaxes/r.tmLanguage.json | 8 ++++++-- extensions/razor/syntaxes/cshtml.json | 8 ++++++-- extensions/ruby/syntaxes/ruby.tmLanguage.json | 8 ++++++-- extensions/rust/syntaxes/rust.tmLanguage.json | 8 ++++++-- extensions/scss/syntaxes/scss.json | 8 ++++++-- extensions/shaderlab/syntaxes/shaderlab.json | 8 ++++++-- .../syntaxes/Shell-Unix-Bash.tmLanguage.json | 8 ++++++-- extensions/swift/syntaxes/swift.tmLanguage.json | 8 ++++++-- .../syntaxes/TypeScript.tmLanguage.json | 8 ++++++-- .../syntaxes/TypeScriptReact.tmLanguage.json | 8 ++++++-- .../vb/syntaxes/asp-vb-net.tmlanguage.json | 8 ++++++-- extensions/xml/syntaxes/xml.json | 8 ++++++-- extensions/xml/syntaxes/xsl.json | 8 ++++++-- extensions/yaml/syntaxes/yaml.json | 8 ++++++-- 46 files changed, 277 insertions(+), 89 deletions(-) diff --git a/build/npm/update-all-grammars.js b/build/npm/update-all-grammars.js index 252b0f4edcb..88b890af730 100644 --- a/build/npm/update-all-grammars.js +++ b/build/npm/update-all-grammars.js @@ -5,7 +5,6 @@ const cp = require('child_process'); const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm'; -const integrationTests = process.platform === 'win32' ? '.\test-integration.bat' : './test-integration.sh'; function updateGrammar(location) { const result = cp.spawnSync(npm, ['run', 'update-grammar'], { diff --git a/build/npm/update-grammar.js b/build/npm/update-grammar.js index dbb12cdcb44..fca60d83242 100644 --- a/build/npm/update-grammar.js +++ b/build/npm/update-grammar.js @@ -88,11 +88,23 @@ exports.update = function (repoId, repoPath, dest, modifyGrammar) { modifyGrammar(grammar); } return getCommitSha(repoId, repoPath).then(function (info) { + let result = { + information_for_contributors: [ + 'This file has been converted from https://github.com/' + repoId + '/blob/master/' + repoPath, + 'If you want to provide a fix or improvement, please create a pull request against the original repository.', + 'Once accepted there, we are happy to receive an update request.' + ] + }; + if (info) { - grammar.version = 'https://github.com/' + repoId + '/commit/' + info.commitSha; + result.version = 'https://github.com/' + repoId + '/commit/' + info.commitSha; } + for (let key in grammar) { + result[key] = grammar[key]; + } + try { - fs.writeFileSync(dest, JSON.stringify(grammar, null, '\t')); + fs.writeFileSync(dest, JSON.stringify(result, null, '\t')); if (info) { console.log('Updated ' + path.basename(dest) + ' to ' + repoId + '@' + info.commitSha.substr(0, 7) + ' (' + info.commitDate.substr(0, 10) + ')'); } else { diff --git a/extensions/clojure/syntaxes/clojure.tmLanguage.json b/extensions/clojure/syntaxes/clojure.tmLanguage.json index 881ce191e1c..437a0c5b5e1 100644 --- a/extensions/clojure/syntaxes/clojure.tmLanguage.json +++ b/extensions/clojure/syntaxes/clojure.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-clojure/blob/master/grammars/clojure.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.clojure", "fileTypes": [ "boot", @@ -440,6 +445,5 @@ } ] } - }, - "version": "https://github.com/atom/language-clojure/commit/70e83b27444da31d6367a0aa447a216836eafc05" + } } \ No newline at end of file diff --git a/extensions/coffeescript/syntaxes/coffeescript.tmLanguage.json b/extensions/coffeescript/syntaxes/coffeescript.tmLanguage.json index d7c22867d76..dae1d795f45 100644 --- a/extensions/coffeescript/syntaxes/coffeescript.tmLanguage.json +++ b/extensions/coffeescript/syntaxes/coffeescript.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-coffee-script/blob/master/grammars/coffeescript.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.coffee", "name": "CoffeeScript", "fileTypes": [ @@ -686,6 +691,5 @@ } ] } - }, - "version": "https://github.com/atom/language-coffee-script/commit/49c117b24096a369f92dfce180b61bd1f0425a29" + } } \ No newline at end of file diff --git a/extensions/cpp/syntaxes/c++.json b/extensions/cpp/syntaxes/c++.json index 7ec3054f58b..bc627e3a036 100644 --- a/extensions/cpp/syntaxes/c++.json +++ b/extensions/cpp/syntaxes/c++.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-c/blob/master/grammars/c%2B%2B.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.cpp", "fileTypes": [ "cc", @@ -457,6 +462,5 @@ } ] } - }, - "version": "https://github.com/atom/language-c/commit/3a269f88b12e512fb9495dc006a1dabf325d3d7f" + } } \ No newline at end of file diff --git a/extensions/cpp/syntaxes/c.json b/extensions/cpp/syntaxes/c.json index 6cc84cff24d..022f588cf28 100644 --- a/extensions/cpp/syntaxes/c.json +++ b/extensions/cpp/syntaxes/c.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-c/blob/master/grammars/c.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.c", "fileTypes": [ "c", @@ -1950,6 +1955,5 @@ } ] } - }, - "version": "https://github.com/atom/language-c/commit/1d137279178d06e7f7500800ebc36155e130172e" + } } \ No newline at end of file diff --git a/extensions/csharp/syntaxes/csharp.tmLanguage.json b/extensions/csharp/syntaxes/csharp.tmLanguage.json index eae75041576..3f81563c5bb 100644 --- a/extensions/csharp/syntaxes/csharp.tmLanguage.json +++ b/extensions/csharp/syntaxes/csharp.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/dotnet/csharp-tmLanguage/blob/master/grammars/csharp.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "name": "C#", "scopeName": "source.cs", "fileTypes": [ @@ -4186,6 +4191,5 @@ } } } - }, - "version": "https://github.com/dotnet/csharp-tmLanguage/commit/4d0e50c51f336645c98689737db1be321d212d3d" + } } \ No newline at end of file diff --git a/extensions/css/syntaxes/css.tmLanguage.json b/extensions/css/syntaxes/css.tmLanguage.json index 700b6dd3140..dae4475161a 100644 --- a/extensions/css/syntaxes/css.tmLanguage.json +++ b/extensions/css/syntaxes/css.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-css/blob/master/grammars/css.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.css", "name": "CSS", "fileTypes": [ @@ -1796,6 +1801,5 @@ } ] } - }, - "version": "https://github.com/atom/language-css/commit/23dcdee3372050eb3f07374fbe9188884bd545d1" + } } \ No newline at end of file diff --git a/extensions/diff/syntaxes/diff.tmLanguage.json b/extensions/diff/syntaxes/diff.tmLanguage.json index ac16f416a64..e259c46be42 100644 --- a/extensions/diff/syntaxes/diff.tmLanguage.json +++ b/extensions/diff/syntaxes/diff.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/diff.tmbundle/blob/master/Syntaxes/Diff.plist", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "patch", "diff", @@ -158,6 +163,5 @@ } ], "scopeName": "source.diff", - "uuid": "7E848FF4-708E-11D9-97B4-0011242E4184", - "version": "https://github.com/textmate/diff.tmbundle/commit/0593bb775eab1824af97ef2172fd38822abd97d7" + "uuid": "7E848FF4-708E-11D9-97B4-0011242E4184" } \ No newline at end of file diff --git a/extensions/docker/syntaxes/docker.tmLanguage.json b/extensions/docker/syntaxes/docker.tmLanguage.json index 8be1c94055d..d8c2d0fd766 100644 --- a/extensions/docker/syntaxes/docker.tmLanguage.json +++ b/extensions/docker/syntaxes/docker.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/moby/moby/blob/master/contrib/syntax/textmate/Docker.tmbundle/Syntaxes/Dockerfile.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "Dockerfile" ], @@ -96,6 +101,5 @@ } ], "scopeName": "source.dockerfile", - "uuid": "a39d8795-59d2-49af-aa00-fe74ee29576e", - "version": "https://github.com/moby/moby/commit/8523e9d108a0e98865673701a7bd0a7929c5260b" + "uuid": "a39d8795-59d2-49af-aa00-fe74ee29576e" } \ No newline at end of file diff --git a/extensions/fsharp/syntaxes/fsharp.json b/extensions/fsharp/syntaxes/fsharp.json index 7ef61094dd1..f7abe7e8a52 100644 --- a/extensions/fsharp/syntaxes/fsharp.json +++ b/extensions/fsharp/syntaxes/fsharp.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/ionide/ionide-fsgrammar/blob/master/grammar/fsharp.json", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "name": "fsharp", "scopeName": "source.fsharp", "fileTypes": [ @@ -456,6 +461,5 @@ } ] } - }, - "version": "https://github.com/ionide/ionide-fsgrammar/commit/f2e3c30f0ebfcc89fb78ad908701159f20516812" + } } \ No newline at end of file diff --git a/extensions/gitsyntax/syntaxes/git-commit.tmLanguage.json b/extensions/gitsyntax/syntaxes/git-commit.tmLanguage.json index 5f5db8762fa..ffe1561f727 100644 --- a/extensions/gitsyntax/syntaxes/git-commit.tmLanguage.json +++ b/extensions/gitsyntax/syntaxes/git-commit.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/git.tmbundle/blob/master/Syntaxes/Git%20Commit%20Message.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "COMMIT_EDITMSG", "MERGE_MSG" @@ -138,6 +143,5 @@ } }, "scopeName": "text.git-commit", - "uuid": "BFE83C06-8508-44BE-A975-95A57BF619A7", - "version": "https://github.com/textmate/git.tmbundle/commit/93897a78c6e52bef13dadc0d4091d203c5facb40" + "uuid": "BFE83C06-8508-44BE-A975-95A57BF619A7" } \ No newline at end of file diff --git a/extensions/gitsyntax/syntaxes/git-rebase.tmLanguage.json b/extensions/gitsyntax/syntaxes/git-rebase.tmLanguage.json index c8bf731d9cb..15bac0d8d09 100644 --- a/extensions/gitsyntax/syntaxes/git-rebase.tmLanguage.json +++ b/extensions/gitsyntax/syntaxes/git-rebase.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/git.tmbundle/blob/master/Syntaxes/Git%20Rebase%20Message.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "git-rebase-todo" ], @@ -30,6 +35,5 @@ } ], "scopeName": "text.git-rebase", - "uuid": "7F1CC209-5F6D-486A-8180-09FA282381A1", - "version": "https://github.com/textmate/git.tmbundle/commit/d1db42c2d71948662098183a6df519fb53a7a15b" + "uuid": "7F1CC209-5F6D-486A-8180-09FA282381A1" } \ No newline at end of file diff --git a/extensions/go/syntaxes/go.json b/extensions/go/syntaxes/go.json index 53908a80bac..098c8710482 100644 --- a/extensions/go/syntaxes/go.json +++ b/extensions/go/syntaxes/go.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-go/blob/master/grammars/go.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.go", "name": "Go", "comment": "Go language", @@ -624,6 +629,5 @@ } ] } - }, - "version": "https://github.com/atom/language-go/commit/c1fe618ccf2dcd17118c5600c49b1c539f26d5c5" + } } \ No newline at end of file diff --git a/extensions/groovy/syntaxes/groovy.tmLanguage.json b/extensions/groovy/syntaxes/groovy.tmLanguage.json index 8850454840e..3dc8af7d0a1 100644 --- a/extensions/groovy/syntaxes/groovy.tmLanguage.json +++ b/extensions/groovy/syntaxes/groovy.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/groovy.tmbundle/blob/master/Syntaxes/Groovy.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "groovy", "gvy" @@ -1381,6 +1386,5 @@ } }, "scopeName": "source.groovy", - "uuid": "B3A64888-EBBB-4436-8D9E-F1169C5D7613", - "version": "https://github.com/textmate/groovy.tmbundle/commit/85d8f7c97ae473ccb9473f6c8d27e4ec957f4be1" + "uuid": "B3A64888-EBBB-4436-8D9E-F1169C5D7613" } \ No newline at end of file diff --git a/extensions/handlebars/syntaxes/Handlebars.tmLanguage.json b/extensions/handlebars/syntaxes/Handlebars.tmLanguage.json index 9e3579d90c2..e915b691d7f 100644 --- a/extensions/handlebars/syntaxes/Handlebars.tmLanguage.json +++ b/extensions/handlebars/syntaxes/Handlebars.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/daaain/Handlebars/blob/master/grammars/Handlebars.json", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "name": "Handlebars", "repository": { "html_tags": { @@ -849,6 +854,5 @@ "template", "tmpl" ], - "uuid": "70E91676-DE0A-4266-A2B9-3AD2E535E484", - "version": "https://github.com/daaain/Handlebars/commit/4e8244410815da73f93375532939d48bd5a9bb93" + "uuid": "70E91676-DE0A-4266-A2B9-3AD2E535E484" } \ No newline at end of file diff --git a/extensions/hlsl/syntaxes/hlsl.json b/extensions/hlsl/syntaxes/hlsl.json index 91dcf2b2520..20565922c53 100644 --- a/extensions/hlsl/syntaxes/hlsl.json +++ b/extensions/hlsl/syntaxes/hlsl.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/tgjones/shaders-tmLanguage/blob/master/grammars/hlsl.json", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.hlsl", "name": "HLSL", "fileTypes": [ @@ -213,6 +218,5 @@ } ] } - ], - "version": "https://github.com/tgjones/shaders-tmLanguage/commit/cd1ef40f549f9ce2b9e6b73498688de114a85382" + ] } \ No newline at end of file diff --git a/extensions/html/syntaxes/html.json b/extensions/html/syntaxes/html.json index cc2d9fd17ea..4192c824703 100644 --- a/extensions/html/syntaxes/html.json +++ b/extensions/html/syntaxes/html.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/html.tmbundle/blob/master/Syntaxes/HTML.plist", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "html", "htm", @@ -742,6 +747,5 @@ } }, "scopeName": "text.html.basic", - "uuid": "17994EC8-6B1D-11D9-AC3A-000D93589AF6", - "version": "https://github.com/textmate/html.tmbundle/commit/a723f08ebd49c67c22aca08dd8f17d0bf836ec93" + "uuid": "17994EC8-6B1D-11D9-AC3A-000D93589AF6" } \ No newline at end of file diff --git a/extensions/ini/syntaxes/ini.tmLanguage.json b/extensions/ini/syntaxes/ini.tmLanguage.json index e8f1a0ef9b3..34679c1bee0 100644 --- a/extensions/ini/syntaxes/ini.tmLanguage.json +++ b/extensions/ini/syntaxes/ini.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/ini.tmbundle/blob/master/Syntaxes/Ini.plist", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "ini", "conf" @@ -109,6 +114,5 @@ } ], "scopeName": "source.ini", - "uuid": "77DC23B6-8A90-11D9-BAA4-000A9584EC8C", - "version": "https://github.com/textmate/ini.tmbundle/commit/2af0cbb0704940f967152616f2f1ff0aae6287a6" + "uuid": "77DC23B6-8A90-11D9-BAA4-000A9584EC8C" } \ No newline at end of file diff --git a/extensions/java/syntaxes/java.tmLanguage.json b/extensions/java/syntaxes/java.tmLanguage.json index 5d0513d49b0..654bf8e2ba8 100644 --- a/extensions/java/syntaxes/java.tmLanguage.json +++ b/extensions/java/syntaxes/java.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-java/blob/master/grammars/java.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.java", "name": "Java", "fileTypes": [ @@ -1360,6 +1365,5 @@ } ] } - }, - "version": "https://github.com/atom/language-java/commit/0e0ec7966059e3e363868311b3d855014bca95dd" + } } \ No newline at end of file diff --git a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json index d7aabe6479b..8856e46770c 100644 --- a/extensions/javascript/syntaxes/JavaScript.tmLanguage.json +++ b/extensions/javascript/syntaxes/JavaScript.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/Microsoft/TypeScript-TmLanguage/blob/master/TypeScriptReact.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "name": "JavaScript (with React support)", "scopeName": "source.js", "fileTypes": [ @@ -4222,6 +4227,5 @@ } ] } - }, - "version": "https://github.com/Microsoft/TypeScript-TmLanguage/commit/8c967fe7553297bfad672b7417d78e357c8fe724" + } } \ No newline at end of file diff --git a/extensions/less/syntaxes/less.tmLanguage.json b/extensions/less/syntaxes/less.tmLanguage.json index cd25b2a89b5..cd1543fd7d3 100644 --- a/extensions/less/syntaxes/less.tmLanguage.json +++ b/extensions/less/syntaxes/less.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-less/blob/master/grammars/less.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "name": "Less", "scopeName": "source.css.less", "fileTypes": [ @@ -540,6 +545,5 @@ "match": "\\b(abs|acos|alpha|argb|asin|atan|average|blue|calc|ceil|color|contrast|convert|convert|cos|darken|data-uri|desaturate|difference|e|escape|exclusion|extract|fade|fadein|fadeout|floor|format|green|greyscale|hardlight|hsl|hsla|hsv|hsva|hsvhue|hsvsaturation|hsvvalue|hue|length|lighten|lightness|luma|max|min|mix|mod|multiply|negation|overlay|percentage|pi|pow|red|replace|round|saturate|saturation|screen|sin|softlight|spin|sqrt|tan|unit)\\b", "name": "support.function.any-method.builtin.less" } - }, - "version": "https://github.com/atom/language-less/commit/4661d870784f725599e438bf683553cc6cf0f4ed" + } } \ No newline at end of file diff --git a/extensions/lua/syntaxes/lua.json b/extensions/lua/syntaxes/lua.json index a4da3a43c6a..efea9819bde 100644 --- a/extensions/lua/syntaxes/lua.json +++ b/extensions/lua/syntaxes/lua.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/lua.tmbundle/blob/master/Syntaxes/Lua.plist", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "comment": "Lua Syntax: version 0.8", "fileTypes": [ "lua", @@ -275,6 +280,5 @@ } }, "scopeName": "source.lua", - "uuid": "93E017CC-6F27-11D9-90EB-000D93589AF7", - "version": "https://github.com/textmate/lua.tmbundle/commit/3a97f1b46804a3de99d4d2909e14450299462f2d" + "uuid": "93E017CC-6F27-11D9-90EB-000D93589AF7" } \ No newline at end of file diff --git a/extensions/make/syntaxes/Makefile.json b/extensions/make/syntaxes/Makefile.json index 2264321c9c8..1562efc5c17 100644 --- a/extensions/make/syntaxes/Makefile.json +++ b/extensions/make/syntaxes/Makefile.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/make.tmbundle/blob/master/Syntaxes/Makefile.plist", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "Makefile", "makefile", @@ -470,6 +475,5 @@ } }, "scopeName": "source.makefile", - "uuid": "FF1825E8-6B1C-11D9-B883-000D93589AF6", - "version": "https://github.com/textmate/make.tmbundle/commit/1a1827da81e20fdce56e2658451340c070ca44b7" + "uuid": "FF1825E8-6B1C-11D9-B883-000D93589AF6" } \ No newline at end of file diff --git a/extensions/objective-c/syntaxes/objective-c++.tmLanguage.json b/extensions/objective-c/syntaxes/objective-c++.tmLanguage.json index 26550c61e1b..2b46507a2fb 100644 --- a/extensions/objective-c/syntaxes/objective-c++.tmLanguage.json +++ b/extensions/objective-c/syntaxes/objective-c++.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-objective-c/blob/master/grammars/objective-c++.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.objcpp", "fileTypes": [ "mm", diff --git a/extensions/objective-c/syntaxes/objective-c.tmLanguage.json b/extensions/objective-c/syntaxes/objective-c.tmLanguage.json index 2037028b0c3..a07e0ba7f43 100644 --- a/extensions/objective-c/syntaxes/objective-c.tmLanguage.json +++ b/extensions/objective-c/syntaxes/objective-c.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-objective-c/blob/master/grammars/objective-c.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "source.objc", "fileTypes": [ "m", @@ -993,6 +998,5 @@ } ] } - }, - "version": "https://github.com/atom/language-objective-c/commit/0727e04544f3414c1c339cf15a39a05ea3938cb4" + } } \ No newline at end of file diff --git a/extensions/perl/syntaxes/perl.tmLanguage.json b/extensions/perl/syntaxes/perl.tmLanguage.json index 612c4796cbe..4c4209c317b 100644 --- a/extensions/perl/syntaxes/perl.tmLanguage.json +++ b/extensions/perl/syntaxes/perl.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/perl.tmbundle/blob/master/Syntaxes/Perl.plist", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "comment": "\n\tTODO:\tInclude RegExp syntax\n", "fileTypes": [ "pl", @@ -2541,6 +2546,5 @@ } }, "scopeName": "source.perl", - "uuid": "EDBFE125-6B1C-11D9-9189-000D93589AF6", - "version": "https://github.com/textmate/perl.tmbundle/commit/c0b7a4bd65882380522d82a60b536479a62b07c3" + "uuid": "EDBFE125-6B1C-11D9-9189-000D93589AF6" } \ No newline at end of file diff --git a/extensions/perl/syntaxes/perl6.tmLanguage.json b/extensions/perl/syntaxes/perl6.tmLanguage.json index a3024a11ae7..9ddfdf42509 100644 --- a/extensions/perl/syntaxes/perl6.tmLanguage.json +++ b/extensions/perl/syntaxes/perl6.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/perl.tmbundle/blob/master/Syntaxes/Perl%206.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "p6", "pl6", @@ -314,6 +319,5 @@ } }, "scopeName": "source.perl.6", - "uuid": "E685440C-0E20-4424-9693-864D5240A269", - "version": "https://github.com/textmate/perl.tmbundle/commit/d9841a0878239fa43f88c640f8d458590f97e8f5" + "uuid": "E685440C-0E20-4424-9693-864D5240A269" } \ No newline at end of file diff --git a/extensions/php/syntaxes/php.tmLanguage.json b/extensions/php/syntaxes/php.tmLanguage.json index 8e69579120b..b815d80e072 100644 --- a/extensions/php/syntaxes/php.tmLanguage.json +++ b/extensions/php/syntaxes/php.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-php/blob/master/grammars/php.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "text.html.php", "name": "PHP", "fileTypes": [ @@ -2974,6 +2979,5 @@ } ] } - }, - "version": "https://github.com/atom/language-php/commit/c523a19f849b97f6499eae6accf80564aa190c0e" + } } \ No newline at end of file diff --git a/extensions/pug/syntaxes/pug.tmLanguage.json b/extensions/pug/syntaxes/pug.tmLanguage.json index 808be9e6db8..8a3d17a81dc 100644 --- a/extensions/pug/syntaxes/pug.tmLanguage.json +++ b/extensions/pug/syntaxes/pug.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/davidrios/jade-tmbundle/blob/master/Syntaxes/Jade.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "jade" ], @@ -981,6 +986,5 @@ } }, "scopeName": "text.jade", - "uuid": "eee6ba25-6ac2-4f7e-9c70-cddf2bd3448b", - "version": "https://github.com/davidrios/jade-tmbundle/commit/f311a516bb29296fcebfdc7da8149b1c79dfb0a1" + "uuid": "eee6ba25-6ac2-4f7e-9c70-cddf2bd3448b" } \ No newline at end of file diff --git a/extensions/python/syntaxes/MagicPython.tmLanguage.json b/extensions/python/syntaxes/MagicPython.tmLanguage.json index f9d673e6273..29e51b920fa 100644 --- a/extensions/python/syntaxes/MagicPython.tmLanguage.json +++ b/extensions/python/syntaxes/MagicPython.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/MagicStack/MagicPython/blob/master/grammars/MagicPython.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "name": "MagicPython", "scopeName": "source.python", "fileTypes": [ @@ -5230,6 +5235,5 @@ } ] } - }, - "version": "https://github.com/MagicStack/MagicPython/commit/976e59dcb78cb577e79c8f2117216c06718337e0" + } } \ No newline at end of file diff --git a/extensions/python/syntaxes/MagicRegExp.tmLanguage.json b/extensions/python/syntaxes/MagicRegExp.tmLanguage.json index b5795a7b89f..34d1a973578 100644 --- a/extensions/python/syntaxes/MagicRegExp.tmLanguage.json +++ b/extensions/python/syntaxes/MagicRegExp.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/MagicStack/MagicPython/blob/master/grammars/MagicRegExp.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "name": "MagicRegExp", "scopeName": "source.regexp.python", "fileTypes": [ @@ -460,6 +465,5 @@ } ] } - }, - "version": "https://github.com/MagicStack/MagicPython/commit/df5bb18c64252f2e7b1aa87e2ed124666d314f1d" + } } \ No newline at end of file diff --git a/extensions/r/syntaxes/r.tmLanguage.json b/extensions/r/syntaxes/r.tmLanguage.json index 829be8d0d2b..025877c7ab4 100644 --- a/extensions/r/syntaxes/r.tmLanguage.json +++ b/extensions/r/syntaxes/r.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/r.tmbundle/blob/master/Syntaxes/R.plist", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "R", "r", @@ -199,6 +204,5 @@ } ], "scopeName": "source.r", - "uuid": "B2E6B78D-6E70-11D9-A369-000D93B3A10E", - "version": "https://github.com/textmate/r.tmbundle/commit/6b04ff3424f3f1cdfe64a9cfb71d8765959be250" + "uuid": "B2E6B78D-6E70-11D9-A369-000D93B3A10E" } \ No newline at end of file diff --git a/extensions/razor/syntaxes/cshtml.json b/extensions/razor/syntaxes/cshtml.json index 402915e8c9f..180ad0e68dd 100644 --- a/extensions/razor/syntaxes/cshtml.json +++ b/extensions/razor/syntaxes/cshtml.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/demyte/language-cshtml/blob/master/grammars/cshtml.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "name": "ASP.NET Razor", "scopeName": "text.html.cshtml", "fileTypes": [ @@ -148,6 +153,5 @@ "end": "\\*@", "name": "comment.block.cshtml" } - }, - "version": "https://github.com/demyte/language-cshtml/commit/a49735dc7aef56ae772a3bcfd8e42c89895dcff4" + } } \ No newline at end of file diff --git a/extensions/ruby/syntaxes/ruby.tmLanguage.json b/extensions/ruby/syntaxes/ruby.tmLanguage.json index dce58f758b1..a6e0c01b7b9 100644 --- a/extensions/ruby/syntaxes/ruby.tmLanguage.json +++ b/extensions/ruby/syntaxes/ruby.tmLanguage.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/ruby.tmbundle/blob/master/Syntaxes/Ruby.plist", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "comment": "\n\tTODO: unresolved issues\n\n\ttext:\n\t\"p <", "name": "comment.block.xml" } - }, - "version": "https://github.com/atom/language-xml/commit/ac6bc8ef6a9c79ac3c7e31615bc18436b0c815ab" + } } \ No newline at end of file diff --git a/extensions/xml/syntaxes/xsl.json b/extensions/xml/syntaxes/xsl.json index 8b715b599f9..2193c1a9570 100644 --- a/extensions/xml/syntaxes/xsl.json +++ b/extensions/xml/syntaxes/xsl.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/atom/language-xml/blob/master/grammars/xsl.cson", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "scopeName": "text.xml.xsl", "name": "XSL", "fileTypes": [ @@ -88,6 +93,5 @@ }, "name": "string.quoted.single.xml" } - }, - "version": "https://github.com/atom/language-xml/commit/507de2ee7daca60cf02e9e21fbeb92bbae73e280" + } } \ No newline at end of file diff --git a/extensions/yaml/syntaxes/yaml.json b/extensions/yaml/syntaxes/yaml.json index 55939b86d8d..82cd7d840db 100644 --- a/extensions/yaml/syntaxes/yaml.json +++ b/extensions/yaml/syntaxes/yaml.json @@ -1,4 +1,9 @@ { + "information_for_contributors": [ + "This file has been converted from https://github.com/textmate/yaml.tmbundle/blob/master/Syntaxes/YAML.tmLanguage", + "If you want to provide a fix or improvement, please create a pull request against the original repository.", + "Once accepted there, we are happy to receive an update request." + ], "fileTypes": [ "yaml", "yml", @@ -624,6 +629,5 @@ } }, "scopeName": "source.yaml", - "uuid": "686AD6AE-33F3-4493-9512-9E9FC1D5417F", - "version": "https://github.com/textmate/yaml.tmbundle/commit/efc96efafe5e48480cf55a2ed124b388cbea4440" + "uuid": "686AD6AE-33F3-4493-9512-9E9FC1D5417F" } \ No newline at end of file From fa35c9a9424d5417f67db142274ea7b20c0944bf Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 13:03:01 +0200 Subject: [PATCH 1056/1164] Possible bugs around non-invoking usage of `isEmpty`. Fixes #27201 --- src/vs/editor/contrib/folding/browser/folding.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/contrib/folding/browser/folding.ts b/src/vs/editor/contrib/folding/browser/folding.ts index 9f644ccd761..74df9c51570 100644 --- a/src/vs/editor/contrib/folding/browser/folding.ts +++ b/src/vs/editor/contrib/folding/browser/folding.ts @@ -287,7 +287,7 @@ export class FoldingController implements IFoldingController { return; } let range = e.target.range; - if (!range || !range.isEmpty) { + if (!range) { return; } if (!e.event.leftButton) { @@ -303,7 +303,7 @@ export class FoldingController implements IFoldingController { break; case MouseTargetType.CONTENT_EMPTY: case MouseTargetType.CONTENT_TEXT: - if (range.isEmpty && range.startColumn === model.getLineMaxColumn(range.startLineNumber)) { + if (range.startColumn === model.getLineMaxColumn(range.startLineNumber)) { break; } return; @@ -322,7 +322,7 @@ export class FoldingController implements IFoldingController { let iconClicked = this.mouseDownInfo.iconClicked; let range = e.target.range; - if (!range || !range.isEmpty || range.startLineNumber !== lineNumber) { + if (!range || range.startLineNumber !== lineNumber) { return; } From 656bde928aabfec81fea9ae735d5dde13eaa59c5 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 25 May 2017 07:03:56 -0700 Subject: [PATCH 1057/1164] Fix failing ripgrep test --- .../services/search/test/node/ripgrepTextSearch.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts b/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts index 2f377d82d27..1ee3f9a6a83 100644 --- a/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts +++ b/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts @@ -70,7 +70,7 @@ suite('RipgrepParser', () => { assert.deepEqual(results[0], { numMatches: 2, - path: path.join(rootFolder, 'a.txt'), + path: path.resolve(rootFolder, 'a.txt'), lineMatches: [ { lineNumber: 0, From 8fcb57e8b6f02e1c977ee620473e976550969144 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 25 May 2017 17:15:23 +0200 Subject: [PATCH 1058/1164] Fixes Microsoft/monaco-editor#278 --- src/vs/editor/editor.main.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/vs/editor/editor.main.ts b/src/vs/editor/editor.main.ts index 667a3004499..012e073ff51 100644 --- a/src/vs/editor/editor.main.ts +++ b/src/vs/editor/editor.main.ts @@ -21,10 +21,17 @@ import { EDITOR_DEFAULTS, WrappingIndent } from 'vs/editor/common/config/editorO (EDITOR_DEFAULTS.contribInfo).folding = false; (EDITOR_DEFAULTS.viewInfo).glyphMargin = false; +let base = createMonacoBaseAPI(); +for (let prop in base) { + if (base.hasOwnProperty(prop)) { + exports[prop] = base[prop]; + } +} +exports.editor = createMonacoEditorAPI(); +exports.languages = createMonacoLanguagesAPI(); + var global: any = self; -global.monaco = createMonacoBaseAPI(); -global.monaco.editor = createMonacoEditorAPI(); -global.monaco.languages = createMonacoLanguagesAPI(); +global.monaco = exports; if (typeof global.require !== 'undefined' && typeof global.require.config === 'function') { global.require.config({ From 735d7d07b3113e7f09f7624d4b12199c6e3a0445 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 25 May 2017 08:44:07 -0700 Subject: [PATCH 1059/1164] Move terminal.foreground defaults to JS Fixes #27230 --- .../parts/terminal/electron-browser/media/terminal.css | 3 --- .../terminal/electron-browser/terminalColorRegistry.ts | 6 +++++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css index f35dde259bf..5a7d34f9e18 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css +++ b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css @@ -9,12 +9,9 @@ display: flex; flex-direction: column; background-color: transparent!important; - color: #333; -webkit-user-select: initial; position: relative; } -.vs-dark .monaco-workbench .panel.integrated-terminal { color: #CCC; } -.hc-black .monaco-workbench .panel.integrated-terminal { color: #FFF; } .monaco-workbench .panel.integrated-terminal .terminal-outer-container { height: 100%; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts index 27f3f23c8ba..ae1d524a912 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalColorRegistry.ts @@ -14,7 +14,11 @@ import { registerColor, ColorIdentifier } from 'vs/platform/theme/common/colorRe export const ansiColorIdentifiers: ColorIdentifier[] = []; export const TERMINAL_BACKGROUND_COLOR = registerColor('terminal.background', null, nls.localize('terminal.background', 'The background color of the terminal, this allows coloring the terminal differently to the panel.')); -export const TERMINAL_FOREGROUND_COLOR = registerColor('terminal.foreground', null, nls.localize('terminal.foreground', 'The foreground color of the terminal.')); +export const TERMINAL_FOREGROUND_COLOR = registerColor('terminal.foreground', { + light: '#333333', + dark: '#CCCCCC', + hc: 'FFFFFF' +}, nls.localize('terminal.foreground', 'The foreground color of the terminal.')); const ansiColorMap = { 'terminal.ansiBlack': { From 3356f28259ca3f95c2b8112b875a3fe79aa18a15 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 25 May 2017 08:44:54 -0700 Subject: [PATCH 1060/1164] Remove deprecated css property --- .../parts/terminal/electron-browser/media/terminal.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css index 5a7d34f9e18..f2cc6747e2c 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css +++ b/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css @@ -9,7 +9,7 @@ display: flex; flex-direction: column; background-color: transparent!important; - -webkit-user-select: initial; + user-select: initial; position: relative; } From d0de62ea2b7158b2c5882928c7d079b4fafd1b56 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 25 May 2017 09:09:41 -0700 Subject: [PATCH 1061/1164] More welcome page colors (#25798) --- .../electron-browser/vs_code_welcome_page.ts | 38 +++++----- .../page/electron-browser/welcomePage.css | 69 +------------------ .../page/electron-browser/welcomePage.ts | 26 ++++++- 3 files changed, 47 insertions(+), 86 deletions(-) diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts b/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts index cc27fe4978c..767ee36747a 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts +++ b/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts @@ -14,13 +14,13 @@ export default () => `
    -

    ${escape(localize('welcomePage.vscode', "Visual Studio Code"))}

    -

    ${escape(localize('welcomePage.editingEvolved', "Editing evolved"))}

    +

    ${escape(localize('welcomePage.vscode', "Visual Studio Code"))}

    +

    ${escape(localize('welcomePage.editingEvolved', "Editing evolved"))}

    -

    ${escape(localize('welcomePage.start', "Start"))}

    +

    ${escape(localize('welcomePage.start', "Start"))}

    -

    ${escape(localize('welcomePage.recent', "Recent"))}

    +

    ${escape(localize('welcomePage.recent', "Recent"))}

    -

    ${escape(localize('welcomePage.noRecentFolders', "No recent folders"))}

    +

    ${escape(localize('welcomePage.noRecentFolders', "No recent folders"))}

    -

    +

    -

    ${escape(localize('welcomePage.customize', "Customize"))}

    +

    ${escape(localize('welcomePage.customize', "Customize"))}

      -
    • -
    • -
    • +
    -

    ${escape(localize('welcomePage.learn', "Learn"))}

    +

    ${escape(localize('welcomePage.learn', "Learn"))}

      -
    • -
    • -
    • +
    • +
    • +
    diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css index 982a72d9d1b..a3c2fa3e686 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css +++ b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css @@ -16,9 +16,6 @@ max-width: 1200px; font-size: 10px; } -.vs .monaco-workbench > .part.editor > .content .welcomePage { - color: #6C6C6C; -} .monaco-workbench > .part.editor > .content .welcomePage .row { display: flex; @@ -41,66 +38,36 @@ } .monaco-workbench > .part.editor > .content .welcomePage a { - color: #2e70c0; text-decoration: none; } -.vs-dark .monaco-workbench > .part.editor > .content .welcomePage a { - color: #4080D0; -} - .monaco-workbench > .part.editor > .content .welcomePage a:focus { outline: 1px solid -webkit-focus-ring-color; outline-offset: -1px; } -.monaco-workbench > .part.editor > .content .welcomePage a:hover { - color: #6ea0dc; -} - -.hc-black .monaco-workbench > .part.editor > .content .welcomePage a { - color: #0b9eff; -} - -.hc-black .monaco-workbench > .part.editor > .content .welcomePage a:hover { - color: #f38518; -} - .monaco-workbench > .part.editor > .content .welcomePage h1 { padding: 0; margin: 0; border: none; font-weight: normal; - color: rgba(0,0,0,.8); font-size: 3.6em; white-space: nowrap; } -.vs-dark .monaco-workbench > .part.editor > .content .welcomePage h1 { - color: rgba(255,255,255,.76); -} - -.hc-black .monaco-workbench > .part.editor > .content .welcomePage h1 { - color: white; -} - .monaco-workbench > .part.editor > .content .welcomePage .title { margin-top: 1em; margin-bottom: 1em; flex: 1 100%; } + .monaco-workbench > .part.editor > .content .welcomePage .subtitle { margin-top: .8em; font-size: 2.6em; - color: rgba(0,0,0,.53); display: block; } -.vs-dark .monaco-workbench > .part.editor > .content .welcomePage .subtitle { - color: rgba(255,255,255,.46); -} .hc-black .monaco-workbench > .part.editor > .content .welcomePage .subtitle { - color: white; font-weight: 200; } @@ -150,22 +117,6 @@ } .monaco-workbench > .part.editor > .content .welcomePage .splash .recent .path { padding-left: 1em; - color: rgba(255,255,255,.46); -} - -.monaco-workbench > .part.editor > .content .welcomePage .splash .recent .none, -.monaco-workbench > .part.editor > .content .welcomePage .splash .recent .path { - color: rgba(0,0,0,.53); -} - -.vs-dark .monaco-workbench > .part.editor > .content .welcomePage .splash .recent .none, -.vs-dark .monaco-workbench > .part.editor > .content .welcomePage .splash .recent .path { - color: rgba(255,255,255,.46); -} - -.hc-black .monaco-workbench > .part.editor > .content .welcomePage .splash .recent .none, -.hc-black .monaco-workbench > .part.editor > .content .welcomePage .splash .recent .path { - color: white; } .monaco-workbench > .part.editor > .content .welcomePage .splash .title, @@ -207,41 +158,27 @@ margin-bottom: .25em; } -.vs .monaco-workbench > .part.editor > .content .welcomePage .commands li button h3 { - color: #2c2c2c; -} - .monaco-workbench > .part.editor > .content .welcomePage .commands li button { - color: #6c6c6c; border: none; } -.vs-dark .monaco-workbench > .part.editor > .content .welcomePage .commands li button > h3 { - color: #ccc; -} - .hc-black .monaco-workbench > .part.editor > .content .welcomePage .commands li button > h3 { font-weight: bold; } -.vs-dark .monaco-workbench > .part.editor > .content .welcomePage .commands li button { - color: #828282; -} - .monaco-workbench > .part.editor > .content .welcomePage .commands li button:focus { outline-style: solid; outline-width: 1px; } .hc-black .monaco-workbench > .part.editor > .content .welcomePage .commands li button { - color: white; - border-color: #f38518; border-width: 1px; border-style: solid; } .hc-black .monaco-workbench > .part.editor > .content .welcomePage .commands li button:hover { - outline: 1px dashed #f38518; + outline-width: 1px; + outline-style: dashed; outline-offset: -5px; } diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts index 874bc17d8dd..86dde1dd27d 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts +++ b/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts @@ -35,7 +35,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { tildify } from 'vs/base/common/labels'; import { isLinux } from 'vs/base/common/platform'; import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { registerColor } from 'vs/platform/theme/common/colorRegistry'; +import { registerColor, textLinkForeground, foreground, contrastBorder, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { getExtraColor } from 'vs/workbench/parts/welcome/walkThrough/node/walkThroughUtils'; used(); @@ -240,6 +240,7 @@ class WelcomePage { const span = document.createElement('span'); span.classList.add('path'); + span.classList.add('detail'); span.innerText = tildify(parentFolder, this.environmentService.userHome); span.title = folder; li.appendChild(span); @@ -446,10 +447,21 @@ class WelcomePage { // theming +const caption = registerColor('welcomePage.caption', { dark: '#FFFFFFC2', light: '#000000D4', hc: foreground }, localize('welcomePage.caption', 'Caption color on the Welcome page.')); +const detail = registerColor('welcomePage.detail', { dark: '#FFFFFF76', light: '#00000088', hc: foreground }, localize('welcomePage.detail', 'Detail color on the Welcome page.')); + const quickLinkBackground = registerColor('welcomePage.quickLinkBackground', { dark: null, light: null, hc: null }, localize('welcomePage.quickLinkBackground', 'Background color for the quick links on the Welcome page.')); const quickLinkHoverBackground = registerColor('welcomePage.quickLinkHoverBackground', { dark: null, light: null, hc: null }, localize('welcomePage.quickLinkHoverBackground', 'Hover background color for the quick links on the Welcome page.')); registerThemingParticipant((theme, collector) => { + const captionColor = theme.getColor(caption); + if (captionColor) { + collector.addRule(`.monaco-workbench > .part.editor > .content .welcomePage .caption { color: ${captionColor}; }`); + } + const detailColor = theme.getColor(detail); + if (detailColor) { + collector.addRule(`.monaco-workbench > .part.editor > .content .welcomePage .detail { color: ${detailColor}; }`); + } const color = getExtraColor(theme, quickLinkBackground, { dark: 'rgba(0, 0, 0, .2)', extra_dark: 'rgba(200, 235, 255, .042)', light: 'rgba(0,0,0,.04)', hc: 'black' }); if (color) { collector.addRule(`.monaco-workbench > .part.editor > .content .welcomePage .commands li button { background: ${color}; }`); @@ -458,4 +470,16 @@ registerThemingParticipant((theme, collector) => { if (hover) { collector.addRule(`.monaco-workbench > .part.editor > .content .welcomePage .commands li button:hover { background: ${hover}; }`); } + const link = theme.getColor(textLinkForeground); + if (link) { + collector.addRule(`.monaco-workbench > .part.editor > .content .welcomePage a { color: ${link}; }`); + } + const border = theme.getColor(contrastBorder); + if (border) { + collector.addRule(`.monaco-workbench > .part.editor > .content .welcomePage .commands li button { border-color: ${border}; }`); + } + const activeBorder = theme.getColor(activeContrastBorder); + if (activeBorder) { + collector.addRule(`.monaco-workbench > .part.editor > .content .welcomePage .commands li button:hover { outline-color: ${activeBorder}; }`); + } }); From 60a5167e093ae2a95defac1a6c77976986ac7467 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 25 May 2017 09:49:50 -0700 Subject: [PATCH 1062/1164] Playground colors (#25798) --- .../electron-browser/walkThroughPart.css | 30 ++----------------- .../electron-browser/walkThroughPart.ts | 23 +++++++++++++- 2 files changed, 24 insertions(+), 29 deletions(-) diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css index baaf1f3ceed..305fece6c6b 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css @@ -17,7 +17,6 @@ } .monaco-workbench > .part.editor > .content .walkThroughContent a { - color: #4080D0; text-decoration: none; } @@ -69,7 +68,6 @@ } .monaco-workbench > .part.editor > .content .walkThroughContent a:hover { - color: #4080D0; text-decoration: underline; } @@ -106,36 +104,11 @@ line-height: 19px; } -/*.monaco-workbench.mac > .part.editor > .content .walkThroughContent code, -.monaco-workbench.mac > .part.editor > .content .walkThroughContent .shortcut { - font-size: 12px; - line-height: 18px; -}*/ - -.vs .monaco-workbench > .part.editor > .content .walkThroughContent code, -.vs .monaco-workbench > .part.editor > .content .walkThroughContent .shortcut { - color: #A31515; -} - -.vs-dark .monaco-workbench > .part.editor > .content .walkThroughContent code, -.vs-dark .monaco-workbench > .part.editor > .content .walkThroughContent .shortcut { - color: #D7BA7D; -} - .monaco-workbench > .part.editor > .content .walkThroughContent blockquote { margin: 0 7px 0 5px; padding: 0 16px 0 10px; border-left: 5px solid; } -.vs .monaco-workbench > .part.editor > .content .walkThroughContent blockquote, -.vs-dark .monaco-workbench > .part.editor > .content .walkThroughContent blockquote { - background: rgba(127, 127, 127, 0.1); - border-color: rgba(0, 122, 204, 0.5); -} -.hc-black .monaco-workbench > .part.editor > .content .walkThroughContent blockquote { - background: transparent; - border-color: #fff; -} .monaco-workbench > .part.editor > .content .walkThroughContent .monaco-tokenized-source { white-space: pre; @@ -162,5 +135,6 @@ } .hc-black .monaco-workbench > .part.editor > .content .walkThroughContent .monaco-editor { - border: 1px white solid + border-width: 1px; + border-style: solid; } diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts index 2fcbace413f..f22fa7e0702 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts +++ b/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts @@ -38,7 +38,7 @@ import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { registerColor } from 'vs/platform/theme/common/colorRegistry'; +import { registerColor, textLinkForeground, textPreformatForeground, contrastBorder, textBlockQuoteBackground, textBlockQuoteBorder } from 'vs/platform/theme/common/colorRegistry'; import { getExtraColor } from 'vs/workbench/parts/welcome/walkThrough/node/walkThroughUtils'; export const WALK_THROUGH_FOCUS = new RawContextKey('interactivePlaygroundFocus', false); @@ -534,4 +534,25 @@ registerThemingParticipant((theme, collector) => { collector.addRule(`.monaco-workbench > .part.editor > .content .walkThroughContent .monaco-editor-background, .monaco-workbench > .part.editor > .content .walkThroughContent .margin-view-overlays { background: ${color}; }`); } + const link = theme.getColor(textLinkForeground); + if (link) { + collector.addRule(`.monaco-workbench > .part.editor > .content .walkThroughContent a { color: ${link}; }`); + } + const shortcut = theme.getColor(textPreformatForeground); + if (shortcut) { + collector.addRule(`.monaco-workbench > .part.editor > .content .walkThroughContent code, + .monaco-workbench > .part.editor > .content .walkThroughContent .shortcut { color: ${shortcut}; }`); + } + const border = theme.getColor(contrastBorder); + if (border) { + collector.addRule(`.monaco-workbench > .part.editor > .content .walkThroughContent .monaco-editor { border-color: ${border}; }`); + } + const quoteBackground = theme.getColor(textBlockQuoteBackground); + if (quoteBackground) { + collector.addRule(`.monaco-workbench > .part.editor > .content .walkThroughContent blockquote { background: ${quoteBackground}; }`); + } + const quoteBorder = theme.getColor(textBlockQuoteBorder); + if (quoteBorder) { + collector.addRule(`.monaco-workbench > .part.editor > .content .walkThroughContent blockquote { border-color: ${quoteBorder}; }`); + } }); \ No newline at end of file From fb5eab501353456adc7523b3582ca3c0535d3466 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 25 May 2017 10:25:46 -0700 Subject: [PATCH 1063/1164] Overlay color (#25798) --- .../overlay/browser/welcomeOverlay.css | 15 ------------- .../welcome/overlay/browser/welcomeOverlay.ts | 22 +++++++++++++++++++ 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.css b/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.css index 6aa8c04e789..50cf77eafad 100644 --- a/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.css +++ b/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.css @@ -10,15 +10,10 @@ height: 100%; width: 100%; z-index: 9999; - background: rgba(0,0,0,0.52); font-size: 10px; transition: font-size .25s; } -.vs .monaco-workbench > .welcomeOverlay { - background: rgba(255,255,255,.52); -} - #workbench\.parts\.editor { transition: filter .25s, opacity .2s; } @@ -40,15 +35,6 @@ font-size: 1.6em; } -.monaco-workbench > .welcomeOverlay > .key { - color: #000; -} - -.vs-dark .monaco-workbench > .welcomeOverlay > .key, -.hc-black .monaco-workbench > .welcomeOverlay > .key { - color: #FFF; -} - .monaco-workbench > .welcomeOverlay > .key > .label { padding: 0 1ex; } @@ -56,7 +42,6 @@ .monaco-workbench > .welcomeOverlay > .key > .shortcut { letter-spacing: 0.15em; font-size: 0.8125em; - color: #d7ba7d; font-family: "Lucida Grande", sans-serif; } diff --git a/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.ts b/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.ts index 8a3bb16246a..d5a435aac22 100644 --- a/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.ts +++ b/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.ts @@ -22,6 +22,8 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { RawContextKey, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { KeyCode } from 'vs/base/common/keyCodes'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { registerColor, textPreformatForeground } from 'vs/platform/theme/common/colorRegistry'; interface Key { id: string; @@ -233,3 +235,23 @@ Registry.as(Extensions.WorkbenchActions) Registry.as(Extensions.WorkbenchActions) .registerWorkbenchAction(new SyncActionDescriptor(HideWelcomeOverlayAction, HideWelcomeOverlayAction.ID, HideWelcomeOverlayAction.LABEL, { primary: KeyCode.Escape }, OVERLAY_VISIBLE), 'Help: Hide Interface Overview', localize('help', "Help")); + +// theming + +const foreground = registerColor('welcomeOverlay.foreground', { dark: '#fff', light: '#000', hc: '#fff' }, localize('welcomeOverlay.foreground', 'Foreground color for the Interface Overview.')); +const background = registerColor('welcomeOverlay.background', { dark: '#00000085', light: '#FFFFFF85', hc: '#00000085' }, localize('welcomeOverlay.background', 'Background color for the Interface Overview.')); + +registerThemingParticipant((theme, collector) => { + const key = theme.getColor(foreground); + if (key) { + collector.addRule(`.monaco-workbench > .welcomeOverlay > .key { color: ${key}; }`); + } + const backgroundColor = theme.getColor(background); + if (backgroundColor) { + collector.addRule(`.monaco-workbench > .welcomeOverlay { background: ${backgroundColor}; }`); + } + const shortcut = theme.getColor(textPreformatForeground); + if (shortcut) { + collector.addRule(`.monaco-workbench > .welcomeOverlay > .key > .shortcut { color: ${shortcut}; }`); + } +}); From dbeb66f8fd416f58d4a3b7b5d76f84c1d5b56811 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 25 May 2017 11:07:55 -0700 Subject: [PATCH 1064/1164] Add null check in terminalPanel click listener Fixes #27256 --- .../parts/terminal/electron-browser/terminalPanel.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index ec880bdd12c..4b5a29f34c4 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -197,11 +197,12 @@ export class TerminalPanel extends Panel { this._cancelContextMenu = false; })); this._register(dom.addDisposableListener(this._parentDomElement, 'click', (event) => { - if (this._terminalService.terminalInstances.length === 0) { + if (event.which === 3) { return; } - if (event.which !== 3) { + const instance = this._terminalService.getActiveInstance(); + if (instance) { this._terminalService.getActiveInstance().focus(); } })); From f0ebd2b48287f0cdbe6f93a93c7af4009afae2d0 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 25 May 2017 11:11:40 -0700 Subject: [PATCH 1065/1164] Add null check to terminal link handler Fixes #27247 --- .../terminal/electron-browser/terminalLinkHandler.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts index 49df15b331a..16047707ea7 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts @@ -226,12 +226,15 @@ export class TerminalLinkHandler { private _resolvePath(link: string): TPromise { link = this._preprocessPath(link); - if (!link) { return TPromise.as(void 0); } const linkUrl = this.extractLinkUrl(link); + if (!linkUrl) { + return TPromise.as(void 0); + } + // Open an editor if the path exists return pfs.fileExists(linkUrl).then(isFile => { if (!isFile) { @@ -292,6 +295,9 @@ export class TerminalLinkHandler { */ public extractLinkUrl(link: string): string { const matches: string[] = this._localLinkRegex.exec(link); + if (!matches) { + return null; + } return matches[1]; } } From f962f52cd4c13c1dea6572a496b96bf628ca7d56 Mon Sep 17 00:00:00 2001 From: rebornix Date: Thu, 25 May 2017 11:25:34 -0700 Subject: [PATCH 1066/1164] Fix #27265. False positve --- src/vs/editor/contrib/find/common/findController.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/editor/contrib/find/common/findController.ts b/src/vs/editor/contrib/find/common/findController.ts index 4536b2b5b6f..a5dae70a8dc 100644 --- a/src/vs/editor/contrib/find/common/findController.ts +++ b/src/vs/editor/contrib/find/common/findController.ts @@ -508,13 +508,13 @@ export class StartFindReplaceAction extends EditorAction { let controller = CommonFindController.get(editor); let currentSelection = editor.getSelection(); // we only seed search string from selection when the current selection is single line and not empty. - let seedSearchStringFromSelection = currentSelection.isEmpty() || - currentSelection.startLineNumber !== currentSelection.endLineNumber; + let seedSearchStringFromSelection = !currentSelection.isEmpty() && + currentSelection.startLineNumber === currentSelection.endLineNumber; let oldSearchString = controller.getState().searchString; // if the existing search string in find widget is empty and we don't seed search string from selection, it means the Find Input // is still empty, so we should focus the Find Input instead of Replace Input. - let shouldFocus = !oldSearchString && seedSearchStringFromSelection ? - FindStartFocusAction.FocusFindInput : FindStartFocusAction.FocusReplaceInput; + let shouldFocus = (!!oldSearchString || seedSearchStringFromSelection) ? + FindStartFocusAction.FocusReplaceInput : FindStartFocusAction.FocusFindInput; if (controller) { controller.start({ From 29a7a86c3afcc98ad4f96e4b6193cf41877131bc Mon Sep 17 00:00:00 2001 From: Ramya Rao Date: Thu, 25 May 2017 13:10:39 -0700 Subject: [PATCH 1067/1164] Start crash reporter inside child processes (#27180) * Use service to get crash reporter start options * some refactorings and fixes * Move crashesDirectory to the main payload from extra bag --- src/bootstrap.js | 12 +++ src/typings/electron.d.ts | 7 ++ .../electron-browser/crashReporter.ts | 71 --------------- .../electron-browser/extensionHost.ts | 12 ++- src/vs/workbench/electron-browser/shell.ts | 32 ++----- .../common/crashReporterService.ts | 43 +++++++++ .../electron-browser/crashReporterService.ts | 91 +++++++++++++++++++ 7 files changed, 171 insertions(+), 97 deletions(-) delete mode 100644 src/vs/workbench/electron-browser/crashReporter.ts create mode 100644 src/vs/workbench/services/crashReporter/common/crashReporterService.ts create mode 100644 src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.ts diff --git a/src/bootstrap.js b/src/bootstrap.js index 022aa50b6a3..3f94abadd31 100644 --- a/src/bootstrap.js +++ b/src/bootstrap.js @@ -126,4 +126,16 @@ if (process.env['VSCODE_PARENT_PID']) { } } +const crashReporterOptionsRaw = process.env['CRASH_REPORTER_START_OPTIONS']; +if (typeof crashReporterOptionsRaw === 'string') { + try { + const crashReporterOptions = JSON.parse(crashReporterOptionsRaw); + if (crashReporterOptions) { + process.crashReporter.start(crashReporterOptions); + } + } catch (error) { + console.error(error); + } +} + require('./bootstrap-amd').bootstrap(process.env['AMD_ENTRYPOINT']); \ No newline at end of file diff --git a/src/typings/electron.d.ts b/src/typings/electron.d.ts index 5a1f5ea3430..05aab3a8161 100644 --- a/src/typings/electron.d.ts +++ b/src/typings/electron.d.ts @@ -2066,6 +2066,13 @@ declare namespace Electron { * Only string properties are sent correctly, nested objects are not supported. */ extra?: { [prop: string]: string }; + + /** + * Path to a folder where the crashes will be temporarily stored by the electron crash reporter + * Applies only to child processes that need crash reporting. + * Electron figures out the crashesDirectory on its own for Main and Renderer process + */ + crashesDirectory?: string; } interface CrashReport { diff --git a/src/vs/workbench/electron-browser/crashReporter.ts b/src/vs/workbench/electron-browser/crashReporter.ts deleted file mode 100644 index 119229bc2d4..00000000000 --- a/src/vs/workbench/electron-browser/crashReporter.ts +++ /dev/null @@ -1,71 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ -'use strict'; - -import nls = require('vs/nls'); -import { onUnexpectedError } from 'vs/base/common/errors'; -import { assign, clone } from 'vs/base/common/objects'; -import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IWindowsService } from 'vs/platform/windows/common/windows'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { Registry } from 'vs/platform/platform'; -import { crashReporter } from 'electron'; -import product from 'vs/platform/node/product'; -import pkg from 'vs/platform/node/package'; - -const TELEMETRY_SECTION_ID = 'telemetry'; - -interface ICrashReporterConfig { - enableCrashReporter: boolean; -} - -const configurationRegistry = Registry.as(Extensions.Configuration); -configurationRegistry.registerConfiguration({ - 'id': TELEMETRY_SECTION_ID, - 'order': 110, - title: nls.localize('telemetryConfigurationTitle', "Telemetry"), - 'type': 'object', - 'properties': { - 'telemetry.enableCrashReporter': { - 'type': 'boolean', - 'description': nls.localize('telemetry.enableCrashReporting', "Enable crash reports to be sent to Microsoft.\nThis option requires restart to take effect."), - 'default': true - } - } -}); - -export class CrashReporter { - - constructor( - configuration: Electron.CrashReporterStartOptions, - @ITelemetryService telemetryService: ITelemetryService, - @IWindowsService windowsService: IWindowsService, - @IConfigurationService configurationService: IConfigurationService - ) { - const config = configurationService.getConfiguration(TELEMETRY_SECTION_ID); - - if (!config.enableCrashReporter) { - return; - } - - telemetryService.getTelemetryInfo() - .then(info => ({ - vscode_sessionId: info.sessionId, - vscode_version: pkg.version, - vscode_commit: product.commit, - vscode_machineId: info.machineId - })) - .then(extra => assign(configuration, { extra })) - .then(configuration => { - // start crash reporter right here - crashReporter.start(clone(configuration)); - - // TODO: start crash reporter in the main process - return windowsService.startCrashReporter(configuration); - }) - .done(null, onUnexpectedError); - } -} \ No newline at end of file diff --git a/src/vs/workbench/electron-browser/extensionHost.ts b/src/vs/workbench/electron-browser/extensionHost.ts index e8f82622b43..2431281d98e 100644 --- a/src/vs/workbench/electron-browser/extensionHost.ts +++ b/src/vs/workbench/electron-browser/extensionHost.ts @@ -32,6 +32,7 @@ import Event, { Emitter } from 'vs/base/common/event'; import { IInitData } from 'vs/workbench/api/node/extHost.protocol'; import { MainProcessExtensionService } from 'vs/workbench/api/electron-browser/mainThreadExtensionService'; import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; +import { ICrashReporterService } from 'vs/workbench/services/crashReporter/common/crashReporterService'; export const EXTENSION_LOG_BROADCAST_CHANNEL = 'vscode:extensionLog'; export const EXTENSION_ATTACH_BROADCAST_CHANNEL = 'vscode:extensionAttach'; @@ -92,7 +93,9 @@ export class ExtensionHostProcessWorker { @IInstantiationService private instantiationService: IInstantiationService, @IEnvironmentService private environmentService: IEnvironmentService, @IWorkspaceConfigurationService private configurationService: IWorkspaceConfigurationService, - @ITelemetryService private telemetryService: ITelemetryService + @ITelemetryService private telemetryService: ITelemetryService, + @ICrashReporterService private crashReporterService: ICrashReporterService + ) { // handle extension host lifecycle a bit special when we know we are developing an extension that runs inside this.isExtensionDevelopmentHost = environmentService.isExtensionDevelopment; @@ -111,7 +114,7 @@ export class ExtensionHostProcessWorker { const [server, hook] = <[Server, string]>data[0]; const port = data[1]; - let opts = { + const opts = { env: objects.mixin(objects.clone(process.env), { AMD_ENTRYPOINT: 'vs/workbench/node/extensionHostProcess', PIPE_LOGGING: 'true', @@ -130,6 +133,11 @@ export class ExtensionHostProcessWorker { : undefined }; + const crashReporterOptions = this.crashReporterService.getChildProcessStartOptions('extensionHost'); + if (crashReporterOptions) { + opts.env.CRASH_REPORTER_START_OPTIONS = JSON.stringify(crashReporterOptions); + } + // Run Extension Host as fork of current process this.extensionHostProcess = fork(URI.parse(require.toUrl('bootstrap')).fsPath, ['--type=extensionHost'], opts); diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index da3ce116627..66e974a00c7 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -73,7 +73,8 @@ import { IExtensionService } from 'vs/platform/extensions/common/extensions'; import { WorkbenchModeServiceImpl } from 'vs/workbench/services/mode/common/workbenchModeService'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IUntitledEditorService, UntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; -import { CrashReporter } from 'vs/workbench/electron-browser/crashReporter'; +import { ICrashReporterService, NullCrashReporterService } from 'vs/workbench/services/crashReporter/common/crashReporterService'; +import { CrashReporterService } from 'vs/workbench/services/crashReporter/electron-browser/crashReporterService'; import { NodeCachedDataManager } from 'vs/workbench/electron-browser/nodeCachedDataManager'; import { getDelayedChannel } from 'vs/base/parts/ipc/common/ipc'; import { connect as connectNet } from 'vs/base/parts/ipc/node/ipc.net'; @@ -168,29 +169,6 @@ export class WorkbenchShell { // Instantiation service with services const [instantiationService, serviceCollection] = this.initServiceCollection(parent.getHTMLElement()); - //crash reporting - if (product.crashReporter && product.hockeyApp) { - let submitURL: string; - - if (platform.isWindows) { - submitURL = product.hockeyApp[`win32-${process.arch}`]; - } else if (platform.isMacintosh) { - submitURL = product.hockeyApp.darwin; - } else if (platform.isLinux) { - submitURL = product.hockeyApp[`linux-${process.arch}`]; - } - - if (submitURL) { - const opts: Electron.CrashReporterStartOptions = { - companyName: product.crashReporter.companyName, - productName: product.crashReporter.productName, - submitURL - }; - - instantiationService.createInstance(CrashReporter, opts); - } - } - // Workbench this.workbench = instantiationService.createInstance(Workbench, parent.getHTMLElement(), workbenchContainer.getHTMLElement(), this.options, serviceCollection); this.workbench.startup({ @@ -333,6 +311,12 @@ export class WorkbenchShell { serviceCollection.set(ITelemetryService, this.telemetryService); disposables.add(configurationTelemetry(this.telemetryService, this.configurationService)); + let crashReporterService = NullCrashReporterService; + if (product.crashReporter && product.hockeyApp) { + crashReporterService = instantiationService.createInstance(CrashReporterService); + } + serviceCollection.set(ICrashReporterService, crashReporterService); + this.messageService = instantiationService.createInstance(MessageService, container); serviceCollection.set(IMessageService, this.messageService); serviceCollection.set(IChoiceService, this.messageService); diff --git a/src/vs/workbench/services/crashReporter/common/crashReporterService.ts b/src/vs/workbench/services/crashReporter/common/crashReporterService.ts new file mode 100644 index 00000000000..4ce3933901d --- /dev/null +++ b/src/vs/workbench/services/crashReporter/common/crashReporterService.ts @@ -0,0 +1,43 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import nls = require('vs/nls'); +import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry'; +import { Registry } from 'vs/platform/platform'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; + +export const ICrashReporterService = createDecorator('crashReporterService'); + +export const TELEMETRY_SECTION_ID = 'telemetry'; + +export interface ICrashReporterConfig { + enableCrashReporter: boolean; +} + +const configurationRegistry = Registry.as(Extensions.Configuration); +configurationRegistry.registerConfiguration({ + 'id': TELEMETRY_SECTION_ID, + 'order': 110, + title: nls.localize('telemetryConfigurationTitle', "Telemetry"), + 'type': 'object', + 'properties': { + 'telemetry.enableCrashReporter': { + 'type': 'boolean', + 'description': nls.localize('telemetry.enableCrashReporting', "Enable crash reports to be sent to Microsoft.\nThis option requires restart to take effect."), + 'default': true + } + } +}); + +export interface ICrashReporterService { + _serviceBrand: any; + getChildProcessStartOptions(processName: string): Electron.CrashReporterStartOptions; +} + +export const NullCrashReporterService: ICrashReporterService = { + _serviceBrand: undefined, + getChildProcessStartOptions(processName: string) { return undefined; } +}; \ No newline at end of file diff --git a/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.ts b/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.ts new file mode 100644 index 00000000000..58cca417c6b --- /dev/null +++ b/src/vs/workbench/services/crashReporter/electron-browser/crashReporterService.ts @@ -0,0 +1,91 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { onUnexpectedError } from 'vs/base/common/errors'; +import { assign, clone } from 'vs/base/common/objects'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IWindowsService } from 'vs/platform/windows/common/windows'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { crashReporter } from 'electron'; +import product from 'vs/platform/node/product'; +import pkg from 'vs/platform/node/package'; +import * as os from 'os'; +import { ICrashReporterService, TELEMETRY_SECTION_ID, ICrashReporterConfig } from "vs/workbench/services/crashReporter/common/crashReporterService"; +import { isWindows, isMacintosh, isLinux } from "vs/base/common/platform"; + +export class CrashReporterService implements ICrashReporterService { + + public _serviceBrand: any; + + private options: Electron.CrashReporterStartOptions; + + constructor( + @ITelemetryService private telemetryService: ITelemetryService, + @IWindowsService private windowsService: IWindowsService, + @IConfigurationService configurationService: IConfigurationService + ) { + const config = configurationService.getConfiguration(TELEMETRY_SECTION_ID); + if (config.enableCrashReporter) { + this.startCrashReporter(); + } + } + + private startCrashReporter(): void { + + // base options + this.options = { + companyName: product.crashReporter.companyName, + productName: product.crashReporter.productName, + submitURL: this.getSubmitURL() + }; + + // mixin telemetry info and product info + this.telemetryService.getTelemetryInfo() + .then(info => { + assign(this.options, { + extra: { + vscode_sessionId: info.sessionId, + vscode_version: pkg.version, + vscode_commit: product.commit, + vscode_machineId: info.machineId + } + }); + + // start crash reporter right here + crashReporter.start(clone(this.options)); + + // start crash reporter in the main process + return this.windowsService.startCrashReporter(this.options); + }) + .done(null, onUnexpectedError); + } + + private getSubmitURL(): string { + let submitURL: string; + if (isWindows) { + submitURL = product.hockeyApp[`win32-${process.arch}`]; + } else if (isMacintosh) { + submitURL = product.hockeyApp.darwin; + } else if (isLinux) { + submitURL = product.hockeyApp[`linux-${process.arch}`]; + } + + return submitURL; + } + + public getChildProcessStartOptions(name: string): Electron.CrashReporterStartOptions { + + // Experimental attempt on Mac only for now + if (isMacintosh) { + const childProcessOptions = clone(this.options); + childProcessOptions.extra.processName = name; + childProcessOptions.crashesDirectory = os.tmpdir(); + return childProcessOptions; + } + + return void 0; + } +} \ No newline at end of file From 0dd3f6b7bddfca066152e380c21764787a326296 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Thu, 25 May 2017 13:18:23 -0700 Subject: [PATCH 1068/1164] Fixes #27287 --- .../parts/emmet/electron-browser/actions/expandAbbreviation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts b/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts index f046995c799..26125b52a0f 100644 --- a/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts +++ b/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts @@ -33,7 +33,7 @@ class ExpandAbbreviationAction extends BasicEmmetEditorAction { EditorContextKeys.hasSingleSelection, EditorContextKeys.tabDoesNotMoveFocus, ContextKeyExpr.has('config.emmet.triggerExpansionOnTab'), - ContextKeyExpr.not('config.emmet.suggestExpandedAbbreviation') + ContextKeyExpr.not('config.emmet.useModules') ) } ); From 23f76d4e468bd9aa6fea291fc23a38049a7c9d8c Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Thu, 25 May 2017 22:40:41 +0200 Subject: [PATCH 1069/1164] [seti] Update to jesseweed/seti-ui@f78d623 (2017-05-11) --- extensions/theme-seti/icons/seti.woff | Bin 30512 -> 30516 bytes .../theme-seti/icons/vs-seti-icon-theme.json | 500 ++++++++++-------- 2 files changed, 283 insertions(+), 217 deletions(-) diff --git a/extensions/theme-seti/icons/seti.woff b/extensions/theme-seti/icons/seti.woff index d1411ae52218317ccb3d374bfa42e106da8ef2fa..5dd4c46c58c12024e051f21d7b8f946184a7f638 100644 GIT binary patch delta 30249 zcmV)EK)}DS?g6y!0Tg#nMn(Vu00000cQgPC00000wk(kpK7T|YV{Kt@0004m0007_ z000O$@Ff;YXKZ<9000Ci003=_005&b)jrC{Xk}q!0042c0000k0000s4T~ioXlP|& z004310000S0000a2fPI+Xl-0043z0002+0002+ z)}8~*ZDDwD05<@05C8xG9{>OVAOcVd5pH2^WdHzkFaQ7n9smFV=H5yf%y4gWbN~Q! zPyhe|;{X5zF9PoGZIcKAL4SV5IDvtcfr05K(;fx}h8_sb_<+HXkqIcuz{<>k6$GTY zrZ6}>V0=)^`~t|00+T?EAOZkRjSR2=0C=43)CW>jK^R5hGcbTiPLc!x0f_mdU${LsTu0k04YFn&=SNUX@*#MMSpBO+>J%|lert+ zkH^ZQJ#pPn+}z%VYfRVhcRac#g}w1mOeKvwq=$1EWRgWTIpLZ`E_virKp{okqnHv( zDWjbGR8YwSs;H)hhtyIRe(QNe1C2D%9NtAMk7=Ww4xWS)PkF|3I_aXD9$wHJ^wG~i zxDN7?A%+=YlrhGc;C~g9Ofk(2v&`|DH_WrZB1VQ5}yX#T*^yvoqL+R(hl(EOpHd99&& zouPTXq4^_2^9GAvHyYa8WN2@*p}j4J_O=?@``FOlHq&=dqTSHm4nupN7~1>P(B5Z; z_C7bXx6`8kRezVEbKQo{^%y$$!qB;1L+APoo$EJrZotsFK||+WT6BNNP-ECoW5iHn z)S^9OhI-?MdJ~3vuMG7j4fUoB^`;H=W(@Ua4fW;>^w`ZugZ>aaqQ188=-hrXs z2SdG&hI*e2^*$TweKFKKG}QZQsCQ(jcWkJ4VyJg&sCQ=3chtF|_JyJLrJ?qfq4u?* z_BTWA?}pkx47Gn6YX36S{%xpzV_g3QhNxOC004NLl)VX@Bu9BCnh}u^k#}b0Sy^{g zc2#vx_kZ+JXOCv4TQg`hqZu)Sq|t$d#taq+O9sSYFv7yJ#cg9`%a#q63=0p|*j&aB z42z5wY(48)EEv4@^1zFY%|0-;*@quKz*c#`FRHo+_Q89aet*&F_x66qqux<6nvSMBWI8!a22GL< z)8Sy3Oa^I&KOTWg>LgAR{8nscEQzI1KgD=7o$UXl@Z_-YWA1auiX6A*OFuGm7hc@J zjQmKXL1YTXgmKw&9yF~mb%h8_x0W5P7`9QVnmv=5%&2>1oxCxPtA=9)KBH1M
    S zmw%DlgxFkTq#Df3g;vZa%|rY0~&_64keHmNrR)Br$YO(SMnahuL(P6k}QRlaF1ydhJ?vL)tpldiiEG z_M!L8Bx)vpo*(FS4&eEDr}`|^7p`nC5h+HjEmwN}%1w40SIbfCH$6n{p3 zJi=ifPbV;(Nhy|v?Cy;xh{aqErjveeIvJ?(PoQ=Ec<=0J(pP84SPbuw$`~YUU0nqI zu|rbqgp@p~8{)!%u~!A$b?y`Qo1tV5V`NR&%W*^ZT$6KRkqtAt(Q#yA_WZI=$@#JF zJC?5Nq%ggsFn%CHQH|Z$(n}$ifq&2)kLzBndp6}n6Z$nPl=vTXT>TzNEN0G5mN@%n zWFFccbfCX7ht9+Pq<_vr?Hc$ZlXN%*by##7Y83Q9)*y2|7*Bd|Xn!*8gWm1X ztU)i80-;bkH=Tfb?dc8u{4qk0G0Qc=rLC-AakeX~BM?@9+&fT>XnU|3nl)w?rhWKi zEvehQ`fNY-YKiTei5FXC!KLo$&BH5acbi3ZiMd@$YS1>r(w(dsRN;n=!82D&0e8~M za<)`ydMW4}6S=4!@J*w;9)G=hXn>YLrxVA`t64oPj8j)^o*1NM%fqG{b9rKx_EPO< zwBOX8(Ec-tNR9NNH&lZ*NT(-3A{uNuoXgKH>0z_i*;o}&W+&( zta=yg&>u}C8n_`oE`#f#Hhp+7*ti%j@JZ3@57Jn4dLyXIFdL*$*M5=C$E)z5iJ%2& zMWH35-Z)hio>xiz453lk5Cx(?*de`+h|@kaF~fWIdn{mJ#}1rd)nm|rfHJDnwAOP# zxO15usn$If2o`UJd4HN++-cOAewkHsNjKI(xX}gJMc>z1`=B5^&AbZWBz%(w;jAv&jyD|F&ojGCNM-l*o*YDEY? z0{OuH88>ZRXWmo0H*a3N(W^QZbEyffqTCC(W$B!oCV>)^fHU!-y`axwsbVqcRG)#@ z&`Sb*1EXmcrhm7Xggb)hCTcvR?08o7!Fyy*Gk{wV>3|Q3t-v%&cEzM(SPdxAt6-a; zurM7Vp@#Tb+PZb2v)*oRwjLE0^sPa4hq}zPs1Z3Z{2Dkjk0vqb%K+p%Q<|^` z7`lZlrhmnFsQ!jh{UwF^E8=M%j(@4UbFi3hoXJlZfn~*B8m5)7S?Uj>#Ji#n4_Mt; zZTXJjq~wXF({pRh|Mv-NO zXWMZUcrCx|H~Wne0Dj#;lUfyGTw@-KD&yw;ghMQT3x#i z?hEod9dns&q#)#NK4?N@WKclcb^$%7%a+?x0HmV>3X52;IE!2XK-; zV1H%Fy|cT%MuIm3jQUIvr_DyMYyac8^TN+i_VXZ{u1NFhMC!Z-V%ZB&B|+FZ2U*nJ z@&RE`?=YvKZN+9_m$-Zi`IGhyXM-o!@;@oan{#tFFW1WLsBEu1$on_tx^rAwJao5u z2Q5c#GfH#t&2G*(sA^Ja#9dwN{!`P7D1T@mxW}^lZR`rwADi?qwFBBw?FN+EVh>cV z6NHq?3m`bcHUfZLU{5H(3gt5Zcq)jAmb|N=s(_vW)7?O`o(=I1H6rzw}W-Bj`- zK?&Jr>?US0qb4O_MkQjZ9}chsTB6PUVH*dx)IfLFR?e_AVt@$S;QLG9`iE^0!V>Fc zSI%xt#pNDYmh2>XJCF3^=E-U{`+t>6p_7&ulUvFioqp-K$*RX^x2n^NqS5RwC{rnu z+k2sfSM19>JIvO#7JS(uL-eV0JSqhRj|Tm%1_TiPC?yY5PJi~bUNv#bwlD0rCR|oat(|Cm>0i{4si)gg~R}E4m z4P_1IkR4QiRUHe@>L*3 zO9CKU2tI&%nQh8AOqdt+rKAQEZti;tGuwwYPaOC3P8Zk(mCl*r>Ju$6W87=x;EO&* z^@^znR%klXkgfqGJXd#p0xq%SfTPW81|tV`hnaZ^&>2(C3;2wT1AmX0PPxS35T#Ye zVg7T>G{~*c@(nAlHv*FqE(l!;gEjD9QLh~J%u3B^_WX@eT)D=P(n$~cFD23j^j-!xqPyHn3;MPO&({a%Ztp*bzwZ=Gk-(Ahg{P8Kc>G6{-rsW zd;vC1BIMgx^arRKA{yD3efr0QodJ0AYi|(-FLiTivb%5Rl7HRK)<1OpJ1@JQyn?cm zU~qr=mpCsKWzO}N{4m$QOb(@M@4fcn>9v=1{6}Goeh3*|zo$sW99a+N!Vj<%2rA&{ z$sBki+3%?{^M5J<{VTqUx2PW&u8|tO9kkmDt^@id*K#8^tc|#cI(D}9yn9}9vKPrD z3YujbnKA)d&dc0)rQSTwb8a#~NhBH+2P(BZPDE_S<@)ONw`S#99(5}f8xSc^%h00* zfKzz3Q(b+=`qR1o%#H2HN8e)DiB$qcAdHyqsT7VtZ+|;7SoXPBYW3FpqiCG3)H;?M z@y5ZH1ioT>VNF^fBb4lqNf~(BgWB8C7H<&1>m%rm9Wa0E#3!9`4?iG0pUi!b>WGd) z`h6_n0iTGAdDujq$3u#^0A-0qBC!BE>_MW8YldPzr!van4G?4ul}pEmf~ez%>74ke zAGAzpyMN#!L1%^!thg`*tMQUq2;G*<*LCPj({USt69Q=G_A-br^`XG7CArVQ%IE=? zz5}PZV}bGbem4O>1vimFRt>)2O#}dVN1xvWzA*bA4&InVoi+7Jp7;S*xX2sv3QKU) z{-2&JI1m*MSHg3hM(zLQvFavJ(lUhiJvZq{ReyPuu6gC%%AvhV!Rsa5F$3(ntz7}5 z{QnEPCPgw#hU4M5n2s-f0T^}kV6m+rYss`@H;od2tidusR`*1Gxx29jcEWR|o07@e zU;w`#8y`MAK0@`w7mmh34Y+49@o_Qmh_ z%d98=GhKV}%F4=k?{9f|dB08H&@3&4Hh;z7B}xGP0Dg?rrwRSi!@u&@5B}_#UiY52 z?@n&Go_yz(KTW=Mym8Bscg#L=%_ScM#82yLmupX-+qn4;7^cZ^u0KN+m)ZlAU~n_g z%R(8lV!t%v1Yqcyip8mOO7Z6>Krq0@Z(KHTQb)R6w>r`2^4?Q_b)8p&T96fcp&2uLyJ^Hbr0bifVmoX0qnF`%n^SwhuhCf49=wS=I6mz3_RAF%;wax?ttUm*yn{k z`p5fYsF5}h!^K|-{>U51L$lky=YQ|hlaEe6I-PxBy3g_cRQdB;5uYzyc!E(6soYej zzct#2Qj@)~)NmfBQ8umHfx;?OgYk|rVE2XJ$506L<`i-JDo|c@xjfY)#(wx&8(F_~ z8)GRCxno8~sqW>2UK~WR*<7hs!cM7{JKpSXYdOG_jJZir)>+;GZ@kp3Reu{L_7{J? zaZPU(VCydMaSFB~iohuVRHp#l%O$XVUR^R_8%{F=#G@M-pt8vDOzKo~ur}SA6lPlM zGCiNY4?R^>suvw#=4^XgTdD6))u=L9*Om-G1Y-%SMCc)LgcFkf4Cgs+RAjzW*jWsX1BG;f@UL(R1k+cdQ+E z=k<#}{5KZ*x*y1>(NBB}JhofP8s4N;=(JfKt#6hLrkeurJO1bB7buv6RQ zfIW*#IOG`p7p;R{7SvE7!FANeOljLZ8VU^`<11TDuB_>Sm#(?t@Q~~1S(-SG&bKC; zhbPyGZoOvEA4;q`PprV~9S>Lf&3ZT)?i|~k6j89;y*8tIqju%O#?0vFG@*GImrrDt z^tl{^V2-n|KmOo@kAKtn@i)KuahiVgru*)@>7xwZ*nPKrWDgtAPqT9{!pq3q7h{yl zIfUvjBC}X&7)z$iN54U69r~aNX54ml(Q9n>uIrDAwZMzQ<=!*8;EGSJ1R0Yb2*&jN z)q1J56t)`O17}C8X~-OZ>EKnDpFe%})SZ5@wmB=C#A!xBTYvkW`W)BJT&mCauT2JC z4e8Hfb^*i4a?XUtBlLMAoUFN2 zZ66GNe!n@l8vYMzOndcUn_MwzF2#;a{k)b$r(G$YvfW+_+~h#j_h&z|*VH+=SYk`i zVy+nrO-nV+B!BIGHtv!VDYX$JldRn@P21#KvoF(~7u-906yBdX`}(%$ozC-?M_T~G3^50sd`Q#_bG2*@LP4~ZvY`*%{voGIw$$uQAf1|lt3HZ1+orAAL znX?`PUta>R|499^o3dN7dv-TQ`Db6Vv-6#eXZ+041Aj~G@r!4!U1j8!M;@7db!TV) zen-I{aj16*EijAP5$}(uS<+215Ig$r*<0WGR&w!y*+(9G?6KKL?z`_k=FYx4`zp!5 za@UvczWYm$Jb32JgV*fc>l5sQsuxgt2}&=UmbxU#WYQ-e{^A!Oewch^cKC~5B>zf2 z^o1|N`+tWYnmzu|{PVuv9b`w*!vhSJSzk{3Q}V5gpMSXb$xrqk`Y-IrW6cLYf7@-J zf3Ue<{&VbAPrUrn0!>!UY1C2mwdRda!O3l{urWJMys=WmXP zZStNPa%c`7!8C=mTVMM|+ZOl{%;5O8+a6eJlIv$5X|&BC2m}Evjh?fq zLP1b9Gx$XUu-bTt&}|Nm-3Bb|*x-~>(*Sh920&Try^PalNr*9HUd6S#5$ATvt=0an zUjLe@8({Mt9@X66q|zkcFbx4v;$cD$>3nrvjpcx56Ny zY|I4Qld1Ti5yMTtQLFv6$$;{69##C`rV-JxPeix4DEYfiwu7xOqu(Nj(C zFWg)*H}9E>4&ZdlmWpWt&lK}mW;U3Djapc+9SR@}i_SwbM+rQDuF108O{yLPdVio> z2*7NaM@*c)3Yr+1zVC2qnt<;(IB#ctDGyx1Drq?gYCb2xKuoJut_7~y>z?W?>FkOZ zo_N|*Pd`76~kN+y++$8uX!uHQGh(#oAA6-zEl0$(WoZPbbeJKSEwaeuBK7+)v(um{#=*cA!LX+K3CmzBjbC@+qXEaPw(BKgqfp*X%m4fTBx0*x=%@XUF?c26A?B~})UmET*7+SMhXO8E< z?`@6?f+>K%f}9%E^IVZ|mr$w;;Kh#XTGU_?2)b@k*5Rf>0YXtrP=8Vb6vqj7IeC}R z1>@8%$&Ll4A#$W?dPw#Kum#Ho8Qv)Cyj(eZezR#1E2>SsD{AE7}c!? z=Ygqvx*=R4be*s7UUir;P$onFdLW{dCB?cI>%4fqU$2_7S6(U^(hrZg0&F(i!ljny zcs^KU*EVpr(9>N4YJZ7UHaN~P2nTeInjGq1!EW*Gj$q_1^S&^l9EYOpc@{G%4;Wh;)Vl5Lx=8@kNd^4xyd;D7}4b-80YPUJXd6YL#hEVQ`J zbg)w*bOoVO>N@KP)1qKExpbk@1HlbYQ`eycYGr}#*QpaSoPVVwbXH}YbJw%=`j(eC zd3Y*vbSPtiE7@&MRvn$m+{qJ%^Vq0*qGE8%?Y7|Tf$6E9&S;?HBe`JA3=_K(RI_oR zqh&UsNv=TCoAWBrHqI#Zn5;%|%d`C$T6z~hSW8mM8)4t|E-=Ck7<}Ox7EaH=*TfV; zfFn8|(0OG|&wt<&I@)pJ3x;!joFWD4qrXh`l*@4Li(0CKfCYi+qWU(Y4$vMOy81Zu z2eXAvsZ=4bIrpc3%Lc&1tKh*mv{z`a)gI8^t$k3_x|4LcNY>ygYJ%Fjh>&zqag(^{ zO?c-h&J|1>BG%erYY8GIvJ3QW-eKh8jJ{{=_TESfu{^q&2+gn z`-Ba>7soani=Ybe9;ftws1QE zr~nZ{1%HQ4CzP{a&-yDzTQrN`(TK~mb7-~yLsY=k;8#qZ#jeARTsADd;)Aj}l`j$x z{IdM}(+7%=qx+A-0-bc+yyw8XCH$N`H8MehyR~e|l9XAYB?V4dJB_28<>i)d zxV9{ec2j4h8|zCG%QgJyR20{|a)0c_mQ3Et4piC)i$;+~l!i&SQLMMh zE1)+}51)g1fQq;Q52%+=?m2tdm~Dbw)U^Z1ZnGhBdGPWCa0}+E%!%s|aL=?Kd!)0D zu{Cf$tOrXfdi+my5ZbwZnPe64tIu)2D~)sqi;Ta zcYkLooxShvpMJ;r)t^3n!|9U;R!`o2^+t11qB-2h)pr8MT-MHNFGPf?qOXe(^*q8b zZGV?XQBhcMQhOomL@Xp%ktB6Vr$3meNw34CI~>e2*Q9C_crNfmDhxhR_Xb}{zG5<~ zDM8C6Xf)?HXWddv$*0ra)3$VG8=>UB&wo=eNaQDUFf93?MFlgZD0OPS2|$5SHvlWi z=!s>pP}e*eo(1FIKL_?G@_osPzIp%*h{Gj!f@u{fG-)wl(9(>WNuxR}%AIC!ZBSfM zl!x_Bwge*&5(r{e(rr$sp3yIbPU_hVti2ccQB*E5lT}XYUI%SkBAHM4V1QgfKMBW`16OlHDxjo-;0OaS0SB{m)EHr`Zjj8QNApO?-c&afL1ZxA zA#z9`Wiqi`3#6RuUJy6c)RrSdX@4?5i?d1+M7j8C$+hO)_ejP1gp?&s-NS z1RwaFpCw--%#v26EOft`WgU2sC%{936)53QxmJSth2SwG&J1S9VC3CM2Y=seuqcOt z#CTZ31LEaq5#osP#MdJZRc(PswWM9K9LvdzkQpX-@}OL4S8A?Yx0uht(J|cwnK9Qa zEAf*M+`n7O?bJ_|<21tb%~&oH5BeiD zBZ35Foc1R}%z@gQvhVMZ{eP(6FdH<9x`w_)xMpCl+Xb;m&$k%W-Iu->`YdgAwy!*D zV>k+Mi6z;GKkUdGsoRZ+P2QW_lzyeo0rQ984&A8y66nMB?l5TfjtGk}BZw^Da>ouBT7T0C#OiU+fWwiL z(%8?>pkHHG1NW~1cU^&=(LnosDvI$DG6V;t!o&p#I_9VqeTknC#IBMF8*L>}>M+1> z@(uPlN>=AJKm_R%pyHj^Eiw5xVJn0__N+VE?;m?QyZSM~9;ftiMmn#5@^MO@fWP+Z zIvbBaMu`c3&zZf45Px_-e)FYR&!EJZBCGCr-D4MWTI-pcTry%04KmB3q!G zFlt-Cspj*0gJ}j-3*Wa!(=9a9F;Z>iZdI-u4tO@{t2s#JuGI&S0f5J15zs~7OJ4|@ zq4N$x4)Um5ZKokXT&D!a zkC|Z2I&lSo3&Z@JrVZK)py)(Xm$&L=z$=LxQ27wC7)WW}t)F)PMsoq*I2 zvw6t`#%0{bT5xWq<9Eb{_rR7@d?*WO(6|vd(;Z2(@Sz zvppwMkxc>g3OQ%W^Te>Zi<7{hRi2jeh4U;=`YEATgI#7$eq{WtE5L-8>rof%dk~qH z&P#zg7Kgf%o%PYncqwTBsk0_s+npIrLo{V~ttnV!J?jOg?udw;Iehmm9(|V!Zpzwa z34h5}pKJM|UJi2RN0wdkb?e^d^2zquGr#0l64L}H(VO}g%@xzA8Qo${gz}uHJ7yHP z$(`n2UYbY00g|$zU9O$hZpK(&sf`o=*q~8wm2`ZHW)7M<_re$z%`ojs$vMzrbrR>; z)X}s*XU~YvM;&zkLZ*kw0IUmhpZqi({C`~&v>Hq}*N=nOjC9%o#0i91)PRlwbp>+` zm8IlH-AMro(Hc0k#PZ!F@O}pnjAIeD$_eH48&Ce-1Hd*nY>dyG0A*%zZ!OL)X2Aa_ zh$k5LvyqUyrM=hrh@U4E`LsU zwo854m(VN2Qk%XdYqvMr?b+{=FU_{e2k$!Zh8L5;?204gUh}<6^VK(|!djhPduV;|qNg2;FmHJF_^G2u zPMkctd)3L87fbZ2BRhad6*|3`H%%+5J#t&tXstC`G`Q;I)-lgCx379mGaB4@B*E0POh^C`gDFUm2maHem=&}RfGXPPMEO-eeElh)1?0ei zlc#;t6R zdHK)%_(`%BnVn62`_QSEpI0ESSzLA5$)m->CatqWz%zad#|$&{7mGLW2h8O>n3>Fj zoQo51c%E5?juT9+!cT~;_OkvJK9*=f6lY2iNCAY#ly$JVs9=M6%10l`2iz6|X?Tbo zG?U#Z9e*2pMkq|(XRKANH1(ACDxJn!vl0pi{GKkTSgKgzxVP;HwtDVNNw;K~*oN(z zwRNc%CL1-REhEuiMs7>)-Z>fgg26Kkig)E+TMX_KNKQhBMpk&Tcg|C4f?y-<~^V z>3QIlt2k$k%zCN06|I5~fQRaVx&ZnZcpH`|u zl<3g*mKaR>BeG8_fNFG9CXdK)(SS-T9ir93ki>9a2#2OW9%NhT;tA*}F!=}V9}X`l zEPvg=wK6gua|~|c%7$XtpqW|~HB}UIZb2v0WKR@u;#Z}`frvzLApmpklT;L;Ig#Cq zt|R#F?avCcd0O1O253-lIuGxz@`JGv*aX!8XcRIuc-9s;G<>K~m-SQ>7KL*<&yg4w z3IXi*#a=fICIfY&!Gy=1={y5-{}K3rY=5Zuo{IW+RH78dkufklns8Ms>}fR?*x+Ie z-Jxgmn~bDERRwQmZ`8~-U`8J6~|Um$M8#*(J`7q08R!c!fhKgCwHU5XobMlWq)B@ z0r#&NQPb%7xWEFOgz2>WsJVg+5e~YRUO(IkL{0A0+HL9(0KvfF%-l&a8!)ttn$(TJ zdcSazk`tRIt_ou=JjT+QlVrl?hRrO`P_an6-Hg^EF#wVtujw)s&3-$=lm&pz(z7Ku zbRk?&+ktRA6R0WB#6y%}kW&}SvVSIcYUkoSv7AhK=D;~^rCZ<@0sT5| zZMz5qlc#3N;XXW`eH8;*lmZBL0JWV-dOX!x9m>+A2hB@Y>wb_#F4U7^a>fePn{MQo zK!z=Dgp3%v6p<4rmO*sOiR)!=_FwM)CVPc#8=mWI)!}w-FAV%z8kUxG;C~5WGqQzc zNv9T+;vlrZ{ii@$0VAeQo-r`n41>m)p~`e*g<_tb3fx@anm^!bwgIEyGA@XOb4;qG z9s+ngJqs`s!*4LIP*mz3wj4a0qdP#bB?t@>VoIOSgl8MRAw$ctJu8IMURyx*eQA49 zBF)Gbjsz~AR3bAHY}UkCLVrOpaD(X|95{qYBti*YC6-F_{S+n1!m~Kjh`A2|t{kx# zR1)LR41e+TVN8Dqsl?X6_h_$P*jAn5t(h@_n?|M=r(SGf2jICt26kj7vgCW@S7&d& z<(mt<`w#TPS^yRi^GxFT+OVl2bmK*q^GKOIR4_SrNw~lel`UT6w11J?u3u^&_m^xl z%4=TfZDF}uZZvAe?N5Em800dvleAh7oaMnrZ{>8omB;i0-*{@#;`|EJ4-X71X(YYO zS-N_#8=ZjWilk$kK{V+PnuWo^aQn(`pJ2}gHa*c!XxC}CYA?|KoE##j$gSkZ$?M32 zKsffo0rE=X|iMrpx-9^9Rf$Y3in1=}={s_J1(V1w$*-#j40And5}X zrJRnvr5{AhtDwHByQmIRc?wxiCFx_ZOeLJ+;?i`o!Fz;BFqm_mK}Q^4t1 z7jT??vAKmnY@*tmb#S%kbljJsH^zv=WHBIYzOWOg^W(V_+@<3ULSIP$0JaDKcq1!O z)L!_}OThgo2!DqxnSfcS0ouE2_-QK2o^VVTQF&13G?a#p{Ym{Q7rJA|^j_-clF2mk z9b8BysIo<%vivoooX8;P8By#=!ULbM%F5+dT3K6jGLr&q06PL0DK`SpI|~4=yi#Yr zZa8XU$~;;Mb(#{swvquC0F{#-rh`!$gp?XGa#Dkd*?-%?vsjo{3_q^x3vN204YeRT z&X;ghW=e>4AS>-O{gP*bwWh=cW#$<)8H)GEO6e57?c?97L=kcbTS8~ZGkOxd@y<4=M(CR zveAI&5PzEb(qp)&z`X`;rb{lN2Xx;FyrtYSTl4~rG4DYpRb5J`KW98lT$_8yyCl)! zsV=9f0Y=uA(D3InTv!kqWtRAyu2I$yFoMi*L;0)Bj{~AR&!#p5o<_hNfd3}Koc%@& z_Ym?$Wk0Z_FsnDOY!};bb6GXK92|Sq3`$ftO@H36nLy`4Ux&V1h59-&X_eZe6-%!| z@hf#`H<(Xff;D%%7G^wxJD~U!TJ@alGqqF#I>2;rAi7!P1(Z5Eh#Tl?X2+!Lfbr%m zsySekWfBso9W%_pwTy%H?WNo-K|77WsR4)%5*@pW>De7-9+klJq_|oMS##j(Y6YK; zj(@q7)rA>;LkAPi!eXhLLZxs7Un6Yj_9oQjGN_(j_2B4-$W)kc9!TxZ%|KUCUZ}oK zi6wO1sQONckbfq)Fw;rGFbx~6EGadHM~@8UUalIG+7z=ZB9#!+8!3x^m?XtKO>lqa zd>%R%saoZt&SOA+RCGHDPO&Ax6UXQhaDM?RF0ERi;W0W1%)(K*>FPGaueWfbl5P)k z7w3iu4ZKDJyB7K+O5Oaqa!i9UV|M`PiI~23mc@ya54J(=K~#Z3`gUR#QB;zf>xc7P zIKCm=(CWbfBZ#|p=sLd5^Zf9IPPf<)8)jifoeSf9;2KS%8wZ9gMLjEYMX*_Bhkw^M z)%nEsFL6pj{{fgmuJxdIVwG((S|=Xm`=2`=>3{c^ueP_3Z@1M8>0SE#z;_*fetYjz z3qPpOt=9J6wDDDy+RtC4pJ6)YVUZ*njsf|y@f4%OB)@$lzw@DwzUQ6S=Zri!d-+2T zku>cM=USBp;P3Ozin=}P7&{z9A%me?^9zCUBHQ8XL`00&Yuep|U?0;ZAE{ADi zm~|_+ODO|eC_S!Mqm43f*2r>sxC2&nOc}GA*cs{i~!07pkMh>7w2|4w=(8&6Cj!mM$#fUX9~6hScJaZC|`yc_wWf0 zZ>cx~I$mph0;kdmJ&rR8tbd?44Ue&IwJ;m?byKe`A6yxLF$?yOy90Ks)1LAC|jVg3kasutL01}!Ohik2Kr+ecHp?`?Qa1-&DEv3GT=tiaA}xg>sn8 zJ)U49444E3LlBbSa+L9WVb%~p!+csa9!}@xV$QR(e!7ROFu@B&ce+EBp;^#wl>&s5 z4ExiCY1Aulm5`FvRDV&*@pPmfm0?1;DwQmjzD%a-M#aLAkt|UJ6FBc;+YyjgfGLxs zWDqA!(x8KMFElxi%+Lv@tzD3HX=GM>ZR|EcOu&gDIw1l$!Xc^~?YII2tYS0fCem_5 zfb0>9z{^)%6Bn#Feuk@$fB>y-R+b{4Nm~ZO1=mq)Qau7PP=D_(S8CwJeg>VXY35-S z{0K-de6^k6Ag0{-AOOq^OD4-@$lW>1DNGif3OAa#9vvTOLM5csrCSro6LDt>#sSJa zY!t>14--ZrtQiMH18!Qho?md>gh>j~Tt6SSG*Hgw&BN^AofF}TcY%W;=H9c{mvH4Y)*!ESR{ zBP@^o3it`bNSiq6gEU95#KYC=Ca9yBJ@YtXJ4Ndl5YO{zGquupHuH@ZVGd3hfriRl z>;%XC>K#=O)eHNv!mkpLQm|N8lBWSvxQ)Dmyqf$nd4CuA4e}oHzmkuU-zC3CK1KeN z{2BR6@>TM; zd+Gb=`+w<&=!fa=&`0R+(vQF?9W=o9o)^gmIIMI{5ZfNnS$Uq;68d2p1B4igO5 z4lh%4c7Vi(PzV(1C?dp=Kqt0OJxW)g&8&<-qz6Mr?vN2DQVqVA<)7_ny)PHd0d41|k{v<~PmY*jOEd zBE@9>U@Q+L2X2$9+sI6OFIgQI<;!s& z8-LiFf@R1iXs^&Hs2hR>;X^2b8xcW^JEJj4M!js8O!NtASba@ul=|)l~a7lBo@Grz%rp&(eD(TOq0zq zUa~nXhH~*meICGzx~2Mr*B&LC-*XIal7GkorxC|K!6Wm}avMJ#kyy4mXHz?&}v~<{C9Ow)6PUEd{GTl-I_DfUpEvjf78cSwIlB#(VLONhD z3Ltt?n!3uPXfS5NnKht5ktxrB*%B`Vh3vgc=Z`I@;NpkUuQQ-rv#+C_04qiSOMlKD z60Fb}c{flXV>X5doYFD&vx}JwC%{XSQ(#u~BNCjxgIh8IiNf`pc|b`AI02eXsK#4> zNs&*Ycb?sd`Hde$GdUYzHkCZgkvV}$`a1f08JRjT#2Q$roADwSLHswr2@qYM{hiQn zr|O2Uf^VN7+j#rg|E|;D5ibOGd4ERULdnYj)ZY&!IH&YDJnB)dL;cpb+q2_mP5@cp zCr&Z)e%iR_CHOQ#jNONmRKBeAtA)i9VQLhIV}a21GwgXMdxZi%KvQkD63I1V!Nd%Wh;Hu|ZWS zOZsr3-o%2ylcB3qj)uQi(-#u7hzDSsQw-pl3Uu)%>%eh-7?Y~$NybiLU~-46ijc=( zK;-NiDqR~G*RwHsQOen8bAJbiCxXEuXCDOj#=gL39{T3PT;)aT$2qwJhxJ`33%K%K ze+;gGqUNK5iBIA%KPcXU{#K^g9eS=aos6M@v$sop&g_*f5I6%M{Hs77NXi}p$cYj} zyU;Vg2sit$FZeN?epNBLny4{MCwh$PyNZo|3!eCv6I8#3k~8p-m4DgVSr7-fd6O}t zw9D8EV@~A%9bBDYkTbxG)Rhh#XBr=GgISi0(-etUEMip`CC+8cDe zXs>TQa@9S*_{yS3$yG;pAGqf#^4ZPfsz3+M9b4a9Z-ILYIJkdSX;{jJQ+Vx5vU}To zcU^tgeYbsxx%tc?le_Pp{UP~Q{@8+}%~(aPd@K!xBygG9E`MS&rLTS2EgzbF`}xka zHb{Ee2FqrDcVnPNVs4H z_!;?*6L;LG6c~I8<|MmWdhC$pSDmn&-LQNxjiSr1 zNPhGuZok05hJTv7NkYq^;hJ05TA{e@dehv`Q(_0{r?gb7Xbo*uMS%A`;9zp&20)upaq3A^I*`+3cuuFI5yFO$I&KT{-Jym#f5t{8U zau4x}uQKlAo)?xcTD}=tL2zs(XQHt_?3;z@2To#ICT4=WQPKskAv`;3w5!GWL*r&Q zUQVZ*M}KtOAI?fma3W8-j1%c3V0UEh8-Z|m+RcUNbd09qacZZQ!72C*vxQOMBKJ*$ zo1D45if0C9DC1JP6WOlLxvX9qCkcA8r1iDK+9~Zvka=OOwT|)av4UYmX}-UW%DF3z zkY}~CeiAMA$Jn7bv8<-k*nC)lSphv#O0|kBa(~rLaP$uol^tCt@Psj~vj>Fr*%v-C2%WUfimkt?=uuSg&wfi8Tu-&c3i*J={9H3O^C2YFFz z>)T^q;6nTHFjKFoY|p=|Z@fr`_x#B_$xEL6i{+K`@BGa5=idpYtGB$ewtW3}W*=Nx zp|AbU+RBrkefi7Z`OdXZ5AJ$7{CnrxHGkUw*dJYxaBT-!C7sO zCanX`?285IIi1$ZO0)21U+7$lhh4^`_Ve2BA;a&MMtj)_0L$Y-rI*C%-UO`LS${0_x$Xw<{ql)f(CB?qtaAx$`{x2smX8TC~3S1LC%+MDYibqz*DxT)WgAe zos7Fv+;(if1WW}QMW%M+Q7MQMr2fTloQ%LgO_0sQqqAOrR49Ym6AQjSe=ZOjp^{|w z7D;1tfF0EJs;QRB%o3--O+N#}0DstK7+me-8QY3!3j>(ABVAnXVy3<@On&8bacx%BP*%6NeHUsdS>XD`mCcvk$Srs z$Pz{iBnf?+`!x?ES-AZUPFy|=&(Wz>b6gWVYGmRx0`9a(smR@G%XJLT3V$WokSEEz zayL%^?*im7p~6in`Dt$If#l6+n$%_u$$Z1d{S6%EKEWfHAfrO3y?OG1NjvaNl3&*DO z*|O;l1-U}o$~TMQd`fS=FGK{a3gfM#dCvNL75*1NFe)80U88z8;D0_3b%W~(U=3Th z95uBo%xoPxwsX9bM?zYR>q4@CEwvjhc!O^0h3)|1YT7Kyer}`Nyd}(z_ z2xc=~vJ$V&K2Aurf^%Y)p}WZg0K80Gtb))GMw`@JN5WH_NT+9d_NvWR>z$Q2VWtet zz|HGnr(g$$I0pk3+zn@m?Z029o<~ ze^<4fVm^lp3ct78<(`#k!03$&HOY!o7hqg5$h?;mqmGLN?uc4H>M4J@P(m@9UfO>M zj{)F%#|Biqgqdu17Mh+ptY<+_L{`TFgrHX{v2RnyA~cAX;#RwVFcp3(gIY6kq~|-H zB6~EYG#d9osdS5CP&uF+)Y{&#nJY3L9j$_Dgf93{#{o0+hL%DbZJ8)C`%*y_HYsAJ^L;v*F;5pvq6eGF?4@acps-0(k`4#Qam@B zXKogzn0+YhWZP74yNB}L8l}sh;(gr6MliP=h5^+x8H!3qS+lad0_MPMx`3vjF}~?p zyf^zdC#mFlL+}zK&Xb=O=GQo*cUhdQfPv9BmX;5lTJh6d(i|<0ZrLRdtew-TBu#0; zICj9U@l@j0%{qVe9)_{IlTz2WJK4ey9-v>)eo=e3_S^FvoK(;`+uM?4VHQ+W8ja1~ zHe?H6nWcLxjq$?qe79Cy(2&mI{RjhN3(u3pSZbYiltaT66hh_t0Wd@FyEES?7BO#} zsfD@)9-j1Zhu?)$!z)u&cy(=HTBRnER&kTBKNjTS1{c&rLfF^!9W;G z86}eAPB?$evSG-b{NNR*uBbagmJIvAQnfWQIqoNd>mO-k`WATQ_01~{hvN!uoAdg? zr&~TJT)IBPpxMusQymhXrJY?l%Bnh3->9u1xcgBdc+tBEkrNjKPw zxnV+8%!Qrmvse?Fg*oBYss6Ac#ciR7=y;u7!?LTP$QF{!Y zdx(EX5HU5?l6B_kfO{Jr7L(p|o=O6lTZ&ex z9Y--IMW!l?Fd2KKxxcjuY6T`5(!qSq7AnskfW#NPL$^1`=E>f%m~I{-m%faSk|Z8) zCgTbH)EV0-MJ3Z}E~$(It6pp^H7s4N4k>^BlAEH)|=!jICf}>Yl^85U&VhM--<4Ai^V3aMYzxIB{5b0EujR&YNuf{_kVv z9#}NWeT=B+dTC?Q)QP_=XbRBPw+{GDy-K>5``p7tzW(K1QmMJY5*R(n!O1&ZzuKP= zatBs*DF-m2-YXcpp#~x35*N_eo3wvWMF_NL*d&+`(DNy75jO6t9lA>J_m|%$&nCb7 z2xZSA-+uHt&w2FxweXMq+{d5&9il($(eFIxr=Rn#>t^<~dp?FRLp!KV0kypVS6r%C zx=K1#D*}guqbiqOO)5RnN(pAvFDXL?C{uz2^oIr0USv=etVE>KP&RRmMi~vQ8M*VTG=ocv-$4wN{CPot` z{jtg-z`2D{Z?w5e)a?MhjfJ}Nbn%4gsIO=tF6K?fpx5v;c+zk(>JNYEzto1~@zMTf z)%5IYDYOJ(E_ewk-0JncqZQydPksw0K2XmiU=NZH0GL8RCP*bo1+110#lu$m|P78(G+Z@CO_rY66~~ ze*{y<7^o#>A-N7}6X7aDnS9waSqKO+a!E@MI247dd=hFJAq{Yt`B{QQO~4WMW)=yk zDu6(74TARov5Ij8F0CdKcY3)TBfL^77o|4HXB#ZgPHA^)KdyhhL3+cJZ31 zHKIjlFSM{&SvY?WsA8lGK178QIn_Fuc7d&Rry$Bxb+ku6AR1X#jh8aq6Uwh`)`{pv zc^=a=01%DS%|y!8TAqg)fR;h6)y%34U}bG+M`;>4dD!|8w|(iFAd1Xy>Grq=6j*vd zZA{Ox0K3ti zJ@xXkUy(u6JUe@wU=p6to8>rhG9zpWw)AQ@&*FiJS!pCb5Sa!yq_kuXg72O=C2}Ey zAJdJJfk|iGZGHAlc#(ev$6Zk-Z(#iB(PheQtL)3%v4N8Gc1}31lP6mV$fmV_ z(!h?X)O&wHV)A}-V8yO9bHi;fwOzvn`6SdG)O3f|w=4!7QgLnD%i{neg5^Q#oGN9d zeo(UIgS7!;gQjqOvveTvL$k{zC3!EgN`@KLqTFwB(7a};mIPou1G6mBo@xDsuxoA> zXCaUkGnRQzoG67Q>2IZ#01zdU+!T&wld(}VWZ8fHHx1tH=%Dm!rLjD6+=`!d+;r(Qb1~|s{4dU0u`j=$Y=`uAbSM-I?jFRo9{`u$s$o&8B$6b|+8~HR=RipKiUR+#0k*s8HFRdBJ*f#R1 znmbEHTzARwThQuEu)DK*^YWD#v|YJdMu2n53g^;u;6Q|Y;4-fS8QtY_GDieXeyD%u zj@)=NHSHKp10Pr@ZuMlf^R^Dz*d(Zy`Un6e>6X^=*82MPn8fX_iYFv!oAmqWFTKD; z2tGVi%jztUNKS;K!f~(^Y_A+_9bQ}sEw;T$zKzv}c!~Ic_$%>`;$H!(F6(kh7KoL| zhdUCvZKTS`3NTn;%*ZwvwiI+?R)>GqDkHCvR$HfU7sY;HICcxlQI|+%q0W;SBcnoR zEs3D3A{7H7>^e5wu>3IZY~57Fe00 zD~=0}>+X)aoHtVfTkZo;jOj2^aK@;2Gn^na32x$!oDQ+TNe`VIMYJA}lCXbHIwVVe zOcoJ>$tPnDghC+^IzBE}XUk>I!3nt|mL-=~!h&(e=aY?qJq03NV}S6fMrN1GV`XS| zw@gIlMcVvo&S4sl21mIJ%HeW3WwvgEg&0tQXO8H0$~>ddVSxn0Sr7`!l#o@1!0$$h zkBaNDjWZne=sAX0HP;{+kL+KV+0``{+l%H}WuC(Sy#=)XtU>;NC|B<9hG(C$4 z2cZN3!@zUm4lx9$>yU<|ixz*7Bd8JRT?1KOXpcbbfND~supFN<#1Ghlch>2Xxum=r zpju-OLFS02s49O9D)DTr*2uy^FYC*RN}bq07|}y%Aa$)UyU!>m*ENr{>Z(vXB#r~( zFtY{=73@cndM&YB_aACRPpLFeAE{g_>z0r#z?%JF%JQa;ieP2=w|#WwQU`yRxrAMoE$rnmjz}zKNF#kf z%A;fxC;xCQfMH{}Ego3OG@^|{Me@8>jWaUu1Jg{JCbR>OC~Vxsj}}+$(2$?)VCBoP z-DK%RMk<-e9jPEpwQUC>X({4fd)URa`jB1KwuR|UK3;~%kAPhJuoh)aRB=la5(zY2 z4EguQb0U8`iWi&+bhKRZ{#`O9L#)aQ8MsT`fmAbFL4;J@FVl5G z9OgaVeUPFO0r3h}>uh0shHCsRQF3K_efhwa;~Z!my71$hO*bUt ztr;98e>n&@SBVYZdazZsWfFHY08)L)&pT@y2i9%NSha&~uWp>cMZUiD7Fx|X*=QU% zc%n0h5`6Kbc;3of%~*4xVw}0Q@5I%s7rGfqqw#z@Y^DdorZ-@WxOoRaa_W5Es^(Fo zoRxoCnq0vu9aj(lLW-r0Oom}QDyu^#@`o$s z+e)mBGTqk557Fd|$RY}l+%_Oj`SjuL=3KvJ#i%hAwe+Bw98K1)YAL;N*TU(YsvGS7 z7HNg_blM)wt+h!sI5hS11MO4M`BlHB!uyqqIN_A8zh4EGZEWL_P%*!8zxGjkipGD6 zo_;^VbiJA;mGaj6;e^}9ayYg8ek>+?u1}}hdwV~?Fc?%$0QqzTd`@gF$h<^T?*c87 zQ%R7+Tu%BvlA_6$n*Lxe#*=Pz>e6Ioer|XRIUHVw=py+jJ*~;{edb~H{EKOGa&b#v zICRtPH*FrKm&0zc~B%Eih{5j#W1CD+9wqsVaf%$SVAUVATK#{A$3HuKoH zO(%4-axJT{f9QlOhxhL#UOQh%Sq$;=@xWVM^#ZxL`(-ikg5a&q{jYYf3p{@@*!?oT z#W}(5U-5M#lGZ)pe3`xozW?>Wd*~rLH^{1eU2(G#JYx?zKUPlQ)uA#A0I%VDucK;UPb|J-Cm2L>^x_rH|G-QLlo z;;!9CpM6$r?tVpSVELck9BhBCo>@D+c4hssO7o;u*@kbDR>-8fCYpH)s>mmdP|@WoDSYTC#~afj@!ZL(qoOu^XluPQ zx@)+(=8`E^Z#$&?!6tuny_BZ!-P&~%4@QA2_h_H01(H$cDz}!X;Ik;IeZ^C1nZf=h zDz>4@^_`jO*%Y(wbCzH-Z;9D{gS}^~%com@>_)e&Zw>};dY@+>KlZb)z9ZERc1~rU z-9FdJHfl&$PgjS{wf4@nLC{3C536@mzEbbkU$8p2BqF~xNA7?0ORu?p_mggz)Iwi= z>-^EP&wup|Z5ll5({H@(nwzue1&Oqbom-#0{aiiq5<>&7%Wy^QzTkOhUzD`_;Z;2k zNSgLa?bwNC9wNx0xiS3JBn{#QyPtb<>#d|q?!=70vd5h5Em4g%!wc^@#{a)V+TJlZ=R3GZd{W;=eyC$Z!v9H7}j^w_2fy-CE?v7WoctqnQ-j&5Zyl z>Qb8e?vu$uN5Rsg|KyC2^vxCzj%s188jz)_A}^$lgeEeR)#EFO7mk6}g@#O?-5C zust7b9V>P^ZF1bNpH3F$oXpMNe(a1Z<%(tZlvp4yp;mRgKxopNN#{UTx8061YE74=;NLkUi!^aQYskZmE2h z>ck0y9Kuo#LAiU)7CA$b%h|fXqQE-G6&n-Yf0+U{+$-GC;FW$}@?{v0G8<6!M`8oE zLO_3BW{|?gXlS<{EGNMrEE>&V*;*t|&RLAR#x!+7{`aXuT7Xga$YvzR^V)5b*bPo{ zDqQlWMOM^mQA%d2IeFdapmGcMwjJ{IYGF`yauoACc=hwPY&%-4JBtpN4%JORwdKR` zl2Y5(t`i2*C8x_K>!;~@9apV4R)RIUv@m~;){D`yV>hT>fg+Pi*!`;y9@MFqc}a~% zPX~k3aVwr2R*U3Z1Zwk$*N8pDLamdx2(Q~A$4)19VhwIn0Ppn>gCzrdo`&9U*7TzG znpR@##gJ^i{dkNYQ)hpm?n<8ZdnTLWeOY9E@z%?i#h+ci{QcvXFaO)+%kuIo|Kfix z{ED;m@=^M|qLW`NpCrz5E1k;e%1=Qr4SRi)BSw+Tj4={-QRuMWHN$ec9TjPLa7obD z&`q58%L_>TSuv7nx2~t%Y0h`((D<^b37KMK#FKUoymXba9>E-2Tg4O&z@!?JPb#bKSnSr7S z6(pAuRjhe;Cy}kLIpTV8a;JFT>Zwzz(_3Brk`=_K?@pFnl7hQ`a;x-`mT0ed&Vd_V#TL#KL5iqH;sIF3NvZsu|3t zU53I;t63e1OXDi}WbMwZG68R_@7v`l#yd03XLvi}xyO4)jN0sxN4op|&7+5lhPd4g zmGAFu5s1_GIs5BU1*(E4z$CeynNx$2e6tjwNJEwa+$$~@Vz z+m(}*^JK@~L3-^Cm3u4is(iTe>B@hve5>*=!WJDd5!Z?rikFI?68DM!EIuNBSA0=? zT|6WHNgBB=uaTEH-|b=f4*4GWJMszn$MUb`*X1+v@8x&p_elfHsU?5aQGGR0$J9x6 zTAfw5sGnC4s&}YgQ;(?+sE??Rt52yX)ECs()HCYu)xTLSt7ENM*I74OKWV+zy2rZL zdW-d-^$F{@t>3dgV|~GT+WK4T8@6vBw$IrY?2GoV+V8PHVgI)M$M%=)uiAfSf5ZN^ zCYMI9=mUC9U#D->KcRnb*RRy~>9^^}^vCok^k?*+>;I*{WfZBf$Sj$4vuOrqV$Pcv znpd0GoBPaL%!B4(^HK9z^QY$P=5NjaHQ#gQot|^hIp$pJT<_fM+~K^!d4qG0^MLbi z=Y!5~I*&U~IbU-A!uf0G8RuE&ADw@8zU%zEYrBCvPa^4vyW@Y};GTD1vs{TH2S~3as&z>&26LBO46q z^zCAbM`s2YlxQ$b)55@8$Y=NKcj{zX8(fIC(WETsD8hf_^9-SE-ANxM&L(DSGz4J` z2Q4@HlSb)S6X_6549g@37Rs#p$fV$F#xv?s7v->_>j*(aXjaxo_GX_{V0jmMCQ1ZM z^U;*Lg_W3C_Ng7?Dcj9^&@jkI-Xzfc|qO5D*c3>S7u)$MU}4KI!;Hsx|rmXd>dbp7l4X`z|1ijFkq*n zDK(#d8yGcWV7UA`&rqj>|^OU4C?(-~^X zWSN|%TodW2o&5$kZ#14}U7~MR&yci2pYeB&h~NR3FT&P&rzAEO7D|tXuAdG8L{H5d z=7oXaF8Ubb9K5+GaIYyfeLAE*_P6V1Jn9ZJ8c=H31QQI;?QfA5n9{uL66G+a)I%Ou zgrI+;g2bd4W<%<^>7$SZrb(ShMZRF4C_N(Uw_L0nmSz(sHJ3@ll4qyT;GRB_h?rddb#K^U_6rh3vK zKZvAJHXEi%F)fkNVJaF1FzgrGeJ+y8m0E$^pYt*<=L?Wuu!NBVTVR2ggM|;%8{ZAnax#$jsbr7&mrAfka;#LW~^U6_tp)EqNSv8=FZ) zs1c+$L>IUOgMlsP@n}F36OYNMNrv}W$@K1To#62;==M2}4`vUC)sf)d+nM9e5D{rI zW6Ep;rn$dG#HGIW$xx>w9p>HhT`B7lYfDg-w~TS`{hrU@{Dh5?k~HjQsAF=_?Vc$-Lo1_1Mtgzyw& zz;IpE_~|x1bWFFVQ5%pb(wHp#~gn2a&;AZv^U+tCfjBkF!`x+LVOw-A2<(*lByAy4_O zpOgM2BV{nuec(jmK>))UjETRX-nzgWfTr1=5Rd51GUSh@L6?*%4Hz*9FCU{G816xx zDcGLL4cbY~>=Lt2kCICwhagrygvh{Y^RWdh9an#I{;;c<n+dmfR)_ zYbqi{Jhrg4+odyt1bN)3Qy`_n#wl+E(OncDbEFs27mJcX&gi+qLK-&W?IS6w^rR5^ z!*q(}OF(g{5}rh&4iF<9A`+V}M3TP)A4XXc^)#s|M#_x$Z8?n?z>Rk9&~qG1EFsNV z@S2{Bgc)Rw^PYb%K-@A}RzI?_lYb{&D#>EBfNSQX>6Uwg;%dr|=;b4#2aDW^TCr+taBJsA#y`CUBDRFdFcB}zJDI~~J>d@_v(JtD+|Ww*ga zd{5?l>eeaxYLysJbtrh|iTmcI#tqtRa$-{exnbeC1;Y>XRt^wa2}VI%yaW5nu^GFU!$XtSrechHN#Kml)2qWJ}!knj;^svb8qB9C2KwK6j z$by(bn$XK1A#4NrbvAfY{1?y5y)eLF26}&XPsI{Nt0NTM?D49LRCsl z8zaCEQy#(zf2|y6Fv2QdFGP(SO-&M?Q`+)W1UL|-p9ZtB@H1kaqfUhQ@ILT^dYOMv z4%p%C=&Urqh)QlyE>7ZNlr)K6W2-+!dx>7D5Vw(jurc1RFHt76^u-&5ZT|{WxS*!W z1A>$nHLEM$K@V|V(n2owD$JY$(xjz~YaynJ_}yhF%^)SM0_aOSQ?k<)KJj5-JokMF ze)$#ZiDjhcT6T_NZbm)D^Hhp3z!ZO@K0V?>QT!(%+L#qTff!w$Z#~9W5eFFzgPH}# zqf55XNVJ{qWp6{9$uI(~jb%O z+!!G`&Bo*vqLiJG4=z|4W8l@?9+614Hk_#M0p8X1Vpo4Bk+$h_tt|&R zwXW;g4tU7L1GLC37-6jLe6la>$k=*Lff31;3WKDbI8~82y~2q}U>r1&S=FfY2cXa< zF_ISp$XiClatbrdxWsYxbw!V^3=lsiJ1pJk;yAvJRENd$Uz54n(XmGzbZC4L(nf@z zqmLv`G+0$}ogE8k4#+HhvOTu65Q!+l79beo$ZK^l3;{+6R-5HP7?ET*#6+>g?xf|L zfFvrU2{qc2OK2K@X1XX=G#4e%dJumJbY4v+tix?)g=A|I2R0E>a*YDVM#tH zM$tSmzSh2$DvpR$!ofxo=7?*nBu2Ql5Q#=suXO2XwaT^`GDk>1Dia}`+YzP(%sR|) zSa^^U7zE>3#XB|l5=yMp9luHgTxWv-Q^_@`JOeY3T@Nxfjc>C(PZP&hWqa9n2JjJ@nZZ~KiH)>269f_!`xkZ8B9nEXFuFDz7vYixEc z44EL7a7!mH#;itNPHJ01Cu2%MSR3dX6u?q{G@Jnd$OO#|L?j}8!AI2t%yP~1nr0wT zD>4po1&MnDqlubmbA&L1Qn)E~JkRh{IzYFQK+F!vDhxHdF^Dx0=m=zyWG_L&FG3_W zSNLL|&;|u<7V9Fd0dmzLZS62}0r4k2Gm1&7fTGZpFmQqDO>_-xlq;2x^E5{T;RH^9 zjQAN;Cm^nsoKeYxWr6ZG=jy|EGO#yo@`tJAbB>_yb0DE@c_bpN2qr8t`EjjgtBIk_ zFlIJKVS@|VJw!P^00qI4hEf%LBAK>UAas>m<_XZ#2GAUw-DR-?7uA7DE=zl@w3PS! zhrN&Gi?n7g1}t>no12})b4tXHp~r-OC}>yqEdsU3BvLjzWia1J15@`%Rq4`$1oH`A z0pOb>;S~&~SWhy_nkDuf3XC6_oQ&+nPVbNYo5e01kiS!L5Z5QVRr)_}XZfh;@0GMc z+6ZzsyByb0qGOcB1ZEK+(;#YG#o)W0ftqc!3|_`ezk}fNQn@u z1iH4GJIPY0fIKM8LU&$zNv&N4h>Hx@i_Ko~a|fgOV*RFOkkr=fy3uxn5yweXnQ??h}=VLY}fn+TV+w=2DfUP^i$f5{3vqR=$98=6V7FSx#w%o#PhL@ zm@zU_t4`E#>uDIc0jgx!Q84PaEj!wL^XAR1Rcg>}XF928&24N4sTY&W7^P> zuU0H~J<`DL>DZymmD}hv;(A!k@AQHQ-C9rmnkHKyBn!;-_Tpk<6;;wo3utkBL3KMf`LF8xN`3UAeEP;~u040=7Y-D7 zzu`X~D8v_cfBj?X?jzFLd(L}RP}YtUY1j0-ZC`ZBRKEEB3un$;5SKpx`Fq8+^#8k} ze&2n&pAhP7Ajad!3vFKGpp?du%|DFDcmbiI;_qW6?f?niTyWbHD z-|2o;G`4sDhg{kH+UCDriGMt#P|f`pDo-JL3Q(d51MTkD3|be}mJKFh)GjWrgUqaI zKCnyt?k+JCf)HnUI@s($?h<0=QBjApxj34Vt^)KogQ;TKcSoHNBP^nJbg#ZWrfEDZ zk;WJy4C||t8EPtj9sB=$#Z8(H)S<}##yaY1&hX()M zCw>nSjs7k_KVE)*Ldb8BRD0mO7au7RQApwH-I#%qJ)jYPk6CNEO1w&KyeViRUcD@u zzUl>okeu1uRl?|vcaH6bt?FxAO_~VlxfHtO;-(4*`6e`VJEQ zocqoN{&(xG7cP8f_xFYLH~p2KN^~uhqDhXZScFl3sY7qm%TiCJbSISpE((^E6NNBP zmdSY)-Am;^`6s)#l732d1d^XrIe5^Ee@+*}d6QgW+m%N{vW<&zO8*=5+dE2hzu3?_ zC%Gihc!PB1^RWb)-LBHrE}8;d&W4>@z!mjnveH6|loBV$gf|NJNeod=Z(ePj}ERnNe+%WcjA^87b`G4gDm zyjlC*_)t&}x0c-iw0-ulk@HLKlRDy-K31BO?v z0(hKbU}Rum0OBW%TYKX9ZN4&aGrs_eFkJQd;DSsuUuNC}q&OIuKs*3R918sa0C=2Z zU}Rume!&0)EE_;1^JNA`22@ZE06xS5?|7VJU|?WienB2)*+9HJA+_|tw06S^K==`# zodEsjYYCG;av*;P@CbkjatYK51PVS1U<&371`C!9Gz@SIjttffN)3Pws142y@D2zL zA`X-f7!SA-0uv4sR1^Xf^c8*;%oc_g>K8y4To-s3`WSo|t{EyBiW*ED)Ey`v#voK6 zlpwGn=p#TU5+_V2W+#Rx(kLh>rYSrrb}6nY+$%CH5-eKUEnqHYE`Tn$FXAu^Fs3oO zGek4iG%7a^H<~y`IF30GIcz!nIwCrJI^a8OJOn(RJitAoJ;pv@KG013O-ZR-;8T2t8~7Yw z;7fdkukj7O#dr7~Kj26FgrD&Xe#LM29e?0Y{Dr@ARs|#(V>UJ8Ur*&7+5&m zghxO`!h{XBvywZfiSaO&JV|BChBu_k#%{>7Cg^`!EJM$|gD3X>kji4bz1Adh5IOKN%2 z@w_DGN${BWE`@cK%$JcrC8?tIXNPGWD$;7J{JBF~1>u#8jPzKN_tsYwv@)@74AH7oCc$!??<2pPHl2vd&(uI?tu1eNsA&005*My}mhHXk}q!004310000k0000s4Hx7RXlP|& z0043n0000O0000a2fGAZXl-004480002!0002! zo@LC2ZDDwD05<@0C;$Ke9{>OVAOcJZ5pH2^WdHzkNB{r<9smFV=H5yf%y4gWbN~Q! zXaE2L#Q*>U|B8h3s*?x-L4Ur_IDvtcfq_AUX%CR>fzXT(7z`Pi7#NrsSeY5Hf`ByF z6b6R}j1MZAUjVsLU=pYiL;wKFdkWJ40C=43)CW>jK^R5hGce>JlA|C9qU0PUiR7Sy zlB1F{M)u}nW+&M9U6&zK-|ON1-KPfX)c`3#a?l*aA!(9Wct>m`+<%Ql_mjzt?#E;K z(Vn>OCmtRj!!@RB_&pw7lfvG3D5jD|IvL?y7TM&G8|3hWJf4zI0fiJ%ObMlwQBDPw zRPl^zYIsg9b>a1bdK!31Bd>T(Q}`4uw9-a<*xx}XU3Ak!FMaff*8qbIh3hbH7-5t# z#+l$Ple}Y!X=a#Zj(>R;SY(N1-t&Qvtgy-_KC{L;8*H-0HaqOH$36!f@`bM)aU4GV z38$QK&IOlTam@|4+;JcNPLd3*$)@Km5jQGFEBJOG&CoX8P_)v>V#nVQ6osp}k#(_I6wJ|LHMwuGi4H zK11jF4V@b>bboHp(77Q)=Y|cPdt=f25krkpLya**jd6?iOc?6DHPo9l)O%;BH)W_d zZKyY6s5fhYCmsJCdSw`8cdY^e9%Q164G-bX{d6+^vML%mOidY=vT)(rL5 z4fQq*^)?OlwhZ;Q4fS>m^>z*Q_6+s*4fPHT^$rd7zJD0%eKpiOGSoXZ)H^ZMJ2lih zGt@gb)Vna$yEN3hvgkYK+EDw(Q2W+U`_54N-cb9Sq4sw}?H`8PKMl2i8EXGF)P6AT z{{pd~OGS8`l)Vd>B}a88m=Tc?k?+i#&ztxCsC#c!S9MkOeO9ZxtJIB}Zgq=pBw7z7 z)TXgOAb(jPSr{4N#Vs>!0xxIzOT&4%y^tQ=l{<+5z?pz|1rWgwd=JzHI0ZwNFhBU#VYA+ z(0;cgg-^tw+ZptC|0d)95i*{QXWL{pJw%30l7EiU(Qt=MhiQg?9)U~hBu*3j)!ock z5=)`}x|8v2y7!mDlf$kbbDuj_JFM%^pxOaep5}qYYOE6v7ZP5>9*-fEt?Yi#~@<(~2-SC7?nV-6rEuGvo zbxE0~t3F((cW6?xw5j$iO^arutUKt+*=UeWpl_h7CgVYWgQ)JCO-I8lQGFX{X_GWa z5<};7JG03sn~jq0M0N+sC$3q&W-YreZGRnYy?V16`_Ox45;YS)&-e8^`|{AS4Lb@4 z4bRI*y zeC1v5`pO3$`SlMj+OVJgtya^vwHuWzbfCH$6h?kB#$le!rZAjIDVAN?+Z|63i+@56 zX464`HXW+*PoQ;!c=zmhI#6dPSPbuw$`~YUU0nqIu}xC!gp@p^8{+(svDXFMb?z4r znxSM4V`NR&%W*^ZT$6KRkqtAt-f?7N_WiO>$+?N{JC?5Nq-%OdVEjOYq8hutrI$i3 z1ED(}*S%QxY|4oy^s84W@jvXi`hP`9EN0G6lsNlVWFFiacA&p>m%}rUo&Nb(lx)k| z+_$xpQX9FWDoKesNS%VbwU^4B)q3LV@^KP4F4SJ~*2!)z+vnfok-G6yQzi^b$ zqs(%RaOprcs5o1d)iDUGKk4tQMzlTL49yxdyQY2UL@lY?y!v84^=gUjn~4`&Wx=KH z>CHncXLg$1>JoE%l+>VYhNU}MGpNE18^af_mICgimE~-y()3c8b4=u-y3aR_-g@-< zkpZ&=I-NLfUd`%Z*Eo5_=6~^FTDClFx>3jzv$R)fKd1ec_O$jNNknR70KK6av_U$3 z2@=s@vr!>GJEV`zUS|_kK&hdu5REB{*g~CPr)B934>hq%CbKczU@}EvMM;_sK^skH zBP=pKLg3Uo8GtrhXE5v1WE;D^Nj6a?M~hAdQBC0DiRxXf!(cp>sDI!___z$NhuRF_ z!Jy+}xWFgf{$QBKqSGHkT}Ih3g}M&9X)#`151I(G0JSKzWZa*ms=`H;)ZYjim5op! z2E%RA?}#`ZKoc{(=b+C526}AYxm7)e84yrLb(+@t4hVNHv%}T8#{$9P17V(K7q%O9 zre9{&oKhbiNEqWBWPj7qc@$Bd8>aB2MJP9P9pr_Dpkv{F;kqa435;MlrOvNJIiWE8 zgc>^6C1^^%>UJt+!K6+FC_E!DbVu55;#pq6&N({UzXV#B`K*=(HQ|Gn;e=W>ICMVk zv^LtUf15{J93CH=lIh%uphYyUf@0;vr7I2|sIc6M+|ZXxt$#d;V$&6lJk#C})o7jl zJwGCGJ&ts0vjEh%1@|F3r;aOh;#!QFoKoJX=GJOO2tNY(!2X#uZCz*Hb9y&!Ubx)O39X{s3%F(JoSP$lZsI_phT~NZi2$XbcBQ&;&*B5*7?qQyS>?Z zLRiqZ2Gt$vGSi|)M}4Me2jvgjn+YRdw(Qukl}O&Qb}F1^UMS1&+qK) zkjiAaxnW%}#%I@u*AIu+zxamodzL5U;hS$JmHC^=^*8SrO`MHInL;bk(aH z&jxV(%YVJ?{oUEd>HN46SXS(%VOj~BrNJ;tyesPPfYpuFmhTu&N}g^yeYd|Mme<{$ z(}dUZP^=8yo-DOQll;r!o3~@Xm!A`v*yWW6j@eyrX5Ft*YeALbI>?_x-;yY zK3#m!{H^E=1NnAuT-n#jSKY|A{CN5DXB%f%UhyKg9OtQ( zSX8oy&q%R-e#eblwXhYgT>nzZ$w3k}11jZLpvv}&U4Lc6aU#>B-3y>mZ4ogC#DDUd zFo^Ap6VcLL+i#s|y3h@j_9Hg`OA+a25Oz=I08djcZ@Ho5MS>Et#n=tZVn$6$z>G@7 zR6p!v`?N$W>|q-Rx70v$*H*@`G-iMZ+hF@kVERXG5W*7cXV0GBoQlgm&@9;r@@^jK z$IKJeZ2qg2u1;EBOl~T7bo%9ECV#6Qo8PQXFN#LMet!ULNrAxJuWMB^}WoTw?t8b(|(+aCAaat;+ zVcwkojWAhf%a41N-_AshMSra>5D(J_Yq)ZHz4A)WOU&gfL5h|HK(-KU0QEB4lyR6a zFBnKk4JO>&_Y!8d4{jbm=INatunQ`k)1%d=TcF0c*T}&ZeVXbOQxB}rbfh6&14?+V z?)n5wV#xtRo7W6R_UjHa^Aeylri>Tx85sv2F`aUW!68bkj>G(yn15-ITcPC}R$Olc zCM8@Dx)cU$V85b%IqI90n$zt28{@cgwIijIAUc4{9b3ptW9czZn`qD0eiX)XR16RN z#V~!LN3m0p2O$0;Y6ReK+DBNnKtjVQYtU_~&Z*)Vo&uqpOdBX0_z&skXbN|nkgxWQ znz6OfPgYE9oWC<^WPkMg$03}?J{eKwr%;Lpg>AG`04Z9AT!!ZgEX}dV+cUdv5kUPXT3FJbhogp|kl{c5d4tNAEm_ zH>KqA>DD1;>OE9>oS81~W?rrf<7uB6@&n}3eETuzuOC5nHGk+UfM1~8Q6Y!`5rHfM zrkxfb7>RdZohiBts95)VIE4Cxt{bbK+(sR$pfey*at$|P!`g_uQOC~K?zs5M6a7dg zQP3>g$XW?dWM1aJEA{3vo^z7{Vjl?Ov<$85 z0#Jl!JJr<}tbaeB>o45cihR`bhMia?5K6*`>7GpC2(;Xh!LrZ2Qmel{7)O(QrPi_B zh&T4PByb1Y3v1GX@uFl;FP4EbJ*>SO_2LEr>^z3v*alU!PJGgt^zjQqK;Yxg3b*e7;4uPtj0@bSLn86zOF-OnvUBDoDcvsx0gYTs1F5pEXjQaGhPq4 z^c^_O9SbJ%54s8147iC5vTE>yZXy6oJ9=>w_`&Rd+JAi#b=K57dHRQ3;Ub5_D=fiH z`+s<@;D10GI9v(ObsDw*m&dA`KuOCG-uK<4BUR;5x{AuXm4myLg7-@pU=BEPOS=L_ z`TrM=OuES^8BIo$?rd`D2SA!5`@35TK9)>7cGD;U_!uk$d~}c3mwOv)FlRkix+$5i z4TtdW6O%)SCWonh==_m5=p$TYOqh0e3UDzFO@BK)+m1uuYx`xdx%S{>ZEI_dZEsJG z9h)rVl>P<%KeVdWgckfTXgll59nzKLSbpZbfAxj@`uqlXow+f(`eya*qJMorf{Vw_ z9K9F*J9_5W#fuj|dG;(|#X_&z3w-Zu5g<~079jno)Gl$j{cQ1=AN2VpI-D=R>s?>^ zL4W_4^~`^yYj>}#tW0)a%gf7qZThBWX(6;J28~?;AO=uitiDa@mmmGrcYgS-r~AE& z@7|eScP;tuYk!t}`&i?q!|$1Y?CMMQ07#hD(=OMZU+B2v4;0gMRLq}|@)7NVJFwds z%*(D)WZk{eXtRMWXUZ?8&Z&uCoB+W9eSf=g+0aQH>2lrbMB~f*&w1JNV6@HLUAwIA z&HlyaLBsutU!}v!zP4Mowogr-clyZ5%Wa-JN$H7C1T9aB!>1~Z4ZoxbQw&(7aVJ1Pi^UwVAal5VM`Ca$jkn(cKhX(TYciWt%eoDYbAMx( zqtU-(WN!?$s0}1-@hZXV8S>3}_7OavdNX3>g*i>o1A(5k z4d~tj<2_h2-E|R-3ZIG6X}t~8@C{Z)XFJHU-8=!z%;qX4j(0*o$~K=*ld$%Jh<%?!|oZe)OvBEvJOQ_Vr!^lDO= zX|2cfeEvbSR8gtk?Ep(=TU+9MC&Io_K$^XT{`n7>BhLlddnuw3r6AO6@P7k7d-&>i zQJpJh1)U2W+JO#UV3^S^JS=**&v#uuQaPZ~!Z{`S0PG>p88 zG(p|2{_|^I#X*8(d9b?mwxgGghs&wCZ22HT0h?DX-%Wl00XwNVS<~T;4DInt>6f;x zZFl?4ix>Vk5&F6x$fz+$e18ipwp+>?-n7-#X|pbha4 zw#fkpb}#YLXS1nxjrLaU1KNkQKSo}f#e1OQ61M0J3gA2$pa{X#8xO_`sud^=_`*od zRb>#1o;!q^8v)#`zaVXZslh}G{FqD&wl~=IXO5-?omCQ>EJT-$3x6T)cJ{DNqBO^- zK>izKm@25#?XMCA-BF_~{A&|>*35Ng)~u41=3Ct1<%*T;Pf|N72}C}Yh;m_b>7*j@ zK;9e?0aoF<;TeN{5%)RJU@zXNRs_t69YIRjD8_fTqqQAJ$-YaL*B}6bf^B zAeRD|0389E1kI+-UVjVHZsj6?spXj^gV)SbAP?pkd=RwPG>IfHv+NQBjn%2i6ppi6 zt-Y@y$)mckO<}LNwsd`<)ZF8QNnnyXH4R<2Ef!fO*ehxRUDYGLmG7YMj&UJ<4hkZV z0^bURFaim^z#NvoL#?l_W0yWC4!{3lBIBJLOnxYs(8sFvQfnz}HG2Eb zj91f;IsVfAD=$BH>deX8{qEZ4ylfJu83k?a`|5K{JAJ7>Ke#p-$~MrG8+sU)$c^yWbJO8XW3ff>CO- zs2%aaWR@kpBm=Rd@1MW(o$n+U9-4pb$tRzje}C-$`|oG&{A=^Ck^HN7e)-;ezx?>a zr%yk8^)4^l&yFDS0!1XVft(Fy)&X>MQo9PS>@I9` zlYb=Li89|K<*a~Th;as!4GM~8I*Uf=qu^`lhzFI{&q#X}>von^WRO_0u)i1h~tBw?ks z!BU&1kap|q-)!3gzk+$1+;Yo9YfWlXC)?|`E(Wv787B`$lKaANv?Kb6CTexX4^g9LE)h&EY-M(t_U;#f6h-HNr zGtDq0bwK%jf&YubKxV@k=$D1|*?*=0j-ck@bL!=3 z9LKkva$KhCrh>%uEW9*?Vbe6@3h*`jA}!qqCG&an16%4<)U2E z!L0c87`pH<@Lw+*UUB@|6R*C;^Yi@fGtYU>>AQ1od8cC^rgEb6@BhWF1$~rj1MPrz zwRSRRDZ;=+nJ4b$Z*m}>C12qu9I%zmlOzZ0R2t+JIG~*DA*Fy z8rI2Vyv@>tbq6Y#y`#o-jD8Cc+(op1I)Mvk$_c4_tSAx%C|6FdB!#&grx{SASSl+5 z73$*r-c6h+3{ZcA7WD+KgbofVA_a&5k`>~EhZkXGD42E7`;nnPB!3a@dz#{;O{V%LpX=jBF#G3BAT%ztuR*P;fK0hhW-S%;ejKq5jdK}ikJH7DHVwJCZ%0rC7WHR(`1R_dV(p~prop;~t*Q=)NmzPS0^uxoh0Dqkgw{WTDIi3$1*|iOf zsCv3fU|M384UTab;lP}uCWrc0uv>f^&?9+A(HAC^;|S{Ru$W1C;0OmW*#;DN56~b+ z=!YuhN?bCfY{gMkvMtkfLzg)RJa-T_xSpl?y4*G$CvqIK3HpvP7FqyHb-GxsxXj=dn@sM8)8i+iStueY2B&ozXzYM*`qvW|-KWpqfp(I%;MUn&b*p zy*aM}yylEjkI8Bjw>;aAp`~~7{k0^eyb%su?>r;ifPcXku3=#a3w|c15CRO*xqudx zH9dn%=xE1rKsv4M?P^29JOG~j%v+0mrFmuV0)L=vqO)u#t!hQx*&2+gn{{tI(G4v?; zNCf?7`_%C>yJW52{mL~r_wCSR6iVtiJ27lvF@G5A6lP|q8}i40#I}Xo31A8kA(R8% zbV51*x7lFjNQ-9idm3?>b`Gu%egp{>rjeLDi(Q8sxolW^#fQo2RK7$!u+KKk6_)~q z0l30#9Nm8w7R*V<&HD~~0!PWob0Xj}vRBKNEZ}!mXi0%#eW!6`v%K8$4Pa7Tqn%Y_ z3V)(z!~CgKp!SXRrK#l_esnU5YhD>BpCyxbvVE2I{%)h2MwEt0uhCs^l~-WiKs|g8 z>H#X^20Wl%LV^D6;##%|a#7dzq1PcBAwdQ!PXM=IPESFLM}T`~gV-aTb@X|H@ga|Y z_{JC8Hypd-IhSveA_7OX>WB z@BYkt&aM9Jsq0Ri*tdG(-m5m6ixSPz9wxpWFy^v$M!O3Urt*p}LI;KCXV(56i=w>a zV5D~Gej*l5Ya(cAr#j0?P$fT^0$yZHgH6_e)34b%1 z^Bc2XDW>EzY5%zgbY>f&S?6d=r2Iqiz6NlF{SKprNjQ zCOiYme{dG`QRMrQ6Mc0bC=iEB?gXq{aw+sKcc2>J=WU-E;sbg2-U9O@HKwKEY&S zxfVz{*S#Qas_>s9LuoQUi?d1+M7jAG0_IlQhB<*H|u+Gk*qS6{$jkGD!#1 z5$1{QrZo(<$(}cMlnt9iT|-|fTr;rO?Jhc2e2Y=tebsM6pQWwN*0Yb;=q3bQVoCPV zk2>;tDmW(F3ESClEJK=(XG|>Jb02{Q=jWbt)mhTAa`Qq7s2F3eX^DIzw_`_dliyBm zNWWU=fcZl(hi+7UC4cl`duJ3h`-g?am=Q#lZ@Ci(6s_q5V)dA3z~M+rY3%t5>DSp+ zz}suUU00xIG?@K972U~UG6Dmn-1l7&bj;)H4kUg<5W7mIYX+F(D?I!J~i@ZW4oEQcLjYJ0+{Oc;~DhDu03rFMuoSFxKQx$R7 z;Vc8Hg`Wq;vjeE6W2D;3+^T#)9Pn(4{Bz;`QC~m?03M5lqaAH8y$fcB&O1Pz^$OA5 zifuTo2~-kn)_;9RF%J#KiqUr20VxN7gI-ykU3;uK%%fhlorVB$of0TNW`Z{B#1#ZC z40D*8Hq2fCMaP@Eyjd>;UP;`D0!WHP;P@W21b|(g3YaE3p=F{=o!#~@2n!>jWCmDK zYFU6fq4x9>!N0VLXnv$@8!p;#BLK1}4BM+`-UZW?V1MO=kOo0BXBf^pHPhp@(9)%C z2PNAOdwIg2*BaVHyG%O<{a!e4yUM_fH*vl|zhky9W?oKMcY@jpNd0Kx=1pK+W<5}u zqXgswKgr{OCZ{*7zMOf7pc~#5^+Fn8Tex)N6hPE7iS6*gdzf@I=@gRoUuwH`4!dl08ny zNw%2lkApsMX(Me4tyrhs{vt)aTN+Jw=pt5?lt!iT091CO+~T9@aI&qEufUqqU*VO0 zI%srC^^9F$Znf?mU-G-AYo2GlTST=2!+#4!C4Xu}a(?H93v?8>B1}UU=F{^hF)uL@ zNZ04@B{$^ef71{33|kUrb}Y9YJ@e2DFI>tO+RvEsb!k22>5}O7$>@XgryhBPY(4U~ zXV3on*|YyAXe@93k8j5RcIU@8>Hnq)n7!ZYlO0U5?>_#vw>?h2{fP%2_ymm}yZYkA ztA8J3kDa@C@!VsJF;40K4t=w%9n{XDy_=ws5{e8jY*N-K!ge@|b}%D$IuqFpK(CMm zQ!bL{3KJ)RL91LgWeW>WJ^i%MtHBO4r!Skl=n7Eb<$BZu{T@W7rSno?PQ=09bbEb# z4=*JRAa&NXXS;KwX^5umtu+OUtQWn))PEfjvD1g{y~(5RbHPkmJ1imD>PszO)XPE6 z{K&FPzHZ&uTt3l0bNZM4N@AK|B>FS|g1KTEHKW&E6QMlo>5dr%ZgRW18zb@PH$hT1 zw9B(HFSj|YM9YCBwm_-ff7*JPG*HBqXuGgIupb)KrK}#&( zO#<)t0KqsGVXK@_PQUrgKRg6%bHhge%yF2^Ebgzx*@X=FAEg|=+{=j%IEz0GoRG0& z=iSJ6O~;J@APBmZg9gAO{k9WmIa@cVzAM zM!P-#ee&h`7Wwd<$KP@{8P2abOztC}ZNZ6+)^E)(lKYeS2k*Q3p$Ewa=8uuuu3vPM z?E_gGYFBF4C_RpvWVHaLb@DyIIMgZq3F$0SUR1gfI>2Tf6{woP_XK(xpnuaUNk)^w zZf)6qzQ6r~gYEk8#;dMRg|#}n=HUA9$DeyN!rbclQzwrcK7QiJ&Xp%#-Cd$r9^M8- zs?h0$ylGld?eSZ(Mr*CnqQR9X4jlDNbL+~NG^645hp%qM+&XvkCJg;ZbN`7i09CZniSjFd^xBg^3&_5GCrFVwk>e_2h%|AqXomc<-Pk){uYmwR6)VB_v zeD!hihQ(EvojB56=%jUa5O~JV;F#emhDETih}4+PagMR?rs_SmpSfak6Q!B4K z$1Dy!TuP?L(5}50c+6g-ZE3%xJ+1wBvXA^Yc`x~6@-+E0`48kXIA0HR)ry>0WkeO} zc+mM&^!HM4m5UM$+U_!p>0nIuNCi-hj>@nS87{0)skb8);{}W~DhlDy3?{?uK)QGW zS_(|cLj8xs3x5-qZs2+%8BaJmH*xhxchsPnS~)gT6tmEv(^;}B3K)=Ase>RQQQQ@P zIrm5^icmphcfIQfzWaO8dRC+k7BxVHf}uFPyUL-)MyN0~HUJuh3=N)j01O&FRH)1P z$_tCaIV*BkMqPyf_WEMC8-~-Ny3ugTbObFj%jhveOiY!a z#UnknJe?3ae-M~c$m?ax)+NiM6rE+t?U=VhP+HxiE2(4nCClg-%^(0Hg9!?@4KpWq zqpr~kfq$#Zu5kt2zh*>DqvPWu6fhE|)AFO{3Nl1E=vsRHP$v*Ixm|0wsY3t+3k+>L zDP~NDmQjG7H_Q_&o> zBTOX$*epF;asxxzFl~pz@l2qmKobvAhE7ghEPuNR{^(!@=A?Imo|^;b zwAI`Kvk2(dacf)MFfe&)rX23W7>t7ozIoW7MTAONGo8(^qJEJW&xtp7_)epj;v4=DZIeV1+I$(u4WrB z3NGV!(l4jkP9f-ON{kPuV)awa_6@C_MSj_p|? zoc7uRs_#qNixO!@zHlUP@uU)&kzn&CMt=zfLB|cI<#6B-CXomwbd`K7&BrK8l7(k6 z(ug@J0j{pGn8Z{IhDD(vaQYA~5df*g*1+#*w_ey*o#L&TF@>8(rWdDPY+(oBxj+VX zWG1rYd*s*VZ@=kV3%vVJ^rKn;8WHn<;$r>WOcA=tA`^V9R31(+S(qeTgo%?aUVr2o zl3T7_Y9I5LY%|JhUg=$7xms>CYTa9(^Q;NTWoRd9wH`Rj!;SvRsd_7q>4(1goNkNr zD@;G!H?*XY^fPDas^Ly_9GWYVj%^0fbTDjo4Q}q`N-(L-FhUrqpl*MxYITSt-692P zFZxrse?+RX+0}V;Dvi6nPJ(XY1b?v31e=8m&2S0DLZeTxp%_V4d9Ug=qi?j(*-p1c zxr_cyLIbbS@B;isqtwk`Dkn6UFm@YE+=%JBXIY#$`EU!yix@7TAm2{RZWNW|=K7&L z7mjZTH?;b2zzE`=9lDNh^E^LvzSHY&hz+xAMxFDMeCPsn@5O;3OHtnnU4Id5mf4~8 zO?5u8{Y$ur(0>B!mTP_JomfST$LqwSeD8Y)nE3bp_*#4G*j8J;k^ZIc4}H(!m$!Gn zweXAj-fC_AT^rw3sl6O+`dOx977IzD(FC+No6OL|LGoKS^4lNz_y^v5ZO+KU^H&4& zN`vpd<&C@brk`Xl(B7#1k$?85$S2Y5u7Z6@+$4oBb#F~0fV;^UFzW=f$cm&A^zF$a ziigF(G-4)v@o$WySQtgP*HDQwdZUWdXi>KHBKin+v=6r~tZ6hZa%Z71TC<4~kRtl7 z+`?+nq&nRn$cCzEu`IPoQ!r=)wT`=RUd{USq<-aegO%dvH*&q^T7S;b{q?vUrio$J zt=ul9Ou%gPxL%Dm%7D8f%jMxVC?764s8}AO=g!CUDHFJg%`Jyhf>tGRE#bvr3pnGZ zWid0gFytqw2TFy2rUqkG`7syc6P#Na^SB9W#wM7PgnoYmuH(AC+$dj$div0DAWTl9*3Hk07?iC3?ph#p{d!>ZMefdi?TmK6_Newj?UUNKRNiiaEAK_OfIPS$1`|am zQw-*UN>KO+=qiS}r;}m<#t86p;o6T!vqD`ISTP%9`bVluqrXSlKfjQHwiWhwF*!23YB(h6!#s((jd(CWSAN{w>o=a7h-W*$~c zgo5L$&FIXA12^XT4>VjjYME}%B;~+nN+(O{xs*9z zqf1VS>VF}$KCg(D&Z-;h3EU8qKbhk;blrkVY)PFOT;{dqxJRCky5Gzi2Vt66*liAL zgyo4}0XtzBX%iinXsQKEJY1y;gen*F7aoJg1qzxl08i)AW@@GHZRQ&-!W?vZ!VHzU z*ba{Q)!V8ds^|Ck?$-!NDQK)`ljo9~$t~nHeFqY+JMM$0q@_S>XOv`71Nm2T1ry^QYAE9jN<41FHG zfj*z!NPmRBkiM9{gx*f?q<7JK=ugp$^tJS->3#HP=o{&q=+Dy!=r7ZU=_B+}`fmCg z^nbVM2kB$6OFIgQI-+#)< z02|n!fo902sIO2ds2hR?;Ug%58;(GWJL3sS#{FzG=s>-OKEeBmj?B7bk^pBc>N-m0 z0L~>ot~!-tW3Ncuh9p zRI)=hCH#U9JiGS+rF>-kqru|9K&Vd|ADASw1FFDYX-dA0>#nF$mduPKRlYw$I-oGR zOgE%7brlP2FlNG;HA>vbl&3*$iMwDz_TQ)TCy|U?`lIw4z&GUl8>lBhi+>TolJiFd z>*|cWAE<#bpTGl7>d0SqFdBCptTZ_ZYDGUR!RR}<^@ItALRA1j}&ySrx&f)m+ zlZ-q@8y8=RPb1_QTLakP-Y|bZRO>OSH5O64X|@;2<16lzCGLvj$4aNve$Y7DhZ z5Vh#FjO@o{!t{~-H5KUMP1b?q{17Gv(i4oGL~^~&RYk~?Fd%Y% zHI=Td3-V%2z>#wPIe$!0rzC>GB4-{3^Txi&=N{VTLtN$d=*Kv@4Ttr8C=0m4Reut$ zfTHFTf{9PzFh4Bbf%aCW*d2NfY?Dl&f%A7ue9ru}Ef6>ZApGk<9!Sa_0mz9GM0?OP zzXUh?&#(9ioqi3Qpw~o=VMzQ*s_$Sz7Wp_6bhI;EDG6q)5P(gAWAT&l?KS9o`I8HdHfI%FRYgi8AqiZjmVbp$XY`Ht-1L$8cV6zyYD1vm z8!Vgu@y#D40Xb~;!&dIKcRAkM*;#Eru0NN1i*P#|1v#4zCdEqeg?kYQ5++>(KO^6D z;*J}Y0>km@7Bp~_o{GE?;KkrrZ{TDl!*h?=oMbmjj~%r9suPy8>z4PYQFQqg$&dZi zt>+o&P=9kLNoYAVT=T#+Rw!<{)-*4z%h^vqt)*H;YiO&=i?O>2#RxZ{Q2TitA``WM zNiAY(OQ3BFTOFZ!#rzU5*9je!+wF4DkQ>&lTidL`zhC^t4{U6#ZETRc<~QCpnUMDl zF55C|(fp@24_qLxi>u^`_C_lVx~sK~t&Q5oJAa>k|Hh}jaQp4_;PSWnTk{Xb)iY{y7s#MUl1=v(p-t7^Jj#iQUAkSY?#>eQdhV{JQ2zV=Vztp=kw1f1 ze2sA**S1@}X!&Mn1;NpkoQcNzXkd0tKX4M$GBKOcjglT%4dK~Qqh0NuJ2+|f;^lO< zd4E{PeW0w=1S9f{%Q%rv0(wX0z7YtAr@dT=PRD2(9;bF{8JvR6Fk8S(vTp911~)l# z`xVa&%uvRqbUU(LopV{eG)@xc$&xnE4rwQ~mm%{4Bm^)9_YqPstXnGfu~2yKE@OqlLk{&IQc+gq4AtSw*r-T8-CR_GhQ zySDPo=U)Bl_r7=SGs8Py4gbA&?SE?Re|l!Bb(A0J2S1bl@JD|B+H>z?r1Ss%#6q9^ zIsLraH%2NizK{c!MT2RvC7O&tFZJEH{oGFCt=)9jO)F-Sua_fp9EEf7oSAYQLcUAu{}4X>V;D!1B1OLZorJ8$_7lW`7-O7p!7| z&1kl_nkw5}23jmNQDL(NZu6l+tr)hz^(ZQUgB&G|7cR(R`GI2VLv%c4yOVk}oUD^c zZ-(0o70VcuqfumP*A10MGezp(9ZixkD5xp2d3bczAB?+7q4vds?-$PnLL*e5cXt6M zdI#8kU9Xxd-Fu!mUEJI+Fn6A(UYyjKQ(36GRY@qY~QFx9{t(xPSU{NEJ@?u9dN=5EgTdrexR(~i#hde{xm%Dia zco!g-yDXgtB|!kmsqS+4Pf$!@7r>(lwMAfnngd!d0~4T)pVx|PIRqOPw#TI=4=n@$ zCanV=f`>U#z(i`wvIV`Q69v-H<$;^ENrT_WswGndQn!dnBdG2ni(=^1X6U~X$|;Wv zpBZ)Z2~=7-qE(gz1Aj2h2zs5^%t#F^DqRbD67V`R{cv~Q#UQKawHIrz)Lw`CyF|NT zJ>_mv0sKPM1Ia7$p4GC`q}bSPZ*h2G6Fh=JUgbLN7XdUCNK;ul9d)<|$7cP3lI(2? za)r8;Z+1t@%~Wg%G>d>$p}%!pZh&nRn;XSn9X#_ zO1w7zBq7y`>4Nwex|=)%z{|vhYlMa{+N9<>5}x8jIz8RDS8cXh@2tcLGi7K7Ze9;N zUAAuoNKJqScYj1`b99Fy$g{1K;pPRn?Sj6%QZL&e$f5H!XXr+D`7p=^!Lh|S5Wm?? zL?jrPJEuxc)$$0Jff?KhOx@YdGm62ky%xq!>vfA*>IRwYCNrWVd7$=jR4Ktlt}sma z-CgZ=wM+v>Z_-tvW(-|`az!WeZd_L#7YW=EXZ^UZsO&yESAYO`F?ZN(3_^AwP&B&3S?|6#r(Uj6?GJr{? zTNItj0p&2Q?G2l`BID7KDol;g1sm!(poZSkvdX>aaXq5KGh**kYC{>`e(}L2E(8oN z?x&?km49rlTrz!88<&^M4c`nhzcM{s54T3n9dR}2+?UdRvYtk+O*qiil z%Af@(jdwwo$W(e2_U2+YlVZ;V`Q z>TUO6-e041`O|!Wn`8*)mcuZhdL~0r$tY`9mRCR>m`xYZ6g0*+J&X6}|LP=_JZ}hI zV#ImoGs65jXY@{slNC@f`o_}o!ILX~noF9a#?dXi~1%-0G3(0yIKw} zoD{n$_cS2#J_C&eUSFE*_o^rfPY+ zQdD?lip#`in1YnW>1ayc#w%$gObb+kC4WE$aY|+w$}K@R7*w~=BkVRW)A^uOcJiI| zi3^AJH@!frB|I<^p#6_5bLqQEyJT42jK`~KyhO~@QXAPh$ zm6Cl^8w3Rv!~rHY*~uBkVu0G3dgvOKNljsq`&yL8nzPyH3eCV>?_%h9~lt?}!9+ml5@w2*f!a4eo%!3>n6TBaGGS2D_UZCRD{- z>@E6(_D4~BKJ31-#a<7+#c$j-g#=&yDsg|GdTRd3&wS?IM;`fuKOpCBxn+JU931ZK zko*u?IZSpAJ#~2d&>=wGhn_fuk1BxJCjFXrMtiw-k9ME-7LdYsf*gKZdj`zFI{6WD z5BWv%Zt}b2ljINSCOt>b)0fh_=xgX3=mYd&`YZHN`s?)H(D%{bK&G(RwP}Ei66Aji zx1a!V#D#=tC^7qEVK6aNv)COqn-)7Q#G?bqG%!YosZ{Bp*g{xMg2^HRjNxRp4-^LQ zc5~onyI;VD0^2}Q%@!*mr+qm*LU7N)Y*9{PY?)zR&uo+kl@6WacBvT7QTwI>zZ+%? zeP86p@A0_7?hnjkSy%?N&T9R`09AjEr$U{+UL?h+%hbvxT+_5jJ5o?K<%_&Ag%%Mp zz^m{^fEEMfAXM@grWvah!XsRLRjgq_x~10Bs`Rs7hDa9hX;)6w)+b|JjiXY}SlTR} zk7^V8Iue+q23_14fNC6}bGR?3xYoiW(PlD9NL*}?w@PrsBHG8@X9op0&pLmLJm zM-fTQ(qhZlq}TuhTB)+3p}SS*P8Zs1k2YtRHKdMp#@Rr|ic)Wo-Bh4Nu}rnIRUtrN zF&9atshI73lY5)f7GEa)sqBnr2jF)sV=Om<7Kt7@lf`f%WB3^Nvdv`BIWX#G^rOO# z(>n9@N^E-oE-EtwemX9{pk9B*gz_2s5l^@)ZOhbIrztQ-Bw?DP>z986a8m+S(&MPA zfQ54gYThuY#LXl)djhwT)7g9ALx383NH^e<($ASN&tcBLAC6N?|2n9)sE1iUEE2f4 ztOr1PGJ6k@;Z&sa0R*AiCkRG!ch523ouoX*`C97N7QW4 zsUe2zjHUsk0IZLtq?PJoC+=@?{$G$I54`cGE}kBDlE&6bXO2)r4-6=(lEG8R`Y&hi=jkh9%Is#QxA5=;)4X9sp53269ynB2(4@ z9T|@B%e7KFgQ^lMw0f2i;IfOsU?r*r!Uj{ziD_FP<6`CjoihU;+6LAPo?&}o$(z*b zAS%!uz}$e;Qu!84bI)5VNuaYvh8x7_`(N-*V3)n<P@1y&s}pl#?%kbbTyX;B=8C zhAn)|f8c*K5_U;KHSChh9)n?oq0mn*J|p}@)q!i0sh+E?#VK2(nDq8B^ke7BQ+-=R zN*fC-sIdpMPvjX-N-Ub+gd z&i33CYQg^Qeggxrp(-{xR{U0J?QW+|)V4^)u4lV8a)wE0)5U%S*>Fm}zSAC zez5uxKuhFy$!pEv@VFA%(8){f^gb^Re9QLk+AfL$aV?6{+kRM4st?**R==5VuWTAD zz^#89m%FCRELXU;X}fo}m)IvPKL|bQ|IMI%(EJ~Z0>JmUDtcGzQc>tGSNXl3q5oB_ zhd!uXrCqPx0zLN{?ac}w{igP@VpZ1nZCF_+?Sf7gP$kW9p%pGe1!FmbUg-~t@6a=o z1bREk0P+m6|0ZhpG9guFlyVP^2a|qx&`p2wIBtlLHqom(9ZXa<6~)Nig5bvt0O z6QS-rTRZ{qhH{VL!rWv6I0l{uPZ~|fgAx62wb5j9WUyH^J-b>8EkPI>6Di#4wf!R% zP$|!R8B+jMY`UzoE066E+T@VL%@N2DS$Jx}oH$1@L=M~A^lAM_E}F-w1L zz6!`6RCxa~{V1W{yuOSdPr+;ya9GG=-XC}~4PzZ{vht!A1A zxlitMA{fsIa6sFujlM%WT;>Gf`&#X~?^M38u2WE$K6KqYe!eE0N8kqa68gl?3Ks6>BgZ%dzl3*O{k z!*N%X$y*pda%7ou+ba7qcWmyM{q5t9>*UFS1Z2};$J1T~6lq|`U?BQIV)8+AXvMBH zbHi;fwOzvn`6SdG)^vx~4_FL3q~hAPm&XA{M#{s~Ia$g|gP>%~higN|hE3u6W@%sG zhh`7VFvjUkbbC0*?r#@XT1|eQ~@LmZX0m ztpvcVndBy*2AfQbnjy>XziRMlNBgB$D^29#V^;j4W2RdlxjnbIK*t!aSpueBcJpxtE>X>6)A9Z0)_=7fXzQA-EN#a zang)I|#3K!6qp0|NU9rgNc9GneM8ttUTWFpYQ$u_usU7 zITm*&XJs@ur=M_MJO@xk$n7n2M39|bZmV%*^yJ^w7?N9Wp{AW6Ht>OK;#N;rJ8$o# z#VQG^l|F24l5S}&Z*6Ywj!E3kR6HR;+oa#ee*Oh6!s)S6XIY&k63K~hR5%V+g59;l zt)t6pWJ7;dJeF@`wIyC6-Y@=A{Db%xfXK_bT#*H0#>lUf$WtR#Mpl5qMhkgy*|4Rc z6SF$B7B5#b@-VrJ*|L}eF))BnR?fOaS_*ZZ#26M0vX<27cGu`3g1{Loifj=Ei7KPa zy6pXye|H!&tlJrLYF&)s8W-dK2wJbi*d`S!;eUUV{nR-rIA^yz>T(WD2_AX?CNZYN zNT(U2zRz%i5KSzXos!cbHhM~DeL5Nf^$7b#w7&jzNp-v7J2}_2@ZL4>Z-=kD5r!BUluiFU81TCx;>BWJ9HwJ&08-HK!y=9i)jj$!`c; zPN?v#rV8jpy9Nk$`i9}duf!%)|;wf0$Lb^H(u!(`)40yE)pd!$XjO+tuV}q;M95YykPe6R}NN!UW;b(<%+@#9mfGy4%;{;!8Z0 zXkq)c;Mg(182vsYV46^R%^)Mu?>9)L>7-Dz_qd20lg&^HSIE;B>C;&_J{Hn=&a0b~q{vZmMsj1NjaFx=y0$Sv)xisR|hOo|ABhAUO4gG$dWL{DXfKL5)D~ z8pzl}djw*rRFfKoZON43dO#K&VT7fGi^{734mbAL&-6@ORqXaTCRQ8pzv=1q)kLLE z>>rNkp)`@YR+!l{%E@)jBdxkF)F~3j0a2LQfQ1V3BT2oHSg!l`H5yN@X(D8@+LQ9p zO+;K1k;RHrpsre+&Yt=X- z^FA=mq-jDs@UU*>CVsTMZignQ*BtBsIJTRt>}8~qX}BX5gsHaeAS8b+Mbv8#yI`vi z+EoD15_^-6mmvZ!u#E|8SU2%akR~J&h+VL7V>~Caqj<@QFpid63saX&$q>6!LI&i5+ z0gUQ+ezd%a9M*c%TI_$150N{o(`7FW+(y-r;2-O7tLbJYh&Rq&Jafvd>O+e`eOjE~ z1iB1XI+R@7-CRAi<2Z*}M{fDi?WP-&@zxBElfN8<+v`MzZ#&$o+A@i|8Nj8!9M+rAT5uUzV8 zB#p+4?Xa013Y*@5@!l34fWoN@d8?X7k#g2*X>u8NbX-9o94VGI7M_RgsH}#;!$f0< zaBirLb|aggFv-;sTh8v<$TM+o@2B2>{k8ugN){J?^2V!v?sXkg`%*QlRmswseQb+P zI37jft5I$?lG=YYH>InqZ@%%u4d-4{uP$7Fg_X6d3we>$EbAcFM1F{D(xu9XGx1?U z9C+^g`x50#p6!>h!|TB|#dIRN{NZxBx)L{|Or16IgT$N>Sw!Kn+Xv(+pFP^$Ug)>1 z7&Wz`mL4>dISplB(0F1P1}QojW&OY28UQbKh!=GU0C;PDtthx zh?7U@`Ug~C*~T_lB{aYOfc8;qi{^@+{s7VyyqYGJ^0o)ygxkh)I8FQkY^r&#Pp8`Z zd*Hw$7*zIvVmboWCbn4R93Q(26dGMq&?CZn*|-VYo!KX`)8G&XM23Eiw*%PN2De|N&=!w2^guU#ypEQWabSm3R% zdx2b@eOU~=Ab4Bz;H%j+fhPvDFXLOB6U_dSuN#rH?g{71^hNOfuLs`457Qan>@1#I zY`5v9b0PJDQvv;WsTLGG4f@>+FUN%0N)wgC zVvm1N<$!A`23j1MLLjZ_ccQSoi`K_LKgtYBO(>BU$ z)w9{__>;Qe)!Qi<0AEC0Pp7v1$TiphwN8KaiN#H^#aFCXYbxqT&g^x<5}ihD(I+Kt z51N~G@@RUS^<#%?sb9aX-hSQzZ+}{y<2GN-tDD6>m@L=jY#ppv00@Ue7y&wwPZ({Y z%av&O&~eVYphM!h(^W@BZTQgEW@mKwaC^fgQ>@;0NcqRjt#h6${p4W)V5YT=^R9o9 zUi^-fUc_5;a?Oe5jp4CF(>NE+>_yYHcHTQZh&`pAb^I`bP3U?lvF|(WD28r_?fogJ2SD$Cv9nbJepg=3zuE!DQYNbKC%X-&U7TxBS?R zZre|^S+%TzyzWmmOm%=y^cJwAX4U_L_N!V6W!Z@RyP_h#TyF?#q9zw~;Qn z3mktr)+XCuq8e+43f^~)2b}LmLVZ-QfMCQUXq+Fw{|AwbXtd^tSeM0re^ij+9@c7J zI_>YYLJ_;Q$c-)X9o$AUDR!G%0n*K-H1*k2$zeyq(xd<6jF9xrmJg3=VXYdFrKut> zq>h9pGL!X_YlxeZfqD>iej9(sZ@lH@gEc>tGH|N4N7jyIR(DT6fA!|wJ}0-!G_B4) zzY<{?6&r!ditNsn!A+x^cVgojAExLQO`4{gU-!z_+YP^#7=M4fQngNW^m4@26#E<3 zKL|R*Mo2jhWa%itgfZ~u9L;1rCpTm*GWu_c-v{}L^~qrevDriH*fM|2Fc1-zmy6Zn zXMXbPe#7_OZf~pGI&{lUiYAUd>HN@3c=%R0<&6tX6N3 z|K>PLk=IyKo~IU&SRk#)^*m|f4HFOJgSm406GWk`-PD_ZqOVhgrHKwf5mZCu^ZZar8{fVo|5GljGOiSCijNRH>#yC$(4oa|Y+*bmH#S}jV+Of{#k868$`;og3Ve7#y2RGl2f zOAlZ9ydB$)mg|4cvcsiPb<9WcCX}Vs=Rhx~qV1q6#jHC5( zwCdOmYFD7hq!M=j%EO0s>SbP1quJBJ;B4HACr8yXITwN2KIS!I4>6&e*kvc*(;>%B zCw5{DZdU-}^$?3H1ACFC-f!0Qvi6!*V(aCQY`%lIv>$&_*I%w}Bl4`@GuagHt0L=* zw_Um<{`AtN@1MMM>0d8hl9yij=Xc{*Tu(0_q2J3o`Ni@nqAa)4shq9+1oYCd*Ecz0 zwaLsF1Hb@<9s6A~EZOb2NXvsOg1&}sV*CSMKFmUtEZoHd*noWZZrJOxE2~&6q3BCL7rJk z_S~meSDy*i^Y_L_x82vpk(TEMiWn+LE+(qj@a{<>TU~X`_2T3%@xJvlXH=)RzWyaE zh|k`WthgivXMcRF^pfPhB=O`qFYp%b+W6weO-q0E*PJ=i=}GIgXO&U*M$Z}#wzh*xBjV!vF*E!7C(_UrcLbgn96OIPBn=|1)$IlXI+YJ7`s~Q& zaG@sCyA8SOl}oJ5o>VQe(&EY@*|EEo)0GQk$KFYL?G2UtD(|j*sPd`Gf3JM2^3TE+ z9WfDCix-NQik}eoi~lS>EPh9PQG8uIBmRF;8o4X4k{3De_YwI{`Cj?k@=5te@~`CA zmlpo)^AzAYkk`Kg7viZH`X_7-#%)ew{L&3 zZ?k{Ney{y;`?u^rvcGJ9)&5)i8}_#~xiorBAJQB88hwNQF@1-ArM_RkT|cfrsz0tj zt^Z8_Fa0f}NQFga#cY~wGcXf#!MxDC+PvP}Z{BJiGLM*#n9rI&F<&=-WB#xCp0num zoWsru=W6F#=O*V)=M~NyoO_)Io%eq@A8>xddBXXO^CjocoxgIPah`Sl!TBfWyUxG4 zwi~#MB$AG~r`+q@3+{{Dm$|QU?{VMgzQuj3`*!zH_kHfi+^5|C=6==vTlbspKf3?N z{hnt5S?ajh?T!t$#j|e5?9Quc7Y1npjoi$oFC9TiS74Wc?8x*jqkH?~X`g>%hVc=* zW!-6mghxSl%!x(!P!*(a>chqq_vjn0LplZ0U<_aiGM)iKZ%UY_NEY2aIY3)->;QJS zyb!L*OVvEaX3B_<4qMvEyPof+UsqQS(bg@Lz_&+pgo)XB6qxDah4 zrYz_v(uML2A-&y6A7$hwW@j|Sz!*;6X!IwI(y^wYLskVW6FR$J%qxjZ3chAMA3f@# z95!?vq1Xsf&H9Kf?2`&C??TT6-2XHmO{rU0iHRkG6US4wo9AUXa4LVGyQooE%9@O) zbbN(PpKgJ5oQx6KPT~iH&94X(-`SmF%LaEuFyM3qb0}*VU{#P5;`lhu7e~d}aar~c zbW%56fIr}x$+SPnOm{eixlg}+Z2qH?=%~m?#n9BL9izOU?qHRELeDEvD3Gd8*YBL9 zqg`Dfj&c`Ykr#lfjs<`2l>yInI+{}R>9>JdBLarYuk#Ese$=ep>9B4<++3Z5F3P(A zft?KT&v=rjJ#kr^=n z@kQ7=@05d$g@w|iq3fqZfXY+zhIwHixQjmKI0tPm3*2i;O`m@bsgM2Lx*3nU!;B`B z8a4rg;ko@C(gIWB%Px%^=9GHK^NQd~RD+ll!)!=BH+>YP0GrflsK^)W(@2lV`Yjjh zhNamArsh&~Sn})?8r0LLA>y9yj%dEHd&9Gl@r7BJ3%@euOu0-%zd%guDzy@8sJy=k zip(?6QJ;ok%2R(tm-bBoa}M1+A%^sfoQA%ijru%M7-K|RV{eAod_3anG1RMah=~-Y z*=`>kP7SKlWRh!`b#xyCLpI-3Pa5P0ku=KY(=;ijCCWKW#S)CLU+ng|5GhxtMXYMh z%eb63MSj5wW)5V51zrx>JW6j^GU6eiK7o?~+>a8jG_QZ0SIcBN1qSZ4C9^Wf7JPuz z2+ie63*9ZoIcaMys5a??SG!jT#{B`a(VaV}qMd_8R*^QC*RjbpDZ9_bj=2T^iGXqA zlqdjrKvRgBqr0N=aqW*3ml{T&)y>T912bvn{v3eQSYJfHAg(MD=- z87ed$G^WE+>UFYw1o8qO;G{kxh#EAfye|ybU`Y3`=MVuj1yCWlA=*-s$}Ta$2pR^k zh`ThuvBazuJjS~;1ZV*8D@h1XF$Y|Hh#EiLrH6lx>DDxB0}@3V%)(#J4JP4)M^@WgFccF?T-NaFqu*txNmi|l;fcxENGTV z?~Z>E3soQ=E8oe7omK3R(su)cOk*Zu(_wkt?IYob1jAG}CYbpto0r`_ktR6EOi>At z<|pq0DrEruO0t5U(Va9j4a*3WN*afCOF1kgJZOS*%r(i_I>wU31EAYhq2r2t2vs;W z#2^`f8X+bS{Y(msrlLN~&4}h47$%UnIg5W-dOC@gI!-L6{RVZR(*-=sWDLfGtT7s7 zM>iagsQbC;l8~p~LI_L?2s(x@<+pxL`j?E9!BF>s`G^Mr6l^di`ht4v0(S+PW_Lm~ zqPNSCKVpL}DN~v-B9JmDemI!o9@LqF?U~%5oz%=O5&QHwxg>Ik!ODja8JJQg8sdM- z3{cuc)%Co?v^w13B3Y=9H7LW(8$*ardMfj9e@Mhfa$?t@>N&U(-9Z5m5CL#KskMkD z7!zp#0gUJtgq`XBV2JjRRfjB!-2ubSnX$Z2NXK8RMWMplPZ%L=+qU$&(n%tc#FDNC zSdbD3UufCBW!o1K`1=Y(AG?khSP?cc zg+rJ5*n*Xgs~JbZ)qqk!kfim#1V%x$390l@@A}Ol$q!2g?bc*Fma=?TtVVWdr`Y>uCGE(S5#8iJf@L>>I z3`boUBW1?>whX5L5Jo$9=sAuhRsi=Pcumhm;vmp7c+Z!5X=SpkWP~_naTg-6$zrrD zV;dh$x7_O#SKMZg$t|Jd6^5h1nS=C|R|1jrg{+r&97qhj5~tAz-;~kIijiKligp-H zLf94`#TK+K+lIS%p5p!I@(h2C;ZyT3)g03V_u*&($sa8#evhxW`D=^Y@;)IR7oTJ_ zNIb;sBTpzR5#sH1s+H7?6I{WejQqp*`mETH>OJ)5ix8PiGtU4O%J!+dfI*oE(WufF z+`&4UW?3&5;&Vd0M@YJkLnF8V5IRFo{VWTGr+tZWIyw5D>0La* zqa;DSN|fV_?Q~2N@@h36^r#RImE8sv@jaRHsat30kCT#jYHe=5vemn#+@Cy#m48D#W>LVUskf+$WD3^RYYWSC=}oc?yT{0$5^ z8vSMQO)mFLcUfo3#=L<>KZPC|MnsWMa_8u%MML=uC@+9MTaH!s0T*F%cZIkF5~BP5 zJbhf4^NU5D;t>ZKGvJVAYxzms&$v9lLK4ZCOJ7 z%o#-(`9>1v%vyia!y>zj&M1fgaY>Y5Ghz=1FcMP!9nt-r@i65fobZ>+c?N$Wtn>9k)VR^qB=I?=El)*& zMN;}{5E~0WBQ`neM2HU^0N|*Xi89mW9q6nyKZmMpP%cj5VwNr1p9Eq(C@VcWmRBV15ZebdlhDZ=*c1xYg`L4RYdPD z#?%W^(kg!uP?$3%J6+)u9R|j8--qCrU!9YEwa1 zYdfQ_5Lnzn%1DSvCL&57Ty5I{rpB|?ib!ZKqlkYri@^wHDwPSR$nX?`%4I5`KS`l3 zGtMuWl~TJ(yQa+aQDq>JC1NE^iTez~j!5%cOAE+^B5g)zI&nyXUU-cpAYz~~af_51 zWUZ3W&_UA3aJvE`hz8X~I!l&=2&nV!O4Y5!)F|TU;RcZ?Q-ThHv<}(pXMvkAFIukj z=pKI-O9CUSD`pKG9M=6v1>givIaMpJxx}(`%Ie}mU^ykZn=p>7l<2hzb~VxjGEi}7 zka9#sOjHCyRxXc?4@pnM8_@W>bwSh^Av(%gGV2;u`$)>_CJ~Ys1C(1vL~;roW?Z5;`X9<5Ue)KgD@h=Zit9tiQP%dH-U@1Bq#>QlN)Fnf9ARX@EsAY)1q#IHXq~ma# zSs~e)#DR@GO0GBH_$W$c`6x{X;5_0J<7@3}sp5!+N;ud^0*|=1N@9d-3z2A`8%URq zR;z5AA#;TEqcRb~xgB9z!0rTx!@`4*s2sYQNl=7Ex|kO(vI9SmRSF~kUUsm|SUt_zi6j?%k{&`uu#-{qOP3mf8gRYDPBmVE9i)gOea=lEI8^kc2aR= zNoou>DNLymX);k6lVpYsPGK#^Go!Kh90V*?N~;>P>_`OGDg=R6@ks+kQ45zR!vXs{ z0FpP6F8v5pClnB{NMKZJ(l|7lkZYx%0E2@=WwC|sLk&2r-AUpC@|JEy5=yMq9luHw ze_UsS0IcL1RFQ!h$gT&On#Q-;o+rk!RoPy)ok4sI0ZGGQ=^A4R;K3j`tv!e2s0*(N zT#mA#B!`FtJ?L$}5yM&viCln7q5=}_wiT2AXY8e=Dp8Hiu7x2J#1d}l#Kquh)Yzo9 zC3G@a3c}hz*Pxh{qUj6(#3+b25Rr)Ve+3^E48Y}@`Iq+fzf24uss|U z2Ip~8>Uf^vsdRvDMSb^FKvp4fF2@lI0R|)~;#h2jveO|IBB{Ar7yE=ZM$l%lF47vH zrybJP4kNe_ebO_dn4}6u6q*tSZUB%RYPO98QwcdwJQ@fmaAL&Ipwa+QEmSzte^oX7 z1R8mpF-zb(8Q7aP`NP!m1xHZ#Igrq{JQ5LB1QQmBCb(9!)x;2wm@}KButA0F9-_1! z0MlSeL#YZrkxW}F5W31O^907z2H+-~-Bqy$7uA7DE=zl@w3PS#hy9P`3%uPqkRZtv zZ()8C^OT4kLyrkjoUZI!gwZ0Ce@NNvl)-!>4NTo5Ri#T062vEX1%Pi3m`@OxVm--d zla@GeC@_Cyax%gpJH0>rZyvjFNd9)kL0q5cR_Xt^o#iD`0!I@dZ3H=+U5;xgQG&|C z0P_ft>5xMm2Gfc7=Bv)%Emog%j1HW-b5+sV=>7D1@2u<9PpqX*5-gs4e_mQEPMzM^ zw$3%&R<%PG+?!^f7pJbc;u$}2P}D%B%PX7P%gf#NPE_~eg+?vX+IDKw-GzRzyw)49 z!9`B@Yw$g%hLz)$8@LkoFJS-e0Q4jl^MIYG1Ran_&?vzK4x+ja(&&aICIfx3pF@NJ z;85l{R(!dk%mpXQ(B1JVf5C;&aAaEors6ViK_(a1i+G8Y2$4#lYwNj_tb_^(tkNuX z7p0ff+EsvA$#ApS?iD|MI9e<=Z)^rhZNomQpFNn~s&D5`HvIRo2z+7)XE+$q{C9Sl8nzxwSDE(y7J?%a39)#B>!o;&xZ&wpM8_uv2hugLBD@1K1_{7B^> zX5)xDdO2oeUJq_8deu;_1!i45Ft1sf;kt?m_*ZO;K&xAQDC|f%&O)CyR2i-C1OGl;yh0W zn;pnqLd-k>D>$2rqbcbslt5rmX)ODmQhQ>AMbwV&)py6l#={bEk&zOyzB-wsN7J$Y z&sW@}=|CNcfBbK3qQ=UWznN||&#VS27&K9;Vs+bXEDQN8keZa3ePkKl9ElrOr;L=Y zP$d%!YE6v-JS2yD3RVul+|??|x49A-HbOQNh~v}Wdh!Wq@ZWjzcOlW}@AC5#<>x1b z{02$22QPT>u@V`I6t14d3=r=Dm3_=w%T?l4YU|BGe-rWQWdZbcz*3MidxuIG#rCeT z-LO@CW2Z@ske*MWOK#g%;UM3J=F|5IF*|;Y`nDp)atGj8beFYd&gEGy`13Z|J(W4m z&Jndz*{PhZJY0FS^6tv7RDQMcL7=W8#C20}0b7H)s?KXTm6fE_bchHWBCmNw&JX|g zMx3%Yed#QefGN;cq;Ibw*VH2`3zdz@kk#Q`x2n(~B{x{^c3dL2n&ra=wgVH{&RzoO z3pSX z89*7l8XOwl9cCT69!MUD9;6@KAv7fhB|s%wC3+>sCLAW3Com^!C!#0NDJCigD$XlZ zELtpRk}z5@gfSj6GBdn1PBfx7hBy*9zBvXth&kjsbUKufJc6#qU8w4YX6#~q_mVX~Eclj2c zhhbnCc+2c)b~cu?{~wGa2vn%iV2%ZjvBU{3;396oCESRca2Yq_7Tk*4a69h6owy5k z;~w0L`*1%Vz=L=Q591L$ipTIcp1_lM3Qyx1tne(J!+-O50ax%MUc$?G1+U^YypA{U zCf>r^cn9y|J-m+(a240^AwI&#_ynKgGklIO@Fl*&*Z2nC;yZkgAMhi7!q4~xzv4Ii zjz91x{=yo6L!yO(2BAZb0R|h4u$bWB5pW$5j5Mod2$qE8sg_wAU$?R)Tep5kQM7F5 zYQ=+$0e`Aea-_v+Scf58Rs*TA_4`$J|E8oD{~c9o!~0rUug0bFR(F|=ca8F{GrdqD z2*q6H7WzoHb4{JhHeJ#bA}N{5-Iem8(WRf_1=1$@c-~AKZpfOwi5Jh7HLGYs5@e^E zV)U^gw#KD-C%2|FHC+KfvFf}_%ig5**}f_1kbm2w-izK}Y5FL&rPIY&uKSo>s`_lh zVvuUI()HCKCp#Y`k7R8#Q1oLK1MRCJm2=ZOA4#7WYcr=P3*OpHvZuZ7qiv;lgxM=K37o!ezI~YUJ9h!bSw$Re_>C4uemg2OmT+b{?YN zkV+!tz6m)5N=-PVq2N4ICz4dDiN0_RRm|<71WrqqmbfcMQN^;@%WbMzNh=#B8P%|0 zO3ApMYaWV*RdH!*xbR4ahC?ishSQ6hsc&ef^5<)?aUG Date: Thu, 25 May 2017 22:57:35 +0200 Subject: [PATCH 1070/1164] [seti] add information_for_contributors --- extensions/theme-seti/build/update-icon-theme.js | 8 ++++++++ extensions/theme-seti/icons/vs-seti-icon-theme.json | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/extensions/theme-seti/build/update-icon-theme.js b/extensions/theme-seti/build/update-icon-theme.js index 7f44c3ac245..a2a2bbd840c 100644 --- a/extensions/theme-seti/build/update-icon-theme.js +++ b/extensions/theme-seti/build/update-icon-theme.js @@ -212,6 +212,14 @@ exports.update = function () { } var res = { + information_for_contributors: [ + 'This file has been generated from data in https://github.com/jesseweed/seti-ui:', + '- icon definitions: styles/_fonts/seti.less', + '- icon colors: styles/ui-variables.less', + '- file associations: styles/icons/mapping.less', + 'If you want to provide a fix or improvement, please create a pull request against the jesseweed/seti-ui repository.', + 'Once accepted there, we are happy to receive an update request.', + ], fonts: [{ id: "seti", src: [{ "path": "./seti.woff", "format": "woff" }], diff --git a/extensions/theme-seti/icons/vs-seti-icon-theme.json b/extensions/theme-seti/icons/vs-seti-icon-theme.json index b26e557e5d3..46e757af3f6 100644 --- a/extensions/theme-seti/icons/vs-seti-icon-theme.json +++ b/extensions/theme-seti/icons/vs-seti-icon-theme.json @@ -1,4 +1,12 @@ { + "information_for_contributors": [ + "This file has been generated from data in https://github.com/jesseweed/seti-ui:", + "- icon definitions: styles/_fonts/seti.less", + "- icon colors: styles/ui-variables.less", + "- file associations: styles/icons/mapping.less", + "If you want to provide a fix or improvement, please create a pull request against the jesseweed/seti-ui repository.", + "Once accepted there, we are happy to receive an update request." + ], "fonts": [ { "id": "seti", From acadd61cc39d97b30642cf05bc7d475dfbd35225 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Thu, 25 May 2017 14:32:00 -0700 Subject: [PATCH 1071/1164] Comments --- src/vs/editor/contrib/suggest/browser/suggestWidget.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index c27e0dbaa95..c5559659a7f 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -953,11 +953,14 @@ export class SuggestWidget implements IContentWidget, IDelegate if (hasClass(this.element, 'docs-side')) { if (this.details.element.offsetHeight > this.listElement.offsetHeight) { + + // Fix for #26416 + // Docs is bigger than list and widget is above cursor, apply margin-top so that list appears right above cursor if (hasClass(this.element, 'widget-above')) { - // Docs is bigger than list and widget is above cursor, apply margin-top so that list appears right above cursor this.listElement.style.marginTop = `${this.details.element.offsetHeight - this.listElement.offsetHeight}px`; } + // Fix for #26244 if (hasClass(this.element, 'list-right')) { addClass(this.listElement, 'empty-left-border'); removeClass(this.listElement, 'empty-right-border'); @@ -970,6 +973,7 @@ export class SuggestWidget implements IContentWidget, IDelegate removeClass(this.details.element, 'empty-right-border'); return; } else { + // Fix for #26244 if (hasClass(this.element, 'list-right')) { addClass(this.details.element, 'empty-right-border'); removeClass(this.details.element, 'empty-left-border'); @@ -983,6 +987,7 @@ export class SuggestWidget implements IContentWidget, IDelegate } } + // Reset margin-top that was set as Fix for #26416 this.listElement.style.marginTop = '0px'; } From 2b7cf864395e501b95f285e3a3449e204e07eb3d Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 25 May 2017 14:31:52 -0700 Subject: [PATCH 1072/1164] Extract merge-conflict colors as workbench colors (#27299) --- .../merge-conflict/src/mergeDecorator.ts | 28 ++++++++----------- src/vs/platform/theme/common/colorRegistry.ts | 18 ++++++++++++ 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/extensions/merge-conflict/src/mergeDecorator.ts b/extensions/merge-conflict/src/mergeDecorator.ts index f6d0135aad9..39888f727e6 100644 --- a/extensions/merge-conflict/src/mergeDecorator.ts +++ b/extensions/merge-conflict/src/mergeDecorator.ts @@ -13,9 +13,6 @@ export default class MergeDectorator implements vscode.Disposable { private decorationUsesWholeLine: boolean = true; // Useful for debugging, set to false to see exact match ranges - // TODO: Move to config? - private currentColorRgb = `32,200,94`; - private incomingColorRgb = `24,134,255`; private config: interfaces.IExtensionConfiguration; private tracker: interfaces.IDocumentMergeConflictTracker; @@ -69,21 +66,19 @@ export default class MergeDectorator implements vscode.Disposable { // Create decorators if (config.enableDecorations || config.enableEditorOverview) { this.decorations['current.content'] = vscode.window.createTextEditorDecorationType( - this.generateBlockRenderOptions(this.currentColorRgb, config) + this.generateBlockRenderOptions('merge.currentContentBackground', 'overviewRuler.currentContentForeground', config) ); this.decorations['incoming.content'] = vscode.window.createTextEditorDecorationType( - this.generateBlockRenderOptions(this.incomingColorRgb, config) + this.generateBlockRenderOptions('merge.incomingContentBackground', 'overviewRuler.incomingContentForeground', config) ); } if (config.enableDecorations) { this.decorations['current.header'] = vscode.window.createTextEditorDecorationType({ - // backgroundColor: 'rgba(255, 0, 0, 0.01)', - // border: '2px solid red', isWholeLine: this.decorationUsesWholeLine, - backgroundColor: `rgba(${this.currentColorRgb}, 1.0)`, - color: 'white', + backgroundColor: new vscode.ThemeColor('merge.currentHeaderBackground'), + color: new vscode.ThemeColor('editor.foreground'), after: { contentText: ' ' + localize('currentChange', '(Current change)'), color: 'rgba(0, 0, 0, 0.7)' @@ -91,14 +86,13 @@ export default class MergeDectorator implements vscode.Disposable { }); this.decorations['splitter'] = vscode.window.createTextEditorDecorationType({ - backgroundColor: 'rgba(0, 0, 0, 0.25)', - color: 'white', + color: new vscode.ThemeColor('editor.foreground'), isWholeLine: this.decorationUsesWholeLine, }); this.decorations['incoming.header'] = vscode.window.createTextEditorDecorationType({ - backgroundColor: `rgba(${this.incomingColorRgb}, 1.0)`, - color: 'white', + backgroundColor: new vscode.ThemeColor('merge.incomingHeaderBackground'), + color: new vscode.ThemeColor('editor.foreground'), isWholeLine: this.decorationUsesWholeLine, after: { contentText: ' ' + localize('incomingChange', '(Incoming change)'), @@ -118,17 +112,17 @@ export default class MergeDectorator implements vscode.Disposable { this.decorations = {}; } - private generateBlockRenderOptions(color: string, config: interfaces.IExtensionConfiguration): vscode.DecorationRenderOptions { + private generateBlockRenderOptions(backgroundColor: string, overviewRulerColor: string, config: interfaces.IExtensionConfiguration): vscode.DecorationRenderOptions { - let renderOptions: any = {}; + let renderOptions: vscode.DecorationRenderOptions = {}; if (config.enableDecorations) { - renderOptions.backgroundColor = `rgba(${color}, 0.2)`; + renderOptions.backgroundColor = new vscode.ThemeColor(backgroundColor); renderOptions.isWholeLine = this.decorationUsesWholeLine; } if (config.enableEditorOverview) { - renderOptions.overviewRulerColor = `rgba(${color}, 0.5)`; + renderOptions.overviewRulerColor = new vscode.ThemeColor(overviewRulerColor); renderOptions.overviewRulerLane = vscode.OverviewRulerLane.Full; } diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index bc3da9fed16..b908d663df3 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -254,6 +254,24 @@ export const diffRemoved = registerColor('diffEditor.removedTextBackground', { d export const diffInsertedOutline = registerColor('diffEditor.insertedTextBorder', { dark: null, light: null, hc: '#33ff2eff' }, nls.localize('diffEditorInsertedOutline', 'Outline color for the text that got inserted.')); export const diffRemovedOutline = registerColor('diffEditor.removedTextBorder', { dark: null, light: null, hc: '#FF008F' }, nls.localize('diffEditorRemovedOutline', 'Outline color for text that got removed.')); +/** + * Merge-conflict colors + */ + +const headerTransparency = 1; +const currentBaseColor = Color.fromHex('#20C85E').transparent(headerTransparency); +const incomingBaseColor = Color.fromHex('#1886FF').transparent(headerTransparency); +const contentTransparency = 0.2; +const rulerTransparency = 0.5; + +export const mergeCurrentHeaderBackground = registerColor('merge.currentHeaderBackground', { dark: currentBaseColor, light: currentBaseColor, hc: currentBaseColor }, nls.localize('mergeCurrentHeaderBackground', 'Current header background in inline merge-conflict.')); +export const mergeCurrentContentBackground = registerColor('merge.currentContentBackground', { dark: transparent(mergeCurrentHeaderBackground, contentTransparency), light: transparent(mergeCurrentHeaderBackground, contentTransparency), hc: transparent(mergeCurrentHeaderBackground, contentTransparency) }, nls.localize('mergeCurrentContentBackground', 'Current content background in inline merge-conflict.')); +export const mergeIncomingHeaderBackground = registerColor('merge.incomingHeaderBackground', { dark: incomingBaseColor, light: incomingBaseColor, hc: incomingBaseColor }, nls.localize('mergeIncomingHeaderBackground', 'Incoming header background in inline merge-conflict.')); +export const mergeIncomingContentBackground = registerColor('merge.incomingContentBackground', { dark: transparent(mergeIncomingHeaderBackground, contentTransparency), light: transparent(mergeIncomingHeaderBackground, contentTransparency), hc: transparent(mergeIncomingHeaderBackground, contentTransparency) }, nls.localize('mergeIncomingContentBackground', 'Incoming content background in inline merge-conflict.')); + +export const overviewRulerCurrentContentForeground = registerColor('overviewRuler.currentContentForeground', { dark: transparent(mergeCurrentHeaderBackground, rulerTransparency), light: transparent(mergeCurrentHeaderBackground, rulerTransparency), hc: transparent(mergeCurrentHeaderBackground, rulerTransparency) }, nls.localize('overviewRulerCurrentContentForeground', 'Current overview ruler foreground for inline merge-conflict.')); +export const overviewRulerIncomingContentForeground = registerColor('overviewRuler.incomingContentForeground', { dark: transparent(mergeIncomingHeaderBackground, rulerTransparency), light: transparent(mergeIncomingHeaderBackground, rulerTransparency), hc: transparent(mergeIncomingHeaderBackground, rulerTransparency) }, nls.localize('overviewRulerIncomingContentForeground', 'Incoming overview ruler foreground for inline merge-conflict.')); + // ----- color functions export function darken(colorValue: ColorValue, factor: number): ColorFunction { From 5860e3dcad744cde8156f55ad8726d862f9c5498 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 25 May 2017 14:40:05 -0700 Subject: [PATCH 1073/1164] Tune merge-conflict colors (#27299) --- src/vs/platform/theme/common/colorRegistry.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index b908d663df3..5f3a474f034 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -258,11 +258,11 @@ export const diffRemovedOutline = registerColor('diffEditor.removedTextBorder', * Merge-conflict colors */ -const headerTransparency = 1; -const currentBaseColor = Color.fromHex('#20C85E').transparent(headerTransparency); -const incomingBaseColor = Color.fromHex('#1886FF').transparent(headerTransparency); -const contentTransparency = 0.2; -const rulerTransparency = 0.5; +const headerTransparency = 0.5; +const currentBaseColor = Color.fromHex('#40C8AE').transparent(headerTransparency); +const incomingBaseColor = Color.fromHex('#40A6FF').transparent(headerTransparency); +const contentTransparency = 0.4; +const rulerTransparency = 1; export const mergeCurrentHeaderBackground = registerColor('merge.currentHeaderBackground', { dark: currentBaseColor, light: currentBaseColor, hc: currentBaseColor }, nls.localize('mergeCurrentHeaderBackground', 'Current header background in inline merge-conflict.')); export const mergeCurrentContentBackground = registerColor('merge.currentContentBackground', { dark: transparent(mergeCurrentHeaderBackground, contentTransparency), light: transparent(mergeCurrentHeaderBackground, contentTransparency), hc: transparent(mergeCurrentHeaderBackground, contentTransparency) }, nls.localize('mergeCurrentContentBackground', 'Current content background in inline merge-conflict.')); From 64d676ccf7d0062e18ca6bfa113bef8efbd6d58f Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 25 May 2017 15:18:05 -0700 Subject: [PATCH 1074/1164] Add TSC Task Provider (#27093) * extract standardLanguageDescriptions to constant * Remove client variable * Move VersionStatus into a class * Add TSC Task Provider Fixes #26079 Adds a task provider for building typescript projects. * Make ts loading lazy --- extensions/typescript/package.json | 5 +- .../src/features/jsDocCompletionProvider.ts | 6 +- .../typescript/src/features/taskProvider.ts | 110 ++++++++++++++++++ extensions/typescript/src/typescriptMain.ts | 109 +++++++++++------ .../typescript/src/typescriptServiceClient.ts | 10 +- .../typescript/src/utils/versionStatus.ts | 69 ++++++----- src/vs/workbench/api/node/extHostTask.ts | 2 +- 7 files changed, 235 insertions(+), 76 deletions(-) create mode 100644 extensions/typescript/src/features/taskProvider.ts diff --git a/extensions/typescript/package.json b/extensions/typescript/package.json index 461cb773a4d..b039fac9631 100644 --- a/extensions/typescript/package.json +++ b/extensions/typescript/package.json @@ -34,7 +34,10 @@ "onCommand:typescript.selectTypeScriptVersion", "onCommand:javascript.goToProjectConfig", "onCommand:typescript.goToProjectConfig", - "onCommand:typescript.openTsServerLog" + "onCommand:typescript.openTsServerLog", + "onCommand:workbench.action.tasks.runTask", + "onCommand:workbench.action.tasks.build", + "onCommand:workbench.action.tasks.test" ], "main": "./out/typescriptMain", "contributes": { diff --git a/extensions/typescript/src/features/jsDocCompletionProvider.ts b/extensions/typescript/src/features/jsDocCompletionProvider.ts index da02e942bfc..502cf89c42c 100644 --- a/extensions/typescript/src/features/jsDocCompletionProvider.ts +++ b/extensions/typescript/src/features/jsDocCompletionProvider.ts @@ -88,7 +88,7 @@ export class TryCompleteJsDocCommand { static COMMAND_NAME = '_typeScript.tryCompleteJsDoc'; constructor( - private client: ITypescriptServiceClient + private lazyClient: () => ITypescriptServiceClient ) { } /** @@ -96,7 +96,7 @@ export class TryCompleteJsDocCommand { * if possible, otherwise falling back to a default comment format. */ public tryCompleteJsDoc(resource: Uri, start: Position, shouldGetJSDocFromTSServer: boolean): Thenable { - const file = this.client.normalizePath(resource); + const file = this.lazyClient().normalizePath(resource); if (!file) { return Promise.resolve(false); } @@ -126,7 +126,7 @@ export class TryCompleteJsDocCommand { offset: position.character + 1 }; return Promise.race([ - this.client.execute('docCommentTemplate', args), + this.lazyClient().execute('docCommentTemplate', args), new Promise((_, reject) => setTimeout(reject, 250)) ]).then((res: DocCommandTemplateResponse) => { if (!res || !res.body) { diff --git a/extensions/typescript/src/features/taskProvider.ts b/extensions/typescript/src/features/taskProvider.ts new file mode 100644 index 00000000000..76528021983 --- /dev/null +++ b/extensions/typescript/src/features/taskProvider.ts @@ -0,0 +1,110 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import * as fs from 'fs'; +import * as path from 'path'; +import * as vscode from 'vscode'; + +import * as Proto from '../protocol'; +import TypeScriptServiceClient from '../typescriptServiceClient'; + + +const exists = (file: string): Promise => + new Promise((resolve, _reject) => { + fs.exists(file, (value: boolean) => { + resolve(value); + }); + }); + +export default class TypeScriptTaskProvider implements vscode.TaskProvider { + + public constructor( + private readonly lazyClient: () => TypeScriptServiceClient + ) { } + + async provideTasks(token: vscode.CancellationToken): Promise { + const rootPath = vscode.workspace.rootPath; + if (!rootPath) { + return []; + } + + const projects = (await this.getConfigForActiveFile(token)).concat(await this.getConfigsForWorkspace()); + const command = await this.getCommand(); + + return projects + .filter((x, i) => projects.indexOf(x) === i) + .map(configFile => { + const configFileName = path.relative(rootPath, configFile); + const buildTask = new vscode.ShellTask(`tsc: build ${configFileName}`, `${command} -p ${configFile}`, '$tsc'); + buildTask.group = vscode.TaskGroup.Build; + return buildTask; + }); + } + + + private async getConfigForActiveFile(token: vscode.CancellationToken): Promise { + const editor = vscode.window.activeTextEditor; + if (editor) { + if (path.basename(editor.document.fileName).match(/^tsconfig\.(.\.)?json$/)) { + return [editor.document.fileName]; + } + } + + const file = this.getActiveTypeScriptFile(); + if (!file) { + return []; + } + + const res: Proto.ProjectInfoResponse = await this.lazyClient().execute( + 'projectInfo', + { file, needFileNameList: false } as protocol.ProjectInfoRequestArgs, + token); + + if (!res || !res.body) { + return []; + } + + const { configFileName } = res.body; + if (configFileName && configFileName.indexOf('/dev/null/') !== 0) { + return [configFileName]; + } + return []; + } + + private async getConfigsForWorkspace(): Promise { + if (!vscode.workspace.rootPath) { + return []; + } + const rootTsConfig = path.join(vscode.workspace.rootPath, 'tsconfig.json'); + if (!await exists(rootTsConfig)) { + return []; + } + return [rootTsConfig]; + } + + private async getCommand(): Promise { + const platform = process.platform; + if (platform === 'win32' && await exists(path.join(vscode.workspace.rootPath!, 'node_modules', '.bin', 'tsc.cmd'))) { + return path.join('.', 'node_modules', '.bin', 'tsc.cmd'); + } else if ((platform === 'linux' || platform === 'darwin') && await exists(path.join(vscode.workspace.rootPath!, 'node_modules', '.bin', 'tsc'))) { + return path.join('.', 'node_modules', '.bin', 'tsc'); + } else { + return 'tsc'; + } + } + + private getActiveTypeScriptFile(): string | null { + const editor = vscode.window.activeTextEditor; + if (editor) { + const document = editor.document; + if (document && (document.languageId === 'typescript' || document.languageId === 'typescriptreact')) { + return this.lazyClient().normalizePath(document.uri); + } + } + return null; + } +} \ No newline at end of file diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index 9949d0db9d2..07a666936b9 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -41,13 +41,14 @@ import CodeActionProvider from './features/codeActionProvider'; import ReferenceCodeLensProvider from './features/referencesCodeLensProvider'; import { JsDocCompletionProvider, TryCompleteJsDocCommand } from './features/jsDocCompletionProvider'; import { DirectiveCommentCompletionProvider } from './features/directiveCommentCompletionProvider'; +import TypeScriptTaskProvider from './features/taskProvider'; import ImplementationCodeLensProvider from './features/implementationsCodeLensProvider'; import * as BuildStatus from './utils/buildStatus'; import * as ProjectStatus from './utils/projectStatus'; import TypingsStatus, { AtaProgressReporter } from './utils/typingsStatus'; -import * as VersionStatus from './utils/versionStatus'; +import VersionStatus from './utils/versionStatus'; import { getContributedTypeScriptServerPlugins, TypeScriptServerPlugin } from "./utils/plugins"; interface LanguageDescription { @@ -67,72 +68,100 @@ interface ProjectConfigMessageItem extends MessageItem { id: ProjectConfigAction; } +const MODE_ID_TS = 'typescript'; +const MODE_ID_TSX = 'typescriptreact'; +const MODE_ID_JS = 'javascript'; +const MODE_ID_JSX = 'javascriptreact'; + +const standardLanguageDescriptions: LanguageDescription[] = [ + { + id: 'typescript', + diagnosticSource: 'ts', + modeIds: [MODE_ID_TS, MODE_ID_TSX], + configFile: 'tsconfig.json' + }, { + id: 'javascript', + diagnosticSource: 'js', + modeIds: [MODE_ID_JS, MODE_ID_JSX], + configFile: 'jsconfig.json' + } +]; export function activate(context: ExtensionContext): void { - const MODE_ID_TS = 'typescript'; - const MODE_ID_TSX = 'typescriptreact'; - const MODE_ID_JS = 'javascript'; - const MODE_ID_JSX = 'javascriptreact'; - const plugins = getContributedTypeScriptServerPlugins(); - const clientHost = new TypeScriptServiceClientHost([ - { - id: 'typescript', - diagnosticSource: 'ts', - modeIds: [MODE_ID_TS, MODE_ID_TSX], - configFile: 'tsconfig.json' - }, - { - id: 'javascript', - diagnosticSource: 'js', - modeIds: [MODE_ID_JS, MODE_ID_JSX], - configFile: 'jsconfig.json' - } - ], context.storagePath, context.globalState, context.workspaceState, plugins); - context.subscriptions.push(clientHost); - const client = clientHost.serviceClient; + const lazyClientHost = (() => { + let clientHost: TypeScriptServiceClientHost | undefined; + return () => { + if (!clientHost) { + clientHost = new TypeScriptServiceClientHost(standardLanguageDescriptions, context.storagePath, context.globalState, context.workspaceState, plugins); + context.subscriptions.push(clientHost); + + const host = clientHost; + clientHost.serviceClient.onReady().then(() => { + context.subscriptions.push(ProjectStatus.create(host.serviceClient, + path => new Promise(resolve => setTimeout(() => resolve(host.handles(path)), 750)), + context.workspaceState)); + }, () => { + // Nothing to do here. The client did show a message; + }); + } + return clientHost; + }; + })(); + context.subscriptions.push(commands.registerCommand('typescript.reloadProjects', () => { - clientHost.reloadProjects(); + lazyClientHost().reloadProjects(); })); context.subscriptions.push(commands.registerCommand('javascript.reloadProjects', () => { - clientHost.reloadProjects(); + lazyClientHost().reloadProjects(); })); context.subscriptions.push(commands.registerCommand('typescript.selectTypeScriptVersion', () => { - client.onVersionStatusClicked(); + lazyClientHost().serviceClient.onVersionStatusClicked(); })); context.subscriptions.push(commands.registerCommand('typescript.openTsServerLog', () => { - client.openTsServerLogFile(); + lazyClientHost().serviceClient.openTsServerLogFile(); })); context.subscriptions.push(commands.registerCommand('typescript.restartTsServer', () => { - client.restartTsServer(); + lazyClientHost().serviceClient.restartTsServer(); })); + context.subscriptions.push(workspace.registerTaskProvider(new TypeScriptTaskProvider(() => lazyClientHost().serviceClient))); + const goToProjectConfig = (isTypeScript: boolean) => { const editor = window.activeTextEditor; if (editor) { - clientHost.goToProjectConfig(isTypeScript, editor.document.uri); + lazyClientHost().goToProjectConfig(isTypeScript, editor.document.uri); } }; context.subscriptions.push(commands.registerCommand('typescript.goToProjectConfig', goToProjectConfig.bind(null, true))); context.subscriptions.push(commands.registerCommand('javascript.goToProjectConfig', goToProjectConfig.bind(null, false))); - const jsDocCompletionCommand = new TryCompleteJsDocCommand(client); + const jsDocCompletionCommand = new TryCompleteJsDocCommand(() => lazyClientHost().serviceClient); context.subscriptions.push(commands.registerCommand(TryCompleteJsDocCommand.COMMAND_NAME, jsDocCompletionCommand.tryCompleteJsDoc, jsDocCompletionCommand)); - window.onDidChangeActiveTextEditor(VersionStatus.showHideStatus, null, context.subscriptions); - client.onReady().then(() => { - context.subscriptions.push(ProjectStatus.create(client, - path => new Promise(resolve => setTimeout(() => resolve(clientHost.handles(path)), 750)), - context.workspaceState)); - }, () => { - // Nothing to do here. The client did show a message; - }); + const supportedLanguage = [].concat.apply([], standardLanguageDescriptions.map(x => x.modeIds).concat(plugins.map(x => x.languages))); + function didOpenTextDocument(textDocument: TextDocument): boolean { + if (supportedLanguage.indexOf(textDocument.languageId) >= 0) { + openListener.dispose(); + // Force activation + void lazyClientHost(); + return true; + } + return false; + }; + const openListener = workspace.onDidOpenTextDocument(didOpenTextDocument); + for (let textDocument of workspace.textDocuments) { + if (didOpenTextDocument(textDocument)) { + break; + } + } + BuildStatus.update({ queueLength: 0 }); } @@ -423,6 +452,7 @@ class TypeScriptServiceClientHost implements ITypescriptServiceClientHost { private languages: LanguageProvider[] = []; private languagePerId: ObjectMap; private readonly disposables: Disposable[] = []; + private readonly versionStatus: VersionStatus; constructor( descriptions: LanguageDescription[], @@ -446,7 +476,10 @@ class TypeScriptServiceClientHost implements ITypescriptServiceClientHost { configFileWatcher.onDidDelete(handleProjectCreateOrDelete, this, this.disposables); configFileWatcher.onDidChange(handleProjectChange, this, this.disposables); - this.client = new TypeScriptServiceClient(this, storagePath, globalState, workspaceState, plugins, this.disposables); + this.versionStatus = new VersionStatus(); + this.disposables.push(this.versionStatus); + + this.client = new TypeScriptServiceClient(this, storagePath, globalState, workspaceState, this.versionStatus, plugins, this.disposables); this.languagePerId = Object.create(null); for (const description of descriptions) { const manager = new LanguageProvider(this.client, description); diff --git a/extensions/typescript/src/typescriptServiceClient.ts b/extensions/typescript/src/typescriptServiceClient.ts index cf2b7c3be6f..5e22350feb0 100644 --- a/extensions/typescript/src/typescriptServiceClient.ts +++ b/extensions/typescript/src/typescriptServiceClient.ts @@ -18,7 +18,7 @@ import { ITypescriptServiceClient, ITypescriptServiceClientHost, API } from './t import { TypeScriptServerPlugin } from './utils/plugins'; import Logger from './utils/logger'; -import * as VersionStatus from './utils/versionStatus'; +import VersionStatus from './utils/versionStatus'; import * as is from './utils/is'; import * as nls from 'vscode-nls'; @@ -141,7 +141,9 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient host: ITypescriptServiceClientHost, storagePath: string | undefined, globalState: Memento, - private workspaceState: Memento, + private readonly workspaceState: Memento, + private readonly versionStatus: VersionStatus, + private plugins: TypeScriptServerPlugin[], disposables: Disposable[] ) { @@ -404,8 +406,8 @@ export default class TypeScriptServiceClient implements ITypescriptServiceClient const label = version || localize('versionNumber.custom', 'custom'); const tooltip = modulePath; this.modulePath = modulePath; - VersionStatus.showHideStatus(); - VersionStatus.setInfo(label, tooltip); + this.versionStatus.showHideStatus(); + this.versionStatus.setInfo(label, tooltip); // This is backwards compatibility code to move the setting from the local // store into the workspace setting file. diff --git a/extensions/typescript/src/utils/versionStatus.ts b/extensions/typescript/src/utils/versionStatus.ts index e92b87d0f24..21f3a1c34f1 100644 --- a/extensions/typescript/src/utils/versionStatus.ts +++ b/extensions/typescript/src/utils/versionStatus.ts @@ -3,42 +3,53 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import vscode = require('vscode'); +import * as vscode from 'vscode'; -const versionBarEntry = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, Number.MIN_VALUE); -export function showHideStatus() { - if (!versionBarEntry) { - return; - } - if (!vscode.window.activeTextEditor) { - versionBarEntry.hide(); - return; +export default class VersionStatus extends vscode.Disposable { + onChangeEditorSub: any; + private versionBarEntry: vscode.StatusBarItem; + + constructor() { + super(() => this.dispose()); + + this.versionBarEntry = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, Number.MIN_VALUE); + + this.onChangeEditorSub = vscode.window.onDidChangeActiveTextEditor(this.showHideStatus, this); } - let doc = vscode.window.activeTextEditor.document; - if (vscode.languages.match('typescript', doc) || vscode.languages.match('typescriptreact', doc)) { - versionBarEntry.show(); - return; + dispose() { + this.versionBarEntry.dispose(); + this.onChangeEditorSub.dispose(); } - if (!vscode.window.activeTextEditor.viewColumn) { - // viewColumn is undefined for the debug/output panel, but we still want - // to show the version info - return; + showHideStatus() { + if (!this.versionBarEntry) { + return; + } + if (!vscode.window.activeTextEditor) { + this.versionBarEntry.hide(); + return; + } + + let doc = vscode.window.activeTextEditor.document; + if (vscode.languages.match('typescript', doc) || vscode.languages.match('typescriptreact', doc)) { + this.versionBarEntry.show(); + return; + } + + if (!vscode.window.activeTextEditor.viewColumn) { + // viewColumn is undefined for the debug/output panel, but we still want + // to show the version info + return; + } + + this.versionBarEntry.hide(); } - versionBarEntry.hide(); -} - -export function disposeStatus() { - if (versionBarEntry) { - versionBarEntry.dispose(); + public setInfo(message: string, tooltip: string) { + this.versionBarEntry.text = message; + this.versionBarEntry.tooltip = tooltip; + this.versionBarEntry.command = 'typescript.selectTypeScriptVersion'; } } - -export function setInfo(message: string, tooltip: string) { - versionBarEntry.text = message; - versionBarEntry.tooltip = tooltip; - versionBarEntry.command = 'typescript.selectTypeScriptVersion'; -} diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index 5f23efc8f80..aa6497bc410 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -163,7 +163,7 @@ namespace ProblemMatcher { if (values === void 0 || values === null) { return undefined; } - let result: (string | Problems.ProblemMatcher)[]; + let result: (string | Problems.ProblemMatcher)[] = []; for (let value of values) { let converted = typeof value === 'string' ? value : fromSingle(value); if (converted) { From 416861268af5c06b56a6ca880020097ab0bbc11b Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 26 May 2017 00:18:20 +0200 Subject: [PATCH 1075/1164] Decoration text after decoration wrongly positioned. Fixes #27288 --- src/vs/editor/browser/services/codeEditorServiceImpl.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/editor/browser/services/codeEditorServiceImpl.ts b/src/vs/editor/browser/services/codeEditorServiceImpl.ts index 26bc62e9e6a..d824627e4ec 100644 --- a/src/vs/editor/browser/services/codeEditorServiceImpl.ts +++ b/src/vs/editor/browser/services/codeEditorServiceImpl.ts @@ -151,7 +151,7 @@ class DecorationTypeOptionsProvider implements IModelDecorationOptionsProvider { this.className = createCSSRules(ModelDecorationCSSRuleType.ClassName); this.inlineClassName = createCSSRules(ModelDecorationCSSRuleType.InlineClassName); this.beforeContentClassName = createCSSRules(ModelDecorationCSSRuleType.BeforeContentClassName); - this.beforeContentClassName = createCSSRules(ModelDecorationCSSRuleType.AfterContentClassName); + this.afterContentClassName = createCSSRules(ModelDecorationCSSRuleType.AfterContentClassName); this.glyphMarginClassName = createCSSRules(ModelDecorationCSSRuleType.GlyphMarginClassName); let options = providerArgs.options; From 2db5b3a43cabdbcbcfba8cff6ee65273eb1998c6 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 24 May 2017 15:27:48 -0700 Subject: [PATCH 1076/1164] Move VersionStatus into a class --- extensions/typescript/src/typescriptMain.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index 07a666936b9..18bc57678ff 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -90,6 +90,7 @@ const standardLanguageDescriptions: LanguageDescription[] = [ export function activate(context: ExtensionContext): void { const plugins = getContributedTypeScriptServerPlugins(); +<<<<<<< HEAD const lazyClientHost = (() => { let clientHost: TypeScriptServiceClientHost | undefined; return () => { @@ -110,6 +111,10 @@ export function activate(context: ExtensionContext): void { }; })(); +======= + const clientHost = new TypeScriptServiceClientHost(standardLanguageDescriptions, context.storagePath, context.globalState, context.workspaceState, plugins); + context.subscriptions.push(clientHost); +>>>>>>> a0b779f... Move VersionStatus into a class context.subscriptions.push(commands.registerCommand('typescript.reloadProjects', () => { lazyClientHost().reloadProjects(); @@ -145,6 +150,7 @@ export function activate(context: ExtensionContext): void { const jsDocCompletionCommand = new TryCompleteJsDocCommand(() => lazyClientHost().serviceClient); context.subscriptions.push(commands.registerCommand(TryCompleteJsDocCommand.COMMAND_NAME, jsDocCompletionCommand.tryCompleteJsDoc, jsDocCompletionCommand)); +<<<<<<< HEAD const supportedLanguage = [].concat.apply([], standardLanguageDescriptions.map(x => x.modeIds).concat(plugins.map(x => x.languages))); function didOpenTextDocument(textDocument: TextDocument): boolean { if (supportedLanguage.indexOf(textDocument.languageId) >= 0) { @@ -162,6 +168,15 @@ export function activate(context: ExtensionContext): void { } } +======= + clientHost.serviceClient.onReady().then(() => { + context.subscriptions.push(ProjectStatus.create(clientHost.serviceClient, + path => new Promise(resolve => setTimeout(() => resolve(clientHost.handles(path)), 750)), + context.workspaceState)); + }, () => { + // Nothing to do here. The client did show a message; + }); +>>>>>>> a0b779f... Move VersionStatus into a class BuildStatus.update({ queueLength: 0 }); } From 68dbf58ff72b9dc136aaf1b7faddd99f75e21c48 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 25 May 2017 15:30:19 -0700 Subject: [PATCH 1077/1164] Actually save the file this time :'( --- extensions/typescript/src/typescriptMain.ts | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index 18bc57678ff..07a666936b9 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -90,7 +90,6 @@ const standardLanguageDescriptions: LanguageDescription[] = [ export function activate(context: ExtensionContext): void { const plugins = getContributedTypeScriptServerPlugins(); -<<<<<<< HEAD const lazyClientHost = (() => { let clientHost: TypeScriptServiceClientHost | undefined; return () => { @@ -111,10 +110,6 @@ export function activate(context: ExtensionContext): void { }; })(); -======= - const clientHost = new TypeScriptServiceClientHost(standardLanguageDescriptions, context.storagePath, context.globalState, context.workspaceState, plugins); - context.subscriptions.push(clientHost); ->>>>>>> a0b779f... Move VersionStatus into a class context.subscriptions.push(commands.registerCommand('typescript.reloadProjects', () => { lazyClientHost().reloadProjects(); @@ -150,7 +145,6 @@ export function activate(context: ExtensionContext): void { const jsDocCompletionCommand = new TryCompleteJsDocCommand(() => lazyClientHost().serviceClient); context.subscriptions.push(commands.registerCommand(TryCompleteJsDocCommand.COMMAND_NAME, jsDocCompletionCommand.tryCompleteJsDoc, jsDocCompletionCommand)); -<<<<<<< HEAD const supportedLanguage = [].concat.apply([], standardLanguageDescriptions.map(x => x.modeIds).concat(plugins.map(x => x.languages))); function didOpenTextDocument(textDocument: TextDocument): boolean { if (supportedLanguage.indexOf(textDocument.languageId) >= 0) { @@ -168,15 +162,6 @@ export function activate(context: ExtensionContext): void { } } -======= - clientHost.serviceClient.onReady().then(() => { - context.subscriptions.push(ProjectStatus.create(clientHost.serviceClient, - path => new Promise(resolve => setTimeout(() => resolve(clientHost.handles(path)), 750)), - context.workspaceState)); - }, () => { - // Nothing to do here. The client did show a message; - }); ->>>>>>> a0b779f... Move VersionStatus into a class BuildStatus.update({ queueLength: 0 }); } From 065b600fe726a4e8e1e183eb2e39dbd4565173a9 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 25 May 2017 16:03:38 -0700 Subject: [PATCH 1078/1164] Fix #26708 - use StringDecoder to handle data chunks that split multibyte characters --- .../services/search/node/ripgrepTextSearch.ts | 16 +++++++-- .../test/node/ripgrepTextSearch.test.ts | 36 +++++++++++++++---- 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/services/search/node/ripgrepTextSearch.ts b/src/vs/workbench/services/search/node/ripgrepTextSearch.ts index 829406f52fe..03aaa15bb75 100644 --- a/src/vs/workbench/services/search/node/ripgrepTextSearch.ts +++ b/src/vs/workbench/services/search/node/ripgrepTextSearch.ts @@ -6,6 +6,7 @@ import { EventEmitter } from 'events'; import * as path from 'path'; +import { StringDecoder, NodeStringDecoder } from 'string_decoder'; import * as cp from 'child_process'; import { rgPath } from 'vscode-ripgrep'; @@ -174,11 +175,13 @@ export class RipgrepParser extends EventEmitter { private fileMatch: FileMatch; private remainder: string; private isDone: boolean; + private stringDecoder: NodeStringDecoder; private numResults = 0; constructor(private maxResults: number, private rootFolder: string) { super(); + this.stringDecoder = new StringDecoder(); } public cancel(): void { @@ -186,16 +189,23 @@ export class RipgrepParser extends EventEmitter { } public flush(): void { + this.handleDecodedData(this.stringDecoder.end()); + if (this.fileMatch) { this.onResult(); } } - public handleData(data: string | Buffer): void { + public handleData(data: Buffer | string): void { + const dataStr = typeof data === 'string' ? data : this.stringDecoder.write(data); + this.handleDecodedData(dataStr); + } + + private handleDecodedData(decodedData: string): void { // If the previous data chunk didn't end in a newline, prepend it to this chunk const dataStr = this.remainder ? - this.remainder + data.toString() : - data.toString(); + this.remainder + decodedData : + decodedData; const dataLines: string[] = dataStr.split(/\r\n|\n/); this.remainder = dataLines[dataLines.length - 1] ? dataLines.pop() : null; diff --git a/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts b/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts index 1ee3f9a6a83..9ff4208d109 100644 --- a/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts +++ b/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts @@ -33,7 +33,11 @@ suite('RipgrepParser', () => { return matchLine; } - function parseInput(inputChunks: string[]): ISerializedFileMatch[] { + function parseInputStrings(inputChunks: string[]): ISerializedFileMatch[] { + return parseInput(inputChunks.map(chunk => new Buffer(chunk))); + } + + function parseInput(inputChunks: Buffer[]): ISerializedFileMatch[] { const matches: ISerializedFileMatch[] = []; const rgp = new RipgrepParser(1e6, rootFolder); rgp.on('result', (match: ISerializedFileMatch) => { @@ -65,7 +69,7 @@ suite('RipgrepParser', () => { [getFileLine('a.txt'), getMatchLine(1, ['before', 'match', 'after']), getMatchLine(2, ['before', 'match', 'after']), fileSectionEnd].join('\n') ]; - const results = parseInput(input); + const results = parseInputStrings(input); assert.equal(results.length, 1); assert.deepEqual(results[0], { @@ -93,7 +97,7 @@ suite('RipgrepParser', () => { [getFileLine('c.txt'), getMatchLine(1, ['before', 'match', 'after']), getMatchLine(2, ['before', 'match', 'after']), fileSectionEnd].join('\n') ]; - const results = parseInput(input); + const results = parseInputStrings(input); assert.equal(results.length, 3); results.forEach(fileResult => assert.equal(fileResult.numMatches, 2)); }); @@ -116,7 +120,7 @@ suite('RipgrepParser', () => { test('Parses multiple chunks broken at each line', () => { const input = singleLineChunks.map(chunk => chunk + '\n'); - const results = parseInput(input); + const results = parseInputStrings(input); assert.equal(results.length, 3); results.forEach(fileResult => assert.equal(fileResult.numMatches, 2)); }); @@ -126,7 +130,7 @@ suite('RipgrepParser', () => { .map(chunk => chunk + '\n') .map(halve)); - const results = parseInput(input); + const results = parseInputStrings(input); assert.equal(results.length, 3); results.forEach(fileResult => assert.equal(fileResult.numMatches, 2)); }); @@ -136,7 +140,7 @@ suite('RipgrepParser', () => { .map(chunk => chunk + '\n') .map(arrayOfChars)); - const results = parseInput(input); + const results = parseInputStrings(input); assert.equal(results.length, 3); results.forEach(fileResult => assert.equal(fileResult.numMatches, 2)); }); @@ -145,8 +149,26 @@ suite('RipgrepParser', () => { const input = singleLineChunks .map(chunk => '\n' + chunk); - const results = parseInput(input); + const results = parseInputStrings(input); assert.equal(results.length, 3); results.forEach(fileResult => assert.equal(fileResult.numMatches, 2)); }); + + test('Parses chunks broken in the middle of a multibyte character', () => { + const multibyteStr = '漢'; + const multibyteBuf = new Buffer(multibyteStr); + const text = getFileLine('foo/bar') + '\n' + getMatchLine(0, ['before', 'match', 'after']) + '\n'; + + // Split the multibyte char into two pieces and divide between the two buffers + const beforeIndex = 24; + const inputBufs = [ + Buffer.concat([new Buffer(text.substr(0, beforeIndex)), multibyteBuf.slice(0, 2)]), + Buffer.concat([multibyteBuf.slice(2), new Buffer(text.substr(beforeIndex))]) + ]; + + const results = parseInput(inputBufs); + assert.equal(results.length, 1); + assert.equal(results[0].lineMatches.length, 1); + assert.deepEqual(results[0].lineMatches[0].offsetAndLengths, [[7, 5]]); + }); }); \ No newline at end of file From 018f6ac2a610685b40770ebcbc39087fb609d07e Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 25 May 2017 16:15:19 -0700 Subject: [PATCH 1079/1164] Add Unit Test launch config (not sure why it was deleted?) --- .vscode/launch.json | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/.vscode/launch.json b/.vscode/launch.json index d56ca22e59d..fa30207ce2b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -146,6 +146,32 @@ "outFiles": [ "${workspaceRoot}/extensions/node_modules/typescript/lib/**/*.js" ] + }, + { + "type": "node", + "request": "launch", + "name": "Unit Tests", + "protocol": "legacy", + "program": "${workspaceRoot}/node_modules/mocha/bin/_mocha", + "runtimeExecutable": "${workspaceRoot}/.build/electron/Code - OSS.app/Contents/MacOS/Electron", + "windows": { + "runtimeExecutable": "${workspaceRoot}/.build/electron/Code - OSS.exe" + }, + "linux": { + "runtimeExecutable": "${workspaceRoot}/.build/electron/code-oss" + }, + "stopOnEntry": false, + "args": [ + "--timeout", + "2000" + ], + "cwd": "${workspaceRoot}", + "env": { + "ELECTRON_RUN_AS_NODE": "true" + }, + "outFiles": [ + "${workspaceRoot}/out/**/*.js" + ] } ], "compounds": [ From 665dbb442e970564c8d3771ee4653b8961dfc765 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 25 May 2017 16:17:37 -0700 Subject: [PATCH 1080/1164] sourceMaps is enabled by default, remove from launch configs --- .vscode/launch.json | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index fa30207ce2b..39b72b995a8 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -18,7 +18,6 @@ "name": "Attach to Extension Host", "protocol": "legacy", "port": 5870, - "sourceMaps": true, "restart": true, "outFiles": [ "${workspaceRoot}/out/**/*.js" @@ -30,7 +29,6 @@ "name": "Attach to Shared Process", "protocol": "legacy", "port": 5871, - "sourceMaps": true, "outFiles": [ "${workspaceRoot}/out/**/*.js" ] @@ -41,7 +39,6 @@ "protocol": "legacy", "name": "Attach to Search process", "port": 7890, - "sourceMaps": true, "outFiles": [ "${workspaceRoot}/out/**/*.js" ] @@ -52,7 +49,6 @@ "name": "Attach to CLI Process", "protocol": "legacy", "port": 5874, - "sourceMaps": true, "outFiles": [ "${workspaceRoot}/out/**/*.js" ] @@ -63,7 +59,6 @@ "name": "Attach to Main Process", "protocol": "legacy", "port": 5875, - "sourceMaps": true, "outFiles": [ "${workspaceRoot}/out/**/*.js" ] @@ -78,7 +73,6 @@ "--extensionDevelopmentPath=${workspaceRoot}/extensions/vscode-api-tests", "--extensionTestsPath=${workspaceRoot}/extensions/vscode-api-tests/out" ], - "sourceMaps": true, "outFiles": [ "${workspaceRoot}/out/**/*.js" ] @@ -93,7 +87,6 @@ "--extensionDevelopmentPath=${workspaceRoot}/extensions/vscode-colorize-tests", "--extensionTestsPath=${workspaceRoot}/extensions/vscode-colorize-tests/out" ], - "sourceMaps": true, "outFiles": [ "${workspaceRoot}/out/**/*.js" ] @@ -131,7 +124,6 @@ "program": "${workspaceRoot}/extensions/git/node_modules/mocha/bin/_mocha", "stopOnEntry": false, "cwd": "${workspaceRoot}/extensions/git", - "sourceMaps": true, "outFiles": [ "${workspaceRoot}/extensions/git/out/**/*.js" ] @@ -141,7 +133,6 @@ "type": "node", "request": "attach", "port": 5859, - "sourceMaps": true, "protocol": "legacy", "outFiles": [ "${workspaceRoot}/extensions/node_modules/typescript/lib/**/*.js" From c81df3a4f446dbcd5d0b7c03bbabe581455b46b6 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Thu, 25 May 2017 16:17:21 -0700 Subject: [PATCH 1081/1164] Use 'descriptionForeground' (#27289) --- extensions/merge-conflict/src/mergeDecorator.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/merge-conflict/src/mergeDecorator.ts b/extensions/merge-conflict/src/mergeDecorator.ts index 39888f727e6..be9e733a562 100644 --- a/extensions/merge-conflict/src/mergeDecorator.ts +++ b/extensions/merge-conflict/src/mergeDecorator.ts @@ -81,7 +81,7 @@ export default class MergeDectorator implements vscode.Disposable { color: new vscode.ThemeColor('editor.foreground'), after: { contentText: ' ' + localize('currentChange', '(Current change)'), - color: 'rgba(0, 0, 0, 0.7)' + color: new vscode.ThemeColor('descriptionForeground') } }); @@ -96,7 +96,7 @@ export default class MergeDectorator implements vscode.Disposable { isWholeLine: this.decorationUsesWholeLine, after: { contentText: ' ' + localize('incomingChange', '(Incoming change)'), - color: 'rgba(0, 0, 0, 0.7)' + color: new vscode.ThemeColor('descriptionForeground') } }); } From b117a11c0db5743c35d111a607c1a53f05573503 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 25 May 2017 16:27:55 -0700 Subject: [PATCH 1082/1164] Safer change for #25422 --- src/vs/workbench/services/search/node/ripgrepTextSearch.ts | 2 +- .../services/search/test/node/ripgrepTextSearch.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/services/search/node/ripgrepTextSearch.ts b/src/vs/workbench/services/search/node/ripgrepTextSearch.ts index 03aaa15bb75..b7f3b7ad4dc 100644 --- a/src/vs/workbench/services/search/node/ripgrepTextSearch.ts +++ b/src/vs/workbench/services/search/node/ripgrepTextSearch.ts @@ -235,7 +235,7 @@ export class RipgrepParser extends EventEmitter { this.onResult(); } - this.fileMatch = new FileMatch(path.resolve(this.rootFolder, r[1])); + this.fileMatch = new FileMatch(path.isAbsolute(r[1]) ? r[1] : path.join(this.rootFolder, r[1])); } else { // Line is empty (or malformed) } diff --git a/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts b/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts index 9ff4208d109..87a27629eaf 100644 --- a/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts +++ b/src/vs/workbench/services/search/test/node/ripgrepTextSearch.test.ts @@ -74,7 +74,7 @@ suite('RipgrepParser', () => { assert.deepEqual(results[0], { numMatches: 2, - path: path.resolve(rootFolder, 'a.txt'), + path: path.join(rootFolder, 'a.txt'), lineMatches: [ { lineNumber: 0, From c79c2fe9fb57aecdd1cbe468b6b9cda2b9daf7fb Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Thu, 25 May 2017 17:47:01 -0700 Subject: [PATCH 1083/1164] node-debug2@1.13.0 --- build/gulpfile.vscode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 15d2edd0323..cf894772b6a 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -43,7 +43,7 @@ const nodeModules = ['electron', 'original-fs'] const builtInExtensions = [ { name: 'ms-vscode.node-debug', version: '1.13.6' }, - { name: 'ms-vscode.node-debug2', version: '1.12.4' } + { name: 'ms-vscode.node-debug2', version: '1.13.0' } ]; const vscodeEntryPoints = _.flatten([ From 71aeb83f8a5ece369534350157fed381d03c6eb1 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Thu, 25 May 2017 21:23:47 -0700 Subject: [PATCH 1084/1164] Pickup all TSConfigs in Workspace for TSC Build Task (#27306) Follow up on #26079 Allows us to pick up all tsconfig files in a workspace for the build tasks --- .../typescript/src/features/taskProvider.ts | 51 +++++++++------- .../typescript/src/utils/tsconfigProvider.ts | 58 +++++++++++++++++++ 2 files changed, 88 insertions(+), 21 deletions(-) create mode 100644 extensions/typescript/src/utils/tsconfigProvider.ts diff --git a/extensions/typescript/src/features/taskProvider.ts b/extensions/typescript/src/features/taskProvider.ts index 76528021983..ba53903e447 100644 --- a/extensions/typescript/src/features/taskProvider.ts +++ b/extensions/typescript/src/features/taskProvider.ts @@ -11,6 +11,7 @@ import * as vscode from 'vscode'; import * as Proto from '../protocol'; import TypeScriptServiceClient from '../typescriptServiceClient'; +import TsConfigProvider from "../utils/tsconfigProvider"; const exists = (file: string): Promise => @@ -21,32 +22,47 @@ const exists = (file: string): Promise => }); export default class TypeScriptTaskProvider implements vscode.TaskProvider { + private readonly tsconfigProvider: TsConfigProvider; public constructor( private readonly lazyClient: () => TypeScriptServiceClient - ) { } + ) { + this.tsconfigProvider = new TsConfigProvider(); + } - async provideTasks(token: vscode.CancellationToken): Promise { + dispose() { + this.tsconfigProvider.dispose(); + } + + public async provideTasks(token: vscode.CancellationToken): Promise { const rootPath = vscode.workspace.rootPath; if (!rootPath) { return []; } - const projects = (await this.getConfigForActiveFile(token)).concat(await this.getConfigsForWorkspace()); const command = await this.getCommand(); + const projects = await this.getAllTsConfigs(token); - return projects - .filter((x, i) => projects.indexOf(x) === i) - .map(configFile => { - const configFileName = path.relative(rootPath, configFile); - const buildTask = new vscode.ShellTask(`tsc: build ${configFileName}`, `${command} -p ${configFile}`, '$tsc'); - buildTask.group = vscode.TaskGroup.Build; - return buildTask; - }); + return projects.map(configFile => { + const configFileName = path.relative(rootPath, configFile); + const buildTask = new vscode.ShellTask(`tsc: build ${configFileName}`, `${command} -p ${configFile}`, '$tsc'); + buildTask.group = vscode.TaskGroup.Build; + return buildTask; + }); } + private async getAllTsConfigs(token: vscode.CancellationToken): Promise { + const out: string[] = []; + const configs = (await this.getTsConfigForActiveFile(token)).concat(await this.getTsConfigsInWorkspace()); + for (const config of configs) { + if (await exists(config)) { + out.push(config); + } + } + return out; + } - private async getConfigForActiveFile(token: vscode.CancellationToken): Promise { + private async getTsConfigForActiveFile(token: vscode.CancellationToken): Promise { const editor = vscode.window.activeTextEditor; if (editor) { if (path.basename(editor.document.fileName).match(/^tsconfig\.(.\.)?json$/)) { @@ -75,15 +91,8 @@ export default class TypeScriptTaskProvider implements vscode.TaskProvider { return []; } - private async getConfigsForWorkspace(): Promise { - if (!vscode.workspace.rootPath) { - return []; - } - const rootTsConfig = path.join(vscode.workspace.rootPath, 'tsconfig.json'); - if (!await exists(rootTsConfig)) { - return []; - } - return [rootTsConfig]; + private async getTsConfigsInWorkspace(): Promise { + return Array.from(await this.tsconfigProvider.getConfigsForWorkspace()); } private async getCommand(): Promise { diff --git a/extensions/typescript/src/utils/tsconfigProvider.ts b/extensions/typescript/src/utils/tsconfigProvider.ts new file mode 100644 index 00000000000..e85ca24bbff --- /dev/null +++ b/extensions/typescript/src/utils/tsconfigProvider.ts @@ -0,0 +1,58 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import * as vscode from 'vscode'; + +export default class TsConfigProvider extends vscode.Disposable { + private readonly tsconfigs = new Set(); + + private activated: boolean = false; + private disposables: vscode.Disposable[] = []; + + constructor() { + super(() => this.dispose()); + } + + dispose(): void { + this.disposables.forEach(d => d.dispose()); + } + + public async getConfigsForWorkspace(): Promise> { + if (!vscode.workspace.rootPath) { + return []; + } + await this.ensureActivated(); + return this.tsconfigs; + } + + private async ensureActivated() { + if (this.activated) { + return this; + } + this.activated = true; + + for (const config of await TsConfigProvider.loadWorkspaceTsconfigs()) { + this.tsconfigs.add(config.fsPath); + } + + const configFileWatcher = vscode.workspace.createFileSystemWatcher('**/tsconfig*.json'); + this.disposables.push(configFileWatcher); + configFileWatcher.onDidCreate(this.handleProjectCreate, this, this.disposables); + configFileWatcher.onDidDelete(this.handleProjectDelete, this, this.disposables); + + return this; + } + + private static loadWorkspaceTsconfigs() { + return vscode.workspace.findFiles('**/tsconfig*.json', '**/node_modules/**'); + } + + private handleProjectCreate(e: vscode.Uri) { + this.tsconfigs.add(e.fsPath); + } + + private handleProjectDelete(e: vscode.Uri) { + this.tsconfigs.delete(e.fsPath); + } +} From 5be2260d22aa832ab53ae9196c513553b410bef3 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Thu, 25 May 2017 23:50:49 -0700 Subject: [PATCH 1085/1164] Select single words in property value --- extensions/emmet/src/selectItemHTML.ts | 65 +++++++++++++++-- extensions/emmet/src/selectItemStylesheet.ts | 75 ++++++++++++++++--- extensions/emmet/src/util.ts | 76 ++++++++++++++++++++ 3 files changed, 200 insertions(+), 16 deletions(-) diff --git a/extensions/emmet/src/selectItemHTML.ts b/extensions/emmet/src/selectItemHTML.ts index 79d0a585e0a..2c0be704ead 100644 --- a/extensions/emmet/src/selectItemHTML.ts +++ b/extensions/emmet/src/selectItemHTML.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import { getNode, getDeepestNode } from './util'; +import { getNode, getDeepestNode, findNextWord, findPrevWord } from './util'; import Node from '@emmetio/node'; export function nextItemHTML(selection: vscode.Selection, editor: vscode.TextEditor, rootNode: Node): vscode.Selection { @@ -99,10 +99,40 @@ function getNextAttribute(selection: vscode.Selection, document: vscode.TextDocu return new vscode.Selection(document.positionAt(attr.start), document.positionAt(attr.end)); } - if ((attr.value.start !== attr.value.end) && ((selectionStart === attr.start && selectionEnd === attr.end) || selectionEnd < attr.end - 1)) { - // select attr value + if (attr.value.start === attr.value.end) { + // No attr value to select + continue; + } + + if ((selectionStart === attr.start && selectionEnd === attr.end) || selectionEnd < attr.value.start) { + // cursor is in attr name, so select full attr value return new vscode.Selection(document.positionAt(attr.value.start), document.positionAt(attr.value.end)); } + + // Fetch the next word in the attr value + + if (attr.value.toString().indexOf(' ') === -1) { + // attr value does not have space, so no next word to find + continue; + } + + let pos = undefined; + if (selectionStart === attr.value.start && selectionEnd === attr.value.end) { + pos = -1; + } + if (pos === undefined && selectionEnd < attr.end) { + pos = selectionEnd - attr.value.start - 1; + } + + if (pos !== undefined) { + let [newSelectionStart, newSelectionEnd] = findNextWord(attr.value.toString(), pos); + if (newSelectionStart >= 0 && newSelectionEnd >= 0) { + newSelectionStart += attr.value.start; + newSelectionEnd += attr.value.start; + return new vscode.Selection(document.positionAt(newSelectionStart), document.positionAt(newSelectionEnd)); + } + } + } } @@ -113,18 +143,39 @@ function getPrevAttribute(selection: vscode.Selection, document: vscode.TextDocu } let selectionStart = document.offsetAt(selection.anchor); + let selectionEnd = document.offsetAt(selection.active); for (let i = node.attributes.length - 1; i >= 0; i--) { let attr = node.attributes[i]; - if (selectionStart > attr.value.start) { + if (selectionStart <= attr.start) { + continue; + } + + if (attr.value.start === attr.value.end || selectionStart < attr.value.start) { + // select full attr + return new vscode.Selection(document.positionAt(attr.start), document.positionAt(attr.end)); + } + + if (selectionStart === attr.value.start) { + if (selectionEnd >= attr.value.end) { + // select full attr + return new vscode.Selection(document.positionAt(attr.start), document.positionAt(attr.end)); + } // select attr value return new vscode.Selection(document.positionAt(attr.value.start), document.positionAt(attr.value.end)); } - if (selectionStart > attr.start) { - // select full attr - return new vscode.Selection(document.positionAt(attr.start), document.positionAt(attr.end)); + // Fetch the prev word in the attr value + + let pos = selectionStart > attr.value.end ? attr.value.toString().length : selectionStart - attr.value.start; + let [newSelectionStart, newSelectionEnd] = findPrevWord(attr.value.toString(), pos); + if (newSelectionStart >= 0 && newSelectionEnd >= 0) { + newSelectionStart += attr.value.start; + newSelectionEnd += attr.value.start; + return new vscode.Selection(document.positionAt(newSelectionStart), document.positionAt(newSelectionEnd)); } + + } } \ No newline at end of file diff --git a/extensions/emmet/src/selectItemStylesheet.ts b/extensions/emmet/src/selectItemStylesheet.ts index d0167a2d8b9..e3144cbf666 100644 --- a/extensions/emmet/src/selectItemStylesheet.ts +++ b/extensions/emmet/src/selectItemStylesheet.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import { getNode, getDeepestNode } from './util'; +import { getNode, getDeepestNode, findNextWord, findPrevWord } from './util'; import Node from '@emmetio/node'; export function nextItemStylesheet(selection: vscode.Selection, editor: vscode.TextEditor, rootNode: Node): vscode.Selection { @@ -12,9 +12,17 @@ export function nextItemStylesheet(selection: vscode.Selection, editor: vscode.T let endOffset = editor.document.offsetAt(selection.active); let currentNode = getNode(rootNode, endOffset, true); - // Full property is selected, so select property value next + // Full property is selected, so select full property value next if (currentNode.type === 'property' && startOffset === currentNode.start && endOffset === currentNode.end) { - return getSelectionFromNode(currentNode, editor.document, true); + return getSelectionFromProperty(currentNode, editor.document, startOffset, endOffset, true, 'next'); + } + + // Part or whole of propertyValue is selected, so select the next word in the propertyValue + if (currentNode.type === 'property' && startOffset >= currentNode.valueToken.start && endOffset <= currentNode.valueToken.end) { + let singlePropertyValue = getSelectionFromProperty(currentNode, editor.document, startOffset, endOffset, false, 'next'); + if (singlePropertyValue) { + return singlePropertyValue; + } } // Cursor is in the selector or in a property @@ -41,13 +49,27 @@ export function nextItemStylesheet(selection: vscode.Selection, editor: vscode.T export function prevItemStylesheet(selection: vscode.Selection, editor: vscode.TextEditor, rootNode: Node): vscode.Selection { let startOffset = editor.document.offsetAt(selection.anchor); + let endOffset = editor.document.offsetAt(selection.active); let currentNode = getNode(rootNode, startOffset); if (!currentNode) { currentNode = rootNode; } + // Full property value is selected, so select the whole property next + if (currentNode.type === 'property' && startOffset === currentNode.valueToken.start && endOffset === currentNode.valueToken.end) { + return getSelectionFromNode(currentNode, editor.document); + } + + // Part of propertyValue is selected, so select the prev word in the propertyValue + if (currentNode.type === 'property' && startOffset >= currentNode.valueToken.start && endOffset <= currentNode.valueToken.end) { + let singlePropertyValue = getSelectionFromProperty(currentNode, editor.document, startOffset, endOffset, false, 'prev'); + if (singlePropertyValue) { + return singlePropertyValue; + } + } + if (currentNode.type === 'property' || !currentNode.firstChild || (currentNode.type === 'rule' && startOffset <= currentNode.firstChild.start)) { - return getSelectionFromNode(currentNode, editor.document);; + return getSelectionFromNode(currentNode, editor.document); } // Select the child that appears just before the cursor @@ -57,23 +79,58 @@ export function prevItemStylesheet(selection: vscode.Selection, editor: vscode.T } prevNode = getDeepestNode(prevNode); - return getSelectionFromNode(prevNode, editor.document, true); + return getSelectionFromProperty(prevNode, editor.document, startOffset, endOffset, false, 'prev'); } -function getSelectionFromNode(node: Node, document: vscode.TextDocument, selectPropertyValue: boolean = false): vscode.Selection { +function getSelectionFromNode(node: Node, document: vscode.TextDocument): vscode.Selection { if (!node) { return; } let nodeToSelect = node.type === 'rule' ? node.selectorToken : node; + return new vscode.Selection(document.positionAt(nodeToSelect.start), document.positionAt(nodeToSelect.end)); +} - let selectionStart = (node.type === 'property' && selectPropertyValue) ? node.valueToken.start : nodeToSelect.start; - let selectionEnd = (node.type === 'property' && selectPropertyValue) ? node.valueToken.end : nodeToSelect.end; - return new vscode.Selection(document.positionAt(selectionStart), document.positionAt(selectionEnd)); +function getSelectionFromProperty(node: Node, document: vscode.TextDocument, selectionStart: number, selectionEnd: number, selectFullValue: boolean, direction: string): vscode.Selection { + if (!node || node.type !== 'property') { + return; + } + let propertyValue = node.valueToken.stream.substring(node.valueToken.start, node.valueToken.end); + selectFullValue = selectFullValue || (direction === 'prev' && selectionStart === node.valueToken.start && selectionEnd < node.valueToken.end); + + if (selectFullValue) { + return new vscode.Selection(document.positionAt(node.valueToken.start), document.positionAt(node.valueToken.end)); + } + + let pos; + if (direction === 'prev') { + if (selectionStart === node.valueToken.start) { + return; + } + pos = selectionStart > node.valueToken.end ? propertyValue.length : selectionStart - node.valueToken.start; + } + + if (direction === 'next') { + if (selectionEnd === node.valueToken.end && (selectionStart > node.valueToken.start || propertyValue.indexOf(' ') === -1)) { + return; + } + pos = selectionEnd === node.valueToken.end ? -1 : selectionEnd - node.valueToken.start - 1; + } + + + let [newSelectionStart, newSelectionEnd] = direction === 'prev' ? findPrevWord(propertyValue, pos) : findNextWord(propertyValue, pos); + if (!newSelectionStart && !newSelectionEnd) { + return; + } + + newSelectionStart += node.valueToken.start; + newSelectionEnd += node.valueToken.start; + + return new vscode.Selection(document.positionAt(newSelectionStart), document.positionAt(newSelectionEnd)); } diff --git a/extensions/emmet/src/util.ts b/extensions/emmet/src/util.ts index 3b495069d1e..81085e5b6d6 100644 --- a/extensions/emmet/src/util.ts +++ b/extensions/emmet/src/util.ts @@ -136,4 +136,80 @@ export function getDeepestNode(node: Node): Node { } return getDeepestNode(node.children[node.children.length - 1]); +} + +export function findNextWord(propertyValue: string, pos: number): [number, number] { + + let foundSpace = pos === -1; + let foundStart = false; + let foundEnd = false; + + let newSelectionStart; + let newSelectionEnd; + while (pos < propertyValue.length - 1) { + pos++; + if (!foundSpace) { + if (propertyValue[pos] === ' ') { + foundSpace = true; + } + continue; + } + if (foundSpace && !foundStart && propertyValue[pos] === ' ') { + continue; + } + if (!foundStart) { + newSelectionStart = pos; + foundStart = true; + continue; + } + if (propertyValue[pos] === ' ') { + newSelectionEnd = pos; + foundEnd = true; + break; + } + } + + if (foundStart && !foundEnd) { + newSelectionEnd = propertyValue.length; + } + + return [newSelectionStart, newSelectionEnd]; +} + +export function findPrevWord(propertyValue: string, pos: number): [number, number] { + + let foundSpace = pos === propertyValue.length; + let foundStart = false; + let foundEnd = false; + + let newSelectionStart; + let newSelectionEnd; + while (pos > -1) { + pos--; + if (!foundSpace) { + if (propertyValue[pos] === ' ') { + foundSpace = true; + } + continue; + } + if (foundSpace && !foundEnd && propertyValue[pos] === ' ') { + continue; + } + if (!foundEnd) { + newSelectionEnd = pos + 1; + foundEnd = true; + continue; + } + if (propertyValue[pos] === ' ') { + newSelectionStart = pos + 1; + foundStart = true; + break; + } + } + + if (foundEnd && !foundStart) { + newSelectionStart = 0; + } + + return [newSelectionStart, newSelectionEnd]; } \ No newline at end of file From 0fbbc8eb0c0e88c55474eb07ac31759d0b5255ec Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 26 May 2017 10:17:58 +0200 Subject: [PATCH 1086/1164] fix #27245 --- src/vs/vscode.d.ts | 4 +++- src/vs/workbench/api/node/extHostDocumentData.ts | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 35a6a58cc03..296649cd8f9 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -201,7 +201,9 @@ declare module 'vscode' { * Get a word-range at the given position. By default words are defined by * common separators, like space, -, _, etc. In addition, per languge custom * [word definitions](#LanguageConfiguration.wordPattern) can be defined. It - * is also possible to provide a custom regular expression. + * is also possible to provide a custom regular expression. *Note* that a + * custom regular expression must not match the empty string and that it will + * be ignored if it does. * * The position will be [adjusted](#TextDocument.validatePosition). * diff --git a/src/vs/workbench/api/node/extHostDocumentData.ts b/src/vs/workbench/api/node/extHostDocumentData.ts index 96cb2aec92d..e52493a31e0 100644 --- a/src/vs/workbench/api/node/extHostDocumentData.ts +++ b/src/vs/workbench/api/node/extHostDocumentData.ts @@ -243,6 +243,7 @@ export class ExtHostDocumentData extends MirrorModel { private _getWordRangeAtPosition(_position: vscode.Position, regexp?: RegExp): vscode.Range { let position = this._validatePosition(_position); if (!regexp || regExpLeadsToEndlessLoop(regexp)) { + console.warn(`[getWordRangeAtPosition]: ignoring custom regexp '${regexp.source}' because it matches the empty string.`); regexp = getWordDefinitionFor(this._languageId); } let wordAtText = getWordAtText( From de6e586588f7701cadb966a70d2452700b5b3858 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 26 May 2017 10:27:58 +0200 Subject: [PATCH 1087/1164] fix #27277 --- src/vs/vscode.d.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 296649cd8f9..e9645e8147d 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -4680,6 +4680,8 @@ declare module 'vscode' { * A glob pattern that filters the file events must be provided. Optionally, flags to ignore certain * kinds of events can be provided. To stop listening to events the watcher must be disposed. * + * *Note* that only files within the current [workspace](#workspace.rootPath) can be watched. + * * @param globPattern A glob pattern that is applied to the names of created, changed, and deleted files. * @param ignoreCreateEvents Ignore when files have been created. * @param ignoreChangeEvents Ignore when files have been changed. From e14e783ca890d389a2db4eb22a043aeb10201cd5 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 26 May 2017 11:00:10 +0200 Subject: [PATCH 1088/1164] followup fix from fix #27245 --- src/vs/workbench/api/node/extHostDocumentData.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/api/node/extHostDocumentData.ts b/src/vs/workbench/api/node/extHostDocumentData.ts index e52493a31e0..be60815d553 100644 --- a/src/vs/workbench/api/node/extHostDocumentData.ts +++ b/src/vs/workbench/api/node/extHostDocumentData.ts @@ -242,10 +242,17 @@ export class ExtHostDocumentData extends MirrorModel { private _getWordRangeAtPosition(_position: vscode.Position, regexp?: RegExp): vscode.Range { let position = this._validatePosition(_position); - if (!regexp || regExpLeadsToEndlessLoop(regexp)) { - console.warn(`[getWordRangeAtPosition]: ignoring custom regexp '${regexp.source}' because it matches the empty string.`); + + if (!regexp) { + // use default when custom-regexp isn't provided regexp = getWordDefinitionFor(this._languageId); + + } else if (regExpLeadsToEndlessLoop(regexp)) { + // use default when custom-regexp is bad + regexp = getWordDefinitionFor(this._languageId); + console.warn(`[getWordRangeAtPosition]: ignoring custom regexp '${regexp.source}' because it matches the empty string.`); } + let wordAtText = getWordAtText( position.character + 1, ensureValidWordDefinition(regexp), From 7e68adad6427a6e9745a9e43af5bf17a3f3b0a7b Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 26 May 2017 11:07:17 +0200 Subject: [PATCH 1089/1164] simplify tests, fix tests, promise ftw --- .../vscode-api-tests/src/languages.test.ts | 33 +++++++------------ .../workbench/api/node/extHostDocumentData.ts | 2 +- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/extensions/vscode-api-tests/src/languages.test.ts b/extensions/vscode-api-tests/src/languages.test.ts index d4a0c80130e..321b1b772f2 100644 --- a/extensions/vscode-api-tests/src/languages.test.ts +++ b/extensions/vscode-api-tests/src/languages.test.ts @@ -14,7 +14,7 @@ import { suite('languages namespace tests', () => { - test('diagnostics & CodeActionProvider', function (done) { + test('diagnostics & CodeActionProvider', function () { class D2 extends Diagnostic { customProp = { complex() { } }; @@ -54,20 +54,15 @@ suite('languages namespace tests', () => { let r4 = languages.createDiagnosticCollection(); r4.set(uri, [diag2]); - workspace.openTextDocument(uri).then(doc => { + return workspace.openTextDocument(uri).then(doc => { return commands.executeCommand('vscode.executeCodeActionProvider', uri, new Range(0, 0, 0, 10)); }).then(commands => { - try { - assert.ok(ran); - Disposable.from(r1, r2, r3, r4).dispose(); - done(); - } catch (e) { - done(e); - } - }, done); + assert.ok(ran); + Disposable.from(r1, r2, r3, r4).dispose(); + }); }); - test('completions with document filters', function (done) { + test('completions with document filters', function () { let ran = false; let uri = Uri.file(join(workspace.rootPath || '', './bower.json')); @@ -82,17 +77,13 @@ suite('languages namespace tests', () => { } }); - workspace.openTextDocument(uri).then(doc => { + return workspace.openTextDocument(uri).then(doc => { return commands.executeCommand('vscode.executeCompletionItemProvider', uri, new Position(1, 0)); }).then((result: CompletionList) => { - try { - assert.equal(result.items[0].label, 'foo'); - assert.ok(ran); - Disposable.from(r1).dispose(); - done(); - } catch (e) { - done(e); - } - }, done); + r1.dispose(); + assert.ok(ran); + console.log(result.items); + assert.equal(result.items[0].label, 'foo'); + }); }); }); diff --git a/src/vs/workbench/api/node/extHostDocumentData.ts b/src/vs/workbench/api/node/extHostDocumentData.ts index be60815d553..edb38779935 100644 --- a/src/vs/workbench/api/node/extHostDocumentData.ts +++ b/src/vs/workbench/api/node/extHostDocumentData.ts @@ -249,8 +249,8 @@ export class ExtHostDocumentData extends MirrorModel { } else if (regExpLeadsToEndlessLoop(regexp)) { // use default when custom-regexp is bad - regexp = getWordDefinitionFor(this._languageId); console.warn(`[getWordRangeAtPosition]: ignoring custom regexp '${regexp.source}' because it matches the empty string.`); + regexp = getWordDefinitionFor(this._languageId); } let wordAtText = getWordAtText( From b2b81e4f3eb16074407f86340554d58e71a3f1b6 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 26 May 2017 11:31:28 +0200 Subject: [PATCH 1090/1164] fix #27231 --- .../api/electron-browser/mainThreadDocuments.ts | 6 +++--- src/vs/workbench/api/node/extHost.protocol.ts | 3 +-- src/vs/workbench/api/node/extHostDocuments.ts | 17 ++++++++--------- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadDocuments.ts b/src/vs/workbench/api/electron-browser/mainThreadDocuments.ts index 120beef086f..13e61675fa4 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDocuments.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDocuments.ts @@ -123,12 +123,12 @@ export class MainThreadDocuments extends MainThreadDocumentsShape { })); this._toDispose.push(textFileService.models.onModelReverted(e => { if (this._shouldHandleFileEvent(e)) { - this._proxy.$acceptModelReverted(e.resource.toString()); + this._proxy.$acceptDirtyStateChanged(e.resource.toString(), false); } })); this._toDispose.push(textFileService.models.onModelDirty(e => { if (this._shouldHandleFileEvent(e)) { - this._proxy.$acceptModelDirty(e.resource.toString()); + this._proxy.$acceptDirtyStateChanged(e.resource.toString(), true); } })); @@ -240,7 +240,7 @@ export class MainThreadDocuments extends MainThreadDocumentsShape { if (!this._modelIsSynced[input.getResource().toString()]) { throw new Error(`expected URI ${input.getResource().toString()} to have come to LIFE`); } - return this._proxy.$acceptModelDirty(input.getResource().toString()); // mark as dirty + return this._proxy.$acceptDirtyStateChanged(input.getResource().toString(), true); // mark as dirty }).then(() => { return input.getResource(); }); diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index f9c02d01d8c..b168ae2ddac 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -371,8 +371,7 @@ export abstract class ExtHostDocumentsShape { $provideTextDocumentContent(handle: number, uri: URI): TPromise { throw ni(); } $acceptModelModeChanged(strURL: string, oldModeId: string, newModeId: string): void { throw ni(); } $acceptModelSaved(strURL: string): void { throw ni(); } - $acceptModelDirty(strURL: string): void { throw ni(); } - $acceptModelReverted(strURL: string): void { throw ni(); } + $acceptDirtyStateChanged(strURL: string, isDirty: boolean): void { throw ni(); } $acceptModelChanged(strURL: string, e: IModelChangedEvent, isDirty: boolean): void { throw ni(); } } diff --git a/src/vs/workbench/api/node/extHostDocuments.ts b/src/vs/workbench/api/node/extHostDocuments.ts index 918efad51f3..eacff1334c5 100644 --- a/src/vs/workbench/api/node/extHostDocuments.ts +++ b/src/vs/workbench/api/node/extHostDocuments.ts @@ -171,18 +171,17 @@ export class ExtHostDocuments extends ExtHostDocumentsShape { public $acceptModelSaved(strURL: string): void { let data = this._documentsAndEditors.getDocument(strURL); - data._acceptIsDirty(false); + this.$acceptDirtyStateChanged(strURL, false); this._onDidSaveDocument.fire(data.document); } - public $acceptModelDirty(strURL: string): void { - let document = this._documentsAndEditors.getDocument(strURL); - document._acceptIsDirty(true); - } - - public $acceptModelReverted(strURL: string): void { - let document = this._documentsAndEditors.getDocument(strURL); - document._acceptIsDirty(false); + public $acceptDirtyStateChanged(strURL: string, isDirty: boolean): void { + let data = this._documentsAndEditors.getDocument(strURL); + data._acceptIsDirty(isDirty); + this._onDidChangeDocument.fire({ + document: data.document, + contentChanges: [] + }); } public $acceptModelChanged(strURL: string, events: IModelChangedEvent, isDirty: boolean): void { From 3022b4cde49d380f1f4d609b567b152fdf7c80f0 Mon Sep 17 00:00:00 2001 From: YukiUeda Date: Fri, 26 May 2017 19:18:05 +0900 Subject: [PATCH 1091/1164] support %%(fix #26825) --- extensions/bat/syntaxes/Batch File.tmLanguage | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/extensions/bat/syntaxes/Batch File.tmLanguage b/extensions/bat/syntaxes/Batch File.tmLanguage index 49909636404..7f0a1061423 100644 --- a/extensions/bat/syntaxes/Batch File.tmLanguage +++ b/extensions/bat/syntaxes/Batch File.tmLanguage @@ -68,20 +68,6 @@ match (?i)(%)(~(?:f|d|p|n|x|s|a|t|z|\$[^:]*:)*)?\d - - captures - - 1 - - name - variable.parameter.loop.begin.shell - - - name - variable.parameter.loop.dosbatch - match - (?i)(%%)(~(?:f|d|p|n|x|s|a|t|z|\$[^:]*:)*)?[a-z] - captures @@ -99,7 +85,21 @@ name variable.other.parsetime.dosbatch match - (%)[^%]+(%) + (%)[^%]+(%)|(%%)[^%]+(%%) + + + captures + + 1 + + name + variable.parameter.loop.begin.shell + + + name + variable.parameter.loop.dosbatch + match + (?i)(%%)(~(?:f|d|p|n|x|s|a|t|z|\$[^:]*:)*)?[a-z] captures From e81c07d7c23145ea726a4534b46fed0539b9b7df Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 26 May 2017 12:28:31 +0200 Subject: [PATCH 1092/1164] snippets - fix leaking listeners that break subsequent snippet insertion --- .../contrib/snippet/browser/snippetController2.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 3983e58599e..73946415785 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -62,12 +62,16 @@ export class SnippetController2 { if (!this._snippet) { // create a new session this._snippet = new SnippetSession(this._editor); + this._snippet.insert(template, overwriteBefore, overwriteAfter); + this._snippetListener = [ + this._editor.onDidChangeModel(() => this.cancel()), + this._editor.onDidChangeCursorSelection(() => this._updateState()) + ]; + } else { + // only insert the snippet when a session + // is already active + this._snippet.insert(template, overwriteBefore, overwriteAfter); } - this._snippet.insert(template, overwriteBefore, overwriteAfter); - this._snippetListener = [ - this._editor.onDidChangeModel(() => this.cancel()), - this._editor.onDidChangeCursorSelection(() => this._updateState()) - ]; if (undoStopAfter) { this._editor.getModel().pushStackElement(); } From e030a071355c05735d3ab248bb3f795219ec4e40 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Fri, 26 May 2017 14:52:06 +0200 Subject: [PATCH 1093/1164] Support customiying tasks --- src/vs/workbench/api/node/extHostTask.ts | 18 ++- .../parts/tasks/browser/quickOpen.ts | 14 +- .../parts/tasks/common/taskConfiguration.ts | 105 ++++++++----- .../parts/tasks/common/taskService.ts | 2 + .../parts/tasks/common/taskTemplates.ts | 139 +++--------------- src/vs/workbench/parts/tasks/common/tasks.ts | 63 +++++--- .../tasks/electron-browser/jsonSchema_v2.ts | 9 ++ .../electron-browser/task.contribution.ts | 83 ++++++----- .../electron-browser/terminalTaskSystem.ts | 16 +- .../parts/tasks/node/processTaskSystem.ts | 4 +- .../tasks/test/node/configuration.test.ts | 16 +- 11 files changed, 229 insertions(+), 240 deletions(-) diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index aa6497bc410..656f57739d7 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -230,7 +230,10 @@ namespace Strings { } namespace CommandOptions { - export function from(value: { cwd?: string; env?: { [key: string]: string; } }): TaskSystem.CommandOptions { + function isShellOptions(value: any): value is vscode.ShellOptions { + return value && typeof value.executable === 'string'; + } + export function from(value: vscode.ShellOptions | vscode.ProcessOptions): TaskSystem.CommandOptions { if (value === void 0 || value === null) { return undefined; } @@ -248,14 +251,17 @@ namespace CommandOptions { } }); } + if (isShellOptions(value)) { + result.shell = ShellConfiguration.from(value); + } return result; } } namespace ShellConfiguration { - export function from(value: { executable?: string, args?: string[] }): boolean | TaskSystem.ShellConfiguration { - if (value === void 0 || value === null || typeof value.executable !== 'string') { - return true; + export function from(value: { executable?: string, args?: string[] }): TaskSystem.ShellConfiguration { + if (value === void 0 || value === null || !value.executable) { + return undefined; } let result: TaskSystem.ShellConfiguration = { @@ -323,7 +329,7 @@ namespace Tasks { let result: TaskSystem.CommandConfiguration = { name: value.process, args: Strings.from(value.args), - isShellCommand: false, + type: TaskSystem.CommandType.Process, terminal: TerminalBehaviour.from(value.terminal) }; if (value.options) { @@ -338,7 +344,7 @@ namespace Tasks { } let result: TaskSystem.CommandConfiguration = { name: value.commandLine, - isShellCommand: ShellConfiguration.from(value.options), + type: TaskSystem.CommandType.Shell, terminal: TerminalBehaviour.from(value.terminal) }; if (value.options) { diff --git a/src/vs/workbench/parts/tasks/browser/quickOpen.ts b/src/vs/workbench/parts/tasks/browser/quickOpen.ts index 6c9afcd0b74..e282ee68321 100644 --- a/src/vs/workbench/parts/tasks/browser/quickOpen.ts +++ b/src/vs/workbench/parts/tasks/browser/quickOpen.ts @@ -97,10 +97,10 @@ export abstract class QuickOpenHandler extends Quickopen.QuickOpenHandler { if (task._source.kind === TaskSourceKind.Workspace && groupWorkspace) { groupWorkspace = false; hadWorkspace = true; - entries.push(new TaskGroupEntry(this.createEntry(this.taskService, task, highlights), nls.localize('workspace', 'From Workspace'), false)); + entries.push(new TaskGroupEntry(this.createEntry(this.taskService, task, highlights), nls.localize('configured', 'Configured Tasks'), false)); } else if (task._source.kind === TaskSourceKind.Extension && groupExtension) { groupExtension = false; - entries.push(new TaskGroupEntry(this.createEntry(this.taskService, task, highlights), nls.localize('extension', 'From Extensions'), hadWorkspace)); + entries.push(new TaskGroupEntry(this.createEntry(this.taskService, task, highlights), nls.localize('detected', 'Detected Tasks'), hadWorkspace)); } else { entries.push(this.createEntry(this.taskService, task, highlights)); } @@ -125,7 +125,7 @@ class CustomizeTaskAction extends Action { private static ID = 'workbench.action.tasks.customizeTask'; private static LABEL = nls.localize('customizeTask', "Customize Task"); - constructor() { + constructor(private taskService: ITaskService, private task: Task) { super(CustomizeTaskAction.ID, CustomizeTaskAction.LABEL); this.updateClass(); } @@ -134,14 +134,14 @@ class CustomizeTaskAction extends Action { this.class = 'quick-open-task-configure'; } - public run(context: any): TPromise { - return TPromise.as(false); + public run(context: any): TPromise { + return this.taskService.customize(this.task, true).then(_ => false, _ => false); } } export class QuickOpenActionContributor extends ActionBarContributor { - constructor() { + constructor( @ITaskService private taskService: ITaskService) { super(); } @@ -156,7 +156,7 @@ export class QuickOpenActionContributor extends ActionBarContributor { const entry = this.getEntry(context); if (entry && entry.task._source.kind === TaskSourceKind.Extension) { - actions.push(new CustomizeTaskAction()); + actions.push(new CustomizeTaskAction(this.taskService, entry.task)); } return actions; } diff --git a/src/vs/workbench/parts/tasks/common/taskConfiguration.ts b/src/vs/workbench/parts/tasks/common/taskConfiguration.ts index b06f6c15bf3..9af9833e240 100644 --- a/src/vs/workbench/parts/tasks/common/taskConfiguration.ts +++ b/src/vs/workbench/parts/tasks/common/taskConfiguration.ts @@ -11,7 +11,6 @@ import { IStringDictionary } from 'vs/base/common/collections'; import * as Platform from 'vs/base/common/platform'; import * as Types from 'vs/base/common/types'; import * as UUID from 'vs/base/common/uuid'; -import { Config as ProcessConfig } from 'vs/base/common/processes'; import { ValidationStatus, IProblemReporter as IProblemReporterBase } from 'vs/base/common/parsers'; import { @@ -32,7 +31,37 @@ export class ProblemHandling { public static clean: string = 'cleanMatcherMatchers'; } +export interface ShellConfiguration { + executable: string; + args?: string[]; +} + +export interface CommandOptions { + /** + * The current working directory of the executed program or shell. + * If omitted VSCode's current workspace root is used. + */ + cwd?: string; + + /** + * The additional environment of the executed program or shell. If omitted + * the parent process' environment is used. + */ + env?: IStringDictionary; + + /** + * The shell configuration; + */ + shell?: ShellConfiguration; +} + export interface PlatformTaskDescription { + + /** + * Whether the task is a shell task or a process task. + */ + type?: string; + /** * The command to be executed. Can be an external program or a shell * command. @@ -40,17 +69,18 @@ export interface PlatformTaskDescription { command?: string; /** + * @deprecated use the task type instead. * Specifies whether the command is a shell command and therefore must * be executed in a shell interpreter (e.g. cmd.exe, bash, ...). * * Defaults to false if omitted. */ - isShellCommand?: boolean; + isShellCommand?: boolean | ShellConfiguration; /** * The command options used when the command is executed. Can be omitted. */ - options?: ProcessConfig.CommandOptions; + options?: CommandOptions; /** * The arguments passed to the command or additional arguments passed to the @@ -166,7 +196,7 @@ export interface BaseTaskRunnerConfiguration { /** * The command options used when the command is executed. Can be omitted. */ - options?: ProcessConfig.CommandOptions; + options?: CommandOptions; /** * The arguments passed to the command. Can be omitted. @@ -308,7 +338,7 @@ interface ParseContext { } namespace CommandOptions { - export function from(this: void, options: ProcessConfig.CommandOptions, context: ParseContext): Tasks.CommandOptions { + export function from(this: void, options: CommandOptions, context: ParseContext): Tasks.CommandOptions { let result: Tasks.CommandOptions = {}; if (options.cwd !== void 0) { if (Types.isString(options.cwd)) { @@ -320,11 +350,12 @@ namespace CommandOptions { if (options.env !== void 0) { result.env = Objects.clone(options.env); } + result.shell = ShellConfiguration.from(options.shell, context); return isEmpty(result) ? undefined : result; } export function isEmpty(value: Tasks.CommandOptions): boolean { - return !value || value.cwd === void 0 && value.env === void 0; + return !value || value.cwd === void 0 && value.env === void 0 && value.shell === void 0; } export function merge(target: Tasks.CommandOptions, source: Tasks.CommandOptions): Tasks.CommandOptions { @@ -343,6 +374,7 @@ namespace CommandOptions { Object.keys(source.env).forEach(key => env[key = source.env[key]]); target.env = env; } + target.shell = ShellConfiguration.merge(target.shell, source.shell); return target; } @@ -356,6 +388,7 @@ namespace CommandOptions { if (value.cwd === void 0) { value.cwd = '${workspaceRoot}'; } + ShellConfiguration.fillDefaults(value.shell); return value; } @@ -364,14 +397,10 @@ namespace CommandOptions { if (value.env) { Object.freeze(value.env); } + ShellConfiguration.freeze(value.shell); } } -interface ShellConfiguration { - executable: string; - args?: string[]; -} - namespace ShellConfiguration { export function is(value: any): value is ShellConfiguration { let candidate: ShellConfiguration = value; @@ -424,9 +453,10 @@ namespace CommandConfiguration { interface BaseCommandConfiguationShape { command?: string; + type?: string; isShellCommand?: boolean | ShellConfiguration; args?: string[]; - options?: ProcessConfig.CommandOptions; + options?: CommandOptions; echoCommand?: boolean; showOutput?: string; terminal?: TerminalBehavior; @@ -524,21 +554,20 @@ namespace CommandConfiguration { function fromBase(this: void, config: BaseCommandConfiguationShape, context: ParseContext): Tasks.CommandConfiguration { let result: Tasks.CommandConfiguration = { name: undefined, - isShellCommand: undefined, + type: undefined, terminal: undefined }; if (Types.isString(config.command)) { result.name = config.command; } - if (Types.isBoolean(config.isShellCommand)) { - result.isShellCommand = config.isShellCommand; - } else if (ShellConfiguration.is(config.isShellCommand)) { - result.isShellCommand = ShellConfiguration.from(config.isShellCommand, context); - if (!context.isTermnial) { - context.problemReporter.warn(nls.localize('ConfigurationParser.noShell', 'Warning: shell configuration is only supported when executing tasks in the terminal.')); - } + if (Types.isString(config.type)) { + result.type = Tasks.CommandType.fromString(config.type); + } + let isShellConfiguration = ShellConfiguration.is(config.isShellCommand); + if (Types.isBoolean(config.isShellCommand) || isShellConfiguration) { + result.type = Tasks.CommandType.Shell; } else if (config.isShellCommand !== void 0) { - result.isShellCommand = !!config.isShellCommand; + result.type = !!config.isShellCommand ? Tasks.CommandType.Shell : Tasks.CommandType.Process; } if (config.args !== void 0) { if (Types.isStringArray(config.args)) { @@ -549,6 +578,12 @@ namespace CommandConfiguration { } if (config.options !== void 0) { result.options = CommandOptions.from(config.options, context); + if (result.options && result.options.shell === void 0 && isShellConfiguration) { + result.options.shell = ShellConfiguration.from(config.isShellCommand as ShellConfiguration, context); + if (!context.isTermnial) { + context.problemReporter.warn(nls.localize('ConfigurationParser.noShell', 'Warning: shell configuration is only supported when executing tasks in the terminal.')); + } + } } let terminal = TerminalBehavior.from(config, context); if (terminal) { @@ -561,13 +596,13 @@ namespace CommandConfiguration { } export function isEmpty(value: Tasks.CommandConfiguration): boolean { - return !value || value.name === void 0 && value.isShellCommand === void 0 && value.args === void 0 && CommandOptions.isEmpty(value.options) && value.terminal === void 0; + return !value || value.name === void 0 && value.type === void 0 && value.args === void 0 && CommandOptions.isEmpty(value.options) && value.terminal === void 0; } export function onlyTerminalBehaviour(value: Tasks.CommandConfiguration): boolean { return value && - value.terminal && (value.terminal.echo !== void 0 || value.terminal.reveal === void 0) && - value.name === void 0 && value.isShellCommand === void 0 && value.args === void 0 && CommandOptions.isEmpty(value.options); + value.terminal && (value.terminal.echo !== void 0 || value.terminal.reveal !== void 0) && + value.name === void 0 && value.type === void 0 && value.args === void 0 && CommandOptions.isEmpty(value.options); } export function merge(target: Tasks.CommandConfiguration, source: Tasks.CommandConfiguration): Tasks.CommandConfiguration { @@ -578,15 +613,10 @@ namespace CommandConfiguration { return source; } mergeProperty(target, source, 'name'); + mergeProperty(target, source, 'type'); // Merge isShellCommand - if (target.isShellCommand === void 0) { - target.isShellCommand = source.isShellCommand; - } if (Types.isBoolean(target.isShellCommand) && Types.isBoolean(source.isShellCommand)) { - mergeProperty(target, source, 'isShellCommand'); - } else if (ShellConfiguration.is(target.isShellCommand) && ShellConfiguration.is(source.isShellCommand)) { - ShellConfiguration.merge(target.isShellCommand, source.isShellCommand); - } else if (Types.isBoolean(target.isShellCommand) && ShellConfiguration.is(source.isShellCommand)) { - target.isShellCommand = source.isShellCommand; + if (target.type === void 0) { + target.type = source.type; } target.terminal = TerminalBehavior.merge(target.terminal, source.terminal); @@ -606,8 +636,8 @@ namespace CommandConfiguration { if (!value || Object.isFrozen(value)) { return; } - if (value.name !== void 0 && value.isShellCommand === void 0) { - value.isShellCommand = false; + if (value.name !== void 0 && value.type === void 0) { + value.type = Tasks.CommandType.Process; } value.terminal = TerminalBehavior.fillDefault(value.terminal); if (value.args === void 0) { @@ -629,9 +659,6 @@ namespace CommandConfiguration { if (value.terminal) { TerminalBehavior.freeze(value.terminal); } - if (ShellConfiguration.is(value.isShellCommand)) { - ShellConfiguration.freeze(value.isShellCommand); - } } } @@ -751,7 +778,7 @@ namespace TaskDescription { let command: Tasks.CommandConfiguration = externalTask.command !== void 0 ? CommandConfiguration.from(externalTask, context) : externalTask.echoCommand !== void 0 - ? { name: undefined, isShellCommand: undefined, terminal: CommandConfiguration.TerminalBehavior.from(externalTask, context) } + ? { name: undefined, type: undefined, terminal: CommandConfiguration.TerminalBehavior.from(externalTask, context) } : undefined; let identifer = Types.isString(externalTask.identifier) ? externalTask.identifier : taskName; let task: Tasks.Task = { @@ -797,7 +824,7 @@ namespace TaskDescription { } fillDefaults(task); let addTask: boolean = true; - if (context.isTermnial && task.command && task.command.name && task.command.isShellCommand && task.command.args && task.command.args.length > 0) { + if (context.isTermnial && task.command && task.command.name && task.command.type === Tasks.CommandType.Shell && task.command.args && task.command.args.length > 0) { if (hasUnescapedSpaces(task.command.name) || task.command.args.some(hasUnescapedSpaces)) { context.problemReporter.warn(nls.localize('taskConfiguration.shellArgs', 'Warning: the task \'{0}\' is a shell command and either the command name or one of its arguments has unescaped spaces. To ensure correct command line quoting please merge args into the command.', task.name)); } diff --git a/src/vs/workbench/parts/tasks/common/taskService.ts b/src/vs/workbench/parts/tasks/common/taskService.ts index 53f92ee18ee..63b2da04137 100644 --- a/src/vs/workbench/parts/tasks/common/taskService.ts +++ b/src/vs/workbench/parts/tasks/common/taskService.ts @@ -43,6 +43,8 @@ export interface ITaskService extends IEventEmitter { terminateAll(): TPromise; tasks(): TPromise; + customize(task: Task, openConfig?: boolean): TPromise; + registerTaskProvider(handle: number, taskProvider: ITaskProvider): void; unregisterTaskProvider(handle: number): boolean; } \ No newline at end of file diff --git a/src/vs/workbench/parts/tasks/common/taskTemplates.ts b/src/vs/workbench/parts/tasks/common/taskTemplates.ts index 0d7253582b8..ca345475266 100644 --- a/src/vs/workbench/parts/tasks/common/taskTemplates.ts +++ b/src/vs/workbench/parts/tasks/common/taskTemplates.ts @@ -14,104 +14,6 @@ export interface TaskEntry extends IPickOpenEntry { content: string; } -const gulp: TaskEntry = { - id: 'gulp', - label: 'Gulp', - autoDetect: true, - content: [ - '{', - '\t// See https://go.microsoft.com/fwlink/?LinkId=733558', - '\t// for the documentation about the tasks.json format', - '\t"version": "2.0.0",', - '\t"command": "gulp --no-color",', - '\t"isShellCommand": true,', - '}' - ].join('\n') -}; - -const grunt: TaskEntry = { - id: 'grunt', - label: 'Grunt', - autoDetect: true, - content: [ - '{', - '\t// See https://go.microsoft.com/fwlink/?LinkId=733558', - '\t// for the documentation about the tasks.json format', - '\t"version": "2.0.0",', - '\t"command": "grunt --no-color",', - '\t"isShellCommand": true,', - '}' - ].join('\n') -}; - -const npm: TaskEntry = { - id: 'npm', - label: 'npm', - sort: 'NPM', - autoDetect: false, - content: [ - '{', - '\t// See https://go.microsoft.com/fwlink/?LinkId=733558', - '\t// for the documentation about the tasks.json format', - '\t"version": "2.0.0",', - '\t"tasks": [', - '\t\t{', - '\t\t\t"taskName": "install",', - '\t\t\t"command": "npm install",', - '\t\t\t"isShellCommand": true,', - '\t\t},', - '\t\t{', - '\t\t\t"taskName": "update",', - '\t\t\t"command": "npm update",', - '\t\t\t"isShellCommand": true,', - '\t\t},', - '\t\t{', - '\t\t\t"taskName": "test",', - '\t\t\t"command": "npm run test",', - '\t\t\t"isShellCommand": true,', - '\t\t}', - '\t]', - '}' - ].join('\n') -}; - -const tscConfig: TaskEntry = { - id: 'tsc.config', - label: 'TypeScript - tsconfig.json', - autoDetect: false, - description: nls.localize('tsc.config', 'Compiles a TypeScript project'), - content: [ - '{', - '\t// See https://go.microsoft.com/fwlink/?LinkId=733558', - '\t// for the documentation about the tasks.json format', - '\t"version": "2.0.0",', - '\t"command": "tsc -p .",', - '\t"isShellCommand": true,', - '\t"showOutput": "silent",', - '\t"problemMatcher": "$tsc"', - '}' - ].join('\n') -}; - -const tscWatch: TaskEntry = { - id: 'tsc.watch', - label: 'TypeScript - Watch Mode', - autoDetect: false, - description: nls.localize('tsc.watch', 'Compiles a TypeScript project in watch mode'), - content: [ - '{', - '\t// See https://go.microsoft.com/fwlink/?LinkId=733558', - '\t// for the documentation about the tasks.json format', - '\t"version": "2.0.0",', - '\t"command": "tsc -w -p .",', - '\t"isShellCommand": true,', - '\t"showOutput": "silent",', - '\t"isBackground": true,', - '\t"problemMatcher": "$tsc-watch"', - '}' - ].join('\n') -}; - const dotnetBuild: TaskEntry = { id: 'dotnetCore', label: '.NET Core', @@ -122,16 +24,16 @@ const dotnetBuild: TaskEntry = { '{', '\t// See https://go.microsoft.com/fwlink/?LinkId=733558', '\t// for the documentation about the tasks.json format', - '\t"version": "0.1.0",', - '\t"command": "dotnet",', - '\t"isShellCommand": true,', - '\t"args": [],', + '\t"version": "2.0.0",', '\t"tasks": [', '\t\t{', '\t\t\t"taskName": "build",', - '\t\t\t"args": [ ],', - '\t\t\t"isBuildCommand": true,', - '\t\t\t"showOutput": "silent",', + '\t\t\t"command": "dotnet",', + '\t\t\t"isShellCommand": true,', + '\t\t\t"group": "build",', + '\t\t\t"terminal": {', + '\t\t\t\t"reveal": "silent"', + '\t\t\t},', '\t\t\t"problemMatcher": "$msCompile"', '\t\t}', '\t]', @@ -149,18 +51,20 @@ const msbuild: TaskEntry = { '\t// See https://go.microsoft.com/fwlink/?LinkId=733558', '\t// for the documentation about the tasks.json format', '\t"version": "2.0.0",', - '\t"command": "msbuild",', - '\t"args": [', - '\t\t// Ask msbuild to generate full paths for file names.', - '\t\t"/property:GenerateFullPaths=true"', - '\t],', - '\t"taskSelector": "/t:",', - '\t"showOutput": "silent",', '\t"tasks": [', '\t\t{', '\t\t\t"taskName": "build",', - '\t\t\t// Show the output window only if unrecognized errors occur.', - '\t\t\t"showOutput": "silent",', + '\t\t\t"command": "msbuild",', + '\t\t\t"args": [', + '\t\t\t\t// Ask msbuild to generate full paths for file names.', + '\t\t\t\t"/property:GenerateFullPaths=true",', + '\t\t\t\t"/t:build"', + '\t\t\t],', + '\t\t\t"group": "build",', + '\t\t\t"terminal": {', + '\t\t\t\t// Reveal the terminal only if unrecognized errors occur.', + '\t\t\t\t"reveal": "silent"', + '\t\t\t},', '\t\t\t// Use the standard MS compiler pattern to detect errors, warnings and infos', '\t\t\t"problemMatcher": "$msCompile"', '\t\t}', @@ -201,26 +105,25 @@ const maven: TaskEntry = { '\t// See https://go.microsoft.com/fwlink/?LinkId=733558', '\t// for the documentation about the tasks.json format', '\t"version": "2.0.0",', - '\t"showOutput": "always",', '\t"tasks": [', '\t\t{', '\t\t\t"taskName": "verify",', '\t\t\t"command": "mvn -B verify",', '\t\t\t"isShellCommand": true,', - '\t\t\t"isBuildCommand": true', + '\t\t\t"group": "build"', '\t\t},', '\t\t{', '\t\t\t"taskName": "test",', '\t\t\t"command": "mvn -B test",', '\t\t\t"isShellCommand": true,', - '\t\t\t"isTestCommand": true', + '\t\t\t"group": "test"', '\t\t}', '\t]', '}' ].join('\n') }; -export let templates: TaskEntry[] = [gulp, grunt, tscConfig, tscWatch, dotnetBuild, msbuild, npm, maven].sort((a, b) => { +export let templates: TaskEntry[] = [dotnetBuild, msbuild, maven].sort((a, b) => { return (a.sort || a.label).localeCompare(b.sort || b.label); }); templates.push(command); diff --git a/src/vs/workbench/parts/tasks/common/tasks.ts b/src/vs/workbench/parts/tasks/common/tasks.ts index 4b3031da91f..c3e90f83fb6 100644 --- a/src/vs/workbench/parts/tasks/common/tasks.ts +++ b/src/vs/workbench/parts/tasks/common/tasks.ts @@ -9,20 +9,6 @@ import * as Types from 'vs/base/common/types'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { ProblemMatcher } from 'vs/platform/markers/common/problemMatcher'; -export interface CommandOptions { - /** - * The current working directory of the executed program or shell. - * If omitted VSCode's current workspace root is used. - */ - cwd?: string; - - /** - * The environment of the executed program or shell. If omitted - * the parent process' environment is used. - */ - env?: { [key: string]: string; }; -} - export interface ShellConfiguration { /** * The shell executable. @@ -41,6 +27,26 @@ export namespace ShellConfiguration { } } +export interface CommandOptions { + + /** + * The shell to use if the task is a shell command. + */ + shell?: ShellConfiguration; + + /** + * The current working directory of the executed program or shell. + * If omitted VSCode's current workspace root is used. + */ + cwd?: string; + + /** + * The environment of the executed program or shell. If omitted + * the parent process' environment is used. + */ + env?: { [key: string]: string; }; +} + export enum RevealKind { /** * Always brings the terminal to front if the task is executed. @@ -87,17 +93,36 @@ export interface TerminalBehavior { echo: boolean; } +export enum CommandType { + Shell = 1, + Process = 2 +} + +export namespace CommandType { + export function fromString(value: string): CommandType { + switch (value.toLowerCase()) { + case 'shell': + return CommandType.Shell; + case 'process': + return CommandType.Process; + default: + return CommandType.Process; + } + } +} + export interface CommandConfiguration { + + /** + * The task type + */ + type: CommandType; + /** * The command to execute */ name: string; - /** - * Whether the command is a shell command or not - */ - isShellCommand: boolean | ShellConfiguration; - /** * Additional command options. */ diff --git a/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts b/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts index 4ece04baf2e..2efb28f4d6a 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts @@ -104,6 +104,13 @@ const group: IJSONSchema = { description: nls.localize('JsonSchema.tasks.group', 'Defines to which execution group this task belongs to. If omitted the task belongs to no group') }; +const taskType: IJSONSchema = { + type: 'string', + enum: ['shell', 'process'], + default: 'process', + description: nls.localize('JsonSchema.tasks.type', 'Defines whether the task is run as a process or as a command inside a shell. Default is process') +}; + schema.definitions = Objects.deepClone(commonSchema.definitions); let definitions = schema.definitions; definitions.commandConfiguration.properties.isShellCommand = Objects.deepClone(shellCommand); @@ -113,6 +120,8 @@ definitions.showOutputType.deprecationMessage = nls.localize('JsonSchema.tasks.s definitions.taskDescription.properties.echoCommand.deprecationMessage = nls.localize('JsonSchema.tasks.echoCommand.deprecated', 'The property echoCommand is deprecated. Use the terminal property instead.'); definitions.taskDescription.properties.isBuildCommand.deprecationMessage = nls.localize('JsonSchema.tasks.isBuildCommand.deprecated', 'The property isBuildCommand is deprecated. Use the group property instead.'); definitions.taskDescription.properties.isTestCommand.deprecationMessage = nls.localize('JsonSchema.tasks.isTestCommand.deprecated', 'The property isTestCommand is deprecated. Use the group property instead.'); +definitions.taskDescription.properties.type = taskType; +definitions.taskDescription.properties.isShellCommand.deprecationMessage = nls.localize('JsonSchema.tasks.isShellCommand.deprecated', 'The property isShellCommand is deprecated. Use the type property instead.'); definitions.taskDescription.properties.terminal = terminal; definitions.taskDescription.properties.group = group; definitions.taskRunnerConfiguration.properties.isShellCommand = Objects.deepClone(shellCommand); diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index 98b390f2f21..49c14ca2110 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -61,6 +61,7 @@ import Constants from 'vs/workbench/parts/markers/common/constants'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; +import { IConfigurationEditingService, ConfigurationTarget } from 'vs/workbench/services/configuration/common/configurationEditing'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; @@ -118,40 +119,13 @@ abstract class OpenTaskConfigurationAction extends Action { if (!selection) { return undefined; } - let contentPromise: TPromise; - if (selection.autoDetect) { - contentPromise = this.extensionService.activateByEvent('onCommand:workbench.action.tasks.runTask').then(() => { - return this.taskService.tasks().then((tasks) => { - let tasksToInsert: Task[] = tasks.filter((task) => { - return task.identifier && task.identifier.indexOf(selection.id) === 0 && task.identifier[selection.id.length] === '.' && task.group !== void 0; - }); - if (tasksToInsert.length === 0) { - return selection.content; - } - let config: TaskConfig.ExternalTaskRunnerConfiguration = { - version: '2.0.0', - tasks: tasksToInsert.map((task) => { return { taskName: task.name }; }) - }; - let content = JSON.stringify(config, null, '\t'); - content = [ - '{', - '\t// See https://go.microsoft.com/fwlink/?LinkId=733558', - '\t// for the documentation about the tasks.json format', - ].join('\n') + content.substr(1); - return content; - }); - }); - } else { - contentPromise = TPromise.as(selection.content); + let content = selection.content; + let editorConfig = this.configurationService.getConfiguration(); + if (editorConfig.editor.insertSpaces) { + content = content.replace(/(\n)(\t+)/g, (_, s1, s2) => s1 + strings.repeat(' ', s2.length * editorConfig.editor.tabSize)); } - return contentPromise.then(content => { - let editorConfig = this.configurationService.getConfiguration(); - if (editorConfig.editor.insertSpaces) { - content = content.replace(/(\n)(\t+)/g, (_, s1, s2) => s1 + strings.repeat(' ', s2.length * editorConfig.editor.tabSize)); - } - configFileCreated = true; - return this.fileService.createFile(this.contextService.toResource('.vscode/tasks.json'), content); - }); + configFileCreated = true; + return this.fileService.createFile(this.contextService.toResource('.vscode/tasks.json'), content); }); }).then((stat) => { if (!stat) { @@ -187,7 +161,6 @@ class ConfigureTaskRunnerAction extends OpenTaskConfigurationAction { outputService, messageService, quickOpenService, environmentService, configurationResolverService, extensionService); } - } class ConfigureBuildTaskAction extends OpenTaskConfigurationAction { @@ -503,6 +476,7 @@ class TaskService extends EventEmitter implements ITaskService { private modeService: IModeService; private configurationService: IConfigurationService; + private configurationEditingService: IConfigurationEditingService; private markerService: IMarkerService; private outputService: IOutputService; private messageService: IMessageService; @@ -526,6 +500,7 @@ class TaskService extends EventEmitter implements ITaskService { private _outputChannel: IOutputChannel; constructor( @IModeService modeService: IModeService, @IConfigurationService configurationService: IConfigurationService, + @IConfigurationEditingService configurationEditingService: IConfigurationEditingService, @IMarkerService markerService: IMarkerService, @IOutputService outputService: IOutputService, @IMessageService messageService: IMessageService, @IWorkbenchEditorService editorService: IWorkbenchEditorService, @IFileService fileService: IFileService, @IWorkspaceContextService contextService: IWorkspaceContextService, @@ -542,6 +517,7 @@ class TaskService extends EventEmitter implements ITaskService { super(); this.modeService = modeService; this.configurationService = configurationService; + this.configurationEditingService = configurationEditingService; this.markerService = markerService; this.outputService = outputService; this.messageService = messageService; @@ -723,6 +699,43 @@ class TaskService extends EventEmitter implements ITaskService { }); } + public customize(task: Task, openConfig: boolean = false): TPromise { + if (task._source.kind !== TaskSourceKind.Extension) { + return TPromise.as(undefined); + } + let configuration = this.getConfiguration(); + if (configuration.hasParseErrors) { + this.messageService.show(Severity.Warning, nls.localize('customizeParseErrors', 'The current task configuration has errors. Please fix the errors first before customizing a task.')); + return TPromise.as(undefined); + } + let fileConfig = configuration.config; + let customize = { taskName: task.name }; + if (!fileConfig) { + fileConfig = { + version: '2.0.0', + tasks: [customize] + }; + } else { + if (Array.isArray(fileConfig.tasks)) { + fileConfig.tasks.push(customize); + } else { + fileConfig.tasks = [customize]; + } + }; + return this.configurationEditingService.writeConfiguration(ConfigurationTarget.WORKSPACE, { key: 'tasks', value: fileConfig }).then(() => { + if (openConfig) { + let resource = this.contextService.toResource('.vscode/tasks.json'); + this.editorService.openEditor({ + resource: resource, + options: { + forceOpen: true, + pinned: false + } + }, false); + } + }); + } + private createRunnableTask(sets: TaskSet[], group: TaskGroup): { task: Task; resolver: ITaskResolver } { let uuidMap: IStringDictionary = Object.create(null); let identifierMap: IStringDictionary = Object.create(null); @@ -740,6 +753,8 @@ class TaskService extends EventEmitter implements ITaskService { if (primaryTasks.length === 0) { return undefined; } + // check for a WORKSPACE build task and use that onemptied.apply + let resolver: ITaskResolver = { resolve: (id: string) => { let result = uuidMap[id]; diff --git a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts b/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts index 504d0114385..bf6065aa66a 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts @@ -33,7 +33,7 @@ import { IConfigurationResolverService } from 'vs/workbench/services/configurati import { ITerminalService, ITerminalInstance, IShellLaunchConfig } from 'vs/workbench/parts/terminal/common/terminal'; import { IOutputService, IOutputChannel } from 'vs/workbench/parts/output/common/output'; import { StartStopProblemCollector, WatchingProblemCollector, ProblemCollectorEvents } from 'vs/workbench/parts/tasks/common/problemCollectors'; -import { Task, RevealKind, CommandOptions, ShellConfiguration } from 'vs/workbench/parts/tasks/common/tasks'; +import { Task, RevealKind, CommandOptions, ShellConfiguration, CommandType } from 'vs/workbench/parts/tasks/common/tasks'; import { ITaskSystem, ITaskSummary, ITaskExecuteResult, TaskExecuteKind, TaskError, TaskErrors, ITaskResolver, TelemetryEvent, Triggers, TaskSystemEvents, TaskEvent, TaskType @@ -368,17 +368,19 @@ export class TerminalTaskSystem extends EventEmitter implements ITaskSystem { let terminalName = nls.localize('TerminalTaskSystem.terminalName', 'Task - {0}', task.name); let waitOnExit = task.command.terminal.reveal !== RevealKind.Never || !task.isBackground; let shellLaunchConfig: IShellLaunchConfig = undefined; - if (task.command.isShellCommand) { + let isShellCommand = task.command.type === CommandType.Shell; + if (isShellCommand) { if (Platform.isWindows && ((options.cwd && TPath.isUNC(options.cwd)) || (!options.cwd && TPath.isUNC(process.cwd())))) { throw new TaskError(Severity.Error, nls.localize('TerminalTaskSystem', 'Can\'t execute a shell command on an UNC drive.'), TaskErrors.UnknownError); } shellLaunchConfig = { name: terminalName, executable: null, args: null, waitOnExit }; let shellSpecified: boolean = false; - if (ShellConfiguration.is(task.command.isShellCommand)) { - shellLaunchConfig.executable = task.command.isShellCommand.executable; + let shellOptions: ShellConfiguration = task.command.options && task.command.options.shell; + if (shellOptions && shellOptions.executable) { + shellLaunchConfig.executable = shellOptions.executable; shellSpecified = true; - if (task.command.isShellCommand.args) { - shellLaunchConfig.args = task.command.isShellCommand.args.slice(); + if (shellOptions.args) { + shellLaunchConfig.args = shellOptions.args.slice(); } else { shellLaunchConfig.args = []; } @@ -422,7 +424,7 @@ export class TerminalTaskSystem extends EventEmitter implements ITaskSystem { let cwd = options && options.cwd ? options.cwd : process.cwd(); // On Windows executed process must be described absolute. Since we allowed command without an // absolute path (e.g. "command": "node") we need to find the executable in the CWD or PATH. - let executable = Platform.isWindows && !task.command.isShellCommand ? this.findExecutable(command, cwd) : command; + let executable = Platform.isWindows && !isShellCommand ? this.findExecutable(command, cwd) : command; shellLaunchConfig = { name: terminalName, executable: executable, diff --git a/src/vs/workbench/parts/tasks/node/processTaskSystem.ts b/src/vs/workbench/parts/tasks/node/processTaskSystem.ts index 848368e6dc4..2a1fcb76e73 100644 --- a/src/vs/workbench/parts/tasks/node/processTaskSystem.ts +++ b/src/vs/workbench/parts/tasks/node/processTaskSystem.ts @@ -29,7 +29,7 @@ import { StartStopProblemCollector, WatchingProblemCollector, ProblemCollectorEv import { ITaskSystem, ITaskSummary, ITaskExecuteResult, TaskExecuteKind, TaskError, TaskErrors, TelemetryEvent, Triggers, TaskSystemEvents, TaskEvent, TaskType } from 'vs/workbench/parts/tasks/common/taskSystem'; -import { Task, CommandOptions, RevealKind, CommandConfiguration } from 'vs/workbench/parts/tasks/common/tasks'; +import { Task, CommandOptions, RevealKind, CommandConfiguration, CommandType } from 'vs/workbench/parts/tasks/common/tasks'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; @@ -175,7 +175,7 @@ export class ProcessTaskSystem extends EventEmitter implements ITaskSystem { } args = this.resolveVariables(args); let command: string = this.resolveVariable(commandConfig.name); - this.childProcess = new LineProcess(command, args, !!commandConfig.isShellCommand, this.resolveOptions(commandConfig.options)); + this.childProcess = new LineProcess(command, args, commandConfig.type === CommandType.Shell, this.resolveOptions(commandConfig.options)); telemetryEvent.command = this.childProcess.getSanitizedCommand(); // we have no problem matchers defined. So show the output log let reveal = task.command.terminal.reveal; diff --git a/src/vs/workbench/parts/tasks/test/node/configuration.test.ts b/src/vs/workbench/parts/tasks/test/node/configuration.test.ts index 091899e941a..03610ad7ecc 100644 --- a/src/vs/workbench/parts/tasks/test/node/configuration.test.ts +++ b/src/vs/workbench/parts/tasks/test/node/configuration.test.ts @@ -96,7 +96,7 @@ class CommandConfigurationBuilder { this.terminalBuilder = new TerminalBehaviorBuilder(this); this.result = { name: command, - isShellCommand: false, + type: Tasks.CommandType.Process, args: [], options: { cwd: '${workspaceRoot}' @@ -110,8 +110,8 @@ class CommandConfigurationBuilder { return this; } - public shell(value: boolean): CommandConfigurationBuilder { - this.result.isShellCommand = value; + public type(value: Tasks.CommandType): CommandConfigurationBuilder { + this.result.type = value; return this; } @@ -433,7 +433,7 @@ function assertCommandConfiguration(actual: Tasks.CommandConfiguration, expected if (actual && expected) { assertTerminalBehavior(actual.terminal, expected.terminal); assert.strictEqual(actual.name, expected.name, 'name'); - assert.strictEqual(actual.isShellCommand, expected.isShellCommand, 'isShellCommand'); + assert.strictEqual(actual.type, expected.type, 'task type'); assert.deepEqual(actual.args, expected.args, 'args'); assert.strictEqual(typeof actual.options, typeof expected.options); if (actual.options && expected.options) { @@ -531,7 +531,7 @@ suite('Tasks Configuration parsing tests', () => { group(Tasks.TaskGroup.Build). suppressTaskName(true). command(). - shell(true); + type(Tasks.CommandType.Shell); testConfiguration( { version: '0.1.0', @@ -730,7 +730,7 @@ suite('Tasks Configuration parsing tests', () => { group(Tasks.TaskGroup.Build). suppressTaskName(true). command(). - shell(true); + type(Tasks.CommandType.Shell); let external: ExternalTaskRunnerConfiguration = { version: '0.1.0', command: 'tsc', @@ -1280,7 +1280,7 @@ suite('Tasks Configuration parsing tests', () => { }; let builder = new ConfiguationBuilder(); builder.task('taskNameOne', 'tsc').suppressTaskName(true).command(). - shell(true).args(['arg']).options({ cwd: 'cwd', env: { env: 'env' } }); + type(Tasks.CommandType.Shell).args(['arg']).options({ cwd: 'cwd', env: { env: 'env' } }); testConfiguration(external, builder); }); @@ -1355,7 +1355,7 @@ suite('Tasks Configuration parsing tests', () => { ] }; let builder = new ConfiguationBuilder(); - builder.task('taskNameOne', 'tsc').command().shell(false); + builder.task('taskNameOne', 'tsc').command().type(Tasks.CommandType.Process); testConfiguration(external, builder); }); }); From 447622435ae4745a0a4b9b7033e178d399c82b88 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Fri, 26 May 2017 15:17:19 +0200 Subject: [PATCH 1094/1164] Remove ProblemMatchers from API. --- src/vs/vscode.d.ts | 215 +----------------- src/vs/workbench/api/node/extHost.api.impl.ts | 2 - src/vs/workbench/api/node/extHostTask.ts | 8 +- src/vs/workbench/api/node/extHostTypes.ts | 20 +- .../workbench/parts/tasks/common/task.api.ts | 213 +++++++++++++++++ 5 files changed, 231 insertions(+), 227 deletions(-) create mode 100644 src/vs/workbench/parts/tasks/common/task.api.ts diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index e9645e8147d..f9587fccbe0 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3509,215 +3509,6 @@ declare module 'vscode' { update(key: string, value: any): Thenable; } - /** - * Defines a problem pattern - */ - export interface ProblemPattern { - - /** - * The regular expression to find a problem in the console output of an - * executed task. - */ - regexp: RegExp; - - /** - * The match group index of the filename. - * - * Defaults to 1 if omitted. - */ - file?: number; - - /** - * The match group index of the problems's location. Valid location - * patterns are: (line), (line,column) and (startLine,startColumn,endLine,endColumn). - * If omitted the line and colum properties are used. - */ - location?: number; - - /** - * The match group index of the problem's line in the source file. - * - * Defaults to 2 if omitted. - */ - line?: number; - - /** - * The match group index of the problem's character in the source file. - * - * Defaults to 3 if omitted. - */ - character?: number; - - /** - * The match group index of the problem's end line in the source file. - * - * Defaults to undefined. No end line is captured. - */ - endLine?: number; - - /** - * The match group index of the problem's end character in the source file. - * - * Defaults to undefined. No end column is captured. - */ - endCharacter?: number; - - /** - * The match group index of the problem's severity. - * - * Defaults to undefined. In this case the problem matcher's severity - * is used. - */ - severity?: number; - - /** - * The match group index of the problems's code. - * - * Defaults to undefined. No code is captured. - */ - code?: number; - - /** - * The match group index of the message. If omitted it defaults - * to 4 if location is specified. Otherwise it defaults to 5. - */ - message?: number; - - /** - * Specifies if the last pattern in a multi line problem matcher should - * loop as long as it does match a line consequently. Only valid on the - * last problem pattern in a multi line problem matcher. - */ - loop?: boolean; - } - - /** - * A multi line problem pattern. - */ - export type MultiLineProblemPattern = ProblemPattern[]; - - /** - * The way how the file location is interpreted - */ - export enum FileLocationKind { - /** - * VS Code should decide based on whether the file path found in the - * output is absolute or relative. A relative file path will be treated - * relative to the workspace root. - */ - Auto = 1, - - /** - * Always treat the file path relative. - */ - Relative = 2, - - /** - * Always treat the file path absolute. - */ - Absolute = 3 - } - - /** - * Controls to which kind of documents problems are applied. - */ - export enum ApplyToKind { - /** - * Problems are applied to all documents. - */ - AllDocuments = 1, - - /** - * Problems are applied to open documents only. - */ - OpenDocuments = 2, - - - /** - * Problems are applied to closed documents only. - */ - ClosedDocuments = 3 - } - - - /** - * A background monitor pattern - */ - export interface BackgroundPattern { - /** - * The actual regular expression - */ - regexp: RegExp; - - /** - * The match group index of the filename. If provided the expression - * is matched for that file only. - */ - file?: number; - } - - /** - * A description to control the activity of a problem matcher - * watching a background task. - */ - export interface BackgroundMonitor { - /** - * If set to true the monitor is in active mode when the task - * starts. This is equals of issuing a line that matches the - * beginPattern. - */ - activeOnStart?: boolean; - - /** - * If matched in the output the start of a background activity is signaled. - */ - beginsPattern: RegExp | BackgroundPattern; - - /** - * If matched in the output the end of a background activity is signaled. - */ - endsPattern: RegExp | BackgroundPattern; - } - - /** - * Defines a problem matcher - */ - export interface ProblemMatcher { - /** - * The owner of a problem. Defaults to a generated id - * if omitted. - */ - owner?: string; - - /** - * The type of documents problems detected by this matcher - * apply to. Default to `ApplyToKind.AllDocuments` if omitted. - */ - applyTo?: ApplyToKind; - - /** - * How a file location recognized by a matcher should be interpreted. If omitted the file location - * if `FileLocationKind.Auto`. - */ - fileLocation?: FileLocationKind | string; - - /** - * The actual pattern used by the problem matcher. - */ - pattern: ProblemPattern | MultiLineProblemPattern; - - /** - * The default severity of a detected problem in the output. Used - * if the `ProblemPattern` doesn't define a severity match group. - */ - severity?: DiagnosticSeverity; - - /** - * A background monitor for tasks that are running in the background. - */ - backgound?: BackgroundMonitor; - } - /** * Controls the behaviour of the terminal's visibility. */ @@ -3797,7 +3588,7 @@ declare module 'vscode' { /** * The ProblemMatchers type definition. */ - export type ProblemMatchers = string | ProblemMatcher | (string | ProblemMatcher)[]; + export type ProblemMatchers = string | string[]; /** * A task that starts an external process. @@ -3881,7 +3672,7 @@ declare module 'vscode' { * The problem matchers attached to the task. Defaults to an empty * array. */ - problemMatchers: (string | ProblemMatcher)[]; + problemMatchers: string[]; } export type ShellOptions = { @@ -4001,7 +3792,7 @@ declare module 'vscode' { * The problem matchers attached to the task. Defaults to an empty * array. */ - problemMatchers: (string | ProblemMatcher)[]; + problemMatchers: string[]; } export type Task = ProcessTask | ShellTask; diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index eb5b38f2391..80ab4b01781 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -536,8 +536,6 @@ export function createApiFactory( TreeItemCollapsibleState: extHostTypes.TreeItemCollapsibleState, ThemeColor: extHostTypes.ThemeColor, // functions - FileLocationKind: extHostTypes.FileLocationKind, - ApplyToKind: extHostTypes.ApplyToKind, RevealKind: extHostTypes.RevealKind, TaskGroup: extHostTypes.TaskGroup, ShellTask: extHostTypes.ShellTask, diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index 65e818dafc3..19b3bcaae5d 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -8,13 +8,11 @@ import { TPromise } from 'vs/base/common/winjs.base'; import * as UUID from 'vs/base/common/uuid'; import { asWinJsPromise } from 'vs/base/common/async'; -import * as Problems from 'vs/platform/markers/common/problemMatcher'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import * as TaskSystem from 'vs/workbench/parts/tasks/common/tasks'; import { IThreadService } from 'vs/workbench/services/thread/common/threadService'; import { MainContext, MainThreadTaskShape, ExtHostTaskShape } from 'vs/workbench/api/node/extHost.protocol'; -import { fromDiagnosticSeverity } from 'vs/workbench/api/node/extHostTypeConverters'; import * as types from 'vs/workbench/api/node/extHostTypes'; import * as vscode from 'vscode'; @@ -23,6 +21,7 @@ interface StringMap { [key: string]: V; } +/* namespace ProblemPattern { export function from(value: vscode.ProblemPattern | vscode.MultiLineProblemPattern): Problems.ProblemPattern | Problems.MultiLineProblemPattern { if (value === void 0 || value === null) { @@ -144,7 +143,7 @@ namespace WatchingPattern { } } -namespace WathingMatcher { +namespace BackgroundMonitor { export function from(value: vscode.BackgroundMonitor): Problems.WatchingMatcher { if (value === void 0 || value === null) { return undefined; @@ -190,6 +189,7 @@ namespace ProblemMatcher { return result; } } +*/ namespace RevealKind { export function from(value: vscode.RevealKind): TaskSystem.ShowOutput { @@ -314,7 +314,7 @@ namespace Tasks { showOutput: behaviour.showOutput, isBackground: !!task.isBackground, suppressTaskName: true, - problemMatchers: ProblemMatcher.from(task.problemMatchers) + problemMatchers: task.problemMatchers.slice() }; return result; } diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index 20b0d2a1aff..d78f0d8d75e 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1018,12 +1018,12 @@ export enum RevealKind { export class BaseTask { private _name: string; - private _problemMatchers: (string | vscode.ProblemMatcher)[]; + private _problemMatchers: string[]; private _identifier: string; private _isBackground: boolean; private _terminal: vscode.TerminalBehaviour; - constructor(name: string, problemMatchers: (string | vscode.ProblemMatcher)[]) { + constructor(name: string, problemMatchers: string[]) { if (typeof name !== 'string') { throw illegalArgument('name'); } @@ -1074,11 +1074,11 @@ export class BaseTask { this._terminal = value; } - get problemMatchers(): (string | vscode.ProblemMatcher)[] { + get problemMatchers(): string[] { return this._problemMatchers; } - set problemMatchers(value: (string | vscode.ProblemMatcher)[]) { + set problemMatchers(value: string[]) { if (!Array.isArray(value)) { value = []; } @@ -1086,12 +1086,14 @@ export class BaseTask { } } +/* namespace ProblemMatcher { export function is(value: any): value is vscode.ProblemMatcher { let candidate: vscode.ProblemMatcher = value; return candidate && !!candidate.pattern; } } +*/ namespace ShellOptions { export function is(value: any): value is vscode.ShellOptions { @@ -1144,7 +1146,7 @@ export class ProcessTask extends BaseTask { args = arg3 || []; if (arg4) { - if (Array.isArray(arg4) || typeof arg4 === 'string' || ProblemMatcher.is(arg4)) { + if (Array.isArray(arg4) || typeof arg4 === 'string') { problemMatchers = arg4; } else { options = arg4; @@ -1153,8 +1155,8 @@ export class ProcessTask extends BaseTask { if (arg5 && !problemMatchers) { problemMatchers = arg5; } - let pm: (string | vscode.ProblemMatcher)[]; - if (problemMatchers && (typeof problemMatchers === 'string' || ProblemMatcher.is(problemMatchers))) { + let pm: string[]; + if (problemMatchers && (typeof problemMatchers === 'string')) { pm = [problemMatchers]; } else if (Array.isArray(problemMatchers)) { pm = problemMatchers; @@ -1217,13 +1219,13 @@ export class ShellTask extends BaseTask implements vscode.ShellTask { throw illegalArgument('commandLine'); } let options: vscode.ShellOptions = undefined; - let pm: (string | vscode.ProblemMatcher)[]; + let pm: string[]; if (ShellOptions.is(optionsOrProblemMatchers)) { options = optionsOrProblemMatchers; } else { problemMatchers = optionsOrProblemMatchers; } - if (problemMatchers && (typeof problemMatchers === 'string' || ProblemMatcher.is(problemMatchers))) { + if (problemMatchers && (typeof problemMatchers === 'string')) { pm = [problemMatchers]; } else if (Array.isArray(problemMatchers)) { pm = problemMatchers; diff --git a/src/vs/workbench/parts/tasks/common/task.api.ts b/src/vs/workbench/parts/tasks/common/task.api.ts new file mode 100644 index 00000000000..212047ae084 --- /dev/null +++ b/src/vs/workbench/parts/tasks/common/task.api.ts @@ -0,0 +1,213 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/** + * Defines a problem pattern + */ +export interface ProblemPattern { + + /** + * The regular expression to find a problem in the console output of an + * executed task. + */ + regexp: RegExp; + + /** + * The match group index of the filename. + * + * Defaults to 1 if omitted. + */ + file?: number; + + /** + * The match group index of the problems's location. Valid location + * patterns are: (line), (line,column) and (startLine,startColumn,endLine,endColumn). + * If omitted the line and colum properties are used. + */ + location?: number; + + /** + * The match group index of the problem's line in the source file. + * + * Defaults to 2 if omitted. + */ + line?: number; + + /** + * The match group index of the problem's character in the source file. + * + * Defaults to 3 if omitted. + */ + character?: number; + + /** + * The match group index of the problem's end line in the source file. + * + * Defaults to undefined. No end line is captured. + */ + endLine?: number; + + /** + * The match group index of the problem's end character in the source file. + * + * Defaults to undefined. No end column is captured. + */ + endCharacter?: number; + + /** + * The match group index of the problem's severity. + * + * Defaults to undefined. In this case the problem matcher's severity + * is used. + */ + severity?: number; + + /** + * The match group index of the problems's code. + * + * Defaults to undefined. No code is captured. + */ + code?: number; + + /** + * The match group index of the message. If omitted it defaults + * to 4 if location is specified. Otherwise it defaults to 5. + */ + message?: number; + + /** + * Specifies if the last pattern in a multi line problem matcher should + * loop as long as it does match a line consequently. Only valid on the + * last problem pattern in a multi line problem matcher. + */ + loop?: boolean; +} + +/** + * A multi line problem pattern. + */ +export type MultiLineProblemPattern = ProblemPattern[]; + +/** + * The way how the file location is interpreted + */ +export enum FileLocationKind { + /** + * VS Code should decide based on whether the file path found in the + * output is absolute or relative. A relative file path will be treated + * relative to the workspace root. + */ + Auto = 1, + + /** + * Always treat the file path relative. + */ + Relative = 2, + + /** + * Always treat the file path absolute. + */ + Absolute = 3 +} + +/** + * Controls to which kind of documents problems are applied. + */ +export enum ApplyToKind { + /** + * Problems are applied to all documents. + */ + AllDocuments = 1, + + /** + * Problems are applied to open documents only. + */ + OpenDocuments = 2, + + + /** + * Problems are applied to closed documents only. + */ + ClosedDocuments = 3 +} + + +/** + * A background monitor pattern + */ +export interface BackgroundPattern { + /** + * The actual regular expression + */ + regexp: RegExp; + + /** + * The match group index of the filename. If provided the expression + * is matched for that file only. + */ + file?: number; +} + +/** + * A description to control the activity of a problem matcher + * watching a background task. + */ +export interface BackgroundMonitor { + /** + * If set to true the monitor is in active mode when the task + * starts. This is equals of issuing a line that matches the + * beginPattern. + */ + activeOnStart?: boolean; + + /** + * If matched in the output the start of a background activity is signaled. + */ + beginsPattern: RegExp | BackgroundPattern; + + /** + * If matched in the output the end of a background activity is signaled. + */ + endsPattern: RegExp | BackgroundPattern; +} + +/** + * Defines a problem matcher + */ +export interface ProblemMatcher { + /** + * The owner of a problem. Defaults to a generated id + * if omitted. + */ + owner?: string; + + /** + * The type of documents problems detected by this matcher + * apply to. Default to `ApplyToKind.AllDocuments` if omitted. + */ + applyTo?: ApplyToKind; + + /** + * How a file location recognized by a matcher should be interpreted. If omitted the file location + * if `FileLocationKind.Auto`. + */ + fileLocation?: FileLocationKind | string; + + /** + * The actual pattern used by the problem matcher. + */ + pattern: ProblemPattern | MultiLineProblemPattern; + + /** + * The default severity of a detected problem in the output. Used + * if the `ProblemPattern` doesn't define a severity match group. + */ + severity?: any; + + /** + * A background monitor for tasks that are running in the background. + */ + backgound?: BackgroundMonitor; +} \ No newline at end of file From 201ea1922ec96aeb1e1fbe3fd838df4dd53a5127 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 26 May 2017 15:29:02 +0200 Subject: [PATCH 1095/1164] snippets - fix test failures because 'deleteLeft' is gone --- .../contrib/snippet/test/browser/snippetController2.test.ts | 2 +- .../editor/contrib/snippet/test/browser/snippetSession.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts index 6c30a179315..b862a3dba92 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts @@ -131,7 +131,7 @@ suite('SnippetController2', function () { assertContextKeys(contextKeys, true, false, true); assertSelections(editor, new Selection(1, 1, 1, 7), new Selection(2, 5, 2, 11)); - editor.trigger('test', 'deleteLeft', {}); + editor.trigger('test', 'cut', {}); assertContextKeys(contextKeys, true, false, true); assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts index 100b9c0dbd8..d6a999e751e 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts @@ -388,7 +388,7 @@ suite('SnippetSession', function () { session.next(); assertSelections(editor, new Selection(1, 9, 1, 15)); - editor.trigger('test', 'deleteLeft', {}); + editor.trigger('test', 'cut', {}); assertSelections(editor, new Selection(1, 9, 1, 9)); editor.trigger('test', 'type', { text: 'XXX' }); From 4c71f96c8c518202a0cf57e1624b5f879dc77193 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Fri, 26 May 2017 16:11:25 +0200 Subject: [PATCH 1096/1164] More work on the task v2 json schema --- .../electron-browser/jsonSchemaCommon.ts | 1 + .../tasks/electron-browser/jsonSchema_v2.ts | 83 ++++++++++--------- 2 files changed, 46 insertions(+), 38 deletions(-) diff --git a/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.ts b/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.ts index 12350a98ac8..51b794a250a 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.ts @@ -57,6 +57,7 @@ const schema: IJSONSchema = { shellConfiguration: { type: 'object', additionalProperties: false, + description: nls.localize('JsonSchema.shellConfiguration', 'Configures the shell to be used.'), properties: { executable: { type: 'string', diff --git a/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts b/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts index 2efb28f4d6a..b184d7ee3ff 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts @@ -10,41 +10,6 @@ import { IJSONSchema } from 'vs/base/common/jsonSchema'; import commonSchema from './jsonSchemaCommon'; -const schema: IJSONSchema = { - oneOf: [ - { - 'allOf': [ - { - 'type': 'object', - 'required': ['version'], - 'properties': { - 'version': { - 'type': 'string', - 'enum': ['2.0.0'], - 'description': nls.localize('JsonSchema.version', 'The config\'s version number') - }, - 'windows': { - '$ref': '#/definitions/taskRunnerConfiguration', - 'description': nls.localize('JsonSchema.windows', 'Windows specific command configuration') - }, - 'osx': { - '$ref': '#/definitions/taskRunnerConfiguration', - 'description': nls.localize('JsonSchema.mac', 'Mac specific command configuration') - }, - 'linux': { - '$ref': '#/definitions/taskRunnerConfiguration', - 'description': nls.localize('JsonSchema.linux', 'Linux specific command configuration') - } - } - }, - { - '$ref': '#/definitions/taskRunnerConfiguration' - } - ] - } - ] -}; - const shellCommand: IJSONSchema = { anyOf: [ { @@ -55,7 +20,8 @@ const shellCommand: IJSONSchema = { { $ref: '#definitions/shellConfiguration' } - ] + ], + deprecationMessage: nls.localize('JsonSchema.tasks.isShellCommand.deprecated', 'The property isShellCommand is deprecated. Use the type property and the shell property in the options instead.') }; const dependsOn: IJSONSchema = { @@ -111,6 +77,43 @@ const taskType: IJSONSchema = { description: nls.localize('JsonSchema.tasks.type', 'Defines whether the task is run as a process or as a command inside a shell. Default is process') }; +const version: IJSONSchema = { + type: 'string', + enum: ['2.0.0'], + description: nls.localize('JsonSchema.version', 'The config\'s version number') +}; + +const schema: IJSONSchema = { + oneOf: [ + { + 'allOf': [ + { + type: 'object', + required: ['version'], + properties: { + version: Objects.deepClone(version), + windows: { + '$ref': '#/definitions/taskRunnerConfiguration', + 'description': nls.localize('JsonSchema.windows', 'Windows specific command configuration') + }, + osx: { + '$ref': '#/definitions/taskRunnerConfiguration', + 'description': nls.localize('JsonSchema.mac', 'Mac specific command configuration') + }, + linux: { + '$ref': '#/definitions/taskRunnerConfiguration', + 'description': nls.localize('JsonSchema.linux', 'Linux specific command configuration') + } + } + }, + { + $ref: '#/definitions/taskRunnerConfiguration' + } + ] + } + ] +}; + schema.definitions = Objects.deepClone(commonSchema.definitions); let definitions = schema.definitions; definitions.commandConfiguration.properties.isShellCommand = Objects.deepClone(shellCommand); @@ -120,11 +123,15 @@ definitions.showOutputType.deprecationMessage = nls.localize('JsonSchema.tasks.s definitions.taskDescription.properties.echoCommand.deprecationMessage = nls.localize('JsonSchema.tasks.echoCommand.deprecated', 'The property echoCommand is deprecated. Use the terminal property instead.'); definitions.taskDescription.properties.isBuildCommand.deprecationMessage = nls.localize('JsonSchema.tasks.isBuildCommand.deprecated', 'The property isBuildCommand is deprecated. Use the group property instead.'); definitions.taskDescription.properties.isTestCommand.deprecationMessage = nls.localize('JsonSchema.tasks.isTestCommand.deprecated', 'The property isTestCommand is deprecated. Use the group property instead.'); -definitions.taskDescription.properties.type = taskType; -definitions.taskDescription.properties.isShellCommand.deprecationMessage = nls.localize('JsonSchema.tasks.isShellCommand.deprecated', 'The property isShellCommand is deprecated. Use the type property instead.'); +definitions.taskDescription.properties.type = Objects.deepClone(taskType); definitions.taskDescription.properties.terminal = terminal; definitions.taskDescription.properties.group = group; +definitions.options.properties.shell = { + $ref: '#/definitions/shellConfiguration' +}; definitions.taskRunnerConfiguration.properties.isShellCommand = Objects.deepClone(shellCommand); +definitions.taskRunnerConfiguration.properties.type = Objects.deepClone(taskType); +definitions.taskRunnerConfiguration.properties.version = Objects.deepClone(version); Object.getOwnPropertyNames(definitions).forEach(key => { let newKey = key + '2'; From c29241c9603a23522033d2d919220e59adbf3df2 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 26 May 2017 17:25:03 +0200 Subject: [PATCH 1097/1164] [bat] add test for #26825 --- .../bat/test/colorize-fixtures/test.bat | 8 +- .../bat/test/colorize-results/test_bat.json | 113 +++++------------- 2 files changed, 31 insertions(+), 90 deletions(-) diff --git a/extensions/bat/test/colorize-fixtures/test.bat b/extensions/bat/test/colorize-fixtures/test.bat index f5ae5d25119..3e215fc5efc 100644 --- a/extensions/bat/test/colorize-fixtures/test.bat +++ b/extensions/bat/test/colorize-fixtures/test.bat @@ -16,13 +16,9 @@ if not exist out node .\node_modules\gulp\bin\gulp.js compile :: Configuration set NODE_ENV=development -set VSCODE_DEV=1 -set ELECTRON_DEFAULT_ERROR_MODE=1 -set ELECTRON_ENABLE_LOGGING=1 -set ELECTRON_ENABLE_STACK_DUMPING=1 -:: Launch Code -.\.build\electron\electron.exe . %* +call echo %%LINE:rem +=%% + popd endlocal \ No newline at end of file diff --git a/extensions/bat/test/colorize-results/test_bat.json b/extensions/bat/test/colorize-results/test_bat.json index d909fe69bef..d0f381fc7f3 100644 --- a/extensions/bat/test/colorize-results/test_bat.json +++ b/extensions/bat/test/colorize-results/test_bat.json @@ -264,7 +264,29 @@ } }, { - "c": "set", + "c": "call", + "t": "source.dosbatch keyword.control.statement.dosbatch", + "r": { + "dark_plus": "keyword.control: #C586C0", + "light_plus": "keyword.control: #AF00DB", + "dark_vs": "keyword.control: #569CD6", + "light_vs": "keyword.control: #0000FF", + "hc_black": "keyword.control: #C586C0" + } + }, + { + "c": " ", + "t": "source.dosbatch", + "r": { + "dark_plus": "default: #D4D4D4", + "light_plus": "default: #000000", + "dark_vs": "default: #D4D4D4", + "light_vs": "default: #000000", + "hc_black": "default: #FFFFFF" + } + }, + { + "c": "echo", "t": "source.dosbatch keyword.command.dosbatch", "r": { "dark_plus": "keyword: #569CD6", @@ -275,7 +297,7 @@ } }, { - "c": " VSCODE_DEV=1", + "c": " ", "t": "source.dosbatch", "r": { "dark_plus": "default: #D4D4D4", @@ -286,91 +308,14 @@ } }, { - "c": "set", - "t": "source.dosbatch keyword.command.dosbatch", + "c": "%%LINE:rem +=%%", + "t": "source.dosbatch variable.other.parsetime.dosbatch", "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" - } - }, - { - "c": " ELECTRON_DEFAULT_ERROR_MODE=1", - "t": "source.dosbatch", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", + "dark_plus": "variable: #9CDCFE", + "light_plus": "variable: #001080", "dark_vs": "default: #D4D4D4", "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "set", - "t": "source.dosbatch keyword.command.dosbatch", - "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" - } - }, - { - "c": " ELECTRON_ENABLE_LOGGING=1", - "t": "source.dosbatch", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": "set", - "t": "source.dosbatch keyword.command.dosbatch", - "r": { - "dark_plus": "keyword: #569CD6", - "light_plus": "keyword: #0000FF", - "dark_vs": "keyword: #569CD6", - "light_vs": "keyword: #0000FF", - "hc_black": "keyword: #569CD6" - } - }, - { - "c": " ELECTRON_ENABLE_STACK_DUMPING=1", - "t": "source.dosbatch", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" - } - }, - { - "c": ":: Launch Code", - "t": "source.dosbatch comment.line.colons.dosbatch", - "r": { - "dark_plus": "comment: #608B4E", - "light_plus": "comment: #008000", - "dark_vs": "comment: #608B4E", - "light_vs": "comment: #008000", - "hc_black": "comment: #7CA668" - } - }, - { - "c": ".\\.build\\electron\\electron.exe . %*", - "t": "source.dosbatch", - "r": { - "dark_plus": "default: #D4D4D4", - "light_plus": "default: #000000", - "dark_vs": "default: #D4D4D4", - "light_vs": "default: #000000", - "hc_black": "default: #FFFFFF" + "hc_black": "variable: #9CDCFE" } }, { From dfd358082f4f03d6439e65fb130eb77988ad53ef Mon Sep 17 00:00:00 2001 From: Nick Snyder Date: Fri, 26 May 2017 08:57:47 -0700 Subject: [PATCH 1098/1164] Handle progress results in quick open controller (#27152) --- .../parts/quickopen/quickOpenController.ts | 5 +- src/vs/workbench/browser/quickopen.ts | 4 +- .../search/browser/openAnythingHandler.ts | 47 ++++++++++++------- 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index e86aa2e27e3..59e116b11d4 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -774,7 +774,7 @@ export class QuickOpenController extends Component implements IQuickOpenService } // Get results - return resolvedHandler.getResults(value).then(result => { + const handleResult = (result) => { if (this.currentResultToken === currentResultToken) { // now is the time to show the input if we did not have set it before @@ -787,7 +787,8 @@ export class QuickOpenController extends Component implements IQuickOpenService const handlerResults = (result && result.entries) || []; this.mergeResults(quickOpenModel, handlerResults, resolvedHandler.getGroupLabel()); } - }); + }; + return resolvedHandler.getResults(value).then(handleResult, undefined, handleResult); }); } diff --git a/src/vs/workbench/browser/quickopen.ts b/src/vs/workbench/browser/quickopen.ts index ebb31e7a833..551ffbd9808 100644 --- a/src/vs/workbench/browser/quickopen.ts +++ b/src/vs/workbench/browser/quickopen.ts @@ -5,7 +5,7 @@ 'use strict'; import nls = require('vs/nls'); -import { TPromise } from 'vs/base/common/winjs.base'; +import { PPromise, TPromise } from 'vs/base/common/winjs.base'; import * as objects from 'vs/base/common/objects'; import filters = require('vs/base/common/filters'); import arrays = require('vs/base/common/arrays'); @@ -34,7 +34,7 @@ export class QuickOpenHandler { * As such, returning the same model instance across multiple searches will yield best * results in terms of performance when many items are shown. */ - public getResults(searchValue: string): TPromise> { + public getResults(searchValue: string): PPromise, IModel> { return TPromise.as(null); } diff --git a/src/vs/workbench/parts/search/browser/openAnythingHandler.ts b/src/vs/workbench/parts/search/browser/openAnythingHandler.ts index cc77586caa2..7ac06c931f6 100644 --- a/src/vs/workbench/parts/search/browser/openAnythingHandler.ts +++ b/src/vs/workbench/parts/search/browser/openAnythingHandler.ts @@ -7,7 +7,7 @@ import * as arrays from 'vs/base/common/arrays'; import * as objects from 'vs/base/common/objects'; -import { TPromise } from 'vs/base/common/winjs.base'; +import { PPromise, TPromise } from 'vs/base/common/winjs.base'; import nls = require('vs/nls'); import { ThrottledDelayer } from 'vs/base/common/async'; import types = require('vs/base/common/types'); @@ -91,7 +91,7 @@ export class OpenAnythingHandler extends QuickOpenHandler { private openSymbolHandler: OpenSymbolHandler; private openFileHandler: OpenFileHandler; private searchDelayer: ThrottledDelayer; - private pendingSearch: TPromise; + private pendingSearch: PPromise; private isClosed: boolean; private scorerCache: { [key: string]: number }; private includeSymbols: boolean; @@ -135,7 +135,7 @@ export class OpenAnythingHandler extends QuickOpenHandler { }); } - public getResults(searchValue: string): TPromise { + public getResults(searchValue: string): PPromise { const startTime = Date.now(); this.cancelPendingSearch(); @@ -166,21 +166,21 @@ export class OpenAnythingHandler extends QuickOpenHandler { // Symbol Results (unless disabled or a range or absolute path is specified) if (this.includeSymbols && !searchWithRange) { resultPromises.push(this.openSymbolHandler.getResults(searchValue)); - } else { - resultPromises.push(TPromise.as(new QuickOpenModel())); // We need this empty promise because we are using the throttler below! } // Join and sort unified - this.pendingSearch = TPromise.join(resultPromises).then(results => { + const handleResults = (results: (QuickOpenModel | FileQuickOpenModel)[]) => { this.pendingSearch = null; // If the quick open widget has been closed meanwhile, ignore the result if (this.isClosed) { - return TPromise.as(new QuickOpenModel()); + return new QuickOpenModel(); } // Combine file results and symbol results (if any) - const mergedResults = [...results[0].entries, ...results[1].entries]; + const mergedResults: QuickOpenEntry[] = results.reduce((entries: QuickOpenEntry[], model: QuickOpenModel) => { + return entries.concat(model.entries); + }, []); // Sort const unsortedResultTime = Date.now(); @@ -200,10 +200,11 @@ export class OpenAnythingHandler extends QuickOpenHandler { }); let fileSearchStats: ISearchStats; - if (results[0] instanceof FileQuickOpenModel) { - fileSearchStats = (results[0]).stats; - } else if (results[1] instanceof FileQuickOpenModel) { - fileSearchStats = (results[1]).stats; + for (const result of results) { + if (result instanceof FileQuickOpenModel) { + fileSearchStats = (result).stats; + break; + } } const duration = new Date().getTime() - startTime; @@ -218,10 +219,24 @@ export class OpenAnythingHandler extends QuickOpenHandler { this.telemetryService.publicLog('openAnything', objects.assign(data, { duration })); - return TPromise.as(new QuickOpenModel(viewResults)); - }, (error: Error) => { - this.pendingSearch = null; - this.messageService.show(Severity.Error, error); + return new QuickOpenModel(viewResults); + }; + + this.pendingSearch = new PPromise((complete, error, progress) => { + // When any of the result promises return, forward the result as progress. + resultPromises.map(resultPromise => { + resultPromise.then(result => { + progress(handleResults([result])); + }); + }); + // Complete the promise when all promises have completed. + TPromise.join(resultPromises).then(() => { + // We already sent the results via progress. + complete(new QuickOpenModel()); + }, error => { + this.pendingSearch = null; + this.messageService.show(Severity.Error, error); + }); }); return this.pendingSearch; From 66bc0d13fafadbddb5b26a3bc114bdcc29cfd39c Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Fri, 26 May 2017 09:02:10 -0700 Subject: [PATCH 1099/1164] Update controller, simplify telemetry (#27152) --- .../parts/quickopen/quickOpenController.ts | 19 ++++--- .../search/browser/openAnythingHandler.ts | 52 ++++++++----------- 2 files changed, 34 insertions(+), 37 deletions(-) diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index 59e116b11d4..70ab1330732 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -774,7 +774,8 @@ export class QuickOpenController extends Component implements IQuickOpenService } // Get results - const handleResult = (result) => { + let addedGroupLabel = false; + const handleResult = (result: IModel, last = false) => { if (this.currentResultToken === currentResultToken) { // now is the time to show the input if we did not have set it before @@ -785,10 +786,10 @@ export class QuickOpenController extends Component implements IQuickOpenService // merge history and default handler results const handlerResults = (result && result.entries) || []; - this.mergeResults(quickOpenModel, handlerResults, resolvedHandler.getGroupLabel()); + addedGroupLabel = this.mergeResults(quickOpenModel, handlerResults, !addedGroupLabel ? resolvedHandler.getGroupLabel() : null, last) || addedGroupLabel; } }; - return resolvedHandler.getResults(value).then(handleResult, undefined, handleResult); + return resolvedHandler.getResults(value).then(result => handleResult(result, true), undefined, handleResult); }); } @@ -845,7 +846,7 @@ export class QuickOpenController extends Component implements IQuickOpenService return results.sort((elementA: EditorHistoryEntry, elementB: EditorHistoryEntry) => QuickOpenEntry.compare(elementA, elementB, normalizedSearchValue)); } - private mergeResults(quickOpenModel: QuickOpenModel, handlerResults: QuickOpenEntry[], groupLabel: string): void { + private mergeResults(quickOpenModel: QuickOpenModel, handlerResults: QuickOpenEntry[], groupLabel: string, last: boolean): boolean { // Remove results already showing by checking for a "resource" property const mapEntryToResource = this.mapEntriesToResource(quickOpenModel); @@ -862,17 +863,21 @@ export class QuickOpenController extends Component implements IQuickOpenService // Show additional handler results below any existing results if (additionalHandlerResults.length > 0) { const autoFocusFirstEntry = (quickOpenModel.getEntries().length === 0); // the user might have selected another entry meanwhile in local history (see https://github.com/Microsoft/vscode/issues/20828) - const useTopBorder = quickOpenModel.getEntries().length > 0; - additionalHandlerResults[0] = new QuickOpenEntryGroup(additionalHandlerResults[0], groupLabel, useTopBorder); + if (groupLabel) { + const useTopBorder = quickOpenModel.getEntries().length > 0; + additionalHandlerResults[0] = new QuickOpenEntryGroup(additionalHandlerResults[0], groupLabel, useTopBorder); + } quickOpenModel.addEntries(additionalHandlerResults); this.quickOpenWidget.refresh(quickOpenModel, { autoFocusFirstEntry }); + return !!groupLabel; } // Otherwise if no results are present (even from histoy) indicate this to the user - else if (quickOpenModel.getEntries().length === 0) { + else if (quickOpenModel.getEntries().length === 0 && last) { quickOpenModel.addEntries([new PlaceholderQuickOpenEntry(nls.localize('noResultsFound1', "No results found"))]); this.quickOpenWidget.refresh(quickOpenModel, { autoFocusFirstEntry: true }); } + return false; } private handleSpecificHandler(handlerDescriptor: QuickOpenHandlerDescriptor, value: string, currentResultToken: string): TPromise { diff --git a/src/vs/workbench/parts/search/browser/openAnythingHandler.ts b/src/vs/workbench/parts/search/browser/openAnythingHandler.ts index 7ac06c931f6..113adfd286d 100644 --- a/src/vs/workbench/parts/search/browser/openAnythingHandler.ts +++ b/src/vs/workbench/parts/search/browser/openAnythingHandler.ts @@ -168,8 +168,7 @@ export class OpenAnythingHandler extends QuickOpenHandler { resultPromises.push(this.openSymbolHandler.getResults(searchValue)); } - // Join and sort unified - const handleResults = (results: (QuickOpenModel | FileQuickOpenModel)[]) => { + const handleResult = (result: QuickOpenModel | FileQuickOpenModel) => { this.pendingSearch = null; // If the quick open widget has been closed meanwhile, ignore the result @@ -177,16 +176,13 @@ export class OpenAnythingHandler extends QuickOpenHandler { return new QuickOpenModel(); } - // Combine file results and symbol results (if any) - const mergedResults: QuickOpenEntry[] = results.reduce((entries: QuickOpenEntry[], model: QuickOpenModel) => { - return entries.concat(model.entries); - }, []); + const entries = result.entries; // Sort const unsortedResultTime = Date.now(); const normalizedSearchValue = strings.stripWildcards(searchValue).toLowerCase(); const compare = (elementA: QuickOpenEntry, elementB: QuickOpenEntry) => QuickOpenEntry.compareByScore(elementA, elementB, searchValue, normalizedSearchValue, this.scorerCache); - const viewResults = arrays.top(mergedResults, compare, OpenAnythingHandler.MAX_DISPLAYED_RESULTS); + const viewResults = arrays.top(entries, compare, OpenAnythingHandler.MAX_DISPLAYED_RESULTS); const sortedResultTime = Date.now(); // Apply range and highlights to file entries @@ -199,38 +195,34 @@ export class OpenAnythingHandler extends QuickOpenHandler { } }); - let fileSearchStats: ISearchStats; - for (const result of results) { - if (result instanceof FileQuickOpenModel) { - fileSearchStats = (result).stats; - break; - } + // Telemetry + if (result instanceof FileQuickOpenModel) { + const fileSearchStats = (result).stats; + const duration = new Date().getTime() - startTime; + const data = this.createTimerEventData(startTime, { + searchLength: searchValue.length, + unsortedResultTime, + sortedResultTime, + resultCount: entries.length, + symbols: { fromCache: false }, + files: fileSearchStats + }); + + this.telemetryService.publicLog('openAnything', objects.assign(data, { duration })); } - const duration = new Date().getTime() - startTime; - const data = this.createTimerEventData(startTime, { - searchLength: searchValue.length, - unsortedResultTime, - sortedResultTime, - resultCount: mergedResults.length, - symbols: { fromCache: false }, - files: fileSearchStats - }); - - this.telemetryService.publicLog('openAnything', objects.assign(data, { duration })); - return new QuickOpenModel(viewResults); }; this.pendingSearch = new PPromise((complete, error, progress) => { // When any of the result promises return, forward the result as progress. - resultPromises.map(resultPromise => { + const processed = resultPromises.map(resultPromise => resultPromise.then(result => { - progress(handleResults([result])); - }); - }); + progress(handleResult(result)); + }) + ); // Complete the promise when all promises have completed. - TPromise.join(resultPromises).then(() => { + TPromise.join(processed).then(() => { // We already sent the results via progress. complete(new QuickOpenModel()); }, error => { From f2cf819a7b0dbea76b304667658026c4e7965e72 Mon Sep 17 00:00:00 2001 From: Christof Marti Date: Fri, 26 May 2017 09:38:25 -0700 Subject: [PATCH 1100/1164] Mention keymaps (fixes #24727) --- .../parts/extensions/electron-browser/extensionsUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts index bff8aa3754b..c33a4ecd7d4 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts @@ -73,7 +73,7 @@ export class KeymapExtensions implements IWorkbenchContribution { oldKeymaps: oldKeymaps.map(k => k.identifier) }; this.telemetryService.publicLog('disableOtherKeymapsConfirmation', telemetryData); - const message = localize('disableOtherKeymapsConfirmation', "Disable other keymaps to avoid conflicts between keybindings?"); + const message = localize('disableOtherKeymapsConfirmation', "Disable other keymaps ({0}) to avoid conflicts between keybindings?", oldKeymaps.map(k => `'${k.local.manifest.displayName}'`).join(', ')); const options = [ localize('yes', "Yes"), localize('no', "No") From 4ad0fd04f28d3e42fdfa23eb43bb970840bfd195 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 26 May 2017 16:03:36 +0200 Subject: [PATCH 1101/1164] debt - renames --- .../snippet/browser/snippetController2.ts | 2 +- .../contrib/snippet/browser/snippetSession.ts | 2 +- .../test/browser/snippetSession.test.ts | 24 +++++++++---------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index 73946415785..c17c871a823 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -90,7 +90,7 @@ export class SnippetController2 { return this.cancel(); } - if (this._snippet.isAtFinalPlaceholder || !this._snippet.isSelectionWithPlaceholders()) { + if (this._snippet.isAtFinalPlaceholder || !this._snippet.isSelectionWithinPlaceholders()) { return this.cancel(); } diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts index 2a38815488c..9450bfa8ba3 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -321,7 +321,7 @@ export class SnippetSession { return this._snippets[0].hasPlaceholder; } - isSelectionWithPlaceholders(): boolean { + isSelectionWithinPlaceholders(): boolean { const selections = this._editor.getSelections(); if (selections.length < this._snippets.length) { // this means we started snippet mode with N diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts index d6a999e751e..8d5af1eef2e 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts @@ -299,28 +299,28 @@ suite('SnippetSession', function () { assert.equal(model.getValue(), 'foofarboobarfunction foo() {\n foofarboobarconsole.log(a);\n}'); assertSelections(editor, new Selection(1, 1, 1, 4), new Selection(2, 5, 2, 8)); - assert.equal(session.isSelectionWithPlaceholders(), true); + assert.equal(session.isSelectionWithinPlaceholders(), true); editor.setSelections([new Selection(1, 1, 1, 1)]); - assert.equal(session.isSelectionWithPlaceholders(), false); + assert.equal(session.isSelectionWithinPlaceholders(), false); editor.setSelections([new Selection(1, 6, 1, 6), new Selection(2, 10, 2, 10)]); - assert.equal(session.isSelectionWithPlaceholders(), false); // in snippet, outside placeholder + assert.equal(session.isSelectionWithinPlaceholders(), false); // in snippet, outside placeholder editor.setSelections([new Selection(1, 6, 1, 6), new Selection(2, 10, 2, 10), new Selection(1, 1, 1, 1)]); - assert.equal(session.isSelectionWithPlaceholders(), false); // in snippet, outside placeholder + assert.equal(session.isSelectionWithinPlaceholders(), false); // in snippet, outside placeholder editor.setSelections([new Selection(1, 6, 1, 6), new Selection(2, 10, 2, 10), new Selection(2, 20, 2, 21)]); - assert.equal(session.isSelectionWithPlaceholders(), false); + assert.equal(session.isSelectionWithinPlaceholders(), false); // reset selection to placeholder session.next(); - assert.equal(session.isSelectionWithPlaceholders(), true); + assert.equal(session.isSelectionWithinPlaceholders(), true); assertSelections(editor, new Selection(1, 10, 1, 13), new Selection(2, 14, 2, 17)); // reset selection to placeholder session.next(); - assert.equal(session.isSelectionWithPlaceholders(), true); + assert.equal(session.isSelectionWithinPlaceholders(), true); assert.equal(session.isAtFinalPlaceholder, true); assertSelections(editor, new Selection(1, 13, 1, 13), new Selection(2, 17, 2, 17)); }); @@ -354,10 +354,10 @@ suite('SnippetSession', function () { const session = new SnippetSession(editor); session.insert('farboo$0'); assert.equal(session.isAtFinalPlaceholder, true); - assert.equal(session.isSelectionWithPlaceholders(), false); + assert.equal(session.isSelectionWithinPlaceholders(), false); editor.trigger('test', 'type', { text: 'XXX' }); - assert.equal(session.isSelectionWithPlaceholders(), false); + assert.equal(session.isSelectionWithinPlaceholders(), false); }); test('snippets, typing at beginning', function () { @@ -367,12 +367,12 @@ suite('SnippetSession', function () { session.insert('farboo$0'); editor.setSelection(new Selection(1, 2, 1, 2)); - assert.equal(session.isSelectionWithPlaceholders(), false); + assert.equal(session.isSelectionWithinPlaceholders(), false); assert.equal(session.isAtFinalPlaceholder, true); editor.trigger('test', 'type', { text: 'XXX' }); assert.equal(model.getLineContent(1), 'fXXXfarboounction foo() {'); - assert.equal(session.isSelectionWithPlaceholders(), false); + assert.equal(session.isSelectionWithinPlaceholders(), false); session.next(); assertSelections(editor, new Selection(1, 11, 1, 11)); @@ -410,7 +410,7 @@ suite('SnippetSession', function () { assertSelections(editor, new Selection(1, 4, 1, 4), new Selection(2, 8, 2, 8)); session.insert('bar'); - assert.ok(session.isSelectionWithPlaceholders()); + assert.ok(session.isSelectionWithinPlaceholders()); assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); session.next(); From 52cc722dcd00b02e59edc4ea38cc694fc210d34e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 26 May 2017 17:27:22 +0200 Subject: [PATCH 1102/1164] basic support for nested snippets, #24855 --- .../snippet/browser/snippetController2.ts | 124 +++++++++++++----- .../contrib/snippet/browser/snippetSession.ts | 74 +++++------ .../test/browser/snippetController2.test.ts | 24 +++- .../test/browser/snippetSession.test.ts | 15 --- 4 files changed, 142 insertions(+), 95 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index c17c871a823..c35e9766a49 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -13,6 +13,62 @@ import { SnippetSession } from './snippetSession'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +class SnippetSessions { + + private _stack: SnippetSession[] = []; + + add(session: SnippetSession): number { + return this._stack.push(session); + } + + clear(): void { + dispose(this._stack); + this._stack.length = 0; + } + + get empty(): boolean { + return this._stack.length === 0; + } + + get hasPlaceholder(): boolean { + return this._stack.some(s => s.hasPlaceholder); + } + + get isAtFirstPlaceholder(): boolean { + // return !this.empty && this._stack[0].isAtFirstPlaceholder; + return this._stack.every(s => s.isAtFirstPlaceholder); + } + + get isAtFinalPlaceholder(): boolean { + // return !this.empty && this._stack[0].isAtFinalPlaceholder; + return this._stack.every(s => s.isAtFinalPlaceholder); + } + + get isSelectionWithinPlaceholders(): boolean { + return this._stack.some(s => s.isSelectionWithinPlaceholders()); + } + + prev(): void { + for (let i = this._stack.length - 1; i >= 0; i--) { + const snippet = this._stack[i]; + if (!snippet.isAtFirstPlaceholder) { + snippet.prev(); + break; + } + } + } + + next(): void { + for (let i = this._stack.length - 1; i >= 0; i--) { + const snippet = this._stack[i]; + if (!snippet.isAtFinalPlaceholder) { + snippet.next(); + break; + } + } + } +} + @commonEditorContribution export class SnippetController2 { @@ -28,7 +84,8 @@ export class SnippetController2 { private readonly _hasNextTabstop: IContextKey; private readonly _hasPrevTabstop: IContextKey; - private _snippet: SnippetSession; + // private _snippet: SnippetSession; + private _sessions = new SnippetSessions(); private _snippetListener: IDisposable[] = []; constructor( @@ -44,7 +101,7 @@ export class SnippetController2 { this._inSnippet.reset(); this._hasPrevTabstop.reset(); this._hasNextTabstop.reset(); - dispose(this._snippet); + this._sessions.clear(); } getId(): string { @@ -56,47 +113,49 @@ export class SnippetController2 { overwriteBefore: number = 0, overwriteAfter: number = 0, undoStopBefore: boolean = true, undoStopAfter: boolean = true ): void { + + // don't listen while inserting the snippet + // as that is the inflight state causing cancelation + this._snippetListener = dispose(this._snippetListener); + if (undoStopBefore) { this._editor.getModel().pushStackElement(); } - if (!this._snippet) { - // create a new session - this._snippet = new SnippetSession(this._editor); - this._snippet.insert(template, overwriteBefore, overwriteAfter); - this._snippetListener = [ - this._editor.onDidChangeModel(() => this.cancel()), - this._editor.onDidChangeCursorSelection(() => this._updateState()) - ]; - } else { - // only insert the snippet when a session - // is already active - this._snippet.insert(template, overwriteBefore, overwriteAfter); - } + + const snippet = new SnippetSession(this._editor); + snippet.insert(template, overwriteBefore, overwriteAfter); + this._sessions.add(snippet); + if (undoStopAfter) { this._editor.getModel().pushStackElement(); } + + this._snippetListener = [ + this._editor.onDidChangeModel(() => this.cancel()), + this._editor.onDidChangeCursorSelection(() => this._updateState()) + ]; this._updateState(); } private _updateState(): void { - if (!this._snippet) { + if (this._sessions.empty) { // canceled in the meanwhile return; } - if (!this._snippet.hasPlaceholder) { + if (!this._sessions.hasPlaceholder) { // don't listen for selection changes and don't // update context keys when the snippet is plain text return this.cancel(); } - if (this._snippet.isAtFinalPlaceholder || !this._snippet.isSelectionWithinPlaceholders()) { + if (this._sessions.isAtFinalPlaceholder || !this._sessions.isSelectionWithinPlaceholders) { return this.cancel(); } this._inSnippet.set(true); - this._hasPrevTabstop.set(!this._snippet.isAtFirstPlaceholder); - this._hasNextTabstop.set(!this._snippet.isAtFinalPlaceholder); + this._hasPrevTabstop.set(!this._sessions.isAtFirstPlaceholder); + this._hasNextTabstop.set(!this._sessions.isAtFinalPlaceholder); } finish(): void { @@ -106,28 +165,21 @@ export class SnippetController2 { } cancel(): void { - if (this._snippet) { - this._inSnippet.reset(); - this._hasPrevTabstop.reset(); - this._hasNextTabstop.reset(); - dispose(this._snippetListener); - dispose(this._snippet); - this._snippet = undefined; - } + this._inSnippet.reset(); + this._hasPrevTabstop.reset(); + this._hasNextTabstop.reset(); + this._sessions.clear(); + dispose(this._snippetListener); } prev(): void { - if (this._snippet) { - this._snippet.prev(); - this._updateState(); - } + this._sessions.prev(); + this._updateState(); } next(): void { - if (this._snippet) { - this._snippet.next(); - this._updateState(); - } + this._sessions.next(); + this._updateState(); } } diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts index 9450bfa8ba3..51567e97c20 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -130,11 +130,13 @@ export class OneSnippet { } get isAtFirstPlaceholder() { - return this._placeholderGroupsIdx === 0; + return this._placeholderGroupsIdx === 0 || this._placeholderGroups.length === 0; } get isAtFinalPlaceholder() { - if (this._placeholderGroupsIdx < 0) { + if (this._placeholderGroups.length === 0) { + return true; + } else if (this._placeholderGroupsIdx < 0) { return false; } else { return this._placeholderGroups[this._placeholderGroupsIdx][0].isFinalTabstop; @@ -196,24 +198,35 @@ export class SnippetSession { return selection; } - static makeInsertEditsAndSnippets(editor: ICommonCodeEditor, template: string, overwriteBefore: number = 0, overwriteAfter: number = 0): { edits: IIdentifiedSingleEditOperation[], snippets: OneSnippet[] } { + private readonly _editor: ICommonCodeEditor; + private _snippets: OneSnippet[] = []; + + constructor(editor: ICommonCodeEditor) { + this._editor = editor; + } + + dispose(): void { + dispose(this._snippets); + } + + insert(template: string, overwriteBefore: number = 0, overwriteAfter: number = 0): void { + + const model = this._editor.getModel(); + const edits: IIdentifiedSingleEditOperation[] = []; let delta = 0; - let edits: IIdentifiedSingleEditOperation[] = []; - let snippets: OneSnippet[] = []; - let model = editor.getModel(); // know what text the overwrite[Before|After] extensions // of the primary curser have selected because only when // secondary selections extend to the same text we can grow them - let firstBeforeText = model.getValueInRange(SnippetSession.adjustSelection(model, editor.getSelection(), overwriteBefore, 0)); - let firstAfterText = model.getValueInRange(SnippetSession.adjustSelection(model, editor.getSelection(), 0, overwriteAfter)); + let firstBeforeText = model.getValueInRange(SnippetSession.adjustSelection(model, this._editor.getSelection(), overwriteBefore, 0)); + let firstAfterText = model.getValueInRange(SnippetSession.adjustSelection(model, this._editor.getSelection(), 0, overwriteAfter)); // sort selections by their start position but remeber // the original index. that allows you to create correct // offset-based selection logic without changing the // primary selection - const indexedSelection = editor.getSelections() + const indexedSelection = this._editor.getSelections() .map((selection, idx) => ({ selection, idx })) .sort((a, b) => Range.compareRangesUsingStarts(a.selection, b.selection)); @@ -248,46 +261,18 @@ export class SnippetSession { // that ensures the primiary cursor stays primary despite not being // the one with lowest start position edits[idx] = EditOperation.replaceMove(snippetSelection, snippet.text); - snippets[idx] = new OneSnippet(editor, snippet, offset); - } - - return { edits, snippets }; - } - - private readonly _editor: ICommonCodeEditor; - private _snippets: OneSnippet[]; - - constructor(editor: ICommonCodeEditor) { - this._editor = editor; - } - - dispose(): void { - dispose(this._snippets); - } - - insert(template: string, overwriteBefore: number = 0, overwriteAfter: number = 0): void { - - const model = this._editor.getModel(); - const { edits, snippets } = SnippetSession.makeInsertEditsAndSnippets( - this._editor, template, overwriteBefore, overwriteAfter - ); - - let isNestedInsert = true; - if (!this._snippets) { - // keep snippets around - this._snippets = snippets; - isNestedInsert = false; + this._snippets[idx] = new OneSnippet(this._editor, snippet, offset); } // make insert edit and start with first selections - const newSelections = model.pushEditOperations(this._editor.getSelections(), edits, undoEdits => { - if (!isNestedInsert && this._snippets[0].hasPlaceholder) { + + this._editor.setSelections(model.pushEditOperations(this._editor.getSelections(), edits, undoEdits => { + if (this._snippets[0].hasPlaceholder) { return this._move(true); } else { return undoEdits.map(edit => Selection.fromPositions(edit.range.getEndPosition())); } - }); - this._editor.setSelections(newSelections); + })); } next(): void { @@ -322,6 +307,11 @@ export class SnippetSession { } isSelectionWithinPlaceholders(): boolean { + + if (!this.hasPlaceholder) { + return false; + } + const selections = this._editor.getSelections(); if (selections.length < this._snippets.length) { // this means we started snippet mode with N diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts index b862a3dba92..ce84d8796d8 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts @@ -148,17 +148,37 @@ suite('SnippetController2', function () { // assertContextKeys(contextKeys, false, false, false); }); - test('insert, insert nested', function () { + test('insert, nested snippet', function () { + const ctrl = new SnippetController2(editor, contextKeys); + ctrl.insert('${1:foobar}$0'); + assertContextKeys(contextKeys, true, false, true); + assertSelections(editor, new Selection(1, 1, 1, 7), new Selection(2, 5, 2, 11)); + + ctrl.insert('farboo$1$0'); + assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); + assertContextKeys(contextKeys, true, false, true); + + ctrl.next(); + assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); + assertContextKeys(contextKeys, true, true, true); + + ctrl.next(); + assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); + assertContextKeys(contextKeys, false, false, false); + }); + + test('insert, nested plain text', function () { const ctrl = new SnippetController2(editor, contextKeys); ctrl.insert('${1:foobar}$0'); assertContextKeys(contextKeys, true, false, true); assertSelections(editor, new Selection(1, 1, 1, 7), new Selection(2, 5, 2, 11)); ctrl.insert('farboo'); - assertContextKeys(contextKeys, true, false, true); assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); + assertContextKeys(contextKeys, true, false, true); ctrl.next(); + assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); assertContextKeys(contextKeys, false, false, false); }); }); diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts index 8d5af1eef2e..ce807bedad7 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts @@ -403,20 +403,5 @@ suite('SnippetSession', function () { assert.equal(model.getValue(), '@line=1function foo() {\n @line=2console.log(a);\n}'); assertSelections(editor, new Selection(1, 8, 1, 8), new Selection(2, 12, 2, 12)); }); - - test('snippet, insert-nested', function () { - const session = new SnippetSession(editor); - session.insert('foo$1foo$0'); - - assertSelections(editor, new Selection(1, 4, 1, 4), new Selection(2, 8, 2, 8)); - session.insert('bar'); - assert.ok(session.isSelectionWithinPlaceholders()); - assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); - - session.next(); - assertSelections(editor, new Selection(1, 10, 1, 10), new Selection(2, 14, 2, 14)); - assert.ok(session.isAtFinalPlaceholder); - }); - }); From 90a68e55391afc18cc1caffef776280983e14350 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 26 May 2017 17:32:27 +0200 Subject: [PATCH 1103/1164] make SnippetSession single insert again, #24855 --- .../snippet/browser/snippetController2.ts | 4 +- .../contrib/snippet/browser/snippetSession.ts | 20 +++-- .../test/browser/snippetSession.test.ts | 80 +++++++++---------- 3 files changed, 55 insertions(+), 49 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index c35e9766a49..fbf4764ba64 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -122,9 +122,9 @@ export class SnippetController2 { this._editor.getModel().pushStackElement(); } - const snippet = new SnippetSession(this._editor); - snippet.insert(template, overwriteBefore, overwriteAfter); + const snippet = new SnippetSession(this._editor, template, overwriteBefore, overwriteAfter); this._sessions.add(snippet); + snippet.insert(); if (undoStopAfter) { this._editor.getModel().pushStackElement(); diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts index 51567e97c20..de1eea466b9 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -199,17 +199,23 @@ export class SnippetSession { } private readonly _editor: ICommonCodeEditor; + private readonly _template: string; + private readonly _overwriteBefore: number; + private readonly _overwriteAfter: number; private _snippets: OneSnippet[] = []; - constructor(editor: ICommonCodeEditor) { + constructor(editor: ICommonCodeEditor, template: string, overwriteBefore: number = 0, overwriteAfter: number = 0) { this._editor = editor; + this._template = template; + this._overwriteBefore = overwriteBefore; + this._overwriteAfter = overwriteAfter; } dispose(): void { dispose(this._snippets); } - insert(template: string, overwriteBefore: number = 0, overwriteAfter: number = 0): void { + insert(): void { const model = this._editor.getModel(); const edits: IIdentifiedSingleEditOperation[] = []; @@ -219,8 +225,8 @@ export class SnippetSession { // know what text the overwrite[Before|After] extensions // of the primary curser have selected because only when // secondary selections extend to the same text we can grow them - let firstBeforeText = model.getValueInRange(SnippetSession.adjustSelection(model, this._editor.getSelection(), overwriteBefore, 0)); - let firstAfterText = model.getValueInRange(SnippetSession.adjustSelection(model, this._editor.getSelection(), 0, overwriteAfter)); + let firstBeforeText = model.getValueInRange(SnippetSession.adjustSelection(model, this._editor.getSelection(), this._overwriteBefore, 0)); + let firstAfterText = model.getValueInRange(SnippetSession.adjustSelection(model, this._editor.getSelection(), 0, this._overwriteAfter)); // sort selections by their start position but remeber // the original index. that allows you to create correct @@ -234,8 +240,8 @@ export class SnippetSession { // extend selection with the `overwriteBefore` and `overwriteAfter` and then // compare if this matches the extensions of the primary selection - let extensionBefore = SnippetSession.adjustSelection(model, selection, overwriteBefore, 0); - let extensionAfter = SnippetSession.adjustSelection(model, selection, 0, overwriteAfter); + let extensionBefore = SnippetSession.adjustSelection(model, selection, this._overwriteBefore, 0); + let extensionAfter = SnippetSession.adjustSelection(model, selection, 0, this._overwriteAfter); if (firstBeforeText !== model.getValueInRange(extensionBefore)) { extensionBefore = selection; } @@ -251,7 +257,7 @@ export class SnippetSession { // adjust the template string to match the indentation and // whitespace rules of this insert location (can be different for each cursor) const start = snippetSelection.getStartPosition(); - const adjustedTemplate = SnippetSession.adjustWhitespace(model, start, template); + const adjustedTemplate = SnippetSession.adjustWhitespace(model, start, this._template); const snippet = SnippetParser.parse(adjustedTemplate).resolveVariables(new EditorSnippetVariableResolver(model, snippetSelection)); const offset = model.getOffsetAt(start) + delta; diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts index ce807bedad7..5d5db85fb93 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts @@ -67,8 +67,8 @@ suite('SnippetSession', function () { }); test('text edits & selection', function () { - const session = new SnippetSession(editor); - session.insert('foo${1:bar}foo$0'); + const session = new SnippetSession(editor, 'foo${1:bar}foo$0'); + session.insert(); assert.equal(editor.getModel().getValue(), 'foobarfoofunction foo() {\n foobarfooconsole.log(a);\n}'); assertSelections(editor, new Selection(1, 4, 1, 7), new Selection(2, 8, 2, 11)); @@ -78,17 +78,17 @@ suite('SnippetSession', function () { test('text edit with reversed selection', function () { - const session = new SnippetSession(editor); + const session = new SnippetSession(editor, '${1:bar}$0'); editor.setSelections([new Selection(2, 5, 2, 5), new Selection(1, 1, 1, 1)]); - session.insert('${1:bar}$0'); + session.insert(); assert.equal(model.getValue(), 'barfunction foo() {\n barconsole.log(a);\n}'); assertSelections(editor, new Selection(2, 5, 2, 8), new Selection(1, 1, 1, 4)); }); test('snippets, repeated tabstops', function () { - const session = new SnippetSession(editor); - session.insert('${1:abc}foo${1:abc}$0'); + const session = new SnippetSession(editor, '${1:abc}foo${1:abc}$0'); + session.insert(); assertSelections(editor, new Selection(1, 1, 1, 4), new Selection(1, 7, 1, 10), new Selection(2, 5, 2, 8), new Selection(2, 11, 2, 14), @@ -101,16 +101,16 @@ suite('SnippetSession', function () { }); test('snippets, just text', function () { - const session = new SnippetSession(editor); - session.insert('foobar'); + const session = new SnippetSession(editor, 'foobar'); + session.insert(); assert.equal(model.getValue(), 'foobarfunction foo() {\n foobarconsole.log(a);\n}'); assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); }); test('snippets, selections and new text with newlines', () => { - const session = new SnippetSession(editor); - session.insert('foo\n\t${1:bar}\n$0'); + const session = new SnippetSession(editor, 'foo\n\t${1:bar}\n$0'); + session.insert(); assert.equal(editor.getModel().getValue(), 'foo\n bar\nfunction foo() {\n foo\n bar\n console.log(a);\n}'); @@ -122,8 +122,8 @@ suite('SnippetSession', function () { test('snippets, selections -> next/prev', () => { - const session = new SnippetSession(editor); - session.insert('f$1oo${2:bar}foo$0'); + const session = new SnippetSession(editor, 'f$1oo${2:bar}foo$0'); + session.insert(); // @ $2 assertSelections(editor, new Selection(1, 2, 1, 2), new Selection(2, 6, 2, 6)); @@ -142,8 +142,8 @@ suite('SnippetSession', function () { }); test('snippets, selections & typing', function () { - const session = new SnippetSession(editor); - session.insert('f${1:oo}_$2_$0'); + const session = new SnippetSession(editor, 'f${1:oo}_$2_$0'); + session.insert(); editor.trigger('test', 'type', { text: 'X' }); session.next(); @@ -167,7 +167,7 @@ suite('SnippetSession', function () { model.setValue('foo_bar_foo'); editor.setSelections([new Selection(1, 1, 1, 4), new Selection(1, 9, 1, 12)]); - new SnippetSession(editor).insert('x$0'); + new SnippetSession(editor, 'x$0').insert(); assert.equal(model.getValue(), 'x_bar_x'); assertSelections(editor, new Selection(1, 2, 1, 2), new Selection(1, 8, 1, 8)); }); @@ -176,7 +176,7 @@ suite('SnippetSession', function () { model.setValue('foo_bar_foo'); editor.setSelections([new Selection(1, 1, 1, 4), new Selection(1, 9, 1, 12)]); - new SnippetSession(editor).insert('LONGER$0'); + new SnippetSession(editor, 'LONGER$0').insert(); assert.equal(model.getValue(), 'LONGER_bar_LONGER'); assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(1, 18, 1, 18)); }); @@ -184,8 +184,8 @@ suite('SnippetSession', function () { test('snippets, don\'t grow final tabstop', function () { model.setValue('foo_zzz_foo'); editor.setSelection(new Selection(1, 5, 1, 8)); - const session = new SnippetSession(editor); - session.insert('$1bar$0'); + const session = new SnippetSession(editor, '$1bar$0'); + session.insert(); assertSelections(editor, new Selection(1, 5, 1, 5)); editor.trigger('test', 'type', { text: 'foo-' }); @@ -204,8 +204,8 @@ suite('SnippetSession', function () { test('snippets, don\'t merge touching tabstops 1/2', function () { - const session = new SnippetSession(editor); - session.insert('$1$2$3$0'); + const session = new SnippetSession(editor, '$1$2$3$0'); + session.insert(); assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); session.next(); @@ -242,8 +242,8 @@ suite('SnippetSession', function () { }); test('snippets, don\'t merge touching tabstops 2/2', function () { - const session = new SnippetSession(editor); - session.insert('$1$2$3$0'); + const session = new SnippetSession(editor, '$1$2$3$0'); + session.insert(); assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); editor.trigger('test', 'type', { text: '111' }); @@ -261,8 +261,8 @@ suite('SnippetSession', function () { }); test('snippets, gracefully move over final tabstop', function () { - const session = new SnippetSession(editor); - session.insert('${1}bar$0'); + const session = new SnippetSession(editor, '${1}bar$0'); + session.insert(); assert.equal(session.isAtFinalPlaceholder, false); assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); @@ -277,8 +277,8 @@ suite('SnippetSession', function () { }); test('snippets, overwriting nested placeholder', function () { - const session = new SnippetSession(editor); - session.insert('log(${1:"$2"});$0'); + const session = new SnippetSession(editor, 'log(${1:"$2"});$0'); + session.insert(); assertSelections(editor, new Selection(1, 5, 1, 7), new Selection(2, 9, 2, 11)); editor.trigger('test', 'type', { text: 'XXX' }); @@ -294,8 +294,8 @@ suite('SnippetSession', function () { }); test('snippets, selections and snippet ranges', function () { - const session = new SnippetSession(editor); - session.insert('${1:foo}farboo${2:bar}$0'); + const session = new SnippetSession(editor, '${1:foo}farboo${2:bar}$0'); + session.insert(); assert.equal(model.getValue(), 'foofarboobarfunction foo() {\n foofarboobarconsole.log(a);\n}'); assertSelections(editor, new Selection(1, 1, 1, 4), new Selection(2, 5, 2, 8)); @@ -330,13 +330,13 @@ suite('SnippetSession', function () { model.setValue(''); editor.setSelection(new Selection(1, 1, 1, 1)); - const first = new SnippetSession(editor); - first.insert('foo${2:bar}foo$0'); + const first = new SnippetSession(editor, 'foo${2:bar}foo$0'); + first.insert(); assert.equal(model.getValue(), 'foobarfoo'); assertSelections(editor, new Selection(1, 4, 1, 7)); - const second = new SnippetSession(editor); - second.insert('ba${1:zzzz}$0'); + const second = new SnippetSession(editor, 'ba${1:zzzz}$0'); + second.insert(); assert.equal(model.getValue(), 'foobazzzzfoo'); assertSelections(editor, new Selection(1, 6, 1, 10)); @@ -351,8 +351,8 @@ suite('SnippetSession', function () { test('snippets, typing at final tabstop', function () { - const session = new SnippetSession(editor); - session.insert('farboo$0'); + const session = new SnippetSession(editor, 'farboo$0'); + session.insert(); assert.equal(session.isAtFinalPlaceholder, true); assert.equal(session.isSelectionWithinPlaceholders(), false); @@ -363,8 +363,8 @@ suite('SnippetSession', function () { test('snippets, typing at beginning', function () { editor.setSelection(new Selection(1, 2, 1, 2)); - const session = new SnippetSession(editor); - session.insert('farboo$0'); + const session = new SnippetSession(editor, 'farboo$0'); + session.insert(); editor.setSelection(new Selection(1, 2, 1, 2)); assert.equal(session.isSelectionWithinPlaceholders(), false); @@ -381,8 +381,8 @@ suite('SnippetSession', function () { test('snippets, typing with nested placeholder', function () { editor.setSelection(new Selection(1, 1, 1, 1)); - const session = new SnippetSession(editor); - session.insert('This ${1:is ${2:nested}}.$0'); + const session = new SnippetSession(editor, 'This ${1:is ${2:nested}}.$0'); + session.insert(); assertSelections(editor, new Selection(1, 6, 1, 15)); session.next(); @@ -397,8 +397,8 @@ suite('SnippetSession', function () { }); test('snippets, snippet with variables', function () { - const session = new SnippetSession(editor); - session.insert('@line=$TM_LINE_NUMBER$0'); + const session = new SnippetSession(editor, '@line=$TM_LINE_NUMBER$0'); + session.insert(); assert.equal(model.getValue(), '@line=1function foo() {\n @line=2console.log(a);\n}'); assertSelections(editor, new Selection(1, 8, 1, 8), new Selection(2, 12, 2, 12)); From f8a959aec0cfe896c0e3bf32bf81a1592524d8b3 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 26 May 2017 18:47:47 +0200 Subject: [PATCH 1104/1164] make final tabstops of nested snippets normal tabstop, #24855 --- .../snippet/browser/snippetController2.ts | 10 +++---- .../contrib/snippet/browser/snippetSession.ts | 29 +++++++++++-------- .../test/browser/snippetController2.test.ts | 4 +-- .../test/browser/snippetSession.test.ts | 22 +++++++------- 4 files changed, 34 insertions(+), 31 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetController2.ts b/src/vs/editor/contrib/snippet/browser/snippetController2.ts index fbf4764ba64..4c210d851ac 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetController2.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetController2.ts @@ -35,13 +35,11 @@ class SnippetSessions { } get isAtFirstPlaceholder(): boolean { - // return !this.empty && this._stack[0].isAtFirstPlaceholder; return this._stack.every(s => s.isAtFirstPlaceholder); } get isAtFinalPlaceholder(): boolean { - // return !this.empty && this._stack[0].isAtFinalPlaceholder; - return this._stack.every(s => s.isAtFinalPlaceholder); + return !this.empty && this._stack[0].isAtLastPlaceholder; } get isSelectionWithinPlaceholders(): boolean { @@ -61,7 +59,7 @@ class SnippetSessions { next(): void { for (let i = this._stack.length - 1; i >= 0; i--) { const snippet = this._stack[i]; - if (!snippet.isAtFinalPlaceholder) { + if (!snippet.isAtLastPlaceholder) { snippet.next(); break; } @@ -123,8 +121,8 @@ export class SnippetController2 { } const snippet = new SnippetSession(this._editor, template, overwriteBefore, overwriteAfter); - this._sessions.add(snippet); - snippet.insert(); + const newLen = this._sessions.add(snippet); + snippet.insert(newLen > 1); if (undoStopAfter) { this._editor.getModel().pushStackElement(); diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.ts b/src/vs/editor/contrib/snippet/browser/snippetSession.ts index de1eea466b9..c4fcdaa3e41 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.ts @@ -130,17 +130,11 @@ export class OneSnippet { } get isAtFirstPlaceholder() { - return this._placeholderGroupsIdx === 0 || this._placeholderGroups.length === 0; + return this._placeholderGroupsIdx <= 0 || this._placeholderGroups.length === 0; } - get isAtFinalPlaceholder() { - if (this._placeholderGroups.length === 0) { - return true; - } else if (this._placeholderGroupsIdx < 0) { - return false; - } else { - return this._placeholderGroups[this._placeholderGroupsIdx][0].isFinalTabstop; - } + get isAtLastPlaceholder() { + return this._placeholderGroupsIdx === this._placeholderGroups.length - 1; } get hasPlaceholder() { @@ -215,7 +209,7 @@ export class SnippetSession { dispose(this._snippets); } - insert(): void { + insert(ignoreFinalTabstops: boolean = false): void { const model = this._editor.getModel(); const edits: IIdentifiedSingleEditOperation[] = []; @@ -260,6 +254,17 @@ export class SnippetSession { const adjustedTemplate = SnippetSession.adjustWhitespace(model, start, this._template); const snippet = SnippetParser.parse(adjustedTemplate).resolveVariables(new EditorSnippetVariableResolver(model, snippetSelection)); + + // rewrite final-tabstop to some other placeholder because this + // snippet sits inside another snippet + if (ignoreFinalTabstops) { + for (const placeholder of snippet.placeholders) { + if (placeholder.isFinalTabstop) { + placeholder.index = String(snippet.placeholders.length); + } + } + } + const offset = model.getOffsetAt(start) + delta; delta += snippet.text.length - model.getValueLengthInRange(snippetSelection); @@ -304,8 +309,8 @@ export class SnippetSession { return this._snippets[0].isAtFirstPlaceholder; } - get isAtFinalPlaceholder() { - return this._snippets[0].isAtFinalPlaceholder; + get isAtLastPlaceholder() { + return this._snippets[0].isAtLastPlaceholder; } get hasPlaceholder() { diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts index ce84d8796d8..7a485ac4f6b 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetController2.test.ts @@ -154,8 +154,8 @@ suite('SnippetController2', function () { assertContextKeys(contextKeys, true, false, true); assertSelections(editor, new Selection(1, 1, 1, 7), new Selection(2, 5, 2, 11)); - ctrl.insert('farboo$1$0'); - assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); + ctrl.insert('far$1boo$0'); + assertSelections(editor, new Selection(1, 4, 1, 4), new Selection(2, 8, 2, 8)); assertContextKeys(contextKeys, true, false, true); ctrl.next(); diff --git a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts index 5d5db85fb93..4691eaad476 100644 --- a/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts +++ b/src/vs/editor/contrib/snippet/test/browser/snippetSession.test.ts @@ -257,22 +257,22 @@ suite('SnippetSession', function () { editor.trigger('test', 'type', { text: '333' }); session.next(); - assert.equal(session.isAtFinalPlaceholder, true); + assert.equal(session.isAtLastPlaceholder, true); }); test('snippets, gracefully move over final tabstop', function () { const session = new SnippetSession(editor, '${1}bar$0'); session.insert(); - assert.equal(session.isAtFinalPlaceholder, false); + assert.equal(session.isAtLastPlaceholder, false); assertSelections(editor, new Selection(1, 1, 1, 1), new Selection(2, 5, 2, 5)); session.next(); - assert.equal(session.isAtFinalPlaceholder, true); + assert.equal(session.isAtLastPlaceholder, true); assertSelections(editor, new Selection(1, 4, 1, 4), new Selection(2, 8, 2, 8)); session.next(); - assert.equal(session.isAtFinalPlaceholder, true); + assert.equal(session.isAtLastPlaceholder, true); assertSelections(editor, new Selection(1, 4, 1, 4), new Selection(2, 8, 2, 8)); }); @@ -285,11 +285,11 @@ suite('SnippetSession', function () { assert.equal(model.getValue(), 'log(XXX);function foo() {\n log(XXX);console.log(a);\n}'); session.next(); - assert.equal(session.isAtFinalPlaceholder, false); + assert.equal(session.isAtLastPlaceholder, false); // assertSelections(editor, new Selection(1, 7, 1, 7), new Selection(2, 11, 2, 11)); session.next(); - assert.equal(session.isAtFinalPlaceholder, true); + assert.equal(session.isAtLastPlaceholder, true); assertSelections(editor, new Selection(1, 10, 1, 10), new Selection(2, 14, 2, 14)); }); @@ -321,7 +321,7 @@ suite('SnippetSession', function () { // reset selection to placeholder session.next(); assert.equal(session.isSelectionWithinPlaceholders(), true); - assert.equal(session.isAtFinalPlaceholder, true); + assert.equal(session.isAtLastPlaceholder, true); assertSelections(editor, new Selection(1, 13, 1, 13), new Selection(2, 17, 2, 17)); }); @@ -341,11 +341,11 @@ suite('SnippetSession', function () { assertSelections(editor, new Selection(1, 6, 1, 10)); second.next(); - assert.equal(second.isAtFinalPlaceholder, true); + assert.equal(second.isAtLastPlaceholder, true); assertSelections(editor, new Selection(1, 10, 1, 10)); first.next(); - assert.equal(first.isAtFinalPlaceholder, true); + assert.equal(first.isAtLastPlaceholder, true); assertSelections(editor, new Selection(1, 13, 1, 13)); }); @@ -353,7 +353,7 @@ suite('SnippetSession', function () { const session = new SnippetSession(editor, 'farboo$0'); session.insert(); - assert.equal(session.isAtFinalPlaceholder, true); + assert.equal(session.isAtLastPlaceholder, true); assert.equal(session.isSelectionWithinPlaceholders(), false); editor.trigger('test', 'type', { text: 'XXX' }); @@ -368,7 +368,7 @@ suite('SnippetSession', function () { editor.setSelection(new Selection(1, 2, 1, 2)); assert.equal(session.isSelectionWithinPlaceholders(), false); - assert.equal(session.isAtFinalPlaceholder, true); + assert.equal(session.isAtLastPlaceholder, true); editor.trigger('test', 'type', { text: 'XXX' }); assert.equal(model.getLineContent(1), 'fXXXfarboounction foo() {'); From 3e7152fb4d0e69e539329c729f54868f2d605cfd Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 26 May 2017 18:58:47 +0200 Subject: [PATCH 1105/1164] snippets - remove unused css --- src/vs/editor/contrib/snippet/browser/snippetSession.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/vs/editor/contrib/snippet/browser/snippetSession.css b/src/vs/editor/contrib/snippet/browser/snippetSession.css index 6f839f10d22..b6c7d72adda 100644 --- a/src/vs/editor/contrib/snippet/browser/snippetSession.css +++ b/src/vs/editor/contrib/snippet/browser/snippetSession.css @@ -3,10 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -.monaco-editor.vs .new-snippet { background-color: rgba(10, 50, 150, 0.1); } -.monaco-editor.vs-dark .new-snippet { background-color: rgba(100, 105, 110, 0.1); } -.monaco-editor.hc-black .new-snippet { background-color: rgba(100, 105, 110, 0.1); } - .monaco-editor.vs .snippet-placeholder { background-color: rgba(10, 50, 100, 0.1); } .monaco-editor.vs-dark .snippet-placeholder { background-color: rgba(124, 124, 124, 0.1); } .monaco-editor.hc-black .snippet-placeholder { background-color: rgba(124, 124, 124, 0.1); } From 0ece9b10815b7014ebcba4838f10c4ace2522eb1 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 26 May 2017 12:03:17 -0700 Subject: [PATCH 1106/1164] Update markdown extension contributes key names --- extensions/markdown/src/extension.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/markdown/src/extension.ts b/extensions/markdown/src/extension.ts index 8e459df89a2..4deb344b9f2 100644 --- a/extensions/markdown/src/extension.ts +++ b/extensions/markdown/src/extension.ts @@ -61,7 +61,7 @@ export function activate(context: vscode.ExtensionContext) { continue; } - let styles = contributes['markdown.preview'] && contributes['markdown.preview'].styles; + let styles = contributes['markdown.previewStyles']; if (styles) { if (!Array.isArray(styles)) { styles = [styles]; @@ -75,7 +75,7 @@ export function activate(context: vscode.ExtensionContext) { } } - let scripts = contributes['markdown.preview'] && contributes['markdown.preview'].scripts; + let scripts = contributes['markdown.previewScripts']; if (scripts) { if (!Array.isArray(scripts)) { scripts = [scripts]; From f7288dfcb9eda68e7105e0e683cc52e1ddf55d10 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 26 May 2017 23:04:48 +0200 Subject: [PATCH 1107/1164] Ugly flicker upon first startup. Fixes #25448 --- src/vs/workbench/electron-browser/bootstrap/index.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/electron-browser/bootstrap/index.html b/src/vs/workbench/electron-browser/bootstrap/index.html index 018512e1164..1474a70e097 100644 --- a/src/vs/workbench/electron-browser/bootstrap/index.html +++ b/src/vs/workbench/electron-browser/bootstrap/index.html @@ -30,8 +30,9 @@ if (!backgroundColor) { backgroundColor = baseTheme === 'hc-black' ? '#000000' : (baseTheme === 'vs' ? '#FFFFFF' : '#1E1E1E'); } + let foregroundColor = baseTheme === 'hc-black' ? '#FFFFFF' : (baseTheme === 'vs' ? '#6C6C6C' : '#CCCCCC'); let style = document.createElement('style'); - style.innerHTML = '.monaco-shell { background-color:' + backgroundColor + '; }'; + style.innerHTML = '.monaco-shell { background-color:' + backgroundColor + '; color:' + foregroundColor + '; }'; document.head.appendChild(style); } catch (error) { From 5a83b55b70480eac2bf5d8fca4d628645bd48e02 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 26 May 2017 13:56:26 -0700 Subject: [PATCH 1108/1164] Fix a few potential issues for tsc task provider --- extensions/typescript/src/features/taskProvider.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/typescript/src/features/taskProvider.ts b/extensions/typescript/src/features/taskProvider.ts index ba53903e447..de8394594c9 100644 --- a/extensions/typescript/src/features/taskProvider.ts +++ b/extensions/typescript/src/features/taskProvider.ts @@ -45,21 +45,21 @@ export default class TypeScriptTaskProvider implements vscode.TaskProvider { return projects.map(configFile => { const configFileName = path.relative(rootPath, configFile); - const buildTask = new vscode.ShellTask(`tsc: build ${configFileName}`, `${command} -p ${configFile}`, '$tsc'); + const buildTask = new vscode.ShellTask(`tsc: build ${configFileName}`, `${command} -p "${configFile}"`, '$tsc'); buildTask.group = vscode.TaskGroup.Build; return buildTask; }); } private async getAllTsConfigs(token: vscode.CancellationToken): Promise { - const out: string[] = []; + const out = new Set(); const configs = (await this.getTsConfigForActiveFile(token)).concat(await this.getTsConfigsInWorkspace()); for (const config of configs) { if (await exists(config)) { - out.push(config); + out.add(config); } } - return out; + return Array.from(out); } private async getTsConfigForActiveFile(token: vscode.CancellationToken): Promise { From c9a2a5be88f67f0d1a82c5a53cf36891553a9dee Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Fri, 26 May 2017 14:24:15 -0700 Subject: [PATCH 1109/1164] Allow tsc tasks to be disabled using settings. Fixes #27312 --- extensions/typescript/package.json | 9 +++++ extensions/typescript/package.nls.json | 3 +- .../typescript/src/features/taskProvider.ts | 40 ++++++++++++++++++- extensions/typescript/src/typescriptMain.ts | 4 +- 4 files changed, 52 insertions(+), 4 deletions(-) diff --git a/extensions/typescript/package.json b/extensions/typescript/package.json index b039fac9631..cff9784cabe 100644 --- a/extensions/typescript/package.json +++ b/extensions/typescript/package.json @@ -315,6 +315,15 @@ "type": "boolean", "default": true, "description": "%javascript.nameSuggestions%" + }, + "typescript.tsc.autoDetect": { + "type": "string", + "default": "on", + "enum": [ + "on", + "off" + ], + "description": "%typescript.tsc.autoDetect%" } } }, diff --git a/extensions/typescript/package.nls.json b/extensions/typescript/package.nls.json index 821257b38a1..0679841532d 100644 --- a/extensions/typescript/package.nls.json +++ b/extensions/typescript/package.nls.json @@ -37,5 +37,6 @@ "jsDocCompletion.enabled": "Enable/disable auto JSDoc comments", "javascript.implicitProjectConfig.checkJs": "Enable/disable semantic checking of JavaScript files. Existing jsconfig.json or tsconfig.json files override this setting. Requires TypeScript >=2.3.1.", "typescript.check.npmIsInstalled": "Check if NPM is installed for automatic typings acquisition", - "javascript.nameSuggestions": "Enable/disable including unique names from the file in JavaScript suggestion lists." + "javascript.nameSuggestions": "Enable/disable including unique names from the file in JavaScript suggestion lists.", + "typescript.tsc.autoDetect": "Controls whether auto detection of tsc tasks is on or off." } diff --git a/extensions/typescript/src/features/taskProvider.ts b/extensions/typescript/src/features/taskProvider.ts index de8394594c9..4d50b233294 100644 --- a/extensions/typescript/src/features/taskProvider.ts +++ b/extensions/typescript/src/features/taskProvider.ts @@ -21,7 +21,10 @@ const exists = (file: string): Promise => }); }); -export default class TypeScriptTaskProvider implements vscode.TaskProvider { +/** + * Provides tasks for building `tsconfig.json` files in a project. + */ +class TscTaskProvider implements vscode.TaskProvider { private readonly tsconfigProvider: TsConfigProvider; public constructor( @@ -116,4 +119,39 @@ export default class TypeScriptTaskProvider implements vscode.TaskProvider { } return null; } +} + +type AutoDetect = 'on' | 'off'; + +/** + * Manages registrations of TypeScript task provides with VScode. + */ +export default class TypeScriptTaskProviderManager { + private taskProviderSub: vscode.Disposable | undefined = undefined; + private readonly disposables: vscode.Disposable[] = []; + + constructor( + private readonly lazyClient: () => TypeScriptServiceClient + ) { + vscode.workspace.onDidChangeConfiguration(this.onConfigurationChanged, this, this.disposables); + this.onConfigurationChanged(); + } + + dispose() { + if (this.taskProviderSub) { + this.taskProviderSub.dispose(); + this.taskProviderSub = undefined; + } + this.disposables.forEach(x => x.dispose()); + } + + private onConfigurationChanged() { + let autoDetect = vscode.workspace.getConfiguration('typescript.tsc').get('autoDetect'); + if (this.taskProviderSub && autoDetect === 'off') { + this.taskProviderSub.dispose(); + this.taskProviderSub = undefined; + } else if (!this.taskProviderSub && autoDetect === 'on') { + this.taskProviderSub = vscode.workspace.registerTaskProvider(new TscTaskProvider(this.lazyClient)); + } + } } \ No newline at end of file diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index 07a666936b9..9c207250932 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -41,7 +41,7 @@ import CodeActionProvider from './features/codeActionProvider'; import ReferenceCodeLensProvider from './features/referencesCodeLensProvider'; import { JsDocCompletionProvider, TryCompleteJsDocCommand } from './features/jsDocCompletionProvider'; import { DirectiveCommentCompletionProvider } from './features/directiveCommentCompletionProvider'; -import TypeScriptTaskProvider from './features/taskProvider'; +import TypeScriptTaskProviderManager from './features/taskProvider'; import ImplementationCodeLensProvider from './features/implementationsCodeLensProvider'; @@ -131,7 +131,7 @@ export function activate(context: ExtensionContext): void { lazyClientHost().serviceClient.restartTsServer(); })); - context.subscriptions.push(workspace.registerTaskProvider(new TypeScriptTaskProvider(() => lazyClientHost().serviceClient))); + context.subscriptions.push(new TypeScriptTaskProviderManager(() => lazyClientHost().serviceClient)); const goToProjectConfig = (isTypeScript: boolean) => { const editor = window.activeTextEditor; From 23c6f80062af89e8fba66d10e43eccd9d018c3f3 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Fri, 26 May 2017 14:47:57 -0700 Subject: [PATCH 1110/1164] Fix #26771 - use focus tracker to set search focus context keys --- src/vs/workbench/parts/search/browser/searchViewlet.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index 04837eb7f6e..97f51caa16c 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -498,7 +498,7 @@ export class SearchViewlet extends Viewlet { } })); - this.toUnbind.push(this.tree.addListener('focus', (event: any) => { + this.toUnbind.push(this.tree.onDOMFocus(e => { const focus = this.tree.getFocus(); this.firstMatchFocussed.set(this.tree.getNavigator().first() === this.tree.getFocus()); this.fileMatchOrMatchFocussed.set(true); From 5b09beb12bcd95f884ec43aaf1f45efcf9bfb7b5 Mon Sep 17 00:00:00 2001 From: kieferrm Date: Fri, 26 May 2017 15:03:50 -0700 Subject: [PATCH 1111/1164] Change default settings. Fixes #26893. --- src/vs/editor/common/config/editorOptions.ts | 8 ++++---- src/vs/workbench/electron-browser/main.contribution.ts | 2 +- .../electron-browser/extensions.contribution.ts | 2 +- .../themes/electron-browser/workbenchThemeService.ts | 3 ++- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 720302d227e..c6997e43114 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -2053,7 +2053,7 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { wordWrapBreakAfterCharacters: ' \t})]?|&,;¢°′″‰℃、。。、¢,.:;?!%・・ゝゞヽヾーァィゥェォッャュョヮヵヶぁぃぅぇぉっゃゅょゎゕゖㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ々〻ァィゥェォャュョッー’”〉》」』】〕)]}」', wordWrapBreakObtrusiveCharacters: '.', autoClosingBrackets: true, - dragAndDrop: false, + dragAndDrop: true, emptySelectionClipboard: true, useTabStops: true, multicursorModifier: 'altKey', @@ -2081,7 +2081,7 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { renderWhitespace: 'none', renderControlCharacters: false, fontLigatures: false, - renderIndentGuides: false, + renderIndentGuides: true, renderLineHighlight: 'line', scrollbar: { vertical: ScrollbarVisibility.Auto, @@ -2098,7 +2098,7 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { mouseWheelScrollSensitivity: 1, }, minimap: { - enabled: false, + enabled: true, renderCharacters: true, maxColumn: 120 }, @@ -2114,7 +2114,7 @@ export const EDITOR_DEFAULTS: IValidatedEditorOptions = { parameterHints: true, iconsInSuggestions: true, formatOnType: false, - formatOnPaste: false, + formatOnPaste: true, suggestOnTriggerCharacters: true, acceptSuggestionOnEnter: 'on', acceptSuggestionOnCommitCharacter: true, diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index 46b0bce9b76..53ab7b01760 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -182,7 +182,7 @@ let properties: { [path: string]: IJSONSchema; } = { nls.localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'window.openFilesInNewWindow.off' }, "Files will open in the window with the files' folder open or the last active window"), nls.localize({ comment: ['This is the description for a setting. Values surrounded by single quotes are not to be translated.'], key: 'window.openFilesInNewWindow.default' }, "Files will open in the window with the files' folder open or the last active window unless opened via the dock or from finder (macOS only)") ], - 'default': 'default', + 'default': 'off', 'description': nls.localize('openFilesInNewWindow', `Controls if files should open in a new window. diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts index 7e6ec97a78e..74161d1c27c 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts @@ -171,7 +171,7 @@ Registry.as(ConfigurationExtensions.Configuration) 'extensions.autoUpdate': { type: 'boolean', description: localize('extensionsAutoUpdate', "Automatically update extensions"), - default: false + default: true }, 'extensions.ignoreRecommendations': { type: 'boolean', diff --git a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts index 6e41871b060..4125a7a1ea8 100644 --- a/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/electron-browser/workbenchThemeService.ts @@ -51,6 +51,7 @@ const PERSISTED_THEME_STORAGE_KEY = 'colorThemeData'; const defaultThemeExtensionId = 'vscode-theme-defaults'; const oldDefaultThemeExtensionId = 'vscode-theme-colorful-defaults'; +const DEFAULT_ICON_THEME_SETTING_VALUE = 'vs-seti'; const fileIconsEnabledClass = 'file-icons-enabled'; const themingRegistry = Registry.as(ThemingExtensions.ThemingContribution); @@ -962,7 +963,7 @@ const colorThemeSettingSchema: IJSONSchema = { }; const iconThemeSettingSchema: IJSONSchema = { type: ['string', 'null'], - default: null, + default: DEFAULT_ICON_THEME_SETTING_VALUE, description: nls.localize('iconTheme', "Specifies the icon theme used in the workbench."), enum: [null], enumDescriptions: [nls.localize('noIconThemeDesc', 'No file icons')], From 8853b2db99a8a6f3151a08ecabf7727a8fb568a3 Mon Sep 17 00:00:00 2001 From: kieferrm Date: Fri, 26 May 2017 15:21:14 -0700 Subject: [PATCH 1112/1164] Ajust test to new defaults. See #26893. --- .../test/common/config/commonEditorConfig.test.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/test/common/config/commonEditorConfig.test.ts b/src/vs/editor/test/common/config/commonEditorConfig.test.ts index c07e1240c1f..2e2f47b16aa 100644 --- a/src/vs/editor/test/common/config/commonEditorConfig.test.ts +++ b/src/vs/editor/test/common/config/commonEditorConfig.test.ts @@ -89,13 +89,23 @@ suite('Common Editor Config', () => { let config = new TestWrappingConfiguration({ wordWrap: true }); - assertWrapping(config, true, 89); + assertWrapping(config, true, 81); }); test('wordWrap on', () => { let config = new TestWrappingConfiguration({ wordWrap: 'on' }); + assertWrapping(config, true, 81); + }); + + test('wordWrap on without minimap', () => { + let config = new TestWrappingConfiguration({ + wordWrap: 'on', + minimap: { + enabled: false + } + }); assertWrapping(config, true, 89); }); @@ -104,7 +114,7 @@ suite('Common Editor Config', () => { wordWrap: 'on', wordWrapColumn: 10 }); - assertWrapping(config, true, 89); + assertWrapping(config, true, 81); }); test('wordWrap off', () => { From 944d4f1391dab48dec301bbb3a042921688d8cfb Mon Sep 17 00:00:00 2001 From: Daniel Ye Date: Fri, 26 May 2017 19:26:40 -0700 Subject: [PATCH 1113/1164] 2017-05-26. Merged in translation from transifex. --- .../chs/extensions/git/out/commands.i18n.json | 3 +++ i18n/chs/extensions/git/package.i18n.json | 1 + .../out/codelensProvider.i18n.json | 4 +++- .../out/commandHandler.i18n.json | 6 +++++- .../out/mergeDecorator.i18n.json | 4 +++- .../merge-conflict/package.i18n.json | 8 +++++++- i18n/chs/extensions/npm/package.i18n.json | 4 +++- .../out/features/bufferSyncSupport.i18n.json | 2 +- .../extensions/typescript/package.i18n.json | 1 + .../vs/code/electron-main/windows.i18n.json | 1 - .../browser/goToDeclarationCommands.i18n.json | 19 +------------------ .../browser/goToDeclarationMouse.i18n.json | 4 +--- .../electron-browser/workbench.i18n.json | 6 ++++++ .../extensionsUtils.i18n.json | 5 +++-- .../dirtydiffDecorator.i18n.json | 6 ++++++ .../out/codelensProvider.i18n.json | 7 ++++++- .../out/commandHandler.i18n.json | 5 ++++- .../out/mergeDecorator.i18n.json | 5 ++++- .../merge-conflict/package.i18n.json | 15 ++++++++++++++- i18n/cht/extensions/npm/package.i18n.json | 4 +++- .../vs/code/electron-main/windows.i18n.json | 1 - .../electron-browser/workbench.i18n.json | 6 ++++++ .../extensionsUtils.i18n.json | 5 +++-- .../dirtydiffDecorator.i18n.json | 6 ++++++ .../vs/code/electron-main/windows.i18n.json | 1 - .../electron-browser/workbench.i18n.json | 6 ++++++ .../extensionsUtils.i18n.json | 5 +++-- .../dirtydiffDecorator.i18n.json | 6 ++++++ .../esn/extensions/git/out/commands.i18n.json | 3 +++ i18n/esn/extensions/git/package.i18n.json | 1 + .../markdown/out/extension.i18n.json | 4 +++- .../out/codelensProvider.i18n.json | 7 ++++++- .../out/commandHandler.i18n.json | 8 +++++++- .../out/mergeDecorator.i18n.json | 5 ++++- .../merge-conflict/package.i18n.json | 16 +++++++++++++++- i18n/esn/extensions/npm/package.i18n.json | 4 +++- .../extensions/typescript/package.i18n.json | 1 + .../vs/code/electron-main/windows.i18n.json | 1 - .../electron-browser/workbench.i18n.json | 6 ++++++ .../statusbarColorProvider.i18n.json | 3 ++- .../extensionsUtils.i18n.json | 5 +++-- .../browser/files.contribution.i18n.json | 1 + .../dirtydiffDecorator.i18n.json | 6 ++++++ .../vs/code/electron-main/windows.i18n.json | 1 - .../electron-browser/workbench.i18n.json | 6 ++++++ .../extensionsUtils.i18n.json | 5 +++-- .../dirtydiffDecorator.i18n.json | 6 ++++++ .../vs/code/electron-main/windows.i18n.json | 1 - .../electron-browser/workbench.i18n.json | 6 ++++++ .../extensionsUtils.i18n.json | 5 +++-- .../dirtydiffDecorator.i18n.json | 6 ++++++ .../jpn/extensions/git/out/commands.i18n.json | 3 +++ i18n/jpn/extensions/git/package.i18n.json | 1 + .../markdown/out/extension.i18n.json | 4 +++- .../out/codelensProvider.i18n.json | 4 +++- .../out/commandHandler.i18n.json | 6 +++++- .../out/mergeDecorator.i18n.json | 4 +++- .../merge-conflict/package.i18n.json | 8 +++++++- i18n/jpn/extensions/npm/package.i18n.json | 4 +++- .../extensions/typescript/package.i18n.json | 1 + .../resourceviewer/resourceViewer.i18n.json | 1 + .../vs/code/electron-main/windows.i18n.json | 1 - .../common/view/editorColorRegistry.i18n.json | 6 +++++- .../contrib/links/browser/links.i18n.json | 1 + .../electron-browser/workbench.i18n.json | 6 ++++++ .../statusbarColorProvider.i18n.json | 3 ++- .../browser/extensionsActions.i18n.json | 4 ++++ .../extensionsUtils.i18n.json | 5 +++-- .../browser/files.contribution.i18n.json | 1 + .../dirtydiffDecorator.i18n.json | 6 ++++++ .../electron-browser/TMSnippets.i18n.json | 3 ++- .../vs/code/electron-main/windows.i18n.json | 1 - .../electron-browser/workbench.i18n.json | 6 ++++++ .../extensionsUtils.i18n.json | 5 +++-- .../dirtydiffDecorator.i18n.json | 6 ++++++ .../ptb/extensions/git/out/commands.i18n.json | 3 +++ i18n/ptb/extensions/git/package.i18n.json | 1 + .../markdown/out/extension.i18n.json | 4 +++- .../out/codelensProvider.i18n.json | 7 ++++++- .../out/commandHandler.i18n.json | 8 +++++++- .../out/mergeDecorator.i18n.json | 5 ++++- .../merge-conflict/package.i18n.json | 16 +++++++++++++++- i18n/ptb/extensions/npm/package.i18n.json | 4 +++- .../extensions/typescript/package.i18n.json | 1 + .../resourceviewer/resourceViewer.i18n.json | 1 + .../vs/code/electron-main/windows.i18n.json | 1 - .../config/commonEditorConfig.i18n.json | 4 ++++ .../common/view/editorColorRegistry.i18n.json | 6 +++++- .../contrib/links/browser/links.i18n.json | 1 + .../parts/editor/editorStatus.i18n.json | 1 + .../src/vs/workbench/common/theme.i18n.json | 6 ++++++ .../electron-browser/workbench.i18n.json | 6 ++++++ .../statusbarColorProvider.i18n.json | 3 ++- .../emmet.contribution.i18n.json | 3 ++- .../browser/extensionsActions.i18n.json | 9 ++++++++- .../extensionsUtils.i18n.json | 6 ++++-- .../browser/files.contribution.i18n.json | 1 + .../dirtydiffDecorator.i18n.json | 6 ++++++ .../electron-browser/TMSnippets.i18n.json | 3 ++- .../vs/code/electron-main/windows.i18n.json | 1 - .../electron-browser/workbench.i18n.json | 6 ++++++ .../extensionsUtils.i18n.json | 5 +++-- .../dirtydiffDecorator.i18n.json | 6 ++++++ 103 files changed, 378 insertions(+), 89 deletions(-) create mode 100644 i18n/chs/src/vs/workbench/electron-browser/workbench.i18n.json create mode 100644 i18n/chs/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json create mode 100644 i18n/cht/src/vs/workbench/electron-browser/workbench.i18n.json create mode 100644 i18n/cht/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json create mode 100644 i18n/deu/src/vs/workbench/electron-browser/workbench.i18n.json create mode 100644 i18n/deu/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json create mode 100644 i18n/esn/src/vs/workbench/electron-browser/workbench.i18n.json create mode 100644 i18n/esn/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json create mode 100644 i18n/fra/src/vs/workbench/electron-browser/workbench.i18n.json create mode 100644 i18n/fra/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json create mode 100644 i18n/ita/src/vs/workbench/electron-browser/workbench.i18n.json create mode 100644 i18n/ita/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/electron-browser/workbench.i18n.json create mode 100644 i18n/jpn/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json create mode 100644 i18n/kor/src/vs/workbench/electron-browser/workbench.i18n.json create mode 100644 i18n/kor/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/electron-browser/workbench.i18n.json create mode 100644 i18n/ptb/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json create mode 100644 i18n/rus/src/vs/workbench/electron-browser/workbench.i18n.json create mode 100644 i18n/rus/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json diff --git a/i18n/chs/extensions/git/out/commands.i18n.json b/i18n/chs/extensions/git/out/commands.i18n.json index 3a000b98773..ceede002e08 100644 --- a/i18n/chs/extensions/git/out/commands.i18n.json +++ b/i18n/chs/extensions/git/out/commands.i18n.json @@ -26,6 +26,9 @@ "provide commit message": "请提供提交消息", "branch name": "分支名称", "provide branch name": "请提供分支名称", + "select branch to delete": "选择要删除的分支", + "confirm force delete branch": "“{0}”分支未被完全合并。是否仍要删除?", + "delete branch": "删除分支", "no remotes to pull": "存储库未配置任何从其中进行拉取的远程存储库。", "no remotes to push": "存储库未配置任何要推送到的远程存储库。", "nobranch": "请签出一个分支以推送到远程。", diff --git a/i18n/chs/extensions/git/package.i18n.json b/i18n/chs/extensions/git/package.i18n.json index bed9f4de89c..9c65f275fd6 100644 --- a/i18n/chs/extensions/git/package.i18n.json +++ b/i18n/chs/extensions/git/package.i18n.json @@ -26,6 +26,7 @@ "command.undoCommit": "撤消上次提交", "command.checkout": "签出到...", "command.branch": "创建分支...", + "command.deleteBranch": "删除分支...", "command.pull": "拉取", "command.pullRebase": "拉取(变基)", "command.push": "推送", diff --git a/i18n/chs/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/chs/extensions/merge-conflict/out/codelensProvider.i18n.json index 8b6ad71cd4e..3590523ef87 100644 --- a/i18n/chs/extensions/merge-conflict/out/codelensProvider.i18n.json +++ b/i18n/chs/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "acceptCurrentChange": "采用当前更改" +} \ No newline at end of file diff --git a/i18n/chs/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/chs/extensions/merge-conflict/out/commandHandler.i18n.json index 8b6ad71cd4e..996cf7276b8 100644 --- a/i18n/chs/extensions/merge-conflict/out/commandHandler.i18n.json +++ b/i18n/chs/extensions/merge-conflict/out/commandHandler.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "cursorNotInConflict": "编辑器光标不在合并冲突内", + "noConflicts": "没有在此文件中找到合并冲突", + "noOtherConflictsInThisFile": "此文件中没有其他合并冲突了" +} \ No newline at end of file diff --git a/i18n/chs/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/chs/extensions/merge-conflict/out/mergeDecorator.i18n.json index 8b6ad71cd4e..feac7a236d8 100644 --- a/i18n/chs/extensions/merge-conflict/out/mergeDecorator.i18n.json +++ b/i18n/chs/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "currentChange": "(当前更改)" +} \ No newline at end of file diff --git a/i18n/chs/extensions/merge-conflict/package.i18n.json b/i18n/chs/extensions/merge-conflict/package.i18n.json index 8b6ad71cd4e..82e4bc58463 100644 --- a/i18n/chs/extensions/merge-conflict/package.i18n.json +++ b/i18n/chs/extensions/merge-conflict/package.i18n.json @@ -3,4 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "command.category": "合并冲突", + "command.next": "下一个冲突", + "command.previous": "上一个冲突", + "command.compare": "比较当前冲突", + "config.title": "合并冲突" +} \ No newline at end of file diff --git a/i18n/chs/extensions/npm/package.i18n.json b/i18n/chs/extensions/npm/package.i18n.json index 8b6ad71cd4e..6130b12cc05 100644 --- a/i18n/chs/extensions/npm/package.i18n.json +++ b/i18n/chs/extensions/npm/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.npm.autoDetect": "控制自动检测 npm 脚本是否打开。默认开启。" +} \ No newline at end of file diff --git a/i18n/chs/extensions/typescript/out/features/bufferSyncSupport.i18n.json b/i18n/chs/extensions/typescript/out/features/bufferSyncSupport.i18n.json index c885212097a..9dcaf692d8f 100644 --- a/i18n/chs/extensions/typescript/out/features/bufferSyncSupport.i18n.json +++ b/i18n/chs/extensions/typescript/out/features/bufferSyncSupport.i18n.json @@ -6,7 +6,7 @@ { "versionMismatch": "版本不匹配! 全局 tsc ({0}) != VS Code 的语言服务({1})。可能出现不一致的编译错误", "moreInformation": "详细信息", - "doNotCheckAgain": "不要再次检查", + "doNotCheckAgain": "不再检查", "close": "关闭", "updateTscCheck": "已将用户设置 \"typescript.check.tscVersion\" 更新为 false" } \ No newline at end of file diff --git a/i18n/chs/extensions/typescript/package.i18n.json b/i18n/chs/extensions/typescript/package.i18n.json index 7d185d9e36e..e9bd0e95be0 100644 --- a/i18n/chs/extensions/typescript/package.i18n.json +++ b/i18n/chs/extensions/typescript/package.i18n.json @@ -37,6 +37,7 @@ "typescript.referencesCodeLens.enabled": "启用/禁用在 TypeScript 文件中引用 CodeLens。要求 TypeScript >= 2.0.6。", "typescript.implementationsCodeLens.enabled": "启用/禁用实现 CodeLens。要求 TypeScript >= 2.2.0。", "typescript.openTsServerLog.title": "打开 TS 服务器日志", + "typescript.restartTsServer": "重启 TS 服务器", "typescript.selectTypeScriptVersion.title": "选择 TypeScript 版本", "jsDocCompletion.enabled": "启用/禁用自动 JSDoc 注释", "javascript.implicitProjectConfig.checkJs": "启用/禁用 JavaScript 文件的语义检查。现有的 jsconfig.json 或\n tsconfig.json 文件会覆盖此设置。要求 TypeScript >=2.3.1。", diff --git a/i18n/chs/src/vs/code/electron-main/windows.i18n.json b/i18n/chs/src/vs/code/electron-main/windows.i18n.json index 6982cf6190c..55246096dd2 100644 --- a/i18n/chs/src/vs/code/electron-main/windows.i18n.json +++ b/i18n/chs/src/vs/code/electron-main/windows.i18n.json @@ -7,7 +7,6 @@ "ok": "确定", "pathNotExistTitle": "路径不存在", "pathNotExistDetail": "磁盘上似乎不再存在路径“{0}”。", - "accessibilityOptionsWindowTitle": "辅助功能选项", "reopen": "重新打开", "wait": "保持等待", "close": "关闭", diff --git a/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json b/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json index e788771d2f2..8b6ad71cd4e 100644 --- a/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationCommands.i18n.json @@ -3,21 +3,4 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{ - "noResultWord": "未找到“{0}”的任何定义", - "generic.noResults": "找不到定义", - "meta.title": " – {0} 定义", - "actions.goToDecl.label": "转到定义", - "actions.goToDeclToSide.label": "打开侧边的定义", - "actions.previewDecl.label": "查看定义", - "goToImplementation.noResultWord": "未找到“{0}”的实现", - "goToImplementation.generic.noResults": "未找到实现", - "meta.implementations.title": "– {0} 个实现", - "actions.goToImplementation.label": "转到实现", - "actions.peekImplementation.label": "速览实现", - "goToTypeDefinition.noResultWord": "未找到“{0}”的类型定义", - "goToTypeDefinition.generic.noResults": "未找到类型定义", - "meta.typeDefinitions.title": " – {0} 个类型定义", - "actions.goToTypeDefinition.label": "转到类型定义", - "actions.peekTypeDefinition.label": "快速查看类型定义" -} \ No newline at end of file +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json b/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json index ab0b4761cf9..8b6ad71cd4e 100644 --- a/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json +++ b/i18n/chs/src/vs/editor/contrib/goToDeclaration/browser/goToDeclarationMouse.i18n.json @@ -3,6 +3,4 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{ - "multipleResults": "单击显示 {0} 个定义。" -} \ No newline at end of file +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/electron-browser/workbench.i18n.json b/i18n/chs/src/vs/workbench/electron-browser/workbench.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/electron-browser/workbench.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 5a4bf096f38..a8554464048 100644 --- a/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/chs/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "disableOtherKeymapsConfirmation": "是否禁用其他键映射以避免键绑定之间的冲突?", "yes": "是", - "no": "否" + "no": "否", + "uninstall": "卸载", + "later": "稍后" } \ No newline at end of file diff --git a/i18n/chs/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json b/i18n/chs/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/chs/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/cht/extensions/merge-conflict/out/codelensProvider.i18n.json index 8b6ad71cd4e..fd3fc4ee512 100644 --- a/i18n/cht/extensions/merge-conflict/out/codelensProvider.i18n.json +++ b/i18n/cht/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -3,4 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "acceptCurrentChange": "接受當前變更", + "acceptIncomingChange": "接受來源變更", + "acceptBothChanges": "接受兩者變更", + "compareChanges": "比較變更" +} \ No newline at end of file diff --git a/i18n/cht/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/cht/extensions/merge-conflict/out/commandHandler.i18n.json index 8b6ad71cd4e..b72349a9332 100644 --- a/i18n/cht/extensions/merge-conflict/out/commandHandler.i18n.json +++ b/i18n/cht/extensions/merge-conflict/out/commandHandler.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "noConflicts": "檔案內找不到需要合併衝突項目", + "noOtherConflictsInThisFile": "此檔案內沒有其他的衝突合併項目" +} \ No newline at end of file diff --git a/i18n/cht/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/cht/extensions/merge-conflict/out/mergeDecorator.i18n.json index 8b6ad71cd4e..1282a1b3de3 100644 --- a/i18n/cht/extensions/merge-conflict/out/mergeDecorator.i18n.json +++ b/i18n/cht/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "currentChange": "(目前變更)", + "incomingChange": "(來源變更)" +} \ No newline at end of file diff --git a/i18n/cht/extensions/merge-conflict/package.i18n.json b/i18n/cht/extensions/merge-conflict/package.i18n.json index 8b6ad71cd4e..1afd0effd3e 100644 --- a/i18n/cht/extensions/merge-conflict/package.i18n.json +++ b/i18n/cht/extensions/merge-conflict/package.i18n.json @@ -3,4 +3,17 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "command.category": "合併衝突", + "command.accept.all-incoming": "接受所有來源", + "command.accept.all-both": "接受兩者", + "command.accept.current": "接受當前項目", + "command.accept.incoming": "接受來源", + "command.accept.selection": "接受選取項目", + "command.accept.both": "接受兩者", + "command.next": "後一個衝突", + "command.previous": "前一個衝突", + "command.compare": "比較目前衝突", + "config.title": "合併衝突", + "config.codeLensEnabled": "啟用/停用 編輯器CodeLens衝突合併 " +} \ No newline at end of file diff --git a/i18n/cht/extensions/npm/package.i18n.json b/i18n/cht/extensions/npm/package.i18n.json index 8b6ad71cd4e..74cbc6cffe4 100644 --- a/i18n/cht/extensions/npm/package.i18n.json +++ b/i18n/cht/extensions/npm/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.npm.autoDetect": "控制是否自動檢測npm腳本.預設為開啟." +} \ No newline at end of file diff --git a/i18n/cht/src/vs/code/electron-main/windows.i18n.json b/i18n/cht/src/vs/code/electron-main/windows.i18n.json index 1a51baff5db..08847b4b8e4 100644 --- a/i18n/cht/src/vs/code/electron-main/windows.i18n.json +++ b/i18n/cht/src/vs/code/electron-main/windows.i18n.json @@ -7,7 +7,6 @@ "ok": "確定", "pathNotExistTitle": "路徑不存在", "pathNotExistDetail": "磁碟上似乎已沒有路徑 '{0}'。", - "accessibilityOptionsWindowTitle": "協助工具選項", "reopen": "重新開啟", "wait": "繼續等候", "close": "關閉", diff --git a/i18n/cht/src/vs/workbench/electron-browser/workbench.i18n.json b/i18n/cht/src/vs/workbench/electron-browser/workbench.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/electron-browser/workbench.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 49a87dcf222..6394eecabd8 100644 --- a/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/cht/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "disableOtherKeymapsConfirmation": "要停用其他按鍵對應,以避免按鍵繫結關係發生衝突嗎?", "yes": "是", - "no": "否" + "no": "否", + "uninstall": "解除安裝", + "later": "稍後" } \ No newline at end of file diff --git a/i18n/cht/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json b/i18n/cht/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/cht/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/code/electron-main/windows.i18n.json b/i18n/deu/src/vs/code/electron-main/windows.i18n.json index 19ea01ffe2b..b31c876e930 100644 --- a/i18n/deu/src/vs/code/electron-main/windows.i18n.json +++ b/i18n/deu/src/vs/code/electron-main/windows.i18n.json @@ -7,7 +7,6 @@ "ok": "OK", "pathNotExistTitle": "Der Pfad ist nicht vorhanden.", "pathNotExistDetail": "Der Pfad \"{0}\" scheint auf dem Datenträger nicht mehr vorhanden zu sein.", - "accessibilityOptionsWindowTitle": "Optionen für erleichterte Bedienung", "reopen": "Erneut öffnen", "wait": "Bitte warten.", "close": "Schließen", diff --git a/i18n/deu/src/vs/workbench/electron-browser/workbench.i18n.json b/i18n/deu/src/vs/workbench/electron-browser/workbench.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/electron-browser/workbench.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 5c79e379437..4769dc3fe1e 100644 --- a/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/deu/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "disableOtherKeymapsConfirmation": "Andere Tastenzuordnungen deaktivieren, um Konflikte zwischen Tastenzuordnungen zu vermeiden?", "yes": "Ja", - "no": "Nein" + "no": "Nein", + "uninstall": "Deinstallieren", + "later": "Später" } \ No newline at end of file diff --git a/i18n/deu/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json b/i18n/deu/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/deu/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/extensions/git/out/commands.i18n.json b/i18n/esn/extensions/git/out/commands.i18n.json index 1897af0ac26..6ace96fe6d2 100644 --- a/i18n/esn/extensions/git/out/commands.i18n.json +++ b/i18n/esn/extensions/git/out/commands.i18n.json @@ -26,6 +26,9 @@ "provide commit message": "Proporcione un mensaje de confirmación", "branch name": "Nombre de rama", "provide branch name": "Especifique un nombre para la rama", + "select branch to delete": "Seleccione una rama para borrar", + "confirm force delete branch": "La rama '{0}' no está completamente fusionada. ¿Borrarla de todas formas?", + "delete branch": "Borrar rama...", "no remotes to pull": "El repositorio no tiene remotos configurados de los que extraer.", "no remotes to push": "El repositorio no tiene remotos configurados en los que insertar.", "nobranch": "Extraiga del repositorio una rama para insertar un remoto.", diff --git a/i18n/esn/extensions/git/package.i18n.json b/i18n/esn/extensions/git/package.i18n.json index 504bfa02569..afda046fe5a 100644 --- a/i18n/esn/extensions/git/package.i18n.json +++ b/i18n/esn/extensions/git/package.i18n.json @@ -26,6 +26,7 @@ "command.undoCommit": "Deshacer última confirmación", "command.checkout": "Desproteger en...", "command.branch": "Crear rama...", + "command.deleteBranch": "Borrar rama...", "command.pull": "Incorporación de cambios", "command.pullRebase": "Incorporación de cambios (fusionar mediante cambio de base)", "command.push": "Insertar", diff --git a/i18n/esn/extensions/markdown/out/extension.i18n.json b/i18n/esn/extensions/markdown/out/extension.i18n.json index 8b6ad71cd4e..360f0b974b7 100644 --- a/i18n/esn/extensions/markdown/out/extension.i18n.json +++ b/i18n/esn/extensions/markdown/out/extension.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "onPreviewStyleLoadError": "No se pudo cargar 'markdown.styles': {0}" +} \ No newline at end of file diff --git a/i18n/esn/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/esn/extensions/merge-conflict/out/codelensProvider.i18n.json index 8b6ad71cd4e..22ca13053b5 100644 --- a/i18n/esn/extensions/merge-conflict/out/codelensProvider.i18n.json +++ b/i18n/esn/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -3,4 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "acceptCurrentChange": "Aceptar cambio actual", + "acceptIncomingChange": "Aceptar cambio entrante", + "acceptBothChanges": "Aceptar ambos cambios", + "compareChanges": "Comparar cambios" +} \ No newline at end of file diff --git a/i18n/esn/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/esn/extensions/merge-conflict/out/commandHandler.i18n.json index 8b6ad71cd4e..eb8028b1717 100644 --- a/i18n/esn/extensions/merge-conflict/out/commandHandler.i18n.json +++ b/i18n/esn/extensions/merge-conflict/out/commandHandler.i18n.json @@ -3,4 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "cursorNotInConflict": "El cursor de edición no se encuentra en un conflicto de fusión", + "compareChangesTitle": "{0}: Cambios actuales \\u2194 Cambios entrantes", + "cursorOnSplitterRange": "El cursor del editor está dentro del separador de conflictos de fusión, muévalo al bloque \"actual\" o al \"entrante\" ", + "noConflicts": "No se encontraron conflictos en este archivo", + "noOtherConflictsInThisFile": "No hay más conflictos en este archivo" +} \ No newline at end of file diff --git a/i18n/esn/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/esn/extensions/merge-conflict/out/mergeDecorator.i18n.json index 8b6ad71cd4e..9cf24c3ecc5 100644 --- a/i18n/esn/extensions/merge-conflict/out/mergeDecorator.i18n.json +++ b/i18n/esn/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "currentChange": "(Cambio actual)", + "incomingChange": "(Cambio entrante)" +} \ No newline at end of file diff --git a/i18n/esn/extensions/merge-conflict/package.i18n.json b/i18n/esn/extensions/merge-conflict/package.i18n.json index 8b6ad71cd4e..880711d45ac 100644 --- a/i18n/esn/extensions/merge-conflict/package.i18n.json +++ b/i18n/esn/extensions/merge-conflict/package.i18n.json @@ -3,4 +3,18 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "command.category": "Fusionar conflicto", + "command.accept.all-incoming": "Aceptar todos los entrantes", + "command.accept.all-both": "Aceptar todos ambos", + "command.accept.current": "Aceptar actual", + "command.accept.incoming": "Aceptar entrante", + "command.accept.selection": "Aceptar selección", + "command.accept.both": "Aceptar ambos", + "command.next": "Siguiente conflicto", + "command.previous": "Conflicto anterior", + "command.compare": "Comparar conflicto actual", + "config.title": "Fusionar conflicto", + "config.codeLensEnabled": "Habilitar/deshabilitar CodeLens de fusionar bloque de conflictos en el editor", + "config.decoratorsEnabled": "Habilitar/deshabilitar decoradores de conflictos de fusión en el editor" +} \ No newline at end of file diff --git a/i18n/esn/extensions/npm/package.i18n.json b/i18n/esn/extensions/npm/package.i18n.json index 8b6ad71cd4e..d71e21915da 100644 --- a/i18n/esn/extensions/npm/package.i18n.json +++ b/i18n/esn/extensions/npm/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.npm.autoDetect": "Controla si la detección automática de scripts npm está activada o desactivada. Por defecto está activada." +} \ No newline at end of file diff --git a/i18n/esn/extensions/typescript/package.i18n.json b/i18n/esn/extensions/typescript/package.i18n.json index 599140da8f5..4ff6892a0a6 100644 --- a/i18n/esn/extensions/typescript/package.i18n.json +++ b/i18n/esn/extensions/typescript/package.i18n.json @@ -37,6 +37,7 @@ "typescript.referencesCodeLens.enabled": "Habilitar/deshabilitar las referencias de CodeLens en los archivos de TypeScript. Requiere TypeScript >= 2.0.6.", "typescript.implementationsCodeLens.enabled": "Habilita o deshabilita implementaciones de CodeLens. Requiere TypeScript >= 2.2.0.", "typescript.openTsServerLog.title": "Abrir registro del servidor de TS", + "typescript.restartTsServer": "Reiniciar servidor TS", "typescript.selectTypeScriptVersion.title": "Seleccionar versión de TypeScript", "jsDocCompletion.enabled": "Habilita o deshabilita comentarios automaticos de JSDoc", "javascript.implicitProjectConfig.checkJs": "Habilita/deshabilita la comprobación semántica de los archivos JavaScript. Los archivos jsconfig.json o tsconfig.json reemplazan esta configuración. Se requiere TypeScript >=2.3.1.", diff --git a/i18n/esn/src/vs/code/electron-main/windows.i18n.json b/i18n/esn/src/vs/code/electron-main/windows.i18n.json index fd891dfad94..80fb2bc32dc 100644 --- a/i18n/esn/src/vs/code/electron-main/windows.i18n.json +++ b/i18n/esn/src/vs/code/electron-main/windows.i18n.json @@ -7,7 +7,6 @@ "ok": "Aceptar", "pathNotExistTitle": "La ruta no existe", "pathNotExistDetail": "Parece que la ruta '{0}' ya no existe en el disco.", - "accessibilityOptionsWindowTitle": "Opciones de accesibilidad", "reopen": "Volver a abrir", "wait": "Siga esperando", "close": "Cerrar", diff --git a/i18n/esn/src/vs/workbench/electron-browser/workbench.i18n.json b/i18n/esn/src/vs/workbench/electron-browser/workbench.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/electron-browser/workbench.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json index 916ac3e4884..ff677b59a60 100644 --- a/i18n/esn/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "statusBarDebuggingBackground": "Color de fondo de la barra de estado cuando se está depurando un programa. La barra de estado se muestra en la parte inferior de la ventana" + "statusBarDebuggingBackground": "Color de fondo de la barra de estado cuando se está depurando un programa. La barra de estado se muestra en la parte inferior de la ventana", + "statusBarDebuggingForeground": "Color de primer plano de la barra de estado cuando se está depurando un programa. La barra de estado se muestra en la parte inferior de la ventana" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 2b42d7a0c5b..f9f715ea4a9 100644 --- a/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "disableOtherKeymapsConfirmation": "¿Quiere deshabilitar otras asignaciones de teclado para evitar conflictos entre los enlaces de teclado?", "yes": "Sí", - "no": "No" + "no": "No", + "uninstall": "Desinstalación", + "later": "Más tarde" } \ No newline at end of file diff --git a/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index ef718dc3ee1..923353af133 100644 --- a/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/esn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,6 +16,7 @@ "associations": "Configure asociaciones de archivo para los lenguajes (por ejemplo, \"*.extension\": \"html\"). Estas asociaciones tienen prioridad sobre las asociaciones predeterminadas de los lenguajes instalados.", "encoding": "La codificación del juego de caracteres predeterminada que debe utilizarse al leer y escribir archivos.", "autoGuessEncoding": "Si está opción está habilitada, se intentará adivinar la codificación del juego de caracteres al abrir los archivos", + "eol": "Carácter predeterminado de final de línea. Utilice \\n para LF y \\r\\n para CRLF.", "trimTrailingWhitespace": "Si se habilita, se recortará el espacio final cuando se guarde un archivo.", "insertFinalNewline": "Si se habilita, inserte una nueva línea final al final del archivo cuando lo guarde.", "files.autoSave.off": "Un archivo con modificaciones no se guarda nunca automáticamente.", diff --git a/i18n/esn/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json b/i18n/esn/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/esn/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/code/electron-main/windows.i18n.json b/i18n/fra/src/vs/code/electron-main/windows.i18n.json index 7893fb77cc3..af0778db015 100644 --- a/i18n/fra/src/vs/code/electron-main/windows.i18n.json +++ b/i18n/fra/src/vs/code/electron-main/windows.i18n.json @@ -7,7 +7,6 @@ "ok": "OK", "pathNotExistTitle": "Le chemin d'accès n'existe pas", "pathNotExistDetail": "Le chemin d'accès '{0}' ne semble plus exister sur le disque.", - "accessibilityOptionsWindowTitle": "Options d'accessibilité", "reopen": "Rouvrir", "wait": "Continuer à attendre", "close": "Fermer", diff --git a/i18n/fra/src/vs/workbench/electron-browser/workbench.i18n.json b/i18n/fra/src/vs/workbench/electron-browser/workbench.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/electron-browser/workbench.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 5ddc77dfc5a..8fa1a11d54a 100644 --- a/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/fra/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "disableOtherKeymapsConfirmation": "Désactiver les autres mappages de touches pour éviter les conflits de combinaisons de touches ?", "yes": "Oui", - "no": "Non" + "no": "Non", + "uninstall": "Désinstaller", + "later": "Plus tard" } \ No newline at end of file diff --git a/i18n/fra/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json b/i18n/fra/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/fra/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/code/electron-main/windows.i18n.json b/i18n/ita/src/vs/code/electron-main/windows.i18n.json index 2d2cdf7fee4..6add23a4257 100644 --- a/i18n/ita/src/vs/code/electron-main/windows.i18n.json +++ b/i18n/ita/src/vs/code/electron-main/windows.i18n.json @@ -7,7 +7,6 @@ "ok": "OK", "pathNotExistTitle": "Il percorso non esiste", "pathNotExistDetail": "Il percorso '{0}' sembra non esistere più sul disco.", - "accessibilityOptionsWindowTitle": "Opzioni accessibilità", "reopen": "Riapri", "wait": "Continua ad attendere", "close": "Chiudi", diff --git a/i18n/ita/src/vs/workbench/electron-browser/workbench.i18n.json b/i18n/ita/src/vs/workbench/electron-browser/workbench.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/electron-browser/workbench.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 6c3f2e984e8..0a6152b0c7b 100644 --- a/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/ita/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "disableOtherKeymapsConfirmation": "Disabilitare altre mappature tastiera per evitare conflitti tra tasti di scelta rapida?", "yes": "Sì", - "no": "No" + "no": "No", + "uninstall": "Disinstalla", + "later": "In seguito" } \ No newline at end of file diff --git a/i18n/ita/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json b/i18n/ita/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ita/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/extensions/git/out/commands.i18n.json b/i18n/jpn/extensions/git/out/commands.i18n.json index 8ecbb563965..9c6bd23d155 100644 --- a/i18n/jpn/extensions/git/out/commands.i18n.json +++ b/i18n/jpn/extensions/git/out/commands.i18n.json @@ -26,6 +26,9 @@ "provide commit message": "コミット メッセージを入力してください", "branch name": "ブランチ名", "provide branch name": "ブランチ名を指定してください", + "select branch to delete": "削除するブランチの選択", + "confirm force delete branch": "ブランチ '{0}' はマージされていません。それでも削除しますか?", + "delete branch": "ブランチの削除", "no remotes to pull": "リポジトリには、プル元として構成されているリモートがありません。", "no remotes to push": "リポジトリには、プッシュ先として構成されているリモートがありません。", "nobranch": "リモートにプッシュするブランチをチェックアウトしてください。", diff --git a/i18n/jpn/extensions/git/package.i18n.json b/i18n/jpn/extensions/git/package.i18n.json index 66c511eaf69..1c27e31a01c 100644 --- a/i18n/jpn/extensions/git/package.i18n.json +++ b/i18n/jpn/extensions/git/package.i18n.json @@ -26,6 +26,7 @@ "command.undoCommit": "前回のコミットを元に戻す", "command.checkout": "チェックアウト先...", "command.branch": "分岐の作成...", + "command.deleteBranch": "ブランチの削除...", "command.pull": "プル", "command.pullRebase": "プル (リベース)", "command.push": "プッシュ", diff --git a/i18n/jpn/extensions/markdown/out/extension.i18n.json b/i18n/jpn/extensions/markdown/out/extension.i18n.json index 8b6ad71cd4e..fd083fda4b6 100644 --- a/i18n/jpn/extensions/markdown/out/extension.i18n.json +++ b/i18n/jpn/extensions/markdown/out/extension.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "onPreviewStyleLoadError": "'markdown.styles' を読み込むことができません: {0}" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/jpn/extensions/merge-conflict/out/codelensProvider.i18n.json index 8b6ad71cd4e..104396accee 100644 --- a/i18n/jpn/extensions/merge-conflict/out/codelensProvider.i18n.json +++ b/i18n/jpn/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "compareChanges": "変更の比較" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/jpn/extensions/merge-conflict/out/commandHandler.i18n.json index 8b6ad71cd4e..6c318704912 100644 --- a/i18n/jpn/extensions/merge-conflict/out/commandHandler.i18n.json +++ b/i18n/jpn/extensions/merge-conflict/out/commandHandler.i18n.json @@ -3,4 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "cursorNotInConflict": "エディターのカーソルがマージの競合の範囲内にありません", + "noConflicts": "このファイルにマージの競合は存在しません", + "noOtherConflictsInThisFile": "このファイルに他のマージの競合は存在しません" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/jpn/extensions/merge-conflict/out/mergeDecorator.i18n.json index 8b6ad71cd4e..9da2446076d 100644 --- a/i18n/jpn/extensions/merge-conflict/out/mergeDecorator.i18n.json +++ b/i18n/jpn/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "currentChange": "(現在の変更)" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/merge-conflict/package.i18n.json b/i18n/jpn/extensions/merge-conflict/package.i18n.json index 8b6ad71cd4e..178880dd69d 100644 --- a/i18n/jpn/extensions/merge-conflict/package.i18n.json +++ b/i18n/jpn/extensions/merge-conflict/package.i18n.json @@ -3,4 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "command.category": "マージの競合", + "command.next": "次の競合", + "command.previous": "前の競合", + "command.compare": "現在の競合を比較", + "config.title": "マージの競合" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/npm/package.i18n.json b/i18n/jpn/extensions/npm/package.i18n.json index 8b6ad71cd4e..6a332075fd0 100644 --- a/i18n/jpn/extensions/npm/package.i18n.json +++ b/i18n/jpn/extensions/npm/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.npm.autoDetect": "npm スクリプトの自動検出をオンにするかオフにするかを制御します。既定はオンです。" +} \ No newline at end of file diff --git a/i18n/jpn/extensions/typescript/package.i18n.json b/i18n/jpn/extensions/typescript/package.i18n.json index d3f776eaa11..1ad434c3205 100644 --- a/i18n/jpn/extensions/typescript/package.i18n.json +++ b/i18n/jpn/extensions/typescript/package.i18n.json @@ -37,6 +37,7 @@ "typescript.referencesCodeLens.enabled": "TypeScript ファイル内で CodeLens の参照を有効/無効にします。TypeScript 2.0.6 以上が必要です。", "typescript.implementationsCodeLens.enabled": "CodeLens の実装を有効/無効にします。TypeScript 2.2.0 以上が必要です。", "typescript.openTsServerLog.title": "TS サーバーのログを開く", + "typescript.restartTsServer": "TS サーバーを再起動する", "typescript.selectTypeScriptVersion.title": "TypeScript のバージョンの選択", "jsDocCompletion.enabled": " 自動 JSDoc コメントを有効/無効にします", "javascript.implicitProjectConfig.checkJs": "JavaScript ファイルのセマンティック チェックを有効/無効にします。既存の jsconfi.json や tsconfi.json ファイルの設定はこれより優先されます。TypeScript は 2.3.1 以上である必要があります。", diff --git a/i18n/jpn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/jpn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index e70844baf7b..15d556bd644 100644 --- a/i18n/jpn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/jpn/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,6 +6,7 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "イメージが大きすぎてエディターに表示できません。", + "resourceOpenExternalButton": "外部のプログラムを使用して画像を開きますか?", "nativeBinaryError": "このファイルはバイナリか、非常に大きいか、またはサポートされていないテキスト エンコードを使用しているため、エディターに表示されません。", "sizeB": "{0}B", "sizeKB": "{0}KB", diff --git a/i18n/jpn/src/vs/code/electron-main/windows.i18n.json b/i18n/jpn/src/vs/code/electron-main/windows.i18n.json index 6b0480ce2d2..6631797b5a4 100644 --- a/i18n/jpn/src/vs/code/electron-main/windows.i18n.json +++ b/i18n/jpn/src/vs/code/electron-main/windows.i18n.json @@ -7,7 +7,6 @@ "ok": "OK", "pathNotExistTitle": "パスが存在しません", "pathNotExistDetail": "パス '{0}' はディスクに存在しなくなったようです。", - "accessibilityOptionsWindowTitle": "ユーザー補助オプション", "reopen": "もう一度開く", "wait": "待機を続ける", "close": "閉じる", diff --git a/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json index f364e5e0d14..b380e645e98 100644 --- a/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/jpn/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -16,5 +16,9 @@ "editorBracketMatchBackground": "一致するかっこの背景色", "editorBracketMatchBorder": "一致するかっこ内のボックスの色", "editorOverviewRulerBorder": "概要ルーラーの境界色。", - "editorGutter": "エディターの余白の背景色。余白にはグリフ マージンと行番号が含まれます。" + "editorGutter": "エディターの余白の背景色。余白にはグリフ マージンと行番号が含まれます。", + "errorForeground": "エディターでエラーを示す波線の前景色。", + "errorBorder": "エディターでエラーを示す波線の境界線の色。", + "warningForeground": "エディターで警告を示す波線の前景色。", + "warningBorder": "エディターで警告を示す波線の境界線の色。" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/editor/contrib/links/browser/links.i18n.json b/i18n/jpn/src/vs/editor/contrib/links/browser/links.i18n.json index 178a2d932ba..67812ff35d1 100644 --- a/i18n/jpn/src/vs/editor/contrib/links/browser/links.i18n.json +++ b/i18n/jpn/src/vs/editor/contrib/links/browser/links.i18n.json @@ -6,6 +6,7 @@ { "links.navigate.mac": "command キーを押しながらクリックしてリンク先を表示", "links.navigate": "Ctrl キーを押しながらクリックしてリンク先を表示", + "links.navigate.al": "Altl キーを押しながらクリックしてリンク先を表示", "invalid.url": "申し訳ありません。このリンクは形式が正しくないため開くことができませんでした: {0}", "missing.url": "申し訳ありません。このリンクはターゲットが存在しないため開くことができませんでした。", "label": "リンクを開く" diff --git a/i18n/jpn/src/vs/workbench/electron-browser/workbench.i18n.json b/i18n/jpn/src/vs/workbench/electron-browser/workbench.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/electron-browser/workbench.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json index aa4a05fcb72..ccdb00421dc 100644 --- a/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "statusBarDebuggingBackground": "プログラムをデバッグしているときのステータス バーの背景色。ステータス バーはウィンドウの下部に表示されます" + "statusBarDebuggingBackground": "プログラムをデバッグしているときのステータス バーの背景色。ステータス バーはウィンドウの下部に表示されます", + "statusBarDebuggingForeground": "プログラムをデバッグしているときのステータス バーの前景色。ステータス バーはウィンドウの下部に表示されます" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index b12d5ba07d8..868785478db 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -22,6 +22,8 @@ "disableGloballyAction": "常に行う", "disableAction": "無効にする", "checkForUpdates": "更新の確認", + "enableAutoUpdate": "拡張機能の自動更新を有効にする", + "disableAutoUpdate": "拡張機能の自動更新を無効にする", "updateAll": "すべての拡張機能を更新します", "reloadAction": "再読み込み", "postUpdateTooltip": "再度読み込んで更新する", @@ -44,6 +46,8 @@ "showWorkspaceRecommendedExtensions": "ワークスペースのおすすめの拡張機能を表示", "showRecommendedKeymapExtensions": "推奨のキーマップを表示する", "showRecommendedKeymapExtensionsShort": "キーマップ", + "showLanguageExtensions": "言語の拡張機能を表示", + "showLanguageExtensionsShort": "言語の拡張機能", "configureWorkspaceRecommendedExtensions": "お勧めの拡張機能の構成 (ワークスペース)", "ConfigureWorkspaceRecommendations.noWorkspace": "推奨事項はワークスペース フォルダーでのみ利用可能です。", "OpenExtensionsFile.failed": "'.vscode' ファルダー ({0}) 内に 'extensions.json' ファイルを作成できません。", diff --git a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index e5b2af33ec3..6fd33bfb0e0 100644 --- a/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "disableOtherKeymapsConfirmation": "キーバインド間の競合を回避するために、他のキーマップを無効にしますか?", "yes": "はい", - "no": "いいえ" + "no": "いいえ", + "uninstall": "アンインストール", + "later": "後続" } \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index 9356fa119aa..a23d7187ba2 100644 --- a/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,6 +16,7 @@ "associations": "言語に対するファイルの関連付け (例 \"*.extension\": \"html\") を構成します。これらの関連付けは、インストールされている言語の既定の関連付けより優先されます。", "encoding": "ファイルの読み取り/書き込みで使用する既定の文字セット エンコーディング。", "autoGuessEncoding": "有効な場合、ファイルを開くときに文字セット エンコードを推測します", + "eol": "既定の改行文字。LF の場合には \\n を CRLF の場合には \\r\\n を使用してください。", "trimTrailingWhitespace": "有効にすると、ファイルの保存時に末尾の空白をトリミングします。", "insertFinalNewline": "有効にすると、ファイルの保存時に最新の行を末尾に挿入します。", "files.autoSave.off": "ダーティ ファイルを自動的に保存することはしません。", diff --git a/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json b/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/jpn/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/jpn/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json b/i18n/jpn/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json index 54fb4cd8f93..98112fb1164 100644 --- a/i18n/jpn/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json +++ b/i18n/jpn/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json @@ -9,5 +9,6 @@ "vscode.extension.contributes.snippets-path": "スニペット ファイルのパス。拡張機能フォルダーの相対パスであり、通常 './snippets/' で始まります。", "invalid.language": "`contributes.{0}.language` で不明な言語です。提供された値: {1}", "invalid.path.0": "`contributes.{0}.path` に文字列が必要です。提供された値: {1}", - "invalid.path.1": "拡張機能のフォルダー ({2}) の中に `contributes.{0}.path` ({1}) が含まれている必要があります。これにより拡張を移植できなくなる可能性があります。" + "invalid.path.1": "拡張機能のフォルダー ({2}) の中に `contributes.{0}.path` ({1}) が含まれている必要があります。これにより拡張を移植できなくなる可能性があります。", + "badVariableUse": "スニペット \"{0}\" は、スニペット変数とスニペット プレースホルダーを混乱させる可能性が非常にあります。詳細については https://code.visualstudio.com/docs/editor/userdefinedsnippets#_snippet-syntax をご覧ください。" } \ No newline at end of file diff --git a/i18n/kor/src/vs/code/electron-main/windows.i18n.json b/i18n/kor/src/vs/code/electron-main/windows.i18n.json index 0756d51cd46..474475abdb1 100644 --- a/i18n/kor/src/vs/code/electron-main/windows.i18n.json +++ b/i18n/kor/src/vs/code/electron-main/windows.i18n.json @@ -7,7 +7,6 @@ "ok": "확인", "pathNotExistTitle": "경로가 없습니다.", "pathNotExistDetail": "'{0}' 경로가 디스크에 더 이상 없는 것 같습니다.", - "accessibilityOptionsWindowTitle": "접근성 옵션", "reopen": "다시 열기", "wait": "계속 대기", "close": "닫기", diff --git a/i18n/kor/src/vs/workbench/electron-browser/workbench.i18n.json b/i18n/kor/src/vs/workbench/electron-browser/workbench.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/electron-browser/workbench.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 86d18d9fce3..77a77543915 100644 --- a/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/kor/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "disableOtherKeymapsConfirmation": "키 바인딩 간 충돌을 피하기 위해 다른 키 맵을 사용하지 않도록 설정할까요?", "yes": "예", - "no": "아니요" + "no": "아니요", + "uninstall": "제거", + "later": "나중에" } \ No newline at end of file diff --git a/i18n/kor/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json b/i18n/kor/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/kor/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ptb/extensions/git/out/commands.i18n.json b/i18n/ptb/extensions/git/out/commands.i18n.json index ab5667e260b..6744be04c88 100644 --- a/i18n/ptb/extensions/git/out/commands.i18n.json +++ b/i18n/ptb/extensions/git/out/commands.i18n.json @@ -26,6 +26,9 @@ "provide commit message": "Por favor, forneça uma mensagem de commit", "branch name": "Nome do Ramo", "provide branch name": "Por favor, forneça um nome de ramo", + "select branch to delete": "Selecione uma ramificação para excluir", + "confirm force delete branch": "A ramificação '{0}' não foi totalmente mesclada. Excluir mesmo assim?", + "delete branch": "Excluir ramificação", "no remotes to pull": "O seu repositório não possui remotos configurados para efetuar pull.", "no remotes to push": "O seu repositório não possui remotos configurados para efetuar push.", "nobranch": "Por favor, faça checkout em um ramo para fazer push em um remoto.", diff --git a/i18n/ptb/extensions/git/package.i18n.json b/i18n/ptb/extensions/git/package.i18n.json index 0c79f1929bb..e3eec31c008 100644 --- a/i18n/ptb/extensions/git/package.i18n.json +++ b/i18n/ptb/extensions/git/package.i18n.json @@ -26,6 +26,7 @@ "command.undoCommit": "Desfazer Ultima Confirmação", "command.checkout": "Fazer checkout para...", "command.branch": "Criar Ramificação...", + "command.deleteBranch": "Excluir Ramificação...", "command.pull": "Efetuar pull", "command.pullRebase": "Efetuar pull (Rebase)", "command.push": "Enviar por push", diff --git a/i18n/ptb/extensions/markdown/out/extension.i18n.json b/i18n/ptb/extensions/markdown/out/extension.i18n.json index 8b6ad71cd4e..0f4d1689d7f 100644 --- a/i18n/ptb/extensions/markdown/out/extension.i18n.json +++ b/i18n/ptb/extensions/markdown/out/extension.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "onPreviewStyleLoadError": "Não foi possível carregar o 'markdown.styles': {0}" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/merge-conflict/out/codelensProvider.i18n.json b/i18n/ptb/extensions/merge-conflict/out/codelensProvider.i18n.json index 8b6ad71cd4e..dd5a316f1a1 100644 --- a/i18n/ptb/extensions/merge-conflict/out/codelensProvider.i18n.json +++ b/i18n/ptb/extensions/merge-conflict/out/codelensProvider.i18n.json @@ -3,4 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "acceptCurrentChange": "Aceitar a mudança atual", + "acceptIncomingChange": "Aceitar a mudança de entrada", + "acceptBothChanges": "Aceitar ambas alterações", + "compareChanges": "Comparar alteracões" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/merge-conflict/out/commandHandler.i18n.json b/i18n/ptb/extensions/merge-conflict/out/commandHandler.i18n.json index 8b6ad71cd4e..ee80b2e1905 100644 --- a/i18n/ptb/extensions/merge-conflict/out/commandHandler.i18n.json +++ b/i18n/ptb/extensions/merge-conflict/out/commandHandler.i18n.json @@ -3,4 +3,10 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "cursorNotInConflict": "Cursor do editor não está dentro de um conflito de mesclagem", + "compareChangesTitle": "{0}: Mudanças atuais \\u2194 alterações de entrada ", + "cursorOnSplitterRange": "Cursor do editor está dentro do separador de conflitos de mesclagem, por favor mova-o para o bloco \"atual\" ou \"entrada\"", + "noConflicts": "Nenhum conflito de mesclagem encontrado neste arquivo", + "noOtherConflictsInThisFile": "Não há outros conflitos de mesclagem dentro desse arquivo" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/merge-conflict/out/mergeDecorator.i18n.json b/i18n/ptb/extensions/merge-conflict/out/mergeDecorator.i18n.json index 8b6ad71cd4e..a3da6d4660e 100644 --- a/i18n/ptb/extensions/merge-conflict/out/mergeDecorator.i18n.json +++ b/i18n/ptb/extensions/merge-conflict/out/mergeDecorator.i18n.json @@ -3,4 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "currentChange": "(Mudança atual)", + "incomingChange": "(Mudança de entrada)" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/merge-conflict/package.i18n.json b/i18n/ptb/extensions/merge-conflict/package.i18n.json index 8b6ad71cd4e..b290f272513 100644 --- a/i18n/ptb/extensions/merge-conflict/package.i18n.json +++ b/i18n/ptb/extensions/merge-conflict/package.i18n.json @@ -3,4 +3,18 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "command.category": "Conflito de Mesclagem", + "command.accept.all-incoming": "Aceitar todas as novas entradas", + "command.accept.all-both": "Aceitar Ambos", + "command.accept.current": "Aceitar a atual", + "command.accept.incoming": "Aceitar as novas entradas", + "command.accept.selection": "Aceitar a seleção", + "command.accept.both": "Aceitar Ambos", + "command.next": "Próximo conflito", + "command.previous": "Conflito anterior", + "command.compare": "Comparar o conflito atual", + "config.title": "Mesclar conflitos", + "config.codeLensEnabled": "Habilitar/Desabilitar o conflito de mesclagem no bloco CodeLens dentro do editor", + "config.decoratorsEnabled": "Habilitar/Desabilitar decoradores de mesclagem de conflitos dentro do editor" +} \ No newline at end of file diff --git a/i18n/ptb/extensions/npm/package.i18n.json b/i18n/ptb/extensions/npm/package.i18n.json index 8b6ad71cd4e..8d33aa31e7f 100644 --- a/i18n/ptb/extensions/npm/package.i18n.json +++ b/i18n/ptb/extensions/npm/package.i18n.json @@ -3,4 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. -{} \ No newline at end of file +{ + "config.npm.autoDetect": "Controla se a deteção automática de scripts npm está ligado ou desligado. O padrão é ligado." +} \ No newline at end of file diff --git a/i18n/ptb/extensions/typescript/package.i18n.json b/i18n/ptb/extensions/typescript/package.i18n.json index 5e4125ec050..74b4568f8b9 100644 --- a/i18n/ptb/extensions/typescript/package.i18n.json +++ b/i18n/ptb/extensions/typescript/package.i18n.json @@ -37,6 +37,7 @@ "typescript.referencesCodeLens.enabled": "Habilitar/desabilitar referências CodeLens em arquivos TypeScript. Requer TypeScript > = 2.0.6.", "typescript.implementationsCodeLens.enabled": "Habilitar/desabilitar implementações CodeLens. Requer TypeScript > = 2.0.6.", "typescript.openTsServerLog.title": "Abrir arquivo de log do servidor TS", + "typescript.restartTsServer": "Reiniciar o servidor TS", "typescript.selectTypeScriptVersion.title": "Selecionar a versão do JavaScript", "jsDocCompletion.enabled": "Habilitar/Desabilitar comentários JSDoc automáticos.", "javascript.implicitProjectConfig.checkJs": "Habilitar/desabilitar verificação semântica de arquivos JavaScript. Os arquivos existentes jsconfig.json ou tsconfig.json substituem essa configuração. Requer TypeScript > = 2.3.1.", diff --git a/i18n/ptb/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json b/i18n/ptb/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json index d023184ae70..ff9f2c98cbb 100644 --- a/i18n/ptb/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json +++ b/i18n/ptb/src/vs/base/browser/ui/resourceviewer/resourceViewer.i18n.json @@ -6,6 +6,7 @@ { "imgMeta": "{0}x{1} {2}", "largeImageError": "A imagem é muito grande para ser exibida no editor.", + "resourceOpenExternalButton": "Abrir imagem usando um programa externo?", "nativeBinaryError": "O arquivo não pode ser exibido no editor porque é binário, muito grande ou usa uma codificação de texto sem suporte.", "sizeB": "{0}B", "sizeKB": "{0}KB", diff --git a/i18n/ptb/src/vs/code/electron-main/windows.i18n.json b/i18n/ptb/src/vs/code/electron-main/windows.i18n.json index 308aed29538..abf3a42e2eb 100644 --- a/i18n/ptb/src/vs/code/electron-main/windows.i18n.json +++ b/i18n/ptb/src/vs/code/electron-main/windows.i18n.json @@ -7,7 +7,6 @@ "ok": "OK", "pathNotExistTitle": "O caminho não existe", "pathNotExistDetail": "O caminho '{0}' não parece mais existir no disco.", - "accessibilityOptionsWindowTitle": "Opções de Acessibilidade", "reopen": "Reabrir", "wait": "Continuar Esperando", "close": "Fechar", diff --git a/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json b/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json index 8411a930363..32deba05d12 100644 --- a/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json +++ b/i18n/ptb/src/vs/editor/common/config/commonEditorConfig.i18n.json @@ -23,6 +23,8 @@ "minimap.enabled": "Controla se o mini mapa é exibido", "minimap.renderCharacters": "Renderizar os caracteres em uma linha (em oposição a blocos de caracteres)", "minimap.maxColumn": "Limitar o tamanho de um mini-mapa para renderizar no máximo um número determinado de colunas", + "find.seedSearchStringFromSelection": "Controla se nós inicializamos a string de pesquisa na Ferramenta de Pesquisa a partir da seleção do editor", + "find.autoFindInSelection": "Controla se a configuração Find in Selection deve estar ativada quando vários caracteres ou linhas de texto estão selecionados no editor", "wordWrap.off": "As linhas nunca serão quebradas.", "wordWrap.on": "As linhas serão quebradas na largura de visualização", "wordWrap.wordWrapColumn": "As linhas serão quebradas em `editor.wordWrapColumn`.", @@ -31,6 +33,7 @@ "wordWrapColumn": "Controla a coluna de quebra de linha do editor quando editor.wordWrap` é 'wordWrapColumn' ou 'bounded'.", "wrappingIndent": "Controla o recuo de linhas quebradas. Pode ser \"none\", \"same\" ou \"indent\".", "mouseWheelScrollSensitivity": "Um multiplicador a ser usado em \"deltaX\" e \"deltaY\" dos eventos de rolagem do botão de rolagem do mouse", + "multicursorModifier": "O modificador a ser utilizado para adicionar vários cursores com o mouse.", "quickSuggestions.strings": "Habilitar sugestões rápidas dentro de strings.", "quickSuggestions.comments": "Habilitar sugestões rápidas dentro de comentários.", "quickSuggestions.other": "Habilitar sugestões rápidas fora de strings e comentários.", @@ -41,6 +44,7 @@ "formatOnType": "Controla se o editor deve formatar automaticamente a linha após a digitação", "formatOnPaste": "Controla se o editor deve formatar automaticamente o conteúdo colado. Um formatador deve estar disponível e o formatador deve ser capaz de formatar apenas uma parte do documento.", "suggestOnTriggerCharacters": "Controla se as sugestões devem aparecer automaticamente ao digitar caracteres de gatilho", + "acceptSuggestionOnEnter": "Controla se as sugestões devem ser aceitas com 'Enter' - em adição a 'Tab'. Ajuda a evitar a ambiguidade entre a inserção de novas linhas ou aceitar sugestões. O valor 'smart' significa apenas aceitar uma sugestão com Enter quando ela fizer uma mudança textual", "acceptSuggestionOnCommitCharacter": "Controla se as sugestões devem ser aceitas em caracteres de confirmação. Por exemplo, em JavaScript, o ponto-e-vírgula (';') pode ser um caractere de confirmação que aceita uma sugestão e digita esse caractere.", "snippetSuggestions": "Controla se os snippets são exibidos juntamente com as outras sugestões e como eles são ordenados.", "emptySelectionClipboard": "Controla se a cópia sem nenhuma seleção copia a linha atual.", diff --git a/i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json b/i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json index 8d59b0fcb7d..a1bf17d6ec8 100644 --- a/i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json +++ b/i18n/ptb/src/vs/editor/common/view/editorColorRegistry.i18n.json @@ -16,5 +16,9 @@ "editorBracketMatchBackground": "Cor de fundo atrás do colchetes correspondentes", "editorBracketMatchBorder": "Cor para as caixas de colchetes correspondentes", "editorOverviewRulerBorder": "Cor da borda da régua de visão geral.", - "editorGutter": "Cor de fundo da separação do editor.O separador contém os glifos das margens e os números de linha." + "editorGutter": "Cor de fundo da separação do editor.O separador contém os glifos das margens e os números de linha.", + "errorForeground": "Cor do primeiro plano das linhas onduladas de erro no editor.", + "errorBorder": "Cor da borda das linhas onduladas de erro no editor.", + "warningForeground": "Cor do primeiro plano de linhas onduladas de aviso no editor.", + "warningBorder": "Cor da borda das linhas onduladas de aviso no editor." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/editor/contrib/links/browser/links.i18n.json b/i18n/ptb/src/vs/editor/contrib/links/browser/links.i18n.json index 64628273f2a..32cd9d3212a 100644 --- a/i18n/ptb/src/vs/editor/contrib/links/browser/links.i18n.json +++ b/i18n/ptb/src/vs/editor/contrib/links/browser/links.i18n.json @@ -6,6 +6,7 @@ { "links.navigate.mac": "Cmd + clique para seguir o link", "links.navigate": "Ctrl + clique para seguir o link", + "links.navigate.al": "Alt + clique para seguir o link", "invalid.url": "Desculpe, falha ao abrir este link porque ele não está bem formatado: {0}", "missing.url": "Desculpe, falha ao abrir este link porque seu destino está faltando.", "label": "Abrir link" diff --git a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json index c2057c183a1..ff6a038e701 100644 --- a/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json +++ b/i18n/ptb/src/vs/workbench/browser/parts/editor/editorStatus.i18n.json @@ -11,6 +11,7 @@ "endOfLineLineFeed": "LF", "endOfLineCarriageReturnLineFeed": "CRLF", "tabFocusModeEnabled": "Tabulação move o foco", + "screenReaderDetected": "Leitor de tela detectado", "disableTabMode": "Desativar o modo de acessibilidade", "gotoLine": "Ir para linha", "indentation": "Indentação", diff --git a/i18n/ptb/src/vs/workbench/common/theme.i18n.json b/i18n/ptb/src/vs/workbench/common/theme.i18n.json index bfe4c0ef017..635ace8d708 100644 --- a/i18n/ptb/src/vs/workbench/common/theme.i18n.json +++ b/i18n/ptb/src/vs/workbench/common/theme.i18n.json @@ -11,6 +11,7 @@ "tabInactiveEditorGroupActiveForeground": "Cor de primeiro plano da guia inativa em um grupo ativo. As guias são os recipientes para editores na área do editor. Várias guias podem ser abertas em um grupo de editores. Podem haver vários grupos de editor.", "editorGroupBackground": "Cor de fundo de um grupo de editor. Grupos de editor são os recipientes dos editores. A cor de fundo é mostrada ao arrastar o editor de grupos ao redor.", "tabsContainerBackground": "Cor de fundo do cabeçalho do título do grupo de editor quando as guias são habilitadas. Grupos de editor são os recipientes dos editores.", + "tabsContainerBorder": "Cor da borda do cabeçalho do título do grupo de editor quando as guias estão habilitadas. Grupos de editor são os recipientes dos editores.", "editorGroupHeaderBackground": "Cor de fundo do título do cabeçalho do grupo de editor quando as guias são desabilitadas. Grupos de editor são os recipientes dos editores.", "editorGroupBorder": "Cor para separar múltiplos grupos de editor de outro. Grupos de editor são os recipientes dos editores.", "editorDragAndDropBackground": "Cor de fundo ao arrastar editores. A cor deve ter transparência para que o conteúdo do editor ainda possa ser visto.", @@ -21,20 +22,25 @@ "panelActiveTitleBorder": "Cor da borda para o título do painel ativo. Os painéis são mostrados abaixo da área do editor e contém visualizações como saída e terminal integrado.", "statusBarForeground": "Cor do primeiro plano da barra de status. A barra de status é mostrada na parte inferior da janela.", "statusBarBackground": "Cor de fundo da barra de status padrão. A barra de status é mostrada na parte inferior da janela.", + "statusBarBorder": "Cor da borda da barra de status que separa a barra lateral e o editor.A barra de status é mostrada na parte inferior da janela.", "statusBarNoFolderBackground": "Cor de fundo da barra de status quando nenhuma pasta está aberta. A barra de status é mostrada na parte inferior da janela.", + "statusBarNoFolderForeground": "Cor do primeiro plano da barra de status quando nenhuma pasta está aberta. A barra de status é mostrada na parte inferior da janela.", "statusBarItemActiveBackground": "Cor de fundo do item da barra de status quando você clicado. A barra de status é mostrada na parte inferior da janela.", "statusBarItemHoverBackground": "Cor de fundo do item da barra de status quando estiver passando sobre ele. A barra de status é mostrada na parte inferior da janela.", "statusBarProminentItemBackground": "Cor de fundo de itens proeminentes da barra de status. Itens proeminentes destacam-se outras entradas da barra de status para indicar a importância. A barra de status é mostrada na parte inferior da janela.", "statusBarProminentItemHoverBackground": "Cor de fundo dos itens proeminentes de barra de status quando estiver passando sobre eles. Itens proeminentes destacam-se outras entradas de barra de status para indicar a importância. A barra de status é mostrada na parte inferior da janela.", "activityBarBackground": "Cor de fundo da barra de atividades. Barra de atividade está visível à esquerda ou à direita e permite alternar entre as visualizações da barra lateral.", "activityBarForeground": "Cor de primeiro plano da barra de atividades (por exemplo, usada para os ícones). A barra de atividades está visível à esquerda ou à direita e permite alternar entre as visualizações da barra lateral.", + "activityBarBorder": "Cor da borda da barra de atividades separando a barra lateral. A barra de atividade é mostrada à esquerda ou à direita e permite alternar entre as visualizações da barra lateral.", "activityBarDragAndDropBackground": "Cor de feedback de arrastar e soltar para os itens da barra de atividades. A cor deve ter transparência para que as entradas de bar de atividade ainda possam brilhar. A barra de atividade está visível à esquerda ou à direita e permite para alternar entre as visualizações da barra lateral.", "activityBarBadgeBackground": "Cor de fundo da notificação de atividade. A barra de atividade está visível à esquerda ou à direita e permite alternar entre as visualizações da barra lateral.", "activityBarBadgeForeground": "Cor de primeiro plano da notificação de atividade. A barra de atividade está visível à esquerda ou à direita e permite alternar entre as visualizações da barra lateral.", "sideBarBackground": "Cor de fundo da barra lateral. A barra lateral é o recipiente para visualizações como explorador e pesquisa.", "sideBarForeground": "Cor de primeiro plano da barra lateral. A barra lateral é o recipiente para visualizações como o explorador e a busca.", + "sideBarBorder": "Cor da borda da barra lateral separando o editor. A barra lateral é o recipiente para visualizações como explorador e pesquisa.", "sideBarTitleForeground": "Cor de primeiro plano do título da barra lateral. A barra lateral é o recipiente para visualizações como explorador e pesquisa.", "sideBarSectionHeaderBackground": "Cor de fundo do cabeçalho de seção lateral. A barra lateral é o recipiente para visões como explorador e pesquisa.", + "sideBarSectionHeaderForeground": "Cor de primeiro plano do cabeçalho de seção da barra lateral. A barra lateral é o recipiente para visualizações como o explorador e pesquisa.", "titleBarActiveForeground": "Cor da barra de título do primeiro plano quando a janela está ativa. Observe que essa cor atualmente somente é suportada no macOS.", "titleBarInactiveForeground": "Cor de primeiro plano da barra de título quando a janela está inativa. Observe que essa cor atualmente somente é suportada no macOS.", "titleBarActiveBackground": "Cor de fundo da barra de título quando a janela está ativa. Observe que essa cor atualmente somente é suportada no macOS.", diff --git a/i18n/ptb/src/vs/workbench/electron-browser/workbench.i18n.json b/i18n/ptb/src/vs/workbench/electron-browser/workbench.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ptb/src/vs/workbench/electron-browser/workbench.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json index b191a0de856..86bf6e71ecc 100644 --- a/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/debug/electron-browser/statusbarColorProvider.i18n.json @@ -4,5 +4,6 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "statusBarDebuggingBackground": "Cor de fundo da barra de status quando um programa está sendo depurado. A barra de status é mostrada na parte inferior da janela" + "statusBarDebuggingBackground": "Cor de fundo da barra de status quando um programa está sendo depurado. A barra de status é mostrada na parte inferior da janela", + "statusBarDebuggingForeground": "Cor de primeiro plano da barra de status quando um programa está sendo depurado. A barra de status é mostrada na parte inferior da janela" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json index 1caebe040f5..7f32e3bf156 100644 --- a/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.i18n.json @@ -9,5 +9,6 @@ "emmetPreferences": "Preferências usadas para modificar o comportamento de algumas ações e resolvedores de Emmet.", "emmetSyntaxProfiles": "Definir o perfil para a sintaxe especificada ou usar seu próprio perfil com regras específicas.", "emmetExclude": "Uma matriz de línguagens onde abreviaturas emmet não devem ser expandidas.", - "emmetExtensionsPath": "Caminho para uma pasta contendo perfis emmet, trechos e preferências" + "emmetExtensionsPath": "Caminho para uma pasta contendo perfis emmet, trechos e preferências", + "emmetUseModules": "Use os novos módulos emmet para características emmet ao invés da biblioteca emmet única." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json index e2ff606a7c9..61966d0e312 100644 --- a/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/extensions/browser/extensionsActions.i18n.json @@ -22,6 +22,8 @@ "disableGloballyAction": "Sempre", "disableAction": "Desabilitar", "checkForUpdates": "Verificar Atualizações", + "enableAutoUpdate": "Habilitar Extensões Auto-Atualizáveis", + "disableAutoUpdate": "Desabilitar Extensões Auto-Atualizáveis", "updateAll": "Atualizar Todas as Extensões", "reloadAction": "Recarregar", "postUpdateTooltip": "Recarregar para atualizar", @@ -44,6 +46,8 @@ "showWorkspaceRecommendedExtensions": "Mostrar Extensões Recomendadas para o Espaço de Trabalho", "showRecommendedKeymapExtensions": "Mostrar Mapeamentos de Teclado Recomendados", "showRecommendedKeymapExtensionsShort": "Mapeamentos de Teclado", + "showLanguageExtensions": "Mostrar Extensões de Linguagem", + "showLanguageExtensionsShort": "Extensões de Linguagem", "configureWorkspaceRecommendedExtensions": "Configurar Extensões Recomendadas (Espaço de Trabalho)", "ConfigureWorkspaceRecommendations.noWorkspace": "As recomendações somente estão disponíveis em uma pasta do espaço de trabalho.", "OpenExtensionsFile.failed": "Não foi possível criar o arquivo 'extensions.json' na pasta '.vscode' ({0}).", @@ -51,5 +55,8 @@ "disableAll": "Desabilitar Todas as Extensões Instaladas", "disableAllWorkspace": "Desabilitar Todas as Extensões Instaladas para este Espaço de Trabalho", "enableAll": "Habilitar Todas as Extensões Instaladas", - "enableAllWorkspace": "Habilitar Todas as Extensões Instaladas para este Espaço de Trabalho" + "enableAllWorkspace": "Habilitar Todas as Extensões Instaladas para este Espaço de Trabalho", + "extensionButtonProminentBackground": "Cor de fundo do botão para a ações de extensão que se destacam (por exemplo, o botão de instalar).", + "extensionButtonProminentForeground": "Cor de primeiro plano do botão para a ações de extensão que se destacam (por exemplo, o botão de instalar).", + "extensionButtonProminentHoverBackground": "Cor de fundo ao passar o mouse sobre o botão para a ações de extensão que se destacam (por exemplo, o botão de instalar)." } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 0cde76b12d8..7e8cde2d602 100644 --- a/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -4,7 +4,9 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "disableOtherKeymapsConfirmation": "Desabilitar outros mapeamentos de teclado para evitar conflitos entre mapeamentos de teclado?", "yes": "Sim", - "no": "Não" + "no": "Não", + "betterMergeDisabled": "A extensão Better Merge agora é intrínseca, a extensão instalada foi desabilitada e pode ser desinstalada.", + "uninstall": "Desinstalar", + "later": "Mais tarde" } \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json b/i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json index ddbc9408f54..f4309c6a9bc 100644 --- a/i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/files/browser/files.contribution.i18n.json @@ -16,6 +16,7 @@ "associations": "Configurar as associações de arquivo para linguagens (por exemplo, \"* Extension\": \"html\"). Estas têm precedência sobre as associações padrão das linguagens instaladas.", "encoding": "A codificação padrão do conjunto de caracteres para ser usada ao ler e gravar arquivos.", "autoGuessEncoding": "Quando habilitado, tentará adivinhar a codificação do conjunto de caracteres ao abrir arquivos", + "eol": "O caractere padrão de fim de linha. Use \\n para LF e \\r\\n para CRLF.", "trimTrailingWhitespace": "Quando habilitado, removerá espaços em branco à direita ao salvar um arquivo.", "insertFinalNewline": "Quando habilitado, inseririrá uma nova linha no final do arquivo quando salvá-lo.", "files.autoSave.off": "Um arquivo sujo nunca é automaticamente salvo.", diff --git a/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/ptb/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json index 0f8e6360187..b98cf8d0937 100644 --- a/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json +++ b/i18n/ptb/src/vs/workbench/parts/snippets/electron-browser/TMSnippets.i18n.json @@ -9,5 +9,6 @@ "vscode.extension.contributes.snippets-path": "Caminho do arquivo de trechos de código. O caminho é relativo à pasta de extensão e normalmente começa com '. /snippets/'.", "invalid.language": "Linguagem desconhecida em `contributes.{0}.language`. Valor fornecido: {1}", "invalid.path.0": "Esperada uma string em `contributes.{0}.path`. Valor informado: {1}", - "invalid.path.1": "É esperado que `contributes.{0}.path` ({1}) seja incluído na pasta da extensão ({2}). Isto pode tornar a extensão não portável." + "invalid.path.1": "É esperado que `contributes.{0}.path` ({1}) seja incluído na pasta da extensão ({2}). Isto pode tornar a extensão não portável.", + "badVariableUse": "O trecho de código \"{0}\" muito provavelmente confunde as variáveis de trecho de código e espaços reservados do trecho de código. Consulte https://code.visualstudio.com/docs/editor/userdefinedsnippets#_snippet-syntax para obter mais detalhes." } \ No newline at end of file diff --git a/i18n/rus/src/vs/code/electron-main/windows.i18n.json b/i18n/rus/src/vs/code/electron-main/windows.i18n.json index 6a621782e32..b1934cff062 100644 --- a/i18n/rus/src/vs/code/electron-main/windows.i18n.json +++ b/i18n/rus/src/vs/code/electron-main/windows.i18n.json @@ -7,7 +7,6 @@ "ok": "ОК", "pathNotExistTitle": "Путь не существует.", "pathNotExistDetail": "Путь \"{0}\" больше не существует на диске.", - "accessibilityOptionsWindowTitle": "Специальные возможности", "reopen": "Открыть повторно", "wait": "Подождать", "close": "Закрыть", diff --git a/i18n/rus/src/vs/workbench/electron-browser/workbench.i18n.json b/i18n/rus/src/vs/workbench/electron-browser/workbench.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/electron-browser/workbench.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json index 906d10fee6b..82ee62547a4 100644 --- a/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json +++ b/i18n/rus/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.i18n.json @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ // Do not edit this file. It is machine generated. { - "disableOtherKeymapsConfirmation": "Отключить другие раскладки клавиатуры, чтобы избежать конфликта между настраиваемыми сочетаниями клавиш?", "yes": "Да", - "no": "Нет" + "no": "Нет", + "uninstall": "Удаление", + "later": "Позже" } \ No newline at end of file diff --git a/i18n/rus/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json b/i18n/rus/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json new file mode 100644 index 00000000000..8b6ad71cd4e --- /dev/null +++ b/i18n/rus/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.i18n.json @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +// Do not edit this file. It is machine generated. +{} \ No newline at end of file From 8c1c1d14df3c2f819078484aeffee37c3f00a7a8 Mon Sep 17 00:00:00 2001 From: Erich Gamma Date: Sun, 28 May 2017 17:29:39 +0200 Subject: [PATCH 1114/1164] Added npm install to the list of discovered npm tasks --- extensions/npm/src/main.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extensions/npm/src/main.ts b/extensions/npm/src/main.ts index 9308210ede8..9dc734a4ffe 100644 --- a/extensions/npm/src/main.ts +++ b/extensions/npm/src/main.ts @@ -90,6 +90,8 @@ async function getNpmScriptsAsTasks(): Promise { } result.push(task); }); + // add some 'well known' npm tasks + result.push(new vscode.ShellTask(`npm: install`, `npm install`)); return Promise.resolve(result); } catch (e) { return Promise.resolve(emptyTasks); From 4b2a13aae48e8cdc1485c31d1ac4ecfa37094b69 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Mon, 29 May 2017 09:06:04 +0200 Subject: [PATCH 1115/1164] Make the workspace build / test task win over contributed tasks --- .../parts/tasks/common/taskConfiguration.ts | 39 +++++++++++++------ .../electron-browser/task.contribution.ts | 30 +++++++++----- .../tasks/test/node/configuration.test.ts | 25 +++++++++++- 3 files changed, 71 insertions(+), 23 deletions(-) diff --git a/src/vs/workbench/parts/tasks/common/taskConfiguration.ts b/src/vs/workbench/parts/tasks/common/taskConfiguration.ts index 9af9833e240..09fa78dfd77 100644 --- a/src/vs/workbench/parts/tasks/common/taskConfiguration.ts +++ b/src/vs/workbench/parts/tasks/common/taskConfiguration.ts @@ -137,11 +137,18 @@ export interface TaskDescription extends PlatformTaskDescription { promptOnClose?: boolean; /** + * Defines the group the task belongs too. + */ + group?: string; + + /** + * @deprecated Use `group` instead. * Whether this task maps to the default build command. */ isBuildCommand?: boolean; /** + * @deprecated Use `group` instead. * Whether this task maps to the default test command. */ isTestCommand?: boolean; @@ -766,8 +773,8 @@ namespace TaskDescription { } let parsedTasks: Tasks.Task[] = []; let annotatingTasks: Tasks.Task[] = []; - let defaultBuildTask: { task: Tasks.Task; rank: number; } = { task: null, rank: -1 }; - let defaultTestTask: { task: Tasks.Task; rank: number; } = { task: null, rank: -1 }; + let defaultBuildTask: { task: Tasks.Task; rank: number; } = { task: undefined, rank: -1 }; + let defaultTestTask: { task: Tasks.Task; rank: number; } = { task: undefined, rank: -1 }; tasks.forEach((externalTask) => { let taskName = externalTask.taskName; if (!taskName) { @@ -800,6 +807,16 @@ namespace TaskDescription { if (externalTask.promptOnClose !== void 0) { task.promptOnClose = !!externalTask.promptOnClose; } + if (Tasks.TaskGroup.is(externalTask.group)) { + task.group = externalTask.group; + } + if (task.group === void 0) { + if (Types.isBoolean(externalTask.isBuildCommand) && externalTask.isBuildCommand) { + task.group = Tasks.TaskGroup.Build; + } else if (Types.isBoolean(externalTask.isTestCommand && externalTask.isTestCommand)) { + task.group = Tasks.TaskGroup.Test; + } + } if (externalTask.command !== void 0) { // if the task has its own command then we suppress the // task name by default. @@ -848,26 +865,24 @@ namespace TaskDescription { } if (addTask) { parsedTasks.push(task); - if (!Types.isUndefined(externalTask.isBuildCommand) && externalTask.isBuildCommand && defaultBuildTask.rank < 2) { + if (task.group === Tasks.TaskGroup.Build && defaultBuildTask.rank < 2) { defaultBuildTask.task = task; defaultBuildTask.rank = 2; - } else if (taskName === 'build' && defaultBuildTask.rank < 2) { - defaultBuildTask.task = task; - defaultBuildTask.rank = 1; - } - if (!Types.isUndefined(externalTask.isTestCommand) && externalTask.isTestCommand && defaultTestTask.rank < 2) { + } else if (task.group === Tasks.TaskGroup.Test && defaultTestTask.rank < 2) { defaultTestTask.task = task; defaultTestTask.rank = 2; - } else if (taskName === 'test' && defaultTestTask.rank < 2) { + } else if (task.name === 'build' && defaultBuildTask.rank < 1) { + defaultBuildTask.task = task; + defaultBuildTask.rank = 1; + } else if (task.name === 'test' && defaultTestTask.rank < 1) { defaultTestTask.task = task; defaultTestTask.rank = 1; } } }); - if (defaultBuildTask.task) { + if (defaultBuildTask.rank > -1 && defaultBuildTask.rank < 2) { defaultBuildTask.task.group = Tasks.TaskGroup.Build; - } - if (defaultTestTask.task) { + } else if (defaultTestTask.rank > -1 && defaultTestTask.rank < 2) { defaultTestTask.task.group = Tasks.TaskGroup.Test; } return parsedTasks.length === 0 && annotatingTasks.length === 0 ? undefined : { tasks: parsedTasks, annotatingTasks: annotatingTasks }; diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index 49c14ca2110..68b32dfc244 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -740,21 +740,21 @@ class TaskService extends EventEmitter implements ITaskService { let uuidMap: IStringDictionary = Object.create(null); let identifierMap: IStringDictionary = Object.create(null); - let primaryTasks: Task[] = []; + let workspaceTasks: Task[] = []; + let extensionTasks: Task[] = []; sets.forEach((set) => { set.tasks.forEach((task) => { uuidMap[task._id] = task; identifierMap[task.identifier] = task; if (group && task.group === group) { - primaryTasks.push(task); + if (task._source.kind === TaskSourceKind.Workspace) { + workspaceTasks.push(task); + } else { + extensionTasks.push(task); + } } }); }); - if (primaryTasks.length === 0) { - return undefined; - } - // check for a WORKSPACE build task and use that onemptied.apply - let resolver: ITaskResolver = { resolve: (id: string) => { let result = uuidMap[id]; @@ -764,8 +764,18 @@ class TaskService extends EventEmitter implements ITaskService { return identifierMap[id]; } }; - if (primaryTasks.length === 1) { - return { task: primaryTasks[0], resolver }; + if (workspaceTasks.length > 0) { + if (workspaceTasks.length > 1) { + this._outputChannel.append(nls.localize('moreThanOneBuildTask', 'There are many build tasks defined in the tasks.json. Executing the first one.\n')); + } + return { task: workspaceTasks[0], resolver }; + } + if (extensionTasks.length === 0) { + return undefined; + } + + if (extensionTasks.length === 1) { + return { task: extensionTasks[0], resolver }; } else { let id: string = UUID.generateUuid(); let task: Task = { @@ -773,7 +783,7 @@ class TaskService extends EventEmitter implements ITaskService { _source: { kind: TaskSourceKind.Generic }, name: id, identifier: id, - dependsOn: primaryTasks.map(task => task._id), + dependsOn: extensionTasks.map(task => task._id), command: undefined, }; return { task, resolver }; diff --git a/src/vs/workbench/parts/tasks/test/node/configuration.test.ts b/src/vs/workbench/parts/tasks/test/node/configuration.test.ts index 03610ad7ecc..cbccf978e9d 100644 --- a/src/vs/workbench/parts/tasks/test/node/configuration.test.ts +++ b/src/vs/workbench/parts/tasks/test/node/configuration.test.ts @@ -512,7 +512,7 @@ function assertProblemPattern(actual: ProblemPattern, expected: ProblemPattern) assert.strictEqual(actual.loop, expected.loop); } -suite('Tasks Configuration parsing tests', () => { +suite('Tasks version 0.1.0', () => { test('tasks: all default', () => { let builder = new ConfiguationBuilder(); builder.task('tsc', 'tsc'). @@ -1360,6 +1360,29 @@ suite('Tasks Configuration parsing tests', () => { }); }); +suite('Tasks version 2.0.0', () => { + test('Build workspace task', () => { + let external: ExternalTaskRunnerConfiguration = { + version: '2.0.0', + tasks: [ + { + taskName: 'dir', + command: 'dir', + type: 'shell', + group: 'build' + } + ] + }; + let builder = new ConfiguationBuilder(); + builder.task('dir', 'dir'). + suppressTaskName(true). + group(Tasks.TaskGroup.Build). + command().type(Tasks.CommandType.Shell); + testConfiguration(external, builder); + }); + +}); + suite('Bugs / regression tests', () => { test('Bug 19548', () => { if (Platform.isLinux) { From 60328f1db18b81ce53a21ecb82e4861fffa41a0e Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 29 May 2017 09:31:59 +0200 Subject: [PATCH 1116/1164] Revert "theming - remove hardcoded list color in keybindings editor" This reverts commit 84ced6126ea370a757fbff264f106af319029257. --- .../parts/preferences/browser/media/keybindingsEditor.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css b/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css index 9932877ef4d..94a771ce087 100644 --- a/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css +++ b/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css @@ -68,6 +68,12 @@ display: flex; } +.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row.even:not(.focused):not(.selected):not(:hover), +.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:not(:focus) .monaco-list-row.focused.even:not(.selected):not(:hover), +.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:not(.focused) .monaco-list-row.focused.even:not(.selected):not(:hover) { + background-color: rgba(130, 130, 130, 0.04); +} + .keybindings-editor > .keybindings-body .keybindings-list-container .monaco-list-row > .header { text-align: left; font-weight: bold; From 3c1f7878b2d3114483d09c5ee8490d3cf27ec0b2 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 29 May 2017 10:50:34 +0200 Subject: [PATCH 1117/1164] theming - remove panel.background as we currently do not support it end to end --- extensions/theme-abyss/themes/abyss-color-theme.json | 1 - .../theme-quietlight/themes/quietlight-color-theme.json | 1 - .../themes/solarized-dark-color-theme.json | 1 - .../themes/solarized-light-color-theme.json | 1 - src/vs/workbench/browser/parts/panel/panelPart.ts | 6 +++--- src/vs/workbench/common/theme.ts | 6 ------ 6 files changed, 3 insertions(+), 13 deletions(-) diff --git a/extensions/theme-abyss/themes/abyss-color-theme.json b/extensions/theme-abyss/themes/abyss-color-theme.json index b244eb1cd6a..a67dd83b89d 100644 --- a/extensions/theme-abyss/themes/abyss-color-theme.json +++ b/extensions/theme-abyss/themes/abyss-color-theme.json @@ -375,7 +375,6 @@ // "activityBar.dropBackground": "", // Workbench: Panel - // "panel.background": "", "panel.border": "#2b2b4a", // "panelTitle.activeBorder": "", // "panelTitle.activeForeground": "", diff --git a/extensions/theme-quietlight/themes/quietlight-color-theme.json b/extensions/theme-quietlight/themes/quietlight-color-theme.json index db8f30e0db2..3086021874b 100644 --- a/extensions/theme-quietlight/themes/quietlight-color-theme.json +++ b/extensions/theme-quietlight/themes/quietlight-color-theme.json @@ -465,7 +465,6 @@ "editorWhitespace.foreground": "#AAAAAA", "editor.lineHighlightBackground": "#E4F6D4", "editor.selectionBackground": "#C9D0D9", - "panel.background": "#F5F5F5", "sideBar.background": "#F2F2F2", "sideBarSectionHeader.background": "#ede8ef", "editorLineNumber.foreground": "#9DA39A", diff --git a/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json b/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json index c89667099de..10b058c4911 100644 --- a/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json +++ b/extensions/theme-solarized-dark/themes/solarized-dark-color-theme.json @@ -419,7 +419,6 @@ // "activityBarBadge.foreground": "", // Workbench: Panel - // "panel.background": "", "panel.border": "#2b2b4a", // "panelTitle.activeBorder": "", // "panelTitle.activeForeground": "", diff --git a/extensions/theme-solarized-light/themes/solarized-light-color-theme.json b/extensions/theme-solarized-light/themes/solarized-light-color-theme.json index 0c3123614c0..cebad7db3b2 100644 --- a/extensions/theme-solarized-light/themes/solarized-light-color-theme.json +++ b/extensions/theme-solarized-light/themes/solarized-light-color-theme.json @@ -419,7 +419,6 @@ // "activityBarBadge.foreground": "", // Workbench: Panel - // "panel.background": "", "panel.border": "#DDD6C1", // "panelTitle.activeBorder": "", // "panelTitle.activeForeground": "", diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index f163fd6aa15..33c4fabe884 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -25,8 +25,8 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ActionsOrientation, ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { ClosePanelAction, PanelAction, ToggleMaximizedPanelAction } from 'vs/workbench/browser/parts/panel/panelActions'; import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; -import { PANEL_BACKGROUND, PANEL_BORDER, PANEL_ACTIVE_TITLE_FOREGROUND, PANEL_INACTIVE_TITLE_FOREGROUND, PANEL_ACTIVE_TITLE_BORDER } from 'vs/workbench/common/theme'; -import { activeContrastBorder, focusBorder, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; +import { PANEL_BORDER, PANEL_ACTIVE_TITLE_FOREGROUND, PANEL_INACTIVE_TITLE_FOREGROUND, PANEL_ACTIVE_TITLE_BORDER } from 'vs/workbench/common/theme'; +import { activeContrastBorder, focusBorder, contrastBorder, editorBackground } from 'vs/platform/theme/common/colorRegistry'; export class PanelPart extends CompositePart implements IPanelService { @@ -101,7 +101,7 @@ export class PanelPart extends CompositePart implements IPanelService { super.updateStyles(); const container = this.getContainer(); - container.style('background-color', this.getColor(PANEL_BACKGROUND)); + container.style('background-color', this.getColor(editorBackground)); const title = this.getTitleArea(); title.style('border-top-color', this.getColor(PANEL_BORDER) || this.getColor(contrastBorder)); diff --git a/src/vs/workbench/common/theme.ts b/src/vs/workbench/common/theme.ts index ae51ff8ef6d..6a3c745dafb 100644 --- a/src/vs/workbench/common/theme.ts +++ b/src/vs/workbench/common/theme.ts @@ -84,12 +84,6 @@ export const EDITOR_DRAG_AND_DROP_BACKGROUND = registerColor('editorGroup.dropBa // < --- Panels --- > -export const PANEL_BACKGROUND = registerColor('panel.background', { - dark: editorBackground, - light: editorBackground, - hc: editorBackground -}, nls.localize('panelBackground', "Panel background color. Panels are shown below the editor area and contain views like output and integrated terminal.")); - export const PANEL_BORDER = registerColor('panel.border', { dark: Color.fromHex('#808080').transparent(0.35), light: Color.fromHex('#808080').transparent(0.35), From cf4f34d8081746cbd144a6a8a883047f758e5bd2 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 29 May 2017 11:04:46 +0200 Subject: [PATCH 1118/1164] Extension viewlet high contrast mouse over borders only highlight a single border for top and bottom entries (fixes #15859) --- src/vs/base/browser/ui/list/listWidget.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index d8f833da540..1ed888d7f2a 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -887,7 +887,7 @@ export class List implements ISpliceable, IDisposable { } if (styles.listSelectionOutline) { - content.push(`.monaco-list.${this.idPrefix} .monaco-list-row.selected { outline: 1px dotted ${styles.listSelectionOutline}; }`); + content.push(`.monaco-list.${this.idPrefix} .monaco-list-row.selected { outline: 1px dotted ${styles.listSelectionOutline}; outline-offset: -1px; }`); } if (styles.listFocusOutline) { From bcf8f556928bf5c49ef94d60ef696dfd64423e54 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 29 May 2017 11:07:57 +0200 Subject: [PATCH 1119/1164] Search viewlet doesn't get selected text from diff editor (fixes #25293) --- .../workbench/parts/search/browser/searchViewlet.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/search/browser/searchViewlet.ts b/src/vs/workbench/parts/search/browser/searchViewlet.ts index 97f51caa16c..9fe88c72d57 100644 --- a/src/vs/workbench/parts/search/browser/searchViewlet.ts +++ b/src/vs/workbench/parts/search/browser/searchViewlet.ts @@ -9,7 +9,7 @@ import 'vs/css!./media/searchviewlet'; import nls = require('vs/nls'); import { TPromise } from 'vs/base/common/winjs.base'; import { Emitter, debounceEvent } from 'vs/base/common/event'; -import { ICommonCodeEditor, isCommonCodeEditor } from 'vs/editor/common/editorCommon'; +import { ICommonCodeEditor, isCommonCodeEditor, isCommonDiffEditor } from 'vs/editor/common/editorCommon'; import lifecycle = require('vs/base/common/lifecycle'); import errors = require('vs/base/common/errors'); import aria = require('vs/base/browser/ui/aria/aria'); @@ -797,7 +797,15 @@ export class SearchViewlet extends Viewlet { return null; } - let editorControl: any = this.editorService.getActiveEditor().getControl(); + let editorControl = this.editorService.getActiveEditor().getControl(); + if (isCommonDiffEditor(editorControl)) { + if (editorControl.getOriginalEditor().isFocused()) { + editorControl = editorControl.getOriginalEditor(); + } else { + editorControl = editorControl.getModifiedEditor(); + } + } + if (!isCommonCodeEditor(editorControl)) { return null; } From e4080aa0941ed748859a176be39d587b89432d00 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 29 May 2017 11:21:36 +0200 Subject: [PATCH 1120/1164] Extensions: double-click should open new extension window pinned (fixes #17048) --- src/vs/base/browser/ui/list/listPaging.ts | 4 ++++ .../extensions/electron-browser/extensionsViewlet.ts | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/vs/base/browser/ui/list/listPaging.ts b/src/vs/base/browser/ui/list/listPaging.ts index 70170ab730b..c11ff0e6f8d 100644 --- a/src/vs/base/browser/ui/list/listPaging.ts +++ b/src/vs/base/browser/ui/list/listPaging.ts @@ -85,6 +85,10 @@ export class PagedList { return mapEvent(this.list.onSelectionChange, ({ elements, indexes }) => ({ elements: elements.map(e => this._model.get(e)), indexes })); } + get onPin(): Event> { + return mapEvent(this.list.onPin, ({ elements, indexes }) => ({ elements: elements.map(e => this._model.get(e)), indexes })); + } + get model(): IPagedModel { return this._model; } diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts index 63d676aa2fb..63e301eff01 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts @@ -155,6 +155,11 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { .filter(e => !!e) .on(this.openExtension, this, this.disposables); + chain(this.list.onPin) + .map(e => e.elements[0]) + .filter(e => !!e) + .on(this.pin, this, this.disposables); + return TPromise.as(null); } @@ -437,6 +442,13 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { this.extensionsWorkbenchService.open(extension).done(null, err => this.onError(err)); } + private pin(): void { + const activeEditor = this.editorService.getActiveEditor(); + const activeEditorInput = this.editorService.getActiveEditorInput(); + + this.editorInputService.pinEditor(activeEditor.position, activeEditorInput); + } + private onEnter(): void { this.list.setSelection(this.list.getFocus()); } From 43298ba5473ad3282a6e25fb29bc0eaaa4ac808d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 29 May 2017 11:36:23 +0200 Subject: [PATCH 1121/1164] macOS: custom titlebar double-click not consistent (fixes #27382) --- src/vs/code/electron-main/window.ts | 27 +++++++++++++++++++ src/vs/platform/windows/common/windows.ts | 2 ++ src/vs/platform/windows/common/windowsIpc.ts | 6 +++++ .../windows/electron-browser/windowService.ts | 4 +++ .../windows/electron-main/windowsService.ts | 10 +++++++ .../browser/parts/titlebar/titlebarPart.ts | 8 +----- .../workbench/test/workbenchTestServices.ts | 7 +++++ 7 files changed, 57 insertions(+), 7 deletions(-) diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 91d560b50fd..b4151b960d3 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -823,6 +823,33 @@ export class VSCodeWindow { }; } + public onWindowTitleDoubleClick(): void { + + // Respect system settings on mac with regards to title click on windows title + if (platform.isMacintosh) { + const action = systemPreferences.getUserDefault('AppleActionOnDoubleClick', 'string'); + switch (action) { + case 'Minimize': + this.win.minimize(); + break; + case 'None': + break; + case 'Maximize': + default: + this.win.maximize(); + } + } + + // Linux/Windows: just toggle maximize/minimized state + else { + if (this.win.isMaximized()) { + this.win.unmaximize(); + } else { + this.win.maximize(); + } + } + } + public sendWhenReady(channel: string, ...args: any[]): void { this.ready().then(() => { this.send(channel, ...args); diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index d24aafc9bfb..b4ff59ddacf 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -37,6 +37,7 @@ export interface IWindowsService { isMaximized(windowId: number): TPromise; maximizeWindow(windowId: number): TPromise; unmaximizeWindow(windowId: number): TPromise; + onWindowTitleDoubleClick(windowId: number): TPromise; setDocumentEdited(windowId: number, flag: boolean): TPromise; quit(): TPromise; relaunch(options: { addArgs?: string[], removeArgs?: string[] }): TPromise; @@ -89,6 +90,7 @@ export interface IWindowService { isMaximized(): TPromise; maximizeWindow(): TPromise; unmaximizeWindow(): TPromise; + onWindowTitleDoubleClick(): TPromise; } export type MenuBarVisibility = 'default' | 'visible' | 'toggle' | 'hidden'; diff --git a/src/vs/platform/windows/common/windowsIpc.ts b/src/vs/platform/windows/common/windowsIpc.ts index 2d9e9d36506..01840d84f1e 100644 --- a/src/vs/platform/windows/common/windowsIpc.ts +++ b/src/vs/platform/windows/common/windowsIpc.ts @@ -31,6 +31,7 @@ export interface IWindowsChannel extends IChannel { call(command: 'isMaximized', arg: number): TPromise; call(command: 'maximizeWindow', arg: number): TPromise; call(command: 'unmaximizeWindow', arg: number): TPromise; + call(command: 'onWindowTitleDoubleClick', arg: number): TPromise; call(command: 'setDocumentEdited', arg: [number, boolean]): TPromise; call(command: 'quit'): TPromise; call(command: 'openWindow', arg: [string[], { forceNewWindow?: boolean, forceReuseWindow?: boolean }]): TPromise; @@ -81,6 +82,7 @@ export class WindowsChannel implements IWindowsChannel { case 'isMaximized': return this.service.isMaximized(arg); case 'maximizeWindow': return this.service.maximizeWindow(arg); case 'unmaximizeWindow': return this.service.unmaximizeWindow(arg); + case 'onWindowTitleDoubleClick': return this.service.onWindowTitleDoubleClick(arg); case 'setDocumentEdited': return this.service.setDocumentEdited(arg[0], arg[1]); case 'openWindow': return this.service.openWindow(arg[0], arg[1]); case 'openNewWindow': return this.service.openNewWindow(); @@ -185,6 +187,10 @@ export class WindowsChannelClient implements IWindowsService { return this.channel.call('unmaximizeWindow', windowId); } + onWindowTitleDoubleClick(windowId: number): TPromise { + return this.channel.call('onWindowTitleDoubleClick', windowId); + } + setDocumentEdited(windowId: number, flag: boolean): TPromise { return this.channel.call('setDocumentEdited', [windowId, flag]); } diff --git a/src/vs/platform/windows/electron-browser/windowService.ts b/src/vs/platform/windows/electron-browser/windowService.ts index c5d2e5c7e8a..1247697fd17 100644 --- a/src/vs/platform/windows/electron-browser/windowService.ts +++ b/src/vs/platform/windows/electron-browser/windowService.ts @@ -90,6 +90,10 @@ export class WindowService implements IWindowService { return this.windowsService.unmaximizeWindow(this.windowId); } + onWindowTitleDoubleClick(): TPromise { + return this.windowsService.onWindowTitleDoubleClick(this.windowId); + } + setDocumentEdited(flag: boolean): TPromise { return this.windowsService.setDocumentEdited(this.windowId, flag); } diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index f74c4e5af39..5cef01c60f5 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -209,6 +209,16 @@ export class WindowsService implements IWindowsService, IDisposable { return TPromise.as(null); } + onWindowTitleDoubleClick(windowId: number): TPromise { + const vscodeWindow = this.windowsMainService.getWindowById(windowId); + + if (vscodeWindow) { + vscodeWindow.onWindowTitleDoubleClick(); + } + + return TPromise.as(null); + } + setDocumentEdited(windowId: number, flag: boolean): TPromise { const vscodeWindow = this.windowsMainService.getWindowById(windowId); diff --git a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts index 1e1aa16a14f..d7aa9318fd6 100644 --- a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts @@ -241,13 +241,7 @@ export class TitlebarPart extends Part implements ITitleService { } private onTitleDoubleclick(): void { - this.windowService.isMaximized().then(maximized => { - if (maximized) { - this.windowService.unmaximizeWindow().done(null, errors.onUnexpectedError); - } else { - this.windowService.maximizeWindow().done(null, errors.onUnexpectedError); - } - }, errors.onUnexpectedError); + this.windowService.onWindowTitleDoubleClick().then(null, errors.onUnexpectedError); } private onContextMenu(e: MouseEvent): void { diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 899b03112be..a7f4f1ea918 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -847,6 +847,10 @@ export class TestWindowService implements IWindowService { unmaximizeWindow(): TPromise { return TPromise.as(void 0); } + + onWindowTitleDoubleClick(): TPromise { + return TPromise.as(void 0); + } } export class TestLifecycleService implements ILifecycleService { @@ -944,6 +948,9 @@ export class TestWindowsService implements IWindowsService { unmaximizeWindow(windowId: number): TPromise { return TPromise.as(void 0); } + onWindowTitleDoubleClick(windowId: number): TPromise { + return TPromise.as(void 0); + } setDocumentEdited(windowId: number, flag: boolean): TPromise { return TPromise.as(void 0); } From a168746445d2a36a073be820acd7b9ec5a28f5ff Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 29 May 2017 11:49:15 +0200 Subject: [PATCH 1122/1164] debug repl input disable minimap --- src/vs/workbench/parts/debug/electron-browser/repl.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/debug/electron-browser/repl.ts b/src/vs/workbench/parts/debug/electron-browser/repl.ts index cf2e3937375..06e263aff1d 100644 --- a/src/vs/workbench/parts/debug/electron-browser/repl.ts +++ b/src/vs/workbench/parts/debug/electron-browser/repl.ts @@ -281,7 +281,10 @@ export class Repl extends Panel implements IPrivateReplService { scrollBeyondLastLine: false, renderLineHighlight: 'none', fixedOverflowWidgets: true, - acceptSuggestionOnEnter: 'smart' + acceptSuggestionOnEnter: 'smart', + minimap: { + enabled: false + } }; } From a315b7cb724da24533c00769f61c5d0969601d7a Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 29 May 2017 12:06:06 +0200 Subject: [PATCH 1123/1164] Workbench theme customisation for forground tab colour of inactive group appears to be missing (fixes #27067) --- .../parts/editor/noTabsTitleControl.ts | 20 ++++--------- .../browser/parts/editor/tabsTitleControl.ts | 30 ++----------------- src/vs/workbench/common/theme.ts | 16 ++++++++-- 3 files changed, 23 insertions(+), 43 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts index fa83f95df08..6814ef611b8 100644 --- a/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts @@ -12,7 +12,7 @@ import DOM = require('vs/base/browser/dom'); import { TitleControl } from 'vs/workbench/browser/parts/editor/titleControl'; import { EditorLabel } from 'vs/workbench/browser/labels'; import { Verbosity } from 'vs/platform/editor/common/editor'; -import { TAB_ACTIVE_FOREGROUND } from 'vs/workbench/common/theme'; +import { TAB_ACTIVE_FOREGROUND, TAB_UNFOCUSED_ACTIVE_FOREGROUND } from 'vs/workbench/common/theme'; export class NoTabsTitleControl extends TitleControl { private titleContainer: HTMLElement; @@ -126,19 +126,11 @@ export class NoTabsTitleControl extends TitleControl { } this.editorLabel.setLabel({ name, description, resource }, { title, italic: !isPinned, extraClasses: ['title-label'] }); - this.editorLabel.element.style.color = this.getColor(TAB_ACTIVE_FOREGROUND, (color, theme) => { - if (!isActive) { - if (theme.type === 'dark') { - return color.transparent(0.5); - } - - if (theme.type === 'light') { - return color.transparent(0.7); - } - } - - return color; - }); + if (isActive) { + this.editorLabel.element.style.color = this.getColor(TAB_ACTIVE_FOREGROUND); + } else { + this.editorLabel.element.style.color = this.getColor(TAB_UNFOCUSED_ACTIVE_FOREGROUND); + } // Update Editor Actions Toolbar this.updateEditorActionsToolbar(); diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index de3fda8a4d5..759efa00c16 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -40,7 +40,7 @@ import { LinkedMap } from 'vs/base/common/map'; import { DelegatingWorkbenchEditorService } from 'vs/workbench/services/editor/browser/editorService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; -import { TAB_INACTIVE_BACKGROUND, TAB_ACTIVE_BACKGROUND, TAB_ACTIVE_FOREGROUND, TAB_INACTIVE_FOREGROUND, TAB_BORDER, EDITOR_DRAG_AND_DROP_BACKGROUND } from 'vs/workbench/common/theme'; +import { TAB_INACTIVE_BACKGROUND, TAB_ACTIVE_BACKGROUND, TAB_ACTIVE_FOREGROUND, TAB_INACTIVE_FOREGROUND, TAB_BORDER, EDITOR_DRAG_AND_DROP_BACKGROUND, TAB_UNFOCUSED_ACTIVE_FOREGROUND, TAB_UNFOCUSED_INACTIVE_FOREGROUND } from 'vs/workbench/common/theme'; import { activeContrastBorder, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; interface IEditorInputLabel { @@ -291,38 +291,14 @@ export class TabsTitleControl extends TitleControl { DOM.addClass(tabContainer, 'active'); tabContainer.setAttribute('aria-selected', 'true'); tabContainer.style.backgroundColor = this.getColor(TAB_ACTIVE_BACKGROUND); - tabLabel.element.style.color = this.getColor(TAB_ACTIVE_FOREGROUND, (color, theme) => { - if (!isGroupActive) { - if (theme.type === 'dark') { - return color.transparent(0.5); - } - - if (theme.type === 'light') { - return color.transparent(0.7); - } - } - - return color; - }); + tabLabel.element.style.color = this.getColor(isGroupActive ? TAB_ACTIVE_FOREGROUND : TAB_UNFOCUSED_ACTIVE_FOREGROUND); this.activeTab = tabContainer; } else { DOM.removeClass(tabContainer, 'active'); tabContainer.setAttribute('aria-selected', 'false'); tabContainer.style.backgroundColor = this.getColor(TAB_INACTIVE_BACKGROUND); - tabLabel.element.style.color = this.getColor(TAB_INACTIVE_FOREGROUND, (color, theme) => { - if (!isGroupActive) { - if (theme.type === 'dark') { - return color.transparent(0.5); - } - - if (theme.type === 'light') { - return color.transparent(0.5); - } - } - - return color; - }); + tabLabel.element.style.color = this.getColor(isGroupActive ? TAB_INACTIVE_FOREGROUND : TAB_UNFOCUSED_INACTIVE_FOREGROUND); } // Dirty State diff --git a/src/vs/workbench/common/theme.ts b/src/vs/workbench/common/theme.ts index 6a3c745dafb..3b35554eb6e 100644 --- a/src/vs/workbench/common/theme.ts +++ b/src/vs/workbench/common/theme.ts @@ -33,13 +33,25 @@ export const TAB_ACTIVE_FOREGROUND = registerColor('tab.activeForeground', { dark: Color.white, light: '#333333', hc: Color.white -}, nls.localize('tabActiveEditorGroupActiveForeground', "Active tab foreground color in an active group. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); +}, nls.localize('tabActiveForeground', "Active tab foreground color in an active group. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); export const TAB_INACTIVE_FOREGROUND = registerColor('tab.inactiveForeground', { dark: transparent(TAB_ACTIVE_FOREGROUND, 0.5), light: transparent(TAB_ACTIVE_FOREGROUND, 0.5), hc: Color.white -}, nls.localize('tabInactiveEditorGroupActiveForeground', "Inactive tab foreground color in an active group. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); +}, nls.localize('tabInactiveForeground', "Inactive tab foreground color in an active group. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); + +export const TAB_UNFOCUSED_ACTIVE_FOREGROUND = registerColor('tab.unfocusedActiveForeground', { + dark: transparent(TAB_ACTIVE_FOREGROUND, 0.5), + light: transparent(TAB_ACTIVE_FOREGROUND, 0.7), + hc: Color.white +}, nls.localize('tabUnfocusedActiveForeground', "Active tab foreground color in an inactive group. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); + +export const TAB_UNFOCUSED_INACTIVE_FOREGROUND = registerColor('tab.unfocusedInactiveForeground', { + dark: transparent(TAB_INACTIVE_FOREGROUND, 0.5), + light: transparent(TAB_INACTIVE_FOREGROUND, 0.5), + hc: Color.white +}, nls.localize('tabUnfocusedInactiveForeground', "Inactive tab foreground color in an inactive group. Tabs are the containers for editors in the editor area. Multiple tabs can be opened in one editor group. There can be multiple editor groups.")); // < --- Editors --- > From c1e60c7461a1c0bca82c2aa1f8f7418ebe007710 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 29 May 2017 12:16:43 +0200 Subject: [PATCH 1124/1164] debug actions widget: default position go back to center for discoverability #2513 --- src/vs/workbench/parts/debug/browser/debugActionsWidget.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts b/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts index dc9a9d0d19d..7afe47c4c78 100644 --- a/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts +++ b/src/vs/workbench/parts/debug/browser/debugActionsWidget.ts @@ -114,8 +114,7 @@ export class DebugActionsWidget extends Themable implements IWorkbenchContributi const mouseClickEvent = new StandardMouseEvent(event); if (mouseClickEvent.detail === 2) { // double click on debug bar centers it again #8250 - const widgetWidth = this.$el.getHTMLElement().clientWidth; - this.setXCoordinate(window.innerWidth - widgetWidth); + this.setXCoordinate(0.5 * window.innerWidth); this.storePosition(); } }); @@ -174,7 +173,7 @@ export class DebugActionsWidget extends Themable implements IWorkbenchContributi return; } if (x === undefined) { - x = parseFloat(this.storageService.get(DEBUG_ACTIONS_WIDGET_POSITION_KEY, StorageScope.WORKSPACE, '1')) * window.innerWidth; + x = parseFloat(this.storageService.get(DEBUG_ACTIONS_WIDGET_POSITION_KEY, StorageScope.WORKSPACE, '0.5')) * window.innerWidth; } const widgetWidth = this.$el.getHTMLElement().clientWidth; From 8f1fe44e86453fa2ef89b82f576f5c46640730d6 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Mon, 29 May 2017 12:17:01 +0200 Subject: [PATCH 1125/1164] Fixes #27426: Add runner information to telemetry --- src/vs/workbench/parts/tasks/common/taskSystem.ts | 2 ++ .../parts/tasks/electron-browser/terminalTaskSystem.ts | 2 ++ src/vs/workbench/parts/tasks/node/processTaskSystem.ts | 1 + 3 files changed, 5 insertions(+) diff --git a/src/vs/workbench/parts/tasks/common/taskSystem.ts b/src/vs/workbench/parts/tasks/common/taskSystem.ts index cca11d1e6a9..30e51e8a2e3 100644 --- a/src/vs/workbench/parts/tasks/common/taskSystem.ts +++ b/src/vs/workbench/parts/tasks/common/taskSystem.ts @@ -37,6 +37,8 @@ export interface TelemetryEvent { // How the task got trigger. Is either shortcut or command trigger: string; + runner: 'terminal' | 'output'; + // The command triggered command: string; diff --git a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts b/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts index bf6065aa66a..e374bce4cd9 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts @@ -340,6 +340,7 @@ export class TerminalTaskSystem extends EventEmitter implements ITaskSystem { try { let telemetryEvent: TelemetryEvent = { trigger: trigger, + runner: 'terminal', command: this.getSanitizedCommand(executedCommand), success: true, exitCode: summary.exitCode @@ -352,6 +353,7 @@ export class TerminalTaskSystem extends EventEmitter implements ITaskSystem { try { let telemetryEvent: TelemetryEvent = { trigger: trigger, + runner: 'terminal', command: this.getSanitizedCommand(executedCommand), success: false }; diff --git a/src/vs/workbench/parts/tasks/node/processTaskSystem.ts b/src/vs/workbench/parts/tasks/node/processTaskSystem.ts index 2a1fcb76e73..9f4d55278f5 100644 --- a/src/vs/workbench/parts/tasks/node/processTaskSystem.ts +++ b/src/vs/workbench/parts/tasks/node/processTaskSystem.ts @@ -120,6 +120,7 @@ export class ProcessTaskSystem extends EventEmitter implements ITaskSystem { private executeTask(task: Task, trigger: string = Triggers.command): ITaskExecuteResult { let telemetryEvent: TelemetryEvent = { trigger: trigger, + runner: 'output', command: 'other', success: true }; From 9a55652262ee29c9efaa373fe264a67265521998 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Mon, 29 May 2017 12:52:49 +0200 Subject: [PATCH 1126/1164] Fixes #27338: Let the task framework configure 'Press any key to close the terminal' --- src/vs/workbench/parts/terminal/common/terminal.ts | 4 +++- .../parts/terminal/electron-browser/terminalInstance.ts | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index bd7df535e4e..1093b3ee7e0 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -109,8 +109,10 @@ export interface IShellLaunchConfig { * shell is being launched by an extension). */ ignoreConfigurationCwd?: boolean; + /** Whether to wait for a key press before closing the terminal. */ - waitOnExit?: boolean; + waitOnExit?: boolean | string; + /** * A string including ANSI escape sequences that will be written to the terminal emulator * _before_ the terminal process has launched, a trailing \n is added at the end of the string. diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 5247bd40e71..3b320363826 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -529,7 +529,10 @@ export class TerminalInstance implements ITerminalInstance { if (exitCode) { this._xterm.writeln(exitCodeMessage); } - this._xterm.writeln(nls.localize('terminal.integrated.waitOnExit', 'Press any key to close the terminal')); + let message = typeof this._shellLaunchConfig.waitOnExit === 'string' + ? this._shellLaunchConfig.waitOnExit + : nls.localize('terminal.integrated.waitOnExit', 'Press any key to close the terminal'); + this._xterm.writeln(message); // Disable all input if the terminal is exiting and listen for next keypress this._xterm.setOption('disableStdin', true); if (this._xterm.textarea) { From e8271ae2ae426d29ef087af8e64b14f2b678298b Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Mon, 29 May 2017 12:53:24 +0200 Subject: [PATCH 1127/1164] Adopt #27338 --- .../parts/tasks/electron-browser/terminalTaskSystem.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts b/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts index e374bce4cd9..04591b40b55 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts @@ -368,7 +368,10 @@ export class TerminalTaskSystem extends EventEmitter implements ITaskSystem { let options = this.resolveOptions(task.command.options); let { command, args } = this.resolveCommandAndArgs(task); let terminalName = nls.localize('TerminalTaskSystem.terminalName', 'Task - {0}', task.name); - let waitOnExit = task.command.terminal.reveal !== RevealKind.Never || !task.isBackground; + let waitOnExit: boolean | string = false; + if (task.command.terminal.reveal !== RevealKind.Never || !task.isBackground) { + waitOnExit = nls.localize('reuseTerminal', 'Terminal will be reused by tasks, press any key to close it.'); + }; let shellLaunchConfig: IShellLaunchConfig = undefined; let isShellCommand = task.command.type === CommandType.Shell; if (isShellCommand) { From 365fcece1868764f2a9c771f18dd01ff7072cf79 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Mon, 29 May 2017 13:04:24 +0200 Subject: [PATCH 1128/1164] Fixes #27320 --- .../parts/tasks/browser/quickOpen.ts | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/parts/tasks/browser/quickOpen.ts b/src/vs/workbench/parts/tasks/browser/quickOpen.ts index e282ee68321..fe5ec004ee4 100644 --- a/src/vs/workbench/parts/tasks/browser/quickOpen.ts +++ b/src/vs/workbench/parts/tasks/browser/quickOpen.ts @@ -125,7 +125,7 @@ class CustomizeTaskAction extends Action { private static ID = 'workbench.action.tasks.customizeTask'; private static LABEL = nls.localize('customizeTask', "Customize Task"); - constructor(private taskService: ITaskService, private task: Task) { + constructor(private taskService: ITaskService, private quickOpenService: IQuickOpenService, private task: Task) { super(CustomizeTaskAction.ID, CustomizeTaskAction.LABEL); this.updateClass(); } @@ -134,37 +134,44 @@ class CustomizeTaskAction extends Action { this.class = 'quick-open-task-configure'; } - public run(context: any): TPromise { - return this.taskService.customize(this.task, true).then(_ => false, _ => false); + public run(context: any): TPromise { + return this.taskService.customize(this.task, true).then(() => { + this.quickOpenService.close(); + }); } } export class QuickOpenActionContributor extends ActionBarContributor { - constructor( @ITaskService private taskService: ITaskService) { + constructor( @ITaskService private taskService: ITaskService, @IQuickOpenService private quickOpenService: IQuickOpenService) { super(); } public hasActions(context: any): boolean { - const entry = this.getEntry(context); + let task = this.getTask(context); - return !!entry; + return !!task; } public getActions(context: any): IAction[] { - const actions: Action[] = []; - - const entry = this.getEntry(context); - if (entry && entry.task._source.kind === TaskSourceKind.Extension) { - actions.push(new CustomizeTaskAction(this.taskService, entry.task)); + let actions: Action[] = []; + let task = this.getTask(context); + if (task && task._source.kind === TaskSourceKind.Extension) { + actions.push(new CustomizeTaskAction(this.taskService, this.quickOpenService, task)); } return actions; } - private getEntry(context: any): TaskEntry { - if (!context || !(context.element instanceof TaskEntry)) { + private getTask(context: any): Task { + if (!context) { return undefined; } - return context.element as TaskEntry; + let element = context.element; + if (element instanceof TaskEntry) { + return element.task; + } else if (element instanceof TaskGroupEntry) { + return (element.getEntry() as TaskEntry).task; + } + return undefined; } } \ No newline at end of file From 7c27e9ba0815db59c765aa2ca2719cb0865c9ab3 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 29 May 2017 14:19:33 +0200 Subject: [PATCH 1129/1164] remove variablesDealy setting we used for experimentation fixes #27262 --- src/vs/workbench/parts/debug/common/debug.ts | 1 - .../parts/debug/electron-browser/debug.contribution.ts | 4 ---- .../workbench/parts/debug/electron-browser/debugViews.ts | 8 +++----- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index 5947fe89104..310e20a0d22 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -306,7 +306,6 @@ export interface IDebugConfiguration { inlineValues: boolean; hideActionBar: boolean; internalConsoleOptions: string; - variablesDelay: number; } export interface IGlobalConfig { diff --git a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts index b8faa49a1a1..22c7191e517 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts @@ -173,10 +173,6 @@ configurationRegistry.registerConfiguration({ default: false }, 'debug.internalConsoleOptions': INTERNAL_CONSOLE_OPTIONS_SCHEMA, - 'debug.variablesDelay': { - type: 'number', - default: 400 - }, 'launch': { type: 'object', description: nls.localize({ comment: ['This is the description for a setting'], key: 'launch' }, "Global debug launch configuration. Should be used as an alternative to 'launch.json' that is shared across workspaces"), diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViews.ts b/src/vs/workbench/parts/debug/electron-browser/debugViews.ts index 63d48fe5694..3d4d2f1838b 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViews.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViews.ts @@ -17,7 +17,7 @@ import { IHighlightEvent, ITree } from 'vs/base/parts/tree/browser/tree'; import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { CollapsibleState } from 'vs/base/browser/ui/splitview/splitview'; import { CollapsibleViewletView, AdaptiveCollapsibleViewletView, CollapseAction } from 'vs/workbench/browser/viewlet'; -import { IDebugService, State, IDebugConfiguration, IBreakpoint, IExpression, CONTEXT_BREAKPOINTS_FOCUSED, CONTEXT_WATCH_EXPRESSIONS_FOCUSED, CONTEXT_VARIABLES_FOCUSED } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugService, State, IBreakpoint, IExpression, CONTEXT_BREAKPOINTS_FOCUSED, CONTEXT_WATCH_EXPRESSIONS_FOCUSED, CONTEXT_VARIABLES_FOCUSED } from 'vs/workbench/parts/debug/common/debug'; import { Expression, Variable, ExceptionBreakpoint, FunctionBreakpoint, Thread, StackFrame, Breakpoint, ThreadAndProcessIds } from 'vs/workbench/parts/debug/common/debugModel'; import * as viewer from 'vs/workbench/parts/debug/electron-browser/debugViewer'; import { AddWatchExpressionAction, RemoveAllWatchExpressionsAction, AddFunctionBreakpointAction, ToggleBreakpointsActivatedAction, RemoveAllBreakpointsAction } from 'vs/workbench/parts/debug/browser/debugActions'; @@ -26,7 +26,6 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { MenuId } from 'vs/platform/actions/common/actions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IMessageService } from 'vs/platform/message/common/message'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IListService } from 'vs/platform/list/browser/listService'; @@ -60,8 +59,7 @@ export class VariablesView extends CollapsibleViewletView { @IInstantiationService private instantiationService: IInstantiationService, @IContextKeyService contextKeyService: IContextKeyService, @IListService private listService: IListService, - @IThemeService private themeService: IThemeService, - @IConfigurationService private configurationService: IConfigurationService + @IThemeService private themeService: IThemeService ) { super(actionRunner, !!settings[VariablesView.MEMENTO], nls.localize('variablesSection', "Variables Section"), messageService, keybindingService, contextMenuService); @@ -82,7 +80,7 @@ export class VariablesView extends CollapsibleViewletView { } return undefined; }).done(null, errors.onUnexpectedError); - }, this.configurationService.getConfiguration('debug').variablesDelay); + }, 400); } public renderHeader(container: HTMLElement): void { From 7c3f873bed2b3b89ff14882866a3afd656627e8b Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 29 May 2017 14:31:57 +0200 Subject: [PATCH 1130/1164] update to vscode-textmate@3.1.5 --- npm-shrinkwrap.json | 6 +++--- package.json | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 678f3be8298..d7f219b1638 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -420,9 +420,9 @@ "resolved": "https://registry.npmjs.org/vscode-ripgrep/-/vscode-ripgrep-0.0.12.tgz" }, "vscode-textmate": { - "version": "3.1.4", - "from": "vscode-textmate@3.1.4", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-3.1.4.tgz" + "version": "3.1.5", + "from": "vscode-textmate@3.1.5", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-3.1.5.tgz" }, "windows-foreground-love": { "version": "0.1.0", diff --git a/package.json b/package.json index c31f58f40c9..bfc4fed8575 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "v8-profiler": "jrieken/v8-profiler#vscode", "vscode-debugprotocol": "1.19.0", "vscode-ripgrep": "0.0.12", - "vscode-textmate": "^3.1.4", + "vscode-textmate": "^3.1.5", "winreg": "1.2.0", "xterm": "Tyriar/xterm.js#vscode-release/1.13", "yauzl": "2.3.1" @@ -124,4 +124,4 @@ "windows-mutex": "^0.2.0", "fsevents": "0.3.8" } -} \ No newline at end of file +} From e58c2abb979281c1f4a6530840e5a4ed0093bfb6 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Mon, 29 May 2017 14:44:01 +0200 Subject: [PATCH 1131/1164] Implements #27399: Separate the task provider name from the task name in the task API --- extensions/grunt/src/main.ts | 4 +- extensions/gulp/src/main.ts | 2 +- extensions/jake/src/main.ts | 2 +- extensions/npm/src/main.ts | 4 +- .../typescript/src/features/taskProvider.ts | 3 +- src/vs/vscode.d.ts | 33 +++++++---- src/vs/workbench/api/node/extHostTask.ts | 6 +- src/vs/workbench/api/node/extHostTypes.ts | 58 +++++++++++-------- .../parts/tasks/browser/quickOpen.ts | 16 ++++- .../parts/tasks/common/taskConfiguration.ts | 1 + src/vs/workbench/parts/tasks/common/tasks.ts | 5 +- .../electron-browser/task.contribution.ts | 2 +- .../tasks/test/node/configuration.test.ts | 2 +- 13 files changed, 88 insertions(+), 50 deletions(-) diff --git a/extensions/grunt/src/main.ts b/extensions/grunt/src/main.ts index ff551f904ec..a90eff6c933 100644 --- a/extensions/grunt/src/main.ts +++ b/extensions/grunt/src/main.ts @@ -139,8 +139,8 @@ async function getGruntTasks(): Promise { if (matches && matches.length === 2) { let taskName = matches[1]; let task = taskName.indexOf(' ') === -1 - ? new vscode.ShellTask(`grunt: ${taskName}`, `${command} ${taskName}`) - : new vscode.ShellTask(`grunt: ${taskName}`, `${command} "${taskName}"`); + ? new vscode.ShellTask(taskName, `${command} ${taskName}`) + : new vscode.ShellTask(taskName, `${command} "${taskName}"`); task.identifier = `grunt.${taskName}`; result.push(task); let lowerCaseTaskName = taskName.toLowerCase(); diff --git a/extensions/gulp/src/main.ts b/extensions/gulp/src/main.ts index 666b66bf120..c75a8ce5d9c 100644 --- a/extensions/gulp/src/main.ts +++ b/extensions/gulp/src/main.ts @@ -114,7 +114,7 @@ async function getGulpTasks(): Promise { if (line.length === 0) { continue; } - let task = new vscode.ShellTask(`gulp: ${line}`, `${gulpCommand} ${line}`); + let task = new vscode.ShellTask(line, `${gulpCommand} ${line}`); task.identifier = `gulp.${line}`; result.push(task); let lowerCaseLine = line.toLowerCase(); diff --git a/extensions/jake/src/main.ts b/extensions/jake/src/main.ts index 93b55873eab..25d93a29780 100644 --- a/extensions/jake/src/main.ts +++ b/extensions/jake/src/main.ts @@ -118,7 +118,7 @@ async function getJakeTasks(): Promise { let matches = regExp.exec(line); if (matches && matches.length === 2) { let taskName = matches[1]; - let task = new vscode.ShellTask(`jake: ${taskName}`, `${jakeCommand} ${taskName}`); + let task = new vscode.ShellTask(taskName, `${jakeCommand} ${taskName}`); task.identifier = `jake.${taskName}`; result.push(task); let lowerCaseLine = line.toLowerCase(); diff --git a/extensions/npm/src/main.ts b/extensions/npm/src/main.ts index 9dc734a4ffe..beeddfa5a86 100644 --- a/extensions/npm/src/main.ts +++ b/extensions/npm/src/main.ts @@ -81,7 +81,7 @@ async function getNpmScriptsAsTasks(): Promise { const result: vscode.Task[] = []; Object.keys(json.scripts).forEach(each => { - const task = new vscode.ShellTask(`npm: run ${each}`, `npm run ${each}`); + const task = new vscode.ShellTask(`run ${each}`, `npm run ${each}`); const lowerCaseTaskName = each.toLowerCase(); if (lowerCaseTaskName === 'build') { task.group = vscode.TaskGroup.Build; @@ -91,7 +91,7 @@ async function getNpmScriptsAsTasks(): Promise { result.push(task); }); // add some 'well known' npm tasks - result.push(new vscode.ShellTask(`npm: install`, `npm install`)); + result.push(new vscode.ShellTask(`install`, `npm install`)); return Promise.resolve(result); } catch (e) { return Promise.resolve(emptyTasks); diff --git a/extensions/typescript/src/features/taskProvider.ts b/extensions/typescript/src/features/taskProvider.ts index 4d50b233294..9cb0a3a64a8 100644 --- a/extensions/typescript/src/features/taskProvider.ts +++ b/extensions/typescript/src/features/taskProvider.ts @@ -48,7 +48,8 @@ class TscTaskProvider implements vscode.TaskProvider { return projects.map(configFile => { const configFileName = path.relative(rootPath, configFile); - const buildTask = new vscode.ShellTask(`tsc: build ${configFileName}`, `${command} -p "${configFile}"`, '$tsc'); + const buildTask = new vscode.ShellTask(`build ${configFileName}`, `${command} -p "${configFile}"`, '$tsc'); + buildTask.source = 'tsc'; buildTask.group = vscode.TaskGroup.Build; return buildTask; }); diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index f9587fccbe0..979822a1f4d 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3580,11 +3580,6 @@ declare module 'vscode' { export const Test: 'test'; } - /** - * The supported task groups. - */ - export type TaskGroup = 'clean' | 'build' | 'rebuildAll' | 'test'; - /** * The ProblemMatchers type definition. */ @@ -3652,10 +3647,18 @@ declare module 'vscode' { args: string[]; /** - * The task group this tasks belongs to. Defaults to undefined meaning - * that the task doesn't belong to any special group. + * A human-readable string describing the source of this + * shell task, e.g. 'gulp' or 'npm'. */ - group?: TaskGroup; + source: string | undefined; + + /** + * The task group this tasks belongs to. See TaskGroup + * for a predefined set of available groups. + * Defaults to undefined meaning that the task doesn't + * belong to any special group. + */ + group: string | undefined; /** * The process options used when the process is executed. @@ -3772,10 +3775,18 @@ declare module 'vscode' { readonly commandLine: string; /** - * The task group this tasks belongs to. Defaults to undefined meaning - * that the task doesn't belong to any special group. + * A human-readable string describing the source of this + * shell task, e.g. 'gulp' or 'npm'. */ - group?: TaskGroup; + source: string | undefined; + + /** + * The task group this tasks belongs to. See TaskGroup + * for a predefined set of available groups. + * Defaults to undefined meaning that the task doesn't + * belong to any special group. + */ + group: string | undefined; /** * The shell options used when the shell is executed. Defaults to an diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index 04836f73af8..99f5368de6f 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -310,7 +310,11 @@ namespace Tasks { } let result: TaskSystem.Task = { _id: uuidMap.getUUID(task.identifier), - _source: { kind: TaskSystem.TaskSourceKind.Extension, detail: extension.id }, + _source: { + kind: TaskSystem.TaskSourceKind.Extension, + label: typeof task.source === 'string' ? task.source : extension.name, + detail: extension.id + }, name: task.name, identifier: task.identifier, group: types.TaskGroup.is(task.group) ? task.group : undefined, diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index d78f0d8d75e..87509da1649 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1021,6 +1021,8 @@ export class BaseTask { private _problemMatchers: string[]; private _identifier: string; private _isBackground: boolean; + private _source: string; + private _group: string; private _terminal: vscode.TerminalBehaviour; constructor(name: string, problemMatchers: string[]) { @@ -1063,6 +1065,36 @@ export class BaseTask { this._isBackground = value; } + get source(): string { + return this._source; + } + + set source(value: string) { + if (value === void 0 || value === null) { + this._source = undefined; + return; + } + if (typeof value !== 'string' || value.length === 0) { + throw illegalArgument('source must be a string of length > 0'); + } + this._source = value; + } + + get group(): string { + return this._group; + } + + set group(value: string) { + if (value === void 0 || value === null) { + this._group = undefined; + return; + } + if (typeof value !== 'string' || value.length === 0) { + throw illegalArgument('group must be a string of length > 0'); + } + this._group = value; + } + get terminal(): vscode.TerminalBehaviour { return this._terminal; } @@ -1122,7 +1154,7 @@ export namespace TaskGroup { */ export const Test: 'test' = 'test'; - export function is(value: string): value is vscode.TaskGroup { + export function is(value: string): value is string { return value === Clean || value === Build || value === RebuildAll || value === Test; } } @@ -1131,7 +1163,6 @@ export class ProcessTask extends BaseTask { private _process: string; private _args: string[]; - private _group: vscode.TaskGroup; private _options: vscode.ProcessOptions; constructor(name: string, process: string, args?: string[], problemMatchers?: vscode.ProblemMatchers); @@ -1183,17 +1214,6 @@ export class ProcessTask extends BaseTask { this._args = value; } - get group(): vscode.TaskGroup { - return this._group; - } - - set group(value: vscode.TaskGroup) { - if (!TaskGroup.is(value)) { - throw illegalArgument('group'); - } - this._group = value; - } - get options(): vscode.ProcessOptions { return this._options; } @@ -1209,7 +1229,6 @@ export class ProcessTask extends BaseTask { export class ShellTask extends BaseTask implements vscode.ShellTask { private _commandLine: string; - private _group: vscode.TaskGroup; private _options: vscode.ShellOptions; constructor(name: string, commandLine: string, problemMatchers?: vscode.ProblemMatchers); @@ -1240,17 +1259,6 @@ export class ShellTask extends BaseTask implements vscode.ShellTask { return this._commandLine; } - get group(): vscode.TaskGroup { - return this._group; - } - - set group(value: vscode.TaskGroup) { - if (!TaskGroup.is(value)) { - throw illegalArgument('group'); - } - this._group = value; - } - get options(): vscode.ShellOptions { return this._options; } diff --git a/src/vs/workbench/parts/tasks/browser/quickOpen.ts b/src/vs/workbench/parts/tasks/browser/quickOpen.ts index fe5ec004ee4..15432e9c647 100644 --- a/src/vs/workbench/parts/tasks/browser/quickOpen.ts +++ b/src/vs/workbench/parts/tasks/browser/quickOpen.ts @@ -19,13 +19,19 @@ import { ActionBarContributor, ContributableActionProvider } from 'vs/workbench/ export class TaskEntry extends Model.QuickOpenEntry { + private _label: string; + constructor(protected taskService: ITaskService, protected _task: Task, highlights: Model.IHighlight[] = []) { super(highlights); - this._task = _task; + if (_task._source.kind === TaskSourceKind.Extension) { + this._label = nls.localize('taskEntry.label', '{0}: {1}', _task._source.label, _task.name); + } else { + this._label = _task.name; + } } public getLabel(): string { - return this._task.name; + return this._label; } public getAriaLabel(): string { @@ -76,6 +82,12 @@ export abstract class QuickOpenHandler extends Quickopen.QuickOpenHandler { let aKind = a._source.kind; let bKind = b._source.kind; if (aKind === bKind) { + if (aKind === TaskSourceKind.Extension) { + let compare = a._source.label.localeCompare(b._source.label); + if (compare !== 0) { + return compare; + } + } return a.name.localeCompare(b.name); } if (aKind === TaskSourceKind.Workspace) { diff --git a/src/vs/workbench/parts/tasks/common/taskConfiguration.ts b/src/vs/workbench/parts/tasks/common/taskConfiguration.ts index 09fa78dfd77..a7ccb15f65e 100644 --- a/src/vs/workbench/parts/tasks/common/taskConfiguration.ts +++ b/src/vs/workbench/parts/tasks/common/taskConfiguration.ts @@ -764,6 +764,7 @@ namespace TaskDescription { export let source: Tasks.TaskSource = { kind: Tasks.TaskSourceKind.Workspace, + label: 'Workspace', detail: '.settins\tasks.json' }; diff --git a/src/vs/workbench/parts/tasks/common/tasks.ts b/src/vs/workbench/parts/tasks/common/tasks.ts index c3e90f83fb6..e7d54343b07 100644 --- a/src/vs/workbench/parts/tasks/common/tasks.ts +++ b/src/vs/workbench/parts/tasks/common/tasks.ts @@ -153,7 +153,7 @@ export namespace TaskGroup { export const Test: 'test' = 'test'; - export function is(value: string): value is TaskGroup { + export function is(value: string): value is string { return value === Clean || value === Build || value === RebuildAll || value === Test; } } @@ -168,6 +168,7 @@ export enum TaskSourceKind { export interface TaskSource { kind: TaskSourceKind; + label: string; detail?: string; } @@ -199,7 +200,7 @@ export interface Task { /** * the task's group; */ - group?: TaskGroup; + group?: string; /** * The command configuration diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index 68b32dfc244..d94812a35bb 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -780,7 +780,7 @@ class TaskService extends EventEmitter implements ITaskService { let id: string = UUID.generateUuid(); let task: Task = { _id: id, - _source: { kind: TaskSourceKind.Generic }, + _source: { kind: TaskSourceKind.Generic, label: 'generic' }, name: id, identifier: id, dependsOn: extensionTasks.map(task => task._id), diff --git a/src/vs/workbench/parts/tasks/test/node/configuration.test.ts b/src/vs/workbench/parts/tasks/test/node/configuration.test.ts index cbccf978e9d..c958d68336b 100644 --- a/src/vs/workbench/parts/tasks/test/node/configuration.test.ts +++ b/src/vs/workbench/parts/tasks/test/node/configuration.test.ts @@ -144,7 +144,7 @@ class TaskBuilder { this.commandBuilder = new CommandConfigurationBuilder(this, command); this.result = { _id: name, - _source: { kind: Tasks.TaskSourceKind.Workspace }, + _source: { kind: Tasks.TaskSourceKind.Workspace, label: 'workspace' }, identifier: name, name: name, command: this.commandBuilder.result, From bf5bb9de5c0049b72ca3a506917af64241e5dc4a Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Mon, 29 May 2017 14:50:16 +0200 Subject: [PATCH 1132/1164] Implements #27087: Simplify task activation events --- extensions/grunt/package.json | 4 +--- extensions/gulp/package.json | 4 +--- extensions/jake/package.json | 4 +--- extensions/npm/package.json | 4 +--- extensions/typescript/package.json | 4 +--- 5 files changed, 5 insertions(+), 15 deletions(-) diff --git a/extensions/grunt/package.json b/extensions/grunt/package.json index e3338dd8d34..e8bac905a69 100644 --- a/extensions/grunt/package.json +++ b/extensions/grunt/package.json @@ -22,9 +22,7 @@ }, "main": "./out/main", "activationEvents": [ - "onCommand:workbench.action.tasks.runTask", - "onCommand:workbench.action.tasks.build", - "onCommand:workbench.action.tasks.test" + "onCommand:workbench.action.tasks.runTask" ], "contributes": { "configuration": { diff --git a/extensions/gulp/package.json b/extensions/gulp/package.json index 0d1d70f9e1e..5ec491853fe 100644 --- a/extensions/gulp/package.json +++ b/extensions/gulp/package.json @@ -22,9 +22,7 @@ }, "main": "./out/main", "activationEvents": [ - "onCommand:workbench.action.tasks.runTask", - "onCommand:workbench.action.tasks.build", - "onCommand:workbench.action.tasks.test" + "onCommand:workbench.action.tasks.runTask" ], "contributes": { "configuration": { diff --git a/extensions/jake/package.json b/extensions/jake/package.json index dd34c9b2235..ee5a916ade5 100644 --- a/extensions/jake/package.json +++ b/extensions/jake/package.json @@ -22,9 +22,7 @@ }, "main": "./out/main", "activationEvents": [ - "onCommand:workbench.action.tasks.runTask", - "onCommand:workbench.action.tasks.build", - "onCommand:workbench.action.tasks.test" + "onCommand:workbench.action.tasks.runTask" ], "contributes": { "configuration": { diff --git a/extensions/npm/package.json b/extensions/npm/package.json index e6a6a3ec4fa..9d626265d36 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -23,9 +23,7 @@ }, "main": "./out/main", "activationEvents": [ - "onCommand:workbench.action.tasks.runTask", - "onCommand:workbench.action.tasks.build", - "onCommand:workbench.action.tasks.test" + "onCommand:workbench.action.tasks.runTask" ], "contributes": { "configuration": { diff --git a/extensions/typescript/package.json b/extensions/typescript/package.json index cff9784cabe..11b75cfc26b 100644 --- a/extensions/typescript/package.json +++ b/extensions/typescript/package.json @@ -35,9 +35,7 @@ "onCommand:javascript.goToProjectConfig", "onCommand:typescript.goToProjectConfig", "onCommand:typescript.openTsServerLog", - "onCommand:workbench.action.tasks.runTask", - "onCommand:workbench.action.tasks.build", - "onCommand:workbench.action.tasks.test" + "onCommand:workbench.action.tasks.runTask" ], "main": "./out/typescriptMain", "contributes": { From c25eb69604f19b405d7a28281285be6831e94b76 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 29 May 2017 14:58:29 +0200 Subject: [PATCH 1133/1164] show update activity for all platforms but only for insider quality --- .../parts/update/electron-browser/update.contribution.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/update/electron-browser/update.contribution.ts b/src/vs/workbench/parts/update/electron-browser/update.contribution.ts index 39c771ee7c9..26cc50dfe8e 100644 --- a/src/vs/workbench/parts/update/electron-browser/update.contribution.ts +++ b/src/vs/workbench/parts/update/electron-browser/update.contribution.ts @@ -8,7 +8,7 @@ import * as nls from 'vs/nls'; import 'vs/css!./media/update.contribution'; import { Registry } from 'vs/platform/platform'; -import { isMacintosh } from 'vs/base/common/platform'; +import product from 'vs/platform/node/product'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { ReleaseNotesEditor } from 'vs/workbench/parts/update/electron-browser/releaseNotesEditor'; import { ReleaseNotesInput } from 'vs/workbench/parts/update/electron-browser/releaseNotesInput'; @@ -24,7 +24,7 @@ import { ShowCurrentReleaseNotesAction, ProductContribution, UpdateContribution, Registry.as(WorkbenchExtensions.Workbench) .registerWorkbenchContribution(ProductContribution); -if (isMacintosh) { +if (product.quality === 'insider') { Registry.as(GlobalActivityExtensions) .registerActivity(LightUpdateContribution); } else { From 03fa5a859d5b6da6d70a1cecc2bb6aad5f13bfff Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 29 May 2017 15:02:48 +0200 Subject: [PATCH 1134/1164] use a wrench icon for the update activity --- .../workbench/parts/update/electron-browser/media/update.svg | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/vs/workbench/parts/update/electron-browser/media/update.svg b/src/vs/workbench/parts/update/electron-browser/media/update.svg index 637b2ad42de..3dec2ba50fd 100644 --- a/src/vs/workbench/parts/update/electron-browser/media/update.svg +++ b/src/vs/workbench/parts/update/electron-browser/media/update.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file From 91988af341f2379c0c0312f433a6ea9f5fce5dc5 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 29 May 2017 15:12:55 +0200 Subject: [PATCH 1135/1164] update activity: action labels to better reflect os --- .../parts/update/electron-browser/update.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/update/electron-browser/update.ts b/src/vs/workbench/parts/update/electron-browser/update.ts index ff79f211a37..323a9e07181 100644 --- a/src/vs/workbench/parts/update/electron-browser/update.ts +++ b/src/vs/workbench/parts/update/electron-browser/update.ts @@ -28,7 +28,7 @@ import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IUpdateService, State as UpdateState } from 'vs/platform/update/common/update'; import * as semver from 'semver'; -import { OS } from 'vs/base/common/platform'; +import { OS, isLinux, isWindows } from 'vs/base/common/platform'; class ApplyUpdateAction extends Action { constructor( @IUpdateService private updateService: IUpdateService) { @@ -308,7 +308,17 @@ export class LightUpdateContribution implements IGlobalActivity { return [new Action('update.checking', nls.localize('checkingForUpdates', "Checking For Updates..."), undefined, false)]; case UpdateState.UpdateAvailable: - return [new Action('update.installing', nls.localize('installingUpdate', "Installing Update..."), undefined, false)]; + if (isLinux) { + return [new Action('update.linux.available', nls.localize('DownloadUpdate', "Download Available Update"), undefined, true, () => + this.updateService.quitAndInstall() + )]; + } + + const updateAvailableLabel = isWindows + ? nls.localize('DownloadingUpdate', "Downloading Update...") + : nls.localize('InstallingUpdate', "Installing Update..."); + + return [new Action('update.available', updateAvailableLabel, undefined, false)]; case UpdateState.UpdateDownloaded: return [new Action('update.restart', nls.localize('restartToUpdate', "Restart To Update..."), undefined, true, () => From 87adb8d06a9d77794bf10a5b5c57896d01b60206 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 29 May 2017 15:30:51 +0200 Subject: [PATCH 1136/1164] add more actions to the update activity --- .../parts/update/electron-browser/update.ts | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/vs/workbench/parts/update/electron-browser/update.ts b/src/vs/workbench/parts/update/electron-browser/update.ts index 323a9e07181..cfdf028a841 100644 --- a/src/vs/workbench/parts/update/electron-browser/update.ts +++ b/src/vs/workbench/parts/update/electron-browser/update.ts @@ -9,6 +9,7 @@ import nls = require('vs/nls'); import severity from 'vs/base/common/severity'; import { TPromise } from 'vs/base/common/winjs.base'; import { IAction, Action } from 'vs/base/common/actions'; +import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { IMessageService, CloseAction, Severity } from 'vs/platform/message/common/message'; import pkg from 'vs/platform/node/package'; import product from 'vs/platform/node/product'; @@ -300,35 +301,43 @@ export class LightUpdateContribution implements IGlobalActivity { } getActions(): IAction[] { + return [ + new Action('showCommandPalette', nls.localize('commandPalette', "Command Palette..."), undefined, true, () => this.commandService.executeCommand('workbench.action.showCommands')), + new Separator(), + new Action('openKeybindings', nls.localize('settings', "Settings"), null, true, () => this.commandService.executeCommand('workbench.action.openGlobalSettings')), + new Action('openSettings', nls.localize('keyboardShortcuts', "Keyboard Shortcuts"), null, true, () => this.commandService.executeCommand('workbench.action.openGlobalKeybindings')), + new Separator(), + this.getUpdateAction() + ]; + } + + private getUpdateAction(): IAction { switch (this.updateService.state) { case UpdateState.Uninitialized: - return [new Action('update.notavailable', nls.localize('not available', "Updates Not Available"), undefined, false)]; + return new Action('update.notavailable', nls.localize('not available', "Updates Not Available"), undefined, false); case UpdateState.CheckingForUpdate: - return [new Action('update.checking', nls.localize('checkingForUpdates', "Checking For Updates..."), undefined, false)]; + return new Action('update.checking', nls.localize('checkingForUpdates', "Checking For Updates..."), undefined, false); case UpdateState.UpdateAvailable: if (isLinux) { - return [new Action('update.linux.available', nls.localize('DownloadUpdate', "Download Available Update"), undefined, true, () => - this.updateService.quitAndInstall() - )]; + return new Action('update.linux.available', nls.localize('DownloadUpdate', "Download Available Update"), undefined, true, () => + this.updateService.quitAndInstall()); } const updateAvailableLabel = isWindows ? nls.localize('DownloadingUpdate', "Downloading Update...") : nls.localize('InstallingUpdate', "Installing Update..."); - return [new Action('update.available', updateAvailableLabel, undefined, false)]; + return new Action('update.available', updateAvailableLabel, undefined, false); case UpdateState.UpdateDownloaded: - return [new Action('update.restart', nls.localize('restartToUpdate', "Restart To Update..."), undefined, true, () => - this.updateService.quitAndInstall() - )]; + return new Action('update.restart', nls.localize('restartToUpdate', "Restart To Update..."), undefined, true, () => + this.updateService.quitAndInstall()); default: - return [new Action('update.check', nls.localize('checkForUpdates', "Check For Updates..."), undefined, this.updateService.state === UpdateState.Idle, () => - this.updateService.checkForUpdates(true) - )]; + return new Action('update.check', nls.localize('checkForUpdates', "Check For Updates..."), undefined, this.updateService.state === UpdateState.Idle, () => + this.updateService.checkForUpdates(true)); } } } \ No newline at end of file From fdadd0ed5fd39deebe8fb9e0ac5bd6efb4dfb94e Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Mon, 29 May 2017 15:38:55 +0200 Subject: [PATCH 1137/1164] Make identifier computed to better support task customization --- src/vs/vscode.d.ts | 12 ++++++------ src/vs/workbench/api/node/extHostTask.ts | 2 +- src/vs/workbench/api/node/extHostTypes.ts | 9 ++++----- src/vs/workbench/parts/tasks/browser/quickOpen.ts | 8 ++------ src/vs/workbench/parts/tasks/common/tasks.ts | 9 +++++++++ .../parts/tasks/electron-browser/jsonSchema_v2.ts | 12 +++++++++--- .../tasks/electron-browser/task.contribution.ts | 6 ++++-- 7 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 979822a1f4d..a2de9d4811a 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3626,10 +3626,10 @@ declare module 'vscode' { readonly name: string; /** - * The task's identifier. If omitted the name is - * used as an identifier. + * The task's identifier. If omitted the internal identifier will + * be `${extensionName}:${name}` */ - identifier: string; + identifier: string | undefined; /** * Whether the task is a background task or not. @@ -3759,10 +3759,10 @@ declare module 'vscode' { readonly name: string; /** - * The task's identifier. If omitted the name is - * used as an identifier. + * The task's identifier. If omitted the internal identifier will + * be `${extensionName}:${name}` */ - identifier: string; + identifier: string | undefined; /** * Whether the task is a background task or not. diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index 99f5368de6f..7508d947d45 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -316,7 +316,7 @@ namespace Tasks { detail: extension.id }, name: task.name, - identifier: task.identifier, + identifier: task.identifier ? task.identifier : `${extension.id}.${task.name}`, group: types.TaskGroup.is(task.group) ? task.group : undefined, command: command, isBackground: !!task.isBackground, diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index 87509da1649..2912a30ef42 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1030,7 +1030,6 @@ export class BaseTask { throw illegalArgument('name'); } this._name = name; - this._identifier = name; this._problemMatchers = problemMatchers || []; this._isBackground = false; this._terminal = Object.create(null); @@ -1041,11 +1040,11 @@ export class BaseTask { } set identifier(value: string) { - if (typeof value !== 'string') { - throw illegalArgument('identifier'); + if (value === void 0 || value === null) { + this._identifier = undefined; } - if (value.indexOf(':') !== -1) { - throw illegalArgument('identifier must not contain \':\''); + if (typeof value !== 'string' || value.length === 0) { + throw illegalArgument('identifier must be a string of length > 0'); } this._identifier = value; } diff --git a/src/vs/workbench/parts/tasks/browser/quickOpen.ts b/src/vs/workbench/parts/tasks/browser/quickOpen.ts index 15432e9c647..6f82d048270 100644 --- a/src/vs/workbench/parts/tasks/browser/quickOpen.ts +++ b/src/vs/workbench/parts/tasks/browser/quickOpen.ts @@ -13,7 +13,7 @@ import QuickOpen = require('vs/base/parts/quickopen/common/quickOpen'); import Model = require('vs/base/parts/quickopen/browser/quickOpenModel'); import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; -import { Task, TaskSourceKind } from 'vs/workbench/parts/tasks/common/tasks'; +import { Task, TaskSourceKind, computeLabel } from 'vs/workbench/parts/tasks/common/tasks'; import { ITaskService } from 'vs/workbench/parts/tasks/common/taskService'; import { ActionBarContributor, ContributableActionProvider } from 'vs/workbench/browser/actionBarRegistry'; @@ -23,11 +23,7 @@ export class TaskEntry extends Model.QuickOpenEntry { constructor(protected taskService: ITaskService, protected _task: Task, highlights: Model.IHighlight[] = []) { super(highlights); - if (_task._source.kind === TaskSourceKind.Extension) { - this._label = nls.localize('taskEntry.label', '{0}: {1}', _task._source.label, _task.name); - } else { - this._label = _task.name; - } + this._label = computeLabel(_task); } public getLabel(): string { diff --git a/src/vs/workbench/parts/tasks/common/tasks.ts b/src/vs/workbench/parts/tasks/common/tasks.ts index e7d54343b07..b798e6314e5 100644 --- a/src/vs/workbench/parts/tasks/common/tasks.ts +++ b/src/vs/workbench/parts/tasks/common/tasks.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; +import nls = require('vs/nls'); import * as Types from 'vs/base/common/types'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; @@ -248,4 +249,12 @@ export enum ExecutionEngine { export interface TaskSet { tasks: Task[]; extension?: IExtensionDescription; +} + +export function computeLabel(task: Task): string { + if (task._source.kind === TaskSourceKind.Extension) { + return nls.localize('taskEntry.label', '{0}: {1}', task._source.label, task.name); + } else { + return task.name; + } } \ No newline at end of file diff --git a/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts b/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts index b184d7ee3ff..e12e519fc02 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts @@ -67,20 +67,25 @@ const group: IJSONSchema = { type: 'string', enum: ['none', 'clean', 'build', 'rebuildAll', 'test'], default: 'none', - description: nls.localize('JsonSchema.tasks.group', 'Defines to which execution group this task belongs to. If omitted the task belongs to no group') + description: nls.localize('JsonSchema.tasks.group', 'Defines to which execution group this task belongs to. If omitted the task belongs to no group.') }; const taskType: IJSONSchema = { type: 'string', enum: ['shell', 'process'], default: 'process', - description: nls.localize('JsonSchema.tasks.type', 'Defines whether the task is run as a process or as a command inside a shell. Default is process') + description: nls.localize('JsonSchema.tasks.type', 'Defines whether the task is run as a process or as a command inside a shell. Default is process.') }; const version: IJSONSchema = { type: 'string', enum: ['2.0.0'], - description: nls.localize('JsonSchema.version', 'The config\'s version number') + description: nls.localize('JsonSchema.version', 'The config\'s version number.') +}; + +const identifier: IJSONSchema = { + type: 'string', + description: nls.localize('JsonSchema.tasks.identifier', 'A unique identifier of the task.') }; const schema: IJSONSchema = { @@ -123,6 +128,7 @@ definitions.showOutputType.deprecationMessage = nls.localize('JsonSchema.tasks.s definitions.taskDescription.properties.echoCommand.deprecationMessage = nls.localize('JsonSchema.tasks.echoCommand.deprecated', 'The property echoCommand is deprecated. Use the terminal property instead.'); definitions.taskDescription.properties.isBuildCommand.deprecationMessage = nls.localize('JsonSchema.tasks.isBuildCommand.deprecated', 'The property isBuildCommand is deprecated. Use the group property instead.'); definitions.taskDescription.properties.isTestCommand.deprecationMessage = nls.localize('JsonSchema.tasks.isTestCommand.deprecated', 'The property isTestCommand is deprecated. Use the group property instead.'); +definitions.taskDescription.properties.identifier = identifier; definitions.taskDescription.properties.type = Objects.deepClone(taskType); definitions.taskDescription.properties.terminal = terminal; definitions.taskDescription.properties.group = group; diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index d94812a35bb..411e04c6df5 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -71,7 +71,7 @@ import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions } from 'vs import { ITerminalService } from 'vs/workbench/parts/terminal/common/terminal'; import { ITaskSystem, ITaskResolver, ITaskSummary, ITaskExecuteResult, TaskExecuteKind, TaskError, TaskErrors, TaskSystemEvents } from 'vs/workbench/parts/tasks/common/taskSystem'; -import { Task, TaskSet, TaskGroup, ExecutionEngine, TaskSourceKind } from 'vs/workbench/parts/tasks/common/tasks'; +import { Task, TaskSet, TaskGroup, ExecutionEngine, TaskSourceKind, computeLabel as computeTaskLabel } from 'vs/workbench/parts/tasks/common/tasks'; import { ITaskService, TaskServiceEvents, ITaskProvider } from 'vs/workbench/parts/tasks/common/taskService'; import { templates as taskTemplates } from 'vs/workbench/parts/tasks/common/taskTemplates'; @@ -709,7 +709,7 @@ class TaskService extends EventEmitter implements ITaskService { return TPromise.as(undefined); } let fileConfig = configuration.config; - let customize = { taskName: task.name }; + let customize = { taskName: computeTaskLabel(task), identifier: task.identifier }; if (!fileConfig) { fileConfig = { version: '2.0.0', @@ -931,6 +931,7 @@ class TaskService extends EventEmitter implements ITaskService { let annotatingTask = annotatingTasks.byIdentifier[task.identifier] || annotatingTasks.byName[task.name]; if (annotatingTask) { TaskConfig.mergeTasks(task, annotatingTask); + task.name = annotatingTask.name; task._source.kind = TaskSourceKind.Workspace; continue; } @@ -940,6 +941,7 @@ class TaskService extends EventEmitter implements ITaskService { if (legacyAnnotatingTask) { TaskConfig.mergeTasks(task, legacyAnnotatingTask); task._source.kind = TaskSourceKind.Workspace; + task.name = legacyAnnotatingTask.name; workspaceTasksToDelete.push(legacyAnnotatingTask); continue; } From ccd3c1f94e64f7798ddf30d187274bd8905593fd Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 29 May 2017 15:50:50 +0200 Subject: [PATCH 1138/1164] [c++] grammar in endless loop. Fixes #23850 --- extensions/cpp/OSSREADME.json | 2 +- extensions/cpp/syntaxes/c.json | 22 ++-- .../cpp/test/colorize-fixtures/test-23630.cpp | 3 + .../test/colorize-results/test-23630_cpp.json | 123 ++++++++++++++++++ 4 files changed, 138 insertions(+), 12 deletions(-) create mode 100644 extensions/cpp/test/colorize-fixtures/test-23630.cpp create mode 100644 extensions/cpp/test/colorize-results/test-23630_cpp.json diff --git a/extensions/cpp/OSSREADME.json b/extensions/cpp/OSSREADME.json index 58859a1b776..5137487d2ed 100644 --- a/extensions/cpp/OSSREADME.json +++ b/extensions/cpp/OSSREADME.json @@ -2,7 +2,7 @@ [ { "name": "atom/language-c", - "version": "0.51.3", + "version": "0.0.0", "license": "MIT", "repositoryURL": "https://github.com/atom/language-c", "description": "The files syntaxes/c.json and syntaxes/c++.json were derived from the Atom package https://atom.io/packages/language-c which was originally converted from the C TextMate bundle https://github.com/textmate/c.tmbundle." diff --git a/extensions/cpp/syntaxes/c.json b/extensions/cpp/syntaxes/c.json index 022f588cf28..b83b31ad22e 100644 --- a/extensions/cpp/syntaxes/c.json +++ b/extensions/cpp/syntaxes/c.json @@ -778,7 +778,7 @@ }, "patterns": [ { - "begin": "\\G", + "begin": "\\G(?=.)", "end": "(?=//)|(?=/\\*(?!.*\\\\\\s*\\n))|(? Date: Mon, 29 May 2017 16:07:38 +0200 Subject: [PATCH 1139/1164] node-debug: add 'subtle' value to 'presentationhint' attribute --- src/vs/workbench/parts/debug/common/debugProtocol.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/debug/common/debugProtocol.d.ts b/src/vs/workbench/parts/debug/common/debugProtocol.d.ts index b6b16f7ad5b..a8ec4386a55 100644 --- a/src/vs/workbench/parts/debug/common/debugProtocol.d.ts +++ b/src/vs/workbench/parts/debug/common/debugProtocol.d.ts @@ -1123,8 +1123,8 @@ declare module DebugProtocol { endColumn?: number; /** The module associated with this frame, if any. */ moduleId?: number | string; - /** An optional hint for how to present this frame in the UI. A value of 'label' can be used to indicate that the frame is an artificial frame that is used as a visual label or separator. */ - presentationHint?: 'normal' | 'label'; + /** An optional hint for how to present this frame in the UI. A value of 'label' can be used to indicate that the frame is an artificial frame that is used as a visual label or separator. A value of 'subtle' can be used to change the appearance of a frame in a 'subtle' way. */ + presentationHint?: 'normal' | 'label' | 'subtle'; } /** A Scope is a named container for variables. Optionally a scope can map to a source or a range within a source. */ From 862088c2b1b0ba7ebfba1d71fc90f16bd7e94523 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 29 May 2017 16:12:40 +0200 Subject: [PATCH 1140/1164] do not use a special badge for update notification --- .../browser/parts/activitybar/activitybarActions.ts | 9 +-------- .../browser/parts/activitybar/media/activityaction.css | 10 ---------- .../workbench/parts/update/electron-browser/update.ts | 6 +++--- .../services/activity/common/activityBarService.ts | 2 -- 4 files changed, 4 insertions(+), 23 deletions(-) diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts index 7711afeab12..cc95a89bdd0 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts @@ -13,7 +13,7 @@ import { Builder, $ } from 'vs/base/browser/builder'; import { DelayedDragHandler } from 'vs/base/browser/dnd'; import { Action } from 'vs/base/common/actions'; import { BaseActionItem, Separator, IBaseActionItemOptions } from 'vs/base/browser/ui/actionbar/actionbar'; -import { IActivityBarService, DotBadge, ProgressBadge, TextBadge, NumberBadge, IconBadge, IBadge } from 'vs/workbench/services/activity/common/activityBarService'; +import { IActivityBarService, ProgressBadge, TextBadge, NumberBadge, IconBadge, IBadge } from 'vs/workbench/services/activity/common/activityBarService'; import Event, { Emitter } from 'vs/base/common/event'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { ICommandService } from 'vs/platform/commands/common/commands'; @@ -206,13 +206,6 @@ export class ActivityActionItem extends BaseActionItem { this.$badge.show(); } - // Dot - else if (badge instanceof DotBadge) { - this.$badge.addClass('dot-badge'); - this.$badge.title(badge.getDescription()); - this.$badge.show(); - } - // Progress else if (badge instanceof ProgressBadge) { this.$badge.show(); diff --git a/src/vs/workbench/browser/parts/activitybar/media/activityaction.css b/src/vs/workbench/browser/parts/activitybar/media/activityaction.css index 2cc5e0c94bc..f9bb260bdbe 100644 --- a/src/vs/workbench/browser/parts/activitybar/media/activityaction.css +++ b/src/vs/workbench/browser/parts/activitybar/media/activityaction.css @@ -67,16 +67,6 @@ text-align: center; } -.monaco-workbench > .activitybar > .content .monaco-action-bar .badge.dot-badge .badge-content { - box-sizing: border-box; - content: ''; - top: 9px; - width: 11px; - height: 11px; - min-width: inherit; - padding: 0; -} - /* Right aligned */ .monaco-workbench > .activitybar.right > .content .monaco-action-bar .action-label { diff --git a/src/vs/workbench/parts/update/electron-browser/update.ts b/src/vs/workbench/parts/update/electron-browser/update.ts index cfdf028a841..4b8eff773df 100644 --- a/src/vs/workbench/parts/update/electron-browser/update.ts +++ b/src/vs/workbench/parts/update/electron-browser/update.ts @@ -15,7 +15,7 @@ import pkg from 'vs/platform/node/package'; import product from 'vs/platform/node/product'; import URI from 'vs/base/common/uri'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IActivityBarService, DotBadge } from 'vs/workbench/services/activity/common/activityBarService'; +import { IActivityBarService, TextBadge } from 'vs/workbench/services/activity/common/activityBarService'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { ReleaseNotesInput } from 'vs/workbench/parts/update/electron-browser/releaseNotesInput'; import { IGlobalActivity } from 'vs/workbench/browser/activity'; @@ -280,7 +280,7 @@ export class UpdateContribution implements IWorkbenchContribution { export class LightUpdateContribution implements IGlobalActivity { get id() { return 'vs.update'; } - get name() { return 'VS Code'; } + get name() { return ''; } get cssClass() { return 'update-activity'; } constructor( @@ -293,7 +293,7 @@ export class LightUpdateContribution implements IGlobalActivity { @IActivityBarService activityBarService: IActivityBarService ) { this.updateService.onUpdateReady(() => { - const badge = new DotBadge(() => nls.localize('updateIsReady', "New update available.")); + const badge = new TextBadge('\u21e9', () => nls.localize('updateIsReady', "New update available.")); activityBarService.showGlobalActivity(this.id, badge); }); diff --git a/src/vs/workbench/services/activity/common/activityBarService.ts b/src/vs/workbench/services/activity/common/activityBarService.ts index a07ea58e26a..5c5b18a2105 100644 --- a/src/vs/workbench/services/activity/common/activityBarService.ts +++ b/src/vs/workbench/services/activity/common/activityBarService.ts @@ -24,8 +24,6 @@ export class BaseBadge implements IBadge { } } -export class DotBadge extends BaseBadge { } - export class NumberBadge extends BaseBadge { public number: number; From b0b5d17de1ad636aa943002f9ea6e064169b54b7 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 29 May 2017 16:39:35 +0200 Subject: [PATCH 1141/1164] debug: suport presentationHint = "subtle" fixes #25162 --- src/vs/workbench/parts/debug/browser/media/debugViewlet.css | 4 ++++ .../workbench/parts/debug/electron-browser/debugViewer.ts | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/debug/browser/media/debugViewlet.css b/src/vs/workbench/parts/debug/browser/media/debugViewlet.css index b0d6b4510a1..174bf9f39aa 100644 --- a/src/vs/workbench/parts/debug/browser/media/debugViewlet.css +++ b/src/vs/workbench/parts/debug/browser/media/debugViewlet.css @@ -207,6 +207,10 @@ font-style: italic; } +.debug-viewlet .debug-call-stack .stack-frame.subtle { + font-style: italic; +} + .debug-viewlet .debug-call-stack .stack-frame.label > .file { display: none; } diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts index 2c8391b709f..ea989342bbb 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViewer.ts @@ -537,8 +537,10 @@ export class CallStackRenderer implements IRenderer { } private renderStackFrame(stackFrame: debug.IStackFrame, data: IStackFrameTemplateData): void { - stackFrame.source.presenationHint === 'deemphasize' ? dom.addClass(data.stackFrame, 'disabled') : dom.removeClass(data.stackFrame, 'disabled'); - stackFrame.source.presenationHint === 'label' ? dom.addClass(data.stackFrame, 'label') : dom.removeClass(data.stackFrame, 'label'); + dom.toggleClass(data.stackFrame, 'disabled', stackFrame.source.presenationHint === 'deemphasize'); + dom.toggleClass(data.stackFrame, 'label', stackFrame.source.presenationHint === 'label'); + dom.toggleClass(data.stackFrame, 'subtle', stackFrame.source.presenationHint === 'subtle'); + data.file.title = stackFrame.source.raw.path || stackFrame.source.name; if (stackFrame.source.raw.origin) { data.file.title += `\n${stackFrame.source.raw.origin}`; From afa75ce314939793a14081e47ac7e8ca9b03cb78 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Mon, 29 May 2017 16:38:58 +0200 Subject: [PATCH 1142/1164] node-debug@1.13.7 (translations) --- build/gulpfile.vscode.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index cf894772b6a..e73e03c311d 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -42,7 +42,7 @@ const nodeModules = ['electron', 'original-fs'] // Build const builtInExtensions = [ - { name: 'ms-vscode.node-debug', version: '1.13.6' }, + { name: 'ms-vscode.node-debug', version: '1.13.7' }, { name: 'ms-vscode.node-debug2', version: '1.13.0' } ]; From 5b7b38d8a5ef6025dea1bc889f3719e5e9cd4ed1 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 29 May 2017 16:51:26 +0200 Subject: [PATCH 1143/1164] Have Ctrl+A go to line start on OSX (#19644) --- .../editor/common/controller/coreCommands.ts | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/vs/editor/common/controller/coreCommands.ts b/src/vs/editor/common/controller/coreCommands.ts index e0a3cd88f63..b6372c58eb8 100644 --- a/src/vs/editor/common/controller/coreCommands.ts +++ b/src/vs/editor/common/controller/coreCommands.ts @@ -815,10 +815,48 @@ export namespace CoreNavigationCommands { weight: CORE_WEIGHT, kbExpr: EditorContextKeys.textFocus, primary: KeyCode.Home, - mac: { primary: KeyCode.Home, secondary: [KeyMod.CtrlCmd | KeyCode.LeftArrow, KeyMod.WinCtrl | KeyCode.KEY_A] } + mac: { primary: KeyCode.Home, secondary: [KeyMod.CtrlCmd | KeyCode.LeftArrow] } } })); + export const CursorLineStart: CoreEditorCommand = registerEditorCommand(new class extends CoreEditorCommand { + constructor() { + super({ + id: 'cursorLineStart', + precondition: null, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textFocus, + primary: 0, + mac: { primary: KeyMod.WinCtrl | KeyCode.KEY_A } + } + }); + } + + public runCoreEditorCommand(cursors: ICursors, args: any): void { + cursors.context.model.pushStackElement(); + cursors.setStates( + args.source, + CursorChangeReason.Explicit, + CursorState.ensureInEditableRange( + cursors.context, + this._exec(cursors.context, cursors.getAll()) + ) + ); + cursors.reveal(true, RevealTarget.Primary); + } + + private _exec(context: CursorContext, cursors: CursorState[]): CursorState[] { + let result: CursorState[] = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + const lineNumber = cursor.modelState.position.lineNumber; + result[i] = CursorState.fromModelState(cursor.modelState.move(false, lineNumber, 1, 0)); + } + return result; + } + }); + export const CursorHomeSelect: CoreEditorCommand = registerEditorCommand(new HomeCommand({ inSelectionMode: true, id: 'cursorHomeSelect', From f43e78769ba24714a2007364d4b8d99dd34a4a85 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 29 May 2017 16:54:52 +0200 Subject: [PATCH 1144/1164] Have Ctrl+E go to line end on OSX --- .../editor/common/controller/coreCommands.ts | 65 +++++++++++++++---- 1 file changed, 52 insertions(+), 13 deletions(-) diff --git a/src/vs/editor/common/controller/coreCommands.ts b/src/vs/editor/common/controller/coreCommands.ts index b6372c58eb8..3794e7ace13 100644 --- a/src/vs/editor/common/controller/coreCommands.ts +++ b/src/vs/editor/common/controller/coreCommands.ts @@ -819,6 +819,18 @@ export namespace CoreNavigationCommands { } })); + export const CursorHomeSelect: CoreEditorCommand = registerEditorCommand(new HomeCommand({ + inSelectionMode: true, + id: 'cursorHomeSelect', + precondition: null, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textFocus, + primary: KeyMod.Shift | KeyCode.Home, + mac: { primary: KeyMod.Shift | KeyCode.Home, secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.LeftArrow] } + } + })); + export const CursorLineStart: CoreEditorCommand = registerEditorCommand(new class extends CoreEditorCommand { constructor() { super({ @@ -857,18 +869,6 @@ export namespace CoreNavigationCommands { } }); - export const CursorHomeSelect: CoreEditorCommand = registerEditorCommand(new HomeCommand({ - inSelectionMode: true, - id: 'cursorHomeSelect', - precondition: null, - kbOpts: { - weight: CORE_WEIGHT, - kbExpr: EditorContextKeys.textFocus, - primary: KeyMod.Shift | KeyCode.Home, - mac: { primary: KeyMod.Shift | KeyCode.Home, secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.LeftArrow] } - } - })); - class EndCommand extends CoreEditorCommand { private readonly _inSelectionMode: boolean; @@ -900,7 +900,7 @@ export namespace CoreNavigationCommands { weight: CORE_WEIGHT, kbExpr: EditorContextKeys.textFocus, primary: KeyCode.End, - mac: { primary: KeyCode.End, secondary: [KeyMod.CtrlCmd | KeyCode.RightArrow, KeyMod.WinCtrl | KeyCode.KEY_E] } + mac: { primary: KeyCode.End, secondary: [KeyMod.CtrlCmd | KeyCode.RightArrow] } } })); @@ -916,6 +916,45 @@ export namespace CoreNavigationCommands { } })); + export const CursorLineEnd: CoreEditorCommand = registerEditorCommand(new class extends CoreEditorCommand { + constructor() { + super({ + id: 'cursorLineEnd', + precondition: null, + kbOpts: { + weight: CORE_WEIGHT, + kbExpr: EditorContextKeys.textFocus, + primary: 0, + mac: { primary: KeyMod.WinCtrl | KeyCode.KEY_E } + } + }); + } + + public runCoreEditorCommand(cursors: ICursors, args: any): void { + cursors.context.model.pushStackElement(); + cursors.setStates( + args.source, + CursorChangeReason.Explicit, + CursorState.ensureInEditableRange( + cursors.context, + this._exec(cursors.context, cursors.getAll()) + ) + ); + cursors.reveal(true, RevealTarget.Primary); + } + + private _exec(context: CursorContext, cursors: CursorState[]): CursorState[] { + let result: CursorState[] = []; + for (let i = 0, len = cursors.length; i < len; i++) { + const cursor = cursors[i]; + const lineNumber = cursor.modelState.position.lineNumber; + const maxColumn = context.model.getLineMaxColumn(lineNumber); + result[i] = CursorState.fromModelState(cursor.modelState.move(false, lineNumber, maxColumn, 0)); + } + return result; + } + }); + class TopCommand extends CoreEditorCommand { private readonly _inSelectionMode: boolean; From 3214dd602484c208fad3148c86d5d4fd7394b357 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 29 May 2017 17:05:08 +0200 Subject: [PATCH 1145/1164] [css] update services --- extensions/css/server/npm-shrinkwrap.json | 4 ++-- extensions/css/server/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/extensions/css/server/npm-shrinkwrap.json b/extensions/css/server/npm-shrinkwrap.json index aebf5bf5121..13f55cd6b28 100644 --- a/extensions/css/server/npm-shrinkwrap.json +++ b/extensions/css/server/npm-shrinkwrap.json @@ -3,9 +3,9 @@ "version": "1.0.0", "dependencies": { "vscode-css-languageservice": { - "version": "2.0.3", + "version": "2.1.0", "from": "vscode-css-languageservice@next", - "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-2.0.3.tgz" + "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-2.1.0.tgz" }, "vscode-jsonrpc": { "version": "3.2.0", diff --git a/extensions/css/server/package.json b/extensions/css/server/package.json index 9e4322d03fe..ba141abd6cd 100644 --- a/extensions/css/server/package.json +++ b/extensions/css/server/package.json @@ -8,7 +8,7 @@ "node": "*" }, "dependencies": { - "vscode-css-languageservice": "^2.0.3", + "vscode-css-languageservice": "^2.1.0", "vscode-languageserver": "^3.2.0" }, "devDependencies": { From 41e7b3f9ac73f2a15195fd6679ecd2324a5e361f Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Mon, 29 May 2017 17:05:18 +0200 Subject: [PATCH 1146/1164] [html] update services --- extensions/html/server/npm-shrinkwrap.json | 15 +++++++++++---- extensions/html/server/package.json | 4 ++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/extensions/html/server/npm-shrinkwrap.json b/extensions/html/server/npm-shrinkwrap.json index 82254c66b11..ee83f51e71e 100644 --- a/extensions/html/server/npm-shrinkwrap.json +++ b/extensions/html/server/npm-shrinkwrap.json @@ -3,14 +3,21 @@ "version": "1.0.0", "dependencies": { "vscode-css-languageservice": { - "version": "2.0.2", + "version": "2.1.0", "from": "vscode-css-languageservice@next", - "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-2.0.2.tgz" + "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-2.1.0.tgz", + "dependencies": { + "vscode-languageserver-types": { + "version": "3.2.0", + "from": "vscode-languageserver-types@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.2.0.tgz" + } + } }, "vscode-html-languageservice": { - "version": "2.0.4", + "version": "2.0.5", "from": "vscode-html-languageservice@next", - "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-2.0.4.tgz" + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-2.0.5.tgz" }, "vscode-jsonrpc": { "version": "3.1.0-alpha.1", diff --git a/extensions/html/server/package.json b/extensions/html/server/package.json index a80e9b214ba..5284d547143 100644 --- a/extensions/html/server/package.json +++ b/extensions/html/server/package.json @@ -8,8 +8,8 @@ "node": "*" }, "dependencies": { - "vscode-css-languageservice": "^2.0.2", - "vscode-html-languageservice": "^2.0.4", + "vscode-css-languageservice": "^2.1.0", + "vscode-html-languageservice": "^2.0.5", "vscode-languageserver": "^3.1.0-alpha.1", "vscode-nls": "^2.0.2", "vscode-uri": "^1.0.0" From 64d9133505b6fa46df8f8292e1dbedb811a59e6b Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 29 May 2017 16:49:19 +0200 Subject: [PATCH 1147/1164] Dispose tree view listeners --- src/vs/workbench/parts/views/browser/treeView.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/views/browser/treeView.ts b/src/vs/workbench/parts/views/browser/treeView.ts index c3f34825494..957f7a6f9b2 100644 --- a/src/vs/workbench/parts/views/browser/treeView.ts +++ b/src/vs/workbench/parts/views/browser/treeView.ts @@ -39,6 +39,7 @@ export class TreeView extends CollapsibleViewletView { private activated: boolean = false; private treeInputPromise: TPromise; + private dataProviderRegisteredListener: IDisposable; private dataProviderElementChangeListener: IDisposable; private disposables: IDisposable[] = []; @@ -136,11 +137,11 @@ export class TreeView extends CollapsibleViewletView { return this.treeInputPromise; } this.treeInputPromise = new TPromise((c, e) => { - const disposable = ViewsRegistry.onTreeViewDataProviderRegistered(id => { + this.dataProviderRegisteredListener = ViewsRegistry.onTreeViewDataProviderRegistered(id => { if (this.id === id) { if (this.listenToDataProvider()) { this.tree.setInput(new Root()).then(() => c(null)); - disposable.dispose(); + this.dataProviderRegisteredListener.dispose(); } } }); @@ -183,6 +184,13 @@ export class TreeView extends CollapsibleViewletView { } dispose(): void { + if (this.dataProviderRegisteredListener) { + this.dataProviderRegisteredListener.dispose(); + } + dispose(this.disposables); + if (this.dataProviderElementChangeListener) { + this.dataProviderElementChangeListener.dispose(); + } dispose(this.disposables); super.dispose(); } From 16255827d87054f34bf6674dbd3a54f9dfe35a01 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 29 May 2017 17:03:19 +0200 Subject: [PATCH 1148/1164] Explorer viewlet - Dispose listeners - Expand the view if it is only view - Check sash index before disposing --- src/vs/base/browser/ui/splitview/splitview.ts | 6 +- src/vs/workbench/browser/viewlet.ts | 2 + .../parts/files/browser/explorerViewlet.ts | 105 ++++++++++-------- 3 files changed, 63 insertions(+), 50 deletions(-) diff --git a/src/vs/base/browser/ui/splitview/splitview.ts b/src/vs/base/browser/ui/splitview/splitview.ts index 47ae7bc96eb..a328f784bdc 100644 --- a/src/vs/base/browser/ui/splitview/splitview.ts +++ b/src/vs/base/browser/ui/splitview/splitview.ts @@ -611,8 +611,10 @@ export class SplitView implements this.onViewChange(deadView, 0); let sashIndex = Math.max(index - 1, 0); - this.sashes[sashIndex].dispose(); - this.sashes.splice(sashIndex, 1); + if (sashIndex < this.sashes.length) { + this.sashes[sashIndex].dispose(); + this.sashes.splice(sashIndex, 1); + } this.viewChangeListeners[index].dispose(); this.viewChangeListeners.splice(index, 1); diff --git a/src/vs/workbench/browser/viewlet.ts b/src/vs/workbench/browser/viewlet.ts index 56c11d7b11a..0403d96aa35 100644 --- a/src/vs/workbench/browser/viewlet.ts +++ b/src/vs/workbench/browser/viewlet.ts @@ -301,6 +301,8 @@ export interface IViewletView extends IView, IThemable { shutdown(): void; focusBody(): void; isExpanded(): boolean; + expand(): void; + collapse(): void; } /** diff --git a/src/vs/workbench/parts/files/browser/explorerViewlet.ts b/src/vs/workbench/parts/files/browser/explorerViewlet.ts index f0def3cae94..9160ec7459b 100644 --- a/src/vs/workbench/parts/files/browser/explorerViewlet.ts +++ b/src/vs/workbench/parts/files/browser/explorerViewlet.ts @@ -6,7 +6,7 @@ 'use strict'; import 'vs/css!./media/explorerviewlet'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IAction, IActionRunner } from 'vs/base/common/actions'; import { TPromise } from 'vs/base/common/winjs.base'; import { Dimension, Builder } from 'vs/base/browser/builder'; @@ -61,6 +61,7 @@ export class ExplorerViewlet extends Viewlet { private dimension: Dimension; private viewletVisibleContextKey: IContextKey; + private disposables: IDisposable[] = []; constructor( @ITelemetryService telemetryService: ITelemetryService, @@ -71,7 +72,7 @@ export class ExplorerViewlet extends Viewlet { @IConfigurationService private configurationService: IConfigurationService, @IInstantiationService private instantiationService: IInstantiationService, @IContextKeyService contextKeyService: IContextKeyService, - @IThemeService themeService: IThemeService, + @IThemeService themeService: IThemeService ) { super(VIEWLET_ID, telemetryService, themeService); @@ -81,8 +82,9 @@ export class ExplorerViewlet extends Viewlet { this.viewletVisibleContextKey = ExplorerViewletVisibleContext.bindTo(contextKeyService); this.viewletSettings = this.getMemento(storageService, Scope.WORKSPACE); - this.configurationService.onDidUpdateConfiguration(e => this.onConfigurationUpdated(e.config)); - ViewsRegistry.onViewsRegistered(viewDescriptors => this.addViews(viewDescriptors.filter(viewDescriptor => ViewLocation.Explorer === viewDescriptor.location))); + + this.configurationService.onDidUpdateConfiguration(e => this.onConfigurationUpdated(e.config), this, this.disposables); + ViewsRegistry.onViewsRegistered(viewDescriptors => this.addCustomViews(viewDescriptors.filter(viewDescriptor => ViewLocation.Explorer === viewDescriptor.location), true), this, this.disposables); } public create(parent: Builder): TPromise { @@ -134,11 +136,7 @@ export class ExplorerViewlet extends Viewlet { // custom views for (const view of customViews) { - this.views.push(this.instantiationService.createInstance(view.ctor, view.id, { - name: view.name, - actionRunner: this.getActionRunner(), - collapsed: viewsState[view.id] ? (viewsState[view.id]).collapsed : true - })); + this.addCustomView(view, viewsState[view.id], -1); } for (let i = 0; i < this.views.length; i++) { @@ -150,16 +148,7 @@ export class ExplorerViewlet extends Viewlet { this.lastFocusedView = this.explorerView; return TPromise.join(this.views.map(view => view.create())).then(() => void 0).then(() => { - if (this.views.length === 1) { - this.views[0].hideHeader(); - - } - if (this.dimension) { - this.layout(this.dimension); - } - - // Update title area since the title actions have changed. - this.updateTitleArea(); + this.onViewsUpdated(); return this.setVisible(this.isVisible()).then(() => this.focus()); // Focus the viewlet since that triggers a rerender. }); } @@ -188,49 +177,63 @@ export class ExplorerViewlet extends Viewlet { this.splitView.removeView(this.openEditorsView); this.openEditorsView.dispose(); this.openEditorsView = null; - - if (this.views.length === 1) { - this.views[0].hideHeader(); - } - if (this.dimension) { - this.layout(this.dimension); - } - // Update title area since the title actions have changed. - this.updateTitleArea(); + this.onViewsUpdated(); } } - private addViews(viewDescriptors: IViewDescriptor[]): void { + private addCustomViews(viewDescriptors: IViewDescriptor[], end: boolean): void { if (!this.splitView || !viewDescriptors.length) { return; } const views = []; + const registered = ViewsRegistry.getViews(ViewLocation.Explorer); const viewsState = JSON.parse(this.storageService.get(ExplorerViewlet.EXPLORER_VIEWS_STATE, this.contextService.hasWorkspace() ? StorageScope.WORKSPACE : StorageScope.GLOBAL, '{}')); for (const viewDescriptor of viewDescriptors) { - const view = this.instantiationService.createInstance(viewDescriptor.ctor, viewDescriptor.id, { - name: viewDescriptor.name, - actionRunner: this.getActionRunner(), - collapsed: viewsState[viewDescriptor.id] ? (viewsState[viewDescriptor.id]).collapsed : true - }); + let index = end ? -1 : this.openEditorsView ? registered.indexOf(viewDescriptor) + 2 : registered.indexOf(viewDescriptor) + 1; + const view = this.addCustomView(viewDescriptor, viewsState[viewDescriptor.id], index); views.push(view); - this.views.push(view); attachHeaderViewStyler(view, this.themeService); - this.splitView.addView(view, viewsState[view.id] ? (viewsState[view.id]).size : void 0); + this.splitView.addView(view, viewsState[view.id] ? (viewsState[view.id]).size : void 0, end ? void 0 : index); } TPromise.join(views.map(view => view.create())).then(() => void 0).then(() => { - this.views[0].showHeader(); - - if (this.dimension) { - this.layout(this.dimension); - } - - // Update title area since the title actions have changed. - this.updateTitleArea(); + this.onViewsUpdated(); }); } + private addCustomView(viewDescriptor: IViewDescriptor, viewState: IViewState, index: number): IViewletView { + const view = this.instantiationService.createInstance(viewDescriptor.ctor, viewDescriptor.id, { + name: viewDescriptor.name, + actionRunner: this.getActionRunner(), + collapsed: viewState ? viewState.collapsed : true + }); + if (index !== -1) { + this.views.splice(index, 0, view); + } else { + this.views.push(view); + } + return view; + } + + private onViewsUpdated(): void { + if (this.views.length > 1) { + this.views[0].showHeader(); + } else { + this.views[0].hideHeader(); + if (!this.views[0].isExpanded()) { + this.views[0].expand(); + } + } + + if (this.dimension) { + this.layout(this.dimension); + } + + // Update title area since the title actions have changed. + this.updateTitleArea(); + } + private onConfigurationUpdated(config: IFilesConfiguration): void { // Open editors view should always be visible in no folder workspace. const openEditorsVisible = !this.contextService.hasWorkspace() || config.explorer.openEditors.visible !== 0; @@ -395,15 +398,17 @@ export class ExplorerViewlet extends Viewlet { } public shutdown(): void { + this.saveViewsState(); + this.views.forEach((view) => view.shutdown()); + super.shutdown(); + } + + private saveViewsState(): void { const viewletState = this.views.reduce((result, view) => { result[view.id] = this.getViewState(view); return result; }, {}); this.storageService.store(ExplorerViewlet.EXPLORER_VIEWS_STATE, JSON.stringify(viewletState), this.contextService.hasWorkspace() ? StorageScope.WORKSPACE : StorageScope.GLOBAL); - - this.views.forEach((view) => view.shutdown()); - - super.shutdown(); } private getViewState(view: IViewletView): IViewState { @@ -439,5 +444,9 @@ export class ExplorerViewlet extends Viewlet { this.focusListener.dispose(); this.focusListener = null; } + + this.disposables = dispose(this.disposables); + + super.dispose(); } } \ No newline at end of file From 43786fc1f763232fd81f5a2797fa55aacebd2809 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 29 May 2017 17:23:34 +0200 Subject: [PATCH 1149/1164] global settings - enable when running "out of dev" and show keybindings --- .../browser/parts/activitybar/activitybarActions.ts | 2 -- .../browser/parts/activitybar/activitybarPart.ts | 10 ++++++---- src/vs/workbench/electron-browser/window.ts | 3 +-- .../parts/files/browser/views/explorerViewer.ts | 7 ++----- .../parts/files/browser/views/openEditorsViewer.ts | 4 +--- .../parts/markers/browser/markersTreeController.ts | 11 +---------- .../parts/preferences/browser/keybindingsEditor.ts | 3 +-- .../parts/terminal/electron-browser/terminalPanel.ts | 5 +---- .../update/electron-browser/update.contribution.ts | 2 +- .../workbench/parts/update/electron-browser/update.ts | 10 +++++++--- src/vs/workbench/parts/views/browser/treeView.ts | 11 +---------- .../electron-browser/contextmenuService.ts | 2 +- 12 files changed, 23 insertions(+), 47 deletions(-) diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts index cc95a89bdd0..287ad54470d 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts @@ -504,7 +504,6 @@ export class ViewletOverflowActivityActionItem extends ActivityActionItem { private getBadge: (viewlet: ViewletDescriptor) => IBadge, @IInstantiationService private instantiationService: IInstantiationService, @IViewletService private viewletService: IViewletService, - @IKeybindingService private keybindingService: IKeybindingService, @IContextMenuService private contextMenuService: IContextMenuService, @IThemeService themeService: IThemeService ) { @@ -548,7 +547,6 @@ export class ViewletOverflowActivityActionItem extends ActivityActionItem { this.contextMenuService.showContextMenu({ getAnchor: () => this.builder.getHTMLElement(), getActions: () => TPromise.as(this.actions), - getKeyBinding: (action) => this.keybindingService.lookupKeybinding(action.id), onHide: () => dispose(this.actions) }); } diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 4085747c900..4e773ecab38 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -83,12 +83,13 @@ export class ActivitybarPart extends Part implements IActivityBarService { private dimension: Dimension; + private globalActionBar: ActionBar; + private globalActivityIdToActions: { [globalActivityId: string]: GlobalActivityAction; }; + private viewletSwitcherBar: ActionBar; - private activityActionBar: ActionBar; private viewletOverflowAction: ViewletOverflowActivityAction; private viewletOverflowActionItem: ViewletOverflowActivityActionItem; - private globalActivityIdToActions: { [globalActivityId: string]: GlobalActivityAction; }; private viewletIdToActions: { [viewletId: string]: ActivityAction; }; private viewletIdToActionItems: { [viewletId: string]: IActionItem; }; private viewletIdToActivityStack: { [viewletId: string]: IViewletActivity[]; }; @@ -110,6 +111,7 @@ export class ActivitybarPart extends Part implements IActivityBarService { super(id, { hasTitle: false }, themeService); this.globalActivityIdToActions = Object.create(null); + this.viewletIdToActionItems = Object.create(null); this.viewletIdToActions = Object.create(null); this.viewletIdToActivityStack = Object.create(null); @@ -316,7 +318,7 @@ export class ActivitybarPart extends Part implements IActivityBarService { .map(d => this.instantiationService.createInstance(d)) .map(a => new GlobalActivityAction(a)); - this.activityActionBar = new ActionBar(container, { + this.globalActionBar = new ActionBar(container, { actionItemProvider: a => this.instantiationService.createInstance(GlobalActivityActionItem, a), orientation: ActionsOrientation.VERTICAL, ariaLabel: nls.localize('globalActions', "Global Actions"), @@ -325,7 +327,7 @@ export class ActivitybarPart extends Part implements IActivityBarService { actions.forEach(a => { this.globalActivityIdToActions[a.id] = a; - this.activityActionBar.push(a); + this.globalActionBar.push(a); }); } diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index be59101349e..e0eb6f23dfe 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -338,8 +338,7 @@ export class ElectronWindow extends Themable { this.contextMenuService.showContextMenu({ getAnchor: () => target, - getActions: () => TPromise.as(TextInputActions), - getKeyBinding: action => this.keybindingService.lookupKeybinding(action.id) + getActions: () => TPromise.as(TextInputActions) }); } } diff --git a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts index 4494835dff8..ec485a2d391 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts @@ -33,7 +33,6 @@ import { DesktopDragAndDropData, ExternalElementsDragAndDropData } from 'vs/base import { ClickBehavior, DefaultController } from 'vs/base/parts/tree/browser/treeDefaults'; import { FileStat, NewStatPlaceholder } from 'vs/workbench/parts/files/common/explorerViewModel'; import { DragMouseEvent, IMouseEvent } from 'vs/base/browser/mouseEvent'; -import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; @@ -44,7 +43,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IMessageService, IConfirmation, Severity } from 'vs/platform/message/common/message'; import { IProgressService } from 'vs/platform/progress/common/progress'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { ResolvedKeybinding, KeyCode } from 'vs/base/common/keyCodes'; +import { KeyCode } from 'vs/base/common/keyCodes'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { IMenuService, IMenu, MenuId } from 'vs/platform/actions/common/actions'; import { fillInActions } from 'vs/platform/actions/browser/menuItemActionItem'; @@ -396,8 +395,7 @@ export class FileController extends DefaultController { @ITelemetryService private telemetryService: ITelemetryService, @IWorkspaceContextService private contextService: IWorkspaceContextService, @IMenuService menuService: IMenuService, - @IContextKeyService contextKeyService: IContextKeyService, - @IKeybindingService private keybindingService: IKeybindingService + @IContextKeyService contextKeyService: IContextKeyService ) { super({ clickBehavior: ClickBehavior.ON_MOUSE_UP /* do not change to not break DND */, keyboardSupport: false /* handled via IListService */ }); @@ -495,7 +493,6 @@ export class FileController extends DefaultController { }); }, getActionItem: this.state.actionProvider.getActionItem.bind(this.state.actionProvider, tree, stat), - getKeyBinding: (a): ResolvedKeybinding => this.keybindingService.lookupKeybinding(a.id), getActionsContext: (event) => { return { viewletState: this.state, diff --git a/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts b/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts index e662f47ce91..0985b01da56 100644 --- a/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts @@ -170,8 +170,7 @@ export class Controller extends DefaultController { @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IEditorGroupService private editorGroupService: IEditorGroupService, @IContextMenuService private contextMenuService: IContextMenuService, - @ITelemetryService private telemetryService: ITelemetryService, - @IKeybindingService private keybindingService: IKeybindingService + @ITelemetryService private telemetryService: ITelemetryService ) { super({ clickBehavior: ClickBehavior.ON_MOUSE_DOWN, keyboardSupport: false }); } @@ -261,7 +260,6 @@ export class Controller extends DefaultController { this.contextMenuService.showContextMenu({ getAnchor: () => anchor, getActions: () => this.actionProvider.getSecondaryActions(tree, element), - getKeyBinding: (action) => this.keybindingService.lookupKeybinding(action.id), onHide: (wasCancelled?: boolean) => { if (wasCancelled) { tree.DOMFocus(); diff --git a/src/vs/workbench/parts/markers/browser/markersTreeController.ts b/src/vs/workbench/parts/markers/browser/markersTreeController.ts index 0177d325920..9b420131e3c 100644 --- a/src/vs/workbench/parts/markers/browser/markersTreeController.ts +++ b/src/vs/workbench/parts/markers/browser/markersTreeController.ts @@ -13,7 +13,6 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IMenuService, IMenu, MenuId } from 'vs/platform/actions/common/actions'; import { IAction } from 'vs/base/common/actions'; -import { ResolvedKeybinding } from 'vs/base/common/keyCodes'; import { ActionItem, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; @@ -61,17 +60,13 @@ export class Controller extends treedefaults.DefaultController { }, getActionItem: (action) => { - const keybinding = this._keybindingFor(action); + const keybinding = this._keybindingService.lookupKeybinding(action.id); if (keybinding) { return new ActionItem(action, action, { label: true, keybinding: keybinding.getLabel() }); } return null; }, - getKeyBinding: (action): ResolvedKeybinding => { - return this._keybindingFor(action); - }, - onHide: (wasCancelled?: boolean) => { if (wasCancelled) { tree.DOMFocus(); @@ -94,8 +89,4 @@ export class Controller extends treedefaults.DefaultController { result.pop(); // remove last separator return result; } - - private _keybindingFor(action: IAction): ResolvedKeybinding { - return this._keybindingService.lookupKeybinding(action.id); - } } diff --git a/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts index 16fedab3623..f0aa2694035 100644 --- a/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts @@ -444,8 +444,7 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor this.createRemoveAction(e.element), this.createResetAction(e.element), new Separator(), - this.createShowConflictsAction(e.element)]), - getKeyBinding: (action) => this.keybindingsService.lookupKeybinding(action.id) + this.createShowConflictsAction(e.element)]) }); } } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index 4b5a29f34c4..78364b99abf 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -12,7 +12,6 @@ import { IActionItem, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ITerminalService, ITerminalFont, TERMINAL_PANEL_ID } from 'vs/workbench/parts/terminal/common/terminal'; import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; @@ -40,7 +39,6 @@ export class TerminalPanel extends Panel { @IConfigurationService private _configurationService: IConfigurationService, @IContextMenuService private _contextMenuService: IContextMenuService, @IInstantiationService private _instantiationService: IInstantiationService, - @IKeybindingService private _keybindingService: IKeybindingService, @ITerminalService private _terminalService: ITerminalService, @IThemeService protected themeService: IThemeService, @ITelemetryService telemetryService: ITelemetryService @@ -190,8 +188,7 @@ export class TerminalPanel extends Panel { this._contextMenuService.showContextMenu({ getAnchor: () => anchor, getActions: () => TPromise.as(this._getContextMenuActions()), - getActionsContext: () => this._parentDomElement, - getKeyBinding: (action) => this._keybindingService.lookupKeybinding(action.id) + getActionsContext: () => this._parentDomElement }); } this._cancelContextMenu = false; diff --git a/src/vs/workbench/parts/update/electron-browser/update.contribution.ts b/src/vs/workbench/parts/update/electron-browser/update.contribution.ts index 26cc50dfe8e..64bba795487 100644 --- a/src/vs/workbench/parts/update/electron-browser/update.contribution.ts +++ b/src/vs/workbench/parts/update/electron-browser/update.contribution.ts @@ -24,7 +24,7 @@ import { ShowCurrentReleaseNotesAction, ProductContribution, UpdateContribution, Registry.as(WorkbenchExtensions.Workbench) .registerWorkbenchContribution(ProductContribution); -if (product.quality === 'insider') { +if (product.quality !== 'stable') { Registry.as(GlobalActivityExtensions) .registerActivity(LightUpdateContribution); } else { diff --git a/src/vs/workbench/parts/update/electron-browser/update.ts b/src/vs/workbench/parts/update/electron-browser/update.ts index 4b8eff773df..c68899b0830 100644 --- a/src/vs/workbench/parts/update/electron-browser/update.ts +++ b/src/vs/workbench/parts/update/electron-browser/update.ts @@ -279,6 +279,10 @@ export class UpdateContribution implements IWorkbenchContribution { export class LightUpdateContribution implements IGlobalActivity { + private static readonly showCommandsId = 'workbench.action.showCommands'; + private static readonly openSettingsId = 'workbench.action.openGlobalSettings'; + private static readonly openKeybindingsId = 'workbench.action.openGlobalKeybindings'; + get id() { return 'vs.update'; } get name() { return ''; } get cssClass() { return 'update-activity'; } @@ -302,10 +306,10 @@ export class LightUpdateContribution implements IGlobalActivity { getActions(): IAction[] { return [ - new Action('showCommandPalette', nls.localize('commandPalette', "Command Palette..."), undefined, true, () => this.commandService.executeCommand('workbench.action.showCommands')), + new Action(LightUpdateContribution.showCommandsId, nls.localize('commandPalette', "Command Palette..."), undefined, true, () => this.commandService.executeCommand(LightUpdateContribution.showCommandsId)), new Separator(), - new Action('openKeybindings', nls.localize('settings', "Settings"), null, true, () => this.commandService.executeCommand('workbench.action.openGlobalSettings')), - new Action('openSettings', nls.localize('keyboardShortcuts', "Keyboard Shortcuts"), null, true, () => this.commandService.executeCommand('workbench.action.openGlobalKeybindings')), + new Action(LightUpdateContribution.openSettingsId, nls.localize('settings', "Settings"), null, true, () => this.commandService.executeCommand(LightUpdateContribution.openSettingsId)), + new Action(LightUpdateContribution.openKeybindingsId, nls.localize('keyboardShortcuts', "Keyboard Shortcuts"), null, true, () => this.commandService.executeCommand(LightUpdateContribution.openKeybindingsId)), new Separator(), this.getUpdateAction() ]; diff --git a/src/vs/workbench/parts/views/browser/treeView.ts b/src/vs/workbench/parts/views/browser/treeView.ts index 957f7a6f9b2..cc6c4c38b4e 100644 --- a/src/vs/workbench/parts/views/browser/treeView.ts +++ b/src/vs/workbench/parts/views/browser/treeView.ts @@ -25,7 +25,6 @@ import { createActionItem, fillInActions } from 'vs/platform/actions/browser/men import { IProgressService } from 'vs/platform/progress/common/progress'; import { ITree, IDataSource, IRenderer, ContextMenuEvent } from 'vs/base/parts/tree/browser/tree'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { ResolvedKeybinding } from 'vs/base/common/keyCodes'; import { ActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { ViewsRegistry, ITreeViewDataProvider, IViewOptions, ITreeItem, TreeItemCollapsibleState } from 'vs/workbench/parts/views/browser/views'; import { IExtensionService } from 'vs/platform/extensions/common/extensions'; @@ -326,17 +325,13 @@ class TreeController extends DefaultController { }, getActionItem: (action) => { - const keybinding = this._keybindingFor(action); + const keybinding = this._keybindingService.lookupKeybinding(action.id); if (keybinding) { return new ActionItem(action, action, { label: true, keybinding: keybinding.getLabel() }); } return null; }, - getKeyBinding: (action): ResolvedKeybinding => { - return this._keybindingFor(action); - }, - onHide: (wasCancelled?: boolean) => { if (wasCancelled) { tree.DOMFocus(); @@ -350,10 +345,6 @@ class TreeController extends DefaultController { return true; } - - private _keybindingFor(action: IAction): ResolvedKeybinding { - return this._keybindingService.lookupKeybinding(action.id); - } } class MultipleSelectionActionRunner extends ActionRunner { diff --git a/src/vs/workbench/services/contextview/electron-browser/contextmenuService.ts b/src/vs/workbench/services/contextview/electron-browser/contextmenuService.ts index 0815aae6e33..50e56ffac45 100644 --- a/src/vs/workbench/services/contextview/electron-browser/contextmenuService.ts +++ b/src/vs/workbench/services/contextview/electron-browser/contextmenuService.ts @@ -87,7 +87,7 @@ export class ContextMenuService implements IContextMenuService { } }; - const keybinding = !!delegate.getKeyBinding ? delegate.getKeyBinding(e) : undefined; + const keybinding = !!delegate.getKeyBinding ? delegate.getKeyBinding(e) : this.keybindingService.lookupKeybinding(e.id); if (keybinding) { const electronAccelerator = keybinding.getElectronAccelerator(); if (electronAccelerator) { From a336df99e34f266920f5f4cc677fde810f6b5003 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 29 May 2017 17:24:43 +0200 Subject: [PATCH 1150/1164] Shutdown glob pattern searching process after 1s of idle time --- src/vs/workbench/node/extensionHostMain.ts | 3 ++- src/vs/workbench/services/search/node/searchService.ts | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/node/extensionHostMain.ts b/src/vs/workbench/node/extensionHostMain.ts index ae3bd6cb18b..fd41b0c29fe 100644 --- a/src/vs/workbench/node/extensionHostMain.ts +++ b/src/vs/workbench/node/extensionHostMain.ts @@ -130,7 +130,8 @@ export class ExtensionHostMain { // `workspaceGlob` or something along those lines? if (p.indexOf('*') > -1 || p.indexOf('?') > -1) { if (!this._diskSearch) { - this._diskSearch = new DiskSearch(false); + // Shut down this search process after 1s + this._diskSearch = new DiskSearch(false, 1000); } const query: ISearchQuery = { diff --git a/src/vs/workbench/services/search/node/searchService.ts b/src/vs/workbench/services/search/node/searchService.ts index b1317d6b7cc..1c2d62c29d1 100644 --- a/src/vs/workbench/services/search/node/searchService.ts +++ b/src/vs/workbench/services/search/node/searchService.ts @@ -200,12 +200,12 @@ export class DiskSearch { private raw: IRawSearchService; - constructor(verboseLogging: boolean) { + constructor(verboseLogging: boolean, timeout: number = 60 * 60 * 1000) { const client = new Client( uri.parse(require.toUrl('bootstrap')).fsPath, { serverName: 'Search', - timeout: 60 * 60 * 1000, + timeout: timeout, args: ['--type=searchService'], env: { AMD_ENTRYPOINT: 'vs/workbench/services/search/node/searchApp', From 1fc69c89e7a31f0c6fcdf58c2c4a36c9b391fee4 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 29 May 2017 17:54:39 +0200 Subject: [PATCH 1151/1164] actionBarRegistry.ts => actions.ts --- src/vs/workbench/browser/{actionBarRegistry.ts => actions.ts} | 0 src/vs/workbench/browser/parts/compositePart.ts | 2 +- src/vs/workbench/browser/parts/editor/editor.contribution.ts | 2 +- src/vs/workbench/browser/parts/editor/titleControl.ts | 2 +- src/vs/workbench/browser/parts/panel/panelPart.ts | 2 +- src/vs/workbench/browser/parts/quickopen/quickOpenController.ts | 2 +- src/vs/workbench/browser/parts/sidebar/sidebarPart.ts | 2 +- src/vs/workbench/browser/viewlet.ts | 2 +- src/vs/workbench/electron-browser/workbench.ts | 2 +- src/vs/workbench/parts/debug/electron-browser/debugViews.ts | 2 +- .../parts/execution/electron-browser/terminal.contribution.ts | 2 +- .../workbench/parts/files/browser/fileActions.contribution.ts | 2 +- src/vs/workbench/parts/files/browser/views/explorerView.ts | 2 +- src/vs/workbench/parts/files/browser/views/explorerViewer.ts | 2 +- src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts | 2 +- src/vs/workbench/parts/markers/browser/markersPanel.ts | 2 +- src/vs/workbench/parts/search/browser/search.contribution.ts | 2 +- src/vs/workbench/parts/tasks/browser/quickOpen.ts | 2 +- .../workbench/parts/tasks/electron-browser/task.contribution.ts | 2 +- src/vs/workbench/test/browser/actionRegistry.test.ts | 2 +- 20 files changed, 19 insertions(+), 19 deletions(-) rename src/vs/workbench/browser/{actionBarRegistry.ts => actions.ts} (100%) diff --git a/src/vs/workbench/browser/actionBarRegistry.ts b/src/vs/workbench/browser/actions.ts similarity index 100% rename from src/vs/workbench/browser/actionBarRegistry.ts rename to src/vs/workbench/browser/actions.ts diff --git a/src/vs/workbench/browser/parts/compositePart.ts b/src/vs/workbench/browser/parts/compositePart.ts index 5c23e84ef0f..dea7bce19b3 100644 --- a/src/vs/workbench/browser/parts/compositePart.ts +++ b/src/vs/workbench/browser/parts/compositePart.ts @@ -20,7 +20,7 @@ import errors = require('vs/base/common/errors'); import { CONTEXT as ToolBarContext, ToolBar } from 'vs/base/browser/ui/toolbar/toolbar'; import { IActionItem, ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar'; import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; -import { IActionBarRegistry, Extensions, prepareActions } from 'vs/workbench/browser/actionBarRegistry'; +import { IActionBarRegistry, Extensions, prepareActions } from 'vs/workbench/browser/actions'; import { Action, IAction } from 'vs/base/common/actions'; import { Part, IPartOptions } from 'vs/workbench/browser/part'; import { Composite, CompositeRegistry } from 'vs/workbench/browser/composite'; diff --git a/src/vs/workbench/browser/parts/editor/editor.contribution.ts b/src/vs/workbench/browser/parts/editor/editor.contribution.ts index e8a5d028fd3..7e8aa1bae2b 100644 --- a/src/vs/workbench/browser/parts/editor/editor.contribution.ts +++ b/src/vs/workbench/browser/parts/editor/editor.contribution.ts @@ -23,7 +23,7 @@ import { ITextFileService } from 'vs/workbench/services/textfile/common/textfile import { BinaryResourceDiffEditor } from 'vs/workbench/browser/parts/editor/binaryDiffEditor'; import { ChangeEncodingAction, ChangeEOLAction, ChangeModeAction, EditorStatus } from 'vs/workbench/browser/parts/editor/editorStatus'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actionRegistry'; -import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions, ActionBarContributor } from 'vs/workbench/browser/actionBarRegistry'; +import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions, ActionBarContributor } from 'vs/workbench/browser/actions'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes'; diff --git a/src/vs/workbench/browser/parts/editor/titleControl.ts b/src/vs/workbench/browser/parts/editor/titleControl.ts index acb5d5e3e26..12c13c861ed 100644 --- a/src/vs/workbench/browser/parts/editor/titleControl.ts +++ b/src/vs/workbench/browser/parts/editor/titleControl.ts @@ -8,7 +8,7 @@ import 'vs/css!./media/titlecontrol'; import nls = require('vs/nls'); import { Registry } from 'vs/platform/platform'; -import { Scope, IActionBarRegistry, Extensions, prepareActions } from 'vs/workbench/browser/actionBarRegistry'; +import { Scope, IActionBarRegistry, Extensions, prepareActions } from 'vs/workbench/browser/actions'; import { IAction, Action } from 'vs/base/common/actions'; import errors = require('vs/base/common/errors'); import DOM = require('vs/base/browser/dom'); diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index 33c4fabe884..8f535d23acf 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -10,7 +10,7 @@ import { IAction } from 'vs/base/common/actions'; import Event from 'vs/base/common/event'; import { Builder, $ } from 'vs/base/browser/builder'; import { Registry } from 'vs/platform/platform'; -import { Scope } from 'vs/workbench/browser/actionBarRegistry'; +import { Scope } from 'vs/workbench/browser/actions'; import { IPanel } from 'vs/workbench/common/panel'; import { CompositePart, ICompositeTitleLabel } from 'vs/workbench/browser/parts/compositePart'; import { Panel, PanelRegistry, Extensions as PanelExtensions } from 'vs/workbench/browser/panel'; diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index 70ab1330732..32ef0a9c37a 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -22,7 +22,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { Mode, IEntryRunContext, IAutoFocus, IQuickNavigateConfiguration, IModel } from 'vs/base/parts/quickopen/common/quickOpen'; import { QuickOpenEntry, QuickOpenModel, QuickOpenEntryGroup } from 'vs/base/parts/quickopen/browser/quickOpenModel'; import { QuickOpenWidget, HideReason } from 'vs/base/parts/quickopen/browser/quickOpenWidget'; -import { ContributableActionProvider } from 'vs/workbench/browser/actionBarRegistry'; +import { ContributableActionProvider } from 'vs/workbench/browser/actions'; import labels = require('vs/base/common/labels'); import paths = require('vs/base/common/paths'); import { ITextFileService, AutoSaveMode } from 'vs/workbench/services/textfile/common/textfiles'; diff --git a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts index fa5d1156e36..36f23b53283 100644 --- a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts +++ b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts @@ -15,7 +15,7 @@ import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IPartService, Parts, Position as SideBarPosition } from 'vs/workbench/services/part/common/partService'; import { IViewlet } from 'vs/workbench/common/viewlet'; -import { Scope } from 'vs/workbench/browser/actionBarRegistry'; +import { Scope } from 'vs/workbench/browser/actions'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IMessageService } from 'vs/platform/message/common/message'; diff --git a/src/vs/workbench/browser/viewlet.ts b/src/vs/workbench/browser/viewlet.ts index 0403d96aa35..5f153eee59c 100644 --- a/src/vs/workbench/browser/viewlet.ts +++ b/src/vs/workbench/browser/viewlet.ts @@ -12,7 +12,7 @@ import { Dimension, Builder, $ } from 'vs/base/browser/builder'; import { IAction, IActionRunner, Action } from 'vs/base/common/actions'; import { IActionItem, ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar'; import { ITree, IFocusEvent, ISelectionEvent } from 'vs/base/parts/tree/browser/tree'; -import { prepareActions } from 'vs/workbench/browser/actionBarRegistry'; +import { prepareActions } from 'vs/workbench/browser/actions'; import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar'; import { DelayedDragHandler } from 'vs/base/browser/dnd'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 5a2a8efaff7..b8c52c3c984 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -36,7 +36,7 @@ import { PanelPart } from 'vs/workbench/browser/parts/panel/panelPart'; import { StatusbarPart } from 'vs/workbench/browser/parts/statusbar/statusbarPart'; import { TitlebarPart } from 'vs/workbench/browser/parts/titlebar/titlebarPart'; import { WorkbenchLayout } from 'vs/workbench/browser/layout'; -import { IActionBarRegistry, Extensions as ActionBarExtensions } from 'vs/workbench/browser/actionBarRegistry'; +import { IActionBarRegistry, Extensions as ActionBarExtensions } from 'vs/workbench/browser/actions'; import { PanelRegistry, Extensions as PanelExtensions } from 'vs/workbench/browser/panel'; import { QuickOpenController } from 'vs/workbench/browser/parts/quickopen/quickOpenController'; import { getServices } from 'vs/platform/instantiation/common/extensions'; diff --git a/src/vs/workbench/parts/debug/electron-browser/debugViews.ts b/src/vs/workbench/parts/debug/electron-browser/debugViews.ts index 3d4d2f1838b..f70b82840e5 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugViews.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugViews.ts @@ -12,7 +12,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import * as errors from 'vs/base/common/errors'; import { EventType } from 'vs/base/common/events'; import { IActionRunner, IAction } from 'vs/base/common/actions'; -import { prepareActions } from 'vs/workbench/browser/actionBarRegistry'; +import { prepareActions } from 'vs/workbench/browser/actions'; import { IHighlightEvent, ITree } from 'vs/base/parts/tree/browser/tree'; import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { CollapsibleState } from 'vs/base/browser/ui/splitview/splitview'; diff --git a/src/vs/workbench/parts/execution/electron-browser/terminal.contribution.ts b/src/vs/workbench/parts/execution/electron-browser/terminal.contribution.ts index c7b09a28e16..d191c415426 100644 --- a/src/vs/workbench/parts/execution/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/parts/execution/electron-browser/terminal.contribution.ts @@ -11,7 +11,7 @@ import baseplatform = require('vs/base/common/platform'); import { IAction, Action } from 'vs/base/common/actions'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actionRegistry'; import paths = require('vs/base/common/paths'); -import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions, ActionBarContributor } from 'vs/workbench/browser/actionBarRegistry'; +import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions, ActionBarContributor } from 'vs/workbench/browser/actions'; import uri from 'vs/base/common/uri'; import { explorerItemToFileResource } from 'vs/workbench/parts/files/common/files'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; diff --git a/src/vs/workbench/parts/files/browser/fileActions.contribution.ts b/src/vs/workbench/parts/files/browser/fileActions.contribution.ts index 7c3bd0125d2..6f04409b592 100644 --- a/src/vs/workbench/parts/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/parts/files/browser/fileActions.contribution.ts @@ -9,7 +9,7 @@ import { Registry } from 'vs/platform/platform'; import { Action, IAction } from 'vs/base/common/actions'; import { isMacintosh } from 'vs/base/common/platform'; import { ActionItem, BaseActionItem, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; -import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions, ActionBarContributor } from 'vs/workbench/browser/actionBarRegistry'; +import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions, ActionBarContributor } from 'vs/workbench/browser/actions'; import { GlobalNewUntitledFileAction, SaveFileAsAction, OpenFileAction, ShowOpenedFileInNewWindow, CopyPathAction, GlobalCopyPathAction, RevealInOSAction, GlobalRevealInOSAction, pasteIntoFocusedFilesExplorerViewItem, FocusOpenEditorsView, FocusFilesExplorer, GlobalCompareResourcesAction, GlobalNewFileAction, GlobalNewFolderAction, RevertFileAction, SaveFilesAction, SaveAllAction, SaveFileAction, MoveFileToTrashAction, TriggerRenameFileAction, PasteFileAction, CopyFileAction, SelectResourceForCompareAction, CompareResourcesAction, NewFolderAction, NewFileAction, OpenToSideAction, ShowActiveFileInExplorer, CollapseExplorerView, RefreshExplorerView } from 'vs/workbench/parts/files/browser/fileActions'; import { revertLocalChangesCommand, acceptLocalChangesCommand, CONFLICT_RESOLUTION_CONTEXT } from 'vs/workbench/parts/files/browser/saveErrorHandler'; import { SyncActionDescriptor, MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; diff --git a/src/vs/workbench/parts/files/browser/views/explorerView.ts b/src/vs/workbench/parts/files/browser/views/explorerView.ts index 5895751dd8b..cad31f52e9f 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerView.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerView.ts @@ -13,7 +13,7 @@ import errors = require('vs/base/common/errors'); import labels = require('vs/base/common/labels'); import paths = require('vs/base/common/paths'); import { Action, IAction } from 'vs/base/common/actions'; -import { prepareActions } from 'vs/workbench/browser/actionBarRegistry'; +import { prepareActions } from 'vs/workbench/browser/actions'; import { ITree } from 'vs/base/parts/tree/browser/tree'; import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { IFilesConfiguration, ExplorerFolderContext, FilesExplorerFocussedContext, ExplorerFocussedContext } from 'vs/workbench/parts/files/common/files'; diff --git a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts index ec485a2d391..95f1dc2599c 100644 --- a/src/vs/workbench/parts/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/explorerViewer.ts @@ -22,7 +22,7 @@ import { isMacintosh, isLinux } from 'vs/base/common/platform'; import glob = require('vs/base/common/glob'); import { FileLabel, IFileLabelOptions } from 'vs/workbench/browser/labels'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { ContributableActionProvider } from 'vs/workbench/browser/actionBarRegistry'; +import { ContributableActionProvider } from 'vs/workbench/browser/actions'; import { IFilesConfiguration } from 'vs/workbench/parts/files/common/files'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IFileOperationResult, FileOperationResult, IFileService, isEqual, isEqualOrParent } from 'vs/platform/files/common/files'; diff --git a/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts b/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts index 0985b01da56..f275bfd30a5 100644 --- a/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts +++ b/src/vs/workbench/parts/files/browser/views/openEditorsViewer.ts @@ -23,7 +23,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IEditorGroup, IEditorStacksModel } from 'vs/workbench/common/editor'; import { OpenEditor } from 'vs/workbench/parts/files/common/explorerViewModel'; -import { ContributableActionProvider } from 'vs/workbench/browser/actionBarRegistry'; +import { ContributableActionProvider } from 'vs/workbench/browser/actions'; import { explorerItemToFileResource } from 'vs/workbench/parts/files/common/files'; import { ITextFileService, AutoSaveMode } from 'vs/workbench/services/textfile/common/textfiles'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/vs/workbench/parts/markers/browser/markersPanel.ts b/src/vs/workbench/parts/markers/browser/markersPanel.ts index 615851f727f..f771f5dcaf9 100644 --- a/src/vs/workbench/parts/markers/browser/markersPanel.ts +++ b/src/vs/workbench/parts/markers/browser/markersPanel.ts @@ -32,7 +32,7 @@ import { CollapseAllAction, FilterAction, FilterInputBoxActionItem } from 'vs/wo import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import Messages from 'vs/workbench/parts/markers/common/messages'; import { RangeHighlightDecorations } from 'vs/workbench/common/editor/rangeDecorations'; -import { ContributableActionProvider } from 'vs/workbench/browser/actionBarRegistry'; +import { ContributableActionProvider } from 'vs/workbench/browser/actions'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IListService } from 'vs/platform/list/browser/listService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; diff --git a/src/vs/workbench/parts/search/browser/search.contribution.ts b/src/vs/workbench/parts/search/browser/search.contribution.ts index 9cede51de89..a03f6572e09 100644 --- a/src/vs/workbench/parts/search/browser/search.contribution.ts +++ b/src/vs/workbench/parts/search/browser/search.contribution.ts @@ -15,7 +15,7 @@ import { IAction } from 'vs/base/common/actions'; import { explorerItemToFileResource } from 'vs/workbench/parts/files/common/files'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; -import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions, ActionBarContributor } from 'vs/workbench/browser/actionBarRegistry'; +import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions, ActionBarContributor } from 'vs/workbench/browser/actions'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actionRegistry'; import { QuickOpenHandlerDescriptor, IQuickOpenRegistry, Extensions as QuickOpenExtensions, QuickOpenAction } from 'vs/workbench/browser/quickopen'; import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; diff --git a/src/vs/workbench/parts/tasks/browser/quickOpen.ts b/src/vs/workbench/parts/tasks/browser/quickOpen.ts index 6f82d048270..e4208bafd3a 100644 --- a/src/vs/workbench/parts/tasks/browser/quickOpen.ts +++ b/src/vs/workbench/parts/tasks/browser/quickOpen.ts @@ -15,7 +15,7 @@ import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; import { Task, TaskSourceKind, computeLabel } from 'vs/workbench/parts/tasks/common/tasks'; import { ITaskService } from 'vs/workbench/parts/tasks/common/taskService'; -import { ActionBarContributor, ContributableActionProvider } from 'vs/workbench/browser/actionBarRegistry'; +import { ActionBarContributor, ContributableActionProvider } from 'vs/workbench/browser/actions'; export class TaskEntry extends Model.QuickOpenEntry { diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index 411e04c6df5..c588787f5e7 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -66,7 +66,7 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IOutputService, IOutputChannelRegistry, Extensions as OutputExt, IOutputChannel } from 'vs/workbench/parts/output/common/output'; -import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions } from 'vs/workbench/browser/actionBarRegistry'; +import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions } from 'vs/workbench/browser/actions'; import { ITerminalService } from 'vs/workbench/parts/terminal/common/terminal'; diff --git a/src/vs/workbench/test/browser/actionRegistry.test.ts b/src/vs/workbench/test/browser/actionRegistry.test.ts index 8fe4f7c8dd8..e9605ceacf6 100644 --- a/src/vs/workbench/test/browser/actionRegistry.test.ts +++ b/src/vs/workbench/test/browser/actionRegistry.test.ts @@ -10,7 +10,7 @@ import * as Platform from 'vs/platform/platform'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { Extensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actionRegistry'; -import { prepareActions } from 'vs/workbench/browser/actionBarRegistry'; +import { prepareActions } from 'vs/workbench/browser/actions'; import { Action } from 'vs/base/common/actions'; From 7ad4a225a2bd04e04bd8645568ee52f6e10f48f7 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 29 May 2017 18:18:04 +0200 Subject: [PATCH 1152/1164] :lipstick: global action --- .../parts/activitybar/activitybarActions.ts | 125 ++++++++++++------ .../parts/activitybar/activitybarPart.ts | 50 ++----- 2 files changed, 90 insertions(+), 85 deletions(-) diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts index 287ad54470d..08a7aea55c4 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts @@ -20,28 +20,34 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ViewletDescriptor } from 'vs/workbench/browser/viewlet'; -import { IActivity } from 'vs/workbench/browser/activity'; +import { IActivity, IGlobalActivity } from 'vs/workbench/browser/activity'; import { dispose } from 'vs/base/common/lifecycle'; import { IViewletService, } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; import { IThemeService, ITheme, registerThemingParticipant, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; import { ACTIVITY_BAR_BADGE_FOREGROUND, ACTIVITY_BAR_BADGE_BACKGROUND, ACTIVITY_BAR_DRAG_AND_DROP_BACKGROUND, ACTIVITY_BAR_FOREGROUND } from 'vs/workbench/common/theme'; import { contrastBorder, activeContrastBorder, focusBorder } from 'vs/platform/theme/common/colorRegistry'; +import { StandardMouseEvent } from "vs/base/browser/mouseEvent"; + +export interface IViewletActivity { + badge: IBadge; + clazz: string; +} export class ActivityAction extends Action { private badge: IBadge; private _onDidChangeBadge = new Emitter(); - get activity(): IActivity { - return this._activity; - } - constructor(private _activity: IActivity) { super(_activity.id, _activity.name, _activity.cssClass); this.badge = null; } + public get activity(): IActivity { + return this._activity; + } + public get onDidChangeBadge(): Event { return this._onDidChangeBadge.event; } @@ -108,14 +114,12 @@ export class ViewletActivityAction extends ActivityAction { } export class ActivityActionItem extends BaseActionItem { - + protected $container: Builder; protected $label: Builder; protected $badge: Builder; - private $badgeContent: Builder; - protected get activity(): IActivity { - return (this._action as ActivityAction).activity; - } + private $badgeContent: Builder; + private mouseUpTimeout: number; constructor( action: ActivityAction, @@ -128,6 +132,10 @@ export class ActivityActionItem extends BaseActionItem { action.onDidChangeBadge(this.handleBadgeChangeEvenet, this, this._callOnDispose); } + protected get activity(): IActivity { + return (this._action as ActivityAction).activity; + } + protected updateStyles(): void { const theme = this.themeService.getTheme(); @@ -156,7 +164,27 @@ export class ActivityActionItem extends BaseActionItem { public render(container: HTMLElement): void { super.render(container); - container.title = this.activity.name; + // Make the container tab-able for keyboard navigation + this.$container = $(container).attr({ + tabIndex: '0', + role: 'button', + title: this.activity.name + }); + + // Try hard to prevent keyboard only focus feedback when using mouse + this.$container.on(DOM.EventType.MOUSE_DOWN, () => { + this.$container.addClass('clicked'); + }); + + this.$container.on(DOM.EventType.MOUSE_UP, () => { + if (this.mouseUpTimeout) { + clearTimeout(this.mouseUpTimeout); + } + + this.mouseUpTimeout = setTimeout(() => { + this.$container.removeClass('clicked'); + }, 800); // delayed to prevent focus feedback from showing on mouse up + }); // Label this.$label = $('a.action-label').appendTo(this.builder); @@ -224,6 +252,11 @@ export class ActivityActionItem extends BaseActionItem { public dispose(): void { super.dispose(); + + if (this.mouseUpTimeout) { + clearTimeout(this.mouseUpTimeout); + } + this.$badge.destroy(); } } @@ -234,14 +267,8 @@ export class ViewletActionItem extends ActivityActionItem { private static toggleViewletPinnedAction: ToggleViewletPinnedAction; private static draggedViewlet: ViewletDescriptor; - private $container: Builder; private _keybinding: string; private cssClass: string; - private mouseUpTimeout: number; - - private get viewlet(): ViewletDescriptor { - return this.action.activity as ViewletDescriptor; - } constructor( private action: ViewletActivityAction, @@ -265,6 +292,10 @@ export class ViewletActionItem extends ActivityActionItem { } } + private get viewlet(): ViewletDescriptor { + return this.action.activity as ViewletDescriptor; + } + private getKeybindingLabel(id: string): string { const kb = this.keybindingService.lookupKeybinding(id); if (kb) { @@ -277,27 +308,6 @@ export class ViewletActionItem extends ActivityActionItem { public render(container: HTMLElement): void { super.render(container); - // Make the container tab-able for keyboard navigation - this.$container = $(container).attr({ - tabIndex: '0', - role: 'button' - }); - - // Try hard to prevent keyboard only focus feedback when using mouse - this.$container.on(DOM.EventType.MOUSE_DOWN, () => { - this.$container.addClass('clicked'); - }); - - this.$container.on(DOM.EventType.MOUSE_UP, () => { - if (this.mouseUpTimeout) { - clearTimeout(this.mouseUpTimeout); - } - - this.mouseUpTimeout = setTimeout(() => { - this.$container.removeClass('clicked'); - }, 800); // delayed to prevent focus feedback from showing on mouse up - }); - this.$container.on('contextmenu', e => { DOM.EventHelper.stop(e, true); @@ -465,10 +475,6 @@ export class ViewletActionItem extends ActivityActionItem { ViewletActionItem.clearDraggedViewlet(); - if (this.mouseUpTimeout) { - clearTimeout(this.mouseUpTimeout); - } - this.$label.destroy(); } } @@ -493,7 +499,6 @@ export class ViewletOverflowActivityAction extends ActivityAction { } export class ViewletOverflowActivityActionItem extends ActivityActionItem { - private name: string; private cssClass: string; private actions: OpenViewletAction[]; @@ -647,6 +652,40 @@ export class ToggleViewletPinnedAction extends Action { } } +export class GlobalActivityAction extends ActivityAction { + + constructor(activity: IGlobalActivity) { + super(activity); + } +} + +export class GlobalActivityActionItem extends ActivityActionItem { + + constructor( + action: GlobalActivityAction, + @IThemeService themeService: IThemeService, + @IContextMenuService protected contextMenuService: IContextMenuService + ) { + super(action, { draggable: false }, themeService); + } + + public onClick(e: MouseEvent): void { + const globalAction = this._action as GlobalActivityAction; + const activity = globalAction.activity as IGlobalActivity; + const actions = activity.getActions(); + + const event = new StandardMouseEvent(e); + event.stopPropagation(); + event.preventDefault(); + + this.contextMenuService.showContextMenu({ + getAnchor: () => ({ x: event.posx, y: event.posy }), + getActions: () => TPromise.as(actions), + onHide: () => dispose(actions) + }); + } +} + registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { // Styling with Outline color (e.g. high contrast theme) diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 4e773ecab38..75f4d49aa70 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -15,11 +15,11 @@ import { Builder, $, Dimension } from 'vs/base/browser/builder'; import { Action } from 'vs/base/common/actions'; import { ActionsOrientation, ActionBar, IActionItem, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { ViewletDescriptor } from 'vs/workbench/browser/viewlet'; -import { IGlobalActivity, GlobalActivityExtensions, IGlobalActivityRegistry } from 'vs/workbench/browser/activity'; +import { GlobalActivityExtensions, IGlobalActivityRegistry } from 'vs/workbench/browser/activity'; import { Registry } from 'vs/platform/platform'; import { Part } from 'vs/workbench/browser/part'; import { IViewlet } from 'vs/workbench/common/viewlet'; -import { ToggleViewletPinnedAction, ViewletActivityAction, ActivityAction, ActivityActionItem, ViewletActionItem, ViewletOverflowActivityAction, ViewletOverflowActivityActionItem } from 'vs/workbench/browser/parts/activitybar/activitybarActions'; +import { ToggleViewletPinnedAction, ViewletActivityAction, ActivityAction, GlobalActivityActionItem, ViewletActionItem, ViewletOverflowActivityAction, ViewletOverflowActivityActionItem, GlobalActivityAction, IViewletActivity } from 'vs/workbench/browser/parts/activitybar/activitybarActions'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IActivityBarService, IBadge } from 'vs/workbench/services/activity/common/activityBarService'; import { IPartService, Position as SideBarPosition } from 'vs/workbench/services/part/common/partService'; @@ -35,45 +35,6 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ACTIVITY_BAR_BACKGROUND, ACTIVITY_BAR_BORDER } from 'vs/workbench/common/theme'; import { contrastBorder } from 'vs/platform/theme/common/colorRegistry'; -interface IViewletActivity { - badge: IBadge; - clazz: string; -} - -class GlobalActivityAction extends ActivityAction { - - constructor(activity: IGlobalActivity) { - super(activity); - } -} - -class GlobalActivityActionItem extends ActivityActionItem { - - constructor( - action: GlobalActivityAction, - @IThemeService themeService: IThemeService, - @IContextMenuService protected contextMenuService: IContextMenuService - ) { - super(action, { draggable: false }, themeService); - } - - onClick(e: MouseEvent): void { - const globalAction = this._action as GlobalActivityAction; - const activity = globalAction.activity as IGlobalActivity; - const actions = activity.getActions(); - - const event = new StandardMouseEvent(e); - event.stopPropagation(); - event.preventDefault(); - - this.contextMenuService.showContextMenu({ - getAnchor: () => ({ x: event.posx, y: event.posy }), - getActions: () => TPromise.as(actions), - onHide: () => dispose(actions) - }); - } -} - export class ActivitybarPart extends Part implements IActivityBarService { private static readonly ACTIVITY_ACTION_HEIGHT = 50; @@ -170,12 +131,12 @@ export class ActivitybarPart extends Part implements IActivityBarService { } const action = this.globalActivityIdToActions[globalActivityId]; - if (!action) { throw illegalArgument('globalActivityId'); } action.setBadge(badge); + return toDisposable(() => action.setBadge(undefined)); } @@ -574,6 +535,11 @@ export class ActivitybarPart extends Part implements IActivityBarService { this.viewletSwitcherBar = null; } + if (this.globalActionBar) { + this.globalActionBar.dispose(); + this.globalActionBar = null; + } + super.dispose(); } From 2d74e461808de1cd10e62dc550108dbb004daf12 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 29 May 2017 18:33:45 +0200 Subject: [PATCH 1153/1164] #26948 Provide none collapsible state --- src/vs/vscode.proposed.d.ts | 5 ++++- src/vs/workbench/parts/views/browser/views.ts | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index cf0218df999..a8877a7c25c 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -71,7 +71,6 @@ declare module 'vscode' { /** * Collapsible state of the tree item. - * Required only when item has children. */ readonly collapsibleState?: TreeItemCollapsibleState; } @@ -80,6 +79,10 @@ declare module 'vscode' { * Collapsible state of the tree item */ export enum TreeItemCollapsibleState { + /** + * Determines an item can be neither collapsed nor expanded. Implies it has no children. + */ + None = 0, /** * Determines an item is collapsed */ diff --git a/src/vs/workbench/parts/views/browser/views.ts b/src/vs/workbench/parts/views/browser/views.ts index 927059f1977..d313003efc2 100644 --- a/src/vs/workbench/parts/views/browser/views.ts +++ b/src/vs/workbench/parts/views/browser/views.ts @@ -21,6 +21,7 @@ export class ViewLocation { } export enum TreeItemCollapsibleState { + None = 0, Collapsed = 1, Expanded = 2 } @@ -48,7 +49,7 @@ export interface IViewDescriptor { readonly ctor: IViewConstructorSignature; readonly order?: number; - + } export interface ITreeItem { From 2ef3274358b105209b905a644ad7739cf647499e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 29 May 2017 18:52:09 +0200 Subject: [PATCH 1154/1164] Documentation for context value in tree item --- src/vs/vscode.proposed.d.ts | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index a8877a7c25c..aac77423afe 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -49,7 +49,7 @@ declare module 'vscode' { export interface TreeItem { /** - * Label of the tree item + * A human-readable string describing this item */ readonly label: string; @@ -60,19 +60,34 @@ declare module 'vscode' { /** * The [command](#Command) which should be run when the tree item - * is open in the Source Control viewlet. + * is selected */ readonly command?: Command; /** - * Context value of the tree node - */ - readonly contextValue?: string; - - /** - * Collapsible state of the tree item. + * [TreeItemCollapsibleState](#TreeItemCollapsibleState) of the tree item. */ readonly collapsibleState?: TreeItemCollapsibleState; + + /** + * Context value of the tree item. This can be used to contribute item specific actions in the tree. + * For example, a tree item is given a context value as `folder`. When contribution actions to `view/item/context` + * using `menus` extension point, you can specify context value for key `viewItem` in `when` expression like `viewItem == folder`. + * ``` + * "contributes": { + "menus": { + "view/item/context": [ + { + "command": "extension.deleteFolder", + "when": "viewItem == folder" + } + ] + } + } + * ``` + * This will show action `extension.deleteFolder` only for items with `contextValue` is `folder`. + */ + readonly contextValue?: string; } /** From b4918a7c12e3b9d5b7ad8d4f8168a04c587932c7 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 29 May 2017 18:54:16 +0200 Subject: [PATCH 1155/1164] Fix indentation for example --- src/vs/vscode.proposed.d.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index aac77423afe..b91a0954050 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -75,15 +75,15 @@ declare module 'vscode' { * using `menus` extension point, you can specify context value for key `viewItem` in `when` expression like `viewItem == folder`. * ``` * "contributes": { - "menus": { - "view/item/context": [ - { - "command": "extension.deleteFolder", - "when": "viewItem == folder" - } - ] - } - } + * "menus": { + * "view/item/context": [ + * { + * "command": "extension.deleteFolder", + * "when": "viewItem == folder" + * } + * ] + * } + * } * ``` * This will show action `extension.deleteFolder` only for items with `contextValue` is `folder`. */ From 09d2e426196bf64a3b7e4ac78432ac6fe19b4596 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 29 May 2017 19:00:05 +0200 Subject: [PATCH 1156/1164] #26948 Update the doc for view data provider in API --- src/vs/vscode.proposed.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index b91a0954050..2d7b21802c9 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -14,8 +14,8 @@ declare module 'vscode' { export namespace window { /** - * Register a [TreeDataProvider](#TreeDataProvider) for the registered view `id`. - * @param viewId View id. + * Register a [TreeDataProvider](#TreeDataProvider) for the view contributed using the extension point `views`. + * @param viewId Id of the view contributed using the extension point `views`. * @param treeDataProvider A [TreeDataProvider](#TreeDataProvider) that provides tree data for the view */ export function registerTreeDataProviderForView(viewId: string, treeDataProvider: TreeDataProvider): Disposable; From 9ae89e33030cf232025ede977ca0212c64b8aa55 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 29 May 2017 19:01:14 +0200 Subject: [PATCH 1157/1164] #26948 Fix the TreeItemCollapsibleState ext host type --- src/vs/workbench/api/node/extHostTypes.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index 2912a30ef42..7548f24f051 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1276,6 +1276,7 @@ export enum ProgressLocation { } export enum TreeItemCollapsibleState { + None = 0, Collapsed = 1, Expanded = 2 } From 778c0309390951bc22f1b252265d3fbf30ee1f29 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 29 May 2017 19:23:06 +0200 Subject: [PATCH 1158/1164] format hygiene --- src/vs/workbench/parts/views/browser/views.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/parts/views/browser/views.ts b/src/vs/workbench/parts/views/browser/views.ts index d313003efc2..d5a69e9827d 100644 --- a/src/vs/workbench/parts/views/browser/views.ts +++ b/src/vs/workbench/parts/views/browser/views.ts @@ -49,7 +49,7 @@ export interface IViewDescriptor { readonly ctor: IViewConstructorSignature; readonly order?: number; - + } export interface ITreeItem { From bc2546f0ac017de1d7238e740f88de4c3967e22c Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 29 May 2017 19:49:11 +0200 Subject: [PATCH 1159/1164] #26948 Update documentation --- src/vs/platform/extensions/common/extensionsRegistry.ts | 2 +- src/vs/workbench/parts/views/browser/treeView.ts | 2 +- src/vs/workbench/parts/views/browser/viewsExtensionPoint.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/vs/platform/extensions/common/extensionsRegistry.ts b/src/vs/platform/extensions/common/extensionsRegistry.ts index 9c7b05edb71..7edf4f74960 100644 --- a/src/vs/platform/extensions/common/extensionsRegistry.ts +++ b/src/vs/platform/extensions/common/extensionsRegistry.ts @@ -182,7 +182,7 @@ const schema: IJSONSchema = { type: 'array', items: { type: 'string', - defaultSnippets: [{ label: 'onLanguage', body: 'onLanguage:${1:languageId}' }, { label: 'onCommand', body: 'onCommand:${2:commandId}' }, { label: 'onDebug', body: 'onDebug:${3:type}' }, { label: 'workspaceContains', body: 'workspaceContains:${4:fileName}' }], + defaultSnippets: [{ label: 'onLanguage', body: 'onLanguage:${1:languageId}' }, { label: 'onCommand', body: 'onCommand:${2:commandId}' }, { label: 'onDebug', body: 'onDebug:${3:type}' }, { label: 'workspaceContains', body: 'workspaceContains:${4:fileName}' }, { label: 'onView', body: 'onView:${5:viewId}' }], } }, badges: { diff --git a/src/vs/workbench/parts/views/browser/treeView.ts b/src/vs/workbench/parts/views/browser/treeView.ts index cc6c4c38b4e..d642e54a3a7 100644 --- a/src/vs/workbench/parts/views/browser/treeView.ts +++ b/src/vs/workbench/parts/views/browser/treeView.ts @@ -421,7 +421,7 @@ class Menus implements IDisposable { } getResourceContextActions(element: ITreeItem): IAction[] { - return this.getActions(MenuId.ViewItemContext, { key: 'item', value: element.contextValue }).secondary; + return this.getActions(MenuId.ViewItemContext, { key: 'viewItem', value: element.contextValue }).secondary; } private getActions(menuId: MenuId, context: { key: string, value: string }): { primary: IAction[]; secondary: IAction[]; } { diff --git a/src/vs/workbench/parts/views/browser/viewsExtensionPoint.ts b/src/vs/workbench/parts/views/browser/viewsExtensionPoint.ts index da935449c64..e7cc066c06a 100644 --- a/src/vs/workbench/parts/views/browser/viewsExtensionPoint.ts +++ b/src/vs/workbench/parts/views/browser/viewsExtensionPoint.ts @@ -51,7 +51,7 @@ namespace schema { type: 'object', properties: { id: { - description: localize('vscode.extension.contributes.view.id', 'Identifier of the view. Use the same identifier to register a data provider through API.'), + description: localize('vscode.extension.contributes.view.id', 'Identifier of the view. Use this to register a data provider through `vscode.window.registerTreeDataProviderForView` API. Also to trigger activating your extension by registering `onView:${id}` event to `activationEvents`.'), type: 'string' }, name: { @@ -66,7 +66,7 @@ namespace schema { type: 'object', properties: { 'explorer': { - description: localize('views.explorer', "Explorer"), + description: localize('views.explorer', "Explorer View"), type: 'array', items: viewDescriptor } From c44eec97a1e5697936bfa5cab69f6718262f7963 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 29 May 2017 19:51:50 +0200 Subject: [PATCH 1160/1164] #26948 Update doc --- src/vs/vscode.proposed.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 2d7b21802c9..f571826403c 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -60,7 +60,7 @@ declare module 'vscode' { /** * The [command](#Command) which should be run when the tree item - * is selected + * is selected. This command is called with the model representing this item as first argument. */ readonly command?: Command; From 862ea061a60647817ed39ab8427788d679f1779e Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 29 May 2017 20:32:43 +0200 Subject: [PATCH 1161/1164] #26948 document view locations in menu entry contributions --- .../actions/electron-browser/menusExtensionPoint.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/vs/platform/actions/electron-browser/menusExtensionPoint.ts b/src/vs/platform/actions/electron-browser/menusExtensionPoint.ts index a9a61d92d57..0e9b8d4f004 100644 --- a/src/vs/platform/actions/electron-browser/menusExtensionPoint.ts +++ b/src/vs/platform/actions/electron-browser/menusExtensionPoint.ts @@ -143,6 +143,16 @@ namespace schema { description: localize('menus.resourceStateContext', "The Source Control resource state context menu"), type: 'array', items: menuItem + }, + 'view/title': { + description: localize('view.viewTitle', "The contributed view title menu"), + type: 'array', + items: menuItem + }, + 'view/item/context': { + description: localize('view.itemContext', "The contributed view item context menu"), + type: 'array', + items: menuItem } } }; From 212e44d89e2000d503c699a0dd45ab05c1429bf2 Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Mon, 29 May 2017 22:18:54 +0200 Subject: [PATCH 1162/1164] Minor tweaks to how annotation tasks are merged. --- .../workbench/parts/tasks/common/taskConfiguration.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/tasks/common/taskConfiguration.ts b/src/vs/workbench/parts/tasks/common/taskConfiguration.ts index a7ccb15f65e..862419a7fea 100644 --- a/src/vs/workbench/parts/tasks/common/taskConfiguration.ts +++ b/src/vs/workbench/parts/tasks/common/taskConfiguration.ts @@ -835,11 +835,12 @@ namespace TaskDescription { if (problemMatchers) { task.problemMatchers = problemMatchers; } - mergeGlobals(task, globals); if (context.isTermnial && isAnnotating(task)) { + mergeGlobalsIntoAnnnotation(task, globals); annotatingTasks.push(task); return; } + mergeGlobals(task, globals); fillDefaults(task); let addTask: boolean = true; if (context.isTermnial && task.command && task.command.name && task.command.type === Tasks.CommandType.Shell && task.command.args && task.command.args.length > 0) { @@ -886,7 +887,10 @@ namespace TaskDescription { } else if (defaultTestTask.rank > -1 && defaultTestTask.rank < 2) { defaultTestTask.task.group = Tasks.TaskGroup.Test; } - return parsedTasks.length === 0 && annotatingTasks.length === 0 ? undefined : { tasks: parsedTasks, annotatingTasks: annotatingTasks }; + return { + tasks: parsedTasks.length > 0 ? parsedTasks : undefined, + annotatingTasks: annotatingTasks.length > 0 ? annotatingTasks : undefined + }; } export function mergeTasks(target: Tasks.Task[], source: Tasks.Task[]): Tasks.Task[] { @@ -942,6 +946,9 @@ namespace TaskDescription { } } + export function mergeGlobalsIntoAnnnotation(task: Tasks.Task, globals: Globals): void { + } + export function fillDefaults(task: Tasks.Task): void { CommandConfiguration.fillDefaults(task.command); if (task.args === void 0 && task.command === void 0) { From c2a17a7929259d3d2643cb3f98478e994a39605b Mon Sep 17 00:00:00 2001 From: Dirk Baeumer Date: Mon, 29 May 2017 23:09:07 +0200 Subject: [PATCH 1163/1164] Make dependsOn work with labels --- .../electron-browser/task.contribution.ts | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts index c588787f5e7..540ff68d8ca 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts @@ -686,7 +686,7 @@ class TaskService extends EventEmitter implements ITaskService { toExecute = resolver.resolve(task); } else { requested = task.name; - toExecute = resolver.resolve(task._id); + toExecute = task; } if (!toExecute) { throw new TaskError(Severity.Info, nls.localize('TaskServer.noTask', 'Requested task {0} to execute not found.', requested), TaskErrors.TaskNotFound); @@ -738,6 +738,7 @@ class TaskService extends EventEmitter implements ITaskService { private createRunnableTask(sets: TaskSet[], group: TaskGroup): { task: Task; resolver: ITaskResolver } { let uuidMap: IStringDictionary = Object.create(null); + let labelMap: IStringDictionary = Object.create(null); let identifierMap: IStringDictionary = Object.create(null); let workspaceTasks: Task[] = []; @@ -745,6 +746,7 @@ class TaskService extends EventEmitter implements ITaskService { sets.forEach((set) => { set.tasks.forEach((task) => { uuidMap[task._id] = task; + labelMap[computeTaskLabel(task)] = task; identifierMap[task.identifier] = task; if (group && task.group === group) { if (task._source.kind === TaskSourceKind.Workspace) { @@ -757,11 +759,7 @@ class TaskService extends EventEmitter implements ITaskService { }); let resolver: ITaskResolver = { resolve: (id: string) => { - let result = uuidMap[id]; - if (result) { - return result; - } - return identifierMap[id]; + return uuidMap[id] || labelMap[id] || identifierMap[id]; } }; if (workspaceTasks.length > 0) { @@ -791,22 +789,18 @@ class TaskService extends EventEmitter implements ITaskService { } private createResolver(sets: TaskSet[]): ITaskResolver { - let uuidMap: IStringDictionary = Object.create(null); + let labelMap: IStringDictionary = Object.create(null); let identifierMap: IStringDictionary = Object.create(null); sets.forEach((set) => { set.tasks.forEach((task) => { - uuidMap[task._id] = task; + labelMap[computeTaskLabel(task)] = task; identifierMap[task.identifier] = task; }); }); return { resolve: (id: string) => { - let result = uuidMap[id]; - if (result) { - return result; - } - return identifierMap[id]; + return labelMap[id] || identifierMap[id]; } }; } From bf1521ab82fe0d540e89e4e6694af60b08b8bf5d Mon Sep 17 00:00:00 2001 From: Eric Amodio Date: Sat, 27 May 2017 04:45:04 -0400 Subject: [PATCH 1164/1164] =?UTF-8?q?Fixes=20#27364=20-=20title=20showing?= =?UTF-8?q?=20\u2194=20instead=20of=20=E2=9F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/merge-conflict/src/commandHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/merge-conflict/src/commandHandler.ts b/extensions/merge-conflict/src/commandHandler.ts index e35f6f3cf08..41982c06307 100644 --- a/extensions/merge-conflict/src/commandHandler.ts +++ b/extensions/merge-conflict/src/commandHandler.ts @@ -90,7 +90,7 @@ export default class CommandHandler implements vscode.Disposable { range = conflict.incoming.content; const rightUri = leftUri.with({ query: JSON.stringify(range) }); - const title = localize('compareChangesTitle', '{0}: Current changes \u2194 Incoming changes', fileName); + const title = localize('compareChangesTitle', '{0}: Current changes ⟷ Incoming changes', fileName); vscode.commands.executeCommand('vscode.diff', leftUri, rightUri, title); }